39 lines
14 KiB
JSON
39 lines
14 KiB
JSON
{
|
|
"schema_version": 1,
|
|
"channel": "homelab-runtime",
|
|
"command_id": "NEWFI-260907-A-PORTAL200-APPLY4DESIGN3",
|
|
"status": "OK",
|
|
"rc": 0,
|
|
"host": "pve01",
|
|
"mode": "read-only",
|
|
"component": "newfi-portal200-apply4-candidate-normalize",
|
|
"started_at_utc": "2026-09-07T20:18:26Z",
|
|
"finished_at_utc": "2026-09-07T20:18:27Z",
|
|
"reference_register_checked": true,
|
|
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
|
|
"error_register_checked": true,
|
|
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
|
|
"command_sha256": "6f936120464daa93c1069e66f470cbb6bfaee4d824c0c30f49ff3eb2dde5ebf6",
|
|
"duplicate_failed_command_blocked": false,
|
|
"block_reason": null,
|
|
"execution_started": true,
|
|
"change_declared": false,
|
|
"result_contract_valid": true,
|
|
"result_contract_status": null,
|
|
"result_contract_error": null,
|
|
"command_rc": 0,
|
|
"changes_made": false,
|
|
"rollback_started": false,
|
|
"rollback_restored": null,
|
|
"mutation_outcome": "NO_MUTATION",
|
|
"sanitized": true,
|
|
"secrets_included": false,
|
|
"private_addresses_included": false,
|
|
"raw_evidence_retained_locally": true,
|
|
"raw_evidence_sha256": "55b81abd8fe495315a80d73ed78d8a47ffabc58d5be709bc139c81844ecde12e",
|
|
"sanitized_output_sha256": "55b81abd8fe495315a80d73ed78d8a47ffabc58d5be709bc139c81844ecde12e",
|
|
"output_truncated_in_json": false,
|
|
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
|
|
"output": "APPLY4_DESIGN3_BEGIN=true\nCOMMAND_ID=NEWFI-260907-A-PORTAL200-APPLY4DESIGN3\nMUTATION_SCOPE=NONE_READ_ONLY\nMUTATIONS_PERFORMED=NO\nERROR_REGISTER_CHECK=OK\nERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\nREFERENCE_CHECK=OK\nREFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nNEWFI_260907_PORTAL200_APPLY2_HISTORY_SHA256=5e043e4f2429583487a791569aeca832f744bb71a5eee1617bb6706f6657051b\nNEWFI_260907_PORTAL200_APPLY2_STATUS=FAIL\nNEWFI_260907_PORTAL200_APPLY3_HISTORY_SHA256=f3ea3fcebd7b182e64db6e963a34f1b90baca0d08477e25e27bf88c48b33611c\nNEWFI_260907_PORTAL200_APPLY3_STATUS=FAIL\nNEWFI_260907_A_PORTAL200_APPLY4DESIGN2_HISTORY_SHA256=fbbb08bd7e9b5c4fb4a739bbcf94b54c202c1c045753114e2ffb5b988ec131b2\nNEWFI_260907_A_PORTAL200_APPLY4DESIGN2_STATUS=OK\nNEWFI_260907_B_PORTAL200_RECOVERY5_HISTORY_SHA256=08c00e675ffa960eca55102a114d305fb1a15291ff7e401dc43c09d087c32ece\nNEWFI_260907_B_PORTAL200_RECOVERY5_STATUS=OK\nTARGET_WORKTREES=[{\"dirty_count\":0,\"head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"remote_head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"repo\":\"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\"}]\nBASELINE_ADDON_JSON_PATHS=[\"src/addons/Newfi/Portal/addon.json\"]\nBASELINE_PORTAL_VERSION_ID=1000010\nBASELINE_PORTAL_VERSION_STRING=1.0.0 Alpha 1\nBASELINE_ADDON_JSON_SHA256=288a61044c941107162d045be49ab2e7c844d1586b25378a7289b3c7275010ab\nCANDIDATE_MARKER_LINES=[{\"line\":\"PORTAL200_FLOW=candidate->staging-apply->rollback-proof->staging-reapply->git-push->production\",\"source\":\"NEWFI-260907-PORTAL200-APPLY2\"},{\"line\":\"PORTAL200_CANDIDATE_IDENTITY=PASS\",\"source\":\"NEWFI-260907-PORTAL200-APPLY2\"},{\"line\":\"PORTAL200_FLOW=candidate->staging-apply->rollback-proof->staging-reapply->git-push->production\",\"source\":\"NEWFI-260907-PORTAL200-APPLY3\"},{\"line\":\"PORTAL200_CANDIDATE_IDENTITY=PASS\",\"source\":\"NEWFI-260907-PORTAL200-APPLY3\"}]\nCANDIDATE_VERSION_CONTEXTS=[]\nCANDIDATE_HASH_CONTEXTS=[]\nALL_CANDIDATE_CONTEXT_VERSION_IDS=[]\nALL_CANDIDATE_CONTEXT_VERSION_STRINGS=[]\nNON_BASELINE_VERSION_IDS=[]\nNON_BASELINE_VERSION_STRINGS=[]\nNORMALIZED_CANDIDATE_VERSION_ID=UNPROVEN\nNORMALIZED_CANDIDATE_VERSION_STRING=UNPROVEN\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nRUNNER_CONTRACT_RELEVANT_LINES=[\"import sys\",\"from pathlib import Path\",\"\",\"raw_path, command_id, mode, command_rc = sys.argv[1:]\",\"command_rc = int(command_rc)\",\"result = {\",\" \\\"valid\\\": True,\",\" \\\"status\\\": \\\"NOT_APPLICABLE\\\",\",\" \\\"changes_made\\\": \\\"false\\\",\",\" \\\"rollback_started\\\": \\\"false\\\",\",\" \\\"rollback_restored\\\": \\\"null\\\",\",\" \\\"mutation_outcome\\\": \\\"NO_MUTATION\\\",\",\" \\\"error\\\": \\\"NONE\\\",\",\"}\",\"if mode == \\\"change\\\":\",\" result = {\",\" \\\"valid\\\": False,\",\" \\\"status\\\": \\\"UNKNOWN\\\",\",\" \\\"changes_made\\\": \\\"unknown\\\",\",\" \\\"rollback_started\\\": \\\"unknown\\\",\",\" \\\"rollback_restored\\\": \\\"null\\\",\",\" \\\"mutation_outcome\\\": \\\"UNKNOWN\\\",\",\" \\\"error\\\": \\\"MISSING_CONTRACT\\\",\",\" }\",\" marker = \\\"HOMELAB_RESULT_CONTRACT=\\\"\",\" lines = Path(raw_path).read_bytes().decode(\",\" \\\"utf-8\\\",\",\" errors=\\\"replace\\\",\",\" if not isinstance(document, dict):\",\" raise ValueError(\\\"contract root is not object\\\")\",\" if document.get(\\\"version\\\") != 1:\",\" raise ValueError(\\\"unsupported version\\\")\",\" if document.get(\\\"command_id\\\") != command_id:\",\" raise ValueError(\\\"command_id mismatch\\\")\",\" status = document.get(\\\"status\\\")\",\" if status not in {\\\"OK\\\", \\\"BLOCKED\\\", \\\"FAIL\\\"}:\",\" raise ValueError(\\\"invalid status\\\")\",\" changes = document.get(\\\"changes_made\\\")\",\" rollback_started = document.get(\\\"rollback_started\\\")\",\" rollback_restored = document.get(\\\"rollback_restored\\\")\",\" if not isinstance(changes, bool):\",\" raise ValueError(\\\"changes_made must be boolean\\\")\",\" if not isinstance(rollback_started, bool):\",\" raise ValueError(\\\"rollback_started must be boolean\\\")\",\" if rollback_restored is not None and not isinstance(\",\" rollback_restored,\",\" bool,\",\" ):\",\" raise ValueError(\",\" \\\"rollback_restored must be boolean or null\\\"\",\" )\",\" if rollback_restored is True and rollback_started is not True:\",\" \\\"rollback_restored without rollback_started\\\"\",\" if rollback_started is True and changes is not True:\",\" \\\"rollback_started without changes\\\"\",\" if status == \\\"BLOCKED\\\" and (\",\" changes\",\" or rollback_started\",\" or command_rc != 2\",\" \\\"BLOCKED contract inconsistent with rc/mutation\\\"\",\" if status == \\\"OK\\\" and command_rc != 0:\",\" raise ValueError(\\\"OK contract inconsistent with rc\\\")\",\" if status == \\\"FAIL\\\" and command_rc == 0:\",\" raise ValueError(\\\"FAIL contract inconsistent with rc\\\")\",\" if not changes:\",\" outcome = \\\"NO_MUTATION\\\"\",\" elif not rollback_started:\",\" outcome = \\\"MUTATED\\\"\",\" elif rollback_restored is True:\",\" outcome = \\\"ROLLED_BACK\\\"\",\" elif rollback_restored is False:\",\" outcome = \\\"ROLLBACK_FAILED\\\"\",\" else:\",\" outcome = \\\"ROLLBACK_UNKNOWN\\\"\",\" result = {\",\" \\\"valid\\\": True,\",\" \\\"status\\\": status,\",\" \\\"changes_made\\\": str(changes).lower(),\",\" \\\"rollback_started\\\": str(\",\" rollback_started\",\" ).lower(),\",\" \\\"rollback_restored\\\": (\",\" \\\"null\\\"\",\" if rollback_restored is None\",\" else str(rollback_restored).lower()\",\" ),\",\" \\\"mutation_outcome\\\": outcome,\",\" \\\"error\\\": \\\"NONE\\\",\",\" }\",\" except Exception as exc:\",\" result[\\\"error\\\"] = (\",\" \\\"INVALID_CONTRACT:\\\" + type(exc).__name__\",\" )\",\" elif len(payloads) > 1:\",\" result[\\\"error\\\"] = \\\"MULTIPLE_CONTRACTS\\\"\",\"print(\\\"\\\\t\\\".join([\",\" str(result[\\\"valid\\\"]).lower(),\",\" result[\\\"status\\\"],\",\" result[\\\"changes_made\\\"],\",\" result[\\\"rollback_started\\\"],\",\" result[\\\"rollback_restored\\\"],\",\" result[\\\"mutation_outcome\\\"],\",\" result[\\\"error\\\"],\",\"]))\",\" trap 'rm -f \\\"$tmp\\\"' RETURN\",\" printf '%s\\\\n' \\\\\",\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T1\\\",\\\"status\\\":\\\"BLOCKED\\\",\\\"changes_made\\\":false,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\" >\\\"$tmp\\\"\",\" [ \\\"$(read_mutation_contract \\\"$tmp\\\" T1 change 2)\\\" = \\\\\",\" $'true\\\\tBLOCKED\\\\tfalse\\\\tfalse\\\\tnull\\\\tNO_MUTATION\\\\tNONE' ]\",\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T2\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\" [ \\\"$(read_mutation_contract \\\"$tmp\\\" T2 change 0)\\\" = \\\\\",\" $'true\\\\tOK\\\\ttrue\\\\tfalse\\\\tnull\\\\tMUTATED\\\\tNONE' ]\",\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T3\\\",\\\"status\\\":\\\"FAIL\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":true,\\\"rollback_restored\\\":true}' \\\\\",\" [ \\\"$(read_mutation_contract \\\"$tmp\\\" T3 change 1)\\\" = \\\\\",\" $'true\\\\tFAIL\\\\ttrue\\\\ttrue\\\\ttrue\\\\tROLLED_BACK\\\\tNONE' ]\",\" $'true\\\\tNOT_APPLICABLE\\\\tfalse\\\\tfalse\\\\tnull\\\\tNO_MUTATION\\\\tNONE' ]\",\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"OTHER\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\" [ \\\"$(read_mutation_contract \\\"$tmp\\\" T6 change 0)\\\" = \\\\\",\" $'false\\\\tUNKNOWN\\\\tunknown\\\\tunknown\\\\tnull\\\\tUNKNOWN\\\\tINVALID_CONTRACT:ValueError' ]\",\" 'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\" [ \\\"$(read_mutation_contract \\\"$tmp\\\" T7 change 0)\\\" = \\\\\",\" $'false\\\\tUNKNOWN\\\\tunknown\\\\tunknown\\\\tnull\\\\tUNKNOWN\\\\tMULTIPLE_CONTRACTS' ]\",\"usage() {\",\" cat >&2 <<'USAGE'\",\"Usage:\",\" homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]\",\"MODE:\",\" read-only\",\"[ \\\"$#\\\" -ge 5 ] || usage\",\"COMMAND_ID=\\\"$1\\\"\",\"MODE=\\\"$2\\\"\",\"COMPONENT=\\\"$3\\\"\",\"shift 3\",\"shift\",\"[ \\\"$#\\\" -ge 1 ] || usage\",\"case \\\"$COMMAND_ID\\\" in\",\" ''|*[!A-Za-z0-9._-]*)\",\" echo 'RESULT=FAIL'\",\" echo 'REASON=INVALID_COMMAND_ID'\",\" exit 65\",\" ;;\",\"esac\",\"STAMP=\\\"$(date -u +%Y%m%dT%H%M%SZ)\\\"\",\"HOST_SHORT=\\\"$(hostname -s 2>/dev/null || hostname)\\\"\",\"RAW_FILE=\\\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\\\"\",\"SANITIZED_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\\\"\",\"JSON_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\\\"\",\"TXT_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\\\"\",\"REFERENCE_SHA256=\\\"$(sha256sum \\\"$REFERENCE\\\" | awk '{print $1}')\\\"\",\"ERROR_REGISTER_SHA256=\\\"$(sha256sum \\\"$ERROR_REGISTER\\\" | awk '{print $1}')\\\"\",\"BLOCK_REASON=''\",\"CHANGE_DECLARED=false\",\"RESULT_CONTRACT_VALID=true\",\"CONTRACT_STATUS='NOT_APPLICABLE'\",\"CHANGES_MADE=false\",\"ROLLBACK_STARTED=false\",\"ROLLBACK_RESTORED=null\",\"MUTATION_OUTCOME='NO_MUTATION'\",\"RESULT_CONTRACT_ERROR='NONE'\",\"COMMAND_RC=''\",\"if [ \\\"$MODE\\\" = change ]; then\",\" CHANGE_DECLARED=true\",\" RESULT_CONTRACT_VALID=false\",\" CONTRACT_STATUS='UNKNOWN'\",\" CHANGES_MADE=unknown\",\" ROLLBACK_STARTED=unknown\",\" ROLLBACK_RESTORED=null\",\" MUTATION_OUTCOME='UNKNOWN'\",\" RESULT_CONTRACT_ERROR='MISSING_CONTRACT'\",\"fi\",\" REPEAT_BLOCKED=true\",\" BLOCK_REASON='EXACT_FAILED_COMMAND_REPEAT'\",\" RC=73\",\" STATUS='BLOCKED'\",\" RESULT_CONTRACT_VALID=true\",\" CONTRACT_STATUS='BLOCKED'\",\" CHANGES_MADE=false\",\" ROLLBACK_STARTED=false\",\" MUTATION_OUTCOME='NO_MUTATION'\",\" RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'\",\" timeout \\\\\",\" --foreground \\\\\",\" --preserve-status \\\\\",\" \\\"$HOMELAB_TIMEOUT\\\" \\\\\",\" \\\"$@\\\" >\\\"$RAW_FILE\\\" 2>&1\",\" RC=$?\",\" COMMAND_RC=\\\"$RC\\\"\",\" if [ \\\"$RC\\\" -eq 0 ]; then\",\" STATUS='OK'\",\" else\",\" STATUS='FAIL'\",\" fi\",\" IFS=$'\\\\t' read -r \\\\\",\" RESULT_CONTRACT_VALID \\\\\",\" CONTRACT_STATUS \\\\\",\" CHANGES_MADE \\\\\",\" ROLLBACK_STARTED \\\\\",\" ROLLBACK_RESTORED \\\\\",\" MUTATION_OUTCOME \\\\\",\" RESULT_CONTRACT_ERROR < <(\",\" read_mutation_contract \\\\\",\" \\\"$RAW_FILE\\\" \\\\\",\" \\\"$COMMAND_ID\\\" \\\\\",\" \\\"$MODE\\\" \\\\\",\" \\\"$COMMAND_RC\\\"\",\" )\",\" if [ \\\"$MODE\\\" = change ]; then\",\" if [ \\\"$RESULT_CONTRACT_VALID\\\" != true ]; then\",\" RC=76\",\" STATUS='FAIL'\",\" else\",\" STATUS=\\\"$CONTRACT_STATUS\\\"\",\" fi\",\"python3 - \\\\\",\" \\\"$JSON_FILE\\\" \\\\\",\" \\\"$SANITIZED_FILE\\\" \\\\\",\" \\\"$COMMAND_ID\\\" \\\\\",\" \\\"$STATUS\\\" \\\\\",\" \\\"$RC\\\" \\\\\"]\nHOLD_REASONS=[\"EXACT_CANDIDATE_VERSION_ID_NOT_UNIQUE\",\"EXACT_CANDIDATE_VERSION_STRING_NOT_UNIQUE\",\"EXACT_CANDIDATE_HASH_EVIDENCE_MISSING\"]\nFINAL_DECISION=HOLD_PORTAL200_APPLY4_CHANGE_EXACT_CANDIDATE_VERSION_ID_NOT_UNIQUE__EXACT_CANDIDATE_VERSION_STRING_NOT_UNIQUE__EXACT_CANDIDATE_HASH_EVIDENCE_MISSING\nAPPLY4_DESIGN3_END=true\n"
|
|
}
|