From 8879b4ffac019038305fb91d03e18d01ac78fa09 Mon Sep 17 00:00:00 2001 From: homelab-runtime-publisher Date: Sun, 20 Sep 2026 17:22:35 +0000 Subject: [PATCH] runtime: publish SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1 --- ...9-RUNNER-DUPLICATE-RCA-READONLY-790R1.json | 38 +++++++++++ ...89-RUNNER-DUPLICATE-RCA-READONLY-790R1.txt | 46 +++++++++++++ runtime/latest.json | 22 +++--- runtime/latest.txt | 67 ++++++------------- 4 files changed, 116 insertions(+), 57 deletions(-) create mode 100644 runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1.json create mode 100644 runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1.txt diff --git a/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1.json b/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1.json new file mode 100644 index 00000000..8b5b08c0 --- /dev/null +++ b/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1", + "status": "FAIL", + "rc": 3, + "host": "pve01", + "mode": "read-only", + "component": "pvepro-homepage-portal-789-runner-duplicate-rca-readonly", + "started_at_utc": "2026-09-20T17:20:56Z", + "finished_at_utc": "2026-09-20T17:22:34Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "a38301defa26ee67a8bb0dc8227f645b6dcaccada08b26232bc8216c628fd1ef", + "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": 3, + "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": "7038052a6bbf990f44df906709727240385ac1cc38588e070b544977c2209965", + "sanitized_output_sha256": "0b8d0544ef9d63aa9d2130266a604f965e250bebcbbc626ad09fca81ecdcbb8b", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1\nMODE=read-only\nCOMPONENT=pvepro-homepage-portal-789-runner-duplicate-rca-readonly\nWINDOW_MODE=VISIBLE_SYNCHRONOUS_WAIT\nPRODUCTION_HOST={\"all_link_down\":false,\"config_sha256\":\"ebd2b7d44ab58a222b4fd5a7dcd9358d3082e593bd70fb07c2331c70f22e82ab\",\"name\":\"pvepro-prod\",\"snapshots\":[],\"status\":\"running\"}\nSTAGING_HOST={\"all_link_down\":true,\"config_sha256\":\"27a4e57f09dfd93c374ff9597651cade264a9b10f13302dbf2b8345a9d40dd76\",\"name\":\"pvepro-staging-v1\",\"snapshots\":[\"w2-pre-portal-cutover-787r1\"],\"status\":\"stopped\"}\nRUNNER_SOURCE={\"absolute_paths\":[\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"[SENSITIVE_PATH] bash\"},{\"line\":2,\"text\":\"set -Eeuo pipefail\"},{\"line\":3,\"text\":\"umask 077\"},{\"line\":4,\"text\":\"\"},{\"line\":5,\"text\":\"read_mutation_contract() {\"},{\"line\":6,\"text\":\" python3 - \\\"$1\\\" \\\"$2\\\" \\\"$3\\\" \\\"$4\\\" <<'PY_CONTRACT'\"},{\"line\":7,\"text\":\"import json\"},{\"line\":8,\"text\":\"import sys\"},{\"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\":\"\"},{\"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\\\",\"},{\"line\":19,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":20,\"text\":\" \\\"mutation_outcome\\\": \\\"NO_MUTATION\\\",\"},{\"line\":21,\"text\":\" \\\"error\\\": \\\"NONE\\\",\"},{\"line\":22,\"text\":\"}\"},{\"line\":23,\"text\":\"\"},{\"line\":24,\"text\":\"if mode == \\\"change\\\":\"},{\"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\\\",\"},{\"line\":30,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":31,\"text\":\" \\\"mutation_outcome\\\": \\\"UNKNOWN\\\",\"},{\"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\\\",\"},{\"line\":37,\"text\":\" errors=\\\"replace\\\",\"},{\"line\":38,\"text\":\" ).splitlines()\"},{\"line\":39,\"text\":\" payloads = [\"}],\"match\":\"raw_path, command_id, mode, command_rc = sys.argv[1:]\",\"match_line\":11},{\"context\":[{\"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\\\",\"},{\"line\":22,\"text\":\"}\"},{\"line\":23,\"text\":\"\"},{\"line\":24,\"text\":\"if mode == \\\"change\\\":\"},{\"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\\\",\"},{\"line\":30,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":31,\"text\":\" \\\"mutation_outcome\\\": \\\"UNKNOWN\\\",\"},{\"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\\\",\"},{\"line\":37,\"text\":\" errors=\\\"replace\\\",\"},{\"line\":38,\"text\":\" ).splitlines()\"},{\"line\":39,\"text\":\" payloads = [\"},{\"line\":40,\"text\":\" line[len(marker):]\"},{\"line\":41,\"text\":\" for line in lines\"},{\"line\":42,\"text\":\" if line.startswith(marker)\"},{\"line\":43,\"text\":\" ]\"},{\"line\":44,\"text\":\" if len(payloads) == 1:\"},{\"line\":45,\"text\":\" try:\"},{\"line\":46,\"text\":\" document = json.loads(payloads[0])\"},{\"line\":47,\"text\":\" if not isinstance(document, dict):\"},{\"line\":48,\"text\":\" raise ValueError(\\\"contract root is not object\\\")\"},{\"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\\\")\"},{\"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\\\")\"},{\"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\":\" lines = Path(raw_path).read_bytes().decode(\",\"match_line\":35},{\"context\":[{\"line\":80,\"text\":\" or rollback_started\"},{\"line\":81,\"text\":\" or command_rc != 2\"},{\"line\":82,\"text\":\" ):\"},{\"line\":83,\"text\":\" raise ValueError(\"},{\"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:\"},{\"line\":89,\"text\":\" raise ValueError(\\\"FAIL contract inconsistent with rc\\\")\"},{\"line\":90,\"text\":\"\"},{\"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:\"},{\"line\":96,\"text\":\" outcome = \\\"ROLLED_BACK\\\"\"},{\"line\":97,\"text\":\" elif rollback_restored is False:\"},{\"line\":98,\"text\":\" outcome = \\\"ROLLBACK_FAILED\\\"\"},{\"line\":99,\"text\":\" else:\"},{\"line\":100,\"text\":\" outcome = \\\"ROLLBACK_UNKNOWN\\\"\"},{\"line\":101,\"text\":\"\"},{\"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(\"},{\"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\"},{\"line\":112,\"text\":\" else str(rollback_restored).lower()\"},{\"line\":113,\"text\":\" ),\"},{\"line\":114,\"text\":\" \\\"mutation_outcome\\\": outcome,\"},{\"line\":115,\"text\":\" \\\"error\\\": \\\"NONE\\\",\"},{\"line\":116,\"text\":\" }\"},{\"line\":117,\"text\":\" except Exception as exc:\"},{\"line\":118,\"text\":\" result[\\\"error\\\"] = (\"},{\"line\":119,\"text\":\" \\\"INVALID_CONTRACT:\\\" + type(exc).__name__\"},{\"line\":120,\"text\":\" )\"},{\"line\":121,\"text\":\" elif len(payloads) > 1:\"},{\"line\":122,\"text\":\" result[\\\"error\\\"] = \\\"MULTIPLE_CONTRACTS\\\"\"},{\"line\":123,\"text\":\"\"},{\"line\":124,\"text\":\"print(\\\"\\\\t\\\".join([\"},{\"line\":125,\"text\":\" str(result[\\\"valid\\\"]).lower(),\"},{\"line\":126,\"text\":\" result[\\\"status\\\"],\"}],\"match\":\" outcome = \\\"ROLLBACK_FAILED\\\"\",\"match_line\":98},{\"context\":[{\"line\":182,\"text\":\"\"},{\"line\":183,\"text\":\"if [ \\\"${1:-}\\\" = '--self-test' ]; then\"},{\"line\":184,\"text\":\" runner_self_test\"},{\"line\":185,\"text\":\" exit 0\"},{\"line\":186,\"text\":\"fi\"},{\"line\":187,\"text\":\"\"},{\"line\":188,\"text\":\"usage() {\"},{\"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:\"},{\"line\":194,\"text\":\" read-only\"},{\"line\":195,\"text\":\" verify\"},{\"line\":196,\"text\":\" change\"},{\"line\":197,\"text\":\" transport-test\"},{\"line\":198,\"text\":\"\"},{\"line\":199,\"text\":\"Environment:\"},{\"line\":200,\"text\":\" HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command.\"},{\"line\":201,\"text\":\" HOMELAB_TIMEOUT=SECONDS Optional command timeout.\"},{\"line\":202,\"text\":\"USAGE\"},{\"line\":203,\"text\":\" exit 64\"},{\"line\":204,\"text\":\"}\"},{\"line\":205,\"text\":\"\"},{\"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\\\"\"},{\"line\":211,\"text\":\"shift 3\"},{\"line\":212,\"text\":\"\"},{\"line\":213,\"text\":\"[ \\\"${1:-}\\\" = '--' ] || usage\"},{\"line\":214,\"text\":\"shift\"},{\"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'\"},{\"line\":220,\"text\":\" echo 'REASON=INVALID_COMMAND_ID'\"},{\"line\":221,\"text\":\" exit 65\"},{\"line\":222,\"text\":\" ;;\"},{\"line\":223,\"text\":\"esac\"},{\"line\":224,\"text\":\"\"},{\"line\":225,\"text\":\"case \\\"$COMPONENT\\\" in\"},{\"line\":226,\"text\":\" ''|*[!A-Za-z0-9._-]*)\"},{\"line\":227,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":228,\"text\":\" echo 'REASON=INVALID_COMPONENT'\"}],\"match\":\" HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command.\",\"match_line\":200},{\"context\":[{\"line\":256,\"text\":\" }\"},{\"line\":257,\"text\":\"done\"},{\"line\":258,\"text\":\"\"},{\"line\":259,\"text\":\"REFERENCE=/etc/pve/31_HOMELAB_REFERENCE.md\"},{\"line\":260,\"text\":\"ERROR_REGISTER=/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\"},{\"line\":261,\"text\":\"\"},{\"line\":262,\"text\":\"[ -r \\\"$REFERENCE\\\" ] || {\"},{\"line\":263,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":264,\"text\":\" echo 'REASON=REFERENCE_NOT_READABLE'\"},{\"line\":265,\"text\":\" exit 69\"},{\"line\":266,\"text\":\"}\"},{\"line\":267,\"text\":\"\"},{\"line\":268,\"text\":\"[ -r \\\"$ERROR_REGISTER\\\" ] || {\"},{\"line\":269,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":270,\"text\":\" echo 'REASON=ERROR_REGISTER_NOT_READABLE'\"},{\"line\":271,\"text\":\" exit 70\"},{\"line\":272,\"text\":\"}\"},{\"line\":273,\"text\":\"\"},{\"line\":274,\"text\":\"STATE_DIR=/var/lib/homelab-chat-run\"},{\"line\":275,\"text\":\"RAW_DIR=\\\"$STATE_DIR/raw\\\"\"},{\"line\":276,\"text\":\"PUBLIC_DIR=\\\"$STATE_DIR/public\\\"\"},{\"line\":277,\"text\":\"LEDGER=\\\"$STATE_DIR/state/command-ledger.tsv\\\"\"},{\"line\":278,\"text\":\"LOCK=\\\"$STATE_DIR/state/runner.lock\\\"\"},{\"line\":279,\"text\":\"\"},{\"line\":280,\"text\":\"mkdir -p \\\"$RAW_DIR\\\" \\\"$PUBLIC_DIR\\\" \\\"$(dirname \\\"$LEDGER\\\")\\\"\"},{\"line\":281,\"text\":\"chmod 0700 \\\"$STATE_DIR\\\" \\\"$RAW_DIR\\\" \\\"$PUBLIC_DIR\\\" \\\"$(dirname \\\"$LEDGER\\\")\\\"\"},{\"line\":282,\"text\":\"touch \\\"$LEDGER\\\"\"},{\"line\":283,\"text\":\"chmod 0600 \\\"$LEDGER\\\"\"},{\"line\":284,\"text\":\"\"},{\"line\":285,\"text\":\"exec 9>\\\"$LOCK\\\"\"},{\"line\":286,\"text\":\"\"},{\"line\":287,\"text\":\"flock -w 60 9 || {\"},{\"line\":288,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":289,\"text\":\" echo 'REASON=RUNNER_LOCK_TIMEOUT'\"},{\"line\":290,\"text\":\" exit 71\"},{\"line\":291,\"text\":\"}\"},{\"line\":292,\"text\":\"\"},{\"line\":293,\"text\":\"STARTED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\"},{\"line\":294,\"text\":\"STAMP=\\\"$(date -u +%Y%m%dT%H%M%SZ)\\\"\"},{\"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\\\"\"},{\"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\":\"STATE_DIR=/var/lib/homelab-chat-run\",\"match_line\":274},{\"context\":[{\"line\":263,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":264,\"text\":\" echo 'REASON=REFERENCE_NOT_READABLE'\"},{\"line\":265,\"text\":\" exit 69\"},{\"line\":266,\"text\":\"}\"},{\"line\":267,\"text\":\"\"},{\"line\":268,\"text\":\"[ -r \\\"$ERROR_REGISTER\\\" ] || {\"},{\"line\":269,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":270,\"text\":\" echo 'REASON=ERROR_REGISTER_NOT_READABLE'\"},{\"line\":271,\"text\":\" exit 70\"},{\"line\":272,\"text\":\"}\"},{\"line\":273,\"text\":\"\"},{\"line\":274,\"text\":\"STATE_DIR=/var/lib/homelab-chat-run\"},{\"line\":275,\"text\":\"RAW_DIR=\\\"$STATE_DIR/raw\\\"\"},{\"line\":276,\"text\":\"PUBLIC_DIR=\\\"$STATE_DIR/public\\\"\"},{\"line\":277,\"text\":\"LEDGER=\\\"$STATE_DIR/state/command-ledger.tsv\\\"\"},{\"line\":278,\"text\":\"LOCK=\\\"$STATE_DIR/state/runner.lock\\\"\"},{\"line\":279,\"text\":\"\"},{\"line\":280,\"text\":\"mkdir -p \\\"$RAW_DIR\\\" \\\"$PUBLIC_DIR\\\" \\\"$(dirname \\\"$LEDGER\\\")\\\"\"},{\"line\":281,\"text\":\"chmod 0700 \\\"$STATE_DIR\\\" \\\"$RAW_DIR\\\" \\\"$PUBLIC_DIR\\\" \\\"$(dirname \\\"$LEDGER\\\")\\\"\"},{\"line\":282,\"text\":\"touch \\\"$LEDGER\\\"\"},{\"line\":283,\"text\":\"chmod 0600 \\\"$LEDGER\\\"\"},{\"line\":284,\"text\":\"\"},{\"line\":285,\"text\":\"exec 9>\\\"$LOCK\\\"\"},{\"line\":286,\"text\":\"\"},{\"line\":287,\"text\":\"flock -w 60 9 || {\"},{\"line\":288,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":289,\"text\":\" echo 'REASON=RUNNER_LOCK_TIMEOUT'\"},{\"line\":290,\"text\":\" exit 71\"},{\"line\":291,\"text\":\"}\"},{\"line\":292,\"text\":\"\"},{\"line\":293,\"text\":\"STARTED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\"},{\"line\":294,\"text\":\"STAMP=\\\"$(date -u +%Y%m%dT%H%M%SZ)\\\"\"},{\"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\\\"\"},{\"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}')\\\"\"},{\"line\":303,\"text\":\"ERROR_REGISTER_SHA256=\\\"$(sha256sum \\\"$ERROR_REGISTER\\\" | awk '{print $1}')\\\"\"},{\"line\":304,\"text\":\"\"},{\"line\":305,\"text\":\"COMMAND_SHA256=\\\"$(\"},{\"line\":306,\"text\":\" {\"},{\"line\":307,\"text\":\" printf '%s\\\\0' \\\"$MODE\\\"\"},{\"line\":308,\"text\":\" printf '%s\\\\0' \\\"$COMPONENT\\\"\"},{\"line\":309,\"text\":\" printf '%s\\\\0' \\\"$@\\\"\"}],\"match\":\"chmod 0700 \\\"$STATE_DIR\\\" \\\"$RAW_DIR\\\" \\\"$PUBLIC_DIR\\\" \\\"$(dirname \\\"$LEDGER\\\")\\\"\",\"match_line\":281},{\"context\":[{\"line\":287,\"text\":\"flock -w 60 9 || {\"},{\"line\":288,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":289,\"text\":\" echo 'REASON=RUNNER_LOCK_TIMEOUT'\"},{\"line\":290,\"text\":\" exit 71\"},{\"line\":291,\"text\":\"}\"},{\"line\":292,\"text\":\"\"},{\"line\":293,\"text\":\"STARTED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\"},{\"line\":294,\"text\":\"STAMP=\\\"$(date -u +%Y%m%dT%H%M%SZ)\\\"\"},{\"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\\\"\"},{\"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}')\\\"\"},{\"line\":303,\"text\":\"ERROR_REGISTER_SHA256=\\\"$(sha256sum \\\"$ERROR_REGISTER\\\" | awk '{print $1}')\\\"\"},{\"line\":304,\"text\":\"\"},{\"line\":305,\"text\":\"COMMAND_SHA256=\\\"$(\"},{\"line\":306,\"text\":\" {\"},{\"line\":307,\"text\":\" printf '%s\\\\0' \\\"$MODE\\\"\"},{\"line\":308,\"text\":\" printf '%s\\\\0' \\\"$COMPONENT\\\"\"},{\"line\":309,\"text\":\" printf '%s\\\\0' \\\"$@\\\"\"},{\"line\":310,\"text\":\" } |\"},{\"line\":311,\"text\":\" sha256sum |\"},{\"line\":312,\"text\":\" awk '{print $1}'\"},{\"line\":313,\"text\":\")\\\"\"},{\"line\":314,\"text\":\"\"},{\"line\":315,\"text\":\"PREVIOUS_FAILED_RC=\\\"$(\"},{\"line\":316,\"text\":\" awk -F '\\\\t' -v hash=\\\"$COMMAND_SHA256\\\" '\"},{\"line\":317,\"text\":\" $3 == hash && $4 != \\\"0\\\" {\"},{\"line\":318,\"text\":\" value=$4\"},{\"line\":319,\"text\":\" }\"},{\"line\":320,\"text\":\"\"},{\"line\":321,\"text\":\" END {\"},{\"line\":322,\"text\":\" print value\"},{\"line\":323,\"text\":\" }\"},{\"line\":324,\"text\":\" ' \\\"$LEDGER\\\"\"},{\"line\":325,\"text\":\")\\\"\"},{\"line\":326,\"text\":\"\"},{\"line\":327,\"text\":\"RUN_STARTED=true\"},{\"line\":328,\"text\":\"REPEAT_BLOCKED=false\"},{\"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\":\"COMMAND_SHA256=\\\"$(\",\"match_line\":305},{\"context\":[{\"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'\"},{\"line\":338,\"text\":\"COMMAND_RC=''\"},{\"line\":339,\"text\":\"\"},{\"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\"},{\"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'\"},{\"line\":349,\"text\":\"fi\"},{\"line\":350,\"text\":\"\"},{\"line\":351,\"text\":\"if [ -n \\\"$PREVIOUS_FAILED_RC\\\" ] &&\"},{\"line\":352,\"text\":\" [ \\\"${HOMELAB_ALLOW_REPEAT:-0}\\\" != 1 ]; then\"},{\"line\":353,\"text\":\"\"},{\"line\":354,\"text\":\" RUN_STARTED=false\"},{\"line\":355,\"text\":\" REPEAT_BLOCKED=true\"},{\"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'\"},{\"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'\"},{\"line\":366,\"text\":\"\"},{\"line\":367,\"text\":\" {\"},{\"line\":368,\"text\":\" echo 'COMMAND_EXECUTION_BLOCKED=yes'\"},{\"line\":369,\"text\":\" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'\"},{\"line\":370,\"text\":\" echo \\\"PREVIOUS_RC=$PREVIOUS_FAILED_RC\\\"\"},{\"line\":371,\"text\":\" echo \\\"COMMAND_SHA256=$COMMAND_SHA256\\\"\"},{\"line\":372,\"text\":\" echo\"},{\"line\":373,\"text\":\" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'\"},{\"line\":374,\"text\":\" } >\\\"$RAW_FILE\\\"\"},{\"line\":375,\"text\":\"else\"},{\"line\":376,\"text\":\" set +e\"},{\"line\":377,\"text\":\"\"},{\"line\":378,\"text\":\" if [ -n \\\"${HOMELAB_TIMEOUT:-}\\\" ]; then\"},{\"line\":379,\"text\":\" case \\\"$HOMELAB_TIMEOUT\\\" in\"}],\"match\":\"if [ -n \\\"$PREVIOUS_FAILED_RC\\\" ] &&\",\"match_line\":351},{\"context\":[{\"line\":351,\"text\":\"if [ -n \\\"$PREVIOUS_FAILED_RC\\\" ] &&\"},{\"line\":352,\"text\":\" [ \\\"${HOMELAB_ALLOW_REPEAT:-0}\\\" != 1 ]; then\"},{\"line\":353,\"text\":\"\"},{\"line\":354,\"text\":\" RUN_STARTED=false\"},{\"line\":355,\"text\":\" REPEAT_BLOCKED=true\"},{\"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'\"},{\"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'\"},{\"line\":366,\"text\":\"\"},{\"line\":367,\"text\":\" {\"},{\"line\":368,\"text\":\" echo 'COMMAND_EXECUTION_BLOCKED=yes'\"},{\"line\":369,\"text\":\" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'\"},{\"line\":370,\"text\":\" echo \\\"PREVIOUS_RC=$PREVIOUS_FAILED_RC\\\"\"},{\"line\":371,\"text\":\" echo \\\"COMMAND_SHA256=$COMMAND_SHA256\\\"\"},{\"line\":372,\"text\":\" echo\"},{\"line\":373,\"text\":\" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'\"},{\"line\":374,\"text\":\" } >\\\"$RAW_FILE\\\"\"},{\"line\":375,\"text\":\"else\"},{\"line\":376,\"text\":\" set +e\"},{\"line\":377,\"text\":\"\"},{\"line\":378,\"text\":\" if [ -n \\\"${HOMELAB_TIMEOUT:-}\\\" ]; then\"},{\"line\":379,\"text\":\" case \\\"$HOMELAB_TIMEOUT\\\" in\"},{\"line\":380,\"text\":\" *[!0-9]*|'')\"},{\"line\":381,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":382,\"text\":\" echo 'REASON=INVALID_HOMELAB_TIMEOUT'\"},{\"line\":383,\"text\":\" exit 74\"},{\"line\":384,\"text\":\" ;;\"},{\"line\":385,\"text\":\" esac\"},{\"line\":386,\"text\":\"\"},{\"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\"},{\"line\":392,\"text\":\" RC=$?\"},{\"line\":393,\"text\":\" else\"},{\"line\":394,\"text\":\" \\\"$@\\\" >\\\"$RAW_FILE\\\" 2>&1\"},{\"line\":395,\"text\":\" RC=$?\"},{\"line\":396,\"text\":\" fi\"},{\"line\":397,\"text\":\"\"}],\"match\":\" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'\",\"match_line\":369},{\"context\":[{\"line\":373,\"text\":\" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'\"},{\"line\":374,\"text\":\" } >\\\"$RAW_FILE\\\"\"},{\"line\":375,\"text\":\"else\"},{\"line\":376,\"text\":\" set +e\"},{\"line\":377,\"text\":\"\"},{\"line\":378,\"text\":\" if [ -n \\\"${HOMELAB_TIMEOUT:-}\\\" ]; then\"},{\"line\":379,\"text\":\" case \\\"$HOMELAB_TIMEOUT\\\" in\"},{\"line\":380,\"text\":\" *[!0-9]*|'')\"},{\"line\":381,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":382,\"text\":\" echo 'REASON=INVALID_HOMELAB_TIMEOUT'\"},{\"line\":383,\"text\":\" exit 74\"},{\"line\":384,\"text\":\" ;;\"},{\"line\":385,\"text\":\" esac\"},{\"line\":386,\"text\":\"\"},{\"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\"},{\"line\":392,\"text\":\" RC=$?\"},{\"line\":393,\"text\":\" else\"},{\"line\":394,\"text\":\" \\\"$@\\\" >\\\"$RAW_FILE\\\" 2>&1\"},{\"line\":395,\"text\":\" RC=$?\"},{\"line\":396,\"text\":\" fi\"},{\"line\":397,\"text\":\"\"},{\"line\":398,\"text\":\" set -e\"},{\"line\":399,\"text\":\"\"},{\"line\":400,\"text\":\" COMMAND_RC=\\\"$RC\\\"\"},{\"line\":401,\"text\":\"\"},{\"line\":402,\"text\":\" if [ \\\"$RC\\\" -eq 0 ]; then\"},{\"line\":403,\"text\":\" STATUS='OK'\"},{\"line\":404,\"text\":\" else\"},{\"line\":405,\"text\":\" STATUS='FAIL'\"},{\"line\":406,\"text\":\" fi\"},{\"line\":407,\"text\":\"\"},{\"line\":408,\"text\":\" IFS=$'\\\\t' read -r \\\\\"},{\"line\":409,\"text\":\" RESULT_CONTRACT_VALID \\\\\"},{\"line\":410,\"text\":\" CONTRACT_STATUS \\\\\"},{\"line\":411,\"text\":\" CHANGES_MADE \\\\\"},{\"line\":412,\"text\":\" ROLLBACK_STARTED \\\\\"},{\"line\":413,\"text\":\" ROLLBACK_RESTORED \\\\\"},{\"line\":414,\"text\":\" MUTATION_OUTCOME \\\\\"},{\"line\":415,\"text\":\" RESULT_CONTRACT_ERROR < <(\"},{\"line\":416,\"text\":\" read_mutation_contract \\\\\"},{\"line\":417,\"text\":\" \\\"$RAW_FILE\\\" \\\\\"},{\"line\":418,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":419,\"text\":\" \\\"$MODE\\\" \\\\\"}],\"match\":\" \\\"$@\\\" >\\\"$RAW_FILE\\\" 2>&1\",\"match_line\":391},{\"context\":[{\"line\":399,\"text\":\"\"},{\"line\":400,\"text\":\" COMMAND_RC=\\\"$RC\\\"\"},{\"line\":401,\"text\":\"\"},{\"line\":402,\"text\":\" if [ \\\"$RC\\\" -eq 0 ]; then\"},{\"line\":403,\"text\":\" STATUS='OK'\"},{\"line\":404,\"text\":\" else\"},{\"line\":405,\"text\":\" STATUS='FAIL'\"},{\"line\":406,\"text\":\" fi\"},{\"line\":407,\"text\":\"\"},{\"line\":408,\"text\":\" IFS=$'\\\\t' read -r \\\\\"},{\"line\":409,\"text\":\" RESULT_CONTRACT_VALID \\\\\"},{\"line\":410,\"text\":\" CONTRACT_STATUS \\\\\"},{\"line\":411,\"text\":\" CHANGES_MADE \\\\\"},{\"line\":412,\"text\":\" ROLLBACK_STARTED \\\\\"},{\"line\":413,\"text\":\" ROLLBACK_RESTORED \\\\\"},{\"line\":414,\"text\":\" MUTATION_OUTCOME \\\\\"},{\"line\":415,\"text\":\" RESULT_CONTRACT_ERROR < <(\"},{\"line\":416,\"text\":\" read_mutation_contract \\\\\"},{\"line\":417,\"text\":\" \\\"$RAW_FILE\\\" \\\\\"},{\"line\":418,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":419,\"text\":\" \\\"$MODE\\\" \\\\\"},{\"line\":420,\"text\":\" \\\"$COMMAND_RC\\\"\"},{\"line\":421,\"text\":\" )\"},{\"line\":422,\"text\":\"\"},{\"line\":423,\"text\":\" if [ \\\"$MODE\\\" = change ]; then\"},{\"line\":424,\"text\":\" if [ \\\"$RESULT_CONTRACT_VALID\\\" != true ]; then\"},{\"line\":425,\"text\":\" RC=76\"},{\"line\":426,\"text\":\" STATUS='FAIL'\"},{\"line\":427,\"text\":\" else\"},{\"line\":428,\"text\":\" STATUS=\\\"$CONTRACT_STATUS\\\"\"},{\"line\":429,\"text\":\" fi\"},{\"line\":430,\"text\":\" fi\"},{\"line\":431,\"text\":\"fi\"},{\"line\":432,\"text\":\"\"},{\"line\":433,\"text\":\"FINISHED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\"},{\"line\":434,\"text\":\"RAW_SHA256=\\\"$(sha256sum \\\"$RAW_FILE\\\" | awk '{print $1}')\\\"\"},{\"line\":435,\"text\":\"\"},{\"line\":436,\"text\":\"python3 - \\\"$RAW_FILE\\\" \\\"$SANITIZED_FILE\\\" <<'PY'\"},{\"line\":437,\"text\":\"import re\"},{\"line\":438,\"text\":\"import sys\"},{\"line\":439,\"text\":\"from pathlib import Path\"},{\"line\":440,\"text\":\"\"},{\"line\":441,\"text\":\"source = Path(sys.argv[1])\"},{\"line\":442,\"text\":\"target = Path(sys.argv[2])\"},{\"line\":443,\"text\":\"\"},{\"line\":444,\"text\":\"text = source.read_bytes().decode(\\\"utf-8\\\", errors=\\\"replace\\\")\"},{\"line\":445,\"text\":\"\"}],\"match\":\" \\\"$RAW_FILE\\\" \\\\\",\"match_line\":417},{\"context\":[{\"line\":416,\"text\":\" read_mutation_contract \\\\\"},{\"line\":417,\"text\":\" \\\"$RAW_FILE\\\" \\\\\"},{\"line\":418,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":419,\"text\":\" \\\"$MODE\\\" \\\\\"},{\"line\":420,\"text\":\" \\\"$COMMAND_RC\\\"\"},{\"line\":421,\"text\":\" )\"},{\"line\":422,\"text\":\"\"},{\"line\":423,\"text\":\" if [ \\\"$MODE\\\" = change ]; then\"},{\"line\":424,\"text\":\" if [ \\\"$RESULT_CONTRACT_VALID\\\" != true ]; then\"},{\"line\":425,\"text\":\" RC=76\"},{\"line\":426,\"text\":\" STATUS='FAIL'\"},{\"line\":427,\"text\":\" else\"},{\"line\":428,\"text\":\" STATUS=\\\"$CONTRACT_STATUS\\\"\"},{\"line\":429,\"text\":\" fi\"},{\"line\":430,\"text\":\" fi\"},{\"line\":431,\"text\":\"fi\"},{\"line\":432,\"text\":\"\"},{\"line\":433,\"text\":\"FINISHED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\"},{\"line\":434,\"text\":\"RAW_SHA256=\\\"$(sha256sum \\\"$RAW_FILE\\\" | awk '{print $1}')\\\"\"},{\"line\":435,\"text\":\"\"},{\"line\":436,\"text\":\"python3 - \\\"$RAW_FILE\\\" \\\"$SANITIZED_FILE\\\" <<'PY'\"},{\"line\":437,\"text\":\"import re\"},{\"line\":438,\"text\":\"import sys\"},{\"line\":439,\"text\":\"from pathlib import Path\"},{\"line\":440,\"text\":\"\"},{\"line\":441,\"text\":\"source = Path(sys.argv[1])\"},{\"line\":442,\"text\":\"target = Path(sys.argv[2])\"},{\"line\":443,\"text\":\"\"},{\"line\":444,\"text\":\"text = source.read_bytes().decode(\\\"utf-8\\\", errors=\\\"replace\\\")\"},{\"line\":445,\"text\":\"\"},{\"line\":446,\"text\":\"patterns = [\"},{\"line\":447,\"text\":\" (\"},{\"line\":448,\"text\":\" re.compile(\"},{\"line\":449,\"text\":\" r\\\"-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----\\\"\"},{\"line\":450,\"text\":\" r\\\".*?\\\"\"},{\"line\":451,\"text\":\" r\\\"-----END (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----\\\",\"},{\"line\":452,\"text\":\" re.IGNORECASE | re.DOTALL,\"},{\"line\":453,\"text\":\" ),\"},{\"line\":454,\"text\":\" \\\"[PRIVATE_KEY_REDACTED]\\\",\"},{\"line\":455,\"text\":\" ),\"},{\"line\":456,\"text\":\" (\"},{\"line\":457,\"text\":\" re.compile(\"},{\"line\":458,\"text\":\" r\\\"(?im)^(\\\\s*(?:password|passwd|passphrase|authorization|\\\"\"},{\"line\":459,\"text\":\" r\\\"api[_-]?key|access[_-]?token|refresh[_-]?token|\\\"\"},{\"line\":460,\"text\":\" r\\\"private[_-]?key|secret)\\\\s*[:=]\\\\s*).*$\\\"\"},{\"line\":461,\"text\":\" ),\"},{\"line\":462,\"text\":\" r\\\"\\\\1[REDACTED]\\\",\"}],\"match\":\"RAW_SHA256=\\\"$(sha256sum \\\"$RAW_FILE\\\" | awk '{print $1}')\\\"\",\"match_line\":434},{\"context\":[{\"line\":512,\"text\":\"\"},{\"line\":513,\"text\":\"text = \\\"\\\".join(\"},{\"line\":514,\"text\":\" char\"},{\"line\":515,\"text\":\" for char in text\"},{\"line\":516,\"text\":\" if char in \\\"\\\\n\\\\r\\\\t\\\" or ord(char) >= 32\"},{\"line\":517,\"text\":\")\"},{\"line\":518,\"text\":\"\"},{\"line\":519,\"text\":\"encoded = text.encode(\\\"utf-8\\\")\"},{\"line\":520,\"text\":\"\"},{\"line\":521,\"text\":\"maximum = 900_000\"},{\"line\":522,\"text\":\"\"},{\"line\":523,\"text\":\"if len(encoded) > maximum:\"},{\"line\":524,\"text\":\" first = encoded[:440_000].decode(\\\"utf-8\\\", errors=\\\"ignore\\\")\"},{\"line\":525,\"text\":\" last = encoded[-440_000:].decode(\\\"utf-8\\\", errors=\\\"ignore\\\")\"},{\"line\":526,\"text\":\"\"},{\"line\":527,\"text\":\" text = (\"},{\"line\":528,\"text\":\" first\"},{\"line\":529,\"text\":\" + \\\"\\\\n\\\\n\\\"\"},{\"line\":530,\"text\":\" + \\\"===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====\\\"\"},{\"line\":531,\"text\":\" + \\\"\\\\n\\\\n\\\"\"},{\"line\":532,\"text\":\" + last\"},{\"line\":533,\"text\":\" )\"},{\"line\":534,\"text\":\"\"},{\"line\":535,\"text\":\"target.write_text(text, encoding=\\\"utf-8\\\")\"},{\"line\":536,\"text\":\"PY\"},{\"line\":537,\"text\":\"\"},{\"line\":538,\"text\":\"SANITIZED_SHA256=\\\"$(\"},{\"line\":539,\"text\":\" sha256sum \\\"$SANITIZED_FILE\\\" |\"},{\"line\":540,\"text\":\" awk '{print $1}'\"},{\"line\":541,\"text\":\")\\\"\"},{\"line\":542,\"text\":\"\"},{\"line\":543,\"text\":\"python3 - \\\\\"},{\"line\":544,\"text\":\" \\\"$JSON_FILE\\\" \\\\\"},{\"line\":545,\"text\":\" \\\"$SANITIZED_FILE\\\" \\\\\"},{\"line\":546,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":547,\"text\":\" \\\"$STATUS\\\" \\\\\"},{\"line\":548,\"text\":\" \\\"$RC\\\" \\\\\"},{\"line\":549,\"text\":\" \\\"$HOST_SHORT\\\" \\\\\"},{\"line\":550,\"text\":\" \\\"$MODE\\\" \\\\\"},{\"line\":551,\"text\":\" \\\"$COMPONENT\\\" \\\\\"},{\"line\":552,\"text\":\" \\\"$STARTED_AT\\\" \\\\\"},{\"line\":553,\"text\":\" \\\"$FINISHED_AT\\\" \\\\\"},{\"line\":554,\"text\":\" \\\"$REFERENCE_SHA256\\\" \\\\\"},{\"line\":555,\"text\":\" \\\"$ERROR_REGISTER_SHA256\\\" \\\\\"},{\"line\":556,\"text\":\" \\\"$COMMAND_SHA256\\\" \\\\\"},{\"line\":557,\"text\":\" \\\"$RAW_SHA256\\\" \\\\\"},{\"line\":558,\"text\":\" \\\"$SANITIZED_SHA256\\\" \\\\\"}],\"match\":\" + \\\"===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====\\\"\",\"match_line\":530},{\"context\":[{\"line\":538,\"text\":\"SANITIZED_SHA256=\\\"$(\"},{\"line\":539,\"text\":\" sha256sum \\\"$SANITIZED_FILE\\\" |\"},{\"line\":540,\"text\":\" awk '{print $1}'\"},{\"line\":541,\"text\":\")\\\"\"},{\"line\":542,\"text\":\"\"},{\"line\":543,\"text\":\"python3 - \\\\\"},{\"line\":544,\"text\":\" \\\"$JSON_FILE\\\" \\\\\"},{\"line\":545,\"text\":\" \\\"$SANITIZED_FILE\\\" \\\\\"},{\"line\":546,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":547,\"text\":\" \\\"$STATUS\\\" \\\\\"},{\"line\":548,\"text\":\" \\\"$RC\\\" \\\\\"},{\"line\":549,\"text\":\" \\\"$HOST_SHORT\\\" \\\\\"},{\"line\":550,\"text\":\" \\\"$MODE\\\" \\\\\"},{\"line\":551,\"text\":\" \\\"$COMPONENT\\\" \\\\\"},{\"line\":552,\"text\":\" \\\"$STARTED_AT\\\" \\\\\"},{\"line\":553,\"text\":\" \\\"$FINISHED_AT\\\" \\\\\"},{\"line\":554,\"text\":\" \\\"$REFERENCE_SHA256\\\" \\\\\"},{\"line\":555,\"text\":\" \\\"$ERROR_REGISTER_SHA256\\\" \\\\\"},{\"line\":556,\"text\":\" \\\"$COMMAND_SHA256\\\" \\\\\"},{\"line\":557,\"text\":\" \\\"$RAW_SHA256\\\" \\\\\"},{\"line\":558,\"text\":\" \\\"$SANITIZED_SHA256\\\" \\\\\"},{\"line\":559,\"text\":\" \\\"$RUN_STARTED\\\" \\\\\"},{\"line\":560,\"text\":\" \\\"$REPEAT_BLOCKED\\\" \\\\\"},{\"line\":561,\"text\":\" \\\"$BLOCK_REASON\\\" \\\\\"},{\"line\":562,\"text\":\" \\\"$CHANGE_DECLARED\\\" \\\\\"},{\"line\":563,\"text\":\" \\\"$RESULT_CONTRACT_VALID\\\" \\\\\"},{\"line\":564,\"text\":\" \\\"$CONTRACT_STATUS\\\" \\\\\"},{\"line\":565,\"text\":\" \\\"$CHANGES_MADE\\\" \\\\\"},{\"line\":566,\"text\":\" \\\"$ROLLBACK_STARTED\\\" \\\\\"},{\"line\":567,\"text\":\" \\\"$ROLLBACK_RESTORED\\\" \\\\\"},{\"line\":568,\"text\":\" \\\"$MUTATION_OUTCOME\\\" \\\\\"},{\"line\":569,\"text\":\" \\\"$RESULT_CONTRACT_ERROR\\\" \\\\\"},{\"line\":570,\"text\":\" \\\"$COMMAND_RC\\\" <<'PY'\"},{\"line\":571,\"text\":\"import json\"},{\"line\":572,\"text\":\"import sys\"},{\"line\":573,\"text\":\"from pathlib import Path\"},{\"line\":574,\"text\":\"\"},{\"line\":575,\"text\":\"(\"},{\"line\":576,\"text\":\" json_path,\"},{\"line\":577,\"text\":\" output_path,\"},{\"line\":578,\"text\":\" command_id,\"},{\"line\":579,\"text\":\" status,\"},{\"line\":580,\"text\":\" rc,\"},{\"line\":581,\"text\":\" host,\"},{\"line\":582,\"text\":\" mode,\"},{\"line\":583,\"text\":\" component,\"},{\"line\":584,\"text\":\" started,\"}],\"match\":\" \\\"$COMMAND_SHA256\\\" \\\\\",\"match_line\":556},{\"context\":[{\"line\":570,\"text\":\" \\\"$COMMAND_RC\\\" <<'PY'\"},{\"line\":571,\"text\":\"import json\"},{\"line\":572,\"text\":\"import sys\"},{\"line\":573,\"text\":\"from pathlib import Path\"},{\"line\":574,\"text\":\"\"},{\"line\":575,\"text\":\"(\"},{\"line\":576,\"text\":\" json_path,\"},{\"line\":577,\"text\":\" output_path,\"},{\"line\":578,\"text\":\" command_id,\"},{\"line\":579,\"text\":\" status,\"},{\"line\":580,\"text\":\" rc,\"},{\"line\":581,\"text\":\" host,\"},{\"line\":582,\"text\":\" mode,\"},{\"line\":583,\"text\":\" component,\"},{\"line\":584,\"text\":\" started,\"},{\"line\":585,\"text\":\" finished,\"},{\"line\":586,\"text\":\" reference_sha,\"},{\"line\":587,\"text\":\" error_sha,\"},{\"line\":588,\"text\":\" command_sha,\"},{\"line\":589,\"text\":\" raw_sha,\"},{\"line\":590,\"text\":\" sanitized_sha,\"},{\"line\":591,\"text\":\" run_started,\"},{\"line\":592,\"text\":\" repeat_blocked,\"},{\"line\":593,\"text\":\" block_reason,\"},{\"line\":594,\"text\":\" change_declared,\"},{\"line\":595,\"text\":\" result_contract_valid,\"},{\"line\":596,\"text\":\" contract_status,\"},{\"line\":597,\"text\":\" changes_made,\"},{\"line\":598,\"text\":\" rollback_started,\"},{\"line\":599,\"text\":\" rollback_restored,\"},{\"line\":600,\"text\":\" mutation_outcome,\"},{\"line\":601,\"text\":\" result_contract_error,\"},{\"line\":602,\"text\":\" command_rc,\"},{\"line\":603,\"text\":\") = sys.argv[1:]\"},{\"line\":604,\"text\":\"\"},{\"line\":605,\"text\":\"\"},{\"line\":606,\"text\":\"def optional_bool(value: str):\"},{\"line\":607,\"text\":\" if value == \\\"true\\\":\"},{\"line\":608,\"text\":\" return True\"},{\"line\":609,\"text\":\" if value == \\\"false\\\":\"},{\"line\":610,\"text\":\" return False\"},{\"line\":611,\"text\":\" return None\"},{\"line\":612,\"text\":\"\"},{\"line\":613,\"text\":\"output = Path(output_path).read_text(\"},{\"line\":614,\"text\":\" encoding=\\\"utf-8\\\",\"},{\"line\":615,\"text\":\" errors=\\\"replace\\\",\"},{\"line\":616,\"text\":\")\"}],\"match\":\" command_sha,\",\"match_line\":588},{\"context\":[{\"line\":627,\"text\":\"else:\"},{\"line\":628,\"text\":\" output_preview = output\"},{\"line\":629,\"text\":\"\"},{\"line\":630,\"text\":\"document = {\"},{\"line\":631,\"text\":\" \\\"schema_version\\\": 1,\"},{\"line\":632,\"text\":\" \\\"channel\\\": \\\"homelab-runtime\\\",\"},{\"line\":633,\"text\":\" \\\"command_id\\\": command_id,\"},{\"line\":634,\"text\":\" \\\"status\\\": status,\"},{\"line\":635,\"text\":\" \\\"rc\\\": int(rc),\"},{\"line\":636,\"text\":\" \\\"host\\\": host,\"},{\"line\":637,\"text\":\" \\\"mode\\\": mode,\"},{\"line\":638,\"text\":\" \\\"component\\\": component,\"},{\"line\":639,\"text\":\" \\\"started_at_utc\\\": started,\"},{\"line\":640,\"text\":\" \\\"finished_at_utc\\\": finished,\"},{\"line\":641,\"text\":\" \\\"reference_register_checked\\\": True,\"},{\"line\":642,\"text\":\" \\\"reference_sha256\\\": reference_sha,\"},{\"line\":643,\"text\":\" \\\"error_register_checked\\\": True,\"},{\"line\":644,\"text\":\" \\\"error_register_sha256\\\": error_sha,\"},{\"line\":645,\"text\":\" \\\"command_sha256\\\": command_sha,\"},{\"line\":646,\"text\":\" \\\"duplicate_failed_command_blocked\\\": repeat_blocked == \\\"true\\\",\"},{\"line\":647,\"text\":\" \\\"block_reason\\\": block_reason or None,\"},{\"line\":648,\"text\":\" \\\"execution_started\\\": run_started == \\\"true\\\",\"},{\"line\":649,\"text\":\" \\\"change_declared\\\": change_declared == \\\"true\\\",\"},{\"line\":650,\"text\":\" \\\"result_contract_valid\\\": result_contract_valid == \\\"true\\\",\"},{\"line\":651,\"text\":\" \\\"result_contract_status\\\": (\"},{\"line\":652,\"text\":\" None\"},{\"line\":653,\"text\":\" if contract_status in {\\\"\\\", \\\"UNKNOWN\\\", \\\"NOT_APPLICABLE\\\"}\"},{\"line\":654,\"text\":\" else contract_status\"},{\"line\":655,\"text\":\" ),\"},{\"line\":656,\"text\":\" \\\"result_contract_error\\\": (\"},{\"line\":657,\"text\":\" None\"},{\"line\":658,\"text\":\" if result_contract_error == \\\"NONE\\\"\"},{\"line\":659,\"text\":\" else result_contract_error\"},{\"line\":660,\"text\":\" ),\"},{\"line\":661,\"text\":\" \\\"command_rc\\\": int(command_rc) if command_rc else None,\"},{\"line\":662,\"text\":\" \\\"changes_made\\\": optional_bool(changes_made),\"},{\"line\":663,\"text\":\" \\\"rollback_started\\\": optional_bool(rollback_started),\"},{\"line\":664,\"text\":\" \\\"rollback_restored\\\": optional_bool(rollback_restored),\"},{\"line\":665,\"text\":\" \\\"mutation_outcome\\\": mutation_outcome,\"},{\"line\":666,\"text\":\" \\\"sanitized\\\": True,\"},{\"line\":667,\"text\":\" \\\"secrets_included\\\": False,\"},{\"line\":668,\"text\":\" \\\"private_addresses_included\\\": False,\"},{\"line\":669,\"text\":\" \\\"raw_evidence_retained_locally\\\": True,\"},{\"line\":670,\"text\":\" \\\"raw_evidence_sha256\\\": raw_sha,\"},{\"line\":671,\"text\":\" \\\"sanitized_output_sha256\\\": sanitized_sha,\"},{\"line\":672,\"text\":\" \\\"output_truncated_in_json\\\": output_truncated,\"},{\"line\":673,\"text\":\" \\\"full_sanitized_output_url\\\": (\"}],\"match\":\" \\\"command_sha256\\\": command_sha,\",\"match_line\":645},{\"context\":[{\"line\":651,\"text\":\" \\\"result_contract_status\\\": (\"},{\"line\":652,\"text\":\" None\"},{\"line\":653,\"text\":\" if contract_status in {\\\"\\\", \\\"UNKNOWN\\\", \\\"NOT_APPLICABLE\\\"}\"},{\"line\":654,\"text\":\" else contract_status\"},{\"line\":655,\"text\":\" ),\"},{\"line\":656,\"text\":\" \\\"result_contract_error\\\": (\"},{\"line\":657,\"text\":\" None\"},{\"line\":658,\"text\":\" if result_contract_error == \\\"NONE\\\"\"},{\"line\":659,\"text\":\" else result_contract_error\"},{\"line\":660,\"text\":\" ),\"},{\"line\":661,\"text\":\" \\\"command_rc\\\": int(command_rc) if command_rc else None,\"},{\"line\":662,\"text\":\" \\\"changes_made\\\": optional_bool(changes_made),\"},{\"line\":663,\"text\":\" \\\"rollback_started\\\": optional_bool(rollback_started),\"},{\"line\":664,\"text\":\" \\\"rollback_restored\\\": optional_bool(rollback_restored),\"},{\"line\":665,\"text\":\" \\\"mutation_outcome\\\": mutation_outcome,\"},{\"line\":666,\"text\":\" \\\"sanitized\\\": True,\"},{\"line\":667,\"text\":\" \\\"secrets_included\\\": False,\"},{\"line\":668,\"text\":\" \\\"private_addresses_included\\\": False,\"},{\"line\":669,\"text\":\" \\\"raw_evidence_retained_locally\\\": True,\"},{\"line\":670,\"text\":\" \\\"raw_evidence_sha256\\\": raw_sha,\"},{\"line\":671,\"text\":\" \\\"sanitized_output_sha256\\\": sanitized_sha,\"},{\"line\":672,\"text\":\" \\\"output_truncated_in_json\\\": output_truncated,\"},{\"line\":673,\"text\":\" \\\"full_sanitized_output_url\\\": (\"},{\"line\":674,\"text\":\" \\\"https://git.gram1.ru/.well-known/\\\"\"},{\"line\":675,\"text\":\" \\\"homelab-runtime/latest.txt\\\"\"},{\"line\":676,\"text\":\" ),\"},{\"line\":677,\"text\":\" \\\"output\\\": output_preview,\"},{\"line\":678,\"text\":\"}\"},{\"line\":679,\"text\":\"\"},{\"line\":680,\"text\":\"Path(json_path).write_text(\"},{\"line\":681,\"text\":\" json.dumps(\"},{\"line\":682,\"text\":\" document,\"},{\"line\":683,\"text\":\" ensure_ascii=False,\"},{\"line\":684,\"text\":\" indent=2,\"},{\"line\":685,\"text\":\" )\"},{\"line\":686,\"text\":\" + \\\"\\\\n\\\",\"},{\"line\":687,\"text\":\" encoding=\\\"utf-8\\\",\"},{\"line\":688,\"text\":\")\"},{\"line\":689,\"text\":\"PY\"},{\"line\":690,\"text\":\"\"},{\"line\":691,\"text\":\"{\"},{\"line\":692,\"text\":\" echo 'CHAT_OUTPUT_BEGIN'\"},{\"line\":693,\"text\":\" echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":694,\"text\":\" echo \\\"STATUS=$STATUS\\\"\"},{\"line\":695,\"text\":\" echo \\\"RC=$RC\\\"\"},{\"line\":696,\"text\":\" echo \\\"HOST=$HOST_SHORT\\\"\"},{\"line\":697,\"text\":\" echo \\\"MODE=$MODE\\\"\"}],\"match\":\" \\\"raw_evidence_retained_locally\\\": True,\",\"match_line\":669},{\"context\":[{\"line\":685,\"text\":\" )\"},{\"line\":686,\"text\":\" + \\\"\\\\n\\\",\"},{\"line\":687,\"text\":\" encoding=\\\"utf-8\\\",\"},{\"line\":688,\"text\":\")\"},{\"line\":689,\"text\":\"PY\"},{\"line\":690,\"text\":\"\"},{\"line\":691,\"text\":\"{\"},{\"line\":692,\"text\":\" echo 'CHAT_OUTPUT_BEGIN'\"},{\"line\":693,\"text\":\" echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":694,\"text\":\" echo \\\"STATUS=$STATUS\\\"\"},{\"line\":695,\"text\":\" echo \\\"RC=$RC\\\"\"},{\"line\":696,\"text\":\" echo \\\"HOST=$HOST_SHORT\\\"\"},{\"line\":697,\"text\":\" echo \\\"MODE=$MODE\\\"\"},{\"line\":698,\"text\":\" echo \\\"COMPONENT=$COMPONENT\\\"\"},{\"line\":699,\"text\":\" echo 'REFERENCE_REGISTER_CHECK=OK'\"},{\"line\":700,\"text\":\" echo \\\"REFERENCE_SHA256=$REFERENCE_SHA256\\\"\"},{\"line\":701,\"text\":\" echo 'ERROR_REGISTER_CHECK=OK'\"},{\"line\":702,\"text\":\" echo \\\"ERROR_REGISTER_SHA256=$ERROR_REGISTER_SHA256\\\"\"},{\"line\":703,\"text\":\" echo \\\"COMMAND_SHA256=$COMMAND_SHA256\\\"\"},{\"line\":704,\"text\":\" echo \\\"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\\\"\"},{\"line\":705,\"text\":\" echo \\\"EXECUTION_STARTED=$RUN_STARTED\\\"\"},{\"line\":706,\"text\":\" echo \\\"CHANGE_DECLARED=$CHANGE_DECLARED\\\"\"},{\"line\":707,\"text\":\" echo \\\"RESULT_CONTRACT_VALID=$RESULT_CONTRACT_VALID\\\"\"},{\"line\":708,\"text\":\" echo \\\"RESULT_CONTRACT_STATUS=$CONTRACT_STATUS\\\"\"},{\"line\":709,\"text\":\" echo \\\"RESULT_CONTRACT_ERROR=$RESULT_CONTRACT_ERROR\\\"\"},{\"line\":710,\"text\":\" echo \\\"COMMAND_RC=${COMMAND_RC:-}\\\"\"},{\"line\":711,\"text\":\" echo \\\"CHANGES_MADE=$CHANGES_MADE\\\"\"},{\"line\":712,\"text\":\" echo \\\"ROLLBACK_STARTED=$ROLLBACK_STARTED\\\"\"},{\"line\":713,\"text\":\" echo \\\"ROLLBACK_RESTORED=$ROLLBACK_RESTORED\\\"\"},{\"line\":714,\"text\":\" echo \\\"MUTATION_OUTCOME=$MUTATION_OUTCOME\\\"\"},{\"line\":715,\"text\":\" echo 'SANITIZED=yes'\"},{\"line\":716,\"text\":\" echo 'SECRETS_INCLUDED=no'\"},{\"line\":717,\"text\":\" echo 'PRIVATE_ADDRESSES_INCLUDED=no'\"},{\"line\":718,\"text\":\" echo \\\"RAW_EVIDENCE_SHA256=$RAW_SHA256\\\"\"},{\"line\":719,\"text\":\" echo \\\"SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256\\\"\"},{\"line\":720,\"text\":\" echo 'OUTPUT_BEGIN'\"},{\"line\":721,\"text\":\" cat \\\"$SANITIZED_FILE\\\"\"},{\"line\":722,\"text\":\" echo\"},{\"line\":723,\"text\":\" echo 'OUTPUT_END'\"},{\"line\":724,\"text\":\" echo 'CHAT_OUTPUT_END'\"},{\"line\":725,\"text\":\"} >\\\"$TXT_FILE\\\"\"},{\"line\":726,\"text\":\"\"},{\"line\":727,\"text\":\"chmod 0600 \\\\\"},{\"line\":728,\"text\":\" \\\"$RAW_FILE\\\" \\\\\"},{\"line\":729,\"text\":\" \\\"$SANITIZED_FILE\\\" \\\\\"},{\"line\":730,\"text\":\" \\\"$JSON_FILE\\\" \\\\\"},{\"line\":731,\"text\":\" \\\"$TXT_FILE\\\"\"}],\"match\":\" echo \\\"COMMAND_SHA256=$COMMAND_SHA256\\\"\",\"match_line\":703},{\"context\":[{\"line\":710,\"text\":\" echo \\\"COMMAND_RC=${COMMAND_RC:-}\\\"\"},{\"line\":711,\"text\":\" echo \\\"CHANGES_MADE=$CHANGES_MADE\\\"\"},{\"line\":712,\"text\":\" echo \\\"ROLLBACK_STARTED=$ROLLBACK_STARTED\\\"\"},{\"line\":713,\"text\":\" echo \\\"ROLLBACK_RESTORED=$ROLLBACK_RESTORED\\\"\"},{\"line\":714,\"text\":\" echo \\\"MUTATION_OUTCOME=$MUTATION_OUTCOME\\\"\"},{\"line\":715,\"text\":\" echo 'SANITIZED=yes'\"},{\"line\":716,\"text\":\" echo 'SECRETS_INCLUDED=no'\"},{\"line\":717,\"text\":\" echo 'PRIVATE_ADDRESSES_INCLUDED=no'\"},{\"line\":718,\"text\":\" echo \\\"RAW_EVIDENCE_SHA256=$RAW_SHA256\\\"\"},{\"line\":719,\"text\":\" echo \\\"SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256\\\"\"},{\"line\":720,\"text\":\" echo 'OUTPUT_BEGIN'\"},{\"line\":721,\"text\":\" cat \\\"$SANITIZED_FILE\\\"\"},{\"line\":722,\"text\":\" echo\"},{\"line\":723,\"text\":\" echo 'OUTPUT_END'\"},{\"line\":724,\"text\":\" echo 'CHAT_OUTPUT_END'\"},{\"line\":725,\"text\":\"} >\\\"$TXT_FILE\\\"\"},{\"line\":726,\"text\":\"\"},{\"line\":727,\"text\":\"chmod 0600 \\\\\"},{\"line\":728,\"text\":\" \\\"$RAW_FILE\\\" \\\\\"},{\"line\":729,\"text\":\" \\\"$SANITIZED_FILE\\\" \\\\\"},{\"line\":730,\"text\":\" \\\"$JSON_FILE\\\" \\\\\"},{\"line\":731,\"text\":\" \\\"$TXT_FILE\\\"\"},{\"line\":732,\"text\":\"\"},{\"line\":733,\"text\":\"TARGET=debian@[PRIVATE_IP]\"},{\"line\":734,\"text\":\"REMOTE_PREFIX=\\\"/tmp/homelab-runtime-${COMMAND_ID}-$$\\\"\"},{\"line\":735,\"text\":\"\"},{\"line\":736,\"text\":\"SSH_OPTS=(\"},{\"line\":737,\"text\":\" -o BatchMode=yes\"},{\"line\":738,\"text\":\" -o ConnectTimeout=10\"},{\"line\":739,\"text\":\" -o ConnectionAttempts=1\"},{\"line\":740,\"text\":\" -o StrictHostKeyChecking=yes\"},{\"line\":741,\"text\":\" -o UserKnownHostsFile=[SENSITIVE_PATH] \\\\\"},{\"line\":745,\"text\":\" -q \\\\\"},{\"line\":746,\"text\":\" \\\"${SSH_OPTS[@]}\\\" \\\\\"},{\"line\":747,\"text\":\" \\\"$JSON_FILE\\\" \\\\\"},{\"line\":748,\"text\":\" \\\"${TARGET}:${REMOTE_PREFIX}.json\\\"\"},{\"line\":749,\"text\":\"\"},{\"line\":750,\"text\":\"scp \\\\\"},{\"line\":751,\"text\":\" -q \\\\\"},{\"line\":752,\"text\":\" \\\"${SSH_OPTS[@]}\\\" \\\\\"},{\"line\":753,\"text\":\" \\\"$TXT_FILE\\\" \\\\\"},{\"line\":754,\"text\":\" \\\"${TARGET}:${REMOTE_PREFIX}.txt\\\"\"},{\"line\":755,\"text\":\"\"},{\"line\":756,\"text\":\"ssh \\\"${SSH_OPTS[@]}\\\" \\\"$TARGET\\\" \\\"\"}],\"match\":\" \\\"$RAW_FILE\\\" \\\\\",\"match_line\":728},{\"context\":[{\"line\":779,\"text\":\" --max-time 15 \\\\\"},{\"line\":780,\"text\":\" \\\"$PUBLIC_URL\\\" 2>/dev/null ||\"},{\"line\":781,\"text\":\" true\"},{\"line\":782,\"text\":\" )\\\"\"},{\"line\":783,\"text\":\"\"},{\"line\":784,\"text\":\" if printf '%s\\\\n' \\\"$CONTENT\\\" |\"},{\"line\":785,\"text\":\" grep -Fq \\\"\\\\\\\"command_id\\\\\\\": \\\\\\\"$COMMAND_ID\\\\\\\"\\\"; then\"},{\"line\":786,\"text\":\" PUBLIC_VISIBLE=true\"},{\"line\":787,\"text\":\" break\"},{\"line\":788,\"text\":\" fi\"},{\"line\":789,\"text\":\"\"},{\"line\":790,\"text\":\" sleep 2\"},{\"line\":791,\"text\":\"done\"},{\"line\":792,\"text\":\"\"},{\"line\":793,\"text\":\"if [ \\\"$PUBLIC_VISIBLE\\\" != true ]; then\"},{\"line\":794,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":795,\"text\":\" echo 'REASON=PUBLIC_RUNTIME_RESULT_NOT_VISIBLE'\"},{\"line\":796,\"text\":\" echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":797,\"text\":\" echo \\\"LOCAL_RAW_FILE=$RAW_FILE\\\"\"},{\"line\":798,\"text\":\" exit 75\"},{\"line\":799,\"text\":\"fi\"},{\"line\":800,\"text\":\"\"},{\"line\":801,\"text\":\"printf '%s\\\\t%s\\\\t%s\\\\t%s\\\\t%s\\\\t%s\\\\n' \\\\\"},{\"line\":802,\"text\":\" \\\"$FINISHED_AT\\\" \\\\\"},{\"line\":803,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":804,\"text\":\" \\\"$COMMAND_SHA256\\\" \\\\\"},{\"line\":805,\"text\":\" \\\"$RC\\\" \\\\\"},{\"line\":806,\"text\":\" \\\"$STATUS\\\" \\\\\"},{\"line\":807,\"text\":\" \\\"$COMPONENT\\\" >>\\\"$LEDGER\\\"\"},{\"line\":808,\"text\":\"\"},{\"line\":809,\"text\":\"echo\"},{\"line\":810,\"text\":\"echo '===== HOMELAB CHAT RUN COMPLETE ====='\"},{\"line\":811,\"text\":\"echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":812,\"text\":\"echo \\\"STATUS=$STATUS\\\"\"},{\"line\":813,\"text\":\"echo \\\"RC=$RC\\\"\"},{\"line\":814,\"text\":\"echo 'REFERENCE_REGISTER_CHECK=OK'\"},{\"line\":815,\"text\":\"echo 'ERROR_REGISTER_CHECK=OK'\"},{\"line\":816,\"text\":\"echo \\\"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\\\"\"},{\"line\":817,\"text\":\"echo 'GITEA_PUBLICATION=OK'\"},{\"line\":818,\"text\":\"echo \\\"PUBLIC_URL=$PUBLIC_URL\\\"\"},{\"line\":819,\"text\":\"echo \\\"LOCAL_RAW_FILE=$RAW_FILE\\\"\"},{\"line\":820,\"text\":\"echo 'SHELL_SESSION_PRESERVED=yes'\"},{\"line\":821,\"text\":\"\"},{\"line\":822,\"text\":\"exit \\\"$RC\\\"\"}],\"match\":\" echo \\\"LOCAL_RAW_FILE=$RAW_FILE\\\"\",\"match_line\":797},{\"context\":[{\"line\":786,\"text\":\" PUBLIC_VISIBLE=true\"},{\"line\":787,\"text\":\" break\"},{\"line\":788,\"text\":\" fi\"},{\"line\":789,\"text\":\"\"},{\"line\":790,\"text\":\" sleep 2\"},{\"line\":791,\"text\":\"done\"},{\"line\":792,\"text\":\"\"},{\"line\":793,\"text\":\"if [ \\\"$PUBLIC_VISIBLE\\\" != true ]; then\"},{\"line\":794,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":795,\"text\":\" echo 'REASON=PUBLIC_RUNTIME_RESULT_NOT_VISIBLE'\"},{\"line\":796,\"text\":\" echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":797,\"text\":\" echo \\\"LOCAL_RAW_FILE=$RAW_FILE\\\"\"},{\"line\":798,\"text\":\" exit 75\"},{\"line\":799,\"text\":\"fi\"},{\"line\":800,\"text\":\"\"},{\"line\":801,\"text\":\"printf '%s\\\\t%s\\\\t%s\\\\t%s\\\\t%s\\\\t%s\\\\n' \\\\\"},{\"line\":802,\"text\":\" \\\"$FINISHED_AT\\\" \\\\\"},{\"line\":803,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":804,\"text\":\" \\\"$COMMAND_SHA256\\\" \\\\\"},{\"line\":805,\"text\":\" \\\"$RC\\\" \\\\\"},{\"line\":806,\"text\":\" \\\"$STATUS\\\" \\\\\"},{\"line\":807,\"text\":\" \\\"$COMPONENT\\\" >>\\\"$LEDGER\\\"\"},{\"line\":808,\"text\":\"\"},{\"line\":809,\"text\":\"echo\"},{\"line\":810,\"text\":\"echo '===== HOMELAB CHAT RUN COMPLETE ====='\"},{\"line\":811,\"text\":\"echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":812,\"text\":\"echo \\\"STATUS=$STATUS\\\"\"},{\"line\":813,\"text\":\"echo \\\"RC=$RC\\\"\"},{\"line\":814,\"text\":\"echo 'REFERENCE_REGISTER_CHECK=OK'\"},{\"line\":815,\"text\":\"echo 'ERROR_REGISTER_CHECK=OK'\"},{\"line\":816,\"text\":\"echo \\\"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\\\"\"},{\"line\":817,\"text\":\"echo 'GITEA_PUBLICATION=OK'\"},{\"line\":818,\"text\":\"echo \\\"PUBLIC_URL=$PUBLIC_URL\\\"\"},{\"line\":819,\"text\":\"echo \\\"LOCAL_RAW_FILE=$RAW_FILE\\\"\"},{\"line\":820,\"text\":\"echo 'SHELL_SESSION_PRESERVED=yes'\"},{\"line\":821,\"text\":\"\"},{\"line\":822,\"text\":\"exit \\\"$RC\\\"\"}],\"match\":\" \\\"$COMMAND_SHA256\\\" \\\\\",\"match_line\":804}],\"sha256\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\"}\nRUNNER_CANDIDATE_ROOTS=[\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"/var/lib/homelab-chat-run\",\"/var/log/homelab\"]\nTARGET_SHA_SEARCH=[{\"files\":[],\"rc\":1,\"root\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"files\":[],\"rc\":1,\"root\":\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"files\":[\"/var/lib/homelab-chat-run/state/command-ledger.tsv\",\"/var/lib/homelab-chat-run/raw/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.log\",\"/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.txt\",\"/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171441Z.json\",\"/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.json\",\"/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171441Z-latest.txt\",\"/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z-latest.txt\"],\"rc\":0,\"root\":\"/var/lib/homelab-chat-run\",\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"files\":[],\"rc\":1,\"root\":\"/var/log/homelab\",\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}]\nRCA_ERROR_CLASS=TimeoutExpired\nRCA_ERROR_SHA256=47027a3fd2fcca9dbfcae4c4ea66f79d2512e2d04aa00889dc8893508b183cc9\nNO_MUTATION=True\nTASK_RESULT=PVEPRO_HOMEPAGE_PORTAL_789_RUNNER_DUPLICATE_RCA_FAILED\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"FAIL\",\"version\":1}\n" +} diff --git a/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1.txt b/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1.txt new file mode 100644 index 00000000..57dcf9ea --- /dev/null +++ b/runtime/history/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1.txt @@ -0,0 +1,46 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1 +STATUS=FAIL +RC=3 +HOST=pve01 +MODE=read-only +COMPONENT=pvepro-homepage-portal-789-runner-duplicate-rca-readonly +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=a38301defa26ee67a8bb0dc8227f645b6dcaccada08b26232bc8216c628fd1ef +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=3 +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=7038052a6bbf990f44df906709727240385ac1cc38588e070b544977c2209965 +SANITIZED_OUTPUT_SHA256=0b8d0544ef9d63aa9d2130266a604f965e250bebcbbc626ad09fca81ecdcbb8b +OUTPUT_BEGIN +COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1 +MODE=read-only +COMPONENT=pvepro-homepage-portal-789-runner-duplicate-rca-readonly +WINDOW_MODE=VISIBLE_SYNCHRONOUS_WAIT +PRODUCTION_HOST={"all_link_down":false,"config_sha256":"ebd2b7d44ab58a222b4fd5a7dcd9358d3082e593bd70fb07c2331c70f22e82ab","name":"pvepro-prod","snapshots":[],"status":"running"} +STAGING_HOST={"all_link_down":true,"config_sha256":"27a4e57f09dfd93c374ff9597651cade264a9b10f13302dbf2b8345a9d40dd76","name":"pvepro-staging-v1","snapshots":["w2-pre-portal-cutover-787r1"],"status":"stopped"} +RUNNER_SOURCE={"absolute_paths":["/etc/pve/31_HOMELAB_REFERENCE.md","/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md","[SENSITIVE_PATH] bash"},{"line":2,"text":"set -Eeuo pipefail"},{"line":3,"text":"umask 077"},{"line":4,"text":""},{"line":5,"text":"read_mutation_contract() {"},{"line":6,"text":" python3 - \"$1\" \"$2\" \"$3\" \"$4\" <<'PY_CONTRACT'"},{"line":7,"text":"import json"},{"line":8,"text":"import sys"},{"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":""},{"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\","},{"line":19,"text":" \"rollback_restored\": \"null\","},{"line":20,"text":" \"mutation_outcome\": \"NO_MUTATION\","},{"line":21,"text":" \"error\": \"NONE\","},{"line":22,"text":"}"},{"line":23,"text":""},{"line":24,"text":"if mode == \"change\":"},{"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\","},{"line":30,"text":" \"rollback_restored\": \"null\","},{"line":31,"text":" \"mutation_outcome\": \"UNKNOWN\","},{"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\","},{"line":37,"text":" errors=\"replace\","},{"line":38,"text":" ).splitlines()"},{"line":39,"text":" payloads = ["}],"match":"raw_path, command_id, mode, command_rc = sys.argv[1:]","match_line":11},{"context":[{"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\","},{"line":22,"text":"}"},{"line":23,"text":""},{"line":24,"text":"if mode == \"change\":"},{"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\","},{"line":30,"text":" \"rollback_restored\": \"null\","},{"line":31,"text":" \"mutation_outcome\": \"UNKNOWN\","},{"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\","},{"line":37,"text":" errors=\"replace\","},{"line":38,"text":" ).splitlines()"},{"line":39,"text":" payloads = ["},{"line":40,"text":" line[len(marker):]"},{"line":41,"text":" for line in lines"},{"line":42,"text":" if line.startswith(marker)"},{"line":43,"text":" ]"},{"line":44,"text":" if len(payloads) == 1:"},{"line":45,"text":" try:"},{"line":46,"text":" document = json.loads(payloads[0])"},{"line":47,"text":" if not isinstance(document, dict):"},{"line":48,"text":" raise ValueError(\"contract root is not object\")"},{"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\")"},{"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\")"},{"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":" lines = Path(raw_path).read_bytes().decode(","match_line":35},{"context":[{"line":80,"text":" or rollback_started"},{"line":81,"text":" or command_rc != 2"},{"line":82,"text":" ):"},{"line":83,"text":" raise ValueError("},{"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:"},{"line":89,"text":" raise ValueError(\"FAIL contract inconsistent with rc\")"},{"line":90,"text":""},{"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:"},{"line":96,"text":" outcome = \"ROLLED_BACK\""},{"line":97,"text":" elif rollback_restored is False:"},{"line":98,"text":" outcome = \"ROLLBACK_FAILED\""},{"line":99,"text":" else:"},{"line":100,"text":" outcome = \"ROLLBACK_UNKNOWN\""},{"line":101,"text":""},{"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("},{"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"},{"line":112,"text":" else str(rollback_restored).lower()"},{"line":113,"text":" ),"},{"line":114,"text":" \"mutation_outcome\": outcome,"},{"line":115,"text":" \"error\": \"NONE\","},{"line":116,"text":" }"},{"line":117,"text":" except Exception as exc:"},{"line":118,"text":" result[\"error\"] = ("},{"line":119,"text":" \"INVALID_CONTRACT:\" + type(exc).__name__"},{"line":120,"text":" )"},{"line":121,"text":" elif len(payloads) > 1:"},{"line":122,"text":" result[\"error\"] = \"MULTIPLE_CONTRACTS\""},{"line":123,"text":""},{"line":124,"text":"print(\"\\t\".join(["},{"line":125,"text":" str(result[\"valid\"]).lower(),"},{"line":126,"text":" result[\"status\"],"}],"match":" outcome = \"ROLLBACK_FAILED\"","match_line":98},{"context":[{"line":182,"text":""},{"line":183,"text":"if [ \"${1:-}\" = '--self-test' ]; then"},{"line":184,"text":" runner_self_test"},{"line":185,"text":" exit 0"},{"line":186,"text":"fi"},{"line":187,"text":""},{"line":188,"text":"usage() {"},{"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:"},{"line":194,"text":" read-only"},{"line":195,"text":" verify"},{"line":196,"text":" change"},{"line":197,"text":" transport-test"},{"line":198,"text":""},{"line":199,"text":"Environment:"},{"line":200,"text":" HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command."},{"line":201,"text":" HOMELAB_TIMEOUT=SECONDS Optional command timeout."},{"line":202,"text":"USAGE"},{"line":203,"text":" exit 64"},{"line":204,"text":"}"},{"line":205,"text":""},{"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\""},{"line":211,"text":"shift 3"},{"line":212,"text":""},{"line":213,"text":"[ \"${1:-}\" = '--' ] || usage"},{"line":214,"text":"shift"},{"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'"},{"line":220,"text":" echo 'REASON=INVALID_COMMAND_ID'"},{"line":221,"text":" exit 65"},{"line":222,"text":" ;;"},{"line":223,"text":"esac"},{"line":224,"text":""},{"line":225,"text":"case \"$COMPONENT\" in"},{"line":226,"text":" ''|*[!A-Za-z0-9._-]*)"},{"line":227,"text":" echo 'RESULT=FAIL'"},{"line":228,"text":" echo 'REASON=INVALID_COMPONENT'"}],"match":" HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command.","match_line":200},{"context":[{"line":256,"text":" }"},{"line":257,"text":"done"},{"line":258,"text":""},{"line":259,"text":"REFERENCE=/etc/pve/31_HOMELAB_REFERENCE.md"},{"line":260,"text":"ERROR_REGISTER=/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md"},{"line":261,"text":""},{"line":262,"text":"[ -r \"$REFERENCE\" ] || {"},{"line":263,"text":" echo 'RESULT=FAIL'"},{"line":264,"text":" echo 'REASON=REFERENCE_NOT_READABLE'"},{"line":265,"text":" exit 69"},{"line":266,"text":"}"},{"line":267,"text":""},{"line":268,"text":"[ -r \"$ERROR_REGISTER\" ] || {"},{"line":269,"text":" echo 'RESULT=FAIL'"},{"line":270,"text":" echo 'REASON=ERROR_REGISTER_NOT_READABLE'"},{"line":271,"text":" exit 70"},{"line":272,"text":"}"},{"line":273,"text":""},{"line":274,"text":"STATE_DIR=/var/lib/homelab-chat-run"},{"line":275,"text":"RAW_DIR=\"$STATE_DIR/raw\""},{"line":276,"text":"PUBLIC_DIR=\"$STATE_DIR/public\""},{"line":277,"text":"LEDGER=\"$STATE_DIR/state/command-ledger.tsv\""},{"line":278,"text":"LOCK=\"$STATE_DIR/state/runner.lock\""},{"line":279,"text":""},{"line":280,"text":"mkdir -p \"$RAW_DIR\" \"$PUBLIC_DIR\" \"$(dirname \"$LEDGER\")\""},{"line":281,"text":"chmod 0700 \"$STATE_DIR\" \"$RAW_DIR\" \"$PUBLIC_DIR\" \"$(dirname \"$LEDGER\")\""},{"line":282,"text":"touch \"$LEDGER\""},{"line":283,"text":"chmod 0600 \"$LEDGER\""},{"line":284,"text":""},{"line":285,"text":"exec 9>\"$LOCK\""},{"line":286,"text":""},{"line":287,"text":"flock -w 60 9 || {"},{"line":288,"text":" echo 'RESULT=FAIL'"},{"line":289,"text":" echo 'REASON=RUNNER_LOCK_TIMEOUT'"},{"line":290,"text":" exit 71"},{"line":291,"text":"}"},{"line":292,"text":""},{"line":293,"text":"STARTED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\""},{"line":294,"text":"STAMP=\"$(date -u +%Y%m%dT%H%M%SZ)\""},{"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\""},{"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":"STATE_DIR=/var/lib/homelab-chat-run","match_line":274},{"context":[{"line":263,"text":" echo 'RESULT=FAIL'"},{"line":264,"text":" echo 'REASON=REFERENCE_NOT_READABLE'"},{"line":265,"text":" exit 69"},{"line":266,"text":"}"},{"line":267,"text":""},{"line":268,"text":"[ -r \"$ERROR_REGISTER\" ] || {"},{"line":269,"text":" echo 'RESULT=FAIL'"},{"line":270,"text":" echo 'REASON=ERROR_REGISTER_NOT_READABLE'"},{"line":271,"text":" exit 70"},{"line":272,"text":"}"},{"line":273,"text":""},{"line":274,"text":"STATE_DIR=/var/lib/homelab-chat-run"},{"line":275,"text":"RAW_DIR=\"$STATE_DIR/raw\""},{"line":276,"text":"PUBLIC_DIR=\"$STATE_DIR/public\""},{"line":277,"text":"LEDGER=\"$STATE_DIR/state/command-ledger.tsv\""},{"line":278,"text":"LOCK=\"$STATE_DIR/state/runner.lock\""},{"line":279,"text":""},{"line":280,"text":"mkdir -p \"$RAW_DIR\" \"$PUBLIC_DIR\" \"$(dirname \"$LEDGER\")\""},{"line":281,"text":"chmod 0700 \"$STATE_DIR\" \"$RAW_DIR\" \"$PUBLIC_DIR\" \"$(dirname \"$LEDGER\")\""},{"line":282,"text":"touch \"$LEDGER\""},{"line":283,"text":"chmod 0600 \"$LEDGER\""},{"line":284,"text":""},{"line":285,"text":"exec 9>\"$LOCK\""},{"line":286,"text":""},{"line":287,"text":"flock -w 60 9 || {"},{"line":288,"text":" echo 'RESULT=FAIL'"},{"line":289,"text":" echo 'REASON=RUNNER_LOCK_TIMEOUT'"},{"line":290,"text":" exit 71"},{"line":291,"text":"}"},{"line":292,"text":""},{"line":293,"text":"STARTED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\""},{"line":294,"text":"STAMP=\"$(date -u +%Y%m%dT%H%M%SZ)\""},{"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\""},{"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}')\""},{"line":303,"text":"ERROR_REGISTER_SHA256=\"$(sha256sum \"$ERROR_REGISTER\" | awk '{print $1}')\""},{"line":304,"text":""},{"line":305,"text":"COMMAND_SHA256=\"$("},{"line":306,"text":" {"},{"line":307,"text":" printf '%s\\0' \"$MODE\""},{"line":308,"text":" printf '%s\\0' \"$COMPONENT\""},{"line":309,"text":" printf '%s\\0' \"$@\""}],"match":"chmod 0700 \"$STATE_DIR\" \"$RAW_DIR\" \"$PUBLIC_DIR\" \"$(dirname \"$LEDGER\")\"","match_line":281},{"context":[{"line":287,"text":"flock -w 60 9 || {"},{"line":288,"text":" echo 'RESULT=FAIL'"},{"line":289,"text":" echo 'REASON=RUNNER_LOCK_TIMEOUT'"},{"line":290,"text":" exit 71"},{"line":291,"text":"}"},{"line":292,"text":""},{"line":293,"text":"STARTED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\""},{"line":294,"text":"STAMP=\"$(date -u +%Y%m%dT%H%M%SZ)\""},{"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\""},{"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}')\""},{"line":303,"text":"ERROR_REGISTER_SHA256=\"$(sha256sum \"$ERROR_REGISTER\" | awk '{print $1}')\""},{"line":304,"text":""},{"line":305,"text":"COMMAND_SHA256=\"$("},{"line":306,"text":" {"},{"line":307,"text":" printf '%s\\0' \"$MODE\""},{"line":308,"text":" printf '%s\\0' \"$COMPONENT\""},{"line":309,"text":" printf '%s\\0' \"$@\""},{"line":310,"text":" } |"},{"line":311,"text":" sha256sum |"},{"line":312,"text":" awk '{print $1}'"},{"line":313,"text":")\""},{"line":314,"text":""},{"line":315,"text":"PREVIOUS_FAILED_RC=\"$("},{"line":316,"text":" awk -F '\\t' -v hash=\"$COMMAND_SHA256\" '"},{"line":317,"text":" $3 == hash && $4 != \"0\" {"},{"line":318,"text":" value=$4"},{"line":319,"text":" }"},{"line":320,"text":""},{"line":321,"text":" END {"},{"line":322,"text":" print value"},{"line":323,"text":" }"},{"line":324,"text":" ' \"$LEDGER\""},{"line":325,"text":")\""},{"line":326,"text":""},{"line":327,"text":"RUN_STARTED=true"},{"line":328,"text":"REPEAT_BLOCKED=false"},{"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":"COMMAND_SHA256=\"$(","match_line":305},{"context":[{"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'"},{"line":338,"text":"COMMAND_RC=''"},{"line":339,"text":""},{"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"},{"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'"},{"line":349,"text":"fi"},{"line":350,"text":""},{"line":351,"text":"if [ -n \"$PREVIOUS_FAILED_RC\" ] &&"},{"line":352,"text":" [ \"${HOMELAB_ALLOW_REPEAT:-0}\" != 1 ]; then"},{"line":353,"text":""},{"line":354,"text":" RUN_STARTED=false"},{"line":355,"text":" REPEAT_BLOCKED=true"},{"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'"},{"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'"},{"line":366,"text":""},{"line":367,"text":" {"},{"line":368,"text":" echo 'COMMAND_EXECUTION_BLOCKED=yes'"},{"line":369,"text":" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'"},{"line":370,"text":" echo \"PREVIOUS_RC=$PREVIOUS_FAILED_RC\""},{"line":371,"text":" echo \"COMMAND_SHA256=$COMMAND_SHA256\""},{"line":372,"text":" echo"},{"line":373,"text":" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'"},{"line":374,"text":" } >\"$RAW_FILE\""},{"line":375,"text":"else"},{"line":376,"text":" set +e"},{"line":377,"text":""},{"line":378,"text":" if [ -n \"${HOMELAB_TIMEOUT:-}\" ]; then"},{"line":379,"text":" case \"$HOMELAB_TIMEOUT\" in"}],"match":"if [ -n \"$PREVIOUS_FAILED_RC\" ] &&","match_line":351},{"context":[{"line":351,"text":"if [ -n \"$PREVIOUS_FAILED_RC\" ] &&"},{"line":352,"text":" [ \"${HOMELAB_ALLOW_REPEAT:-0}\" != 1 ]; then"},{"line":353,"text":""},{"line":354,"text":" RUN_STARTED=false"},{"line":355,"text":" REPEAT_BLOCKED=true"},{"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'"},{"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'"},{"line":366,"text":""},{"line":367,"text":" {"},{"line":368,"text":" echo 'COMMAND_EXECUTION_BLOCKED=yes'"},{"line":369,"text":" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'"},{"line":370,"text":" echo \"PREVIOUS_RC=$PREVIOUS_FAILED_RC\""},{"line":371,"text":" echo \"COMMAND_SHA256=$COMMAND_SHA256\""},{"line":372,"text":" echo"},{"line":373,"text":" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'"},{"line":374,"text":" } >\"$RAW_FILE\""},{"line":375,"text":"else"},{"line":376,"text":" set +e"},{"line":377,"text":""},{"line":378,"text":" if [ -n \"${HOMELAB_TIMEOUT:-}\" ]; then"},{"line":379,"text":" case \"$HOMELAB_TIMEOUT\" in"},{"line":380,"text":" *[!0-9]*|'')"},{"line":381,"text":" echo 'RESULT=FAIL'"},{"line":382,"text":" echo 'REASON=INVALID_HOMELAB_TIMEOUT'"},{"line":383,"text":" exit 74"},{"line":384,"text":" ;;"},{"line":385,"text":" esac"},{"line":386,"text":""},{"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"},{"line":392,"text":" RC=$?"},{"line":393,"text":" else"},{"line":394,"text":" \"$@\" >\"$RAW_FILE\" 2>&1"},{"line":395,"text":" RC=$?"},{"line":396,"text":" fi"},{"line":397,"text":""}],"match":" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'","match_line":369},{"context":[{"line":373,"text":" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'"},{"line":374,"text":" } >\"$RAW_FILE\""},{"line":375,"text":"else"},{"line":376,"text":" set +e"},{"line":377,"text":""},{"line":378,"text":" if [ -n \"${HOMELAB_TIMEOUT:-}\" ]; then"},{"line":379,"text":" case \"$HOMELAB_TIMEOUT\" in"},{"line":380,"text":" *[!0-9]*|'')"},{"line":381,"text":" echo 'RESULT=FAIL'"},{"line":382,"text":" echo 'REASON=INVALID_HOMELAB_TIMEOUT'"},{"line":383,"text":" exit 74"},{"line":384,"text":" ;;"},{"line":385,"text":" esac"},{"line":386,"text":""},{"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"},{"line":392,"text":" RC=$?"},{"line":393,"text":" else"},{"line":394,"text":" \"$@\" >\"$RAW_FILE\" 2>&1"},{"line":395,"text":" RC=$?"},{"line":396,"text":" fi"},{"line":397,"text":""},{"line":398,"text":" set -e"},{"line":399,"text":""},{"line":400,"text":" COMMAND_RC=\"$RC\""},{"line":401,"text":""},{"line":402,"text":" if [ \"$RC\" -eq 0 ]; then"},{"line":403,"text":" STATUS='OK'"},{"line":404,"text":" else"},{"line":405,"text":" STATUS='FAIL'"},{"line":406,"text":" fi"},{"line":407,"text":""},{"line":408,"text":" IFS=$'\\t' read -r \\"},{"line":409,"text":" RESULT_CONTRACT_VALID \\"},{"line":410,"text":" CONTRACT_STATUS \\"},{"line":411,"text":" CHANGES_MADE \\"},{"line":412,"text":" ROLLBACK_STARTED \\"},{"line":413,"text":" ROLLBACK_RESTORED \\"},{"line":414,"text":" MUTATION_OUTCOME \\"},{"line":415,"text":" RESULT_CONTRACT_ERROR < <("},{"line":416,"text":" read_mutation_contract \\"},{"line":417,"text":" \"$RAW_FILE\" \\"},{"line":418,"text":" \"$COMMAND_ID\" \\"},{"line":419,"text":" \"$MODE\" \\"}],"match":" \"$@\" >\"$RAW_FILE\" 2>&1","match_line":391},{"context":[{"line":399,"text":""},{"line":400,"text":" COMMAND_RC=\"$RC\""},{"line":401,"text":""},{"line":402,"text":" if [ \"$RC\" -eq 0 ]; then"},{"line":403,"text":" STATUS='OK'"},{"line":404,"text":" else"},{"line":405,"text":" STATUS='FAIL'"},{"line":406,"text":" fi"},{"line":407,"text":""},{"line":408,"text":" IFS=$'\\t' read -r \\"},{"line":409,"text":" RESULT_CONTRACT_VALID \\"},{"line":410,"text":" CONTRACT_STATUS \\"},{"line":411,"text":" CHANGES_MADE \\"},{"line":412,"text":" ROLLBACK_STARTED \\"},{"line":413,"text":" ROLLBACK_RESTORED \\"},{"line":414,"text":" MUTATION_OUTCOME \\"},{"line":415,"text":" RESULT_CONTRACT_ERROR < <("},{"line":416,"text":" read_mutation_contract \\"},{"line":417,"text":" \"$RAW_FILE\" \\"},{"line":418,"text":" \"$COMMAND_ID\" \\"},{"line":419,"text":" \"$MODE\" \\"},{"line":420,"text":" \"$COMMAND_RC\""},{"line":421,"text":" )"},{"line":422,"text":""},{"line":423,"text":" if [ \"$MODE\" = change ]; then"},{"line":424,"text":" if [ \"$RESULT_CONTRACT_VALID\" != true ]; then"},{"line":425,"text":" RC=76"},{"line":426,"text":" STATUS='FAIL'"},{"line":427,"text":" else"},{"line":428,"text":" STATUS=\"$CONTRACT_STATUS\""},{"line":429,"text":" fi"},{"line":430,"text":" fi"},{"line":431,"text":"fi"},{"line":432,"text":""},{"line":433,"text":"FINISHED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\""},{"line":434,"text":"RAW_SHA256=\"$(sha256sum \"$RAW_FILE\" | awk '{print $1}')\""},{"line":435,"text":""},{"line":436,"text":"python3 - \"$RAW_FILE\" \"$SANITIZED_FILE\" <<'PY'"},{"line":437,"text":"import re"},{"line":438,"text":"import sys"},{"line":439,"text":"from pathlib import Path"},{"line":440,"text":""},{"line":441,"text":"source = Path(sys.argv[1])"},{"line":442,"text":"target = Path(sys.argv[2])"},{"line":443,"text":""},{"line":444,"text":"text = source.read_bytes().decode(\"utf-8\", errors=\"replace\")"},{"line":445,"text":""}],"match":" \"$RAW_FILE\" \\","match_line":417},{"context":[{"line":416,"text":" read_mutation_contract \\"},{"line":417,"text":" \"$RAW_FILE\" \\"},{"line":418,"text":" \"$COMMAND_ID\" \\"},{"line":419,"text":" \"$MODE\" \\"},{"line":420,"text":" \"$COMMAND_RC\""},{"line":421,"text":" )"},{"line":422,"text":""},{"line":423,"text":" if [ \"$MODE\" = change ]; then"},{"line":424,"text":" if [ \"$RESULT_CONTRACT_VALID\" != true ]; then"},{"line":425,"text":" RC=76"},{"line":426,"text":" STATUS='FAIL'"},{"line":427,"text":" else"},{"line":428,"text":" STATUS=\"$CONTRACT_STATUS\""},{"line":429,"text":" fi"},{"line":430,"text":" fi"},{"line":431,"text":"fi"},{"line":432,"text":""},{"line":433,"text":"FINISHED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\""},{"line":434,"text":"RAW_SHA256=\"$(sha256sum \"$RAW_FILE\" | awk '{print $1}')\""},{"line":435,"text":""},{"line":436,"text":"python3 - \"$RAW_FILE\" \"$SANITIZED_FILE\" <<'PY'"},{"line":437,"text":"import re"},{"line":438,"text":"import sys"},{"line":439,"text":"from pathlib import Path"},{"line":440,"text":""},{"line":441,"text":"source = Path(sys.argv[1])"},{"line":442,"text":"target = Path(sys.argv[2])"},{"line":443,"text":""},{"line":444,"text":"text = source.read_bytes().decode(\"utf-8\", errors=\"replace\")"},{"line":445,"text":""},{"line":446,"text":"patterns = ["},{"line":447,"text":" ("},{"line":448,"text":" re.compile("},{"line":449,"text":" r\"-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----\""},{"line":450,"text":" r\".*?\""},{"line":451,"text":" r\"-----END (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----\","},{"line":452,"text":" re.IGNORECASE | re.DOTALL,"},{"line":453,"text":" ),"},{"line":454,"text":" \"[PRIVATE_KEY_REDACTED]\","},{"line":455,"text":" ),"},{"line":456,"text":" ("},{"line":457,"text":" re.compile("},{"line":458,"text":" r\"(?im)^(\\s*(?:password|passwd|passphrase|authorization|\""},{"line":459,"text":" r\"api[_-]?key|access[_-]?token|refresh[_-]?token|\""},{"line":460,"text":" r\"private[_-]?key|secret)\\s*[:=]\\s*).*$\""},{"line":461,"text":" ),"},{"line":462,"text":" r\"\\1[REDACTED]\","}],"match":"RAW_SHA256=\"$(sha256sum \"$RAW_FILE\" | awk '{print $1}')\"","match_line":434},{"context":[{"line":512,"text":""},{"line":513,"text":"text = \"\".join("},{"line":514,"text":" char"},{"line":515,"text":" for char in text"},{"line":516,"text":" if char in \"\\n\\r\\t\" or ord(char) >= 32"},{"line":517,"text":")"},{"line":518,"text":""},{"line":519,"text":"encoded = text.encode(\"utf-8\")"},{"line":520,"text":""},{"line":521,"text":"maximum = 900_000"},{"line":522,"text":""},{"line":523,"text":"if len(encoded) > maximum:"},{"line":524,"text":" first = encoded[:440_000].decode(\"utf-8\", errors=\"ignore\")"},{"line":525,"text":" last = encoded[-440_000:].decode(\"utf-8\", errors=\"ignore\")"},{"line":526,"text":""},{"line":527,"text":" text = ("},{"line":528,"text":" first"},{"line":529,"text":" + \"\\n\\n\""},{"line":530,"text":" + \"===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====\""},{"line":531,"text":" + \"\\n\\n\""},{"line":532,"text":" + last"},{"line":533,"text":" )"},{"line":534,"text":""},{"line":535,"text":"target.write_text(text, encoding=\"utf-8\")"},{"line":536,"text":"PY"},{"line":537,"text":""},{"line":538,"text":"SANITIZED_SHA256=\"$("},{"line":539,"text":" sha256sum \"$SANITIZED_FILE\" |"},{"line":540,"text":" awk '{print $1}'"},{"line":541,"text":")\""},{"line":542,"text":""},{"line":543,"text":"python3 - \\"},{"line":544,"text":" \"$JSON_FILE\" \\"},{"line":545,"text":" \"$SANITIZED_FILE\" \\"},{"line":546,"text":" \"$COMMAND_ID\" \\"},{"line":547,"text":" \"$STATUS\" \\"},{"line":548,"text":" \"$RC\" \\"},{"line":549,"text":" \"$HOST_SHORT\" \\"},{"line":550,"text":" \"$MODE\" \\"},{"line":551,"text":" \"$COMPONENT\" \\"},{"line":552,"text":" \"$STARTED_AT\" \\"},{"line":553,"text":" \"$FINISHED_AT\" \\"},{"line":554,"text":" \"$REFERENCE_SHA256\" \\"},{"line":555,"text":" \"$ERROR_REGISTER_SHA256\" \\"},{"line":556,"text":" \"$COMMAND_SHA256\" \\"},{"line":557,"text":" \"$RAW_SHA256\" \\"},{"line":558,"text":" \"$SANITIZED_SHA256\" \\"}],"match":" + \"===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====\"","match_line":530},{"context":[{"line":538,"text":"SANITIZED_SHA256=\"$("},{"line":539,"text":" sha256sum \"$SANITIZED_FILE\" |"},{"line":540,"text":" awk '{print $1}'"},{"line":541,"text":")\""},{"line":542,"text":""},{"line":543,"text":"python3 - \\"},{"line":544,"text":" \"$JSON_FILE\" \\"},{"line":545,"text":" \"$SANITIZED_FILE\" \\"},{"line":546,"text":" \"$COMMAND_ID\" \\"},{"line":547,"text":" \"$STATUS\" \\"},{"line":548,"text":" \"$RC\" \\"},{"line":549,"text":" \"$HOST_SHORT\" \\"},{"line":550,"text":" \"$MODE\" \\"},{"line":551,"text":" \"$COMPONENT\" \\"},{"line":552,"text":" \"$STARTED_AT\" \\"},{"line":553,"text":" \"$FINISHED_AT\" \\"},{"line":554,"text":" \"$REFERENCE_SHA256\" \\"},{"line":555,"text":" \"$ERROR_REGISTER_SHA256\" \\"},{"line":556,"text":" \"$COMMAND_SHA256\" \\"},{"line":557,"text":" \"$RAW_SHA256\" \\"},{"line":558,"text":" \"$SANITIZED_SHA256\" \\"},{"line":559,"text":" \"$RUN_STARTED\" \\"},{"line":560,"text":" \"$REPEAT_BLOCKED\" \\"},{"line":561,"text":" \"$BLOCK_REASON\" \\"},{"line":562,"text":" \"$CHANGE_DECLARED\" \\"},{"line":563,"text":" \"$RESULT_CONTRACT_VALID\" \\"},{"line":564,"text":" \"$CONTRACT_STATUS\" \\"},{"line":565,"text":" \"$CHANGES_MADE\" \\"},{"line":566,"text":" \"$ROLLBACK_STARTED\" \\"},{"line":567,"text":" \"$ROLLBACK_RESTORED\" \\"},{"line":568,"text":" \"$MUTATION_OUTCOME\" \\"},{"line":569,"text":" \"$RESULT_CONTRACT_ERROR\" \\"},{"line":570,"text":" \"$COMMAND_RC\" <<'PY'"},{"line":571,"text":"import json"},{"line":572,"text":"import sys"},{"line":573,"text":"from pathlib import Path"},{"line":574,"text":""},{"line":575,"text":"("},{"line":576,"text":" json_path,"},{"line":577,"text":" output_path,"},{"line":578,"text":" command_id,"},{"line":579,"text":" status,"},{"line":580,"text":" rc,"},{"line":581,"text":" host,"},{"line":582,"text":" mode,"},{"line":583,"text":" component,"},{"line":584,"text":" started,"}],"match":" \"$COMMAND_SHA256\" \\","match_line":556},{"context":[{"line":570,"text":" \"$COMMAND_RC\" <<'PY'"},{"line":571,"text":"import json"},{"line":572,"text":"import sys"},{"line":573,"text":"from pathlib import Path"},{"line":574,"text":""},{"line":575,"text":"("},{"line":576,"text":" json_path,"},{"line":577,"text":" output_path,"},{"line":578,"text":" command_id,"},{"line":579,"text":" status,"},{"line":580,"text":" rc,"},{"line":581,"text":" host,"},{"line":582,"text":" mode,"},{"line":583,"text":" component,"},{"line":584,"text":" started,"},{"line":585,"text":" finished,"},{"line":586,"text":" reference_sha,"},{"line":587,"text":" error_sha,"},{"line":588,"text":" command_sha,"},{"line":589,"text":" raw_sha,"},{"line":590,"text":" sanitized_sha,"},{"line":591,"text":" run_started,"},{"line":592,"text":" repeat_blocked,"},{"line":593,"text":" block_reason,"},{"line":594,"text":" change_declared,"},{"line":595,"text":" result_contract_valid,"},{"line":596,"text":" contract_status,"},{"line":597,"text":" changes_made,"},{"line":598,"text":" rollback_started,"},{"line":599,"text":" rollback_restored,"},{"line":600,"text":" mutation_outcome,"},{"line":601,"text":" result_contract_error,"},{"line":602,"text":" command_rc,"},{"line":603,"text":") = sys.argv[1:]"},{"line":604,"text":""},{"line":605,"text":""},{"line":606,"text":"def optional_bool(value: str):"},{"line":607,"text":" if value == \"true\":"},{"line":608,"text":" return True"},{"line":609,"text":" if value == \"false\":"},{"line":610,"text":" return False"},{"line":611,"text":" return None"},{"line":612,"text":""},{"line":613,"text":"output = Path(output_path).read_text("},{"line":614,"text":" encoding=\"utf-8\","},{"line":615,"text":" errors=\"replace\","},{"line":616,"text":")"}],"match":" command_sha,","match_line":588},{"context":[{"line":627,"text":"else:"},{"line":628,"text":" output_preview = output"},{"line":629,"text":""},{"line":630,"text":"document = {"},{"line":631,"text":" \"schema_version\": 1,"},{"line":632,"text":" \"channel\": \"homelab-runtime\","},{"line":633,"text":" \"command_id\": command_id,"},{"line":634,"text":" \"status\": status,"},{"line":635,"text":" \"rc\": int(rc),"},{"line":636,"text":" \"host\": host,"},{"line":637,"text":" \"mode\": mode,"},{"line":638,"text":" \"component\": component,"},{"line":639,"text":" \"started_at_utc\": started,"},{"line":640,"text":" \"finished_at_utc\": finished,"},{"line":641,"text":" \"reference_register_checked\": True,"},{"line":642,"text":" \"reference_sha256\": reference_sha,"},{"line":643,"text":" \"error_register_checked\": True,"},{"line":644,"text":" \"error_register_sha256\": error_sha,"},{"line":645,"text":" \"command_sha256\": command_sha,"},{"line":646,"text":" \"duplicate_failed_command_blocked\": repeat_blocked == \"true\","},{"line":647,"text":" \"block_reason\": block_reason or None,"},{"line":648,"text":" \"execution_started\": run_started == \"true\","},{"line":649,"text":" \"change_declared\": change_declared == \"true\","},{"line":650,"text":" \"result_contract_valid\": result_contract_valid == \"true\","},{"line":651,"text":" \"result_contract_status\": ("},{"line":652,"text":" None"},{"line":653,"text":" if contract_status in {\"\", \"UNKNOWN\", \"NOT_APPLICABLE\"}"},{"line":654,"text":" else contract_status"},{"line":655,"text":" ),"},{"line":656,"text":" \"result_contract_error\": ("},{"line":657,"text":" None"},{"line":658,"text":" if result_contract_error == \"NONE\""},{"line":659,"text":" else result_contract_error"},{"line":660,"text":" ),"},{"line":661,"text":" \"command_rc\": int(command_rc) if command_rc else None,"},{"line":662,"text":" \"changes_made\": optional_bool(changes_made),"},{"line":663,"text":" \"rollback_started\": optional_bool(rollback_started),"},{"line":664,"text":" \"rollback_restored\": optional_bool(rollback_restored),"},{"line":665,"text":" \"mutation_outcome\": mutation_outcome,"},{"line":666,"text":" \"sanitized\": True,"},{"line":667,"text":" \"secrets_included\": False,"},{"line":668,"text":" \"private_addresses_included\": False,"},{"line":669,"text":" \"raw_evidence_retained_locally\": True,"},{"line":670,"text":" \"raw_evidence_sha256\": raw_sha,"},{"line":671,"text":" \"sanitized_output_sha256\": sanitized_sha,"},{"line":672,"text":" \"output_truncated_in_json\": output_truncated,"},{"line":673,"text":" \"full_sanitized_output_url\": ("}],"match":" \"command_sha256\": command_sha,","match_line":645},{"context":[{"line":651,"text":" \"result_contract_status\": ("},{"line":652,"text":" None"},{"line":653,"text":" if contract_status in {\"\", \"UNKNOWN\", \"NOT_APPLICABLE\"}"},{"line":654,"text":" else contract_status"},{"line":655,"text":" ),"},{"line":656,"text":" \"result_contract_error\": ("},{"line":657,"text":" None"},{"line":658,"text":" if result_contract_error == \"NONE\""},{"line":659,"text":" else result_contract_error"},{"line":660,"text":" ),"},{"line":661,"text":" \"command_rc\": int(command_rc) if command_rc else None,"},{"line":662,"text":" \"changes_made\": optional_bool(changes_made),"},{"line":663,"text":" \"rollback_started\": optional_bool(rollback_started),"},{"line":664,"text":" \"rollback_restored\": optional_bool(rollback_restored),"},{"line":665,"text":" \"mutation_outcome\": mutation_outcome,"},{"line":666,"text":" \"sanitized\": True,"},{"line":667,"text":" \"secrets_included\": False,"},{"line":668,"text":" \"private_addresses_included\": False,"},{"line":669,"text":" \"raw_evidence_retained_locally\": True,"},{"line":670,"text":" \"raw_evidence_sha256\": raw_sha,"},{"line":671,"text":" \"sanitized_output_sha256\": sanitized_sha,"},{"line":672,"text":" \"output_truncated_in_json\": output_truncated,"},{"line":673,"text":" \"full_sanitized_output_url\": ("},{"line":674,"text":" \"https://git.gram1.ru/.well-known/\""},{"line":675,"text":" \"homelab-runtime/latest.txt\""},{"line":676,"text":" ),"},{"line":677,"text":" \"output\": output_preview,"},{"line":678,"text":"}"},{"line":679,"text":""},{"line":680,"text":"Path(json_path).write_text("},{"line":681,"text":" json.dumps("},{"line":682,"text":" document,"},{"line":683,"text":" ensure_ascii=False,"},{"line":684,"text":" indent=2,"},{"line":685,"text":" )"},{"line":686,"text":" + \"\\n\","},{"line":687,"text":" encoding=\"utf-8\","},{"line":688,"text":")"},{"line":689,"text":"PY"},{"line":690,"text":""},{"line":691,"text":"{"},{"line":692,"text":" echo 'CHAT_OUTPUT_BEGIN'"},{"line":693,"text":" echo \"COMMAND_ID=$COMMAND_ID\""},{"line":694,"text":" echo \"STATUS=$STATUS\""},{"line":695,"text":" echo \"RC=$RC\""},{"line":696,"text":" echo \"HOST=$HOST_SHORT\""},{"line":697,"text":" echo \"MODE=$MODE\""}],"match":" \"raw_evidence_retained_locally\": True,","match_line":669},{"context":[{"line":685,"text":" )"},{"line":686,"text":" + \"\\n\","},{"line":687,"text":" encoding=\"utf-8\","},{"line":688,"text":")"},{"line":689,"text":"PY"},{"line":690,"text":""},{"line":691,"text":"{"},{"line":692,"text":" echo 'CHAT_OUTPUT_BEGIN'"},{"line":693,"text":" echo \"COMMAND_ID=$COMMAND_ID\""},{"line":694,"text":" echo \"STATUS=$STATUS\""},{"line":695,"text":" echo \"RC=$RC\""},{"line":696,"text":" echo \"HOST=$HOST_SHORT\""},{"line":697,"text":" echo \"MODE=$MODE\""},{"line":698,"text":" echo \"COMPONENT=$COMPONENT\""},{"line":699,"text":" echo 'REFERENCE_REGISTER_CHECK=OK'"},{"line":700,"text":" echo \"REFERENCE_SHA256=$REFERENCE_SHA256\""},{"line":701,"text":" echo 'ERROR_REGISTER_CHECK=OK'"},{"line":702,"text":" echo \"ERROR_REGISTER_SHA256=$ERROR_REGISTER_SHA256\""},{"line":703,"text":" echo \"COMMAND_SHA256=$COMMAND_SHA256\""},{"line":704,"text":" echo \"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\""},{"line":705,"text":" echo \"EXECUTION_STARTED=$RUN_STARTED\""},{"line":706,"text":" echo \"CHANGE_DECLARED=$CHANGE_DECLARED\""},{"line":707,"text":" echo \"RESULT_CONTRACT_VALID=$RESULT_CONTRACT_VALID\""},{"line":708,"text":" echo \"RESULT_CONTRACT_STATUS=$CONTRACT_STATUS\""},{"line":709,"text":" echo \"RESULT_CONTRACT_ERROR=$RESULT_CONTRACT_ERROR\""},{"line":710,"text":" echo \"COMMAND_RC=${COMMAND_RC:-}\""},{"line":711,"text":" echo \"CHANGES_MADE=$CHANGES_MADE\""},{"line":712,"text":" echo \"ROLLBACK_STARTED=$ROLLBACK_STARTED\""},{"line":713,"text":" echo \"ROLLBACK_RESTORED=$ROLLBACK_RESTORED\""},{"line":714,"text":" echo \"MUTATION_OUTCOME=$MUTATION_OUTCOME\""},{"line":715,"text":" echo 'SANITIZED=yes'"},{"line":716,"text":" echo 'SECRETS_INCLUDED=no'"},{"line":717,"text":" echo 'PRIVATE_ADDRESSES_INCLUDED=no'"},{"line":718,"text":" echo \"RAW_EVIDENCE_SHA256=$RAW_SHA256\""},{"line":719,"text":" echo \"SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256\""},{"line":720,"text":" echo 'OUTPUT_BEGIN'"},{"line":721,"text":" cat \"$SANITIZED_FILE\""},{"line":722,"text":" echo"},{"line":723,"text":" echo 'OUTPUT_END'"},{"line":724,"text":" echo 'CHAT_OUTPUT_END'"},{"line":725,"text":"} >\"$TXT_FILE\""},{"line":726,"text":""},{"line":727,"text":"chmod 0600 \\"},{"line":728,"text":" \"$RAW_FILE\" \\"},{"line":729,"text":" \"$SANITIZED_FILE\" \\"},{"line":730,"text":" \"$JSON_FILE\" \\"},{"line":731,"text":" \"$TXT_FILE\""}],"match":" echo \"COMMAND_SHA256=$COMMAND_SHA256\"","match_line":703},{"context":[{"line":710,"text":" echo \"COMMAND_RC=${COMMAND_RC:-}\""},{"line":711,"text":" echo \"CHANGES_MADE=$CHANGES_MADE\""},{"line":712,"text":" echo \"ROLLBACK_STARTED=$ROLLBACK_STARTED\""},{"line":713,"text":" echo \"ROLLBACK_RESTORED=$ROLLBACK_RESTORED\""},{"line":714,"text":" echo \"MUTATION_OUTCOME=$MUTATION_OUTCOME\""},{"line":715,"text":" echo 'SANITIZED=yes'"},{"line":716,"text":" echo 'SECRETS_INCLUDED=no'"},{"line":717,"text":" echo 'PRIVATE_ADDRESSES_INCLUDED=no'"},{"line":718,"text":" echo \"RAW_EVIDENCE_SHA256=$RAW_SHA256\""},{"line":719,"text":" echo \"SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256\""},{"line":720,"text":" echo 'OUTPUT_BEGIN'"},{"line":721,"text":" cat \"$SANITIZED_FILE\""},{"line":722,"text":" echo"},{"line":723,"text":" echo 'OUTPUT_END'"},{"line":724,"text":" echo 'CHAT_OUTPUT_END'"},{"line":725,"text":"} >\"$TXT_FILE\""},{"line":726,"text":""},{"line":727,"text":"chmod 0600 \\"},{"line":728,"text":" \"$RAW_FILE\" \\"},{"line":729,"text":" \"$SANITIZED_FILE\" \\"},{"line":730,"text":" \"$JSON_FILE\" \\"},{"line":731,"text":" \"$TXT_FILE\""},{"line":732,"text":""},{"line":733,"text":"TARGET=debian@[PRIVATE_IP]"},{"line":734,"text":"REMOTE_PREFIX=\"/tmp/homelab-runtime-${COMMAND_ID}-$$\""},{"line":735,"text":""},{"line":736,"text":"SSH_OPTS=("},{"line":737,"text":" -o BatchMode=yes"},{"line":738,"text":" -o ConnectTimeout=10"},{"line":739,"text":" -o ConnectionAttempts=1"},{"line":740,"text":" -o StrictHostKeyChecking=yes"},{"line":741,"text":" -o UserKnownHostsFile=[SENSITIVE_PATH] \\"},{"line":745,"text":" -q \\"},{"line":746,"text":" \"${SSH_OPTS[@]}\" \\"},{"line":747,"text":" \"$JSON_FILE\" \\"},{"line":748,"text":" \"${TARGET}:${REMOTE_PREFIX}.json\""},{"line":749,"text":""},{"line":750,"text":"scp \\"},{"line":751,"text":" -q \\"},{"line":752,"text":" \"${SSH_OPTS[@]}\" \\"},{"line":753,"text":" \"$TXT_FILE\" \\"},{"line":754,"text":" \"${TARGET}:${REMOTE_PREFIX}.txt\""},{"line":755,"text":""},{"line":756,"text":"ssh \"${SSH_OPTS[@]}\" \"$TARGET\" \""}],"match":" \"$RAW_FILE\" \\","match_line":728},{"context":[{"line":779,"text":" --max-time 15 \\"},{"line":780,"text":" \"$PUBLIC_URL\" 2>/dev/null ||"},{"line":781,"text":" true"},{"line":782,"text":" )\""},{"line":783,"text":""},{"line":784,"text":" if printf '%s\\n' \"$CONTENT\" |"},{"line":785,"text":" grep -Fq \"\\\"command_id\\\": \\\"$COMMAND_ID\\\"\"; then"},{"line":786,"text":" PUBLIC_VISIBLE=true"},{"line":787,"text":" break"},{"line":788,"text":" fi"},{"line":789,"text":""},{"line":790,"text":" sleep 2"},{"line":791,"text":"done"},{"line":792,"text":""},{"line":793,"text":"if [ \"$PUBLIC_VISIBLE\" != true ]; then"},{"line":794,"text":" echo 'RESULT=FAIL'"},{"line":795,"text":" echo 'REASON=PUBLIC_RUNTIME_RESULT_NOT_VISIBLE'"},{"line":796,"text":" echo \"COMMAND_ID=$COMMAND_ID\""},{"line":797,"text":" echo \"LOCAL_RAW_FILE=$RAW_FILE\""},{"line":798,"text":" exit 75"},{"line":799,"text":"fi"},{"line":800,"text":""},{"line":801,"text":"printf '%s\\t%s\\t%s\\t%s\\t%s\\t%s\\n' \\"},{"line":802,"text":" \"$FINISHED_AT\" \\"},{"line":803,"text":" \"$COMMAND_ID\" \\"},{"line":804,"text":" \"$COMMAND_SHA256\" \\"},{"line":805,"text":" \"$RC\" \\"},{"line":806,"text":" \"$STATUS\" \\"},{"line":807,"text":" \"$COMPONENT\" >>\"$LEDGER\""},{"line":808,"text":""},{"line":809,"text":"echo"},{"line":810,"text":"echo '===== HOMELAB CHAT RUN COMPLETE ====='"},{"line":811,"text":"echo \"COMMAND_ID=$COMMAND_ID\""},{"line":812,"text":"echo \"STATUS=$STATUS\""},{"line":813,"text":"echo \"RC=$RC\""},{"line":814,"text":"echo 'REFERENCE_REGISTER_CHECK=OK'"},{"line":815,"text":"echo 'ERROR_REGISTER_CHECK=OK'"},{"line":816,"text":"echo \"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\""},{"line":817,"text":"echo 'GITEA_PUBLICATION=OK'"},{"line":818,"text":"echo \"PUBLIC_URL=$PUBLIC_URL\""},{"line":819,"text":"echo \"LOCAL_RAW_FILE=$RAW_FILE\""},{"line":820,"text":"echo 'SHELL_SESSION_PRESERVED=yes'"},{"line":821,"text":""},{"line":822,"text":"exit \"$RC\""}],"match":" echo \"LOCAL_RAW_FILE=$RAW_FILE\"","match_line":797},{"context":[{"line":786,"text":" PUBLIC_VISIBLE=true"},{"line":787,"text":" break"},{"line":788,"text":" fi"},{"line":789,"text":""},{"line":790,"text":" sleep 2"},{"line":791,"text":"done"},{"line":792,"text":""},{"line":793,"text":"if [ \"$PUBLIC_VISIBLE\" != true ]; then"},{"line":794,"text":" echo 'RESULT=FAIL'"},{"line":795,"text":" echo 'REASON=PUBLIC_RUNTIME_RESULT_NOT_VISIBLE'"},{"line":796,"text":" echo \"COMMAND_ID=$COMMAND_ID\""},{"line":797,"text":" echo \"LOCAL_RAW_FILE=$RAW_FILE\""},{"line":798,"text":" exit 75"},{"line":799,"text":"fi"},{"line":800,"text":""},{"line":801,"text":"printf '%s\\t%s\\t%s\\t%s\\t%s\\t%s\\n' \\"},{"line":802,"text":" \"$FINISHED_AT\" \\"},{"line":803,"text":" \"$COMMAND_ID\" \\"},{"line":804,"text":" \"$COMMAND_SHA256\" \\"},{"line":805,"text":" \"$RC\" \\"},{"line":806,"text":" \"$STATUS\" \\"},{"line":807,"text":" \"$COMPONENT\" >>\"$LEDGER\""},{"line":808,"text":""},{"line":809,"text":"echo"},{"line":810,"text":"echo '===== HOMELAB CHAT RUN COMPLETE ====='"},{"line":811,"text":"echo \"COMMAND_ID=$COMMAND_ID\""},{"line":812,"text":"echo \"STATUS=$STATUS\""},{"line":813,"text":"echo \"RC=$RC\""},{"line":814,"text":"echo 'REFERENCE_REGISTER_CHECK=OK'"},{"line":815,"text":"echo 'ERROR_REGISTER_CHECK=OK'"},{"line":816,"text":"echo \"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\""},{"line":817,"text":"echo 'GITEA_PUBLICATION=OK'"},{"line":818,"text":"echo \"PUBLIC_URL=$PUBLIC_URL\""},{"line":819,"text":"echo \"LOCAL_RAW_FILE=$RAW_FILE\""},{"line":820,"text":"echo 'SHELL_SESSION_PRESERVED=yes'"},{"line":821,"text":""},{"line":822,"text":"exit \"$RC\""}],"match":" \"$COMMAND_SHA256\" \\","match_line":804}],"sha256":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d"} +RUNNER_CANDIDATE_ROOTS=["/etc/pve/31_HOMELAB_REFERENCE.md","/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md","/var/lib/homelab-chat-run","/var/log/homelab"] +TARGET_SHA_SEARCH=[{"files":[],"rc":1,"root":"/etc/pve/31_HOMELAB_REFERENCE.md","stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"files":[],"rc":1,"root":"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md","stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"files":["/var/lib/homelab-chat-run/state/command-ledger.tsv","/var/lib/homelab-chat-run/raw/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.log","/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.txt","/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171441Z.json","/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.json","/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171441Z-latest.txt","/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z-latest.txt"],"rc":0,"root":"/var/lib/homelab-chat-run","stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"files":[],"rc":1,"root":"/var/log/homelab","stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}] +RCA_ERROR_CLASS=TimeoutExpired +RCA_ERROR_SHA256=47027a3fd2fcca9dbfcae4c4ea66f79d2512e2d04aa00889dc8893508b183cc9 +NO_MUTATION=True +TASK_RESULT=PVEPRO_HOMEPAGE_PORTAL_789_RUNNER_DUPLICATE_RCA_FAILED +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1","rollback_restored":null,"rollback_started":false,"status":"FAIL","version":1} + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index c2727691..8b5b08c0 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "NEWFI-260920-NEWFDOM-MESSENGERS214-QGA270", - "status": "OK", - "rc": 0, + "command_id": "SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1", + "status": "FAIL", + "rc": 3, "host": "pve01", "mode": "read-only", - "component": "newfi-messengers214-qga270-transport-reconcile-readonly", - "started_at_utc": "2026-09-20T17:17:26Z", - "finished_at_utc": "2026-09-20T17:17:29Z", + "component": "pvepro-homepage-portal-789-runner-duplicate-rca-readonly", + "started_at_utc": "2026-09-20T17:20:56Z", + "finished_at_utc": "2026-09-20T17:22:34Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "16d0d62c324c90b9a1b9d5ee0151a56f8374c1b81c3f976c1de8f2d29d3f2344", + "command_sha256": "a38301defa26ee67a8bb0dc8227f645b6dcaccada08b26232bc8216c628fd1ef", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, @@ -21,7 +21,7 @@ "result_contract_valid": true, "result_contract_status": null, "result_contract_error": null, - "command_rc": 0, + "command_rc": 3, "changes_made": false, "rollback_started": false, "rollback_restored": null, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "82425ee7d922d1b0e7167bf7a5b0f86a3723944236f533d41326dcbdbfee195c", - "sanitized_output_sha256": "82425ee7d922d1b0e7167bf7a5b0f86a3723944236f533d41326dcbdbfee195c", + "raw_evidence_sha256": "7038052a6bbf990f44df906709727240385ac1cc38588e070b544977c2209965", + "sanitized_output_sha256": "0b8d0544ef9d63aa9d2130266a604f965e250bebcbbc626ad09fca81ecdcbb8b", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "NEWFI270_BEGIN=true\nCOMMAND_ID=NEWFI-260920-NEWFDOM-MESSENGERS214-QGA270\nMODE=read-only\nCHANGES_MADE=false\nMUTATION_OUTCOME=NO_MUTATION\nIMMUTABLE_PLAN_CHECK=PASS\nERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\nREFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\nAUTHORITY_SHA_MATCH=true\nPRODUCTION_VM_STATUS_RC=0\nPRODUCTION_VM_STATE=RUNNING\nPRODUCTION_VM_STATUS_ERR_CLASS=NONE\nPRODUCTION_VM_STATUS_ERR_SHA256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nSTAGING_VM_STATUS_OUTER_RC=0\nSTAGING_VM_STATE=RUNNING\nSTAGING_VM_STATUS_ERR_CLASS=NONE\nSTAGING_VM_STATUS_ERR_SHA256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCTION_QM_RC=0\nPRODUCTION_QGA_STATE=PASS\nPRODUCTION_GUEST_EXITCODE=0\nPRODUCTION_UNEXPECTED_PID=null\nPRODUCTION_QGA_ERR_CLASS=NONE\nPRODUCTION_QGA_ERR_SHA256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nSTAGING_SSH_QM_RC=0\nSTAGING_QGA_STATE=PASS\nSTAGING_GUEST_EXITCODE=0\nSTAGING_UNEXPECTED_PID=null\nSTAGING_QGA_ERR_CLASS=NONE\nSTAGING_QGA_ERR_SHA256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nPRODUCTION_QGA_TRANSPORT_READY=true\nSTAGING_QGA_TRANSPORT_READY=true\nBOTH_QGA_TRANSPORT_READY=true\nDECISION=PASS_QGA270_BOTH_TRANSPORTS_READY\nNEXT_GATE=RERUN_MESSENGERS_EGRESS_PREFLIGHT_WITH_PROVEN_QGA\nNEWFI270_END=true\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"NEWFI-260920-NEWFDOM-MESSENGERS214-QGA270\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n" + "output": "COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1\nMODE=read-only\nCOMPONENT=pvepro-homepage-portal-789-runner-duplicate-rca-readonly\nWINDOW_MODE=VISIBLE_SYNCHRONOUS_WAIT\nPRODUCTION_HOST={\"all_link_down\":false,\"config_sha256\":\"ebd2b7d44ab58a222b4fd5a7dcd9358d3082e593bd70fb07c2331c70f22e82ab\",\"name\":\"pvepro-prod\",\"snapshots\":[],\"status\":\"running\"}\nSTAGING_HOST={\"all_link_down\":true,\"config_sha256\":\"27a4e57f09dfd93c374ff9597651cade264a9b10f13302dbf2b8345a9d40dd76\",\"name\":\"pvepro-staging-v1\",\"snapshots\":[\"w2-pre-portal-cutover-787r1\"],\"status\":\"stopped\"}\nRUNNER_SOURCE={\"absolute_paths\":[\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"[SENSITIVE_PATH] bash\"},{\"line\":2,\"text\":\"set -Eeuo pipefail\"},{\"line\":3,\"text\":\"umask 077\"},{\"line\":4,\"text\":\"\"},{\"line\":5,\"text\":\"read_mutation_contract() {\"},{\"line\":6,\"text\":\" python3 - \\\"$1\\\" \\\"$2\\\" \\\"$3\\\" \\\"$4\\\" <<'PY_CONTRACT'\"},{\"line\":7,\"text\":\"import json\"},{\"line\":8,\"text\":\"import sys\"},{\"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\":\"\"},{\"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\\\",\"},{\"line\":19,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":20,\"text\":\" \\\"mutation_outcome\\\": \\\"NO_MUTATION\\\",\"},{\"line\":21,\"text\":\" \\\"error\\\": \\\"NONE\\\",\"},{\"line\":22,\"text\":\"}\"},{\"line\":23,\"text\":\"\"},{\"line\":24,\"text\":\"if mode == \\\"change\\\":\"},{\"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\\\",\"},{\"line\":30,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":31,\"text\":\" \\\"mutation_outcome\\\": \\\"UNKNOWN\\\",\"},{\"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\\\",\"},{\"line\":37,\"text\":\" errors=\\\"replace\\\",\"},{\"line\":38,\"text\":\" ).splitlines()\"},{\"line\":39,\"text\":\" payloads = [\"}],\"match\":\"raw_path, command_id, mode, command_rc = sys.argv[1:]\",\"match_line\":11},{\"context\":[{\"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\\\",\"},{\"line\":22,\"text\":\"}\"},{\"line\":23,\"text\":\"\"},{\"line\":24,\"text\":\"if mode == \\\"change\\\":\"},{\"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\\\",\"},{\"line\":30,\"text\":\" \\\"rollback_restored\\\": \\\"null\\\",\"},{\"line\":31,\"text\":\" \\\"mutation_outcome\\\": \\\"UNKNOWN\\\",\"},{\"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\\\",\"},{\"line\":37,\"text\":\" errors=\\\"replace\\\",\"},{\"line\":38,\"text\":\" ).splitlines()\"},{\"line\":39,\"text\":\" payloads = [\"},{\"line\":40,\"text\":\" line[len(marker):]\"},{\"line\":41,\"text\":\" for line in lines\"},{\"line\":42,\"text\":\" if line.startswith(marker)\"},{\"line\":43,\"text\":\" ]\"},{\"line\":44,\"text\":\" if len(payloads) == 1:\"},{\"line\":45,\"text\":\" try:\"},{\"line\":46,\"text\":\" document = json.loads(payloads[0])\"},{\"line\":47,\"text\":\" if not isinstance(document, dict):\"},{\"line\":48,\"text\":\" raise ValueError(\\\"contract root is not object\\\")\"},{\"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\\\")\"},{\"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\\\")\"},{\"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\":\" lines = Path(raw_path).read_bytes().decode(\",\"match_line\":35},{\"context\":[{\"line\":80,\"text\":\" or rollback_started\"},{\"line\":81,\"text\":\" or command_rc != 2\"},{\"line\":82,\"text\":\" ):\"},{\"line\":83,\"text\":\" raise ValueError(\"},{\"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:\"},{\"line\":89,\"text\":\" raise ValueError(\\\"FAIL contract inconsistent with rc\\\")\"},{\"line\":90,\"text\":\"\"},{\"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:\"},{\"line\":96,\"text\":\" outcome = \\\"ROLLED_BACK\\\"\"},{\"line\":97,\"text\":\" elif rollback_restored is False:\"},{\"line\":98,\"text\":\" outcome = \\\"ROLLBACK_FAILED\\\"\"},{\"line\":99,\"text\":\" else:\"},{\"line\":100,\"text\":\" outcome = \\\"ROLLBACK_UNKNOWN\\\"\"},{\"line\":101,\"text\":\"\"},{\"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(\"},{\"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\"},{\"line\":112,\"text\":\" else str(rollback_restored).lower()\"},{\"line\":113,\"text\":\" ),\"},{\"line\":114,\"text\":\" \\\"mutation_outcome\\\": outcome,\"},{\"line\":115,\"text\":\" \\\"error\\\": \\\"NONE\\\",\"},{\"line\":116,\"text\":\" }\"},{\"line\":117,\"text\":\" except Exception as exc:\"},{\"line\":118,\"text\":\" result[\\\"error\\\"] = (\"},{\"line\":119,\"text\":\" \\\"INVALID_CONTRACT:\\\" + type(exc).__name__\"},{\"line\":120,\"text\":\" )\"},{\"line\":121,\"text\":\" elif len(payloads) > 1:\"},{\"line\":122,\"text\":\" result[\\\"error\\\"] = \\\"MULTIPLE_CONTRACTS\\\"\"},{\"line\":123,\"text\":\"\"},{\"line\":124,\"text\":\"print(\\\"\\\\t\\\".join([\"},{\"line\":125,\"text\":\" str(result[\\\"valid\\\"]).lower(),\"},{\"line\":126,\"text\":\" result[\\\"status\\\"],\"}],\"match\":\" outcome = \\\"ROLLBACK_FAILED\\\"\",\"match_line\":98},{\"context\":[{\"line\":182,\"text\":\"\"},{\"line\":183,\"text\":\"if [ \\\"${1:-}\\\" = '--self-test' ]; then\"},{\"line\":184,\"text\":\" runner_self_test\"},{\"line\":185,\"text\":\" exit 0\"},{\"line\":186,\"text\":\"fi\"},{\"line\":187,\"text\":\"\"},{\"line\":188,\"text\":\"usage() {\"},{\"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:\"},{\"line\":194,\"text\":\" read-only\"},{\"line\":195,\"text\":\" verify\"},{\"line\":196,\"text\":\" change\"},{\"line\":197,\"text\":\" transport-test\"},{\"line\":198,\"text\":\"\"},{\"line\":199,\"text\":\"Environment:\"},{\"line\":200,\"text\":\" HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command.\"},{\"line\":201,\"text\":\" HOMELAB_TIMEOUT=SECONDS Optional command timeout.\"},{\"line\":202,\"text\":\"USAGE\"},{\"line\":203,\"text\":\" exit 64\"},{\"line\":204,\"text\":\"}\"},{\"line\":205,\"text\":\"\"},{\"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\\\"\"},{\"line\":211,\"text\":\"shift 3\"},{\"line\":212,\"text\":\"\"},{\"line\":213,\"text\":\"[ \\\"${1:-}\\\" = '--' ] || usage\"},{\"line\":214,\"text\":\"shift\"},{\"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'\"},{\"line\":220,\"text\":\" echo 'REASON=INVALID_COMMAND_ID'\"},{\"line\":221,\"text\":\" exit 65\"},{\"line\":222,\"text\":\" ;;\"},{\"line\":223,\"text\":\"esac\"},{\"line\":224,\"text\":\"\"},{\"line\":225,\"text\":\"case \\\"$COMPONENT\\\" in\"},{\"line\":226,\"text\":\" ''|*[!A-Za-z0-9._-]*)\"},{\"line\":227,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":228,\"text\":\" echo 'REASON=INVALID_COMPONENT'\"}],\"match\":\" HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command.\",\"match_line\":200},{\"context\":[{\"line\":256,\"text\":\" }\"},{\"line\":257,\"text\":\"done\"},{\"line\":258,\"text\":\"\"},{\"line\":259,\"text\":\"REFERENCE=/etc/pve/31_HOMELAB_REFERENCE.md\"},{\"line\":260,\"text\":\"ERROR_REGISTER=/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\"},{\"line\":261,\"text\":\"\"},{\"line\":262,\"text\":\"[ -r \\\"$REFERENCE\\\" ] || {\"},{\"line\":263,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":264,\"text\":\" echo 'REASON=REFERENCE_NOT_READABLE'\"},{\"line\":265,\"text\":\" exit 69\"},{\"line\":266,\"text\":\"}\"},{\"line\":267,\"text\":\"\"},{\"line\":268,\"text\":\"[ -r \\\"$ERROR_REGISTER\\\" ] || {\"},{\"line\":269,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":270,\"text\":\" echo 'REASON=ERROR_REGISTER_NOT_READABLE'\"},{\"line\":271,\"text\":\" exit 70\"},{\"line\":272,\"text\":\"}\"},{\"line\":273,\"text\":\"\"},{\"line\":274,\"text\":\"STATE_DIR=/var/lib/homelab-chat-run\"},{\"line\":275,\"text\":\"RAW_DIR=\\\"$STATE_DIR/raw\\\"\"},{\"line\":276,\"text\":\"PUBLIC_DIR=\\\"$STATE_DIR/public\\\"\"},{\"line\":277,\"text\":\"LEDGER=\\\"$STATE_DIR/state/command-ledger.tsv\\\"\"},{\"line\":278,\"text\":\"LOCK=\\\"$STATE_DIR/state/runner.lock\\\"\"},{\"line\":279,\"text\":\"\"},{\"line\":280,\"text\":\"mkdir -p \\\"$RAW_DIR\\\" \\\"$PUBLIC_DIR\\\" \\\"$(dirname \\\"$LEDGER\\\")\\\"\"},{\"line\":281,\"text\":\"chmod 0700 \\\"$STATE_DIR\\\" \\\"$RAW_DIR\\\" \\\"$PUBLIC_DIR\\\" \\\"$(dirname \\\"$LEDGER\\\")\\\"\"},{\"line\":282,\"text\":\"touch \\\"$LEDGER\\\"\"},{\"line\":283,\"text\":\"chmod 0600 \\\"$LEDGER\\\"\"},{\"line\":284,\"text\":\"\"},{\"line\":285,\"text\":\"exec 9>\\\"$LOCK\\\"\"},{\"line\":286,\"text\":\"\"},{\"line\":287,\"text\":\"flock -w 60 9 || {\"},{\"line\":288,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":289,\"text\":\" echo 'REASON=RUNNER_LOCK_TIMEOUT'\"},{\"line\":290,\"text\":\" exit 71\"},{\"line\":291,\"text\":\"}\"},{\"line\":292,\"text\":\"\"},{\"line\":293,\"text\":\"STARTED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\"},{\"line\":294,\"text\":\"STAMP=\\\"$(date -u +%Y%m%dT%H%M%SZ)\\\"\"},{\"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\\\"\"},{\"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\":\"STATE_DIR=/var/lib/homelab-chat-run\",\"match_line\":274},{\"context\":[{\"line\":263,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":264,\"text\":\" echo 'REASON=REFERENCE_NOT_READABLE'\"},{\"line\":265,\"text\":\" exit 69\"},{\"line\":266,\"text\":\"}\"},{\"line\":267,\"text\":\"\"},{\"line\":268,\"text\":\"[ -r \\\"$ERROR_REGISTER\\\" ] || {\"},{\"line\":269,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":270,\"text\":\" echo 'REASON=ERROR_REGISTER_NOT_READABLE'\"},{\"line\":271,\"text\":\" exit 70\"},{\"line\":272,\"text\":\"}\"},{\"line\":273,\"text\":\"\"},{\"line\":274,\"text\":\"STATE_DIR=/var/lib/homelab-chat-run\"},{\"line\":275,\"text\":\"RAW_DIR=\\\"$STATE_DIR/raw\\\"\"},{\"line\":276,\"text\":\"PUBLIC_DIR=\\\"$STATE_DIR/public\\\"\"},{\"line\":277,\"text\":\"LEDGER=\\\"$STATE_DIR/state/command-ledger.tsv\\\"\"},{\"line\":278,\"text\":\"LOCK=\\\"$STATE_DIR/state/runner.lock\\\"\"},{\"line\":279,\"text\":\"\"},{\"line\":280,\"text\":\"mkdir -p \\\"$RAW_DIR\\\" \\\"$PUBLIC_DIR\\\" \\\"$(dirname \\\"$LEDGER\\\")\\\"\"},{\"line\":281,\"text\":\"chmod 0700 \\\"$STATE_DIR\\\" \\\"$RAW_DIR\\\" \\\"$PUBLIC_DIR\\\" \\\"$(dirname \\\"$LEDGER\\\")\\\"\"},{\"line\":282,\"text\":\"touch \\\"$LEDGER\\\"\"},{\"line\":283,\"text\":\"chmod 0600 \\\"$LEDGER\\\"\"},{\"line\":284,\"text\":\"\"},{\"line\":285,\"text\":\"exec 9>\\\"$LOCK\\\"\"},{\"line\":286,\"text\":\"\"},{\"line\":287,\"text\":\"flock -w 60 9 || {\"},{\"line\":288,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":289,\"text\":\" echo 'REASON=RUNNER_LOCK_TIMEOUT'\"},{\"line\":290,\"text\":\" exit 71\"},{\"line\":291,\"text\":\"}\"},{\"line\":292,\"text\":\"\"},{\"line\":293,\"text\":\"STARTED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\"},{\"line\":294,\"text\":\"STAMP=\\\"$(date -u +%Y%m%dT%H%M%SZ)\\\"\"},{\"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\\\"\"},{\"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}')\\\"\"},{\"line\":303,\"text\":\"ERROR_REGISTER_SHA256=\\\"$(sha256sum \\\"$ERROR_REGISTER\\\" | awk '{print $1}')\\\"\"},{\"line\":304,\"text\":\"\"},{\"line\":305,\"text\":\"COMMAND_SHA256=\\\"$(\"},{\"line\":306,\"text\":\" {\"},{\"line\":307,\"text\":\" printf '%s\\\\0' \\\"$MODE\\\"\"},{\"line\":308,\"text\":\" printf '%s\\\\0' \\\"$COMPONENT\\\"\"},{\"line\":309,\"text\":\" printf '%s\\\\0' \\\"$@\\\"\"}],\"match\":\"chmod 0700 \\\"$STATE_DIR\\\" \\\"$RAW_DIR\\\" \\\"$PUBLIC_DIR\\\" \\\"$(dirname \\\"$LEDGER\\\")\\\"\",\"match_line\":281},{\"context\":[{\"line\":287,\"text\":\"flock -w 60 9 || {\"},{\"line\":288,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":289,\"text\":\" echo 'REASON=RUNNER_LOCK_TIMEOUT'\"},{\"line\":290,\"text\":\" exit 71\"},{\"line\":291,\"text\":\"}\"},{\"line\":292,\"text\":\"\"},{\"line\":293,\"text\":\"STARTED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\"},{\"line\":294,\"text\":\"STAMP=\\\"$(date -u +%Y%m%dT%H%M%SZ)\\\"\"},{\"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\\\"\"},{\"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}')\\\"\"},{\"line\":303,\"text\":\"ERROR_REGISTER_SHA256=\\\"$(sha256sum \\\"$ERROR_REGISTER\\\" | awk '{print $1}')\\\"\"},{\"line\":304,\"text\":\"\"},{\"line\":305,\"text\":\"COMMAND_SHA256=\\\"$(\"},{\"line\":306,\"text\":\" {\"},{\"line\":307,\"text\":\" printf '%s\\\\0' \\\"$MODE\\\"\"},{\"line\":308,\"text\":\" printf '%s\\\\0' \\\"$COMPONENT\\\"\"},{\"line\":309,\"text\":\" printf '%s\\\\0' \\\"$@\\\"\"},{\"line\":310,\"text\":\" } |\"},{\"line\":311,\"text\":\" sha256sum |\"},{\"line\":312,\"text\":\" awk '{print $1}'\"},{\"line\":313,\"text\":\")\\\"\"},{\"line\":314,\"text\":\"\"},{\"line\":315,\"text\":\"PREVIOUS_FAILED_RC=\\\"$(\"},{\"line\":316,\"text\":\" awk -F '\\\\t' -v hash=\\\"$COMMAND_SHA256\\\" '\"},{\"line\":317,\"text\":\" $3 == hash && $4 != \\\"0\\\" {\"},{\"line\":318,\"text\":\" value=$4\"},{\"line\":319,\"text\":\" }\"},{\"line\":320,\"text\":\"\"},{\"line\":321,\"text\":\" END {\"},{\"line\":322,\"text\":\" print value\"},{\"line\":323,\"text\":\" }\"},{\"line\":324,\"text\":\" ' \\\"$LEDGER\\\"\"},{\"line\":325,\"text\":\")\\\"\"},{\"line\":326,\"text\":\"\"},{\"line\":327,\"text\":\"RUN_STARTED=true\"},{\"line\":328,\"text\":\"REPEAT_BLOCKED=false\"},{\"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\":\"COMMAND_SHA256=\\\"$(\",\"match_line\":305},{\"context\":[{\"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'\"},{\"line\":338,\"text\":\"COMMAND_RC=''\"},{\"line\":339,\"text\":\"\"},{\"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\"},{\"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'\"},{\"line\":349,\"text\":\"fi\"},{\"line\":350,\"text\":\"\"},{\"line\":351,\"text\":\"if [ -n \\\"$PREVIOUS_FAILED_RC\\\" ] &&\"},{\"line\":352,\"text\":\" [ \\\"${HOMELAB_ALLOW_REPEAT:-0}\\\" != 1 ]; then\"},{\"line\":353,\"text\":\"\"},{\"line\":354,\"text\":\" RUN_STARTED=false\"},{\"line\":355,\"text\":\" REPEAT_BLOCKED=true\"},{\"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'\"},{\"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'\"},{\"line\":366,\"text\":\"\"},{\"line\":367,\"text\":\" {\"},{\"line\":368,\"text\":\" echo 'COMMAND_EXECUTION_BLOCKED=yes'\"},{\"line\":369,\"text\":\" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'\"},{\"line\":370,\"text\":\" echo \\\"PREVIOUS_RC=$PREVIOUS_FAILED_RC\\\"\"},{\"line\":371,\"text\":\" echo \\\"COMMAND_SHA256=$COMMAND_SHA256\\\"\"},{\"line\":372,\"text\":\" echo\"},{\"line\":373,\"text\":\" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'\"},{\"line\":374,\"text\":\" } >\\\"$RAW_FILE\\\"\"},{\"line\":375,\"text\":\"else\"},{\"line\":376,\"text\":\" set +e\"},{\"line\":377,\"text\":\"\"},{\"line\":378,\"text\":\" if [ -n \\\"${HOMELAB_TIMEOUT:-}\\\" ]; then\"},{\"line\":379,\"text\":\" case \\\"$HOMELAB_TIMEOUT\\\" in\"}],\"match\":\"if [ -n \\\"$PREVIOUS_FAILED_RC\\\" ] &&\",\"match_line\":351},{\"context\":[{\"line\":351,\"text\":\"if [ -n \\\"$PREVIOUS_FAILED_RC\\\" ] &&\"},{\"line\":352,\"text\":\" [ \\\"${HOMELAB_ALLOW_REPEAT:-0}\\\" != 1 ]; then\"},{\"line\":353,\"text\":\"\"},{\"line\":354,\"text\":\" RUN_STARTED=false\"},{\"line\":355,\"text\":\" REPEAT_BLOCKED=true\"},{\"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'\"},{\"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'\"},{\"line\":366,\"text\":\"\"},{\"line\":367,\"text\":\" {\"},{\"line\":368,\"text\":\" echo 'COMMAND_EXECUTION_BLOCKED=yes'\"},{\"line\":369,\"text\":\" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'\"},{\"line\":370,\"text\":\" echo \\\"PREVIOUS_RC=$PREVIOUS_FAILED_RC\\\"\"},{\"line\":371,\"text\":\" echo \\\"COMMAND_SHA256=$COMMAND_SHA256\\\"\"},{\"line\":372,\"text\":\" echo\"},{\"line\":373,\"text\":\" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'\"},{\"line\":374,\"text\":\" } >\\\"$RAW_FILE\\\"\"},{\"line\":375,\"text\":\"else\"},{\"line\":376,\"text\":\" set +e\"},{\"line\":377,\"text\":\"\"},{\"line\":378,\"text\":\" if [ -n \\\"${HOMELAB_TIMEOUT:-}\\\" ]; then\"},{\"line\":379,\"text\":\" case \\\"$HOMELAB_TIMEOUT\\\" in\"},{\"line\":380,\"text\":\" *[!0-9]*|'')\"},{\"line\":381,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":382,\"text\":\" echo 'REASON=INVALID_HOMELAB_TIMEOUT'\"},{\"line\":383,\"text\":\" exit 74\"},{\"line\":384,\"text\":\" ;;\"},{\"line\":385,\"text\":\" esac\"},{\"line\":386,\"text\":\"\"},{\"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\"},{\"line\":392,\"text\":\" RC=$?\"},{\"line\":393,\"text\":\" else\"},{\"line\":394,\"text\":\" \\\"$@\\\" >\\\"$RAW_FILE\\\" 2>&1\"},{\"line\":395,\"text\":\" RC=$?\"},{\"line\":396,\"text\":\" fi\"},{\"line\":397,\"text\":\"\"}],\"match\":\" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'\",\"match_line\":369},{\"context\":[{\"line\":373,\"text\":\" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'\"},{\"line\":374,\"text\":\" } >\\\"$RAW_FILE\\\"\"},{\"line\":375,\"text\":\"else\"},{\"line\":376,\"text\":\" set +e\"},{\"line\":377,\"text\":\"\"},{\"line\":378,\"text\":\" if [ -n \\\"${HOMELAB_TIMEOUT:-}\\\" ]; then\"},{\"line\":379,\"text\":\" case \\\"$HOMELAB_TIMEOUT\\\" in\"},{\"line\":380,\"text\":\" *[!0-9]*|'')\"},{\"line\":381,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":382,\"text\":\" echo 'REASON=INVALID_HOMELAB_TIMEOUT'\"},{\"line\":383,\"text\":\" exit 74\"},{\"line\":384,\"text\":\" ;;\"},{\"line\":385,\"text\":\" esac\"},{\"line\":386,\"text\":\"\"},{\"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\"},{\"line\":392,\"text\":\" RC=$?\"},{\"line\":393,\"text\":\" else\"},{\"line\":394,\"text\":\" \\\"$@\\\" >\\\"$RAW_FILE\\\" 2>&1\"},{\"line\":395,\"text\":\" RC=$?\"},{\"line\":396,\"text\":\" fi\"},{\"line\":397,\"text\":\"\"},{\"line\":398,\"text\":\" set -e\"},{\"line\":399,\"text\":\"\"},{\"line\":400,\"text\":\" COMMAND_RC=\\\"$RC\\\"\"},{\"line\":401,\"text\":\"\"},{\"line\":402,\"text\":\" if [ \\\"$RC\\\" -eq 0 ]; then\"},{\"line\":403,\"text\":\" STATUS='OK'\"},{\"line\":404,\"text\":\" else\"},{\"line\":405,\"text\":\" STATUS='FAIL'\"},{\"line\":406,\"text\":\" fi\"},{\"line\":407,\"text\":\"\"},{\"line\":408,\"text\":\" IFS=$'\\\\t' read -r \\\\\"},{\"line\":409,\"text\":\" RESULT_CONTRACT_VALID \\\\\"},{\"line\":410,\"text\":\" CONTRACT_STATUS \\\\\"},{\"line\":411,\"text\":\" CHANGES_MADE \\\\\"},{\"line\":412,\"text\":\" ROLLBACK_STARTED \\\\\"},{\"line\":413,\"text\":\" ROLLBACK_RESTORED \\\\\"},{\"line\":414,\"text\":\" MUTATION_OUTCOME \\\\\"},{\"line\":415,\"text\":\" RESULT_CONTRACT_ERROR < <(\"},{\"line\":416,\"text\":\" read_mutation_contract \\\\\"},{\"line\":417,\"text\":\" \\\"$RAW_FILE\\\" \\\\\"},{\"line\":418,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":419,\"text\":\" \\\"$MODE\\\" \\\\\"}],\"match\":\" \\\"$@\\\" >\\\"$RAW_FILE\\\" 2>&1\",\"match_line\":391},{\"context\":[{\"line\":399,\"text\":\"\"},{\"line\":400,\"text\":\" COMMAND_RC=\\\"$RC\\\"\"},{\"line\":401,\"text\":\"\"},{\"line\":402,\"text\":\" if [ \\\"$RC\\\" -eq 0 ]; then\"},{\"line\":403,\"text\":\" STATUS='OK'\"},{\"line\":404,\"text\":\" else\"},{\"line\":405,\"text\":\" STATUS='FAIL'\"},{\"line\":406,\"text\":\" fi\"},{\"line\":407,\"text\":\"\"},{\"line\":408,\"text\":\" IFS=$'\\\\t' read -r \\\\\"},{\"line\":409,\"text\":\" RESULT_CONTRACT_VALID \\\\\"},{\"line\":410,\"text\":\" CONTRACT_STATUS \\\\\"},{\"line\":411,\"text\":\" CHANGES_MADE \\\\\"},{\"line\":412,\"text\":\" ROLLBACK_STARTED \\\\\"},{\"line\":413,\"text\":\" ROLLBACK_RESTORED \\\\\"},{\"line\":414,\"text\":\" MUTATION_OUTCOME \\\\\"},{\"line\":415,\"text\":\" RESULT_CONTRACT_ERROR < <(\"},{\"line\":416,\"text\":\" read_mutation_contract \\\\\"},{\"line\":417,\"text\":\" \\\"$RAW_FILE\\\" \\\\\"},{\"line\":418,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":419,\"text\":\" \\\"$MODE\\\" \\\\\"},{\"line\":420,\"text\":\" \\\"$COMMAND_RC\\\"\"},{\"line\":421,\"text\":\" )\"},{\"line\":422,\"text\":\"\"},{\"line\":423,\"text\":\" if [ \\\"$MODE\\\" = change ]; then\"},{\"line\":424,\"text\":\" if [ \\\"$RESULT_CONTRACT_VALID\\\" != true ]; then\"},{\"line\":425,\"text\":\" RC=76\"},{\"line\":426,\"text\":\" STATUS='FAIL'\"},{\"line\":427,\"text\":\" else\"},{\"line\":428,\"text\":\" STATUS=\\\"$CONTRACT_STATUS\\\"\"},{\"line\":429,\"text\":\" fi\"},{\"line\":430,\"text\":\" fi\"},{\"line\":431,\"text\":\"fi\"},{\"line\":432,\"text\":\"\"},{\"line\":433,\"text\":\"FINISHED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\"},{\"line\":434,\"text\":\"RAW_SHA256=\\\"$(sha256sum \\\"$RAW_FILE\\\" | awk '{print $1}')\\\"\"},{\"line\":435,\"text\":\"\"},{\"line\":436,\"text\":\"python3 - \\\"$RAW_FILE\\\" \\\"$SANITIZED_FILE\\\" <<'PY'\"},{\"line\":437,\"text\":\"import re\"},{\"line\":438,\"text\":\"import sys\"},{\"line\":439,\"text\":\"from pathlib import Path\"},{\"line\":440,\"text\":\"\"},{\"line\":441,\"text\":\"source = Path(sys.argv[1])\"},{\"line\":442,\"text\":\"target = Path(sys.argv[2])\"},{\"line\":443,\"text\":\"\"},{\"line\":444,\"text\":\"text = source.read_bytes().decode(\\\"utf-8\\\", errors=\\\"replace\\\")\"},{\"line\":445,\"text\":\"\"}],\"match\":\" \\\"$RAW_FILE\\\" \\\\\",\"match_line\":417},{\"context\":[{\"line\":416,\"text\":\" read_mutation_contract \\\\\"},{\"line\":417,\"text\":\" \\\"$RAW_FILE\\\" \\\\\"},{\"line\":418,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":419,\"text\":\" \\\"$MODE\\\" \\\\\"},{\"line\":420,\"text\":\" \\\"$COMMAND_RC\\\"\"},{\"line\":421,\"text\":\" )\"},{\"line\":422,\"text\":\"\"},{\"line\":423,\"text\":\" if [ \\\"$MODE\\\" = change ]; then\"},{\"line\":424,\"text\":\" if [ \\\"$RESULT_CONTRACT_VALID\\\" != true ]; then\"},{\"line\":425,\"text\":\" RC=76\"},{\"line\":426,\"text\":\" STATUS='FAIL'\"},{\"line\":427,\"text\":\" else\"},{\"line\":428,\"text\":\" STATUS=\\\"$CONTRACT_STATUS\\\"\"},{\"line\":429,\"text\":\" fi\"},{\"line\":430,\"text\":\" fi\"},{\"line\":431,\"text\":\"fi\"},{\"line\":432,\"text\":\"\"},{\"line\":433,\"text\":\"FINISHED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\"},{\"line\":434,\"text\":\"RAW_SHA256=\\\"$(sha256sum \\\"$RAW_FILE\\\" | awk '{print $1}')\\\"\"},{\"line\":435,\"text\":\"\"},{\"line\":436,\"text\":\"python3 - \\\"$RAW_FILE\\\" \\\"$SANITIZED_FILE\\\" <<'PY'\"},{\"line\":437,\"text\":\"import re\"},{\"line\":438,\"text\":\"import sys\"},{\"line\":439,\"text\":\"from pathlib import Path\"},{\"line\":440,\"text\":\"\"},{\"line\":441,\"text\":\"source = Path(sys.argv[1])\"},{\"line\":442,\"text\":\"target = Path(sys.argv[2])\"},{\"line\":443,\"text\":\"\"},{\"line\":444,\"text\":\"text = source.read_bytes().decode(\\\"utf-8\\\", errors=\\\"replace\\\")\"},{\"line\":445,\"text\":\"\"},{\"line\":446,\"text\":\"patterns = [\"},{\"line\":447,\"text\":\" (\"},{\"line\":448,\"text\":\" re.compile(\"},{\"line\":449,\"text\":\" r\\\"-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----\\\"\"},{\"line\":450,\"text\":\" r\\\".*?\\\"\"},{\"line\":451,\"text\":\" r\\\"-----END (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----\\\",\"},{\"line\":452,\"text\":\" re.IGNORECASE | re.DOTALL,\"},{\"line\":453,\"text\":\" ),\"},{\"line\":454,\"text\":\" \\\"[PRIVATE_KEY_REDACTED]\\\",\"},{\"line\":455,\"text\":\" ),\"},{\"line\":456,\"text\":\" (\"},{\"line\":457,\"text\":\" re.compile(\"},{\"line\":458,\"text\":\" r\\\"(?im)^(\\\\s*(?:password|passwd|passphrase|authorization|\\\"\"},{\"line\":459,\"text\":\" r\\\"api[_-]?key|access[_-]?token|refresh[_-]?token|\\\"\"},{\"line\":460,\"text\":\" r\\\"private[_-]?key|secret)\\\\s*[:=]\\\\s*).*$\\\"\"},{\"line\":461,\"text\":\" ),\"},{\"line\":462,\"text\":\" r\\\"\\\\1[REDACTED]\\\",\"}],\"match\":\"RAW_SHA256=\\\"$(sha256sum \\\"$RAW_FILE\\\" | awk '{print $1}')\\\"\",\"match_line\":434},{\"context\":[{\"line\":512,\"text\":\"\"},{\"line\":513,\"text\":\"text = \\\"\\\".join(\"},{\"line\":514,\"text\":\" char\"},{\"line\":515,\"text\":\" for char in text\"},{\"line\":516,\"text\":\" if char in \\\"\\\\n\\\\r\\\\t\\\" or ord(char) >= 32\"},{\"line\":517,\"text\":\")\"},{\"line\":518,\"text\":\"\"},{\"line\":519,\"text\":\"encoded = text.encode(\\\"utf-8\\\")\"},{\"line\":520,\"text\":\"\"},{\"line\":521,\"text\":\"maximum = 900_000\"},{\"line\":522,\"text\":\"\"},{\"line\":523,\"text\":\"if len(encoded) > maximum:\"},{\"line\":524,\"text\":\" first = encoded[:440_000].decode(\\\"utf-8\\\", errors=\\\"ignore\\\")\"},{\"line\":525,\"text\":\" last = encoded[-440_000:].decode(\\\"utf-8\\\", errors=\\\"ignore\\\")\"},{\"line\":526,\"text\":\"\"},{\"line\":527,\"text\":\" text = (\"},{\"line\":528,\"text\":\" first\"},{\"line\":529,\"text\":\" + \\\"\\\\n\\\\n\\\"\"},{\"line\":530,\"text\":\" + \\\"===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====\\\"\"},{\"line\":531,\"text\":\" + \\\"\\\\n\\\\n\\\"\"},{\"line\":532,\"text\":\" + last\"},{\"line\":533,\"text\":\" )\"},{\"line\":534,\"text\":\"\"},{\"line\":535,\"text\":\"target.write_text(text, encoding=\\\"utf-8\\\")\"},{\"line\":536,\"text\":\"PY\"},{\"line\":537,\"text\":\"\"},{\"line\":538,\"text\":\"SANITIZED_SHA256=\\\"$(\"},{\"line\":539,\"text\":\" sha256sum \\\"$SANITIZED_FILE\\\" |\"},{\"line\":540,\"text\":\" awk '{print $1}'\"},{\"line\":541,\"text\":\")\\\"\"},{\"line\":542,\"text\":\"\"},{\"line\":543,\"text\":\"python3 - \\\\\"},{\"line\":544,\"text\":\" \\\"$JSON_FILE\\\" \\\\\"},{\"line\":545,\"text\":\" \\\"$SANITIZED_FILE\\\" \\\\\"},{\"line\":546,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":547,\"text\":\" \\\"$STATUS\\\" \\\\\"},{\"line\":548,\"text\":\" \\\"$RC\\\" \\\\\"},{\"line\":549,\"text\":\" \\\"$HOST_SHORT\\\" \\\\\"},{\"line\":550,\"text\":\" \\\"$MODE\\\" \\\\\"},{\"line\":551,\"text\":\" \\\"$COMPONENT\\\" \\\\\"},{\"line\":552,\"text\":\" \\\"$STARTED_AT\\\" \\\\\"},{\"line\":553,\"text\":\" \\\"$FINISHED_AT\\\" \\\\\"},{\"line\":554,\"text\":\" \\\"$REFERENCE_SHA256\\\" \\\\\"},{\"line\":555,\"text\":\" \\\"$ERROR_REGISTER_SHA256\\\" \\\\\"},{\"line\":556,\"text\":\" \\\"$COMMAND_SHA256\\\" \\\\\"},{\"line\":557,\"text\":\" \\\"$RAW_SHA256\\\" \\\\\"},{\"line\":558,\"text\":\" \\\"$SANITIZED_SHA256\\\" \\\\\"}],\"match\":\" + \\\"===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====\\\"\",\"match_line\":530},{\"context\":[{\"line\":538,\"text\":\"SANITIZED_SHA256=\\\"$(\"},{\"line\":539,\"text\":\" sha256sum \\\"$SANITIZED_FILE\\\" |\"},{\"line\":540,\"text\":\" awk '{print $1}'\"},{\"line\":541,\"text\":\")\\\"\"},{\"line\":542,\"text\":\"\"},{\"line\":543,\"text\":\"python3 - \\\\\"},{\"line\":544,\"text\":\" \\\"$JSON_FILE\\\" \\\\\"},{\"line\":545,\"text\":\" \\\"$SANITIZED_FILE\\\" \\\\\"},{\"line\":546,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":547,\"text\":\" \\\"$STATUS\\\" \\\\\"},{\"line\":548,\"text\":\" \\\"$RC\\\" \\\\\"},{\"line\":549,\"text\":\" \\\"$HOST_SHORT\\\" \\\\\"},{\"line\":550,\"text\":\" \\\"$MODE\\\" \\\\\"},{\"line\":551,\"text\":\" \\\"$COMPONENT\\\" \\\\\"},{\"line\":552,\"text\":\" \\\"$STARTED_AT\\\" \\\\\"},{\"line\":553,\"text\":\" \\\"$FINISHED_AT\\\" \\\\\"},{\"line\":554,\"text\":\" \\\"$REFERENCE_SHA256\\\" \\\\\"},{\"line\":555,\"text\":\" \\\"$ERROR_REGISTER_SHA256\\\" \\\\\"},{\"line\":556,\"text\":\" \\\"$COMMAND_SHA256\\\" \\\\\"},{\"line\":557,\"text\":\" \\\"$RAW_SHA256\\\" \\\\\"},{\"line\":558,\"text\":\" \\\"$SANITIZED_SHA256\\\" \\\\\"},{\"line\":559,\"text\":\" \\\"$RUN_STARTED\\\" \\\\\"},{\"line\":560,\"text\":\" \\\"$REPEAT_BLOCKED\\\" \\\\\"},{\"line\":561,\"text\":\" \\\"$BLOCK_REASON\\\" \\\\\"},{\"line\":562,\"text\":\" \\\"$CHANGE_DECLARED\\\" \\\\\"},{\"line\":563,\"text\":\" \\\"$RESULT_CONTRACT_VALID\\\" \\\\\"},{\"line\":564,\"text\":\" \\\"$CONTRACT_STATUS\\\" \\\\\"},{\"line\":565,\"text\":\" \\\"$CHANGES_MADE\\\" \\\\\"},{\"line\":566,\"text\":\" \\\"$ROLLBACK_STARTED\\\" \\\\\"},{\"line\":567,\"text\":\" \\\"$ROLLBACK_RESTORED\\\" \\\\\"},{\"line\":568,\"text\":\" \\\"$MUTATION_OUTCOME\\\" \\\\\"},{\"line\":569,\"text\":\" \\\"$RESULT_CONTRACT_ERROR\\\" \\\\\"},{\"line\":570,\"text\":\" \\\"$COMMAND_RC\\\" <<'PY'\"},{\"line\":571,\"text\":\"import json\"},{\"line\":572,\"text\":\"import sys\"},{\"line\":573,\"text\":\"from pathlib import Path\"},{\"line\":574,\"text\":\"\"},{\"line\":575,\"text\":\"(\"},{\"line\":576,\"text\":\" json_path,\"},{\"line\":577,\"text\":\" output_path,\"},{\"line\":578,\"text\":\" command_id,\"},{\"line\":579,\"text\":\" status,\"},{\"line\":580,\"text\":\" rc,\"},{\"line\":581,\"text\":\" host,\"},{\"line\":582,\"text\":\" mode,\"},{\"line\":583,\"text\":\" component,\"},{\"line\":584,\"text\":\" started,\"}],\"match\":\" \\\"$COMMAND_SHA256\\\" \\\\\",\"match_line\":556},{\"context\":[{\"line\":570,\"text\":\" \\\"$COMMAND_RC\\\" <<'PY'\"},{\"line\":571,\"text\":\"import json\"},{\"line\":572,\"text\":\"import sys\"},{\"line\":573,\"text\":\"from pathlib import Path\"},{\"line\":574,\"text\":\"\"},{\"line\":575,\"text\":\"(\"},{\"line\":576,\"text\":\" json_path,\"},{\"line\":577,\"text\":\" output_path,\"},{\"line\":578,\"text\":\" command_id,\"},{\"line\":579,\"text\":\" status,\"},{\"line\":580,\"text\":\" rc,\"},{\"line\":581,\"text\":\" host,\"},{\"line\":582,\"text\":\" mode,\"},{\"line\":583,\"text\":\" component,\"},{\"line\":584,\"text\":\" started,\"},{\"line\":585,\"text\":\" finished,\"},{\"line\":586,\"text\":\" reference_sha,\"},{\"line\":587,\"text\":\" error_sha,\"},{\"line\":588,\"text\":\" command_sha,\"},{\"line\":589,\"text\":\" raw_sha,\"},{\"line\":590,\"text\":\" sanitized_sha,\"},{\"line\":591,\"text\":\" run_started,\"},{\"line\":592,\"text\":\" repeat_blocked,\"},{\"line\":593,\"text\":\" block_reason,\"},{\"line\":594,\"text\":\" change_declared,\"},{\"line\":595,\"text\":\" result_contract_valid,\"},{\"line\":596,\"text\":\" contract_status,\"},{\"line\":597,\"text\":\" changes_made,\"},{\"line\":598,\"text\":\" rollback_started,\"},{\"line\":599,\"text\":\" rollback_restored,\"},{\"line\":600,\"text\":\" mutation_outcome,\"},{\"line\":601,\"text\":\" result_contract_error,\"},{\"line\":602,\"text\":\" command_rc,\"},{\"line\":603,\"text\":\") = sys.argv[1:]\"},{\"line\":604,\"text\":\"\"},{\"line\":605,\"text\":\"\"},{\"line\":606,\"text\":\"def optional_bool(value: str):\"},{\"line\":607,\"text\":\" if value == \\\"true\\\":\"},{\"line\":608,\"text\":\" return True\"},{\"line\":609,\"text\":\" if value == \\\"false\\\":\"},{\"line\":610,\"text\":\" return False\"},{\"line\":611,\"text\":\" return None\"},{\"line\":612,\"text\":\"\"},{\"line\":613,\"text\":\"output = Path(output_path).read_text(\"},{\"line\":614,\"text\":\" encoding=\\\"utf-8\\\",\"},{\"line\":615,\"text\":\" errors=\\\"replace\\\",\"},{\"line\":616,\"text\":\")\"}],\"match\":\" command_sha,\",\"match_line\":588},{\"context\":[{\"line\":627,\"text\":\"else:\"},{\"line\":628,\"text\":\" output_preview = output\"},{\"line\":629,\"text\":\"\"},{\"line\":630,\"text\":\"document = {\"},{\"line\":631,\"text\":\" \\\"schema_version\\\": 1,\"},{\"line\":632,\"text\":\" \\\"channel\\\": \\\"homelab-runtime\\\",\"},{\"line\":633,\"text\":\" \\\"command_id\\\": command_id,\"},{\"line\":634,\"text\":\" \\\"status\\\": status,\"},{\"line\":635,\"text\":\" \\\"rc\\\": int(rc),\"},{\"line\":636,\"text\":\" \\\"host\\\": host,\"},{\"line\":637,\"text\":\" \\\"mode\\\": mode,\"},{\"line\":638,\"text\":\" \\\"component\\\": component,\"},{\"line\":639,\"text\":\" \\\"started_at_utc\\\": started,\"},{\"line\":640,\"text\":\" \\\"finished_at_utc\\\": finished,\"},{\"line\":641,\"text\":\" \\\"reference_register_checked\\\": True,\"},{\"line\":642,\"text\":\" \\\"reference_sha256\\\": reference_sha,\"},{\"line\":643,\"text\":\" \\\"error_register_checked\\\": True,\"},{\"line\":644,\"text\":\" \\\"error_register_sha256\\\": error_sha,\"},{\"line\":645,\"text\":\" \\\"command_sha256\\\": command_sha,\"},{\"line\":646,\"text\":\" \\\"duplicate_failed_command_blocked\\\": repeat_blocked == \\\"true\\\",\"},{\"line\":647,\"text\":\" \\\"block_reason\\\": block_reason or None,\"},{\"line\":648,\"text\":\" \\\"execution_started\\\": run_started == \\\"true\\\",\"},{\"line\":649,\"text\":\" \\\"change_declared\\\": change_declared == \\\"true\\\",\"},{\"line\":650,\"text\":\" \\\"result_contract_valid\\\": result_contract_valid == \\\"true\\\",\"},{\"line\":651,\"text\":\" \\\"result_contract_status\\\": (\"},{\"line\":652,\"text\":\" None\"},{\"line\":653,\"text\":\" if contract_status in {\\\"\\\", \\\"UNKNOWN\\\", \\\"NOT_APPLICABLE\\\"}\"},{\"line\":654,\"text\":\" else contract_status\"},{\"line\":655,\"text\":\" ),\"},{\"line\":656,\"text\":\" \\\"result_contract_error\\\": (\"},{\"line\":657,\"text\":\" None\"},{\"line\":658,\"text\":\" if result_contract_error == \\\"NONE\\\"\"},{\"line\":659,\"text\":\" else result_contract_error\"},{\"line\":660,\"text\":\" ),\"},{\"line\":661,\"text\":\" \\\"command_rc\\\": int(command_rc) if command_rc else None,\"},{\"line\":662,\"text\":\" \\\"changes_made\\\": optional_bool(changes_made),\"},{\"line\":663,\"text\":\" \\\"rollback_started\\\": optional_bool(rollback_started),\"},{\"line\":664,\"text\":\" \\\"rollback_restored\\\": optional_bool(rollback_restored),\"},{\"line\":665,\"text\":\" \\\"mutation_outcome\\\": mutation_outcome,\"},{\"line\":666,\"text\":\" \\\"sanitized\\\": True,\"},{\"line\":667,\"text\":\" \\\"secrets_included\\\": False,\"},{\"line\":668,\"text\":\" \\\"private_addresses_included\\\": False,\"},{\"line\":669,\"text\":\" \\\"raw_evidence_retained_locally\\\": True,\"},{\"line\":670,\"text\":\" \\\"raw_evidence_sha256\\\": raw_sha,\"},{\"line\":671,\"text\":\" \\\"sanitized_output_sha256\\\": sanitized_sha,\"},{\"line\":672,\"text\":\" \\\"output_truncated_in_json\\\": output_truncated,\"},{\"line\":673,\"text\":\" \\\"full_sanitized_output_url\\\": (\"}],\"match\":\" \\\"command_sha256\\\": command_sha,\",\"match_line\":645},{\"context\":[{\"line\":651,\"text\":\" \\\"result_contract_status\\\": (\"},{\"line\":652,\"text\":\" None\"},{\"line\":653,\"text\":\" if contract_status in {\\\"\\\", \\\"UNKNOWN\\\", \\\"NOT_APPLICABLE\\\"}\"},{\"line\":654,\"text\":\" else contract_status\"},{\"line\":655,\"text\":\" ),\"},{\"line\":656,\"text\":\" \\\"result_contract_error\\\": (\"},{\"line\":657,\"text\":\" None\"},{\"line\":658,\"text\":\" if result_contract_error == \\\"NONE\\\"\"},{\"line\":659,\"text\":\" else result_contract_error\"},{\"line\":660,\"text\":\" ),\"},{\"line\":661,\"text\":\" \\\"command_rc\\\": int(command_rc) if command_rc else None,\"},{\"line\":662,\"text\":\" \\\"changes_made\\\": optional_bool(changes_made),\"},{\"line\":663,\"text\":\" \\\"rollback_started\\\": optional_bool(rollback_started),\"},{\"line\":664,\"text\":\" \\\"rollback_restored\\\": optional_bool(rollback_restored),\"},{\"line\":665,\"text\":\" \\\"mutation_outcome\\\": mutation_outcome,\"},{\"line\":666,\"text\":\" \\\"sanitized\\\": True,\"},{\"line\":667,\"text\":\" \\\"secrets_included\\\": False,\"},{\"line\":668,\"text\":\" \\\"private_addresses_included\\\": False,\"},{\"line\":669,\"text\":\" \\\"raw_evidence_retained_locally\\\": True,\"},{\"line\":670,\"text\":\" \\\"raw_evidence_sha256\\\": raw_sha,\"},{\"line\":671,\"text\":\" \\\"sanitized_output_sha256\\\": sanitized_sha,\"},{\"line\":672,\"text\":\" \\\"output_truncated_in_json\\\": output_truncated,\"},{\"line\":673,\"text\":\" \\\"full_sanitized_output_url\\\": (\"},{\"line\":674,\"text\":\" \\\"https://git.gram1.ru/.well-known/\\\"\"},{\"line\":675,\"text\":\" \\\"homelab-runtime/latest.txt\\\"\"},{\"line\":676,\"text\":\" ),\"},{\"line\":677,\"text\":\" \\\"output\\\": output_preview,\"},{\"line\":678,\"text\":\"}\"},{\"line\":679,\"text\":\"\"},{\"line\":680,\"text\":\"Path(json_path).write_text(\"},{\"line\":681,\"text\":\" json.dumps(\"},{\"line\":682,\"text\":\" document,\"},{\"line\":683,\"text\":\" ensure_ascii=False,\"},{\"line\":684,\"text\":\" indent=2,\"},{\"line\":685,\"text\":\" )\"},{\"line\":686,\"text\":\" + \\\"\\\\n\\\",\"},{\"line\":687,\"text\":\" encoding=\\\"utf-8\\\",\"},{\"line\":688,\"text\":\")\"},{\"line\":689,\"text\":\"PY\"},{\"line\":690,\"text\":\"\"},{\"line\":691,\"text\":\"{\"},{\"line\":692,\"text\":\" echo 'CHAT_OUTPUT_BEGIN'\"},{\"line\":693,\"text\":\" echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":694,\"text\":\" echo \\\"STATUS=$STATUS\\\"\"},{\"line\":695,\"text\":\" echo \\\"RC=$RC\\\"\"},{\"line\":696,\"text\":\" echo \\\"HOST=$HOST_SHORT\\\"\"},{\"line\":697,\"text\":\" echo \\\"MODE=$MODE\\\"\"}],\"match\":\" \\\"raw_evidence_retained_locally\\\": True,\",\"match_line\":669},{\"context\":[{\"line\":685,\"text\":\" )\"},{\"line\":686,\"text\":\" + \\\"\\\\n\\\",\"},{\"line\":687,\"text\":\" encoding=\\\"utf-8\\\",\"},{\"line\":688,\"text\":\")\"},{\"line\":689,\"text\":\"PY\"},{\"line\":690,\"text\":\"\"},{\"line\":691,\"text\":\"{\"},{\"line\":692,\"text\":\" echo 'CHAT_OUTPUT_BEGIN'\"},{\"line\":693,\"text\":\" echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":694,\"text\":\" echo \\\"STATUS=$STATUS\\\"\"},{\"line\":695,\"text\":\" echo \\\"RC=$RC\\\"\"},{\"line\":696,\"text\":\" echo \\\"HOST=$HOST_SHORT\\\"\"},{\"line\":697,\"text\":\" echo \\\"MODE=$MODE\\\"\"},{\"line\":698,\"text\":\" echo \\\"COMPONENT=$COMPONENT\\\"\"},{\"line\":699,\"text\":\" echo 'REFERENCE_REGISTER_CHECK=OK'\"},{\"line\":700,\"text\":\" echo \\\"REFERENCE_SHA256=$REFERENCE_SHA256\\\"\"},{\"line\":701,\"text\":\" echo 'ERROR_REGISTER_CHECK=OK'\"},{\"line\":702,\"text\":\" echo \\\"ERROR_REGISTER_SHA256=$ERROR_REGISTER_SHA256\\\"\"},{\"line\":703,\"text\":\" echo \\\"COMMAND_SHA256=$COMMAND_SHA256\\\"\"},{\"line\":704,\"text\":\" echo \\\"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\\\"\"},{\"line\":705,\"text\":\" echo \\\"EXECUTION_STARTED=$RUN_STARTED\\\"\"},{\"line\":706,\"text\":\" echo \\\"CHANGE_DECLARED=$CHANGE_DECLARED\\\"\"},{\"line\":707,\"text\":\" echo \\\"RESULT_CONTRACT_VALID=$RESULT_CONTRACT_VALID\\\"\"},{\"line\":708,\"text\":\" echo \\\"RESULT_CONTRACT_STATUS=$CONTRACT_STATUS\\\"\"},{\"line\":709,\"text\":\" echo \\\"RESULT_CONTRACT_ERROR=$RESULT_CONTRACT_ERROR\\\"\"},{\"line\":710,\"text\":\" echo \\\"COMMAND_RC=${COMMAND_RC:-}\\\"\"},{\"line\":711,\"text\":\" echo \\\"CHANGES_MADE=$CHANGES_MADE\\\"\"},{\"line\":712,\"text\":\" echo \\\"ROLLBACK_STARTED=$ROLLBACK_STARTED\\\"\"},{\"line\":713,\"text\":\" echo \\\"ROLLBACK_RESTORED=$ROLLBACK_RESTORED\\\"\"},{\"line\":714,\"text\":\" echo \\\"MUTATION_OUTCOME=$MUTATION_OUTCOME\\\"\"},{\"line\":715,\"text\":\" echo 'SANITIZED=yes'\"},{\"line\":716,\"text\":\" echo 'SECRETS_INCLUDED=no'\"},{\"line\":717,\"text\":\" echo 'PRIVATE_ADDRESSES_INCLUDED=no'\"},{\"line\":718,\"text\":\" echo \\\"RAW_EVIDENCE_SHA256=$RAW_SHA256\\\"\"},{\"line\":719,\"text\":\" echo \\\"SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256\\\"\"},{\"line\":720,\"text\":\" echo 'OUTPUT_BEGIN'\"},{\"line\":721,\"text\":\" cat \\\"$SANITIZED_FILE\\\"\"},{\"line\":722,\"text\":\" echo\"},{\"line\":723,\"text\":\" echo 'OUTPUT_END'\"},{\"line\":724,\"text\":\" echo 'CHAT_OUTPUT_END'\"},{\"line\":725,\"text\":\"} >\\\"$TXT_FILE\\\"\"},{\"line\":726,\"text\":\"\"},{\"line\":727,\"text\":\"chmod 0600 \\\\\"},{\"line\":728,\"text\":\" \\\"$RAW_FILE\\\" \\\\\"},{\"line\":729,\"text\":\" \\\"$SANITIZED_FILE\\\" \\\\\"},{\"line\":730,\"text\":\" \\\"$JSON_FILE\\\" \\\\\"},{\"line\":731,\"text\":\" \\\"$TXT_FILE\\\"\"}],\"match\":\" echo \\\"COMMAND_SHA256=$COMMAND_SHA256\\\"\",\"match_line\":703},{\"context\":[{\"line\":710,\"text\":\" echo \\\"COMMAND_RC=${COMMAND_RC:-}\\\"\"},{\"line\":711,\"text\":\" echo \\\"CHANGES_MADE=$CHANGES_MADE\\\"\"},{\"line\":712,\"text\":\" echo \\\"ROLLBACK_STARTED=$ROLLBACK_STARTED\\\"\"},{\"line\":713,\"text\":\" echo \\\"ROLLBACK_RESTORED=$ROLLBACK_RESTORED\\\"\"},{\"line\":714,\"text\":\" echo \\\"MUTATION_OUTCOME=$MUTATION_OUTCOME\\\"\"},{\"line\":715,\"text\":\" echo 'SANITIZED=yes'\"},{\"line\":716,\"text\":\" echo 'SECRETS_INCLUDED=no'\"},{\"line\":717,\"text\":\" echo 'PRIVATE_ADDRESSES_INCLUDED=no'\"},{\"line\":718,\"text\":\" echo \\\"RAW_EVIDENCE_SHA256=$RAW_SHA256\\\"\"},{\"line\":719,\"text\":\" echo \\\"SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256\\\"\"},{\"line\":720,\"text\":\" echo 'OUTPUT_BEGIN'\"},{\"line\":721,\"text\":\" cat \\\"$SANITIZED_FILE\\\"\"},{\"line\":722,\"text\":\" echo\"},{\"line\":723,\"text\":\" echo 'OUTPUT_END'\"},{\"line\":724,\"text\":\" echo 'CHAT_OUTPUT_END'\"},{\"line\":725,\"text\":\"} >\\\"$TXT_FILE\\\"\"},{\"line\":726,\"text\":\"\"},{\"line\":727,\"text\":\"chmod 0600 \\\\\"},{\"line\":728,\"text\":\" \\\"$RAW_FILE\\\" \\\\\"},{\"line\":729,\"text\":\" \\\"$SANITIZED_FILE\\\" \\\\\"},{\"line\":730,\"text\":\" \\\"$JSON_FILE\\\" \\\\\"},{\"line\":731,\"text\":\" \\\"$TXT_FILE\\\"\"},{\"line\":732,\"text\":\"\"},{\"line\":733,\"text\":\"TARGET=debian@[PRIVATE_IP]\"},{\"line\":734,\"text\":\"REMOTE_PREFIX=\\\"/tmp/homelab-runtime-${COMMAND_ID}-$$\\\"\"},{\"line\":735,\"text\":\"\"},{\"line\":736,\"text\":\"SSH_OPTS=(\"},{\"line\":737,\"text\":\" -o BatchMode=yes\"},{\"line\":738,\"text\":\" -o ConnectTimeout=10\"},{\"line\":739,\"text\":\" -o ConnectionAttempts=1\"},{\"line\":740,\"text\":\" -o StrictHostKeyChecking=yes\"},{\"line\":741,\"text\":\" -o UserKnownHostsFile=[SENSITIVE_PATH] \\\\\"},{\"line\":745,\"text\":\" -q \\\\\"},{\"line\":746,\"text\":\" \\\"${SSH_OPTS[@]}\\\" \\\\\"},{\"line\":747,\"text\":\" \\\"$JSON_FILE\\\" \\\\\"},{\"line\":748,\"text\":\" \\\"${TARGET}:${REMOTE_PREFIX}.json\\\"\"},{\"line\":749,\"text\":\"\"},{\"line\":750,\"text\":\"scp \\\\\"},{\"line\":751,\"text\":\" -q \\\\\"},{\"line\":752,\"text\":\" \\\"${SSH_OPTS[@]}\\\" \\\\\"},{\"line\":753,\"text\":\" \\\"$TXT_FILE\\\" \\\\\"},{\"line\":754,\"text\":\" \\\"${TARGET}:${REMOTE_PREFIX}.txt\\\"\"},{\"line\":755,\"text\":\"\"},{\"line\":756,\"text\":\"ssh \\\"${SSH_OPTS[@]}\\\" \\\"$TARGET\\\" \\\"\"}],\"match\":\" \\\"$RAW_FILE\\\" \\\\\",\"match_line\":728},{\"context\":[{\"line\":779,\"text\":\" --max-time 15 \\\\\"},{\"line\":780,\"text\":\" \\\"$PUBLIC_URL\\\" 2>/dev/null ||\"},{\"line\":781,\"text\":\" true\"},{\"line\":782,\"text\":\" )\\\"\"},{\"line\":783,\"text\":\"\"},{\"line\":784,\"text\":\" if printf '%s\\\\n' \\\"$CONTENT\\\" |\"},{\"line\":785,\"text\":\" grep -Fq \\\"\\\\\\\"command_id\\\\\\\": \\\\\\\"$COMMAND_ID\\\\\\\"\\\"; then\"},{\"line\":786,\"text\":\" PUBLIC_VISIBLE=true\"},{\"line\":787,\"text\":\" break\"},{\"line\":788,\"text\":\" fi\"},{\"line\":789,\"text\":\"\"},{\"line\":790,\"text\":\" sleep 2\"},{\"line\":791,\"text\":\"done\"},{\"line\":792,\"text\":\"\"},{\"line\":793,\"text\":\"if [ \\\"$PUBLIC_VISIBLE\\\" != true ]; then\"},{\"line\":794,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":795,\"text\":\" echo 'REASON=PUBLIC_RUNTIME_RESULT_NOT_VISIBLE'\"},{\"line\":796,\"text\":\" echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":797,\"text\":\" echo \\\"LOCAL_RAW_FILE=$RAW_FILE\\\"\"},{\"line\":798,\"text\":\" exit 75\"},{\"line\":799,\"text\":\"fi\"},{\"line\":800,\"text\":\"\"},{\"line\":801,\"text\":\"printf '%s\\\\t%s\\\\t%s\\\\t%s\\\\t%s\\\\t%s\\\\n' \\\\\"},{\"line\":802,\"text\":\" \\\"$FINISHED_AT\\\" \\\\\"},{\"line\":803,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":804,\"text\":\" \\\"$COMMAND_SHA256\\\" \\\\\"},{\"line\":805,\"text\":\" \\\"$RC\\\" \\\\\"},{\"line\":806,\"text\":\" \\\"$STATUS\\\" \\\\\"},{\"line\":807,\"text\":\" \\\"$COMPONENT\\\" >>\\\"$LEDGER\\\"\"},{\"line\":808,\"text\":\"\"},{\"line\":809,\"text\":\"echo\"},{\"line\":810,\"text\":\"echo '===== HOMELAB CHAT RUN COMPLETE ====='\"},{\"line\":811,\"text\":\"echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":812,\"text\":\"echo \\\"STATUS=$STATUS\\\"\"},{\"line\":813,\"text\":\"echo \\\"RC=$RC\\\"\"},{\"line\":814,\"text\":\"echo 'REFERENCE_REGISTER_CHECK=OK'\"},{\"line\":815,\"text\":\"echo 'ERROR_REGISTER_CHECK=OK'\"},{\"line\":816,\"text\":\"echo \\\"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\\\"\"},{\"line\":817,\"text\":\"echo 'GITEA_PUBLICATION=OK'\"},{\"line\":818,\"text\":\"echo \\\"PUBLIC_URL=$PUBLIC_URL\\\"\"},{\"line\":819,\"text\":\"echo \\\"LOCAL_RAW_FILE=$RAW_FILE\\\"\"},{\"line\":820,\"text\":\"echo 'SHELL_SESSION_PRESERVED=yes'\"},{\"line\":821,\"text\":\"\"},{\"line\":822,\"text\":\"exit \\\"$RC\\\"\"}],\"match\":\" echo \\\"LOCAL_RAW_FILE=$RAW_FILE\\\"\",\"match_line\":797},{\"context\":[{\"line\":786,\"text\":\" PUBLIC_VISIBLE=true\"},{\"line\":787,\"text\":\" break\"},{\"line\":788,\"text\":\" fi\"},{\"line\":789,\"text\":\"\"},{\"line\":790,\"text\":\" sleep 2\"},{\"line\":791,\"text\":\"done\"},{\"line\":792,\"text\":\"\"},{\"line\":793,\"text\":\"if [ \\\"$PUBLIC_VISIBLE\\\" != true ]; then\"},{\"line\":794,\"text\":\" echo 'RESULT=FAIL'\"},{\"line\":795,\"text\":\" echo 'REASON=PUBLIC_RUNTIME_RESULT_NOT_VISIBLE'\"},{\"line\":796,\"text\":\" echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":797,\"text\":\" echo \\\"LOCAL_RAW_FILE=$RAW_FILE\\\"\"},{\"line\":798,\"text\":\" exit 75\"},{\"line\":799,\"text\":\"fi\"},{\"line\":800,\"text\":\"\"},{\"line\":801,\"text\":\"printf '%s\\\\t%s\\\\t%s\\\\t%s\\\\t%s\\\\t%s\\\\n' \\\\\"},{\"line\":802,\"text\":\" \\\"$FINISHED_AT\\\" \\\\\"},{\"line\":803,\"text\":\" \\\"$COMMAND_ID\\\" \\\\\"},{\"line\":804,\"text\":\" \\\"$COMMAND_SHA256\\\" \\\\\"},{\"line\":805,\"text\":\" \\\"$RC\\\" \\\\\"},{\"line\":806,\"text\":\" \\\"$STATUS\\\" \\\\\"},{\"line\":807,\"text\":\" \\\"$COMPONENT\\\" >>\\\"$LEDGER\\\"\"},{\"line\":808,\"text\":\"\"},{\"line\":809,\"text\":\"echo\"},{\"line\":810,\"text\":\"echo '===== HOMELAB CHAT RUN COMPLETE ====='\"},{\"line\":811,\"text\":\"echo \\\"COMMAND_ID=$COMMAND_ID\\\"\"},{\"line\":812,\"text\":\"echo \\\"STATUS=$STATUS\\\"\"},{\"line\":813,\"text\":\"echo \\\"RC=$RC\\\"\"},{\"line\":814,\"text\":\"echo 'REFERENCE_REGISTER_CHECK=OK'\"},{\"line\":815,\"text\":\"echo 'ERROR_REGISTER_CHECK=OK'\"},{\"line\":816,\"text\":\"echo \\\"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\\\"\"},{\"line\":817,\"text\":\"echo 'GITEA_PUBLICATION=OK'\"},{\"line\":818,\"text\":\"echo \\\"PUBLIC_URL=$PUBLIC_URL\\\"\"},{\"line\":819,\"text\":\"echo \\\"LOCAL_RAW_FILE=$RAW_FILE\\\"\"},{\"line\":820,\"text\":\"echo 'SHELL_SESSION_PRESERVED=yes'\"},{\"line\":821,\"text\":\"\"},{\"line\":822,\"text\":\"exit \\\"$RC\\\"\"}],\"match\":\" \\\"$COMMAND_SHA256\\\" \\\\\",\"match_line\":804}],\"sha256\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\"}\nRUNNER_CANDIDATE_ROOTS=[\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"/var/lib/homelab-chat-run\",\"/var/log/homelab\"]\nTARGET_SHA_SEARCH=[{\"files\":[],\"rc\":1,\"root\":\"/etc/pve/31_HOMELAB_REFERENCE.md\",\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"files\":[],\"rc\":1,\"root\":\"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md\",\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"files\":[\"/var/lib/homelab-chat-run/state/command-ledger.tsv\",\"/var/lib/homelab-chat-run/raw/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.log\",\"/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.txt\",\"/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171441Z.json\",\"/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.json\",\"/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171441Z-latest.txt\",\"/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z-latest.txt\"],\"rc\":0,\"root\":\"/var/lib/homelab-chat-run\",\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"},{\"files\":[],\"rc\":1,\"root\":\"/var/log/homelab\",\"stderr_sha256\":\"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"}]\nRCA_ERROR_CLASS=TimeoutExpired\nRCA_ERROR_SHA256=47027a3fd2fcca9dbfcae4c4ea66f79d2512e2d04aa00889dc8893508b183cc9\nNO_MUTATION=True\nTASK_RESULT=PVEPRO_HOMEPAGE_PORTAL_789_RUNNER_DUPLICATE_RCA_FAILED\nHOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1\",\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"FAIL\",\"version\":1}\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index db42b29e..57dcf9ea 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,22 +1,22 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=NEWFI-260920-NEWFDOM-MESSENGERS214-QGA270 -STATUS=OK -RC=0 +COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1 +STATUS=FAIL +RC=3 HOST=pve01 MODE=read-only -COMPONENT=newfi-messengers214-qga270-transport-reconcile-readonly +COMPONENT=pvepro-homepage-portal-789-runner-duplicate-rca-readonly REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=16d0d62c324c90b9a1b9d5ee0151a56f8374c1b81c3f976c1de8f2d29d3f2344 +COMMAND_SHA256=a38301defa26ee67a8bb0dc8227f645b6dcaccada08b26232bc8216c628fd1ef 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 +COMMAND_RC=3 CHANGES_MADE=false ROLLBACK_STARTED=false ROLLBACK_RESTORED=null @@ -24,48 +24,23 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=82425ee7d922d1b0e7167bf7a5b0f86a3723944236f533d41326dcbdbfee195c -SANITIZED_OUTPUT_SHA256=82425ee7d922d1b0e7167bf7a5b0f86a3723944236f533d41326dcbdbfee195c +RAW_EVIDENCE_SHA256=7038052a6bbf990f44df906709727240385ac1cc38588e070b544977c2209965 +SANITIZED_OUTPUT_SHA256=0b8d0544ef9d63aa9d2130266a604f965e250bebcbbc626ad09fca81ecdcbb8b OUTPUT_BEGIN -NEWFI270_BEGIN=true -COMMAND_ID=NEWFI-260920-NEWFDOM-MESSENGERS214-QGA270 +COMMAND_ID=SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1 MODE=read-only -CHANGES_MADE=false -MUTATION_OUTCOME=NO_MUTATION -IMMUTABLE_PLAN_CHECK=PASS -ERROR_REGISTER_CHECK=OK -REFERENCE_CHECK=OK -RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d -ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 -AUTHORITY_SHA_MATCH=true -PRODUCTION_VM_STATUS_RC=0 -PRODUCTION_VM_STATE=RUNNING -PRODUCTION_VM_STATUS_ERR_CLASS=NONE -PRODUCTION_VM_STATUS_ERR_SHA256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -STAGING_VM_STATUS_OUTER_RC=0 -STAGING_VM_STATE=RUNNING -STAGING_VM_STATUS_ERR_CLASS=NONE -STAGING_VM_STATUS_ERR_SHA256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -PRODUCTION_QM_RC=0 -PRODUCTION_QGA_STATE=PASS -PRODUCTION_GUEST_EXITCODE=0 -PRODUCTION_UNEXPECTED_PID=null -PRODUCTION_QGA_ERR_CLASS=NONE -PRODUCTION_QGA_ERR_SHA256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -STAGING_SSH_QM_RC=0 -STAGING_QGA_STATE=PASS -STAGING_GUEST_EXITCODE=0 -STAGING_UNEXPECTED_PID=null -STAGING_QGA_ERR_CLASS=NONE -STAGING_QGA_ERR_SHA256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 -PRODUCTION_QGA_TRANSPORT_READY=true -STAGING_QGA_TRANSPORT_READY=true -BOTH_QGA_TRANSPORT_READY=true -DECISION=PASS_QGA270_BOTH_TRANSPORTS_READY -NEXT_GATE=RERUN_MESSENGERS_EGRESS_PREFLIGHT_WITH_PROVEN_QGA -NEWFI270_END=true -HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"NEWFI-260920-NEWFDOM-MESSENGERS214-QGA270","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} +COMPONENT=pvepro-homepage-portal-789-runner-duplicate-rca-readonly +WINDOW_MODE=VISIBLE_SYNCHRONOUS_WAIT +PRODUCTION_HOST={"all_link_down":false,"config_sha256":"ebd2b7d44ab58a222b4fd5a7dcd9358d3082e593bd70fb07c2331c70f22e82ab","name":"pvepro-prod","snapshots":[],"status":"running"} +STAGING_HOST={"all_link_down":true,"config_sha256":"27a4e57f09dfd93c374ff9597651cade264a9b10f13302dbf2b8345a9d40dd76","name":"pvepro-staging-v1","snapshots":["w2-pre-portal-cutover-787r1"],"status":"stopped"} +RUNNER_SOURCE={"absolute_paths":["/etc/pve/31_HOMELAB_REFERENCE.md","/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md","[SENSITIVE_PATH] bash"},{"line":2,"text":"set -Eeuo pipefail"},{"line":3,"text":"umask 077"},{"line":4,"text":""},{"line":5,"text":"read_mutation_contract() {"},{"line":6,"text":" python3 - \"$1\" \"$2\" \"$3\" \"$4\" <<'PY_CONTRACT'"},{"line":7,"text":"import json"},{"line":8,"text":"import sys"},{"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":""},{"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\","},{"line":19,"text":" \"rollback_restored\": \"null\","},{"line":20,"text":" \"mutation_outcome\": \"NO_MUTATION\","},{"line":21,"text":" \"error\": \"NONE\","},{"line":22,"text":"}"},{"line":23,"text":""},{"line":24,"text":"if mode == \"change\":"},{"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\","},{"line":30,"text":" \"rollback_restored\": \"null\","},{"line":31,"text":" \"mutation_outcome\": \"UNKNOWN\","},{"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\","},{"line":37,"text":" errors=\"replace\","},{"line":38,"text":" ).splitlines()"},{"line":39,"text":" payloads = ["}],"match":"raw_path, command_id, mode, command_rc = sys.argv[1:]","match_line":11},{"context":[{"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\","},{"line":22,"text":"}"},{"line":23,"text":""},{"line":24,"text":"if mode == \"change\":"},{"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\","},{"line":30,"text":" \"rollback_restored\": \"null\","},{"line":31,"text":" \"mutation_outcome\": \"UNKNOWN\","},{"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\","},{"line":37,"text":" errors=\"replace\","},{"line":38,"text":" ).splitlines()"},{"line":39,"text":" payloads = ["},{"line":40,"text":" line[len(marker):]"},{"line":41,"text":" for line in lines"},{"line":42,"text":" if line.startswith(marker)"},{"line":43,"text":" ]"},{"line":44,"text":" if len(payloads) == 1:"},{"line":45,"text":" try:"},{"line":46,"text":" document = json.loads(payloads[0])"},{"line":47,"text":" if not isinstance(document, dict):"},{"line":48,"text":" raise ValueError(\"contract root is not object\")"},{"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\")"},{"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\")"},{"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":" lines = Path(raw_path).read_bytes().decode(","match_line":35},{"context":[{"line":80,"text":" or rollback_started"},{"line":81,"text":" or command_rc != 2"},{"line":82,"text":" ):"},{"line":83,"text":" raise ValueError("},{"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:"},{"line":89,"text":" raise ValueError(\"FAIL contract inconsistent with rc\")"},{"line":90,"text":""},{"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:"},{"line":96,"text":" outcome = \"ROLLED_BACK\""},{"line":97,"text":" elif rollback_restored is False:"},{"line":98,"text":" outcome = \"ROLLBACK_FAILED\""},{"line":99,"text":" else:"},{"line":100,"text":" outcome = \"ROLLBACK_UNKNOWN\""},{"line":101,"text":""},{"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("},{"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"},{"line":112,"text":" else str(rollback_restored).lower()"},{"line":113,"text":" ),"},{"line":114,"text":" \"mutation_outcome\": outcome,"},{"line":115,"text":" \"error\": \"NONE\","},{"line":116,"text":" }"},{"line":117,"text":" except Exception as exc:"},{"line":118,"text":" result[\"error\"] = ("},{"line":119,"text":" \"INVALID_CONTRACT:\" + type(exc).__name__"},{"line":120,"text":" )"},{"line":121,"text":" elif len(payloads) > 1:"},{"line":122,"text":" result[\"error\"] = \"MULTIPLE_CONTRACTS\""},{"line":123,"text":""},{"line":124,"text":"print(\"\\t\".join(["},{"line":125,"text":" str(result[\"valid\"]).lower(),"},{"line":126,"text":" result[\"status\"],"}],"match":" outcome = \"ROLLBACK_FAILED\"","match_line":98},{"context":[{"line":182,"text":""},{"line":183,"text":"if [ \"${1:-}\" = '--self-test' ]; then"},{"line":184,"text":" runner_self_test"},{"line":185,"text":" exit 0"},{"line":186,"text":"fi"},{"line":187,"text":""},{"line":188,"text":"usage() {"},{"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:"},{"line":194,"text":" read-only"},{"line":195,"text":" verify"},{"line":196,"text":" change"},{"line":197,"text":" transport-test"},{"line":198,"text":""},{"line":199,"text":"Environment:"},{"line":200,"text":" HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command."},{"line":201,"text":" HOMELAB_TIMEOUT=SECONDS Optional command timeout."},{"line":202,"text":"USAGE"},{"line":203,"text":" exit 64"},{"line":204,"text":"}"},{"line":205,"text":""},{"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\""},{"line":211,"text":"shift 3"},{"line":212,"text":""},{"line":213,"text":"[ \"${1:-}\" = '--' ] || usage"},{"line":214,"text":"shift"},{"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'"},{"line":220,"text":" echo 'REASON=INVALID_COMMAND_ID'"},{"line":221,"text":" exit 65"},{"line":222,"text":" ;;"},{"line":223,"text":"esac"},{"line":224,"text":""},{"line":225,"text":"case \"$COMPONENT\" in"},{"line":226,"text":" ''|*[!A-Za-z0-9._-]*)"},{"line":227,"text":" echo 'RESULT=FAIL'"},{"line":228,"text":" echo 'REASON=INVALID_COMPONENT'"}],"match":" HOMELAB_ALLOW_REPEAT=1 Allow exact repeat of a previously failed command.","match_line":200},{"context":[{"line":256,"text":" }"},{"line":257,"text":"done"},{"line":258,"text":""},{"line":259,"text":"REFERENCE=/etc/pve/31_HOMELAB_REFERENCE.md"},{"line":260,"text":"ERROR_REGISTER=/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md"},{"line":261,"text":""},{"line":262,"text":"[ -r \"$REFERENCE\" ] || {"},{"line":263,"text":" echo 'RESULT=FAIL'"},{"line":264,"text":" echo 'REASON=REFERENCE_NOT_READABLE'"},{"line":265,"text":" exit 69"},{"line":266,"text":"}"},{"line":267,"text":""},{"line":268,"text":"[ -r \"$ERROR_REGISTER\" ] || {"},{"line":269,"text":" echo 'RESULT=FAIL'"},{"line":270,"text":" echo 'REASON=ERROR_REGISTER_NOT_READABLE'"},{"line":271,"text":" exit 70"},{"line":272,"text":"}"},{"line":273,"text":""},{"line":274,"text":"STATE_DIR=/var/lib/homelab-chat-run"},{"line":275,"text":"RAW_DIR=\"$STATE_DIR/raw\""},{"line":276,"text":"PUBLIC_DIR=\"$STATE_DIR/public\""},{"line":277,"text":"LEDGER=\"$STATE_DIR/state/command-ledger.tsv\""},{"line":278,"text":"LOCK=\"$STATE_DIR/state/runner.lock\""},{"line":279,"text":""},{"line":280,"text":"mkdir -p \"$RAW_DIR\" \"$PUBLIC_DIR\" \"$(dirname \"$LEDGER\")\""},{"line":281,"text":"chmod 0700 \"$STATE_DIR\" \"$RAW_DIR\" \"$PUBLIC_DIR\" \"$(dirname \"$LEDGER\")\""},{"line":282,"text":"touch \"$LEDGER\""},{"line":283,"text":"chmod 0600 \"$LEDGER\""},{"line":284,"text":""},{"line":285,"text":"exec 9>\"$LOCK\""},{"line":286,"text":""},{"line":287,"text":"flock -w 60 9 || {"},{"line":288,"text":" echo 'RESULT=FAIL'"},{"line":289,"text":" echo 'REASON=RUNNER_LOCK_TIMEOUT'"},{"line":290,"text":" exit 71"},{"line":291,"text":"}"},{"line":292,"text":""},{"line":293,"text":"STARTED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\""},{"line":294,"text":"STAMP=\"$(date -u +%Y%m%dT%H%M%SZ)\""},{"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\""},{"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":"STATE_DIR=/var/lib/homelab-chat-run","match_line":274},{"context":[{"line":263,"text":" echo 'RESULT=FAIL'"},{"line":264,"text":" echo 'REASON=REFERENCE_NOT_READABLE'"},{"line":265,"text":" exit 69"},{"line":266,"text":"}"},{"line":267,"text":""},{"line":268,"text":"[ -r \"$ERROR_REGISTER\" ] || {"},{"line":269,"text":" echo 'RESULT=FAIL'"},{"line":270,"text":" echo 'REASON=ERROR_REGISTER_NOT_READABLE'"},{"line":271,"text":" exit 70"},{"line":272,"text":"}"},{"line":273,"text":""},{"line":274,"text":"STATE_DIR=/var/lib/homelab-chat-run"},{"line":275,"text":"RAW_DIR=\"$STATE_DIR/raw\""},{"line":276,"text":"PUBLIC_DIR=\"$STATE_DIR/public\""},{"line":277,"text":"LEDGER=\"$STATE_DIR/state/command-ledger.tsv\""},{"line":278,"text":"LOCK=\"$STATE_DIR/state/runner.lock\""},{"line":279,"text":""},{"line":280,"text":"mkdir -p \"$RAW_DIR\" \"$PUBLIC_DIR\" \"$(dirname \"$LEDGER\")\""},{"line":281,"text":"chmod 0700 \"$STATE_DIR\" \"$RAW_DIR\" \"$PUBLIC_DIR\" \"$(dirname \"$LEDGER\")\""},{"line":282,"text":"touch \"$LEDGER\""},{"line":283,"text":"chmod 0600 \"$LEDGER\""},{"line":284,"text":""},{"line":285,"text":"exec 9>\"$LOCK\""},{"line":286,"text":""},{"line":287,"text":"flock -w 60 9 || {"},{"line":288,"text":" echo 'RESULT=FAIL'"},{"line":289,"text":" echo 'REASON=RUNNER_LOCK_TIMEOUT'"},{"line":290,"text":" exit 71"},{"line":291,"text":"}"},{"line":292,"text":""},{"line":293,"text":"STARTED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\""},{"line":294,"text":"STAMP=\"$(date -u +%Y%m%dT%H%M%SZ)\""},{"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\""},{"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}')\""},{"line":303,"text":"ERROR_REGISTER_SHA256=\"$(sha256sum \"$ERROR_REGISTER\" | awk '{print $1}')\""},{"line":304,"text":""},{"line":305,"text":"COMMAND_SHA256=\"$("},{"line":306,"text":" {"},{"line":307,"text":" printf '%s\\0' \"$MODE\""},{"line":308,"text":" printf '%s\\0' \"$COMPONENT\""},{"line":309,"text":" printf '%s\\0' \"$@\""}],"match":"chmod 0700 \"$STATE_DIR\" \"$RAW_DIR\" \"$PUBLIC_DIR\" \"$(dirname \"$LEDGER\")\"","match_line":281},{"context":[{"line":287,"text":"flock -w 60 9 || {"},{"line":288,"text":" echo 'RESULT=FAIL'"},{"line":289,"text":" echo 'REASON=RUNNER_LOCK_TIMEOUT'"},{"line":290,"text":" exit 71"},{"line":291,"text":"}"},{"line":292,"text":""},{"line":293,"text":"STARTED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\""},{"line":294,"text":"STAMP=\"$(date -u +%Y%m%dT%H%M%SZ)\""},{"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\""},{"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}')\""},{"line":303,"text":"ERROR_REGISTER_SHA256=\"$(sha256sum \"$ERROR_REGISTER\" | awk '{print $1}')\""},{"line":304,"text":""},{"line":305,"text":"COMMAND_SHA256=\"$("},{"line":306,"text":" {"},{"line":307,"text":" printf '%s\\0' \"$MODE\""},{"line":308,"text":" printf '%s\\0' \"$COMPONENT\""},{"line":309,"text":" printf '%s\\0' \"$@\""},{"line":310,"text":" } |"},{"line":311,"text":" sha256sum |"},{"line":312,"text":" awk '{print $1}'"},{"line":313,"text":")\""},{"line":314,"text":""},{"line":315,"text":"PREVIOUS_FAILED_RC=\"$("},{"line":316,"text":" awk -F '\\t' -v hash=\"$COMMAND_SHA256\" '"},{"line":317,"text":" $3 == hash && $4 != \"0\" {"},{"line":318,"text":" value=$4"},{"line":319,"text":" }"},{"line":320,"text":""},{"line":321,"text":" END {"},{"line":322,"text":" print value"},{"line":323,"text":" }"},{"line":324,"text":" ' \"$LEDGER\""},{"line":325,"text":")\""},{"line":326,"text":""},{"line":327,"text":"RUN_STARTED=true"},{"line":328,"text":"REPEAT_BLOCKED=false"},{"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":"COMMAND_SHA256=\"$(","match_line":305},{"context":[{"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'"},{"line":338,"text":"COMMAND_RC=''"},{"line":339,"text":""},{"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"},{"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'"},{"line":349,"text":"fi"},{"line":350,"text":""},{"line":351,"text":"if [ -n \"$PREVIOUS_FAILED_RC\" ] &&"},{"line":352,"text":" [ \"${HOMELAB_ALLOW_REPEAT:-0}\" != 1 ]; then"},{"line":353,"text":""},{"line":354,"text":" RUN_STARTED=false"},{"line":355,"text":" REPEAT_BLOCKED=true"},{"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'"},{"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'"},{"line":366,"text":""},{"line":367,"text":" {"},{"line":368,"text":" echo 'COMMAND_EXECUTION_BLOCKED=yes'"},{"line":369,"text":" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'"},{"line":370,"text":" echo \"PREVIOUS_RC=$PREVIOUS_FAILED_RC\""},{"line":371,"text":" echo \"COMMAND_SHA256=$COMMAND_SHA256\""},{"line":372,"text":" echo"},{"line":373,"text":" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'"},{"line":374,"text":" } >\"$RAW_FILE\""},{"line":375,"text":"else"},{"line":376,"text":" set +e"},{"line":377,"text":""},{"line":378,"text":" if [ -n \"${HOMELAB_TIMEOUT:-}\" ]; then"},{"line":379,"text":" case \"$HOMELAB_TIMEOUT\" in"}],"match":"if [ -n \"$PREVIOUS_FAILED_RC\" ] &&","match_line":351},{"context":[{"line":351,"text":"if [ -n \"$PREVIOUS_FAILED_RC\" ] &&"},{"line":352,"text":" [ \"${HOMELAB_ALLOW_REPEAT:-0}\" != 1 ]; then"},{"line":353,"text":""},{"line":354,"text":" RUN_STARTED=false"},{"line":355,"text":" REPEAT_BLOCKED=true"},{"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'"},{"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'"},{"line":366,"text":""},{"line":367,"text":" {"},{"line":368,"text":" echo 'COMMAND_EXECUTION_BLOCKED=yes'"},{"line":369,"text":" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'"},{"line":370,"text":" echo \"PREVIOUS_RC=$PREVIOUS_FAILED_RC\""},{"line":371,"text":" echo \"COMMAND_SHA256=$COMMAND_SHA256\""},{"line":372,"text":" echo"},{"line":373,"text":" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'"},{"line":374,"text":" } >\"$RAW_FILE\""},{"line":375,"text":"else"},{"line":376,"text":" set +e"},{"line":377,"text":""},{"line":378,"text":" if [ -n \"${HOMELAB_TIMEOUT:-}\" ]; then"},{"line":379,"text":" case \"$HOMELAB_TIMEOUT\" in"},{"line":380,"text":" *[!0-9]*|'')"},{"line":381,"text":" echo 'RESULT=FAIL'"},{"line":382,"text":" echo 'REASON=INVALID_HOMELAB_TIMEOUT'"},{"line":383,"text":" exit 74"},{"line":384,"text":" ;;"},{"line":385,"text":" esac"},{"line":386,"text":""},{"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"},{"line":392,"text":" RC=$?"},{"line":393,"text":" else"},{"line":394,"text":" \"$@\" >\"$RAW_FILE\" 2>&1"},{"line":395,"text":" RC=$?"},{"line":396,"text":" fi"},{"line":397,"text":""}],"match":" echo 'REASON=EXACT_FAILED_COMMAND_REPEAT'","match_line":369},{"context":[{"line":373,"text":" echo 'Set HOMELAB_ALLOW_REPEAT=1 only after reviewing the previous failure.'"},{"line":374,"text":" } >\"$RAW_FILE\""},{"line":375,"text":"else"},{"line":376,"text":" set +e"},{"line":377,"text":""},{"line":378,"text":" if [ -n \"${HOMELAB_TIMEOUT:-}\" ]; then"},{"line":379,"text":" case \"$HOMELAB_TIMEOUT\" in"},{"line":380,"text":" *[!0-9]*|'')"},{"line":381,"text":" echo 'RESULT=FAIL'"},{"line":382,"text":" echo 'REASON=INVALID_HOMELAB_TIMEOUT'"},{"line":383,"text":" exit 74"},{"line":384,"text":" ;;"},{"line":385,"text":" esac"},{"line":386,"text":""},{"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"},{"line":392,"text":" RC=$?"},{"line":393,"text":" else"},{"line":394,"text":" \"$@\" >\"$RAW_FILE\" 2>&1"},{"line":395,"text":" RC=$?"},{"line":396,"text":" fi"},{"line":397,"text":""},{"line":398,"text":" set -e"},{"line":399,"text":""},{"line":400,"text":" COMMAND_RC=\"$RC\""},{"line":401,"text":""},{"line":402,"text":" if [ \"$RC\" -eq 0 ]; then"},{"line":403,"text":" STATUS='OK'"},{"line":404,"text":" else"},{"line":405,"text":" STATUS='FAIL'"},{"line":406,"text":" fi"},{"line":407,"text":""},{"line":408,"text":" IFS=$'\\t' read -r \\"},{"line":409,"text":" RESULT_CONTRACT_VALID \\"},{"line":410,"text":" CONTRACT_STATUS \\"},{"line":411,"text":" CHANGES_MADE \\"},{"line":412,"text":" ROLLBACK_STARTED \\"},{"line":413,"text":" ROLLBACK_RESTORED \\"},{"line":414,"text":" MUTATION_OUTCOME \\"},{"line":415,"text":" RESULT_CONTRACT_ERROR < <("},{"line":416,"text":" read_mutation_contract \\"},{"line":417,"text":" \"$RAW_FILE\" \\"},{"line":418,"text":" \"$COMMAND_ID\" \\"},{"line":419,"text":" \"$MODE\" \\"}],"match":" \"$@\" >\"$RAW_FILE\" 2>&1","match_line":391},{"context":[{"line":399,"text":""},{"line":400,"text":" COMMAND_RC=\"$RC\""},{"line":401,"text":""},{"line":402,"text":" if [ \"$RC\" -eq 0 ]; then"},{"line":403,"text":" STATUS='OK'"},{"line":404,"text":" else"},{"line":405,"text":" STATUS='FAIL'"},{"line":406,"text":" fi"},{"line":407,"text":""},{"line":408,"text":" IFS=$'\\t' read -r \\"},{"line":409,"text":" RESULT_CONTRACT_VALID \\"},{"line":410,"text":" CONTRACT_STATUS \\"},{"line":411,"text":" CHANGES_MADE \\"},{"line":412,"text":" ROLLBACK_STARTED \\"},{"line":413,"text":" ROLLBACK_RESTORED \\"},{"line":414,"text":" MUTATION_OUTCOME \\"},{"line":415,"text":" RESULT_CONTRACT_ERROR < <("},{"line":416,"text":" read_mutation_contract \\"},{"line":417,"text":" \"$RAW_FILE\" \\"},{"line":418,"text":" \"$COMMAND_ID\" \\"},{"line":419,"text":" \"$MODE\" \\"},{"line":420,"text":" \"$COMMAND_RC\""},{"line":421,"text":" )"},{"line":422,"text":""},{"line":423,"text":" if [ \"$MODE\" = change ]; then"},{"line":424,"text":" if [ \"$RESULT_CONTRACT_VALID\" != true ]; then"},{"line":425,"text":" RC=76"},{"line":426,"text":" STATUS='FAIL'"},{"line":427,"text":" else"},{"line":428,"text":" STATUS=\"$CONTRACT_STATUS\""},{"line":429,"text":" fi"},{"line":430,"text":" fi"},{"line":431,"text":"fi"},{"line":432,"text":""},{"line":433,"text":"FINISHED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\""},{"line":434,"text":"RAW_SHA256=\"$(sha256sum \"$RAW_FILE\" | awk '{print $1}')\""},{"line":435,"text":""},{"line":436,"text":"python3 - \"$RAW_FILE\" \"$SANITIZED_FILE\" <<'PY'"},{"line":437,"text":"import re"},{"line":438,"text":"import sys"},{"line":439,"text":"from pathlib import Path"},{"line":440,"text":""},{"line":441,"text":"source = Path(sys.argv[1])"},{"line":442,"text":"target = Path(sys.argv[2])"},{"line":443,"text":""},{"line":444,"text":"text = source.read_bytes().decode(\"utf-8\", errors=\"replace\")"},{"line":445,"text":""}],"match":" \"$RAW_FILE\" \\","match_line":417},{"context":[{"line":416,"text":" read_mutation_contract \\"},{"line":417,"text":" \"$RAW_FILE\" \\"},{"line":418,"text":" \"$COMMAND_ID\" \\"},{"line":419,"text":" \"$MODE\" \\"},{"line":420,"text":" \"$COMMAND_RC\""},{"line":421,"text":" )"},{"line":422,"text":""},{"line":423,"text":" if [ \"$MODE\" = change ]; then"},{"line":424,"text":" if [ \"$RESULT_CONTRACT_VALID\" != true ]; then"},{"line":425,"text":" RC=76"},{"line":426,"text":" STATUS='FAIL'"},{"line":427,"text":" else"},{"line":428,"text":" STATUS=\"$CONTRACT_STATUS\""},{"line":429,"text":" fi"},{"line":430,"text":" fi"},{"line":431,"text":"fi"},{"line":432,"text":""},{"line":433,"text":"FINISHED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\""},{"line":434,"text":"RAW_SHA256=\"$(sha256sum \"$RAW_FILE\" | awk '{print $1}')\""},{"line":435,"text":""},{"line":436,"text":"python3 - \"$RAW_FILE\" \"$SANITIZED_FILE\" <<'PY'"},{"line":437,"text":"import re"},{"line":438,"text":"import sys"},{"line":439,"text":"from pathlib import Path"},{"line":440,"text":""},{"line":441,"text":"source = Path(sys.argv[1])"},{"line":442,"text":"target = Path(sys.argv[2])"},{"line":443,"text":""},{"line":444,"text":"text = source.read_bytes().decode(\"utf-8\", errors=\"replace\")"},{"line":445,"text":""},{"line":446,"text":"patterns = ["},{"line":447,"text":" ("},{"line":448,"text":" re.compile("},{"line":449,"text":" r\"-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----\""},{"line":450,"text":" r\".*?\""},{"line":451,"text":" r\"-----END (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----\","},{"line":452,"text":" re.IGNORECASE | re.DOTALL,"},{"line":453,"text":" ),"},{"line":454,"text":" \"[PRIVATE_KEY_REDACTED]\","},{"line":455,"text":" ),"},{"line":456,"text":" ("},{"line":457,"text":" re.compile("},{"line":458,"text":" r\"(?im)^(\\s*(?:password|passwd|passphrase|authorization|\""},{"line":459,"text":" r\"api[_-]?key|access[_-]?token|refresh[_-]?token|\""},{"line":460,"text":" r\"private[_-]?key|secret)\\s*[:=]\\s*).*$\""},{"line":461,"text":" ),"},{"line":462,"text":" r\"\\1[REDACTED]\","}],"match":"RAW_SHA256=\"$(sha256sum \"$RAW_FILE\" | awk '{print $1}')\"","match_line":434},{"context":[{"line":512,"text":""},{"line":513,"text":"text = \"\".join("},{"line":514,"text":" char"},{"line":515,"text":" for char in text"},{"line":516,"text":" if char in \"\\n\\r\\t\" or ord(char) >= 32"},{"line":517,"text":")"},{"line":518,"text":""},{"line":519,"text":"encoded = text.encode(\"utf-8\")"},{"line":520,"text":""},{"line":521,"text":"maximum = 900_000"},{"line":522,"text":""},{"line":523,"text":"if len(encoded) > maximum:"},{"line":524,"text":" first = encoded[:440_000].decode(\"utf-8\", errors=\"ignore\")"},{"line":525,"text":" last = encoded[-440_000:].decode(\"utf-8\", errors=\"ignore\")"},{"line":526,"text":""},{"line":527,"text":" text = ("},{"line":528,"text":" first"},{"line":529,"text":" + \"\\n\\n\""},{"line":530,"text":" + \"===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====\""},{"line":531,"text":" + \"\\n\\n\""},{"line":532,"text":" + last"},{"line":533,"text":" )"},{"line":534,"text":""},{"line":535,"text":"target.write_text(text, encoding=\"utf-8\")"},{"line":536,"text":"PY"},{"line":537,"text":""},{"line":538,"text":"SANITIZED_SHA256=\"$("},{"line":539,"text":" sha256sum \"$SANITIZED_FILE\" |"},{"line":540,"text":" awk '{print $1}'"},{"line":541,"text":")\""},{"line":542,"text":""},{"line":543,"text":"python3 - \\"},{"line":544,"text":" \"$JSON_FILE\" \\"},{"line":545,"text":" \"$SANITIZED_FILE\" \\"},{"line":546,"text":" \"$COMMAND_ID\" \\"},{"line":547,"text":" \"$STATUS\" \\"},{"line":548,"text":" \"$RC\" \\"},{"line":549,"text":" \"$HOST_SHORT\" \\"},{"line":550,"text":" \"$MODE\" \\"},{"line":551,"text":" \"$COMPONENT\" \\"},{"line":552,"text":" \"$STARTED_AT\" \\"},{"line":553,"text":" \"$FINISHED_AT\" \\"},{"line":554,"text":" \"$REFERENCE_SHA256\" \\"},{"line":555,"text":" \"$ERROR_REGISTER_SHA256\" \\"},{"line":556,"text":" \"$COMMAND_SHA256\" \\"},{"line":557,"text":" \"$RAW_SHA256\" \\"},{"line":558,"text":" \"$SANITIZED_SHA256\" \\"}],"match":" + \"===== PUBLIC OUTPUT TRUNCATED; FULL RAW LOG RETAINED LOCALLY =====\"","match_line":530},{"context":[{"line":538,"text":"SANITIZED_SHA256=\"$("},{"line":539,"text":" sha256sum \"$SANITIZED_FILE\" |"},{"line":540,"text":" awk '{print $1}'"},{"line":541,"text":")\""},{"line":542,"text":""},{"line":543,"text":"python3 - \\"},{"line":544,"text":" \"$JSON_FILE\" \\"},{"line":545,"text":" \"$SANITIZED_FILE\" \\"},{"line":546,"text":" \"$COMMAND_ID\" \\"},{"line":547,"text":" \"$STATUS\" \\"},{"line":548,"text":" \"$RC\" \\"},{"line":549,"text":" \"$HOST_SHORT\" \\"},{"line":550,"text":" \"$MODE\" \\"},{"line":551,"text":" \"$COMPONENT\" \\"},{"line":552,"text":" \"$STARTED_AT\" \\"},{"line":553,"text":" \"$FINISHED_AT\" \\"},{"line":554,"text":" \"$REFERENCE_SHA256\" \\"},{"line":555,"text":" \"$ERROR_REGISTER_SHA256\" \\"},{"line":556,"text":" \"$COMMAND_SHA256\" \\"},{"line":557,"text":" \"$RAW_SHA256\" \\"},{"line":558,"text":" \"$SANITIZED_SHA256\" \\"},{"line":559,"text":" \"$RUN_STARTED\" \\"},{"line":560,"text":" \"$REPEAT_BLOCKED\" \\"},{"line":561,"text":" \"$BLOCK_REASON\" \\"},{"line":562,"text":" \"$CHANGE_DECLARED\" \\"},{"line":563,"text":" \"$RESULT_CONTRACT_VALID\" \\"},{"line":564,"text":" \"$CONTRACT_STATUS\" \\"},{"line":565,"text":" \"$CHANGES_MADE\" \\"},{"line":566,"text":" \"$ROLLBACK_STARTED\" \\"},{"line":567,"text":" \"$ROLLBACK_RESTORED\" \\"},{"line":568,"text":" \"$MUTATION_OUTCOME\" \\"},{"line":569,"text":" \"$RESULT_CONTRACT_ERROR\" \\"},{"line":570,"text":" \"$COMMAND_RC\" <<'PY'"},{"line":571,"text":"import json"},{"line":572,"text":"import sys"},{"line":573,"text":"from pathlib import Path"},{"line":574,"text":""},{"line":575,"text":"("},{"line":576,"text":" json_path,"},{"line":577,"text":" output_path,"},{"line":578,"text":" command_id,"},{"line":579,"text":" status,"},{"line":580,"text":" rc,"},{"line":581,"text":" host,"},{"line":582,"text":" mode,"},{"line":583,"text":" component,"},{"line":584,"text":" started,"}],"match":" \"$COMMAND_SHA256\" \\","match_line":556},{"context":[{"line":570,"text":" \"$COMMAND_RC\" <<'PY'"},{"line":571,"text":"import json"},{"line":572,"text":"import sys"},{"line":573,"text":"from pathlib import Path"},{"line":574,"text":""},{"line":575,"text":"("},{"line":576,"text":" json_path,"},{"line":577,"text":" output_path,"},{"line":578,"text":" command_id,"},{"line":579,"text":" status,"},{"line":580,"text":" rc,"},{"line":581,"text":" host,"},{"line":582,"text":" mode,"},{"line":583,"text":" component,"},{"line":584,"text":" started,"},{"line":585,"text":" finished,"},{"line":586,"text":" reference_sha,"},{"line":587,"text":" error_sha,"},{"line":588,"text":" command_sha,"},{"line":589,"text":" raw_sha,"},{"line":590,"text":" sanitized_sha,"},{"line":591,"text":" run_started,"},{"line":592,"text":" repeat_blocked,"},{"line":593,"text":" block_reason,"},{"line":594,"text":" change_declared,"},{"line":595,"text":" result_contract_valid,"},{"line":596,"text":" contract_status,"},{"line":597,"text":" changes_made,"},{"line":598,"text":" rollback_started,"},{"line":599,"text":" rollback_restored,"},{"line":600,"text":" mutation_outcome,"},{"line":601,"text":" result_contract_error,"},{"line":602,"text":" command_rc,"},{"line":603,"text":") = sys.argv[1:]"},{"line":604,"text":""},{"line":605,"text":""},{"line":606,"text":"def optional_bool(value: str):"},{"line":607,"text":" if value == \"true\":"},{"line":608,"text":" return True"},{"line":609,"text":" if value == \"false\":"},{"line":610,"text":" return False"},{"line":611,"text":" return None"},{"line":612,"text":""},{"line":613,"text":"output = Path(output_path).read_text("},{"line":614,"text":" encoding=\"utf-8\","},{"line":615,"text":" errors=\"replace\","},{"line":616,"text":")"}],"match":" command_sha,","match_line":588},{"context":[{"line":627,"text":"else:"},{"line":628,"text":" output_preview = output"},{"line":629,"text":""},{"line":630,"text":"document = {"},{"line":631,"text":" \"schema_version\": 1,"},{"line":632,"text":" \"channel\": \"homelab-runtime\","},{"line":633,"text":" \"command_id\": command_id,"},{"line":634,"text":" \"status\": status,"},{"line":635,"text":" \"rc\": int(rc),"},{"line":636,"text":" \"host\": host,"},{"line":637,"text":" \"mode\": mode,"},{"line":638,"text":" \"component\": component,"},{"line":639,"text":" \"started_at_utc\": started,"},{"line":640,"text":" \"finished_at_utc\": finished,"},{"line":641,"text":" \"reference_register_checked\": True,"},{"line":642,"text":" \"reference_sha256\": reference_sha,"},{"line":643,"text":" \"error_register_checked\": True,"},{"line":644,"text":" \"error_register_sha256\": error_sha,"},{"line":645,"text":" \"command_sha256\": command_sha,"},{"line":646,"text":" \"duplicate_failed_command_blocked\": repeat_blocked == \"true\","},{"line":647,"text":" \"block_reason\": block_reason or None,"},{"line":648,"text":" \"execution_started\": run_started == \"true\","},{"line":649,"text":" \"change_declared\": change_declared == \"true\","},{"line":650,"text":" \"result_contract_valid\": result_contract_valid == \"true\","},{"line":651,"text":" \"result_contract_status\": ("},{"line":652,"text":" None"},{"line":653,"text":" if contract_status in {\"\", \"UNKNOWN\", \"NOT_APPLICABLE\"}"},{"line":654,"text":" else contract_status"},{"line":655,"text":" ),"},{"line":656,"text":" \"result_contract_error\": ("},{"line":657,"text":" None"},{"line":658,"text":" if result_contract_error == \"NONE\""},{"line":659,"text":" else result_contract_error"},{"line":660,"text":" ),"},{"line":661,"text":" \"command_rc\": int(command_rc) if command_rc else None,"},{"line":662,"text":" \"changes_made\": optional_bool(changes_made),"},{"line":663,"text":" \"rollback_started\": optional_bool(rollback_started),"},{"line":664,"text":" \"rollback_restored\": optional_bool(rollback_restored),"},{"line":665,"text":" \"mutation_outcome\": mutation_outcome,"},{"line":666,"text":" \"sanitized\": True,"},{"line":667,"text":" \"secrets_included\": False,"},{"line":668,"text":" \"private_addresses_included\": False,"},{"line":669,"text":" \"raw_evidence_retained_locally\": True,"},{"line":670,"text":" \"raw_evidence_sha256\": raw_sha,"},{"line":671,"text":" \"sanitized_output_sha256\": sanitized_sha,"},{"line":672,"text":" \"output_truncated_in_json\": output_truncated,"},{"line":673,"text":" \"full_sanitized_output_url\": ("}],"match":" \"command_sha256\": command_sha,","match_line":645},{"context":[{"line":651,"text":" \"result_contract_status\": ("},{"line":652,"text":" None"},{"line":653,"text":" if contract_status in {\"\", \"UNKNOWN\", \"NOT_APPLICABLE\"}"},{"line":654,"text":" else contract_status"},{"line":655,"text":" ),"},{"line":656,"text":" \"result_contract_error\": ("},{"line":657,"text":" None"},{"line":658,"text":" if result_contract_error == \"NONE\""},{"line":659,"text":" else result_contract_error"},{"line":660,"text":" ),"},{"line":661,"text":" \"command_rc\": int(command_rc) if command_rc else None,"},{"line":662,"text":" \"changes_made\": optional_bool(changes_made),"},{"line":663,"text":" \"rollback_started\": optional_bool(rollback_started),"},{"line":664,"text":" \"rollback_restored\": optional_bool(rollback_restored),"},{"line":665,"text":" \"mutation_outcome\": mutation_outcome,"},{"line":666,"text":" \"sanitized\": True,"},{"line":667,"text":" \"secrets_included\": False,"},{"line":668,"text":" \"private_addresses_included\": False,"},{"line":669,"text":" \"raw_evidence_retained_locally\": True,"},{"line":670,"text":" \"raw_evidence_sha256\": raw_sha,"},{"line":671,"text":" \"sanitized_output_sha256\": sanitized_sha,"},{"line":672,"text":" \"output_truncated_in_json\": output_truncated,"},{"line":673,"text":" \"full_sanitized_output_url\": ("},{"line":674,"text":" \"https://git.gram1.ru/.well-known/\""},{"line":675,"text":" \"homelab-runtime/latest.txt\""},{"line":676,"text":" ),"},{"line":677,"text":" \"output\": output_preview,"},{"line":678,"text":"}"},{"line":679,"text":""},{"line":680,"text":"Path(json_path).write_text("},{"line":681,"text":" json.dumps("},{"line":682,"text":" document,"},{"line":683,"text":" ensure_ascii=False,"},{"line":684,"text":" indent=2,"},{"line":685,"text":" )"},{"line":686,"text":" + \"\\n\","},{"line":687,"text":" encoding=\"utf-8\","},{"line":688,"text":")"},{"line":689,"text":"PY"},{"line":690,"text":""},{"line":691,"text":"{"},{"line":692,"text":" echo 'CHAT_OUTPUT_BEGIN'"},{"line":693,"text":" echo \"COMMAND_ID=$COMMAND_ID\""},{"line":694,"text":" echo \"STATUS=$STATUS\""},{"line":695,"text":" echo \"RC=$RC\""},{"line":696,"text":" echo \"HOST=$HOST_SHORT\""},{"line":697,"text":" echo \"MODE=$MODE\""}],"match":" \"raw_evidence_retained_locally\": True,","match_line":669},{"context":[{"line":685,"text":" )"},{"line":686,"text":" + \"\\n\","},{"line":687,"text":" encoding=\"utf-8\","},{"line":688,"text":")"},{"line":689,"text":"PY"},{"line":690,"text":""},{"line":691,"text":"{"},{"line":692,"text":" echo 'CHAT_OUTPUT_BEGIN'"},{"line":693,"text":" echo \"COMMAND_ID=$COMMAND_ID\""},{"line":694,"text":" echo \"STATUS=$STATUS\""},{"line":695,"text":" echo \"RC=$RC\""},{"line":696,"text":" echo \"HOST=$HOST_SHORT\""},{"line":697,"text":" echo \"MODE=$MODE\""},{"line":698,"text":" echo \"COMPONENT=$COMPONENT\""},{"line":699,"text":" echo 'REFERENCE_REGISTER_CHECK=OK'"},{"line":700,"text":" echo \"REFERENCE_SHA256=$REFERENCE_SHA256\""},{"line":701,"text":" echo 'ERROR_REGISTER_CHECK=OK'"},{"line":702,"text":" echo \"ERROR_REGISTER_SHA256=$ERROR_REGISTER_SHA256\""},{"line":703,"text":" echo \"COMMAND_SHA256=$COMMAND_SHA256\""},{"line":704,"text":" echo \"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\""},{"line":705,"text":" echo \"EXECUTION_STARTED=$RUN_STARTED\""},{"line":706,"text":" echo \"CHANGE_DECLARED=$CHANGE_DECLARED\""},{"line":707,"text":" echo \"RESULT_CONTRACT_VALID=$RESULT_CONTRACT_VALID\""},{"line":708,"text":" echo \"RESULT_CONTRACT_STATUS=$CONTRACT_STATUS\""},{"line":709,"text":" echo \"RESULT_CONTRACT_ERROR=$RESULT_CONTRACT_ERROR\""},{"line":710,"text":" echo \"COMMAND_RC=${COMMAND_RC:-}\""},{"line":711,"text":" echo \"CHANGES_MADE=$CHANGES_MADE\""},{"line":712,"text":" echo \"ROLLBACK_STARTED=$ROLLBACK_STARTED\""},{"line":713,"text":" echo \"ROLLBACK_RESTORED=$ROLLBACK_RESTORED\""},{"line":714,"text":" echo \"MUTATION_OUTCOME=$MUTATION_OUTCOME\""},{"line":715,"text":" echo 'SANITIZED=yes'"},{"line":716,"text":" echo 'SECRETS_INCLUDED=no'"},{"line":717,"text":" echo 'PRIVATE_ADDRESSES_INCLUDED=no'"},{"line":718,"text":" echo \"RAW_EVIDENCE_SHA256=$RAW_SHA256\""},{"line":719,"text":" echo \"SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256\""},{"line":720,"text":" echo 'OUTPUT_BEGIN'"},{"line":721,"text":" cat \"$SANITIZED_FILE\""},{"line":722,"text":" echo"},{"line":723,"text":" echo 'OUTPUT_END'"},{"line":724,"text":" echo 'CHAT_OUTPUT_END'"},{"line":725,"text":"} >\"$TXT_FILE\""},{"line":726,"text":""},{"line":727,"text":"chmod 0600 \\"},{"line":728,"text":" \"$RAW_FILE\" \\"},{"line":729,"text":" \"$SANITIZED_FILE\" \\"},{"line":730,"text":" \"$JSON_FILE\" \\"},{"line":731,"text":" \"$TXT_FILE\""}],"match":" echo \"COMMAND_SHA256=$COMMAND_SHA256\"","match_line":703},{"context":[{"line":710,"text":" echo \"COMMAND_RC=${COMMAND_RC:-}\""},{"line":711,"text":" echo \"CHANGES_MADE=$CHANGES_MADE\""},{"line":712,"text":" echo \"ROLLBACK_STARTED=$ROLLBACK_STARTED\""},{"line":713,"text":" echo \"ROLLBACK_RESTORED=$ROLLBACK_RESTORED\""},{"line":714,"text":" echo \"MUTATION_OUTCOME=$MUTATION_OUTCOME\""},{"line":715,"text":" echo 'SANITIZED=yes'"},{"line":716,"text":" echo 'SECRETS_INCLUDED=no'"},{"line":717,"text":" echo 'PRIVATE_ADDRESSES_INCLUDED=no'"},{"line":718,"text":" echo \"RAW_EVIDENCE_SHA256=$RAW_SHA256\""},{"line":719,"text":" echo \"SANITIZED_OUTPUT_SHA256=$SANITIZED_SHA256\""},{"line":720,"text":" echo 'OUTPUT_BEGIN'"},{"line":721,"text":" cat \"$SANITIZED_FILE\""},{"line":722,"text":" echo"},{"line":723,"text":" echo 'OUTPUT_END'"},{"line":724,"text":" echo 'CHAT_OUTPUT_END'"},{"line":725,"text":"} >\"$TXT_FILE\""},{"line":726,"text":""},{"line":727,"text":"chmod 0600 \\"},{"line":728,"text":" \"$RAW_FILE\" \\"},{"line":729,"text":" \"$SANITIZED_FILE\" \\"},{"line":730,"text":" \"$JSON_FILE\" \\"},{"line":731,"text":" \"$TXT_FILE\""},{"line":732,"text":""},{"line":733,"text":"TARGET=debian@[PRIVATE_IP]"},{"line":734,"text":"REMOTE_PREFIX=\"/tmp/homelab-runtime-${COMMAND_ID}-$$\""},{"line":735,"text":""},{"line":736,"text":"SSH_OPTS=("},{"line":737,"text":" -o BatchMode=yes"},{"line":738,"text":" -o ConnectTimeout=10"},{"line":739,"text":" -o ConnectionAttempts=1"},{"line":740,"text":" -o StrictHostKeyChecking=yes"},{"line":741,"text":" -o UserKnownHostsFile=[SENSITIVE_PATH] \\"},{"line":745,"text":" -q \\"},{"line":746,"text":" \"${SSH_OPTS[@]}\" \\"},{"line":747,"text":" \"$JSON_FILE\" \\"},{"line":748,"text":" \"${TARGET}:${REMOTE_PREFIX}.json\""},{"line":749,"text":""},{"line":750,"text":"scp \\"},{"line":751,"text":" -q \\"},{"line":752,"text":" \"${SSH_OPTS[@]}\" \\"},{"line":753,"text":" \"$TXT_FILE\" \\"},{"line":754,"text":" \"${TARGET}:${REMOTE_PREFIX}.txt\""},{"line":755,"text":""},{"line":756,"text":"ssh \"${SSH_OPTS[@]}\" \"$TARGET\" \""}],"match":" \"$RAW_FILE\" \\","match_line":728},{"context":[{"line":779,"text":" --max-time 15 \\"},{"line":780,"text":" \"$PUBLIC_URL\" 2>/dev/null ||"},{"line":781,"text":" true"},{"line":782,"text":" )\""},{"line":783,"text":""},{"line":784,"text":" if printf '%s\\n' \"$CONTENT\" |"},{"line":785,"text":" grep -Fq \"\\\"command_id\\\": \\\"$COMMAND_ID\\\"\"; then"},{"line":786,"text":" PUBLIC_VISIBLE=true"},{"line":787,"text":" break"},{"line":788,"text":" fi"},{"line":789,"text":""},{"line":790,"text":" sleep 2"},{"line":791,"text":"done"},{"line":792,"text":""},{"line":793,"text":"if [ \"$PUBLIC_VISIBLE\" != true ]; then"},{"line":794,"text":" echo 'RESULT=FAIL'"},{"line":795,"text":" echo 'REASON=PUBLIC_RUNTIME_RESULT_NOT_VISIBLE'"},{"line":796,"text":" echo \"COMMAND_ID=$COMMAND_ID\""},{"line":797,"text":" echo \"LOCAL_RAW_FILE=$RAW_FILE\""},{"line":798,"text":" exit 75"},{"line":799,"text":"fi"},{"line":800,"text":""},{"line":801,"text":"printf '%s\\t%s\\t%s\\t%s\\t%s\\t%s\\n' \\"},{"line":802,"text":" \"$FINISHED_AT\" \\"},{"line":803,"text":" \"$COMMAND_ID\" \\"},{"line":804,"text":" \"$COMMAND_SHA256\" \\"},{"line":805,"text":" \"$RC\" \\"},{"line":806,"text":" \"$STATUS\" \\"},{"line":807,"text":" \"$COMPONENT\" >>\"$LEDGER\""},{"line":808,"text":""},{"line":809,"text":"echo"},{"line":810,"text":"echo '===== HOMELAB CHAT RUN COMPLETE ====='"},{"line":811,"text":"echo \"COMMAND_ID=$COMMAND_ID\""},{"line":812,"text":"echo \"STATUS=$STATUS\""},{"line":813,"text":"echo \"RC=$RC\""},{"line":814,"text":"echo 'REFERENCE_REGISTER_CHECK=OK'"},{"line":815,"text":"echo 'ERROR_REGISTER_CHECK=OK'"},{"line":816,"text":"echo \"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\""},{"line":817,"text":"echo 'GITEA_PUBLICATION=OK'"},{"line":818,"text":"echo \"PUBLIC_URL=$PUBLIC_URL\""},{"line":819,"text":"echo \"LOCAL_RAW_FILE=$RAW_FILE\""},{"line":820,"text":"echo 'SHELL_SESSION_PRESERVED=yes'"},{"line":821,"text":""},{"line":822,"text":"exit \"$RC\""}],"match":" echo \"LOCAL_RAW_FILE=$RAW_FILE\"","match_line":797},{"context":[{"line":786,"text":" PUBLIC_VISIBLE=true"},{"line":787,"text":" break"},{"line":788,"text":" fi"},{"line":789,"text":""},{"line":790,"text":" sleep 2"},{"line":791,"text":"done"},{"line":792,"text":""},{"line":793,"text":"if [ \"$PUBLIC_VISIBLE\" != true ]; then"},{"line":794,"text":" echo 'RESULT=FAIL'"},{"line":795,"text":" echo 'REASON=PUBLIC_RUNTIME_RESULT_NOT_VISIBLE'"},{"line":796,"text":" echo \"COMMAND_ID=$COMMAND_ID\""},{"line":797,"text":" echo \"LOCAL_RAW_FILE=$RAW_FILE\""},{"line":798,"text":" exit 75"},{"line":799,"text":"fi"},{"line":800,"text":""},{"line":801,"text":"printf '%s\\t%s\\t%s\\t%s\\t%s\\t%s\\n' \\"},{"line":802,"text":" \"$FINISHED_AT\" \\"},{"line":803,"text":" \"$COMMAND_ID\" \\"},{"line":804,"text":" \"$COMMAND_SHA256\" \\"},{"line":805,"text":" \"$RC\" \\"},{"line":806,"text":" \"$STATUS\" \\"},{"line":807,"text":" \"$COMPONENT\" >>\"$LEDGER\""},{"line":808,"text":""},{"line":809,"text":"echo"},{"line":810,"text":"echo '===== HOMELAB CHAT RUN COMPLETE ====='"},{"line":811,"text":"echo \"COMMAND_ID=$COMMAND_ID\""},{"line":812,"text":"echo \"STATUS=$STATUS\""},{"line":813,"text":"echo \"RC=$RC\""},{"line":814,"text":"echo 'REFERENCE_REGISTER_CHECK=OK'"},{"line":815,"text":"echo 'ERROR_REGISTER_CHECK=OK'"},{"line":816,"text":"echo \"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\""},{"line":817,"text":"echo 'GITEA_PUBLICATION=OK'"},{"line":818,"text":"echo \"PUBLIC_URL=$PUBLIC_URL\""},{"line":819,"text":"echo \"LOCAL_RAW_FILE=$RAW_FILE\""},{"line":820,"text":"echo 'SHELL_SESSION_PRESERVED=yes'"},{"line":821,"text":""},{"line":822,"text":"exit \"$RC\""}],"match":" \"$COMMAND_SHA256\" \\","match_line":804}],"sha256":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d"} +RUNNER_CANDIDATE_ROOTS=["/etc/pve/31_HOMELAB_REFERENCE.md","/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md","/var/lib/homelab-chat-run","/var/log/homelab"] +TARGET_SHA_SEARCH=[{"files":[],"rc":1,"root":"/etc/pve/31_HOMELAB_REFERENCE.md","stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"files":[],"rc":1,"root":"/etc/pve/HOMELAB_ASSISTANT_ERROR_REGISTER.md","stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"files":["/var/lib/homelab-chat-run/state/command-ledger.tsv","/var/lib/homelab-chat-run/raw/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.log","/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.txt","/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171441Z.json","/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z.json","/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171441Z-latest.txt","/var/lib/homelab-chat-run/public/SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-SOURCE-PERSISTENCE-RECOVERY-789R1-20260920T171713Z-latest.txt"],"rc":0,"root":"/var/lib/homelab-chat-run","stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"files":[],"rc":1,"root":"/var/log/homelab","stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}] +RCA_ERROR_CLASS=TimeoutExpired +RCA_ERROR_SHA256=47027a3fd2fcca9dbfcae4c4ea66f79d2512e2d04aa00889dc8893508b183cc9 +NO_MUTATION=True +TASK_RESULT=PVEPRO_HOMEPAGE_PORTAL_789_RUNNER_DUPLICATE_RCA_FAILED +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"SUPPORT-260920-PVEPRO-HOMEPAGE-PORTAL-789-RUNNER-DUPLICATE-RCA-READONLY-790R1","rollback_restored":null,"rollback_started":false,"status":"FAIL","version":1} OUTPUT_END CHAT_OUTPUT_END