{ "schema_version": 1, "channel": "homelab-runtime", "command_id": "SUPPORT-260921-HOMELAB-BACKUP-SCHEDULER-CONTRACT-RCA-READONLY-1103R1", "status": "OK", "rc": 0, "host": "pve01", "mode": "read-only", "component": "homelab-backup-scheduler-contract-rca", "started_at_utc": "2026-09-21T20:58:11Z", "finished_at_utc": "2026-09-21T20:58:11Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", "command_sha256": "03f74f4f55da06e3cb0f9a99977974ef5f7a54cf444a6d81d92957823f7e8f08", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, "change_declared": false, "result_contract_valid": true, "result_contract_status": null, "result_contract_error": null, "command_rc": 0, "changes_made": false, "rollback_started": false, "rollback_restored": null, "mutation_outcome": "NO_MUTATION", "sanitized": true, "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, "raw_evidence_sha256": "a0a1f31643f6b251d01109ba03b14ffd330a1bb432b6481e2854ccd40bf40b83", "sanitized_output_sha256": "a0a1f31643f6b251d01109ba03b14ffd330a1bb432b6481e2854ccd40bf40b83", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", "output": "WORKERS2_SCHEDULER_CONTRACT_RCA_BEGIN=1\nCOMMAND_ID=SUPPORT-260921-HOMELAB-BACKUP-SCHEDULER-CONTRACT-RCA-READONLY-1103R1\nMODE=read-only\nCOMPONENT=homelab-backup-scheduler-contract-rca\nMUTATION_BOUNDARY=READ_ONLY_NO_SERVICE_START_NO_TIMER_CHANGE_NO_KILL_NO_SIGNAL_NO_LOCK_BREAK_NO_BACKUP_NO_GC_NO_MAIL_NO_GIT_WRITE\nSOURCE_FILES=[{\"path\":\"/etc/systemd/system/homelab-backup-v2.service\",\"sha256\":\"1ef3e6bc660767a1f29a6a0bfa8d1b7a2419370b2250764ca181c34c93188565\",\"size\":309},{\"path\":\"/usr/local/sbin/homelab-backup-v2\",\"sha256\":\"5077444065c732451cb84898680f62361b21a24ef9eb4f191253e82ead524ea2\",\"size\":1656},{\"path\":\"/usr/local/libexec/homelab-backup-target-registry\",\"sha256\":\"c681c44be7557d192d7b453b67e31164237874596168f1d4c78e1e926e2e9cb4\",\"size\":4406},{\"path\":\"/usr/local/libexec/homelab-vm-cloud-quorum-node-worker\",\"sha256\":\"91bdd116be865560a38105dffbd1a66d687232035e2359e4a5be4d225e9c61d1\",\"size\":17702},{\"path\":\"/usr/local/libexec/homelab-cloud-quorum-payload\",\"sha256\":\"df9e19485e5d87112bf58bf77bdddf3b9b896418dd85ff945a31cd5b6817f352\",\"size\":38039}]\nSCHEDULER_LOGIC_HITS=[{\"file\":\"/etc/systemd/system/homelab-backup-v2.service\",\"line\":2,\"text\":\"Description=Homelab Backup V2 manifest-driven scheduler\"},{\"file\":\"/etc/systemd/system/homelab-backup-v2.service\",\"line\":3,\"text\":\"After=network-online.target\"},{\"file\":\"/etc/systemd/system/homelab-backup-v2.service\",\"line\":4,\"text\":\"Wants=network-online.target\"},{\"file\":\"/etc/systemd/system/homelab-backup-v2.service\",\"line\":11,\"text\":\"ExecStart=/usr/local/sbin/homelab-backup-v2 scheduled\"},{\"file\":\"/etc/systemd/system/homelab-backup-v2.service\",\"line\":14,\"text\":\"IOSchedulingPriority=7\"},{\"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/libexec/homelab-backup-target-registry\",\"line\":4,\"text\":\"REGISTRY=\\\"${HOMELAB_BACKUP_TARGET_REGISTRY:-/etc/homelab-backup/targets.json}\\\"\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":5,\"text\":\"die(){ printf 'TARGET_REGISTRY_ERROR=%s\\\\n' \\\"$1\\\" >&2; exit \\\"${2:-65}\\\"; }\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":10,\"text\":\".schema==\\\"homelab-backup-target-registry-v1\\\" and\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":13,\"text\":\".policies.freshness_seconds.VM==72000 and .policies.freshness_seconds.APP==72000 and .policies.freshness_seconds.CONTROL==86400 and\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":14,\"text\":\"(.targets|type)==\\\"array\\\" and (.targets|length)==21 and\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":15,\"text\":\"([.targets[].id]|length)==([.targets[].id]|unique|length) and\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":16,\"text\":\"([.targets[].logical_id]|length)==([.targets[].logical_id]|unique|length) and\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":17,\"text\":\"([.targets[]|select(.kind==\\\"VM\\\" and .lifecycle==\\\"ACTIVE\\\")]|length)==11 and\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":18,\"text\":\"([.targets[]|select(.kind==\\\"APP\\\" and .lifecycle==\\\"ACTIVE\\\")]|length)==4 and\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":19,\"text\":\"([.targets[]|select(.kind==\\\"APP\\\" and .lifecycle==\\\"RETIRED_PRESERVE\\\")]|length)==3 and\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":20,\"text\":\"([.targets[]|select(.kind==\\\"CONTROL\\\" and .lifecycle==\\\"ACTIVE\\\")]|length)==1 and\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":21,\"text\":\"([.targets[]|select((.kind!=\\\"VM\\\" and .kind!=\\\"APP\\\" and .kind!=\\\"CONTROL\\\") or (.lifecycle!=\\\"ACTIVE\\\" and .lifecycle!=\\\"RETIRED_PRESERVE\\\"))]|length)==0 and\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":22,\"text\":\"([.targets[]|select(.kind==\\\"VM\\\")|select(.owner!=\\\"pve01\\\" and .owner!=\\\"pve02\\\" and .owner!=\\\"pve03\\\")]|length)==0 and\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":27,\"text\":\"rows(){ validate; jq -r '.targets[]|[.kind,.id,.logical_id,.owner,.lifecycle,(.source_host//\\\"\\\"),((.migrate//false)|tostring)]|@tsv' \\\"$REGISTRY\\\"; }\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":28,\"text\":\"find_by_id(){ local kind=\\\"$1\\\" id=\\\"$2\\\"; validate; jq -er --arg k \\\"$kind\\\" --arg i \\\"$id\\\" '.targets[]|select(.kind==$k and .id==$i)' \\\"$REGISTRY\\\"; }\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":29,\"text\":\"find_by_logical(){ local logical=\\\"$1\\\"; validate; jq -er --arg l \\\"$logical\\\" '.targets[]|select(.logical_id==$l)' \\\"$REGISTRY\\\"; }\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":31,\"text\":\"validate) [[ \\\"$#\\\" == 1 ]] || die USAGE 64; validate; printf 'TARGET_REGISTRY=OK\\\\n' ;;\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":32,\"text\":\"active-vm-ids) [[ \\\"$#\\\" == 1 ]] || die USAGE 64; validate; jq -r '.targets[]|select(.kind==\\\"VM\\\" and .lifecycle==\\\"ACTIVE\\\")|.id' \\\"$REGISTRY\\\" ;;\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":33,\"text\":\"active-app-ids) [[ \\\"$#\\\" == 1 ]] || die USAGE 64; validate; jq -r '.targets[]|select(.kind==\\\"APP\\\" and .lifecycle==\\\"ACTIVE\\\")|.id' \\\"$REGISTRY\\\" ;;\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":34,\"text\":\"migrate-app-ids) [[ \\\"$#\\\" == 1 ]] || die USAGE 64; validate; jq -r '.targets[]|select(.kind==\\\"APP\\\" and .lifecycle==\\\"ACTIVE\\\" and .migrate==true)|.id' \\\"$REGISTRY\\\" ;;\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":35,\"text\":\"app-active) [[ \\\"$#\\\" == 2 ]] || die USAGE 64; find_by_id APP \\\"$2\\\" | jq -e '.lifecycle==\\\"ACTIVE\\\"' >/dev/null ;;\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":36,\"text\":\"app-logical) [[ \\\"$#\\\" == 2 ]] || die USAGE 64; find_by_id APP \\\"$2\\\" | jq -er 'select(.lifecycle==\\\"ACTIVE\\\")|.logical_id' ;;\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":37,\"text\":\"app-source-host) [[ \\\"$#\\\" == 2 ]] || die USAGE 64; find_by_id APP \\\"$2\\\" | jq -er 'select(.lifecycle==\\\"ACTIVE\\\")|.source_host' ;;\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":39,\"text\":\"lifecycle) [[ \\\"$#\\\" == 2 ]] || die USAGE 64; find_by_logical \\\"$2\\\" | jq -er '.lifecycle' ;;\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":40,\"text\":\"retention-logicals) [[ \\\"$#\\\" == 1 ]] || die USAGE 64; validate; jq -r '.targets[]|select(.lifecycle==\\\"ACTIVE\\\" or .lifecycle==\\\"RETIRED_PRESERVE\\\")|.logical_id' \\\"$REGISTRY\\\" ;;\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":41,\"text\":\"retention-keep) [[ \\\"$#\\\" == 2 ]] || die USAGE 64; rec=\\\"$(find_by_logical \\\"$2\\\")\\\"; life=\\\"$(jq -r '.lifecycle' <<<\\\"$rec\\\")\\\"; [[ \\\"$life\\\" == ACTIVE ]] || die RETENTION_KEEP_NOT_ACTIVE 64; kind=\\\"$(jq -r '.kind' <<<\\\"$rec\\\")\\\"; jq -er --arg k \\\"$kind\\\" '.policies.retention_keep[$k]' \\\"$REGISTRY\\\" ;;\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":43,\"text\":\"freshness-seconds) [[ \\\"$#\\\" == 2 ]] || die USAGE 64; validate; jq -er --arg k \\\"$2\\\" '.policies.freshness_seconds[$k]' \\\"$REGISTRY\\\" ;;\"},{\"file\":\"/usr/local/libexec/homelab-backup-target-registry\",\"line\":46,\"text\":\"*) die USAGE_validate_active-vm-ids_active-app-ids_migrate-app-ids_app-active_app-logical_app-source-host_logical-owner_lifecycle_retention-logicals_retention-keep_policy-keep_freshness-seconds_systemd-expectations_rows 64 ;;\"},{\"file\":\"/usr/local/libexec/homelab-cloud-quorum-payload\",\"line\":403,\"text\":\"if ! awk -v target=\\\"$LOGICAL_ID/\\\" '$0==target{found=1} END{exit !found}' \\\"$root_listing\\\"; then\"},{\"file\":\"/usr/local/libexec/homelab-cloud-quorum-payload\",\"line\":410,\"text\":\"if awk -v target=\\\"$GENERATION/\\\" '$0==target{found=1} END{exit !found}' \\\"$logical_listing\\\"; then\"}]\nTARGET_CONTRACT_ROWS=[{\"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\"}]\nCURRENT_VM_STATE_ROWS=[{\"age_seconds\":1783,\"exists\":true,\"last_attempt_epoch\":1790022508,\"last_success_epoch\":1790022508,\"replica_count\":2,\"resource_type\":\"lxc\",\"result\":\"SUCCESS\",\"state_id\":\"ct110\",\"vmid\":\"110\"},{\"age_seconds\":1636,\"exists\":true,\"last_attempt_epoch\":1790022655,\"last_success_epoch\":1790022655,\"replica_count\":2,\"resource_type\":\"lxc\",\"result\":\"SUCCESS\",\"state_id\":\"ct111\",\"vmid\":\"111\"},{\"age_seconds\":83215,\"exists\":true,\"last_attempt_epoch\":1789941076,\"last_success_epoch\":1789941076,\"replica_count\":2,\"resource_type\":\"lxc\",\"result\":\"SUCCESS\",\"state_id\":\"ct112\",\"vmid\":\"112\"},{\"age_seconds\":81050,\"exists\":true,\"last_attempt_epoch\":1789943241,\"last_success_epoch\":1789943241,\"replica_count\":2,\"resource_type\":\"lxc\",\"result\":\"SUCCESS\",\"state_id\":\"ct113\",\"vmid\":\"113\"},{\"age_seconds\":75658,\"exists\":true,\"last_attempt_epoch\":1789948633,\"last_success_epoch\":1789948633,\"replica_count\":2,\"resource_type\":\"qemu\",\"result\":\"SUCCESS\",\"state_id\":\"vm130\",\"vmid\":\"130\"},{\"age_seconds\":78944,\"exists\":true,\"last_attempt_epoch\":1789945347,\"last_success_epoch\":1789945347,\"replica_count\":2,\"resource_type\":\"qemu\",\"result\":\"SUCCESS\",\"state_id\":\"vm150\",\"vmid\":\"150\"},{\"age_seconds\":74191,\"exists\":true,\"last_attempt_epoch\":1789950100,\"last_success_epoch\":1789950100,\"replica_count\":2,\"resource_type\":\"qemu\",\"result\":\"SUCCESS\",\"state_id\":\"vm160\",\"vmid\":\"160\"}]\nREGISTRY_VM_FRESHNESS={\"lines\":[\"72000\",\"\"],\"rc\":0}\nREGISTRY_HELP={\"lines\":[\"\",\"TARGET_REGISTRY_ERROR=USAGE_validate_active-vm-ids_active-app-ids_migrate-app-ids_app-active_app-logical_app-source-host_logical-owner_lifecycle_retention-logicals_retention-keep_policy-keep_freshness-seconds_systemd-expectations_rows\"],\"rc\":64}\nDECISIVE_JOURNAL=[\"SCHEDULE_TARGET=xf-codevipe\",\"SCHEDULE_RESULT=SUCCESS\",\"homelab-backup-v2.service: Deactivated successfully.\",\"SCHEDULE_TARGET=xf-zakrutim\",\"SCHEDULE_RESULT=SUCCESS\",\"homelab-backup-v2.service: Deactivated successfully.\",\"INFO: starting new backup job: vzdump 110 --remove 0 --prune-backups 'keep-all=1' --compress zstd --tmpdir /var/tmp/homelab-vzdump-v2-v2-ct110-20260921T202514Z-1c872adccfab --mode snapshot --stdexcludes 0 --bwlimit 32768 --ionice 7 --node pve01 --zstd 1 --lockwait 0\",\"INFO: Backup job finished successfully\",\"notified via target `mail-to-root`\",\"SCHEDULE_TARGET=ct110\",\"SCHEDULE_RESULT=SUCCESS\",\"homelab-backup-v2.service: Deactivated successfully.\",\"SCHEDULE_TARGET=ct111\",\"SCHEDULE_RESULT=SUCCESS\",\"homelab-backup-v2.service: Deactivated successfully.\",\"SCHEDULE_DECISION=DEFER_NO_DUE_TARGET\",\"homelab-backup-v2.service: Deactivated successfully.\",\"SCHEDULE_DECISION=DEFER_NO_DUE_TARGET\",\"homelab-backup-v2.service: Deactivated successfully.\",\"SCHEDULE_DECISION=DEFER_NO_DUE_TARGET\",\"homelab-backup-v2.service: Deactivated successfully.\"]\nDECISION=SCHEDULER_ELIGIBILITY_FILTER_DIFFERS_FROM_RPO_SET\nNO_MUTATION=true\nTASK_RESULT=PASS_HOMELAB_BACKUP_SCHEDULER_CONTRACT_RCA_READONLY\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260921-HOMELAB-BACKUP-SCHEDULER-CONTRACT-RCA-READONLY-1103R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\nWORKERS2_SCHEDULER_CONTRACT_RCA_END=1\n" }