diff --git a/runtime/history/NEWFI-260907-B-PORTAL200-RECOVERY2.json b/runtime/history/NEWFI-260907-B-PORTAL200-RECOVERY2.json new file mode 100644 index 00000000..5c607cce --- /dev/null +++ b/runtime/history/NEWFI-260907-B-PORTAL200-RECOVERY2.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "NEWFI-260907-B-PORTAL200-RECOVERY2", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "newfi-portal200-recovery2-strict-readonly", + "started_at_utc": "2026-09-07T19:24:17Z", + "finished_at_utc": "2026-09-07T19:24:31Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "845c1cd3782bcb68401f17baffd22c1f5850d989434d3a7eed95dd807d372a63", + "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": "4d4a8415236fab465d1567f5162ffbdb161dc16a12c2a3d798c2c9f3faeb1f00", + "sanitized_output_sha256": "4d4a8415236fab465d1567f5162ffbdb161dc16a12c2a3d798c2c9f3faeb1f00", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "RECOVERY2_BEGIN=true\nCOMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY2\nMUTATION_SCOPE=NONE_READ_ONLY\nMUTATIONS_PERFORMED=NO\nERROR_REGISTER_CHECK=OK\nERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\nREFERENCE_CHECK=OK\nREFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nRUNNER_CONTRACT_MARKERS_PRESENT={\"HOMELAB_RESULT_CONTRACT\":true,\"changes_made\":true,\"command_id\":true,\"rollback_restored\":true,\"rollback_started\":true}\nHISTORY_NEWFI_260907_PORTAL200_APPLY3_SHA256=f3ea3fcebd7b182e64db6e963a34f1b90baca0d08477e25e27bf88c48b33611c\nHISTORY_NEWFI_260907_PORTAL200_APPLY3_STATUS=FAIL\nHISTORY_NEWFI_260907_PORTAL200_APPLY3_MODE=change\nHISTORY_NEWFI_260907_PORTAL200_APPLY3_CHANGES_MADE=unknown\nHISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_SHA256=00c4dc5e100be0cb26a80262a8af96555457b5dc4fa924c6a9458089cd01474e\nHISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_STATUS=OK\nHISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_MODE=read-only\nHISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_CHANGES_MADE=false\nHISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_SHA256=805954f73608dbd343da33d387c59a6ad258a7f6a51965db4e78c3fd0f588fd4\nHISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_STATUS=OK\nHISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_MODE=read-only\nHISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_CHANGES_MADE=false\nHISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_SHA256=30370cad3d4d7e73c6612a5df702abe1fac6ae559bf142b5e489a19a1258cfb7\nHISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_STATUS=OK\nHISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_MODE=read-only\nHISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_CHANGES_MADE=false\nHISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_SHA256=80ce8e1f27c78341e596ae39a7208959347572ffb6b3b2e7496c0c2aea897928\nHISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_STATUS=FAIL\nHISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_MODE=read-only\nHISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_CHANGES_MADE=false\nHISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_SHA256=0b09da950cf23908353b6af93784e61e2cde7c365d41a94070d28295494fd21f\nHISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_STATUS=OK\nHISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_MODE=read-only\nHISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_CHANGES_MADE=false\nTARGET_BRANCH_WORKTREES=[{\"branch\":\"implementation/newfi-closed-mvp-20260906\",\"dirty_count\":0,\"head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"remote_head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"repo\":\"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\"}]\nGIT_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\nGIT_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_REMOTE_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_DIRTY_COUNT=0\nNEWFI_CLUSTER_VMS=[{\"name\":\"newfi-prod\",\"node\":\"pve01\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":210},{\"name\":\"newfi-staging\",\"node\":\"pve03\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":211}]\nPRODUCTION_VM={\"name\":\"newfi-prod\",\"node\":\"pve01\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":210}\nSTAGING_VM={\"name\":\"newfi-staging\",\"node\":\"pve03\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":211}\nPRODUCTION_LAYOUT_DISCOVERY={\"base_candidates\":[[20,\"/var/www/forums/newfi/public\"]],\"doc_candidates\":[\"/var/www/forums/newfi/public\"],\"guest_hostname\":\"newfi-prod\",\"guest_smoke_err\":\"\",\"guest_smoke_rc\":0,\"layout_scan_err\":\"\",\"layout_scan_rc\":0,\"sections\":{\"ADDONS\":[\"/var/www/forums/newfi/public/src/addons/Newfi/Dogs/addon.json\",\"/var/www/forums/newfi/public/src/addons/Newfi/Events/addon.json\",\"/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json\"],\"CMD\":[\"/var/www/forums/newfi/public/cmd.php\"],\"INDEX\":[\"/var/www/forums/newfi/public/index.php\",\"/var/www/forums/newfi/public/install/index.php\"],\"XF\":[\"/var/www/forums/newfi/public/src/XF.php\"]}}\nPRODUCTION_XF_BASE_ROOT=/var/www/forums/newfi/public\nPRODUCTION_DOCROOT=/var/www/forums/newfi/public\nPRODUCTION_XF_VERSION=XenForo 2.3.12\nPRODUCTION_SERVICES=nginx=active\\nmariadb=active\\nmysql=active\\nphp8.3-fpm.service=active\nPRODUCTION_ADDON_LIST= -------------- -------------------------- --------------- -------- \\n Add-on ID Title Version Active \\n -------------- -------------------------- --------------- -------- \\n Newfi/Dogs Newfi Dogs 1.0.0 Alpha 1 Yes \\n Newfi/Events Newfi Events 1.0.0 Alpha 1 Yes \\n Newfi/Portal Newfi Portal 1.0.0 Alpha 1 Yes \\n XFMG XenForo Media Gallery 2.3.11 Yes \\n XFRM XenForo Resource Manager 2.3.11 Yes \\n -------------- -------------------------- --------------- -------- \\n\\n Total: 5 add-ons (5 active, 0 inactive)\nPRODUCTION_PORTAL_ADDON_CANDIDATES=[{\"id\":\"Newfi/Portal\",\"path\":\"/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json\",\"title\":\"Newfi Portal\",\"version_id\":1000010,\"version_string\":\"1.0.0 Alpha 1\"}]\nSTAGING_LAYOUT_DISCOVERY={\"guest_hostname\":\"newfi-staging\",\"guest_smoke_err\":\"\",\"guest_smoke_rc\":0,\"layout_scan_err\":\"\",\"layout_scan_rc\":0,\"sections\":{\"ADDONS\":[],\"CMD\":[],\"INDEX\":[],\"XF\":[]}}\nPRODUCTION_DB_SCHEMA_CANDIDATES=[\"xf_newfi\"]\nPRODUCTION_BOARD_ACTIVE=1\nPRODUCTION_ERROR_MAX=0\nPRODUCTION_ADDON_ROWS=Newfi/Dogs\tNewfi Dogs\t1000010\t1.0.0 Alpha 1\t1\\nNewfi/Events\tNewfi Events\t1000010\t1.0.0 Alpha 1\t1\\nNewfi/Portal\tNewfi Portal\t1000010\t1.0.0 Alpha 1\t1\\nXF\tXenForo\t2031270\t2.3.12\t1\\nXFMG\tXenForo Media Gallery\t902031170\t2.3.11\t1\\nXFRM\tXenForo Resource Manager\t2031170\t2.3.11\t1\nPRODUCTION_PUBLIC_HTTP={\"http\":\"200\",\"rc\":0}\nHOLD_REASONS=[\"STAGING_XF_BASE_ROOT_UNPROVEN\"]\nFINAL_DECISION=HOLD_PORTAL200_APPLY4_PREP_STAGING_XF_BASE_ROOT_UNPROVEN\nRECOVERY2_END=true\n" +} diff --git a/runtime/history/NEWFI-260907-B-PORTAL200-RECOVERY2.txt b/runtime/history/NEWFI-260907-B-PORTAL200-RECOVERY2.txt new file mode 100644 index 00000000..69a89eae --- /dev/null +++ b/runtime/history/NEWFI-260907-B-PORTAL200-RECOVERY2.txt @@ -0,0 +1,91 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY2 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=newfi-portal200-recovery2-strict-readonly +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=845c1cd3782bcb68401f17baffd22c1f5850d989434d3a7eed95dd807d372a63 +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=4d4a8415236fab465d1567f5162ffbdb161dc16a12c2a3d798c2c9f3faeb1f00 +SANITIZED_OUTPUT_SHA256=4d4a8415236fab465d1567f5162ffbdb161dc16a12c2a3d798c2c9f3faeb1f00 +OUTPUT_BEGIN +RECOVERY2_BEGIN=true +COMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY2 +MUTATION_SCOPE=NONE_READ_ONLY +MUTATIONS_PERFORMED=NO +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +REFERENCE_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED +RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d +RUNNER_CONTRACT_MARKERS_PRESENT={"HOMELAB_RESULT_CONTRACT":true,"changes_made":true,"command_id":true,"rollback_restored":true,"rollback_started":true} +HISTORY_NEWFI_260907_PORTAL200_APPLY3_SHA256=f3ea3fcebd7b182e64db6e963a34f1b90baca0d08477e25e27bf88c48b33611c +HISTORY_NEWFI_260907_PORTAL200_APPLY3_STATUS=FAIL +HISTORY_NEWFI_260907_PORTAL200_APPLY3_MODE=change +HISTORY_NEWFI_260907_PORTAL200_APPLY3_CHANGES_MADE=unknown +HISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_SHA256=00c4dc5e100be0cb26a80262a8af96555457b5dc4fa924c6a9458089cd01474e +HISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_STATUS=OK +HISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_MODE=read-only +HISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_CHANGES_MADE=false +HISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_SHA256=805954f73608dbd343da33d387c59a6ad258a7f6a51965db4e78c3fd0f588fd4 +HISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_STATUS=OK +HISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_MODE=read-only +HISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_CHANGES_MADE=false +HISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_SHA256=30370cad3d4d7e73c6612a5df702abe1fac6ae559bf142b5e489a19a1258cfb7 +HISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_STATUS=OK +HISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_MODE=read-only +HISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_CHANGES_MADE=false +HISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_SHA256=80ce8e1f27c78341e596ae39a7208959347572ffb6b3b2e7496c0c2aea897928 +HISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_STATUS=FAIL +HISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_MODE=read-only +HISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_CHANGES_MADE=false +HISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_SHA256=0b09da950cf23908353b6af93784e61e2cde7c365d41a94070d28295494fd21f +HISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_STATUS=OK +HISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_MODE=read-only +HISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_CHANGES_MADE=false +TARGET_BRANCH_WORKTREES=[{"branch":"implementation/newfi-closed-mvp-20260906","dirty_count":0,"head":"06bab5acd124e768f70305b3d7eca2f595871890","remote_head":"06bab5acd124e768f70305b3d7eca2f595871890","repo":"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906"}] +GIT_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906 +GIT_HEAD=06bab5acd124e768f70305b3d7eca2f595871890 +GIT_REMOTE_HEAD=06bab5acd124e768f70305b3d7eca2f595871890 +GIT_DIRTY_COUNT=0 +NEWFI_CLUSTER_VMS=[{"name":"newfi-prod","node":"pve01","status":"running","type":"qemu","vmid":210},{"name":"newfi-staging","node":"pve03","status":"running","type":"qemu","vmid":211}] +PRODUCTION_VM={"name":"newfi-prod","node":"pve01","status":"running","type":"qemu","vmid":210} +STAGING_VM={"name":"newfi-staging","node":"pve03","status":"running","type":"qemu","vmid":211} +PRODUCTION_LAYOUT_DISCOVERY={"base_candidates":[[20,"/var/www/forums/newfi/public"]],"doc_candidates":["/var/www/forums/newfi/public"],"guest_hostname":"newfi-prod","guest_smoke_err":"","guest_smoke_rc":0,"layout_scan_err":"","layout_scan_rc":0,"sections":{"ADDONS":["/var/www/forums/newfi/public/src/addons/Newfi/Dogs/addon.json","/var/www/forums/newfi/public/src/addons/Newfi/Events/addon.json","/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json"],"CMD":["/var/www/forums/newfi/public/cmd.php"],"INDEX":["/var/www/forums/newfi/public/index.php","/var/www/forums/newfi/public/install/index.php"],"XF":["/var/www/forums/newfi/public/src/XF.php"]}} +PRODUCTION_XF_BASE_ROOT=/var/www/forums/newfi/public +PRODUCTION_DOCROOT=/var/www/forums/newfi/public +PRODUCTION_XF_VERSION=XenForo 2.3.12 +PRODUCTION_SERVICES=nginx=active\nmariadb=active\nmysql=active\nphp8.3-fpm.service=active +PRODUCTION_ADDON_LIST= -------------- -------------------------- --------------- -------- \n Add-on ID Title Version Active \n -------------- -------------------------- --------------- -------- \n Newfi/Dogs Newfi Dogs 1.0.0 Alpha 1 Yes \n Newfi/Events Newfi Events 1.0.0 Alpha 1 Yes \n Newfi/Portal Newfi Portal 1.0.0 Alpha 1 Yes \n XFMG XenForo Media Gallery 2.3.11 Yes \n XFRM XenForo Resource Manager 2.3.11 Yes \n -------------- -------------------------- --------------- -------- \n\n Total: 5 add-ons (5 active, 0 inactive) +PRODUCTION_PORTAL_ADDON_CANDIDATES=[{"id":"Newfi/Portal","path":"/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json","title":"Newfi Portal","version_id":1000010,"version_string":"1.0.0 Alpha 1"}] +STAGING_LAYOUT_DISCOVERY={"guest_hostname":"newfi-staging","guest_smoke_err":"","guest_smoke_rc":0,"layout_scan_err":"","layout_scan_rc":0,"sections":{"ADDONS":[],"CMD":[],"INDEX":[],"XF":[]}} +PRODUCTION_DB_SCHEMA_CANDIDATES=["xf_newfi"] +PRODUCTION_BOARD_ACTIVE=1 +PRODUCTION_ERROR_MAX=0 +PRODUCTION_ADDON_ROWS=Newfi/Dogs Newfi Dogs 1000010 1.0.0 Alpha 1 1\nNewfi/Events Newfi Events 1000010 1.0.0 Alpha 1 1\nNewfi/Portal Newfi Portal 1000010 1.0.0 Alpha 1 1\nXF XenForo 2031270 2.3.12 1\nXFMG XenForo Media Gallery 902031170 2.3.11 1\nXFRM XenForo Resource Manager 2031170 2.3.11 1 +PRODUCTION_PUBLIC_HTTP={"http":"200","rc":0} +HOLD_REASONS=["STAGING_XF_BASE_ROOT_UNPROVEN"] +FINAL_DECISION=HOLD_PORTAL200_APPLY4_PREP_STAGING_XF_BASE_ROOT_UNPROVEN +RECOVERY2_END=true + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index 49ae3f8d..5c607cce 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "NEWFI-260907-B-PORTAL200-RUNNERCONTRACT5", + "command_id": "NEWFI-260907-B-PORTAL200-RECOVERY2", "status": "OK", "rc": 0, "host": "pve01", "mode": "read-only", - "component": "newfi-portal200-runner-contract-source-evidence", - "started_at_utc": "2026-09-07T19:23:56Z", - "finished_at_utc": "2026-09-07T19:23:56Z", + "component": "newfi-portal200-recovery2-strict-readonly", + "started_at_utc": "2026-09-07T19:24:17Z", + "finished_at_utc": "2026-09-07T19:24:31Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "78728559634f5f083666b7c6889dfeac8efb1f04a5c9d2777009d2ad479e57a4", + "command_sha256": "845c1cd3782bcb68401f17baffd22c1f5850d989434d3a7eed95dd807d372a63", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "cbef9ff8eec5a98273cdd12e712d16746764b9c2857b2f37db7efde899c698fb", - "sanitized_output_sha256": "cbef9ff8eec5a98273cdd12e712d16746764b9c2857b2f37db7efde899c698fb", + "raw_evidence_sha256": "4d4a8415236fab465d1567f5162ffbdb161dc16a12c2a3d798c2c9f3faeb1f00", + "sanitized_output_sha256": "4d4a8415236fab465d1567f5162ffbdb161dc16a12c2a3d798c2c9f3faeb1f00", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "ERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nRUNNERCONTRACT5_AUTHORITY={\"ERROR_REGISTER\":{\"bytes\":302058,\"ok\":true,\"sha256\":\"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\"},\"REFERENCE\":{\"bytes\":201129,\"ok\":true,\"sha256\":\"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\"}}\nRUNNERCONTRACT5_RUNNER={\"bytes\":21321,\"first_line\":\"#!/usr/bin/env bash\",\"line_count\":822,\"matches_handoff_baseline\":true,\"path\":\"/usr/local/sbin/homelab-chat-run\",\"sha256\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\"}\nRUNNERCONTRACT5_STATUS_TOKENS=[\"BLOCKED\",\"ERROR\",\"FAIL\",\"OK\"]\nRUNNERCONTRACT5_CONTRACT_KEYS=[\"changes_made\",\"command_id\",\"rollback_restored\",\"rollback_started\",\"status\",\"version\"]\nRUNNERCONTRACT5_CROSSFIELD_LINES=[{\"line\":19,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":30,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":58,\"text\":\" rollback_restored = document.get(\\\"rollback_restored\\\")\"},{\"line\":60,\"text\":\" raise ValueError(\\\"changes_made must be boolean\\\")\"},{\"line\":62,\"text\":\" raise ValueError(\\\"rollback_started must be boolean\\\")\"},{\"line\":63,\"text\":\" if rollback_restored is not None and not isinstance(\"},{\"line\":64,\"text\":\" rollback_restored,\"},{\"line\":68,\"text\":\" \\\"rollback_restored must be boolean or null\\\"\"},{\"line\":70,\"text\":\" if rollback_restored is True and rollback_started is not True:\"},{\"line\":72,\"text\":\" \\\"rollback_restored without rollback_started\\\"\"},{\"line\":74,\"text\":\" if rollback_started is True and changes is not True:\"},{\"line\":80,\"text\":\" or rollback_started\"},{\"line\":95,\"text\":\" elif rollback_restored is True:\"},{\"line\":97,\"text\":\" elif rollback_restored is False:\"},{\"line\":109,\"text\":\" \\\"rollback_restored\\\": (\"},{\"line\":111,\"text\":\" if rollback_restored is None\"},{\"line\":112,\"text\":\" else str(rollback_restored).lower()\"},{\"line\":129,\"text\":\" result[\\\"rollback_restored\\\"],\"},{\"line\":142,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T1\\\",\\\"status\\\":\\\"BLOCKED\\\",\\\"changes_made\\\":false,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":148,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T2\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":154,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T3\\\",\\\"status\\\":\\\"FAIL\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":true,\\\"rollback_restored\\\":true}' \\\\\"},{\"line\":168,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"OTHER\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":174,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":175,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":599,\"text\":\" rollback_restored,\"},{\"line\":664,\"text\":\" \\\"rollback_restored\\\": optional_bool(rollback_restored),\"}]\nRUNNERCONTRACT5_DUPLICATE_LINES=[{\"line\":646,\"text\":\" \\\"duplicate_failed_command_blocked\\\": repeat_blocked == \\\"true\\\",\"},{\"line\":704,\"text\":\" echo \\\"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\\\"\"},{\"line\":816,\"text\":\"echo \\\"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\\\"\"}]\nRUNNERCONTRACT5_SOURCE_WINDOWS=[{\"match_line\":11,\"match_text\":\"raw_path, command_id, mode, command_rc = sys.argv[1:]\",\"window\":[{\"line\":9,\"text\":\"from pathlib import Path\"},{\"line\":10,\"text\":\"\"},{\"line\":11,\"text\":\"raw_path, command_id, mode, command_rc = sys.argv[1:]\"},{\"line\":12,\"text\":\"command_rc = int(command_rc)\"},{\"line\":13,\"text\":\"\"}]},{\"match_line\":16,\"match_text\":\" \\\"status\\\": \\\"NOT_APPLICABLE\\\",\",\"window\":[{\"line\":14,\"text\":\"result = {\"},{\"line\":15,\"text\":\" \\\"valid\\\": True,\"},{\"line\":16,\"text\":\" \\\"status\\\": \\\"NOT_APPLICABLE\\\",\"},{\"line\":17,\"text\":\" \\\"changes_made\\\": \\\"false\\\",\"},{\"line\":18,\"text\":\" \\\"rollback_started\\\": \\\"false\\\",\"}]},{\"match_line\":17,\"match_text\":\" \\\"changes_made\\\": \\\"false\\\",\",\"window\":[{\"line\":15,\"text\":\" \\\"valid\\\": True,\"},{\"line\":16,\"text\":\" \\\"status\\\": \\\"NOT_APPLICABLE\\\",\"},{\"line\":17,\"text\":\" \\\"changes_made\\\": \\\"false\\\",\"},{\"line\":18,\"text\":\" \\\"rollback_started\\\": \\\"false\\\",\"},{\"line\":19,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"}]},{\"match_line\":18,\"match_text\":\" \\\"rollback_started\\\": \\\"false\\\",\",\"window\":[{\"line\":16,\"text\":\" \\\"status\\\": \\\"NOT_APPLICABLE\\\",\"},{\"line\":17,\"text\":\" \\\"changes_made\\\": \\\"false\\\",\"},{\"line\":18,\"text\":\" \\\"rollback_started\\\": \\\"false\\\",\"},{\"line\":19,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":20,\"text\":\" \\\"mutation_outcome\\\": \\\"NO_MUTATION\\\",\"}]},{\"match_line\":19,\"match_text\":\" \\\"rollback_restored\\\": \\\"null\\\",\",\"window\":[{\"line\":17,\"text\":\" \\\"changes_made\\\": \\\"false\\\",\"},{\"line\":18,\"text\":\" \\\"rollback_started\\\": \\\"false\\\",\"},{\"line\":19,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":20,\"text\":\" \\\"mutation_outcome\\\": \\\"NO_MUTATION\\\",\"},{\"line\":21,\"text\":\" \\\"error\\\": \\\"NONE\\\",\"}]},{\"match_line\":27,\"match_text\":\" \\\"status\\\": \\\"UNKNOWN\\\",\",\"window\":[{\"line\":25,\"text\":\" result = {\"},{\"line\":26,\"text\":\" \\\"valid\\\": False,\"},{\"line\":27,\"text\":\" \\\"status\\\": \\\"UNKNOWN\\\",\"},{\"line\":28,\"text\":\" \\\"changes_made\\\": \\\"unknown\\\",\"},{\"line\":29,\"text\":\" \\\"rollback_started\\\": \\\"unknown\\\",\"}]},{\"match_line\":28,\"match_text\":\" \\\"changes_made\\\": \\\"unknown\\\",\",\"window\":[{\"line\":26,\"text\":\" \\\"valid\\\": False,\"},{\"line\":27,\"text\":\" \\\"status\\\": \\\"UNKNOWN\\\",\"},{\"line\":28,\"text\":\" \\\"changes_made\\\": \\\"unknown\\\",\"},{\"line\":29,\"text\":\" \\\"rollback_started\\\": \\\"unknown\\\",\"},{\"line\":30,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"}]},{\"match_line\":29,\"match_text\":\" \\\"rollback_started\\\": \\\"unknown\\\",\",\"window\":[{\"line\":27,\"text\":\" \\\"status\\\": \\\"UNKNOWN\\\",\"},{\"line\":28,\"text\":\" \\\"changes_made\\\": \\\"unknown\\\",\"},{\"line\":29,\"text\":\" \\\"rollback_started\\\": \\\"unknown\\\",\"},{\"line\":30,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":31,\"text\":\" \\\"mutation_outcome\\\": \\\"UNKNOWN\\\",\"}]},{\"match_line\":30,\"match_text\":\" \\\"rollback_restored\\\": \\\"null\\\",\",\"window\":[{\"line\":28,\"text\":\" \\\"changes_made\\\": \\\"unknown\\\",\"},{\"line\":29,\"text\":\" \\\"rollback_started\\\": \\\"unknown\\\",\"},{\"line\":30,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":31,\"text\":\" \\\"mutation_outcome\\\": \\\"UNKNOWN\\\",\"},{\"line\":32,\"text\":\" \\\"error\\\": \\\"MISSING_CONTRACT\\\",\"}]},{\"match_line\":34,\"match_text\":\" marker = \\\"HOMELAB_RESULT_CONTRACT=\\\"\",\"window\":[{\"line\":32,\"text\":\" \\\"error\\\": \\\"MISSING_CONTRACT\\\",\"},{\"line\":33,\"text\":\" }\"},{\"line\":34,\"text\":\" marker = \\\"HOMELAB_RESULT_CONTRACT=\\\"\"},{\"line\":35,\"text\":\" lines = Path(raw_path).read_bytes().decode(\"},{\"line\":36,\"text\":\" \\\"utf-8\\\",\"}]},{\"match_line\":51,\"match_text\":\" if document.get(\\\"command_id\\\") != command_id:\",\"window\":[{\"line\":49,\"text\":\" if document.get(\\\"version\\\") != 1:\"},{\"line\":50,\"text\":\" raise ValueError(\\\"unsupported version\\\")\"},{\"line\":51,\"text\":\" if document.get(\\\"command_id\\\") != command_id:\"},{\"line\":52,\"text\":\" raise ValueError(\\\"command_id mismatch\\\")\"},{\"line\":53,\"text\":\" status = document.get(\\\"status\\\")\"}]},{\"match_line\":52,\"match_text\":\" raise ValueError(\\\"command_id mismatch\\\")\",\"window\":[{\"line\":50,\"text\":\" raise ValueError(\\\"unsupported version\\\")\"},{\"line\":51,\"text\":\" if document.get(\\\"command_id\\\") != command_id:\"},{\"line\":52,\"text\":\" raise ValueError(\\\"command_id mismatch\\\")\"},{\"line\":53,\"text\":\" status = document.get(\\\"status\\\")\"},{\"line\":54,\"text\":\" if status not in {\\\"OK\\\", \\\"BLOCKED\\\", \\\"FAIL\\\"}:\"}]},{\"match_line\":53,\"match_text\":\" status = document.get(\\\"status\\\")\",\"window\":[{\"line\":51,\"text\":\" if document.get(\\\"command_id\\\") != command_id:\"},{\"line\":52,\"text\":\" raise ValueError(\\\"command_id mismatch\\\")\"},{\"line\":53,\"text\":\" status = document.get(\\\"status\\\")\"},{\"line\":54,\"text\":\" if status not in {\\\"OK\\\", \\\"BLOCKED\\\", \\\"FAIL\\\"}:\"},{\"line\":55,\"text\":\" raise ValueError(\\\"invalid status\\\")\"}]},{\"match_line\":54,\"match_text\":\" if status not in {\\\"OK\\\", \\\"BLOCKED\\\", \\\"FAIL\\\"}:\",\"window\":[{\"line\":52,\"text\":\" raise ValueError(\\\"command_id mismatch\\\")\"},{\"line\":53,\"text\":\" status = document.get(\\\"status\\\")\"},{\"line\":54,\"text\":\" if status not in {\\\"OK\\\", \\\"BLOCKED\\\", \\\"FAIL\\\"}:\"},{\"line\":55,\"text\":\" raise ValueError(\\\"invalid status\\\")\"},{\"line\":56,\"text\":\" changes = document.get(\\\"changes_made\\\")\"}]},{\"match_line\":55,\"match_text\":\" raise ValueError(\\\"invalid status\\\")\",\"window\":[{\"line\":53,\"text\":\" status = document.get(\\\"status\\\")\"},{\"line\":54,\"text\":\" if status not in {\\\"OK\\\", \\\"BLOCKED\\\", \\\"FAIL\\\"}:\"},{\"line\":55,\"text\":\" raise ValueError(\\\"invalid status\\\")\"},{\"line\":56,\"text\":\" changes = document.get(\\\"changes_made\\\")\"},{\"line\":57,\"text\":\" rollback_started = document.get(\\\"rollback_started\\\")\"}]},{\"match_line\":56,\"match_text\":\" changes = document.get(\\\"changes_made\\\")\",\"window\":[{\"line\":54,\"text\":\" if status not in {\\\"OK\\\", \\\"BLOCKED\\\", \\\"FAIL\\\"}:\"},{\"line\":55,\"text\":\" raise ValueError(\\\"invalid status\\\")\"},{\"line\":56,\"text\":\" changes = document.get(\\\"changes_made\\\")\"},{\"line\":57,\"text\":\" rollback_started = document.get(\\\"rollback_started\\\")\"},{\"line\":58,\"text\":\" rollback_restored = document.get(\\\"rollback_restored\\\")\"}]},{\"match_line\":57,\"match_text\":\" rollback_started = document.get(\\\"rollback_started\\\")\",\"window\":[{\"line\":55,\"text\":\" raise ValueError(\\\"invalid status\\\")\"},{\"line\":56,\"text\":\" changes = document.get(\\\"changes_made\\\")\"},{\"line\":57,\"text\":\" rollback_started = document.get(\\\"rollback_started\\\")\"},{\"line\":58,\"text\":\" rollback_restored = document.get(\\\"rollback_restored\\\")\"},{\"line\":59,\"text\":\" if not isinstance(changes, bool):\"}]},{\"match_line\":58,\"match_text\":\" rollback_restored = document.get(\\\"rollback_restored\\\")\",\"window\":[{\"line\":56,\"text\":\" changes = document.get(\\\"changes_made\\\")\"},{\"line\":57,\"text\":\" rollback_started = document.get(\\\"rollback_started\\\")\"},{\"line\":58,\"text\":\" rollback_restored = document.get(\\\"rollback_restored\\\")\"},{\"line\":59,\"text\":\" if not isinstance(changes, bool):\"},{\"line\":60,\"text\":\" raise ValueError(\\\"changes_made must be boolean\\\")\"}]},{\"match_line\":60,\"match_text\":\" raise ValueError(\\\"changes_made must be boolean\\\")\",\"window\":[{\"line\":58,\"text\":\" rollback_restored = document.get(\\\"rollback_restored\\\")\"},{\"line\":59,\"text\":\" if not isinstance(changes, bool):\"},{\"line\":60,\"text\":\" raise ValueError(\\\"changes_made must be boolean\\\")\"},{\"line\":61,\"text\":\" if not isinstance(rollback_started, bool):\"},{\"line\":62,\"text\":\" raise ValueError(\\\"rollback_started must be boolean\\\")\"}]},{\"match_line\":61,\"match_text\":\" if not isinstance(rollback_started, bool):\",\"window\":[{\"line\":59,\"text\":\" if not isinstance(changes, bool):\"},{\"line\":60,\"text\":\" raise ValueError(\\\"changes_made must be boolean\\\")\"},{\"line\":61,\"text\":\" if not isinstance(rollback_started, bool):\"},{\"line\":62,\"text\":\" raise ValueError(\\\"rollback_started must be boolean\\\")\"},{\"line\":63,\"text\":\" if rollback_restored is not None and not isinstance(\"}]},{\"match_line\":62,\"match_text\":\" raise ValueError(\\\"rollback_started must be boolean\\\")\",\"window\":[{\"line\":60,\"text\":\" raise ValueError(\\\"changes_made must be boolean\\\")\"},{\"line\":61,\"text\":\" if not isinstance(rollback_started, bool):\"},{\"line\":62,\"text\":\" raise ValueError(\\\"rollback_started must be boolean\\\")\"},{\"line\":63,\"text\":\" if rollback_restored is not None and not isinstance(\"},{\"line\":64,\"text\":\" rollback_restored,\"}]},{\"match_line\":63,\"match_text\":\" if rollback_restored is not None and not isinstance(\",\"window\":[{\"line\":61,\"text\":\" if not isinstance(rollback_started, bool):\"},{\"line\":62,\"text\":\" raise ValueError(\\\"rollback_started must be boolean\\\")\"},{\"line\":63,\"text\":\" if rollback_restored is not None and not isinstance(\"},{\"line\":64,\"text\":\" rollback_restored,\"},{\"line\":65,\"text\":\" bool,\"}]},{\"match_line\":64,\"match_text\":\" rollback_restored,\",\"window\":[{\"line\":62,\"text\":\" raise ValueError(\\\"rollback_started must be boolean\\\")\"},{\"line\":63,\"text\":\" if rollback_restored is not None and not isinstance(\"},{\"line\":64,\"text\":\" rollback_restored,\"},{\"line\":65,\"text\":\" bool,\"},{\"line\":66,\"text\":\" ):\"}]},{\"match_line\":68,\"match_text\":\" \\\"rollback_restored must be boolean or null\\\"\",\"window\":[{\"line\":66,\"text\":\" ):\"},{\"line\":67,\"text\":\" raise ValueError(\"},{\"line\":68,\"text\":\" \\\"rollback_restored must be boolean or null\\\"\"},{\"line\":69,\"text\":\" )\"},{\"line\":70,\"text\":\" if rollback_restored is True and rollback_started is not True:\"}]},{\"match_line\":70,\"match_text\":\" if rollback_restored is True and rollback_started is not True:\",\"window\":[{\"line\":68,\"text\":\" \\\"rollback_restored must be boolean or null\\\"\"},{\"line\":69,\"text\":\" )\"},{\"line\":70,\"text\":\" if rollback_restored is True and rollback_started is not True:\"},{\"line\":71,\"text\":\" raise ValueError(\"},{\"line\":72,\"text\":\" \\\"rollback_restored without rollback_started\\\"\"}]},{\"match_line\":72,\"match_text\":\" \\\"rollback_restored without rollback_started\\\"\",\"window\":[{\"line\":70,\"text\":\" if rollback_restored is True and rollback_started is not True:\"},{\"line\":71,\"text\":\" raise ValueError(\"},{\"line\":72,\"text\":\" \\\"rollback_restored without rollback_started\\\"\"},{\"line\":73,\"text\":\" )\"},{\"line\":74,\"text\":\" if rollback_started is True and changes is not True:\"}]},{\"match_line\":74,\"match_text\":\" if rollback_started is True and changes is not True:\",\"window\":[{\"line\":72,\"text\":\" \\\"rollback_restored without rollback_started\\\"\"},{\"line\":73,\"text\":\" )\"},{\"line\":74,\"text\":\" if rollback_started is True and changes is not True:\"},{\"line\":75,\"text\":\" raise ValueError(\"},{\"line\":76,\"text\":\" \\\"rollback_started without changes\\\"\"}]},{\"match_line\":76,\"match_text\":\" \\\"rollback_started without changes\\\"\",\"window\":[{\"line\":74,\"text\":\" if rollback_started is True and changes is not True:\"},{\"line\":75,\"text\":\" raise ValueError(\"},{\"line\":76,\"text\":\" \\\"rollback_started without changes\\\"\"},{\"line\":77,\"text\":\" )\"},{\"line\":78,\"text\":\" if status == \\\"BLOCKED\\\" and (\"}]},{\"match_line\":78,\"match_text\":\" if status == \\\"BLOCKED\\\" and (\",\"window\":[{\"line\":76,\"text\":\" \\\"rollback_started without changes\\\"\"},{\"line\":77,\"text\":\" )\"},{\"line\":78,\"text\":\" if status == \\\"BLOCKED\\\" and (\"},{\"line\":79,\"text\":\" changes\"},{\"line\":80,\"text\":\" or rollback_started\"}]},{\"match_line\":80,\"match_text\":\" or rollback_started\",\"window\":[{\"line\":78,\"text\":\" if status == \\\"BLOCKED\\\" and (\"},{\"line\":79,\"text\":\" changes\"},{\"line\":80,\"text\":\" or rollback_started\"},{\"line\":81,\"text\":\" or command_rc != 2\"},{\"line\":82,\"text\":\" ):\"}]},{\"match_line\":86,\"match_text\":\" if status == \\\"OK\\\" and command_rc != 0:\",\"window\":[{\"line\":84,\"text\":\" \\\"BLOCKED contract inconsistent with rc/mutation\\\"\"},{\"line\":85,\"text\":\" )\"},{\"line\":86,\"text\":\" if status == \\\"OK\\\" and command_rc != 0:\"},{\"line\":87,\"text\":\" raise ValueError(\\\"OK contract inconsistent with rc\\\")\"},{\"line\":88,\"text\":\" if status == \\\"FAIL\\\" and command_rc == 0:\"}]},{\"match_line\":88,\"match_text\":\" if status == \\\"FAIL\\\" and command_rc == 0:\",\"window\":[{\"line\":86,\"text\":\" if status == \\\"OK\\\" and command_rc != 0:\"},{\"line\":87,\"text\":\" raise ValueError(\\\"OK contract inconsistent with rc\\\")\"},{\"line\":88,\"text\":\" if status == \\\"FAIL\\\" and command_rc == 0:\"},{\"line\":89,\"text\":\" raise ValueError(\\\"FAIL contract inconsistent with rc\\\")\"},{\"line\":90,\"text\":\"\"}]},{\"match_line\":93,\"match_text\":\" elif not rollback_started:\",\"window\":[{\"line\":91,\"text\":\" if not changes:\"},{\"line\":92,\"text\":\" outcome = \\\"NO_MUTATION\\\"\"},{\"line\":93,\"text\":\" elif not rollback_started:\"},{\"line\":94,\"text\":\" outcome = \\\"MUTATED\\\"\"},{\"line\":95,\"text\":\" elif rollback_restored is True:\"}]},{\"match_line\":95,\"match_text\":\" elif rollback_restored is True:\",\"window\":[{\"line\":93,\"text\":\" elif not rollback_started:\"},{\"line\":94,\"text\":\" outcome = \\\"MUTATED\\\"\"},{\"line\":95,\"text\":\" elif rollback_restored is True:\"},{\"line\":96,\"text\":\" outcome = \\\"ROLLED_BACK\\\"\"},{\"line\":97,\"text\":\" elif rollback_restored is False:\"}]},{\"match_line\":97,\"match_text\":\" elif rollback_restored is False:\",\"window\":[{\"line\":95,\"text\":\" elif rollback_restored is True:\"},{\"line\":96,\"text\":\" outcome = \\\"ROLLED_BACK\\\"\"},{\"line\":97,\"text\":\" elif rollback_restored is False:\"},{\"line\":98,\"text\":\" outcome = \\\"ROLLBACK_FAILED\\\"\"},{\"line\":99,\"text\":\" else:\"}]},{\"match_line\":104,\"match_text\":\" \\\"status\\\": status,\",\"window\":[{\"line\":102,\"text\":\" result = {\"},{\"line\":103,\"text\":\" \\\"valid\\\": True,\"},{\"line\":104,\"text\":\" \\\"status\\\": status,\"},{\"line\":105,\"text\":\" \\\"changes_made\\\": str(changes).lower(),\"},{\"line\":106,\"text\":\" \\\"rollback_started\\\": str(\"}]},{\"match_line\":105,\"match_text\":\" \\\"changes_made\\\": str(changes).lower(),\",\"window\":[{\"line\":103,\"text\":\" \\\"valid\\\": True,\"},{\"line\":104,\"text\":\" \\\"status\\\": status,\"},{\"line\":105,\"text\":\" \\\"changes_made\\\": str(changes).lower(),\"},{\"line\":106,\"text\":\" \\\"rollback_started\\\": str(\"},{\"line\":107,\"text\":\" rollback_started\"}]},{\"match_line\":106,\"match_text\":\" \\\"rollback_started\\\": str(\",\"window\":[{\"line\":104,\"text\":\" \\\"status\\\": status,\"},{\"line\":105,\"text\":\" \\\"changes_made\\\": str(changes).lower(),\"},{\"line\":106,\"text\":\" \\\"rollback_started\\\": str(\"},{\"line\":107,\"text\":\" rollback_started\"},{\"line\":108,\"text\":\" ).lower(),\"}]},{\"match_line\":107,\"match_text\":\" rollback_started\",\"window\":[{\"line\":105,\"text\":\" \\\"changes_made\\\": str(changes).lower(),\"},{\"line\":106,\"text\":\" \\\"rollback_started\\\": str(\"},{\"line\":107,\"text\":\" rollback_started\"},{\"line\":108,\"text\":\" ).lower(),\"},{\"line\":109,\"text\":\" \\\"rollback_restored\\\": (\"}]},{\"match_line\":109,\"match_text\":\" \\\"rollback_restored\\\": (\",\"window\":[{\"line\":107,\"text\":\" rollback_started\"},{\"line\":108,\"text\":\" ).lower(),\"},{\"line\":109,\"text\":\" \\\"rollback_restored\\\": (\"},{\"line\":110,\"text\":\" \\\"null\\\"\"},{\"line\":111,\"text\":\" if rollback_restored is None\"}]},{\"match_line\":111,\"match_text\":\" if rollback_restored is None\",\"window\":[{\"line\":109,\"text\":\" \\\"rollback_restored\\\": (\"},{\"line\":110,\"text\":\" \\\"null\\\"\"},{\"line\":111,\"text\":\" if rollback_restored is None\"},{\"line\":112,\"text\":\" else str(rollback_restored).lower()\"},{\"line\":113,\"text\":\" ),\"}]},{\"match_line\":112,\"match_text\":\" else str(rollback_restored).lower()\",\"window\":[{\"line\":110,\"text\":\" \\\"null\\\"\"},{\"line\":111,\"text\":\" if rollback_restored is None\"},{\"line\":112,\"text\":\" else str(rollback_restored).lower()\"},{\"line\":113,\"text\":\" ),\"},{\"line\":114,\"text\":\" \\\"mutation_outcome\\\": outcome,\"}]},{\"match_line\":126,\"match_text\":\" result[\\\"status\\\"],\",\"window\":[{\"line\":124,\"text\":\"print(\\\"\\\\t\\\".join([\"},{\"line\":125,\"text\":\" str(result[\\\"valid\\\"]).lower(),\"},{\"line\":126,\"text\":\" result[\\\"status\\\"],\"},{\"line\":127,\"text\":\" result[\\\"changes_made\\\"],\"},{\"line\":128,\"text\":\" result[\\\"rollback_started\\\"],\"}]},{\"match_line\":127,\"match_text\":\" result[\\\"changes_made\\\"],\",\"window\":[{\"line\":125,\"text\":\" str(result[\\\"valid\\\"]).lower(),\"},{\"line\":126,\"text\":\" result[\\\"status\\\"],\"},{\"line\":127,\"text\":\" result[\\\"changes_made\\\"],\"},{\"line\":128,\"text\":\" result[\\\"rollback_started\\\"],\"},{\"line\":129,\"text\":\" result[\\\"rollback_restored\\\"],\"}]},{\"match_line\":128,\"match_text\":\" result[\\\"rollback_started\\\"],\",\"window\":[{\"line\":126,\"text\":\" result[\\\"status\\\"],\"},{\"line\":127,\"text\":\" result[\\\"changes_made\\\"],\"},{\"line\":128,\"text\":\" result[\\\"rollback_started\\\"],\"},{\"line\":129,\"text\":\" result[\\\"rollback_restored\\\"],\"},{\"line\":130,\"text\":\" result[\\\"mutation_outcome\\\"],\"}]},{\"match_line\":129,\"match_text\":\" result[\\\"rollback_restored\\\"],\",\"window\":[{\"line\":127,\"text\":\" result[\\\"changes_made\\\"],\"},{\"line\":128,\"text\":\" result[\\\"rollback_started\\\"],\"},{\"line\":129,\"text\":\" result[\\\"rollback_restored\\\"],\"},{\"line\":130,\"text\":\" result[\\\"mutation_outcome\\\"],\"},{\"line\":131,\"text\":\" result[\\\"error\\\"],\"}]},{\"match_line\":142,\"match_text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T1\\\",\\\"status\\\":\\\"BLOCKED\\\",\\\"changes_made\\\":false,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"window\":[{\"line\":140,\"text\":\"\"},{\"line\":141,\"text\":\" printf '%s\\\\n' \\\\\"},{\"line\":142,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T1\\\",\\\"status\\\":\\\"BLOCKED\\\",\\\"changes_made\\\":false,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":143,\"text\":\" >\\\"$tmp\\\"\"},{\"line\":144,\"text\":\" [ \\\"$(read_mutation_contract \\\"$tmp\\\" T1 change 2)\\\" = \\\\\"}]},{\"match_line\":148,\"match_text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T2\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"window\":[{\"line\":146,\"text\":\"\"},{\"line\":147,\"text\":\" printf '%s\\\\n' \\\\\"},{\"line\":148,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T2\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":149,\"text\":\" >\\\"$tmp\\\"\"},{\"line\":150,\"text\":\" [ \\\"$(read_mutation_contract \\\"$tmp\\\" T2 change 0)\\\" = \\\\\"}]},{\"match_line\":154,\"match_text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T3\\\",\\\"status\\\":\\\"FAIL\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":true,\\\"rollback_restored\\\":true}' \\\\\",\"window\":[{\"line\":152,\"text\":\"\"},{\"line\":153,\"text\":\" printf '%s\\\\n' \\\\\"},{\"line\":154,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T3\\\",\\\"status\\\":\\\"FAIL\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":true,\\\"rollback_restored\\\":true}' \\\\\"},{\"line\":155,\"text\":\" >\\\"$tmp\\\"\"},{\"line\":156,\"text\":\" [ \\\"$(read_mutation_contract \\\"$tmp\\\" T3 change 1)\\\" = \\\\\"}]},{\"match_line\":168,\"match_text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"OTHER\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"window\":[{\"line\":166,\"text\":\"\"},{\"line\":167,\"text\":\" printf '%s\\\\n' \\\\\"},{\"line\":168,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"OTHER\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":169,\"text\":\" >\\\"$tmp\\\"\"},{\"line\":170,\"text\":\" [ \\\"$(read_mutation_contract \\\"$tmp\\\" T6 change 0)\\\" = \\\\\"}]},{\"match_line\":174,\"match_text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"window\":[{\"line\":172,\"text\":\"\"},{\"line\":173,\"text\":\" printf '%s\\\\n' \\\\\"},{\"line\":174,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":175,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":176,\"text\":\" >\\\"$tmp\\\"\"}]},{\"match_line\":175,\"match_text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"window\":[{\"line\":173,\"text\":\" printf '%s\\\\n' \\\\\"},{\"line\":174,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":175,\"text\":\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\"},{\"line\":176,\"text\":\" >\\\"$tmp\\\"\"},{\"line\":177,\"text\":\" [ \\\"$(read_mutation_contract \\\"$tmp\\\" T7 change 0)\\\" = \\\\\"}]},{\"match_line\":191,\"match_text\":\" homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]\",\"window\":[{\"line\":189,\"text\":\" cat >&2 <<'USAGE'\"},{\"line\":190,\"text\":\"Usage:\"},{\"line\":191,\"text\":\" homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]\"},{\"line\":192,\"text\":\"\"},{\"line\":193,\"text\":\"MODE:\"}]},{\"match_line\":208,\"match_text\":\"COMMAND_ID=\\\"$1\\\"\",\"window\":[{\"line\":206,\"text\":\"[ \\\"$#\\\" -ge 5 ] || usage\"},{\"line\":207,\"text\":\"\"},{\"line\":208,\"text\":\"COMMAND_ID=\\\"$1\\\"\"},{\"line\":209,\"text\":\"MODE=\\\"$2\\\"\"},{\"line\":210,\"text\":\"COMPONENT=\\\"$3\\\"\"}]},{\"match_line\":217,\"match_text\":\"case \\\"$COMMAND_ID\\\" in\",\"window\":[{\"line\":215,\"text\":\"[ \\\"$#\\\" -ge 1 ] || usage\"},{\"line\":216,\"text\":\"\"},{\"line\":217,\"text\":\"case \\\"$COMMAND_ID\\\" in\"},{\"line\":218,\"text\":\" ''|*[!A-Za-z0-9._-]*)\"},{\"line\":219,\"text\":\" echo 'RESULT=FAIL'\"}]},{\"match_line\":220,\"match_text\":\" echo 'REASON=INVALID_COMMAND_ID'\",\"window\":[{\"line\":218,\"text\":\" ''|*[!A-Za-z0-9._-]*)\"},{\"line\":219,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":220,\"text\":\" echo 'REASON=INVALID_COMMAND_ID'\"},{\"line\":221,\"text\":\" exit 65\"},{\"line\":222,\"text\":\" ;;\"}]},{\"match_line\":297,\"match_text\":\"RAW_FILE=\\\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\\\"\",\"window\":[{\"line\":295,\"text\":\"HOST_SHORT=\\\"$(hostname -s 2>/dev/null || hostname)\\\"\"},{\"line\":296,\"text\":\"\"},{\"line\":297,\"text\":\"RAW_FILE=\\\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\\\"\"},{\"line\":298,\"text\":\"SANITIZED_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\\\"\"},{\"line\":299,\"text\":\"JSON_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\\\"\"}]},{\"match_line\":298,\"match_text\":\"SANITIZED_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\\\"\",\"window\":[{\"line\":296,\"text\":\"\"},{\"line\":297,\"text\":\"RAW_FILE=\\\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\\\"\"},{\"line\":298,\"text\":\"SANITIZED_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\\\"\"},{\"line\":299,\"text\":\"JSON_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\\\"\"},{\"line\":300,\"text\":\"TXT_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\\\"\"}]},{\"match_line\":299,\"match_text\":\"JSON_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\\\"\",\"window\":[{\"line\":297,\"text\":\"RAW_FILE=\\\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\\\"\"},{\"line\":298,\"text\":\"SANITIZED_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\\\"\"},{\"line\":299,\"text\":\"JSON_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\\\"\"},{\"line\":300,\"text\":\"TXT_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\\\"\"},{\"line\":301,\"text\":\"\"}]},{\"match_line\":300,\"match_text\":\"TXT_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\\\"\",\"window\":[{\"line\":298,\"text\":\"SANITIZED_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\\\"\"},{\"line\":299,\"text\":\"JSON_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\\\"\"},{\"line\":300,\"text\":\"TXT_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\\\"\"},{\"line\":301,\"text\":\"\"},{\"line\":302,\"text\":\"REFERENCE_SHA256=\\\"$(sha256sum \\\"$REFERENCE\\\" | awk '{print $1}')\\\"\"}]},{\"match_line\":331,\"match_text\":\"RESULT_CONTRACT_VALID=true\",\"window\":[{\"line\":329,\"text\":\"BLOCK_REASON=''\"},{\"line\":330,\"text\":\"CHANGE_DECLARED=false\"},{\"line\":331,\"text\":\"RESULT_CONTRACT_VALID=true\"},{\"line\":332,\"text\":\"CONTRACT_STATUS='NOT_APPLICABLE'\"},{\"line\":333,\"text\":\"CHANGES_MADE=false\"}]},{\"match_line\":332,\"match_text\":\"CONTRACT_STATUS='NOT_APPLICABLE'\",\"window\":[{\"line\":330,\"text\":\"CHANGE_DECLARED=false\"},{\"line\":331,\"text\":\"RESULT_CONTRACT_VALID=true\"},{\"line\":332,\"text\":\"CONTRACT_STATUS='NOT_APPLICABLE'\"},{\"line\":333,\"text\":\"CHANGES_MADE=false\"},{\"line\":334,\"text\":\"ROLLBACK_STARTED=false\"}]},{\"match_line\":333,\"match_text\":\"CHANGES_MADE=false\",\"window\":[{\"line\":331,\"text\":\"RESULT_CONTRACT_VALID=true\"},{\"line\":332,\"text\":\"CONTRACT_STATUS='NOT_APPLICABLE'\"},{\"line\":333,\"text\":\"CHANGES_MADE=false\"},{\"line\":334,\"text\":\"ROLLBACK_STARTED=false\"},{\"line\":335,\"text\":\"ROLLBACK_RESTORED=null\"}]},{\"match_line\":334,\"match_text\":\"ROLLBACK_STARTED=false\",\"window\":[{\"line\":332,\"text\":\"CONTRACT_STATUS='NOT_APPLICABLE'\"},{\"line\":333,\"text\":\"CHANGES_MADE=false\"},{\"line\":334,\"text\":\"ROLLBACK_STARTED=false\"},{\"line\":335,\"text\":\"ROLLBACK_RESTORED=null\"},{\"line\":336,\"text\":\"MUTATION_OUTCOME='NO_MUTATION'\"}]},{\"match_line\":335,\"match_text\":\"ROLLBACK_RESTORED=null\",\"window\":[{\"line\":333,\"text\":\"CHANGES_MADE=false\"},{\"line\":334,\"text\":\"ROLLBACK_STARTED=false\"},{\"line\":335,\"text\":\"ROLLBACK_RESTORED=null\"},{\"line\":336,\"text\":\"MUTATION_OUTCOME='NO_MUTATION'\"},{\"line\":337,\"text\":\"RESULT_CONTRACT_ERROR='NONE'\"}]},{\"match_line\":337,\"match_text\":\"RESULT_CONTRACT_ERROR='NONE'\",\"window\":[{\"line\":335,\"text\":\"ROLLBACK_RESTORED=null\"},{\"line\":336,\"text\":\"MUTATION_OUTCOME='NO_MUTATION'\"},{\"line\":337,\"text\":\"RESULT_CONTRACT_ERROR='NONE'\"},{\"line\":338,\"text\":\"COMMAND_RC=''\"},{\"line\":339,\"text\":\"\"}]},{\"match_line\":342,\"match_text\":\" RESULT_CONTRACT_VALID=false\",\"window\":[{\"line\":340,\"text\":\"if [ \\\"$MODE\\\" = change ]; then\"},{\"line\":341,\"text\":\" CHANGE_DECLARED=true\"},{\"line\":342,\"text\":\" RESULT_CONTRACT_VALID=false\"},{\"line\":343,\"text\":\" CONTRACT_STATUS='UNKNOWN'\"},{\"line\":344,\"text\":\" CHANGES_MADE=unknown\"}]},{\"match_line\":343,\"match_text\":\" CONTRACT_STATUS='UNKNOWN'\",\"window\":[{\"line\":341,\"text\":\" CHANGE_DECLARED=true\"},{\"line\":342,\"text\":\" RESULT_CONTRACT_VALID=false\"},{\"line\":343,\"text\":\" CONTRACT_STATUS='UNKNOWN'\"},{\"line\":344,\"text\":\" CHANGES_MADE=unknown\"},{\"line\":345,\"text\":\" ROLLBACK_STARTED=unknown\"}]},{\"match_line\":344,\"match_text\":\" CHANGES_MADE=unknown\",\"window\":[{\"line\":342,\"text\":\" RESULT_CONTRACT_VALID=false\"},{\"line\":343,\"text\":\" CONTRACT_STATUS='UNKNOWN'\"},{\"line\":344,\"text\":\" CHANGES_MADE=unknown\"},{\"line\":345,\"text\":\" ROLLBACK_STARTED=unknown\"},{\"line\":346,\"text\":\" ROLLBACK_RESTORED=null\"}]},{\"match_line\":345,\"match_text\":\" ROLLBACK_STARTED=unknown\",\"window\":[{\"line\":343,\"text\":\" CONTRACT_STATUS='UNKNOWN'\"},{\"line\":344,\"text\":\" CHANGES_MADE=unknown\"},{\"line\":345,\"text\":\" ROLLBACK_STARTED=unknown\"},{\"line\":346,\"text\":\" ROLLBACK_RESTORED=null\"},{\"line\":347,\"text\":\" MUTATION_OUTCOME='UNKNOWN'\"}]},{\"match_line\":346,\"match_text\":\" ROLLBACK_RESTORED=null\",\"window\":[{\"line\":344,\"text\":\" CHANGES_MADE=unknown\"},{\"line\":345,\"text\":\" ROLLBACK_STARTED=unknown\"},{\"line\":346,\"text\":\" ROLLBACK_RESTORED=null\"},{\"line\":347,\"text\":\" MUTATION_OUTCOME='UNKNOWN'\"},{\"line\":348,\"text\":\" RESULT_CONTRACT_ERROR='MISSING_CONTRACT'\"}]},{\"match_line\":348,\"match_text\":\" RESULT_CONTRACT_ERROR='MISSING_CONTRACT'\",\"window\":[{\"line\":346,\"text\":\" ROLLBACK_RESTORED=null\"},{\"line\":347,\"text\":\" MUTATION_OUTCOME='UNKNOWN'\"},{\"line\":348,\"text\":\" RESULT_CONTRACT_ERROR='MISSING_CONTRACT'\"},{\"line\":349,\"text\":\"fi\"},{\"line\":350,\"text\":\"\"}]},{\"match_line\":358,\"match_text\":\" STATUS='BLOCKED'\",\"window\":[{\"line\":356,\"text\":\" BLOCK_REASON='EXACT_FAILED_COMMAND_REPEAT'\"},{\"line\":357,\"text\":\" RC=73\"},{\"line\":358,\"text\":\" STATUS='BLOCKED'\"},{\"line\":359,\"text\":\" RESULT_CONTRACT_VALID=true\"},{\"line\":360,\"text\":\" CONTRACT_STATUS='BLOCKED'\"}]},{\"match_line\":359,\"match_text\":\" RESULT_CONTRACT_VALID=true\",\"window\":[{\"line\":357,\"text\":\" RC=73\"},{\"line\":358,\"text\":\" STATUS='BLOCKED'\"},{\"line\":359,\"text\":\" RESULT_CONTRACT_VALID=true\"},{\"line\":360,\"text\":\" CONTRACT_STATUS='BLOCKED'\"},{\"line\":361,\"text\":\" CHANGES_MADE=false\"}]},{\"match_line\":360,\"match_text\":\" CONTRACT_STATUS='BLOCKED'\",\"window\":[{\"line\":358,\"text\":\" STATUS='BLOCKED'\"},{\"line\":359,\"text\":\" RESULT_CONTRACT_VALID=true\"},{\"line\":360,\"text\":\" CONTRACT_STATUS='BLOCKED'\"},{\"line\":361,\"text\":\" CHANGES_MADE=false\"},{\"line\":362,\"text\":\" ROLLBACK_STARTED=false\"}]},{\"match_line\":361,\"match_text\":\" CHANGES_MADE=false\",\"window\":[{\"line\":359,\"text\":\" RESULT_CONTRACT_VALID=true\"},{\"line\":360,\"text\":\" CONTRACT_STATUS='BLOCKED'\"},{\"line\":361,\"text\":\" CHANGES_MADE=false\"},{\"line\":362,\"text\":\" ROLLBACK_STARTED=false\"},{\"line\":363,\"text\":\" ROLLBACK_RESTORED=null\"}]},{\"match_line\":362,\"match_text\":\" ROLLBACK_STARTED=false\",\"window\":[{\"line\":360,\"text\":\" CONTRACT_STATUS='BLOCKED'\"},{\"line\":361,\"text\":\" CHANGES_MADE=false\"},{\"line\":362,\"text\":\" ROLLBACK_STARTED=false\"},{\"line\":363,\"text\":\" ROLLBACK_RESTORED=null\"},{\"line\":364,\"text\":\" MUTATION_OUTCOME='NO_MUTATION'\"}]},{\"match_line\":363,\"match_text\":\" ROLLBACK_RESTORED=null\",\"window\":[{\"line\":361,\"text\":\" CHANGES_MADE=false\"},{\"line\":362,\"text\":\" ROLLBACK_STARTED=false\"},{\"line\":363,\"text\":\" ROLLBACK_RESTORED=null\"},{\"line\":364,\"text\":\" MUTATION_OUTCOME='NO_MUTATION'\"},{\"line\":365,\"text\":\" RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'\"}]},{\"match_line\":365,\"match_text\":\" RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'\",\"window\":[{\"line\":363,\"text\":\" ROLLBACK_RESTORED=null\"},{\"line\":364,\"text\":\" MUTATION_OUTCOME='NO_MUTATION'\"},{\"line\":365,\"text\":\" RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'\"},{\"line\":366,\"text\":\"\"},{\"line\":367,\"text\":\" {\"}]},{\"match_line\":389,\"match_text\":\" --preserve-status \\\\\",\"window\":[{\"line\":387,\"text\":\" timeout \\\\\"},{\"line\":388,\"text\":\" --foreground \\\\\"},{\"line\":389,\"text\":\" --preserve-status \\\\\"},{\"line\":390,\"text\":\" \\\"$HOMELAB_TIMEOUT\\\" \\\\\"},{\"line\":391,\"text\":\" \\\"$@\\\" >\\\"$RAW_FILE\\\" 2>&1\"}]}]\nRUNNERCONTRACT5_WINDOW_COUNT=80\nRUNNERCONTRACT5_HOLD_REASONS=[]\nRUNNERCONTRACT5_DECISION=RUNNER_CONTRACT_SOURCE_EVIDENCE_PUBLISHED_FOR_MANUAL_INTERPRETATION\nRUNNERCONTRACT5_MUTATION_SCOPE=NO_GIT_NO_APPLICATION_NO_DB_NO_PRODUCTION_MUTATION\n" + "output": "RECOVERY2_BEGIN=true\nCOMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY2\nMUTATION_SCOPE=NONE_READ_ONLY\nMUTATIONS_PERFORMED=NO\nERROR_REGISTER_CHECK=OK\nERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\nREFERENCE_CHECK=OK\nREFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nRUNNER_CONTRACT_MARKERS_PRESENT={\"HOMELAB_RESULT_CONTRACT\":true,\"changes_made\":true,\"command_id\":true,\"rollback_restored\":true,\"rollback_started\":true}\nHISTORY_NEWFI_260907_PORTAL200_APPLY3_SHA256=f3ea3fcebd7b182e64db6e963a34f1b90baca0d08477e25e27bf88c48b33611c\nHISTORY_NEWFI_260907_PORTAL200_APPLY3_STATUS=FAIL\nHISTORY_NEWFI_260907_PORTAL200_APPLY3_MODE=change\nHISTORY_NEWFI_260907_PORTAL200_APPLY3_CHANGES_MADE=unknown\nHISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_SHA256=00c4dc5e100be0cb26a80262a8af96555457b5dc4fa924c6a9458089cd01474e\nHISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_STATUS=OK\nHISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_MODE=read-only\nHISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_CHANGES_MADE=false\nHISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_SHA256=805954f73608dbd343da33d387c59a6ad258a7f6a51965db4e78c3fd0f588fd4\nHISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_STATUS=OK\nHISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_MODE=read-only\nHISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_CHANGES_MADE=false\nHISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_SHA256=30370cad3d4d7e73c6612a5df702abe1fac6ae559bf142b5e489a19a1258cfb7\nHISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_STATUS=OK\nHISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_MODE=read-only\nHISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_CHANGES_MADE=false\nHISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_SHA256=80ce8e1f27c78341e596ae39a7208959347572ffb6b3b2e7496c0c2aea897928\nHISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_STATUS=FAIL\nHISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_MODE=read-only\nHISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_CHANGES_MADE=false\nHISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_SHA256=0b09da950cf23908353b6af93784e61e2cde7c365d41a94070d28295494fd21f\nHISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_STATUS=OK\nHISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_MODE=read-only\nHISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_CHANGES_MADE=false\nTARGET_BRANCH_WORKTREES=[{\"branch\":\"implementation/newfi-closed-mvp-20260906\",\"dirty_count\":0,\"head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"remote_head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"repo\":\"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\"}]\nGIT_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\nGIT_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_REMOTE_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_DIRTY_COUNT=0\nNEWFI_CLUSTER_VMS=[{\"name\":\"newfi-prod\",\"node\":\"pve01\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":210},{\"name\":\"newfi-staging\",\"node\":\"pve03\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":211}]\nPRODUCTION_VM={\"name\":\"newfi-prod\",\"node\":\"pve01\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":210}\nSTAGING_VM={\"name\":\"newfi-staging\",\"node\":\"pve03\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":211}\nPRODUCTION_LAYOUT_DISCOVERY={\"base_candidates\":[[20,\"/var/www/forums/newfi/public\"]],\"doc_candidates\":[\"/var/www/forums/newfi/public\"],\"guest_hostname\":\"newfi-prod\",\"guest_smoke_err\":\"\",\"guest_smoke_rc\":0,\"layout_scan_err\":\"\",\"layout_scan_rc\":0,\"sections\":{\"ADDONS\":[\"/var/www/forums/newfi/public/src/addons/Newfi/Dogs/addon.json\",\"/var/www/forums/newfi/public/src/addons/Newfi/Events/addon.json\",\"/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json\"],\"CMD\":[\"/var/www/forums/newfi/public/cmd.php\"],\"INDEX\":[\"/var/www/forums/newfi/public/index.php\",\"/var/www/forums/newfi/public/install/index.php\"],\"XF\":[\"/var/www/forums/newfi/public/src/XF.php\"]}}\nPRODUCTION_XF_BASE_ROOT=/var/www/forums/newfi/public\nPRODUCTION_DOCROOT=/var/www/forums/newfi/public\nPRODUCTION_XF_VERSION=XenForo 2.3.12\nPRODUCTION_SERVICES=nginx=active\\nmariadb=active\\nmysql=active\\nphp8.3-fpm.service=active\nPRODUCTION_ADDON_LIST= -------------- -------------------------- --------------- -------- \\n Add-on ID Title Version Active \\n -------------- -------------------------- --------------- -------- \\n Newfi/Dogs Newfi Dogs 1.0.0 Alpha 1 Yes \\n Newfi/Events Newfi Events 1.0.0 Alpha 1 Yes \\n Newfi/Portal Newfi Portal 1.0.0 Alpha 1 Yes \\n XFMG XenForo Media Gallery 2.3.11 Yes \\n XFRM XenForo Resource Manager 2.3.11 Yes \\n -------------- -------------------------- --------------- -------- \\n\\n Total: 5 add-ons (5 active, 0 inactive)\nPRODUCTION_PORTAL_ADDON_CANDIDATES=[{\"id\":\"Newfi/Portal\",\"path\":\"/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json\",\"title\":\"Newfi Portal\",\"version_id\":1000010,\"version_string\":\"1.0.0 Alpha 1\"}]\nSTAGING_LAYOUT_DISCOVERY={\"guest_hostname\":\"newfi-staging\",\"guest_smoke_err\":\"\",\"guest_smoke_rc\":0,\"layout_scan_err\":\"\",\"layout_scan_rc\":0,\"sections\":{\"ADDONS\":[],\"CMD\":[],\"INDEX\":[],\"XF\":[]}}\nPRODUCTION_DB_SCHEMA_CANDIDATES=[\"xf_newfi\"]\nPRODUCTION_BOARD_ACTIVE=1\nPRODUCTION_ERROR_MAX=0\nPRODUCTION_ADDON_ROWS=Newfi/Dogs\tNewfi Dogs\t1000010\t1.0.0 Alpha 1\t1\\nNewfi/Events\tNewfi Events\t1000010\t1.0.0 Alpha 1\t1\\nNewfi/Portal\tNewfi Portal\t1000010\t1.0.0 Alpha 1\t1\\nXF\tXenForo\t2031270\t2.3.12\t1\\nXFMG\tXenForo Media Gallery\t902031170\t2.3.11\t1\\nXFRM\tXenForo Resource Manager\t2031170\t2.3.11\t1\nPRODUCTION_PUBLIC_HTTP={\"http\":\"200\",\"rc\":0}\nHOLD_REASONS=[\"STAGING_XF_BASE_ROOT_UNPROVEN\"]\nFINAL_DECISION=HOLD_PORTAL200_APPLY4_PREP_STAGING_XF_BASE_ROOT_UNPROVEN\nRECOVERY2_END=true\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index f70792eb..69a89eae 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,15 +1,15 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=NEWFI-260907-B-PORTAL200-RUNNERCONTRACT5 +COMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY2 STATUS=OK RC=0 HOST=pve01 MODE=read-only -COMPONENT=newfi-portal200-runner-contract-source-evidence +COMPONENT=newfi-portal200-recovery2-strict-readonly REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=78728559634f5f083666b7c6889dfeac8efb1f04a5c9d2777009d2ad479e57a4 +COMMAND_SHA256=845c1cd3782bcb68401f17baffd22c1f5850d989434d3a7eed95dd807d372a63 DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true CHANGE_DECLARED=false @@ -24,23 +24,68 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=cbef9ff8eec5a98273cdd12e712d16746764b9c2857b2f37db7efde899c698fb -SANITIZED_OUTPUT_SHA256=cbef9ff8eec5a98273cdd12e712d16746764b9c2857b2f37db7efde899c698fb +RAW_EVIDENCE_SHA256=4d4a8415236fab465d1567f5162ffbdb161dc16a12c2a3d798c2c9f3faeb1f00 +SANITIZED_OUTPUT_SHA256=4d4a8415236fab465d1567f5162ffbdb161dc16a12c2a3d798c2c9f3faeb1f00 OUTPUT_BEGIN +RECOVERY2_BEGIN=true +COMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY2 +MUTATION_SCOPE=NONE_READ_ONLY +MUTATIONS_PERFORMED=NO ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 REFERENCE_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED -RUNNERCONTRACT5_AUTHORITY={"ERROR_REGISTER":{"bytes":302058,"ok":true,"sha256":"3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0"},"REFERENCE":{"bytes":201129,"ok":true,"sha256":"5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66"}} -RUNNERCONTRACT5_RUNNER={"bytes":21321,"first_line":"#!/usr/bin/env bash","line_count":822,"matches_handoff_baseline":true,"path":"/usr/local/sbin/homelab-chat-run","sha256":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d"} -RUNNERCONTRACT5_STATUS_TOKENS=["BLOCKED","ERROR","FAIL","OK"] -RUNNERCONTRACT5_CONTRACT_KEYS=["changes_made","command_id","rollback_restored","rollback_started","status","version"] -RUNNERCONTRACT5_CROSSFIELD_LINES=[{"line":19,"text":" \"rollback_restored\": \"null\","},{"line":30,"text":" \"rollback_restored\": \"null\","},{"line":58,"text":" rollback_restored = document.get(\"rollback_restored\")"},{"line":60,"text":" raise ValueError(\"changes_made must be boolean\")"},{"line":62,"text":" raise ValueError(\"rollback_started must be boolean\")"},{"line":63,"text":" if rollback_restored is not None and not isinstance("},{"line":64,"text":" rollback_restored,"},{"line":68,"text":" \"rollback_restored must be boolean or null\""},{"line":70,"text":" if rollback_restored is True and rollback_started is not True:"},{"line":72,"text":" \"rollback_restored without rollback_started\""},{"line":74,"text":" if rollback_started is True and changes is not True:"},{"line":80,"text":" or rollback_started"},{"line":95,"text":" elif rollback_restored is True:"},{"line":97,"text":" elif rollback_restored is False:"},{"line":109,"text":" \"rollback_restored\": ("},{"line":111,"text":" if rollback_restored is None"},{"line":112,"text":" else str(rollback_restored).lower()"},{"line":129,"text":" result[\"rollback_restored\"],"},{"line":142,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T1\",\"status\":\"BLOCKED\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":148,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T2\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":154,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T3\",\"status\":\"FAIL\",\"changes_made\":true,\"rollback_started\":true,\"rollback_restored\":true}' \\"},{"line":168,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"OTHER\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":174,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":175,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":599,"text":" rollback_restored,"},{"line":664,"text":" \"rollback_restored\": optional_bool(rollback_restored),"}] -RUNNERCONTRACT5_DUPLICATE_LINES=[{"line":646,"text":" \"duplicate_failed_command_blocked\": repeat_blocked == \"true\","},{"line":704,"text":" echo \"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\""},{"line":816,"text":"echo \"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\""}] -RUNNERCONTRACT5_SOURCE_WINDOWS=[{"match_line":11,"match_text":"raw_path, command_id, mode, command_rc = sys.argv[1:]","window":[{"line":9,"text":"from pathlib import Path"},{"line":10,"text":""},{"line":11,"text":"raw_path, command_id, mode, command_rc = sys.argv[1:]"},{"line":12,"text":"command_rc = int(command_rc)"},{"line":13,"text":""}]},{"match_line":16,"match_text":" \"status\": \"NOT_APPLICABLE\",","window":[{"line":14,"text":"result = {"},{"line":15,"text":" \"valid\": True,"},{"line":16,"text":" \"status\": \"NOT_APPLICABLE\","},{"line":17,"text":" \"changes_made\": \"false\","},{"line":18,"text":" \"rollback_started\": \"false\","}]},{"match_line":17,"match_text":" \"changes_made\": \"false\",","window":[{"line":15,"text":" \"valid\": True,"},{"line":16,"text":" \"status\": \"NOT_APPLICABLE\","},{"line":17,"text":" \"changes_made\": \"false\","},{"line":18,"text":" \"rollback_started\": \"false\","},{"line":19,"text":" \"rollback_restored\": \"null\","}]},{"match_line":18,"match_text":" \"rollback_started\": \"false\",","window":[{"line":16,"text":" \"status\": \"NOT_APPLICABLE\","},{"line":17,"text":" \"changes_made\": \"false\","},{"line":18,"text":" \"rollback_started\": \"false\","},{"line":19,"text":" \"rollback_restored\": \"null\","},{"line":20,"text":" \"mutation_outcome\": \"NO_MUTATION\","}]},{"match_line":19,"match_text":" \"rollback_restored\": \"null\",","window":[{"line":17,"text":" \"changes_made\": \"false\","},{"line":18,"text":" \"rollback_started\": \"false\","},{"line":19,"text":" \"rollback_restored\": \"null\","},{"line":20,"text":" \"mutation_outcome\": \"NO_MUTATION\","},{"line":21,"text":" \"error\": \"NONE\","}]},{"match_line":27,"match_text":" \"status\": \"UNKNOWN\",","window":[{"line":25,"text":" result = {"},{"line":26,"text":" \"valid\": False,"},{"line":27,"text":" \"status\": \"UNKNOWN\","},{"line":28,"text":" \"changes_made\": \"unknown\","},{"line":29,"text":" \"rollback_started\": \"unknown\","}]},{"match_line":28,"match_text":" \"changes_made\": \"unknown\",","window":[{"line":26,"text":" \"valid\": False,"},{"line":27,"text":" \"status\": \"UNKNOWN\","},{"line":28,"text":" \"changes_made\": \"unknown\","},{"line":29,"text":" \"rollback_started\": \"unknown\","},{"line":30,"text":" \"rollback_restored\": \"null\","}]},{"match_line":29,"match_text":" \"rollback_started\": \"unknown\",","window":[{"line":27,"text":" \"status\": \"UNKNOWN\","},{"line":28,"text":" \"changes_made\": \"unknown\","},{"line":29,"text":" \"rollback_started\": \"unknown\","},{"line":30,"text":" \"rollback_restored\": \"null\","},{"line":31,"text":" \"mutation_outcome\": \"UNKNOWN\","}]},{"match_line":30,"match_text":" \"rollback_restored\": \"null\",","window":[{"line":28,"text":" \"changes_made\": \"unknown\","},{"line":29,"text":" \"rollback_started\": \"unknown\","},{"line":30,"text":" \"rollback_restored\": \"null\","},{"line":31,"text":" \"mutation_outcome\": \"UNKNOWN\","},{"line":32,"text":" \"error\": \"MISSING_CONTRACT\","}]},{"match_line":34,"match_text":" marker = \"HOMELAB_RESULT_CONTRACT=\"","window":[{"line":32,"text":" \"error\": \"MISSING_CONTRACT\","},{"line":33,"text":" }"},{"line":34,"text":" marker = \"HOMELAB_RESULT_CONTRACT=\""},{"line":35,"text":" lines = Path(raw_path).read_bytes().decode("},{"line":36,"text":" \"utf-8\","}]},{"match_line":51,"match_text":" if document.get(\"command_id\") != command_id:","window":[{"line":49,"text":" if document.get(\"version\") != 1:"},{"line":50,"text":" raise ValueError(\"unsupported version\")"},{"line":51,"text":" if document.get(\"command_id\") != command_id:"},{"line":52,"text":" raise ValueError(\"command_id mismatch\")"},{"line":53,"text":" status = document.get(\"status\")"}]},{"match_line":52,"match_text":" raise ValueError(\"command_id mismatch\")","window":[{"line":50,"text":" raise ValueError(\"unsupported version\")"},{"line":51,"text":" if document.get(\"command_id\") != command_id:"},{"line":52,"text":" raise ValueError(\"command_id mismatch\")"},{"line":53,"text":" status = document.get(\"status\")"},{"line":54,"text":" if status not in {\"OK\", \"BLOCKED\", \"FAIL\"}:"}]},{"match_line":53,"match_text":" status = document.get(\"status\")","window":[{"line":51,"text":" if document.get(\"command_id\") != command_id:"},{"line":52,"text":" raise ValueError(\"command_id mismatch\")"},{"line":53,"text":" status = document.get(\"status\")"},{"line":54,"text":" if status not in {\"OK\", \"BLOCKED\", \"FAIL\"}:"},{"line":55,"text":" raise ValueError(\"invalid status\")"}]},{"match_line":54,"match_text":" if status not in {\"OK\", \"BLOCKED\", \"FAIL\"}:","window":[{"line":52,"text":" raise ValueError(\"command_id mismatch\")"},{"line":53,"text":" status = document.get(\"status\")"},{"line":54,"text":" if status not in {\"OK\", \"BLOCKED\", \"FAIL\"}:"},{"line":55,"text":" raise ValueError(\"invalid status\")"},{"line":56,"text":" changes = document.get(\"changes_made\")"}]},{"match_line":55,"match_text":" raise ValueError(\"invalid status\")","window":[{"line":53,"text":" status = document.get(\"status\")"},{"line":54,"text":" if status not in {\"OK\", \"BLOCKED\", \"FAIL\"}:"},{"line":55,"text":" raise ValueError(\"invalid status\")"},{"line":56,"text":" changes = document.get(\"changes_made\")"},{"line":57,"text":" rollback_started = document.get(\"rollback_started\")"}]},{"match_line":56,"match_text":" changes = document.get(\"changes_made\")","window":[{"line":54,"text":" if status not in {\"OK\", \"BLOCKED\", \"FAIL\"}:"},{"line":55,"text":" raise ValueError(\"invalid status\")"},{"line":56,"text":" changes = document.get(\"changes_made\")"},{"line":57,"text":" rollback_started = document.get(\"rollback_started\")"},{"line":58,"text":" rollback_restored = document.get(\"rollback_restored\")"}]},{"match_line":57,"match_text":" rollback_started = document.get(\"rollback_started\")","window":[{"line":55,"text":" raise ValueError(\"invalid status\")"},{"line":56,"text":" changes = document.get(\"changes_made\")"},{"line":57,"text":" rollback_started = document.get(\"rollback_started\")"},{"line":58,"text":" rollback_restored = document.get(\"rollback_restored\")"},{"line":59,"text":" if not isinstance(changes, bool):"}]},{"match_line":58,"match_text":" rollback_restored = document.get(\"rollback_restored\")","window":[{"line":56,"text":" changes = document.get(\"changes_made\")"},{"line":57,"text":" rollback_started = document.get(\"rollback_started\")"},{"line":58,"text":" rollback_restored = document.get(\"rollback_restored\")"},{"line":59,"text":" if not isinstance(changes, bool):"},{"line":60,"text":" raise ValueError(\"changes_made must be boolean\")"}]},{"match_line":60,"match_text":" raise ValueError(\"changes_made must be boolean\")","window":[{"line":58,"text":" rollback_restored = document.get(\"rollback_restored\")"},{"line":59,"text":" if not isinstance(changes, bool):"},{"line":60,"text":" raise ValueError(\"changes_made must be boolean\")"},{"line":61,"text":" if not isinstance(rollback_started, bool):"},{"line":62,"text":" raise ValueError(\"rollback_started must be boolean\")"}]},{"match_line":61,"match_text":" if not isinstance(rollback_started, bool):","window":[{"line":59,"text":" if not isinstance(changes, bool):"},{"line":60,"text":" raise ValueError(\"changes_made must be boolean\")"},{"line":61,"text":" if not isinstance(rollback_started, bool):"},{"line":62,"text":" raise ValueError(\"rollback_started must be boolean\")"},{"line":63,"text":" if rollback_restored is not None and not isinstance("}]},{"match_line":62,"match_text":" raise ValueError(\"rollback_started must be boolean\")","window":[{"line":60,"text":" raise ValueError(\"changes_made must be boolean\")"},{"line":61,"text":" if not isinstance(rollback_started, bool):"},{"line":62,"text":" raise ValueError(\"rollback_started must be boolean\")"},{"line":63,"text":" if rollback_restored is not None and not isinstance("},{"line":64,"text":" rollback_restored,"}]},{"match_line":63,"match_text":" if rollback_restored is not None and not isinstance(","window":[{"line":61,"text":" if not isinstance(rollback_started, bool):"},{"line":62,"text":" raise ValueError(\"rollback_started must be boolean\")"},{"line":63,"text":" if rollback_restored is not None and not isinstance("},{"line":64,"text":" rollback_restored,"},{"line":65,"text":" bool,"}]},{"match_line":64,"match_text":" rollback_restored,","window":[{"line":62,"text":" raise ValueError(\"rollback_started must be boolean\")"},{"line":63,"text":" if rollback_restored is not None and not isinstance("},{"line":64,"text":" rollback_restored,"},{"line":65,"text":" bool,"},{"line":66,"text":" ):"}]},{"match_line":68,"match_text":" \"rollback_restored must be boolean or null\"","window":[{"line":66,"text":" ):"},{"line":67,"text":" raise ValueError("},{"line":68,"text":" \"rollback_restored must be boolean or null\""},{"line":69,"text":" )"},{"line":70,"text":" if rollback_restored is True and rollback_started is not True:"}]},{"match_line":70,"match_text":" if rollback_restored is True and rollback_started is not True:","window":[{"line":68,"text":" \"rollback_restored must be boolean or null\""},{"line":69,"text":" )"},{"line":70,"text":" if rollback_restored is True and rollback_started is not True:"},{"line":71,"text":" raise ValueError("},{"line":72,"text":" \"rollback_restored without rollback_started\""}]},{"match_line":72,"match_text":" \"rollback_restored without rollback_started\"","window":[{"line":70,"text":" if rollback_restored is True and rollback_started is not True:"},{"line":71,"text":" raise ValueError("},{"line":72,"text":" \"rollback_restored without rollback_started\""},{"line":73,"text":" )"},{"line":74,"text":" if rollback_started is True and changes is not True:"}]},{"match_line":74,"match_text":" if rollback_started is True and changes is not True:","window":[{"line":72,"text":" \"rollback_restored without rollback_started\""},{"line":73,"text":" )"},{"line":74,"text":" if rollback_started is True and changes is not True:"},{"line":75,"text":" raise ValueError("},{"line":76,"text":" \"rollback_started without changes\""}]},{"match_line":76,"match_text":" \"rollback_started without changes\"","window":[{"line":74,"text":" if rollback_started is True and changes is not True:"},{"line":75,"text":" raise ValueError("},{"line":76,"text":" \"rollback_started without changes\""},{"line":77,"text":" )"},{"line":78,"text":" if status == \"BLOCKED\" and ("}]},{"match_line":78,"match_text":" if status == \"BLOCKED\" and (","window":[{"line":76,"text":" \"rollback_started without changes\""},{"line":77,"text":" )"},{"line":78,"text":" if status == \"BLOCKED\" and ("},{"line":79,"text":" changes"},{"line":80,"text":" or rollback_started"}]},{"match_line":80,"match_text":" or rollback_started","window":[{"line":78,"text":" if status == \"BLOCKED\" and ("},{"line":79,"text":" changes"},{"line":80,"text":" or rollback_started"},{"line":81,"text":" or command_rc != 2"},{"line":82,"text":" ):"}]},{"match_line":86,"match_text":" if status == \"OK\" and command_rc != 0:","window":[{"line":84,"text":" \"BLOCKED contract inconsistent with rc/mutation\""},{"line":85,"text":" )"},{"line":86,"text":" if status == \"OK\" and command_rc != 0:"},{"line":87,"text":" raise ValueError(\"OK contract inconsistent with rc\")"},{"line":88,"text":" if status == \"FAIL\" and command_rc == 0:"}]},{"match_line":88,"match_text":" if status == \"FAIL\" and command_rc == 0:","window":[{"line":86,"text":" if status == \"OK\" and command_rc != 0:"},{"line":87,"text":" raise ValueError(\"OK contract inconsistent with rc\")"},{"line":88,"text":" if status == \"FAIL\" and command_rc == 0:"},{"line":89,"text":" raise ValueError(\"FAIL contract inconsistent with rc\")"},{"line":90,"text":""}]},{"match_line":93,"match_text":" elif not rollback_started:","window":[{"line":91,"text":" if not changes:"},{"line":92,"text":" outcome = \"NO_MUTATION\""},{"line":93,"text":" elif not rollback_started:"},{"line":94,"text":" outcome = \"MUTATED\""},{"line":95,"text":" elif rollback_restored is True:"}]},{"match_line":95,"match_text":" elif rollback_restored is True:","window":[{"line":93,"text":" elif not rollback_started:"},{"line":94,"text":" outcome = \"MUTATED\""},{"line":95,"text":" elif rollback_restored is True:"},{"line":96,"text":" outcome = \"ROLLED_BACK\""},{"line":97,"text":" elif rollback_restored is False:"}]},{"match_line":97,"match_text":" elif rollback_restored is False:","window":[{"line":95,"text":" elif rollback_restored is True:"},{"line":96,"text":" outcome = \"ROLLED_BACK\""},{"line":97,"text":" elif rollback_restored is False:"},{"line":98,"text":" outcome = \"ROLLBACK_FAILED\""},{"line":99,"text":" else:"}]},{"match_line":104,"match_text":" \"status\": status,","window":[{"line":102,"text":" result = {"},{"line":103,"text":" \"valid\": True,"},{"line":104,"text":" \"status\": status,"},{"line":105,"text":" \"changes_made\": str(changes).lower(),"},{"line":106,"text":" \"rollback_started\": str("}]},{"match_line":105,"match_text":" \"changes_made\": str(changes).lower(),","window":[{"line":103,"text":" \"valid\": True,"},{"line":104,"text":" \"status\": status,"},{"line":105,"text":" \"changes_made\": str(changes).lower(),"},{"line":106,"text":" \"rollback_started\": str("},{"line":107,"text":" rollback_started"}]},{"match_line":106,"match_text":" \"rollback_started\": str(","window":[{"line":104,"text":" \"status\": status,"},{"line":105,"text":" \"changes_made\": str(changes).lower(),"},{"line":106,"text":" \"rollback_started\": str("},{"line":107,"text":" rollback_started"},{"line":108,"text":" ).lower(),"}]},{"match_line":107,"match_text":" rollback_started","window":[{"line":105,"text":" \"changes_made\": str(changes).lower(),"},{"line":106,"text":" \"rollback_started\": str("},{"line":107,"text":" rollback_started"},{"line":108,"text":" ).lower(),"},{"line":109,"text":" \"rollback_restored\": ("}]},{"match_line":109,"match_text":" \"rollback_restored\": (","window":[{"line":107,"text":" rollback_started"},{"line":108,"text":" ).lower(),"},{"line":109,"text":" \"rollback_restored\": ("},{"line":110,"text":" \"null\""},{"line":111,"text":" if rollback_restored is None"}]},{"match_line":111,"match_text":" if rollback_restored is None","window":[{"line":109,"text":" \"rollback_restored\": ("},{"line":110,"text":" \"null\""},{"line":111,"text":" if rollback_restored is None"},{"line":112,"text":" else str(rollback_restored).lower()"},{"line":113,"text":" ),"}]},{"match_line":112,"match_text":" else str(rollback_restored).lower()","window":[{"line":110,"text":" \"null\""},{"line":111,"text":" if rollback_restored is None"},{"line":112,"text":" else str(rollback_restored).lower()"},{"line":113,"text":" ),"},{"line":114,"text":" \"mutation_outcome\": outcome,"}]},{"match_line":126,"match_text":" result[\"status\"],","window":[{"line":124,"text":"print(\"\\t\".join(["},{"line":125,"text":" str(result[\"valid\"]).lower(),"},{"line":126,"text":" result[\"status\"],"},{"line":127,"text":" result[\"changes_made\"],"},{"line":128,"text":" result[\"rollback_started\"],"}]},{"match_line":127,"match_text":" result[\"changes_made\"],","window":[{"line":125,"text":" str(result[\"valid\"]).lower(),"},{"line":126,"text":" result[\"status\"],"},{"line":127,"text":" result[\"changes_made\"],"},{"line":128,"text":" result[\"rollback_started\"],"},{"line":129,"text":" result[\"rollback_restored\"],"}]},{"match_line":128,"match_text":" result[\"rollback_started\"],","window":[{"line":126,"text":" result[\"status\"],"},{"line":127,"text":" result[\"changes_made\"],"},{"line":128,"text":" result[\"rollback_started\"],"},{"line":129,"text":" result[\"rollback_restored\"],"},{"line":130,"text":" result[\"mutation_outcome\"],"}]},{"match_line":129,"match_text":" result[\"rollback_restored\"],","window":[{"line":127,"text":" result[\"changes_made\"],"},{"line":128,"text":" result[\"rollback_started\"],"},{"line":129,"text":" result[\"rollback_restored\"],"},{"line":130,"text":" result[\"mutation_outcome\"],"},{"line":131,"text":" result[\"error\"],"}]},{"match_line":142,"match_text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T1\",\"status\":\"BLOCKED\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}' \\","window":[{"line":140,"text":""},{"line":141,"text":" printf '%s\\n' \\"},{"line":142,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T1\",\"status\":\"BLOCKED\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":143,"text":" >\"$tmp\""},{"line":144,"text":" [ \"$(read_mutation_contract \"$tmp\" T1 change 2)\" = \\"}]},{"match_line":148,"match_text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T2\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","window":[{"line":146,"text":""},{"line":147,"text":" printf '%s\\n' \\"},{"line":148,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T2\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":149,"text":" >\"$tmp\""},{"line":150,"text":" [ \"$(read_mutation_contract \"$tmp\" T2 change 0)\" = \\"}]},{"match_line":154,"match_text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T3\",\"status\":\"FAIL\",\"changes_made\":true,\"rollback_started\":true,\"rollback_restored\":true}' \\","window":[{"line":152,"text":""},{"line":153,"text":" printf '%s\\n' \\"},{"line":154,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T3\",\"status\":\"FAIL\",\"changes_made\":true,\"rollback_started\":true,\"rollback_restored\":true}' \\"},{"line":155,"text":" >\"$tmp\""},{"line":156,"text":" [ \"$(read_mutation_contract \"$tmp\" T3 change 1)\" = \\"}]},{"match_line":168,"match_text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"OTHER\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","window":[{"line":166,"text":""},{"line":167,"text":" printf '%s\\n' \\"},{"line":168,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"OTHER\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":169,"text":" >\"$tmp\""},{"line":170,"text":" [ \"$(read_mutation_contract \"$tmp\" T6 change 0)\" = \\"}]},{"match_line":174,"match_text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","window":[{"line":172,"text":""},{"line":173,"text":" printf '%s\\n' \\"},{"line":174,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":175,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":176,"text":" >\"$tmp\""}]},{"match_line":175,"match_text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","window":[{"line":173,"text":" printf '%s\\n' \\"},{"line":174,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":175,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"},{"line":176,"text":" >\"$tmp\""},{"line":177,"text":" [ \"$(read_mutation_contract \"$tmp\" T7 change 0)\" = \\"}]},{"match_line":191,"match_text":" homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]","window":[{"line":189,"text":" cat >&2 <<'USAGE'"},{"line":190,"text":"Usage:"},{"line":191,"text":" homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]"},{"line":192,"text":""},{"line":193,"text":"MODE:"}]},{"match_line":208,"match_text":"COMMAND_ID=\"$1\"","window":[{"line":206,"text":"[ \"$#\" -ge 5 ] || usage"},{"line":207,"text":""},{"line":208,"text":"COMMAND_ID=\"$1\""},{"line":209,"text":"MODE=\"$2\""},{"line":210,"text":"COMPONENT=\"$3\""}]},{"match_line":217,"match_text":"case \"$COMMAND_ID\" in","window":[{"line":215,"text":"[ \"$#\" -ge 1 ] || usage"},{"line":216,"text":""},{"line":217,"text":"case \"$COMMAND_ID\" in"},{"line":218,"text":" ''|*[!A-Za-z0-9._-]*)"},{"line":219,"text":" echo 'RESULT=FAIL'"}]},{"match_line":220,"match_text":" echo 'REASON=INVALID_COMMAND_ID'","window":[{"line":218,"text":" ''|*[!A-Za-z0-9._-]*)"},{"line":219,"text":" echo 'RESULT=FAIL'"},{"line":220,"text":" echo 'REASON=INVALID_COMMAND_ID'"},{"line":221,"text":" exit 65"},{"line":222,"text":" ;;"}]},{"match_line":297,"match_text":"RAW_FILE=\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\"","window":[{"line":295,"text":"HOST_SHORT=\"$(hostname -s 2>/dev/null || hostname)\""},{"line":296,"text":""},{"line":297,"text":"RAW_FILE=\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\""},{"line":298,"text":"SANITIZED_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\""},{"line":299,"text":"JSON_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\""}]},{"match_line":298,"match_text":"SANITIZED_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\"","window":[{"line":296,"text":""},{"line":297,"text":"RAW_FILE=\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\""},{"line":298,"text":"SANITIZED_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\""},{"line":299,"text":"JSON_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\""},{"line":300,"text":"TXT_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\""}]},{"match_line":299,"match_text":"JSON_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\"","window":[{"line":297,"text":"RAW_FILE=\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\""},{"line":298,"text":"SANITIZED_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\""},{"line":299,"text":"JSON_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\""},{"line":300,"text":"TXT_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\""},{"line":301,"text":""}]},{"match_line":300,"match_text":"TXT_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\"","window":[{"line":298,"text":"SANITIZED_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\""},{"line":299,"text":"JSON_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\""},{"line":300,"text":"TXT_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\""},{"line":301,"text":""},{"line":302,"text":"REFERENCE_SHA256=\"$(sha256sum \"$REFERENCE\" | awk '{print $1}')\""}]},{"match_line":331,"match_text":"RESULT_CONTRACT_VALID=true","window":[{"line":329,"text":"BLOCK_REASON=''"},{"line":330,"text":"CHANGE_DECLARED=false"},{"line":331,"text":"RESULT_CONTRACT_VALID=true"},{"line":332,"text":"CONTRACT_STATUS='NOT_APPLICABLE'"},{"line":333,"text":"CHANGES_MADE=false"}]},{"match_line":332,"match_text":"CONTRACT_STATUS='NOT_APPLICABLE'","window":[{"line":330,"text":"CHANGE_DECLARED=false"},{"line":331,"text":"RESULT_CONTRACT_VALID=true"},{"line":332,"text":"CONTRACT_STATUS='NOT_APPLICABLE'"},{"line":333,"text":"CHANGES_MADE=false"},{"line":334,"text":"ROLLBACK_STARTED=false"}]},{"match_line":333,"match_text":"CHANGES_MADE=false","window":[{"line":331,"text":"RESULT_CONTRACT_VALID=true"},{"line":332,"text":"CONTRACT_STATUS='NOT_APPLICABLE'"},{"line":333,"text":"CHANGES_MADE=false"},{"line":334,"text":"ROLLBACK_STARTED=false"},{"line":335,"text":"ROLLBACK_RESTORED=null"}]},{"match_line":334,"match_text":"ROLLBACK_STARTED=false","window":[{"line":332,"text":"CONTRACT_STATUS='NOT_APPLICABLE'"},{"line":333,"text":"CHANGES_MADE=false"},{"line":334,"text":"ROLLBACK_STARTED=false"},{"line":335,"text":"ROLLBACK_RESTORED=null"},{"line":336,"text":"MUTATION_OUTCOME='NO_MUTATION'"}]},{"match_line":335,"match_text":"ROLLBACK_RESTORED=null","window":[{"line":333,"text":"CHANGES_MADE=false"},{"line":334,"text":"ROLLBACK_STARTED=false"},{"line":335,"text":"ROLLBACK_RESTORED=null"},{"line":336,"text":"MUTATION_OUTCOME='NO_MUTATION'"},{"line":337,"text":"RESULT_CONTRACT_ERROR='NONE'"}]},{"match_line":337,"match_text":"RESULT_CONTRACT_ERROR='NONE'","window":[{"line":335,"text":"ROLLBACK_RESTORED=null"},{"line":336,"text":"MUTATION_OUTCOME='NO_MUTATION'"},{"line":337,"text":"RESULT_CONTRACT_ERROR='NONE'"},{"line":338,"text":"COMMAND_RC=''"},{"line":339,"text":""}]},{"match_line":342,"match_text":" RESULT_CONTRACT_VALID=false","window":[{"line":340,"text":"if [ \"$MODE\" = change ]; then"},{"line":341,"text":" CHANGE_DECLARED=true"},{"line":342,"text":" RESULT_CONTRACT_VALID=false"},{"line":343,"text":" CONTRACT_STATUS='UNKNOWN'"},{"line":344,"text":" CHANGES_MADE=unknown"}]},{"match_line":343,"match_text":" CONTRACT_STATUS='UNKNOWN'","window":[{"line":341,"text":" CHANGE_DECLARED=true"},{"line":342,"text":" RESULT_CONTRACT_VALID=false"},{"line":343,"text":" CONTRACT_STATUS='UNKNOWN'"},{"line":344,"text":" CHANGES_MADE=unknown"},{"line":345,"text":" ROLLBACK_STARTED=unknown"}]},{"match_line":344,"match_text":" CHANGES_MADE=unknown","window":[{"line":342,"text":" RESULT_CONTRACT_VALID=false"},{"line":343,"text":" CONTRACT_STATUS='UNKNOWN'"},{"line":344,"text":" CHANGES_MADE=unknown"},{"line":345,"text":" ROLLBACK_STARTED=unknown"},{"line":346,"text":" ROLLBACK_RESTORED=null"}]},{"match_line":345,"match_text":" ROLLBACK_STARTED=unknown","window":[{"line":343,"text":" CONTRACT_STATUS='UNKNOWN'"},{"line":344,"text":" CHANGES_MADE=unknown"},{"line":345,"text":" ROLLBACK_STARTED=unknown"},{"line":346,"text":" ROLLBACK_RESTORED=null"},{"line":347,"text":" MUTATION_OUTCOME='UNKNOWN'"}]},{"match_line":346,"match_text":" ROLLBACK_RESTORED=null","window":[{"line":344,"text":" CHANGES_MADE=unknown"},{"line":345,"text":" ROLLBACK_STARTED=unknown"},{"line":346,"text":" ROLLBACK_RESTORED=null"},{"line":347,"text":" MUTATION_OUTCOME='UNKNOWN'"},{"line":348,"text":" RESULT_CONTRACT_ERROR='MISSING_CONTRACT'"}]},{"match_line":348,"match_text":" RESULT_CONTRACT_ERROR='MISSING_CONTRACT'","window":[{"line":346,"text":" ROLLBACK_RESTORED=null"},{"line":347,"text":" MUTATION_OUTCOME='UNKNOWN'"},{"line":348,"text":" RESULT_CONTRACT_ERROR='MISSING_CONTRACT'"},{"line":349,"text":"fi"},{"line":350,"text":""}]},{"match_line":358,"match_text":" STATUS='BLOCKED'","window":[{"line":356,"text":" BLOCK_REASON='EXACT_FAILED_COMMAND_REPEAT'"},{"line":357,"text":" RC=73"},{"line":358,"text":" STATUS='BLOCKED'"},{"line":359,"text":" RESULT_CONTRACT_VALID=true"},{"line":360,"text":" CONTRACT_STATUS='BLOCKED'"}]},{"match_line":359,"match_text":" RESULT_CONTRACT_VALID=true","window":[{"line":357,"text":" RC=73"},{"line":358,"text":" STATUS='BLOCKED'"},{"line":359,"text":" RESULT_CONTRACT_VALID=true"},{"line":360,"text":" CONTRACT_STATUS='BLOCKED'"},{"line":361,"text":" CHANGES_MADE=false"}]},{"match_line":360,"match_text":" CONTRACT_STATUS='BLOCKED'","window":[{"line":358,"text":" STATUS='BLOCKED'"},{"line":359,"text":" RESULT_CONTRACT_VALID=true"},{"line":360,"text":" CONTRACT_STATUS='BLOCKED'"},{"line":361,"text":" CHANGES_MADE=false"},{"line":362,"text":" ROLLBACK_STARTED=false"}]},{"match_line":361,"match_text":" CHANGES_MADE=false","window":[{"line":359,"text":" RESULT_CONTRACT_VALID=true"},{"line":360,"text":" CONTRACT_STATUS='BLOCKED'"},{"line":361,"text":" CHANGES_MADE=false"},{"line":362,"text":" ROLLBACK_STARTED=false"},{"line":363,"text":" ROLLBACK_RESTORED=null"}]},{"match_line":362,"match_text":" ROLLBACK_STARTED=false","window":[{"line":360,"text":" CONTRACT_STATUS='BLOCKED'"},{"line":361,"text":" CHANGES_MADE=false"},{"line":362,"text":" ROLLBACK_STARTED=false"},{"line":363,"text":" ROLLBACK_RESTORED=null"},{"line":364,"text":" MUTATION_OUTCOME='NO_MUTATION'"}]},{"match_line":363,"match_text":" ROLLBACK_RESTORED=null","window":[{"line":361,"text":" CHANGES_MADE=false"},{"line":362,"text":" ROLLBACK_STARTED=false"},{"line":363,"text":" ROLLBACK_RESTORED=null"},{"line":364,"text":" MUTATION_OUTCOME='NO_MUTATION'"},{"line":365,"text":" RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'"}]},{"match_line":365,"match_text":" RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'","window":[{"line":363,"text":" ROLLBACK_RESTORED=null"},{"line":364,"text":" MUTATION_OUTCOME='NO_MUTATION'"},{"line":365,"text":" RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'"},{"line":366,"text":""},{"line":367,"text":" {"}]},{"match_line":389,"match_text":" --preserve-status \\","window":[{"line":387,"text":" timeout \\"},{"line":388,"text":" --foreground \\"},{"line":389,"text":" --preserve-status \\"},{"line":390,"text":" \"$HOMELAB_TIMEOUT\" \\"},{"line":391,"text":" \"$@\" >\"$RAW_FILE\" 2>&1"}]}] -RUNNERCONTRACT5_WINDOW_COUNT=80 -RUNNERCONTRACT5_HOLD_REASONS=[] -RUNNERCONTRACT5_DECISION=RUNNER_CONTRACT_SOURCE_EVIDENCE_PUBLISHED_FOR_MANUAL_INTERPRETATION -RUNNERCONTRACT5_MUTATION_SCOPE=NO_GIT_NO_APPLICATION_NO_DB_NO_PRODUCTION_MUTATION +RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d +RUNNER_CONTRACT_MARKERS_PRESENT={"HOMELAB_RESULT_CONTRACT":true,"changes_made":true,"command_id":true,"rollback_restored":true,"rollback_started":true} +HISTORY_NEWFI_260907_PORTAL200_APPLY3_SHA256=f3ea3fcebd7b182e64db6e963a34f1b90baca0d08477e25e27bf88c48b33611c +HISTORY_NEWFI_260907_PORTAL200_APPLY3_STATUS=FAIL +HISTORY_NEWFI_260907_PORTAL200_APPLY3_MODE=change +HISTORY_NEWFI_260907_PORTAL200_APPLY3_CHANGES_MADE=unknown +HISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_SHA256=00c4dc5e100be0cb26a80262a8af96555457b5dc4fa924c6a9458089cd01474e +HISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_STATUS=OK +HISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_MODE=read-only +HISTORY_NEWFI_260907_PORTAL200_CONTRACTAST1_CHANGES_MADE=false +HISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_SHA256=805954f73608dbd343da33d387c59a6ad258a7f6a51965db4e78c3fd0f588fd4 +HISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_STATUS=OK +HISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_MODE=read-only +HISTORY_NEWFI_260907_PORTAL200_IMPORTDISC2_CHANGES_MADE=false +HISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_SHA256=30370cad3d4d7e73c6612a5df702abe1fac6ae559bf142b5e489a19a1258cfb7 +HISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_STATUS=OK +HISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_MODE=read-only +HISTORY_NEWFI_260907_PORTAL200_REBUILDHELP1_CHANGES_MADE=false +HISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_SHA256=80ce8e1f27c78341e596ae39a7208959347572ffb6b3b2e7496c0c2aea897928 +HISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_STATUS=FAIL +HISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_MODE=read-only +HISTORY_NEWFI_260907_B_PORTAL200_RECOVERY1_CHANGES_MADE=false +HISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_SHA256=0b09da950cf23908353b6af93784e61e2cde7c365d41a94070d28295494fd21f +HISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_STATUS=OK +HISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_MODE=read-only +HISTORY_NEWFI_260907_A_PORTAL200_APPLY4PREP1_CHANGES_MADE=false +TARGET_BRANCH_WORKTREES=[{"branch":"implementation/newfi-closed-mvp-20260906","dirty_count":0,"head":"06bab5acd124e768f70305b3d7eca2f595871890","remote_head":"06bab5acd124e768f70305b3d7eca2f595871890","repo":"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906"}] +GIT_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906 +GIT_HEAD=06bab5acd124e768f70305b3d7eca2f595871890 +GIT_REMOTE_HEAD=06bab5acd124e768f70305b3d7eca2f595871890 +GIT_DIRTY_COUNT=0 +NEWFI_CLUSTER_VMS=[{"name":"newfi-prod","node":"pve01","status":"running","type":"qemu","vmid":210},{"name":"newfi-staging","node":"pve03","status":"running","type":"qemu","vmid":211}] +PRODUCTION_VM={"name":"newfi-prod","node":"pve01","status":"running","type":"qemu","vmid":210} +STAGING_VM={"name":"newfi-staging","node":"pve03","status":"running","type":"qemu","vmid":211} +PRODUCTION_LAYOUT_DISCOVERY={"base_candidates":[[20,"/var/www/forums/newfi/public"]],"doc_candidates":["/var/www/forums/newfi/public"],"guest_hostname":"newfi-prod","guest_smoke_err":"","guest_smoke_rc":0,"layout_scan_err":"","layout_scan_rc":0,"sections":{"ADDONS":["/var/www/forums/newfi/public/src/addons/Newfi/Dogs/addon.json","/var/www/forums/newfi/public/src/addons/Newfi/Events/addon.json","/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json"],"CMD":["/var/www/forums/newfi/public/cmd.php"],"INDEX":["/var/www/forums/newfi/public/index.php","/var/www/forums/newfi/public/install/index.php"],"XF":["/var/www/forums/newfi/public/src/XF.php"]}} +PRODUCTION_XF_BASE_ROOT=/var/www/forums/newfi/public +PRODUCTION_DOCROOT=/var/www/forums/newfi/public +PRODUCTION_XF_VERSION=XenForo 2.3.12 +PRODUCTION_SERVICES=nginx=active\nmariadb=active\nmysql=active\nphp8.3-fpm.service=active +PRODUCTION_ADDON_LIST= -------------- -------------------------- --------------- -------- \n Add-on ID Title Version Active \n -------------- -------------------------- --------------- -------- \n Newfi/Dogs Newfi Dogs 1.0.0 Alpha 1 Yes \n Newfi/Events Newfi Events 1.0.0 Alpha 1 Yes \n Newfi/Portal Newfi Portal 1.0.0 Alpha 1 Yes \n XFMG XenForo Media Gallery 2.3.11 Yes \n XFRM XenForo Resource Manager 2.3.11 Yes \n -------------- -------------------------- --------------- -------- \n\n Total: 5 add-ons (5 active, 0 inactive) +PRODUCTION_PORTAL_ADDON_CANDIDATES=[{"id":"Newfi/Portal","path":"/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json","title":"Newfi Portal","version_id":1000010,"version_string":"1.0.0 Alpha 1"}] +STAGING_LAYOUT_DISCOVERY={"guest_hostname":"newfi-staging","guest_smoke_err":"","guest_smoke_rc":0,"layout_scan_err":"","layout_scan_rc":0,"sections":{"ADDONS":[],"CMD":[],"INDEX":[],"XF":[]}} +PRODUCTION_DB_SCHEMA_CANDIDATES=["xf_newfi"] +PRODUCTION_BOARD_ACTIVE=1 +PRODUCTION_ERROR_MAX=0 +PRODUCTION_ADDON_ROWS=Newfi/Dogs Newfi Dogs 1000010 1.0.0 Alpha 1 1\nNewfi/Events Newfi Events 1000010 1.0.0 Alpha 1 1\nNewfi/Portal Newfi Portal 1000010 1.0.0 Alpha 1 1\nXF XenForo 2031270 2.3.12 1\nXFMG XenForo Media Gallery 902031170 2.3.11 1\nXFRM XenForo Resource Manager 2031170 2.3.11 1 +PRODUCTION_PUBLIC_HTTP={"http":"200","rc":0} +HOLD_REASONS=["STAGING_XF_BASE_ROOT_UNPROVEN"] +FINAL_DECISION=HOLD_PORTAL200_APPLY4_PREP_STAGING_XF_BASE_ROOT_UNPROVEN +RECOVERY2_END=true OUTPUT_END CHAT_OUTPUT_END