CHAT_OUTPUT_BEGIN
COMMAND_ID=NEWFI-260907-A-PORTAL200-APPLY4PREP1
STATUS=OK
RC=0
HOST=pve01
MODE=read-only
COMPONENT=newfi-portal200-apply4-preparation
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
COMMAND_SHA256=549a62ae9b0a3353233208c0615167a9903e3bcc0280d1171e0421c44dcbdd8b
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=fe9f7b7570e491d7d496776d1d946aa03cb264b46cea79cc07fc32d040fba0b5
SANITIZED_OUTPUT_SHA256=fe9f7b7570e491d7d496776d1d946aa03cb264b46cea79cc07fc32d040fba0b5
OUTPUT_BEGIN
APPLY4_PREP_BEGIN=true
COMMAND_ID=NEWFI-260907-A-PORTAL200-APPLY4PREP1
MUTATION_SCOPE=NONE_READ_ONLY
MUTATIONS_PERFORMED=NO
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0
REFERENCE_CHECK=OK
REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66
ERROR_REGISTER_CHECK=OK
REFERENCE_CHECK=OK
AUTHORITY_CHECK_SCOPE=READABILITY_ONLY_INCIDENTS_NOT_CLOSED
RUNNER_SHA256=b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d
RUNNER_SHA_MATCHES_KNOWN_BASELINE=true
RUNNER_CONTRACT_AND_DUPLICATE_EXCERPT=["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\",","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:]))","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' ]","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","197:transport-test","199:Environment:","200:HOMELAB_ALLOW_REPEAT=1   Allow exact repeat of a previously failed command.","201:HOMELAB_TIMEOUT=SECONDS  Optional command timeout.","202:USAGE","203:exit 64","206:[ \"$#\" -ge 5 ] || usage","208:COMMAND_ID=\"$1\"","209:MODE=\"$2\"","210:COMPONENT=\"$3\"","211:shift 3","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","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'"]
RUNNER_CONTRACT_EXCERPT_SHA256=f4b17f4d25a636e3e685f518ca9001c7560f8bac2ba637c28f4d311200e2fb78
NEWFI_260907_PORTAL200_CONTRACTAST1_EXACT_OK=true
NEWFI_260907_PORTAL200_CONTRACTAST1_SHA256=00c4dc5e100be0cb26a80262a8af96555457b5dc4fa924c6a9458089cd01474e
NEWFI_260907_PORTAL200_IMPORTDISC2_EXACT_OK=true
NEWFI_260907_PORTAL200_IMPORTDISC2_SHA256=805954f73608dbd343da33d387c59a6ad258a7f6a51965db4e78c3fd0f588fd4
NEWFI_260907_PORTAL200_REBUILDHELP1_EXACT_OK=true
NEWFI_260907_PORTAL200_REBUILDHELP1_SHA256=30370cad3d4d7e73c6612a5df702abe1fac6ae559bf142b5e489a19a1258cfb7
ASSISTANT_RUNTIME_BRANCH_HEAD=2da92090b830c31690cbba441708f33d8d6c1c5f
LANEB_PORTAL200_HISTORY_CANDIDATE_PATHS=[]
LANEB_ELIGIBLE_IMMUTABLE_CHECKPOINTS=[]
NEWFI_GIT_CANDIDATES=[{"branch":"main","dirty_count":0,"head":"6360c4c919c4c5b3cb2430dd55fe63b6ad595a28","portal_hits":[],"remote_head":"6360c4c919c4c5b3cb2430dd55fe63b6ad595a28","repo":"/root/newfi-portal","score":3},{"branch":"foundation/newfi-foundation-20260904","dirty_count":0,"head":"38688a88c3850e43e310e755faa0c6178e203e26","portal_hits":[],"remote_head":"e4f7b4318e2b0c1aa799edf91f39992c4b3ba378","repo":"/root/newfi-portal/.worktrees/foundation-newfi-foundation-20260904","score":9},{"branch":"implementation/newfi-closed-mvp-20260906","dirty_count":0,"head":"06bab5acd124e768f70305b3d7eca2f595871890","portal_hits":[],"remote_head":"06bab5acd124e768f70305b3d7eca2f595871890","repo":"/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906","score":15}]
GIT_REPO=/root/newfi-portal/.worktrees/implementation-newfi-closed-mvp-20260906
GIT_BRANCH=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_XF_ROOT_CANDIDATES=["/var/www/forums/newfi/public"]
PRODUCTION_XF_ROOT=/var/www/forums/newfi/public
PRODUCTION_XF_VERSION_DECL=XenForo 2.3.12
PRODUCTION_SERVICES=nginx=active\nmariadb=active\nmysql=active\nphp8.3-fpm.service=active
PRODUCTION_ADDON_LIST= -------------- -------------------------- --------------- -------- \n  Add-on ID      Title                      Version         Active  \n -------------- -------------------------- --------------- -------- \n  Newfi/Dogs     Newfi Dogs                 1.0.0 Alpha 1   Yes     \n  Newfi/Events   Newfi Events               1.0.0 Alpha 1   Yes     \n  Newfi/Portal   Newfi Portal               1.0.0 Alpha 1   Yes     \n  XFMG           XenForo Media Gallery      2.3.11          Yes     \n  XFRM           XenForo Resource Manager   2.3.11          Yes     \n -------------- -------------------------- --------------- -------- \n\n Total: 5 add-ons (5 active, 0 inactive)
PRODUCTION_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_NODE_SSH_RC=0
STAGING_NODE_SSH_HOSTNAME=pve03
STAGING_XF_ROOT_CANDIDATES=[]
PRODUCTION_DB_CLIENT=/usr/bin/mariadb
PRODUCTION_XF_DB_SCHEMAS=["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_ROLLBACK_PREREQUISITES=tar=/usr/bin/tar\ndump=/usr/bin/mariadb-dump\n/dev/sda1         51392640 2041460  47212844       5% /\n/dev/sda1         51392640 2041460  47212844       5% /
PRODUCTION_PUBLIC_HTTP={"http":"200","rc":0,"url":"https://newfi.ru/"}
HOLD_REASONS=["EXACT_SINGLE_LANEB_ELIGIBLE_CHECKPOINT_NOT_RESOLVED","STAGING_XF_ROOT_UNPROVEN","PORTAL_ADDON_ID_CROSS_ENV_MISMATCH_OR_UNPROVEN"]
FINAL_DECISION=HOLD_PORTAL200_APPLY4_CARRIER_FINALIZATION_EXACT_SINGLE_LANEB_ELIGIBLE_CHECKPOINT_NOT_RESOLVED__STAGING_XF_ROOT_UNPROVEN__PORTAL_ADDON_ID_CROSS_ENV_MISMATCH_OR_UNPROVEN
APPLY4_PREP_END=true

OUTPUT_END
CHAT_OUTPUT_END
