1
0

runtime: publish NEWFI-260907-RUNNERCONTRACT47

This commit is contained in:
homelab-runtime-publisher
2026-09-07 10:49:29 +00:00
parent 941a64356d
commit b154f64ae3
4 changed files with 492 additions and 21 deletions
File diff suppressed because one or more lines are too long
@@ -0,0 +1,237 @@
CHAT_OUTPUT_BEGIN
COMMAND_ID=NEWFI-260907-RUNNERCONTRACT47
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=newfi-runner-contract-status-rca
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=63ee0255b910daf2f06f62bca781d351b6e54a1ad4cbe8f16a0d325edc204626
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
CHANGE_DECLARED=false
RESULT_CONTRACT_VALID=true
RESULT_CONTRACT_STATUS=NOT_APPLICABLE
RESULT_CONTRACT_ERROR=NONE
COMMAND_RC=0
CHANGES_MADE=false
ROLLBACK_STARTED=false
ROLLBACK_RESTORED=null
MUTATION_OUTCOME=NO_MUTATION
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
RAW_EVIDENCE_SHA256=f9b3192a7eced7003947dfaeab409344216b73c58a17b7a5a3a0849a7817b200
SANITIZED_OUTPUT_SHA256=f9b3192a7eced7003947dfaeab409344216b73c58a17b7a5a3a0849a7817b200
OUTPUT_BEGIN
NEWFI47_BEGIN
COMMAND_ID=NEWFI-260907-RUNNERCONTRACT47
MUTATION_SCOPE=NONE_READ_ONLY
RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d
RUNNER_BYTES=21321
STATUS_LITERALS_NEAR_CONTRACT=["FAIL","MUTATED","NOT_APPLICABLE","NO_MUTATION","OK","ROLLED_BACK","UNKNOWN"]
STATUS_COMPARISONS_NEAR_CONTRACT=["{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","BLOCKED","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL"]
SELECTED_SOURCE_LINES_BEGIN
{"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":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":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("}
{"line":64,"text":" rollback_restored,"}
{"line":65,"text":" bool,"}
{"line":66,"text":" ):"}
{"line":67,"text":" raise ValueError("}
{"line":68,"text":" \"rollback_restored must be boolean or null\""}
{"line":69,"text":" )"}
{"line":70,"text":" if rollback_restored is True and rollback_started is not True:"}
{"line":71,"text":" raise ValueError("}
{"line":72,"text":" \"rollback_restored without rollback_started\""}
{"line":73,"text":" )"}
{"line":74,"text":" if rollback_started is True and changes is not True:"}
{"line":75,"text":" raise ValueError("}
{"line":76,"text":" \"rollback_started without changes\""}
{"line":77,"text":" )"}
{"line":78,"text":" if status == \"BLOCKED\" and ("}
{"line":79,"text":" changes"}
{"line":80,"text":" or rollback_started"}
{"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":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":125,"text":" str(result[\"valid\"]).lower(),"}
{"line":126,"text":" result[\"status\"],"}
{"line":127,"text":" result[\"changes_made\"],"}
{"line":128,"text":" result[\"rollback_started\"],"}
{"line":129,"text":" result[\"rollback_restored\"],"}
{"line":130,"text":" result[\"mutation_outcome\"],"}
{"line":131,"text":" result[\"error\"],"}
{"line":140,"text":""}
{"line":141,"text":" printf '%s\\n' \\"}
{"line":142,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T1\",\"status\":\"BLOCKED\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}' \\"}
{"line":143,"text":" >\"$tmp\""}
{"line":144,"text":" [ \"$(read_mutation_contract \"$tmp\" T1 change 2)\" = \\"}
{"line":146,"text":""}
{"line":147,"text":" printf '%s\\n' \\"}
{"line":148,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T2\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"}
{"line":149,"text":" >\"$tmp\""}
{"line":150,"text":" [ \"$(read_mutation_contract \"$tmp\" T2 change 0)\" = \\"}
{"line":152,"text":""}
{"line":153,"text":" printf '%s\\n' \\"}
{"line":154,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T3\",\"status\":\"FAIL\",\"changes_made\":true,\"rollback_started\":true,\"rollback_restored\":true}' \\"}
{"line":155,"text":" >\"$tmp\""}
{"line":156,"text":" [ \"$(read_mutation_contract \"$tmp\" T3 change 1)\" = \\"}
{"line":166,"text":""}
{"line":167,"text":" printf '%s\\n' \\"}
{"line":168,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"OTHER\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"}
{"line":169,"text":" >\"$tmp\""}
{"line":170,"text":" [ \"$(read_mutation_contract \"$tmp\" T6 change 0)\" = \\"}
{"line":171,"text":" $'false\\tUNKNOWN\\tunknown\\tunknown\\tnull\\tUNKNOWN\\tINVALID_CONTRACT:ValueError' ]"}
{"line":172,"text":""}
{"line":173,"text":" printf '%s\\n' \\"}
{"line":174,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"}
{"line":175,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"}
{"line":176,"text":" >\"$tmp\""}
{"line":177,"text":" [ \"$(read_mutation_contract \"$tmp\" T7 change 0)\" = \\"}
{"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"}
{"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":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":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":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":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":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":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":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":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":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":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":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\""}
SELECTED_SOURCE_LINES_END
HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"NEWFI-260907-RUNNERCONTRACT47","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null}
NEWFI47_END
OUTPUT_END
CHAT_OUTPUT_END
+8 -8
View File
File diff suppressed because one or more lines are too long
+209 -13
View File
@@ -1,15 +1,15 @@
CHAT_OUTPUT_BEGIN
COMMAND_ID=NEWFI-260907-PORTAL200-HTTPRCA1
COMMAND_ID=NEWFI-260907-RUNNERCONTRACT47
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=newfi-portal200-http-rca
COMPONENT=newfi-runner-contract-status-rca
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=90252a18f33ee01c0f8e5c8ad032e2c666c4d2dc2fa565690200f3769943abab
COMMAND_SHA256=63ee0255b910daf2f06f62bca781d351b6e54a1ad4cbe8f16a0d325edc204626
DUPLICATE_FAILED_COMMAND_BLOCKED=false
EXECUTION_STARTED=true
CHANGE_DECLARED=false
@@ -24,18 +24,214 @@ MUTATION_OUTCOME=NO_MUTATION
SANITIZED=yes
SECRETS_INCLUDED=no
PRIVATE_ADDRESSES_INCLUDED=no
RAW_EVIDENCE_SHA256=c6bc4d065690ff2e7c08992935c07369cbf92df2eb16290744d921372f5d1c1b
SANITIZED_OUTPUT_SHA256=c6bc4d065690ff2e7c08992935c07369cbf92df2eb16290744d921372f5d1c1b
RAW_EVIDENCE_SHA256=f9b3192a7eced7003947dfaeab409344216b73c58a17b7a5a3a0849a7817b200
SANITIZED_OUTPUT_SHA256=f9b3192a7eced7003947dfaeab409344216b73c58a17b7a5a3a0849a7817b200
OUTPUT_BEGIN
NEWFI46_BEGIN
COMMAND_ID=NEWFI-260907-PORTAL200-HTTPRCA1
PORTAL200_ROADMAP_REMAINS=22
NEWFI47_BEGIN
COMMAND_ID=NEWFI-260907-RUNNERCONTRACT47
MUTATION_SCOPE=NONE_READ_ONLY
RCA_TARGET=FIRST_PREFLIGHT_HTTP_VERIFIER_FROM_APPLY1
STAGING_HTTP_VERIFIER_RAW={"qga":{"err_data":"FAIL_REASON=NO_CSS_HREFS\n","err_truncated":0,"exitcode":46,"exited":1,"out_data":"PORTAL200_HTTP_RCA_JSON={\"bytes\":23817,\"css_count\":0,\"css_marker\":false,\"css_status\":[],\"hrefs\":[],\"html_marker\":false,\"mode\":\"staging\",\"old_copy\":false,\"state\":\"old\",\"status\":503}\n","out_truncated":0},"transport_rc":0,"transport_stderr":"","transport_stdout":"{\n \"err-data\" : \"FAIL_REASON=NO_CSS_HREFS\\n\",\n \"err-truncated\" : 0,\n \"exitcode\" : 46,\n \"exited\" : 1,\n \"out-data\" : \"PORTAL200_HTTP_RCA_JSON={\\\"bytes\\\":23817,\\\"css_count\\\":0,\\\"css_marker\\\":false,\\\"css_status\\\":[],\\\"hrefs\\\":[],\\\"html_marker\\\":false,\\\"mode\\\":\\\"staging\\\",\\\"old_copy\\\":false,\\\"state\\\":\\\"old\\\",\\\"status\\\":503}\\n\",\n \"out-truncated\" : 0\n}\n"}
PROD_HTTP_VERIFIER_RAW={"qga":{"err_data":"FETCH_CURL_RC=7\nFETCH_CURL_STDERR=curl: (7) Failed to connect to newfi.ru port 443 after 0 ms: Couldn't connect to server\n\n","err_truncated":0,"exitcode":41,"exited":1,"out_data":"","out_truncated":null},"transport_rc":0,"transport_stderr":"","transport_stdout":"{\n \"err-data\" : \"FETCH_CURL_RC=7\\nFETCH_CURL_STDERR=curl: (7) Failed to connect to newfi.ru port 443 after 0 ms: Couldn't connect to server\\n\\n\",\n \"err-truncated\" : 0,\n \"exitcode\" : 41,\n \"exited\" : 1\n}\n"}
HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"NEWFI-260907-PORTAL200-HTTPRCA1","rollback_restored":null,"rollback_started":false,"status":"OK","version":1}
NEWFI46_END
RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d
RUNNER_BYTES=21321
STATUS_LITERALS_NEAR_CONTRACT=["FAIL","MUTATED","NOT_APPLICABLE","NO_MUTATION","OK","ROLLED_BACK","UNKNOWN"]
STATUS_COMPARISONS_NEAR_CONTRACT=["{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","{\"OK\", \"BLOCKED\", \"FAIL\"}","BLOCKED","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL","BLOCKED","OK","FAIL"]
SELECTED_SOURCE_LINES_BEGIN
{"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":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":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("}
{"line":64,"text":" rollback_restored,"}
{"line":65,"text":" bool,"}
{"line":66,"text":" ):"}
{"line":67,"text":" raise ValueError("}
{"line":68,"text":" \"rollback_restored must be boolean or null\""}
{"line":69,"text":" )"}
{"line":70,"text":" if rollback_restored is True and rollback_started is not True:"}
{"line":71,"text":" raise ValueError("}
{"line":72,"text":" \"rollback_restored without rollback_started\""}
{"line":73,"text":" )"}
{"line":74,"text":" if rollback_started is True and changes is not True:"}
{"line":75,"text":" raise ValueError("}
{"line":76,"text":" \"rollback_started without changes\""}
{"line":77,"text":" )"}
{"line":78,"text":" if status == \"BLOCKED\" and ("}
{"line":79,"text":" changes"}
{"line":80,"text":" or rollback_started"}
{"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":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":125,"text":" str(result[\"valid\"]).lower(),"}
{"line":126,"text":" result[\"status\"],"}
{"line":127,"text":" result[\"changes_made\"],"}
{"line":128,"text":" result[\"rollback_started\"],"}
{"line":129,"text":" result[\"rollback_restored\"],"}
{"line":130,"text":" result[\"mutation_outcome\"],"}
{"line":131,"text":" result[\"error\"],"}
{"line":140,"text":""}
{"line":141,"text":" printf '%s\\n' \\"}
{"line":142,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T1\",\"status\":\"BLOCKED\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}' \\"}
{"line":143,"text":" >\"$tmp\""}
{"line":144,"text":" [ \"$(read_mutation_contract \"$tmp\" T1 change 2)\" = \\"}
{"line":146,"text":""}
{"line":147,"text":" printf '%s\\n' \\"}
{"line":148,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T2\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"}
{"line":149,"text":" >\"$tmp\""}
{"line":150,"text":" [ \"$(read_mutation_contract \"$tmp\" T2 change 0)\" = \\"}
{"line":152,"text":""}
{"line":153,"text":" printf '%s\\n' \\"}
{"line":154,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T3\",\"status\":\"FAIL\",\"changes_made\":true,\"rollback_started\":true,\"rollback_restored\":true}' \\"}
{"line":155,"text":" >\"$tmp\""}
{"line":156,"text":" [ \"$(read_mutation_contract \"$tmp\" T3 change 1)\" = \\"}
{"line":166,"text":""}
{"line":167,"text":" printf '%s\\n' \\"}
{"line":168,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"OTHER\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"}
{"line":169,"text":" >\"$tmp\""}
{"line":170,"text":" [ \"$(read_mutation_contract \"$tmp\" T6 change 0)\" = \\"}
{"line":171,"text":" $'false\\tUNKNOWN\\tunknown\\tunknown\\tnull\\tUNKNOWN\\tINVALID_CONTRACT:ValueError' ]"}
{"line":172,"text":""}
{"line":173,"text":" printf '%s\\n' \\"}
{"line":174,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"}
{"line":175,"text":" 'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\"}
{"line":176,"text":" >\"$tmp\""}
{"line":177,"text":" [ \"$(read_mutation_contract \"$tmp\" T7 change 0)\" = \\"}
{"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"}
{"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":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":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":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":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":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":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":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":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":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":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":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\""}
SELECTED_SOURCE_LINES_END
HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"NEWFI-260907-RUNNERCONTRACT47","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null}
NEWFI47_END
OUTPUT_END
CHAT_OUTPUT_END