1
0

runtime: publish NEWFI-260907-B-PORTAL200-RECOVERY1

This commit is contained in:
homelab-runtime-publisher
2026-09-07 18:41:52 +00:00
parent c565644c85
commit d35bcd1585
4 changed files with 226 additions and 155 deletions
File diff suppressed because one or more lines are too long
@@ -0,0 +1,79 @@
CHAT_OUTPUT_BEGIN
COMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY1
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=newfi-portal200-post-apply3-recovery
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=d8eafd855d3bb7704ed58082193c471dc66b330930971af4ecb75ba88e78dee7
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=4374c49510ffe36bec1cd54e5668650886725d6b65f4634aa7e39c404224074a
SANITIZED_OUTPUT_SHA256=4374c49510ffe36bec1cd54e5668650886725d6b65f4634aa7e39c404224074a
OUTPUT_BEGIN
RECOVERY_AUDIT_BEGIN=true
COMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY1
MUTATION_SCOPE=NONE_READ_ONLY
MUTATIONS_PERFORMED=NO
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
REFERENCE_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
REFERENCE_CHECK=OK
AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED
RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d
RUNNER_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' \\"]
RUNNER_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\""]
RUNNER_CONTRACT_EXCERPT_SHA256=d63009f27c5447f810615041cc82bed8a85a5a125502257f85df4a3e7fbf0ffc
APPLY3_FETCH=OK
APPLY3_HISTORY_SHA256=f3ea3fcebd7b182e64db6e963a34f1b90baca0d08477e25e27bf88c48b33611c
APPLY3_COMMAND_ID_EXACT=true
APPLY3_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"]
NEWFI_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}]
GIT_SELECTED_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906
GIT_BRANCH=implementation/newfi-closed-mvp-20260906
GIT_LOCAL_HEAD=06bab5acd124e768f70305b3d7eca2f595871890
GIT_REMOTE_HEAD=06bab5acd124e768f70305b3d7eca2f595871890
GIT_DIRTY_COUNT=0
NEWFI_VM_CANDIDATES=[{"name":"newfi-prod","status":"running","vmid":210}]
PRODUCTION_XF_ROOT_CANDIDATES=["/var/www/forums/newfi/public"]
PRODUCTION_XF_ROOT=/var/www/forums/newfi/public
PRODUCTION_DOCROOT=/var/www/forums/newfi/public
PRODUCTION_XF_VERSION_DECL=XenForo 2.3.12
PRODUCTION_PHP_VERSION=8.3.33
PRODUCTION_SERVICES=nginx=active\nmariadb=active\nmysql=active\nphp8.3-fpm.service=active
PRODUCTION_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)
PRODUCTION_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"}]
PRODUCTION_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"}]
PRODUCTION_DB_CLIENT=/usr/bin/mariadb
PRODUCTION_XF_DB_SCHEMAS=["xf_newfi"]
PRODUCTION_ADDON_ROWS=Newfi/Dogs Newfi Dogs 1000010 1.0.0 Alpha 1 1\nNewfi/Events Newfi Events 1000010 1.0.0 Alpha 1 1\nNewfi/Portal Newfi Portal 1000010 1.0.0 Alpha 1 1\nXF XenForo 2031270 2.3.12 1\nXFMG XenForo Media Gallery 902031170 2.3.11 1\nXFRM XenForo Resource Manager 2031170 2.3.11 1
PRODUCTION_BOARD_ACTIVE=1
PRODUCTION_ERROR_MAX=0
REFERENCE_NEWFI_URLS=[]
HTTP_ROUTE_RESULTS=[{"http":"200","rc":0,"url":"https://newfi.ru/"},{"http":"000","rc":6,"url":"http://newfi-staging.gram1.ru/"}]
ROADMAP_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')"]
APPLY3_INTERNAL_ROLLBACK_PASS_PRESENT=true
HOLD_REASONS=["EXACT_NEWFI_PROD_STAGING_IDENTITY_UNPROVEN","PRODUCTION_URL_NOT_CONFIRMED_BY_REFERENCE","STAGING_URL_NOT_CONFIRMED_BY_REFERENCE","STAGING_HTTP_UNEXPECTED_OR_UNPROVEN"]
FINAL_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
RECOVERY_AUDIT_END=true
OUTPUT_END
CHAT_OUTPUT_END
+38 -1
View File
File diff suppressed because one or more lines are too long
+71 -154
View File
File diff suppressed because one or more lines are too long