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
