1
0
Files
homelab-public-context/runtime/latest.json
T

39 lines
105 KiB
JSON

{
"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<DELETE_COUNT; I++)); do\"},{\"line\":83,\"text\":\" [[ -n \\\"$LATEST_REL\\\" && \\\"$REL\\\" == \\\"$LATEST_REL\\\" ]] && { echo \\\"REFUSE delete latest ${REL}\\\"; exit 7; }\"},{\"line\":85,\"text\":\" if [[ \\\"$MODE\\\" == apply ]]; then echo \\\"DELETE schema=dual path=$REL\\\"; rclone purge \\\"$TARGET\\\"; else echo \\\"WOULD_DELETE schema=dual path=$REL\\\"; fi\"},{\"line\":88,\"text\":\"[[ \\\"$MODE\\\" == apply ]] && echo \\\"OK app retention apply finished\\\" || echo \\\"OK app retention dry-run finished\\\"\"}],\"path\":\"/usr/local/sbin/appbackup-retention\",\"sha256\":\"31144fc51f5f0806faf9c96d5ed05957061a88b25be7f4896eb6b6a86cee0fda\"},{\"bytes\":1675,\"interface_lines\":[{\"line\":3,\"text\":\"KEEP=\\\"${1:-7}\\\"\"},{\"line\":4,\"text\":\"MODE=\\\"${2:-dry-run}\\\"\"},{\"line\":5,\"text\":\"[[ \\\"$KEEP\\\" =~ ^[0-9]+$ ]] || { echo \\\"BAD KEEP\\\"; exit 2; }\"},{\"line\":6,\"text\":\"(( KEEP >= 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<DELETE_COUNT; i++)); do TARGET_NAME=\\\"${DIRS[$i]}\\\"; TARGET=\\\"$BASE/$TARGET_NAME\\\"; [[ -n \\\"$LATEST\\\" && \\\"$TARGET_NAME\\\" == \\\"$LATEST\\\" ]] && { echo \\\"REFUSE delete latest $TARGET\\\"; exit 5; }; if [[ \\\"$MODE\\\" == \\\"apply\\\" ]]; then echo \\\"DELETE $TARGET\\\"; rclone purge \\\"$TARGET\\\"; else echo \\\"WOULD_DELETE $TARGET\\\"; fi; done\"},{\"line\":26,\"text\":\"[[ \\\"$MODE\\\" == \\\"apply\\\" ]] && echo \\\"OK retention apply finished\\\" || echo \\\"OK retention dry-run finished\\\"\"}],\"path\":\"/usr/local/sbin/backup-retention\",\"sha256\":\"910d22765b49f05ddf72bb9cb6ea4fe10d2e8df9c9aa5f82b0d1bc115233a3c7\"},{\"bytes\":32975,\"interface_lines\":[{\"line\":5,\"text\":\"TASK_ID=backup-retention-safe-gc-v1\"},{\"line\":8,\"text\":\"RETENTION_ROOT=/var/lib/homelab-backup/retention-safe-gc\"},{\"line\":9,\"text\":\"HEALTH=/var/lib/homelab-health/backup-retention-safe-gc.json\"},{\"line\":10,\"text\":\"LOCK=/run/lock/homelab-backup-retention-gc.lock\"},{\"line\":25,\"text\":\"GFS_POLICY=\\\"${HOMELAB_BACKUP_GFS_POLICY:-/etc/homelab-backup/gfs-retention.json}\\\"\"},{\"line\":27,\"text\":\"[[ -x \\\"$REGISTRY_HELPER\\\" && ! -L \\\"$REGISTRY_HELPER\\\" ]] || { printf 'GC_STATUS=ERROR|ROOT_CAUSE=TARGET_REGISTRY_HELPER_MISSING\\\\n' >&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"
}