diff --git a/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1.json b/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1.json new file mode 100644 index 00000000..624e5484 --- /dev/null +++ b/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "homelab-backup-closure-audit", + "started_at_utc": "2026-09-21T02:54:35Z", + "finished_at_utc": "2026-09-21T02:54:37Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "d3877f0193bbe5b5c8345ebec48097517ce415848ee63ff839517234bc496da1", + "duplicate_failed_command_blocked": false, + "block_reason": null, + "execution_started": true, + "change_declared": false, + "result_contract_valid": true, + "result_contract_status": null, + "result_contract_error": null, + "command_rc": 0, + "changes_made": false, + "rollback_started": false, + "rollback_restored": null, + "mutation_outcome": "NO_MUTATION", + "sanitized": true, + "secrets_included": false, + "private_addresses_included": false, + "raw_evidence_retained_locally": true, + "raw_evidence_sha256": "12f9c3c08bd66206cce08cf9b97ad5ece4d918a0ee1661e4a7fb3735e42d6a36", + "sanitized_output_sha256": "12f9c3c08bd66206cce08cf9b97ad5ece4d918a0ee1661e4a7fb3735e42d6a36", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "WORKERS2_BACKUP_CLOSURE_AUDIT_BEGIN=1\nCOMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1\nMODE=read-only\nCOMPONENT=homelab-backup-closure-audit\nHOST=pve01\nUID=0\nMUTATION_BOUNDARY=READ_ONLY_NO_REPO_WRITE_NO_GIT_FETCH_NO_GIT_COMMIT_NO_PUSH_NO_SYSTEMD_ACTION_NO_BACKUP_NO_RESTORE_NO_RETENTION_GC_NO_CLOUD_DELETE_NO_MAIL\nSOURCE_HEAD=50bf24f8ee27f3d2e0d1cbc6c17b62c69ff06bae\nSOURCE_HEAD_EXPECTED=true\nSOURCE_WORKTREE_CLEAN=true\nSOURCE_STATUS_LINES=[]\nGFS_POST_STATE={\"helper\":{\"exists\":true,\"sha256\":\"a1aed0c6039f8095bd5da7f62b47f4ee6932df98c4e0e7420d3006df86bd5c94\"},\"policy\":{\"exists\":true,\"sha256\":\"2c7674045dd5c68cc48d348d616494dbbe145df460a8e85d97a2c5c153ec792d\"},\"seal\":{\"exists\":true,\"sha256\":\"b7da77e3a40ce308f56bbc3915569e071079773db39df1e7adc84929baf69bc6\"},\"seal_selected\":{\"critical_vm_count\":8,\"helper_sha256\":\"a1aed0c6039f8095bd5da7f62b47f4ee6932df98c4e0e7420d3006df86bd5c94\",\"policy_sha256\":\"2c7674045dd5c68cc48d348d616494dbbe145df460a8e85d97a2c5c153ec792d\",\"retention_reenable_requires_safe_plan\":true,\"retention_timer_held_disabled\":true,\"status\":\"SEALED\",\"vm200_retired_preserve\":true}}\nGFS_VALIDATE={\"rc\":0,\"stderr\":[],\"stdout\":[\"GFS_POLICY=OK\"]}\nGFS_CRITICAL_LOGICALS=[\"vm110\",\"vm111\",\"vm112\",\"vm113\",\"vm130\",\"vm150\",\"vm160\",\"vm170\"]\nUNIT_STATE={\"homelab-backup-retention-gc.service\":{\"ActiveState\":{\"rc\":0,\"value\":\"inactive\"},\"ExecMainStatus\":{\"rc\":0,\"value\":\"66\"},\"LastTriggerUSec\":{\"rc\":0,\"value\":\"\"},\"LoadState\":{\"rc\":0,\"value\":\"loaded\"},\"NextElapseUSecRealtime\":{\"rc\":0,\"value\":\"\"},\"Result\":{\"rc\":0,\"value\":\"success\"},\"SubState\":{\"rc\":0,\"value\":\"dead\"},\"UnitFileState\":{\"rc\":0,\"value\":\"static\"}},\"homelab-backup-retention-gc.timer\":{\"ActiveState\":{\"rc\":0,\"value\":\"inactive\"},\"ExecMainStatus\":{\"rc\":0,\"value\":\"\"},\"LastTriggerUSec\":{\"rc\":0,\"value\":\"\"},\"LoadState\":{\"rc\":0,\"value\":\"loaded\"},\"NextElapseUSecRealtime\":{\"rc\":0,\"value\":\"\"},\"Result\":{\"rc\":0,\"value\":\"success\"},\"SubState\":{\"rc\":0,\"value\":\"dead\"},\"UnitFileState\":{\"rc\":0,\"value\":\"disabled\"}},\"homelab-backup-v2.service\":{\"ActiveState\":{\"rc\":0,\"value\":\"inactive\"},\"ExecMainStatus\":{\"rc\":0,\"value\":\"0\"},\"LastTriggerUSec\":{\"rc\":0,\"value\":\"\"},\"LoadState\":{\"rc\":0,\"value\":\"loaded\"},\"NextElapseUSecRealtime\":{\"rc\":0,\"value\":\"\"},\"Result\":{\"rc\":0,\"value\":\"success\"},\"SubState\":{\"rc\":0,\"value\":\"dead\"},\"UnitFileState\":{\"rc\":0,\"value\":\"static\"}},\"homelab-backup-v2.timer\":{\"ActiveState\":{\"rc\":0,\"value\":\"active\"},\"ExecMainStatus\":{\"rc\":0,\"value\":\"\"},\"LastTriggerUSec\":{\"rc\":0,\"value\":\"Mon 2026-09-21 05:35:16 MSK\"},\"LoadState\":{\"rc\":0,\"value\":\"loaded\"},\"NextElapseUSecRealtime\":{\"rc\":0,\"value\":\"\"},\"Result\":{\"rc\":0,\"value\":\"success\"},\"SubState\":{\"rc\":0,\"value\":\"waiting\"},\"UnitFileState\":{\"rc\":0,\"value\":\"enabled\"}}}\nREGISTRY_LOGICALS=[{\"id\":\"filebrowser\",\"kind\":\"APP\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"app-filebrowser\"},{\"id\":\"hbarhub\",\"kind\":\"APP\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"app-hbarhub\"},{\"id\":\"immich\",\"kind\":\"APP\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"app-immich\"},{\"id\":\"memos\",\"kind\":\"APP\",\"lifecycle\":\"RETIRED_PRESERVE\",\"logical_id\":\"app-memos\"},{\"id\":\"scrutiny\",\"kind\":\"APP\",\"lifecycle\":\"RETIRED_PRESERVE\",\"logical_id\":\"app-scrutiny\"},{\"id\":\"skladchik-moderator-assistant\",\"kind\":\"APP\",\"lifecycle\":\"RETIRED_PRESERVE\",\"logical_id\":\"app-skladchik-moderator-assistant\"},{\"id\":\"skladchik-reports-monitor\",\"kind\":\"APP\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"app-skladchik-reports-monitor\"},{\"id\":\"control-bootstrap-v2\",\"kind\":\"CONTROL\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"control-bootstrap-v2\"},{\"id\":\"110\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm110\"},{\"id\":\"111\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm111\"},{\"id\":\"112\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm112\"},{\"id\":\"113\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm113\"},{\"id\":\"130\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm130\"},{\"id\":\"150\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm150\"},{\"id\":\"160\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm160\"},{\"id\":\"170\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm170\"},{\"id\":\"171\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm171\"},{\"id\":\"180\",\"kind\":\"VM\",\"lifecycle\":\"RETIRED_PRESERVE\",\"logical_id\":\"vm180\"},{\"id\":\"190\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm190\"},{\"id\":\"200\",\"kind\":\"VM\",\"lifecycle\":\"RETIRED_PRESERVE\",\"logical_id\":\"vm200\"},{\"id\":\"9130\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm9130\"}]\nREGISTRY_ACTIVE_LOGICALS=[\"app-filebrowser\",\"app-hbarhub\",\"app-immich\",\"app-skladchik-reports-monitor\",\"control-bootstrap-v2\",\"vm110\",\"vm111\",\"vm112\",\"vm113\",\"vm130\",\"vm150\",\"vm160\",\"vm170\",\"vm171\",\"vm190\",\"vm9130\"]\nREGISTRY_ACTIVE_COUNT=16\nV2_STATE_COUNT=29\nV2_STATES=[{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"control-bootstrap-v2.json\",\"generation\":\"control-bootstrap-v2-pve01-20260916T120057Z\",\"green_verified\":null,\"json_valid\":true,\"last_attempt_epoch\":1789930298,\"last_success_epoch\":1789930298,\"logical_id\":\"control-bootstrap-v2\",\"quorum\":null,\"replica_count\":null,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":28977},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"ct110.json\",\"generation\":\"v2-ct110-20260920T181158Z-25703b1ef77f\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789928120,\"last_success_epoch\":1789928120,\"logical_id\":\"ct110\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":31155},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"ct111.json\",\"generation\":\"v2-ct111-20260920T200749Z-a2bac7e3ecb7\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789935021,\"last_success_epoch\":1789935021,\"logical_id\":\"ct111\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":24254},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"ct112.json\",\"generation\":\"v2-ct112-20260920T214958Z-30e3291e1543\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789941076,\"last_success_epoch\":1789941076,\"logical_id\":\"ct112\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":18199},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"ct113.json\",\"generation\":\"v2-ct113-20260920T222532Z-4f4a608def82\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789943241,\"last_success_epoch\":1789943241,\"logical_id\":\"ct113\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":16034},{\"consecutive_failures\":5,\"failure_backoff_seconds\":21600,\"file\":\"guest-pve01-lxc-112.json\",\"generation\":null,\"green_verified\":null,\"json_valid\":true,\"last_attempt_epoch\":1789938729,\"last_success_epoch\":1789799511,\"logical_id\":\"guest-pve01-lxc-112\",\"quorum\":null,\"replica_count\":null,\"result\":\"FAIL\",\"retry_count\":null,\"status\":null,\"success_age_sec\":159764},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"md-relay.json\",\"generation\":\"v2-md-relay-20260920T140452Z-1943a8c57bd6\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789913115,\"last_success_epoch\":1789913115,\"logical_id\":\"md-relay\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":46160},{\"consecutive_failures\":null,\"failure_backoff_seconds\":null,\"file\":\"node-pve01.json\",\"generation\":\"v2-node-pve01-20260915T040859Z-9187f2b9a0b4\",\"green_verified\":true,\"json_valid\":true,\"last_attempt_epoch\":null,\"last_success_epoch\":1789445359,\"logical_id\":\"node-pve01\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":513916},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"node-pve02.json\",\"generation\":\"v2-node-pve02-20260918T011512Z-59f345bf9a9b\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789694135,\"last_success_epoch\":1789694135,\"logical_id\":\"node-pve02\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":265140},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"node-pve03.json\",\"generation\":\"v2-node-pve03-20260918T015457Z-204ac5a3eb03\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789696518,\"last_success_epoch\":1789696518,\"logical_id\":\"node-pve03\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":262757},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"router-netcraze.json\",\"generation\":\"v2-router-netcraze-20260920T155444Z-a91b2efdb4fe\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789919711,\"last_success_epoch\":1789919711,\"logical_id\":\"router-netcraze\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":39564},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"spb-ingress.json\",\"generation\":\"v2-spb-ingress-20260920T151616Z-9d80091d0c4c\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789917397,\"last_success_epoch\":1789917397,\"logical_id\":\"spb-ingress\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":41878},{\"consecutive_failures\":10,\"failure_backoff_seconds\":21600,\"file\":\"us-netbird.json\",\"generation\":\"v2-us-netbird-20260921T015632Z-dc499030a55f\",\"green_verified\":null,\"json_valid\":true,\"last_attempt_epoch\":1789955807,\"last_success_epoch\":1789704670,\"logical_id\":\"us-netbird\",\"quorum\":null,\"replica_count\":null,\"result\":\"FAIL\",\"retry_count\":null,\"status\":null,\"success_age_sec\":254605},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm130.json\",\"generation\":\"v2-vm130-20260920T233759Z-c9518c8be2c3\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789948633,\"last_success_epoch\":1789948633,\"logical_id\":\"vm130\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":10642},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm150.json\",\"generation\":\"v2-vm150-20260920T230035Z-e0880e47ea55\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789945347,\"last_success_epoch\":1789945347,\"logical_id\":\"vm150\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":13928},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm160.json\",\"generation\":\"v2-vm160-20260921T001432Z-31df1acfee7a\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789950100,\"last_success_epoch\":1789950100,\"logical_id\":\"vm160\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":9175},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm170.json\",\"generation\":\"v2-vm170-20260921T023516Z-53ad6a6b10f9\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789958880,\"last_success_epoch\":1789958880,\"logical_id\":\"vm170\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":395},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm171.json\",\"generation\":\"v2-vm171-20260921T004759Z-537db1552014\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789951877,\"last_success_epoch\":1789951877,\"logical_id\":\"vm171\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":7398},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm190.json\",\"generation\":\"v2-vm190-20260921T012544Z-298b64987988\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789954139,\"last_success_epoch\":1789954139,\"logical_id\":\"vm190\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":5136},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm210.json\",\"generation\":\"v2-vm210-20260920T203832Z-458da35ec027\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789936798,\"last_success_epoch\":1789936798,\"logical_id\":\"vm210\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":22477},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm211.json\",\"generation\":\"v2-vm211-20260919T203132Z-82878bb22008\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789849984,\"last_success_epoch\":1789849984,\"logical_id\":\"vm211\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":109291},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm9130.json\",\"generation\":\"v2-vm9130-20260919T210758Z-0aa987efac8c\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789853557,\"last_success_epoch\":1789853557,\"logical_id\":\"vm9130\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":105718},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-codevipe.json\",\"generation\":\"v2-xf-codevipe-20260920T162616Z-da4e8fcf3129\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789922324,\"last_success_epoch\":1789922324,\"logical_id\":\"xf-codevipe\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":36951},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-dsmods.json\",\"generation\":\"v2-xf-dsmods-20260919T214716Z-c783be0bd209\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789860411,\"last_success_epoch\":1789860411,\"logical_id\":\"xf-dsmods\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":98864},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-gamevipe.json\",\"generation\":\"v2-xf-gamevipe-20260920T015714Z-762dbd7ce0d7\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789882268,\"last_success_epoch\":1789882268,\"logical_id\":\"xf-gamevipe\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":77007},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-hkmods.json\",\"generation\":\"v2-xf-hkmods-20260920T071214Z-6407219f0624\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789906789,\"last_success_epoch\":1789906789,\"logical_id\":\"xf-hkmods\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":52486},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-kingofwolk.json\",\"generation\":\"v2-xf-kingofwolk-20260919T232652Z-cb0189b2b0ba\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789861037,\"last_success_epoch\":1789861037,\"logical_id\":\"xf-kingofwolk\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":98238},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-newfi.json\",\"generation\":\"v2-xf-newfi-20260920T004616Z-6be6559a5589\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789865619,\"last_success_epoch\":1789865619,\"logical_id\":\"xf-newfi\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":93656},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-zakrutim.json\",\"generation\":\"v2-xf-zakrutim-20260920T173658Z-a8de3568c79b\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789926652,\"last_success_epoch\":1789926652,\"logical_id\":\"xf-zakrutim\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":32623}]\nACTIVE_WITHOUT_V2_STATE=[\"app-filebrowser\",\"app-hbarhub\",\"app-immich\",\"app-skladchik-reports-monitor\",\"vm110\",\"vm111\",\"vm112\",\"vm113\"]\nACTIVE_STATE_SUMMARY=[{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"control-bootstrap-v2.json\",\"generation\":\"control-bootstrap-v2-pve01-20260916T120057Z\",\"green_verified\":null,\"json_valid\":true,\"last_attempt_epoch\":1789930298,\"last_success_epoch\":1789930298,\"logical_id\":\"control-bootstrap-v2\",\"quorum\":null,\"replica_count\":null,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":28977},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm130.json\",\"generation\":\"v2-vm130-20260920T233759Z-c9518c8be2c3\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789948633,\"last_success_epoch\":1789948633,\"logical_id\":\"vm130\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":10642},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm150.json\",\"generation\":\"v2-vm150-20260920T230035Z-e0880e47ea55\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789945347,\"last_success_epoch\":1789945347,\"logical_id\":\"vm150\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":13928},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm160.json\",\"generation\":\"v2-vm160-20260921T001432Z-31df1acfee7a\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789950100,\"last_success_epoch\":1789950100,\"logical_id\":\"vm160\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":9175},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm170.json\",\"generation\":\"v2-vm170-20260921T023516Z-53ad6a6b10f9\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789958880,\"last_success_epoch\":1789958880,\"logical_id\":\"vm170\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":395},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm171.json\",\"generation\":\"v2-vm171-20260921T004759Z-537db1552014\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789951877,\"last_success_epoch\":1789951877,\"logical_id\":\"vm171\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":7398},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm190.json\",\"generation\":\"v2-vm190-20260921T012544Z-298b64987988\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789954139,\"last_success_epoch\":1789954139,\"logical_id\":\"vm190\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":5136},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm9130.json\",\"generation\":\"v2-vm9130-20260919T210758Z-0aa987efac8c\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789853557,\"last_success_epoch\":1789853557,\"logical_id\":\"vm9130\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":105718}]\nV2_WRAPPER_META={\"exists\":true,\"is_symlink\":false,\"sha256\":\"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2\"}\nV2_SOURCE_HINTS=[{\"file\":\"/usr/local/sbin/.homelab-command-adapter.new.1544389\",\"line\":1089,\"text\":\" \\\"capsule retry client IP mismatch\\\"\"},{\"file\":\"/usr/local/sbin/.homelab-command-adapter.new.1544389\",\"line\":1118,\"text\":\" \\\"idempotent_retry\\\": True,\"},{\"file\":\"/usr/local/sbin/__pycache__/homelab-backup-matrix-refreshcpython-313.pyc\",\"line\":171,\"text\":\"age_seconds\\ufffd\\u0017generated_health_output)\\u0003rk\\u0000\\u0000\\u0000\\ufffd\\tfreshnessr}\\u0000\\u0000\\u0000r&\\u0000\\u0000\\u0000\\ufffd\\u0006shadowz\\u0007STATUS=z\\u0003TS=z\\u0007JOB_ID=z\\tJOB_NAME=z\"},{\"file\":\"/usr/local/sbin/__pycache__/homelab-backup-matrix-refreshcpython-313.pyc\",\"line\":176,\"text\":\"FRESHNESS=z\\u0004.txtr1\\u0000\\u0000\\u0000\\ufffd\\u0015compatibility_outputs\\ufffd\"},{\"file\":\"/usr/local/sbin/__pycache__/homelab-reference-refreshcpython-313.pyc\",\"line\":107,\"text\":\"Nr\\u0003\\u0000\\u0000\\u0000\\ufffd\\u0011freshness_secondsi\\u0010\\u000e\\u0000\\u0000)\\u0001\\ufffd\\u0007seconds)\\u0003\\ufffd\\u0006source\\ufffd\"},{\"file\":\"/usr/local/sbin/__pycache__/homelab-safe-runcpython-313.pyc\",\"line\":23,\"text\":\"kb/lessons/known_failures.jsonz!kb/current/02_FRESHNESS_POLICY.md\\ufffd\\u001fkb/policies/command_policy.jsonz\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":5,\"text\":\"PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":14,\"text\":\"FRESHNESS_SECONDS=\\\"$(\\\"$REGISTRY_HELPER\\\" freshness-seconds APP)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":16,\"text\":\"(( DUE_SECONDS > 0 && DUE_SECONDS < FRESHNESS_SECONDS )) || { printf 'APP_QUORUM_QUEUE_ERROR=DUE_THRESHOLD_INVALID\\\\n' >&2; exit 65; }\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":31,\"text\":\"freshness_decision(){\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":39,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_RESUME GENERATION=%s\\\\n' \\\"$app\\\" \\\"$generation\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":45,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_EPOCH_INVALID\\\\n' \\\"$app\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":50,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=SKIP_FRESH GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$app\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":51,\"text\":\" elif (( age >= DUE_SECONDS && age < FRESHNESS_SECONDS )); then\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":52,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_DUE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$app\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":53,\"text\":\" elif (( age >= FRESHNESS_SECONDS )); then\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":54,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_STALE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$app\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":56,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_TIMESTAMP_IN_FUTURE GENERATION=%s AGE_SECONDS=%s\\\\n' \\\"$app\\\" \\\"$generation\\\" \\\"$age\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":60,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED\\\\n' \\\"$app\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":63,\"text\":\" die \\\"FRESHNESS_DECISION_INVALID_${app}_${decision:-EMPTY}\\\" 65\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":67,\"text\":\"freshness_plan(){\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":69,\"text\":\" [[ -x \\\"$PROBE\\\" && ! -L \\\"$PROBE\\\" ]] || die FRESHNESS_PROBE_NOT_INSTALLED 69\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":72,\"text\":\" out=\\\"$(freshness_decision \\\"$a\\\" \\\"$now_epoch\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":74,\"text\":\" decision=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\\\"\\\",$i);print $i}}' <<<\\\"$out\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":75,\"text\":\" [[ -n \\\"$decision\\\" ]] || die \\\"FRESHNESS_PLAN_DECISION_MISSING_$a\\\" 65\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":76,\"text\":\" printf 'QUEUE_FRESHNESS_PLAN APP=%s DECISION=%s\\\\n' \\\"$a\\\" \\\"$decision\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":90,\"text\":\" freshness_plan\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":93,\"text\":\" local a=\\\"$1\\\" freshness decision now_epoch out generation\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":107,\"text\":\" freshness=\\\"$(exec 8>&-; exec 9>&-; freshness_decision \\\"$a\\\" \\\"$now_epoch\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":108,\"text\":\" printf '%s\\\\n' \\\"$freshness\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":109,\"text\":\" decision=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\\\"\\\",$i);print $i}}' <<<\\\"$freshness\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":112,\"text\":\" generation=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^GENERATION=/){sub(/^GENERATION=/,\\\"\\\",$i);print $i}}' <<<\\\"$freshness\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":117,\"text\":\" *) die \\\"FRESHNESS_RECHECK_INVALID_${a}_${decision:-EMPTY}\\\" 65 ;;\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":150,\"text\":\" freshness-plan) [[ \\\"$#\\\" == 1 ]] || die USAGE_FRESHNESS_PLAN 64; freshness_plan ;;\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":12,\"text\":\"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":14,\"text\":\"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":105,\"text\":\" value=\\\"$(awk -F= '$1==\\\"FRESHNESS_SECONDS\\\"{print $2; exit}' \\\"$file\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":140,\"text\":\" printf 'CONTRACT|task=%s|target_registry=CANONICAL|vm_count=%s|app_count=%s|control_sla_seconds=%s|retention=ACTIVE_OWNER_AWARE|provider_worm=NOT_PROVEN_SKIPPED|dr_proof_source=EXACT_SITE_DR_FINAL_SEAL|legacy_site_dr_seal=AUTHORITATIVE|control_freshness=RECURRING_PRODUCER_12H_DUE_24H_SLA|full_site_dr=PROVEN_BY_SEAL\\\\n' \\\"$TASK_ID\\\" \\\"${#VMIDS[@]}\\\" \\\"${#APPS[@]}\\\" \\\"$CONTROL_SLA_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":153,\"text\":\" all|write-health|scheduled) ;;\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":154,\"text\":\" *) die \\\"USAGE_all_write-health_scheduled_contract\\\" 64 ;;\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":166,\"text\":\"vm_sla=\\\"$(\\\"$REGISTRY_HELPER\\\" freshness-seconds VM)\\\" || die VM_SLA_UNREADABLE\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":167,\"text\":\"app_sla=\\\"$(\\\"$REGISTRY_HELPER\\\" freshness-seconds APP)\\\" || die APP_SLA_UNREADABLE\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":220,\"text\":\" freshness_status=\\\"$(field FRESHNESS_STATUS <<<\\\"$out\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":223,\"text\":\" if [[ \\\"$freshness_status\\\" != OK ]]; then\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":260,\"text\":\" freshness_status=\\\"$(field FRESHNESS_STATUS <<<\\\"$out\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":263,\"text\":\" if [[ \\\"$freshness_status\\\" != OK ]]; then\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":345,\"text\":\"printf 'CONTROL|state=%s|CONTROL_FRESHNESS=%s|generation=%s|age_seconds=%s|sla_seconds=%s|archive_size_bytes=%s|restore_evidence_checked=%s|source_coverage=RESTORE_EVIDENCE|retention=ACTIVE_OWNER_AWARE\\\\n' \\\"$control_status\\\" \\\"$control_status\\\" \\\"$control_generation\\\" \\\"$control_age\\\" \\\"$CONTROL_SLA_SECONDS\\\" \\\"$control_archive_size\\\" \\\"$control_checked\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":391,\"text\":\"if [[ \\\"$mode\\\" == write-health || \\\"$mode\\\" == scheduled ]]; then\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":402,\"text\":\"scheduler_ok=0\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":412,\"text\":\" if [[ \\\"$load_state\\\" == loaded && \\\"$unit_file_state\\\" == enabled && \\\"$active_state\\\" == active && \\\"$result\\\" != failed && \\\"$service_result\\\" != failed ]]; then status=OK; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":415,\"text\":\" if [[ \\\"$load_state\\\" == not-found && \\\"$active_state\\\" == inactive ]]; then status=EXPECTED_ABSENT; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":527,\"text\":\"(( stale > 0 )) && add_risk HIGH RPO_BREACH\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":536,\"text\":\"printf 'SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=%s|RISK_SEVERITY=%s|RISK_REASONS=%s|DR_PROOF_STATUS=%s|CONTROL_FRESHNESS=%s|LIFECYCLE_STATUS=%s|VM_COUNT=%s|APP_COUNT=%s|FRESH=%s|STALE=%s|RESUME=%s|UNVERIFIED=%s|CONTROL_STATE=%s|CLOUD_OK=%s|SCHEDULER_OK=%s|SOURCE_OK=%s|SOURCE_DRIFT=%s|STAGING_BAD=%s|STAGING_WARN=%s|PAYLOAD_LEAKS=%s|RETENTION_STATUS=%s|OBSERVABILITY=%s|SIZE_ANOMALIES=%s|CAPACITY=%s|GLOBAL_DR_PROVEN=%s\\\\n' \\\"$backup_status\\\" \\\"$risk_severity\\\" \\\"$risk_reasons\\\" \\\"$dr_proof_status\\\" \\\"$control_status\\\" \\\"$lifecycle_status\\\" \\\"$vm_seen\\\" \\\"$app_seen\\\" \\\"$fresh\\\" \\\"$stale\\\" \\\"$resume\\\" \\\"$unverified\\\" \\\"$control_status\\\" \\\"$cloud_ok\\\" \\\"$scheduler_ok\\\" \\\"$source_ok\\\" \\\"$source_drift\\\" \\\"$staging_bad\\\" \\\"$staging_warn\\\" \\\"$payload_leaks\\\" \\\"$retention_status\\\" \\\"$observability_status\\\" \\\"$size_anomaly_count\\\" \\\"$capacity_status\\\" \\\"$global_dr_proven\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":538,\"text\":\"if [[ \\\"$mode\\\" == write-health || \\\"$mode\\\" == scheduled ]]; then\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":541,\"text\":\" jq -n --arg task \\\"$TASK_ID\\\" --arg change \\\"$CHANGE_ID\\\" --arg at \\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\" --arg backup \\\"$backup_status\\\" --arg risk \\\"$risk_severity\\\" --arg reasons \\\"$risk_reasons\\\" --arg control \\\"$control_status\\\" --arg dr \\\"$dr_proof_status\\\" --arg lifecycle \\\"$lifecycle_status\\\" --arg escrow \\\"$escrow_status\\\" --arg staging \\\"$staging_status\\\" --arg retention \\\"$retention_status\\\" --arg observability \\\"$observability_status\\\" --arg capacity \\\"$capacity_status\\\" --argjson historical \\\"$historical_gc_proven\\\" --argjson owner_gc \\\"$owner_aware_gc_proven\\\" --argjson staging_bad \\\"$staging_bad\\\" --argjson staging_warn \\\"$staging_warn\\\" --argjson vm_count \\\"$vm_seen\\\" --argjson app_count \\\"$app_seen\\\" --argjson fresh \\\"$fresh\\\" --argjson stale \\\"$stale\\\" --argjson resume \\\"$resume\\\" --argjson unverified \\\"$unverified\\\" --argjson cloud_ok \\\"$cloud_ok\\\" --argjson scheduler_ok \\\"$scheduler_ok\\\" --argjson source_ok \\\"$source_ok\\\" --argjson source_drift \\\"$source_drift\\\" --argjson payload_leaks \\\"$payload_leaks\\\" --argjson size_anoma\"},{\"file\":\"/usr/local/sbin/homelab-backup-dispatcher\",\"line\":15,\"text\":\" if [[ \\\"$kind\\\" == VM ]]; then [[ \\\"$line\\\" == QUEUE_FRESHNESS\\\\ VMID=* ]] || continue; else [[ \\\"$line\\\" == QUEUE_FRESHNESS\\\\ APP=* ]] || continue; fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":3,\"text\":\"OUT=\\\"${HL_OUTPUT_DIR:-/var/log/homelab-backup-freshness}\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":38,\"text\":\" echo \\\"# HELP homelab_backup_freshness_artifact_candidates_total Backup artifact candidates found by safe local collector.\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":39,\"text\":\" echo \\\"# TYPE homelab_backup_freshness_artifact_candidates_total gauge\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":40,\"text\":\" echo \\\"homelab_backup_freshness_artifact_candidates_total $TOTAL\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":41,\"text\":\" echo \\\"# HELP homelab_backup_freshness_newest_artifact_age_seconds Age of newest backup-like artifact candidate in seconds, -1 if none.\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":42,\"text\":\" echo \\\"# TYPE homelab_backup_freshness_newest_artifact_age_seconds gauge\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":43,\"text\":\" echo \\\"homelab_backup_freshness_newest_artifact_age_seconds $AGE\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":44,\"text\":\" echo \\\"# HELP homelab_backup_freshness_run_success Last backup freshness collector run status.\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":45,\"text\":\" echo \\\"# TYPE homelab_backup_freshness_run_success gauge\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":46,\"text\":\" echo \\\"homelab_backup_freshness_run_success 1\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":47,\"text\":\"} > \\\"$TEXTFILE/homelab_backup_freshness.prom\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":48,\"text\":\"chmod 0644 \\\"$TEXTFILE/homelab_backup_freshness.prom\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-matrix-refresh\",\"line\":112,\"text\":\" freshness=\\\"UNKNOWN\\\" if age<0 else (\\\"FRESH\\\" if age<=max_age else \\\"STALE\\\")\"},{\"file\":\"/usr/local/sbin/homelab-backup-matrix-refresh\",\"line\":114,\"text\":\" result={\\\"id\\\":jid,\\\"name\\\":name,\\\"category\\\":job.get(\\\"category\\\",\\\"unknown\\\"),\\\"critical\\\":critical,\\\"timer\\\":timer,\\\"service\\\":service,\\\"timer_enabled\\\":enabled,\\\"timer_active\\\":active,\\\"status\\\":final,\\\"source_kind\\\":source_kind,\\\"evidence_level\\\":evidence_level,\\\"service_result\\\":service_result,\\\"service_exec_main_status\\\":service_exec_main_status,\\\"source_health\\\":source,\\\"source_status\\\":source_status,\\\"source_mtime\\\":source_mtime,\\\"age_seconds\\\":age,\\\"max_age_seconds\\\":max_age,\\\"freshness\\\":freshness,\\\"generated_health_output\\\":job.get(\\\"generated_health_output\\\",\\\"\\\")}\"},{\"file\":\"/usr/local/sbin/homelab-backup-matrix-refresh\",\"line\":116,\"text\":\" mode_value=matrix.get(\\\"mode\\\",\\\"shadow\\\"); lines=[f\\\"STATUS={final}\\\",f\\\"TS={now_iso}\\\",\\\"TYPE=backup-matrix-generated\\\",f\\\"JOB_ID={jid}\\\",f\\\"JOB_NAME={name}\\\",f\\\"MATRIX_MODE={mode_value}\\\",f\\\"TIMER={timer}\\\",f\\\"SERVICE={service}\\\",f\\\"TIMER_ENABLED={enabled}\\\",f\\\"TIMER_ACTIVE={active}\\\",f\\\"SOURCE_KIND={source_kind}\\\",f\\\"EVIDENCE_LEVEL={evidence_level}\\\",f\\\"SERVICE_RESULT={service_result}\\\",f\\\"SERVICE_EXEC_MAIN_STATUS={service_exec_main_status}\\\",f\\\"SOURCE_HEALTH={source}\\\",f\\\"SOURCE_STATUS={source_status}\\\",f\\\"SOURCE_MTIME_UTC={source_mtime}\\\",f\\\"AGE_SECONDS={age}\\\",f\\\"MAX_AGE_SECONDS={max_age}\\\",f\\\"FRESHNESS={freshness}\\\"]\"},{\"file\":\"/usr/local/sbin/homelab-backup-npmplus-kuma-configs\",\"line\":70,\"text\":\" SELECT id || char(124) || name || char(124) || type || char(124) || url || char(124) || keyword || char(124) || interval || char(124) || maxretries || char(124) || retry_interval || char(124) || active\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":19,\"text\":\"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":20,\"text\":\"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":433,\"text\":\"scheduled(){\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":434,\"text\":\" exec 5>\\\"$LOCK\\\"; flock -n 5 || { printf 'GC_SCHEDULED=SKIP|reason=GC_LOCK_BUSY\\\\n'; return 0; }\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":443,\"text\":\" if (( count == 0 && open_tx == 0 )); then write_health \\\"$p1\\\" true 0; cat \\\"$p1\\\"; printf 'GC_SCHEDULED=OK|deleted=0|transactions_resumed=0\\\\n'; return 0; fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":444,\"text\":\" if ! acquire_gc_locks; then write_health \\\"$p1\\\" true 0; printf 'GC_SCHEDULED=SKIP|reason=BACKUP_LOCK_BUSY|candidates=%s|open_transactions=%s\\\\n' \\\"$count\\\" \\\"$open_tx\\\"; return 0; fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":449,\"text\":\" if (( count == 0 )); then write_health \\\"$p2\\\" true 0; cat \\\"$p2\\\"; printf 'GC_SCHEDULED=OK|deleted=0|transactions_resumed=%s\\\\n' \\\"$open_tx\\\"; return 0; fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":450,\"text\":\" cmp -s <(grep '^DELETE|' \\\"$p1\\\" | stable_delete_set) <(grep '^DELETE|' \\\"$p2\\\" | stable_delete_set) || { write_health \\\"$p2\\\" true 0; printf 'GC_SCHEDULED=SKIP|reason=PLAN_CHANGED_AFTER_LOCK\\\\n'; return 0; }\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":454,\"text\":\" printf 'GC_SCHEDULED=OK|deleted=%s|transactions_resumed=%s\\\\n' \\\"$deleted\\\" \\\"$open_tx\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":462,\"text\":\" scheduled) scheduled ;;\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":463,\"text\":\" *) die USAGE_contract_plan_canary_activate_scheduled 64 ;;\"},{\"file\":\"/usr/local/sbin/homelab-backup-sla-health\",\"line\":20,\"text\":\"echo \\\"## App backup freshness\\\" >> \\\"$REPORT\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-sla-health\",\"line\":50,\"text\":\"echo \\\"## Emergency backup freshness\\\" >> \\\"$REPORT\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-v2\",\"line\":5,\"text\":\"EXPECTED={'fresh_lxc_helper.py': 'dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011', 'producer_exec_helper.py': 'b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3', 'lxc_adapter.py': '3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d', 'qemu_adapter.py': '1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b', 'scheduler_adapter.py': 'a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96', 'entry504.py': 'ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793'}\"},{\"file\":\"/usr/local/sbin/homelab-command-adapter\",\"line\":1089,\"text\":\" \\\"capsule retry client IP mismatch\\\"\"},{\"file\":\"/usr/local/sbin/homelab-command-adapter\",\"line\":1118,\"text\":\" \\\"idempotent_retry\\\": True,\"},{\"file\":\"/usr/local/sbin/homelab-control-backup\",\"line\":105,\"text\":\" tmp=\\\"${HEALTH}.new.$$\\\"; jq -n --arg gen \\\"$gen\\\" --arg state \\\"$state\\\" --arg evidence \\\"$EVIDENCE_ROOT/$gen.json\\\" --arg sha \\\"$archive_sha\\\" --arg now \\\"$now\\\" '{schema:\\\"homelab-control-backup-health-v1\\\",status:\\\"OK\\\",generation:$gen,state_file:$state,restore_evidence:$evidence,archive_sha256:$sha,cloud_quorum:2,control_freshness:\\\"FRESH\\\",full_site_dr_proven:false,updated_at_utc:$now}' >\\\"$tmp\\\"; chmod 0644 \\\"$tmp\\\"; mv -f \\\"$tmp\\\" \\\"$HEALTH\\\"\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":13,\"text\":\"LOCK=/run/homelab-edge-vm-offhost-freshness.lock\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":23,\"text\":\" printf 'STATUS=ERROR TS=%s TYPE=edge-vm-offhost-freshness BAD=1 REASON=%s\\\\n' \\\"$TS\\\" \\\"$reason\\\" >\\\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\\\"\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":24,\"text\":\" chmod 0644 \\\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\\\"\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":25,\"text\":\" printf 'STATUS=ERROR TS=%s TYPE=edge-vm-offhost-freshness BAD=1 REASON=%s\\\\n' \\\"$TS\\\" \\\"$reason\\\"\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":153,\"text\":\"printf 'STATUS=OK TS=%s TYPE=edge-vm-offhost-freshness BAD=0 VMID=%s SOURCE_NODE=%s DEST_NODE=%s SRC=%s DEST=%s SIZE=%s SHA256=%s COPY_STATUS=%s ZSTD_RC=0 VMA_RC=0 KEEP=%s\\\\n' \\\\\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":155,\"text\":\" >\\\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\\\"\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":156,\"text\":\"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-backup NODE=%s VMID=%s ARCHIVE=%s SIZE=%s SHA256=%s NOTES=nightly_existing_dump_freshness\\\\n' \\\\\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":159,\"text\":\"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-offhost NODE=%s VMID=%s HOST=%s DEST=%s SIZE=%s SHA256=%s NOTES=nightly_existing_dump_freshness\\\\n' \\\\\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":162,\"text\":\"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-restore-verify HOST=%s VMID=%s ARCHIVE=%s SIZE=%s SHA256=%s ZSTD_RC=0 VMA_RC=0 NOTES=nightly_existing_dump_freshness\\\\n' \\\\\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":166,\"text\":\" \\\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\\\" \\\\\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":171,\"text\":\"printf 'STATUS=OK TS=%s TYPE=edge-vm-offhost-freshness BAD=0 COPY_STATUS=%s SIZE=%s SHA256=%s DEST=%s COMPLETE_COUNT=%s KEEP=%s\\\\n' \\\\\"},{\"file\":\"/usr/local/sbin/homelab-final-readiness-gate\",\"line\":18,\"text\":\"check \\\"backup framework evidence\\\" bash -c \\\"grep -q STATUS=OK /var/lib/homelab-health/backup-framework.txt && grep -q SOURCE_STATUS=OK /var/lib/homelab-health/backup-framework.txt && grep -q FRESHNESS=FRESH /var/lib/homelab-health/backup-framework.txt\\\"\"},{\"file\":\"/usr/local/sbin/homelab-mail-cloud-edge-vm-upload\",\"line\":7,\"text\":\"SOURCE_HEALTH=/var/lib/homelab-health/edge-vm-offhost-freshness.txt\"},{\"file\":\"/usr/local/sbin/homelab-mailru-trash-gc\",\"line\":183,\"text\":\" \\\"trash_debt_bytes\\\":\\\"UNKNOWN_PROVIDER_API\\\",\\\"last_success\\\":s}\"},{\"file\":\"/usr/local/sbin/homelab-reference-refresh\",\"line\":34,\"text\":\" f=int(json.loads((R/\\\"manifest.json\\\").read_text()).get(\\\"freshness_seconds\\\",{}).get(s,3600));z=(t+datetime.timedelta(seconds=f)).isoformat()\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":219,\"text\":\" \\\"task_id\\\":\\\"backup-rotating-boot-drill-escrow-freshness-v1\\\",\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":444,\"text\":\" return {\\\"schema\\\":\\\"homelab-rotating-boot-drill-state-v1\\\",\\\"sequence\\\":0,\\\"qemu_cursor\\\":None,\\\"lxc_cursor\\\":None,\\\"last_success_utc\\\":None,\\\"last_evidence\\\":None}\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":651,\"text\":\" print(f\\\"BOOT_DRILL_SCHEDULED=DEFERRED|reason={code}\\\")\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":688,\"text\":\" wait=int(p[\\\"initial_lock_wait_seconds\\\"] if mode==\\\"initial\\\" else p[\\\"scheduled_lock_wait_seconds\\\"])\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":734,\"text\":\" \\\"qemu_cursor\\\":q,\\\"lxc_cursor\\\":l,\\\"last_success_utc\\\":evidence[\\\"completed_at_utc\\\"],\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":749,\"text\":\" if mode==\\\"scheduled\\\" and e.code in (\\\"BACKUP_LOCK_BUSY\\\",\\\"ESCROW_SEMANTIC_PROOF_STALE\\\",\\\"CURRENT_BACKUP_AUDIT_NOT_DR_READY\\\",\\\"NO_QEMU_GUEST_AGENT_ELIGIBLE\\\",\\\"NO_LXC_RUNNING_ELIGIBLE\\\",\\\"STAGE_CAPACITY_INSUFFICIENT\\\",\\\"LOCAL_LVM_CAPACITY_INSUFFICIENT\\\"):\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":793,\"text\":\" elif action==\\\"scheduled\\\":\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":794,\"text\":\" execute(\\\"scheduled\\\",p)\"},{\"file\":\"/usr/local/sbin/homelab-safe-run\",\"line\":11,\"text\":\" \\\"kb/lessons/known_failures.json\\\",\\\"kb/current/02_FRESHNESS_POLICY.md\\\",\"},{\"file\":\"/usr/local/sbin/homelab-vm-backup-health\",\"line\":20,\"text\":\"if systemctl is-active --quiet homelab-edge-vm-offhost-freshness.timer; then DETAILS=\\\"$DETAILS edge-freshness-timer=active\\\"; else BAD=$((BAD+1)); DETAILS=\\\"$DETAILS edge-freshness-timer=bad\\\"; fi\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":6,\"text\":\"PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":9,\"text\":\"FRESHNESS_SECONDS=72000\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":16,\"text\":\"(( DUE_SECONDS > 0 && DUE_SECONDS < FRESHNESS_SECONDS )) || die DUE_THRESHOLD_INVALID 65\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":80,\"text\":\"freshness_decision(){\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":88,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_RESUME GENERATION=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":94,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_EPOCH_INVALID\\\\n' \\\"$vmid\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":99,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=SKIP_FRESH GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":100,\"text\":\" elif (( age >= DUE_SECONDS && age < FRESHNESS_SECONDS )); then\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":101,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_DUE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":102,\"text\":\" elif (( age >= FRESHNESS_SECONDS )); then\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":103,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_STALE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":105,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_TIMESTAMP_IN_FUTURE GENERATION=%s AGE_SECONDS=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\" \\\"$age\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":109,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED\\\\n' \\\"$vmid\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":112,\"text\":\" die \\\"FRESHNESS_DECISION_INVALID_${vmid}_${decision:-EMPTY}\\\" 65\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":116,\"text\":\"freshness_plan(){\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":118,\"text\":\" [[ -x \\\"$PROBE\\\" ]] || die \\\"FRESHNESS_PROBE_NOT_INSTALLED\\\" 69\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":121,\"text\":\" out=\\\"$(freshness_decision \\\"$vmid\\\" \\\"$now_epoch\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":123,\"text\":\" decision=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\\\"\\\",$i);print $i}}' <<<\\\"$out\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":124,\"text\":\" [[ -n \\\"$decision\\\" ]] || die \\\"FRESHNESS_PLAN_DECISION_MISSING_$vmid\\\" 65\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":125,\"text\":\" printf 'QUEUE_FRESHNESS_PLAN VMID=%s DECISION=%s\\\\n' \\\"$vmid\\\" \\\"$decision\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":144,\"text\":\" freshness_plan\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":147,\"text\":\" local vmid=\\\"$1\\\" freshness decision now_epoch out generation\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":161,\"text\":\" freshness=\\\"$(exec 8>&-; exec 9>&-; freshness_decision \\\"$vmid\\\" \\\"$now_epoch\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":162,\"text\":\" printf '%s\\\\n' \\\"$freshness\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":163,\"text\":\" decision=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\\\"\\\",$i);print $i}}' <<<\\\"$freshness\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":166,\"text\":\" generation=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^GENERATION=/){sub(/^GENERATION=/,\\\"\\\",$i);print $i}}' <<<\\\"$freshness\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":171,\"text\":\" *) die \\\"FRESHNESS_RECHECK_INVALID_${vmid}_${decision:-EMPTY}\\\" 65 ;;\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":188,\"text\":\" freshness-plan)\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":189,\"text\":\" [[ \\\"$#\\\" == 1 ]] || die \\\"USAGE_FRESHNESS_PLAN\\\" 64\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":190,\"text\":\" freshness_plan\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-status\",\"line\":44,\"text\":\"CANONICAL_PROBE=\\\"/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\\\"\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-status\",\"line\":52,\"text\":\" grep -q '^FRESHNESS_STATUS=OK$' <<<\\\"$CANONICAL_OUTPUT\\\" || PROBLEMS=$((PROBLEMS+1))\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":24,\"text\":\"APP_FRESHNESS_PROBE = Path(\\\"/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\\\")\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":132,\"text\":\"# HOMELAB_COOKIE_JAR_RETRY_423\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":225,\"text\":\" shlex.quote(str(APP_FRESHNESS_PROBE)) + \\\" decision skladchik-reports-monitor\\\",\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":230,\"text\":\" facts[\\\"canonical_backup_status\\\"] = probe.get(\\\"FRESHNESS_STATUS\\\", \\\"MISSING\\\")\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":239,\"text\":\" if probe.get(\\\"FRESHNESS_STATUS\\\") != \\\"OK\\\":\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":286,\"text\":\" f\\\"- freshness status: {facts.get('canonical_backup_status')}\\\",\"}]\nCLOUD_STATE={\"A\":{\"about\":{\"free\":293208518329,\"total\":1099511627776,\"used\":806303109447},\"about_rc\":0,\"lsf_rc\":0,\"stderr_lines\":[],\"top_dirs_count\":26},\"B\":{\"about\":{\"free\":293208454470,\"total\":1099511627776,\"used\":806303173306},\"about_rc\":0,\"lsf_rc\":0,\"stderr_lines\":[],\"top_dirs_count\":26}}\nCLOUD_B_RESTORE_CANDIDATES=[]\nCLOUD_B_RESTORE_PREFERRED=null\nRETENTION_IMPLEMENTATION=[{\"bytes\":327,\"interface_lines\":[{\"line\":2,\"text\":\"Description=Homelab owner-aware cloud retention GC\"},{\"line\":5,\"text\":\"ConditionPathExists=/usr/local/sbin/homelab-backup-retention-gc\"},{\"line\":9,\"text\":\"ExecStart=/usr/local/sbin/homelab-backup-retention-gc scheduled\"},{\"line\":11,\"text\":\"IOSchedulingClass=best-effort\"}],\"path\":\"/etc/systemd/system/homelab-backup-retention-gc.service\",\"sha256\":\"0c49e10bdb225eeca0af5fca80aaf109addec2b18a6b892c0fe17c28b656ad7c\"},{\"bytes\":237,\"interface_lines\":[{\"line\":2,\"text\":\"Description=Run homelab owner-aware cloud retention GC daily\"},{\"line\":9,\"text\":\"Unit=homelab-backup-retention-gc.service\"}],\"path\":\"/etc/systemd/system/homelab-backup-retention-gc.timer\",\"sha256\":\"a0e763670745a5ef7c04b54da23114a013f47075cf36cceef0218bae9b82ea2f\"},{\"bytes\":7123,\"interface_lines\":[{\"line\":23,\"text\":\"KEEP=\\\"${10:?keep}\\\"\"},{\"line\":132,\"text\":\" [[ \\\"$(complete_count)\\\" == \\\"$KEEP\\\" ]]\"},{\"line\":138,\"text\":\" plan)\"},{\"line\":146,\"text\":\" printf 'REMOTE_PLAN_STATUS=OK\\\\n'\"},{\"line\":154,\"text\":\" [[ \\\"$(complete_count)\\\" == \\\"$KEEP\\\" ]]\"},{\"line\":167,\"text\":\" [[ \\\"$(complete_count)\\\" == \\\"$KEEP\\\" ]]\"},{\"line\":184,\"text\":\" [[ \\\"$(complete_count)\\\" == \\\"$KEEP\\\" ]]\"},{\"line\":206,\"text\":\" [[ \\\"$(complete_count)\\\" == \\\"$KEEP\\\" ]]\"}],\"path\":\"/usr/local/libexec/homelab-edge-vm-offhost-retention-worker\",\"sha256\":\"ca25a48b00c26e0eb5e64ac7d5e1d8f3805c200e30d9f87c5ef7c8da90402e54\"},{\"bytes\":4296,\"interface_lines\":[{\"line\":3,\"text\":\"KEEP=\\\"${1:-7}\\\"\"},{\"line\":4,\"text\":\"MODE=\\\"${2:-dry-run}\\\"\"},{\"line\":6,\"text\":\"[[ \\\"$KEEP\\\" =~ ^[0-9]+$ ]] || { echo \\\"BAD KEEP\\\"; exit 2; }\"},{\"line\":7,\"text\":\"(( KEEP >= 2 )) || { echo \\\"REFUSE keep<2\\\"; exit 2; }\"},{\"line\":8,\"text\":\"[[ \\\"$MODE\\\" == dry-run || \\\"$MODE\\\" == apply ]] || { echo \\\"BAD MODE\\\"; exit 2; }\"},{\"line\":31,\"text\":\"WORK=\\\"$(mktemp -d /tmp/app-retention-dual.XXXXXX)\\\"\"},{\"line\":71,\"text\":\" echo \\\"remote_index=$INDEX app=$APP canonical=$CANONICAL total=$TOTAL legacy=$LEGACY_TOTAL short=$SHORT_TOTAL keep=$KEEP mode=$MODE latest=${LATEST:-none}\\\"\"},{\"line\":76,\"text\":\" [[ \\\"$FOUND_LATEST\\\" -eq 1 ]] || { echo \\\"REFUSE latest not in retention set remote_index=$INDEX\\\"; exit 6; }\"},{\"line\":78,\"text\":\" if (( TOTAL <= KEEP )); then echo \\\"nothing to delete\\\"; continue; fi\"},{\"line\":79,\"text\":\" DELETE_COUNT=$((TOTAL-KEEP))\"},{\"line\":80,\"text\":\" for ((I=0; I= 2 )) || { echo \\\"REFUSE keep<2\\\"; exit 2; }\"},{\"line\":7,\"text\":\"[[ \\\"$MODE\\\" == \\\"dry-run\\\" || \\\"$MODE\\\" == \\\"apply\\\" ]] || { echo \\\"BAD MODE\\\"; exit 2; }\"},{\"line\":21,\"text\":\" echo \\\"total=$TOTAL keep=$KEEP mode=$MODE latest=${LATEST:-none}\\\"\"},{\"line\":22,\"text\":\" if (( TOTAL <= KEEP )); then echo \\\"nothing to delete\\\"; continue; fi\"},{\"line\":23,\"text\":\" DELETE_COUNT=$((TOTAL-KEEP))\"},{\"line\":24,\"text\":\" for ((i=0; i&2; exit 69; }\"},{\"line\":28,\"text\":\"[[ \\\"$(sha256sum \\\"$REGISTRY_HELPER\\\"|awk '{print $1}')\\\" == \\\"$REGISTRY_HELPER_SHA_EXPECTED\\\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=TARGET_REGISTRY_HELPER_SHA_DRIFT\\\\n' >&2; exit 65; }\"},{\"line\":29,\"text\":\"\\\"$REGISTRY_HELPER\\\" validate >/dev/null || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=TARGET_REGISTRY_INVALID\\\\n' >&2; exit 66; }\"},{\"line\":30,\"text\":\"[[ -x \\\"$GFS_HELPER\\\" && ! -L \\\"$GFS_HELPER\\\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_HELPER_MISSING\\\\n' >&2; exit 69; }\"},{\"line\":31,\"text\":\"[[ \\\"$(sha256sum \\\"$GFS_HELPER\\\"|awk '{print $1}')\\\" == \\\"$GFS_HELPER_SHA_EXPECTED\\\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_HELPER_SHA_DRIFT\\\\n' >&2; exit 65; }\"},{\"line\":32,\"text\":\"HOMELAB_BACKUP_GFS_POLICY=\\\"$GFS_POLICY\\\" \\\"$GFS_HELPER\\\" validate >/dev/null || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_INVALID\\\\n' >&2; exit 66; }\"},{\"line\":35,\"text\":\"GFS_CRITICAL_COUNT=\\\"$(HOMELAB_BACKUP_GFS_POLICY=\\\"$GFS_POLICY\\\" \\\"$GFS_HELPER\\\" critical-logicals | wc -l)\\\"\"},{\"line\":36,\"text\":\"VM_KEEP=\\\"$(\\\"$REGISTRY_HELPER\\\" policy-keep VM)\\\"\"},{\"line\":37,\"text\":\"APP_KEEP=\\\"$(\\\"$REGISTRY_HELPER\\\" policy-keep APP)\\\"\"},{\"line\":38,\"text\":\"CONTROL_KEEP=\\\"$(\\\"$REGISTRY_HELPER\\\" policy-keep CONTROL)\\\"\"},{\"line\":39,\"text\":\"MIN_DELETE_AGE_SECONDS=86400\"},{\"line\":42,\"text\":\"die(){ local msg=\\\"$1\\\" rc=\\\"${2:-65}\\\"; trap - ERR; printf 'GC_STATUS=ERROR|ROOT_CAUSE=%s\\\\n' \\\"$msg\\\" >&2; exit \\\"$rc\\\"; }\"},{\"line\":44,\"text\":\"stable_delete_set(){ sed -E 's/\\\\|age_seconds=[0-9]+$//'; }\"},{\"line\":50,\"text\":\"keep_for(){ \\\"$REGISTRY_HELPER\\\" retention-keep \\\"$1\\\" 2>/dev/null; }\"},{\"line\":51,\"text\":\"logical_list(){ \\\"$REGISTRY_HELPER\\\" retention-logicals; }\"},{\"line\":58,\"text\":\" TMPROOT=\\\"/run/homelab-retention-gc.$$\\\"\"},{\"line\":74,\"text\":\" jq -e --arg l \\\"$logical\\\" --arg g \\\"$generation\\\" '.schema==\\\"homelab-cloud-quorum-payload-v1\\\" and .logical_id==$l and .generation==$g and .status==\\\"SEALED\\\" and .cloud_quorum==2 and .cloud_a_verified==true and .cloud_b_verified==true and .part_hashes_verified==true and .seal_written==true and .cloud_a_seal_verified==true and .cloud_b_seal_verified==true and .local_delete_allowed==true and .local_payload_present==false and .local_cleanup==\\\"OK\\\"' <<<\\\"$json\\\" >/dev/null\"},{\"line\":106,\"text\":\" f=\\\"$RETENTION_ROOT/transactions/$logical/$generation.json\\\"\"},{\"line\":111,\"text\":\" f=\\\"$RETENTION_ROOT/transactions/$logical/$generation.json\\\"\"},{\"line\":117,\"text\":\" [[ -d \\\"$RETENTION_ROOT/transactions\\\" ]] || { printf '0\\\\n'; return 0; }\"},{\"line\":123,\"text\":\" PLANNED|B_DELETED) count=$((count+1)) ;;\"},{\"line\":126,\"text\":\" done < <(find \\\"$RETENTION_ROOT/transactions\\\" -type f -name '*.json' -print | LC_ALL=C sort)\"},{\"line\":130,\"text\":\"pinned_delete_contract_enabled(){\"},{\"line\":131,\"text\":\" [[ -n \\\"${HOMELAB_RETENTION_PINNED_DELETE_FILE:-}\\\" || -n \\\"${HOMELAB_RETENTION_PINNED_DELETE_SHA256:-}\\\" ]]\"},{\"line\":133,\"text\":\"pinned_delete_assert_file(){\"},{\"line\":134,\"text\":\" local f=\\\"${HOMELAB_RETENTION_PINNED_DELETE_FILE:-}\\\" expected=\\\"${HOMELAB_RETENTION_PINNED_DELETE_SHA256:-}\\\" actual line logical generation owner state_file state_sha count=0\"},{\"line\":135,\"text\":\" [[ -n \\\"$f\\\" && -n \\\"$expected\\\" ]] || die PINNED_DELETE_CONTRACT_INCOMPLETE 64\"},{\"line\":136,\"text\":\" [[ \\\"$expected\\\" =~ ^[0-9a-f]{64}$ ]] || die PINNED_DELETE_SHA_INVALID 64\"},{\"line\":137,\"text\":\" [[ -f \\\"$f\\\" && ! -L \\\"$f\\\" ]] || die PINNED_DELETE_FILE_UNSAFE 64\"},{\"line\":139,\"text\":\" [[ \\\"$actual\\\" == \\\"$expected\\\" ]] || die PINNED_DELETE_FILE_SHA_MISMATCH 66\"},{\"line\":141,\"text\":\" [[ -n \\\"$line\\\" ]] || die PINNED_DELETE_EMPTY_LINE 66\"},{\"line\":147,\"text\":\" [[ \\\"$line\\\" == \\\"DELETE|logical=$logical|generation=$generation|owner=$owner|state_file=$state_file|state_sha256=$state_sha\\\" ]] || die PINNED_DELETE_LINE_FORMAT_INVALID 66\"},{\"line\":148,\"text\":\" [[ \\\"$(node_for_logical \\\"$logical\\\")\\\" == \\\"$owner\\\" ]] || die \\\"PINNED_DELETE_OWNER_INVALID_${logical}\\\" 66\"},{\"line\":149,\"text\":\" safe_generation \\\"$logical\\\" \\\"$generation\\\" || die \\\"PINNED_DELETE_GENERATION_INVALID_${logical}\\\" 66\"},{\"line\":150,\"text\":\" [[ \\\"$state_file\\\" == \\\"$STATE_ROOT/$logical/$generation.json\\\" ]] || die \\\"PINNED_DELETE_STATE_PATH_INVALID_${logical}\\\" 66\"},{\"line\":151,\"text\":\" [[ \\\"$state_sha\\\" =~ ^[0-9a-f]{64}$ ]] || die \\\"PINNED_DELETE_STATE_SHA_INVALID_${logical}\\\" 66\"},{\"line\":154,\"text\":\" (( count > 0 )) || die PINNED_DELETE_FILE_EMPTY 66\"},{\"line\":155,\"text\":\" [[ \\\"$(LC_ALL=C sort \\\"$f\\\" | uniq | wc -l)\\\" == \\\"$count\\\" ]] || die PINNED_DELETE_FILE_DUPLICATE 66\"},{\"line\":160,\"text\":\" jq -e --arg task \\\"$TASK_ID\\\" --arg change \\\"$CHANGE_ID\\\" '.schema==\\\"homelab-backup-retention-transaction-v1\\\" and .task_id==$task and .change_id==$change and (.logical_id|type)==\\\"string\\\" and (.generation|type)==\\\"string\\\" and (.state_sha256|type)==\\\"string\\\" and (.status==\\\"PLANNED\\\" or .status==\\\"B_DELETED\\\" or .status==\\\"DONE\\\")' \\\"$f\\\" >/dev/null || die \\\"PINNED_TX_CONTENT_INVALID_$f\\\" 66\"},{\"line\":165,\"text\":\" expected_path=\\\"$RETENTION_ROOT/transactions/$logical/$generation.json\\\"\"},{\"line\":167,\"text\":\" printf 'DELETE|logical=%s|generation=%s|owner=%s|state_file=%s|state_sha256=%s\\\\n' \\\"$logical\\\" \\\"$generation\\\" \\\"$owner\\\" \\\"$STATE_ROOT/$logical/$generation.json\\\" \\\"$state_sha\\\"\"},{\"line\":170,\"text\":\" local root=\\\"$RETENTION_ROOT/transactions\\\" f\"},{\"line\":178,\"text\":\" local plan_file=\\\"$1\\\" line logical generation reason txf status\"},{\"line\":183,\"text\":\" [[ \\\"$reason\\\" == GC_TRANSACTION_PLANNED || \\\"$reason\\\" == GC_TRANSACTION_B_DELETED ]] || die \\\"PINNED_PLAN_UNEXPECTED_PROTECT_${logical}_${generation}_${reason}\\\" 66\"},{\"line\":184,\"text\":\" txf=\\\"$RETENTION_ROOT/transactions/$logical/$generation.json\\\"\"},{\"line\":185,\"text\":\" [[ -s \\\"$txf\\\" && ! -L \\\"$txf\\\" ]] || die \\\"PINNED_PLAN_PROTECT_TX_MISSING_${logical}_${generation}\\\" 66\"},{\"line\":187,\"text\":\" [[ \\\"GC_TRANSACTION_$status\\\" == \\\"$reason\\\" ]] || die \\\"PINNED_PLAN_PROTECT_STATUS_MISMATCH_${logical}_${generation}\\\" 66\"},{\"line\":188,\"text\":\" grep -Fqx \\\"$(pinned_tx_identity \\\"$txf\\\")\\\" \\\"$HOMELAB_RETENTION_PINNED_DELETE_FILE\\\" || die \\\"PINNED_PLAN_PROTECT_NOT_PINNED_${logical}_${generation}\\\" 66\"},{\"line\":189,\"text\":\" done < <(awk '/^PROTECT\\\\|/' \\\"$plan_file\\\")\"},{\"line\":191,\"text\":\"pinned_assert_delete_scope(){\"},{\"line\":192,\"text\":\" local plan_file=\\\"$1\\\" stage=\\\"$2\\\" actual expected f count_actual count_expected\"},{\"line\":193,\"text\":\" actual=\\\"$TMPROOT/pinned-delete-actual.$stage\\\"\"},{\"line\":194,\"text\":\" expected=\\\"$TMPROOT/pinned-delete-expected.$stage\\\"\"},{\"line\":195,\"text\":\" pinned_delete_assert_file\"},{\"line\":197,\"text\":\" pinned_assert_protect_scope \\\"$plan_file\\\"\"},{\"line\":198,\"text\":\" awk '/^DELETE\\\\|/' \\\"$plan_file\\\" | stable_delete_set >\\\"$actual\\\"\"},{\"line\":199,\"text\":\" if [[ -d \\\"$RETENTION_ROOT/transactions\\\" ]]; then\"},{\"line\":200,\"text\":\" while IFS= read -r f; do pinned_tx_identity \\\"$f\\\" >>\\\"$actual\\\"; done < <(find \\\"$RETENTION_ROOT/transactions\\\" -type f -name '*.json' -print | LC_ALL=C sort)\"},{\"line\":203,\"text\":\" LC_ALL=C sort \\\"$HOMELAB_RETENTION_PINNED_DELETE_FILE\\\" >\\\"$expected\\\"\"},{\"line\":205,\"text\":\" [[ \\\"$count_actual\\\" == \\\"$count_expected\\\" ]] || die \\\"PINNED_DELETE_SCOPE_COUNT_MISMATCH_${stage}\\\" 66\"},{\"line\":206,\"text\":\" [[ \\\"$(uniq \\\"$actual\\\" | wc -l)\\\" == \\\"$count_actual\\\" ]] || die \\\"PINNED_DELETE_SCOPE_DUPLICATE_${stage}\\\" 66\"},{\"line\":207,\"text\":\" cmp -s \\\"$actual\\\" \\\"$expected\\\" || die \\\"PINNED_DELETE_SCOPE_MISMATCH_${stage}\\\" 66\"},{\"line\":208,\"text\":\" printf 'PINNED_DELETE_SCOPE=OK|stage=%s|count=%s|sha256=%s\\\\n' \\\"$stage\\\" \\\"$count_expected\\\" \\\"$HOMELAB_RETENTION_PINNED_DELETE_SHA256\\\"\"},{\"line\":211,\"text\":\" printf 'CONTRACT|task=%s|policy=OWNER_AWARE_SAFE_GC_GFS|target_registry=CANONICAL|vm_keep=%s|app_keep=%s|control_keep=%s|min_delete_age_seconds=%s|gfs_critical=%s|gfs_weekly=%s|gfs_monthly=%s|gfs_completed_periods_only=YES|nonsealed=PROTECT|retired_preserve=PROTECT|unknown_namespace=PROTECT|owner_state_required=YES|both_clouds_required=YES|latest_restore_proven_required=YES|legacy_hb=PROTECT|legacy_pve01=PROTECT|legacy_control=PROTECT\\\\n' \\\"$TASK_ID\\\" \\\"$VM_KEEP\\\" \\\"$APP_KEEP\\\" \\\"$CONTROL_KEEP\\\" \\\"$MIN_DELETE_AGE_SECONDS\\\" \\\"$GFS_CRITICAL_COUNT\\\" \\\"$GFS_WEEKLY\\\" \\\"$GFS_MONTHLY\\\"\"},{\"line\":218,\"text\":\" if ! HOMELAB_BACKUP_GFS_POLICY=\\\"$GFS_POLICY\\\" \\\"$GFS_HELPER\\\" is-critical \\\"$logical\\\"; then return 0; fi\"},{\"line\":236,\"text\":\"plan(){\"},{\"line\":240,\"text\":\" local now logical node keep lifecycle open_count file json schema lid gen status sha sealed_at epoch age idx tx gfs_bucket candidates=0 protected=0 kept=0 gfs_kept=0\"},{\"line\":246,\"text\":\" if [[ \\\"$lifecycle\\\" == ACTIVE ]]; then keep=\\\"$(keep_for \\\"$logical\\\")\\\" || die \\\"KEEP_POLICY_UNKNOWN_$logical\\\"; else keep=0; fi\"},{\"line\":273,\"text\":\" while IFS=$'\\\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=LOGICAL_HAS_INCOMPLETE\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \\\"$TMPROOT/$logical.rows\\\")\"},{\"line\":277,\"text\":\" while IFS=$'\\\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=RETIRED_PRESERVE\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \\\"$TMPROOT/$logical.rows\\\")\"},{\"line\":281,\"text\":\" while IFS=$'\\\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=LATEST_RESTORE_NOT_PROVEN\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \\\"$TMPROOT/$logical.rows\\\")\"},{\"line\":290,\"text\":\" printf 'RETIRED|logical=%s|generation=%s|owner=%s|reason=GC_ALREADY_DONE\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\"\"},{\"line\":292,\"text\":\" printf 'PROTECT|logical=%s|generation=%s|owner=%s|reason=GC_TRANSACTION_%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$tx\\\"; protected=$((protected+1))\"},{\"line\":293,\"text\":\" elif (( idx <= keep )); then\"},{\"line\":294,\"text\":\" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=POLICY_NEWEST_%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$keep\\\"; kept=$((kept+1))\"},{\"line\":295,\"text\":\" elif (( age < MIN_DELETE_AGE_SECONDS )); then\"},{\"line\":296,\"text\":\" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=MIN_AGE|age_seconds=%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$age\\\"; kept=$((kept+1))\"},{\"line\":300,\"text\":\" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=GFS_WEEKLY|bucket=%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$gfs_bucket\\\"; kept=$((kept+1)); gfs_kept=$((gfs_kept+1))\"},{\"line\":302,\"text\":\" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=GFS_MONTHLY|bucket=%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$gfs_bucket\\\"; kept=$((kept+1)); gfs_kept=$((gfs_kept+1))\"},{\"line\":304,\"text\":\" printf 'DELETE|logical=%s|generation=%s|owner=%s|state_file=%s|state_sha256=%s|age_seconds=%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$file\\\" \\\"$sha\\\" \\\"$age\\\"\"},{\"line\":312,\"text\":\" printf 'PLAN_SUMMARY|delete_candidates=%s|protected=%s|kept=%s|vm_keep=%s|app_keep=%s|control_keep=%s|gfs_kept=%s|gfs_critical=%s|gfs_weekly=%s|gfs_monthly=%s\\\\n' \\\"$candidates\\\" \\\"$protected\\\" \\\"$kept\\\" \\\"$VM_KEEP\\\" \\\"$APP_KEEP\\\" \\\"$CONTROL_KEEP\\\" \\\"$gfs_kept\\\" \\\"$GFS_CRITICAL_COUNT\\\" \\\"$GFS_WEEKLY\\\" \\\"$GFS_MONTHLY\\\"\"},{\"line\":321,\"text\":\" path=\\\"$RETENTION_ROOT/transactions/$logical/$generation.json\\\"\"},{\"line\":324,\"text\":\" jq -n --arg task \\\"$TASK_ID\\\" --arg change \\\"$CHANGE_ID\\\" --arg l \\\"$logical\\\" --arg g \\\"$generation\\\" --arg s \\\"$state_sha\\\" --arg status \\\"$status\\\" --arg at \\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\" --argjson aa \\\"$a_absent\\\" --argjson ba \\\"$b_absent\\\" '{schema:\\\"homelab-backup-retention-transaction-v1\\\",task_id:$task,change_id:$change,logical_id:$l,generation:$g,state_sha256:$s,status:$status,updated_at_utc:$at,remote_a_absent:$aa,remote_b_absent:$ba}' >\\\"$tmp\\\"\"},{\"line\":328,\"text\":\"apply_delete_line(){\"},{\"line\":343,\"text\":\" (( age >= MIN_DELETE_AGE_SECONDS )) || die \\\"APPLY_AGE_GUARD_${logical}_${generation}\\\"\"},{\"line\":346,\"text\":\" write_tx \\\"$logical\\\" \\\"$generation\\\" \\\"$state_sha\\\" PLANNED false false\"},{\"line\":348,\"text\":\" remote_generation_present \\\"$REMOTE_B\\\" \\\"$logical\\\" \\\"$generation\\\" && die \\\"APPLY_REMOTE_B_DELETE_FAILED_${logical}_${generation}\\\"\"},{\"line\":349,\"text\":\" write_tx \\\"$logical\\\" \\\"$generation\\\" \\\"$state_sha\\\" B_DELETED false true\"},{\"line\":351,\"text\":\" remote_generation_present \\\"$REMOTE_A\\\" \\\"$logical\\\" \\\"$generation\\\" && die \\\"APPLY_REMOTE_A_DELETE_FAILED_${logical}_${generation}\\\"\"},{\"line\":353,\"text\":\" printf 'GC_DELETE_DONE|logical=%s|generation=%s|owner=%s\\\\n' \\\"$logical\\\" \\\"$generation\\\" \\\"$owner\\\"\"},{\"line\":357,\"text\":\" [[ -d \\\"$RETENTION_ROOT/transactions\\\" ]] || return 0\"},{\"line\":361,\"text\":\" [[ \\\"$status\\\" == PLANNED || \\\"$status\\\" == B_DELETED ]] || die \\\"TX_STATUS_INVALID_$f\\\"\"},{\"line\":372,\"text\":\" if [[ \\\"$status\\\" == PLANNED ]]; then\"},{\"line\":374,\"text\":\" remote_generation_present \\\"$REMOTE_B\\\" \\\"$logical\\\" \\\"$generation\\\" && die \\\"TX_REMOTE_B_DELETE_FAILED_${logical}_${generation}\\\"\"},{\"line\":375,\"text\":\" write_tx \\\"$logical\\\" \\\"$generation\\\" \\\"$state_sha\\\" B_DELETED false true\"}],\"path\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"sha256\":\"8adb6c10f5911f39c53775b89eac3cd1823f1ed34b4caccade5279c213e998a3\"},{\"bytes\":3140,\"interface_lines\":[{\"line\":7,\"text\":\"LOCK=/run/lock/homelab-vm-full-retention.lock\"},{\"line\":12,\"text\":\" local keep=\\\"$LOCAL_KEEP_PAIRS\\\"\"},{\"line\":27,\"text\":\" if ((${#archives[@]} <= keep)); then\"},{\"line\":31,\"text\":\" for archive in \\\"${archives[@]:keep}\\\"; do\"},{\"line\":57,\"text\":\" KEEP='$OFFHOST_KEEP_PAIRS'\"},{\"line\":69,\"text\":\" if [ \\\\\\\"\\\\$count\\\\\\\" -gt \\\\\\\"\\\\$KEEP\\\\\\\" ]; then\"},{\"line\":86,\"text\":\" local keep=$3\"},{\"line\":99,\"text\":\" if ((${#dirs[@]} <= keep)); then\"},{\"line\":103,\"text\":\" for dir in \\\"${dirs[@]:keep}\\\"; do\"},{\"line\":113,\"text\":\" prune_cloud_tier \\\"$remote\\\" daily \\\"$KEEP_DAILY\\\"\"},{\"line\":114,\"text\":\" prune_cloud_tier \\\"$remote\\\" weekly \\\"$KEEP_WEEKLY\\\"\"},{\"line\":115,\"text\":\" prune_cloud_tier \\\"$remote\\\" monthly \\\"$KEEP_MONTHLY\\\"\"},{\"line\":116,\"text\":\" prune_cloud_tier \\\"$remote\\\" quarterly \\\"$KEEP_QUARTERLY\\\"\"},{\"line\":119,\"text\":\"echo \\\"RETENTION_STATUS=OK\\\"\"}],\"path\":\"/usr/local/sbin/homelab-vm-full-retention\",\"sha256\":\"a3cced5263960557d3501123d57f95f12fcede45116111d3d5f02283497d4e63\"},{\"bytes\":2081,\"interface_lines\":[{\"line\":4,\"text\":\"MODE=\\\"${1:-dry-run}\\\"\"},{\"line\":5,\"text\":\"KEEP=\\\"${KEEP:-2}\\\"\"},{\"line\":6,\"text\":\"OUT=\\\"/var/lib/homelab-health/vm-local-dumps-retention.txt\\\"\"},{\"line\":8,\"text\":\"REPORT=\\\"$ROOT/vm-local-dumps-retention-latest.md\\\"\"},{\"line\":15,\"text\":\"DELETED=0\"},{\"line\":16,\"text\":\"WOULD_DELETE=0\"},{\"line\":21,\"text\":\"echo \\\"# Homelab VM local dumps cloud retention\\\" >> \\\"$REPORT\\\"\"},{\"line\":25,\"text\":\"echo \\\"keep=$KEEP\\\" >> \\\"$REPORT\\\"\"},{\"line\":36,\"text\":\" if [ \\\"$TOTAL\\\" -le \\\"$KEEP\\\" ]; then\"},{\"line\":37,\"text\":\" echo \\\"nothing_to_delete\\\" >> \\\"$REPORT\\\"\"},{\"line\":42,\"text\":\" DELETE_COUNT=$((TOTAL-KEEP))\"},{\"line\":46,\"text\":\" if [ \\\"$IDX\\\" -le \\\"$DELETE_COUNT\\\" ]; then\"},{\"line\":55,\"text\":\" echo \\\"DELETE $PATH_REMOTE\\\" >> \\\"$REPORT\\\"\"},{\"line\":56,\"text\":\" rclone purge \\\"$PATH_REMOTE\\\" >> \\\"$REPORT\\\" 2>&1 && DELETED=$((DELETED+1)) || BAD=$((BAD+1))\"},{\"line\":58,\"text\":\" echo \\\"WOULD_DELETE $PATH_REMOTE\\\" >> \\\"$REPORT\\\"\"},{\"line\":59,\"text\":\" WOULD_DELETE=$((WOULD_DELETE+1))\"},{\"line\":62,\"text\":\" echo \\\"KEEP $BASE/$J\\\" >> \\\"$REPORT\\\"\"},{\"line\":72,\"text\":\"echo \\\"STATUS=$STATUS TS=$TS TYPE=vm-local-dumps-retention BAD=$BAD MODE=$MODE KEEP=$KEEP DELETED=$DELETED WOULD_DELETE=$WOULD_DELETE REPORT=$REPORT\\\" > \\\"$OUT\\\"\"}],\"path\":\"/usr/local/sbin/homelab-vm-local-dumps-retention\",\"sha256\":\"306a775325708bcdfb9df6f751c15de0635bc0cf3ab90c00dfadf5ac8220c3bb\"}]\nAUDIT_IMPLEMENTATION=[{\"bytes\":39160,\"path\":\"/usr/local/sbin/homelab-backup-audit\",\"relevant_lines\":[{\"line\":12,\"text\":\"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe\"},{\"line\":13,\"text\":\"VM_WORKER=/usr/local/libexec/homelab-vm-cloud-quorum-node-worker\"},{\"line\":14,\"text\":\"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\"},{\"line\":15,\"text\":\"APP_WORKER=/usr/local/libexec/homelab-app-cloud-quorum-worker\"},{\"line\":16,\"text\":\"APP_CORE=/usr/local/libexec/homelab-app-cloud-quorum-core-helper\"},{\"line\":18,\"text\":\"VM_QUEUE=/usr/local/sbin/homelab-vm-cloud-quorum-queue\"},{\"line\":19,\"text\":\"APP_QUEUE=/usr/local/sbin/homelab-app-cloud-quorum-queue\"},{\"line\":22,\"text\":\"CONTROL_BACKUP=/usr/local/sbin/homelab-control-backup\"},{\"line\":23,\"text\":\"CONTROL_BUILDER=/usr/local/libexec/homelab-control-bundle-builder\"},{\"line\":24,\"text\":\"CONTROL_TIMER=/etc/systemd/system/homelab-control-backup.timer\"},{\"line\":25,\"text\":\"CONTROL_SERVICE=/etc/systemd/system/homelab-control-backup.service\"},{\"line\":26,\"text\":\"CONTROL_RUNTIME_MANIFEST=/etc/homelab-backup/control-runtime-paths.txt\"},{\"line\":27,\"text\":\"CONTROL_SYSTEMD_MANIFEST=/etc/homelab-backup/control-systemd-paths.txt\"},{\"line\":28,\"text\":\"VM_TIMER=/etc/systemd/system/homelab-vm-cloud-quorum-queue.timer\"},{\"line\":29,\"text\":\"APP_TIMER=/etc/systemd/system/homelab-app-cloud-quorum-queue.timer\"},{\"line\":30,\"text\":\"VM_SERVICE=/etc/systemd/system/homelab-vm-cloud-quorum-queue.service\"},{\"line\":31,\"text\":\"APP_SERVICE=/etc/systemd/system/homelab-app-cloud-quorum-queue.service\"},{\"line\":47,\"text\":\"CONTROL_BACKUP_SHA=0b3a0f685d4e67cb86250df89a4918aff2e6c67799b7d35b0e54b1bbc016ee57\"},{\"line\":48,\"text\":\"CONTROL_BUILDER_SHA=2e1c3935b5016c09aad21f34a36f7e1f53188bbc34a3f033e59fe964571ec3f0\"},{\"line\":49,\"text\":\"CONTROL_TIMER_SHA=7c4136da20b9cd9162293380f5794d93e2c6099ce7d87ec00e0e7e19b6cd44a3\"},{\"line\":50,\"text\":\"CONTROL_SERVICE_SHA=428d3e1f3042c3347b7c34b6f190e44fa35f7a97264eec3974239f581c9b9250\"},{\"line\":51,\"text\":\"CONTROL_RUNTIME_MANIFEST_SHA=6777f95159db0fa213017f286f2cee6cc51e9963a01a0578cee8586e8731b2be\"},{\"line\":52,\"text\":\"CONTROL_SYSTEMD_MANIFEST_SHA=7f990d6257b43f97c3c8407945ca9dae6113dc9064c6cf1f25e7fcdaf99d5163\"},{\"line\":53,\"text\":\"VM_TIMER_SHA=9a78c9ea507116cbb9f5645fe697e34964c905b017cc98b17977cd5006aa5050\"},{\"line\":54,\"text\":\"APP_TIMER_SHA=af2eedce3df53029b591d31715a3f3e6688ddb997b4823f487e70c339ce88078\"},{\"line\":60,\"text\":\"CONTROL_STATE_ROOT=/var/lib/homelab-backup/cloud-quorum/control-bootstrap-v2\"},{\"line\":61,\"text\":\"CONTROL_EVIDENCE_ROOT=/var/lib/homelab-backup/control-restore-validation/control-bootstrap\"},{\"line\":69,\"text\":\"CONTROL_SLA_SECONDS=86400\"},{\"line\":140,\"text\":\" printf 'CONTRACT|task=%s|target_registry=CANONICAL|vm_count=%s|app_count=%s|control_sla_seconds=%s|retention=ACTIVE_OWNER_AWARE|provider_worm=NOT_PROVEN_SKIPPED|dr_proof_source=EXACT_SITE_DR_FINAL_SEAL|legacy_site_dr_seal=AUTHORITATIVE|control_freshness=RECURRING_PRODUCER_12H_DUE_24H_SLA|full_site_dr=PROVEN_BY_SEAL\\\\n' \\\"$TASK_ID\\\" \\\"${#VMIDS[@]}\\\" \\\"${#APPS[@]}\\\" \\\"$CONTROL_SLA_SECONDS\\\"\"},{\"line\":170,\"text\":\"stale=0\"},{\"line\":192,\"text\":\"source_hash_local CONTROL_BACKUP \\\"$CONTROL_BACKUP\\\" \\\"$CONTROL_BACKUP_SHA\\\"\"},{\"line\":193,\"text\":\"source_hash_local CONTROL_BUILDER \\\"$CONTROL_BUILDER\\\" \\\"$CONTROL_BUILDER_SHA\\\"\"},{\"line\":194,\"text\":\"source_hash_local CONTROL_TIMER \\\"$CONTROL_TIMER\\\" \\\"$CONTROL_TIMER_SHA\\\"\"},{\"line\":195,\"text\":\"source_hash_local CONTROL_SERVICE \\\"$CONTROL_SERVICE\\\" \\\"$CONTROL_SERVICE_SHA\\\"\"},{\"line\":196,\"text\":\"source_hash_local CONTROL_RUNTIME_MANIFEST \\\"$CONTROL_RUNTIME_MANIFEST\\\" \\\"$CONTROL_RUNTIME_MANIFEST_SHA\\\"\"},{\"line\":197,\"text\":\"source_hash_local CONTROL_SYSTEMD_MANIFEST \\\"$CONTROL_SYSTEMD_MANIFEST\\\" \\\"$CONTROL_SYSTEMD_MANIFEST_SHA\\\"\"},{\"line\":198,\"text\":\"source_hash_local VM_TIMER \\\"$VM_TIMER\\\" \\\"$VM_TIMER_SHA\\\"\"},{\"line\":199,\"text\":\"source_hash_local APP_TIMER \\\"$APP_TIMER\\\" \\\"$APP_TIMER_SHA\\\"\"},{\"line\":233,\"text\":\" if (( age < vm_sla )); then state=FRESH; fresh=$((fresh+1)); else state=STALE; stale=$((stale+1)); fi\"},{\"line\":253,\"text\":\" unverified=$((unverified+1)); printf 'TARGET|kind=VM|id=%s|owner=%s|state=UNVERIFIED|generation=UNKNOWN|age_seconds=-1|sla_seconds=%s|reason=PROBE_FAILED\\\\n' \\\"$vmid\\\" \\\"$node\\\" \\\"$vm_sla\\\"\"},{\"line\":273,\"text\":\" if (( age < app_sla )); then state=FRESH; fresh=$((fresh+1)); else state=STALE; stale=$((stale+1)); fi\"},{\"line\":293,\"text\":\" unverified=$((unverified+1)); printf 'TARGET|kind=APP|id=%s|owner=pve01|state=UNVERIFIED|generation=UNKNOWN|age_seconds=-1|sla_seconds=%s|reason=PROBE_FAILED\\\\n' \\\"$app\\\" \\\"$app_sla\\\"\"},{\"line\":297,\"text\":\"control_status=UNVERIFIED\"},{\"line\":298,\"text\":\"control_age=-1\"},{\"line\":299,\"text\":\"control_generation=UNKNOWN\"},{\"line\":300,\"text\":\"control_checked=false\"},{\"line\":301,\"text\":\"control_state=\\\"\\\"\"},{\"line\":302,\"text\":\"control_degraded=0\"},{\"line\":303,\"text\":\"control_bad=0\"},{\"line\":304,\"text\":\"if control_state=\\\"$(find \\\"$CONTROL_STATE_ROOT\\\" -type f -name '*.json' -printf '%T@|%p\\\\n' 2>&1 | LC_ALL=C sort -n | tail -n 1 | cut -d'|' -f2-)\\\"; then :; else control_state=\\\"\\\"; fi\"},{\"line\":305,\"text\":\"if [[ -n \\\"$control_state\\\" && -s \\\"$control_state\\\" && ! -L \\\"$control_state\\\" ]]; then\"},{\"line\":306,\"text\":\" control_generation=\\\"$(jq -er '.generation' \\\"$control_state\\\" 2>&1)\\\" || control_generation=UNKNOWN\"},{\"line\":307,\"text\":\" transport_status=\\\"$(jq -er '.status' \\\"$control_state\\\" 2>&1)\\\" || transport_status=INVALID\"},{\"line\":308,\"text\":\" if [[ ! \\\"$control_generation\\\" =~ ^control-bootstrap-v2-pve01-[0-9]{8}T[0-9]{6}Z$ ]]; then transport_status=INVALID; fi\"},{\"line\":311,\"text\":\" control_status=RESUME\"},{\"line\":312,\"text\":\" control_degraded=1\"},{\"line\":316,\"text\":\" if strict=\\\"$(jq -er 'if .schema==\\\"homelab-cloud-quorum-payload-v1\\\" and .logical_id==\\\"control-bootstrap-v2\\\" and .status==\\\"SEALED\\\" and .cloud_quorum==2 and .cloud_a_verified==true and .cloud_b_verified==true and .part_hashes_verified==true and .seal_written==true and .cloud_a_seal_verified==true and .cloud_b_seal_verified==true and .local_payload_present==false and .local_cleanup==\\\"OK\\\" then \\\"OK\\\" else error(\\\"strict state invalid\\\") end' \\\"$control_state\\\" 2>&1)\\\"; then\"},{\"line\":317,\"text\":\" control_updated=\\\"$(jq -er '.sealed_at_utc // .updated_at_utc' \\\"$control_state\\\" 2>&1)\\\" || control_updated=INVALID\"},{\"line\":318,\"text\":\" control_sha=\\\"$(jq -er '.archive_sha256' \\\"$control_state\\\" 2>&1)\\\" || control_sha=INVALID\"},{\"line\":319,\"text\":\" control_epoch=\\\"$(date -u -d \\\"$control_updated\\\" +%s 2>&1)\\\" || control_epoch=-1\"},{\"line\":320,\"text\":\" control_evidence=\\\"$CONTROL_EVIDENCE_ROOT/$control_generation.json\\\"\"},{\"line\":321,\"text\":\" if [[ \\\"$control_epoch\\\" =~ ^[0-9]+$ && \\\"$control_epoch\\\" -le \\\"$now\\\" && -s \\\"$control_evidence\\\" && ! -L \\\"$control_evidence\\\" ]]; then\"},{\"line\":322,\"text\":\" if evidence_ok=\\\"$(jq -er --arg g \\\"$control_generation\\\" --arg sha \\\"$control_sha\\\" 'if .result==\\\"OK\\\" and .logical_id==\\\"control-bootstrap-v2\\\" and .generation==$g and .restore_source==\\\"Cloud A + Cloud B\\\" and .payload_sha256==$sha and .payload_sha256_verified==true and .control_manifest_verified==true and .payload_checksums_verified==true and .ops_git_bundle_verified==true and .desired_git_bundle_verified==true and .secret_escrow_separate==true and .clean_machine_bootstrap_proven==false then \\\"OK\\\" else error(\\\"control evidence invalid\\\") end' \\\"$control_evidence\\\" 2>&1)\\\"; then\"},{\"line\":323,\"text\":\" control_checked=true\"},{\"line\":324,\"text\":\" control_age=$((now-control_epoch))\"},{\"line\":325,\"text\":\" if (( control_age < CONTROL_SLA_SECONDS )); then control_status=FRESH_SEALED_PROVEN; else control_status=STALE_PROVEN; control_bad=1; infra_bad=$((infra_bad+1)); fi\"},{\"line\":326,\"text\":\" control_payload=\\\"$(jq -er '.payload_path' \\\"$control_state\\\" 2>&1)\\\" || control_payload=INVALID\"},{\"line\":327,\"text\":\" if [[ \\\"$control_payload\\\" != /* ]] || [[ -e \\\"$control_payload\\\" ]]; then payload_leaks=$((payload_leaks+1)); fi\"},{\"line\":329,\"text\":\" control_bad=1; infra_bad=$((infra_bad+1))\"},{\"line\":332,\"text\":\" control_bad=1; infra_bad=$((infra_bad+1))\"},{\"line\":335,\"text\":\" control_bad=1; infra_bad=$((infra_bad+1))\"},{\"line\":338,\"text\":\" *) control_bad=1; infra_bad=$((infra_bad+1)) ;;\"},{\"line\":341,\"text\":\" control_bad=1; infra_bad=$((infra_bad+1))\"},{\"line\":343,\"text\":\"control_archive_size=-1\"},{\"line\":344,\"text\":\"if [[ -n \\\"$control_state\\\" && -s \\\"$control_state\\\" && \\\"$control_status\\\" != UNVERIFIED && \\\"$control_status\\\" != RESUME ]]; then control_archive_size=\\\"$(jq -er '.archive_size_bytes' \\\"$control_state\\\" 2>/dev/null)\\\" || control_archive_size=-1; if ! append_obs_target CONTROL control-bootstrap-v2 control-bootstrap-v2 \\\"$control_archive_size\\\"; then observability_input_bad=$((observability_input_bad+1)); fi; fi\"},{\"line\":345,\"text\":\"printf 'CONTROL|state=%s|CONTROL_FRESHNESS=%s|generation=%s|age_seconds=%s|sla_seconds=%s|archive_size_bytes=%s|restore_evidence_checked=%s|source_coverage=RESTORE_EVIDENCE|retention=ACTIVE_OWNER_AWARE\\\\n' \\\"$control_status\\\" \\\"$control_status\\\" \\\"$control_generation\\\" \\\"$control_age\\\" \\\"$CONTROL_SLA_SECONDS\\\" \\\"$control_archive_size\\\" \\\"$control_checked\\\"\"},{\"line\":410,\"text\":\" service=\\\"${unit%.timer}.service\\\"\"},{\"line\":412,\"text\":\" if [[ \\\"$load_state\\\" == loaded && \\\"$unit_file_state\\\" == enabled && \\\"$active_state\\\" == active && \\\"$result\\\" != failed && \\\"$service_result\\\" != failed ]]; then status=OK; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi\"},{\"line\":422,\"text\":\"for lock in /run/homelab-backup-heavy.lock /run/lock/homelab-vm-cloud-quorum-queue.lock /run/lock/homelab-app-cloud-quorum-queue.lock /run/lock/homelab-backup-dispatcher.lock; do\"},{\"line\":466,\"text\":\"if [[ -s \\\"$RETENTION_HEALTH\\\" && ! -L \\\"$RETENTION_HEALTH\\\" ]] && jq -e '.schema==\\\"homelab-backup-retention-v1\\\" and .status==\\\"OK\\\" and .policy.vm_keep==2 and .policy.app_keep==7 and .policy.control_keep==4 and .owner_aware_gc_proven==true and .destructive_canary_proven==true' \\\"$RETENTION_HEALTH\\\" >/dev/null; then\"},{\"line\":473,\"text\":\"printf 'RETENTION|status=%s|historical_gc_proven=%s|owner_aware_gc_proven=%s|vm_keep=2|app_keep=7|control_keep=4\\\\n' \\\"$retention_status\\\" \\\"$( [[ \\\"$historical_gc_proven\\\" == true ]] && printf YES || printf NO )\\\" \\\"$( [[ \\\"$owner_aware_gc_proven\\\" == true ]] && printf YES || printf NO )\\\"\"},{\"line\":510,\"text\":\"if (( stale > 0 || unverified > 0 || payload_leaks > 0 || infra_bad > 0 )); then backup_status=RED\"},{\"line\":527,\"text\":\"(( stale > 0 )) && add_risk HIGH RPO_BREACH\"},{\"line\":536,\"text\":\"printf 'SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=%s|RISK_SEVERITY=%s|RISK_REASONS=%s|DR_PROOF_STATUS=%s|CONTROL_FRESHNESS=%s|LIFECYCLE_STATUS=%s|VM_COUNT=%s|APP_COUNT=%s|FRESH=%s|STALE=%s|RESUME=%s|UNVERIFIED=%s|CONTROL_STATE=%s|CLOUD_OK=%s|SCHEDULER_OK=%s|SOURCE_OK=%s|SOURCE_DRIFT=%s|STAGING_BAD=%s|STAGING_WARN=%s|PAYLOAD_LEAKS=%s|RETENTION_STATUS=%s|OBSERVABILITY=%s|SIZE_ANOMALIES=%s|CAPACITY=%s|GLOBAL_DR_PROVEN=%s\\\\n' \\\"$backup_status\\\" \\\"$risk_severity\\\" \\\"$risk_reasons\\\" \\\"$dr_proof_status\\\" \\\"$control_status\\\" \\\"$lifecycle_status\\\" \\\"$vm_seen\\\" \\\"$app_seen\\\" \\\"$fresh\\\" \\\"$stale\\\" \\\"$resume\\\" \\\"$unverified\\\" \\\"$control_status\\\" \\\"$cloud_ok\\\" \\\"$scheduler_ok\\\" \\\"$source_ok\\\" \\\"$source_drift\\\" \\\"$staging_bad\\\" \\\"$staging_warn\\\" \\\"$payload_leaks\\\" \\\"$retention_status\\\" \\\"$observability_status\\\" \\\"$size_anomaly_count\\\" \\\"$capacity_status\\\" \\\"$global_dr_proven\\\"\"},{\"line\":541,\"text\":\" jq -n --arg task \\\"$TASK_ID\\\" --arg change \\\"$CHANGE_ID\\\" --arg at \\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\" --arg backup \\\"$backup_status\\\" --arg risk \\\"$risk_severity\\\" --arg reasons \\\"$risk_reasons\\\" --arg control \\\"$control_status\\\" --arg dr \\\"$dr_proof_status\\\" --arg lifecycle \\\"$lifecycle_status\\\" --arg escrow \\\"$escrow_status\\\" --arg staging \\\"$staging_status\\\" --arg retention \\\"$retention_status\\\" --arg observability \\\"$observability_status\\\" --arg capacity \\\"$capacity_status\\\" --argjson historical \\\"$historical_gc_proven\\\" --argjson owner_gc \\\"$owner_aware_gc_proven\\\" --argjson staging_bad \\\"$staging_bad\\\" --argjson staging_warn \\\"$staging_warn\\\" --argjson vm_count \\\"$vm_seen\\\" --argjson app_count \\\"$app_seen\\\" --argjson fresh \\\"$fresh\\\" --argjson stale \\\"$stale\\\" --argjson resume \\\"$resume\\\" --argjson unverified \\\"$unverified\\\" --argjson cloud_ok \\\"$cloud_ok\\\" --argjson scheduler_ok \\\"$scheduler_ok\\\" --argjson source_ok \\\"$source_ok\\\" --argjson source_drift \\\"$source_drift\\\" --argjson payload_leaks \\\"$payload_leaks\\\" --argjson size_anoma\"}],\"sha256\":\"1474c9ce58bbc1b3ae7437261d1bdb923232926fb2943c7c830253f8b284724c\"},{\"bytes\":2161,\"path\":\"/usr/local/sbin/homelab-vps-identity-audit\",\"relevant_lines\":[],\"sha256\":\"b709691c52ae48432b70e197eb4810b6c374a05911cee3b9fdba4ecc67c76c3a\"}]\nALERT_IMPLEMENTATION={\"bytes\":1806,\"exists\":true,\"sha256\":\"6deef30b4708a7e5b2ac0f0d98bb6b37b22d858afde994483b67baa18dffdc2a\",\"structure_lines\":[{\"line\":4,\"text\":\"APP=\\\"alertmanager\\\"\"},{\"line\":14,\"text\":\"fail(){ echo \\\"[ERROR] alertmanager backup failed; kept: $STAGE\\\"; }\"},{\"line\":16,\"text\":\"ssh -n -o BatchMode=yes -o ConnectTimeout=8 \\\"$MON\\\" \\\"sudo -n docker exec alertmanager amtool check-config /etc/alertmanager/alertmanager.yml >/dev/null && sudo -n tar -C / -czf - opt/stacks/observability-lite/compose.yaml opt/stacks/observability-lite/compose.override.yaml opt/stacks/observability-lite/alertmanager/alertmanager.yml opt/stacks/observability-lite/alertmanager/data\\\" > \\\"$STAGE/remote.tgz\\\"\"},{\"line\":19,\"text\":\"test -s \\\"$STAGE/payload/opt/stacks/observability-lite/alertmanager/alertmanager.yml\\\"\"},{\"line\":21,\"text\":\"jq -n --arg app \\\"$APP\\\" --arg host \\\"monitoring\\\" --arg engine \\\"files+alertmanager-config-check\\\" --arg config \\\"ok\\\" --argjson files \\\"$FILES\\\" \\\"{app:\\\\$app,engine:\\\\$engine,source_host:\\\\$host,source_paths:[\\\\\\\"monitoring:/opt/stacks/observability-lite/alertmanager\\\\\\\",\\\\\\\"monitoring:/opt/stacks/observability-lite/compose.yaml\\\\\\\",\\\\\\\"monitoring:/opt/stacks/observability-lite/compose.override.yaml\\\\\\\"],config_check:\\\\$config,file_count:\\\\$files,note:\\\\\\\"Alertmanager configuration and runtime state in encrypted two-cloud backup\\\\\\\"}\\\" > \\\"$STAGE/metadata.json\\\"\"},{\"line\":25,\"text\":\"echo ALERTMANAGER_BACKUP_RUN=OK\"}]}\nALERT_SYSTEMD_REFERENCES=[]\nMAIL_ROUTE_READINESS={\"postfix_active\":true,\"pve_user_email_present\":false,\"relayhost_configured\":false,\"root_alias_present\":false,\"sendmail_present\":true,\"smtp_sasl_auth_enable\":\"no\",\"smtp_sasl_password_maps_configured\":false,\"smtp_tls_security_level\":\"\"}\nSOURCE_PUBLICATION_STATE={\"cr_branch_sha\":null,\"fetch_url_present\":true,\"local_head\":\"50bf24f8ee27f3d2e0d1cbc6c17b62c69ff06bae\",\"ls_remote_rc\":0,\"main_sha\":\"326622a4864fa9b5f43b69981733236bb42c4d7b\",\"pushurl_is_disabled\":true}\nDR_RESTORE_SEALS=[{\"mtime_epoch\":1786237057,\"name\":\"backup-app-cloud-quorum-cutover-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0020\",\"status\":\"SEALED\",\"task_id\":\"backup-app-cloud-quorum-cutover-v1\"},\"sha256\":\"c77f83927dcf020cac0182bf8f7145ac823b3bbb2b62dd1021dbc9a340b0c467\"},{\"mtime_epoch\":1786241107,\"name\":\"backup-app-cloud-quorum-freshness-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0022\",\"status\":\"SEALED\",\"task_id\":\"backup-app-cloud-quorum-freshness-v1\"},\"sha256\":\"0d5374f9cceb05113c24ce9ee16a3b12f1e7846261b4d5801b125489ac45c4d7\"},{\"mtime_epoch\":1786453079,\"name\":\"backup-cloud-legacy-retirement-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0035\",\"status\":\"SEALED\",\"task_id\":\"backup-cloud-legacy-retirement-v1\"},\"sha256\":\"fe78e534174b1e23ef0aef72599cf74e73332d7abe100dda02b9ebb2f2f7afdc\"},{\"mtime_epoch\":1786396264,\"name\":\"backup-control-bootstrap-cloud-quorum-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0029\",\"logical_id\":\"control-bootstrap\",\"status\":\"SEALED\",\"task_id\":\"backup-control-bootstrap-cloud-quorum-v1\"},\"sha256\":\"332f9fd0822a1531753a16978d33e8543694f3c2c0e329ba6115bf05c00d02d8\"},{\"mtime_epoch\":1786406463,\"name\":\"backup-control-bootstrap-configs-source-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0030\",\"logical_id\":\"control-bootstrap-v2\",\"status\":\"SEALED\",\"task_id\":\"backup-control-bootstrap-configs-source-v1\"},\"sha256\":\"8a39632eb3901677047a544243c52a32e304912c589376ff855ef4c623a46fa9\"},{\"mtime_epoch\":1786601026,\"name\":\"backup-control-coverage-hardening-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0054\",\"status\":\"SEALED\",\"task_id\":\"backup-control-coverage-hardening-v1\"},\"sha256\":\"d4f1240df892ddddfd880bc5d5fca5df1c5c0d5c93f21c56658a669ed7547b58\"},{\"mtime_epoch\":1786441319,\"name\":\"backup-control-final-generation-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0034\",\"status\":\"SEALED\",\"task_id\":\"backup-control-final-generation-v1\"},\"sha256\":\"c5a0d270c9582e84f61564905734d76796bb5aa2de93873d1a639f5dbe7695a2\"},{\"mtime_epoch\":1787357380,\"name\":\"backup-control-refresh-current-v3.json\",\"selected\":{\"change_id\":\"CR-2026-0095\",\"status\":\"SEALED\",\"task_id\":\"backup-control-refresh-current-v3\"},\"sha256\":\"5c7cb7ce3af6fe4ce3c11d0f3c2a2ab80790d7997b4ceea64ae5d9cc5bc4ada4\"},{\"mtime_epoch\":1786685619,\"name\":\"backup-control-refresh-post-legacy-retirement-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0067\",\"status\":\"SEALED\",\"task_id\":\"backup-control-refresh-post-legacy-retirement-v1\"},\"sha256\":\"6986ef7c5a3f13a3d199397e3f01a45c4418d81ce7ccd1f929fc9cb5593fd9db\"},{\"mtime_epoch\":1786604876,\"name\":\"backup-control-refresh-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0057\",\"status\":\"SEALED\",\"task_id\":\"backup-control-refresh-v1\"},\"sha256\":\"52abe0785bbabf2ed7df5a4f46580487f65ab48b2a3462b32ae4e0943894fcc2\"},{\"mtime_epoch\":1786719633,\"name\":\"backup-delete-evidence-hardening-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0074\",\"status\":\"SEALED\",\"task_id\":\"backup-delete-evidence-hardening-v1\"},\"sha256\":\"02abe418e49139b034984128399374301505686e45d07db8ffb6a9b8e1c53fd0\"},{\"mtime_epoch\":1789959071,\"name\":\"backup-gfs-lifecycle-remediation-v1.json\",\"selected\":{\"change_id\":\"CR-2026-1005\",\"status\":\"SEALED\",\"task_id\":\"backup-gfs-lifecycle-remediation-v1\"},\"sha256\":\"b7da77e3a40ce308f56bbc3915569e071079773db39df1e7adc84929baf69bc6\"},{\"mtime_epoch\":1786717462,\"name\":\"backup-gfs-retention-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0072\",\"status\":\"SEALED\",\"task_id\":\"backup-gfs-retention-v1\"},\"sha256\":\"e6857f4f736d2f9506c0184119e6152ceb8301fcfaa75eb983b9e9fd4b3fac87\"},{\"mtime_epoch\":1786247840,\"name\":\"backup-hbarhub-cloud-quorum-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0024\",\"logical_id\":\"app-hbarhub\",\"status\":\"SEALED\",\"task_id\":\"backup-hbarhub-cloud-quorum-v1\"},\"sha256\":\"d7d6f959ff3575b27602ffe09a0d304f12d477b499637a2ea7358bfa85e7b20e\"},{\"mtime_epoch\":1786373683,\"name\":\"backup-lock-fd-hardening-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0027\",\"status\":\"SEALED\",\"task_id\":\"backup-lock-fd-hardening-v1\"},\"sha256\":\"3d1e9f182ce7263f2c4148618b132277c7125f4d0a348203cd1c08b711076501\"},{\"mtime_epoch\":1786565758,\"name\":\"backup-matrix-residue-retirement-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0050\",\"status\":\"SEALED\",\"task_id\":\"backup-matrix-residue-retirement-v1\"},\"sha256\":\"85036d473fa309331a9167d58ef1f2bd7e7466d52b9b130096dbdc45507512fc\"},{\"mtime_epoch\":1786703572,\"name\":\"backup-observability-risk-forecast-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0071\",\"status\":\"SEALED\",\"task_id\":\"backup-observability-risk-forecast-v1\"},\"sha256\":\"40a316a39025867cfb488543006badf0bdb315aec65c0c5f8ef20bc1b1665915\"},{\"mtime_epoch\":1786643518,\"name\":\"backup-retention-dynamic-pinned-prune-mailru-cleanup-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0065\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-dynamic-pinned-prune-mailru-cleanup-v1\"},\"sha256\":\"f9165cf9faf0d2bd7803b7dc9763d24244e677d14d4a3d8fce558a4b8326088a\"},{\"mtime_epoch\":1786639543,\"name\":\"backup-retention-pinned-scheduled-scope-hotfix-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0064\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-pinned-scheduled-scope-hotfix-v1\"},\"sha256\":\"8b2ddd3968a8c2bcb4fc91855f667a21c0aa2710944fe2553108350344a7dd56\"},{\"mtime_epoch\":1786599343,\"name\":\"backup-retention-plan-stability-hotfix-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0055\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-plan-stability-hotfix-v1\"},\"sha256\":\"4d7ebbc69ee319f210785ef6113e033dca9e2ceed2e706afc8f0b3cf10873026\"},{\"mtime_epoch\":1786607325,\"name\":\"backup-retention-remote-list-failclosed-hotfix-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0060\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-remote-list-failclosed-hotfix-v1\"},\"sha256\":\"b2831634be5ff1f829302b83025fc5ba7649dcbe72fd14cdfda1e5d7a0f52e07\"},{\"mtime_epoch\":1786513619,\"name\":\"backup-retention-remote-stdin-hotfix-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0035\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-remote-stdin-hotfix-v1\"},\"sha256\":\"d42d89260f2304945df40c958fd5a52b758a674bcb10b9323552a0a7b35ce7ae\"},{\"mtime_epoch\":1786431140,\"name\":\"backup-retention-safe-gc-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0033\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-safe-gc-v1\"},\"sha256\":\"2e1d4745b70ea6e3e96097ccc336fd7d555e70b8cc058b96491fd8c87d95579f\"},{\"mtime_epoch\":1786600541,\"name\":\"backup-retention-transaction-resume-hotfix-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0056\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-transaction-resume-hotfix-v1\"},\"sha256\":\"d4e4dd8d58d0fc527cd7210c6252b6321e0568961c03a4ddd729fbdb20494928\"},{\"mtime_epoch\":1786726495,\"name\":\"backup-rotating-boot-drill-escrow-freshness-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0075\",\"status\":\"SEALED\",\"task_id\":\"backup-rotating-boot-drill-escrow-freshness-v1\"},\"sha256\":\"9a38eebec6e913d802dd08bb4dcb5612dfec734530bbf1afbe7e277507ccd163\"},{\"mtime_epoch\":1786387065,\"name\":\"backup-scheduler-fairness-granularity-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0028\",\"status\":\"SEALED\",\"task_id\":\"backup-scheduler-fairness-granularity-v1\"},\"sha256\":\"cf0fd28e413fc9eb6dbd76149378a169b987c7509246ae1758cc75041a8d393b\"},{\"mtime_epoch\":1786359648,\"name\":\"backup-scheduler-rpo-hardening-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0026\",\"status\":\"SEALED\",\"task_id\":\"backup-scheduler-rpo-hardening-v1\"},\"sha256\":\"b56847a3c68d16559aabcd23ff46dfefd820fc970432afd2232415bc0202af3e\"},{\"mtime_epoch\":1786297580,\"name\":\"backup-scrutiny-cloud-quorum-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0025\",\"logical_id\":\"app-scrutiny\",\"status\":\"SEALED\",\"task_id\":\"backup-scrutiny-cloud-quorum-v1\"},\"sha256\":\"eb50068d771572139320b41b4a9a4fef9fa28fd977686d66f84e15a987dd43a3\"},{\"mtime_epoch\":1786698442,\"name\":\"backup-target-lifecycle-registry-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0070\",\"status\":\"SEALED\",\"task_id\":\"backup-target-lifecycle-registry-v1\"},\"sha256\":\"b843b84c66c739ec42e8454b8a996eb827364fb6c938a8ce86e4e5ac7c16c0b8\"},{\"mtime_epoch\":1786428928,\"name\":\"backup-unified-monitoring-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0032\",\"status\":\"SEALED\",\"task_id\":\"backup-unified-monitoring-v1\"},\"sha256\":\"26cbd0d9f84cf4bd8aec1c8ad479e612afde3949954003dd0d9f4a1bbc278867\"},{\"mtime_epoch\":1786200294,\"name\":\"backup-vm-cloud-quorum-cutover-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0019\",\"status\":\"SEALED\",\"task_id\":\"backup-vm-cloud-quorum-cutover-v1\"},\"sha256\":\"33b0dadaf58949fe1356904c7171f4be992dc3866e3ba4688e0ada41e6266aac\"},{\"mtime_epoch\":1786239546,\"name\":\"backup-vm-cloud-quorum-freshness-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0021\",\"status\":\"SEALED\",\"task_id\":\"backup-vm-cloud-quorum-freshness-v1\"},\"sha256\":\"89a3a916b5a099ba71fb6f171c16bb52adeec45295315a9b605b1703b2ed3f65\"},{\"mtime_epoch\":1786422218,\"name\":\"backup-vm-restore-evidence-hardening-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0031\",\"status\":\"SEALED\",\"task_id\":\"backup-vm-restore-evidence-hardening-v1\"},\"sha256\":\"5f1274624374adbbb495b1701fe1eedaab028fad0f97a2409f0b79df9a791f9a\"},{\"mtime_epoch\":1786459865,\"name\":\"cluster-postdr-storage-retirement-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0038\",\"status\":\"SEALED\",\"task_id\":\"cluster-postdr-storage-retirement-v1\"},\"sha256\":\"d25c1760d3ea45ac695ee1fc5d2636bbb1c012da96c3ba4e89767915efe0e7d2\"},{\"mtime_epoch\":1784329495,\"name\":\"homelab-backup-tail-closure-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0004\",\"status\":\"SEALED\",\"task_id\":\"homelab-backup-tail-closure-v1\"},\"sha256\":\"9a52b2bb0186f9807a0b25274f819c33b097dbbfaa32f03f1c31360354c096c1\"},{\"mtime_epoch\":1786684253,\"name\":\"legacy-backup-target-retirement-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0066\",\"status\":\"SEALED\",\"task_id\":\"legacy-backup-target-retirement-v1\"},\"sha256\":\"830eb32a0c3366d51c9d798736ccbd3048a0524b38cd228a58085499b610048f\"},{\"mtime_epoch\":1786555697,\"name\":\"reports-monitor-canonical-backup-supervision-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0046\",\"status\":\"SEALED\",\"task_id\":\"reports-monitor-canonical-backup-supervision-v1\"},\"sha256\":\"2c4fdb17fbd7caec98e111fae74e1d8bad3942cc2c7bc33a0b1c8b769b542076\"},{\"mtime_epoch\":1786450297,\"name\":\"site-dr-final-acceptance-v1.json\",\"selected\":{\"change_id\":\"DR-2026-FINAL\",\"status\":\"SEALED\",\"task_id\":\"site-dr-final-resume-boot-v1\"},\"sha256\":\"b9f8172bac0206380198ac68079625b06f06eac7d484e66226082ebc1abae14d\"},{\"mtime_epoch\":1786470088,\"name\":\"vm160-post-cleanup-canonical-backup-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0043\",\"status\":\"SEALED\",\"target\":\"vm160\",\"task_id\":\"vm160-post-cleanup-canonical-backup-v1\"},\"sha256\":\"83b76b909bad03476133425e38ab0be75a300a821300389660aa2f620c543d0c\"}]\nCLOSURE_GATES={\"active_targets_with_state_missing\":8,\"alert_script_present\":true,\"cloud_a_readable\":true,\"cloud_b_readable\":true,\"gfs_ok\":true,\"retention_timer_safely_held\":true,\"sendmail_present\":true,\"source_offhost_branch_exact\":false,\"v2_timer_enabled_active\":true}\nNO_MUTATION=true\nNO_REPO_WRITE=true\nNO_GIT_FETCH=true\nNO_GIT_COMMIT=true\nNO_GIT_PUSH_UPDATE=true\nNO_SYSTEMD_ACTION=true\nNO_BACKUP_STARTED=true\nNO_RESTORE_STARTED=true\nNO_RETENTION_GC_STARTED=true\nNO_CLOUD_DELETE=true\nNO_MAIL_SENT=true\nAUDIT_DURATION_SEC=1.505\nTASK_RESULT=PASS_HOMELAB_BACKUP_CLOSURE_AUDIT_READONLY\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nWORKERS2_BACKUP_CLOSURE_AUDIT_END=1\n" +} diff --git a/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1.txt b/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1.txt new file mode 100644 index 00000000..8d42d716 --- /dev/null +++ b/runtime/history/SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1.txt @@ -0,0 +1,82 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=homelab-backup-closure-audit +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=d3877f0193bbe5b5c8345ebec48097517ce415848ee63ff839517234bc496da1 +DUPLICATE_FAILED_COMMAND_BLOCKED=false +EXECUTION_STARTED=true +CHANGE_DECLARED=false +RESULT_CONTRACT_VALID=true +RESULT_CONTRACT_STATUS=NOT_APPLICABLE +RESULT_CONTRACT_ERROR=NONE +COMMAND_RC=0 +CHANGES_MADE=false +ROLLBACK_STARTED=false +ROLLBACK_RESTORED=null +MUTATION_OUTCOME=NO_MUTATION +SANITIZED=yes +SECRETS_INCLUDED=no +PRIVATE_ADDRESSES_INCLUDED=no +RAW_EVIDENCE_SHA256=12f9c3c08bd66206cce08cf9b97ad5ece4d918a0ee1661e4a7fb3735e42d6a36 +SANITIZED_OUTPUT_SHA256=12f9c3c08bd66206cce08cf9b97ad5ece4d918a0ee1661e4a7fb3735e42d6a36 +OUTPUT_BEGIN +WORKERS2_BACKUP_CLOSURE_AUDIT_BEGIN=1 +COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1 +MODE=read-only +COMPONENT=homelab-backup-closure-audit +HOST=pve01 +UID=0 +MUTATION_BOUNDARY=READ_ONLY_NO_REPO_WRITE_NO_GIT_FETCH_NO_GIT_COMMIT_NO_PUSH_NO_SYSTEMD_ACTION_NO_BACKUP_NO_RESTORE_NO_RETENTION_GC_NO_CLOUD_DELETE_NO_MAIL +SOURCE_HEAD=50bf24f8ee27f3d2e0d1cbc6c17b62c69ff06bae +SOURCE_HEAD_EXPECTED=true +SOURCE_WORKTREE_CLEAN=true +SOURCE_STATUS_LINES=[] +GFS_POST_STATE={"helper":{"exists":true,"sha256":"a1aed0c6039f8095bd5da7f62b47f4ee6932df98c4e0e7420d3006df86bd5c94"},"policy":{"exists":true,"sha256":"2c7674045dd5c68cc48d348d616494dbbe145df460a8e85d97a2c5c153ec792d"},"seal":{"exists":true,"sha256":"b7da77e3a40ce308f56bbc3915569e071079773db39df1e7adc84929baf69bc6"},"seal_selected":{"critical_vm_count":8,"helper_sha256":"a1aed0c6039f8095bd5da7f62b47f4ee6932df98c4e0e7420d3006df86bd5c94","policy_sha256":"2c7674045dd5c68cc48d348d616494dbbe145df460a8e85d97a2c5c153ec792d","retention_reenable_requires_safe_plan":true,"retention_timer_held_disabled":true,"status":"SEALED","vm200_retired_preserve":true}} +GFS_VALIDATE={"rc":0,"stderr":[],"stdout":["GFS_POLICY=OK"]} +GFS_CRITICAL_LOGICALS=["vm110","vm111","vm112","vm113","vm130","vm150","vm160","vm170"] +UNIT_STATE={"homelab-backup-retention-gc.service":{"ActiveState":{"rc":0,"value":"inactive"},"ExecMainStatus":{"rc":0,"value":"66"},"LastTriggerUSec":{"rc":0,"value":""},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"dead"},"UnitFileState":{"rc":0,"value":"static"}},"homelab-backup-retention-gc.timer":{"ActiveState":{"rc":0,"value":"inactive"},"ExecMainStatus":{"rc":0,"value":""},"LastTriggerUSec":{"rc":0,"value":""},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"dead"},"UnitFileState":{"rc":0,"value":"disabled"}},"homelab-backup-v2.service":{"ActiveState":{"rc":0,"value":"inactive"},"ExecMainStatus":{"rc":0,"value":"0"},"LastTriggerUSec":{"rc":0,"value":""},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"dead"},"UnitFileState":{"rc":0,"value":"static"}},"homelab-backup-v2.timer":{"ActiveState":{"rc":0,"value":"active"},"ExecMainStatus":{"rc":0,"value":""},"LastTriggerUSec":{"rc":0,"value":"Mon 2026-09-21 05:35:16 MSK"},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"waiting"},"UnitFileState":{"rc":0,"value":"enabled"}}} +REGISTRY_LOGICALS=[{"id":"filebrowser","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-filebrowser"},{"id":"hbarhub","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-hbarhub"},{"id":"immich","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-immich"},{"id":"memos","kind":"APP","lifecycle":"RETIRED_PRESERVE","logical_id":"app-memos"},{"id":"scrutiny","kind":"APP","lifecycle":"RETIRED_PRESERVE","logical_id":"app-scrutiny"},{"id":"skladchik-moderator-assistant","kind":"APP","lifecycle":"RETIRED_PRESERVE","logical_id":"app-skladchik-moderator-assistant"},{"id":"skladchik-reports-monitor","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-skladchik-reports-monitor"},{"id":"control-bootstrap-v2","kind":"CONTROL","lifecycle":"ACTIVE","logical_id":"control-bootstrap-v2"},{"id":"110","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm110"},{"id":"111","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm111"},{"id":"112","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm112"},{"id":"113","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm113"},{"id":"130","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm130"},{"id":"150","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm150"},{"id":"160","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm160"},{"id":"170","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm170"},{"id":"171","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm171"},{"id":"180","kind":"VM","lifecycle":"RETIRED_PRESERVE","logical_id":"vm180"},{"id":"190","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm190"},{"id":"200","kind":"VM","lifecycle":"RETIRED_PRESERVE","logical_id":"vm200"},{"id":"9130","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm9130"}] +REGISTRY_ACTIVE_LOGICALS=["app-filebrowser","app-hbarhub","app-immich","app-skladchik-reports-monitor","control-bootstrap-v2","vm110","vm111","vm112","vm113","vm130","vm150","vm160","vm170","vm171","vm190","vm9130"] +REGISTRY_ACTIVE_COUNT=16 +V2_STATE_COUNT=29 +V2_STATES=[{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"control-bootstrap-v2.json","generation":"control-bootstrap-v2-pve01-20260916T120057Z","green_verified":null,"json_valid":true,"last_attempt_epoch":1789930298,"last_success_epoch":1789930298,"logical_id":"control-bootstrap-v2","quorum":null,"replica_count":null,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":28977},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct110.json","generation":"v2-ct110-20260920T181158Z-25703b1ef77f","green_verified":false,"json_valid":true,"last_attempt_epoch":1789928120,"last_success_epoch":1789928120,"logical_id":"ct110","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":31155},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct111.json","generation":"v2-ct111-20260920T200749Z-a2bac7e3ecb7","green_verified":false,"json_valid":true,"last_attempt_epoch":1789935021,"last_success_epoch":1789935021,"logical_id":"ct111","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":24254},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct112.json","generation":"v2-ct112-20260920T214958Z-30e3291e1543","green_verified":false,"json_valid":true,"last_attempt_epoch":1789941076,"last_success_epoch":1789941076,"logical_id":"ct112","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":18199},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct113.json","generation":"v2-ct113-20260920T222532Z-4f4a608def82","green_verified":false,"json_valid":true,"last_attempt_epoch":1789943241,"last_success_epoch":1789943241,"logical_id":"ct113","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":16034},{"consecutive_failures":5,"failure_backoff_seconds":21600,"file":"guest-pve01-lxc-112.json","generation":null,"green_verified":null,"json_valid":true,"last_attempt_epoch":1789938729,"last_success_epoch":1789799511,"logical_id":"guest-pve01-lxc-112","quorum":null,"replica_count":null,"result":"FAIL","retry_count":null,"status":null,"success_age_sec":159764},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"md-relay.json","generation":"v2-md-relay-20260920T140452Z-1943a8c57bd6","green_verified":false,"json_valid":true,"last_attempt_epoch":1789913115,"last_success_epoch":1789913115,"logical_id":"md-relay","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":46160},{"consecutive_failures":null,"failure_backoff_seconds":null,"file":"node-pve01.json","generation":"v2-node-pve01-20260915T040859Z-9187f2b9a0b4","green_verified":true,"json_valid":true,"last_attempt_epoch":null,"last_success_epoch":1789445359,"logical_id":"node-pve01","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":513916},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"node-pve02.json","generation":"v2-node-pve02-20260918T011512Z-59f345bf9a9b","green_verified":false,"json_valid":true,"last_attempt_epoch":1789694135,"last_success_epoch":1789694135,"logical_id":"node-pve02","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":265140},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"node-pve03.json","generation":"v2-node-pve03-20260918T015457Z-204ac5a3eb03","green_verified":false,"json_valid":true,"last_attempt_epoch":1789696518,"last_success_epoch":1789696518,"logical_id":"node-pve03","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":262757},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"router-netcraze.json","generation":"v2-router-netcraze-20260920T155444Z-a91b2efdb4fe","green_verified":false,"json_valid":true,"last_attempt_epoch":1789919711,"last_success_epoch":1789919711,"logical_id":"router-netcraze","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":39564},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"spb-ingress.json","generation":"v2-spb-ingress-20260920T151616Z-9d80091d0c4c","green_verified":false,"json_valid":true,"last_attempt_epoch":1789917397,"last_success_epoch":1789917397,"logical_id":"spb-ingress","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":41878},{"consecutive_failures":10,"failure_backoff_seconds":21600,"file":"us-netbird.json","generation":"v2-us-netbird-20260921T015632Z-dc499030a55f","green_verified":null,"json_valid":true,"last_attempt_epoch":1789955807,"last_success_epoch":1789704670,"logical_id":"us-netbird","quorum":null,"replica_count":null,"result":"FAIL","retry_count":null,"status":null,"success_age_sec":254605},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm130.json","generation":"v2-vm130-20260920T233759Z-c9518c8be2c3","green_verified":false,"json_valid":true,"last_attempt_epoch":1789948633,"last_success_epoch":1789948633,"logical_id":"vm130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":10642},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm150.json","generation":"v2-vm150-20260920T230035Z-e0880e47ea55","green_verified":false,"json_valid":true,"last_attempt_epoch":1789945347,"last_success_epoch":1789945347,"logical_id":"vm150","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":13928},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm160.json","generation":"v2-vm160-20260921T001432Z-31df1acfee7a","green_verified":false,"json_valid":true,"last_attempt_epoch":1789950100,"last_success_epoch":1789950100,"logical_id":"vm160","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":9175},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm170.json","generation":"v2-vm170-20260921T023516Z-53ad6a6b10f9","green_verified":false,"json_valid":true,"last_attempt_epoch":1789958880,"last_success_epoch":1789958880,"logical_id":"vm170","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":395},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm171.json","generation":"v2-vm171-20260921T004759Z-537db1552014","green_verified":false,"json_valid":true,"last_attempt_epoch":1789951877,"last_success_epoch":1789951877,"logical_id":"vm171","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":7398},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm190.json","generation":"v2-vm190-20260921T012544Z-298b64987988","green_verified":false,"json_valid":true,"last_attempt_epoch":1789954139,"last_success_epoch":1789954139,"logical_id":"vm190","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":5136},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm210.json","generation":"v2-vm210-20260920T203832Z-458da35ec027","green_verified":false,"json_valid":true,"last_attempt_epoch":1789936798,"last_success_epoch":1789936798,"logical_id":"vm210","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":22477},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm211.json","generation":"v2-vm211-20260919T203132Z-82878bb22008","green_verified":false,"json_valid":true,"last_attempt_epoch":1789849984,"last_success_epoch":1789849984,"logical_id":"vm211","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":109291},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm9130.json","generation":"v2-vm9130-20260919T210758Z-0aa987efac8c","green_verified":false,"json_valid":true,"last_attempt_epoch":1789853557,"last_success_epoch":1789853557,"logical_id":"vm9130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":105718},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-codevipe.json","generation":"v2-xf-codevipe-20260920T162616Z-da4e8fcf3129","green_verified":false,"json_valid":true,"last_attempt_epoch":1789922324,"last_success_epoch":1789922324,"logical_id":"xf-codevipe","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":36951},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-dsmods.json","generation":"v2-xf-dsmods-20260919T214716Z-c783be0bd209","green_verified":false,"json_valid":true,"last_attempt_epoch":1789860411,"last_success_epoch":1789860411,"logical_id":"xf-dsmods","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":98864},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-gamevipe.json","generation":"v2-xf-gamevipe-20260920T015714Z-762dbd7ce0d7","green_verified":false,"json_valid":true,"last_attempt_epoch":1789882268,"last_success_epoch":1789882268,"logical_id":"xf-gamevipe","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":77007},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-hkmods.json","generation":"v2-xf-hkmods-20260920T071214Z-6407219f0624","green_verified":false,"json_valid":true,"last_attempt_epoch":1789906789,"last_success_epoch":1789906789,"logical_id":"xf-hkmods","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":52486},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-kingofwolk.json","generation":"v2-xf-kingofwolk-20260919T232652Z-cb0189b2b0ba","green_verified":false,"json_valid":true,"last_attempt_epoch":1789861037,"last_success_epoch":1789861037,"logical_id":"xf-kingofwolk","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":98238},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-newfi.json","generation":"v2-xf-newfi-20260920T004616Z-6be6559a5589","green_verified":false,"json_valid":true,"last_attempt_epoch":1789865619,"last_success_epoch":1789865619,"logical_id":"xf-newfi","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":93656},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-zakrutim.json","generation":"v2-xf-zakrutim-20260920T173658Z-a8de3568c79b","green_verified":false,"json_valid":true,"last_attempt_epoch":1789926652,"last_success_epoch":1789926652,"logical_id":"xf-zakrutim","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":32623}] +ACTIVE_WITHOUT_V2_STATE=["app-filebrowser","app-hbarhub","app-immich","app-skladchik-reports-monitor","vm110","vm111","vm112","vm113"] +ACTIVE_STATE_SUMMARY=[{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"control-bootstrap-v2.json","generation":"control-bootstrap-v2-pve01-20260916T120057Z","green_verified":null,"json_valid":true,"last_attempt_epoch":1789930298,"last_success_epoch":1789930298,"logical_id":"control-bootstrap-v2","quorum":null,"replica_count":null,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":28977},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm130.json","generation":"v2-vm130-20260920T233759Z-c9518c8be2c3","green_verified":false,"json_valid":true,"last_attempt_epoch":1789948633,"last_success_epoch":1789948633,"logical_id":"vm130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":10642},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm150.json","generation":"v2-vm150-20260920T230035Z-e0880e47ea55","green_verified":false,"json_valid":true,"last_attempt_epoch":1789945347,"last_success_epoch":1789945347,"logical_id":"vm150","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":13928},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm160.json","generation":"v2-vm160-20260921T001432Z-31df1acfee7a","green_verified":false,"json_valid":true,"last_attempt_epoch":1789950100,"last_success_epoch":1789950100,"logical_id":"vm160","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":9175},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm170.json","generation":"v2-vm170-20260921T023516Z-53ad6a6b10f9","green_verified":false,"json_valid":true,"last_attempt_epoch":1789958880,"last_success_epoch":1789958880,"logical_id":"vm170","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":395},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm171.json","generation":"v2-vm171-20260921T004759Z-537db1552014","green_verified":false,"json_valid":true,"last_attempt_epoch":1789951877,"last_success_epoch":1789951877,"logical_id":"vm171","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":7398},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm190.json","generation":"v2-vm190-20260921T012544Z-298b64987988","green_verified":false,"json_valid":true,"last_attempt_epoch":1789954139,"last_success_epoch":1789954139,"logical_id":"vm190","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":5136},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm9130.json","generation":"v2-vm9130-20260919T210758Z-0aa987efac8c","green_verified":false,"json_valid":true,"last_attempt_epoch":1789853557,"last_success_epoch":1789853557,"logical_id":"vm9130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":105718}] +V2_WRAPPER_META={"exists":true,"is_symlink":false,"sha256":"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2"} +V2_SOURCE_HINTS=[{"file":"/usr/local/sbin/.homelab-command-adapter.new.1544389","line":1089,"text":" \"capsule retry client IP mismatch\""},{"file":"/usr/local/sbin/.homelab-command-adapter.new.1544389","line":1118,"text":" \"idempotent_retry\": True,"},{"file":"/usr/local/sbin/__pycache__/homelab-backup-matrix-refreshcpython-313.pyc","line":171,"text":"age_seconds\ufffd\u0017generated_health_output)\u0003rk\u0000\u0000\u0000\ufffd\tfreshnessr}\u0000\u0000\u0000r&\u0000\u0000\u0000\ufffd\u0006shadowz\u0007STATUS=z\u0003TS=z\u0007JOB_ID=z\tJOB_NAME=z"},{"file":"/usr/local/sbin/__pycache__/homelab-backup-matrix-refreshcpython-313.pyc","line":176,"text":"FRESHNESS=z\u0004.txtr1\u0000\u0000\u0000\ufffd\u0015compatibility_outputs\ufffd"},{"file":"/usr/local/sbin/__pycache__/homelab-reference-refreshcpython-313.pyc","line":107,"text":"Nr\u0003\u0000\u0000\u0000\ufffd\u0011freshness_secondsi\u0010\u000e\u0000\u0000)\u0001\ufffd\u0007seconds)\u0003\ufffd\u0006source\ufffd"},{"file":"/usr/local/sbin/__pycache__/homelab-safe-runcpython-313.pyc","line":23,"text":"kb/lessons/known_failures.jsonz!kb/current/02_FRESHNESS_POLICY.md\ufffd\u001fkb/policies/command_policy.jsonz"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":5,"text":"PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":14,"text":"FRESHNESS_SECONDS=\"$(\"$REGISTRY_HELPER\" freshness-seconds APP)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":16,"text":"(( DUE_SECONDS > 0 && DUE_SECONDS < FRESHNESS_SECONDS )) || { printf 'APP_QUORUM_QUEUE_ERROR=DUE_THRESHOLD_INVALID\\n' >&2; exit 65; }"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":31,"text":"freshness_decision(){"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":39,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_RESUME GENERATION=%s\\n' \"$app\" \"$generation\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":45,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_EPOCH_INVALID\\n' \"$app\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":50,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=SKIP_FRESH GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":51,"text":" elif (( age >= DUE_SECONDS && age < FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":52,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_DUE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":53,"text":" elif (( age >= FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":54,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_STALE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":56,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_TIMESTAMP_IN_FUTURE GENERATION=%s AGE_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":60,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED\\n' \"$app\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":63,"text":" die \"FRESHNESS_DECISION_INVALID_${app}_${decision:-EMPTY}\" 65"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":67,"text":"freshness_plan(){"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":69,"text":" [[ -x \"$PROBE\" && ! -L \"$PROBE\" ]] || die FRESHNESS_PROBE_NOT_INSTALLED 69"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":72,"text":" out=\"$(freshness_decision \"$a\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":74,"text":" decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$out\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":75,"text":" [[ -n \"$decision\" ]] || die \"FRESHNESS_PLAN_DECISION_MISSING_$a\" 65"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":76,"text":" printf 'QUEUE_FRESHNESS_PLAN APP=%s DECISION=%s\\n' \"$a\" \"$decision\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":90,"text":" freshness_plan"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":93,"text":" local a=\"$1\" freshness decision now_epoch out generation"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":107,"text":" freshness=\"$(exec 8>&-; exec 9>&-; freshness_decision \"$a\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":108,"text":" printf '%s\\n' \"$freshness\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":109,"text":" decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":112,"text":" generation=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^GENERATION=/){sub(/^GENERATION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":117,"text":" *) die \"FRESHNESS_RECHECK_INVALID_${a}_${decision:-EMPTY}\" 65 ;;"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":150,"text":" freshness-plan) [[ \"$#\" == 1 ]] || die USAGE_FRESHNESS_PLAN 64; freshness_plan ;;"},{"file":"/usr/local/sbin/homelab-backup-audit","line":12,"text":"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-audit","line":14,"text":"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-audit","line":105,"text":" value=\"$(awk -F= '$1==\"FRESHNESS_SECONDS\"{print $2; exit}' \"$file\")\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":140,"text":" printf 'CONTRACT|task=%s|target_registry=CANONICAL|vm_count=%s|app_count=%s|control_sla_seconds=%s|retention=ACTIVE_OWNER_AWARE|provider_worm=NOT_PROVEN_SKIPPED|dr_proof_source=EXACT_SITE_DR_FINAL_SEAL|legacy_site_dr_seal=AUTHORITATIVE|control_freshness=RECURRING_PRODUCER_12H_DUE_24H_SLA|full_site_dr=PROVEN_BY_SEAL\\n' \"$TASK_ID\" \"${#VMIDS[@]}\" \"${#APPS[@]}\" \"$CONTROL_SLA_SECONDS\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":153,"text":" all|write-health|scheduled) ;;"},{"file":"/usr/local/sbin/homelab-backup-audit","line":154,"text":" *) die \"USAGE_all_write-health_scheduled_contract\" 64 ;;"},{"file":"/usr/local/sbin/homelab-backup-audit","line":166,"text":"vm_sla=\"$(\"$REGISTRY_HELPER\" freshness-seconds VM)\" || die VM_SLA_UNREADABLE"},{"file":"/usr/local/sbin/homelab-backup-audit","line":167,"text":"app_sla=\"$(\"$REGISTRY_HELPER\" freshness-seconds APP)\" || die APP_SLA_UNREADABLE"},{"file":"/usr/local/sbin/homelab-backup-audit","line":220,"text":" freshness_status=\"$(field FRESHNESS_STATUS <<<\"$out\")\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":223,"text":" if [[ \"$freshness_status\" != OK ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":260,"text":" freshness_status=\"$(field FRESHNESS_STATUS <<<\"$out\")\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":263,"text":" if [[ \"$freshness_status\" != OK ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":345,"text":"printf 'CONTROL|state=%s|CONTROL_FRESHNESS=%s|generation=%s|age_seconds=%s|sla_seconds=%s|archive_size_bytes=%s|restore_evidence_checked=%s|source_coverage=RESTORE_EVIDENCE|retention=ACTIVE_OWNER_AWARE\\n' \"$control_status\" \"$control_status\" \"$control_generation\" \"$control_age\" \"$CONTROL_SLA_SECONDS\" \"$control_archive_size\" \"$control_checked\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":391,"text":"if [[ \"$mode\" == write-health || \"$mode\" == scheduled ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":402,"text":"scheduler_ok=0"},{"file":"/usr/local/sbin/homelab-backup-audit","line":412,"text":" if [[ \"$load_state\" == loaded && \"$unit_file_state\" == enabled && \"$active_state\" == active && \"$result\" != failed && \"$service_result\" != failed ]]; then status=OK; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi"},{"file":"/usr/local/sbin/homelab-backup-audit","line":415,"text":" if [[ \"$load_state\" == not-found && \"$active_state\" == inactive ]]; then status=EXPECTED_ABSENT; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi"},{"file":"/usr/local/sbin/homelab-backup-audit","line":527,"text":"(( stale > 0 )) && add_risk HIGH RPO_BREACH"},{"file":"/usr/local/sbin/homelab-backup-audit","line":536,"text":"printf 'SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=%s|RISK_SEVERITY=%s|RISK_REASONS=%s|DR_PROOF_STATUS=%s|CONTROL_FRESHNESS=%s|LIFECYCLE_STATUS=%s|VM_COUNT=%s|APP_COUNT=%s|FRESH=%s|STALE=%s|RESUME=%s|UNVERIFIED=%s|CONTROL_STATE=%s|CLOUD_OK=%s|SCHEDULER_OK=%s|SOURCE_OK=%s|SOURCE_DRIFT=%s|STAGING_BAD=%s|STAGING_WARN=%s|PAYLOAD_LEAKS=%s|RETENTION_STATUS=%s|OBSERVABILITY=%s|SIZE_ANOMALIES=%s|CAPACITY=%s|GLOBAL_DR_PROVEN=%s\\n' \"$backup_status\" \"$risk_severity\" \"$risk_reasons\" \"$dr_proof_status\" \"$control_status\" \"$lifecycle_status\" \"$vm_seen\" \"$app_seen\" \"$fresh\" \"$stale\" \"$resume\" \"$unverified\" \"$control_status\" \"$cloud_ok\" \"$scheduler_ok\" \"$source_ok\" \"$source_drift\" \"$staging_bad\" \"$staging_warn\" \"$payload_leaks\" \"$retention_status\" \"$observability_status\" \"$size_anomaly_count\" \"$capacity_status\" \"$global_dr_proven\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":538,"text":"if [[ \"$mode\" == write-health || \"$mode\" == scheduled ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":541,"text":" jq -n --arg task \"$TASK_ID\" --arg change \"$CHANGE_ID\" --arg at \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" --arg backup \"$backup_status\" --arg risk \"$risk_severity\" --arg reasons \"$risk_reasons\" --arg control \"$control_status\" --arg dr \"$dr_proof_status\" --arg lifecycle \"$lifecycle_status\" --arg escrow \"$escrow_status\" --arg staging \"$staging_status\" --arg retention \"$retention_status\" --arg observability \"$observability_status\" --arg capacity \"$capacity_status\" --argjson historical \"$historical_gc_proven\" --argjson owner_gc \"$owner_aware_gc_proven\" --argjson staging_bad \"$staging_bad\" --argjson staging_warn \"$staging_warn\" --argjson vm_count \"$vm_seen\" --argjson app_count \"$app_seen\" --argjson fresh \"$fresh\" --argjson stale \"$stale\" --argjson resume \"$resume\" --argjson unverified \"$unverified\" --argjson cloud_ok \"$cloud_ok\" --argjson scheduler_ok \"$scheduler_ok\" --argjson source_ok \"$source_ok\" --argjson source_drift \"$source_drift\" --argjson payload_leaks \"$payload_leaks\" --argjson size_anoma"},{"file":"/usr/local/sbin/homelab-backup-dispatcher","line":15,"text":" if [[ \"$kind\" == VM ]]; then [[ \"$line\" == QUEUE_FRESHNESS\\ VMID=* ]] || continue; else [[ \"$line\" == QUEUE_FRESHNESS\\ APP=* ]] || continue; fi"},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":3,"text":"OUT=\"${HL_OUTPUT_DIR:-/var/log/homelab-backup-freshness}\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":38,"text":" echo \"# HELP homelab_backup_freshness_artifact_candidates_total Backup artifact candidates found by safe local collector.\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":39,"text":" echo \"# TYPE homelab_backup_freshness_artifact_candidates_total gauge\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":40,"text":" echo \"homelab_backup_freshness_artifact_candidates_total $TOTAL\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":41,"text":" echo \"# HELP homelab_backup_freshness_newest_artifact_age_seconds Age of newest backup-like artifact candidate in seconds, -1 if none.\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":42,"text":" echo \"# TYPE homelab_backup_freshness_newest_artifact_age_seconds gauge\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":43,"text":" echo \"homelab_backup_freshness_newest_artifact_age_seconds $AGE\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":44,"text":" echo \"# HELP homelab_backup_freshness_run_success Last backup freshness collector run status.\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":45,"text":" echo \"# TYPE homelab_backup_freshness_run_success gauge\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":46,"text":" echo \"homelab_backup_freshness_run_success 1\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":47,"text":"} > \"$TEXTFILE/homelab_backup_freshness.prom\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":48,"text":"chmod 0644 \"$TEXTFILE/homelab_backup_freshness.prom\""},{"file":"/usr/local/sbin/homelab-backup-matrix-refresh","line":112,"text":" freshness=\"UNKNOWN\" if age<0 else (\"FRESH\" if age<=max_age else \"STALE\")"},{"file":"/usr/local/sbin/homelab-backup-matrix-refresh","line":114,"text":" result={\"id\":jid,\"name\":name,\"category\":job.get(\"category\",\"unknown\"),\"critical\":critical,\"timer\":timer,\"service\":service,\"timer_enabled\":enabled,\"timer_active\":active,\"status\":final,\"source_kind\":source_kind,\"evidence_level\":evidence_level,\"service_result\":service_result,\"service_exec_main_status\":service_exec_main_status,\"source_health\":source,\"source_status\":source_status,\"source_mtime\":source_mtime,\"age_seconds\":age,\"max_age_seconds\":max_age,\"freshness\":freshness,\"generated_health_output\":job.get(\"generated_health_output\",\"\")}"},{"file":"/usr/local/sbin/homelab-backup-matrix-refresh","line":116,"text":" mode_value=matrix.get(\"mode\",\"shadow\"); lines=[f\"STATUS={final}\",f\"TS={now_iso}\",\"TYPE=backup-matrix-generated\",f\"JOB_ID={jid}\",f\"JOB_NAME={name}\",f\"MATRIX_MODE={mode_value}\",f\"TIMER={timer}\",f\"SERVICE={service}\",f\"TIMER_ENABLED={enabled}\",f\"TIMER_ACTIVE={active}\",f\"SOURCE_KIND={source_kind}\",f\"EVIDENCE_LEVEL={evidence_level}\",f\"SERVICE_RESULT={service_result}\",f\"SERVICE_EXEC_MAIN_STATUS={service_exec_main_status}\",f\"SOURCE_HEALTH={source}\",f\"SOURCE_STATUS={source_status}\",f\"SOURCE_MTIME_UTC={source_mtime}\",f\"AGE_SECONDS={age}\",f\"MAX_AGE_SECONDS={max_age}\",f\"FRESHNESS={freshness}\"]"},{"file":"/usr/local/sbin/homelab-backup-npmplus-kuma-configs","line":70,"text":" SELECT id || char(124) || name || char(124) || type || char(124) || url || char(124) || keyword || char(124) || interval || char(124) || maxretries || char(124) || retry_interval || char(124) || active"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":19,"text":"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":20,"text":"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":433,"text":"scheduled(){"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":434,"text":" exec 5>\"$LOCK\"; flock -n 5 || { printf 'GC_SCHEDULED=SKIP|reason=GC_LOCK_BUSY\\n'; return 0; }"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":443,"text":" if (( count == 0 && open_tx == 0 )); then write_health \"$p1\" true 0; cat \"$p1\"; printf 'GC_SCHEDULED=OK|deleted=0|transactions_resumed=0\\n'; return 0; fi"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":444,"text":" if ! acquire_gc_locks; then write_health \"$p1\" true 0; printf 'GC_SCHEDULED=SKIP|reason=BACKUP_LOCK_BUSY|candidates=%s|open_transactions=%s\\n' \"$count\" \"$open_tx\"; return 0; fi"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":449,"text":" if (( count == 0 )); then write_health \"$p2\" true 0; cat \"$p2\"; printf 'GC_SCHEDULED=OK|deleted=0|transactions_resumed=%s\\n' \"$open_tx\"; return 0; fi"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":450,"text":" cmp -s <(grep '^DELETE|' \"$p1\" | stable_delete_set) <(grep '^DELETE|' \"$p2\" | stable_delete_set) || { write_health \"$p2\" true 0; printf 'GC_SCHEDULED=SKIP|reason=PLAN_CHANGED_AFTER_LOCK\\n'; return 0; }"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":454,"text":" printf 'GC_SCHEDULED=OK|deleted=%s|transactions_resumed=%s\\n' \"$deleted\" \"$open_tx\""},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":462,"text":" scheduled) scheduled ;;"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":463,"text":" *) die USAGE_contract_plan_canary_activate_scheduled 64 ;;"},{"file":"/usr/local/sbin/homelab-backup-sla-health","line":20,"text":"echo \"## App backup freshness\" >> \"$REPORT\""},{"file":"/usr/local/sbin/homelab-backup-sla-health","line":50,"text":"echo \"## Emergency backup freshness\" >> \"$REPORT\""},{"file":"/usr/local/sbin/homelab-backup-v2","line":5,"text":"EXPECTED={'fresh_lxc_helper.py': 'dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011', 'producer_exec_helper.py': 'b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3', 'lxc_adapter.py': '3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d', 'qemu_adapter.py': '1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b', 'scheduler_adapter.py': 'a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96', 'entry504.py': 'ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793'}"},{"file":"/usr/local/sbin/homelab-command-adapter","line":1089,"text":" \"capsule retry client IP mismatch\""},{"file":"/usr/local/sbin/homelab-command-adapter","line":1118,"text":" \"idempotent_retry\": True,"},{"file":"/usr/local/sbin/homelab-control-backup","line":105,"text":" tmp=\"${HEALTH}.new.$$\"; jq -n --arg gen \"$gen\" --arg state \"$state\" --arg evidence \"$EVIDENCE_ROOT/$gen.json\" --arg sha \"$archive_sha\" --arg now \"$now\" '{schema:\"homelab-control-backup-health-v1\",status:\"OK\",generation:$gen,state_file:$state,restore_evidence:$evidence,archive_sha256:$sha,cloud_quorum:2,control_freshness:\"FRESH\",full_site_dr_proven:false,updated_at_utc:$now}' >\"$tmp\"; chmod 0644 \"$tmp\"; mv -f \"$tmp\" \"$HEALTH\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":13,"text":"LOCK=/run/homelab-edge-vm-offhost-freshness.lock"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":23,"text":" printf 'STATUS=ERROR TS=%s TYPE=edge-vm-offhost-freshness BAD=1 REASON=%s\\n' \"$TS\" \"$reason\" >\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":24,"text":" chmod 0644 \"$HEALTH_DIR/edge-vm-offhost-freshness.txt\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":25,"text":" printf 'STATUS=ERROR TS=%s TYPE=edge-vm-offhost-freshness BAD=1 REASON=%s\\n' \"$TS\" \"$reason\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":153,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-offhost-freshness BAD=0 VMID=%s SOURCE_NODE=%s DEST_NODE=%s SRC=%s DEST=%s SIZE=%s SHA256=%s COPY_STATUS=%s ZSTD_RC=0 VMA_RC=0 KEEP=%s\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":155,"text":" >\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":156,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-backup NODE=%s VMID=%s ARCHIVE=%s SIZE=%s SHA256=%s NOTES=nightly_existing_dump_freshness\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":159,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-offhost NODE=%s VMID=%s HOST=%s DEST=%s SIZE=%s SHA256=%s NOTES=nightly_existing_dump_freshness\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":162,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-restore-verify HOST=%s VMID=%s ARCHIVE=%s SIZE=%s SHA256=%s ZSTD_RC=0 VMA_RC=0 NOTES=nightly_existing_dump_freshness\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":166,"text":" \"$HEALTH_DIR/edge-vm-offhost-freshness.txt\" \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":171,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-offhost-freshness BAD=0 COPY_STATUS=%s SIZE=%s SHA256=%s DEST=%s COMPLETE_COUNT=%s KEEP=%s\\n' \\"},{"file":"/usr/local/sbin/homelab-final-readiness-gate","line":18,"text":"check \"backup framework evidence\" bash -c \"grep -q STATUS=OK /var/lib/homelab-health/backup-framework.txt && grep -q SOURCE_STATUS=OK /var/lib/homelab-health/backup-framework.txt && grep -q FRESHNESS=FRESH /var/lib/homelab-health/backup-framework.txt\""},{"file":"/usr/local/sbin/homelab-mail-cloud-edge-vm-upload","line":7,"text":"SOURCE_HEALTH=/var/lib/homelab-health/edge-vm-offhost-freshness.txt"},{"file":"/usr/local/sbin/homelab-mailru-trash-gc","line":183,"text":" \"trash_debt_bytes\":\"UNKNOWN_PROVIDER_API\",\"last_success\":s}"},{"file":"/usr/local/sbin/homelab-reference-refresh","line":34,"text":" f=int(json.loads((R/\"manifest.json\").read_text()).get(\"freshness_seconds\",{}).get(s,3600));z=(t+datetime.timedelta(seconds=f)).isoformat()"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":219,"text":" \"task_id\":\"backup-rotating-boot-drill-escrow-freshness-v1\","},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":444,"text":" return {\"schema\":\"homelab-rotating-boot-drill-state-v1\",\"sequence\":0,\"qemu_cursor\":None,\"lxc_cursor\":None,\"last_success_utc\":None,\"last_evidence\":None}"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":651,"text":" print(f\"BOOT_DRILL_SCHEDULED=DEFERRED|reason={code}\")"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":688,"text":" wait=int(p[\"initial_lock_wait_seconds\"] if mode==\"initial\" else p[\"scheduled_lock_wait_seconds\"])"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":734,"text":" \"qemu_cursor\":q,\"lxc_cursor\":l,\"last_success_utc\":evidence[\"completed_at_utc\"],"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":749,"text":" if mode==\"scheduled\" and e.code in (\"BACKUP_LOCK_BUSY\",\"ESCROW_SEMANTIC_PROOF_STALE\",\"CURRENT_BACKUP_AUDIT_NOT_DR_READY\",\"NO_QEMU_GUEST_AGENT_ELIGIBLE\",\"NO_LXC_RUNNING_ELIGIBLE\",\"STAGE_CAPACITY_INSUFFICIENT\",\"LOCAL_LVM_CAPACITY_INSUFFICIENT\"):"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":793,"text":" elif action==\"scheduled\":"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":794,"text":" execute(\"scheduled\",p)"},{"file":"/usr/local/sbin/homelab-safe-run","line":11,"text":" \"kb/lessons/known_failures.json\",\"kb/current/02_FRESHNESS_POLICY.md\","},{"file":"/usr/local/sbin/homelab-vm-backup-health","line":20,"text":"if systemctl is-active --quiet homelab-edge-vm-offhost-freshness.timer; then DETAILS=\"$DETAILS edge-freshness-timer=active\"; else BAD=$((BAD+1)); DETAILS=\"$DETAILS edge-freshness-timer=bad\"; fi"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":6,"text":"PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":9,"text":"FRESHNESS_SECONDS=72000"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":16,"text":"(( DUE_SECONDS > 0 && DUE_SECONDS < FRESHNESS_SECONDS )) || die DUE_THRESHOLD_INVALID 65"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":80,"text":"freshness_decision(){"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":88,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_RESUME GENERATION=%s\\n' \"$vmid\" \"$generation\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":94,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_EPOCH_INVALID\\n' \"$vmid\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":99,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=SKIP_FRESH GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":100,"text":" elif (( age >= DUE_SECONDS && age < FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":101,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_DUE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":102,"text":" elif (( age >= FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":103,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_STALE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":105,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_TIMESTAMP_IN_FUTURE GENERATION=%s AGE_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":109,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED\\n' \"$vmid\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":112,"text":" die \"FRESHNESS_DECISION_INVALID_${vmid}_${decision:-EMPTY}\" 65"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":116,"text":"freshness_plan(){"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":118,"text":" [[ -x \"$PROBE\" ]] || die \"FRESHNESS_PROBE_NOT_INSTALLED\" 69"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":121,"text":" out=\"$(freshness_decision \"$vmid\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":123,"text":" decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$out\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":124,"text":" [[ -n \"$decision\" ]] || die \"FRESHNESS_PLAN_DECISION_MISSING_$vmid\" 65"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":125,"text":" printf 'QUEUE_FRESHNESS_PLAN VMID=%s DECISION=%s\\n' \"$vmid\" \"$decision\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":144,"text":" freshness_plan"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":147,"text":" local vmid=\"$1\" freshness decision now_epoch out generation"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":161,"text":" freshness=\"$(exec 8>&-; exec 9>&-; freshness_decision \"$vmid\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":162,"text":" printf '%s\\n' \"$freshness\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":163,"text":" decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":166,"text":" generation=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^GENERATION=/){sub(/^GENERATION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":171,"text":" *) die \"FRESHNESS_RECHECK_INVALID_${vmid}_${decision:-EMPTY}\" 65 ;;"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":188,"text":" freshness-plan)"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":189,"text":" [[ \"$#\" == 1 ]] || die \"USAGE_FRESHNESS_PLAN\" 64"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":190,"text":" freshness_plan"},{"file":"/usr/local/sbin/skladchik-reports-monitor-status","line":44,"text":"CANONICAL_PROBE=\"/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\""},{"file":"/usr/local/sbin/skladchik-reports-monitor-status","line":52,"text":" grep -q '^FRESHNESS_STATUS=OK$' <<<\"$CANONICAL_OUTPUT\" || PROBLEMS=$((PROBLEMS+1))"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":24,"text":"APP_FRESHNESS_PROBE = Path(\"/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\")"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":132,"text":"# HOMELAB_COOKIE_JAR_RETRY_423"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":225,"text":" shlex.quote(str(APP_FRESHNESS_PROBE)) + \" decision skladchik-reports-monitor\","},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":230,"text":" facts[\"canonical_backup_status\"] = probe.get(\"FRESHNESS_STATUS\", \"MISSING\")"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":239,"text":" if probe.get(\"FRESHNESS_STATUS\") != \"OK\":"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":286,"text":" f\"- freshness status: {facts.get('canonical_backup_status')}\","}] +CLOUD_STATE={"A":{"about":{"free":293208518329,"total":1099511627776,"used":806303109447},"about_rc":0,"lsf_rc":0,"stderr_lines":[],"top_dirs_count":26},"B":{"about":{"free":293208454470,"total":1099511627776,"used":806303173306},"about_rc":0,"lsf_rc":0,"stderr_lines":[],"top_dirs_count":26}} +CLOUD_B_RESTORE_CANDIDATES=[] +CLOUD_B_RESTORE_PREFERRED=null +RETENTION_IMPLEMENTATION=[{"bytes":327,"interface_lines":[{"line":2,"text":"Description=Homelab owner-aware cloud retention GC"},{"line":5,"text":"ConditionPathExists=/usr/local/sbin/homelab-backup-retention-gc"},{"line":9,"text":"ExecStart=/usr/local/sbin/homelab-backup-retention-gc scheduled"},{"line":11,"text":"IOSchedulingClass=best-effort"}],"path":"/etc/systemd/system/homelab-backup-retention-gc.service","sha256":"0c49e10bdb225eeca0af5fca80aaf109addec2b18a6b892c0fe17c28b656ad7c"},{"bytes":237,"interface_lines":[{"line":2,"text":"Description=Run homelab owner-aware cloud retention GC daily"},{"line":9,"text":"Unit=homelab-backup-retention-gc.service"}],"path":"/etc/systemd/system/homelab-backup-retention-gc.timer","sha256":"a0e763670745a5ef7c04b54da23114a013f47075cf36cceef0218bae9b82ea2f"},{"bytes":7123,"interface_lines":[{"line":23,"text":"KEEP=\"${10:?keep}\""},{"line":132,"text":" [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":138,"text":" plan)"},{"line":146,"text":" printf 'REMOTE_PLAN_STATUS=OK\\n'"},{"line":154,"text":" [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":167,"text":" [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":184,"text":" [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":206,"text":" [[ \"$(complete_count)\" == \"$KEEP\" ]]"}],"path":"/usr/local/libexec/homelab-edge-vm-offhost-retention-worker","sha256":"ca25a48b00c26e0eb5e64ac7d5e1d8f3805c200e30d9f87c5ef7c8da90402e54"},{"bytes":4296,"interface_lines":[{"line":3,"text":"KEEP=\"${1:-7}\""},{"line":4,"text":"MODE=\"${2:-dry-run}\""},{"line":6,"text":"[[ \"$KEEP\" =~ ^[0-9]+$ ]] || { echo \"BAD KEEP\"; exit 2; }"},{"line":7,"text":"(( KEEP >= 2 )) || { echo \"REFUSE keep<2\"; exit 2; }"},{"line":8,"text":"[[ \"$MODE\" == dry-run || \"$MODE\" == apply ]] || { echo \"BAD MODE\"; exit 2; }"},{"line":31,"text":"WORK=\"$(mktemp -d /tmp/app-retention-dual.XXXXXX)\""},{"line":71,"text":" echo \"remote_index=$INDEX app=$APP canonical=$CANONICAL total=$TOTAL legacy=$LEGACY_TOTAL short=$SHORT_TOTAL keep=$KEEP mode=$MODE latest=${LATEST:-none}\""},{"line":76,"text":" [[ \"$FOUND_LATEST\" -eq 1 ]] || { echo \"REFUSE latest not in retention set remote_index=$INDEX\"; exit 6; }"},{"line":78,"text":" if (( TOTAL <= KEEP )); then echo \"nothing to delete\"; continue; fi"},{"line":79,"text":" DELETE_COUNT=$((TOTAL-KEEP))"},{"line":80,"text":" for ((I=0; I= 2 )) || { echo \"REFUSE keep<2\"; exit 2; }"},{"line":7,"text":"[[ \"$MODE\" == \"dry-run\" || \"$MODE\" == \"apply\" ]] || { echo \"BAD MODE\"; exit 2; }"},{"line":21,"text":" echo \"total=$TOTAL keep=$KEEP mode=$MODE latest=${LATEST:-none}\""},{"line":22,"text":" if (( TOTAL <= KEEP )); then echo \"nothing to delete\"; continue; fi"},{"line":23,"text":" DELETE_COUNT=$((TOTAL-KEEP))"},{"line":24,"text":" for ((i=0; i&2; exit 69; }"},{"line":28,"text":"[[ \"$(sha256sum \"$REGISTRY_HELPER\"|awk '{print $1}')\" == \"$REGISTRY_HELPER_SHA_EXPECTED\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=TARGET_REGISTRY_HELPER_SHA_DRIFT\\n' >&2; exit 65; }"},{"line":29,"text":"\"$REGISTRY_HELPER\" validate >/dev/null || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=TARGET_REGISTRY_INVALID\\n' >&2; exit 66; }"},{"line":30,"text":"[[ -x \"$GFS_HELPER\" && ! -L \"$GFS_HELPER\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_HELPER_MISSING\\n' >&2; exit 69; }"},{"line":31,"text":"[[ \"$(sha256sum \"$GFS_HELPER\"|awk '{print $1}')\" == \"$GFS_HELPER_SHA_EXPECTED\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_HELPER_SHA_DRIFT\\n' >&2; exit 65; }"},{"line":32,"text":"HOMELAB_BACKUP_GFS_POLICY=\"$GFS_POLICY\" \"$GFS_HELPER\" validate >/dev/null || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_INVALID\\n' >&2; exit 66; }"},{"line":35,"text":"GFS_CRITICAL_COUNT=\"$(HOMELAB_BACKUP_GFS_POLICY=\"$GFS_POLICY\" \"$GFS_HELPER\" critical-logicals | wc -l)\""},{"line":36,"text":"VM_KEEP=\"$(\"$REGISTRY_HELPER\" policy-keep VM)\""},{"line":37,"text":"APP_KEEP=\"$(\"$REGISTRY_HELPER\" policy-keep APP)\""},{"line":38,"text":"CONTROL_KEEP=\"$(\"$REGISTRY_HELPER\" policy-keep CONTROL)\""},{"line":39,"text":"MIN_DELETE_AGE_SECONDS=86400"},{"line":42,"text":"die(){ local msg=\"$1\" rc=\"${2:-65}\"; trap - ERR; printf 'GC_STATUS=ERROR|ROOT_CAUSE=%s\\n' \"$msg\" >&2; exit \"$rc\"; }"},{"line":44,"text":"stable_delete_set(){ sed -E 's/\\|age_seconds=[0-9]+$//'; }"},{"line":50,"text":"keep_for(){ \"$REGISTRY_HELPER\" retention-keep \"$1\" 2>/dev/null; }"},{"line":51,"text":"logical_list(){ \"$REGISTRY_HELPER\" retention-logicals; }"},{"line":58,"text":" TMPROOT=\"/run/homelab-retention-gc.$$\""},{"line":74,"text":" jq -e --arg l \"$logical\" --arg g \"$generation\" '.schema==\"homelab-cloud-quorum-payload-v1\" and .logical_id==$l and .generation==$g and .status==\"SEALED\" and .cloud_quorum==2 and .cloud_a_verified==true and .cloud_b_verified==true and .part_hashes_verified==true and .seal_written==true and .cloud_a_seal_verified==true and .cloud_b_seal_verified==true and .local_delete_allowed==true and .local_payload_present==false and .local_cleanup==\"OK\"' <<<\"$json\" >/dev/null"},{"line":106,"text":" f=\"$RETENTION_ROOT/transactions/$logical/$generation.json\""},{"line":111,"text":" f=\"$RETENTION_ROOT/transactions/$logical/$generation.json\""},{"line":117,"text":" [[ -d \"$RETENTION_ROOT/transactions\" ]] || { printf '0\\n'; return 0; }"},{"line":123,"text":" PLANNED|B_DELETED) count=$((count+1)) ;;"},{"line":126,"text":" done < <(find \"$RETENTION_ROOT/transactions\" -type f -name '*.json' -print | LC_ALL=C sort)"},{"line":130,"text":"pinned_delete_contract_enabled(){"},{"line":131,"text":" [[ -n \"${HOMELAB_RETENTION_PINNED_DELETE_FILE:-}\" || -n \"${HOMELAB_RETENTION_PINNED_DELETE_SHA256:-}\" ]]"},{"line":133,"text":"pinned_delete_assert_file(){"},{"line":134,"text":" local f=\"${HOMELAB_RETENTION_PINNED_DELETE_FILE:-}\" expected=\"${HOMELAB_RETENTION_PINNED_DELETE_SHA256:-}\" actual line logical generation owner state_file state_sha count=0"},{"line":135,"text":" [[ -n \"$f\" && -n \"$expected\" ]] || die PINNED_DELETE_CONTRACT_INCOMPLETE 64"},{"line":136,"text":" [[ \"$expected\" =~ ^[0-9a-f]{64}$ ]] || die PINNED_DELETE_SHA_INVALID 64"},{"line":137,"text":" [[ -f \"$f\" && ! -L \"$f\" ]] || die PINNED_DELETE_FILE_UNSAFE 64"},{"line":139,"text":" [[ \"$actual\" == \"$expected\" ]] || die PINNED_DELETE_FILE_SHA_MISMATCH 66"},{"line":141,"text":" [[ -n \"$line\" ]] || die PINNED_DELETE_EMPTY_LINE 66"},{"line":147,"text":" [[ \"$line\" == \"DELETE|logical=$logical|generation=$generation|owner=$owner|state_file=$state_file|state_sha256=$state_sha\" ]] || die PINNED_DELETE_LINE_FORMAT_INVALID 66"},{"line":148,"text":" [[ \"$(node_for_logical \"$logical\")\" == \"$owner\" ]] || die \"PINNED_DELETE_OWNER_INVALID_${logical}\" 66"},{"line":149,"text":" safe_generation \"$logical\" \"$generation\" || die \"PINNED_DELETE_GENERATION_INVALID_${logical}\" 66"},{"line":150,"text":" [[ \"$state_file\" == \"$STATE_ROOT/$logical/$generation.json\" ]] || die \"PINNED_DELETE_STATE_PATH_INVALID_${logical}\" 66"},{"line":151,"text":" [[ \"$state_sha\" =~ ^[0-9a-f]{64}$ ]] || die \"PINNED_DELETE_STATE_SHA_INVALID_${logical}\" 66"},{"line":154,"text":" (( count > 0 )) || die PINNED_DELETE_FILE_EMPTY 66"},{"line":155,"text":" [[ \"$(LC_ALL=C sort \"$f\" | uniq | wc -l)\" == \"$count\" ]] || die PINNED_DELETE_FILE_DUPLICATE 66"},{"line":160,"text":" jq -e --arg task \"$TASK_ID\" --arg change \"$CHANGE_ID\" '.schema==\"homelab-backup-retention-transaction-v1\" and .task_id==$task and .change_id==$change and (.logical_id|type)==\"string\" and (.generation|type)==\"string\" and (.state_sha256|type)==\"string\" and (.status==\"PLANNED\" or .status==\"B_DELETED\" or .status==\"DONE\")' \"$f\" >/dev/null || die \"PINNED_TX_CONTENT_INVALID_$f\" 66"},{"line":165,"text":" expected_path=\"$RETENTION_ROOT/transactions/$logical/$generation.json\""},{"line":167,"text":" printf 'DELETE|logical=%s|generation=%s|owner=%s|state_file=%s|state_sha256=%s\\n' \"$logical\" \"$generation\" \"$owner\" \"$STATE_ROOT/$logical/$generation.json\" \"$state_sha\""},{"line":170,"text":" local root=\"$RETENTION_ROOT/transactions\" f"},{"line":178,"text":" local plan_file=\"$1\" line logical generation reason txf status"},{"line":183,"text":" [[ \"$reason\" == GC_TRANSACTION_PLANNED || \"$reason\" == GC_TRANSACTION_B_DELETED ]] || die \"PINNED_PLAN_UNEXPECTED_PROTECT_${logical}_${generation}_${reason}\" 66"},{"line":184,"text":" txf=\"$RETENTION_ROOT/transactions/$logical/$generation.json\""},{"line":185,"text":" [[ -s \"$txf\" && ! -L \"$txf\" ]] || die \"PINNED_PLAN_PROTECT_TX_MISSING_${logical}_${generation}\" 66"},{"line":187,"text":" [[ \"GC_TRANSACTION_$status\" == \"$reason\" ]] || die \"PINNED_PLAN_PROTECT_STATUS_MISMATCH_${logical}_${generation}\" 66"},{"line":188,"text":" grep -Fqx \"$(pinned_tx_identity \"$txf\")\" \"$HOMELAB_RETENTION_PINNED_DELETE_FILE\" || die \"PINNED_PLAN_PROTECT_NOT_PINNED_${logical}_${generation}\" 66"},{"line":189,"text":" done < <(awk '/^PROTECT\\|/' \"$plan_file\")"},{"line":191,"text":"pinned_assert_delete_scope(){"},{"line":192,"text":" local plan_file=\"$1\" stage=\"$2\" actual expected f count_actual count_expected"},{"line":193,"text":" actual=\"$TMPROOT/pinned-delete-actual.$stage\""},{"line":194,"text":" expected=\"$TMPROOT/pinned-delete-expected.$stage\""},{"line":195,"text":" pinned_delete_assert_file"},{"line":197,"text":" pinned_assert_protect_scope \"$plan_file\""},{"line":198,"text":" awk '/^DELETE\\|/' \"$plan_file\" | stable_delete_set >\"$actual\""},{"line":199,"text":" if [[ -d \"$RETENTION_ROOT/transactions\" ]]; then"},{"line":200,"text":" while IFS= read -r f; do pinned_tx_identity \"$f\" >>\"$actual\"; done < <(find \"$RETENTION_ROOT/transactions\" -type f -name '*.json' -print | LC_ALL=C sort)"},{"line":203,"text":" LC_ALL=C sort \"$HOMELAB_RETENTION_PINNED_DELETE_FILE\" >\"$expected\""},{"line":205,"text":" [[ \"$count_actual\" == \"$count_expected\" ]] || die \"PINNED_DELETE_SCOPE_COUNT_MISMATCH_${stage}\" 66"},{"line":206,"text":" [[ \"$(uniq \"$actual\" | wc -l)\" == \"$count_actual\" ]] || die \"PINNED_DELETE_SCOPE_DUPLICATE_${stage}\" 66"},{"line":207,"text":" cmp -s \"$actual\" \"$expected\" || die \"PINNED_DELETE_SCOPE_MISMATCH_${stage}\" 66"},{"line":208,"text":" printf 'PINNED_DELETE_SCOPE=OK|stage=%s|count=%s|sha256=%s\\n' \"$stage\" \"$count_expected\" \"$HOMELAB_RETENTION_PINNED_DELETE_SHA256\""},{"line":211,"text":" printf 'CONTRACT|task=%s|policy=OWNER_AWARE_SAFE_GC_GFS|target_registry=CANONICAL|vm_keep=%s|app_keep=%s|control_keep=%s|min_delete_age_seconds=%s|gfs_critical=%s|gfs_weekly=%s|gfs_monthly=%s|gfs_completed_periods_only=YES|nonsealed=PROTECT|retired_preserve=PROTECT|unknown_namespace=PROTECT|owner_state_required=YES|both_clouds_required=YES|latest_restore_proven_required=YES|legacy_hb=PROTECT|legacy_pve01=PROTECT|legacy_control=PROTECT\\n' \"$TASK_ID\" \"$VM_KEEP\" \"$APP_KEEP\" \"$CONTROL_KEEP\" \"$MIN_DELETE_AGE_SECONDS\" \"$GFS_CRITICAL_COUNT\" \"$GFS_WEEKLY\" \"$GFS_MONTHLY\""},{"line":218,"text":" if ! HOMELAB_BACKUP_GFS_POLICY=\"$GFS_POLICY\" \"$GFS_HELPER\" is-critical \"$logical\"; then return 0; fi"},{"line":236,"text":"plan(){"},{"line":240,"text":" local now logical node keep lifecycle open_count file json schema lid gen status sha sealed_at epoch age idx tx gfs_bucket candidates=0 protected=0 kept=0 gfs_kept=0"},{"line":246,"text":" if [[ \"$lifecycle\" == ACTIVE ]]; then keep=\"$(keep_for \"$logical\")\" || die \"KEEP_POLICY_UNKNOWN_$logical\"; else keep=0; fi"},{"line":273,"text":" while IFS=$'\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=LOGICAL_HAS_INCOMPLETE\\n' \"$logical\" \"$gen\" \"$node\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \"$TMPROOT/$logical.rows\")"},{"line":277,"text":" while IFS=$'\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=RETIRED_PRESERVE\\n' \"$logical\" \"$gen\" \"$node\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \"$TMPROOT/$logical.rows\")"},{"line":281,"text":" while IFS=$'\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=LATEST_RESTORE_NOT_PROVEN\\n' \"$logical\" \"$gen\" \"$node\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \"$TMPROOT/$logical.rows\")"},{"line":290,"text":" printf 'RETIRED|logical=%s|generation=%s|owner=%s|reason=GC_ALREADY_DONE\\n' \"$logical\" \"$gen\" \"$node\""},{"line":292,"text":" printf 'PROTECT|logical=%s|generation=%s|owner=%s|reason=GC_TRANSACTION_%s\\n' \"$logical\" \"$gen\" \"$node\" \"$tx\"; protected=$((protected+1))"},{"line":293,"text":" elif (( idx <= keep )); then"},{"line":294,"text":" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=POLICY_NEWEST_%s\\n' \"$logical\" \"$gen\" \"$node\" \"$keep\"; kept=$((kept+1))"},{"line":295,"text":" elif (( age < MIN_DELETE_AGE_SECONDS )); then"},{"line":296,"text":" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=MIN_AGE|age_seconds=%s\\n' \"$logical\" \"$gen\" \"$node\" \"$age\"; kept=$((kept+1))"},{"line":300,"text":" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=GFS_WEEKLY|bucket=%s\\n' \"$logical\" \"$gen\" \"$node\" \"$gfs_bucket\"; kept=$((kept+1)); gfs_kept=$((gfs_kept+1))"},{"line":302,"text":" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=GFS_MONTHLY|bucket=%s\\n' \"$logical\" \"$gen\" \"$node\" \"$gfs_bucket\"; kept=$((kept+1)); gfs_kept=$((gfs_kept+1))"},{"line":304,"text":" printf 'DELETE|logical=%s|generation=%s|owner=%s|state_file=%s|state_sha256=%s|age_seconds=%s\\n' \"$logical\" \"$gen\" \"$node\" \"$file\" \"$sha\" \"$age\""},{"line":312,"text":" printf 'PLAN_SUMMARY|delete_candidates=%s|protected=%s|kept=%s|vm_keep=%s|app_keep=%s|control_keep=%s|gfs_kept=%s|gfs_critical=%s|gfs_weekly=%s|gfs_monthly=%s\\n' \"$candidates\" \"$protected\" \"$kept\" \"$VM_KEEP\" \"$APP_KEEP\" \"$CONTROL_KEEP\" \"$gfs_kept\" \"$GFS_CRITICAL_COUNT\" \"$GFS_WEEKLY\" \"$GFS_MONTHLY\""},{"line":321,"text":" path=\"$RETENTION_ROOT/transactions/$logical/$generation.json\""},{"line":324,"text":" jq -n --arg task \"$TASK_ID\" --arg change \"$CHANGE_ID\" --arg l \"$logical\" --arg g \"$generation\" --arg s \"$state_sha\" --arg status \"$status\" --arg at \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" --argjson aa \"$a_absent\" --argjson ba \"$b_absent\" '{schema:\"homelab-backup-retention-transaction-v1\",task_id:$task,change_id:$change,logical_id:$l,generation:$g,state_sha256:$s,status:$status,updated_at_utc:$at,remote_a_absent:$aa,remote_b_absent:$ba}' >\"$tmp\""},{"line":328,"text":"apply_delete_line(){"},{"line":343,"text":" (( age >= MIN_DELETE_AGE_SECONDS )) || die \"APPLY_AGE_GUARD_${logical}_${generation}\""},{"line":346,"text":" write_tx \"$logical\" \"$generation\" \"$state_sha\" PLANNED false false"},{"line":348,"text":" remote_generation_present \"$REMOTE_B\" \"$logical\" \"$generation\" && die \"APPLY_REMOTE_B_DELETE_FAILED_${logical}_${generation}\""},{"line":349,"text":" write_tx \"$logical\" \"$generation\" \"$state_sha\" B_DELETED false true"},{"line":351,"text":" remote_generation_present \"$REMOTE_A\" \"$logical\" \"$generation\" && die \"APPLY_REMOTE_A_DELETE_FAILED_${logical}_${generation}\""},{"line":353,"text":" printf 'GC_DELETE_DONE|logical=%s|generation=%s|owner=%s\\n' \"$logical\" \"$generation\" \"$owner\""},{"line":357,"text":" [[ -d \"$RETENTION_ROOT/transactions\" ]] || return 0"},{"line":361,"text":" [[ \"$status\" == PLANNED || \"$status\" == B_DELETED ]] || die \"TX_STATUS_INVALID_$f\""},{"line":372,"text":" if [[ \"$status\" == PLANNED ]]; then"},{"line":374,"text":" remote_generation_present \"$REMOTE_B\" \"$logical\" \"$generation\" && die \"TX_REMOTE_B_DELETE_FAILED_${logical}_${generation}\""},{"line":375,"text":" write_tx \"$logical\" \"$generation\" \"$state_sha\" B_DELETED false true"}],"path":"/usr/local/sbin/homelab-backup-retention-gc","sha256":"8adb6c10f5911f39c53775b89eac3cd1823f1ed34b4caccade5279c213e998a3"},{"bytes":3140,"interface_lines":[{"line":7,"text":"LOCK=/run/lock/homelab-vm-full-retention.lock"},{"line":12,"text":" local keep=\"$LOCAL_KEEP_PAIRS\""},{"line":27,"text":" if ((${#archives[@]} <= keep)); then"},{"line":31,"text":" for archive in \"${archives[@]:keep}\"; do"},{"line":57,"text":" KEEP='$OFFHOST_KEEP_PAIRS'"},{"line":69,"text":" if [ \\\"\\$count\\\" -gt \\\"\\$KEEP\\\" ]; then"},{"line":86,"text":" local keep=$3"},{"line":99,"text":" if ((${#dirs[@]} <= keep)); then"},{"line":103,"text":" for dir in \"${dirs[@]:keep}\"; do"},{"line":113,"text":" prune_cloud_tier \"$remote\" daily \"$KEEP_DAILY\""},{"line":114,"text":" prune_cloud_tier \"$remote\" weekly \"$KEEP_WEEKLY\""},{"line":115,"text":" prune_cloud_tier \"$remote\" monthly \"$KEEP_MONTHLY\""},{"line":116,"text":" prune_cloud_tier \"$remote\" quarterly \"$KEEP_QUARTERLY\""},{"line":119,"text":"echo \"RETENTION_STATUS=OK\""}],"path":"/usr/local/sbin/homelab-vm-full-retention","sha256":"a3cced5263960557d3501123d57f95f12fcede45116111d3d5f02283497d4e63"},{"bytes":2081,"interface_lines":[{"line":4,"text":"MODE=\"${1:-dry-run}\""},{"line":5,"text":"KEEP=\"${KEEP:-2}\""},{"line":6,"text":"OUT=\"/var/lib/homelab-health/vm-local-dumps-retention.txt\""},{"line":8,"text":"REPORT=\"$ROOT/vm-local-dumps-retention-latest.md\""},{"line":15,"text":"DELETED=0"},{"line":16,"text":"WOULD_DELETE=0"},{"line":21,"text":"echo \"# Homelab VM local dumps cloud retention\" >> \"$REPORT\""},{"line":25,"text":"echo \"keep=$KEEP\" >> \"$REPORT\""},{"line":36,"text":" if [ \"$TOTAL\" -le \"$KEEP\" ]; then"},{"line":37,"text":" echo \"nothing_to_delete\" >> \"$REPORT\""},{"line":42,"text":" DELETE_COUNT=$((TOTAL-KEEP))"},{"line":46,"text":" if [ \"$IDX\" -le \"$DELETE_COUNT\" ]; then"},{"line":55,"text":" echo \"DELETE $PATH_REMOTE\" >> \"$REPORT\""},{"line":56,"text":" rclone purge \"$PATH_REMOTE\" >> \"$REPORT\" 2>&1 && DELETED=$((DELETED+1)) || BAD=$((BAD+1))"},{"line":58,"text":" echo \"WOULD_DELETE $PATH_REMOTE\" >> \"$REPORT\""},{"line":59,"text":" WOULD_DELETE=$((WOULD_DELETE+1))"},{"line":62,"text":" echo \"KEEP $BASE/$J\" >> \"$REPORT\""},{"line":72,"text":"echo \"STATUS=$STATUS TS=$TS TYPE=vm-local-dumps-retention BAD=$BAD MODE=$MODE KEEP=$KEEP DELETED=$DELETED WOULD_DELETE=$WOULD_DELETE REPORT=$REPORT\" > \"$OUT\""}],"path":"/usr/local/sbin/homelab-vm-local-dumps-retention","sha256":"306a775325708bcdfb9df6f751c15de0635bc0cf3ab90c00dfadf5ac8220c3bb"}] +AUDIT_IMPLEMENTATION=[{"bytes":39160,"path":"/usr/local/sbin/homelab-backup-audit","relevant_lines":[{"line":12,"text":"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"line":13,"text":"VM_WORKER=/usr/local/libexec/homelab-vm-cloud-quorum-node-worker"},{"line":14,"text":"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"line":15,"text":"APP_WORKER=/usr/local/libexec/homelab-app-cloud-quorum-worker"},{"line":16,"text":"APP_CORE=/usr/local/libexec/homelab-app-cloud-quorum-core-helper"},{"line":18,"text":"VM_QUEUE=/usr/local/sbin/homelab-vm-cloud-quorum-queue"},{"line":19,"text":"APP_QUEUE=/usr/local/sbin/homelab-app-cloud-quorum-queue"},{"line":22,"text":"CONTROL_BACKUP=/usr/local/sbin/homelab-control-backup"},{"line":23,"text":"CONTROL_BUILDER=/usr/local/libexec/homelab-control-bundle-builder"},{"line":24,"text":"CONTROL_TIMER=/etc/systemd/system/homelab-control-backup.timer"},{"line":25,"text":"CONTROL_SERVICE=/etc/systemd/system/homelab-control-backup.service"},{"line":26,"text":"CONTROL_RUNTIME_MANIFEST=/etc/homelab-backup/control-runtime-paths.txt"},{"line":27,"text":"CONTROL_SYSTEMD_MANIFEST=/etc/homelab-backup/control-systemd-paths.txt"},{"line":28,"text":"VM_TIMER=/etc/systemd/system/homelab-vm-cloud-quorum-queue.timer"},{"line":29,"text":"APP_TIMER=/etc/systemd/system/homelab-app-cloud-quorum-queue.timer"},{"line":30,"text":"VM_SERVICE=/etc/systemd/system/homelab-vm-cloud-quorum-queue.service"},{"line":31,"text":"APP_SERVICE=/etc/systemd/system/homelab-app-cloud-quorum-queue.service"},{"line":47,"text":"CONTROL_BACKUP_SHA=0b3a0f685d4e67cb86250df89a4918aff2e6c67799b7d35b0e54b1bbc016ee57"},{"line":48,"text":"CONTROL_BUILDER_SHA=2e1c3935b5016c09aad21f34a36f7e1f53188bbc34a3f033e59fe964571ec3f0"},{"line":49,"text":"CONTROL_TIMER_SHA=7c4136da20b9cd9162293380f5794d93e2c6099ce7d87ec00e0e7e19b6cd44a3"},{"line":50,"text":"CONTROL_SERVICE_SHA=428d3e1f3042c3347b7c34b6f190e44fa35f7a97264eec3974239f581c9b9250"},{"line":51,"text":"CONTROL_RUNTIME_MANIFEST_SHA=6777f95159db0fa213017f286f2cee6cc51e9963a01a0578cee8586e8731b2be"},{"line":52,"text":"CONTROL_SYSTEMD_MANIFEST_SHA=7f990d6257b43f97c3c8407945ca9dae6113dc9064c6cf1f25e7fcdaf99d5163"},{"line":53,"text":"VM_TIMER_SHA=9a78c9ea507116cbb9f5645fe697e34964c905b017cc98b17977cd5006aa5050"},{"line":54,"text":"APP_TIMER_SHA=af2eedce3df53029b591d31715a3f3e6688ddb997b4823f487e70c339ce88078"},{"line":60,"text":"CONTROL_STATE_ROOT=/var/lib/homelab-backup/cloud-quorum/control-bootstrap-v2"},{"line":61,"text":"CONTROL_EVIDENCE_ROOT=/var/lib/homelab-backup/control-restore-validation/control-bootstrap"},{"line":69,"text":"CONTROL_SLA_SECONDS=86400"},{"line":140,"text":" printf 'CONTRACT|task=%s|target_registry=CANONICAL|vm_count=%s|app_count=%s|control_sla_seconds=%s|retention=ACTIVE_OWNER_AWARE|provider_worm=NOT_PROVEN_SKIPPED|dr_proof_source=EXACT_SITE_DR_FINAL_SEAL|legacy_site_dr_seal=AUTHORITATIVE|control_freshness=RECURRING_PRODUCER_12H_DUE_24H_SLA|full_site_dr=PROVEN_BY_SEAL\\n' \"$TASK_ID\" \"${#VMIDS[@]}\" \"${#APPS[@]}\" \"$CONTROL_SLA_SECONDS\""},{"line":170,"text":"stale=0"},{"line":192,"text":"source_hash_local CONTROL_BACKUP \"$CONTROL_BACKUP\" \"$CONTROL_BACKUP_SHA\""},{"line":193,"text":"source_hash_local CONTROL_BUILDER \"$CONTROL_BUILDER\" \"$CONTROL_BUILDER_SHA\""},{"line":194,"text":"source_hash_local CONTROL_TIMER \"$CONTROL_TIMER\" \"$CONTROL_TIMER_SHA\""},{"line":195,"text":"source_hash_local CONTROL_SERVICE \"$CONTROL_SERVICE\" \"$CONTROL_SERVICE_SHA\""},{"line":196,"text":"source_hash_local CONTROL_RUNTIME_MANIFEST \"$CONTROL_RUNTIME_MANIFEST\" \"$CONTROL_RUNTIME_MANIFEST_SHA\""},{"line":197,"text":"source_hash_local CONTROL_SYSTEMD_MANIFEST \"$CONTROL_SYSTEMD_MANIFEST\" \"$CONTROL_SYSTEMD_MANIFEST_SHA\""},{"line":198,"text":"source_hash_local VM_TIMER \"$VM_TIMER\" \"$VM_TIMER_SHA\""},{"line":199,"text":"source_hash_local APP_TIMER \"$APP_TIMER\" \"$APP_TIMER_SHA\""},{"line":233,"text":" if (( age < vm_sla )); then state=FRESH; fresh=$((fresh+1)); else state=STALE; stale=$((stale+1)); fi"},{"line":253,"text":" unverified=$((unverified+1)); printf 'TARGET|kind=VM|id=%s|owner=%s|state=UNVERIFIED|generation=UNKNOWN|age_seconds=-1|sla_seconds=%s|reason=PROBE_FAILED\\n' \"$vmid\" \"$node\" \"$vm_sla\""},{"line":273,"text":" if (( age < app_sla )); then state=FRESH; fresh=$((fresh+1)); else state=STALE; stale=$((stale+1)); fi"},{"line":293,"text":" unverified=$((unverified+1)); printf 'TARGET|kind=APP|id=%s|owner=pve01|state=UNVERIFIED|generation=UNKNOWN|age_seconds=-1|sla_seconds=%s|reason=PROBE_FAILED\\n' \"$app\" \"$app_sla\""},{"line":297,"text":"control_status=UNVERIFIED"},{"line":298,"text":"control_age=-1"},{"line":299,"text":"control_generation=UNKNOWN"},{"line":300,"text":"control_checked=false"},{"line":301,"text":"control_state=\"\""},{"line":302,"text":"control_degraded=0"},{"line":303,"text":"control_bad=0"},{"line":304,"text":"if control_state=\"$(find \"$CONTROL_STATE_ROOT\" -type f -name '*.json' -printf '%T@|%p\\n' 2>&1 | LC_ALL=C sort -n | tail -n 1 | cut -d'|' -f2-)\"; then :; else control_state=\"\"; fi"},{"line":305,"text":"if [[ -n \"$control_state\" && -s \"$control_state\" && ! -L \"$control_state\" ]]; then"},{"line":306,"text":" control_generation=\"$(jq -er '.generation' \"$control_state\" 2>&1)\" || control_generation=UNKNOWN"},{"line":307,"text":" transport_status=\"$(jq -er '.status' \"$control_state\" 2>&1)\" || transport_status=INVALID"},{"line":308,"text":" if [[ ! \"$control_generation\" =~ ^control-bootstrap-v2-pve01-[0-9]{8}T[0-9]{6}Z$ ]]; then transport_status=INVALID; fi"},{"line":311,"text":" control_status=RESUME"},{"line":312,"text":" control_degraded=1"},{"line":316,"text":" if strict=\"$(jq -er 'if .schema==\"homelab-cloud-quorum-payload-v1\" and .logical_id==\"control-bootstrap-v2\" and .status==\"SEALED\" and .cloud_quorum==2 and .cloud_a_verified==true and .cloud_b_verified==true and .part_hashes_verified==true and .seal_written==true and .cloud_a_seal_verified==true and .cloud_b_seal_verified==true and .local_payload_present==false and .local_cleanup==\"OK\" then \"OK\" else error(\"strict state invalid\") end' \"$control_state\" 2>&1)\"; then"},{"line":317,"text":" control_updated=\"$(jq -er '.sealed_at_utc // .updated_at_utc' \"$control_state\" 2>&1)\" || control_updated=INVALID"},{"line":318,"text":" control_sha=\"$(jq -er '.archive_sha256' \"$control_state\" 2>&1)\" || control_sha=INVALID"},{"line":319,"text":" control_epoch=\"$(date -u -d \"$control_updated\" +%s 2>&1)\" || control_epoch=-1"},{"line":320,"text":" control_evidence=\"$CONTROL_EVIDENCE_ROOT/$control_generation.json\""},{"line":321,"text":" if [[ \"$control_epoch\" =~ ^[0-9]+$ && \"$control_epoch\" -le \"$now\" && -s \"$control_evidence\" && ! -L \"$control_evidence\" ]]; then"},{"line":322,"text":" if evidence_ok=\"$(jq -er --arg g \"$control_generation\" --arg sha \"$control_sha\" 'if .result==\"OK\" and .logical_id==\"control-bootstrap-v2\" and .generation==$g and .restore_source==\"Cloud A + Cloud B\" and .payload_sha256==$sha and .payload_sha256_verified==true and .control_manifest_verified==true and .payload_checksums_verified==true and .ops_git_bundle_verified==true and .desired_git_bundle_verified==true and .secret_escrow_separate==true and .clean_machine_bootstrap_proven==false then \"OK\" else error(\"control evidence invalid\") end' \"$control_evidence\" 2>&1)\"; then"},{"line":323,"text":" control_checked=true"},{"line":324,"text":" control_age=$((now-control_epoch))"},{"line":325,"text":" if (( control_age < CONTROL_SLA_SECONDS )); then control_status=FRESH_SEALED_PROVEN; else control_status=STALE_PROVEN; control_bad=1; infra_bad=$((infra_bad+1)); fi"},{"line":326,"text":" control_payload=\"$(jq -er '.payload_path' \"$control_state\" 2>&1)\" || control_payload=INVALID"},{"line":327,"text":" if [[ \"$control_payload\" != /* ]] || [[ -e \"$control_payload\" ]]; then payload_leaks=$((payload_leaks+1)); fi"},{"line":329,"text":" control_bad=1; infra_bad=$((infra_bad+1))"},{"line":332,"text":" control_bad=1; infra_bad=$((infra_bad+1))"},{"line":335,"text":" control_bad=1; infra_bad=$((infra_bad+1))"},{"line":338,"text":" *) control_bad=1; infra_bad=$((infra_bad+1)) ;;"},{"line":341,"text":" control_bad=1; infra_bad=$((infra_bad+1))"},{"line":343,"text":"control_archive_size=-1"},{"line":344,"text":"if [[ -n \"$control_state\" && -s \"$control_state\" && \"$control_status\" != UNVERIFIED && \"$control_status\" != RESUME ]]; then control_archive_size=\"$(jq -er '.archive_size_bytes' \"$control_state\" 2>/dev/null)\" || control_archive_size=-1; if ! append_obs_target CONTROL control-bootstrap-v2 control-bootstrap-v2 \"$control_archive_size\"; then observability_input_bad=$((observability_input_bad+1)); fi; fi"},{"line":345,"text":"printf 'CONTROL|state=%s|CONTROL_FRESHNESS=%s|generation=%s|age_seconds=%s|sla_seconds=%s|archive_size_bytes=%s|restore_evidence_checked=%s|source_coverage=RESTORE_EVIDENCE|retention=ACTIVE_OWNER_AWARE\\n' \"$control_status\" \"$control_status\" \"$control_generation\" \"$control_age\" \"$CONTROL_SLA_SECONDS\" \"$control_archive_size\" \"$control_checked\""},{"line":410,"text":" service=\"${unit%.timer}.service\""},{"line":412,"text":" if [[ \"$load_state\" == loaded && \"$unit_file_state\" == enabled && \"$active_state\" == active && \"$result\" != failed && \"$service_result\" != failed ]]; then status=OK; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi"},{"line":422,"text":"for lock in /run/homelab-backup-heavy.lock /run/lock/homelab-vm-cloud-quorum-queue.lock /run/lock/homelab-app-cloud-quorum-queue.lock /run/lock/homelab-backup-dispatcher.lock; do"},{"line":466,"text":"if [[ -s \"$RETENTION_HEALTH\" && ! -L \"$RETENTION_HEALTH\" ]] && jq -e '.schema==\"homelab-backup-retention-v1\" and .status==\"OK\" and .policy.vm_keep==2 and .policy.app_keep==7 and .policy.control_keep==4 and .owner_aware_gc_proven==true and .destructive_canary_proven==true' \"$RETENTION_HEALTH\" >/dev/null; then"},{"line":473,"text":"printf 'RETENTION|status=%s|historical_gc_proven=%s|owner_aware_gc_proven=%s|vm_keep=2|app_keep=7|control_keep=4\\n' \"$retention_status\" \"$( [[ \"$historical_gc_proven\" == true ]] && printf YES || printf NO )\" \"$( [[ \"$owner_aware_gc_proven\" == true ]] && printf YES || printf NO )\""},{"line":510,"text":"if (( stale > 0 || unverified > 0 || payload_leaks > 0 || infra_bad > 0 )); then backup_status=RED"},{"line":527,"text":"(( stale > 0 )) && add_risk HIGH RPO_BREACH"},{"line":536,"text":"printf 'SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=%s|RISK_SEVERITY=%s|RISK_REASONS=%s|DR_PROOF_STATUS=%s|CONTROL_FRESHNESS=%s|LIFECYCLE_STATUS=%s|VM_COUNT=%s|APP_COUNT=%s|FRESH=%s|STALE=%s|RESUME=%s|UNVERIFIED=%s|CONTROL_STATE=%s|CLOUD_OK=%s|SCHEDULER_OK=%s|SOURCE_OK=%s|SOURCE_DRIFT=%s|STAGING_BAD=%s|STAGING_WARN=%s|PAYLOAD_LEAKS=%s|RETENTION_STATUS=%s|OBSERVABILITY=%s|SIZE_ANOMALIES=%s|CAPACITY=%s|GLOBAL_DR_PROVEN=%s\\n' \"$backup_status\" \"$risk_severity\" \"$risk_reasons\" \"$dr_proof_status\" \"$control_status\" \"$lifecycle_status\" \"$vm_seen\" \"$app_seen\" \"$fresh\" \"$stale\" \"$resume\" \"$unverified\" \"$control_status\" \"$cloud_ok\" \"$scheduler_ok\" \"$source_ok\" \"$source_drift\" \"$staging_bad\" \"$staging_warn\" \"$payload_leaks\" \"$retention_status\" \"$observability_status\" \"$size_anomaly_count\" \"$capacity_status\" \"$global_dr_proven\""},{"line":541,"text":" jq -n --arg task \"$TASK_ID\" --arg change \"$CHANGE_ID\" --arg at \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" --arg backup \"$backup_status\" --arg risk \"$risk_severity\" --arg reasons \"$risk_reasons\" --arg control \"$control_status\" --arg dr \"$dr_proof_status\" --arg lifecycle \"$lifecycle_status\" --arg escrow \"$escrow_status\" --arg staging \"$staging_status\" --arg retention \"$retention_status\" --arg observability \"$observability_status\" --arg capacity \"$capacity_status\" --argjson historical \"$historical_gc_proven\" --argjson owner_gc \"$owner_aware_gc_proven\" --argjson staging_bad \"$staging_bad\" --argjson staging_warn \"$staging_warn\" --argjson vm_count \"$vm_seen\" --argjson app_count \"$app_seen\" --argjson fresh \"$fresh\" --argjson stale \"$stale\" --argjson resume \"$resume\" --argjson unverified \"$unverified\" --argjson cloud_ok \"$cloud_ok\" --argjson scheduler_ok \"$scheduler_ok\" --argjson source_ok \"$source_ok\" --argjson source_drift \"$source_drift\" --argjson payload_leaks \"$payload_leaks\" --argjson size_anoma"}],"sha256":"1474c9ce58bbc1b3ae7437261d1bdb923232926fb2943c7c830253f8b284724c"},{"bytes":2161,"path":"/usr/local/sbin/homelab-vps-identity-audit","relevant_lines":[],"sha256":"b709691c52ae48432b70e197eb4810b6c374a05911cee3b9fdba4ecc67c76c3a"}] +ALERT_IMPLEMENTATION={"bytes":1806,"exists":true,"sha256":"6deef30b4708a7e5b2ac0f0d98bb6b37b22d858afde994483b67baa18dffdc2a","structure_lines":[{"line":4,"text":"APP=\"alertmanager\""},{"line":14,"text":"fail(){ echo \"[ERROR] alertmanager backup failed; kept: $STAGE\"; }"},{"line":16,"text":"ssh -n -o BatchMode=yes -o ConnectTimeout=8 \"$MON\" \"sudo -n docker exec alertmanager amtool check-config /etc/alertmanager/alertmanager.yml >/dev/null && sudo -n tar -C / -czf - opt/stacks/observability-lite/compose.yaml opt/stacks/observability-lite/compose.override.yaml opt/stacks/observability-lite/alertmanager/alertmanager.yml opt/stacks/observability-lite/alertmanager/data\" > \"$STAGE/remote.tgz\""},{"line":19,"text":"test -s \"$STAGE/payload/opt/stacks/observability-lite/alertmanager/alertmanager.yml\""},{"line":21,"text":"jq -n --arg app \"$APP\" --arg host \"monitoring\" --arg engine \"files+alertmanager-config-check\" --arg config \"ok\" --argjson files \"$FILES\" \"{app:\\$app,engine:\\$engine,source_host:\\$host,source_paths:[\\\"monitoring:/opt/stacks/observability-lite/alertmanager\\\",\\\"monitoring:/opt/stacks/observability-lite/compose.yaml\\\",\\\"monitoring:/opt/stacks/observability-lite/compose.override.yaml\\\"],config_check:\\$config,file_count:\\$files,note:\\\"Alertmanager configuration and runtime state in encrypted two-cloud backup\\\"}\" > \"$STAGE/metadata.json\""},{"line":25,"text":"echo ALERTMANAGER_BACKUP_RUN=OK"}]} +ALERT_SYSTEMD_REFERENCES=[] +MAIL_ROUTE_READINESS={"postfix_active":true,"pve_user_email_present":false,"relayhost_configured":false,"root_alias_present":false,"sendmail_present":true,"smtp_sasl_auth_enable":"no","smtp_sasl_password_maps_configured":false,"smtp_tls_security_level":""} +SOURCE_PUBLICATION_STATE={"cr_branch_sha":null,"fetch_url_present":true,"local_head":"50bf24f8ee27f3d2e0d1cbc6c17b62c69ff06bae","ls_remote_rc":0,"main_sha":"326622a4864fa9b5f43b69981733236bb42c4d7b","pushurl_is_disabled":true} +DR_RESTORE_SEALS=[{"mtime_epoch":1786237057,"name":"backup-app-cloud-quorum-cutover-v1.json","selected":{"change_id":"CR-2026-0020","status":"SEALED","task_id":"backup-app-cloud-quorum-cutover-v1"},"sha256":"c77f83927dcf020cac0182bf8f7145ac823b3bbb2b62dd1021dbc9a340b0c467"},{"mtime_epoch":1786241107,"name":"backup-app-cloud-quorum-freshness-v1.json","selected":{"change_id":"CR-2026-0022","status":"SEALED","task_id":"backup-app-cloud-quorum-freshness-v1"},"sha256":"0d5374f9cceb05113c24ce9ee16a3b12f1e7846261b4d5801b125489ac45c4d7"},{"mtime_epoch":1786453079,"name":"backup-cloud-legacy-retirement-v1.json","selected":{"change_id":"CR-2026-0035","status":"SEALED","task_id":"backup-cloud-legacy-retirement-v1"},"sha256":"fe78e534174b1e23ef0aef72599cf74e73332d7abe100dda02b9ebb2f2f7afdc"},{"mtime_epoch":1786396264,"name":"backup-control-bootstrap-cloud-quorum-v1.json","selected":{"change_id":"CR-2026-0029","logical_id":"control-bootstrap","status":"SEALED","task_id":"backup-control-bootstrap-cloud-quorum-v1"},"sha256":"332f9fd0822a1531753a16978d33e8543694f3c2c0e329ba6115bf05c00d02d8"},{"mtime_epoch":1786406463,"name":"backup-control-bootstrap-configs-source-v1.json","selected":{"change_id":"CR-2026-0030","logical_id":"control-bootstrap-v2","status":"SEALED","task_id":"backup-control-bootstrap-configs-source-v1"},"sha256":"8a39632eb3901677047a544243c52a32e304912c589376ff855ef4c623a46fa9"},{"mtime_epoch":1786601026,"name":"backup-control-coverage-hardening-v1.json","selected":{"change_id":"CR-2026-0054","status":"SEALED","task_id":"backup-control-coverage-hardening-v1"},"sha256":"d4f1240df892ddddfd880bc5d5fca5df1c5c0d5c93f21c56658a669ed7547b58"},{"mtime_epoch":1786441319,"name":"backup-control-final-generation-v1.json","selected":{"change_id":"CR-2026-0034","status":"SEALED","task_id":"backup-control-final-generation-v1"},"sha256":"c5a0d270c9582e84f61564905734d76796bb5aa2de93873d1a639f5dbe7695a2"},{"mtime_epoch":1787357380,"name":"backup-control-refresh-current-v3.json","selected":{"change_id":"CR-2026-0095","status":"SEALED","task_id":"backup-control-refresh-current-v3"},"sha256":"5c7cb7ce3af6fe4ce3c11d0f3c2a2ab80790d7997b4ceea64ae5d9cc5bc4ada4"},{"mtime_epoch":1786685619,"name":"backup-control-refresh-post-legacy-retirement-v1.json","selected":{"change_id":"CR-2026-0067","status":"SEALED","task_id":"backup-control-refresh-post-legacy-retirement-v1"},"sha256":"6986ef7c5a3f13a3d199397e3f01a45c4418d81ce7ccd1f929fc9cb5593fd9db"},{"mtime_epoch":1786604876,"name":"backup-control-refresh-v1.json","selected":{"change_id":"CR-2026-0057","status":"SEALED","task_id":"backup-control-refresh-v1"},"sha256":"52abe0785bbabf2ed7df5a4f46580487f65ab48b2a3462b32ae4e0943894fcc2"},{"mtime_epoch":1786719633,"name":"backup-delete-evidence-hardening-v1.json","selected":{"change_id":"CR-2026-0074","status":"SEALED","task_id":"backup-delete-evidence-hardening-v1"},"sha256":"02abe418e49139b034984128399374301505686e45d07db8ffb6a9b8e1c53fd0"},{"mtime_epoch":1789959071,"name":"backup-gfs-lifecycle-remediation-v1.json","selected":{"change_id":"CR-2026-1005","status":"SEALED","task_id":"backup-gfs-lifecycle-remediation-v1"},"sha256":"b7da77e3a40ce308f56bbc3915569e071079773db39df1e7adc84929baf69bc6"},{"mtime_epoch":1786717462,"name":"backup-gfs-retention-v1.json","selected":{"change_id":"CR-2026-0072","status":"SEALED","task_id":"backup-gfs-retention-v1"},"sha256":"e6857f4f736d2f9506c0184119e6152ceb8301fcfaa75eb983b9e9fd4b3fac87"},{"mtime_epoch":1786247840,"name":"backup-hbarhub-cloud-quorum-v1.json","selected":{"change_id":"CR-2026-0024","logical_id":"app-hbarhub","status":"SEALED","task_id":"backup-hbarhub-cloud-quorum-v1"},"sha256":"d7d6f959ff3575b27602ffe09a0d304f12d477b499637a2ea7358bfa85e7b20e"},{"mtime_epoch":1786373683,"name":"backup-lock-fd-hardening-v1.json","selected":{"change_id":"CR-2026-0027","status":"SEALED","task_id":"backup-lock-fd-hardening-v1"},"sha256":"3d1e9f182ce7263f2c4148618b132277c7125f4d0a348203cd1c08b711076501"},{"mtime_epoch":1786565758,"name":"backup-matrix-residue-retirement-v1.json","selected":{"change_id":"CR-2026-0050","status":"SEALED","task_id":"backup-matrix-residue-retirement-v1"},"sha256":"85036d473fa309331a9167d58ef1f2bd7e7466d52b9b130096dbdc45507512fc"},{"mtime_epoch":1786703572,"name":"backup-observability-risk-forecast-v1.json","selected":{"change_id":"CR-2026-0071","status":"SEALED","task_id":"backup-observability-risk-forecast-v1"},"sha256":"40a316a39025867cfb488543006badf0bdb315aec65c0c5f8ef20bc1b1665915"},{"mtime_epoch":1786643518,"name":"backup-retention-dynamic-pinned-prune-mailru-cleanup-v1.json","selected":{"change_id":"CR-2026-0065","status":"SEALED","task_id":"backup-retention-dynamic-pinned-prune-mailru-cleanup-v1"},"sha256":"f9165cf9faf0d2bd7803b7dc9763d24244e677d14d4a3d8fce558a4b8326088a"},{"mtime_epoch":1786639543,"name":"backup-retention-pinned-scheduled-scope-hotfix-v1.json","selected":{"change_id":"CR-2026-0064","status":"SEALED","task_id":"backup-retention-pinned-scheduled-scope-hotfix-v1"},"sha256":"8b2ddd3968a8c2bcb4fc91855f667a21c0aa2710944fe2553108350344a7dd56"},{"mtime_epoch":1786599343,"name":"backup-retention-plan-stability-hotfix-v1.json","selected":{"change_id":"CR-2026-0055","status":"SEALED","task_id":"backup-retention-plan-stability-hotfix-v1"},"sha256":"4d7ebbc69ee319f210785ef6113e033dca9e2ceed2e706afc8f0b3cf10873026"},{"mtime_epoch":1786607325,"name":"backup-retention-remote-list-failclosed-hotfix-v1.json","selected":{"change_id":"CR-2026-0060","status":"SEALED","task_id":"backup-retention-remote-list-failclosed-hotfix-v1"},"sha256":"b2831634be5ff1f829302b83025fc5ba7649dcbe72fd14cdfda1e5d7a0f52e07"},{"mtime_epoch":1786513619,"name":"backup-retention-remote-stdin-hotfix-v1.json","selected":{"change_id":"CR-2026-0035","status":"SEALED","task_id":"backup-retention-remote-stdin-hotfix-v1"},"sha256":"d42d89260f2304945df40c958fd5a52b758a674bcb10b9323552a0a7b35ce7ae"},{"mtime_epoch":1786431140,"name":"backup-retention-safe-gc-v1.json","selected":{"change_id":"CR-2026-0033","status":"SEALED","task_id":"backup-retention-safe-gc-v1"},"sha256":"2e1d4745b70ea6e3e96097ccc336fd7d555e70b8cc058b96491fd8c87d95579f"},{"mtime_epoch":1786600541,"name":"backup-retention-transaction-resume-hotfix-v1.json","selected":{"change_id":"CR-2026-0056","status":"SEALED","task_id":"backup-retention-transaction-resume-hotfix-v1"},"sha256":"d4e4dd8d58d0fc527cd7210c6252b6321e0568961c03a4ddd729fbdb20494928"},{"mtime_epoch":1786726495,"name":"backup-rotating-boot-drill-escrow-freshness-v1.json","selected":{"change_id":"CR-2026-0075","status":"SEALED","task_id":"backup-rotating-boot-drill-escrow-freshness-v1"},"sha256":"9a38eebec6e913d802dd08bb4dcb5612dfec734530bbf1afbe7e277507ccd163"},{"mtime_epoch":1786387065,"name":"backup-scheduler-fairness-granularity-v1.json","selected":{"change_id":"CR-2026-0028","status":"SEALED","task_id":"backup-scheduler-fairness-granularity-v1"},"sha256":"cf0fd28e413fc9eb6dbd76149378a169b987c7509246ae1758cc75041a8d393b"},{"mtime_epoch":1786359648,"name":"backup-scheduler-rpo-hardening-v1.json","selected":{"change_id":"CR-2026-0026","status":"SEALED","task_id":"backup-scheduler-rpo-hardening-v1"},"sha256":"b56847a3c68d16559aabcd23ff46dfefd820fc970432afd2232415bc0202af3e"},{"mtime_epoch":1786297580,"name":"backup-scrutiny-cloud-quorum-v1.json","selected":{"change_id":"CR-2026-0025","logical_id":"app-scrutiny","status":"SEALED","task_id":"backup-scrutiny-cloud-quorum-v1"},"sha256":"eb50068d771572139320b41b4a9a4fef9fa28fd977686d66f84e15a987dd43a3"},{"mtime_epoch":1786698442,"name":"backup-target-lifecycle-registry-v1.json","selected":{"change_id":"CR-2026-0070","status":"SEALED","task_id":"backup-target-lifecycle-registry-v1"},"sha256":"b843b84c66c739ec42e8454b8a996eb827364fb6c938a8ce86e4e5ac7c16c0b8"},{"mtime_epoch":1786428928,"name":"backup-unified-monitoring-v1.json","selected":{"change_id":"CR-2026-0032","status":"SEALED","task_id":"backup-unified-monitoring-v1"},"sha256":"26cbd0d9f84cf4bd8aec1c8ad479e612afde3949954003dd0d9f4a1bbc278867"},{"mtime_epoch":1786200294,"name":"backup-vm-cloud-quorum-cutover-v1.json","selected":{"change_id":"CR-2026-0019","status":"SEALED","task_id":"backup-vm-cloud-quorum-cutover-v1"},"sha256":"33b0dadaf58949fe1356904c7171f4be992dc3866e3ba4688e0ada41e6266aac"},{"mtime_epoch":1786239546,"name":"backup-vm-cloud-quorum-freshness-v1.json","selected":{"change_id":"CR-2026-0021","status":"SEALED","task_id":"backup-vm-cloud-quorum-freshness-v1"},"sha256":"89a3a916b5a099ba71fb6f171c16bb52adeec45295315a9b605b1703b2ed3f65"},{"mtime_epoch":1786422218,"name":"backup-vm-restore-evidence-hardening-v1.json","selected":{"change_id":"CR-2026-0031","status":"SEALED","task_id":"backup-vm-restore-evidence-hardening-v1"},"sha256":"5f1274624374adbbb495b1701fe1eedaab028fad0f97a2409f0b79df9a791f9a"},{"mtime_epoch":1786459865,"name":"cluster-postdr-storage-retirement-v1.json","selected":{"change_id":"CR-2026-0038","status":"SEALED","task_id":"cluster-postdr-storage-retirement-v1"},"sha256":"d25c1760d3ea45ac695ee1fc5d2636bbb1c012da96c3ba4e89767915efe0e7d2"},{"mtime_epoch":1784329495,"name":"homelab-backup-tail-closure-v1.json","selected":{"change_id":"CR-2026-0004","status":"SEALED","task_id":"homelab-backup-tail-closure-v1"},"sha256":"9a52b2bb0186f9807a0b25274f819c33b097dbbfaa32f03f1c31360354c096c1"},{"mtime_epoch":1786684253,"name":"legacy-backup-target-retirement-v1.json","selected":{"change_id":"CR-2026-0066","status":"SEALED","task_id":"legacy-backup-target-retirement-v1"},"sha256":"830eb32a0c3366d51c9d798736ccbd3048a0524b38cd228a58085499b610048f"},{"mtime_epoch":1786555697,"name":"reports-monitor-canonical-backup-supervision-v1.json","selected":{"change_id":"CR-2026-0046","status":"SEALED","task_id":"reports-monitor-canonical-backup-supervision-v1"},"sha256":"2c4fdb17fbd7caec98e111fae74e1d8bad3942cc2c7bc33a0b1c8b769b542076"},{"mtime_epoch":1786450297,"name":"site-dr-final-acceptance-v1.json","selected":{"change_id":"DR-2026-FINAL","status":"SEALED","task_id":"site-dr-final-resume-boot-v1"},"sha256":"b9f8172bac0206380198ac68079625b06f06eac7d484e66226082ebc1abae14d"},{"mtime_epoch":1786470088,"name":"vm160-post-cleanup-canonical-backup-v1.json","selected":{"change_id":"CR-2026-0043","status":"SEALED","target":"vm160","task_id":"vm160-post-cleanup-canonical-backup-v1"},"sha256":"83b76b909bad03476133425e38ab0be75a300a821300389660aa2f620c543d0c"}] +CLOSURE_GATES={"active_targets_with_state_missing":8,"alert_script_present":true,"cloud_a_readable":true,"cloud_b_readable":true,"gfs_ok":true,"retention_timer_safely_held":true,"sendmail_present":true,"source_offhost_branch_exact":false,"v2_timer_enabled_active":true} +NO_MUTATION=true +NO_REPO_WRITE=true +NO_GIT_FETCH=true +NO_GIT_COMMIT=true +NO_GIT_PUSH_UPDATE=true +NO_SYSTEMD_ACTION=true +NO_BACKUP_STARTED=true +NO_RESTORE_STARTED=true +NO_RETENTION_GC_STARTED=true +NO_CLOUD_DELETE=true +NO_MAIL_SENT=true +AUDIT_DURATION_SEC=1.505 +TASK_RESULT=PASS_HOMELAB_BACKUP_CLOSURE_AUDIT_READONLY +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} +WORKERS2_BACKUP_CLOSURE_AUDIT_END=1 + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index 6758d851..624e5484 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,25 +1,25 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "SIGNALBOT-260921-RECONCILIATION-BOUNDED-REPAIR-052REPAIR7", + "command_id": "SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1", "status": "OK", "rc": 0, "host": "pve01", - "mode": "change", - "component": "signalbot-reconciliation-bounded-repair", - "started_at_utc": "2026-09-21T02:51:27Z", - "finished_at_utc": "2026-09-21T02:51:32Z", + "mode": "read-only", + "component": "homelab-backup-closure-audit", + "started_at_utc": "2026-09-21T02:54:35Z", + "finished_at_utc": "2026-09-21T02:54:37Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "6e0210f6e920560a7f5388a8c2b727b145671136198a36dd3294f514729c1a9e", + "command_sha256": "d3877f0193bbe5b5c8345ebec48097517ce415848ee63ff839517234bc496da1", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, - "change_declared": true, + "change_declared": false, "result_contract_valid": true, - "result_contract_status": "OK", + "result_contract_status": null, "result_contract_error": null, "command_rc": 0, "changes_made": false, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "1e2edb9e58c7cfe362b8d51a5c246b28c6abfd53cf7689006c2351e607ac0a74", - "sanitized_output_sha256": "1e2edb9e58c7cfe362b8d51a5c246b28c6abfd53cf7689006c2351e607ac0a74", + "raw_evidence_sha256": "12f9c3c08bd66206cce08cf9b97ad5ece4d918a0ee1661e4a7fb3735e42d6a36", + "sanitized_output_sha256": "12f9c3c08bd66206cce08cf9b97ad5ece4d918a0ee1661e4a7fb3735e42d6a36", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "SIGNALBOT052REPAIR7_EVIDENCE={\"code\":10,\"phase\":\"simulation\",\"pre_unresolved\":[251009,303837,318578,350488,377008,397710,433876,437370,438938,455774],\"now_unresolved\":[251009,303837,318578,350488,377008,397710,433876,437370,438938,455774],\"core_rc\":4}\nSIGNALBOT052REPAIR7_EXITCODE=10\nTASK_RESULT=HOLD_SIMULATION_NOT_ALL_RECONCILED\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SIGNALBOT-260921-RECONCILIATION-BOUNDED-REPAIR-052REPAIR7\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n" + "output": "WORKERS2_BACKUP_CLOSURE_AUDIT_BEGIN=1\nCOMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1\nMODE=read-only\nCOMPONENT=homelab-backup-closure-audit\nHOST=pve01\nUID=0\nMUTATION_BOUNDARY=READ_ONLY_NO_REPO_WRITE_NO_GIT_FETCH_NO_GIT_COMMIT_NO_PUSH_NO_SYSTEMD_ACTION_NO_BACKUP_NO_RESTORE_NO_RETENTION_GC_NO_CLOUD_DELETE_NO_MAIL\nSOURCE_HEAD=50bf24f8ee27f3d2e0d1cbc6c17b62c69ff06bae\nSOURCE_HEAD_EXPECTED=true\nSOURCE_WORKTREE_CLEAN=true\nSOURCE_STATUS_LINES=[]\nGFS_POST_STATE={\"helper\":{\"exists\":true,\"sha256\":\"a1aed0c6039f8095bd5da7f62b47f4ee6932df98c4e0e7420d3006df86bd5c94\"},\"policy\":{\"exists\":true,\"sha256\":\"2c7674045dd5c68cc48d348d616494dbbe145df460a8e85d97a2c5c153ec792d\"},\"seal\":{\"exists\":true,\"sha256\":\"b7da77e3a40ce308f56bbc3915569e071079773db39df1e7adc84929baf69bc6\"},\"seal_selected\":{\"critical_vm_count\":8,\"helper_sha256\":\"a1aed0c6039f8095bd5da7f62b47f4ee6932df98c4e0e7420d3006df86bd5c94\",\"policy_sha256\":\"2c7674045dd5c68cc48d348d616494dbbe145df460a8e85d97a2c5c153ec792d\",\"retention_reenable_requires_safe_plan\":true,\"retention_timer_held_disabled\":true,\"status\":\"SEALED\",\"vm200_retired_preserve\":true}}\nGFS_VALIDATE={\"rc\":0,\"stderr\":[],\"stdout\":[\"GFS_POLICY=OK\"]}\nGFS_CRITICAL_LOGICALS=[\"vm110\",\"vm111\",\"vm112\",\"vm113\",\"vm130\",\"vm150\",\"vm160\",\"vm170\"]\nUNIT_STATE={\"homelab-backup-retention-gc.service\":{\"ActiveState\":{\"rc\":0,\"value\":\"inactive\"},\"ExecMainStatus\":{\"rc\":0,\"value\":\"66\"},\"LastTriggerUSec\":{\"rc\":0,\"value\":\"\"},\"LoadState\":{\"rc\":0,\"value\":\"loaded\"},\"NextElapseUSecRealtime\":{\"rc\":0,\"value\":\"\"},\"Result\":{\"rc\":0,\"value\":\"success\"},\"SubState\":{\"rc\":0,\"value\":\"dead\"},\"UnitFileState\":{\"rc\":0,\"value\":\"static\"}},\"homelab-backup-retention-gc.timer\":{\"ActiveState\":{\"rc\":0,\"value\":\"inactive\"},\"ExecMainStatus\":{\"rc\":0,\"value\":\"\"},\"LastTriggerUSec\":{\"rc\":0,\"value\":\"\"},\"LoadState\":{\"rc\":0,\"value\":\"loaded\"},\"NextElapseUSecRealtime\":{\"rc\":0,\"value\":\"\"},\"Result\":{\"rc\":0,\"value\":\"success\"},\"SubState\":{\"rc\":0,\"value\":\"dead\"},\"UnitFileState\":{\"rc\":0,\"value\":\"disabled\"}},\"homelab-backup-v2.service\":{\"ActiveState\":{\"rc\":0,\"value\":\"inactive\"},\"ExecMainStatus\":{\"rc\":0,\"value\":\"0\"},\"LastTriggerUSec\":{\"rc\":0,\"value\":\"\"},\"LoadState\":{\"rc\":0,\"value\":\"loaded\"},\"NextElapseUSecRealtime\":{\"rc\":0,\"value\":\"\"},\"Result\":{\"rc\":0,\"value\":\"success\"},\"SubState\":{\"rc\":0,\"value\":\"dead\"},\"UnitFileState\":{\"rc\":0,\"value\":\"static\"}},\"homelab-backup-v2.timer\":{\"ActiveState\":{\"rc\":0,\"value\":\"active\"},\"ExecMainStatus\":{\"rc\":0,\"value\":\"\"},\"LastTriggerUSec\":{\"rc\":0,\"value\":\"Mon 2026-09-21 05:35:16 MSK\"},\"LoadState\":{\"rc\":0,\"value\":\"loaded\"},\"NextElapseUSecRealtime\":{\"rc\":0,\"value\":\"\"},\"Result\":{\"rc\":0,\"value\":\"success\"},\"SubState\":{\"rc\":0,\"value\":\"waiting\"},\"UnitFileState\":{\"rc\":0,\"value\":\"enabled\"}}}\nREGISTRY_LOGICALS=[{\"id\":\"filebrowser\",\"kind\":\"APP\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"app-filebrowser\"},{\"id\":\"hbarhub\",\"kind\":\"APP\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"app-hbarhub\"},{\"id\":\"immich\",\"kind\":\"APP\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"app-immich\"},{\"id\":\"memos\",\"kind\":\"APP\",\"lifecycle\":\"RETIRED_PRESERVE\",\"logical_id\":\"app-memos\"},{\"id\":\"scrutiny\",\"kind\":\"APP\",\"lifecycle\":\"RETIRED_PRESERVE\",\"logical_id\":\"app-scrutiny\"},{\"id\":\"skladchik-moderator-assistant\",\"kind\":\"APP\",\"lifecycle\":\"RETIRED_PRESERVE\",\"logical_id\":\"app-skladchik-moderator-assistant\"},{\"id\":\"skladchik-reports-monitor\",\"kind\":\"APP\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"app-skladchik-reports-monitor\"},{\"id\":\"control-bootstrap-v2\",\"kind\":\"CONTROL\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"control-bootstrap-v2\"},{\"id\":\"110\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm110\"},{\"id\":\"111\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm111\"},{\"id\":\"112\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm112\"},{\"id\":\"113\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm113\"},{\"id\":\"130\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm130\"},{\"id\":\"150\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm150\"},{\"id\":\"160\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm160\"},{\"id\":\"170\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm170\"},{\"id\":\"171\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm171\"},{\"id\":\"180\",\"kind\":\"VM\",\"lifecycle\":\"RETIRED_PRESERVE\",\"logical_id\":\"vm180\"},{\"id\":\"190\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm190\"},{\"id\":\"200\",\"kind\":\"VM\",\"lifecycle\":\"RETIRED_PRESERVE\",\"logical_id\":\"vm200\"},{\"id\":\"9130\",\"kind\":\"VM\",\"lifecycle\":\"ACTIVE\",\"logical_id\":\"vm9130\"}]\nREGISTRY_ACTIVE_LOGICALS=[\"app-filebrowser\",\"app-hbarhub\",\"app-immich\",\"app-skladchik-reports-monitor\",\"control-bootstrap-v2\",\"vm110\",\"vm111\",\"vm112\",\"vm113\",\"vm130\",\"vm150\",\"vm160\",\"vm170\",\"vm171\",\"vm190\",\"vm9130\"]\nREGISTRY_ACTIVE_COUNT=16\nV2_STATE_COUNT=29\nV2_STATES=[{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"control-bootstrap-v2.json\",\"generation\":\"control-bootstrap-v2-pve01-20260916T120057Z\",\"green_verified\":null,\"json_valid\":true,\"last_attempt_epoch\":1789930298,\"last_success_epoch\":1789930298,\"logical_id\":\"control-bootstrap-v2\",\"quorum\":null,\"replica_count\":null,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":28977},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"ct110.json\",\"generation\":\"v2-ct110-20260920T181158Z-25703b1ef77f\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789928120,\"last_success_epoch\":1789928120,\"logical_id\":\"ct110\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":31155},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"ct111.json\",\"generation\":\"v2-ct111-20260920T200749Z-a2bac7e3ecb7\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789935021,\"last_success_epoch\":1789935021,\"logical_id\":\"ct111\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":24254},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"ct112.json\",\"generation\":\"v2-ct112-20260920T214958Z-30e3291e1543\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789941076,\"last_success_epoch\":1789941076,\"logical_id\":\"ct112\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":18199},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"ct113.json\",\"generation\":\"v2-ct113-20260920T222532Z-4f4a608def82\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789943241,\"last_success_epoch\":1789943241,\"logical_id\":\"ct113\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":16034},{\"consecutive_failures\":5,\"failure_backoff_seconds\":21600,\"file\":\"guest-pve01-lxc-112.json\",\"generation\":null,\"green_verified\":null,\"json_valid\":true,\"last_attempt_epoch\":1789938729,\"last_success_epoch\":1789799511,\"logical_id\":\"guest-pve01-lxc-112\",\"quorum\":null,\"replica_count\":null,\"result\":\"FAIL\",\"retry_count\":null,\"status\":null,\"success_age_sec\":159764},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"md-relay.json\",\"generation\":\"v2-md-relay-20260920T140452Z-1943a8c57bd6\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789913115,\"last_success_epoch\":1789913115,\"logical_id\":\"md-relay\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":46160},{\"consecutive_failures\":null,\"failure_backoff_seconds\":null,\"file\":\"node-pve01.json\",\"generation\":\"v2-node-pve01-20260915T040859Z-9187f2b9a0b4\",\"green_verified\":true,\"json_valid\":true,\"last_attempt_epoch\":null,\"last_success_epoch\":1789445359,\"logical_id\":\"node-pve01\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":513916},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"node-pve02.json\",\"generation\":\"v2-node-pve02-20260918T011512Z-59f345bf9a9b\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789694135,\"last_success_epoch\":1789694135,\"logical_id\":\"node-pve02\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":265140},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"node-pve03.json\",\"generation\":\"v2-node-pve03-20260918T015457Z-204ac5a3eb03\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789696518,\"last_success_epoch\":1789696518,\"logical_id\":\"node-pve03\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":262757},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"router-netcraze.json\",\"generation\":\"v2-router-netcraze-20260920T155444Z-a91b2efdb4fe\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789919711,\"last_success_epoch\":1789919711,\"logical_id\":\"router-netcraze\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":39564},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"spb-ingress.json\",\"generation\":\"v2-spb-ingress-20260920T151616Z-9d80091d0c4c\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789917397,\"last_success_epoch\":1789917397,\"logical_id\":\"spb-ingress\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":41878},{\"consecutive_failures\":10,\"failure_backoff_seconds\":21600,\"file\":\"us-netbird.json\",\"generation\":\"v2-us-netbird-20260921T015632Z-dc499030a55f\",\"green_verified\":null,\"json_valid\":true,\"last_attempt_epoch\":1789955807,\"last_success_epoch\":1789704670,\"logical_id\":\"us-netbird\",\"quorum\":null,\"replica_count\":null,\"result\":\"FAIL\",\"retry_count\":null,\"status\":null,\"success_age_sec\":254605},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm130.json\",\"generation\":\"v2-vm130-20260920T233759Z-c9518c8be2c3\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789948633,\"last_success_epoch\":1789948633,\"logical_id\":\"vm130\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":10642},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm150.json\",\"generation\":\"v2-vm150-20260920T230035Z-e0880e47ea55\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789945347,\"last_success_epoch\":1789945347,\"logical_id\":\"vm150\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":13928},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm160.json\",\"generation\":\"v2-vm160-20260921T001432Z-31df1acfee7a\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789950100,\"last_success_epoch\":1789950100,\"logical_id\":\"vm160\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":9175},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm170.json\",\"generation\":\"v2-vm170-20260921T023516Z-53ad6a6b10f9\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789958880,\"last_success_epoch\":1789958880,\"logical_id\":\"vm170\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":395},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm171.json\",\"generation\":\"v2-vm171-20260921T004759Z-537db1552014\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789951877,\"last_success_epoch\":1789951877,\"logical_id\":\"vm171\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":7398},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm190.json\",\"generation\":\"v2-vm190-20260921T012544Z-298b64987988\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789954139,\"last_success_epoch\":1789954139,\"logical_id\":\"vm190\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":5136},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm210.json\",\"generation\":\"v2-vm210-20260920T203832Z-458da35ec027\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789936798,\"last_success_epoch\":1789936798,\"logical_id\":\"vm210\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":22477},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm211.json\",\"generation\":\"v2-vm211-20260919T203132Z-82878bb22008\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789849984,\"last_success_epoch\":1789849984,\"logical_id\":\"vm211\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":109291},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm9130.json\",\"generation\":\"v2-vm9130-20260919T210758Z-0aa987efac8c\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789853557,\"last_success_epoch\":1789853557,\"logical_id\":\"vm9130\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":105718},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-codevipe.json\",\"generation\":\"v2-xf-codevipe-20260920T162616Z-da4e8fcf3129\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789922324,\"last_success_epoch\":1789922324,\"logical_id\":\"xf-codevipe\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":36951},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-dsmods.json\",\"generation\":\"v2-xf-dsmods-20260919T214716Z-c783be0bd209\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789860411,\"last_success_epoch\":1789860411,\"logical_id\":\"xf-dsmods\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":98864},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-gamevipe.json\",\"generation\":\"v2-xf-gamevipe-20260920T015714Z-762dbd7ce0d7\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789882268,\"last_success_epoch\":1789882268,\"logical_id\":\"xf-gamevipe\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":77007},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-hkmods.json\",\"generation\":\"v2-xf-hkmods-20260920T071214Z-6407219f0624\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789906789,\"last_success_epoch\":1789906789,\"logical_id\":\"xf-hkmods\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":52486},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-kingofwolk.json\",\"generation\":\"v2-xf-kingofwolk-20260919T232652Z-cb0189b2b0ba\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789861037,\"last_success_epoch\":1789861037,\"logical_id\":\"xf-kingofwolk\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":98238},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-newfi.json\",\"generation\":\"v2-xf-newfi-20260920T004616Z-6be6559a5589\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789865619,\"last_success_epoch\":1789865619,\"logical_id\":\"xf-newfi\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":93656},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"xf-zakrutim.json\",\"generation\":\"v2-xf-zakrutim-20260920T173658Z-a8de3568c79b\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789926652,\"last_success_epoch\":1789926652,\"logical_id\":\"xf-zakrutim\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":32623}]\nACTIVE_WITHOUT_V2_STATE=[\"app-filebrowser\",\"app-hbarhub\",\"app-immich\",\"app-skladchik-reports-monitor\",\"vm110\",\"vm111\",\"vm112\",\"vm113\"]\nACTIVE_STATE_SUMMARY=[{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"control-bootstrap-v2.json\",\"generation\":\"control-bootstrap-v2-pve01-20260916T120057Z\",\"green_verified\":null,\"json_valid\":true,\"last_attempt_epoch\":1789930298,\"last_success_epoch\":1789930298,\"logical_id\":\"control-bootstrap-v2\",\"quorum\":null,\"replica_count\":null,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":28977},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm130.json\",\"generation\":\"v2-vm130-20260920T233759Z-c9518c8be2c3\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789948633,\"last_success_epoch\":1789948633,\"logical_id\":\"vm130\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":10642},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm150.json\",\"generation\":\"v2-vm150-20260920T230035Z-e0880e47ea55\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789945347,\"last_success_epoch\":1789945347,\"logical_id\":\"vm150\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":13928},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm160.json\",\"generation\":\"v2-vm160-20260921T001432Z-31df1acfee7a\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789950100,\"last_success_epoch\":1789950100,\"logical_id\":\"vm160\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":9175},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm170.json\",\"generation\":\"v2-vm170-20260921T023516Z-53ad6a6b10f9\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789958880,\"last_success_epoch\":1789958880,\"logical_id\":\"vm170\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":395},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm171.json\",\"generation\":\"v2-vm171-20260921T004759Z-537db1552014\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789951877,\"last_success_epoch\":1789951877,\"logical_id\":\"vm171\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":7398},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm190.json\",\"generation\":\"v2-vm190-20260921T012544Z-298b64987988\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789954139,\"last_success_epoch\":1789954139,\"logical_id\":\"vm190\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":5136},{\"consecutive_failures\":0,\"failure_backoff_seconds\":0,\"file\":\"vm9130.json\",\"generation\":\"v2-vm9130-20260919T210758Z-0aa987efac8c\",\"green_verified\":false,\"json_valid\":true,\"last_attempt_epoch\":1789853557,\"last_success_epoch\":1789853557,\"logical_id\":\"vm9130\",\"quorum\":null,\"replica_count\":2,\"result\":\"SUCCESS\",\"retry_count\":null,\"status\":null,\"success_age_sec\":105718}]\nV2_WRAPPER_META={\"exists\":true,\"is_symlink\":false,\"sha256\":\"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2\"}\nV2_SOURCE_HINTS=[{\"file\":\"/usr/local/sbin/.homelab-command-adapter.new.1544389\",\"line\":1089,\"text\":\" \\\"capsule retry client IP mismatch\\\"\"},{\"file\":\"/usr/local/sbin/.homelab-command-adapter.new.1544389\",\"line\":1118,\"text\":\" \\\"idempotent_retry\\\": True,\"},{\"file\":\"/usr/local/sbin/__pycache__/homelab-backup-matrix-refreshcpython-313.pyc\",\"line\":171,\"text\":\"age_seconds\\ufffd\\u0017generated_health_output)\\u0003rk\\u0000\\u0000\\u0000\\ufffd\\tfreshnessr}\\u0000\\u0000\\u0000r&\\u0000\\u0000\\u0000\\ufffd\\u0006shadowz\\u0007STATUS=z\\u0003TS=z\\u0007JOB_ID=z\\tJOB_NAME=z\"},{\"file\":\"/usr/local/sbin/__pycache__/homelab-backup-matrix-refreshcpython-313.pyc\",\"line\":176,\"text\":\"FRESHNESS=z\\u0004.txtr1\\u0000\\u0000\\u0000\\ufffd\\u0015compatibility_outputs\\ufffd\"},{\"file\":\"/usr/local/sbin/__pycache__/homelab-reference-refreshcpython-313.pyc\",\"line\":107,\"text\":\"Nr\\u0003\\u0000\\u0000\\u0000\\ufffd\\u0011freshness_secondsi\\u0010\\u000e\\u0000\\u0000)\\u0001\\ufffd\\u0007seconds)\\u0003\\ufffd\\u0006source\\ufffd\"},{\"file\":\"/usr/local/sbin/__pycache__/homelab-safe-runcpython-313.pyc\",\"line\":23,\"text\":\"kb/lessons/known_failures.jsonz!kb/current/02_FRESHNESS_POLICY.md\\ufffd\\u001fkb/policies/command_policy.jsonz\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":5,\"text\":\"PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":14,\"text\":\"FRESHNESS_SECONDS=\\\"$(\\\"$REGISTRY_HELPER\\\" freshness-seconds APP)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":16,\"text\":\"(( DUE_SECONDS > 0 && DUE_SECONDS < FRESHNESS_SECONDS )) || { printf 'APP_QUORUM_QUEUE_ERROR=DUE_THRESHOLD_INVALID\\\\n' >&2; exit 65; }\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":31,\"text\":\"freshness_decision(){\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":39,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_RESUME GENERATION=%s\\\\n' \\\"$app\\\" \\\"$generation\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":45,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_EPOCH_INVALID\\\\n' \\\"$app\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":50,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=SKIP_FRESH GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$app\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":51,\"text\":\" elif (( age >= DUE_SECONDS && age < FRESHNESS_SECONDS )); then\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":52,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_DUE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$app\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":53,\"text\":\" elif (( age >= FRESHNESS_SECONDS )); then\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":54,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_STALE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$app\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":56,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_TIMESTAMP_IN_FUTURE GENERATION=%s AGE_SECONDS=%s\\\\n' \\\"$app\\\" \\\"$generation\\\" \\\"$age\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":60,\"text\":\" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED\\\\n' \\\"$app\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":63,\"text\":\" die \\\"FRESHNESS_DECISION_INVALID_${app}_${decision:-EMPTY}\\\" 65\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":67,\"text\":\"freshness_plan(){\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":69,\"text\":\" [[ -x \\\"$PROBE\\\" && ! -L \\\"$PROBE\\\" ]] || die FRESHNESS_PROBE_NOT_INSTALLED 69\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":72,\"text\":\" out=\\\"$(freshness_decision \\\"$a\\\" \\\"$now_epoch\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":74,\"text\":\" decision=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\\\"\\\",$i);print $i}}' <<<\\\"$out\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":75,\"text\":\" [[ -n \\\"$decision\\\" ]] || die \\\"FRESHNESS_PLAN_DECISION_MISSING_$a\\\" 65\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":76,\"text\":\" printf 'QUEUE_FRESHNESS_PLAN APP=%s DECISION=%s\\\\n' \\\"$a\\\" \\\"$decision\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":90,\"text\":\" freshness_plan\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":93,\"text\":\" local a=\\\"$1\\\" freshness decision now_epoch out generation\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":107,\"text\":\" freshness=\\\"$(exec 8>&-; exec 9>&-; freshness_decision \\\"$a\\\" \\\"$now_epoch\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":108,\"text\":\" printf '%s\\\\n' \\\"$freshness\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":109,\"text\":\" decision=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\\\"\\\",$i);print $i}}' <<<\\\"$freshness\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":112,\"text\":\" generation=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^GENERATION=/){sub(/^GENERATION=/,\\\"\\\",$i);print $i}}' <<<\\\"$freshness\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":117,\"text\":\" *) die \\\"FRESHNESS_RECHECK_INVALID_${a}_${decision:-EMPTY}\\\" 65 ;;\"},{\"file\":\"/usr/local/sbin/homelab-app-cloud-quorum-queue\",\"line\":150,\"text\":\" freshness-plan) [[ \\\"$#\\\" == 1 ]] || die USAGE_FRESHNESS_PLAN 64; freshness_plan ;;\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":12,\"text\":\"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":14,\"text\":\"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":105,\"text\":\" value=\\\"$(awk -F= '$1==\\\"FRESHNESS_SECONDS\\\"{print $2; exit}' \\\"$file\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":140,\"text\":\" printf 'CONTRACT|task=%s|target_registry=CANONICAL|vm_count=%s|app_count=%s|control_sla_seconds=%s|retention=ACTIVE_OWNER_AWARE|provider_worm=NOT_PROVEN_SKIPPED|dr_proof_source=EXACT_SITE_DR_FINAL_SEAL|legacy_site_dr_seal=AUTHORITATIVE|control_freshness=RECURRING_PRODUCER_12H_DUE_24H_SLA|full_site_dr=PROVEN_BY_SEAL\\\\n' \\\"$TASK_ID\\\" \\\"${#VMIDS[@]}\\\" \\\"${#APPS[@]}\\\" \\\"$CONTROL_SLA_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":153,\"text\":\" all|write-health|scheduled) ;;\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":154,\"text\":\" *) die \\\"USAGE_all_write-health_scheduled_contract\\\" 64 ;;\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":166,\"text\":\"vm_sla=\\\"$(\\\"$REGISTRY_HELPER\\\" freshness-seconds VM)\\\" || die VM_SLA_UNREADABLE\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":167,\"text\":\"app_sla=\\\"$(\\\"$REGISTRY_HELPER\\\" freshness-seconds APP)\\\" || die APP_SLA_UNREADABLE\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":220,\"text\":\" freshness_status=\\\"$(field FRESHNESS_STATUS <<<\\\"$out\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":223,\"text\":\" if [[ \\\"$freshness_status\\\" != OK ]]; then\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":260,\"text\":\" freshness_status=\\\"$(field FRESHNESS_STATUS <<<\\\"$out\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":263,\"text\":\" if [[ \\\"$freshness_status\\\" != OK ]]; then\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":345,\"text\":\"printf 'CONTROL|state=%s|CONTROL_FRESHNESS=%s|generation=%s|age_seconds=%s|sla_seconds=%s|archive_size_bytes=%s|restore_evidence_checked=%s|source_coverage=RESTORE_EVIDENCE|retention=ACTIVE_OWNER_AWARE\\\\n' \\\"$control_status\\\" \\\"$control_status\\\" \\\"$control_generation\\\" \\\"$control_age\\\" \\\"$CONTROL_SLA_SECONDS\\\" \\\"$control_archive_size\\\" \\\"$control_checked\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":391,\"text\":\"if [[ \\\"$mode\\\" == write-health || \\\"$mode\\\" == scheduled ]]; then\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":402,\"text\":\"scheduler_ok=0\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":412,\"text\":\" if [[ \\\"$load_state\\\" == loaded && \\\"$unit_file_state\\\" == enabled && \\\"$active_state\\\" == active && \\\"$result\\\" != failed && \\\"$service_result\\\" != failed ]]; then status=OK; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":415,\"text\":\" if [[ \\\"$load_state\\\" == not-found && \\\"$active_state\\\" == inactive ]]; then status=EXPECTED_ABSENT; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":527,\"text\":\"(( stale > 0 )) && add_risk HIGH RPO_BREACH\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":536,\"text\":\"printf 'SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=%s|RISK_SEVERITY=%s|RISK_REASONS=%s|DR_PROOF_STATUS=%s|CONTROL_FRESHNESS=%s|LIFECYCLE_STATUS=%s|VM_COUNT=%s|APP_COUNT=%s|FRESH=%s|STALE=%s|RESUME=%s|UNVERIFIED=%s|CONTROL_STATE=%s|CLOUD_OK=%s|SCHEDULER_OK=%s|SOURCE_OK=%s|SOURCE_DRIFT=%s|STAGING_BAD=%s|STAGING_WARN=%s|PAYLOAD_LEAKS=%s|RETENTION_STATUS=%s|OBSERVABILITY=%s|SIZE_ANOMALIES=%s|CAPACITY=%s|GLOBAL_DR_PROVEN=%s\\\\n' \\\"$backup_status\\\" \\\"$risk_severity\\\" \\\"$risk_reasons\\\" \\\"$dr_proof_status\\\" \\\"$control_status\\\" \\\"$lifecycle_status\\\" \\\"$vm_seen\\\" \\\"$app_seen\\\" \\\"$fresh\\\" \\\"$stale\\\" \\\"$resume\\\" \\\"$unverified\\\" \\\"$control_status\\\" \\\"$cloud_ok\\\" \\\"$scheduler_ok\\\" \\\"$source_ok\\\" \\\"$source_drift\\\" \\\"$staging_bad\\\" \\\"$staging_warn\\\" \\\"$payload_leaks\\\" \\\"$retention_status\\\" \\\"$observability_status\\\" \\\"$size_anomaly_count\\\" \\\"$capacity_status\\\" \\\"$global_dr_proven\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":538,\"text\":\"if [[ \\\"$mode\\\" == write-health || \\\"$mode\\\" == scheduled ]]; then\"},{\"file\":\"/usr/local/sbin/homelab-backup-audit\",\"line\":541,\"text\":\" jq -n --arg task \\\"$TASK_ID\\\" --arg change \\\"$CHANGE_ID\\\" --arg at \\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\" --arg backup \\\"$backup_status\\\" --arg risk \\\"$risk_severity\\\" --arg reasons \\\"$risk_reasons\\\" --arg control \\\"$control_status\\\" --arg dr \\\"$dr_proof_status\\\" --arg lifecycle \\\"$lifecycle_status\\\" --arg escrow \\\"$escrow_status\\\" --arg staging \\\"$staging_status\\\" --arg retention \\\"$retention_status\\\" --arg observability \\\"$observability_status\\\" --arg capacity \\\"$capacity_status\\\" --argjson historical \\\"$historical_gc_proven\\\" --argjson owner_gc \\\"$owner_aware_gc_proven\\\" --argjson staging_bad \\\"$staging_bad\\\" --argjson staging_warn \\\"$staging_warn\\\" --argjson vm_count \\\"$vm_seen\\\" --argjson app_count \\\"$app_seen\\\" --argjson fresh \\\"$fresh\\\" --argjson stale \\\"$stale\\\" --argjson resume \\\"$resume\\\" --argjson unverified \\\"$unverified\\\" --argjson cloud_ok \\\"$cloud_ok\\\" --argjson scheduler_ok \\\"$scheduler_ok\\\" --argjson source_ok \\\"$source_ok\\\" --argjson source_drift \\\"$source_drift\\\" --argjson payload_leaks \\\"$payload_leaks\\\" --argjson size_anoma\"},{\"file\":\"/usr/local/sbin/homelab-backup-dispatcher\",\"line\":15,\"text\":\" if [[ \\\"$kind\\\" == VM ]]; then [[ \\\"$line\\\" == QUEUE_FRESHNESS\\\\ VMID=* ]] || continue; else [[ \\\"$line\\\" == QUEUE_FRESHNESS\\\\ APP=* ]] || continue; fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":3,\"text\":\"OUT=\\\"${HL_OUTPUT_DIR:-/var/log/homelab-backup-freshness}\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":38,\"text\":\" echo \\\"# HELP homelab_backup_freshness_artifact_candidates_total Backup artifact candidates found by safe local collector.\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":39,\"text\":\" echo \\\"# TYPE homelab_backup_freshness_artifact_candidates_total gauge\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":40,\"text\":\" echo \\\"homelab_backup_freshness_artifact_candidates_total $TOTAL\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":41,\"text\":\" echo \\\"# HELP homelab_backup_freshness_newest_artifact_age_seconds Age of newest backup-like artifact candidate in seconds, -1 if none.\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":42,\"text\":\" echo \\\"# TYPE homelab_backup_freshness_newest_artifact_age_seconds gauge\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":43,\"text\":\" echo \\\"homelab_backup_freshness_newest_artifact_age_seconds $AGE\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":44,\"text\":\" echo \\\"# HELP homelab_backup_freshness_run_success Last backup freshness collector run status.\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":45,\"text\":\" echo \\\"# TYPE homelab_backup_freshness_run_success gauge\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":46,\"text\":\" echo \\\"homelab_backup_freshness_run_success 1\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":47,\"text\":\"} > \\\"$TEXTFILE/homelab_backup_freshness.prom\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-freshness.sh\",\"line\":48,\"text\":\"chmod 0644 \\\"$TEXTFILE/homelab_backup_freshness.prom\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-matrix-refresh\",\"line\":112,\"text\":\" freshness=\\\"UNKNOWN\\\" if age<0 else (\\\"FRESH\\\" if age<=max_age else \\\"STALE\\\")\"},{\"file\":\"/usr/local/sbin/homelab-backup-matrix-refresh\",\"line\":114,\"text\":\" result={\\\"id\\\":jid,\\\"name\\\":name,\\\"category\\\":job.get(\\\"category\\\",\\\"unknown\\\"),\\\"critical\\\":critical,\\\"timer\\\":timer,\\\"service\\\":service,\\\"timer_enabled\\\":enabled,\\\"timer_active\\\":active,\\\"status\\\":final,\\\"source_kind\\\":source_kind,\\\"evidence_level\\\":evidence_level,\\\"service_result\\\":service_result,\\\"service_exec_main_status\\\":service_exec_main_status,\\\"source_health\\\":source,\\\"source_status\\\":source_status,\\\"source_mtime\\\":source_mtime,\\\"age_seconds\\\":age,\\\"max_age_seconds\\\":max_age,\\\"freshness\\\":freshness,\\\"generated_health_output\\\":job.get(\\\"generated_health_output\\\",\\\"\\\")}\"},{\"file\":\"/usr/local/sbin/homelab-backup-matrix-refresh\",\"line\":116,\"text\":\" mode_value=matrix.get(\\\"mode\\\",\\\"shadow\\\"); lines=[f\\\"STATUS={final}\\\",f\\\"TS={now_iso}\\\",\\\"TYPE=backup-matrix-generated\\\",f\\\"JOB_ID={jid}\\\",f\\\"JOB_NAME={name}\\\",f\\\"MATRIX_MODE={mode_value}\\\",f\\\"TIMER={timer}\\\",f\\\"SERVICE={service}\\\",f\\\"TIMER_ENABLED={enabled}\\\",f\\\"TIMER_ACTIVE={active}\\\",f\\\"SOURCE_KIND={source_kind}\\\",f\\\"EVIDENCE_LEVEL={evidence_level}\\\",f\\\"SERVICE_RESULT={service_result}\\\",f\\\"SERVICE_EXEC_MAIN_STATUS={service_exec_main_status}\\\",f\\\"SOURCE_HEALTH={source}\\\",f\\\"SOURCE_STATUS={source_status}\\\",f\\\"SOURCE_MTIME_UTC={source_mtime}\\\",f\\\"AGE_SECONDS={age}\\\",f\\\"MAX_AGE_SECONDS={max_age}\\\",f\\\"FRESHNESS={freshness}\\\"]\"},{\"file\":\"/usr/local/sbin/homelab-backup-npmplus-kuma-configs\",\"line\":70,\"text\":\" SELECT id || char(124) || name || char(124) || type || char(124) || url || char(124) || keyword || char(124) || interval || char(124) || maxretries || char(124) || retry_interval || char(124) || active\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":19,\"text\":\"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":20,\"text\":\"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":433,\"text\":\"scheduled(){\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":434,\"text\":\" exec 5>\\\"$LOCK\\\"; flock -n 5 || { printf 'GC_SCHEDULED=SKIP|reason=GC_LOCK_BUSY\\\\n'; return 0; }\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":443,\"text\":\" if (( count == 0 && open_tx == 0 )); then write_health \\\"$p1\\\" true 0; cat \\\"$p1\\\"; printf 'GC_SCHEDULED=OK|deleted=0|transactions_resumed=0\\\\n'; return 0; fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":444,\"text\":\" if ! acquire_gc_locks; then write_health \\\"$p1\\\" true 0; printf 'GC_SCHEDULED=SKIP|reason=BACKUP_LOCK_BUSY|candidates=%s|open_transactions=%s\\\\n' \\\"$count\\\" \\\"$open_tx\\\"; return 0; fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":449,\"text\":\" if (( count == 0 )); then write_health \\\"$p2\\\" true 0; cat \\\"$p2\\\"; printf 'GC_SCHEDULED=OK|deleted=0|transactions_resumed=%s\\\\n' \\\"$open_tx\\\"; return 0; fi\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":450,\"text\":\" cmp -s <(grep '^DELETE|' \\\"$p1\\\" | stable_delete_set) <(grep '^DELETE|' \\\"$p2\\\" | stable_delete_set) || { write_health \\\"$p2\\\" true 0; printf 'GC_SCHEDULED=SKIP|reason=PLAN_CHANGED_AFTER_LOCK\\\\n'; return 0; }\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":454,\"text\":\" printf 'GC_SCHEDULED=OK|deleted=%s|transactions_resumed=%s\\\\n' \\\"$deleted\\\" \\\"$open_tx\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":462,\"text\":\" scheduled) scheduled ;;\"},{\"file\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"line\":463,\"text\":\" *) die USAGE_contract_plan_canary_activate_scheduled 64 ;;\"},{\"file\":\"/usr/local/sbin/homelab-backup-sla-health\",\"line\":20,\"text\":\"echo \\\"## App backup freshness\\\" >> \\\"$REPORT\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-sla-health\",\"line\":50,\"text\":\"echo \\\"## Emergency backup freshness\\\" >> \\\"$REPORT\\\"\"},{\"file\":\"/usr/local/sbin/homelab-backup-v2\",\"line\":5,\"text\":\"EXPECTED={'fresh_lxc_helper.py': 'dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011', 'producer_exec_helper.py': 'b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3', 'lxc_adapter.py': '3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d', 'qemu_adapter.py': '1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b', 'scheduler_adapter.py': 'a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96', 'entry504.py': 'ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793'}\"},{\"file\":\"/usr/local/sbin/homelab-command-adapter\",\"line\":1089,\"text\":\" \\\"capsule retry client IP mismatch\\\"\"},{\"file\":\"/usr/local/sbin/homelab-command-adapter\",\"line\":1118,\"text\":\" \\\"idempotent_retry\\\": True,\"},{\"file\":\"/usr/local/sbin/homelab-control-backup\",\"line\":105,\"text\":\" tmp=\\\"${HEALTH}.new.$$\\\"; jq -n --arg gen \\\"$gen\\\" --arg state \\\"$state\\\" --arg evidence \\\"$EVIDENCE_ROOT/$gen.json\\\" --arg sha \\\"$archive_sha\\\" --arg now \\\"$now\\\" '{schema:\\\"homelab-control-backup-health-v1\\\",status:\\\"OK\\\",generation:$gen,state_file:$state,restore_evidence:$evidence,archive_sha256:$sha,cloud_quorum:2,control_freshness:\\\"FRESH\\\",full_site_dr_proven:false,updated_at_utc:$now}' >\\\"$tmp\\\"; chmod 0644 \\\"$tmp\\\"; mv -f \\\"$tmp\\\" \\\"$HEALTH\\\"\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":13,\"text\":\"LOCK=/run/homelab-edge-vm-offhost-freshness.lock\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":23,\"text\":\" printf 'STATUS=ERROR TS=%s TYPE=edge-vm-offhost-freshness BAD=1 REASON=%s\\\\n' \\\"$TS\\\" \\\"$reason\\\" >\\\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\\\"\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":24,\"text\":\" chmod 0644 \\\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\\\"\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":25,\"text\":\" printf 'STATUS=ERROR TS=%s TYPE=edge-vm-offhost-freshness BAD=1 REASON=%s\\\\n' \\\"$TS\\\" \\\"$reason\\\"\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":153,\"text\":\"printf 'STATUS=OK TS=%s TYPE=edge-vm-offhost-freshness BAD=0 VMID=%s SOURCE_NODE=%s DEST_NODE=%s SRC=%s DEST=%s SIZE=%s SHA256=%s COPY_STATUS=%s ZSTD_RC=0 VMA_RC=0 KEEP=%s\\\\n' \\\\\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":155,\"text\":\" >\\\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\\\"\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":156,\"text\":\"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-backup NODE=%s VMID=%s ARCHIVE=%s SIZE=%s SHA256=%s NOTES=nightly_existing_dump_freshness\\\\n' \\\\\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":159,\"text\":\"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-offhost NODE=%s VMID=%s HOST=%s DEST=%s SIZE=%s SHA256=%s NOTES=nightly_existing_dump_freshness\\\\n' \\\\\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":162,\"text\":\"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-restore-verify HOST=%s VMID=%s ARCHIVE=%s SIZE=%s SHA256=%s ZSTD_RC=0 VMA_RC=0 NOTES=nightly_existing_dump_freshness\\\\n' \\\\\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":166,\"text\":\" \\\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\\\" \\\\\"},{\"file\":\"/usr/local/sbin/homelab-edge-vm-offhost-freshness\",\"line\":171,\"text\":\"printf 'STATUS=OK TS=%s TYPE=edge-vm-offhost-freshness BAD=0 COPY_STATUS=%s SIZE=%s SHA256=%s DEST=%s COMPLETE_COUNT=%s KEEP=%s\\\\n' \\\\\"},{\"file\":\"/usr/local/sbin/homelab-final-readiness-gate\",\"line\":18,\"text\":\"check \\\"backup framework evidence\\\" bash -c \\\"grep -q STATUS=OK /var/lib/homelab-health/backup-framework.txt && grep -q SOURCE_STATUS=OK /var/lib/homelab-health/backup-framework.txt && grep -q FRESHNESS=FRESH /var/lib/homelab-health/backup-framework.txt\\\"\"},{\"file\":\"/usr/local/sbin/homelab-mail-cloud-edge-vm-upload\",\"line\":7,\"text\":\"SOURCE_HEALTH=/var/lib/homelab-health/edge-vm-offhost-freshness.txt\"},{\"file\":\"/usr/local/sbin/homelab-mailru-trash-gc\",\"line\":183,\"text\":\" \\\"trash_debt_bytes\\\":\\\"UNKNOWN_PROVIDER_API\\\",\\\"last_success\\\":s}\"},{\"file\":\"/usr/local/sbin/homelab-reference-refresh\",\"line\":34,\"text\":\" f=int(json.loads((R/\\\"manifest.json\\\").read_text()).get(\\\"freshness_seconds\\\",{}).get(s,3600));z=(t+datetime.timedelta(seconds=f)).isoformat()\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":219,\"text\":\" \\\"task_id\\\":\\\"backup-rotating-boot-drill-escrow-freshness-v1\\\",\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":444,\"text\":\" return {\\\"schema\\\":\\\"homelab-rotating-boot-drill-state-v1\\\",\\\"sequence\\\":0,\\\"qemu_cursor\\\":None,\\\"lxc_cursor\\\":None,\\\"last_success_utc\\\":None,\\\"last_evidence\\\":None}\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":651,\"text\":\" print(f\\\"BOOT_DRILL_SCHEDULED=DEFERRED|reason={code}\\\")\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":688,\"text\":\" wait=int(p[\\\"initial_lock_wait_seconds\\\"] if mode==\\\"initial\\\" else p[\\\"scheduled_lock_wait_seconds\\\"])\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":734,\"text\":\" \\\"qemu_cursor\\\":q,\\\"lxc_cursor\\\":l,\\\"last_success_utc\\\":evidence[\\\"completed_at_utc\\\"],\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":749,\"text\":\" if mode==\\\"scheduled\\\" and e.code in (\\\"BACKUP_LOCK_BUSY\\\",\\\"ESCROW_SEMANTIC_PROOF_STALE\\\",\\\"CURRENT_BACKUP_AUDIT_NOT_DR_READY\\\",\\\"NO_QEMU_GUEST_AGENT_ELIGIBLE\\\",\\\"NO_LXC_RUNNING_ELIGIBLE\\\",\\\"STAGE_CAPACITY_INSUFFICIENT\\\",\\\"LOCAL_LVM_CAPACITY_INSUFFICIENT\\\"):\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":793,\"text\":\" elif action==\\\"scheduled\\\":\"},{\"file\":\"/usr/local/sbin/homelab-rotating-boot-drill\",\"line\":794,\"text\":\" execute(\\\"scheduled\\\",p)\"},{\"file\":\"/usr/local/sbin/homelab-safe-run\",\"line\":11,\"text\":\" \\\"kb/lessons/known_failures.json\\\",\\\"kb/current/02_FRESHNESS_POLICY.md\\\",\"},{\"file\":\"/usr/local/sbin/homelab-vm-backup-health\",\"line\":20,\"text\":\"if systemctl is-active --quiet homelab-edge-vm-offhost-freshness.timer; then DETAILS=\\\"$DETAILS edge-freshness-timer=active\\\"; else BAD=$((BAD+1)); DETAILS=\\\"$DETAILS edge-freshness-timer=bad\\\"; fi\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":6,\"text\":\"PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":9,\"text\":\"FRESHNESS_SECONDS=72000\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":16,\"text\":\"(( DUE_SECONDS > 0 && DUE_SECONDS < FRESHNESS_SECONDS )) || die DUE_THRESHOLD_INVALID 65\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":80,\"text\":\"freshness_decision(){\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":88,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_RESUME GENERATION=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":94,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_EPOCH_INVALID\\\\n' \\\"$vmid\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":99,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=SKIP_FRESH GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":100,\"text\":\" elif (( age >= DUE_SECONDS && age < FRESHNESS_SECONDS )); then\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":101,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_DUE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":102,\"text\":\" elif (( age >= FRESHNESS_SECONDS )); then\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":103,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_STALE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\" \\\"$age\\\" \\\"$DUE_SECONDS\\\" \\\"$FRESHNESS_SECONDS\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":105,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_TIMESTAMP_IN_FUTURE GENERATION=%s AGE_SECONDS=%s\\\\n' \\\"$vmid\\\" \\\"$generation\\\" \\\"$age\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":109,\"text\":\" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED\\\\n' \\\"$vmid\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":112,\"text\":\" die \\\"FRESHNESS_DECISION_INVALID_${vmid}_${decision:-EMPTY}\\\" 65\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":116,\"text\":\"freshness_plan(){\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":118,\"text\":\" [[ -x \\\"$PROBE\\\" ]] || die \\\"FRESHNESS_PROBE_NOT_INSTALLED\\\" 69\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":121,\"text\":\" out=\\\"$(freshness_decision \\\"$vmid\\\" \\\"$now_epoch\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":123,\"text\":\" decision=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\\\"\\\",$i);print $i}}' <<<\\\"$out\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":124,\"text\":\" [[ -n \\\"$decision\\\" ]] || die \\\"FRESHNESS_PLAN_DECISION_MISSING_$vmid\\\" 65\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":125,\"text\":\" printf 'QUEUE_FRESHNESS_PLAN VMID=%s DECISION=%s\\\\n' \\\"$vmid\\\" \\\"$decision\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":144,\"text\":\" freshness_plan\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":147,\"text\":\" local vmid=\\\"$1\\\" freshness decision now_epoch out generation\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":161,\"text\":\" freshness=\\\"$(exec 8>&-; exec 9>&-; freshness_decision \\\"$vmid\\\" \\\"$now_epoch\\\")\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":162,\"text\":\" printf '%s\\\\n' \\\"$freshness\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":163,\"text\":\" decision=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\\\"\\\",$i);print $i}}' <<<\\\"$freshness\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":166,\"text\":\" generation=\\\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^GENERATION=/){sub(/^GENERATION=/,\\\"\\\",$i);print $i}}' <<<\\\"$freshness\\\" | tail -1)\\\"\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":171,\"text\":\" *) die \\\"FRESHNESS_RECHECK_INVALID_${vmid}_${decision:-EMPTY}\\\" 65 ;;\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":188,\"text\":\" freshness-plan)\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":189,\"text\":\" [[ \\\"$#\\\" == 1 ]] || die \\\"USAGE_FRESHNESS_PLAN\\\" 64\"},{\"file\":\"/usr/local/sbin/homelab-vm-cloud-quorum-queue\",\"line\":190,\"text\":\" freshness_plan\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-status\",\"line\":44,\"text\":\"CANONICAL_PROBE=\\\"/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\\\"\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-status\",\"line\":52,\"text\":\" grep -q '^FRESHNESS_STATUS=OK$' <<<\\\"$CANONICAL_OUTPUT\\\" || PROBLEMS=$((PROBLEMS+1))\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":24,\"text\":\"APP_FRESHNESS_PROBE = Path(\\\"/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\\\")\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":132,\"text\":\"# HOMELAB_COOKIE_JAR_RETRY_423\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":225,\"text\":\" shlex.quote(str(APP_FRESHNESS_PROBE)) + \\\" decision skladchik-reports-monitor\\\",\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":230,\"text\":\" facts[\\\"canonical_backup_status\\\"] = probe.get(\\\"FRESHNESS_STATUS\\\", \\\"MISSING\\\")\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":239,\"text\":\" if probe.get(\\\"FRESHNESS_STATUS\\\") != \\\"OK\\\":\"},{\"file\":\"/usr/local/sbin/skladchik-reports-monitor-supervisor\",\"line\":286,\"text\":\" f\\\"- freshness status: {facts.get('canonical_backup_status')}\\\",\"}]\nCLOUD_STATE={\"A\":{\"about\":{\"free\":293208518329,\"total\":1099511627776,\"used\":806303109447},\"about_rc\":0,\"lsf_rc\":0,\"stderr_lines\":[],\"top_dirs_count\":26},\"B\":{\"about\":{\"free\":293208454470,\"total\":1099511627776,\"used\":806303173306},\"about_rc\":0,\"lsf_rc\":0,\"stderr_lines\":[],\"top_dirs_count\":26}}\nCLOUD_B_RESTORE_CANDIDATES=[]\nCLOUD_B_RESTORE_PREFERRED=null\nRETENTION_IMPLEMENTATION=[{\"bytes\":327,\"interface_lines\":[{\"line\":2,\"text\":\"Description=Homelab owner-aware cloud retention GC\"},{\"line\":5,\"text\":\"ConditionPathExists=/usr/local/sbin/homelab-backup-retention-gc\"},{\"line\":9,\"text\":\"ExecStart=/usr/local/sbin/homelab-backup-retention-gc scheduled\"},{\"line\":11,\"text\":\"IOSchedulingClass=best-effort\"}],\"path\":\"/etc/systemd/system/homelab-backup-retention-gc.service\",\"sha256\":\"0c49e10bdb225eeca0af5fca80aaf109addec2b18a6b892c0fe17c28b656ad7c\"},{\"bytes\":237,\"interface_lines\":[{\"line\":2,\"text\":\"Description=Run homelab owner-aware cloud retention GC daily\"},{\"line\":9,\"text\":\"Unit=homelab-backup-retention-gc.service\"}],\"path\":\"/etc/systemd/system/homelab-backup-retention-gc.timer\",\"sha256\":\"a0e763670745a5ef7c04b54da23114a013f47075cf36cceef0218bae9b82ea2f\"},{\"bytes\":7123,\"interface_lines\":[{\"line\":23,\"text\":\"KEEP=\\\"${10:?keep}\\\"\"},{\"line\":132,\"text\":\" [[ \\\"$(complete_count)\\\" == \\\"$KEEP\\\" ]]\"},{\"line\":138,\"text\":\" plan)\"},{\"line\":146,\"text\":\" printf 'REMOTE_PLAN_STATUS=OK\\\\n'\"},{\"line\":154,\"text\":\" [[ \\\"$(complete_count)\\\" == \\\"$KEEP\\\" ]]\"},{\"line\":167,\"text\":\" [[ \\\"$(complete_count)\\\" == \\\"$KEEP\\\" ]]\"},{\"line\":184,\"text\":\" [[ \\\"$(complete_count)\\\" == \\\"$KEEP\\\" ]]\"},{\"line\":206,\"text\":\" [[ \\\"$(complete_count)\\\" == \\\"$KEEP\\\" ]]\"}],\"path\":\"/usr/local/libexec/homelab-edge-vm-offhost-retention-worker\",\"sha256\":\"ca25a48b00c26e0eb5e64ac7d5e1d8f3805c200e30d9f87c5ef7c8da90402e54\"},{\"bytes\":4296,\"interface_lines\":[{\"line\":3,\"text\":\"KEEP=\\\"${1:-7}\\\"\"},{\"line\":4,\"text\":\"MODE=\\\"${2:-dry-run}\\\"\"},{\"line\":6,\"text\":\"[[ \\\"$KEEP\\\" =~ ^[0-9]+$ ]] || { echo \\\"BAD KEEP\\\"; exit 2; }\"},{\"line\":7,\"text\":\"(( KEEP >= 2 )) || { echo \\\"REFUSE keep<2\\\"; exit 2; }\"},{\"line\":8,\"text\":\"[[ \\\"$MODE\\\" == dry-run || \\\"$MODE\\\" == apply ]] || { echo \\\"BAD MODE\\\"; exit 2; }\"},{\"line\":31,\"text\":\"WORK=\\\"$(mktemp -d /tmp/app-retention-dual.XXXXXX)\\\"\"},{\"line\":71,\"text\":\" echo \\\"remote_index=$INDEX app=$APP canonical=$CANONICAL total=$TOTAL legacy=$LEGACY_TOTAL short=$SHORT_TOTAL keep=$KEEP mode=$MODE latest=${LATEST:-none}\\\"\"},{\"line\":76,\"text\":\" [[ \\\"$FOUND_LATEST\\\" -eq 1 ]] || { echo \\\"REFUSE latest not in retention set remote_index=$INDEX\\\"; exit 6; }\"},{\"line\":78,\"text\":\" if (( TOTAL <= KEEP )); then echo \\\"nothing to delete\\\"; continue; fi\"},{\"line\":79,\"text\":\" DELETE_COUNT=$((TOTAL-KEEP))\"},{\"line\":80,\"text\":\" for ((I=0; I= 2 )) || { echo \\\"REFUSE keep<2\\\"; exit 2; }\"},{\"line\":7,\"text\":\"[[ \\\"$MODE\\\" == \\\"dry-run\\\" || \\\"$MODE\\\" == \\\"apply\\\" ]] || { echo \\\"BAD MODE\\\"; exit 2; }\"},{\"line\":21,\"text\":\" echo \\\"total=$TOTAL keep=$KEEP mode=$MODE latest=${LATEST:-none}\\\"\"},{\"line\":22,\"text\":\" if (( TOTAL <= KEEP )); then echo \\\"nothing to delete\\\"; continue; fi\"},{\"line\":23,\"text\":\" DELETE_COUNT=$((TOTAL-KEEP))\"},{\"line\":24,\"text\":\" for ((i=0; i&2; exit 69; }\"},{\"line\":28,\"text\":\"[[ \\\"$(sha256sum \\\"$REGISTRY_HELPER\\\"|awk '{print $1}')\\\" == \\\"$REGISTRY_HELPER_SHA_EXPECTED\\\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=TARGET_REGISTRY_HELPER_SHA_DRIFT\\\\n' >&2; exit 65; }\"},{\"line\":29,\"text\":\"\\\"$REGISTRY_HELPER\\\" validate >/dev/null || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=TARGET_REGISTRY_INVALID\\\\n' >&2; exit 66; }\"},{\"line\":30,\"text\":\"[[ -x \\\"$GFS_HELPER\\\" && ! -L \\\"$GFS_HELPER\\\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_HELPER_MISSING\\\\n' >&2; exit 69; }\"},{\"line\":31,\"text\":\"[[ \\\"$(sha256sum \\\"$GFS_HELPER\\\"|awk '{print $1}')\\\" == \\\"$GFS_HELPER_SHA_EXPECTED\\\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_HELPER_SHA_DRIFT\\\\n' >&2; exit 65; }\"},{\"line\":32,\"text\":\"HOMELAB_BACKUP_GFS_POLICY=\\\"$GFS_POLICY\\\" \\\"$GFS_HELPER\\\" validate >/dev/null || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_INVALID\\\\n' >&2; exit 66; }\"},{\"line\":35,\"text\":\"GFS_CRITICAL_COUNT=\\\"$(HOMELAB_BACKUP_GFS_POLICY=\\\"$GFS_POLICY\\\" \\\"$GFS_HELPER\\\" critical-logicals | wc -l)\\\"\"},{\"line\":36,\"text\":\"VM_KEEP=\\\"$(\\\"$REGISTRY_HELPER\\\" policy-keep VM)\\\"\"},{\"line\":37,\"text\":\"APP_KEEP=\\\"$(\\\"$REGISTRY_HELPER\\\" policy-keep APP)\\\"\"},{\"line\":38,\"text\":\"CONTROL_KEEP=\\\"$(\\\"$REGISTRY_HELPER\\\" policy-keep CONTROL)\\\"\"},{\"line\":39,\"text\":\"MIN_DELETE_AGE_SECONDS=86400\"},{\"line\":42,\"text\":\"die(){ local msg=\\\"$1\\\" rc=\\\"${2:-65}\\\"; trap - ERR; printf 'GC_STATUS=ERROR|ROOT_CAUSE=%s\\\\n' \\\"$msg\\\" >&2; exit \\\"$rc\\\"; }\"},{\"line\":44,\"text\":\"stable_delete_set(){ sed -E 's/\\\\|age_seconds=[0-9]+$//'; }\"},{\"line\":50,\"text\":\"keep_for(){ \\\"$REGISTRY_HELPER\\\" retention-keep \\\"$1\\\" 2>/dev/null; }\"},{\"line\":51,\"text\":\"logical_list(){ \\\"$REGISTRY_HELPER\\\" retention-logicals; }\"},{\"line\":58,\"text\":\" TMPROOT=\\\"/run/homelab-retention-gc.$$\\\"\"},{\"line\":74,\"text\":\" jq -e --arg l \\\"$logical\\\" --arg g \\\"$generation\\\" '.schema==\\\"homelab-cloud-quorum-payload-v1\\\" and .logical_id==$l and .generation==$g and .status==\\\"SEALED\\\" and .cloud_quorum==2 and .cloud_a_verified==true and .cloud_b_verified==true and .part_hashes_verified==true and .seal_written==true and .cloud_a_seal_verified==true and .cloud_b_seal_verified==true and .local_delete_allowed==true and .local_payload_present==false and .local_cleanup==\\\"OK\\\"' <<<\\\"$json\\\" >/dev/null\"},{\"line\":106,\"text\":\" f=\\\"$RETENTION_ROOT/transactions/$logical/$generation.json\\\"\"},{\"line\":111,\"text\":\" f=\\\"$RETENTION_ROOT/transactions/$logical/$generation.json\\\"\"},{\"line\":117,\"text\":\" [[ -d \\\"$RETENTION_ROOT/transactions\\\" ]] || { printf '0\\\\n'; return 0; }\"},{\"line\":123,\"text\":\" PLANNED|B_DELETED) count=$((count+1)) ;;\"},{\"line\":126,\"text\":\" done < <(find \\\"$RETENTION_ROOT/transactions\\\" -type f -name '*.json' -print | LC_ALL=C sort)\"},{\"line\":130,\"text\":\"pinned_delete_contract_enabled(){\"},{\"line\":131,\"text\":\" [[ -n \\\"${HOMELAB_RETENTION_PINNED_DELETE_FILE:-}\\\" || -n \\\"${HOMELAB_RETENTION_PINNED_DELETE_SHA256:-}\\\" ]]\"},{\"line\":133,\"text\":\"pinned_delete_assert_file(){\"},{\"line\":134,\"text\":\" local f=\\\"${HOMELAB_RETENTION_PINNED_DELETE_FILE:-}\\\" expected=\\\"${HOMELAB_RETENTION_PINNED_DELETE_SHA256:-}\\\" actual line logical generation owner state_file state_sha count=0\"},{\"line\":135,\"text\":\" [[ -n \\\"$f\\\" && -n \\\"$expected\\\" ]] || die PINNED_DELETE_CONTRACT_INCOMPLETE 64\"},{\"line\":136,\"text\":\" [[ \\\"$expected\\\" =~ ^[0-9a-f]{64}$ ]] || die PINNED_DELETE_SHA_INVALID 64\"},{\"line\":137,\"text\":\" [[ -f \\\"$f\\\" && ! -L \\\"$f\\\" ]] || die PINNED_DELETE_FILE_UNSAFE 64\"},{\"line\":139,\"text\":\" [[ \\\"$actual\\\" == \\\"$expected\\\" ]] || die PINNED_DELETE_FILE_SHA_MISMATCH 66\"},{\"line\":141,\"text\":\" [[ -n \\\"$line\\\" ]] || die PINNED_DELETE_EMPTY_LINE 66\"},{\"line\":147,\"text\":\" [[ \\\"$line\\\" == \\\"DELETE|logical=$logical|generation=$generation|owner=$owner|state_file=$state_file|state_sha256=$state_sha\\\" ]] || die PINNED_DELETE_LINE_FORMAT_INVALID 66\"},{\"line\":148,\"text\":\" [[ \\\"$(node_for_logical \\\"$logical\\\")\\\" == \\\"$owner\\\" ]] || die \\\"PINNED_DELETE_OWNER_INVALID_${logical}\\\" 66\"},{\"line\":149,\"text\":\" safe_generation \\\"$logical\\\" \\\"$generation\\\" || die \\\"PINNED_DELETE_GENERATION_INVALID_${logical}\\\" 66\"},{\"line\":150,\"text\":\" [[ \\\"$state_file\\\" == \\\"$STATE_ROOT/$logical/$generation.json\\\" ]] || die \\\"PINNED_DELETE_STATE_PATH_INVALID_${logical}\\\" 66\"},{\"line\":151,\"text\":\" [[ \\\"$state_sha\\\" =~ ^[0-9a-f]{64}$ ]] || die \\\"PINNED_DELETE_STATE_SHA_INVALID_${logical}\\\" 66\"},{\"line\":154,\"text\":\" (( count > 0 )) || die PINNED_DELETE_FILE_EMPTY 66\"},{\"line\":155,\"text\":\" [[ \\\"$(LC_ALL=C sort \\\"$f\\\" | uniq | wc -l)\\\" == \\\"$count\\\" ]] || die PINNED_DELETE_FILE_DUPLICATE 66\"},{\"line\":160,\"text\":\" jq -e --arg task \\\"$TASK_ID\\\" --arg change \\\"$CHANGE_ID\\\" '.schema==\\\"homelab-backup-retention-transaction-v1\\\" and .task_id==$task and .change_id==$change and (.logical_id|type)==\\\"string\\\" and (.generation|type)==\\\"string\\\" and (.state_sha256|type)==\\\"string\\\" and (.status==\\\"PLANNED\\\" or .status==\\\"B_DELETED\\\" or .status==\\\"DONE\\\")' \\\"$f\\\" >/dev/null || die \\\"PINNED_TX_CONTENT_INVALID_$f\\\" 66\"},{\"line\":165,\"text\":\" expected_path=\\\"$RETENTION_ROOT/transactions/$logical/$generation.json\\\"\"},{\"line\":167,\"text\":\" printf 'DELETE|logical=%s|generation=%s|owner=%s|state_file=%s|state_sha256=%s\\\\n' \\\"$logical\\\" \\\"$generation\\\" \\\"$owner\\\" \\\"$STATE_ROOT/$logical/$generation.json\\\" \\\"$state_sha\\\"\"},{\"line\":170,\"text\":\" local root=\\\"$RETENTION_ROOT/transactions\\\" f\"},{\"line\":178,\"text\":\" local plan_file=\\\"$1\\\" line logical generation reason txf status\"},{\"line\":183,\"text\":\" [[ \\\"$reason\\\" == GC_TRANSACTION_PLANNED || \\\"$reason\\\" == GC_TRANSACTION_B_DELETED ]] || die \\\"PINNED_PLAN_UNEXPECTED_PROTECT_${logical}_${generation}_${reason}\\\" 66\"},{\"line\":184,\"text\":\" txf=\\\"$RETENTION_ROOT/transactions/$logical/$generation.json\\\"\"},{\"line\":185,\"text\":\" [[ -s \\\"$txf\\\" && ! -L \\\"$txf\\\" ]] || die \\\"PINNED_PLAN_PROTECT_TX_MISSING_${logical}_${generation}\\\" 66\"},{\"line\":187,\"text\":\" [[ \\\"GC_TRANSACTION_$status\\\" == \\\"$reason\\\" ]] || die \\\"PINNED_PLAN_PROTECT_STATUS_MISMATCH_${logical}_${generation}\\\" 66\"},{\"line\":188,\"text\":\" grep -Fqx \\\"$(pinned_tx_identity \\\"$txf\\\")\\\" \\\"$HOMELAB_RETENTION_PINNED_DELETE_FILE\\\" || die \\\"PINNED_PLAN_PROTECT_NOT_PINNED_${logical}_${generation}\\\" 66\"},{\"line\":189,\"text\":\" done < <(awk '/^PROTECT\\\\|/' \\\"$plan_file\\\")\"},{\"line\":191,\"text\":\"pinned_assert_delete_scope(){\"},{\"line\":192,\"text\":\" local plan_file=\\\"$1\\\" stage=\\\"$2\\\" actual expected f count_actual count_expected\"},{\"line\":193,\"text\":\" actual=\\\"$TMPROOT/pinned-delete-actual.$stage\\\"\"},{\"line\":194,\"text\":\" expected=\\\"$TMPROOT/pinned-delete-expected.$stage\\\"\"},{\"line\":195,\"text\":\" pinned_delete_assert_file\"},{\"line\":197,\"text\":\" pinned_assert_protect_scope \\\"$plan_file\\\"\"},{\"line\":198,\"text\":\" awk '/^DELETE\\\\|/' \\\"$plan_file\\\" | stable_delete_set >\\\"$actual\\\"\"},{\"line\":199,\"text\":\" if [[ -d \\\"$RETENTION_ROOT/transactions\\\" ]]; then\"},{\"line\":200,\"text\":\" while IFS= read -r f; do pinned_tx_identity \\\"$f\\\" >>\\\"$actual\\\"; done < <(find \\\"$RETENTION_ROOT/transactions\\\" -type f -name '*.json' -print | LC_ALL=C sort)\"},{\"line\":203,\"text\":\" LC_ALL=C sort \\\"$HOMELAB_RETENTION_PINNED_DELETE_FILE\\\" >\\\"$expected\\\"\"},{\"line\":205,\"text\":\" [[ \\\"$count_actual\\\" == \\\"$count_expected\\\" ]] || die \\\"PINNED_DELETE_SCOPE_COUNT_MISMATCH_${stage}\\\" 66\"},{\"line\":206,\"text\":\" [[ \\\"$(uniq \\\"$actual\\\" | wc -l)\\\" == \\\"$count_actual\\\" ]] || die \\\"PINNED_DELETE_SCOPE_DUPLICATE_${stage}\\\" 66\"},{\"line\":207,\"text\":\" cmp -s \\\"$actual\\\" \\\"$expected\\\" || die \\\"PINNED_DELETE_SCOPE_MISMATCH_${stage}\\\" 66\"},{\"line\":208,\"text\":\" printf 'PINNED_DELETE_SCOPE=OK|stage=%s|count=%s|sha256=%s\\\\n' \\\"$stage\\\" \\\"$count_expected\\\" \\\"$HOMELAB_RETENTION_PINNED_DELETE_SHA256\\\"\"},{\"line\":211,\"text\":\" printf 'CONTRACT|task=%s|policy=OWNER_AWARE_SAFE_GC_GFS|target_registry=CANONICAL|vm_keep=%s|app_keep=%s|control_keep=%s|min_delete_age_seconds=%s|gfs_critical=%s|gfs_weekly=%s|gfs_monthly=%s|gfs_completed_periods_only=YES|nonsealed=PROTECT|retired_preserve=PROTECT|unknown_namespace=PROTECT|owner_state_required=YES|both_clouds_required=YES|latest_restore_proven_required=YES|legacy_hb=PROTECT|legacy_pve01=PROTECT|legacy_control=PROTECT\\\\n' \\\"$TASK_ID\\\" \\\"$VM_KEEP\\\" \\\"$APP_KEEP\\\" \\\"$CONTROL_KEEP\\\" \\\"$MIN_DELETE_AGE_SECONDS\\\" \\\"$GFS_CRITICAL_COUNT\\\" \\\"$GFS_WEEKLY\\\" \\\"$GFS_MONTHLY\\\"\"},{\"line\":218,\"text\":\" if ! HOMELAB_BACKUP_GFS_POLICY=\\\"$GFS_POLICY\\\" \\\"$GFS_HELPER\\\" is-critical \\\"$logical\\\"; then return 0; fi\"},{\"line\":236,\"text\":\"plan(){\"},{\"line\":240,\"text\":\" local now logical node keep lifecycle open_count file json schema lid gen status sha sealed_at epoch age idx tx gfs_bucket candidates=0 protected=0 kept=0 gfs_kept=0\"},{\"line\":246,\"text\":\" if [[ \\\"$lifecycle\\\" == ACTIVE ]]; then keep=\\\"$(keep_for \\\"$logical\\\")\\\" || die \\\"KEEP_POLICY_UNKNOWN_$logical\\\"; else keep=0; fi\"},{\"line\":273,\"text\":\" while IFS=$'\\\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=LOGICAL_HAS_INCOMPLETE\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \\\"$TMPROOT/$logical.rows\\\")\"},{\"line\":277,\"text\":\" while IFS=$'\\\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=RETIRED_PRESERVE\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \\\"$TMPROOT/$logical.rows\\\")\"},{\"line\":281,\"text\":\" while IFS=$'\\\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=LATEST_RESTORE_NOT_PROVEN\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \\\"$TMPROOT/$logical.rows\\\")\"},{\"line\":290,\"text\":\" printf 'RETIRED|logical=%s|generation=%s|owner=%s|reason=GC_ALREADY_DONE\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\"\"},{\"line\":292,\"text\":\" printf 'PROTECT|logical=%s|generation=%s|owner=%s|reason=GC_TRANSACTION_%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$tx\\\"; protected=$((protected+1))\"},{\"line\":293,\"text\":\" elif (( idx <= keep )); then\"},{\"line\":294,\"text\":\" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=POLICY_NEWEST_%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$keep\\\"; kept=$((kept+1))\"},{\"line\":295,\"text\":\" elif (( age < MIN_DELETE_AGE_SECONDS )); then\"},{\"line\":296,\"text\":\" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=MIN_AGE|age_seconds=%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$age\\\"; kept=$((kept+1))\"},{\"line\":300,\"text\":\" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=GFS_WEEKLY|bucket=%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$gfs_bucket\\\"; kept=$((kept+1)); gfs_kept=$((gfs_kept+1))\"},{\"line\":302,\"text\":\" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=GFS_MONTHLY|bucket=%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$gfs_bucket\\\"; kept=$((kept+1)); gfs_kept=$((gfs_kept+1))\"},{\"line\":304,\"text\":\" printf 'DELETE|logical=%s|generation=%s|owner=%s|state_file=%s|state_sha256=%s|age_seconds=%s\\\\n' \\\"$logical\\\" \\\"$gen\\\" \\\"$node\\\" \\\"$file\\\" \\\"$sha\\\" \\\"$age\\\"\"},{\"line\":312,\"text\":\" printf 'PLAN_SUMMARY|delete_candidates=%s|protected=%s|kept=%s|vm_keep=%s|app_keep=%s|control_keep=%s|gfs_kept=%s|gfs_critical=%s|gfs_weekly=%s|gfs_monthly=%s\\\\n' \\\"$candidates\\\" \\\"$protected\\\" \\\"$kept\\\" \\\"$VM_KEEP\\\" \\\"$APP_KEEP\\\" \\\"$CONTROL_KEEP\\\" \\\"$gfs_kept\\\" \\\"$GFS_CRITICAL_COUNT\\\" \\\"$GFS_WEEKLY\\\" \\\"$GFS_MONTHLY\\\"\"},{\"line\":321,\"text\":\" path=\\\"$RETENTION_ROOT/transactions/$logical/$generation.json\\\"\"},{\"line\":324,\"text\":\" jq -n --arg task \\\"$TASK_ID\\\" --arg change \\\"$CHANGE_ID\\\" --arg l \\\"$logical\\\" --arg g \\\"$generation\\\" --arg s \\\"$state_sha\\\" --arg status \\\"$status\\\" --arg at \\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\" --argjson aa \\\"$a_absent\\\" --argjson ba \\\"$b_absent\\\" '{schema:\\\"homelab-backup-retention-transaction-v1\\\",task_id:$task,change_id:$change,logical_id:$l,generation:$g,state_sha256:$s,status:$status,updated_at_utc:$at,remote_a_absent:$aa,remote_b_absent:$ba}' >\\\"$tmp\\\"\"},{\"line\":328,\"text\":\"apply_delete_line(){\"},{\"line\":343,\"text\":\" (( age >= MIN_DELETE_AGE_SECONDS )) || die \\\"APPLY_AGE_GUARD_${logical}_${generation}\\\"\"},{\"line\":346,\"text\":\" write_tx \\\"$logical\\\" \\\"$generation\\\" \\\"$state_sha\\\" PLANNED false false\"},{\"line\":348,\"text\":\" remote_generation_present \\\"$REMOTE_B\\\" \\\"$logical\\\" \\\"$generation\\\" && die \\\"APPLY_REMOTE_B_DELETE_FAILED_${logical}_${generation}\\\"\"},{\"line\":349,\"text\":\" write_tx \\\"$logical\\\" \\\"$generation\\\" \\\"$state_sha\\\" B_DELETED false true\"},{\"line\":351,\"text\":\" remote_generation_present \\\"$REMOTE_A\\\" \\\"$logical\\\" \\\"$generation\\\" && die \\\"APPLY_REMOTE_A_DELETE_FAILED_${logical}_${generation}\\\"\"},{\"line\":353,\"text\":\" printf 'GC_DELETE_DONE|logical=%s|generation=%s|owner=%s\\\\n' \\\"$logical\\\" \\\"$generation\\\" \\\"$owner\\\"\"},{\"line\":357,\"text\":\" [[ -d \\\"$RETENTION_ROOT/transactions\\\" ]] || return 0\"},{\"line\":361,\"text\":\" [[ \\\"$status\\\" == PLANNED || \\\"$status\\\" == B_DELETED ]] || die \\\"TX_STATUS_INVALID_$f\\\"\"},{\"line\":372,\"text\":\" if [[ \\\"$status\\\" == PLANNED ]]; then\"},{\"line\":374,\"text\":\" remote_generation_present \\\"$REMOTE_B\\\" \\\"$logical\\\" \\\"$generation\\\" && die \\\"TX_REMOTE_B_DELETE_FAILED_${logical}_${generation}\\\"\"},{\"line\":375,\"text\":\" write_tx \\\"$logical\\\" \\\"$generation\\\" \\\"$state_sha\\\" B_DELETED false true\"}],\"path\":\"/usr/local/sbin/homelab-backup-retention-gc\",\"sha256\":\"8adb6c10f5911f39c53775b89eac3cd1823f1ed34b4caccade5279c213e998a3\"},{\"bytes\":3140,\"interface_lines\":[{\"line\":7,\"text\":\"LOCK=/run/lock/homelab-vm-full-retention.lock\"},{\"line\":12,\"text\":\" local keep=\\\"$LOCAL_KEEP_PAIRS\\\"\"},{\"line\":27,\"text\":\" if ((${#archives[@]} <= keep)); then\"},{\"line\":31,\"text\":\" for archive in \\\"${archives[@]:keep}\\\"; do\"},{\"line\":57,\"text\":\" KEEP='$OFFHOST_KEEP_PAIRS'\"},{\"line\":69,\"text\":\" if [ \\\\\\\"\\\\$count\\\\\\\" -gt \\\\\\\"\\\\$KEEP\\\\\\\" ]; then\"},{\"line\":86,\"text\":\" local keep=$3\"},{\"line\":99,\"text\":\" if ((${#dirs[@]} <= keep)); then\"},{\"line\":103,\"text\":\" for dir in \\\"${dirs[@]:keep}\\\"; do\"},{\"line\":113,\"text\":\" prune_cloud_tier \\\"$remote\\\" daily \\\"$KEEP_DAILY\\\"\"},{\"line\":114,\"text\":\" prune_cloud_tier \\\"$remote\\\" weekly \\\"$KEEP_WEEKLY\\\"\"},{\"line\":115,\"text\":\" prune_cloud_tier \\\"$remote\\\" monthly \\\"$KEEP_MONTHLY\\\"\"},{\"line\":116,\"text\":\" prune_cloud_tier \\\"$remote\\\" quarterly \\\"$KEEP_QUARTERLY\\\"\"},{\"line\":119,\"text\":\"echo \\\"RETENTION_STATUS=OK\\\"\"}],\"path\":\"/usr/local/sbin/homelab-vm-full-retention\",\"sha256\":\"a3cced5263960557d3501123d57f95f12fcede45116111d3d5f02283497d4e63\"},{\"bytes\":2081,\"interface_lines\":[{\"line\":4,\"text\":\"MODE=\\\"${1:-dry-run}\\\"\"},{\"line\":5,\"text\":\"KEEP=\\\"${KEEP:-2}\\\"\"},{\"line\":6,\"text\":\"OUT=\\\"/var/lib/homelab-health/vm-local-dumps-retention.txt\\\"\"},{\"line\":8,\"text\":\"REPORT=\\\"$ROOT/vm-local-dumps-retention-latest.md\\\"\"},{\"line\":15,\"text\":\"DELETED=0\"},{\"line\":16,\"text\":\"WOULD_DELETE=0\"},{\"line\":21,\"text\":\"echo \\\"# Homelab VM local dumps cloud retention\\\" >> \\\"$REPORT\\\"\"},{\"line\":25,\"text\":\"echo \\\"keep=$KEEP\\\" >> \\\"$REPORT\\\"\"},{\"line\":36,\"text\":\" if [ \\\"$TOTAL\\\" -le \\\"$KEEP\\\" ]; then\"},{\"line\":37,\"text\":\" echo \\\"nothing_to_delete\\\" >> \\\"$REPORT\\\"\"},{\"line\":42,\"text\":\" DELETE_COUNT=$((TOTAL-KEEP))\"},{\"line\":46,\"text\":\" if [ \\\"$IDX\\\" -le \\\"$DELETE_COUNT\\\" ]; then\"},{\"line\":55,\"text\":\" echo \\\"DELETE $PATH_REMOTE\\\" >> \\\"$REPORT\\\"\"},{\"line\":56,\"text\":\" rclone purge \\\"$PATH_REMOTE\\\" >> \\\"$REPORT\\\" 2>&1 && DELETED=$((DELETED+1)) || BAD=$((BAD+1))\"},{\"line\":58,\"text\":\" echo \\\"WOULD_DELETE $PATH_REMOTE\\\" >> \\\"$REPORT\\\"\"},{\"line\":59,\"text\":\" WOULD_DELETE=$((WOULD_DELETE+1))\"},{\"line\":62,\"text\":\" echo \\\"KEEP $BASE/$J\\\" >> \\\"$REPORT\\\"\"},{\"line\":72,\"text\":\"echo \\\"STATUS=$STATUS TS=$TS TYPE=vm-local-dumps-retention BAD=$BAD MODE=$MODE KEEP=$KEEP DELETED=$DELETED WOULD_DELETE=$WOULD_DELETE REPORT=$REPORT\\\" > \\\"$OUT\\\"\"}],\"path\":\"/usr/local/sbin/homelab-vm-local-dumps-retention\",\"sha256\":\"306a775325708bcdfb9df6f751c15de0635bc0cf3ab90c00dfadf5ac8220c3bb\"}]\nAUDIT_IMPLEMENTATION=[{\"bytes\":39160,\"path\":\"/usr/local/sbin/homelab-backup-audit\",\"relevant_lines\":[{\"line\":12,\"text\":\"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe\"},{\"line\":13,\"text\":\"VM_WORKER=/usr/local/libexec/homelab-vm-cloud-quorum-node-worker\"},{\"line\":14,\"text\":\"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\"},{\"line\":15,\"text\":\"APP_WORKER=/usr/local/libexec/homelab-app-cloud-quorum-worker\"},{\"line\":16,\"text\":\"APP_CORE=/usr/local/libexec/homelab-app-cloud-quorum-core-helper\"},{\"line\":18,\"text\":\"VM_QUEUE=/usr/local/sbin/homelab-vm-cloud-quorum-queue\"},{\"line\":19,\"text\":\"APP_QUEUE=/usr/local/sbin/homelab-app-cloud-quorum-queue\"},{\"line\":22,\"text\":\"CONTROL_BACKUP=/usr/local/sbin/homelab-control-backup\"},{\"line\":23,\"text\":\"CONTROL_BUILDER=/usr/local/libexec/homelab-control-bundle-builder\"},{\"line\":24,\"text\":\"CONTROL_TIMER=/etc/systemd/system/homelab-control-backup.timer\"},{\"line\":25,\"text\":\"CONTROL_SERVICE=/etc/systemd/system/homelab-control-backup.service\"},{\"line\":26,\"text\":\"CONTROL_RUNTIME_MANIFEST=/etc/homelab-backup/control-runtime-paths.txt\"},{\"line\":27,\"text\":\"CONTROL_SYSTEMD_MANIFEST=/etc/homelab-backup/control-systemd-paths.txt\"},{\"line\":28,\"text\":\"VM_TIMER=/etc/systemd/system/homelab-vm-cloud-quorum-queue.timer\"},{\"line\":29,\"text\":\"APP_TIMER=/etc/systemd/system/homelab-app-cloud-quorum-queue.timer\"},{\"line\":30,\"text\":\"VM_SERVICE=/etc/systemd/system/homelab-vm-cloud-quorum-queue.service\"},{\"line\":31,\"text\":\"APP_SERVICE=/etc/systemd/system/homelab-app-cloud-quorum-queue.service\"},{\"line\":47,\"text\":\"CONTROL_BACKUP_SHA=0b3a0f685d4e67cb86250df89a4918aff2e6c67799b7d35b0e54b1bbc016ee57\"},{\"line\":48,\"text\":\"CONTROL_BUILDER_SHA=2e1c3935b5016c09aad21f34a36f7e1f53188bbc34a3f033e59fe964571ec3f0\"},{\"line\":49,\"text\":\"CONTROL_TIMER_SHA=7c4136da20b9cd9162293380f5794d93e2c6099ce7d87ec00e0e7e19b6cd44a3\"},{\"line\":50,\"text\":\"CONTROL_SERVICE_SHA=428d3e1f3042c3347b7c34b6f190e44fa35f7a97264eec3974239f581c9b9250\"},{\"line\":51,\"text\":\"CONTROL_RUNTIME_MANIFEST_SHA=6777f95159db0fa213017f286f2cee6cc51e9963a01a0578cee8586e8731b2be\"},{\"line\":52,\"text\":\"CONTROL_SYSTEMD_MANIFEST_SHA=7f990d6257b43f97c3c8407945ca9dae6113dc9064c6cf1f25e7fcdaf99d5163\"},{\"line\":53,\"text\":\"VM_TIMER_SHA=9a78c9ea507116cbb9f5645fe697e34964c905b017cc98b17977cd5006aa5050\"},{\"line\":54,\"text\":\"APP_TIMER_SHA=af2eedce3df53029b591d31715a3f3e6688ddb997b4823f487e70c339ce88078\"},{\"line\":60,\"text\":\"CONTROL_STATE_ROOT=/var/lib/homelab-backup/cloud-quorum/control-bootstrap-v2\"},{\"line\":61,\"text\":\"CONTROL_EVIDENCE_ROOT=/var/lib/homelab-backup/control-restore-validation/control-bootstrap\"},{\"line\":69,\"text\":\"CONTROL_SLA_SECONDS=86400\"},{\"line\":140,\"text\":\" printf 'CONTRACT|task=%s|target_registry=CANONICAL|vm_count=%s|app_count=%s|control_sla_seconds=%s|retention=ACTIVE_OWNER_AWARE|provider_worm=NOT_PROVEN_SKIPPED|dr_proof_source=EXACT_SITE_DR_FINAL_SEAL|legacy_site_dr_seal=AUTHORITATIVE|control_freshness=RECURRING_PRODUCER_12H_DUE_24H_SLA|full_site_dr=PROVEN_BY_SEAL\\\\n' \\\"$TASK_ID\\\" \\\"${#VMIDS[@]}\\\" \\\"${#APPS[@]}\\\" \\\"$CONTROL_SLA_SECONDS\\\"\"},{\"line\":170,\"text\":\"stale=0\"},{\"line\":192,\"text\":\"source_hash_local CONTROL_BACKUP \\\"$CONTROL_BACKUP\\\" \\\"$CONTROL_BACKUP_SHA\\\"\"},{\"line\":193,\"text\":\"source_hash_local CONTROL_BUILDER \\\"$CONTROL_BUILDER\\\" \\\"$CONTROL_BUILDER_SHA\\\"\"},{\"line\":194,\"text\":\"source_hash_local CONTROL_TIMER \\\"$CONTROL_TIMER\\\" \\\"$CONTROL_TIMER_SHA\\\"\"},{\"line\":195,\"text\":\"source_hash_local CONTROL_SERVICE \\\"$CONTROL_SERVICE\\\" \\\"$CONTROL_SERVICE_SHA\\\"\"},{\"line\":196,\"text\":\"source_hash_local CONTROL_RUNTIME_MANIFEST \\\"$CONTROL_RUNTIME_MANIFEST\\\" \\\"$CONTROL_RUNTIME_MANIFEST_SHA\\\"\"},{\"line\":197,\"text\":\"source_hash_local CONTROL_SYSTEMD_MANIFEST \\\"$CONTROL_SYSTEMD_MANIFEST\\\" \\\"$CONTROL_SYSTEMD_MANIFEST_SHA\\\"\"},{\"line\":198,\"text\":\"source_hash_local VM_TIMER \\\"$VM_TIMER\\\" \\\"$VM_TIMER_SHA\\\"\"},{\"line\":199,\"text\":\"source_hash_local APP_TIMER \\\"$APP_TIMER\\\" \\\"$APP_TIMER_SHA\\\"\"},{\"line\":233,\"text\":\" if (( age < vm_sla )); then state=FRESH; fresh=$((fresh+1)); else state=STALE; stale=$((stale+1)); fi\"},{\"line\":253,\"text\":\" unverified=$((unverified+1)); printf 'TARGET|kind=VM|id=%s|owner=%s|state=UNVERIFIED|generation=UNKNOWN|age_seconds=-1|sla_seconds=%s|reason=PROBE_FAILED\\\\n' \\\"$vmid\\\" \\\"$node\\\" \\\"$vm_sla\\\"\"},{\"line\":273,\"text\":\" if (( age < app_sla )); then state=FRESH; fresh=$((fresh+1)); else state=STALE; stale=$((stale+1)); fi\"},{\"line\":293,\"text\":\" unverified=$((unverified+1)); printf 'TARGET|kind=APP|id=%s|owner=pve01|state=UNVERIFIED|generation=UNKNOWN|age_seconds=-1|sla_seconds=%s|reason=PROBE_FAILED\\\\n' \\\"$app\\\" \\\"$app_sla\\\"\"},{\"line\":297,\"text\":\"control_status=UNVERIFIED\"},{\"line\":298,\"text\":\"control_age=-1\"},{\"line\":299,\"text\":\"control_generation=UNKNOWN\"},{\"line\":300,\"text\":\"control_checked=false\"},{\"line\":301,\"text\":\"control_state=\\\"\\\"\"},{\"line\":302,\"text\":\"control_degraded=0\"},{\"line\":303,\"text\":\"control_bad=0\"},{\"line\":304,\"text\":\"if control_state=\\\"$(find \\\"$CONTROL_STATE_ROOT\\\" -type f -name '*.json' -printf '%T@|%p\\\\n' 2>&1 | LC_ALL=C sort -n | tail -n 1 | cut -d'|' -f2-)\\\"; then :; else control_state=\\\"\\\"; fi\"},{\"line\":305,\"text\":\"if [[ -n \\\"$control_state\\\" && -s \\\"$control_state\\\" && ! -L \\\"$control_state\\\" ]]; then\"},{\"line\":306,\"text\":\" control_generation=\\\"$(jq -er '.generation' \\\"$control_state\\\" 2>&1)\\\" || control_generation=UNKNOWN\"},{\"line\":307,\"text\":\" transport_status=\\\"$(jq -er '.status' \\\"$control_state\\\" 2>&1)\\\" || transport_status=INVALID\"},{\"line\":308,\"text\":\" if [[ ! \\\"$control_generation\\\" =~ ^control-bootstrap-v2-pve01-[0-9]{8}T[0-9]{6}Z$ ]]; then transport_status=INVALID; fi\"},{\"line\":311,\"text\":\" control_status=RESUME\"},{\"line\":312,\"text\":\" control_degraded=1\"},{\"line\":316,\"text\":\" if strict=\\\"$(jq -er 'if .schema==\\\"homelab-cloud-quorum-payload-v1\\\" and .logical_id==\\\"control-bootstrap-v2\\\" and .status==\\\"SEALED\\\" and .cloud_quorum==2 and .cloud_a_verified==true and .cloud_b_verified==true and .part_hashes_verified==true and .seal_written==true and .cloud_a_seal_verified==true and .cloud_b_seal_verified==true and .local_payload_present==false and .local_cleanup==\\\"OK\\\" then \\\"OK\\\" else error(\\\"strict state invalid\\\") end' \\\"$control_state\\\" 2>&1)\\\"; then\"},{\"line\":317,\"text\":\" control_updated=\\\"$(jq -er '.sealed_at_utc // .updated_at_utc' \\\"$control_state\\\" 2>&1)\\\" || control_updated=INVALID\"},{\"line\":318,\"text\":\" control_sha=\\\"$(jq -er '.archive_sha256' \\\"$control_state\\\" 2>&1)\\\" || control_sha=INVALID\"},{\"line\":319,\"text\":\" control_epoch=\\\"$(date -u -d \\\"$control_updated\\\" +%s 2>&1)\\\" || control_epoch=-1\"},{\"line\":320,\"text\":\" control_evidence=\\\"$CONTROL_EVIDENCE_ROOT/$control_generation.json\\\"\"},{\"line\":321,\"text\":\" if [[ \\\"$control_epoch\\\" =~ ^[0-9]+$ && \\\"$control_epoch\\\" -le \\\"$now\\\" && -s \\\"$control_evidence\\\" && ! -L \\\"$control_evidence\\\" ]]; then\"},{\"line\":322,\"text\":\" if evidence_ok=\\\"$(jq -er --arg g \\\"$control_generation\\\" --arg sha \\\"$control_sha\\\" 'if .result==\\\"OK\\\" and .logical_id==\\\"control-bootstrap-v2\\\" and .generation==$g and .restore_source==\\\"Cloud A + Cloud B\\\" and .payload_sha256==$sha and .payload_sha256_verified==true and .control_manifest_verified==true and .payload_checksums_verified==true and .ops_git_bundle_verified==true and .desired_git_bundle_verified==true and .secret_escrow_separate==true and .clean_machine_bootstrap_proven==false then \\\"OK\\\" else error(\\\"control evidence invalid\\\") end' \\\"$control_evidence\\\" 2>&1)\\\"; then\"},{\"line\":323,\"text\":\" control_checked=true\"},{\"line\":324,\"text\":\" control_age=$((now-control_epoch))\"},{\"line\":325,\"text\":\" if (( control_age < CONTROL_SLA_SECONDS )); then control_status=FRESH_SEALED_PROVEN; else control_status=STALE_PROVEN; control_bad=1; infra_bad=$((infra_bad+1)); fi\"},{\"line\":326,\"text\":\" control_payload=\\\"$(jq -er '.payload_path' \\\"$control_state\\\" 2>&1)\\\" || control_payload=INVALID\"},{\"line\":327,\"text\":\" if [[ \\\"$control_payload\\\" != /* ]] || [[ -e \\\"$control_payload\\\" ]]; then payload_leaks=$((payload_leaks+1)); fi\"},{\"line\":329,\"text\":\" control_bad=1; infra_bad=$((infra_bad+1))\"},{\"line\":332,\"text\":\" control_bad=1; infra_bad=$((infra_bad+1))\"},{\"line\":335,\"text\":\" control_bad=1; infra_bad=$((infra_bad+1))\"},{\"line\":338,\"text\":\" *) control_bad=1; infra_bad=$((infra_bad+1)) ;;\"},{\"line\":341,\"text\":\" control_bad=1; infra_bad=$((infra_bad+1))\"},{\"line\":343,\"text\":\"control_archive_size=-1\"},{\"line\":344,\"text\":\"if [[ -n \\\"$control_state\\\" && -s \\\"$control_state\\\" && \\\"$control_status\\\" != UNVERIFIED && \\\"$control_status\\\" != RESUME ]]; then control_archive_size=\\\"$(jq -er '.archive_size_bytes' \\\"$control_state\\\" 2>/dev/null)\\\" || control_archive_size=-1; if ! append_obs_target CONTROL control-bootstrap-v2 control-bootstrap-v2 \\\"$control_archive_size\\\"; then observability_input_bad=$((observability_input_bad+1)); fi; fi\"},{\"line\":345,\"text\":\"printf 'CONTROL|state=%s|CONTROL_FRESHNESS=%s|generation=%s|age_seconds=%s|sla_seconds=%s|archive_size_bytes=%s|restore_evidence_checked=%s|source_coverage=RESTORE_EVIDENCE|retention=ACTIVE_OWNER_AWARE\\\\n' \\\"$control_status\\\" \\\"$control_status\\\" \\\"$control_generation\\\" \\\"$control_age\\\" \\\"$CONTROL_SLA_SECONDS\\\" \\\"$control_archive_size\\\" \\\"$control_checked\\\"\"},{\"line\":410,\"text\":\" service=\\\"${unit%.timer}.service\\\"\"},{\"line\":412,\"text\":\" if [[ \\\"$load_state\\\" == loaded && \\\"$unit_file_state\\\" == enabled && \\\"$active_state\\\" == active && \\\"$result\\\" != failed && \\\"$service_result\\\" != failed ]]; then status=OK; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi\"},{\"line\":422,\"text\":\"for lock in /run/homelab-backup-heavy.lock /run/lock/homelab-vm-cloud-quorum-queue.lock /run/lock/homelab-app-cloud-quorum-queue.lock /run/lock/homelab-backup-dispatcher.lock; do\"},{\"line\":466,\"text\":\"if [[ -s \\\"$RETENTION_HEALTH\\\" && ! -L \\\"$RETENTION_HEALTH\\\" ]] && jq -e '.schema==\\\"homelab-backup-retention-v1\\\" and .status==\\\"OK\\\" and .policy.vm_keep==2 and .policy.app_keep==7 and .policy.control_keep==4 and .owner_aware_gc_proven==true and .destructive_canary_proven==true' \\\"$RETENTION_HEALTH\\\" >/dev/null; then\"},{\"line\":473,\"text\":\"printf 'RETENTION|status=%s|historical_gc_proven=%s|owner_aware_gc_proven=%s|vm_keep=2|app_keep=7|control_keep=4\\\\n' \\\"$retention_status\\\" \\\"$( [[ \\\"$historical_gc_proven\\\" == true ]] && printf YES || printf NO )\\\" \\\"$( [[ \\\"$owner_aware_gc_proven\\\" == true ]] && printf YES || printf NO )\\\"\"},{\"line\":510,\"text\":\"if (( stale > 0 || unverified > 0 || payload_leaks > 0 || infra_bad > 0 )); then backup_status=RED\"},{\"line\":527,\"text\":\"(( stale > 0 )) && add_risk HIGH RPO_BREACH\"},{\"line\":536,\"text\":\"printf 'SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=%s|RISK_SEVERITY=%s|RISK_REASONS=%s|DR_PROOF_STATUS=%s|CONTROL_FRESHNESS=%s|LIFECYCLE_STATUS=%s|VM_COUNT=%s|APP_COUNT=%s|FRESH=%s|STALE=%s|RESUME=%s|UNVERIFIED=%s|CONTROL_STATE=%s|CLOUD_OK=%s|SCHEDULER_OK=%s|SOURCE_OK=%s|SOURCE_DRIFT=%s|STAGING_BAD=%s|STAGING_WARN=%s|PAYLOAD_LEAKS=%s|RETENTION_STATUS=%s|OBSERVABILITY=%s|SIZE_ANOMALIES=%s|CAPACITY=%s|GLOBAL_DR_PROVEN=%s\\\\n' \\\"$backup_status\\\" \\\"$risk_severity\\\" \\\"$risk_reasons\\\" \\\"$dr_proof_status\\\" \\\"$control_status\\\" \\\"$lifecycle_status\\\" \\\"$vm_seen\\\" \\\"$app_seen\\\" \\\"$fresh\\\" \\\"$stale\\\" \\\"$resume\\\" \\\"$unverified\\\" \\\"$control_status\\\" \\\"$cloud_ok\\\" \\\"$scheduler_ok\\\" \\\"$source_ok\\\" \\\"$source_drift\\\" \\\"$staging_bad\\\" \\\"$staging_warn\\\" \\\"$payload_leaks\\\" \\\"$retention_status\\\" \\\"$observability_status\\\" \\\"$size_anomaly_count\\\" \\\"$capacity_status\\\" \\\"$global_dr_proven\\\"\"},{\"line\":541,\"text\":\" jq -n --arg task \\\"$TASK_ID\\\" --arg change \\\"$CHANGE_ID\\\" --arg at \\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\" --arg backup \\\"$backup_status\\\" --arg risk \\\"$risk_severity\\\" --arg reasons \\\"$risk_reasons\\\" --arg control \\\"$control_status\\\" --arg dr \\\"$dr_proof_status\\\" --arg lifecycle \\\"$lifecycle_status\\\" --arg escrow \\\"$escrow_status\\\" --arg staging \\\"$staging_status\\\" --arg retention \\\"$retention_status\\\" --arg observability \\\"$observability_status\\\" --arg capacity \\\"$capacity_status\\\" --argjson historical \\\"$historical_gc_proven\\\" --argjson owner_gc \\\"$owner_aware_gc_proven\\\" --argjson staging_bad \\\"$staging_bad\\\" --argjson staging_warn \\\"$staging_warn\\\" --argjson vm_count \\\"$vm_seen\\\" --argjson app_count \\\"$app_seen\\\" --argjson fresh \\\"$fresh\\\" --argjson stale \\\"$stale\\\" --argjson resume \\\"$resume\\\" --argjson unverified \\\"$unverified\\\" --argjson cloud_ok \\\"$cloud_ok\\\" --argjson scheduler_ok \\\"$scheduler_ok\\\" --argjson source_ok \\\"$source_ok\\\" --argjson source_drift \\\"$source_drift\\\" --argjson payload_leaks \\\"$payload_leaks\\\" --argjson size_anoma\"}],\"sha256\":\"1474c9ce58bbc1b3ae7437261d1bdb923232926fb2943c7c830253f8b284724c\"},{\"bytes\":2161,\"path\":\"/usr/local/sbin/homelab-vps-identity-audit\",\"relevant_lines\":[],\"sha256\":\"b709691c52ae48432b70e197eb4810b6c374a05911cee3b9fdba4ecc67c76c3a\"}]\nALERT_IMPLEMENTATION={\"bytes\":1806,\"exists\":true,\"sha256\":\"6deef30b4708a7e5b2ac0f0d98bb6b37b22d858afde994483b67baa18dffdc2a\",\"structure_lines\":[{\"line\":4,\"text\":\"APP=\\\"alertmanager\\\"\"},{\"line\":14,\"text\":\"fail(){ echo \\\"[ERROR] alertmanager backup failed; kept: $STAGE\\\"; }\"},{\"line\":16,\"text\":\"ssh -n -o BatchMode=yes -o ConnectTimeout=8 \\\"$MON\\\" \\\"sudo -n docker exec alertmanager amtool check-config /etc/alertmanager/alertmanager.yml >/dev/null && sudo -n tar -C / -czf - opt/stacks/observability-lite/compose.yaml opt/stacks/observability-lite/compose.override.yaml opt/stacks/observability-lite/alertmanager/alertmanager.yml opt/stacks/observability-lite/alertmanager/data\\\" > \\\"$STAGE/remote.tgz\\\"\"},{\"line\":19,\"text\":\"test -s \\\"$STAGE/payload/opt/stacks/observability-lite/alertmanager/alertmanager.yml\\\"\"},{\"line\":21,\"text\":\"jq -n --arg app \\\"$APP\\\" --arg host \\\"monitoring\\\" --arg engine \\\"files+alertmanager-config-check\\\" --arg config \\\"ok\\\" --argjson files \\\"$FILES\\\" \\\"{app:\\\\$app,engine:\\\\$engine,source_host:\\\\$host,source_paths:[\\\\\\\"monitoring:/opt/stacks/observability-lite/alertmanager\\\\\\\",\\\\\\\"monitoring:/opt/stacks/observability-lite/compose.yaml\\\\\\\",\\\\\\\"monitoring:/opt/stacks/observability-lite/compose.override.yaml\\\\\\\"],config_check:\\\\$config,file_count:\\\\$files,note:\\\\\\\"Alertmanager configuration and runtime state in encrypted two-cloud backup\\\\\\\"}\\\" > \\\"$STAGE/metadata.json\\\"\"},{\"line\":25,\"text\":\"echo ALERTMANAGER_BACKUP_RUN=OK\"}]}\nALERT_SYSTEMD_REFERENCES=[]\nMAIL_ROUTE_READINESS={\"postfix_active\":true,\"pve_user_email_present\":false,\"relayhost_configured\":false,\"root_alias_present\":false,\"sendmail_present\":true,\"smtp_sasl_auth_enable\":\"no\",\"smtp_sasl_password_maps_configured\":false,\"smtp_tls_security_level\":\"\"}\nSOURCE_PUBLICATION_STATE={\"cr_branch_sha\":null,\"fetch_url_present\":true,\"local_head\":\"50bf24f8ee27f3d2e0d1cbc6c17b62c69ff06bae\",\"ls_remote_rc\":0,\"main_sha\":\"326622a4864fa9b5f43b69981733236bb42c4d7b\",\"pushurl_is_disabled\":true}\nDR_RESTORE_SEALS=[{\"mtime_epoch\":1786237057,\"name\":\"backup-app-cloud-quorum-cutover-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0020\",\"status\":\"SEALED\",\"task_id\":\"backup-app-cloud-quorum-cutover-v1\"},\"sha256\":\"c77f83927dcf020cac0182bf8f7145ac823b3bbb2b62dd1021dbc9a340b0c467\"},{\"mtime_epoch\":1786241107,\"name\":\"backup-app-cloud-quorum-freshness-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0022\",\"status\":\"SEALED\",\"task_id\":\"backup-app-cloud-quorum-freshness-v1\"},\"sha256\":\"0d5374f9cceb05113c24ce9ee16a3b12f1e7846261b4d5801b125489ac45c4d7\"},{\"mtime_epoch\":1786453079,\"name\":\"backup-cloud-legacy-retirement-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0035\",\"status\":\"SEALED\",\"task_id\":\"backup-cloud-legacy-retirement-v1\"},\"sha256\":\"fe78e534174b1e23ef0aef72599cf74e73332d7abe100dda02b9ebb2f2f7afdc\"},{\"mtime_epoch\":1786396264,\"name\":\"backup-control-bootstrap-cloud-quorum-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0029\",\"logical_id\":\"control-bootstrap\",\"status\":\"SEALED\",\"task_id\":\"backup-control-bootstrap-cloud-quorum-v1\"},\"sha256\":\"332f9fd0822a1531753a16978d33e8543694f3c2c0e329ba6115bf05c00d02d8\"},{\"mtime_epoch\":1786406463,\"name\":\"backup-control-bootstrap-configs-source-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0030\",\"logical_id\":\"control-bootstrap-v2\",\"status\":\"SEALED\",\"task_id\":\"backup-control-bootstrap-configs-source-v1\"},\"sha256\":\"8a39632eb3901677047a544243c52a32e304912c589376ff855ef4c623a46fa9\"},{\"mtime_epoch\":1786601026,\"name\":\"backup-control-coverage-hardening-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0054\",\"status\":\"SEALED\",\"task_id\":\"backup-control-coverage-hardening-v1\"},\"sha256\":\"d4f1240df892ddddfd880bc5d5fca5df1c5c0d5c93f21c56658a669ed7547b58\"},{\"mtime_epoch\":1786441319,\"name\":\"backup-control-final-generation-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0034\",\"status\":\"SEALED\",\"task_id\":\"backup-control-final-generation-v1\"},\"sha256\":\"c5a0d270c9582e84f61564905734d76796bb5aa2de93873d1a639f5dbe7695a2\"},{\"mtime_epoch\":1787357380,\"name\":\"backup-control-refresh-current-v3.json\",\"selected\":{\"change_id\":\"CR-2026-0095\",\"status\":\"SEALED\",\"task_id\":\"backup-control-refresh-current-v3\"},\"sha256\":\"5c7cb7ce3af6fe4ce3c11d0f3c2a2ab80790d7997b4ceea64ae5d9cc5bc4ada4\"},{\"mtime_epoch\":1786685619,\"name\":\"backup-control-refresh-post-legacy-retirement-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0067\",\"status\":\"SEALED\",\"task_id\":\"backup-control-refresh-post-legacy-retirement-v1\"},\"sha256\":\"6986ef7c5a3f13a3d199397e3f01a45c4418d81ce7ccd1f929fc9cb5593fd9db\"},{\"mtime_epoch\":1786604876,\"name\":\"backup-control-refresh-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0057\",\"status\":\"SEALED\",\"task_id\":\"backup-control-refresh-v1\"},\"sha256\":\"52abe0785bbabf2ed7df5a4f46580487f65ab48b2a3462b32ae4e0943894fcc2\"},{\"mtime_epoch\":1786719633,\"name\":\"backup-delete-evidence-hardening-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0074\",\"status\":\"SEALED\",\"task_id\":\"backup-delete-evidence-hardening-v1\"},\"sha256\":\"02abe418e49139b034984128399374301505686e45d07db8ffb6a9b8e1c53fd0\"},{\"mtime_epoch\":1789959071,\"name\":\"backup-gfs-lifecycle-remediation-v1.json\",\"selected\":{\"change_id\":\"CR-2026-1005\",\"status\":\"SEALED\",\"task_id\":\"backup-gfs-lifecycle-remediation-v1\"},\"sha256\":\"b7da77e3a40ce308f56bbc3915569e071079773db39df1e7adc84929baf69bc6\"},{\"mtime_epoch\":1786717462,\"name\":\"backup-gfs-retention-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0072\",\"status\":\"SEALED\",\"task_id\":\"backup-gfs-retention-v1\"},\"sha256\":\"e6857f4f736d2f9506c0184119e6152ceb8301fcfaa75eb983b9e9fd4b3fac87\"},{\"mtime_epoch\":1786247840,\"name\":\"backup-hbarhub-cloud-quorum-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0024\",\"logical_id\":\"app-hbarhub\",\"status\":\"SEALED\",\"task_id\":\"backup-hbarhub-cloud-quorum-v1\"},\"sha256\":\"d7d6f959ff3575b27602ffe09a0d304f12d477b499637a2ea7358bfa85e7b20e\"},{\"mtime_epoch\":1786373683,\"name\":\"backup-lock-fd-hardening-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0027\",\"status\":\"SEALED\",\"task_id\":\"backup-lock-fd-hardening-v1\"},\"sha256\":\"3d1e9f182ce7263f2c4148618b132277c7125f4d0a348203cd1c08b711076501\"},{\"mtime_epoch\":1786565758,\"name\":\"backup-matrix-residue-retirement-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0050\",\"status\":\"SEALED\",\"task_id\":\"backup-matrix-residue-retirement-v1\"},\"sha256\":\"85036d473fa309331a9167d58ef1f2bd7e7466d52b9b130096dbdc45507512fc\"},{\"mtime_epoch\":1786703572,\"name\":\"backup-observability-risk-forecast-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0071\",\"status\":\"SEALED\",\"task_id\":\"backup-observability-risk-forecast-v1\"},\"sha256\":\"40a316a39025867cfb488543006badf0bdb315aec65c0c5f8ef20bc1b1665915\"},{\"mtime_epoch\":1786643518,\"name\":\"backup-retention-dynamic-pinned-prune-mailru-cleanup-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0065\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-dynamic-pinned-prune-mailru-cleanup-v1\"},\"sha256\":\"f9165cf9faf0d2bd7803b7dc9763d24244e677d14d4a3d8fce558a4b8326088a\"},{\"mtime_epoch\":1786639543,\"name\":\"backup-retention-pinned-scheduled-scope-hotfix-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0064\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-pinned-scheduled-scope-hotfix-v1\"},\"sha256\":\"8b2ddd3968a8c2bcb4fc91855f667a21c0aa2710944fe2553108350344a7dd56\"},{\"mtime_epoch\":1786599343,\"name\":\"backup-retention-plan-stability-hotfix-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0055\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-plan-stability-hotfix-v1\"},\"sha256\":\"4d7ebbc69ee319f210785ef6113e033dca9e2ceed2e706afc8f0b3cf10873026\"},{\"mtime_epoch\":1786607325,\"name\":\"backup-retention-remote-list-failclosed-hotfix-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0060\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-remote-list-failclosed-hotfix-v1\"},\"sha256\":\"b2831634be5ff1f829302b83025fc5ba7649dcbe72fd14cdfda1e5d7a0f52e07\"},{\"mtime_epoch\":1786513619,\"name\":\"backup-retention-remote-stdin-hotfix-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0035\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-remote-stdin-hotfix-v1\"},\"sha256\":\"d42d89260f2304945df40c958fd5a52b758a674bcb10b9323552a0a7b35ce7ae\"},{\"mtime_epoch\":1786431140,\"name\":\"backup-retention-safe-gc-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0033\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-safe-gc-v1\"},\"sha256\":\"2e1d4745b70ea6e3e96097ccc336fd7d555e70b8cc058b96491fd8c87d95579f\"},{\"mtime_epoch\":1786600541,\"name\":\"backup-retention-transaction-resume-hotfix-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0056\",\"status\":\"SEALED\",\"task_id\":\"backup-retention-transaction-resume-hotfix-v1\"},\"sha256\":\"d4e4dd8d58d0fc527cd7210c6252b6321e0568961c03a4ddd729fbdb20494928\"},{\"mtime_epoch\":1786726495,\"name\":\"backup-rotating-boot-drill-escrow-freshness-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0075\",\"status\":\"SEALED\",\"task_id\":\"backup-rotating-boot-drill-escrow-freshness-v1\"},\"sha256\":\"9a38eebec6e913d802dd08bb4dcb5612dfec734530bbf1afbe7e277507ccd163\"},{\"mtime_epoch\":1786387065,\"name\":\"backup-scheduler-fairness-granularity-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0028\",\"status\":\"SEALED\",\"task_id\":\"backup-scheduler-fairness-granularity-v1\"},\"sha256\":\"cf0fd28e413fc9eb6dbd76149378a169b987c7509246ae1758cc75041a8d393b\"},{\"mtime_epoch\":1786359648,\"name\":\"backup-scheduler-rpo-hardening-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0026\",\"status\":\"SEALED\",\"task_id\":\"backup-scheduler-rpo-hardening-v1\"},\"sha256\":\"b56847a3c68d16559aabcd23ff46dfefd820fc970432afd2232415bc0202af3e\"},{\"mtime_epoch\":1786297580,\"name\":\"backup-scrutiny-cloud-quorum-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0025\",\"logical_id\":\"app-scrutiny\",\"status\":\"SEALED\",\"task_id\":\"backup-scrutiny-cloud-quorum-v1\"},\"sha256\":\"eb50068d771572139320b41b4a9a4fef9fa28fd977686d66f84e15a987dd43a3\"},{\"mtime_epoch\":1786698442,\"name\":\"backup-target-lifecycle-registry-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0070\",\"status\":\"SEALED\",\"task_id\":\"backup-target-lifecycle-registry-v1\"},\"sha256\":\"b843b84c66c739ec42e8454b8a996eb827364fb6c938a8ce86e4e5ac7c16c0b8\"},{\"mtime_epoch\":1786428928,\"name\":\"backup-unified-monitoring-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0032\",\"status\":\"SEALED\",\"task_id\":\"backup-unified-monitoring-v1\"},\"sha256\":\"26cbd0d9f84cf4bd8aec1c8ad479e612afde3949954003dd0d9f4a1bbc278867\"},{\"mtime_epoch\":1786200294,\"name\":\"backup-vm-cloud-quorum-cutover-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0019\",\"status\":\"SEALED\",\"task_id\":\"backup-vm-cloud-quorum-cutover-v1\"},\"sha256\":\"33b0dadaf58949fe1356904c7171f4be992dc3866e3ba4688e0ada41e6266aac\"},{\"mtime_epoch\":1786239546,\"name\":\"backup-vm-cloud-quorum-freshness-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0021\",\"status\":\"SEALED\",\"task_id\":\"backup-vm-cloud-quorum-freshness-v1\"},\"sha256\":\"89a3a916b5a099ba71fb6f171c16bb52adeec45295315a9b605b1703b2ed3f65\"},{\"mtime_epoch\":1786422218,\"name\":\"backup-vm-restore-evidence-hardening-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0031\",\"status\":\"SEALED\",\"task_id\":\"backup-vm-restore-evidence-hardening-v1\"},\"sha256\":\"5f1274624374adbbb495b1701fe1eedaab028fad0f97a2409f0b79df9a791f9a\"},{\"mtime_epoch\":1786459865,\"name\":\"cluster-postdr-storage-retirement-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0038\",\"status\":\"SEALED\",\"task_id\":\"cluster-postdr-storage-retirement-v1\"},\"sha256\":\"d25c1760d3ea45ac695ee1fc5d2636bbb1c012da96c3ba4e89767915efe0e7d2\"},{\"mtime_epoch\":1784329495,\"name\":\"homelab-backup-tail-closure-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0004\",\"status\":\"SEALED\",\"task_id\":\"homelab-backup-tail-closure-v1\"},\"sha256\":\"9a52b2bb0186f9807a0b25274f819c33b097dbbfaa32f03f1c31360354c096c1\"},{\"mtime_epoch\":1786684253,\"name\":\"legacy-backup-target-retirement-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0066\",\"status\":\"SEALED\",\"task_id\":\"legacy-backup-target-retirement-v1\"},\"sha256\":\"830eb32a0c3366d51c9d798736ccbd3048a0524b38cd228a58085499b610048f\"},{\"mtime_epoch\":1786555697,\"name\":\"reports-monitor-canonical-backup-supervision-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0046\",\"status\":\"SEALED\",\"task_id\":\"reports-monitor-canonical-backup-supervision-v1\"},\"sha256\":\"2c4fdb17fbd7caec98e111fae74e1d8bad3942cc2c7bc33a0b1c8b769b542076\"},{\"mtime_epoch\":1786450297,\"name\":\"site-dr-final-acceptance-v1.json\",\"selected\":{\"change_id\":\"DR-2026-FINAL\",\"status\":\"SEALED\",\"task_id\":\"site-dr-final-resume-boot-v1\"},\"sha256\":\"b9f8172bac0206380198ac68079625b06f06eac7d484e66226082ebc1abae14d\"},{\"mtime_epoch\":1786470088,\"name\":\"vm160-post-cleanup-canonical-backup-v1.json\",\"selected\":{\"change_id\":\"CR-2026-0043\",\"status\":\"SEALED\",\"target\":\"vm160\",\"task_id\":\"vm160-post-cleanup-canonical-backup-v1\"},\"sha256\":\"83b76b909bad03476133425e38ab0be75a300a821300389660aa2f620c543d0c\"}]\nCLOSURE_GATES={\"active_targets_with_state_missing\":8,\"alert_script_present\":true,\"cloud_a_readable\":true,\"cloud_b_readable\":true,\"gfs_ok\":true,\"retention_timer_safely_held\":true,\"sendmail_present\":true,\"source_offhost_branch_exact\":false,\"v2_timer_enabled_active\":true}\nNO_MUTATION=true\nNO_REPO_WRITE=true\nNO_GIT_FETCH=true\nNO_GIT_COMMIT=true\nNO_GIT_PUSH_UPDATE=true\nNO_SYSTEMD_ACTION=true\nNO_BACKUP_STARTED=true\nNO_RESTORE_STARTED=true\nNO_RETENTION_GC_STARTED=true\nNO_CLOUD_DELETE=true\nNO_MAIL_SENT=true\nAUDIT_DURATION_SEC=1.505\nTASK_RESULT=PASS_HOMELAB_BACKUP_CLOSURE_AUDIT_READONLY\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nWORKERS2_BACKUP_CLOSURE_AUDIT_END=1\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index ec49f7df..8d42d716 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,20 +1,20 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=SIGNALBOT-260921-RECONCILIATION-BOUNDED-REPAIR-052REPAIR7 +COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1 STATUS=OK RC=0 HOST=pve01 -MODE=change -COMPONENT=signalbot-reconciliation-bounded-repair +MODE=read-only +COMPONENT=homelab-backup-closure-audit REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=6e0210f6e920560a7f5388a8c2b727b145671136198a36dd3294f514729c1a9e +COMMAND_SHA256=d3877f0193bbe5b5c8345ebec48097517ce415848ee63ff839517234bc496da1 DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true -CHANGE_DECLARED=true +CHANGE_DECLARED=false RESULT_CONTRACT_VALID=true -RESULT_CONTRACT_STATUS=OK +RESULT_CONTRACT_STATUS=NOT_APPLICABLE RESULT_CONTRACT_ERROR=NONE COMMAND_RC=0 CHANGES_MADE=false @@ -24,13 +24,59 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=1e2edb9e58c7cfe362b8d51a5c246b28c6abfd53cf7689006c2351e607ac0a74 -SANITIZED_OUTPUT_SHA256=1e2edb9e58c7cfe362b8d51a5c246b28c6abfd53cf7689006c2351e607ac0a74 +RAW_EVIDENCE_SHA256=12f9c3c08bd66206cce08cf9b97ad5ece4d918a0ee1661e4a7fb3735e42d6a36 +SANITIZED_OUTPUT_SHA256=12f9c3c08bd66206cce08cf9b97ad5ece4d918a0ee1661e4a7fb3735e42d6a36 OUTPUT_BEGIN -SIGNALBOT052REPAIR7_EVIDENCE={"code":10,"phase":"simulation","pre_unresolved":[251009,303837,318578,350488,377008,397710,433876,437370,438938,455774],"now_unresolved":[251009,303837,318578,350488,377008,397710,433876,437370,438938,455774],"core_rc":4} -SIGNALBOT052REPAIR7_EXITCODE=10 -TASK_RESULT=HOLD_SIMULATION_NOT_ALL_RECONCILED -HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SIGNALBOT-260921-RECONCILIATION-BOUNDED-REPAIR-052REPAIR7","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} +WORKERS2_BACKUP_CLOSURE_AUDIT_BEGIN=1 +COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1 +MODE=read-only +COMPONENT=homelab-backup-closure-audit +HOST=pve01 +UID=0 +MUTATION_BOUNDARY=READ_ONLY_NO_REPO_WRITE_NO_GIT_FETCH_NO_GIT_COMMIT_NO_PUSH_NO_SYSTEMD_ACTION_NO_BACKUP_NO_RESTORE_NO_RETENTION_GC_NO_CLOUD_DELETE_NO_MAIL +SOURCE_HEAD=50bf24f8ee27f3d2e0d1cbc6c17b62c69ff06bae +SOURCE_HEAD_EXPECTED=true +SOURCE_WORKTREE_CLEAN=true +SOURCE_STATUS_LINES=[] +GFS_POST_STATE={"helper":{"exists":true,"sha256":"a1aed0c6039f8095bd5da7f62b47f4ee6932df98c4e0e7420d3006df86bd5c94"},"policy":{"exists":true,"sha256":"2c7674045dd5c68cc48d348d616494dbbe145df460a8e85d97a2c5c153ec792d"},"seal":{"exists":true,"sha256":"b7da77e3a40ce308f56bbc3915569e071079773db39df1e7adc84929baf69bc6"},"seal_selected":{"critical_vm_count":8,"helper_sha256":"a1aed0c6039f8095bd5da7f62b47f4ee6932df98c4e0e7420d3006df86bd5c94","policy_sha256":"2c7674045dd5c68cc48d348d616494dbbe145df460a8e85d97a2c5c153ec792d","retention_reenable_requires_safe_plan":true,"retention_timer_held_disabled":true,"status":"SEALED","vm200_retired_preserve":true}} +GFS_VALIDATE={"rc":0,"stderr":[],"stdout":["GFS_POLICY=OK"]} +GFS_CRITICAL_LOGICALS=["vm110","vm111","vm112","vm113","vm130","vm150","vm160","vm170"] +UNIT_STATE={"homelab-backup-retention-gc.service":{"ActiveState":{"rc":0,"value":"inactive"},"ExecMainStatus":{"rc":0,"value":"66"},"LastTriggerUSec":{"rc":0,"value":""},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"dead"},"UnitFileState":{"rc":0,"value":"static"}},"homelab-backup-retention-gc.timer":{"ActiveState":{"rc":0,"value":"inactive"},"ExecMainStatus":{"rc":0,"value":""},"LastTriggerUSec":{"rc":0,"value":""},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"dead"},"UnitFileState":{"rc":0,"value":"disabled"}},"homelab-backup-v2.service":{"ActiveState":{"rc":0,"value":"inactive"},"ExecMainStatus":{"rc":0,"value":"0"},"LastTriggerUSec":{"rc":0,"value":""},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"dead"},"UnitFileState":{"rc":0,"value":"static"}},"homelab-backup-v2.timer":{"ActiveState":{"rc":0,"value":"active"},"ExecMainStatus":{"rc":0,"value":""},"LastTriggerUSec":{"rc":0,"value":"Mon 2026-09-21 05:35:16 MSK"},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"waiting"},"UnitFileState":{"rc":0,"value":"enabled"}}} +REGISTRY_LOGICALS=[{"id":"filebrowser","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-filebrowser"},{"id":"hbarhub","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-hbarhub"},{"id":"immich","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-immich"},{"id":"memos","kind":"APP","lifecycle":"RETIRED_PRESERVE","logical_id":"app-memos"},{"id":"scrutiny","kind":"APP","lifecycle":"RETIRED_PRESERVE","logical_id":"app-scrutiny"},{"id":"skladchik-moderator-assistant","kind":"APP","lifecycle":"RETIRED_PRESERVE","logical_id":"app-skladchik-moderator-assistant"},{"id":"skladchik-reports-monitor","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-skladchik-reports-monitor"},{"id":"control-bootstrap-v2","kind":"CONTROL","lifecycle":"ACTIVE","logical_id":"control-bootstrap-v2"},{"id":"110","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm110"},{"id":"111","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm111"},{"id":"112","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm112"},{"id":"113","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm113"},{"id":"130","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm130"},{"id":"150","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm150"},{"id":"160","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm160"},{"id":"170","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm170"},{"id":"171","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm171"},{"id":"180","kind":"VM","lifecycle":"RETIRED_PRESERVE","logical_id":"vm180"},{"id":"190","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm190"},{"id":"200","kind":"VM","lifecycle":"RETIRED_PRESERVE","logical_id":"vm200"},{"id":"9130","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm9130"}] +REGISTRY_ACTIVE_LOGICALS=["app-filebrowser","app-hbarhub","app-immich","app-skladchik-reports-monitor","control-bootstrap-v2","vm110","vm111","vm112","vm113","vm130","vm150","vm160","vm170","vm171","vm190","vm9130"] +REGISTRY_ACTIVE_COUNT=16 +V2_STATE_COUNT=29 +V2_STATES=[{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"control-bootstrap-v2.json","generation":"control-bootstrap-v2-pve01-20260916T120057Z","green_verified":null,"json_valid":true,"last_attempt_epoch":1789930298,"last_success_epoch":1789930298,"logical_id":"control-bootstrap-v2","quorum":null,"replica_count":null,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":28977},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct110.json","generation":"v2-ct110-20260920T181158Z-25703b1ef77f","green_verified":false,"json_valid":true,"last_attempt_epoch":1789928120,"last_success_epoch":1789928120,"logical_id":"ct110","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":31155},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct111.json","generation":"v2-ct111-20260920T200749Z-a2bac7e3ecb7","green_verified":false,"json_valid":true,"last_attempt_epoch":1789935021,"last_success_epoch":1789935021,"logical_id":"ct111","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":24254},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct112.json","generation":"v2-ct112-20260920T214958Z-30e3291e1543","green_verified":false,"json_valid":true,"last_attempt_epoch":1789941076,"last_success_epoch":1789941076,"logical_id":"ct112","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":18199},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct113.json","generation":"v2-ct113-20260920T222532Z-4f4a608def82","green_verified":false,"json_valid":true,"last_attempt_epoch":1789943241,"last_success_epoch":1789943241,"logical_id":"ct113","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":16034},{"consecutive_failures":5,"failure_backoff_seconds":21600,"file":"guest-pve01-lxc-112.json","generation":null,"green_verified":null,"json_valid":true,"last_attempt_epoch":1789938729,"last_success_epoch":1789799511,"logical_id":"guest-pve01-lxc-112","quorum":null,"replica_count":null,"result":"FAIL","retry_count":null,"status":null,"success_age_sec":159764},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"md-relay.json","generation":"v2-md-relay-20260920T140452Z-1943a8c57bd6","green_verified":false,"json_valid":true,"last_attempt_epoch":1789913115,"last_success_epoch":1789913115,"logical_id":"md-relay","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":46160},{"consecutive_failures":null,"failure_backoff_seconds":null,"file":"node-pve01.json","generation":"v2-node-pve01-20260915T040859Z-9187f2b9a0b4","green_verified":true,"json_valid":true,"last_attempt_epoch":null,"last_success_epoch":1789445359,"logical_id":"node-pve01","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":513916},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"node-pve02.json","generation":"v2-node-pve02-20260918T011512Z-59f345bf9a9b","green_verified":false,"json_valid":true,"last_attempt_epoch":1789694135,"last_success_epoch":1789694135,"logical_id":"node-pve02","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":265140},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"node-pve03.json","generation":"v2-node-pve03-20260918T015457Z-204ac5a3eb03","green_verified":false,"json_valid":true,"last_attempt_epoch":1789696518,"last_success_epoch":1789696518,"logical_id":"node-pve03","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":262757},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"router-netcraze.json","generation":"v2-router-netcraze-20260920T155444Z-a91b2efdb4fe","green_verified":false,"json_valid":true,"last_attempt_epoch":1789919711,"last_success_epoch":1789919711,"logical_id":"router-netcraze","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":39564},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"spb-ingress.json","generation":"v2-spb-ingress-20260920T151616Z-9d80091d0c4c","green_verified":false,"json_valid":true,"last_attempt_epoch":1789917397,"last_success_epoch":1789917397,"logical_id":"spb-ingress","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":41878},{"consecutive_failures":10,"failure_backoff_seconds":21600,"file":"us-netbird.json","generation":"v2-us-netbird-20260921T015632Z-dc499030a55f","green_verified":null,"json_valid":true,"last_attempt_epoch":1789955807,"last_success_epoch":1789704670,"logical_id":"us-netbird","quorum":null,"replica_count":null,"result":"FAIL","retry_count":null,"status":null,"success_age_sec":254605},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm130.json","generation":"v2-vm130-20260920T233759Z-c9518c8be2c3","green_verified":false,"json_valid":true,"last_attempt_epoch":1789948633,"last_success_epoch":1789948633,"logical_id":"vm130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":10642},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm150.json","generation":"v2-vm150-20260920T230035Z-e0880e47ea55","green_verified":false,"json_valid":true,"last_attempt_epoch":1789945347,"last_success_epoch":1789945347,"logical_id":"vm150","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":13928},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm160.json","generation":"v2-vm160-20260921T001432Z-31df1acfee7a","green_verified":false,"json_valid":true,"last_attempt_epoch":1789950100,"last_success_epoch":1789950100,"logical_id":"vm160","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":9175},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm170.json","generation":"v2-vm170-20260921T023516Z-53ad6a6b10f9","green_verified":false,"json_valid":true,"last_attempt_epoch":1789958880,"last_success_epoch":1789958880,"logical_id":"vm170","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":395},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm171.json","generation":"v2-vm171-20260921T004759Z-537db1552014","green_verified":false,"json_valid":true,"last_attempt_epoch":1789951877,"last_success_epoch":1789951877,"logical_id":"vm171","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":7398},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm190.json","generation":"v2-vm190-20260921T012544Z-298b64987988","green_verified":false,"json_valid":true,"last_attempt_epoch":1789954139,"last_success_epoch":1789954139,"logical_id":"vm190","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":5136},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm210.json","generation":"v2-vm210-20260920T203832Z-458da35ec027","green_verified":false,"json_valid":true,"last_attempt_epoch":1789936798,"last_success_epoch":1789936798,"logical_id":"vm210","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":22477},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm211.json","generation":"v2-vm211-20260919T203132Z-82878bb22008","green_verified":false,"json_valid":true,"last_attempt_epoch":1789849984,"last_success_epoch":1789849984,"logical_id":"vm211","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":109291},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm9130.json","generation":"v2-vm9130-20260919T210758Z-0aa987efac8c","green_verified":false,"json_valid":true,"last_attempt_epoch":1789853557,"last_success_epoch":1789853557,"logical_id":"vm9130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":105718},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-codevipe.json","generation":"v2-xf-codevipe-20260920T162616Z-da4e8fcf3129","green_verified":false,"json_valid":true,"last_attempt_epoch":1789922324,"last_success_epoch":1789922324,"logical_id":"xf-codevipe","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":36951},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-dsmods.json","generation":"v2-xf-dsmods-20260919T214716Z-c783be0bd209","green_verified":false,"json_valid":true,"last_attempt_epoch":1789860411,"last_success_epoch":1789860411,"logical_id":"xf-dsmods","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":98864},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-gamevipe.json","generation":"v2-xf-gamevipe-20260920T015714Z-762dbd7ce0d7","green_verified":false,"json_valid":true,"last_attempt_epoch":1789882268,"last_success_epoch":1789882268,"logical_id":"xf-gamevipe","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":77007},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-hkmods.json","generation":"v2-xf-hkmods-20260920T071214Z-6407219f0624","green_verified":false,"json_valid":true,"last_attempt_epoch":1789906789,"last_success_epoch":1789906789,"logical_id":"xf-hkmods","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":52486},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-kingofwolk.json","generation":"v2-xf-kingofwolk-20260919T232652Z-cb0189b2b0ba","green_verified":false,"json_valid":true,"last_attempt_epoch":1789861037,"last_success_epoch":1789861037,"logical_id":"xf-kingofwolk","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":98238},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-newfi.json","generation":"v2-xf-newfi-20260920T004616Z-6be6559a5589","green_verified":false,"json_valid":true,"last_attempt_epoch":1789865619,"last_success_epoch":1789865619,"logical_id":"xf-newfi","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":93656},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-zakrutim.json","generation":"v2-xf-zakrutim-20260920T173658Z-a8de3568c79b","green_verified":false,"json_valid":true,"last_attempt_epoch":1789926652,"last_success_epoch":1789926652,"logical_id":"xf-zakrutim","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":32623}] +ACTIVE_WITHOUT_V2_STATE=["app-filebrowser","app-hbarhub","app-immich","app-skladchik-reports-monitor","vm110","vm111","vm112","vm113"] +ACTIVE_STATE_SUMMARY=[{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"control-bootstrap-v2.json","generation":"control-bootstrap-v2-pve01-20260916T120057Z","green_verified":null,"json_valid":true,"last_attempt_epoch":1789930298,"last_success_epoch":1789930298,"logical_id":"control-bootstrap-v2","quorum":null,"replica_count":null,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":28977},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm130.json","generation":"v2-vm130-20260920T233759Z-c9518c8be2c3","green_verified":false,"json_valid":true,"last_attempt_epoch":1789948633,"last_success_epoch":1789948633,"logical_id":"vm130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":10642},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm150.json","generation":"v2-vm150-20260920T230035Z-e0880e47ea55","green_verified":false,"json_valid":true,"last_attempt_epoch":1789945347,"last_success_epoch":1789945347,"logical_id":"vm150","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":13928},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm160.json","generation":"v2-vm160-20260921T001432Z-31df1acfee7a","green_verified":false,"json_valid":true,"last_attempt_epoch":1789950100,"last_success_epoch":1789950100,"logical_id":"vm160","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":9175},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm170.json","generation":"v2-vm170-20260921T023516Z-53ad6a6b10f9","green_verified":false,"json_valid":true,"last_attempt_epoch":1789958880,"last_success_epoch":1789958880,"logical_id":"vm170","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":395},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm171.json","generation":"v2-vm171-20260921T004759Z-537db1552014","green_verified":false,"json_valid":true,"last_attempt_epoch":1789951877,"last_success_epoch":1789951877,"logical_id":"vm171","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":7398},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm190.json","generation":"v2-vm190-20260921T012544Z-298b64987988","green_verified":false,"json_valid":true,"last_attempt_epoch":1789954139,"last_success_epoch":1789954139,"logical_id":"vm190","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":5136},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm9130.json","generation":"v2-vm9130-20260919T210758Z-0aa987efac8c","green_verified":false,"json_valid":true,"last_attempt_epoch":1789853557,"last_success_epoch":1789853557,"logical_id":"vm9130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":105718}] +V2_WRAPPER_META={"exists":true,"is_symlink":false,"sha256":"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2"} +V2_SOURCE_HINTS=[{"file":"/usr/local/sbin/.homelab-command-adapter.new.1544389","line":1089,"text":" \"capsule retry client IP mismatch\""},{"file":"/usr/local/sbin/.homelab-command-adapter.new.1544389","line":1118,"text":" \"idempotent_retry\": True,"},{"file":"/usr/local/sbin/__pycache__/homelab-backup-matrix-refreshcpython-313.pyc","line":171,"text":"age_seconds\ufffd\u0017generated_health_output)\u0003rk\u0000\u0000\u0000\ufffd\tfreshnessr}\u0000\u0000\u0000r&\u0000\u0000\u0000\ufffd\u0006shadowz\u0007STATUS=z\u0003TS=z\u0007JOB_ID=z\tJOB_NAME=z"},{"file":"/usr/local/sbin/__pycache__/homelab-backup-matrix-refreshcpython-313.pyc","line":176,"text":"FRESHNESS=z\u0004.txtr1\u0000\u0000\u0000\ufffd\u0015compatibility_outputs\ufffd"},{"file":"/usr/local/sbin/__pycache__/homelab-reference-refreshcpython-313.pyc","line":107,"text":"Nr\u0003\u0000\u0000\u0000\ufffd\u0011freshness_secondsi\u0010\u000e\u0000\u0000)\u0001\ufffd\u0007seconds)\u0003\ufffd\u0006source\ufffd"},{"file":"/usr/local/sbin/__pycache__/homelab-safe-runcpython-313.pyc","line":23,"text":"kb/lessons/known_failures.jsonz!kb/current/02_FRESHNESS_POLICY.md\ufffd\u001fkb/policies/command_policy.jsonz"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":5,"text":"PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":14,"text":"FRESHNESS_SECONDS=\"$(\"$REGISTRY_HELPER\" freshness-seconds APP)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":16,"text":"(( DUE_SECONDS > 0 && DUE_SECONDS < FRESHNESS_SECONDS )) || { printf 'APP_QUORUM_QUEUE_ERROR=DUE_THRESHOLD_INVALID\\n' >&2; exit 65; }"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":31,"text":"freshness_decision(){"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":39,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_RESUME GENERATION=%s\\n' \"$app\" \"$generation\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":45,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_EPOCH_INVALID\\n' \"$app\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":50,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=SKIP_FRESH GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":51,"text":" elif (( age >= DUE_SECONDS && age < FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":52,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_DUE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":53,"text":" elif (( age >= FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":54,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_STALE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":56,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_TIMESTAMP_IN_FUTURE GENERATION=%s AGE_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":60,"text":" printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED\\n' \"$app\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":63,"text":" die \"FRESHNESS_DECISION_INVALID_${app}_${decision:-EMPTY}\" 65"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":67,"text":"freshness_plan(){"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":69,"text":" [[ -x \"$PROBE\" && ! -L \"$PROBE\" ]] || die FRESHNESS_PROBE_NOT_INSTALLED 69"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":72,"text":" out=\"$(freshness_decision \"$a\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":74,"text":" decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$out\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":75,"text":" [[ -n \"$decision\" ]] || die \"FRESHNESS_PLAN_DECISION_MISSING_$a\" 65"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":76,"text":" printf 'QUEUE_FRESHNESS_PLAN APP=%s DECISION=%s\\n' \"$a\" \"$decision\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":90,"text":" freshness_plan"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":93,"text":" local a=\"$1\" freshness decision now_epoch out generation"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":107,"text":" freshness=\"$(exec 8>&-; exec 9>&-; freshness_decision \"$a\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":108,"text":" printf '%s\\n' \"$freshness\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":109,"text":" decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":112,"text":" generation=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^GENERATION=/){sub(/^GENERATION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":117,"text":" *) die \"FRESHNESS_RECHECK_INVALID_${a}_${decision:-EMPTY}\" 65 ;;"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":150,"text":" freshness-plan) [[ \"$#\" == 1 ]] || die USAGE_FRESHNESS_PLAN 64; freshness_plan ;;"},{"file":"/usr/local/sbin/homelab-backup-audit","line":12,"text":"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-audit","line":14,"text":"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-audit","line":105,"text":" value=\"$(awk -F= '$1==\"FRESHNESS_SECONDS\"{print $2; exit}' \"$file\")\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":140,"text":" printf 'CONTRACT|task=%s|target_registry=CANONICAL|vm_count=%s|app_count=%s|control_sla_seconds=%s|retention=ACTIVE_OWNER_AWARE|provider_worm=NOT_PROVEN_SKIPPED|dr_proof_source=EXACT_SITE_DR_FINAL_SEAL|legacy_site_dr_seal=AUTHORITATIVE|control_freshness=RECURRING_PRODUCER_12H_DUE_24H_SLA|full_site_dr=PROVEN_BY_SEAL\\n' \"$TASK_ID\" \"${#VMIDS[@]}\" \"${#APPS[@]}\" \"$CONTROL_SLA_SECONDS\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":153,"text":" all|write-health|scheduled) ;;"},{"file":"/usr/local/sbin/homelab-backup-audit","line":154,"text":" *) die \"USAGE_all_write-health_scheduled_contract\" 64 ;;"},{"file":"/usr/local/sbin/homelab-backup-audit","line":166,"text":"vm_sla=\"$(\"$REGISTRY_HELPER\" freshness-seconds VM)\" || die VM_SLA_UNREADABLE"},{"file":"/usr/local/sbin/homelab-backup-audit","line":167,"text":"app_sla=\"$(\"$REGISTRY_HELPER\" freshness-seconds APP)\" || die APP_SLA_UNREADABLE"},{"file":"/usr/local/sbin/homelab-backup-audit","line":220,"text":" freshness_status=\"$(field FRESHNESS_STATUS <<<\"$out\")\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":223,"text":" if [[ \"$freshness_status\" != OK ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":260,"text":" freshness_status=\"$(field FRESHNESS_STATUS <<<\"$out\")\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":263,"text":" if [[ \"$freshness_status\" != OK ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":345,"text":"printf 'CONTROL|state=%s|CONTROL_FRESHNESS=%s|generation=%s|age_seconds=%s|sla_seconds=%s|archive_size_bytes=%s|restore_evidence_checked=%s|source_coverage=RESTORE_EVIDENCE|retention=ACTIVE_OWNER_AWARE\\n' \"$control_status\" \"$control_status\" \"$control_generation\" \"$control_age\" \"$CONTROL_SLA_SECONDS\" \"$control_archive_size\" \"$control_checked\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":391,"text":"if [[ \"$mode\" == write-health || \"$mode\" == scheduled ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":402,"text":"scheduler_ok=0"},{"file":"/usr/local/sbin/homelab-backup-audit","line":412,"text":" if [[ \"$load_state\" == loaded && \"$unit_file_state\" == enabled && \"$active_state\" == active && \"$result\" != failed && \"$service_result\" != failed ]]; then status=OK; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi"},{"file":"/usr/local/sbin/homelab-backup-audit","line":415,"text":" if [[ \"$load_state\" == not-found && \"$active_state\" == inactive ]]; then status=EXPECTED_ABSENT; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi"},{"file":"/usr/local/sbin/homelab-backup-audit","line":527,"text":"(( stale > 0 )) && add_risk HIGH RPO_BREACH"},{"file":"/usr/local/sbin/homelab-backup-audit","line":536,"text":"printf 'SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=%s|RISK_SEVERITY=%s|RISK_REASONS=%s|DR_PROOF_STATUS=%s|CONTROL_FRESHNESS=%s|LIFECYCLE_STATUS=%s|VM_COUNT=%s|APP_COUNT=%s|FRESH=%s|STALE=%s|RESUME=%s|UNVERIFIED=%s|CONTROL_STATE=%s|CLOUD_OK=%s|SCHEDULER_OK=%s|SOURCE_OK=%s|SOURCE_DRIFT=%s|STAGING_BAD=%s|STAGING_WARN=%s|PAYLOAD_LEAKS=%s|RETENTION_STATUS=%s|OBSERVABILITY=%s|SIZE_ANOMALIES=%s|CAPACITY=%s|GLOBAL_DR_PROVEN=%s\\n' \"$backup_status\" \"$risk_severity\" \"$risk_reasons\" \"$dr_proof_status\" \"$control_status\" \"$lifecycle_status\" \"$vm_seen\" \"$app_seen\" \"$fresh\" \"$stale\" \"$resume\" \"$unverified\" \"$control_status\" \"$cloud_ok\" \"$scheduler_ok\" \"$source_ok\" \"$source_drift\" \"$staging_bad\" \"$staging_warn\" \"$payload_leaks\" \"$retention_status\" \"$observability_status\" \"$size_anomaly_count\" \"$capacity_status\" \"$global_dr_proven\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":538,"text":"if [[ \"$mode\" == write-health || \"$mode\" == scheduled ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":541,"text":" jq -n --arg task \"$TASK_ID\" --arg change \"$CHANGE_ID\" --arg at \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" --arg backup \"$backup_status\" --arg risk \"$risk_severity\" --arg reasons \"$risk_reasons\" --arg control \"$control_status\" --arg dr \"$dr_proof_status\" --arg lifecycle \"$lifecycle_status\" --arg escrow \"$escrow_status\" --arg staging \"$staging_status\" --arg retention \"$retention_status\" --arg observability \"$observability_status\" --arg capacity \"$capacity_status\" --argjson historical \"$historical_gc_proven\" --argjson owner_gc \"$owner_aware_gc_proven\" --argjson staging_bad \"$staging_bad\" --argjson staging_warn \"$staging_warn\" --argjson vm_count \"$vm_seen\" --argjson app_count \"$app_seen\" --argjson fresh \"$fresh\" --argjson stale \"$stale\" --argjson resume \"$resume\" --argjson unverified \"$unverified\" --argjson cloud_ok \"$cloud_ok\" --argjson scheduler_ok \"$scheduler_ok\" --argjson source_ok \"$source_ok\" --argjson source_drift \"$source_drift\" --argjson payload_leaks \"$payload_leaks\" --argjson size_anoma"},{"file":"/usr/local/sbin/homelab-backup-dispatcher","line":15,"text":" if [[ \"$kind\" == VM ]]; then [[ \"$line\" == QUEUE_FRESHNESS\\ VMID=* ]] || continue; else [[ \"$line\" == QUEUE_FRESHNESS\\ APP=* ]] || continue; fi"},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":3,"text":"OUT=\"${HL_OUTPUT_DIR:-/var/log/homelab-backup-freshness}\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":38,"text":" echo \"# HELP homelab_backup_freshness_artifact_candidates_total Backup artifact candidates found by safe local collector.\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":39,"text":" echo \"# TYPE homelab_backup_freshness_artifact_candidates_total gauge\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":40,"text":" echo \"homelab_backup_freshness_artifact_candidates_total $TOTAL\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":41,"text":" echo \"# HELP homelab_backup_freshness_newest_artifact_age_seconds Age of newest backup-like artifact candidate in seconds, -1 if none.\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":42,"text":" echo \"# TYPE homelab_backup_freshness_newest_artifact_age_seconds gauge\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":43,"text":" echo \"homelab_backup_freshness_newest_artifact_age_seconds $AGE\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":44,"text":" echo \"# HELP homelab_backup_freshness_run_success Last backup freshness collector run status.\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":45,"text":" echo \"# TYPE homelab_backup_freshness_run_success gauge\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":46,"text":" echo \"homelab_backup_freshness_run_success 1\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":47,"text":"} > \"$TEXTFILE/homelab_backup_freshness.prom\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":48,"text":"chmod 0644 \"$TEXTFILE/homelab_backup_freshness.prom\""},{"file":"/usr/local/sbin/homelab-backup-matrix-refresh","line":112,"text":" freshness=\"UNKNOWN\" if age<0 else (\"FRESH\" if age<=max_age else \"STALE\")"},{"file":"/usr/local/sbin/homelab-backup-matrix-refresh","line":114,"text":" result={\"id\":jid,\"name\":name,\"category\":job.get(\"category\",\"unknown\"),\"critical\":critical,\"timer\":timer,\"service\":service,\"timer_enabled\":enabled,\"timer_active\":active,\"status\":final,\"source_kind\":source_kind,\"evidence_level\":evidence_level,\"service_result\":service_result,\"service_exec_main_status\":service_exec_main_status,\"source_health\":source,\"source_status\":source_status,\"source_mtime\":source_mtime,\"age_seconds\":age,\"max_age_seconds\":max_age,\"freshness\":freshness,\"generated_health_output\":job.get(\"generated_health_output\",\"\")}"},{"file":"/usr/local/sbin/homelab-backup-matrix-refresh","line":116,"text":" mode_value=matrix.get(\"mode\",\"shadow\"); lines=[f\"STATUS={final}\",f\"TS={now_iso}\",\"TYPE=backup-matrix-generated\",f\"JOB_ID={jid}\",f\"JOB_NAME={name}\",f\"MATRIX_MODE={mode_value}\",f\"TIMER={timer}\",f\"SERVICE={service}\",f\"TIMER_ENABLED={enabled}\",f\"TIMER_ACTIVE={active}\",f\"SOURCE_KIND={source_kind}\",f\"EVIDENCE_LEVEL={evidence_level}\",f\"SERVICE_RESULT={service_result}\",f\"SERVICE_EXEC_MAIN_STATUS={service_exec_main_status}\",f\"SOURCE_HEALTH={source}\",f\"SOURCE_STATUS={source_status}\",f\"SOURCE_MTIME_UTC={source_mtime}\",f\"AGE_SECONDS={age}\",f\"MAX_AGE_SECONDS={max_age}\",f\"FRESHNESS={freshness}\"]"},{"file":"/usr/local/sbin/homelab-backup-npmplus-kuma-configs","line":70,"text":" SELECT id || char(124) || name || char(124) || type || char(124) || url || char(124) || keyword || char(124) || interval || char(124) || maxretries || char(124) || retry_interval || char(124) || active"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":19,"text":"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":20,"text":"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":433,"text":"scheduled(){"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":434,"text":" exec 5>\"$LOCK\"; flock -n 5 || { printf 'GC_SCHEDULED=SKIP|reason=GC_LOCK_BUSY\\n'; return 0; }"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":443,"text":" if (( count == 0 && open_tx == 0 )); then write_health \"$p1\" true 0; cat \"$p1\"; printf 'GC_SCHEDULED=OK|deleted=0|transactions_resumed=0\\n'; return 0; fi"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":444,"text":" if ! acquire_gc_locks; then write_health \"$p1\" true 0; printf 'GC_SCHEDULED=SKIP|reason=BACKUP_LOCK_BUSY|candidates=%s|open_transactions=%s\\n' \"$count\" \"$open_tx\"; return 0; fi"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":449,"text":" if (( count == 0 )); then write_health \"$p2\" true 0; cat \"$p2\"; printf 'GC_SCHEDULED=OK|deleted=0|transactions_resumed=%s\\n' \"$open_tx\"; return 0; fi"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":450,"text":" cmp -s <(grep '^DELETE|' \"$p1\" | stable_delete_set) <(grep '^DELETE|' \"$p2\" | stable_delete_set) || { write_health \"$p2\" true 0; printf 'GC_SCHEDULED=SKIP|reason=PLAN_CHANGED_AFTER_LOCK\\n'; return 0; }"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":454,"text":" printf 'GC_SCHEDULED=OK|deleted=%s|transactions_resumed=%s\\n' \"$deleted\" \"$open_tx\""},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":462,"text":" scheduled) scheduled ;;"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":463,"text":" *) die USAGE_contract_plan_canary_activate_scheduled 64 ;;"},{"file":"/usr/local/sbin/homelab-backup-sla-health","line":20,"text":"echo \"## App backup freshness\" >> \"$REPORT\""},{"file":"/usr/local/sbin/homelab-backup-sla-health","line":50,"text":"echo \"## Emergency backup freshness\" >> \"$REPORT\""},{"file":"/usr/local/sbin/homelab-backup-v2","line":5,"text":"EXPECTED={'fresh_lxc_helper.py': 'dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011', 'producer_exec_helper.py': 'b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3', 'lxc_adapter.py': '3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d', 'qemu_adapter.py': '1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b', 'scheduler_adapter.py': 'a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96', 'entry504.py': 'ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793'}"},{"file":"/usr/local/sbin/homelab-command-adapter","line":1089,"text":" \"capsule retry client IP mismatch\""},{"file":"/usr/local/sbin/homelab-command-adapter","line":1118,"text":" \"idempotent_retry\": True,"},{"file":"/usr/local/sbin/homelab-control-backup","line":105,"text":" tmp=\"${HEALTH}.new.$$\"; jq -n --arg gen \"$gen\" --arg state \"$state\" --arg evidence \"$EVIDENCE_ROOT/$gen.json\" --arg sha \"$archive_sha\" --arg now \"$now\" '{schema:\"homelab-control-backup-health-v1\",status:\"OK\",generation:$gen,state_file:$state,restore_evidence:$evidence,archive_sha256:$sha,cloud_quorum:2,control_freshness:\"FRESH\",full_site_dr_proven:false,updated_at_utc:$now}' >\"$tmp\"; chmod 0644 \"$tmp\"; mv -f \"$tmp\" \"$HEALTH\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":13,"text":"LOCK=/run/homelab-edge-vm-offhost-freshness.lock"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":23,"text":" printf 'STATUS=ERROR TS=%s TYPE=edge-vm-offhost-freshness BAD=1 REASON=%s\\n' \"$TS\" \"$reason\" >\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":24,"text":" chmod 0644 \"$HEALTH_DIR/edge-vm-offhost-freshness.txt\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":25,"text":" printf 'STATUS=ERROR TS=%s TYPE=edge-vm-offhost-freshness BAD=1 REASON=%s\\n' \"$TS\" \"$reason\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":153,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-offhost-freshness BAD=0 VMID=%s SOURCE_NODE=%s DEST_NODE=%s SRC=%s DEST=%s SIZE=%s SHA256=%s COPY_STATUS=%s ZSTD_RC=0 VMA_RC=0 KEEP=%s\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":155,"text":" >\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":156,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-backup NODE=%s VMID=%s ARCHIVE=%s SIZE=%s SHA256=%s NOTES=nightly_existing_dump_freshness\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":159,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-offhost NODE=%s VMID=%s HOST=%s DEST=%s SIZE=%s SHA256=%s NOTES=nightly_existing_dump_freshness\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":162,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-restore-verify HOST=%s VMID=%s ARCHIVE=%s SIZE=%s SHA256=%s ZSTD_RC=0 VMA_RC=0 NOTES=nightly_existing_dump_freshness\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":166,"text":" \"$HEALTH_DIR/edge-vm-offhost-freshness.txt\" \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":171,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-offhost-freshness BAD=0 COPY_STATUS=%s SIZE=%s SHA256=%s DEST=%s COMPLETE_COUNT=%s KEEP=%s\\n' \\"},{"file":"/usr/local/sbin/homelab-final-readiness-gate","line":18,"text":"check \"backup framework evidence\" bash -c \"grep -q STATUS=OK /var/lib/homelab-health/backup-framework.txt && grep -q SOURCE_STATUS=OK /var/lib/homelab-health/backup-framework.txt && grep -q FRESHNESS=FRESH /var/lib/homelab-health/backup-framework.txt\""},{"file":"/usr/local/sbin/homelab-mail-cloud-edge-vm-upload","line":7,"text":"SOURCE_HEALTH=/var/lib/homelab-health/edge-vm-offhost-freshness.txt"},{"file":"/usr/local/sbin/homelab-mailru-trash-gc","line":183,"text":" \"trash_debt_bytes\":\"UNKNOWN_PROVIDER_API\",\"last_success\":s}"},{"file":"/usr/local/sbin/homelab-reference-refresh","line":34,"text":" f=int(json.loads((R/\"manifest.json\").read_text()).get(\"freshness_seconds\",{}).get(s,3600));z=(t+datetime.timedelta(seconds=f)).isoformat()"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":219,"text":" \"task_id\":\"backup-rotating-boot-drill-escrow-freshness-v1\","},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":444,"text":" return {\"schema\":\"homelab-rotating-boot-drill-state-v1\",\"sequence\":0,\"qemu_cursor\":None,\"lxc_cursor\":None,\"last_success_utc\":None,\"last_evidence\":None}"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":651,"text":" print(f\"BOOT_DRILL_SCHEDULED=DEFERRED|reason={code}\")"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":688,"text":" wait=int(p[\"initial_lock_wait_seconds\"] if mode==\"initial\" else p[\"scheduled_lock_wait_seconds\"])"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":734,"text":" \"qemu_cursor\":q,\"lxc_cursor\":l,\"last_success_utc\":evidence[\"completed_at_utc\"],"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":749,"text":" if mode==\"scheduled\" and e.code in (\"BACKUP_LOCK_BUSY\",\"ESCROW_SEMANTIC_PROOF_STALE\",\"CURRENT_BACKUP_AUDIT_NOT_DR_READY\",\"NO_QEMU_GUEST_AGENT_ELIGIBLE\",\"NO_LXC_RUNNING_ELIGIBLE\",\"STAGE_CAPACITY_INSUFFICIENT\",\"LOCAL_LVM_CAPACITY_INSUFFICIENT\"):"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":793,"text":" elif action==\"scheduled\":"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":794,"text":" execute(\"scheduled\",p)"},{"file":"/usr/local/sbin/homelab-safe-run","line":11,"text":" \"kb/lessons/known_failures.json\",\"kb/current/02_FRESHNESS_POLICY.md\","},{"file":"/usr/local/sbin/homelab-vm-backup-health","line":20,"text":"if systemctl is-active --quiet homelab-edge-vm-offhost-freshness.timer; then DETAILS=\"$DETAILS edge-freshness-timer=active\"; else BAD=$((BAD+1)); DETAILS=\"$DETAILS edge-freshness-timer=bad\"; fi"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":6,"text":"PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":9,"text":"FRESHNESS_SECONDS=72000"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":16,"text":"(( DUE_SECONDS > 0 && DUE_SECONDS < FRESHNESS_SECONDS )) || die DUE_THRESHOLD_INVALID 65"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":80,"text":"freshness_decision(){"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":88,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_RESUME GENERATION=%s\\n' \"$vmid\" \"$generation\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":94,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_EPOCH_INVALID\\n' \"$vmid\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":99,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=SKIP_FRESH GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":100,"text":" elif (( age >= DUE_SECONDS && age < FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":101,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_DUE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":102,"text":" elif (( age >= FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":103,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_STALE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":105,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_TIMESTAMP_IN_FUTURE GENERATION=%s AGE_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":109,"text":" printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED\\n' \"$vmid\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":112,"text":" die \"FRESHNESS_DECISION_INVALID_${vmid}_${decision:-EMPTY}\" 65"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":116,"text":"freshness_plan(){"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":118,"text":" [[ -x \"$PROBE\" ]] || die \"FRESHNESS_PROBE_NOT_INSTALLED\" 69"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":121,"text":" out=\"$(freshness_decision \"$vmid\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":123,"text":" decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$out\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":124,"text":" [[ -n \"$decision\" ]] || die \"FRESHNESS_PLAN_DECISION_MISSING_$vmid\" 65"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":125,"text":" printf 'QUEUE_FRESHNESS_PLAN VMID=%s DECISION=%s\\n' \"$vmid\" \"$decision\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":144,"text":" freshness_plan"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":147,"text":" local vmid=\"$1\" freshness decision now_epoch out generation"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":161,"text":" freshness=\"$(exec 8>&-; exec 9>&-; freshness_decision \"$vmid\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":162,"text":" printf '%s\\n' \"$freshness\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":163,"text":" decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":166,"text":" generation=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^GENERATION=/){sub(/^GENERATION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":171,"text":" *) die \"FRESHNESS_RECHECK_INVALID_${vmid}_${decision:-EMPTY}\" 65 ;;"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":188,"text":" freshness-plan)"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":189,"text":" [[ \"$#\" == 1 ]] || die \"USAGE_FRESHNESS_PLAN\" 64"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":190,"text":" freshness_plan"},{"file":"/usr/local/sbin/skladchik-reports-monitor-status","line":44,"text":"CANONICAL_PROBE=\"/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\""},{"file":"/usr/local/sbin/skladchik-reports-monitor-status","line":52,"text":" grep -q '^FRESHNESS_STATUS=OK$' <<<\"$CANONICAL_OUTPUT\" || PROBLEMS=$((PROBLEMS+1))"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":24,"text":"APP_FRESHNESS_PROBE = Path(\"/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\")"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":132,"text":"# HOMELAB_COOKIE_JAR_RETRY_423"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":225,"text":" shlex.quote(str(APP_FRESHNESS_PROBE)) + \" decision skladchik-reports-monitor\","},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":230,"text":" facts[\"canonical_backup_status\"] = probe.get(\"FRESHNESS_STATUS\", \"MISSING\")"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":239,"text":" if probe.get(\"FRESHNESS_STATUS\") != \"OK\":"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":286,"text":" f\"- freshness status: {facts.get('canonical_backup_status')}\","}] +CLOUD_STATE={"A":{"about":{"free":293208518329,"total":1099511627776,"used":806303109447},"about_rc":0,"lsf_rc":0,"stderr_lines":[],"top_dirs_count":26},"B":{"about":{"free":293208454470,"total":1099511627776,"used":806303173306},"about_rc":0,"lsf_rc":0,"stderr_lines":[],"top_dirs_count":26}} +CLOUD_B_RESTORE_CANDIDATES=[] +CLOUD_B_RESTORE_PREFERRED=null +RETENTION_IMPLEMENTATION=[{"bytes":327,"interface_lines":[{"line":2,"text":"Description=Homelab owner-aware cloud retention GC"},{"line":5,"text":"ConditionPathExists=/usr/local/sbin/homelab-backup-retention-gc"},{"line":9,"text":"ExecStart=/usr/local/sbin/homelab-backup-retention-gc scheduled"},{"line":11,"text":"IOSchedulingClass=best-effort"}],"path":"/etc/systemd/system/homelab-backup-retention-gc.service","sha256":"0c49e10bdb225eeca0af5fca80aaf109addec2b18a6b892c0fe17c28b656ad7c"},{"bytes":237,"interface_lines":[{"line":2,"text":"Description=Run homelab owner-aware cloud retention GC daily"},{"line":9,"text":"Unit=homelab-backup-retention-gc.service"}],"path":"/etc/systemd/system/homelab-backup-retention-gc.timer","sha256":"a0e763670745a5ef7c04b54da23114a013f47075cf36cceef0218bae9b82ea2f"},{"bytes":7123,"interface_lines":[{"line":23,"text":"KEEP=\"${10:?keep}\""},{"line":132,"text":" [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":138,"text":" plan)"},{"line":146,"text":" printf 'REMOTE_PLAN_STATUS=OK\\n'"},{"line":154,"text":" [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":167,"text":" [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":184,"text":" [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":206,"text":" [[ \"$(complete_count)\" == \"$KEEP\" ]]"}],"path":"/usr/local/libexec/homelab-edge-vm-offhost-retention-worker","sha256":"ca25a48b00c26e0eb5e64ac7d5e1d8f3805c200e30d9f87c5ef7c8da90402e54"},{"bytes":4296,"interface_lines":[{"line":3,"text":"KEEP=\"${1:-7}\""},{"line":4,"text":"MODE=\"${2:-dry-run}\""},{"line":6,"text":"[[ \"$KEEP\" =~ ^[0-9]+$ ]] || { echo \"BAD KEEP\"; exit 2; }"},{"line":7,"text":"(( KEEP >= 2 )) || { echo \"REFUSE keep<2\"; exit 2; }"},{"line":8,"text":"[[ \"$MODE\" == dry-run || \"$MODE\" == apply ]] || { echo \"BAD MODE\"; exit 2; }"},{"line":31,"text":"WORK=\"$(mktemp -d /tmp/app-retention-dual.XXXXXX)\""},{"line":71,"text":" echo \"remote_index=$INDEX app=$APP canonical=$CANONICAL total=$TOTAL legacy=$LEGACY_TOTAL short=$SHORT_TOTAL keep=$KEEP mode=$MODE latest=${LATEST:-none}\""},{"line":76,"text":" [[ \"$FOUND_LATEST\" -eq 1 ]] || { echo \"REFUSE latest not in retention set remote_index=$INDEX\"; exit 6; }"},{"line":78,"text":" if (( TOTAL <= KEEP )); then echo \"nothing to delete\"; continue; fi"},{"line":79,"text":" DELETE_COUNT=$((TOTAL-KEEP))"},{"line":80,"text":" for ((I=0; I= 2 )) || { echo \"REFUSE keep<2\"; exit 2; }"},{"line":7,"text":"[[ \"$MODE\" == \"dry-run\" || \"$MODE\" == \"apply\" ]] || { echo \"BAD MODE\"; exit 2; }"},{"line":21,"text":" echo \"total=$TOTAL keep=$KEEP mode=$MODE latest=${LATEST:-none}\""},{"line":22,"text":" if (( TOTAL <= KEEP )); then echo \"nothing to delete\"; continue; fi"},{"line":23,"text":" DELETE_COUNT=$((TOTAL-KEEP))"},{"line":24,"text":" for ((i=0; i&2; exit 69; }"},{"line":28,"text":"[[ \"$(sha256sum \"$REGISTRY_HELPER\"|awk '{print $1}')\" == \"$REGISTRY_HELPER_SHA_EXPECTED\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=TARGET_REGISTRY_HELPER_SHA_DRIFT\\n' >&2; exit 65; }"},{"line":29,"text":"\"$REGISTRY_HELPER\" validate >/dev/null || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=TARGET_REGISTRY_INVALID\\n' >&2; exit 66; }"},{"line":30,"text":"[[ -x \"$GFS_HELPER\" && ! -L \"$GFS_HELPER\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_HELPER_MISSING\\n' >&2; exit 69; }"},{"line":31,"text":"[[ \"$(sha256sum \"$GFS_HELPER\"|awk '{print $1}')\" == \"$GFS_HELPER_SHA_EXPECTED\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_HELPER_SHA_DRIFT\\n' >&2; exit 65; }"},{"line":32,"text":"HOMELAB_BACKUP_GFS_POLICY=\"$GFS_POLICY\" \"$GFS_HELPER\" validate >/dev/null || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=GFS_POLICY_INVALID\\n' >&2; exit 66; }"},{"line":35,"text":"GFS_CRITICAL_COUNT=\"$(HOMELAB_BACKUP_GFS_POLICY=\"$GFS_POLICY\" \"$GFS_HELPER\" critical-logicals | wc -l)\""},{"line":36,"text":"VM_KEEP=\"$(\"$REGISTRY_HELPER\" policy-keep VM)\""},{"line":37,"text":"APP_KEEP=\"$(\"$REGISTRY_HELPER\" policy-keep APP)\""},{"line":38,"text":"CONTROL_KEEP=\"$(\"$REGISTRY_HELPER\" policy-keep CONTROL)\""},{"line":39,"text":"MIN_DELETE_AGE_SECONDS=86400"},{"line":42,"text":"die(){ local msg=\"$1\" rc=\"${2:-65}\"; trap - ERR; printf 'GC_STATUS=ERROR|ROOT_CAUSE=%s\\n' \"$msg\" >&2; exit \"$rc\"; }"},{"line":44,"text":"stable_delete_set(){ sed -E 's/\\|age_seconds=[0-9]+$//'; }"},{"line":50,"text":"keep_for(){ \"$REGISTRY_HELPER\" retention-keep \"$1\" 2>/dev/null; }"},{"line":51,"text":"logical_list(){ \"$REGISTRY_HELPER\" retention-logicals; }"},{"line":58,"text":" TMPROOT=\"/run/homelab-retention-gc.$$\""},{"line":74,"text":" jq -e --arg l \"$logical\" --arg g \"$generation\" '.schema==\"homelab-cloud-quorum-payload-v1\" and .logical_id==$l and .generation==$g and .status==\"SEALED\" and .cloud_quorum==2 and .cloud_a_verified==true and .cloud_b_verified==true and .part_hashes_verified==true and .seal_written==true and .cloud_a_seal_verified==true and .cloud_b_seal_verified==true and .local_delete_allowed==true and .local_payload_present==false and .local_cleanup==\"OK\"' <<<\"$json\" >/dev/null"},{"line":106,"text":" f=\"$RETENTION_ROOT/transactions/$logical/$generation.json\""},{"line":111,"text":" f=\"$RETENTION_ROOT/transactions/$logical/$generation.json\""},{"line":117,"text":" [[ -d \"$RETENTION_ROOT/transactions\" ]] || { printf '0\\n'; return 0; }"},{"line":123,"text":" PLANNED|B_DELETED) count=$((count+1)) ;;"},{"line":126,"text":" done < <(find \"$RETENTION_ROOT/transactions\" -type f -name '*.json' -print | LC_ALL=C sort)"},{"line":130,"text":"pinned_delete_contract_enabled(){"},{"line":131,"text":" [[ -n \"${HOMELAB_RETENTION_PINNED_DELETE_FILE:-}\" || -n \"${HOMELAB_RETENTION_PINNED_DELETE_SHA256:-}\" ]]"},{"line":133,"text":"pinned_delete_assert_file(){"},{"line":134,"text":" local f=\"${HOMELAB_RETENTION_PINNED_DELETE_FILE:-}\" expected=\"${HOMELAB_RETENTION_PINNED_DELETE_SHA256:-}\" actual line logical generation owner state_file state_sha count=0"},{"line":135,"text":" [[ -n \"$f\" && -n \"$expected\" ]] || die PINNED_DELETE_CONTRACT_INCOMPLETE 64"},{"line":136,"text":" [[ \"$expected\" =~ ^[0-9a-f]{64}$ ]] || die PINNED_DELETE_SHA_INVALID 64"},{"line":137,"text":" [[ -f \"$f\" && ! -L \"$f\" ]] || die PINNED_DELETE_FILE_UNSAFE 64"},{"line":139,"text":" [[ \"$actual\" == \"$expected\" ]] || die PINNED_DELETE_FILE_SHA_MISMATCH 66"},{"line":141,"text":" [[ -n \"$line\" ]] || die PINNED_DELETE_EMPTY_LINE 66"},{"line":147,"text":" [[ \"$line\" == \"DELETE|logical=$logical|generation=$generation|owner=$owner|state_file=$state_file|state_sha256=$state_sha\" ]] || die PINNED_DELETE_LINE_FORMAT_INVALID 66"},{"line":148,"text":" [[ \"$(node_for_logical \"$logical\")\" == \"$owner\" ]] || die \"PINNED_DELETE_OWNER_INVALID_${logical}\" 66"},{"line":149,"text":" safe_generation \"$logical\" \"$generation\" || die \"PINNED_DELETE_GENERATION_INVALID_${logical}\" 66"},{"line":150,"text":" [[ \"$state_file\" == \"$STATE_ROOT/$logical/$generation.json\" ]] || die \"PINNED_DELETE_STATE_PATH_INVALID_${logical}\" 66"},{"line":151,"text":" [[ \"$state_sha\" =~ ^[0-9a-f]{64}$ ]] || die \"PINNED_DELETE_STATE_SHA_INVALID_${logical}\" 66"},{"line":154,"text":" (( count > 0 )) || die PINNED_DELETE_FILE_EMPTY 66"},{"line":155,"text":" [[ \"$(LC_ALL=C sort \"$f\" | uniq | wc -l)\" == \"$count\" ]] || die PINNED_DELETE_FILE_DUPLICATE 66"},{"line":160,"text":" jq -e --arg task \"$TASK_ID\" --arg change \"$CHANGE_ID\" '.schema==\"homelab-backup-retention-transaction-v1\" and .task_id==$task and .change_id==$change and (.logical_id|type)==\"string\" and (.generation|type)==\"string\" and (.state_sha256|type)==\"string\" and (.status==\"PLANNED\" or .status==\"B_DELETED\" or .status==\"DONE\")' \"$f\" >/dev/null || die \"PINNED_TX_CONTENT_INVALID_$f\" 66"},{"line":165,"text":" expected_path=\"$RETENTION_ROOT/transactions/$logical/$generation.json\""},{"line":167,"text":" printf 'DELETE|logical=%s|generation=%s|owner=%s|state_file=%s|state_sha256=%s\\n' \"$logical\" \"$generation\" \"$owner\" \"$STATE_ROOT/$logical/$generation.json\" \"$state_sha\""},{"line":170,"text":" local root=\"$RETENTION_ROOT/transactions\" f"},{"line":178,"text":" local plan_file=\"$1\" line logical generation reason txf status"},{"line":183,"text":" [[ \"$reason\" == GC_TRANSACTION_PLANNED || \"$reason\" == GC_TRANSACTION_B_DELETED ]] || die \"PINNED_PLAN_UNEXPECTED_PROTECT_${logical}_${generation}_${reason}\" 66"},{"line":184,"text":" txf=\"$RETENTION_ROOT/transactions/$logical/$generation.json\""},{"line":185,"text":" [[ -s \"$txf\" && ! -L \"$txf\" ]] || die \"PINNED_PLAN_PROTECT_TX_MISSING_${logical}_${generation}\" 66"},{"line":187,"text":" [[ \"GC_TRANSACTION_$status\" == \"$reason\" ]] || die \"PINNED_PLAN_PROTECT_STATUS_MISMATCH_${logical}_${generation}\" 66"},{"line":188,"text":" grep -Fqx \"$(pinned_tx_identity \"$txf\")\" \"$HOMELAB_RETENTION_PINNED_DELETE_FILE\" || die \"PINNED_PLAN_PROTECT_NOT_PINNED_${logical}_${generation}\" 66"},{"line":189,"text":" done < <(awk '/^PROTECT\\|/' \"$plan_file\")"},{"line":191,"text":"pinned_assert_delete_scope(){"},{"line":192,"text":" local plan_file=\"$1\" stage=\"$2\" actual expected f count_actual count_expected"},{"line":193,"text":" actual=\"$TMPROOT/pinned-delete-actual.$stage\""},{"line":194,"text":" expected=\"$TMPROOT/pinned-delete-expected.$stage\""},{"line":195,"text":" pinned_delete_assert_file"},{"line":197,"text":" pinned_assert_protect_scope \"$plan_file\""},{"line":198,"text":" awk '/^DELETE\\|/' \"$plan_file\" | stable_delete_set >\"$actual\""},{"line":199,"text":" if [[ -d \"$RETENTION_ROOT/transactions\" ]]; then"},{"line":200,"text":" while IFS= read -r f; do pinned_tx_identity \"$f\" >>\"$actual\"; done < <(find \"$RETENTION_ROOT/transactions\" -type f -name '*.json' -print | LC_ALL=C sort)"},{"line":203,"text":" LC_ALL=C sort \"$HOMELAB_RETENTION_PINNED_DELETE_FILE\" >\"$expected\""},{"line":205,"text":" [[ \"$count_actual\" == \"$count_expected\" ]] || die \"PINNED_DELETE_SCOPE_COUNT_MISMATCH_${stage}\" 66"},{"line":206,"text":" [[ \"$(uniq \"$actual\" | wc -l)\" == \"$count_actual\" ]] || die \"PINNED_DELETE_SCOPE_DUPLICATE_${stage}\" 66"},{"line":207,"text":" cmp -s \"$actual\" \"$expected\" || die \"PINNED_DELETE_SCOPE_MISMATCH_${stage}\" 66"},{"line":208,"text":" printf 'PINNED_DELETE_SCOPE=OK|stage=%s|count=%s|sha256=%s\\n' \"$stage\" \"$count_expected\" \"$HOMELAB_RETENTION_PINNED_DELETE_SHA256\""},{"line":211,"text":" printf 'CONTRACT|task=%s|policy=OWNER_AWARE_SAFE_GC_GFS|target_registry=CANONICAL|vm_keep=%s|app_keep=%s|control_keep=%s|min_delete_age_seconds=%s|gfs_critical=%s|gfs_weekly=%s|gfs_monthly=%s|gfs_completed_periods_only=YES|nonsealed=PROTECT|retired_preserve=PROTECT|unknown_namespace=PROTECT|owner_state_required=YES|both_clouds_required=YES|latest_restore_proven_required=YES|legacy_hb=PROTECT|legacy_pve01=PROTECT|legacy_control=PROTECT\\n' \"$TASK_ID\" \"$VM_KEEP\" \"$APP_KEEP\" \"$CONTROL_KEEP\" \"$MIN_DELETE_AGE_SECONDS\" \"$GFS_CRITICAL_COUNT\" \"$GFS_WEEKLY\" \"$GFS_MONTHLY\""},{"line":218,"text":" if ! HOMELAB_BACKUP_GFS_POLICY=\"$GFS_POLICY\" \"$GFS_HELPER\" is-critical \"$logical\"; then return 0; fi"},{"line":236,"text":"plan(){"},{"line":240,"text":" local now logical node keep lifecycle open_count file json schema lid gen status sha sealed_at epoch age idx tx gfs_bucket candidates=0 protected=0 kept=0 gfs_kept=0"},{"line":246,"text":" if [[ \"$lifecycle\" == ACTIVE ]]; then keep=\"$(keep_for \"$logical\")\" || die \"KEEP_POLICY_UNKNOWN_$logical\"; else keep=0; fi"},{"line":273,"text":" while IFS=$'\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=LOGICAL_HAS_INCOMPLETE\\n' \"$logical\" \"$gen\" \"$node\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \"$TMPROOT/$logical.rows\")"},{"line":277,"text":" while IFS=$'\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=RETIRED_PRESERVE\\n' \"$logical\" \"$gen\" \"$node\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \"$TMPROOT/$logical.rows\")"},{"line":281,"text":" while IFS=$'\\t' read -r gen file sha age node sealed_at; do printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=LATEST_RESTORE_NOT_PROVEN\\n' \"$logical\" \"$gen\" \"$node\"; kept=$((kept+1)); done < <(LC_ALL=C sort -r \"$TMPROOT/$logical.rows\")"},{"line":290,"text":" printf 'RETIRED|logical=%s|generation=%s|owner=%s|reason=GC_ALREADY_DONE\\n' \"$logical\" \"$gen\" \"$node\""},{"line":292,"text":" printf 'PROTECT|logical=%s|generation=%s|owner=%s|reason=GC_TRANSACTION_%s\\n' \"$logical\" \"$gen\" \"$node\" \"$tx\"; protected=$((protected+1))"},{"line":293,"text":" elif (( idx <= keep )); then"},{"line":294,"text":" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=POLICY_NEWEST_%s\\n' \"$logical\" \"$gen\" \"$node\" \"$keep\"; kept=$((kept+1))"},{"line":295,"text":" elif (( age < MIN_DELETE_AGE_SECONDS )); then"},{"line":296,"text":" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=MIN_AGE|age_seconds=%s\\n' \"$logical\" \"$gen\" \"$node\" \"$age\"; kept=$((kept+1))"},{"line":300,"text":" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=GFS_WEEKLY|bucket=%s\\n' \"$logical\" \"$gen\" \"$node\" \"$gfs_bucket\"; kept=$((kept+1)); gfs_kept=$((gfs_kept+1))"},{"line":302,"text":" printf 'KEEP|logical=%s|generation=%s|owner=%s|reason=GFS_MONTHLY|bucket=%s\\n' \"$logical\" \"$gen\" \"$node\" \"$gfs_bucket\"; kept=$((kept+1)); gfs_kept=$((gfs_kept+1))"},{"line":304,"text":" printf 'DELETE|logical=%s|generation=%s|owner=%s|state_file=%s|state_sha256=%s|age_seconds=%s\\n' \"$logical\" \"$gen\" \"$node\" \"$file\" \"$sha\" \"$age\""},{"line":312,"text":" printf 'PLAN_SUMMARY|delete_candidates=%s|protected=%s|kept=%s|vm_keep=%s|app_keep=%s|control_keep=%s|gfs_kept=%s|gfs_critical=%s|gfs_weekly=%s|gfs_monthly=%s\\n' \"$candidates\" \"$protected\" \"$kept\" \"$VM_KEEP\" \"$APP_KEEP\" \"$CONTROL_KEEP\" \"$gfs_kept\" \"$GFS_CRITICAL_COUNT\" \"$GFS_WEEKLY\" \"$GFS_MONTHLY\""},{"line":321,"text":" path=\"$RETENTION_ROOT/transactions/$logical/$generation.json\""},{"line":324,"text":" jq -n --arg task \"$TASK_ID\" --arg change \"$CHANGE_ID\" --arg l \"$logical\" --arg g \"$generation\" --arg s \"$state_sha\" --arg status \"$status\" --arg at \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" --argjson aa \"$a_absent\" --argjson ba \"$b_absent\" '{schema:\"homelab-backup-retention-transaction-v1\",task_id:$task,change_id:$change,logical_id:$l,generation:$g,state_sha256:$s,status:$status,updated_at_utc:$at,remote_a_absent:$aa,remote_b_absent:$ba}' >\"$tmp\""},{"line":328,"text":"apply_delete_line(){"},{"line":343,"text":" (( age >= MIN_DELETE_AGE_SECONDS )) || die \"APPLY_AGE_GUARD_${logical}_${generation}\""},{"line":346,"text":" write_tx \"$logical\" \"$generation\" \"$state_sha\" PLANNED false false"},{"line":348,"text":" remote_generation_present \"$REMOTE_B\" \"$logical\" \"$generation\" && die \"APPLY_REMOTE_B_DELETE_FAILED_${logical}_${generation}\""},{"line":349,"text":" write_tx \"$logical\" \"$generation\" \"$state_sha\" B_DELETED false true"},{"line":351,"text":" remote_generation_present \"$REMOTE_A\" \"$logical\" \"$generation\" && die \"APPLY_REMOTE_A_DELETE_FAILED_${logical}_${generation}\""},{"line":353,"text":" printf 'GC_DELETE_DONE|logical=%s|generation=%s|owner=%s\\n' \"$logical\" \"$generation\" \"$owner\""},{"line":357,"text":" [[ -d \"$RETENTION_ROOT/transactions\" ]] || return 0"},{"line":361,"text":" [[ \"$status\" == PLANNED || \"$status\" == B_DELETED ]] || die \"TX_STATUS_INVALID_$f\""},{"line":372,"text":" if [[ \"$status\" == PLANNED ]]; then"},{"line":374,"text":" remote_generation_present \"$REMOTE_B\" \"$logical\" \"$generation\" && die \"TX_REMOTE_B_DELETE_FAILED_${logical}_${generation}\""},{"line":375,"text":" write_tx \"$logical\" \"$generation\" \"$state_sha\" B_DELETED false true"}],"path":"/usr/local/sbin/homelab-backup-retention-gc","sha256":"8adb6c10f5911f39c53775b89eac3cd1823f1ed34b4caccade5279c213e998a3"},{"bytes":3140,"interface_lines":[{"line":7,"text":"LOCK=/run/lock/homelab-vm-full-retention.lock"},{"line":12,"text":" local keep=\"$LOCAL_KEEP_PAIRS\""},{"line":27,"text":" if ((${#archives[@]} <= keep)); then"},{"line":31,"text":" for archive in \"${archives[@]:keep}\"; do"},{"line":57,"text":" KEEP='$OFFHOST_KEEP_PAIRS'"},{"line":69,"text":" if [ \\\"\\$count\\\" -gt \\\"\\$KEEP\\\" ]; then"},{"line":86,"text":" local keep=$3"},{"line":99,"text":" if ((${#dirs[@]} <= keep)); then"},{"line":103,"text":" for dir in \"${dirs[@]:keep}\"; do"},{"line":113,"text":" prune_cloud_tier \"$remote\" daily \"$KEEP_DAILY\""},{"line":114,"text":" prune_cloud_tier \"$remote\" weekly \"$KEEP_WEEKLY\""},{"line":115,"text":" prune_cloud_tier \"$remote\" monthly \"$KEEP_MONTHLY\""},{"line":116,"text":" prune_cloud_tier \"$remote\" quarterly \"$KEEP_QUARTERLY\""},{"line":119,"text":"echo \"RETENTION_STATUS=OK\""}],"path":"/usr/local/sbin/homelab-vm-full-retention","sha256":"a3cced5263960557d3501123d57f95f12fcede45116111d3d5f02283497d4e63"},{"bytes":2081,"interface_lines":[{"line":4,"text":"MODE=\"${1:-dry-run}\""},{"line":5,"text":"KEEP=\"${KEEP:-2}\""},{"line":6,"text":"OUT=\"/var/lib/homelab-health/vm-local-dumps-retention.txt\""},{"line":8,"text":"REPORT=\"$ROOT/vm-local-dumps-retention-latest.md\""},{"line":15,"text":"DELETED=0"},{"line":16,"text":"WOULD_DELETE=0"},{"line":21,"text":"echo \"# Homelab VM local dumps cloud retention\" >> \"$REPORT\""},{"line":25,"text":"echo \"keep=$KEEP\" >> \"$REPORT\""},{"line":36,"text":" if [ \"$TOTAL\" -le \"$KEEP\" ]; then"},{"line":37,"text":" echo \"nothing_to_delete\" >> \"$REPORT\""},{"line":42,"text":" DELETE_COUNT=$((TOTAL-KEEP))"},{"line":46,"text":" if [ \"$IDX\" -le \"$DELETE_COUNT\" ]; then"},{"line":55,"text":" echo \"DELETE $PATH_REMOTE\" >> \"$REPORT\""},{"line":56,"text":" rclone purge \"$PATH_REMOTE\" >> \"$REPORT\" 2>&1 && DELETED=$((DELETED+1)) || BAD=$((BAD+1))"},{"line":58,"text":" echo \"WOULD_DELETE $PATH_REMOTE\" >> \"$REPORT\""},{"line":59,"text":" WOULD_DELETE=$((WOULD_DELETE+1))"},{"line":62,"text":" echo \"KEEP $BASE/$J\" >> \"$REPORT\""},{"line":72,"text":"echo \"STATUS=$STATUS TS=$TS TYPE=vm-local-dumps-retention BAD=$BAD MODE=$MODE KEEP=$KEEP DELETED=$DELETED WOULD_DELETE=$WOULD_DELETE REPORT=$REPORT\" > \"$OUT\""}],"path":"/usr/local/sbin/homelab-vm-local-dumps-retention","sha256":"306a775325708bcdfb9df6f751c15de0635bc0cf3ab90c00dfadf5ac8220c3bb"}] +AUDIT_IMPLEMENTATION=[{"bytes":39160,"path":"/usr/local/sbin/homelab-backup-audit","relevant_lines":[{"line":12,"text":"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"line":13,"text":"VM_WORKER=/usr/local/libexec/homelab-vm-cloud-quorum-node-worker"},{"line":14,"text":"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"line":15,"text":"APP_WORKER=/usr/local/libexec/homelab-app-cloud-quorum-worker"},{"line":16,"text":"APP_CORE=/usr/local/libexec/homelab-app-cloud-quorum-core-helper"},{"line":18,"text":"VM_QUEUE=/usr/local/sbin/homelab-vm-cloud-quorum-queue"},{"line":19,"text":"APP_QUEUE=/usr/local/sbin/homelab-app-cloud-quorum-queue"},{"line":22,"text":"CONTROL_BACKUP=/usr/local/sbin/homelab-control-backup"},{"line":23,"text":"CONTROL_BUILDER=/usr/local/libexec/homelab-control-bundle-builder"},{"line":24,"text":"CONTROL_TIMER=/etc/systemd/system/homelab-control-backup.timer"},{"line":25,"text":"CONTROL_SERVICE=/etc/systemd/system/homelab-control-backup.service"},{"line":26,"text":"CONTROL_RUNTIME_MANIFEST=/etc/homelab-backup/control-runtime-paths.txt"},{"line":27,"text":"CONTROL_SYSTEMD_MANIFEST=/etc/homelab-backup/control-systemd-paths.txt"},{"line":28,"text":"VM_TIMER=/etc/systemd/system/homelab-vm-cloud-quorum-queue.timer"},{"line":29,"text":"APP_TIMER=/etc/systemd/system/homelab-app-cloud-quorum-queue.timer"},{"line":30,"text":"VM_SERVICE=/etc/systemd/system/homelab-vm-cloud-quorum-queue.service"},{"line":31,"text":"APP_SERVICE=/etc/systemd/system/homelab-app-cloud-quorum-queue.service"},{"line":47,"text":"CONTROL_BACKUP_SHA=0b3a0f685d4e67cb86250df89a4918aff2e6c67799b7d35b0e54b1bbc016ee57"},{"line":48,"text":"CONTROL_BUILDER_SHA=2e1c3935b5016c09aad21f34a36f7e1f53188bbc34a3f033e59fe964571ec3f0"},{"line":49,"text":"CONTROL_TIMER_SHA=7c4136da20b9cd9162293380f5794d93e2c6099ce7d87ec00e0e7e19b6cd44a3"},{"line":50,"text":"CONTROL_SERVICE_SHA=428d3e1f3042c3347b7c34b6f190e44fa35f7a97264eec3974239f581c9b9250"},{"line":51,"text":"CONTROL_RUNTIME_MANIFEST_SHA=6777f95159db0fa213017f286f2cee6cc51e9963a01a0578cee8586e8731b2be"},{"line":52,"text":"CONTROL_SYSTEMD_MANIFEST_SHA=7f990d6257b43f97c3c8407945ca9dae6113dc9064c6cf1f25e7fcdaf99d5163"},{"line":53,"text":"VM_TIMER_SHA=9a78c9ea507116cbb9f5645fe697e34964c905b017cc98b17977cd5006aa5050"},{"line":54,"text":"APP_TIMER_SHA=af2eedce3df53029b591d31715a3f3e6688ddb997b4823f487e70c339ce88078"},{"line":60,"text":"CONTROL_STATE_ROOT=/var/lib/homelab-backup/cloud-quorum/control-bootstrap-v2"},{"line":61,"text":"CONTROL_EVIDENCE_ROOT=/var/lib/homelab-backup/control-restore-validation/control-bootstrap"},{"line":69,"text":"CONTROL_SLA_SECONDS=86400"},{"line":140,"text":" printf 'CONTRACT|task=%s|target_registry=CANONICAL|vm_count=%s|app_count=%s|control_sla_seconds=%s|retention=ACTIVE_OWNER_AWARE|provider_worm=NOT_PROVEN_SKIPPED|dr_proof_source=EXACT_SITE_DR_FINAL_SEAL|legacy_site_dr_seal=AUTHORITATIVE|control_freshness=RECURRING_PRODUCER_12H_DUE_24H_SLA|full_site_dr=PROVEN_BY_SEAL\\n' \"$TASK_ID\" \"${#VMIDS[@]}\" \"${#APPS[@]}\" \"$CONTROL_SLA_SECONDS\""},{"line":170,"text":"stale=0"},{"line":192,"text":"source_hash_local CONTROL_BACKUP \"$CONTROL_BACKUP\" \"$CONTROL_BACKUP_SHA\""},{"line":193,"text":"source_hash_local CONTROL_BUILDER \"$CONTROL_BUILDER\" \"$CONTROL_BUILDER_SHA\""},{"line":194,"text":"source_hash_local CONTROL_TIMER \"$CONTROL_TIMER\" \"$CONTROL_TIMER_SHA\""},{"line":195,"text":"source_hash_local CONTROL_SERVICE \"$CONTROL_SERVICE\" \"$CONTROL_SERVICE_SHA\""},{"line":196,"text":"source_hash_local CONTROL_RUNTIME_MANIFEST \"$CONTROL_RUNTIME_MANIFEST\" \"$CONTROL_RUNTIME_MANIFEST_SHA\""},{"line":197,"text":"source_hash_local CONTROL_SYSTEMD_MANIFEST \"$CONTROL_SYSTEMD_MANIFEST\" \"$CONTROL_SYSTEMD_MANIFEST_SHA\""},{"line":198,"text":"source_hash_local VM_TIMER \"$VM_TIMER\" \"$VM_TIMER_SHA\""},{"line":199,"text":"source_hash_local APP_TIMER \"$APP_TIMER\" \"$APP_TIMER_SHA\""},{"line":233,"text":" if (( age < vm_sla )); then state=FRESH; fresh=$((fresh+1)); else state=STALE; stale=$((stale+1)); fi"},{"line":253,"text":" unverified=$((unverified+1)); printf 'TARGET|kind=VM|id=%s|owner=%s|state=UNVERIFIED|generation=UNKNOWN|age_seconds=-1|sla_seconds=%s|reason=PROBE_FAILED\\n' \"$vmid\" \"$node\" \"$vm_sla\""},{"line":273,"text":" if (( age < app_sla )); then state=FRESH; fresh=$((fresh+1)); else state=STALE; stale=$((stale+1)); fi"},{"line":293,"text":" unverified=$((unverified+1)); printf 'TARGET|kind=APP|id=%s|owner=pve01|state=UNVERIFIED|generation=UNKNOWN|age_seconds=-1|sla_seconds=%s|reason=PROBE_FAILED\\n' \"$app\" \"$app_sla\""},{"line":297,"text":"control_status=UNVERIFIED"},{"line":298,"text":"control_age=-1"},{"line":299,"text":"control_generation=UNKNOWN"},{"line":300,"text":"control_checked=false"},{"line":301,"text":"control_state=\"\""},{"line":302,"text":"control_degraded=0"},{"line":303,"text":"control_bad=0"},{"line":304,"text":"if control_state=\"$(find \"$CONTROL_STATE_ROOT\" -type f -name '*.json' -printf '%T@|%p\\n' 2>&1 | LC_ALL=C sort -n | tail -n 1 | cut -d'|' -f2-)\"; then :; else control_state=\"\"; fi"},{"line":305,"text":"if [[ -n \"$control_state\" && -s \"$control_state\" && ! -L \"$control_state\" ]]; then"},{"line":306,"text":" control_generation=\"$(jq -er '.generation' \"$control_state\" 2>&1)\" || control_generation=UNKNOWN"},{"line":307,"text":" transport_status=\"$(jq -er '.status' \"$control_state\" 2>&1)\" || transport_status=INVALID"},{"line":308,"text":" if [[ ! \"$control_generation\" =~ ^control-bootstrap-v2-pve01-[0-9]{8}T[0-9]{6}Z$ ]]; then transport_status=INVALID; fi"},{"line":311,"text":" control_status=RESUME"},{"line":312,"text":" control_degraded=1"},{"line":316,"text":" if strict=\"$(jq -er 'if .schema==\"homelab-cloud-quorum-payload-v1\" and .logical_id==\"control-bootstrap-v2\" and .status==\"SEALED\" and .cloud_quorum==2 and .cloud_a_verified==true and .cloud_b_verified==true and .part_hashes_verified==true and .seal_written==true and .cloud_a_seal_verified==true and .cloud_b_seal_verified==true and .local_payload_present==false and .local_cleanup==\"OK\" then \"OK\" else error(\"strict state invalid\") end' \"$control_state\" 2>&1)\"; then"},{"line":317,"text":" control_updated=\"$(jq -er '.sealed_at_utc // .updated_at_utc' \"$control_state\" 2>&1)\" || control_updated=INVALID"},{"line":318,"text":" control_sha=\"$(jq -er '.archive_sha256' \"$control_state\" 2>&1)\" || control_sha=INVALID"},{"line":319,"text":" control_epoch=\"$(date -u -d \"$control_updated\" +%s 2>&1)\" || control_epoch=-1"},{"line":320,"text":" control_evidence=\"$CONTROL_EVIDENCE_ROOT/$control_generation.json\""},{"line":321,"text":" if [[ \"$control_epoch\" =~ ^[0-9]+$ && \"$control_epoch\" -le \"$now\" && -s \"$control_evidence\" && ! -L \"$control_evidence\" ]]; then"},{"line":322,"text":" if evidence_ok=\"$(jq -er --arg g \"$control_generation\" --arg sha \"$control_sha\" 'if .result==\"OK\" and .logical_id==\"control-bootstrap-v2\" and .generation==$g and .restore_source==\"Cloud A + Cloud B\" and .payload_sha256==$sha and .payload_sha256_verified==true and .control_manifest_verified==true and .payload_checksums_verified==true and .ops_git_bundle_verified==true and .desired_git_bundle_verified==true and .secret_escrow_separate==true and .clean_machine_bootstrap_proven==false then \"OK\" else error(\"control evidence invalid\") end' \"$control_evidence\" 2>&1)\"; then"},{"line":323,"text":" control_checked=true"},{"line":324,"text":" control_age=$((now-control_epoch))"},{"line":325,"text":" if (( control_age < CONTROL_SLA_SECONDS )); then control_status=FRESH_SEALED_PROVEN; else control_status=STALE_PROVEN; control_bad=1; infra_bad=$((infra_bad+1)); fi"},{"line":326,"text":" control_payload=\"$(jq -er '.payload_path' \"$control_state\" 2>&1)\" || control_payload=INVALID"},{"line":327,"text":" if [[ \"$control_payload\" != /* ]] || [[ -e \"$control_payload\" ]]; then payload_leaks=$((payload_leaks+1)); fi"},{"line":329,"text":" control_bad=1; infra_bad=$((infra_bad+1))"},{"line":332,"text":" control_bad=1; infra_bad=$((infra_bad+1))"},{"line":335,"text":" control_bad=1; infra_bad=$((infra_bad+1))"},{"line":338,"text":" *) control_bad=1; infra_bad=$((infra_bad+1)) ;;"},{"line":341,"text":" control_bad=1; infra_bad=$((infra_bad+1))"},{"line":343,"text":"control_archive_size=-1"},{"line":344,"text":"if [[ -n \"$control_state\" && -s \"$control_state\" && \"$control_status\" != UNVERIFIED && \"$control_status\" != RESUME ]]; then control_archive_size=\"$(jq -er '.archive_size_bytes' \"$control_state\" 2>/dev/null)\" || control_archive_size=-1; if ! append_obs_target CONTROL control-bootstrap-v2 control-bootstrap-v2 \"$control_archive_size\"; then observability_input_bad=$((observability_input_bad+1)); fi; fi"},{"line":345,"text":"printf 'CONTROL|state=%s|CONTROL_FRESHNESS=%s|generation=%s|age_seconds=%s|sla_seconds=%s|archive_size_bytes=%s|restore_evidence_checked=%s|source_coverage=RESTORE_EVIDENCE|retention=ACTIVE_OWNER_AWARE\\n' \"$control_status\" \"$control_status\" \"$control_generation\" \"$control_age\" \"$CONTROL_SLA_SECONDS\" \"$control_archive_size\" \"$control_checked\""},{"line":410,"text":" service=\"${unit%.timer}.service\""},{"line":412,"text":" if [[ \"$load_state\" == loaded && \"$unit_file_state\" == enabled && \"$active_state\" == active && \"$result\" != failed && \"$service_result\" != failed ]]; then status=OK; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi"},{"line":422,"text":"for lock in /run/homelab-backup-heavy.lock /run/lock/homelab-vm-cloud-quorum-queue.lock /run/lock/homelab-app-cloud-quorum-queue.lock /run/lock/homelab-backup-dispatcher.lock; do"},{"line":466,"text":"if [[ -s \"$RETENTION_HEALTH\" && ! -L \"$RETENTION_HEALTH\" ]] && jq -e '.schema==\"homelab-backup-retention-v1\" and .status==\"OK\" and .policy.vm_keep==2 and .policy.app_keep==7 and .policy.control_keep==4 and .owner_aware_gc_proven==true and .destructive_canary_proven==true' \"$RETENTION_HEALTH\" >/dev/null; then"},{"line":473,"text":"printf 'RETENTION|status=%s|historical_gc_proven=%s|owner_aware_gc_proven=%s|vm_keep=2|app_keep=7|control_keep=4\\n' \"$retention_status\" \"$( [[ \"$historical_gc_proven\" == true ]] && printf YES || printf NO )\" \"$( [[ \"$owner_aware_gc_proven\" == true ]] && printf YES || printf NO )\""},{"line":510,"text":"if (( stale > 0 || unverified > 0 || payload_leaks > 0 || infra_bad > 0 )); then backup_status=RED"},{"line":527,"text":"(( stale > 0 )) && add_risk HIGH RPO_BREACH"},{"line":536,"text":"printf 'SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=%s|RISK_SEVERITY=%s|RISK_REASONS=%s|DR_PROOF_STATUS=%s|CONTROL_FRESHNESS=%s|LIFECYCLE_STATUS=%s|VM_COUNT=%s|APP_COUNT=%s|FRESH=%s|STALE=%s|RESUME=%s|UNVERIFIED=%s|CONTROL_STATE=%s|CLOUD_OK=%s|SCHEDULER_OK=%s|SOURCE_OK=%s|SOURCE_DRIFT=%s|STAGING_BAD=%s|STAGING_WARN=%s|PAYLOAD_LEAKS=%s|RETENTION_STATUS=%s|OBSERVABILITY=%s|SIZE_ANOMALIES=%s|CAPACITY=%s|GLOBAL_DR_PROVEN=%s\\n' \"$backup_status\" \"$risk_severity\" \"$risk_reasons\" \"$dr_proof_status\" \"$control_status\" \"$lifecycle_status\" \"$vm_seen\" \"$app_seen\" \"$fresh\" \"$stale\" \"$resume\" \"$unverified\" \"$control_status\" \"$cloud_ok\" \"$scheduler_ok\" \"$source_ok\" \"$source_drift\" \"$staging_bad\" \"$staging_warn\" \"$payload_leaks\" \"$retention_status\" \"$observability_status\" \"$size_anomaly_count\" \"$capacity_status\" \"$global_dr_proven\""},{"line":541,"text":" jq -n --arg task \"$TASK_ID\" --arg change \"$CHANGE_ID\" --arg at \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" --arg backup \"$backup_status\" --arg risk \"$risk_severity\" --arg reasons \"$risk_reasons\" --arg control \"$control_status\" --arg dr \"$dr_proof_status\" --arg lifecycle \"$lifecycle_status\" --arg escrow \"$escrow_status\" --arg staging \"$staging_status\" --arg retention \"$retention_status\" --arg observability \"$observability_status\" --arg capacity \"$capacity_status\" --argjson historical \"$historical_gc_proven\" --argjson owner_gc \"$owner_aware_gc_proven\" --argjson staging_bad \"$staging_bad\" --argjson staging_warn \"$staging_warn\" --argjson vm_count \"$vm_seen\" --argjson app_count \"$app_seen\" --argjson fresh \"$fresh\" --argjson stale \"$stale\" --argjson resume \"$resume\" --argjson unverified \"$unverified\" --argjson cloud_ok \"$cloud_ok\" --argjson scheduler_ok \"$scheduler_ok\" --argjson source_ok \"$source_ok\" --argjson source_drift \"$source_drift\" --argjson payload_leaks \"$payload_leaks\" --argjson size_anoma"}],"sha256":"1474c9ce58bbc1b3ae7437261d1bdb923232926fb2943c7c830253f8b284724c"},{"bytes":2161,"path":"/usr/local/sbin/homelab-vps-identity-audit","relevant_lines":[],"sha256":"b709691c52ae48432b70e197eb4810b6c374a05911cee3b9fdba4ecc67c76c3a"}] +ALERT_IMPLEMENTATION={"bytes":1806,"exists":true,"sha256":"6deef30b4708a7e5b2ac0f0d98bb6b37b22d858afde994483b67baa18dffdc2a","structure_lines":[{"line":4,"text":"APP=\"alertmanager\""},{"line":14,"text":"fail(){ echo \"[ERROR] alertmanager backup failed; kept: $STAGE\"; }"},{"line":16,"text":"ssh -n -o BatchMode=yes -o ConnectTimeout=8 \"$MON\" \"sudo -n docker exec alertmanager amtool check-config /etc/alertmanager/alertmanager.yml >/dev/null && sudo -n tar -C / -czf - opt/stacks/observability-lite/compose.yaml opt/stacks/observability-lite/compose.override.yaml opt/stacks/observability-lite/alertmanager/alertmanager.yml opt/stacks/observability-lite/alertmanager/data\" > \"$STAGE/remote.tgz\""},{"line":19,"text":"test -s \"$STAGE/payload/opt/stacks/observability-lite/alertmanager/alertmanager.yml\""},{"line":21,"text":"jq -n --arg app \"$APP\" --arg host \"monitoring\" --arg engine \"files+alertmanager-config-check\" --arg config \"ok\" --argjson files \"$FILES\" \"{app:\\$app,engine:\\$engine,source_host:\\$host,source_paths:[\\\"monitoring:/opt/stacks/observability-lite/alertmanager\\\",\\\"monitoring:/opt/stacks/observability-lite/compose.yaml\\\",\\\"monitoring:/opt/stacks/observability-lite/compose.override.yaml\\\"],config_check:\\$config,file_count:\\$files,note:\\\"Alertmanager configuration and runtime state in encrypted two-cloud backup\\\"}\" > \"$STAGE/metadata.json\""},{"line":25,"text":"echo ALERTMANAGER_BACKUP_RUN=OK"}]} +ALERT_SYSTEMD_REFERENCES=[] +MAIL_ROUTE_READINESS={"postfix_active":true,"pve_user_email_present":false,"relayhost_configured":false,"root_alias_present":false,"sendmail_present":true,"smtp_sasl_auth_enable":"no","smtp_sasl_password_maps_configured":false,"smtp_tls_security_level":""} +SOURCE_PUBLICATION_STATE={"cr_branch_sha":null,"fetch_url_present":true,"local_head":"50bf24f8ee27f3d2e0d1cbc6c17b62c69ff06bae","ls_remote_rc":0,"main_sha":"326622a4864fa9b5f43b69981733236bb42c4d7b","pushurl_is_disabled":true} +DR_RESTORE_SEALS=[{"mtime_epoch":1786237057,"name":"backup-app-cloud-quorum-cutover-v1.json","selected":{"change_id":"CR-2026-0020","status":"SEALED","task_id":"backup-app-cloud-quorum-cutover-v1"},"sha256":"c77f83927dcf020cac0182bf8f7145ac823b3bbb2b62dd1021dbc9a340b0c467"},{"mtime_epoch":1786241107,"name":"backup-app-cloud-quorum-freshness-v1.json","selected":{"change_id":"CR-2026-0022","status":"SEALED","task_id":"backup-app-cloud-quorum-freshness-v1"},"sha256":"0d5374f9cceb05113c24ce9ee16a3b12f1e7846261b4d5801b125489ac45c4d7"},{"mtime_epoch":1786453079,"name":"backup-cloud-legacy-retirement-v1.json","selected":{"change_id":"CR-2026-0035","status":"SEALED","task_id":"backup-cloud-legacy-retirement-v1"},"sha256":"fe78e534174b1e23ef0aef72599cf74e73332d7abe100dda02b9ebb2f2f7afdc"},{"mtime_epoch":1786396264,"name":"backup-control-bootstrap-cloud-quorum-v1.json","selected":{"change_id":"CR-2026-0029","logical_id":"control-bootstrap","status":"SEALED","task_id":"backup-control-bootstrap-cloud-quorum-v1"},"sha256":"332f9fd0822a1531753a16978d33e8543694f3c2c0e329ba6115bf05c00d02d8"},{"mtime_epoch":1786406463,"name":"backup-control-bootstrap-configs-source-v1.json","selected":{"change_id":"CR-2026-0030","logical_id":"control-bootstrap-v2","status":"SEALED","task_id":"backup-control-bootstrap-configs-source-v1"},"sha256":"8a39632eb3901677047a544243c52a32e304912c589376ff855ef4c623a46fa9"},{"mtime_epoch":1786601026,"name":"backup-control-coverage-hardening-v1.json","selected":{"change_id":"CR-2026-0054","status":"SEALED","task_id":"backup-control-coverage-hardening-v1"},"sha256":"d4f1240df892ddddfd880bc5d5fca5df1c5c0d5c93f21c56658a669ed7547b58"},{"mtime_epoch":1786441319,"name":"backup-control-final-generation-v1.json","selected":{"change_id":"CR-2026-0034","status":"SEALED","task_id":"backup-control-final-generation-v1"},"sha256":"c5a0d270c9582e84f61564905734d76796bb5aa2de93873d1a639f5dbe7695a2"},{"mtime_epoch":1787357380,"name":"backup-control-refresh-current-v3.json","selected":{"change_id":"CR-2026-0095","status":"SEALED","task_id":"backup-control-refresh-current-v3"},"sha256":"5c7cb7ce3af6fe4ce3c11d0f3c2a2ab80790d7997b4ceea64ae5d9cc5bc4ada4"},{"mtime_epoch":1786685619,"name":"backup-control-refresh-post-legacy-retirement-v1.json","selected":{"change_id":"CR-2026-0067","status":"SEALED","task_id":"backup-control-refresh-post-legacy-retirement-v1"},"sha256":"6986ef7c5a3f13a3d199397e3f01a45c4418d81ce7ccd1f929fc9cb5593fd9db"},{"mtime_epoch":1786604876,"name":"backup-control-refresh-v1.json","selected":{"change_id":"CR-2026-0057","status":"SEALED","task_id":"backup-control-refresh-v1"},"sha256":"52abe0785bbabf2ed7df5a4f46580487f65ab48b2a3462b32ae4e0943894fcc2"},{"mtime_epoch":1786719633,"name":"backup-delete-evidence-hardening-v1.json","selected":{"change_id":"CR-2026-0074","status":"SEALED","task_id":"backup-delete-evidence-hardening-v1"},"sha256":"02abe418e49139b034984128399374301505686e45d07db8ffb6a9b8e1c53fd0"},{"mtime_epoch":1789959071,"name":"backup-gfs-lifecycle-remediation-v1.json","selected":{"change_id":"CR-2026-1005","status":"SEALED","task_id":"backup-gfs-lifecycle-remediation-v1"},"sha256":"b7da77e3a40ce308f56bbc3915569e071079773db39df1e7adc84929baf69bc6"},{"mtime_epoch":1786717462,"name":"backup-gfs-retention-v1.json","selected":{"change_id":"CR-2026-0072","status":"SEALED","task_id":"backup-gfs-retention-v1"},"sha256":"e6857f4f736d2f9506c0184119e6152ceb8301fcfaa75eb983b9e9fd4b3fac87"},{"mtime_epoch":1786247840,"name":"backup-hbarhub-cloud-quorum-v1.json","selected":{"change_id":"CR-2026-0024","logical_id":"app-hbarhub","status":"SEALED","task_id":"backup-hbarhub-cloud-quorum-v1"},"sha256":"d7d6f959ff3575b27602ffe09a0d304f12d477b499637a2ea7358bfa85e7b20e"},{"mtime_epoch":1786373683,"name":"backup-lock-fd-hardening-v1.json","selected":{"change_id":"CR-2026-0027","status":"SEALED","task_id":"backup-lock-fd-hardening-v1"},"sha256":"3d1e9f182ce7263f2c4148618b132277c7125f4d0a348203cd1c08b711076501"},{"mtime_epoch":1786565758,"name":"backup-matrix-residue-retirement-v1.json","selected":{"change_id":"CR-2026-0050","status":"SEALED","task_id":"backup-matrix-residue-retirement-v1"},"sha256":"85036d473fa309331a9167d58ef1f2bd7e7466d52b9b130096dbdc45507512fc"},{"mtime_epoch":1786703572,"name":"backup-observability-risk-forecast-v1.json","selected":{"change_id":"CR-2026-0071","status":"SEALED","task_id":"backup-observability-risk-forecast-v1"},"sha256":"40a316a39025867cfb488543006badf0bdb315aec65c0c5f8ef20bc1b1665915"},{"mtime_epoch":1786643518,"name":"backup-retention-dynamic-pinned-prune-mailru-cleanup-v1.json","selected":{"change_id":"CR-2026-0065","status":"SEALED","task_id":"backup-retention-dynamic-pinned-prune-mailru-cleanup-v1"},"sha256":"f9165cf9faf0d2bd7803b7dc9763d24244e677d14d4a3d8fce558a4b8326088a"},{"mtime_epoch":1786639543,"name":"backup-retention-pinned-scheduled-scope-hotfix-v1.json","selected":{"change_id":"CR-2026-0064","status":"SEALED","task_id":"backup-retention-pinned-scheduled-scope-hotfix-v1"},"sha256":"8b2ddd3968a8c2bcb4fc91855f667a21c0aa2710944fe2553108350344a7dd56"},{"mtime_epoch":1786599343,"name":"backup-retention-plan-stability-hotfix-v1.json","selected":{"change_id":"CR-2026-0055","status":"SEALED","task_id":"backup-retention-plan-stability-hotfix-v1"},"sha256":"4d7ebbc69ee319f210785ef6113e033dca9e2ceed2e706afc8f0b3cf10873026"},{"mtime_epoch":1786607325,"name":"backup-retention-remote-list-failclosed-hotfix-v1.json","selected":{"change_id":"CR-2026-0060","status":"SEALED","task_id":"backup-retention-remote-list-failclosed-hotfix-v1"},"sha256":"b2831634be5ff1f829302b83025fc5ba7649dcbe72fd14cdfda1e5d7a0f52e07"},{"mtime_epoch":1786513619,"name":"backup-retention-remote-stdin-hotfix-v1.json","selected":{"change_id":"CR-2026-0035","status":"SEALED","task_id":"backup-retention-remote-stdin-hotfix-v1"},"sha256":"d42d89260f2304945df40c958fd5a52b758a674bcb10b9323552a0a7b35ce7ae"},{"mtime_epoch":1786431140,"name":"backup-retention-safe-gc-v1.json","selected":{"change_id":"CR-2026-0033","status":"SEALED","task_id":"backup-retention-safe-gc-v1"},"sha256":"2e1d4745b70ea6e3e96097ccc336fd7d555e70b8cc058b96491fd8c87d95579f"},{"mtime_epoch":1786600541,"name":"backup-retention-transaction-resume-hotfix-v1.json","selected":{"change_id":"CR-2026-0056","status":"SEALED","task_id":"backup-retention-transaction-resume-hotfix-v1"},"sha256":"d4e4dd8d58d0fc527cd7210c6252b6321e0568961c03a4ddd729fbdb20494928"},{"mtime_epoch":1786726495,"name":"backup-rotating-boot-drill-escrow-freshness-v1.json","selected":{"change_id":"CR-2026-0075","status":"SEALED","task_id":"backup-rotating-boot-drill-escrow-freshness-v1"},"sha256":"9a38eebec6e913d802dd08bb4dcb5612dfec734530bbf1afbe7e277507ccd163"},{"mtime_epoch":1786387065,"name":"backup-scheduler-fairness-granularity-v1.json","selected":{"change_id":"CR-2026-0028","status":"SEALED","task_id":"backup-scheduler-fairness-granularity-v1"},"sha256":"cf0fd28e413fc9eb6dbd76149378a169b987c7509246ae1758cc75041a8d393b"},{"mtime_epoch":1786359648,"name":"backup-scheduler-rpo-hardening-v1.json","selected":{"change_id":"CR-2026-0026","status":"SEALED","task_id":"backup-scheduler-rpo-hardening-v1"},"sha256":"b56847a3c68d16559aabcd23ff46dfefd820fc970432afd2232415bc0202af3e"},{"mtime_epoch":1786297580,"name":"backup-scrutiny-cloud-quorum-v1.json","selected":{"change_id":"CR-2026-0025","logical_id":"app-scrutiny","status":"SEALED","task_id":"backup-scrutiny-cloud-quorum-v1"},"sha256":"eb50068d771572139320b41b4a9a4fef9fa28fd977686d66f84e15a987dd43a3"},{"mtime_epoch":1786698442,"name":"backup-target-lifecycle-registry-v1.json","selected":{"change_id":"CR-2026-0070","status":"SEALED","task_id":"backup-target-lifecycle-registry-v1"},"sha256":"b843b84c66c739ec42e8454b8a996eb827364fb6c938a8ce86e4e5ac7c16c0b8"},{"mtime_epoch":1786428928,"name":"backup-unified-monitoring-v1.json","selected":{"change_id":"CR-2026-0032","status":"SEALED","task_id":"backup-unified-monitoring-v1"},"sha256":"26cbd0d9f84cf4bd8aec1c8ad479e612afde3949954003dd0d9f4a1bbc278867"},{"mtime_epoch":1786200294,"name":"backup-vm-cloud-quorum-cutover-v1.json","selected":{"change_id":"CR-2026-0019","status":"SEALED","task_id":"backup-vm-cloud-quorum-cutover-v1"},"sha256":"33b0dadaf58949fe1356904c7171f4be992dc3866e3ba4688e0ada41e6266aac"},{"mtime_epoch":1786239546,"name":"backup-vm-cloud-quorum-freshness-v1.json","selected":{"change_id":"CR-2026-0021","status":"SEALED","task_id":"backup-vm-cloud-quorum-freshness-v1"},"sha256":"89a3a916b5a099ba71fb6f171c16bb52adeec45295315a9b605b1703b2ed3f65"},{"mtime_epoch":1786422218,"name":"backup-vm-restore-evidence-hardening-v1.json","selected":{"change_id":"CR-2026-0031","status":"SEALED","task_id":"backup-vm-restore-evidence-hardening-v1"},"sha256":"5f1274624374adbbb495b1701fe1eedaab028fad0f97a2409f0b79df9a791f9a"},{"mtime_epoch":1786459865,"name":"cluster-postdr-storage-retirement-v1.json","selected":{"change_id":"CR-2026-0038","status":"SEALED","task_id":"cluster-postdr-storage-retirement-v1"},"sha256":"d25c1760d3ea45ac695ee1fc5d2636bbb1c012da96c3ba4e89767915efe0e7d2"},{"mtime_epoch":1784329495,"name":"homelab-backup-tail-closure-v1.json","selected":{"change_id":"CR-2026-0004","status":"SEALED","task_id":"homelab-backup-tail-closure-v1"},"sha256":"9a52b2bb0186f9807a0b25274f819c33b097dbbfaa32f03f1c31360354c096c1"},{"mtime_epoch":1786684253,"name":"legacy-backup-target-retirement-v1.json","selected":{"change_id":"CR-2026-0066","status":"SEALED","task_id":"legacy-backup-target-retirement-v1"},"sha256":"830eb32a0c3366d51c9d798736ccbd3048a0524b38cd228a58085499b610048f"},{"mtime_epoch":1786555697,"name":"reports-monitor-canonical-backup-supervision-v1.json","selected":{"change_id":"CR-2026-0046","status":"SEALED","task_id":"reports-monitor-canonical-backup-supervision-v1"},"sha256":"2c4fdb17fbd7caec98e111fae74e1d8bad3942cc2c7bc33a0b1c8b769b542076"},{"mtime_epoch":1786450297,"name":"site-dr-final-acceptance-v1.json","selected":{"change_id":"DR-2026-FINAL","status":"SEALED","task_id":"site-dr-final-resume-boot-v1"},"sha256":"b9f8172bac0206380198ac68079625b06f06eac7d484e66226082ebc1abae14d"},{"mtime_epoch":1786470088,"name":"vm160-post-cleanup-canonical-backup-v1.json","selected":{"change_id":"CR-2026-0043","status":"SEALED","target":"vm160","task_id":"vm160-post-cleanup-canonical-backup-v1"},"sha256":"83b76b909bad03476133425e38ab0be75a300a821300389660aa2f620c543d0c"}] +CLOSURE_GATES={"active_targets_with_state_missing":8,"alert_script_present":true,"cloud_a_readable":true,"cloud_b_readable":true,"gfs_ok":true,"retention_timer_safely_held":true,"sendmail_present":true,"source_offhost_branch_exact":false,"v2_timer_enabled_active":true} +NO_MUTATION=true +NO_REPO_WRITE=true +NO_GIT_FETCH=true +NO_GIT_COMMIT=true +NO_GIT_PUSH_UPDATE=true +NO_SYSTEMD_ACTION=true +NO_BACKUP_STARTED=true +NO_RESTORE_STARTED=true +NO_RETENTION_GC_STARTED=true +NO_CLOUD_DELETE=true +NO_MAIL_SENT=true +AUDIT_DURATION_SEC=1.505 +TASK_RESULT=PASS_HOMELAB_BACKUP_CLOSURE_AUDIT_READONLY +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1} +WORKERS2_BACKUP_CLOSURE_AUDIT_END=1 OUTPUT_END CHAT_OUTPUT_END