CHAT_OUTPUT_BEGIN
COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=homelab-backup-closure-audit
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=d3877f0193bbe5b5c8345ebec48097517ce415848ee63ff839517234bc496da1
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
CHANGE_DECLARED=false
RESULT_CONTRACT_VALID=true
RESULT_CONTRACT_STATUS=NOT_APPLICABLE
RESULT_CONTRACT_ERROR=NONE
COMMAND_RC=0
CHANGES_MADE=false
ROLLBACK_STARTED=false
ROLLBACK_RESTORED=null
MUTATION_OUTCOME=NO_MUTATION
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
RAW_EVIDENCE_SHA256=12f9c3c08bd66206cce08cf9b97ad5ece4d918a0ee1661e4a7fb3735e42d6a36
SANITIZED_OUTPUT_SHA256=12f9c3c08bd66206cce08cf9b97ad5ece4d918a0ee1661e4a7fb3735e42d6a36
OUTPUT_BEGIN
WORKERS2_BACKUP_CLOSURE_AUDIT_BEGIN=1
COMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1
MODE=read-only
COMPONENT=homelab-backup-closure-audit
HOST=pve01
UID=0
MUTATION_BOUNDARY=READ_ONLY_NO_REPO_WRITE_NO_GIT_FETCH_NO_GIT_COMMIT_NO_PUSH_NO_SYSTEMD_ACTION_NO_BACKUP_NO_RESTORE_NO_RETENTION_GC_NO_CLOUD_DELETE_NO_MAIL
SOURCE_HEAD=50bf24f8ee27f3d2e0d1cbc6c17b62c69ff06bae
SOURCE_HEAD_EXPECTED=true
SOURCE_WORKTREE_CLEAN=true
SOURCE_STATUS_LINES=[]
GFS_POST_STATE={"helper":{"exists":true,"sha256":"a1aed0c6039f8095bd5da7f62b47f4ee6932df98c4e0e7420d3006df86bd5c94"},"policy":{"exists":true,"sha256":"2c7674045dd5c68cc48d348d616494dbbe145df460a8e85d97a2c5c153ec792d"},"seal":{"exists":true,"sha256":"b7da77e3a40ce308f56bbc3915569e071079773db39df1e7adc84929baf69bc6"},"seal_selected":{"critical_vm_count":8,"helper_sha256":"a1aed0c6039f8095bd5da7f62b47f4ee6932df98c4e0e7420d3006df86bd5c94","policy_sha256":"2c7674045dd5c68cc48d348d616494dbbe145df460a8e85d97a2c5c153ec792d","retention_reenable_requires_safe_plan":true,"retention_timer_held_disabled":true,"status":"SEALED","vm200_retired_preserve":true}}
GFS_VALIDATE={"rc":0,"stderr":[],"stdout":["GFS_POLICY=OK"]}
GFS_CRITICAL_LOGICALS=["vm110","vm111","vm112","vm113","vm130","vm150","vm160","vm170"]
UNIT_STATE={"homelab-backup-retention-gc.service":{"ActiveState":{"rc":0,"value":"inactive"},"ExecMainStatus":{"rc":0,"value":"66"},"LastTriggerUSec":{"rc":0,"value":""},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"dead"},"UnitFileState":{"rc":0,"value":"static"}},"homelab-backup-retention-gc.timer":{"ActiveState":{"rc":0,"value":"inactive"},"ExecMainStatus":{"rc":0,"value":""},"LastTriggerUSec":{"rc":0,"value":""},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"dead"},"UnitFileState":{"rc":0,"value":"disabled"}},"homelab-backup-v2.service":{"ActiveState":{"rc":0,"value":"inactive"},"ExecMainStatus":{"rc":0,"value":"0"},"LastTriggerUSec":{"rc":0,"value":""},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"dead"},"UnitFileState":{"rc":0,"value":"static"}},"homelab-backup-v2.timer":{"ActiveState":{"rc":0,"value":"active"},"ExecMainStatus":{"rc":0,"value":""},"LastTriggerUSec":{"rc":0,"value":"Mon 2026-09-21 05:35:16 MSK"},"LoadState":{"rc":0,"value":"loaded"},"NextElapseUSecRealtime":{"rc":0,"value":""},"Result":{"rc":0,"value":"success"},"SubState":{"rc":0,"value":"waiting"},"UnitFileState":{"rc":0,"value":"enabled"}}}
REGISTRY_LOGICALS=[{"id":"filebrowser","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-filebrowser"},{"id":"hbarhub","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-hbarhub"},{"id":"immich","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-immich"},{"id":"memos","kind":"APP","lifecycle":"RETIRED_PRESERVE","logical_id":"app-memos"},{"id":"scrutiny","kind":"APP","lifecycle":"RETIRED_PRESERVE","logical_id":"app-scrutiny"},{"id":"skladchik-moderator-assistant","kind":"APP","lifecycle":"RETIRED_PRESERVE","logical_id":"app-skladchik-moderator-assistant"},{"id":"skladchik-reports-monitor","kind":"APP","lifecycle":"ACTIVE","logical_id":"app-skladchik-reports-monitor"},{"id":"control-bootstrap-v2","kind":"CONTROL","lifecycle":"ACTIVE","logical_id":"control-bootstrap-v2"},{"id":"110","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm110"},{"id":"111","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm111"},{"id":"112","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm112"},{"id":"113","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm113"},{"id":"130","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm130"},{"id":"150","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm150"},{"id":"160","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm160"},{"id":"170","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm170"},{"id":"171","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm171"},{"id":"180","kind":"VM","lifecycle":"RETIRED_PRESERVE","logical_id":"vm180"},{"id":"190","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm190"},{"id":"200","kind":"VM","lifecycle":"RETIRED_PRESERVE","logical_id":"vm200"},{"id":"9130","kind":"VM","lifecycle":"ACTIVE","logical_id":"vm9130"}]
REGISTRY_ACTIVE_LOGICALS=["app-filebrowser","app-hbarhub","app-immich","app-skladchik-reports-monitor","control-bootstrap-v2","vm110","vm111","vm112","vm113","vm130","vm150","vm160","vm170","vm171","vm190","vm9130"]
REGISTRY_ACTIVE_COUNT=16
V2_STATE_COUNT=29
V2_STATES=[{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"control-bootstrap-v2.json","generation":"control-bootstrap-v2-pve01-20260916T120057Z","green_verified":null,"json_valid":true,"last_attempt_epoch":1789930298,"last_success_epoch":1789930298,"logical_id":"control-bootstrap-v2","quorum":null,"replica_count":null,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":28977},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct110.json","generation":"v2-ct110-20260920T181158Z-25703b1ef77f","green_verified":false,"json_valid":true,"last_attempt_epoch":1789928120,"last_success_epoch":1789928120,"logical_id":"ct110","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":31155},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct111.json","generation":"v2-ct111-20260920T200749Z-a2bac7e3ecb7","green_verified":false,"json_valid":true,"last_attempt_epoch":1789935021,"last_success_epoch":1789935021,"logical_id":"ct111","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":24254},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct112.json","generation":"v2-ct112-20260920T214958Z-30e3291e1543","green_verified":false,"json_valid":true,"last_attempt_epoch":1789941076,"last_success_epoch":1789941076,"logical_id":"ct112","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":18199},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"ct113.json","generation":"v2-ct113-20260920T222532Z-4f4a608def82","green_verified":false,"json_valid":true,"last_attempt_epoch":1789943241,"last_success_epoch":1789943241,"logical_id":"ct113","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":16034},{"consecutive_failures":5,"failure_backoff_seconds":21600,"file":"guest-pve01-lxc-112.json","generation":null,"green_verified":null,"json_valid":true,"last_attempt_epoch":1789938729,"last_success_epoch":1789799511,"logical_id":"guest-pve01-lxc-112","quorum":null,"replica_count":null,"result":"FAIL","retry_count":null,"status":null,"success_age_sec":159764},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"md-relay.json","generation":"v2-md-relay-20260920T140452Z-1943a8c57bd6","green_verified":false,"json_valid":true,"last_attempt_epoch":1789913115,"last_success_epoch":1789913115,"logical_id":"md-relay","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":46160},{"consecutive_failures":null,"failure_backoff_seconds":null,"file":"node-pve01.json","generation":"v2-node-pve01-20260915T040859Z-9187f2b9a0b4","green_verified":true,"json_valid":true,"last_attempt_epoch":null,"last_success_epoch":1789445359,"logical_id":"node-pve01","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":513916},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"node-pve02.json","generation":"v2-node-pve02-20260918T011512Z-59f345bf9a9b","green_verified":false,"json_valid":true,"last_attempt_epoch":1789694135,"last_success_epoch":1789694135,"logical_id":"node-pve02","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":265140},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"node-pve03.json","generation":"v2-node-pve03-20260918T015457Z-204ac5a3eb03","green_verified":false,"json_valid":true,"last_attempt_epoch":1789696518,"last_success_epoch":1789696518,"logical_id":"node-pve03","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":262757},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"router-netcraze.json","generation":"v2-router-netcraze-20260920T155444Z-a91b2efdb4fe","green_verified":false,"json_valid":true,"last_attempt_epoch":1789919711,"last_success_epoch":1789919711,"logical_id":"router-netcraze","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":39564},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"spb-ingress.json","generation":"v2-spb-ingress-20260920T151616Z-9d80091d0c4c","green_verified":false,"json_valid":true,"last_attempt_epoch":1789917397,"last_success_epoch":1789917397,"logical_id":"spb-ingress","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":41878},{"consecutive_failures":10,"failure_backoff_seconds":21600,"file":"us-netbird.json","generation":"v2-us-netbird-20260921T015632Z-dc499030a55f","green_verified":null,"json_valid":true,"last_attempt_epoch":1789955807,"last_success_epoch":1789704670,"logical_id":"us-netbird","quorum":null,"replica_count":null,"result":"FAIL","retry_count":null,"status":null,"success_age_sec":254605},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm130.json","generation":"v2-vm130-20260920T233759Z-c9518c8be2c3","green_verified":false,"json_valid":true,"last_attempt_epoch":1789948633,"last_success_epoch":1789948633,"logical_id":"vm130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":10642},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm150.json","generation":"v2-vm150-20260920T230035Z-e0880e47ea55","green_verified":false,"json_valid":true,"last_attempt_epoch":1789945347,"last_success_epoch":1789945347,"logical_id":"vm150","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":13928},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm160.json","generation":"v2-vm160-20260921T001432Z-31df1acfee7a","green_verified":false,"json_valid":true,"last_attempt_epoch":1789950100,"last_success_epoch":1789950100,"logical_id":"vm160","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":9175},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm170.json","generation":"v2-vm170-20260921T023516Z-53ad6a6b10f9","green_verified":false,"json_valid":true,"last_attempt_epoch":1789958880,"last_success_epoch":1789958880,"logical_id":"vm170","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":395},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm171.json","generation":"v2-vm171-20260921T004759Z-537db1552014","green_verified":false,"json_valid":true,"last_attempt_epoch":1789951877,"last_success_epoch":1789951877,"logical_id":"vm171","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":7398},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm190.json","generation":"v2-vm190-20260921T012544Z-298b64987988","green_verified":false,"json_valid":true,"last_attempt_epoch":1789954139,"last_success_epoch":1789954139,"logical_id":"vm190","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":5136},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm210.json","generation":"v2-vm210-20260920T203832Z-458da35ec027","green_verified":false,"json_valid":true,"last_attempt_epoch":1789936798,"last_success_epoch":1789936798,"logical_id":"vm210","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":22477},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm211.json","generation":"v2-vm211-20260919T203132Z-82878bb22008","green_verified":false,"json_valid":true,"last_attempt_epoch":1789849984,"last_success_epoch":1789849984,"logical_id":"vm211","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":109291},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm9130.json","generation":"v2-vm9130-20260919T210758Z-0aa987efac8c","green_verified":false,"json_valid":true,"last_attempt_epoch":1789853557,"last_success_epoch":1789853557,"logical_id":"vm9130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":105718},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-codevipe.json","generation":"v2-xf-codevipe-20260920T162616Z-da4e8fcf3129","green_verified":false,"json_valid":true,"last_attempt_epoch":1789922324,"last_success_epoch":1789922324,"logical_id":"xf-codevipe","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":36951},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-dsmods.json","generation":"v2-xf-dsmods-20260919T214716Z-c783be0bd209","green_verified":false,"json_valid":true,"last_attempt_epoch":1789860411,"last_success_epoch":1789860411,"logical_id":"xf-dsmods","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":98864},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-gamevipe.json","generation":"v2-xf-gamevipe-20260920T015714Z-762dbd7ce0d7","green_verified":false,"json_valid":true,"last_attempt_epoch":1789882268,"last_success_epoch":1789882268,"logical_id":"xf-gamevipe","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":77007},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-hkmods.json","generation":"v2-xf-hkmods-20260920T071214Z-6407219f0624","green_verified":false,"json_valid":true,"last_attempt_epoch":1789906789,"last_success_epoch":1789906789,"logical_id":"xf-hkmods","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":52486},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-kingofwolk.json","generation":"v2-xf-kingofwolk-20260919T232652Z-cb0189b2b0ba","green_verified":false,"json_valid":true,"last_attempt_epoch":1789861037,"last_success_epoch":1789861037,"logical_id":"xf-kingofwolk","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":98238},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-newfi.json","generation":"v2-xf-newfi-20260920T004616Z-6be6559a5589","green_verified":false,"json_valid":true,"last_attempt_epoch":1789865619,"last_success_epoch":1789865619,"logical_id":"xf-newfi","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":93656},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"xf-zakrutim.json","generation":"v2-xf-zakrutim-20260920T173658Z-a8de3568c79b","green_verified":false,"json_valid":true,"last_attempt_epoch":1789926652,"last_success_epoch":1789926652,"logical_id":"xf-zakrutim","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":32623}]
ACTIVE_WITHOUT_V2_STATE=["app-filebrowser","app-hbarhub","app-immich","app-skladchik-reports-monitor","vm110","vm111","vm112","vm113"]
ACTIVE_STATE_SUMMARY=[{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"control-bootstrap-v2.json","generation":"control-bootstrap-v2-pve01-20260916T120057Z","green_verified":null,"json_valid":true,"last_attempt_epoch":1789930298,"last_success_epoch":1789930298,"logical_id":"control-bootstrap-v2","quorum":null,"replica_count":null,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":28977},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm130.json","generation":"v2-vm130-20260920T233759Z-c9518c8be2c3","green_verified":false,"json_valid":true,"last_attempt_epoch":1789948633,"last_success_epoch":1789948633,"logical_id":"vm130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":10642},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm150.json","generation":"v2-vm150-20260920T230035Z-e0880e47ea55","green_verified":false,"json_valid":true,"last_attempt_epoch":1789945347,"last_success_epoch":1789945347,"logical_id":"vm150","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":13928},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm160.json","generation":"v2-vm160-20260921T001432Z-31df1acfee7a","green_verified":false,"json_valid":true,"last_attempt_epoch":1789950100,"last_success_epoch":1789950100,"logical_id":"vm160","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":9175},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm170.json","generation":"v2-vm170-20260921T023516Z-53ad6a6b10f9","green_verified":false,"json_valid":true,"last_attempt_epoch":1789958880,"last_success_epoch":1789958880,"logical_id":"vm170","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":395},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm171.json","generation":"v2-vm171-20260921T004759Z-537db1552014","green_verified":false,"json_valid":true,"last_attempt_epoch":1789951877,"last_success_epoch":1789951877,"logical_id":"vm171","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":7398},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm190.json","generation":"v2-vm190-20260921T012544Z-298b64987988","green_verified":false,"json_valid":true,"last_attempt_epoch":1789954139,"last_success_epoch":1789954139,"logical_id":"vm190","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":5136},{"consecutive_failures":0,"failure_backoff_seconds":0,"file":"vm9130.json","generation":"v2-vm9130-20260919T210758Z-0aa987efac8c","green_verified":false,"json_valid":true,"last_attempt_epoch":1789853557,"last_success_epoch":1789853557,"logical_id":"vm9130","quorum":null,"replica_count":2,"result":"SUCCESS","retry_count":null,"status":null,"success_age_sec":105718}]
V2_WRAPPER_META={"exists":true,"is_symlink":false,"sha256":"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2"}
V2_SOURCE_HINTS=[{"file":"/usr/local/sbin/.homelab-command-adapter.new.1544389","line":1089,"text":"                        \"capsule retry client IP mismatch\""},{"file":"/usr/local/sbin/.homelab-command-adapter.new.1544389","line":1118,"text":"                    \"idempotent_retry\": True,"},{"file":"/usr/local/sbin/__pycache__/homelab-backup-matrix-refreshcpython-313.pyc","line":171,"text":"age_seconds\ufffd\u0017generated_health_output)\u0003rk\u0000\u0000\u0000\ufffd\tfreshnessr}\u0000\u0000\u0000r&\u0000\u0000\u0000\ufffd\u0006shadowz\u0007STATUS=z\u0003TS=z\u0007JOB_ID=z\tJOB_NAME=z"},{"file":"/usr/local/sbin/__pycache__/homelab-backup-matrix-refreshcpython-313.pyc","line":176,"text":"FRESHNESS=z\u0004.txtr1\u0000\u0000\u0000\ufffd\u0015compatibility_outputs\ufffd"},{"file":"/usr/local/sbin/__pycache__/homelab-reference-refreshcpython-313.pyc","line":107,"text":"Nr\u0003\u0000\u0000\u0000\ufffd\u0011freshness_secondsi\u0010\u000e\u0000\u0000)\u0001\ufffd\u0007seconds)\u0003\ufffd\u0006source\ufffd"},{"file":"/usr/local/sbin/__pycache__/homelab-safe-runcpython-313.pyc","line":23,"text":"kb/lessons/known_failures.jsonz!kb/current/02_FRESHNESS_POLICY.md\ufffd\u001fkb/policies/command_policy.jsonz"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":5,"text":"PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":14,"text":"FRESHNESS_SECONDS=\"$(\"$REGISTRY_HELPER\" freshness-seconds APP)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":16,"text":"(( DUE_SECONDS > 0 && DUE_SECONDS < FRESHNESS_SECONDS )) || { printf 'APP_QUORUM_QUEUE_ERROR=DUE_THRESHOLD_INVALID\\n' >&2; exit 65; }"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":31,"text":"freshness_decision(){"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":39,"text":"      printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_RESUME GENERATION=%s\\n' \"$app\" \"$generation\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":45,"text":"        printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_EPOCH_INVALID\\n' \"$app\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":50,"text":"        printf 'QUEUE_FRESHNESS APP=%s DECISION=SKIP_FRESH GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":51,"text":"      elif (( age >= DUE_SECONDS && age < FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":52,"text":"        printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_DUE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":53,"text":"      elif (( age >= FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":54,"text":"        printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_STALE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":56,"text":"        printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_TIMESTAMP_IN_FUTURE GENERATION=%s AGE_SECONDS=%s\\n' \"$app\" \"$generation\" \"$age\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":60,"text":"      printf 'QUEUE_FRESHNESS APP=%s DECISION=BACKUP_UNVERIFIED\\n' \"$app\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":63,"text":"      die \"FRESHNESS_DECISION_INVALID_${app}_${decision:-EMPTY}\" 65"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":67,"text":"freshness_plan(){"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":69,"text":"  [[ -x \"$PROBE\" && ! -L \"$PROBE\" ]] || die FRESHNESS_PROBE_NOT_INSTALLED 69"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":72,"text":"    out=\"$(freshness_decision \"$a\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":74,"text":"    decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$out\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":75,"text":"    [[ -n \"$decision\" ]] || die \"FRESHNESS_PLAN_DECISION_MISSING_$a\" 65"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":76,"text":"    printf 'QUEUE_FRESHNESS_PLAN APP=%s DECISION=%s\\n' \"$a\" \"$decision\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":90,"text":"  freshness_plan"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":93,"text":"  local a=\"$1\" freshness decision now_epoch out generation"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":107,"text":"  freshness=\"$(exec 8>&-; exec 9>&-; freshness_decision \"$a\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":108,"text":"  printf '%s\\n' \"$freshness\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":109,"text":"  decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":112,"text":"      generation=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^GENERATION=/){sub(/^GENERATION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":117,"text":"    *) die \"FRESHNESS_RECHECK_INVALID_${a}_${decision:-EMPTY}\" 65 ;;"},{"file":"/usr/local/sbin/homelab-app-cloud-quorum-queue","line":150,"text":"  freshness-plan) [[ \"$#\" == 1 ]] || die USAGE_FRESHNESS_PLAN 64; freshness_plan ;;"},{"file":"/usr/local/sbin/homelab-backup-audit","line":12,"text":"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-audit","line":14,"text":"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-audit","line":105,"text":"  value=\"$(awk -F= '$1==\"FRESHNESS_SECONDS\"{print $2; exit}' \"$file\")\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":140,"text":"  printf 'CONTRACT|task=%s|target_registry=CANONICAL|vm_count=%s|app_count=%s|control_sla_seconds=%s|retention=ACTIVE_OWNER_AWARE|provider_worm=NOT_PROVEN_SKIPPED|dr_proof_source=EXACT_SITE_DR_FINAL_SEAL|legacy_site_dr_seal=AUTHORITATIVE|control_freshness=RECURRING_PRODUCER_12H_DUE_24H_SLA|full_site_dr=PROVEN_BY_SEAL\\n' \"$TASK_ID\" \"${#VMIDS[@]}\" \"${#APPS[@]}\" \"$CONTROL_SLA_SECONDS\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":153,"text":"  all|write-health|scheduled) ;;"},{"file":"/usr/local/sbin/homelab-backup-audit","line":154,"text":"  *) die \"USAGE_all_write-health_scheduled_contract\" 64 ;;"},{"file":"/usr/local/sbin/homelab-backup-audit","line":166,"text":"vm_sla=\"$(\"$REGISTRY_HELPER\" freshness-seconds VM)\" || die VM_SLA_UNREADABLE"},{"file":"/usr/local/sbin/homelab-backup-audit","line":167,"text":"app_sla=\"$(\"$REGISTRY_HELPER\" freshness-seconds APP)\" || die APP_SLA_UNREADABLE"},{"file":"/usr/local/sbin/homelab-backup-audit","line":220,"text":"    freshness_status=\"$(field FRESHNESS_STATUS <<<\"$out\")\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":223,"text":"    if [[ \"$freshness_status\" != OK ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":260,"text":"    freshness_status=\"$(field FRESHNESS_STATUS <<<\"$out\")\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":263,"text":"    if [[ \"$freshness_status\" != OK ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":345,"text":"printf 'CONTROL|state=%s|CONTROL_FRESHNESS=%s|generation=%s|age_seconds=%s|sla_seconds=%s|archive_size_bytes=%s|restore_evidence_checked=%s|source_coverage=RESTORE_EVIDENCE|retention=ACTIVE_OWNER_AWARE\\n' \"$control_status\" \"$control_status\" \"$control_generation\" \"$control_age\" \"$CONTROL_SLA_SECONDS\" \"$control_archive_size\" \"$control_checked\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":391,"text":"if [[ \"$mode\" == write-health || \"$mode\" == scheduled ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":402,"text":"scheduler_ok=0"},{"file":"/usr/local/sbin/homelab-backup-audit","line":412,"text":"      if [[ \"$load_state\" == loaded && \"$unit_file_state\" == enabled && \"$active_state\" == active && \"$result\" != failed && \"$service_result\" != failed ]]; then status=OK; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi"},{"file":"/usr/local/sbin/homelab-backup-audit","line":415,"text":"      if [[ \"$load_state\" == not-found && \"$active_state\" == inactive ]]; then status=EXPECTED_ABSENT; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi"},{"file":"/usr/local/sbin/homelab-backup-audit","line":527,"text":"(( stale > 0 )) && add_risk HIGH RPO_BREACH"},{"file":"/usr/local/sbin/homelab-backup-audit","line":536,"text":"printf 'SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=%s|RISK_SEVERITY=%s|RISK_REASONS=%s|DR_PROOF_STATUS=%s|CONTROL_FRESHNESS=%s|LIFECYCLE_STATUS=%s|VM_COUNT=%s|APP_COUNT=%s|FRESH=%s|STALE=%s|RESUME=%s|UNVERIFIED=%s|CONTROL_STATE=%s|CLOUD_OK=%s|SCHEDULER_OK=%s|SOURCE_OK=%s|SOURCE_DRIFT=%s|STAGING_BAD=%s|STAGING_WARN=%s|PAYLOAD_LEAKS=%s|RETENTION_STATUS=%s|OBSERVABILITY=%s|SIZE_ANOMALIES=%s|CAPACITY=%s|GLOBAL_DR_PROVEN=%s\\n' \"$backup_status\" \"$risk_severity\" \"$risk_reasons\" \"$dr_proof_status\" \"$control_status\" \"$lifecycle_status\" \"$vm_seen\" \"$app_seen\" \"$fresh\" \"$stale\" \"$resume\" \"$unverified\" \"$control_status\" \"$cloud_ok\" \"$scheduler_ok\" \"$source_ok\" \"$source_drift\" \"$staging_bad\" \"$staging_warn\" \"$payload_leaks\" \"$retention_status\" \"$observability_status\" \"$size_anomaly_count\" \"$capacity_status\" \"$global_dr_proven\""},{"file":"/usr/local/sbin/homelab-backup-audit","line":538,"text":"if [[ \"$mode\" == write-health || \"$mode\" == scheduled ]]; then"},{"file":"/usr/local/sbin/homelab-backup-audit","line":541,"text":"  jq -n --arg task \"$TASK_ID\" --arg change \"$CHANGE_ID\" --arg at \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" --arg backup \"$backup_status\" --arg risk \"$risk_severity\" --arg reasons \"$risk_reasons\" --arg control \"$control_status\" --arg dr \"$dr_proof_status\" --arg lifecycle \"$lifecycle_status\" --arg escrow \"$escrow_status\" --arg staging \"$staging_status\" --arg retention \"$retention_status\" --arg observability \"$observability_status\" --arg capacity \"$capacity_status\" --argjson historical \"$historical_gc_proven\" --argjson owner_gc \"$owner_aware_gc_proven\" --argjson staging_bad \"$staging_bad\" --argjson staging_warn \"$staging_warn\" --argjson vm_count \"$vm_seen\" --argjson app_count \"$app_seen\" --argjson fresh \"$fresh\" --argjson stale \"$stale\" --argjson resume \"$resume\" --argjson unverified \"$unverified\" --argjson cloud_ok \"$cloud_ok\" --argjson scheduler_ok \"$scheduler_ok\" --argjson source_ok \"$source_ok\" --argjson source_drift \"$source_drift\" --argjson payload_leaks \"$payload_leaks\" --argjson size_anoma"},{"file":"/usr/local/sbin/homelab-backup-dispatcher","line":15,"text":"    if [[ \"$kind\" == VM ]]; then [[ \"$line\" == QUEUE_FRESHNESS\\ VMID=* ]] || continue; else [[ \"$line\" == QUEUE_FRESHNESS\\ APP=* ]] || continue; fi"},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":3,"text":"OUT=\"${HL_OUTPUT_DIR:-/var/log/homelab-backup-freshness}\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":38,"text":"  echo \"# HELP homelab_backup_freshness_artifact_candidates_total Backup artifact candidates found by safe local collector.\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":39,"text":"  echo \"# TYPE homelab_backup_freshness_artifact_candidates_total gauge\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":40,"text":"  echo \"homelab_backup_freshness_artifact_candidates_total $TOTAL\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":41,"text":"  echo \"# HELP homelab_backup_freshness_newest_artifact_age_seconds Age of newest backup-like artifact candidate in seconds, -1 if none.\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":42,"text":"  echo \"# TYPE homelab_backup_freshness_newest_artifact_age_seconds gauge\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":43,"text":"  echo \"homelab_backup_freshness_newest_artifact_age_seconds $AGE\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":44,"text":"  echo \"# HELP homelab_backup_freshness_run_success Last backup freshness collector run status.\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":45,"text":"  echo \"# TYPE homelab_backup_freshness_run_success gauge\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":46,"text":"  echo \"homelab_backup_freshness_run_success 1\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":47,"text":"} > \"$TEXTFILE/homelab_backup_freshness.prom\""},{"file":"/usr/local/sbin/homelab-backup-freshness.sh","line":48,"text":"chmod 0644 \"$TEXTFILE/homelab_backup_freshness.prom\""},{"file":"/usr/local/sbin/homelab-backup-matrix-refresh","line":112,"text":"    freshness=\"UNKNOWN\" if age<0 else (\"FRESH\" if age<=max_age else \"STALE\")"},{"file":"/usr/local/sbin/homelab-backup-matrix-refresh","line":114,"text":"    result={\"id\":jid,\"name\":name,\"category\":job.get(\"category\",\"unknown\"),\"critical\":critical,\"timer\":timer,\"service\":service,\"timer_enabled\":enabled,\"timer_active\":active,\"status\":final,\"source_kind\":source_kind,\"evidence_level\":evidence_level,\"service_result\":service_result,\"service_exec_main_status\":service_exec_main_status,\"source_health\":source,\"source_status\":source_status,\"source_mtime\":source_mtime,\"age_seconds\":age,\"max_age_seconds\":max_age,\"freshness\":freshness,\"generated_health_output\":job.get(\"generated_health_output\",\"\")}"},{"file":"/usr/local/sbin/homelab-backup-matrix-refresh","line":116,"text":"    mode_value=matrix.get(\"mode\",\"shadow\"); lines=[f\"STATUS={final}\",f\"TS={now_iso}\",\"TYPE=backup-matrix-generated\",f\"JOB_ID={jid}\",f\"JOB_NAME={name}\",f\"MATRIX_MODE={mode_value}\",f\"TIMER={timer}\",f\"SERVICE={service}\",f\"TIMER_ENABLED={enabled}\",f\"TIMER_ACTIVE={active}\",f\"SOURCE_KIND={source_kind}\",f\"EVIDENCE_LEVEL={evidence_level}\",f\"SERVICE_RESULT={service_result}\",f\"SERVICE_EXEC_MAIN_STATUS={service_exec_main_status}\",f\"SOURCE_HEALTH={source}\",f\"SOURCE_STATUS={source_status}\",f\"SOURCE_MTIME_UTC={source_mtime}\",f\"AGE_SECONDS={age}\",f\"MAX_AGE_SECONDS={max_age}\",f\"FRESHNESS={freshness}\"]"},{"file":"/usr/local/sbin/homelab-backup-npmplus-kuma-configs","line":70,"text":"  SELECT id || char(124) || name || char(124) || type || char(124) || url || char(124) || keyword || char(124) || interval || char(124) || maxretries || char(124) || retry_interval || char(124) || active"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":19,"text":"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":20,"text":"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":433,"text":"scheduled(){"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":434,"text":"  exec 5>\"$LOCK\"; flock -n 5 || { printf 'GC_SCHEDULED=SKIP|reason=GC_LOCK_BUSY\\n'; return 0; }"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":443,"text":"  if (( count == 0 && open_tx == 0 )); then write_health \"$p1\" true 0; cat \"$p1\"; printf 'GC_SCHEDULED=OK|deleted=0|transactions_resumed=0\\n'; return 0; fi"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":444,"text":"  if ! acquire_gc_locks; then write_health \"$p1\" true 0; printf 'GC_SCHEDULED=SKIP|reason=BACKUP_LOCK_BUSY|candidates=%s|open_transactions=%s\\n' \"$count\" \"$open_tx\"; return 0; fi"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":449,"text":"  if (( count == 0 )); then write_health \"$p2\" true 0; cat \"$p2\"; printf 'GC_SCHEDULED=OK|deleted=0|transactions_resumed=%s\\n' \"$open_tx\"; return 0; fi"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":450,"text":"  cmp -s <(grep '^DELETE|' \"$p1\" | stable_delete_set) <(grep '^DELETE|' \"$p2\" | stable_delete_set) || { write_health \"$p2\" true 0; printf 'GC_SCHEDULED=SKIP|reason=PLAN_CHANGED_AFTER_LOCK\\n'; return 0; }"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":454,"text":"  printf 'GC_SCHEDULED=OK|deleted=%s|transactions_resumed=%s\\n' \"$deleted\" \"$open_tx\""},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":462,"text":"  scheduled) scheduled ;;"},{"file":"/usr/local/sbin/homelab-backup-retention-gc","line":463,"text":"  *) die USAGE_contract_plan_canary_activate_scheduled 64 ;;"},{"file":"/usr/local/sbin/homelab-backup-sla-health","line":20,"text":"echo \"## App backup freshness\" >> \"$REPORT\""},{"file":"/usr/local/sbin/homelab-backup-sla-health","line":50,"text":"echo \"## Emergency backup freshness\" >> \"$REPORT\""},{"file":"/usr/local/sbin/homelab-backup-v2","line":5,"text":"EXPECTED={'fresh_lxc_helper.py': 'dbb3e6dbb71b10797df736431d9501a752a0f8c439163c9a0bddb7f76747f011', 'producer_exec_helper.py': 'b3b97099bcd7126670f866e81faae6a42a96d869d9989e6a67f6ea6c871c90b3', 'lxc_adapter.py': '3fa7d194010d76f7c8bc95035ae8876262e9337903e310f45f45df88c266dc8d', 'qemu_adapter.py': '1906db42bd34bbe85eb46fd9797b3572d46e0a41c29d1c29be5f9df5e448f15b', 'scheduler_adapter.py': 'a6f67159a64067773323f028126e3109e15cf17a8142cea5e6129970f1d4da96', 'entry504.py': 'ca6876fa9c3b1465b045344a8ad46962de16972c7dadc4ac6257c7d225047793'}"},{"file":"/usr/local/sbin/homelab-command-adapter","line":1089,"text":"                        \"capsule retry client IP mismatch\""},{"file":"/usr/local/sbin/homelab-command-adapter","line":1118,"text":"                    \"idempotent_retry\": True,"},{"file":"/usr/local/sbin/homelab-control-backup","line":105,"text":"  tmp=\"${HEALTH}.new.$$\"; jq -n --arg gen \"$gen\" --arg state \"$state\" --arg evidence \"$EVIDENCE_ROOT/$gen.json\" --arg sha \"$archive_sha\" --arg now \"$now\" '{schema:\"homelab-control-backup-health-v1\",status:\"OK\",generation:$gen,state_file:$state,restore_evidence:$evidence,archive_sha256:$sha,cloud_quorum:2,control_freshness:\"FRESH\",full_site_dr_proven:false,updated_at_utc:$now}' >\"$tmp\"; chmod 0644 \"$tmp\"; mv -f \"$tmp\" \"$HEALTH\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":13,"text":"LOCK=/run/homelab-edge-vm-offhost-freshness.lock"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":23,"text":"  printf 'STATUS=ERROR TS=%s TYPE=edge-vm-offhost-freshness BAD=1 REASON=%s\\n' \"$TS\" \"$reason\" >\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":24,"text":"  chmod 0644 \"$HEALTH_DIR/edge-vm-offhost-freshness.txt\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":25,"text":"  printf 'STATUS=ERROR TS=%s TYPE=edge-vm-offhost-freshness BAD=1 REASON=%s\\n' \"$TS\" \"$reason\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":153,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-offhost-freshness BAD=0 VMID=%s SOURCE_NODE=%s DEST_NODE=%s SRC=%s DEST=%s SIZE=%s SHA256=%s COPY_STATUS=%s ZSTD_RC=0 VMA_RC=0 KEEP=%s\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":155,"text":"  >\"$HEALTH_DIR/edge-vm-offhost-freshness.txt\""},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":156,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-backup NODE=%s VMID=%s ARCHIVE=%s SIZE=%s SHA256=%s NOTES=nightly_existing_dump_freshness\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":159,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-offhost NODE=%s VMID=%s HOST=%s DEST=%s SIZE=%s SHA256=%s NOTES=nightly_existing_dump_freshness\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":162,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-vzdump-restore-verify HOST=%s VMID=%s ARCHIVE=%s SIZE=%s SHA256=%s ZSTD_RC=0 VMA_RC=0 NOTES=nightly_existing_dump_freshness\\n' \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":166,"text":"  \"$HEALTH_DIR/edge-vm-offhost-freshness.txt\" \\"},{"file":"/usr/local/sbin/homelab-edge-vm-offhost-freshness","line":171,"text":"printf 'STATUS=OK TS=%s TYPE=edge-vm-offhost-freshness BAD=0 COPY_STATUS=%s SIZE=%s SHA256=%s DEST=%s COMPLETE_COUNT=%s KEEP=%s\\n' \\"},{"file":"/usr/local/sbin/homelab-final-readiness-gate","line":18,"text":"check \"backup framework evidence\" bash -c \"grep -q STATUS=OK /var/lib/homelab-health/backup-framework.txt && grep -q SOURCE_STATUS=OK /var/lib/homelab-health/backup-framework.txt && grep -q FRESHNESS=FRESH /var/lib/homelab-health/backup-framework.txt\""},{"file":"/usr/local/sbin/homelab-mail-cloud-edge-vm-upload","line":7,"text":"SOURCE_HEALTH=/var/lib/homelab-health/edge-vm-offhost-freshness.txt"},{"file":"/usr/local/sbin/homelab-mailru-trash-gc","line":183,"text":"         \"trash_debt_bytes\":\"UNKNOWN_PROVIDER_API\",\"last_success\":s}"},{"file":"/usr/local/sbin/homelab-reference-refresh","line":34,"text":" f=int(json.loads((R/\"manifest.json\").read_text()).get(\"freshness_seconds\",{}).get(s,3600));z=(t+datetime.timedelta(seconds=f)).isoformat()"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":219,"text":"      \"task_id\":\"backup-rotating-boot-drill-escrow-freshness-v1\","},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":444,"text":"        return {\"schema\":\"homelab-rotating-boot-drill-state-v1\",\"sequence\":0,\"qemu_cursor\":None,\"lxc_cursor\":None,\"last_success_utc\":None,\"last_evidence\":None}"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":651,"text":"    print(f\"BOOT_DRILL_SCHEDULED=DEFERRED|reason={code}\")"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":688,"text":"    wait=int(p[\"initial_lock_wait_seconds\"] if mode==\"initial\" else p[\"scheduled_lock_wait_seconds\"])"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":734,"text":"                          \"qemu_cursor\":q,\"lxc_cursor\":l,\"last_success_utc\":evidence[\"completed_at_utc\"],"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":749,"text":"        if mode==\"scheduled\" and e.code in (\"BACKUP_LOCK_BUSY\",\"ESCROW_SEMANTIC_PROOF_STALE\",\"CURRENT_BACKUP_AUDIT_NOT_DR_READY\",\"NO_QEMU_GUEST_AGENT_ELIGIBLE\",\"NO_LXC_RUNNING_ELIGIBLE\",\"STAGE_CAPACITY_INSUFFICIENT\",\"LOCAL_LVM_CAPACITY_INSUFFICIENT\"):"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":793,"text":"    elif action==\"scheduled\":"},{"file":"/usr/local/sbin/homelab-rotating-boot-drill","line":794,"text":"        execute(\"scheduled\",p)"},{"file":"/usr/local/sbin/homelab-safe-run","line":11,"text":"     \"kb/lessons/known_failures.json\",\"kb/current/02_FRESHNESS_POLICY.md\","},{"file":"/usr/local/sbin/homelab-vm-backup-health","line":20,"text":"if systemctl is-active --quiet homelab-edge-vm-offhost-freshness.timer; then DETAILS=\"$DETAILS edge-freshness-timer=active\"; else BAD=$((BAD+1)); DETAILS=\"$DETAILS edge-freshness-timer=bad\"; fi"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":6,"text":"PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":9,"text":"FRESHNESS_SECONDS=72000"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":16,"text":"(( DUE_SECONDS > 0 && DUE_SECONDS < FRESHNESS_SECONDS )) || die DUE_THRESHOLD_INVALID 65"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":80,"text":"freshness_decision(){"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":88,"text":"      printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_RESUME GENERATION=%s\\n' \"$vmid\" \"$generation\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":94,"text":"        printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_EPOCH_INVALID\\n' \"$vmid\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":99,"text":"        printf 'QUEUE_FRESHNESS VMID=%s DECISION=SKIP_FRESH GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":100,"text":"      elif (( age >= DUE_SECONDS && age < FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":101,"text":"        printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_DUE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":102,"text":"      elif (( age >= FRESHNESS_SECONDS )); then"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":103,"text":"        printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_STALE GENERATION=%s AGE_SECONDS=%s DUE_SECONDS=%s FRESHNESS_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\" \"$DUE_SECONDS\" \"$FRESHNESS_SECONDS\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":105,"text":"        printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED REASON=SEALED_TIMESTAMP_IN_FUTURE GENERATION=%s AGE_SECONDS=%s\\n' \"$vmid\" \"$generation\" \"$age\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":109,"text":"      printf 'QUEUE_FRESHNESS VMID=%s DECISION=BACKUP_UNVERIFIED\\n' \"$vmid\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":112,"text":"      die \"FRESHNESS_DECISION_INVALID_${vmid}_${decision:-EMPTY}\" 65"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":116,"text":"freshness_plan(){"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":118,"text":"  [[ -x \"$PROBE\" ]] || die \"FRESHNESS_PROBE_NOT_INSTALLED\" 69"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":121,"text":"    out=\"$(freshness_decision \"$vmid\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":123,"text":"    decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$out\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":124,"text":"    [[ -n \"$decision\" ]] || die \"FRESHNESS_PLAN_DECISION_MISSING_$vmid\" 65"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":125,"text":"    printf 'QUEUE_FRESHNESS_PLAN VMID=%s DECISION=%s\\n' \"$vmid\" \"$decision\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":144,"text":"  freshness_plan"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":147,"text":"  local vmid=\"$1\" freshness decision now_epoch out generation"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":161,"text":"  freshness=\"$(exec 8>&-; exec 9>&-; freshness_decision \"$vmid\" \"$now_epoch\")\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":162,"text":"  printf '%s\\n' \"$freshness\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":163,"text":"  decision=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^DECISION=/){sub(/^DECISION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":166,"text":"      generation=\"$(awk '/^QUEUE_FRESHNESS /{for(i=1;i<=NF;i++)if($i~/^GENERATION=/){sub(/^GENERATION=/,\"\",$i);print $i}}' <<<\"$freshness\" | tail -1)\""},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":171,"text":"    *) die \"FRESHNESS_RECHECK_INVALID_${vmid}_${decision:-EMPTY}\" 65 ;;"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":188,"text":"  freshness-plan)"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":189,"text":"    [[ \"$#\" == 1 ]] || die \"USAGE_FRESHNESS_PLAN\" 64"},{"file":"/usr/local/sbin/homelab-vm-cloud-quorum-queue","line":190,"text":"    freshness_plan"},{"file":"/usr/local/sbin/skladchik-reports-monitor-status","line":44,"text":"CANONICAL_PROBE=\"/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\""},{"file":"/usr/local/sbin/skladchik-reports-monitor-status","line":52,"text":"    grep -q '^FRESHNESS_STATUS=OK$' <<<\"$CANONICAL_OUTPUT\" || PROBLEMS=$((PROBLEMS+1))"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":24,"text":"APP_FRESHNESS_PROBE = Path(\"/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe\")"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":132,"text":"# HOMELAB_COOKIE_JAR_RETRY_423"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":225,"text":"        shlex.quote(str(APP_FRESHNESS_PROBE)) + \" decision skladchik-reports-monitor\","},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":230,"text":"    facts[\"canonical_backup_status\"] = probe.get(\"FRESHNESS_STATUS\", \"MISSING\")"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":239,"text":"    if probe.get(\"FRESHNESS_STATUS\") != \"OK\":"},{"file":"/usr/local/sbin/skladchik-reports-monitor-supervisor","line":286,"text":"        f\"- freshness status: {facts.get('canonical_backup_status')}\","}]
CLOUD_STATE={"A":{"about":{"free":293208518329,"total":1099511627776,"used":806303109447},"about_rc":0,"lsf_rc":0,"stderr_lines":[],"top_dirs_count":26},"B":{"about":{"free":293208454470,"total":1099511627776,"used":806303173306},"about_rc":0,"lsf_rc":0,"stderr_lines":[],"top_dirs_count":26}}
CLOUD_B_RESTORE_CANDIDATES=[]
CLOUD_B_RESTORE_PREFERRED=null
RETENTION_IMPLEMENTATION=[{"bytes":327,"interface_lines":[{"line":2,"text":"Description=Homelab owner-aware cloud retention GC"},{"line":5,"text":"ConditionPathExists=/usr/local/sbin/homelab-backup-retention-gc"},{"line":9,"text":"ExecStart=/usr/local/sbin/homelab-backup-retention-gc scheduled"},{"line":11,"text":"IOSchedulingClass=best-effort"}],"path":"/etc/systemd/system/homelab-backup-retention-gc.service","sha256":"0c49e10bdb225eeca0af5fca80aaf109addec2b18a6b892c0fe17c28b656ad7c"},{"bytes":237,"interface_lines":[{"line":2,"text":"Description=Run homelab owner-aware cloud retention GC daily"},{"line":9,"text":"Unit=homelab-backup-retention-gc.service"}],"path":"/etc/systemd/system/homelab-backup-retention-gc.timer","sha256":"a0e763670745a5ef7c04b54da23114a013f47075cf36cceef0218bae9b82ea2f"},{"bytes":7123,"interface_lines":[{"line":23,"text":"KEEP=\"${10:?keep}\""},{"line":132,"text":"    [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":138,"text":"  plan)"},{"line":146,"text":"    printf 'REMOTE_PLAN_STATUS=OK\\n'"},{"line":154,"text":"    [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":167,"text":"    [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":184,"text":"    [[ \"$(complete_count)\" == \"$KEEP\" ]]"},{"line":206,"text":"    [[ \"$(complete_count)\" == \"$KEEP\" ]]"}],"path":"/usr/local/libexec/homelab-edge-vm-offhost-retention-worker","sha256":"ca25a48b00c26e0eb5e64ac7d5e1d8f3805c200e30d9f87c5ef7c8da90402e54"},{"bytes":4296,"interface_lines":[{"line":3,"text":"KEEP=\"${1:-7}\""},{"line":4,"text":"MODE=\"${2:-dry-run}\""},{"line":6,"text":"[[ \"$KEEP\" =~ ^[0-9]+$ ]] || { echo \"BAD KEEP\"; exit 2; }"},{"line":7,"text":"(( KEEP >= 2 )) || { echo \"REFUSE keep<2\"; exit 2; }"},{"line":8,"text":"[[ \"$MODE\" == dry-run || \"$MODE\" == apply ]] || { echo \"BAD MODE\"; exit 2; }"},{"line":31,"text":"WORK=\"$(mktemp -d /tmp/app-retention-dual.XXXXXX)\""},{"line":71,"text":"  echo \"remote_index=$INDEX app=$APP canonical=$CANONICAL total=$TOTAL legacy=$LEGACY_TOTAL short=$SHORT_TOTAL keep=$KEEP mode=$MODE latest=${LATEST:-none}\""},{"line":76,"text":"    [[ \"$FOUND_LATEST\" -eq 1 ]] || { echo \"REFUSE latest not in retention set remote_index=$INDEX\"; exit 6; }"},{"line":78,"text":"  if (( TOTAL <= KEEP )); then echo \"nothing to delete\"; continue; fi"},{"line":79,"text":"  DELETE_COUNT=$((TOTAL-KEEP))"},{"line":80,"text":"  for ((I=0; I<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"}]
AUDIT_IMPLEMENTATION=[{"bytes":39160,"path":"/usr/local/sbin/homelab-backup-audit","relevant_lines":[{"line":12,"text":"VM_PROBE=/usr/local/libexec/homelab-vm-cloud-quorum-freshness-probe"},{"line":13,"text":"VM_WORKER=/usr/local/libexec/homelab-vm-cloud-quorum-node-worker"},{"line":14,"text":"APP_PROBE=/usr/local/libexec/homelab-app-cloud-quorum-freshness-probe"},{"line":15,"text":"APP_WORKER=/usr/local/libexec/homelab-app-cloud-quorum-worker"},{"line":16,"text":"APP_CORE=/usr/local/libexec/homelab-app-cloud-quorum-core-helper"},{"line":18,"text":"VM_QUEUE=/usr/local/sbin/homelab-vm-cloud-quorum-queue"},{"line":19,"text":"APP_QUEUE=/usr/local/sbin/homelab-app-cloud-quorum-queue"},{"line":22,"text":"CONTROL_BACKUP=/usr/local/sbin/homelab-control-backup"},{"line":23,"text":"CONTROL_BUILDER=/usr/local/libexec/homelab-control-bundle-builder"},{"line":24,"text":"CONTROL_TIMER=/etc/systemd/system/homelab-control-backup.timer"},{"line":25,"text":"CONTROL_SERVICE=/etc/systemd/system/homelab-control-backup.service"},{"line":26,"text":"CONTROL_RUNTIME_MANIFEST=/etc/homelab-backup/control-runtime-paths.txt"},{"line":27,"text":"CONTROL_SYSTEMD_MANIFEST=/etc/homelab-backup/control-systemd-paths.txt"},{"line":28,"text":"VM_TIMER=/etc/systemd/system/homelab-vm-cloud-quorum-queue.timer"},{"line":29,"text":"APP_TIMER=/etc/systemd/system/homelab-app-cloud-quorum-queue.timer"},{"line":30,"text":"VM_SERVICE=/etc/systemd/system/homelab-vm-cloud-quorum-queue.service"},{"line":31,"text":"APP_SERVICE=/etc/systemd/system/homelab-app-cloud-quorum-queue.service"},{"line":47,"text":"CONTROL_BACKUP_SHA=0b3a0f685d4e67cb86250df89a4918aff2e6c67799b7d35b0e54b1bbc016ee57"},{"line":48,"text":"CONTROL_BUILDER_SHA=2e1c3935b5016c09aad21f34a36f7e1f53188bbc34a3f033e59fe964571ec3f0"},{"line":49,"text":"CONTROL_TIMER_SHA=7c4136da20b9cd9162293380f5794d93e2c6099ce7d87ec00e0e7e19b6cd44a3"},{"line":50,"text":"CONTROL_SERVICE_SHA=428d3e1f3042c3347b7c34b6f190e44fa35f7a97264eec3974239f581c9b9250"},{"line":51,"text":"CONTROL_RUNTIME_MANIFEST_SHA=6777f95159db0fa213017f286f2cee6cc51e9963a01a0578cee8586e8731b2be"},{"line":52,"text":"CONTROL_SYSTEMD_MANIFEST_SHA=7f990d6257b43f97c3c8407945ca9dae6113dc9064c6cf1f25e7fcdaf99d5163"},{"line":53,"text":"VM_TIMER_SHA=9a78c9ea507116cbb9f5645fe697e34964c905b017cc98b17977cd5006aa5050"},{"line":54,"text":"APP_TIMER_SHA=af2eedce3df53029b591d31715a3f3e6688ddb997b4823f487e70c339ce88078"},{"line":60,"text":"CONTROL_STATE_ROOT=/var/lib/homelab-backup/cloud-quorum/control-bootstrap-v2"},{"line":61,"text":"CONTROL_EVIDENCE_ROOT=/var/lib/homelab-backup/control-restore-validation/control-bootstrap"},{"line":69,"text":"CONTROL_SLA_SECONDS=86400"},{"line":140,"text":"  printf 'CONTRACT|task=%s|target_registry=CANONICAL|vm_count=%s|app_count=%s|control_sla_seconds=%s|retention=ACTIVE_OWNER_AWARE|provider_worm=NOT_PROVEN_SKIPPED|dr_proof_source=EXACT_SITE_DR_FINAL_SEAL|legacy_site_dr_seal=AUTHORITATIVE|control_freshness=RECURRING_PRODUCER_12H_DUE_24H_SLA|full_site_dr=PROVEN_BY_SEAL\\n' \"$TASK_ID\" \"${#VMIDS[@]}\" \"${#APPS[@]}\" \"$CONTROL_SLA_SECONDS\""},{"line":170,"text":"stale=0"},{"line":192,"text":"source_hash_local CONTROL_BACKUP \"$CONTROL_BACKUP\" \"$CONTROL_BACKUP_SHA\""},{"line":193,"text":"source_hash_local CONTROL_BUILDER \"$CONTROL_BUILDER\" \"$CONTROL_BUILDER_SHA\""},{"line":194,"text":"source_hash_local CONTROL_TIMER \"$CONTROL_TIMER\" \"$CONTROL_TIMER_SHA\""},{"line":195,"text":"source_hash_local CONTROL_SERVICE \"$CONTROL_SERVICE\" \"$CONTROL_SERVICE_SHA\""},{"line":196,"text":"source_hash_local CONTROL_RUNTIME_MANIFEST \"$CONTROL_RUNTIME_MANIFEST\" \"$CONTROL_RUNTIME_MANIFEST_SHA\""},{"line":197,"text":"source_hash_local CONTROL_SYSTEMD_MANIFEST \"$CONTROL_SYSTEMD_MANIFEST\" \"$CONTROL_SYSTEMD_MANIFEST_SHA\""},{"line":198,"text":"source_hash_local VM_TIMER \"$VM_TIMER\" \"$VM_TIMER_SHA\""},{"line":199,"text":"source_hash_local APP_TIMER \"$APP_TIMER\" \"$APP_TIMER_SHA\""},{"line":233,"text":"          if (( age < vm_sla )); then state=FRESH; fresh=$((fresh+1)); else state=STALE; stale=$((stale+1)); fi"},{"line":253,"text":"    unverified=$((unverified+1)); printf 'TARGET|kind=VM|id=%s|owner=%s|state=UNVERIFIED|generation=UNKNOWN|age_seconds=-1|sla_seconds=%s|reason=PROBE_FAILED\\n' \"$vmid\" \"$node\" \"$vm_sla\""},{"line":273,"text":"          if (( age < app_sla )); then state=FRESH; fresh=$((fresh+1)); else state=STALE; stale=$((stale+1)); fi"},{"line":293,"text":"    unverified=$((unverified+1)); printf 'TARGET|kind=APP|id=%s|owner=pve01|state=UNVERIFIED|generation=UNKNOWN|age_seconds=-1|sla_seconds=%s|reason=PROBE_FAILED\\n' \"$app\" \"$app_sla\""},{"line":297,"text":"control_status=UNVERIFIED"},{"line":298,"text":"control_age=-1"},{"line":299,"text":"control_generation=UNKNOWN"},{"line":300,"text":"control_checked=false"},{"line":301,"text":"control_state=\"\""},{"line":302,"text":"control_degraded=0"},{"line":303,"text":"control_bad=0"},{"line":304,"text":"if control_state=\"$(find \"$CONTROL_STATE_ROOT\" -type f -name '*.json' -printf '%T@|%p\\n' 2>&1 | LC_ALL=C sort -n | tail -n 1 | cut -d'|' -f2-)\"; then :; else control_state=\"\"; fi"},{"line":305,"text":"if [[ -n \"$control_state\" && -s \"$control_state\" && ! -L \"$control_state\" ]]; then"},{"line":306,"text":"  control_generation=\"$(jq -er '.generation' \"$control_state\" 2>&1)\" || control_generation=UNKNOWN"},{"line":307,"text":"  transport_status=\"$(jq -er '.status' \"$control_state\" 2>&1)\" || transport_status=INVALID"},{"line":308,"text":"  if [[ ! \"$control_generation\" =~ ^control-bootstrap-v2-pve01-[0-9]{8}T[0-9]{6}Z$ ]]; then transport_status=INVALID; fi"},{"line":311,"text":"      control_status=RESUME"},{"line":312,"text":"      control_degraded=1"},{"line":316,"text":"      if strict=\"$(jq -er 'if .schema==\"homelab-cloud-quorum-payload-v1\" and .logical_id==\"control-bootstrap-v2\" and .status==\"SEALED\" and .cloud_quorum==2 and .cloud_a_verified==true and .cloud_b_verified==true and .part_hashes_verified==true and .seal_written==true and .cloud_a_seal_verified==true and .cloud_b_seal_verified==true and .local_payload_present==false and .local_cleanup==\"OK\" then \"OK\" else error(\"strict state invalid\") end' \"$control_state\" 2>&1)\"; then"},{"line":317,"text":"        control_updated=\"$(jq -er '.sealed_at_utc // .updated_at_utc' \"$control_state\" 2>&1)\" || control_updated=INVALID"},{"line":318,"text":"        control_sha=\"$(jq -er '.archive_sha256' \"$control_state\" 2>&1)\" || control_sha=INVALID"},{"line":319,"text":"        control_epoch=\"$(date -u -d \"$control_updated\" +%s 2>&1)\" || control_epoch=-1"},{"line":320,"text":"        control_evidence=\"$CONTROL_EVIDENCE_ROOT/$control_generation.json\""},{"line":321,"text":"        if [[ \"$control_epoch\" =~ ^[0-9]+$ && \"$control_epoch\" -le \"$now\" && -s \"$control_evidence\" && ! -L \"$control_evidence\" ]]; then"},{"line":322,"text":"          if evidence_ok=\"$(jq -er --arg g \"$control_generation\" --arg sha \"$control_sha\" 'if .result==\"OK\" and .logical_id==\"control-bootstrap-v2\" and .generation==$g and .restore_source==\"Cloud A + Cloud B\" and .payload_sha256==$sha and .payload_sha256_verified==true and .control_manifest_verified==true and .payload_checksums_verified==true and .ops_git_bundle_verified==true and .desired_git_bundle_verified==true and .secret_escrow_separate==true and .clean_machine_bootstrap_proven==false then \"OK\" else error(\"control evidence invalid\") end' \"$control_evidence\" 2>&1)\"; then"},{"line":323,"text":"            control_checked=true"},{"line":324,"text":"            control_age=$((now-control_epoch))"},{"line":325,"text":"            if (( control_age < CONTROL_SLA_SECONDS )); then control_status=FRESH_SEALED_PROVEN; else control_status=STALE_PROVEN; control_bad=1; infra_bad=$((infra_bad+1)); fi"},{"line":326,"text":"            control_payload=\"$(jq -er '.payload_path' \"$control_state\" 2>&1)\" || control_payload=INVALID"},{"line":327,"text":"            if [[ \"$control_payload\" != /* ]] || [[ -e \"$control_payload\" ]]; then payload_leaks=$((payload_leaks+1)); fi"},{"line":329,"text":"            control_bad=1; infra_bad=$((infra_bad+1))"},{"line":332,"text":"          control_bad=1; infra_bad=$((infra_bad+1))"},{"line":335,"text":"        control_bad=1; infra_bad=$((infra_bad+1))"},{"line":338,"text":"    *) control_bad=1; infra_bad=$((infra_bad+1)) ;;"},{"line":341,"text":"  control_bad=1; infra_bad=$((infra_bad+1))"},{"line":343,"text":"control_archive_size=-1"},{"line":344,"text":"if [[ -n \"$control_state\" && -s \"$control_state\" && \"$control_status\" != UNVERIFIED && \"$control_status\" != RESUME ]]; then control_archive_size=\"$(jq -er '.archive_size_bytes' \"$control_state\" 2>/dev/null)\" || control_archive_size=-1; if ! append_obs_target CONTROL control-bootstrap-v2 control-bootstrap-v2 \"$control_archive_size\"; then observability_input_bad=$((observability_input_bad+1)); fi; fi"},{"line":345,"text":"printf 'CONTROL|state=%s|CONTROL_FRESHNESS=%s|generation=%s|age_seconds=%s|sla_seconds=%s|archive_size_bytes=%s|restore_evidence_checked=%s|source_coverage=RESTORE_EVIDENCE|retention=ACTIVE_OWNER_AWARE\\n' \"$control_status\" \"$control_status\" \"$control_generation\" \"$control_age\" \"$CONTROL_SLA_SECONDS\" \"$control_archive_size\" \"$control_checked\""},{"line":410,"text":"      service=\"${unit%.timer}.service\""},{"line":412,"text":"      if [[ \"$load_state\" == loaded && \"$unit_file_state\" == enabled && \"$active_state\" == active && \"$result\" != failed && \"$service_result\" != failed ]]; then status=OK; scheduler_ok=$((scheduler_ok+1)); else status=BAD; infra_bad=$((infra_bad+1)); fi"},{"line":422,"text":"for lock in /run/homelab-backup-heavy.lock /run/lock/homelab-vm-cloud-quorum-queue.lock /run/lock/homelab-app-cloud-quorum-queue.lock /run/lock/homelab-backup-dispatcher.lock; do"},{"line":466,"text":"if [[ -s \"$RETENTION_HEALTH\" && ! -L \"$RETENTION_HEALTH\" ]] && jq -e '.schema==\"homelab-backup-retention-v1\" and .status==\"OK\" and .policy.vm_keep==2 and .policy.app_keep==7 and .policy.control_keep==4 and .owner_aware_gc_proven==true and .destructive_canary_proven==true' \"$RETENTION_HEALTH\" >/dev/null; then"},{"line":473,"text":"printf 'RETENTION|status=%s|historical_gc_proven=%s|owner_aware_gc_proven=%s|vm_keep=2|app_keep=7|control_keep=4\\n' \"$retention_status\" \"$( [[ \"$historical_gc_proven\" == true ]] && printf YES || printf NO )\" \"$( [[ \"$owner_aware_gc_proven\" == true ]] && printf YES || printf NO )\""},{"line":510,"text":"if (( stale > 0 || unverified > 0 || payload_leaks > 0 || infra_bad > 0 )); then backup_status=RED"},{"line":527,"text":"(( stale > 0 )) && add_risk HIGH RPO_BREACH"},{"line":536,"text":"printf 'SUMMARY|AUDIT_STATUS=OK|BACKUP_STATUS=%s|RISK_SEVERITY=%s|RISK_REASONS=%s|DR_PROOF_STATUS=%s|CONTROL_FRESHNESS=%s|LIFECYCLE_STATUS=%s|VM_COUNT=%s|APP_COUNT=%s|FRESH=%s|STALE=%s|RESUME=%s|UNVERIFIED=%s|CONTROL_STATE=%s|CLOUD_OK=%s|SCHEDULER_OK=%s|SOURCE_OK=%s|SOURCE_DRIFT=%s|STAGING_BAD=%s|STAGING_WARN=%s|PAYLOAD_LEAKS=%s|RETENTION_STATUS=%s|OBSERVABILITY=%s|SIZE_ANOMALIES=%s|CAPACITY=%s|GLOBAL_DR_PROVEN=%s\\n' \"$backup_status\" \"$risk_severity\" \"$risk_reasons\" \"$dr_proof_status\" \"$control_status\" \"$lifecycle_status\" \"$vm_seen\" \"$app_seen\" \"$fresh\" \"$stale\" \"$resume\" \"$unverified\" \"$control_status\" \"$cloud_ok\" \"$scheduler_ok\" \"$source_ok\" \"$source_drift\" \"$staging_bad\" \"$staging_warn\" \"$payload_leaks\" \"$retention_status\" \"$observability_status\" \"$size_anomaly_count\" \"$capacity_status\" \"$global_dr_proven\""},{"line":541,"text":"  jq -n --arg task \"$TASK_ID\" --arg change \"$CHANGE_ID\" --arg at \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" --arg backup \"$backup_status\" --arg risk \"$risk_severity\" --arg reasons \"$risk_reasons\" --arg control \"$control_status\" --arg dr \"$dr_proof_status\" --arg lifecycle \"$lifecycle_status\" --arg escrow \"$escrow_status\" --arg staging \"$staging_status\" --arg retention \"$retention_status\" --arg observability \"$observability_status\" --arg capacity \"$capacity_status\" --argjson historical \"$historical_gc_proven\" --argjson owner_gc \"$owner_aware_gc_proven\" --argjson staging_bad \"$staging_bad\" --argjson staging_warn \"$staging_warn\" --argjson vm_count \"$vm_seen\" --argjson app_count \"$app_seen\" --argjson fresh \"$fresh\" --argjson stale \"$stale\" --argjson resume \"$resume\" --argjson unverified \"$unverified\" --argjson cloud_ok \"$cloud_ok\" --argjson scheduler_ok \"$scheduler_ok\" --argjson source_ok \"$source_ok\" --argjson source_drift \"$source_drift\" --argjson payload_leaks \"$payload_leaks\" --argjson size_anoma"}],"sha256":"1474c9ce58bbc1b3ae7437261d1bdb923232926fb2943c7c830253f8b284724c"},{"bytes":2161,"path":"/usr/local/sbin/homelab-vps-identity-audit","relevant_lines":[],"sha256":"b709691c52ae48432b70e197eb4810b6c374a05911cee3b9fdba4ecc67c76c3a"}]
ALERT_IMPLEMENTATION={"bytes":1806,"exists":true,"sha256":"6deef30b4708a7e5b2ac0f0d98bb6b37b22d858afde994483b67baa18dffdc2a","structure_lines":[{"line":4,"text":"APP=\"alertmanager\""},{"line":14,"text":"fail(){ echo \"[ERROR] alertmanager backup failed; kept: $STAGE\"; }"},{"line":16,"text":"ssh -n -o BatchMode=yes -o ConnectTimeout=8 \"$MON\" \"sudo -n docker exec alertmanager amtool check-config /etc/alertmanager/alertmanager.yml >/dev/null && sudo -n tar -C / -czf - opt/stacks/observability-lite/compose.yaml opt/stacks/observability-lite/compose.override.yaml opt/stacks/observability-lite/alertmanager/alertmanager.yml opt/stacks/observability-lite/alertmanager/data\" > \"$STAGE/remote.tgz\""},{"line":19,"text":"test -s \"$STAGE/payload/opt/stacks/observability-lite/alertmanager/alertmanager.yml\""},{"line":21,"text":"jq -n --arg app \"$APP\" --arg host \"monitoring\" --arg engine \"files+alertmanager-config-check\" --arg config \"ok\" --argjson files \"$FILES\" \"{app:\\$app,engine:\\$engine,source_host:\\$host,source_paths:[\\\"monitoring:/opt/stacks/observability-lite/alertmanager\\\",\\\"monitoring:/opt/stacks/observability-lite/compose.yaml\\\",\\\"monitoring:/opt/stacks/observability-lite/compose.override.yaml\\\"],config_check:\\$config,file_count:\\$files,note:\\\"Alertmanager configuration and runtime state in encrypted two-cloud backup\\\"}\" > \"$STAGE/metadata.json\""},{"line":25,"text":"echo ALERTMANAGER_BACKUP_RUN=OK"}]}
ALERT_SYSTEMD_REFERENCES=[]
MAIL_ROUTE_READINESS={"postfix_active":true,"pve_user_email_present":false,"relayhost_configured":false,"root_alias_present":false,"sendmail_present":true,"smtp_sasl_auth_enable":"no","smtp_sasl_password_maps_configured":false,"smtp_tls_security_level":""}
SOURCE_PUBLICATION_STATE={"cr_branch_sha":null,"fetch_url_present":true,"local_head":"50bf24f8ee27f3d2e0d1cbc6c17b62c69ff06bae","ls_remote_rc":0,"main_sha":"326622a4864fa9b5f43b69981733236bb42c4d7b","pushurl_is_disabled":true}
DR_RESTORE_SEALS=[{"mtime_epoch":1786237057,"name":"backup-app-cloud-quorum-cutover-v1.json","selected":{"change_id":"CR-2026-0020","status":"SEALED","task_id":"backup-app-cloud-quorum-cutover-v1"},"sha256":"c77f83927dcf020cac0182bf8f7145ac823b3bbb2b62dd1021dbc9a340b0c467"},{"mtime_epoch":1786241107,"name":"backup-app-cloud-quorum-freshness-v1.json","selected":{"change_id":"CR-2026-0022","status":"SEALED","task_id":"backup-app-cloud-quorum-freshness-v1"},"sha256":"0d5374f9cceb05113c24ce9ee16a3b12f1e7846261b4d5801b125489ac45c4d7"},{"mtime_epoch":1786453079,"name":"backup-cloud-legacy-retirement-v1.json","selected":{"change_id":"CR-2026-0035","status":"SEALED","task_id":"backup-cloud-legacy-retirement-v1"},"sha256":"fe78e534174b1e23ef0aef72599cf74e73332d7abe100dda02b9ebb2f2f7afdc"},{"mtime_epoch":1786396264,"name":"backup-control-bootstrap-cloud-quorum-v1.json","selected":{"change_id":"CR-2026-0029","logical_id":"control-bootstrap","status":"SEALED","task_id":"backup-control-bootstrap-cloud-quorum-v1"},"sha256":"332f9fd0822a1531753a16978d33e8543694f3c2c0e329ba6115bf05c00d02d8"},{"mtime_epoch":1786406463,"name":"backup-control-bootstrap-configs-source-v1.json","selected":{"change_id":"CR-2026-0030","logical_id":"control-bootstrap-v2","status":"SEALED","task_id":"backup-control-bootstrap-configs-source-v1"},"sha256":"8a39632eb3901677047a544243c52a32e304912c589376ff855ef4c623a46fa9"},{"mtime_epoch":1786601026,"name":"backup-control-coverage-hardening-v1.json","selected":{"change_id":"CR-2026-0054","status":"SEALED","task_id":"backup-control-coverage-hardening-v1"},"sha256":"d4f1240df892ddddfd880bc5d5fca5df1c5c0d5c93f21c56658a669ed7547b58"},{"mtime_epoch":1786441319,"name":"backup-control-final-generation-v1.json","selected":{"change_id":"CR-2026-0034","status":"SEALED","task_id":"backup-control-final-generation-v1"},"sha256":"c5a0d270c9582e84f61564905734d76796bb5aa2de93873d1a639f5dbe7695a2"},{"mtime_epoch":1787357380,"name":"backup-control-refresh-current-v3.json","selected":{"change_id":"CR-2026-0095","status":"SEALED","task_id":"backup-control-refresh-current-v3"},"sha256":"5c7cb7ce3af6fe4ce3c11d0f3c2a2ab80790d7997b4ceea64ae5d9cc5bc4ada4"},{"mtime_epoch":1786685619,"name":"backup-control-refresh-post-legacy-retirement-v1.json","selected":{"change_id":"CR-2026-0067","status":"SEALED","task_id":"backup-control-refresh-post-legacy-retirement-v1"},"sha256":"6986ef7c5a3f13a3d199397e3f01a45c4418d81ce7ccd1f929fc9cb5593fd9db"},{"mtime_epoch":1786604876,"name":"backup-control-refresh-v1.json","selected":{"change_id":"CR-2026-0057","status":"SEALED","task_id":"backup-control-refresh-v1"},"sha256":"52abe0785bbabf2ed7df5a4f46580487f65ab48b2a3462b32ae4e0943894fcc2"},{"mtime_epoch":1786719633,"name":"backup-delete-evidence-hardening-v1.json","selected":{"change_id":"CR-2026-0074","status":"SEALED","task_id":"backup-delete-evidence-hardening-v1"},"sha256":"02abe418e49139b034984128399374301505686e45d07db8ffb6a9b8e1c53fd0"},{"mtime_epoch":1789959071,"name":"backup-gfs-lifecycle-remediation-v1.json","selected":{"change_id":"CR-2026-1005","status":"SEALED","task_id":"backup-gfs-lifecycle-remediation-v1"},"sha256":"b7da77e3a40ce308f56bbc3915569e071079773db39df1e7adc84929baf69bc6"},{"mtime_epoch":1786717462,"name":"backup-gfs-retention-v1.json","selected":{"change_id":"CR-2026-0072","status":"SEALED","task_id":"backup-gfs-retention-v1"},"sha256":"e6857f4f736d2f9506c0184119e6152ceb8301fcfaa75eb983b9e9fd4b3fac87"},{"mtime_epoch":1786247840,"name":"backup-hbarhub-cloud-quorum-v1.json","selected":{"change_id":"CR-2026-0024","logical_id":"app-hbarhub","status":"SEALED","task_id":"backup-hbarhub-cloud-quorum-v1"},"sha256":"d7d6f959ff3575b27602ffe09a0d304f12d477b499637a2ea7358bfa85e7b20e"},{"mtime_epoch":1786373683,"name":"backup-lock-fd-hardening-v1.json","selected":{"change_id":"CR-2026-0027","status":"SEALED","task_id":"backup-lock-fd-hardening-v1"},"sha256":"3d1e9f182ce7263f2c4148618b132277c7125f4d0a348203cd1c08b711076501"},{"mtime_epoch":1786565758,"name":"backup-matrix-residue-retirement-v1.json","selected":{"change_id":"CR-2026-0050","status":"SEALED","task_id":"backup-matrix-residue-retirement-v1"},"sha256":"85036d473fa309331a9167d58ef1f2bd7e7466d52b9b130096dbdc45507512fc"},{"mtime_epoch":1786703572,"name":"backup-observability-risk-forecast-v1.json","selected":{"change_id":"CR-2026-0071","status":"SEALED","task_id":"backup-observability-risk-forecast-v1"},"sha256":"40a316a39025867cfb488543006badf0bdb315aec65c0c5f8ef20bc1b1665915"},{"mtime_epoch":1786643518,"name":"backup-retention-dynamic-pinned-prune-mailru-cleanup-v1.json","selected":{"change_id":"CR-2026-0065","status":"SEALED","task_id":"backup-retention-dynamic-pinned-prune-mailru-cleanup-v1"},"sha256":"f9165cf9faf0d2bd7803b7dc9763d24244e677d14d4a3d8fce558a4b8326088a"},{"mtime_epoch":1786639543,"name":"backup-retention-pinned-scheduled-scope-hotfix-v1.json","selected":{"change_id":"CR-2026-0064","status":"SEALED","task_id":"backup-retention-pinned-scheduled-scope-hotfix-v1"},"sha256":"8b2ddd3968a8c2bcb4fc91855f667a21c0aa2710944fe2553108350344a7dd56"},{"mtime_epoch":1786599343,"name":"backup-retention-plan-stability-hotfix-v1.json","selected":{"change_id":"CR-2026-0055","status":"SEALED","task_id":"backup-retention-plan-stability-hotfix-v1"},"sha256":"4d7ebbc69ee319f210785ef6113e033dca9e2ceed2e706afc8f0b3cf10873026"},{"mtime_epoch":1786607325,"name":"backup-retention-remote-list-failclosed-hotfix-v1.json","selected":{"change_id":"CR-2026-0060","status":"SEALED","task_id":"backup-retention-remote-list-failclosed-hotfix-v1"},"sha256":"b2831634be5ff1f829302b83025fc5ba7649dcbe72fd14cdfda1e5d7a0f52e07"},{"mtime_epoch":1786513619,"name":"backup-retention-remote-stdin-hotfix-v1.json","selected":{"change_id":"CR-2026-0035","status":"SEALED","task_id":"backup-retention-remote-stdin-hotfix-v1"},"sha256":"d42d89260f2304945df40c958fd5a52b758a674bcb10b9323552a0a7b35ce7ae"},{"mtime_epoch":1786431140,"name":"backup-retention-safe-gc-v1.json","selected":{"change_id":"CR-2026-0033","status":"SEALED","task_id":"backup-retention-safe-gc-v1"},"sha256":"2e1d4745b70ea6e3e96097ccc336fd7d555e70b8cc058b96491fd8c87d95579f"},{"mtime_epoch":1786600541,"name":"backup-retention-transaction-resume-hotfix-v1.json","selected":{"change_id":"CR-2026-0056","status":"SEALED","task_id":"backup-retention-transaction-resume-hotfix-v1"},"sha256":"d4e4dd8d58d0fc527cd7210c6252b6321e0568961c03a4ddd729fbdb20494928"},{"mtime_epoch":1786726495,"name":"backup-rotating-boot-drill-escrow-freshness-v1.json","selected":{"change_id":"CR-2026-0075","status":"SEALED","task_id":"backup-rotating-boot-drill-escrow-freshness-v1"},"sha256":"9a38eebec6e913d802dd08bb4dcb5612dfec734530bbf1afbe7e277507ccd163"},{"mtime_epoch":1786387065,"name":"backup-scheduler-fairness-granularity-v1.json","selected":{"change_id":"CR-2026-0028","status":"SEALED","task_id":"backup-scheduler-fairness-granularity-v1"},"sha256":"cf0fd28e413fc9eb6dbd76149378a169b987c7509246ae1758cc75041a8d393b"},{"mtime_epoch":1786359648,"name":"backup-scheduler-rpo-hardening-v1.json","selected":{"change_id":"CR-2026-0026","status":"SEALED","task_id":"backup-scheduler-rpo-hardening-v1"},"sha256":"b56847a3c68d16559aabcd23ff46dfefd820fc970432afd2232415bc0202af3e"},{"mtime_epoch":1786297580,"name":"backup-scrutiny-cloud-quorum-v1.json","selected":{"change_id":"CR-2026-0025","logical_id":"app-scrutiny","status":"SEALED","task_id":"backup-scrutiny-cloud-quorum-v1"},"sha256":"eb50068d771572139320b41b4a9a4fef9fa28fd977686d66f84e15a987dd43a3"},{"mtime_epoch":1786698442,"name":"backup-target-lifecycle-registry-v1.json","selected":{"change_id":"CR-2026-0070","status":"SEALED","task_id":"backup-target-lifecycle-registry-v1"},"sha256":"b843b84c66c739ec42e8454b8a996eb827364fb6c938a8ce86e4e5ac7c16c0b8"},{"mtime_epoch":1786428928,"name":"backup-unified-monitoring-v1.json","selected":{"change_id":"CR-2026-0032","status":"SEALED","task_id":"backup-unified-monitoring-v1"},"sha256":"26cbd0d9f84cf4bd8aec1c8ad479e612afde3949954003dd0d9f4a1bbc278867"},{"mtime_epoch":1786200294,"name":"backup-vm-cloud-quorum-cutover-v1.json","selected":{"change_id":"CR-2026-0019","status":"SEALED","task_id":"backup-vm-cloud-quorum-cutover-v1"},"sha256":"33b0dadaf58949fe1356904c7171f4be992dc3866e3ba4688e0ada41e6266aac"},{"mtime_epoch":1786239546,"name":"backup-vm-cloud-quorum-freshness-v1.json","selected":{"change_id":"CR-2026-0021","status":"SEALED","task_id":"backup-vm-cloud-quorum-freshness-v1"},"sha256":"89a3a916b5a099ba71fb6f171c16bb52adeec45295315a9b605b1703b2ed3f65"},{"mtime_epoch":1786422218,"name":"backup-vm-restore-evidence-hardening-v1.json","selected":{"change_id":"CR-2026-0031","status":"SEALED","task_id":"backup-vm-restore-evidence-hardening-v1"},"sha256":"5f1274624374adbbb495b1701fe1eedaab028fad0f97a2409f0b79df9a791f9a"},{"mtime_epoch":1786459865,"name":"cluster-postdr-storage-retirement-v1.json","selected":{"change_id":"CR-2026-0038","status":"SEALED","task_id":"cluster-postdr-storage-retirement-v1"},"sha256":"d25c1760d3ea45ac695ee1fc5d2636bbb1c012da96c3ba4e89767915efe0e7d2"},{"mtime_epoch":1784329495,"name":"homelab-backup-tail-closure-v1.json","selected":{"change_id":"CR-2026-0004","status":"SEALED","task_id":"homelab-backup-tail-closure-v1"},"sha256":"9a52b2bb0186f9807a0b25274f819c33b097dbbfaa32f03f1c31360354c096c1"},{"mtime_epoch":1786684253,"name":"legacy-backup-target-retirement-v1.json","selected":{"change_id":"CR-2026-0066","status":"SEALED","task_id":"legacy-backup-target-retirement-v1"},"sha256":"830eb32a0c3366d51c9d798736ccbd3048a0524b38cd228a58085499b610048f"},{"mtime_epoch":1786555697,"name":"reports-monitor-canonical-backup-supervision-v1.json","selected":{"change_id":"CR-2026-0046","status":"SEALED","task_id":"reports-monitor-canonical-backup-supervision-v1"},"sha256":"2c4fdb17fbd7caec98e111fae74e1d8bad3942cc2c7bc33a0b1c8b769b542076"},{"mtime_epoch":1786450297,"name":"site-dr-final-acceptance-v1.json","selected":{"change_id":"DR-2026-FINAL","status":"SEALED","task_id":"site-dr-final-resume-boot-v1"},"sha256":"b9f8172bac0206380198ac68079625b06f06eac7d484e66226082ebc1abae14d"},{"mtime_epoch":1786470088,"name":"vm160-post-cleanup-canonical-backup-v1.json","selected":{"change_id":"CR-2026-0043","status":"SEALED","target":"vm160","task_id":"vm160-post-cleanup-canonical-backup-v1"},"sha256":"83b76b909bad03476133425e38ab0be75a300a821300389660aa2f620c543d0c"}]
CLOSURE_GATES={"active_targets_with_state_missing":8,"alert_script_present":true,"cloud_a_readable":true,"cloud_b_readable":true,"gfs_ok":true,"retention_timer_safely_held":true,"sendmail_present":true,"source_offhost_branch_exact":false,"v2_timer_enabled_active":true}
NO_MUTATION=true
NO_REPO_WRITE=true
NO_GIT_FETCH=true
NO_GIT_COMMIT=true
NO_GIT_PUSH_UPDATE=true
NO_SYSTEMD_ACTION=true
NO_BACKUP_STARTED=true
NO_RESTORE_STARTED=true
NO_RETENTION_GC_STARTED=true
NO_CLOUD_DELETE=true
NO_MAIL_SENT=true
AUDIT_DURATION_SEC=1.505
TASK_RESULT=PASS_HOMELAB_BACKUP_CLOSURE_AUDIT_READONLY
HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260921-HOMELAB-BACKUP-CLOSURE-AUDIT-READONLY-1037R1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1}
WORKERS2_BACKUP_CLOSURE_AUDIT_END=1

OUTPUT_END
CHAT_OUTPUT_END
