diff --git a/runtime/history/NEWFI-260907-A-PORTAL200-APPLY4DESIGN1.json b/runtime/history/NEWFI-260907-A-PORTAL200-APPLY4DESIGN1.json new file mode 100644 index 00000000..c0d13cf1 --- /dev/null +++ b/runtime/history/NEWFI-260907-A-PORTAL200-APPLY4DESIGN1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "NEWFI-260907-A-PORTAL200-APPLY4DESIGN1", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "newfi-portal200-apply4-candidate-provenance", + "started_at_utc": "2026-09-07T20:05:14Z", + "finished_at_utc": "2026-09-07T20:05:15Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "ba1e39080eba5653f605069127f81a6d51ebc978a94c50c3091e5301ed3cd4ae", + "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": "869943bf04580fdbc610eb5377b46fecec1a92821a1b0663d8faab7700ba6176", + "sanitized_output_sha256": "869943bf04580fdbc610eb5377b46fecec1a92821a1b0663d8faab7700ba6176", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "APPLY4_DESIGN1_BEGIN=true\nCOMMAND_ID=NEWFI-260907-A-PORTAL200-APPLY4DESIGN1\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\nLANEB_PASS_HISTORY_SHA256=08c00e675ffa960eca55102a114d305fb1a15291ff7e401dc43c09d087c32ece\nLANEB_PASS_STATUS=OK\nLANEB_PASS_HOLD_REASONS=[]\nLANEB_PASS_FINAL_DECISION=ELIGIBLE_FOR_PORTAL200_APPLY4_PREP\nAPPLY3_HISTORY_SHA256=f3ea3fcebd7b182e64db6e963a34f1b90baca0d08477e25e27bf88c48b33611c\nAPPLY3_STATUS=FAIL\nAPPLY3_RC=76\nAPPLY3_RESULT_CONTRACT_VALID=false\nAPPLY3_MUTATION_OUTCOME=UNKNOWN\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nRUNNER_CONTRACT_EXCERPT=[\"7:import json\",\"8:import sys\",\"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\\\",\",\"22:}\",\"24:if mode == \\\"change\\\":\",\"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\\\",\",\"37:errors=\\\"replace\\\",\",\"38:).splitlines()\",\"44:if len(payloads) == 1:\",\"45:try:\",\"46:document = json.loads(payloads[0])\",\"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:):\",\"83:raise ValueError(\",\"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:\",\"100:outcome = \\\"ROLLBACK_UNKNOWN\\\"\",\"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,\",\"115:\\\"error\\\": \\\"NONE\\\",\",\"116:}\",\"117:except Exception as exc:\",\"118:result[\\\"error\\\"] = (\",\"119:\\\"INVALID_CONTRACT:\\\" + type(exc).__name__\",\"120:)\",\"121:elif len(payloads) > 1:\",\"122:result[\\\"error\\\"] = \\\"MULTIPLE_CONTRACTS\\\"\",\"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\\\"],\",\"132:]))\",\"133:PY_CONTRACT\",\"138:tmp=\\\"$(mktemp)\\\"\",\"139:trap 'rm -f \\\"$tmp\\\"' RETURN\",\"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)\\\" = \\\\\",\"145:$'true\\\\tBLOCKED\\\\tfalse\\\\tfalse\\\\tnull\\\\tNO_MUTATION\\\\tNONE' ]\",\"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)\\\" = \\\\\",\"151:$'true\\\\tOK\\\\ttrue\\\\tfalse\\\\tnull\\\\tMUTATED\\\\tNONE' ]\",\"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)\\\" = \\\\\",\"157:$'true\\\\tFAIL\\\\ttrue\\\\ttrue\\\\ttrue\\\\tROLLED_BACK\\\\tNONE' ]\",\"164:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T5 verify 0)\\\" = \\\\\",\"165:$'true\\\\tNOT_APPLICABLE\\\\tfalse\\\\tfalse\\\\tnull\\\\tNO_MUTATION\\\\tNONE' ]\",\"167:printf '%s\\\\n' \\\\\",\"168:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"OTHER\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"169:>\\\"$tmp\\\"\",\"170:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T6 change 0)\\\" = \\\\\",\"171:$'false\\\\tUNKNOWN\\\\tunknown\\\\tunknown\\\\tnull\\\\tUNKNOWN\\\\tINVALID_CONTRACT:ValueError' ]\",\"173:printf '%s\\\\n' \\\\\",\"174:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"175:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"176:>\\\"$tmp\\\"\",\"177:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T7 change 0)\\\" = \\\\\",\"178:$'false\\\\tUNKNOWN\\\\tunknown\\\\tunknown\\\\tnull\\\\tUNKNOWN\\\\tMULTIPLE_CONTRACTS' ]\",\"188:usage() {\",\"189:cat >&2 <<'USAGE'\",\"190:Usage:\",\"191:homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]\",\"193:MODE:\",\"194:read-only\",\"195:verify\",\"204:}\",\"206:[ \\\"$#\\\" -ge 5 ] || usage\",\"208:COMMAND_ID=\\\"$1\\\"\",\"209:MODE=\\\"$2\\\"\",\"210:COMPONENT=\\\"$3\\\"\",\"211:shift 3\",\"213:[ \\\"${1:-}\\\" = '--' ] || usage\",\"214:shift\",\"215:[ \\\"$#\\\" -ge 1 ] || usage\",\"217:case \\\"$COMMAND_ID\\\" in\",\"218:''|*[!A-Za-z0-9._-]*)\",\"219:echo 'RESULT=FAIL'\",\"220:echo 'REASON=INVALID_COMMAND_ID'\",\"221:exit 65\",\"222:;;\",\"223:esac\",\"293:STARTED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\",\"294:STAMP=\\\"$(date -u +%Y%m%dT%H%M%SZ)\\\"\",\"295:HOST_SHORT=\\\"$(hostname -s 2>/dev/null || hostname)\\\"\",\"297:RAW_FILE=\\\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\\\"\",\"298:SANITIZED_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\\\"\",\"299:JSON_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\\\"\",\"300:TXT_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\\\"\",\"302:REFERENCE_SHA256=\\\"$(sha256sum \\\"$REFERENCE\\\" | awk '{print $1}')\\\"\",\"303:ERROR_REGISTER_SHA256=\\\"$(sha256sum \\\"$ERROR_REGISTER\\\" | awk '{print $1}')\\\"\",\"328:REPEAT_BLOCKED=false\",\"329:BLOCK_REASON=''\",\"330:CHANGE_DECLARED=false\",\"331:RESULT_CONTRACT_VALID=true\",\"332:CONTRACT_STATUS='NOT_APPLICABLE'\",\"333:CHANGES_MADE=false\",\"334:ROLLBACK_STARTED=false\",\"335:ROLLBACK_RESTORED=null\",\"336:MUTATION_OUTCOME='NO_MUTATION'\",\"337:RESULT_CONTRACT_ERROR='NONE'\",\"338:COMMAND_RC=''\",\"340:if [ \\\"$MODE\\\" = change ]; then\",\"341:CHANGE_DECLARED=true\",\"342:RESULT_CONTRACT_VALID=false\",\"343:CONTRACT_STATUS='UNKNOWN'\",\"344:CHANGES_MADE=unknown\",\"345:ROLLBACK_STARTED=unknown\",\"346:ROLLBACK_RESTORED=null\",\"347:MUTATION_OUTCOME='UNKNOWN'\",\"348:RESULT_CONTRACT_ERROR='MISSING_CONTRACT'\",\"349:fi\",\"354:RUN_STARTED=false\",\"355:REPEAT_BLOCKED=true\",\"356:BLOCK_REASON='EXACT_FAILED_COMMAND_REPEAT'\",\"357:RC=73\",\"358:STATUS='BLOCKED'\",\"359:RESULT_CONTRACT_VALID=true\",\"360:CONTRACT_STATUS='BLOCKED'\",\"361:CHANGES_MADE=false\",\"362:ROLLBACK_STARTED=false\",\"363:ROLLBACK_RESTORED=null\",\"364:MUTATION_OUTCOME='NO_MUTATION'\",\"365:RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'\",\"367:{\",\"385:esac\",\"387:timeout \\\\\",\"388:--foreground \\\\\",\"389:--preserve-status \\\\\",\"390:\\\"$HOMELAB_TIMEOUT\\\" \\\\\",\"391:\\\"$@\\\" >\\\"$RAW_FILE\\\" 2>&1\",\"392:RC=$?\",\"393:else\"]\nTARGET_WORKTREES=[{\"dirty_count\":0,\"head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"remote_head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"repo\":\"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\"}]\nGIT_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\nGIT_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_REMOTE_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_DIRTY_COUNT=0\nCURRENT_PORTAL_GIT_FILES=[\"src/addons/Newfi/Portal/Pub/Controller/Portal.php\",\"src/addons/Newfi/Portal/Pub/View/Portal.php\",\"src/addons/Newfi/Portal/_data/navigation.xml\",\"src/addons/Newfi/Portal/_data/phrases.xml\",\"src/addons/Newfi/Portal/_data/routes.xml\",\"src/addons/Newfi/Portal/_data/templates.xml\",\"src/addons/Newfi/Portal/addon.json\"]\nCURRENT_PORTAL_GIT_MANIFEST={\"src/addons/Newfi/Portal/Pub/Controller/Portal.php\":{\"bytes\":247,\"sha256\":\"53909e753ea5a011550fd280ad1c342a74ca9949be092dfbd95244243cae92f3\"},\"src/addons/Newfi/Portal/Pub/View/Portal.php\":{\"bytes\":79,\"sha256\":\"26e3b77c2c86d4f4a6fd51f0472e3f38e70e14c984ffd8d04dcec39071a2a69f\"},\"src/addons/Newfi/Portal/_data/navigation.xml\":{\"bytes\":281,\"sha256\":\"5d724ef5141438bdd0b9dba6a583d330bc6940b0ace5c21c7a8d5301e7d8d649\"},\"src/addons/Newfi/Portal/_data/phrases.xml\":{\"bytes\":173,\"sha256\":\"15282a06a956bda4e810f6b26b1703676dd766424029cd372ce0fd7832dbe09c\"},\"src/addons/Newfi/Portal/_data/routes.xml\":{\"bytes\":144,\"sha256\":\"9b80ef229bcebb49a5930369bb272ed85367deef66070f432948001096673629\"},\"src/addons/Newfi/Portal/_data/templates.xml\":{\"bytes\":1461,\"sha256\":\"c29c04f8b937284e821c87957653e87c2f6ac014fac30648a0f6b18e84392adf\"},\"src/addons/Newfi/Portal/addon.json\":{\"bytes\":378,\"json\":{\"description\":\"Minimal private-staging portal for the Newfi closed MVP.\",\"dev\":\"Newfi\",\"dev_url\":\"\",\"extra_urls\":[],\"faq_url\":\"\",\"icon\":\"\",\"legacy_addon_id\":\"\",\"require\":{\"XF\":[2031270,\"XenForo 2.3.12+\"]},\"support_url\":\"\",\"title\":\"Newfi Portal\",\"version_id\":1000010,\"version_string\":\"1.0.0 Alpha 1\"},\"sha256\":\"288a61044c941107162d045be49ab2e7c844d1586b25378a7289b3c7275010ab\"}}\nAPPLY3_ATTEMPT_DIR=/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3\nAPPLY3_ATTEMPT_EXISTS=true\nAPPLY3_ATTEMPT_FILES=[{\"bytes\":73,\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/attempt.txt\",\"sha256\":\"fc3d53a77acceff697ec5111ab3ba411ede195fd9a8e358de5ae94dbc94f4d14\"},{\"bytes\":90,\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/receipt.txt\",\"sha256\":\"a993d3503cd786e73baa68900ae5bc46eac405da3430cfab0bb5db981e0f1b4b\"},{\"bytes\":669,\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/wrapper.log\",\"sha256\":\"dec036ea985e75d776b2de8c2bede77fe4b4aafa5da33648b2a6b5f79f3dec30\"}]\nRELATED_ARTIFACT_FILES=[]\nCANDIDATE_PORTAL_ROOTS=[]\nCANDIDATE_PORTAL_MANIFESTS=[]\nCANDIDATE_ARTIFACT_EVIDENCE=[{\"decoded_payloads\":[],\"hits\":[\"1:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3\",\"2:STATE=RESERVED_BEFORE_EXECUTION\"],\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/attempt.txt\",\"sha256\":\"fc3d53a77acceff697ec5111ab3ba411ede195fd9a8e358de5ae94dbc94f4d14\"},{\"decoded_payloads\":[],\"hits\":[\"1:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3\",\"2:WRAPPER_RC=76\",\"3:PUBLICATION=GITEA_RUNTIME_EXPECTED\"],\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/receipt.txt\",\"sha256\":\"a993d3503cd786e73baa68900ae5bc46eac405da3430cfab0bb5db981e0f1b4b\"},{\"decoded_payloads\":[],\"hits\":[\"3:remote: Processed 1 references in total \",\"4:RESULT=OK\",\"5:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3\",\"6:COMMIT_SHA=bb707af34d2a2b6a6b23c3d4d03f6b701150a653\",\"7:STATIC_PUBLICATION=OK\",\"9:\",\"10:===== HOMELAB CHAT RUN COMPLETE =====\",\"11:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3\",\"12:STATUS=FAIL\",\"13:RC=76\",\"17:GITEA_PUBLICATION=OK\",\"18:PUBLIC_URL=https://git.gram1.ru/.well-known/homelab-runtime/latest.json\",\"19:LOCAL_RAW_FILE=/var/lib/homelab-chat-run/raw/NEWFI-260907-PORTAL200-APPLY3-20260907T112033Z.log\",\"20:SHELL_SESSION_PRESERVED=yes\"],\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/wrapper.log\",\"sha256\":\"dec036ea985e75d776b2de8c2bede77fe4b4aafa5da33648b2a6b5f79f3dec30\"}]\nPORTAL_GIT_ALL_HISTORY=[\"ca07bfc20953585887f7cc2f1d443cf8313912c8\\t2026-09-06T16:40:06+03:00\\tfeat: add Portal navigation and widgets\",\"82dd2066df377ba9d904f68f90898e009413eec9\\t2026-09-06T16:15:39+03:00\\tfeat: add Newfi Portal staging checkpoint\"]\nPORTAL_UNREACHABLE_COMMITS=[]\nHOLD_REASONS=[]\nFINAL_DECISION=ELIGIBLE_FOR_PORTAL200_APPLY4_CHANGE_CARRIER_BUILD\nAPPLY4_DESIGN1_END=true\n" +} diff --git a/runtime/history/NEWFI-260907-A-PORTAL200-APPLY4DESIGN1.txt b/runtime/history/NEWFI-260907-A-PORTAL200-APPLY4DESIGN1.txt new file mode 100644 index 00000000..7321aca2 --- /dev/null +++ b/runtime/history/NEWFI-260907-A-PORTAL200-APPLY4DESIGN1.txt @@ -0,0 +1,71 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=NEWFI-260907-A-PORTAL200-APPLY4DESIGN1 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=newfi-portal200-apply4-candidate-provenance +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=ba1e39080eba5653f605069127f81a6d51ebc978a94c50c3091e5301ed3cd4ae +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=869943bf04580fdbc610eb5377b46fecec1a92821a1b0663d8faab7700ba6176 +SANITIZED_OUTPUT_SHA256=869943bf04580fdbc610eb5377b46fecec1a92821a1b0663d8faab7700ba6176 +OUTPUT_BEGIN +APPLY4_DESIGN1_BEGIN=true +COMMAND_ID=NEWFI-260907-A-PORTAL200-APPLY4DESIGN1 +MUTATION_SCOPE=NONE_READ_ONLY +MUTATIONS_PERFORMED=NO +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +REFERENCE_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED +LANEB_PASS_HISTORY_SHA256=08c00e675ffa960eca55102a114d305fb1a15291ff7e401dc43c09d087c32ece +LANEB_PASS_STATUS=OK +LANEB_PASS_HOLD_REASONS=[] +LANEB_PASS_FINAL_DECISION=ELIGIBLE_FOR_PORTAL200_APPLY4_PREP +APPLY3_HISTORY_SHA256=f3ea3fcebd7b182e64db6e963a34f1b90baca0d08477e25e27bf88c48b33611c +APPLY3_STATUS=FAIL +APPLY3_RC=76 +APPLY3_RESULT_CONTRACT_VALID=false +APPLY3_MUTATION_OUTCOME=UNKNOWN +RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d +RUNNER_CONTRACT_EXCERPT=["7:import json","8:import sys","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\",","22:}","24:if mode == \"change\":","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\",","37:errors=\"replace\",","38:).splitlines()","44:if len(payloads) == 1:","45:try:","46:document = json.loads(payloads[0])","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:):","83:raise ValueError(","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:","100:outcome = \"ROLLBACK_UNKNOWN\"","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,","115:\"error\": \"NONE\",","116:}","117:except Exception as exc:","118:result[\"error\"] = (","119:\"INVALID_CONTRACT:\" + type(exc).__name__","120:)","121:elif len(payloads) > 1:","122:result[\"error\"] = \"MULTIPLE_CONTRACTS\"","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\"],","132:]))","133:PY_CONTRACT","138:tmp=\"$(mktemp)\"","139:trap 'rm -f \"$tmp\"' RETURN","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)\" = \\","145:$'true\\tBLOCKED\\tfalse\\tfalse\\tnull\\tNO_MUTATION\\tNONE' ]","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)\" = \\","151:$'true\\tOK\\ttrue\\tfalse\\tnull\\tMUTATED\\tNONE' ]","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)\" = \\","157:$'true\\tFAIL\\ttrue\\ttrue\\ttrue\\tROLLED_BACK\\tNONE' ]","164:[ \"$(read_mutation_contract \"$tmp\" T5 verify 0)\" = \\","165:$'true\\tNOT_APPLICABLE\\tfalse\\tfalse\\tnull\\tNO_MUTATION\\tNONE' ]","167:printf '%s\\n' \\","168:'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"OTHER\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","169:>\"$tmp\"","170:[ \"$(read_mutation_contract \"$tmp\" T6 change 0)\" = \\","171:$'false\\tUNKNOWN\\tunknown\\tunknown\\tnull\\tUNKNOWN\\tINVALID_CONTRACT:ValueError' ]","173:printf '%s\\n' \\","174:'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","175:'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","176:>\"$tmp\"","177:[ \"$(read_mutation_contract \"$tmp\" T7 change 0)\" = \\","178:$'false\\tUNKNOWN\\tunknown\\tunknown\\tnull\\tUNKNOWN\\tMULTIPLE_CONTRACTS' ]","188:usage() {","189:cat >&2 <<'USAGE'","190:Usage:","191:homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]","193:MODE:","194:read-only","195:verify","204:}","206:[ \"$#\" -ge 5 ] || usage","208:COMMAND_ID=\"$1\"","209:MODE=\"$2\"","210:COMPONENT=\"$3\"","211:shift 3","213:[ \"${1:-}\" = '--' ] || usage","214:shift","215:[ \"$#\" -ge 1 ] || usage","217:case \"$COMMAND_ID\" in","218:''|*[!A-Za-z0-9._-]*)","219:echo 'RESULT=FAIL'","220:echo 'REASON=INVALID_COMMAND_ID'","221:exit 65","222:;;","223:esac","293:STARTED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"","294:STAMP=\"$(date -u +%Y%m%dT%H%M%SZ)\"","295:HOST_SHORT=\"$(hostname -s 2>/dev/null || hostname)\"","297:RAW_FILE=\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\"","298:SANITIZED_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\"","299:JSON_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\"","300:TXT_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\"","302:REFERENCE_SHA256=\"$(sha256sum \"$REFERENCE\" | awk '{print $1}')\"","303:ERROR_REGISTER_SHA256=\"$(sha256sum \"$ERROR_REGISTER\" | awk '{print $1}')\"","328:REPEAT_BLOCKED=false","329:BLOCK_REASON=''","330:CHANGE_DECLARED=false","331:RESULT_CONTRACT_VALID=true","332:CONTRACT_STATUS='NOT_APPLICABLE'","333:CHANGES_MADE=false","334:ROLLBACK_STARTED=false","335:ROLLBACK_RESTORED=null","336:MUTATION_OUTCOME='NO_MUTATION'","337:RESULT_CONTRACT_ERROR='NONE'","338:COMMAND_RC=''","340:if [ \"$MODE\" = change ]; then","341:CHANGE_DECLARED=true","342:RESULT_CONTRACT_VALID=false","343:CONTRACT_STATUS='UNKNOWN'","344:CHANGES_MADE=unknown","345:ROLLBACK_STARTED=unknown","346:ROLLBACK_RESTORED=null","347:MUTATION_OUTCOME='UNKNOWN'","348:RESULT_CONTRACT_ERROR='MISSING_CONTRACT'","349:fi","354:RUN_STARTED=false","355:REPEAT_BLOCKED=true","356:BLOCK_REASON='EXACT_FAILED_COMMAND_REPEAT'","357:RC=73","358:STATUS='BLOCKED'","359:RESULT_CONTRACT_VALID=true","360:CONTRACT_STATUS='BLOCKED'","361:CHANGES_MADE=false","362:ROLLBACK_STARTED=false","363:ROLLBACK_RESTORED=null","364:MUTATION_OUTCOME='NO_MUTATION'","365:RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'","367:{","385:esac","387:timeout \\","388:--foreground \\","389:--preserve-status \\","390:\"$HOMELAB_TIMEOUT\" \\","391:\"$@\" >\"$RAW_FILE\" 2>&1","392:RC=$?","393:else"] +TARGET_WORKTREES=[{"dirty_count":0,"head":"06bab5acd124e768f70305b3d7eca2f595871890","remote_head":"06bab5acd124e768f70305b3d7eca2f595871890","repo":"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906"}] +GIT_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906 +GIT_HEAD=06bab5acd124e768f70305b3d7eca2f595871890 +GIT_REMOTE_HEAD=06bab5acd124e768f70305b3d7eca2f595871890 +GIT_DIRTY_COUNT=0 +CURRENT_PORTAL_GIT_FILES=["src/addons/Newfi/Portal/Pub/Controller/Portal.php","src/addons/Newfi/Portal/Pub/View/Portal.php","src/addons/Newfi/Portal/_data/navigation.xml","src/addons/Newfi/Portal/_data/phrases.xml","src/addons/Newfi/Portal/_data/routes.xml","src/addons/Newfi/Portal/_data/templates.xml","src/addons/Newfi/Portal/addon.json"] +CURRENT_PORTAL_GIT_MANIFEST={"src/addons/Newfi/Portal/Pub/Controller/Portal.php":{"bytes":247,"sha256":"53909e753ea5a011550fd280ad1c342a74ca9949be092dfbd95244243cae92f3"},"src/addons/Newfi/Portal/Pub/View/Portal.php":{"bytes":79,"sha256":"26e3b77c2c86d4f4a6fd51f0472e3f38e70e14c984ffd8d04dcec39071a2a69f"},"src/addons/Newfi/Portal/_data/navigation.xml":{"bytes":281,"sha256":"5d724ef5141438bdd0b9dba6a583d330bc6940b0ace5c21c7a8d5301e7d8d649"},"src/addons/Newfi/Portal/_data/phrases.xml":{"bytes":173,"sha256":"15282a06a956bda4e810f6b26b1703676dd766424029cd372ce0fd7832dbe09c"},"src/addons/Newfi/Portal/_data/routes.xml":{"bytes":144,"sha256":"9b80ef229bcebb49a5930369bb272ed85367deef66070f432948001096673629"},"src/addons/Newfi/Portal/_data/templates.xml":{"bytes":1461,"sha256":"c29c04f8b937284e821c87957653e87c2f6ac014fac30648a0f6b18e84392adf"},"src/addons/Newfi/Portal/addon.json":{"bytes":378,"json":{"description":"Minimal private-staging portal for the Newfi closed MVP.","dev":"Newfi","dev_url":"","extra_urls":[],"faq_url":"","icon":"","legacy_addon_id":"","require":{"XF":[2031270,"XenForo 2.3.12+"]},"support_url":"","title":"Newfi Portal","version_id":1000010,"version_string":"1.0.0 Alpha 1"},"sha256":"288a61044c941107162d045be49ab2e7c844d1586b25378a7289b3c7275010ab"}} +APPLY3_ATTEMPT_DIR=/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3 +APPLY3_ATTEMPT_EXISTS=true +APPLY3_ATTEMPT_FILES=[{"bytes":73,"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/attempt.txt","sha256":"fc3d53a77acceff697ec5111ab3ba411ede195fd9a8e358de5ae94dbc94f4d14"},{"bytes":90,"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/receipt.txt","sha256":"a993d3503cd786e73baa68900ae5bc46eac405da3430cfab0bb5db981e0f1b4b"},{"bytes":669,"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/wrapper.log","sha256":"dec036ea985e75d776b2de8c2bede77fe4b4aafa5da33648b2a6b5f79f3dec30"}] +RELATED_ARTIFACT_FILES=[] +CANDIDATE_PORTAL_ROOTS=[] +CANDIDATE_PORTAL_MANIFESTS=[] +CANDIDATE_ARTIFACT_EVIDENCE=[{"decoded_payloads":[],"hits":["1:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3","2:STATE=RESERVED_BEFORE_EXECUTION"],"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/attempt.txt","sha256":"fc3d53a77acceff697ec5111ab3ba411ede195fd9a8e358de5ae94dbc94f4d14"},{"decoded_payloads":[],"hits":["1:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3","2:WRAPPER_RC=76","3:PUBLICATION=GITEA_RUNTIME_EXPECTED"],"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/receipt.txt","sha256":"a993d3503cd786e73baa68900ae5bc46eac405da3430cfab0bb5db981e0f1b4b"},{"decoded_payloads":[],"hits":["3:remote: Processed 1 references in total ","4:RESULT=OK","5:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3","6:COMMIT_SHA=bb707af34d2a2b6a6b23c3d4d03f6b701150a653","7:STATIC_PUBLICATION=OK","9:","10:===== HOMELAB CHAT RUN COMPLETE =====","11:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3","12:STATUS=FAIL","13:RC=76","17:GITEA_PUBLICATION=OK","18:PUBLIC_URL=https://git.gram1.ru/.well-known/homelab-runtime/latest.json","19:LOCAL_RAW_FILE=/var/lib/homelab-chat-run/raw/NEWFI-260907-PORTAL200-APPLY3-20260907T112033Z.log","20:SHELL_SESSION_PRESERVED=yes"],"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/wrapper.log","sha256":"dec036ea985e75d776b2de8c2bede77fe4b4aafa5da33648b2a6b5f79f3dec30"}] +PORTAL_GIT_ALL_HISTORY=["ca07bfc20953585887f7cc2f1d443cf8313912c8\t2026-09-06T16:40:06+03:00\tfeat: add Portal navigation and widgets","82dd2066df377ba9d904f68f90898e009413eec9\t2026-09-06T16:15:39+03:00\tfeat: add Newfi Portal staging checkpoint"] +PORTAL_UNREACHABLE_COMMITS=[] +HOLD_REASONS=[] +FINAL_DECISION=ELIGIBLE_FOR_PORTAL200_APPLY4_CHANGE_CARRIER_BUILD +APPLY4_DESIGN1_END=true + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index 10ad2ecc..c0d13cf1 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "NEWFI-260907-B-PORTAL200-RECOVERY5", + "command_id": "NEWFI-260907-A-PORTAL200-APPLY4DESIGN1", "status": "OK", "rc": 0, "host": "pve01", "mode": "read-only", - "component": "newfi-portal200-recovery5-parser-fix", - "started_at_utc": "2026-09-07T19:47:29Z", - "finished_at_utc": "2026-09-07T19:48:17Z", + "component": "newfi-portal200-apply4-candidate-provenance", + "started_at_utc": "2026-09-07T20:05:14Z", + "finished_at_utc": "2026-09-07T20:05:15Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "def5ed0b9b382526126bae0675243fb40bba3480be5fd31b79d9ea9b4774bec8", + "command_sha256": "ba1e39080eba5653f605069127f81a6d51ebc978a94c50c3091e5301ed3cd4ae", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "9ca6ffdd4e8304e7892084bb2c85c01dcba9f5638c90403eb23169bad8c6e599", - "sanitized_output_sha256": "3975ca27123f768ce53b4b9e826eddc6a64712a036a27179c636f69ed6b2fec0", + "raw_evidence_sha256": "869943bf04580fdbc610eb5377b46fecec1a92821a1b0663d8faab7700ba6176", + "sanitized_output_sha256": "869943bf04580fdbc610eb5377b46fecec1a92821a1b0663d8faab7700ba6176", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "RECOVERY5_BEGIN=true\nCOMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY5\nMUTATION_SCOPE=NONE_READ_ONLY\nMUTATIONS_PERFORMED=NO\nREMOTE_QGA_QUOTING_FIX=SSH_REMOTE_ARGV_SHELL_QUOTED_SINGLE_COMMAND\nLAYOUT_SECTION_PARSER_FIX=A_Z_0_9_UNDERSCORE\nERROR_REGISTER_CHECK=OK\nERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0\nREFERENCE_CHECK=OK\nREFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66\nAUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED\nRECOVERY4_HISTORY_SHA256=4f526e81a36c906286024af28c3c5ad8e0185cd2448972a4bfbbaf6f646fae4b\nRECOVERY4_STATUS=OK\nRECOVERY4_CHANGES_MADE=false\nRECOVERY4_MUTATION_OUTCOME=NO_MUTATION\nRECOVERY4_HOLD_REASONS=[\"PRODUCTION_LAYOUT_EXECUTED_OUTSIDE_GUEST\",\"STAGING_LAYOUT_EXECUTED_OUTSIDE_GUEST\"]\nRECOVERY4_FINAL_DECISION=HOLD_PORTAL200_APPLY4_PREP_PRODUCTION_LAYOUT_EXECUTED_OUTSIDE_GUEST__STAGING_LAYOUT_EXECUTED_OUTSIDE_GUEST\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nRUNNER_CONTRACT_RELEVANT_EXCERPT=[\"7:import json\",\"8:import sys\",\"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\\\",\",\"22:}\",\"24:if mode == \\\"change\\\":\",\"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\\\",\",\"37:errors=\\\"replace\\\",\",\"38:).splitlines()\",\"46:document = json.loads(payloads[0])\",\"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:):\",\"83:raise ValueError(\",\"84:\\\"BLOCKED contract inconsistent with rc/mutation\\\"\",\"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:\",\"100:outcome = \\\"ROLLBACK_UNKNOWN\\\"\",\"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,\",\"115:\\\"error\\\": \\\"NONE\\\",\",\"116:}\",\"117:except Exception as exc:\",\"118:result[\\\"error\\\"] = (\",\"119:\\\"INVALID_CONTRACT:\\\" + type(exc).__name__\",\"120:)\",\"121:elif len(payloads) > 1:\",\"122:result[\\\"error\\\"] = \\\"MULTIPLE_CONTRACTS\\\"\",\"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\\\"],\",\"132:]))\",\"133:PY_CONTRACT\",\"138:tmp=\\\"$(mktemp)\\\"\",\"139:trap 'rm -f \\\"$tmp\\\"' RETURN\",\"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)\\\" = \\\\\",\"145:$'true\\\\tBLOCKED\\\\tfalse\\\\tfalse\\\\tnull\\\\tNO_MUTATION\\\\tNONE' ]\",\"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)\\\" = \\\\\",\"151:$'true\\\\tOK\\\\ttrue\\\\tfalse\\\\tnull\\\\tMUTATED\\\\tNONE' ]\",\"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)\\\" = \\\\\",\"157:$'true\\\\tFAIL\\\\ttrue\\\\ttrue\\\\ttrue\\\\tROLLED_BACK\\\\tNONE' ]\",\"164:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T5 verify 0)\\\" = \\\\\",\"165:$'true\\\\tNOT_APPLICABLE\\\\tfalse\\\\tfalse\\\\tnull\\\\tNO_MUTATION\\\\tNONE' ]\",\"167:printf '%s\\\\n' \\\\\",\"168:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"OTHER\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"169:>\\\"$tmp\\\"\",\"170:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T6 change 0)\\\" = \\\\\",\"171:$'false\\\\tUNKNOWN\\\\tunknown\\\\tunknown\\\\tnull\\\\tUNKNOWN\\\\tINVALID_CONTRACT:ValueError' ]\",\"173:printf '%s\\\\n' \\\\\",\"174:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"175:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"176:>\\\"$tmp\\\"\",\"177:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T7 change 0)\\\" = \\\\\",\"178:$'false\\\\tUNKNOWN\\\\tunknown\\\\tunknown\\\\tnull\\\\tUNKNOWN\\\\tMULTIPLE_CONTRACTS' ]\",\"188:usage() {\",\"189:cat >&2 <<'USAGE'\",\"190:Usage:\",\"191:homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]\",\"193:MODE:\",\"194:read-only\",\"195:verify\",\"204:}\",\"206:[ \\\"$#\\\" -ge 5 ] || usage\",\"208:COMMAND_ID=\\\"$1\\\"\",\"209:MODE=\\\"$2\\\"\",\"210:COMPONENT=\\\"$3\\\"\",\"211:shift 3\",\"213:[ \\\"${1:-}\\\" = '--' ] || usage\",\"214:shift\",\"215:[ \\\"$#\\\" -ge 1 ] || usage\",\"217:case \\\"$COMMAND_ID\\\" in\",\"218:''|*[!A-Za-z0-9._-]*)\",\"219:echo 'RESULT=FAIL'\",\"220:echo 'REASON=INVALID_COMMAND_ID'\",\"221:exit 65\",\"222:;;\",\"223:esac\",\"293:STARTED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\",\"294:STAMP=\\\"$(date -u +%Y%m%dT%H%M%SZ)\\\"\",\"295:HOST_SHORT=\\\"$(hostname -s 2>/dev/null || hostname)\\\"\",\"297:RAW_FILE=\\\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\\\"\",\"298:SANITIZED_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\\\"\",\"299:JSON_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\\\"\",\"300:TXT_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\\\"\",\"302:REFERENCE_SHA256=\\\"$(sha256sum \\\"$REFERENCE\\\" | awk '{print $1}')\\\"\",\"303:ERROR_REGISTER_SHA256=\\\"$(sha256sum \\\"$ERROR_REGISTER\\\" | awk '{print $1}')\\\"\",\"329:BLOCK_REASON=''\",\"330:CHANGE_DECLARED=false\",\"331:RESULT_CONTRACT_VALID=true\",\"332:CONTRACT_STATUS='NOT_APPLICABLE'\",\"333:CHANGES_MADE=false\",\"334:ROLLBACK_STARTED=false\",\"335:ROLLBACK_RESTORED=null\",\"336:MUTATION_OUTCOME='NO_MUTATION'\",\"337:RESULT_CONTRACT_ERROR='NONE'\",\"338:COMMAND_RC=''\",\"340:if [ \\\"$MODE\\\" = change ]; then\",\"341:CHANGE_DECLARED=true\",\"342:RESULT_CONTRACT_VALID=false\",\"343:CONTRACT_STATUS='UNKNOWN'\",\"344:CHANGES_MADE=unknown\",\"345:ROLLBACK_STARTED=unknown\",\"346:ROLLBACK_RESTORED=null\",\"347:MUTATION_OUTCOME='UNKNOWN'\",\"348:RESULT_CONTRACT_ERROR='MISSING_CONTRACT'\",\"349:fi\",\"357:RC=73\",\"358:STATUS='BLOCKED'\",\"359:RESULT_CONTRACT_VALID=true\",\"360:CONTRACT_STATUS='BLOCKED'\",\"361:CHANGES_MADE=false\",\"362:ROLLBACK_STARTED=false\",\"363:ROLLBACK_RESTORED=null\",\"364:MUTATION_OUTCOME='NO_MUTATION'\",\"365:RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'\",\"367:{\",\"408:IFS=$'\\\\t' read -r \\\\\",\"409:RESULT_CONTRACT_VALID \\\\\",\"410:CONTRACT_STATUS \\\\\",\"411:CHANGES_MADE \\\\\",\"412:ROLLBACK_STARTED \\\\\",\"413:ROLLBACK_RESTORED \\\\\",\"414:MUTATION_OUTCOME \\\\\",\"415:RESULT_CONTRACT_ERROR < <(\",\"416:read_mutation_contract \\\\\",\"417:\\\"$RAW_FILE\\\" \\\\\",\"418:\\\"$COMMAND_ID\\\" \\\\\",\"419:\\\"$MODE\\\" \\\\\",\"420:\\\"$COMMAND_RC\\\"\",\"421:)\",\"543:python3 - \\\\\",\"544:\\\"$JSON_FILE\\\" \\\\\",\"545:\\\"$SANITIZED_FILE\\\" \\\\\",\"546:\\\"$COMMAND_ID\\\" \\\\\"]\nTARGET_BRANCH_WORKTREES=[{\"dirty_count\":0,\"head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"remote_head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"repo\":\"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\"}]\nGIT_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\nGIT_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_REMOTE_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_DIRTY_COUNT=0\nNEWFI_CLUSTER_VMS=[{\"name\":\"newfi-prod\",\"node\":\"pve01\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":210},{\"name\":\"newfi-staging\",\"node\":\"pve03\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":211}]\nPRODUCTION_VM={\"name\":\"newfi-prod\",\"node\":\"pve01\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":210}\nSTAGING_VM={\"name\":\"newfi-staging\",\"node\":\"pve03\",\"status\":\"running\",\"type\":\"qemu\",\"vmid\":211}\nPRODUCTION_QGA_SIMPLE={\"err\":\"\",\"hostname\":\"newfi-prod\",\"rc\":0}\nPRODUCTION_QGA_COMPOUND={\"err\":\"\",\"out\":\"A=newfi-prod\\nB=/\",\"rc\":0}\nSTAGING_QGA_SIMPLE={\"err\":\"\",\"hostname\":\"newfi-staging\",\"rc\":0}\nSTAGING_QGA_COMPOUND={\"err\":\"\",\"out\":\"A=newfi-staging\\nB=/\",\"rc\":0}\nPRODUCTION_LAYOUT_DIAGNOSTICS={\"guest_hosts\":[\"newfi-prod\"],\"scan_err\":\"\",\"scan_rc\":0,\"sections\":{\"ADDON\":[\"/var/www/forums/newfi/public/src/addons/Newfi/Dogs/addon.json\",\"/var/www/forums/newfi/public/src/addons/Newfi/Events/addon.json\",\"/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json\"],\"CMD\":[\"/var/www/forums/newfi/public/cmd.php\"],\"HOST\":[\"newfi-prod\"],\"INDEX\":[\"/var/www/forums/newfi/public/index.php\",\"/var/www/forums/newfi/public/install/index.php\",\"/var/www/forums/newfi/public/internal_data/code_cache/templates/l0/s0/admin/index.php\",\"/var/www/forums/newfi/public/internal_data/code_cache/templates/l1/s0/admin/index.php\",\"/var/www/forums/newfi/public/internal_data/code_cache/templates/l2/s0/admin/index.php\",\"/var/www/forums/newfi/public/src/vendor/christian-riesen/otp/example/index.php\"],\"KNOWN_PATHS\":[\"/var/www/forums/newfi|/var/www/forums/newfi\",\"drwxr-xr-x 3 root root 4096 Sep 4 21:18 /var/www/forums/newfi\",\"/var/www/forums/newfi/public|/var/www/forums/newfi/public\",\"drwxr-xr-x 9 root root 4096 Sep 6 09:28 /var/www/forums/newfi/public\"],\"NGINX\":[\" server_name newfi-prod newfi.ru www.newfi.ru [PRIVATE_IP];\",\" root /var/www/forums/newfi/public;\"],\"XF\":[\"/var/www/forums/newfi/public/src/XF.php\"]},\"valid_candidates\":[[12,\"/var/www/forums/newfi/public\"]],\"validations\":{\"/var/www/forums/newfi\":{\"err\":\"\",\"ok\":false,\"out\":\"\"},\"/var/www/forums/newfi/public\":{\"err\":\"\",\"ok\":true,\"out\":\"BASE=/var/www/forums/newfi/public\\nCMD=/var/www/forums/newfi/public/cmd.php\\nXF=/var/www/forums/newfi/public/src/XF.php\"}}}\nPRODUCTION_XF_BASE_ROOT=/var/www/forums/newfi/public\nPRODUCTION_XF_VERSION=XenForo 2.3.12\nPRODUCTION_SERVICES=nginx=active\\nmariadb=active\\nmysql=active\\nphp8.3-fpm.service=active\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_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)\nSTAGING_LAYOUT_DIAGNOSTICS={\"guest_hosts\":[\"newfi-staging\"],\"scan_err\":\"\",\"scan_rc\":0,\"sections\":{\"ADDON\":[\"/var/www/forums/newfi/public/src/addons/Newfi/Dogs/addon.json\",\"/var/www/forums/newfi/public/src/addons/Newfi/Events/addon.json\",\"/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json\"],\"CMD\":[\"/var/www/forums/newfi/public/cmd.php\"],\"HOST\":[\"newfi-staging\"],\"INDEX\":[\"/var/www/forums/newfi/public/index.php\",\"/var/www/forums/newfi/public/install/index.php\",\"/var/www/forums/newfi/public/internal_data/code_cache/templates/l0/s0/admin/index.php\",\"/var/www/forums/newfi/public/internal_data/code_cache/templates/l1/s0/admin/index.php\",\"/var/www/forums/newfi/public/internal_data/code_cache/templates/l2/s0/admin/index.php\",\"/var/www/forums/newfi/public/src/vendor/christian-riesen/otp/example/index.php\"],\"KNOWN_PATHS\":[\"/var/www/forums/newfi|/var/www/forums/newfi\",\"drwxr-xr-x 3 root root 4096 Sep 4 21:18 /var/www/forums/newfi\",\"/var/www/forums/newfi/public|/var/www/forums/newfi/public\",\"drwxr-xr-x 9 root root 4096 Sep 6 09:28 /var/www/forums/newfi/public\"],\"NGINX\":[\" server_name newfi-staging newfi-staging.gram1.ru [PRIVATE_IP];\",\" root /var/www/forums/newfi/public;\"],\"XF\":[\"/var/www/forums/newfi/public/src/XF.php\"]},\"valid_candidates\":[[12,\"/var/www/forums/newfi/public\"]],\"validations\":{\"/var/www/forums/newfi\":{\"err\":\"\",\"ok\":false,\"out\":\"\"},\"/var/www/forums/newfi/public\":{\"err\":\"\",\"ok\":true,\"out\":\"BASE=/var/www/forums/newfi/public\\nCMD=/var/www/forums/newfi/public/cmd.php\\nXF=/var/www/forums/newfi/public/src/XF.php\"}}}\nSTAGING_XF_BASE_ROOT=/var/www/forums/newfi/public\nSTAGING_XF_VERSION=XenForo 2.3.12\nSTAGING_SERVICES=nginx=active\\nmariadb=active\\nmysql=active\\nphp8.3-fpm.service=active\nSTAGING_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\"}]\nSTAGING_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)\nPORTAL_ADDON_ID=Newfi/Portal\nPRODUCTION_DB_CLIENT=/usr/bin/mariadb\nPRODUCTION_DB_SCHEMA_CANDIDATES=[\"xf_newfi\"]\nPRODUCTION_BOARD_ACTIVE=1\nPRODUCTION_ERROR_MAX=0\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_PORTAL_TEMPLATE_HASH_ROWS=[\"0\\tnewfi_portal\\t1f484c8cf6bdeda8fda2974abf8a57f8cc7453fe2a779af7c735afa3b73aa741\"]\nPRODUCTION_PORTAL_SOURCE_TREE_SHA256=a066546dcbef1321be989ccdcabdb195318e36cd3f33d2f90a2a88acb7ac44ae\nSTAGING_DB_CLIENT=/usr/bin/mariadb\nSTAGING_DB_SCHEMA_CANDIDATES=[\"xf_newfi\"]\nSTAGING_BOARD_ACTIVE=0\nSTAGING_ERROR_MAX=40\nSTAGING_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\nSTAGING_PORTAL_TEMPLATE_HASH_ROWS=[\"0\\tnewfi_portal\\t1f484c8cf6bdeda8fda2974abf8a57f8cc7453fe2a779af7c735afa3b73aa741\"]\nSTAGING_PORTAL_SOURCE_TREE_SHA256=a066546dcbef1321be989ccdcabdb195318e36cd3f33d2f90a2a88acb7ac44ae\nGIT_PORTAL_SOURCE_PATH_CANDIDATES=[\"src/addons/Newfi/Portal\"]\nGIT_PORTAL_SOURCE_PATH=src/addons/Newfi/Portal\nGIT_PORTAL_SOURCE_TREE_SHA256=a066546dcbef1321be989ccdcabdb195318e36cd3f33d2f90a2a88acb7ac44ae\nGIT_PORTAL_SOURCE_FILE_COUNT=7\nGIT_PRODUCTION_PORTAL_SOURCE_MATCH=true\nGIT_STAGING_PORTAL_SOURCE_MATCH=true\nPORTAL_SOURCE_PROD_STAGING_MATCH=true\nPORTAL_TEMPLATE_PROD_STAGING_MATCH=true\nSTAGING_ADDON_REBUILD_HELP=Description:\\n Rebuilds the specified add-on data.\\n\\nUsage:\\n xf:addon-rebuild [options] [--] \\n xf-addon:rebuild\\n\\nArguments:\\n id Add-On ID\\n\\nOptions:\\n -f, --force Skip verifying that the add-on is rebuildable\\n -h, --help Display help for the given command. When no command is given display help for the list command\\n -q, --quiet Do not output any message\\n -V, --version Display this application version\\n --ansi|--no-ansi Force (or disable --no-ansi) ANSI output\\n -n, --no-interaction Do not ask any interactive question\\n -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug\nSTAGING_REBUILD_COMMAND_SOURCE_CANDIDATES=[\"/var/www/forums/newfi/public/src/XF/Cli/Command/AddOnRebuild.php\"]\nSTAGING_REBUILD_COMMAND_SOURCE_SHA256=6ed0bc6d2b1509a2f4c9ec2d1d612c72f3ede01aca30ac60317eae68e12697ab\nSTAGING_REBUILD_COMMAND_RELEVANT_EXCERPT=[\"use Symfony\\\\Component\\\\Console\\\\Output\\\\OutputInterface;\",\"use Symfony\\\\Component\\\\Console\\\\Question\\\\ConfirmationQuestion;\",\"\",\"class AddOnRebuild extends AbstractCommand\",\"{\",\"\\tuse AddOnActionTrait;\",\"\\tuse JobRunnerTrait;\",\"\\tprotected function configure()\",\"\\t{\",\"\\t\\t$this\",\"\\t\\t\\t->setName('xf:addon-rebuild')\",\"\\t\\t\\t->setAliases(['xf-addon:rebuild'])\",\"\\t\\t\\t->setDescription('Rebuilds the specified add-on data.')\",\"\\t\\t\\t->addArgument(\",\"\\t\\t\\t\\t'id',\",\"\\t\\t\\t\\tInputArgument::REQUIRED,\",\"\\t\\t\\t\\t'Add-On ID'\",\"\\t\\t\\t)\",\"\\t\\t\\t->addOption(\",\"\\t\\t\\t\\t'force',\",\"\\t\\t\\t\\t'f',\",\"\\t\\t\\t\\tInputOption::VALUE_NONE,\",\"\\t\\t\\t\\t'Skip verifying that the add-on is rebuildable'\",\"\\t\\t\\t);\",\"\\t}\",\"\\t\\t\\treturn 1;\",\"\\t\\t}\",\"\\t\\tif (!$addOn->canRebuild() && !$input->getOption('force'))\",\"\\t\\t{\",\"\\t\\t\\t$output->writeln(\\\"\\\" . \\\\XF::phrase('this_add_on_cannot_be_rebuilt') . \\\"\\\");\",\"\\t\\tif (!$this->verifyAddOnAction($input, $output, $addOn))\",\"\\t\\t/** @var QuestionHelper $helper */\",\"\\t\\t$helper = $this->getHelper('question');\",\"\\t\\t$question = new ConfirmationQuestion(\\\"\\\" . \\\\XF::phrase('please_confirm_that_you_want_to_rebuild_following_add_on') . ': (' . $addOn->title . ' ' . $addOn->version_string . \\\") (y/n)\\\");\",\"\\t\\t$response = $helper->ask($input, $output, $question);\",\"\\t\\tif (!$response)\",\"\\t\\t$addOn->preRebuild();\",\"\\t\\t$this->runSubAction($output, $addOn, 'import');\",\"\\t\\t$this->runSubAction($output, $addOn, 'post-rebuild');\",\"\\t\\treturn 0;\"]\nPRODUCTION_ROLLBACK_PREREQUISITES=tar=/usr/bin/tar\\ndump=/usr/bin/mariadb-dump\\n/dev/sda1 51392640 2041544 47212760 5% /\\n/dev/sda1 51392640 2041544 47212760 5% /\nSTAGING_ROLLBACK_PREREQUISITES=tar=/usr/bin/tar\\ndump=/usr/bin/mariadb-dump\\n/dev/sda1 51392640 2005380 47248924 5% /\\n/dev/sda1 51392640 2005380 47248924 5% /\nPRODUCTION_PUBLIC_HTTP={\"http\":\"200\",\"rc\":0}\nSTAGING_NGINX_SERVER_NAMES=[\"newfi-staging\",\"newfi-staging.gram1.ru\"]\nSTAGING_LOCAL_HTTP={\"host\":\"newfi-staging\",\"http\":\"503\",\"rc\":0}\nHOLD_REASONS=[]\nFINAL_DECISION=ELIGIBLE_FOR_PORTAL200_APPLY4_PREP\nRECOVERY5_END=true\n" + "output": "APPLY4_DESIGN1_BEGIN=true\nCOMMAND_ID=NEWFI-260907-A-PORTAL200-APPLY4DESIGN1\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\nLANEB_PASS_HISTORY_SHA256=08c00e675ffa960eca55102a114d305fb1a15291ff7e401dc43c09d087c32ece\nLANEB_PASS_STATUS=OK\nLANEB_PASS_HOLD_REASONS=[]\nLANEB_PASS_FINAL_DECISION=ELIGIBLE_FOR_PORTAL200_APPLY4_PREP\nAPPLY3_HISTORY_SHA256=f3ea3fcebd7b182e64db6e963a34f1b90baca0d08477e25e27bf88c48b33611c\nAPPLY3_STATUS=FAIL\nAPPLY3_RC=76\nAPPLY3_RESULT_CONTRACT_VALID=false\nAPPLY3_MUTATION_OUTCOME=UNKNOWN\nRUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\nRUNNER_CONTRACT_EXCERPT=[\"7:import json\",\"8:import sys\",\"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\\\",\",\"22:}\",\"24:if mode == \\\"change\\\":\",\"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\\\",\",\"37:errors=\\\"replace\\\",\",\"38:).splitlines()\",\"44:if len(payloads) == 1:\",\"45:try:\",\"46:document = json.loads(payloads[0])\",\"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:):\",\"83:raise ValueError(\",\"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:\",\"100:outcome = \\\"ROLLBACK_UNKNOWN\\\"\",\"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,\",\"115:\\\"error\\\": \\\"NONE\\\",\",\"116:}\",\"117:except Exception as exc:\",\"118:result[\\\"error\\\"] = (\",\"119:\\\"INVALID_CONTRACT:\\\" + type(exc).__name__\",\"120:)\",\"121:elif len(payloads) > 1:\",\"122:result[\\\"error\\\"] = \\\"MULTIPLE_CONTRACTS\\\"\",\"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\\\"],\",\"132:]))\",\"133:PY_CONTRACT\",\"138:tmp=\\\"$(mktemp)\\\"\",\"139:trap 'rm -f \\\"$tmp\\\"' RETURN\",\"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)\\\" = \\\\\",\"145:$'true\\\\tBLOCKED\\\\tfalse\\\\tfalse\\\\tnull\\\\tNO_MUTATION\\\\tNONE' ]\",\"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)\\\" = \\\\\",\"151:$'true\\\\tOK\\\\ttrue\\\\tfalse\\\\tnull\\\\tMUTATED\\\\tNONE' ]\",\"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)\\\" = \\\\\",\"157:$'true\\\\tFAIL\\\\ttrue\\\\ttrue\\\\ttrue\\\\tROLLED_BACK\\\\tNONE' ]\",\"164:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T5 verify 0)\\\" = \\\\\",\"165:$'true\\\\tNOT_APPLICABLE\\\\tfalse\\\\tfalse\\\\tnull\\\\tNO_MUTATION\\\\tNONE' ]\",\"167:printf '%s\\\\n' \\\\\",\"168:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"OTHER\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"169:>\\\"$tmp\\\"\",\"170:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T6 change 0)\\\" = \\\\\",\"171:$'false\\\\tUNKNOWN\\\\tunknown\\\\tunknown\\\\tnull\\\\tUNKNOWN\\\\tINVALID_CONTRACT:ValueError' ]\",\"173:printf '%s\\\\n' \\\\\",\"174:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"175:'HOMELAB_RESULT_CONTRACT={\\\"version\\\":1,\\\"command_id\\\":\\\"T7\\\",\\\"status\\\":\\\"OK\\\",\\\"changes_made\\\":true,\\\"rollback_started\\\":false,\\\"rollback_restored\\\":null}' \\\\\",\"176:>\\\"$tmp\\\"\",\"177:[ \\\"$(read_mutation_contract \\\"$tmp\\\" T7 change 0)\\\" = \\\\\",\"178:$'false\\\\tUNKNOWN\\\\tunknown\\\\tunknown\\\\tnull\\\\tUNKNOWN\\\\tMULTIPLE_CONTRACTS' ]\",\"188:usage() {\",\"189:cat >&2 <<'USAGE'\",\"190:Usage:\",\"191:homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]\",\"193:MODE:\",\"194:read-only\",\"195:verify\",\"204:}\",\"206:[ \\\"$#\\\" -ge 5 ] || usage\",\"208:COMMAND_ID=\\\"$1\\\"\",\"209:MODE=\\\"$2\\\"\",\"210:COMPONENT=\\\"$3\\\"\",\"211:shift 3\",\"213:[ \\\"${1:-}\\\" = '--' ] || usage\",\"214:shift\",\"215:[ \\\"$#\\\" -ge 1 ] || usage\",\"217:case \\\"$COMMAND_ID\\\" in\",\"218:''|*[!A-Za-z0-9._-]*)\",\"219:echo 'RESULT=FAIL'\",\"220:echo 'REASON=INVALID_COMMAND_ID'\",\"221:exit 65\",\"222:;;\",\"223:esac\",\"293:STARTED_AT=\\\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\\\"\",\"294:STAMP=\\\"$(date -u +%Y%m%dT%H%M%SZ)\\\"\",\"295:HOST_SHORT=\\\"$(hostname -s 2>/dev/null || hostname)\\\"\",\"297:RAW_FILE=\\\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\\\"\",\"298:SANITIZED_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\\\"\",\"299:JSON_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\\\"\",\"300:TXT_FILE=\\\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\\\"\",\"302:REFERENCE_SHA256=\\\"$(sha256sum \\\"$REFERENCE\\\" | awk '{print $1}')\\\"\",\"303:ERROR_REGISTER_SHA256=\\\"$(sha256sum \\\"$ERROR_REGISTER\\\" | awk '{print $1}')\\\"\",\"328:REPEAT_BLOCKED=false\",\"329:BLOCK_REASON=''\",\"330:CHANGE_DECLARED=false\",\"331:RESULT_CONTRACT_VALID=true\",\"332:CONTRACT_STATUS='NOT_APPLICABLE'\",\"333:CHANGES_MADE=false\",\"334:ROLLBACK_STARTED=false\",\"335:ROLLBACK_RESTORED=null\",\"336:MUTATION_OUTCOME='NO_MUTATION'\",\"337:RESULT_CONTRACT_ERROR='NONE'\",\"338:COMMAND_RC=''\",\"340:if [ \\\"$MODE\\\" = change ]; then\",\"341:CHANGE_DECLARED=true\",\"342:RESULT_CONTRACT_VALID=false\",\"343:CONTRACT_STATUS='UNKNOWN'\",\"344:CHANGES_MADE=unknown\",\"345:ROLLBACK_STARTED=unknown\",\"346:ROLLBACK_RESTORED=null\",\"347:MUTATION_OUTCOME='UNKNOWN'\",\"348:RESULT_CONTRACT_ERROR='MISSING_CONTRACT'\",\"349:fi\",\"354:RUN_STARTED=false\",\"355:REPEAT_BLOCKED=true\",\"356:BLOCK_REASON='EXACT_FAILED_COMMAND_REPEAT'\",\"357:RC=73\",\"358:STATUS='BLOCKED'\",\"359:RESULT_CONTRACT_VALID=true\",\"360:CONTRACT_STATUS='BLOCKED'\",\"361:CHANGES_MADE=false\",\"362:ROLLBACK_STARTED=false\",\"363:ROLLBACK_RESTORED=null\",\"364:MUTATION_OUTCOME='NO_MUTATION'\",\"365:RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'\",\"367:{\",\"385:esac\",\"387:timeout \\\\\",\"388:--foreground \\\\\",\"389:--preserve-status \\\\\",\"390:\\\"$HOMELAB_TIMEOUT\\\" \\\\\",\"391:\\\"$@\\\" >\\\"$RAW_FILE\\\" 2>&1\",\"392:RC=$?\",\"393:else\"]\nTARGET_WORKTREES=[{\"dirty_count\":0,\"head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"remote_head\":\"06bab5acd124e768f70305b3d7eca2f595871890\",\"repo\":\"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\"}]\nGIT_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906\nGIT_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_REMOTE_HEAD=06bab5acd124e768f70305b3d7eca2f595871890\nGIT_DIRTY_COUNT=0\nCURRENT_PORTAL_GIT_FILES=[\"src/addons/Newfi/Portal/Pub/Controller/Portal.php\",\"src/addons/Newfi/Portal/Pub/View/Portal.php\",\"src/addons/Newfi/Portal/_data/navigation.xml\",\"src/addons/Newfi/Portal/_data/phrases.xml\",\"src/addons/Newfi/Portal/_data/routes.xml\",\"src/addons/Newfi/Portal/_data/templates.xml\",\"src/addons/Newfi/Portal/addon.json\"]\nCURRENT_PORTAL_GIT_MANIFEST={\"src/addons/Newfi/Portal/Pub/Controller/Portal.php\":{\"bytes\":247,\"sha256\":\"53909e753ea5a011550fd280ad1c342a74ca9949be092dfbd95244243cae92f3\"},\"src/addons/Newfi/Portal/Pub/View/Portal.php\":{\"bytes\":79,\"sha256\":\"26e3b77c2c86d4f4a6fd51f0472e3f38e70e14c984ffd8d04dcec39071a2a69f\"},\"src/addons/Newfi/Portal/_data/navigation.xml\":{\"bytes\":281,\"sha256\":\"5d724ef5141438bdd0b9dba6a583d330bc6940b0ace5c21c7a8d5301e7d8d649\"},\"src/addons/Newfi/Portal/_data/phrases.xml\":{\"bytes\":173,\"sha256\":\"15282a06a956bda4e810f6b26b1703676dd766424029cd372ce0fd7832dbe09c\"},\"src/addons/Newfi/Portal/_data/routes.xml\":{\"bytes\":144,\"sha256\":\"9b80ef229bcebb49a5930369bb272ed85367deef66070f432948001096673629\"},\"src/addons/Newfi/Portal/_data/templates.xml\":{\"bytes\":1461,\"sha256\":\"c29c04f8b937284e821c87957653e87c2f6ac014fac30648a0f6b18e84392adf\"},\"src/addons/Newfi/Portal/addon.json\":{\"bytes\":378,\"json\":{\"description\":\"Minimal private-staging portal for the Newfi closed MVP.\",\"dev\":\"Newfi\",\"dev_url\":\"\",\"extra_urls\":[],\"faq_url\":\"\",\"icon\":\"\",\"legacy_addon_id\":\"\",\"require\":{\"XF\":[2031270,\"XenForo 2.3.12+\"]},\"support_url\":\"\",\"title\":\"Newfi Portal\",\"version_id\":1000010,\"version_string\":\"1.0.0 Alpha 1\"},\"sha256\":\"288a61044c941107162d045be49ab2e7c844d1586b25378a7289b3c7275010ab\"}}\nAPPLY3_ATTEMPT_DIR=/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3\nAPPLY3_ATTEMPT_EXISTS=true\nAPPLY3_ATTEMPT_FILES=[{\"bytes\":73,\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/attempt.txt\",\"sha256\":\"fc3d53a77acceff697ec5111ab3ba411ede195fd9a8e358de5ae94dbc94f4d14\"},{\"bytes\":90,\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/receipt.txt\",\"sha256\":\"a993d3503cd786e73baa68900ae5bc46eac405da3430cfab0bb5db981e0f1b4b\"},{\"bytes\":669,\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/wrapper.log\",\"sha256\":\"dec036ea985e75d776b2de8c2bede77fe4b4aafa5da33648b2a6b5f79f3dec30\"}]\nRELATED_ARTIFACT_FILES=[]\nCANDIDATE_PORTAL_ROOTS=[]\nCANDIDATE_PORTAL_MANIFESTS=[]\nCANDIDATE_ARTIFACT_EVIDENCE=[{\"decoded_payloads\":[],\"hits\":[\"1:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3\",\"2:STATE=RESERVED_BEFORE_EXECUTION\"],\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/attempt.txt\",\"sha256\":\"fc3d53a77acceff697ec5111ab3ba411ede195fd9a8e358de5ae94dbc94f4d14\"},{\"decoded_payloads\":[],\"hits\":[\"1:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3\",\"2:WRAPPER_RC=76\",\"3:PUBLICATION=GITEA_RUNTIME_EXPECTED\"],\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/receipt.txt\",\"sha256\":\"a993d3503cd786e73baa68900ae5bc46eac405da3430cfab0bb5db981e0f1b4b\"},{\"decoded_payloads\":[],\"hits\":[\"3:remote: Processed 1 references in total \",\"4:RESULT=OK\",\"5:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3\",\"6:COMMIT_SHA=bb707af34d2a2b6a6b23c3d4d03f6b701150a653\",\"7:STATIC_PUBLICATION=OK\",\"9:\",\"10:===== HOMELAB CHAT RUN COMPLETE =====\",\"11:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3\",\"12:STATUS=FAIL\",\"13:RC=76\",\"17:GITEA_PUBLICATION=OK\",\"18:PUBLIC_URL=https://git.gram1.ru/.well-known/homelab-runtime/latest.json\",\"19:LOCAL_RAW_FILE=/var/lib/homelab-chat-run/raw/NEWFI-260907-PORTAL200-APPLY3-20260907T112033Z.log\",\"20:SHELL_SESSION_PRESERVED=yes\"],\"path\":\"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/wrapper.log\",\"sha256\":\"dec036ea985e75d776b2de8c2bede77fe4b4aafa5da33648b2a6b5f79f3dec30\"}]\nPORTAL_GIT_ALL_HISTORY=[\"ca07bfc20953585887f7cc2f1d443cf8313912c8\\t2026-09-06T16:40:06+03:00\\tfeat: add Portal navigation and widgets\",\"82dd2066df377ba9d904f68f90898e009413eec9\\t2026-09-06T16:15:39+03:00\\tfeat: add Newfi Portal staging checkpoint\"]\nPORTAL_UNREACHABLE_COMMITS=[]\nHOLD_REASONS=[]\nFINAL_DECISION=ELIGIBLE_FOR_PORTAL200_APPLY4_CHANGE_CARRIER_BUILD\nAPPLY4_DESIGN1_END=true\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index 2b384bc0..7321aca2 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,15 +1,15 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY5 +COMMAND_ID=NEWFI-260907-A-PORTAL200-APPLY4DESIGN1 STATUS=OK RC=0 HOST=pve01 MODE=read-only -COMPONENT=newfi-portal200-recovery5-parser-fix +COMPONENT=newfi-portal200-apply4-candidate-provenance REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=def5ed0b9b382526126bae0675243fb40bba3480be5fd31b79d9ea9b4774bec8 +COMMAND_SHA256=ba1e39080eba5653f605069127f81a6d51ebc978a94c50c3091e5301ed3cd4ae DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true CHANGE_DECLARED=false @@ -24,87 +24,48 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=9ca6ffdd4e8304e7892084bb2c85c01dcba9f5638c90403eb23169bad8c6e599 -SANITIZED_OUTPUT_SHA256=3975ca27123f768ce53b4b9e826eddc6a64712a036a27179c636f69ed6b2fec0 +RAW_EVIDENCE_SHA256=869943bf04580fdbc610eb5377b46fecec1a92821a1b0663d8faab7700ba6176 +SANITIZED_OUTPUT_SHA256=869943bf04580fdbc610eb5377b46fecec1a92821a1b0663d8faab7700ba6176 OUTPUT_BEGIN -RECOVERY5_BEGIN=true -COMMAND_ID=NEWFI-260907-B-PORTAL200-RECOVERY5 +APPLY4_DESIGN1_BEGIN=true +COMMAND_ID=NEWFI-260907-A-PORTAL200-APPLY4DESIGN1 MUTATION_SCOPE=NONE_READ_ONLY MUTATIONS_PERFORMED=NO -REMOTE_QGA_QUOTING_FIX=SSH_REMOTE_ARGV_SHELL_QUOTED_SINGLE_COMMAND -LAYOUT_SECTION_PARSER_FIX=A_Z_0_9_UNDERSCORE ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 REFERENCE_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED -RECOVERY4_HISTORY_SHA256=4f526e81a36c906286024af28c3c5ad8e0185cd2448972a4bfbbaf6f646fae4b -RECOVERY4_STATUS=OK -RECOVERY4_CHANGES_MADE=false -RECOVERY4_MUTATION_OUTCOME=NO_MUTATION -RECOVERY4_HOLD_REASONS=["PRODUCTION_LAYOUT_EXECUTED_OUTSIDE_GUEST","STAGING_LAYOUT_EXECUTED_OUTSIDE_GUEST"] -RECOVERY4_FINAL_DECISION=HOLD_PORTAL200_APPLY4_PREP_PRODUCTION_LAYOUT_EXECUTED_OUTSIDE_GUEST__STAGING_LAYOUT_EXECUTED_OUTSIDE_GUEST +LANEB_PASS_HISTORY_SHA256=08c00e675ffa960eca55102a114d305fb1a15291ff7e401dc43c09d087c32ece +LANEB_PASS_STATUS=OK +LANEB_PASS_HOLD_REASONS=[] +LANEB_PASS_FINAL_DECISION=ELIGIBLE_FOR_PORTAL200_APPLY4_PREP +APPLY3_HISTORY_SHA256=f3ea3fcebd7b182e64db6e963a34f1b90baca0d08477e25e27bf88c48b33611c +APPLY3_STATUS=FAIL +APPLY3_RC=76 +APPLY3_RESULT_CONTRACT_VALID=false +APPLY3_MUTATION_OUTCOME=UNKNOWN RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d -RUNNER_CONTRACT_RELEVANT_EXCERPT=["7:import json","8:import sys","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\",","22:}","24:if mode == \"change\":","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\",","37:errors=\"replace\",","38:).splitlines()","46:document = json.loads(payloads[0])","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:):","83:raise ValueError(","84:\"BLOCKED contract inconsistent with rc/mutation\"","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:","100:outcome = \"ROLLBACK_UNKNOWN\"","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,","115:\"error\": \"NONE\",","116:}","117:except Exception as exc:","118:result[\"error\"] = (","119:\"INVALID_CONTRACT:\" + type(exc).__name__","120:)","121:elif len(payloads) > 1:","122:result[\"error\"] = \"MULTIPLE_CONTRACTS\"","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\"],","132:]))","133:PY_CONTRACT","138:tmp=\"$(mktemp)\"","139:trap 'rm -f \"$tmp\"' RETURN","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)\" = \\","145:$'true\\tBLOCKED\\tfalse\\tfalse\\tnull\\tNO_MUTATION\\tNONE' ]","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)\" = \\","151:$'true\\tOK\\ttrue\\tfalse\\tnull\\tMUTATED\\tNONE' ]","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)\" = \\","157:$'true\\tFAIL\\ttrue\\ttrue\\ttrue\\tROLLED_BACK\\tNONE' ]","164:[ \"$(read_mutation_contract \"$tmp\" T5 verify 0)\" = \\","165:$'true\\tNOT_APPLICABLE\\tfalse\\tfalse\\tnull\\tNO_MUTATION\\tNONE' ]","167:printf '%s\\n' \\","168:'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"OTHER\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","169:>\"$tmp\"","170:[ \"$(read_mutation_contract \"$tmp\" T6 change 0)\" = \\","171:$'false\\tUNKNOWN\\tunknown\\tunknown\\tnull\\tUNKNOWN\\tINVALID_CONTRACT:ValueError' ]","173:printf '%s\\n' \\","174:'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","175:'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","176:>\"$tmp\"","177:[ \"$(read_mutation_contract \"$tmp\" T7 change 0)\" = \\","178:$'false\\tUNKNOWN\\tunknown\\tunknown\\tnull\\tUNKNOWN\\tMULTIPLE_CONTRACTS' ]","188:usage() {","189:cat >&2 <<'USAGE'","190:Usage:","191:homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]","193:MODE:","194:read-only","195:verify","204:}","206:[ \"$#\" -ge 5 ] || usage","208:COMMAND_ID=\"$1\"","209:MODE=\"$2\"","210:COMPONENT=\"$3\"","211:shift 3","213:[ \"${1:-}\" = '--' ] || usage","214:shift","215:[ \"$#\" -ge 1 ] || usage","217:case \"$COMMAND_ID\" in","218:''|*[!A-Za-z0-9._-]*)","219:echo 'RESULT=FAIL'","220:echo 'REASON=INVALID_COMMAND_ID'","221:exit 65","222:;;","223:esac","293:STARTED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"","294:STAMP=\"$(date -u +%Y%m%dT%H%M%SZ)\"","295:HOST_SHORT=\"$(hostname -s 2>/dev/null || hostname)\"","297:RAW_FILE=\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\"","298:SANITIZED_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\"","299:JSON_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\"","300:TXT_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\"","302:REFERENCE_SHA256=\"$(sha256sum \"$REFERENCE\" | awk '{print $1}')\"","303:ERROR_REGISTER_SHA256=\"$(sha256sum \"$ERROR_REGISTER\" | awk '{print $1}')\"","329:BLOCK_REASON=''","330:CHANGE_DECLARED=false","331:RESULT_CONTRACT_VALID=true","332:CONTRACT_STATUS='NOT_APPLICABLE'","333:CHANGES_MADE=false","334:ROLLBACK_STARTED=false","335:ROLLBACK_RESTORED=null","336:MUTATION_OUTCOME='NO_MUTATION'","337:RESULT_CONTRACT_ERROR='NONE'","338:COMMAND_RC=''","340:if [ \"$MODE\" = change ]; then","341:CHANGE_DECLARED=true","342:RESULT_CONTRACT_VALID=false","343:CONTRACT_STATUS='UNKNOWN'","344:CHANGES_MADE=unknown","345:ROLLBACK_STARTED=unknown","346:ROLLBACK_RESTORED=null","347:MUTATION_OUTCOME='UNKNOWN'","348:RESULT_CONTRACT_ERROR='MISSING_CONTRACT'","349:fi","357:RC=73","358:STATUS='BLOCKED'","359:RESULT_CONTRACT_VALID=true","360:CONTRACT_STATUS='BLOCKED'","361:CHANGES_MADE=false","362:ROLLBACK_STARTED=false","363:ROLLBACK_RESTORED=null","364:MUTATION_OUTCOME='NO_MUTATION'","365:RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'","367:{","408:IFS=$'\\t' read -r \\","409:RESULT_CONTRACT_VALID \\","410:CONTRACT_STATUS \\","411:CHANGES_MADE \\","412:ROLLBACK_STARTED \\","413:ROLLBACK_RESTORED \\","414:MUTATION_OUTCOME \\","415:RESULT_CONTRACT_ERROR < <(","416:read_mutation_contract \\","417:\"$RAW_FILE\" \\","418:\"$COMMAND_ID\" \\","419:\"$MODE\" \\","420:\"$COMMAND_RC\"","421:)","543:python3 - \\","544:\"$JSON_FILE\" \\","545:\"$SANITIZED_FILE\" \\","546:\"$COMMAND_ID\" \\"] -TARGET_BRANCH_WORKTREES=[{"dirty_count":0,"head":"06bab5acd124e768f70305b3d7eca2f595871890","remote_head":"06bab5acd124e768f70305b3d7eca2f595871890","repo":"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906"}] +RUNNER_CONTRACT_EXCERPT=["7:import json","8:import sys","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\",","22:}","24:if mode == \"change\":","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\",","37:errors=\"replace\",","38:).splitlines()","44:if len(payloads) == 1:","45:try:","46:document = json.loads(payloads[0])","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:):","83:raise ValueError(","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:","100:outcome = \"ROLLBACK_UNKNOWN\"","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,","115:\"error\": \"NONE\",","116:}","117:except Exception as exc:","118:result[\"error\"] = (","119:\"INVALID_CONTRACT:\" + type(exc).__name__","120:)","121:elif len(payloads) > 1:","122:result[\"error\"] = \"MULTIPLE_CONTRACTS\"","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\"],","132:]))","133:PY_CONTRACT","138:tmp=\"$(mktemp)\"","139:trap 'rm -f \"$tmp\"' RETURN","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)\" = \\","145:$'true\\tBLOCKED\\tfalse\\tfalse\\tnull\\tNO_MUTATION\\tNONE' ]","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)\" = \\","151:$'true\\tOK\\ttrue\\tfalse\\tnull\\tMUTATED\\tNONE' ]","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)\" = \\","157:$'true\\tFAIL\\ttrue\\ttrue\\ttrue\\tROLLED_BACK\\tNONE' ]","164:[ \"$(read_mutation_contract \"$tmp\" T5 verify 0)\" = \\","165:$'true\\tNOT_APPLICABLE\\tfalse\\tfalse\\tnull\\tNO_MUTATION\\tNONE' ]","167:printf '%s\\n' \\","168:'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"OTHER\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","169:>\"$tmp\"","170:[ \"$(read_mutation_contract \"$tmp\" T6 change 0)\" = \\","171:$'false\\tUNKNOWN\\tunknown\\tunknown\\tnull\\tUNKNOWN\\tINVALID_CONTRACT:ValueError' ]","173:printf '%s\\n' \\","174:'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","175:'HOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"T7\",\"status\":\"OK\",\"changes_made\":true,\"rollback_started\":false,\"rollback_restored\":null}' \\","176:>\"$tmp\"","177:[ \"$(read_mutation_contract \"$tmp\" T7 change 0)\" = \\","178:$'false\\tUNKNOWN\\tunknown\\tunknown\\tnull\\tUNKNOWN\\tMULTIPLE_CONTRACTS' ]","188:usage() {","189:cat >&2 <<'USAGE'","190:Usage:","191:homelab-chat-run COMMAND_ID MODE COMPONENT -- command [arguments...]","193:MODE:","194:read-only","195:verify","204:}","206:[ \"$#\" -ge 5 ] || usage","208:COMMAND_ID=\"$1\"","209:MODE=\"$2\"","210:COMPONENT=\"$3\"","211:shift 3","213:[ \"${1:-}\" = '--' ] || usage","214:shift","215:[ \"$#\" -ge 1 ] || usage","217:case \"$COMMAND_ID\" in","218:''|*[!A-Za-z0-9._-]*)","219:echo 'RESULT=FAIL'","220:echo 'REASON=INVALID_COMMAND_ID'","221:exit 65","222:;;","223:esac","293:STARTED_AT=\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"","294:STAMP=\"$(date -u +%Y%m%dT%H%M%SZ)\"","295:HOST_SHORT=\"$(hostname -s 2>/dev/null || hostname)\"","297:RAW_FILE=\"$RAW_DIR/${COMMAND_ID}-${STAMP}.log\"","298:SANITIZED_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.txt\"","299:JSON_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}.json\"","300:TXT_FILE=\"$PUBLIC_DIR/${COMMAND_ID}-${STAMP}-latest.txt\"","302:REFERENCE_SHA256=\"$(sha256sum \"$REFERENCE\" | awk '{print $1}')\"","303:ERROR_REGISTER_SHA256=\"$(sha256sum \"$ERROR_REGISTER\" | awk '{print $1}')\"","328:REPEAT_BLOCKED=false","329:BLOCK_REASON=''","330:CHANGE_DECLARED=false","331:RESULT_CONTRACT_VALID=true","332:CONTRACT_STATUS='NOT_APPLICABLE'","333:CHANGES_MADE=false","334:ROLLBACK_STARTED=false","335:ROLLBACK_RESTORED=null","336:MUTATION_OUTCOME='NO_MUTATION'","337:RESULT_CONTRACT_ERROR='NONE'","338:COMMAND_RC=''","340:if [ \"$MODE\" = change ]; then","341:CHANGE_DECLARED=true","342:RESULT_CONTRACT_VALID=false","343:CONTRACT_STATUS='UNKNOWN'","344:CHANGES_MADE=unknown","345:ROLLBACK_STARTED=unknown","346:ROLLBACK_RESTORED=null","347:MUTATION_OUTCOME='UNKNOWN'","348:RESULT_CONTRACT_ERROR='MISSING_CONTRACT'","349:fi","354:RUN_STARTED=false","355:REPEAT_BLOCKED=true","356:BLOCK_REASON='EXACT_FAILED_COMMAND_REPEAT'","357:RC=73","358:STATUS='BLOCKED'","359:RESULT_CONTRACT_VALID=true","360:CONTRACT_STATUS='BLOCKED'","361:CHANGES_MADE=false","362:ROLLBACK_STARTED=false","363:ROLLBACK_RESTORED=null","364:MUTATION_OUTCOME='NO_MUTATION'","365:RESULT_CONTRACT_ERROR='RUNNER_PREEXECUTION_BLOCK'","367:{","385:esac","387:timeout \\","388:--foreground \\","389:--preserve-status \\","390:\"$HOMELAB_TIMEOUT\" \\","391:\"$@\" >\"$RAW_FILE\" 2>&1","392:RC=$?","393:else"] +TARGET_WORKTREES=[{"dirty_count":0,"head":"06bab5acd124e768f70305b3d7eca2f595871890","remote_head":"06bab5acd124e768f70305b3d7eca2f595871890","repo":"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906"}] GIT_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906 GIT_HEAD=06bab5acd124e768f70305b3d7eca2f595871890 GIT_REMOTE_HEAD=06bab5acd124e768f70305b3d7eca2f595871890 GIT_DIRTY_COUNT=0 -NEWFI_CLUSTER_VMS=[{"name":"newfi-prod","node":"pve01","status":"running","type":"qemu","vmid":210},{"name":"newfi-staging","node":"pve03","status":"running","type":"qemu","vmid":211}] -PRODUCTION_VM={"name":"newfi-prod","node":"pve01","status":"running","type":"qemu","vmid":210} -STAGING_VM={"name":"newfi-staging","node":"pve03","status":"running","type":"qemu","vmid":211} -PRODUCTION_QGA_SIMPLE={"err":"","hostname":"newfi-prod","rc":0} -PRODUCTION_QGA_COMPOUND={"err":"","out":"A=newfi-prod\nB=/","rc":0} -STAGING_QGA_SIMPLE={"err":"","hostname":"newfi-staging","rc":0} -STAGING_QGA_COMPOUND={"err":"","out":"A=newfi-staging\nB=/","rc":0} -PRODUCTION_LAYOUT_DIAGNOSTICS={"guest_hosts":["newfi-prod"],"scan_err":"","scan_rc":0,"sections":{"ADDON":["/var/www/forums/newfi/public/src/addons/Newfi/Dogs/addon.json","/var/www/forums/newfi/public/src/addons/Newfi/Events/addon.json","/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json"],"CMD":["/var/www/forums/newfi/public/cmd.php"],"HOST":["newfi-prod"],"INDEX":["/var/www/forums/newfi/public/index.php","/var/www/forums/newfi/public/install/index.php","/var/www/forums/newfi/public/internal_data/code_cache/templates/l0/s0/admin/index.php","/var/www/forums/newfi/public/internal_data/code_cache/templates/l1/s0/admin/index.php","/var/www/forums/newfi/public/internal_data/code_cache/templates/l2/s0/admin/index.php","/var/www/forums/newfi/public/src/vendor/christian-riesen/otp/example/index.php"],"KNOWN_PATHS":["/var/www/forums/newfi|/var/www/forums/newfi","drwxr-xr-x 3 root root 4096 Sep 4 21:18 /var/www/forums/newfi","/var/www/forums/newfi/public|/var/www/forums/newfi/public","drwxr-xr-x 9 root root 4096 Sep 6 09:28 /var/www/forums/newfi/public"],"NGINX":[" server_name newfi-prod newfi.ru www.newfi.ru [PRIVATE_IP];"," root /var/www/forums/newfi/public;"],"XF":["/var/www/forums/newfi/public/src/XF.php"]},"valid_candidates":[[12,"/var/www/forums/newfi/public"]],"validations":{"/var/www/forums/newfi":{"err":"","ok":false,"out":""},"/var/www/forums/newfi/public":{"err":"","ok":true,"out":"BASE=/var/www/forums/newfi/public\nCMD=/var/www/forums/newfi/public/cmd.php\nXF=/var/www/forums/newfi/public/src/XF.php"}}} -PRODUCTION_XF_BASE_ROOT=/var/www/forums/newfi/public -PRODUCTION_XF_VERSION=XenForo 2.3.12 -PRODUCTION_SERVICES=nginx=active\nmariadb=active\nmysql=active\nphp8.3-fpm.service=active -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_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) -STAGING_LAYOUT_DIAGNOSTICS={"guest_hosts":["newfi-staging"],"scan_err":"","scan_rc":0,"sections":{"ADDON":["/var/www/forums/newfi/public/src/addons/Newfi/Dogs/addon.json","/var/www/forums/newfi/public/src/addons/Newfi/Events/addon.json","/var/www/forums/newfi/public/src/addons/Newfi/Portal/addon.json"],"CMD":["/var/www/forums/newfi/public/cmd.php"],"HOST":["newfi-staging"],"INDEX":["/var/www/forums/newfi/public/index.php","/var/www/forums/newfi/public/install/index.php","/var/www/forums/newfi/public/internal_data/code_cache/templates/l0/s0/admin/index.php","/var/www/forums/newfi/public/internal_data/code_cache/templates/l1/s0/admin/index.php","/var/www/forums/newfi/public/internal_data/code_cache/templates/l2/s0/admin/index.php","/var/www/forums/newfi/public/src/vendor/christian-riesen/otp/example/index.php"],"KNOWN_PATHS":["/var/www/forums/newfi|/var/www/forums/newfi","drwxr-xr-x 3 root root 4096 Sep 4 21:18 /var/www/forums/newfi","/var/www/forums/newfi/public|/var/www/forums/newfi/public","drwxr-xr-x 9 root root 4096 Sep 6 09:28 /var/www/forums/newfi/public"],"NGINX":[" server_name newfi-staging newfi-staging.gram1.ru [PRIVATE_IP];"," root /var/www/forums/newfi/public;"],"XF":["/var/www/forums/newfi/public/src/XF.php"]},"valid_candidates":[[12,"/var/www/forums/newfi/public"]],"validations":{"/var/www/forums/newfi":{"err":"","ok":false,"out":""},"/var/www/forums/newfi/public":{"err":"","ok":true,"out":"BASE=/var/www/forums/newfi/public\nCMD=/var/www/forums/newfi/public/cmd.php\nXF=/var/www/forums/newfi/public/src/XF.php"}}} -STAGING_XF_BASE_ROOT=/var/www/forums/newfi/public -STAGING_XF_VERSION=XenForo 2.3.12 -STAGING_SERVICES=nginx=active\nmariadb=active\nmysql=active\nphp8.3-fpm.service=active -STAGING_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"}] -STAGING_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) -PORTAL_ADDON_ID=Newfi/Portal -PRODUCTION_DB_CLIENT=/usr/bin/mariadb -PRODUCTION_DB_SCHEMA_CANDIDATES=["xf_newfi"] -PRODUCTION_BOARD_ACTIVE=1 -PRODUCTION_ERROR_MAX=0 -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_PORTAL_TEMPLATE_HASH_ROWS=["0\tnewfi_portal\t1f484c8cf6bdeda8fda2974abf8a57f8cc7453fe2a779af7c735afa3b73aa741"] -PRODUCTION_PORTAL_SOURCE_TREE_SHA256=a066546dcbef1321be989ccdcabdb195318e36cd3f33d2f90a2a88acb7ac44ae -STAGING_DB_CLIENT=/usr/bin/mariadb -STAGING_DB_SCHEMA_CANDIDATES=["xf_newfi"] -STAGING_BOARD_ACTIVE=0 -STAGING_ERROR_MAX=40 -STAGING_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 -STAGING_PORTAL_TEMPLATE_HASH_ROWS=["0\tnewfi_portal\t1f484c8cf6bdeda8fda2974abf8a57f8cc7453fe2a779af7c735afa3b73aa741"] -STAGING_PORTAL_SOURCE_TREE_SHA256=a066546dcbef1321be989ccdcabdb195318e36cd3f33d2f90a2a88acb7ac44ae -GIT_PORTAL_SOURCE_PATH_CANDIDATES=["src/addons/Newfi/Portal"] -GIT_PORTAL_SOURCE_PATH=src/addons/Newfi/Portal -GIT_PORTAL_SOURCE_TREE_SHA256=a066546dcbef1321be989ccdcabdb195318e36cd3f33d2f90a2a88acb7ac44ae -GIT_PORTAL_SOURCE_FILE_COUNT=7 -GIT_PRODUCTION_PORTAL_SOURCE_MATCH=true -GIT_STAGING_PORTAL_SOURCE_MATCH=true -PORTAL_SOURCE_PROD_STAGING_MATCH=true -PORTAL_TEMPLATE_PROD_STAGING_MATCH=true -STAGING_ADDON_REBUILD_HELP=Description:\n Rebuilds the specified add-on data.\n\nUsage:\n xf:addon-rebuild [options] [--] \n xf-addon:rebuild\n\nArguments:\n id Add-On ID\n\nOptions:\n -f, --force Skip verifying that the add-on is rebuildable\n -h, --help Display help for the given command. When no command is given display help for the list command\n -q, --quiet Do not output any message\n -V, --version Display this application version\n --ansi|--no-ansi Force (or disable --no-ansi) ANSI output\n -n, --no-interaction Do not ask any interactive question\n -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug -STAGING_REBUILD_COMMAND_SOURCE_CANDIDATES=["/var/www/forums/newfi/public/src/XF/Cli/Command/AddOnRebuild.php"] -STAGING_REBUILD_COMMAND_SOURCE_SHA256=6ed0bc6d2b1509a2f4c9ec2d1d612c72f3ede01aca30ac60317eae68e12697ab -STAGING_REBUILD_COMMAND_RELEVANT_EXCERPT=["use Symfony\\Component\\Console\\Output\\OutputInterface;","use Symfony\\Component\\Console\\Question\\ConfirmationQuestion;","","class AddOnRebuild extends AbstractCommand","{","\tuse AddOnActionTrait;","\tuse JobRunnerTrait;","\tprotected function configure()","\t{","\t\t$this","\t\t\t->setName('xf:addon-rebuild')","\t\t\t->setAliases(['xf-addon:rebuild'])","\t\t\t->setDescription('Rebuilds the specified add-on data.')","\t\t\t->addArgument(","\t\t\t\t'id',","\t\t\t\tInputArgument::REQUIRED,","\t\t\t\t'Add-On ID'","\t\t\t)","\t\t\t->addOption(","\t\t\t\t'force',","\t\t\t\t'f',","\t\t\t\tInputOption::VALUE_NONE,","\t\t\t\t'Skip verifying that the add-on is rebuildable'","\t\t\t);","\t}","\t\t\treturn 1;","\t\t}","\t\tif (!$addOn->canRebuild() && !$input->getOption('force'))","\t\t{","\t\t\t$output->writeln(\"\" . \\XF::phrase('this_add_on_cannot_be_rebuilt') . \"\");","\t\tif (!$this->verifyAddOnAction($input, $output, $addOn))","\t\t/** @var QuestionHelper $helper */","\t\t$helper = $this->getHelper('question');","\t\t$question = new ConfirmationQuestion(\"\" . \\XF::phrase('please_confirm_that_you_want_to_rebuild_following_add_on') . ': (' . $addOn->title . ' ' . $addOn->version_string . \") (y/n)\");","\t\t$response = $helper->ask($input, $output, $question);","\t\tif (!$response)","\t\t$addOn->preRebuild();","\t\t$this->runSubAction($output, $addOn, 'import');","\t\t$this->runSubAction($output, $addOn, 'post-rebuild');","\t\treturn 0;"] -PRODUCTION_ROLLBACK_PREREQUISITES=tar=/usr/bin/tar\ndump=/usr/bin/mariadb-dump\n/dev/sda1 51392640 2041544 47212760 5% /\n/dev/sda1 51392640 2041544 47212760 5% / -STAGING_ROLLBACK_PREREQUISITES=tar=/usr/bin/tar\ndump=/usr/bin/mariadb-dump\n/dev/sda1 51392640 2005380 47248924 5% /\n/dev/sda1 51392640 2005380 47248924 5% / -PRODUCTION_PUBLIC_HTTP={"http":"200","rc":0} -STAGING_NGINX_SERVER_NAMES=["newfi-staging","newfi-staging.gram1.ru"] -STAGING_LOCAL_HTTP={"host":"newfi-staging","http":"503","rc":0} +CURRENT_PORTAL_GIT_FILES=["src/addons/Newfi/Portal/Pub/Controller/Portal.php","src/addons/Newfi/Portal/Pub/View/Portal.php","src/addons/Newfi/Portal/_data/navigation.xml","src/addons/Newfi/Portal/_data/phrases.xml","src/addons/Newfi/Portal/_data/routes.xml","src/addons/Newfi/Portal/_data/templates.xml","src/addons/Newfi/Portal/addon.json"] +CURRENT_PORTAL_GIT_MANIFEST={"src/addons/Newfi/Portal/Pub/Controller/Portal.php":{"bytes":247,"sha256":"53909e753ea5a011550fd280ad1c342a74ca9949be092dfbd95244243cae92f3"},"src/addons/Newfi/Portal/Pub/View/Portal.php":{"bytes":79,"sha256":"26e3b77c2c86d4f4a6fd51f0472e3f38e70e14c984ffd8d04dcec39071a2a69f"},"src/addons/Newfi/Portal/_data/navigation.xml":{"bytes":281,"sha256":"5d724ef5141438bdd0b9dba6a583d330bc6940b0ace5c21c7a8d5301e7d8d649"},"src/addons/Newfi/Portal/_data/phrases.xml":{"bytes":173,"sha256":"15282a06a956bda4e810f6b26b1703676dd766424029cd372ce0fd7832dbe09c"},"src/addons/Newfi/Portal/_data/routes.xml":{"bytes":144,"sha256":"9b80ef229bcebb49a5930369bb272ed85367deef66070f432948001096673629"},"src/addons/Newfi/Portal/_data/templates.xml":{"bytes":1461,"sha256":"c29c04f8b937284e821c87957653e87c2f6ac014fac30648a0f6b18e84392adf"},"src/addons/Newfi/Portal/addon.json":{"bytes":378,"json":{"description":"Minimal private-staging portal for the Newfi closed MVP.","dev":"Newfi","dev_url":"","extra_urls":[],"faq_url":"","icon":"","legacy_addon_id":"","require":{"XF":[2031270,"XenForo 2.3.12+"]},"support_url":"","title":"Newfi Portal","version_id":1000010,"version_string":"1.0.0 Alpha 1"},"sha256":"288a61044c941107162d045be49ab2e7c844d1586b25378a7289b3c7275010ab"}} +APPLY3_ATTEMPT_DIR=/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3 +APPLY3_ATTEMPT_EXISTS=true +APPLY3_ATTEMPT_FILES=[{"bytes":73,"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/attempt.txt","sha256":"fc3d53a77acceff697ec5111ab3ba411ede195fd9a8e358de5ae94dbc94f4d14"},{"bytes":90,"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/receipt.txt","sha256":"a993d3503cd786e73baa68900ae5bc46eac405da3430cfab0bb5db981e0f1b4b"},{"bytes":669,"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/wrapper.log","sha256":"dec036ea985e75d776b2de8c2bede77fe4b4aafa5da33648b2a6b5f79f3dec30"}] +RELATED_ARTIFACT_FILES=[] +CANDIDATE_PORTAL_ROOTS=[] +CANDIDATE_PORTAL_MANIFESTS=[] +CANDIDATE_ARTIFACT_EVIDENCE=[{"decoded_payloads":[],"hits":["1:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3","2:STATE=RESERVED_BEFORE_EXECUTION"],"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/attempt.txt","sha256":"fc3d53a77acceff697ec5111ab3ba411ede195fd9a8e358de5ae94dbc94f4d14"},{"decoded_payloads":[],"hits":["1:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3","2:WRAPPER_RC=76","3:PUBLICATION=GITEA_RUNTIME_EXPECTED"],"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/receipt.txt","sha256":"a993d3503cd786e73baa68900ae5bc46eac405da3430cfab0bb5db981e0f1b4b"},{"decoded_payloads":[],"hits":["3:remote: Processed 1 references in total ","4:RESULT=OK","5:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3","6:COMMIT_SHA=bb707af34d2a2b6a6b23c3d4d03f6b701150a653","7:STATIC_PUBLICATION=OK","9:","10:===== HOMELAB CHAT RUN COMPLETE =====","11:COMMAND_ID=NEWFI-260907-PORTAL200-APPLY3","12:STATUS=FAIL","13:RC=76","17:GITEA_PUBLICATION=OK","18:PUBLIC_URL=https://git.gram1.ru/.well-known/homelab-runtime/latest.json","19:LOCAL_RAW_FILE=/var/lib/homelab-chat-run/raw/NEWFI-260907-PORTAL200-APPLY3-20260907T112033Z.log","20:SHELL_SESSION_PRESERVED=yes"],"path":"/root/newfi-run-NEWFI-260907-PORTAL200-APPLY3/wrapper.log","sha256":"dec036ea985e75d776b2de8c2bede77fe4b4aafa5da33648b2a6b5f79f3dec30"}] +PORTAL_GIT_ALL_HISTORY=["ca07bfc20953585887f7cc2f1d443cf8313912c8\t2026-09-06T16:40:06+03:00\tfeat: add Portal navigation and widgets","82dd2066df377ba9d904f68f90898e009413eec9\t2026-09-06T16:15:39+03:00\tfeat: add Newfi Portal staging checkpoint"] +PORTAL_UNREACHABLE_COMMITS=[] HOLD_REASONS=[] -FINAL_DECISION=ELIGIBLE_FOR_PORTAL200_APPLY4_PREP -RECOVERY5_END=true +FINAL_DECISION=ELIGIBLE_FOR_PORTAL200_APPLY4_CHANGE_CARRIER_BUILD +APPLY4_DESIGN1_END=true OUTPUT_END CHAT_OUTPUT_END