47 lines
51 KiB
Plaintext
47 lines
51 KiB
Plaintext
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
|