1
0
Files
homelab-public-context/runtime/latest.json
T
2026-09-07 18:41:52 +00:00

39 lines
15 KiB
JSON

{
"schema_version": 1,
"channel": "homelab-runtime",
"command_id": "NEWFI-260907-B-PORTAL200-RECOVERY1",
"status": "OK",
"rc": 0,
"host": "pve01",
"mode": "read-only",
"component": "newfi-portal200-post-apply3-recovery",
"started_at_utc": "2026-09-07T18:41:34Z",
"finished_at_utc": "2026-09-07T18:41:52Z",
"reference_register_checked": true,
"reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66",
"error_register_checked": true,
"error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0",
"command_sha256": "d8eafd855d3bb7704ed58082193c471dc66b330930971af4ecb75ba88e78dee7",
"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": "4374c49510ffe36bec1cd54e5668650886725d6b65f4634aa7e39c404224074a",
"sanitized_output_sha256": "4374c49510ffe36bec1cd54e5668650886725d6b65f4634aa7e39c404224074a",
"output_truncated_in_json": false,
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
"output": "RECOVERY_AUDIT_BEGIN=true\nCOMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY1\nMUTATION_SCOPE=NONE_READ_ONLY\nMUTATIONS_PERFORMED=NO\nERROR_REGISTER_CHECK=OK\nERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\nREFERENCE_CHECK=OK\nREFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\nERROR_REGISTER_CHECK=OK\nREFERENCE_CHECK=OK\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nRUNNER_CONTRACT_EXCERPT=[\"9:from pathlib import Path\",\"11:raw_path, command_id, mode, command_rc = sys.argv[1:]\",\"12:command_rc = int(command_rc)\",\"14:result = {\",\"15:\\\"valid\\\": True,\",\"16:\\\"status\\\": \\\"NOT_APPLICABLE\\\",\",\"17:\\\"changes_made\\\": \\\"false\\\",\",\"18:\\\"rollback_started\\\": \\\"false\\\",\",\"19:\\\"rollback_restored\\\": \\\"null\\\",\",\"20:\\\"mutation_outcome\\\": \\\"NO_MUTATION\\\",\",\"21:\\\"error\\\": \\\"NONE\\\",\",\"25:result = {\",\"26:\\\"valid\\\": False,\",\"27:\\\"status\\\": \\\"UNKNOWN\\\",\",\"28:\\\"changes_made\\\": \\\"unknown\\\",\",\"29:\\\"rollback_started\\\": \\\"unknown\\\",\",\"30:\\\"rollback_restored\\\": \\\"null\\\",\",\"31:\\\"mutation_outcome\\\": \\\"UNKNOWN\\\",\",\"32:\\\"error\\\": \\\"MISSING_CONTRACT\\\",\",\"33:}\",\"34:marker = \\\"HOMELAB_RESULT_CONTRACT=\\\"\",\"35:lines = Path(raw_path).read_bytes().decode(\",\"36:\\\"utf-8\\\",\",\"47:if not isinstance(document, dict):\",\"48:raise ValueError(\\\"contract root is not object\\\")\",\"49:if document.get(\\\"version\\\") != 1:\",\"50:raise ValueError(\\\"unsupported version\\\")\",\"51:if document.get(\\\"command_id\\\") != command_id:\",\"52:raise ValueError(\\\"command_id mismatch\\\")\",\"53:status = document.get(\\\"status\\\")\",\"54:if status not in {\\\"OK\\\", \\\"BLOCKED\\\", \\\"FAIL\\\"}:\",\"55:raise ValueError(\\\"invalid status\\\")\",\"56:changes = document.get(\\\"changes_made\\\")\",\"57:rollback_started = document.get(\\\"rollback_started\\\")\",\"58:rollback_restored = document.get(\\\"rollback_restored\\\")\",\"59:if not isinstance(changes, bool):\",\"60:raise ValueError(\\\"changes_made must be boolean\\\")\",\"61:if not isinstance(rollback_started, bool):\",\"62:raise ValueError(\\\"rollback_started must be boolean\\\")\",\"63:if rollback_restored is not None and not isinstance(\",\"64:rollback_restored,\",\"65:bool,\",\"66:):\",\"67:raise ValueError(\",\"68:\\\"rollback_restored must be boolean or null\\\"\",\"69:)\",\"70:if rollback_restored is True and rollback_started is not True:\",\"71:raise ValueError(\",\"72:\\\"rollback_restored without rollback_started\\\"\",\"73:)\",\"74:if rollback_started is True and changes is not True:\",\"75:raise ValueError(\",\"76:\\\"rollback_started without changes\\\"\",\"77:)\",\"78:if status == \\\"BLOCKED\\\" and (\",\"79:changes\",\"80:or rollback_started\",\"81:or command_rc != 2\",\"82:):\",\"84:\\\"BLOCKED contract inconsistent with rc/mutation\\\"\",\"85:)\",\"86:if status == \\\"OK\\\" and command_rc != 0:\",\"87:raise ValueError(\\\"OK contract inconsistent with rc\\\")\",\"88:if status == \\\"FAIL\\\" and command_rc == 0:\",\"89:raise ValueError(\\\"FAIL contract inconsistent with rc\\\")\",\"91:if not changes:\",\"92:outcome = \\\"NO_MUTATION\\\"\",\"93:elif not rollback_started:\",\"94:outcome = \\\"MUTATED\\\"\",\"95:elif rollback_restored is True:\",\"96:outcome = \\\"ROLLED_BACK\\\"\",\"97:elif rollback_restored is False:\",\"98:outcome = \\\"ROLLBACK_FAILED\\\"\",\"99:else:\",\"102:result = {\",\"103:\\\"valid\\\": True,\",\"104:\\\"status\\\": status,\",\"105:\\\"changes_made\\\": str(changes).lower(),\",\"106:\\\"rollback_started\\\": str(\",\"107:rollback_started\",\"108:).lower(),\",\"109:\\\"rollback_restored\\\": (\",\"110:\\\"null\\\"\",\"111:if rollback_restored is None\",\"112:else str(rollback_restored).lower()\",\"113:),\",\"114:\\\"mutation_outcome\\\": outcome,\",\"117:except Exception as exc:\",\"118:result[\\\"error\\\"] = (\",\"119:\\\"INVALID_CONTRACT:\\\" + type(exc).__name__\",\"120:)\",\"121:elif len(payloads) > 1:\",\"124:print(\\\"\\\\t\\\".join([\",\"125:str(result[\\\"valid\\\"]).lower(),\",\"126:result[\\\"status\\\"],\",\"127:result[\\\"changes_made\\\"],\",\"128:result[\\\"rollback_started\\\"],\",\"129:result[\\\"rollback_restored\\\"],\",\"130:result[\\\"mutation_outcome\\\"],\",\"131:result[\\\"error\\\"],\",\"141:printf '%s\\\\n' \\\\\",\"142:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T1\\\",\\\"status\\\":\\\"BLOCKED\\\",\\\"changes_made\\\":false,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"143:>\\\"$tmp\\\"\",\"144:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T1 change 2)\\\" = \\\\\",\"147:printf '%s\\\\n' \\\\\",\"148:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T2\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"149:>\\\"$tmp\\\"\",\"150:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T2 change 0)\\\" = \\\\\",\"153:printf '%s\\\\n' \\\\\",\"154:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T3\\\",\\\"status\\\":\\\"FAIL\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":true,\\\"rollback_restored\\\":true}' \\\\\",\"155:>\\\"$tmp\\\"\",\"156:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T3 change 1)\\\" = \\\\\",\"167:printf '%s\\\\n' \\\\\"]\nRUNNER_DUPLICATE_EXCERPT=[\"246:flock \\\\\",\"287:flock -w 60 9 || {\",\"646:\\\"duplicate_failed_command_blocked\\\": repeat_blocked == \\\"true\\\",\",\"704:echo \\\"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\\\"\",\"816:echo \\\"DUPLICATE_FAILED_COMMAND_BLOCKED=$REPEAT_BLOCKED\\\"\"]\nRUNNER_CONTRACT_EXCERPT_SHA256=d63009f27c5447f810615041cc82bed8a85a5a125502257f85df4a3e7fbf0ffc\nAPPLY3_FETCH=OK\nAPPLY3_HISTORY_SHA256=f3ea3fcebd7b182e64db6e963a34f1b90baca0d08477e25e27bf88c48b33611c\nAPPLY3_COMMAND_ID_EXACT=true\nAPPLY3_RELEVANT_MARKERS=[\"COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3\",\"COMPONENT=newfi-portal200-deploy\",\"ROLLBACK_STARTED=unknown\",\"ROLLBACK_RESTORED=null\",\"COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3\",\"PORTAL200_REMAINING_FULL_PRODUCT_COMMANDS_BEFORE=22\",\"PORTAL200_FLOW=candidate->staging-apply->rollback-proof->staging-reapply->git-push->production\",\"PORTAL200_CANDIDATE_IDENTITY=PASS\",\"PORTAL200_ORCHESTRATION_FIXES={\\\"css_href_regex_fixed\\\":true,\\\"failure_status\\\":\\\"FAIL\\\",\\\"prod_http_via_pve01_public_route\\\":true,\\\"staging_503_without_css_links\\\":true}\",\"PORTAL200_GIT_PRESTATE={\\\"branch\\\":\\\"implementation/newfi-closed-mvp-20260906\\\",\\\"clean\\\":true,\\\"head\\\":\\\"06bab5acd124e768f70305b3d7eca2f595871890\\\",\\\"remote\\\":\\\"06bab5acd124e768f70305b3d7eca2f595871890\\\"}\",\"PORTAL200_CLUSTER=PASS\",\"PORTAL200_RUNTIME_HELPER_LINT=PASS\",\"PORTAL200_ERROR_BASELINE={\\\"prod\\\":0,\\\"staging\\\":40}\",\"PORTAL200_HTTP={\\\"bytes\\\":23800,\\\"css_count\\\":2,\\\"css_marker\\\":false,\\\"css_status\\\":[200,200],\\\"forced_css_marker\\\":null,\\\"forced_css_status\\\":null,\\\"html_marker\\\":false,\\\"old_copy\\\":false,\\\"state\\\":\\\"old\\\",\\\"status\\\":503,\\\"target\\\":\\\"staging\\\"}\",\"PORTAL200_RUNTIME={\\\"html_bytes\\\":1116,\\\"html_marker\\\":false,\\\"old_copy\\\":true,\\\"state\\\":\\\"old\\\",\\\"target\\\":\\\"prod\\\"}\",\"PORTAL200_HTTP={\\\"bytes\\\":25939,\\\"css_count\\\":2,\\\"css_marker\\\":false,\\\"css_status\\\":[200,200],\\\"forced_css_marker\\\":null,\\\"forced_css_status\\\":null,\\\"html_marker\\\":false,\\\"old_copy\\\":true,\\\"state\\\":\\\"old\\\",\\\"status\\\":200,\\\"target\\\":\\\"prod\\\"}\",\"PORTAL200_PREFLIGHT=PASS\",\"PORTAL200_FAILURE=IMPORT_FAILED\",\"PORTAL200_HTTP={\\\"bytes\\\":23800,\\\"css_count\\\":2,\\\"css_marker\\\":false,\\\"css_status\\\":[200,200],\\\"forced_css_marker\\\":null,\\\"forced_css_status\\\":null,\\\"html_marker\\\":false,\\\"old_copy\\\":false,\\\"state\\\":\\\"old\\\",\\\"status\\\":503,\\\"target\\\":\\\"staging\\\"}\",\"PORTAL200_FAILURE_STAGING_ROLLBACK=PASS\",\"HOMELAB_RESULT_CONTRACT={\\\"changes_made\\\":false,\\\"command_id\\\":\\\"NEWFI-260907-PORTAL200-APPLY3\\\",\\\"rollback_restored\\\":true,\\\"rollback_started\\\":true,\\\"status\\\":\\\"FAIL\\\",\\\"version\\\":1}\",\"PORTAL200_ROADMAP_REMAINS=22\"]\nNEWFI_GIT_CANDIDATES=[{\"branch\":\"main\",\"dirty_count\":0,\"head\":\"6360c4c919c4c5b3cb2430dd55fe63b6ad595a28\",\"portal_hits\":[],\"remote_head\":\"6360c4c919c4c5b3cb2430dd55fe63b6ad595a28\",\"repo\":\"/root/newfi-portal\",\"score\":3},{\"branch\":\"foundation/newfi-foundation-20260904\",\"dirty_count\":0,\"head\":\"38688a88c3850e43e310e755faa0c6178e203e26\",\"portal_hits\":[],\"remote_head\":\"e4f7b4318e2b0c1aa799edf91f39992c4b3ba378\",\"repo\":\"/root/newfi-portal/.worktrees/foundation-newfi-foundation-20260904\",\"score\":8},{\"branch\":\"implementation/newfi-closed-mvp-20260906\",\"dirty_count\":0,\"head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"portal_hits\":[],\"remote_head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"repo\":\"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\",\"score\":13}]\nGIT_SELECTED_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\nGIT_BRANCH=implementation/newfi-closed-mvp-20260906\nGIT_LOCAL_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_REMOTE_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_DIRTY_COUNT=0\nNEWFI_VM_CANDIDATES=[{\"name\":\"newfi-prod\",\"status\":\"running\",\"vmid\":210}]\nPRODUCTION_XF_ROOT_CANDIDATES=[\"/var/www/forums/newfi/public\"]\nPRODUCTION_XF_ROOT=/var/www/forums/newfi/public\nPRODUCTION_DOCROOT=/var/www/forums/newfi/public\nPRODUCTION_XF_VERSION_DECL=XenForo 2.3.12\nPRODUCTION_PHP_VERSION=8.3.33\nPRODUCTION_SERVICES=nginx=active\\nmariadb=active\\nmysql=active\\nphp8.3-fpm.service=active\nPRODUCTION_ADDON_LIST= -------------- -------------------------- --------------- -------- \\n Add-on ID Title Version Active \\n -------------- -------------------------- --------------- -------- \\n Newfi/Dogs Newfi Dogs 1.0.0 Alpha 1 Yes \\n Newfi/Events Newfi Events 1.0.0 Alpha 1 Yes \\n Newfi/Portal Newfi Portal 1.0.0 Alpha 1 Yes \\n XFMG XenForo Media Gallery 2.3.11 Yes \\n XFRM XenForo Resource Manager 2.3.11 Yes \\n -------------- -------------------------- --------------- -------- \\n\\n Total: 5 add-ons (5 active, 0 inactive)\nPRODUCTION_ADDON_METADATA=[{\"id\":\"Newfi/Dogs\",\"path\":\"/var/www/forums/newfi/public/src/addons/Newfi/Dogs/addon.json\",\"title\":\"Newfi Dogs\",\"version_id\":1000010,\"version_string\":\"1.0.0 Alpha 1\"},{\"id\":\"Newfi/Events\",\"path\":\"/var/www/forums/newfi/public/src/addons/Newfi/Events/addon.json\",\"title\":\"Newfi Events\",\"version_id\":1000010,\"version_string\":\"1.0.0 Alpha 1\"},{\"id\":\"Newfi/Portal\",\"path\":\"/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json\",\"title\":\"Newfi Portal\",\"version_id\":1000010,\"version_string\":\"1.0.0 Alpha 1\"}]\nPRODUCTION_PORTAL_ADDON_CANDIDATES=[{\"id\":\"Newfi/Portal\",\"path\":\"/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json\",\"title\":\"Newfi Portal\",\"version_id\":1000010,\"version_string\":\"1.0.0 Alpha 1\"}]\nPRODUCTION_DB_CLIENT=/usr/bin/mariadb\nPRODUCTION_XF_DB_SCHEMAS=[\"xf_newfi\"]\nPRODUCTION_ADDON_ROWS=Newfi/Dogs\tNewfi Dogs\t1000010\t1.0.0 Alpha 1\t1\\nNewfi/Events\tNewfi Events\t1000010\t1.0.0 Alpha 1\t1\\nNewfi/Portal\tNewfi Portal\t1000010\t1.0.0 Alpha 1\t1\\nXF\tXenForo\t2031270\t2.3.12\t1\\nXFMG\tXenForo Media Gallery\t902031170\t2.3.11\t1\\nXFRM\tXenForo Resource Manager\t2031170\t2.3.11\t1\nPRODUCTION_BOARD_ACTIVE=1\nPRODUCTION_ERROR_MAX=0\nREFERENCE_NEWFI_URLS=[]\nHTTP_ROUTE_RESULTS=[{\"http\":\"200\",\"rc\":0,\"url\":\"https://newfi.ru/\"},{\"http\":\"000\",\"rc\":6,\"url\":\"http://newfi-staging.gram1.ru/\"}]\nROADMAP_MATCHES=[\"HEAD:config/newfi-brand-assets.json:34: \\\"roadmap_after_pass\\\": 23,\",\"HEAD:config/newfi-brand-assets.json:35: \\\"roadmap_before\\\": 24,\",\"HEAD:config/newfi-style199.json:5: \\\"roadmap_after\\\": 22,\",\"HEAD:config/newfi-style199.json:6: \\\"roadmap_before\\\": 23,\",\"HEAD:docs/checkpoints/private-staging-v1.md:18:Earlier component checkpoints retain their already accepted rollback evidence; FINAL179 does not destructively repeat every add-on uninstall. The only remaining private-staging gate is a fresh backup followed by real clean-contour restore validation. A backup without a successful restore does not count.\",\"HEAD:docs/operations/content-structure.md:26:database AUTO_INCREMENT counter.\",\"HEAD:scripts/verify-brand-assets.py:11:if cfg['roadmap_before']!=24 or cfg['roadmap_after_pass']!=23: raise RuntimeError('counter')\"]\nAPPLY3_INTERNAL_ROLLBACK_PASS_PRESENT=true\nHOLD_REASONS=[\"EXACT_NEWFI_PROD_STAGING_IDENTITY_UNPROVEN\",\"PRODUCTION_URL_NOT_CONFIRMED_BY_REFERENCE\",\"STAGING_URL_NOT_CONFIRMED_BY_REFERENCE\",\"STAGING_HTTP_UNEXPECTED_OR_UNPROVEN\"]\nFINAL_DECISION=HOLD_PORTAL200_APPLY4_PREP_EXACT_NEWFI_PROD_STAGING_IDENTITY_UNPROVEN__PRODUCTION_URL_NOT_CONFIRMED_BY_REFERENCE__STAGING_URL_NOT_CONFIRMED_BY_REFERENCE__STAGING_HTTP_UNEXPECTED_OR_UNPROVEN\nRECOVERY_AUDIT_END=true\n"
}