1
0
Files
homelab-public-context/runtime/latest.txt
T
2026-07-27 16:42:37 +00:00

34 lines
47 KiB
Plaintext

CHAT_OUTPUT_BEGIN
COMMAND_ID=HOMELAB-MUTATION-CLOSURE-FORENSIC-FIX2-20260727T164022Z
STATUS=OK
RC=0
HOST=pve01
MODE=verify
COMPONENT=mutation-closure-forensic
REFERENCE_REGISTER_CHECK=OK
REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e
ERROR_REGISTER_CHECK=OK
ERROR_REGISTER_SHA256=24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83
COMMAND_SHA256=886574cbeb287526a708cd96da96c9eec91136dd4a11492efad91343bd68f1ea
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=44df2f482dc40d2f26af8b8192b29186e46a9e099537792292b2928ea234fd4a
SANITIZED_OUTPUT_SHA256=44df2f482dc40d2f26af8b8192b29186e46a9e099537792292b2928ea234fd4a
OUTPUT_BEGIN
{"anti_regression":{"FORENSIC-AR-001-ALL-TARGET-STATES-LOCATED":true,"FORENSIC-AR-002-PAYLOAD-SCHEMA-AND-SHA-VERIFIED":true,"FORENSIC-AR-003-WORKER-LOGS-HASHED":true,"FORENSIC-AR-004-PUBLIC-AND-RAW-SEPARATED":true,"FORENSIC-AR-005-ROLLBACK-ROOT-READ-ONLY-SCANNED":true,"FORENSIC-AR-006-LINKED-IDENTITY-EXACT":true,"FORENSIC-AR-007-ACTIVE-REFS-EXCLUDE-BACKUPS-TEMP":true,"FORENSIC-AR-008-NO-MUTATION":true},"backup_changed":false,"changes_made":false,"cluster_changed":false,"command_id":"HOMELAB-MUTATION-CLOSURE-FORENSIC-FIX2-20260727T164022Z","diagnostic":"MUTATION_CLOSURE_AND_SECOND_RUNNER_FORENSIC","diagnostic_completed":true,"gitea_changed":false,"missing_targets":[],"production_changed":false,"read_only":true,"rollback_forensics":{"files_seen":23,"matched_directories":[{"directory":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":2373848,"is_symlink":false,"mode":"0700","path":"/var/lib/homelab-change-rollback/ADAPTER-LIFECYCLE-APPLY-20260727","regular":false,"resolved":"/var/lib/homelab-change-rollback/ADAPTER-LIFECYCLE-APPLY-20260727","size":4096,"uid":0},"files":[{"device":64513,"executable":false,"exists":true,"gid":0,"inode":2373904,"is_symlink":false,"json_facts":{"plan_sha256":"940d56f6f65c6ac0afd7f57cf034a7627b5d00cd05518a94d4dfbc6dc3e91585"},"mode":"0600","path":"/var/lib/homelab-change-rollback/ADAPTER-LIFECYCLE-APPLY-20260727/metadata.json","regular":true,"resolved":"/var/lib/homelab-change-rollback/ADAPTER-LIFECYCLE-APPLY-20260727/metadata.json","sha256":"ec3fd386647591cb22fccf7176168901d9dbeb18fb5453bb9b82995d0dff79e3","size":1029,"uid":0}]},{"directory":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":2373243,"is_symlink":false,"mode":"0700","path":"/var/lib/homelab-change-rollback/ADAPTER-RECOVERY-APPLY-FIX1-20260727","regular":false,"resolved":"/var/lib/homelab-change-rollback/ADAPTER-RECOVERY-APPLY-FIX1-20260727","size":4096,"uid":0},"files":[{"device":64513,"executable":false,"exists":true,"gid":0,"inode":2373831,"is_symlink":false,"json_facts":{"plan_sha256":"4018541089c67dc0611d8fe3bdaa4689517c140e1a5fbf7ad58efeecab450026"},"mode":"0600","path":"/var/lib/homelab-change-rollback/ADAPTER-RECOVERY-APPLY-FIX1-20260727/metadata.json","regular":true,"resolved":"/var/lib/homelab-change-rollback/ADAPTER-RECOVERY-APPLY-FIX1-20260727/metadata.json","sha256":"0f196712e2883121effe69b4e4be0ccbb38e0fe9be357c7ab5ddb44ca70cb667","size":1056,"uid":0}]},{"directory":{"device":64513,"executable":true,"exists":true,"gid":990,"inode":2374057,"is_symlink":false,"mode":"0700","path":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090847Z","regular":false,"resolved":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090847Z","size":4096,"uid":0},"files":[{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2374060,"is_symlink":false,"json_facts":{"PLAN_SHA256":"ce45802551553ab4f5f0cef37d29efcdcb1aae0f19d81ab3ab9430fa5ea9704c"},"mode":"0600","path":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090847Z/plan.json","regular":true,"resolved":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090847Z/plan.json","sha256":"13b1bd4f98939b222e09e3d3d780e000c1f06d22cd2e41d17e12e62a89e44db6","size":1013,"uid":0},{"device":64513,"executable":true,"exists":true,"gid":990,"inode":2374058,"is_symlink":false,"mode":"0750","path":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090847Z/homelab-command-adapter","regular":true,"resolved":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090847Z/homelab-command-adapter","sha256":"8d0af84dcfcf6ddbfd1c4e6cbb059cef66b4cfc6c75bfd66da649acc229c7f5e","size":79938,"uid":0},{"device":64513,"executable":true,"exists":true,"gid":990,"inode":2374059,"is_symlink":false,"mode":"0750","path":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090847Z/homelab-command-portal","regular":true,"resolved":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090847Z/homelab-command-portal","sha256":"8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2","size":39362,"uid":0}]},{"directory":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":2374039,"is_symlink":false,"mode":"0700","path":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T093554Z","regular":false,"resolved":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T093554Z","size":4096,"uid":0},"files":[{"device":64513,"executable":false,"exists":true,"gid":0,"inode":2374065,"is_symlink":false,"json_facts":{"PLAN_SHA256":"ce45802551553ab4f5f0cef37d29efcdcb1aae0f19d81ab3ab9430fa5ea9704c"},"mode":"0600","path":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T093554Z/plan.json","regular":true,"resolved":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T093554Z/plan.json","sha256":"13b1bd4f98939b222e09e3d3d780e000c1f06d22cd2e41d17e12e62a89e44db6","size":1013,"uid":0},{"device":64513,"executable":true,"exists":true,"gid":0,"inode":2374055,"is_symlink":false,"mode":"0755","path":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T093554Z/homelab-command-adapter","regular":true,"resolved":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T093554Z/homelab-command-adapter","sha256":"8d0af84dcfcf6ddbfd1c4e6cbb059cef66b4cfc6c75bfd66da649acc229c7f5e","size":79938,"uid":0},{"device":64513,"executable":false,"exists":true,"gid":0,"inode":2373060,"is_symlink":false,"json_facts":{"PLAN_SHA256":"ce45802551553ab4f5f0cef37d29efcdcb1aae0f19d81ab3ab9430fa5ea9704c","changes_made":true,"rollback_started":false,"status":"OK"},"mode":"0600","path":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T093554Z/apply-report.json","regular":true,"resolved":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T093554Z/apply-report.json","sha256":"297b1771bd231defa9d1fa4360c5f563f26cd2bcb84ddd55c26bfa9c37ae3091","size":911,"uid":0},{"device":64513,"executable":true,"exists":true,"gid":0,"inode":2374062,"is_symlink":false,"mode":"0755","path":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T093554Z/homelab-command-portal","regular":true,"resolved":"/var/lib/homelab-change-rollback/MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T093554Z/homelab-command-portal","sha256":"8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2","size":39362,"uid":0}]},{"directory":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":2374031,"is_symlink":false,"mode":"0700","path":"/var/lib/homelab-change-rollback/PORTAL-RESULT-FEED-ALIAS-20260727T101120Z","regular":false,"resolved":"/var/lib/homelab-change-rollback/PORTAL-RESULT-FEED-ALIAS-20260727T101120Z","size":4096,"uid":0},"files":[{"device":64513,"executable":false,"exists":true,"gid":0,"inode":2374079,"is_symlink":false,"json_facts":{"plan_sha256":"5672ff00eaf567eba7463c9b10b612ab2ba459752c3acaf499892a070941fb45","source_sha256":"493eed48b5ed23b77ea3f554e8264438c0aea91744efb98363a325b4548b179b","target_sha256":"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52"},"mode":"0600","path":"/var/lib/homelab-change-rollback/PORTAL-RESULT-FEED-ALIAS-20260727T101120Z/plan.json","regular":true,"resolved":"/var/lib/homelab-change-rollback/PORTAL-RESULT-FEED-ALIAS-20260727T101120Z/plan.json","sha256":"c01c0525bd8fa1ed169d1acae555f50fe6c591bcc13335160c0820f8515d631e","size":905,"uid":0}]},{"directory":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":2373887,"is_symlink":false,"mode":"0700","path":"/var/lib/homelab-change-rollback/RUNNER-ADAPTER-PAIR-APPLY-20260727","regular":false,"resolved":"/var/lib/homelab-change-rollback/RUNNER-ADAPTER-PAIR-APPLY-20260727","size":4096,"uid":0},"files":[{"device":64513,"executable":false,"exists":true,"gid":0,"inode":2373891,"is_symlink":false,"json_facts":{"plan_sha256":"a4662969765895626989038cd231e47f7fe3f80b9fbd1b85e0fcb64881821d3f"},"mode":"0600","path":"/var/lib/homelab-change-rollback/RUNNER-ADAPTER-PAIR-APPLY-20260727/metadata.json","regular":true,"resolved":"/var/lib/homelab-change-rollback/RUNNER-ADAPTER-PAIR-APPLY-20260727/metadata.json","sha256":"1383dc03bd940525464cb2dd9429b0b0e94bccc4e9b00c80dfb06e1b60ca186b","size":1595,"uid":0}]},{"directory":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":2373863,"is_symlink":false,"mode":"0700","path":"/var/lib/homelab-change-rollback/RUNNER-MUTATION-CONTRACT-APPLY-20260726T205715Z","regular":false,"resolved":"/var/lib/homelab-change-rollback/RUNNER-MUTATION-CONTRACT-APPLY-20260726T205715Z","size":4096,"uid":0},"files":[{"device":64513,"executable":false,"exists":true,"gid":0,"inode":2373865,"is_symlink":false,"json_facts":{"plan_sha256":"22eedf9b1090960a7f92cef992f481d8d6cc3f42e4f4ecd6e27bbda4ebf752bd","source_sha256":"2a88defef9517f89bc60934dce82097f8e316b08af9417e95167ea5d759a10d9","target_sha256":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d"},"mode":"0600","path":"/var/lib/homelab-change-rollback/RUNNER-MUTATION-CONTRACT-APPLY-20260726T205715Z/metadata.json","regular":true,"resolved":"/var/lib/homelab-change-rollback/RUNNER-MUTATION-CONTRACT-APPLY-20260726T205715Z/metadata.json","sha256":"d93828f83ef5789d779e779303fbdcff147ffb020844f610d471ce0b21e726c6","size":819,"uid":0},{"device":64513,"executable":false,"exists":true,"gid":0,"inode":2373864,"is_symlink":false,"mode":"0600","path":"/var/lib/homelab-change-rollback/RUNNER-MUTATION-CONTRACT-APPLY-20260726T205715Z/homelab-chat-run.rollback","regular":true,"resolved":"/var/lib/homelab-change-rollback/RUNNER-MUTATION-CONTRACT-APPLY-20260726T205715Z/homelab-chat-run.rollback","sha256":"2a88defef9517f89bc60934dce82097f8e316b08af9417e95167ea5d759a10d9","size":11864,"uid":0}]}],"root_exists":true,"scan_limits":{"max_files":5000,"max_text_file_bytes":2097152,"max_top_directories":1000}},"rollback_started":false,"schema":1,"second_runner":{"active_config_references":[],"active_process_references":[],"canonical":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":5148538,"is_symlink":false,"mode":"0750","path":"/usr/local/sbin/homelab-chat-run","regular":true,"resolved":"/usr/local/sbin/homelab-chat-run","sha256":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d","size":21321,"uid":0},"distinct_executable":true,"linked":{"content_available":true,"content_sanitized":"#!/usr/bin/env bash\nset -o pipefail\ntmp=$(/usr/bin/mktemp)\ntrap '/usr/bin/rm -f \"$tmp\"' EXIT\n\n/usr/local/sbin/homelab-chat-run \"$@\" 2>&1 | /usr/bin/tee \"$tmp\"\nrc=${PIPESTATUS[0]}\n\ncid=$(/usr/bin/sed -n \"s/^COMMAND_ID=//p\" \"$tmp\" | /usr/bin/tail -n 1)\nsha=$(/usr/bin/sed -n \"s/^COMMIT_SHA=//p\" \"$tmp\" | /usr/bin/tail -n 1)\nraw=$(/usr/bin/sed -n \"s/^LOCAL_RAW_FILE=//p\" \"$tmp\" | /usr/bin/tail -n 1)\n\nif [[ \"$cid\" =~ ^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$ && \"$sha\" =~ ^[0-9a-f]{40}$ ]]; then\n /usr/bin/printf \"COMMIT_URL=https://git.gram1.ru/homelab-admin/homelab-public-context/commit/%s\\n\" \"$sha\"\n /usr/bin/printf \"IMMUTABLE_RESULT_URL=https://git.gram1.[LONG_TOKEN_REDACTED]%s/runtime/history/%s.txt\\n\" \"$sha\" \"$cid\"\nfi\n\n# HOMELAB_READER_RESULT_FEED_V1\nfeed_rc=0\nif [[ \"$cid\" =~ ^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$ && \"$sha\" =~ ^[0-9a-f]{40}$ && -n \"$raw\" && -r \"$raw\" ]]; then\n if feed_out=$(/usr/local/sbin/homelab-reader-result-publish \"$cid\" \"$sha\" \"$tmp\" \"$raw\" \"$rc\" 2>&1); then\n /usr/bin/printf \"%s\\n\" \"$feed_out\"\n else\n feed_rc=$?\n /usr/bin/printf \"RESULT_FEED_PUBLICATION=FAIL\\n\"\n /usr/bin/printf \"RESULT_FEED_PUBLISHER_RC=%s\\n\" \"$feed_rc\"\n /usr/bin/printf \"%s\\n\" \"$feed_out\" | /usr/bin/tail -n 20\n fi\nelse\n /usr/bin/printf \"RESULT_FEED_PUBLICATION=SKIPPED_INVALID_INPUT\\n\"\nfi\n\n/usr/bin/printf \"FAILURE_DIAGNOSTIC_BEGIN\\n\"\nif [[ -n \"$raw\" && -r \"$raw\" ]]; then\n /usr/bin/grep -Ei '^(DECISION|DETAIL|FAILURE_REASON|ERROR_CODE|SOURCE_DECISION|NGINX_[A-Z0-9_]*|READER_[A-Z0-9_]*|RESULT_FEED_URL|PUBLIC_HEALTH_URL|HTTPS_[A-Z0-9_]*|LOCAL_[A-Z0-9_]*|CHANGES_MADE)=|Traceback|RuntimeError|SystemExit|FileNotFoundError|PermissionError|command not found|No such file or directory|Connection refused|failed|invalid|missing' \"$raw\" | /usr/bin/tail -n 100 || true\nfi\n/usr/bin/printf \"FAILURE_DIAGNOSTIC_END\\n\"\n\nexit \"$rc\"\n","device":64513,"executable":true,"exists":true,"gid":0,"inode":5148536,"is_symlink":false,"line_count":39,"mentions_canonical":true,"mentions_linked":false,"mode":"0755","path":"/usr/local/sbin/homelab-chat-run-linked","regular":true,"resolved":"/usr/local/sbin/homelab-chat-run-linked","sha256":"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","size":1901,"uid":0},"safe_to_plan_removal_candidate":true},"source_locks":{"/etc/systemd/system/homelab-command-adapter.service":{"device":64513,"executable":false,"exists":true,"gid":0,"inode":4982677,"is_symlink":false,"mode":"0644","path":"/etc/systemd/system/homelab-command-adapter.service","regular":true,"resolved":"/etc/systemd/system/homelab-command-adapter.service","sha256":"74d0f37878652ed9d46b53ae8556bbb30ebd683741f293c3f59b3527876ed2d7","size":665,"uid":0},"/etc/systemd/system/homelab-command-portal.service":{"device":64513,"executable":false,"exists":true,"gid":0,"inode":4982830,"is_symlink":false,"mode":"0644","path":"/etc/systemd/system/homelab-command-portal.service","regular":true,"resolved":"/etc/systemd/system/homelab-command-portal.service","sha256":"8453eab30f5c3ccd285fc9f70fff18f564809bb27f7bf84f51f2ba593aa85263","size":981,"uid":0},"/etc/systemd/system/homelab-result-lookup.service":{"device":64513,"executable":false,"exists":true,"gid":0,"inode":4997316,"is_symlink":false,"mode":"0644","path":"/etc/systemd/system/homelab-result-lookup.service","regular":true,"resolved":"/etc/systemd/system/homelab-result-lookup.service","sha256":"4bcc607fd457313f75373ec3d8ec20e7020f13c7cb8a9523fd988a24b0f6609d","size":785,"uid":0},"/usr/local/sbin/homelab-chat-run":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":5148538,"is_symlink":false,"mode":"0750","path":"/usr/local/sbin/homelab-chat-run","regular":true,"resolved":"/usr/local/sbin/homelab-chat-run","sha256":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d","size":21321,"uid":0},"/usr/local/sbin/homelab-chat-run-linked":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":5148536,"is_symlink":false,"mode":"0755","path":"/usr/local/sbin/homelab-chat-run-linked","regular":true,"resolved":"/usr/local/sbin/homelab-chat-run-linked","sha256":"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","size":1901,"uid":0},"/usr/local/sbin/homelab-command-adapter":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":5148537,"is_symlink":false,"mode":"0755","path":"/usr/local/sbin/homelab-command-adapter","regular":true,"resolved":"/usr/local/sbin/homelab-command-adapter","sha256":"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d","size":86019,"uid":0},"/usr/local/sbin/homelab-command-portal":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":5148541,"is_symlink":false,"mode":"0755","path":"/usr/local/sbin/homelab-command-portal","regular":true,"resolved":"/usr/local/sbin/homelab-command-portal","sha256":"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52","size":39936,"uid":0},"/usr/local/sbin/homelab-result-lookup":{"device":64513,"executable":true,"exists":true,"gid":0,"inode":5148539,"is_symlink":false,"mode":"0755","path":"/usr/local/sbin/homelab-result-lookup","regular":true,"resolved":"/usr/local/sbin/homelab-result-lookup","sha256":"17f8d2a2ea219cdc02b0f8e821f8054b05c01de1253419b3d23349a2d383889c","size":12083,"uid":0}},"status":"OK","target":"pve01","target_states":{"MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090755Z":{"capsule_file":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2374051,"is_symlink":false,"mode":"0600","path":"/var/lib/homelab-command-adapter/capsules/0d7f18443ac0132c693f1b16a72dd7ce5385cd21bf00932a562ee62768133a5d/capsule.hcmd","regular":true,"resolved":"/var/lib/homelab-command-adapter/capsules/0d7f18443ac0132c693f1b16a72dd7ce5385cd21bf00932a562ee62768133a5d/capsule.hcmd","sha256":"0d7f18443ac0132c693f1b16a72dd7ce5385cd21bf00932a562ee62768133a5d","size":41135,"uid":0},"manifest_facts":{"change_flags":{"backup":false,"cluster":false,"gitea":false,"production":true},"component":"result-integration","mode":"change","payload":[{"bytes":29442,"mode":"0700","path":"apply_minimal_result_feed.py","sha256":"8c80470ef84b03766b23a96bfb4e31dce7c54dd772899add65a71a748efd62d7"}],"risk":"REVERSIBLE","rollback":{"available":true,"description":"Свежие точные копии Adapter и Portal создаются до остановки сервисов. При провале постусловий сначала собирается диагностика, затем оба файла атомарно восстанавливаются и сервисы проверяются."}},"payload_analysis":{"items":[{"actual_sha256":"8c80470ef84b03766b23a96bfb4e31dce7c54dd772899add65a71a748efd62d7","all_sha256_literals":["8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2","8d0af84dcfcf6ddbfd1c4e6cbb059cef66b4cfc6c75bfd66da649acc229c7f5e","97a6dc8d4353d4f414a2c6eab15ceb2f6f8344c1f15265673cbbc62fe735155b","b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d"],"ast_valid":true,"bytes":29442,"contains_plan_sha256_symbol":true,"contains_result_contract":true,"declared_sha256":"8c80470ef84b03766b23a96bfb4e31dce7c54dd772899add65a71a748efd62d7","decode_ok":true,"index":0,"line_count":816,"marker_lines":["133: changes_made = state.get(\"changes_made\")","134: if not isinstance(changes_made, bool):","135: changes_made = None","137: rollback_started = state.get(","138: \"rollback_started\"","140: if not isinstance(rollback_started, bool):","141: rollback_started = None","174: \"changes_made\": changes_made,","175: \"rollback_started\": rollback_started,","393: '/usr/bin/systemctl', 'show', unit, '--no-pager',","503: 'changes_made': False, 'rollback_started': False,","511: 'changes_made': False, 'rollback_started': False,","602:def save_diagnostics(rollback_dir: pathlib.Path, reason: str) -> None:","603: diagnostic = rollback_dir / 'diagnostics-before-rollback.txt'","606: show = run(['/usr/bin/systemctl', 'show', unit, '--no-pager'], timeout=20)","616:def restore(rollback_dir: pathlib.Path) -> None:","617: run(['/usr/bin/systemctl', 'stop', 'homelab-command-portal.service'], timeout=30)","618: run(['/usr/bin/systemctl', 'stop', 'homelab-command-adapter.service'], timeout=30)","619: for live, backup in ((ADAPTER, rollback_dir / ADAPTER.name), (PORTAL, rollback_dir / PORTAL.name)):","620: temp = live.parent / f'.{live.name}.rollback.{os.getpid()}'","621: shutil.copy2(backup, temp)","624: os.replace(temp, live)","625: run(['/usr/bin/systemctl', 'start', 'homelab-command-adapter.service'], timeout=30, check=True)","627: run(['/usr/bin/systemctl', 'start', 'homelab-command-portal.service'], timeout=30, check=True)","633: changes_made: bool,","634: rollback_started: bool,","635: rollback_restored: bool | None,","638: \"HOMELAB_RESULT_CONTRACT=\"","644: \"changes_made\": changes_made,","645: \"rollback_started\": rollback_started,","646: \"rollback_restored\": rollback_restored,","706: 'rollback': True,","709: print(f'PLAN_SHA256={plan_sha}')","712: rollback_root = pathlib.Path('/var/lib/homelab-change-rollback')","713: rollback_root.mkdir(parents=True, exist_ok=True)","715: rollback_dir = rollback_root / f'MINIMAL-RESULT-FEED-EMERGENCY-APPLY-{stamp}'","716: rollback_dir.mkdir(mode=0o700)","717: shutil.copy2(ADAPTER, rollback_dir / ADAPTER.name)","718: shutil.copy2(PORTAL, rollback_dir / PORTAL.name)","719: (rollback_dir / 'plan.json').write_text(json.dumps({'PLAN_SHA256': plan_sha, 'plan': plan}, ensure_ascii=False, sort_keys=True, indent=2), encoding='utf-8')","720: os.chmod(rollback_dir / 'plan.json', 0o600)","736: run(['/usr/bin/systemctl', 'stop', 'homelab-command-portal.service'], timeout=30, check=True)","737: run(['/usr/bin/systemctl', 'stop', 'homelab-command-adapter.service'], timeout=30, check=True)","738: os.replace(adapter_temp, ADAPTER)","739: os.replace(portal_temp, PORTAL)","747: run(['/usr/bin/systemctl', 'start', 'homelab-command-adapter.service'], timeout=30, check=True)","749: run(['/usr/bin/systemctl', 'start', 'homelab-command-portal.service'], timeout=30, check=True)","767: 'PLAN_SHA256': plan_sha,","772: 'rollback_dir': str(rollback_dir),","773: 'changes_made': True,","774: 'rollback_started': False,","777: (rollback_dir / 'apply-report.json').write_text(json.dumps(report, ensure_ascii=False, sort_keys=True, indent=2), encoding='utf-8')","778: os.chmod(rollback_dir / 'apply-report.json', 0o600)","786: print(f'ROLLBACK_DIR={rollback_dir}')","790: save_diagnostics(rollback_dir, f'{type(exc).__name__}: {exc}')","791: restore(rollback_dir)","797: print(f'ROLLBACK_DIR={rollback_dir}')","803: temp.unlink()"],"mode":"0700","mutation_calls":{"WORK_DIR.mkdir":1,"adapter_path.write_text":1,"adapter_temp.write_text":1,"diagnostic.write_text":1,"os.chmod":5,"os.chown":2,"os.replace":3,"portal_path.write_text":1,"portal_temp.write_text":1,"replace":1,"rollback_dir.mkdir":1,"rollback_root.mkdir":1,"shutil.copy2":3,"source.replace":2,"temp.unlink":1,"test_state_dir.mkdir":1,"write_text":3},"path":"apply_minimal_result_feed.py","schema_exact":true,"sha_match":true,"systemctl_actions":["start","stop"]}],"payload_valid":true},"public_results":[],"raw_results":[],"state_facts":{"capsule_sha256":"0d7f18443ac0132c693f1b16a72dd7ce5385cd21bf00932a562ee62768133a5d","changes_made":null,"error_message_sha256":"01626831c30f18bef5e5621858387d988cf0edb83c6ba723ebc0e7081b38a91a","error_stage":null,"error_type":"InterruptedExecution","evidence_sha256":null,"finished_at_utc":"2026-07-27T09:11:52.964315+00:00","gateway_verified":null,"imported_at_utc":"2026-07-27T09:08:40.761423+00:00","mutation_outcome":null,"rollback_restored":null,"rollback_started":null,"runner_document_rc":null,"runner_rc":null,"runner_status":null,"runner_wrapper_matches_document":null,"short_id":"BV7RQRB2YA","started_at_utc":"2026-07-27T09:08:46.908375+00:00","status":"FAIL","worker_pid":1544362},"state_file":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2374061,"is_symlink":false,"mode":"0640","path":"/var/lib/homelab-command-adapter/state/BV7RQRB2YA.json","regular":true,"resolved":"/var/lib/homelab-command-adapter/state/BV7RQRB2YA.json","sha256":"a84b2520927f498a9289ec19fcef83ce01e74ac6d9d29ce2e66de234d311e819","size":3844,"uid":0},"worker_log":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2374027,"is_symlink":false,"mode":"0640","path":"/var/lib/homelab-command-adapter/runs/BV7RQRB2YA.worker.log","regular":true,"resolved":"/var/lib/homelab-command-adapter/runs/BV7RQRB2YA.worker.log","selected_lines":[],"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","size":0,"uid":0},"worker_process":{"pid":1544362,"proc_exists":false}},"RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z":{"capsule_file":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2373807,"is_symlink":false,"mode":"0600","path":"/var/lib/homelab-command-adapter/capsules/ba4a8e897dff0a4e5b9e77d2d769551041a45ebcdbb285bd753febfa721f8d0d/capsule.hcmd","regular":true,"resolved":"/var/lib/homelab-command-adapter/capsules/ba4a8e897dff0a4e5b9e77d2d769551041a45ebcdbb285bd753febfa721f8d0d/capsule.hcmd","sha256":"ba4a8e897dff0a4e5b9e77d2d769551041a45ebcdbb285bd753febfa721f8d0d","size":27283,"uid":0},"manifest_facts":{"change_flags":{"backup":false,"cluster":false,"gitea":false,"production":true},"component":"runner","mode":"change","payload":[{"bytes":19557,"mode":"0700","path":"apply.py","sha256":"98fad507d6539cf41dd7a491cf599d1af7bf1be353066315e833291fa98f9ef7"}],"risk":"REVERSIBLE","rollback":{"available":true,"description":"Exact SHA-verified mode-0600 rollback copy before removal; diagnostics before atomic restore on failed postcondition."}},"payload_analysis":{"items":[{"actual_sha256":"98fad507d6539cf41dd7a491cf599d1af7bf1be353066315e833291fa98f9ef7","all_sha256_literals":["2a88defef9517f89bc60934dce82097f8e316b08af9417e95167ea5d759a10d9","48c056521382e38a280c1ead171c4906c5a42465526aff459cb1c0053ac2c7a1","5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","74d0f37878652ed9d46b53ae8556bbb30ebd683741f293c3f59b3527876ed2d7","8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2","8453eab30f5c3ccd285fc9f70fff18f564809bb27f7bf84f51f2ba593aa85263","8cb775587817330dd12296c2f17665110353bcd090330d9bef36e4b61a23541e","98faa546f7a612f0d1f439d637c1293355371592afbcadf6cae0ee05b3552ef8","dfb769b991c2f8d60879b29e258a6d09f07f900cf3bfe0f12632d68314c66e0e","f2410cd328e2837b99e8ce4a28e25cb031a6bdd596d0286ac77a1822ef1cecd0","fc444570ebc55232fa3cedc9dbe6f0feedd1eba0d1563a88d990739a9ca3ee97"],"ast_valid":true,"bytes":19557,"contains_plan_sha256_symbol":true,"contains_result_contract":false,"declared_sha256":"98fad507d6539cf41dd7a491cf599d1af7bf1be353066315e833291fa98f9ef7","decode_ok":true,"index":0,"line_count":568,"marker_lines":["16:PLAN_SHA256 = \"[LONG_TOKEN_REDACTED]\"","23: \"plan_sha256\": PLAN_SHA256,","32:ROLLBACK_ROOT = pathlib.Path(\"/var/lib/homelab-change-rollback\")","135: \"/usr/bin/systemctl\", \"show\", name, \"--no-pager\",","329:def make_rollback() -> dict[str, Any]:","331: rollback_dir = ROLLBACK_ROOT / COMMAND_ID","332: rollback_dir.mkdir(parents=True, mode=0o700, exist_ok=False)","333: os.chmod(rollback_dir, 0o700)","335: copy_path = rollback_dir / \"homelab-chat-run-linked.rollback\"","336: metadata_path = rollback_dir / \"metadata.json\"","339: fd, temp_name = tempfile.mkstemp(prefix=\".copy.\", dir=str(rollback_dir))","347: os.replace(temp_path, copy_path)","349: temp_path.unlink(missing_ok=True)","358: \"plan_sha256\": PLAN_SHA256,","365: fsync_dir(rollback_dir)","368: raise RuntimeError(\"rollback SHA mismatch\")","370: raise RuntimeError(\"rollback mode mismatch\")","373: \"dir\": rollback_dir,","380:def remove_linked() -> None:","381: LINKED.unlink()","385:def restore_linked(rollback: dict[str, Any]) -> bool:","386: copy_path = pathlib.Path(rollback[\"copy\"])","396: os.chmod(temp_path, int(rollback[\"mode\"]))","398: os.chown(temp_path, int(rollback[\"uid\"]), int(rollback[\"gid\"]))","401: ns=(int(rollback[\"atime_ns\"]), int(rollback[\"mtime_ns\"])),","403: os.replace(temp_path, LINKED)","405: temp_path.unlink(missing_ok=True)","450: \"plan_bound\": PLAN_SOURCE[\"plan_sha256\"] == PLAN_SHA256,","476: \"PLAN_SHA256\": PLAN_SHA256,","478: \"changes_made\": False,","479: \"rollback_started\": False,","483: rollback = None","486: rollback = make_rollback()","487: remove_linked()","516: \"rollback_sha\": sha256_file(pathlib.Path(rollback[\"copy\"])) == EXPECTED[str(LINKED)],","517: \"rollback_mode\": stat.S_IMODE(pathlib.Path(rollback[\"copy\"]).stat().st_mode) == 0o600,","527: \"PLAN_SHA256\": PLAN_SHA256,","530: \"rollback_copy\": str(rollback[\"copy\"]),","531: \"rollback_metadata\": str(rollback[\"metadata\"]),","533: \"changes_made\": True,","539: \"rollback_started\": False,","545: rollback_started = bool(removed and rollback is not None)","547: restore_linked(rollback)","548: if rollback_started","553: \"PLAN_SHA256\": PLAN_SHA256,","556: \"diagnostics_before_rollback\": diag,","557: \"changes_made\": removed,","558: \"rollback_started\": rollback_started,","559: \"rollback_restored\": restored,"],"mode":"0700","mutation_calls":{"LINKED.unlink":1,"metadata_path.write_text":1,"os.chmod":4,"os.chown":1,"os.replace":2,"rollback_dir.mkdir":1,"temp_path.unlink":2},"path":"apply.py","schema_exact":true,"sha_match":true,"systemctl_actions":[]}],"payload_valid":true},"public_results":[{"facts":{"change_declared":null,"changes_made":true,"command_id":"RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z","command_rc":null,"component":"runner","execution_started":true,"mode":"change","mutation_outcome":null,"output_json_facts":{"PLAN_SHA256":"8cb775587817330dd12296c2f17665110353bcd090330d9bef36e4b61a23541e","changes_made":false,"rollback_started":false,"status":"BLOCKED"},"output_selected_lines":["1:{\"PLAN_SHA256\":\"[LONG_TOKEN_REDACTED]\",\"changes_made\":false,\"preconditions\":{\"adapter_healthy\":true,\"adapter_self_test\":true,\"current_capsule\":false,\"linked_regular\":true,\"no_other_mutating\":false,\"package_unmanaged\":true,\"plan_bound\":true,\"portal_health\":true,\"portal_healthy\":true,\"portal_self_test\":true,\"source_lock\":true,\"zero_fds\":true,\"zero_live_refs\":true,\"zero_processes\":true},\"rollback_started\":false,\"status\":\"BLOCKED\"}"],"output_sha256":"dc5edc4974ec58fc16aa68ed6cf3da25fdccb016047861d5cd78253c704319fc","output_type":"str","private_addresses_included":false,"raw_evidence_sha256":"dc5edc4974ec58fc16aa68ed6cf3da25fdccb016047861d5cd78253c704319fc","rc":2,"result_contract_error":null,"result_contract_status":null,"result_contract_valid":null,"rollback_restored":null,"rollback_started":null,"sanitized":true,"sanitized_output_sha256":"dc5edc4974ec58fc16aa68ed6cf3da25fdccb016047861d5cd78253c704319fc","secrets_included":false,"status":"FAIL"},"file_sha256":"a1c17abc64bc32706aa43ef97f19bce5894a05fdabae6834f2d2e4deed611e5c","path":"/var/lib/homelab-chat-run/public/RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z-20260726T202333Z.json"}],"raw_results":[],"state_facts":{"capsule_sha256":"ba4a8e897dff0a4e5b9e77d2d769551041a45ebcdbb285bd753febfa721f8d0d","changes_made":null,"error_message_sha256":null,"error_stage":null,"error_type":null,"evidence_sha256":"d33b0cb4f775fb6bfb57d7681273a2ae9b3e884088ae794f1c152797cd03f6dd","finished_at_utc":"2026-07-26T20:23:37.595816+00:00","gateway_verified":true,"imported_at_utc":"2026-07-26T20:23:28.952530+00:00","mutation_outcome":null,"rollback_restored":null,"rollback_started":null,"runner_document_rc":2,"runner_rc":2,"runner_status":"FAIL","runner_wrapper_matches_document":true,"short_id":"XJFI5CL574","started_at_utc":"2026-07-26T20:23:32.925742+00:00","status":"FAIL","worker_pid":3321816},"state_file":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2373817,"is_symlink":false,"mode":"0640","path":"/var/lib/homelab-command-adapter/state/XJFI5CL574.json","regular":true,"resolved":"/var/lib/homelab-command-adapter/state/XJFI5CL574.json","sha256":"98cf95f846d89ccf9d2a6dcdac1e249587854bf845eba45f17681c964bc27501","size":3778,"uid":0},"worker_log":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2373793,"is_symlink":false,"mode":"0640","path":"/var/lib/homelab-command-adapter/runs/XJFI5CL574.worker.log","regular":true,"resolved":"/var/lib/homelab-command-adapter/runs/XJFI5CL574.worker.log","selected_lines":[],"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","size":0,"uid":0},"worker_process":{"pid":3321816,"proc_exists":false}},"RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z":{"capsule_file":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2373833,"is_symlink":false,"mode":"0600","path":"/var/lib/homelab-command-adapter/capsules/84f120ca27f6de4f1c05e36bcecd59588f8b9298bccb129f480b99ee316702e2/capsule.hcmd","regular":true,"resolved":"/var/lib/homelab-command-adapter/capsules/84f120ca27f6de4f1c05e36bcecd59588f8b9298bccb129f480b99ee316702e2/capsule.hcmd","sha256":"84f120ca27f6de4f1c05e36bcecd59588f8b9298bccb129f480b99ee316702e2","size":34363,"uid":0},"manifest_facts":{"change_flags":{"backup":false,"cluster":false,"gitea":false,"production":true},"component":"runner","mode":"change","payload":[{"bytes":24727,"mode":"0700","path":"apply_final.py","sha256":"659439e2ee73b1cf4cac6a5719642541f39d2999846419e827b8fe160ccf647a"}],"risk":"REVERSIBLE","rollback":{"available":true,"description":"Exact SHA-verified mode-0600 rollback copy before removal; diagnostics before atomic restore on failed postcondition."}},"payload_analysis":{"items":[{"actual_sha256":"659439e2ee73b1cf4cac6a5719642541f39d2999846419e827b8fe160ccf647a","all_sha256_literals":["2a88defef9517f89bc60934dce82097f8e316b08af9417e95167ea5d759a10d9","48c056521382e38a280c1ead171c4906c5a42465526aff459cb1c0053ac2c7a1","5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","74d0f37878652ed9d46b53ae8556bbb30ebd683741f293c3f59b3527876ed2d7","8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2","8453eab30f5c3ccd285fc9f70fff18f564809bb27f7bf84f51f2ba593aa85263","8cb775587817330dd12296c2f17665110353bcd090330d9bef36e4b61a23541e","98faa546f7a612f0d1f439d637c1293355371592afbcadf6cae0ee05b3552ef8","a1c17abc64bc32706aa43ef97f19bce5894a05fdabae6834f2d2e4deed611e5c","ba4a8e897dff0a4e5b9e77d2d769551041a45ebcdbb285bd753febfa721f8d0d","d33b0cb4f775fb6bfb57d7681273a2ae9b3e884088ae794f1c152797cd03f6dd","dfb769b991c2f8d60879b29e258a6d09f07f900cf3bfe0f12632d68314c66e0e","f2410cd328e2837b99e8ce4a28e25cb031a6bdd596d0286ac77a1822ef1cecd0","fc444570ebc55232fa3cedc9dbe6f0feedd1eba0d1563a88d990739a9ca3ee97"],"ast_valid":true,"bytes":24727,"contains_plan_sha256_symbol":true,"contains_result_contract":false,"declared_sha256":"659439e2ee73b1cf4cac6a5719642541f39d2999846419e827b8fe160ccf647a","decode_ok":true,"index":0,"line_count":742,"marker_lines":["16:PLAN_SHA256 = \"[LONG_TOKEN_REDACTED]\"","32: \"plan_sha256\": PLAN_SHA256,","41:ROLLBACK_ROOT = pathlib.Path(\"/var/lib/homelab-change-rollback\")","144: \"/usr/bin/systemctl\", \"show\", name, \"--no-pager\",","289: if document.get(\"changes_made\") is not False:","304: result.get(\"PLAN_SHA256\")","308: if result.get(\"changes_made\") is not False:","310: if result.get(\"rollback_started\") is not False:","496:def make_rollback() -> dict[str, Any]:","498: rollback_dir = ROLLBACK_ROOT / COMMAND_ID","499: rollback_dir.mkdir(parents=True, mode=0o700, exist_ok=False)","500: os.chmod(rollback_dir, 0o700)","502: copy_path = rollback_dir / \"homelab-chat-run-linked.rollback\"","503: metadata_path = rollback_dir / \"metadata.json\"","506: fd, temp_name = tempfile.mkstemp(prefix=\".copy.\", dir=str(rollback_dir))","514: os.replace(temp_path, copy_path)","516: temp_path.unlink(missing_ok=True)","525: \"plan_sha256\": PLAN_SHA256,","532: fsync_dir(rollback_dir)","535: raise RuntimeError(\"rollback SHA mismatch\")","537: raise RuntimeError(\"rollback mode mismatch\")","540: \"dir\": rollback_dir,","547:def remove_linked() -> None:","548: LINKED.unlink()","552:def restore_linked(rollback: dict[str, Any]) -> bool:","553: copy_path = pathlib.Path(rollback[\"copy\"])","563: os.chmod(temp_path, int(rollback[\"mode\"]))","565: os.chown(temp_path, int(rollback[\"uid\"]), int(rollback[\"gid\"]))","568: ns=(int(rollback[\"atime_ns\"]), int(rollback[\"mtime_ns\"])),","570: os.replace(temp_path, LINKED)","572: temp_path.unlink(missing_ok=True)","618: \"plan_bound\": PLAN_SOURCE[\"plan_sha256\"] == PLAN_SHA256,","648: \"PLAN_SHA256\": PLAN_SHA256,","651: \"changes_made\": False,","652: \"rollback_started\": False,","656: rollback = None","659: rollback = make_rollback()","660: remove_linked()","689: \"rollback_sha\": sha256_file(pathlib.Path(rollback[\"copy\"])) == EXPECTED[str(LINKED)],","690: \"rollback_mode\": stat.S_IMODE(pathlib.Path(rollback[\"copy\"]).stat().st_mode) == 0o600,","700: \"PLAN_SHA256\": PLAN_SHA256,","703: \"rollback_copy\": str(rollback[\"copy\"]),","704: \"rollback_metadata\": str(rollback[\"metadata\"]),","707: \"changes_made\": True,","713: \"rollback_started\": False,","719: rollback_started = bool(removed and rollback is not None)","721: restore_linked(rollback)","722: if rollback_started","727: \"PLAN_SHA256\": PLAN_SHA256,","730: \"diagnostics_before_rollback\": diag,","731: \"changes_made\": removed,","732: \"rollback_started\": rollback_started,","733: \"rollback_restored\": restored,"],"mode":"0700","mutation_calls":{"LINKED.unlink":1,"metadata_path.write_text":1,"os.chmod":4,"os.chown":1,"os.replace":2,"rollback_dir.mkdir":1,"temp_path.unlink":2},"path":"apply_final.py","schema_exact":true,"sha_match":true,"systemctl_actions":[]}],"payload_valid":true},"public_results":[{"facts":{"change_declared":null,"changes_made":true,"command_id":"RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z","command_rc":null,"component":"runner","execution_started":true,"mode":"change","mutation_outcome":null,"output_json_facts":{"PLAN_SHA256":"8cb775587817330dd12296c2f17665110353bcd090330d9bef36e4b61a23541e","changes_made":false,"rollback_started":false,"status":"BLOCKED"},"output_selected_lines":["1:{\"PLAN_SHA256\":\"[LONG_TOKEN_REDACTED]\",\"changes_made\":false,\"mutating_state_classification\":{\"closed\":[],\"unresolved\":[\"RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z\"]},\"preconditions\":{\"adapter_healthy\":true,\"adapter_self_test\":true,\"current_capsule\":true,\"linked_regular\":true,\"no_other_mutating\":false,\"package_unmanaged\":true,\"plan_bound\":true,\"portal_health\":true,\"portal_healthy\":true,\"portal_self_test\":true,\"previous_blocked_attempt_closed\":false,\"source_lock\":true,\"zero_fds\":true,\"zero_live_refs\":true,\"zero_processes\":true},\"rollback_started\":false,\"status\":\"BLOCKED\"}"],"output_sha256":"2b955106e013727b7506d472c868d43efbc226530202e72292e1444d839503e7","output_type":"str","private_addresses_included":false,"raw_evidence_sha256":"2b955106e013727b7506d472c868d43efbc226530202e72292e1444d839503e7","rc":2,"result_contract_error":null,"result_contract_status":null,"result_contract_valid":null,"rollback_restored":null,"rollback_started":null,"sanitized":true,"sanitized_output_sha256":"2b955106e013727b7506d472c868d43efbc226530202e72292e1444d839503e7","secrets_included":false,"status":"FAIL"},"file_sha256":"535f79c0d76cc3bd6adeffe6f9d27ed37e6b4b971a3fa260f12b2c57fb5d6a52","path":"/var/lib/homelab-chat-run/public/RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z-20260726T203051Z.json"}],"raw_results":[],"state_facts":{"capsule_sha256":"84f120ca27f6de4f1c05e36bcecd59588f8b9298bccb129f480b99ee316702e2","changes_made":null,"error_message_sha256":null,"error_stage":null,"error_type":null,"evidence_sha256":"98474ad0c0c5ab2b6507c2469ea804b3c771f8a8f71c23a8238fd64ae1fe989d","finished_at_utc":"2026-07-26T20:30:56.238685+00:00","gateway_verified":true,"imported_at_utc":"2026-07-26T20:30:47.474045+00:00","mutation_outcome":null,"rollback_restored":null,"rollback_started":null,"runner_document_rc":2,"runner_rc":2,"runner_status":"FAIL","runner_wrapper_matches_document":true,"short_id":"QTYSBSRH63","started_at_utc":"2026-07-26T20:30:51.488097+00:00","status":"FAIL","worker_pid":3358045},"state_file":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2373842,"is_symlink":false,"mode":"0640","path":"/var/lib/homelab-command-adapter/state/QTYSBSRH63.json","regular":true,"resolved":"/var/lib/homelab-command-adapter/state/QTYSBSRH63.json","sha256":"ab5495eba8f2f81c97bd50b849d3a8e27a5c157672be28bf604050eabde4274e","size":3980,"uid":0},"worker_log":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2373822,"is_symlink":false,"mode":"0640","path":"/var/lib/homelab-command-adapter/runs/QTYSBSRH63.worker.log","regular":true,"resolved":"/var/lib/homelab-command-adapter/runs/QTYSBSRH63.worker.log","selected_lines":[],"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","size":0,"uid":0},"worker_process":{"pid":3358045,"proc_exists":false}},"RUNNER-MUTATION-CONTRACT-ACCEPTANCE-FIX-20260726T210744Z":{"capsule_file":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2373872,"is_symlink":false,"mode":"0600","path":"/var/lib/homelab-command-adapter/capsules/c2f0488dd5d50bee032ddcd75aa46f388bfa538d66797c2ef98af9dd8eff473f/capsule.hcmd","regular":true,"resolved":"/var/lib/homelab-command-adapter/capsules/c2f0488dd5d50bee032ddcd75aa46f388bfa538d66797c2ef98af9dd8eff473f/capsule.hcmd","sha256":"c2f0488dd5d50bee032ddcd75aa46f388bfa538d66797c2ef98af9dd8eff473f","size":11570,"uid":0},"manifest_facts":{"change_flags":{"backup":false,"cluster":false,"gitea":false,"production":true},"component":"runner","mode":"change","payload":[{"bytes":7525,"mode":"0700","path":"acceptance_fix.py","sha256":"dccc63dd169d61728a60180130ee1341d6f72a133178d3744df246e0cadd0f7c"}],"risk":"REVERSIBLE","rollback":{"available":true,"description":"No-op acceptance не изменяет систему. Доступен реальный rollback из /var/lib/homelab-change-rollback/RUNNER-MUTATION-CONTRACT-APPLY-20260726T205715Z/: точная копия прежнего runner и metadata.json."}},"payload_analysis":{"items":[{"actual_sha256":"dccc63dd169d61728a60180130ee1341d6f72a133178d3744df246e0cadd0f7c","all_sha256_literals":["22eedf9b1090960a7f92cef992f481d8d6cc3f42e4f4ecd6e27bbda4ebf752bd","2a88defef9517f89bc60934dce82097f8e316b08af9417e95167ea5d759a10d9","5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","74d0f37878652ed9d46b53ae8556bbb30ebd683741f293c3f59b3527876ed2d7","8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2","8453eab30f5c3ccd285fc9f70fff18f564809bb27f7bf84f51f2ba593aa85263","9ac413b007bdf2ab6eb393d872bcd3eed101da0647924051ae3ea4abf7d4eca0","b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d","f2410cd328e2837b99e8ce4a28e25cb031a6bdd596d0286ac77a1822ef1cecd0"],"ast_valid":true,"bytes":7525,"contains_plan_sha256_symbol":true,"contains_result_contract":true,"declared_sha256":"dccc63dd169d61728a60180130ee1341d6f72a133178d3744df246e0cadd0f7c","decode_ok":true,"index":0,"line_count":262,"marker_lines":["14:PLAN_SHA256 = \"[LONG_TOKEN_REDACTED]\"","16:ROLLBACK_COPY = pathlib.Path(\"[LONG_TOKEN_REDACTED].rollback\")","17:ROLLBACK_META = pathlib.Path(\"[LONG_TOKEN_REDACTED].json\")","74: \"/usr/bin/systemctl\",","135: \"HOMELAB_RESULT_CONTRACT=\"","141: \"changes_made\": False,","142: \"rollback_started\": False,","143: \"rollback_restored\": None,","218: \"rollback_copy_exists\": ROLLBACK_COPY.exists(),","219: \"rollback_copy_sha\": (","224: \"rollback_copy_mode_0600\": (","231: \"rollback_metadata_exists\": ROLLBACK_META.exists(),","240: \"PLAN_SHA256\": PLAN_SHA256,","248: \"changes_made\": False,","249: \"rollback_started\": False,"],"mode":"0700","mutation_calls":{},"path":"acceptance_fix.py","schema_exact":true,"sha_match":true,"systemctl_actions":[]}],"payload_valid":true},"public_results":[],"raw_results":[],"state_facts":{"capsule_sha256":"c2f0488dd5d50bee032ddcd75aa46f388bfa538d66797c2ef98af9dd8eff473f","changes_made":null,"error_message_sha256":"01626831c30f18bef5e5621858387d988cf0edb83c6ba723ebc0e7081b38a91a","error_stage":null,"error_type":"InterruptedExecution","evidence_sha256":null,"finished_at_utc":"2026-07-27T05:07:17.967688+00:00","gateway_verified":null,"imported_at_utc":"2026-07-26T21:10:03.805618+00:00","mutation_outcome":null,"rollback_restored":null,"rollback_started":null,"runner_document_rc":null,"runner_rc":null,"runner_status":null,"runner_wrapper_matches_document":null,"short_id":"YLYERDOV2U","started_at_utc":"2026-07-26T21:10:07.680130+00:00","status":"FAIL","worker_pid":3484244},"state_file":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2373885,"is_symlink":false,"mode":"0640","path":"/var/lib/homelab-command-adapter/state/YLYERDOV2U.json","regular":true,"resolved":"/var/lib/homelab-command-adapter/state/YLYERDOV2U.json","sha256":"36285550ceb849bf22aef539bc56ad4741c0fb61553d108eefd6fdc6805d02d9","size":3327,"uid":0},"worker_log":{"device":64513,"executable":false,"exists":true,"gid":990,"inode":2373811,"is_symlink":false,"mode":"0640","path":"/var/lib/homelab-command-adapter/runs/YLYERDOV2U.worker.log","regular":true,"resolved":"/var/lib/homelab-command-adapter/runs/YLYERDOV2U.worker.log","selected_lines":["1:Traceback (most recent call last):","11: raise AdapterError(","12: f\"helper integrity mismatch: {path}: {actual}\"","14:AdapterError: helper integrity mismatch: /usr/local/sbin/homelab-chat-run: [LONG_TOKEN_REDACTED]"],"sha256":"67696052b4003d1cf0374688de70e22a355b79304c70c76b8e76e270cb10f1b5","size":705,"uid":0},"worker_process":{"pid":3484244,"proc_exists":false}}},"units":{"homelab-command-adapter.service":{"ActiveState":"active","ExecMainStatus":"0","ExecStart_mentions_canonical":false,"ExecStart_mentions_linked":false,"ExecStart_sha256":"3493588fb9c796055b267e57fb1881243972be59e2507910d4cbe948989b5ee3","Group":"homelab-command-portal","LoadState":"loaded","MainPID":"1637015","NRestarts":"0","Result":"success","SubState":"running","UnitFileState":"enabled","User":"root","show_rc":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"homelab-command-portal.service":{"ActiveState":"active","ExecMainStatus":"0","ExecStart_mentions_canonical":false,"ExecStart_mentions_linked":false,"ExecStart_sha256":"e34879c7ae83e8b092ab9f1c561f8a1c47c4eb972df3d3d4abc5da544bf00fa6","Group":"homelab-command-portal","LoadState":"loaded","MainPID":"1759597","NRestarts":"0","Result":"success","SubState":"running","UnitFileState":"enabled","User":"homelab-command-portal","show_rc":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"homelab-result-lookup.service":{"ActiveState":"active","ExecMainStatus":"0","ExecStart_mentions_canonical":false,"ExecStart_mentions_linked":false,"ExecStart_sha256":"f5194a04a3fc4499702b837aa40dc74dd0d047ff0bbfd048367de1af802ababe","Group":"homelab-result-lookup","LoadState":"loaded","MainPID":"2718720","NRestarts":"0","Result":"success","SubState":"running","UnitFileState":"enabled","User":"homelab-result-lookup","show_rc":0,"stderr_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}}}
OUTPUT_END
CHAT_OUTPUT_END