From bad25afd41ef991b95249d5801b7826d1980052e Mon Sep 17 00:00:00 2001 From: homelab-runtime-publisher Date: Mon, 27 Jul 2026 16:52:47 +0000 Subject: [PATCH] runtime: publish RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z --- ...AL-CLOSURE-PLAN-FIX1-20260727T165053Z.json | 38 +++++++++++++++++++ ...VAL-CLOSURE-PLAN-FIX1-20260727T165053Z.txt | 33 ++++++++++++++++ runtime/latest.json | 16 ++++---- runtime/latest.txt | 12 +++--- 4 files changed, 85 insertions(+), 14 deletions(-) create mode 100644 runtime/history/RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z.json create mode 100644 runtime/history/RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z.txt diff --git a/runtime/history/RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z.json b/runtime/history/RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z.json new file mode 100644 index 0000000..c9fe17f --- /dev/null +++ b/runtime/history/RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "verify", + "component": "runner-linked-removal-plan", + "started_at_utc": "2026-07-27T16:52:46Z", + "finished_at_utc": "2026-07-27T16:52:46Z", + "reference_register_checked": true, + "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e", + "error_register_checked": true, + "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83", + "command_sha256": "96196bd9215a78fb99233ff2583c4b79224ee6b6d4d44ed379c0fbe6f2f6934a", + "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": "14fbe176edb23de1b414d60665927b9ca325eaf6e7ee519143fac05e76f9c1ed", + "sanitized_output_sha256": "14fbe176edb23de1b414d60665927b9ca325eaf6e7ee519143fac05e76f9c1ed", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "{\"PLAN_SHA256\":\"42bf4e33ea018e163d2f775057c4ab173c3f0a20bc7ef5423c723b2ec48ce40a\",\"anti_regression_tests\":{\"AR-001-LEGACY-WRAPPER-FLAG-CANNOT-OVERRIDE-EXACT-BLOCKED-PAYLOAD-OUTCOME\":true,\"AR-002-ADAPTER-PREEXECUTION-FAILURE-WITH-NO-MUTATION-CALLS-IS-CLOSED\":true,\"AR-003-INTERRUPTED-APPLY-IS-CLOSED-ONLY-BY-EXACT-SUCCESSFUL-SAME-PLAN-SUCCESSOR\":true,\"AR-004-HISTORICAL-STATE-FILES-ARE-IMMUTABLE\":true,\"AR-005-ZERO-CONFIG-PROCESS-FD-REFERENCES-BEFORE-REMOVE\":true,\"AR-006-EXACTLY-ONE-DISTINCT-RUNNER-AFTER-APPLY\":true,\"AR-007-DIAGNOSTICS-PRECEDE-ROLLBACK\":true,\"AR-008-APPLY-MUST-BIND-THIS-EXACT-PLAN-SHA256\":true},\"apply_steps\":[\"Repeat every source lock, service, self-test, reference, FD, runner inventory and historical closure precondition.\",\"Create one command-specific rollback directory under /var/lib/homelab-change-rollback with mode 0700.\",\"Copy only homelab-chat-run-linked into that rollback directory with mode 0600; verify byte-for-byte SHA-256 and fsync.\",\"Capture diagnostics immediately before the mutation.\",\"Remove only /usr/local/sbin/homelab-chat-run-linked and fsync /usr/local/sbin.\",\"Verify the linked path is absent, the canonical runner is byte-identical, exactly one distinct runner remains, all services and self-tests remain healthy, and the historical closure classifier still passes.\",\"If any postcondition fails, capture diagnostics before rollback, restore the exact rollback copy atomically, fsync, and verify the original SHA/mode/uid/gid.\"],\"canonical_runner_lock\":{\"must_remain_gid\":0,\"must_remain_mode\":\"0750\",\"must_remain_uid\":0,\"path\":\"/usr/local/sbin/homelab-chat-run\",\"sha256\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\"},\"changes_made\":false,\"forbidden_actions\":[\"Do not modify backup.\",\"Do not modify historical Adapter state files.\",\"Do not modify the canonical runner.\",\"Do not create a second runner.\",\"Do not restart or reload Portal, Adapter or Lookup.\",\"Do not modify Portal, Adapter, Lookup, systemd units, Gitea or cluster configuration.\"],\"historical_state_policy\":{\"classifications\":{\"MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090755Z\":\"CLOSED_SUPERSEDED_BY_SUCCESSFUL_SAME_PLAN_AND_CURRENT_SOURCE_LOCKS\",\"RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z\":\"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG\",\"RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z\":\"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG\",\"RUNNER-MUTATION-CONTRACT-ACCEPTANCE-FIX-20260726T210744Z\":\"CLOSED_ADAPTER_PREEXECUTION_INTEGRITY_FAILURE_PAYLOAD_NOT_RUN_AND_PAYLOAD_HAS_NO_MUTATION_CALLS\"},\"do_not_edit_historical_state_files\":true},\"kind\":\"homelab-change-plan\",\"linked_preconditions\":{\"active_config_references\":0,\"active_process_references\":0,\"gid\":0,\"mode\":\"0755\",\"open_fd_references\":0,\"path\":\"/usr/local/sbin/homelab-chat-run-linked\",\"sha256\":\"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1\",\"size\":1901,\"uid\":0},\"objective\":\"Remove only the unused distinct executable /usr/local/sbin/homelab-chat-run-linked and preserve the canonical runner unchanged.\",\"observed_preconditions\":{\"checks\":{\"adapter_self_test\":true,\"adapter_service_healthy\":true,\"all_four_historical_mutations_closed_by_exact_evidence\":true,\"linked_exact_metadata\":true,\"linked_zero_active_config_references\":true,\"linked_zero_live_process_references\":true,\"linked_zero_open_fd_references\":true,\"lookup_local_health\":true,\"lookup_service_healthy\":true,\"portal_local_health\":true,\"portal_self_test_real_identity\":true,\"portal_service_healthy\":true,\"preapply_exactly_two_distinct_runner_files\":true,\"source_lock:/etc/systemd/system/homelab-command-adapter.service\":true,\"source_lock:/etc/systemd/system/homelab-command-portal.service\":true,\"source_lock:/etc/systemd/system/homelab-result-lookup.service\":true,\"source_lock:/usr/local/sbin/homelab-chat-run\":true,\"source_lock:/usr/local/sbin/homelab-chat-run-linked\":true,\"source_lock:/usr/local/sbin/homelab-command-adapter\":true,\"source_lock:/usr/local/sbin/homelab-command-portal\":true,\"source_lock:/usr/local/sbin/homelab-result-lookup\":true,\"target_is_pve01\":true,\"uid_is_root\":true},\"historical_classifications\":{\"MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090755Z\":\"CLOSED_SUPERSEDED_BY_SUCCESSFUL_SAME_PLAN_AND_CURRENT_SOURCE_LOCKS\",\"RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z\":\"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG\",\"RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z\":\"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG\",\"RUNNER-MUTATION-CONTRACT-ACCEPTANCE-FIX-20260726T210744Z\":\"CLOSED_ADAPTER_PREEXECUTION_INTEGRITY_FAILURE_PAYLOAD_NOT_RUN_AND_PAYLOAD_HAS_NO_MUTATION_CALLS\"},\"runner_inventory\":{\"distinct_count\":2,\"entries\":[{\"device\":64513,\"gid\":0,\"inode\":5148538,\"mode\":\"0750\",\"path\":\"/usr/local/sbin/homelab-chat-run\",\"resolved\":\"/usr/local/sbin/homelab-chat-run\",\"sha256\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\",\"uid\":0},{\"device\":64513,\"gid\":0,\"inode\":5148536,\"mode\":\"0755\",\"path\":\"/usr/local/sbin/homelab-chat-run-linked\",\"resolved\":\"/usr/local/sbin/homelab-chat-run-linked\",\"sha256\":\"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1\",\"uid\":0}]}},\"plan_hash_definition\":\"SHA256 of UTF-8 canonical JSON of this plan without PLAN_SHA256 and plan_hash_definition, sort_keys=true, separators=(',', ':'), followed by one LF.\",\"plan_id\":\"RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z\",\"read_only\":true,\"rollback_contract\":{\"available\":true,\"diagnostics_before_rollback\":true,\"restore_exact_sha256\":\"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1\",\"restore_gid\":0,\"restore_mode\":\"0755\",\"restore_uid\":0,\"trigger\":\"Any failed postcondition after linked runner removal.\"},\"rollback_started\":false,\"schema\":1,\"scope\":{\"backup\":false,\"cluster\":false,\"gitea\":false,\"production\":true},\"source_locks\":{\"/etc/systemd/system/homelab-command-adapter.service\":\"74d0f37878652ed9d46b53ae8556bbb30ebd683741f293c3f59b3527876ed2d7\",\"/etc/systemd/system/homelab-command-portal.service\":\"8453eab30f5c3ccd285fc9f70fff18f564809bb27f7bf84f51f2ba593aa85263\",\"/etc/systemd/system/homelab-result-lookup.service\":\"4bcc607fd457313f75373ec3d8ec20e7020f13c7cb8a9523fd988a24b0f6609d\",\"/usr/local/sbin/homelab-chat-run\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\",\"/usr/local/sbin/homelab-chat-run-linked\":\"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1\",\"/usr/local/sbin/homelab-command-adapter\":\"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d\",\"/usr/local/sbin/homelab-command-portal\":\"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52\",\"/usr/local/sbin/homelab-result-lookup\":\"17f8d2a2ea219cdc02b0f8e821f8054b05c01de1253419b3d23349a2d383889c\"},\"status\":\"PLAN_READY\",\"target\":\"pve01\"}\n" +} diff --git a/runtime/history/RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z.txt b/runtime/history/RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z.txt new file mode 100644 index 0000000..c97306a --- /dev/null +++ b/runtime/history/RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z.txt @@ -0,0 +1,33 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z +STATUS=OK +RC=0 +HOST=pve01 +MODE=verify +COMPONENT=runner-linked-removal-plan +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83 +COMMAND_SHA256=96196bd9215a78fb99233ff2583c4b79224ee6b6d4d44ed379c0fbe6f2f6934a +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=14fbe176edb23de1b414d60665927b9ca325eaf6e7ee519143fac05e76f9c1ed +SANITIZED_OUTPUT_SHA256=14fbe176edb23de1b414d60665927b9ca325eaf6e7ee519143fac05e76f9c1ed +OUTPUT_BEGIN +{"PLAN_SHA256":"42bf4e33ea018e163d2f775057c4ab173c3f0a20bc7ef5423c723b2ec48ce40a","anti_regression_tests":{"AR-001-LEGACY-WRAPPER-FLAG-CANNOT-OVERRIDE-EXACT-BLOCKED-PAYLOAD-OUTCOME":true,"AR-002-ADAPTER-PREEXECUTION-FAILURE-WITH-NO-MUTATION-CALLS-IS-CLOSED":true,"AR-003-INTERRUPTED-APPLY-IS-CLOSED-ONLY-BY-EXACT-SUCCESSFUL-SAME-PLAN-SUCCESSOR":true,"AR-004-HISTORICAL-STATE-FILES-ARE-IMMUTABLE":true,"AR-005-ZERO-CONFIG-PROCESS-FD-REFERENCES-BEFORE-REMOVE":true,"AR-006-EXACTLY-ONE-DISTINCT-RUNNER-AFTER-APPLY":true,"AR-007-DIAGNOSTICS-PRECEDE-ROLLBACK":true,"AR-008-APPLY-MUST-BIND-THIS-EXACT-PLAN-SHA256":true},"apply_steps":["Repeat every source lock, service, self-test, reference, FD, runner inventory and historical closure precondition.","Create one command-specific rollback directory under /var/lib/homelab-change-rollback with mode 0700.","Copy only homelab-chat-run-linked into that rollback directory with mode 0600; verify byte-for-byte SHA-256 and fsync.","Capture diagnostics immediately before the mutation.","Remove only /usr/local/sbin/homelab-chat-run-linked and fsync /usr/local/sbin.","Verify the linked path is absent, the canonical runner is byte-identical, exactly one distinct runner remains, all services and self-tests remain healthy, and the historical closure classifier still passes.","If any postcondition fails, capture diagnostics before rollback, restore the exact rollback copy atomically, fsync, and verify the original SHA/mode/uid/gid."],"canonical_runner_lock":{"must_remain_gid":0,"must_remain_mode":"0750","must_remain_uid":0,"path":"/usr/local/sbin/homelab-chat-run","sha256":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d"},"changes_made":false,"forbidden_actions":["Do not modify backup.","Do not modify historical Adapter state files.","Do not modify the canonical runner.","Do not create a second runner.","Do not restart or reload Portal, Adapter or Lookup.","Do not modify Portal, Adapter, Lookup, systemd units, Gitea or cluster configuration."],"historical_state_policy":{"classifications":{"MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090755Z":"CLOSED_SUPERSEDED_BY_SUCCESSFUL_SAME_PLAN_AND_CURRENT_SOURCE_LOCKS","RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z":"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG","RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z":"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG","RUNNER-MUTATION-CONTRACT-ACCEPTANCE-FIX-20260726T210744Z":"CLOSED_ADAPTER_PREEXECUTION_INTEGRITY_FAILURE_PAYLOAD_NOT_RUN_AND_PAYLOAD_HAS_NO_MUTATION_CALLS"},"do_not_edit_historical_state_files":true},"kind":"homelab-change-plan","linked_preconditions":{"active_config_references":0,"active_process_references":0,"gid":0,"mode":"0755","open_fd_references":0,"path":"/usr/local/sbin/homelab-chat-run-linked","sha256":"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","size":1901,"uid":0},"objective":"Remove only the unused distinct executable /usr/local/sbin/homelab-chat-run-linked and preserve the canonical runner unchanged.","observed_preconditions":{"checks":{"adapter_self_test":true,"adapter_service_healthy":true,"all_four_historical_mutations_closed_by_exact_evidence":true,"linked_exact_metadata":true,"linked_zero_active_config_references":true,"linked_zero_live_process_references":true,"linked_zero_open_fd_references":true,"lookup_local_health":true,"lookup_service_healthy":true,"portal_local_health":true,"portal_self_test_real_identity":true,"portal_service_healthy":true,"preapply_exactly_two_distinct_runner_files":true,"source_lock:/etc/systemd/system/homelab-command-adapter.service":true,"source_lock:/etc/systemd/system/homelab-command-portal.service":true,"source_lock:/etc/systemd/system/homelab-result-lookup.service":true,"source_lock:/usr/local/sbin/homelab-chat-run":true,"source_lock:/usr/local/sbin/homelab-chat-run-linked":true,"source_lock:/usr/local/sbin/homelab-command-adapter":true,"source_lock:/usr/local/sbin/homelab-command-portal":true,"source_lock:/usr/local/sbin/homelab-result-lookup":true,"target_is_pve01":true,"uid_is_root":true},"historical_classifications":{"MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090755Z":"CLOSED_SUPERSEDED_BY_SUCCESSFUL_SAME_PLAN_AND_CURRENT_SOURCE_LOCKS","RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z":"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG","RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z":"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG","RUNNER-MUTATION-CONTRACT-ACCEPTANCE-FIX-20260726T210744Z":"CLOSED_ADAPTER_PREEXECUTION_INTEGRITY_FAILURE_PAYLOAD_NOT_RUN_AND_PAYLOAD_HAS_NO_MUTATION_CALLS"},"runner_inventory":{"distinct_count":2,"entries":[{"device":64513,"gid":0,"inode":5148538,"mode":"0750","path":"/usr/local/sbin/homelab-chat-run","resolved":"/usr/local/sbin/homelab-chat-run","sha256":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d","uid":0},{"device":64513,"gid":0,"inode":5148536,"mode":"0755","path":"/usr/local/sbin/homelab-chat-run-linked","resolved":"/usr/local/sbin/homelab-chat-run-linked","sha256":"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","uid":0}]}},"plan_hash_definition":"SHA256 of UTF-8 canonical JSON of this plan without PLAN_SHA256 and plan_hash_definition, sort_keys=true, separators=(',', ':'), followed by one LF.","plan_id":"RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z","read_only":true,"rollback_contract":{"available":true,"diagnostics_before_rollback":true,"restore_exact_sha256":"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","restore_gid":0,"restore_mode":"0755","restore_uid":0,"trigger":"Any failed postcondition after linked runner removal."},"rollback_started":false,"schema":1,"scope":{"backup":false,"cluster":false,"gitea":false,"production":true},"source_locks":{"/etc/systemd/system/homelab-command-adapter.service":"74d0f37878652ed9d46b53ae8556bbb30ebd683741f293c3f59b3527876ed2d7","/etc/systemd/system/homelab-command-portal.service":"8453eab30f5c3ccd285fc9f70fff18f564809bb27f7bf84f51f2ba593aa85263","/etc/systemd/system/homelab-result-lookup.service":"4bcc607fd457313f75373ec3d8ec20e7020f13c7cb8a9523fd988a24b0f6609d","/usr/local/sbin/homelab-chat-run":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d","/usr/local/sbin/homelab-chat-run-linked":"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","/usr/local/sbin/homelab-command-adapter":"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d","/usr/local/sbin/homelab-command-portal":"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52","/usr/local/sbin/homelab-result-lookup":"17f8d2a2ea219cdc02b0f8e821f8054b05c01de1253419b3d23349a2d383889c"},"status":"PLAN_READY","target":"pve01"} + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index e33d5b3..c9fe17f 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "HOMELAB-MUTATION-CLOSURE-FORENSIC-FIX2-20260727T164022Z", + "command_id": "RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z", "status": "OK", "rc": 0, "host": "pve01", "mode": "verify", - "component": "mutation-closure-forensic", - "started_at_utc": "2026-07-27T16:42:37Z", - "finished_at_utc": "2026-07-27T16:42:37Z", + "component": "runner-linked-removal-plan", + "started_at_utc": "2026-07-27T16:52:46Z", + "finished_at_utc": "2026-07-27T16:52:46Z", "reference_register_checked": true, "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e", "error_register_checked": true, "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83", - "command_sha256": "886574cbeb287526a708cd96da96c9eec91136dd4a11492efad91343bd68f1ea", + "command_sha256": "96196bd9215a78fb99233ff2583c4b79224ee6b6d4d44ed379c0fbe6f2f6934a", "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": "44df2f482dc40d2f26af8b8192b29186e46a9e099537792292b2928ea234fd4a", - "sanitized_output_sha256": "44df2f482dc40d2f26af8b8192b29186e46a9e099537792292b2928ea234fd4a", + "raw_evidence_sha256": "14fbe176edb23de1b414d60665927b9ca325eaf6e7ee519143fac05e76f9c1ed", + "sanitized_output_sha256": "14fbe176edb23de1b414d60665927b9ca325eaf6e7ee519143fac05e76f9c1ed", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "{\"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\"}}}\n" + "output": "{\"PLAN_SHA256\":\"42bf4e33ea018e163d2f775057c4ab173c3f0a20bc7ef5423c723b2ec48ce40a\",\"anti_regression_tests\":{\"AR-001-LEGACY-WRAPPER-FLAG-CANNOT-OVERRIDE-EXACT-BLOCKED-PAYLOAD-OUTCOME\":true,\"AR-002-ADAPTER-PREEXECUTION-FAILURE-WITH-NO-MUTATION-CALLS-IS-CLOSED\":true,\"AR-003-INTERRUPTED-APPLY-IS-CLOSED-ONLY-BY-EXACT-SUCCESSFUL-SAME-PLAN-SUCCESSOR\":true,\"AR-004-HISTORICAL-STATE-FILES-ARE-IMMUTABLE\":true,\"AR-005-ZERO-CONFIG-PROCESS-FD-REFERENCES-BEFORE-REMOVE\":true,\"AR-006-EXACTLY-ONE-DISTINCT-RUNNER-AFTER-APPLY\":true,\"AR-007-DIAGNOSTICS-PRECEDE-ROLLBACK\":true,\"AR-008-APPLY-MUST-BIND-THIS-EXACT-PLAN-SHA256\":true},\"apply_steps\":[\"Repeat every source lock, service, self-test, reference, FD, runner inventory and historical closure precondition.\",\"Create one command-specific rollback directory under /var/lib/homelab-change-rollback with mode 0700.\",\"Copy only homelab-chat-run-linked into that rollback directory with mode 0600; verify byte-for-byte SHA-256 and fsync.\",\"Capture diagnostics immediately before the mutation.\",\"Remove only /usr/local/sbin/homelab-chat-run-linked and fsync /usr/local/sbin.\",\"Verify the linked path is absent, the canonical runner is byte-identical, exactly one distinct runner remains, all services and self-tests remain healthy, and the historical closure classifier still passes.\",\"If any postcondition fails, capture diagnostics before rollback, restore the exact rollback copy atomically, fsync, and verify the original SHA/mode/uid/gid.\"],\"canonical_runner_lock\":{\"must_remain_gid\":0,\"must_remain_mode\":\"0750\",\"must_remain_uid\":0,\"path\":\"/usr/local/sbin/homelab-chat-run\",\"sha256\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\"},\"changes_made\":false,\"forbidden_actions\":[\"Do not modify backup.\",\"Do not modify historical Adapter state files.\",\"Do not modify the canonical runner.\",\"Do not create a second runner.\",\"Do not restart or reload Portal, Adapter or Lookup.\",\"Do not modify Portal, Adapter, Lookup, systemd units, Gitea or cluster configuration.\"],\"historical_state_policy\":{\"classifications\":{\"MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090755Z\":\"CLOSED_SUPERSEDED_BY_SUCCESSFUL_SAME_PLAN_AND_CURRENT_SOURCE_LOCKS\",\"RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z\":\"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG\",\"RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z\":\"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG\",\"RUNNER-MUTATION-CONTRACT-ACCEPTANCE-FIX-20260726T210744Z\":\"CLOSED_ADAPTER_PREEXECUTION_INTEGRITY_FAILURE_PAYLOAD_NOT_RUN_AND_PAYLOAD_HAS_NO_MUTATION_CALLS\"},\"do_not_edit_historical_state_files\":true},\"kind\":\"homelab-change-plan\",\"linked_preconditions\":{\"active_config_references\":0,\"active_process_references\":0,\"gid\":0,\"mode\":\"0755\",\"open_fd_references\":0,\"path\":\"/usr/local/sbin/homelab-chat-run-linked\",\"sha256\":\"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1\",\"size\":1901,\"uid\":0},\"objective\":\"Remove only the unused distinct executable /usr/local/sbin/homelab-chat-run-linked and preserve the canonical runner unchanged.\",\"observed_preconditions\":{\"checks\":{\"adapter_self_test\":true,\"adapter_service_healthy\":true,\"all_four_historical_mutations_closed_by_exact_evidence\":true,\"linked_exact_metadata\":true,\"linked_zero_active_config_references\":true,\"linked_zero_live_process_references\":true,\"linked_zero_open_fd_references\":true,\"lookup_local_health\":true,\"lookup_service_healthy\":true,\"portal_local_health\":true,\"portal_self_test_real_identity\":true,\"portal_service_healthy\":true,\"preapply_exactly_two_distinct_runner_files\":true,\"source_lock:/etc/systemd/system/homelab-command-adapter.service\":true,\"source_lock:/etc/systemd/system/homelab-command-portal.service\":true,\"source_lock:/etc/systemd/system/homelab-result-lookup.service\":true,\"source_lock:/usr/local/sbin/homelab-chat-run\":true,\"source_lock:/usr/local/sbin/homelab-chat-run-linked\":true,\"source_lock:/usr/local/sbin/homelab-command-adapter\":true,\"source_lock:/usr/local/sbin/homelab-command-portal\":true,\"source_lock:/usr/local/sbin/homelab-result-lookup\":true,\"target_is_pve01\":true,\"uid_is_root\":true},\"historical_classifications\":{\"MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090755Z\":\"CLOSED_SUPERSEDED_BY_SUCCESSFUL_SAME_PLAN_AND_CURRENT_SOURCE_LOCKS\",\"RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z\":\"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG\",\"RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z\":\"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG\",\"RUNNER-MUTATION-CONTRACT-ACCEPTANCE-FIX-20260726T210744Z\":\"CLOSED_ADAPTER_PREEXECUTION_INTEGRITY_FAILURE_PAYLOAD_NOT_RUN_AND_PAYLOAD_HAS_NO_MUTATION_CALLS\"},\"runner_inventory\":{\"distinct_count\":2,\"entries\":[{\"device\":64513,\"gid\":0,\"inode\":5148538,\"mode\":\"0750\",\"path\":\"/usr/local/sbin/homelab-chat-run\",\"resolved\":\"/usr/local/sbin/homelab-chat-run\",\"sha256\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\",\"uid\":0},{\"device\":64513,\"gid\":0,\"inode\":5148536,\"mode\":\"0755\",\"path\":\"/usr/local/sbin/homelab-chat-run-linked\",\"resolved\":\"/usr/local/sbin/homelab-chat-run-linked\",\"sha256\":\"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1\",\"uid\":0}]}},\"plan_hash_definition\":\"SHA256 of UTF-8 canonical JSON of this plan without PLAN_SHA256 and plan_hash_definition, sort_keys=true, separators=(',', ':'), followed by one LF.\",\"plan_id\":\"RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z\",\"read_only\":true,\"rollback_contract\":{\"available\":true,\"diagnostics_before_rollback\":true,\"restore_exact_sha256\":\"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1\",\"restore_gid\":0,\"restore_mode\":\"0755\",\"restore_uid\":0,\"trigger\":\"Any failed postcondition after linked runner removal.\"},\"rollback_started\":false,\"schema\":1,\"scope\":{\"backup\":false,\"cluster\":false,\"gitea\":false,\"production\":true},\"source_locks\":{\"/etc/systemd/system/homelab-command-adapter.service\":\"74d0f37878652ed9d46b53ae8556bbb30ebd683741f293c3f59b3527876ed2d7\",\"/etc/systemd/system/homelab-command-portal.service\":\"8453eab30f5c3ccd285fc9f70fff18f564809bb27f7bf84f51f2ba593aa85263\",\"/etc/systemd/system/homelab-result-lookup.service\":\"4bcc607fd457313f75373ec3d8ec20e7020f13c7cb8a9523fd988a24b0f6609d\",\"/usr/local/sbin/homelab-chat-run\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\",\"/usr/local/sbin/homelab-chat-run-linked\":\"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1\",\"/usr/local/sbin/homelab-command-adapter\":\"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d\",\"/usr/local/sbin/homelab-command-portal\":\"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52\",\"/usr/local/sbin/homelab-result-lookup\":\"17f8d2a2ea219cdc02b0f8e821f8054b05c01de1253419b3d23349a2d383889c\"},\"status\":\"PLAN_READY\",\"target\":\"pve01\"}\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index b691bca..c97306a 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,15 +1,15 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=HOMELAB-MUTATION-CLOSURE-FORENSIC-FIX2-20260727T164022Z +COMMAND_ID=RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z STATUS=OK RC=0 HOST=pve01 MODE=verify -COMPONENT=mutation-closure-forensic +COMPONENT=runner-linked-removal-plan REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83 -COMMAND_SHA256=886574cbeb287526a708cd96da96c9eec91136dd4a11492efad91343bd68f1ea +COMMAND_SHA256=96196bd9215a78fb99233ff2583c4b79224ee6b6d4d44ed379c0fbe6f2f6934a DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true CHANGE_DECLARED=false @@ -24,10 +24,10 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=44df2f482dc40d2f26af8b8192b29186e46a9e099537792292b2928ea234fd4a -SANITIZED_OUTPUT_SHA256=44df2f482dc40d2f26af8b8192b29186e46a9e099537792292b2928ea234fd4a +RAW_EVIDENCE_SHA256=14fbe176edb23de1b414d60665927b9ca325eaf6e7ee519143fac05e76f9c1ed +SANITIZED_OUTPUT_SHA256=14fbe176edb23de1b414d60665927b9ca325eaf6e7ee519143fac05e76f9c1ed 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"}}} +{"PLAN_SHA256":"42bf4e33ea018e163d2f775057c4ab173c3f0a20bc7ef5423c723b2ec48ce40a","anti_regression_tests":{"AR-001-LEGACY-WRAPPER-FLAG-CANNOT-OVERRIDE-EXACT-BLOCKED-PAYLOAD-OUTCOME":true,"AR-002-ADAPTER-PREEXECUTION-FAILURE-WITH-NO-MUTATION-CALLS-IS-CLOSED":true,"AR-003-INTERRUPTED-APPLY-IS-CLOSED-ONLY-BY-EXACT-SUCCESSFUL-SAME-PLAN-SUCCESSOR":true,"AR-004-HISTORICAL-STATE-FILES-ARE-IMMUTABLE":true,"AR-005-ZERO-CONFIG-PROCESS-FD-REFERENCES-BEFORE-REMOVE":true,"AR-006-EXACTLY-ONE-DISTINCT-RUNNER-AFTER-APPLY":true,"AR-007-DIAGNOSTICS-PRECEDE-ROLLBACK":true,"AR-008-APPLY-MUST-BIND-THIS-EXACT-PLAN-SHA256":true},"apply_steps":["Repeat every source lock, service, self-test, reference, FD, runner inventory and historical closure precondition.","Create one command-specific rollback directory under /var/lib/homelab-change-rollback with mode 0700.","Copy only homelab-chat-run-linked into that rollback directory with mode 0600; verify byte-for-byte SHA-256 and fsync.","Capture diagnostics immediately before the mutation.","Remove only /usr/local/sbin/homelab-chat-run-linked and fsync /usr/local/sbin.","Verify the linked path is absent, the canonical runner is byte-identical, exactly one distinct runner remains, all services and self-tests remain healthy, and the historical closure classifier still passes.","If any postcondition fails, capture diagnostics before rollback, restore the exact rollback copy atomically, fsync, and verify the original SHA/mode/uid/gid."],"canonical_runner_lock":{"must_remain_gid":0,"must_remain_mode":"0750","must_remain_uid":0,"path":"/usr/local/sbin/homelab-chat-run","sha256":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d"},"changes_made":false,"forbidden_actions":["Do not modify backup.","Do not modify historical Adapter state files.","Do not modify the canonical runner.","Do not create a second runner.","Do not restart or reload Portal, Adapter or Lookup.","Do not modify Portal, Adapter, Lookup, systemd units, Gitea or cluster configuration."],"historical_state_policy":{"classifications":{"MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090755Z":"CLOSED_SUPERSEDED_BY_SUCCESSFUL_SAME_PLAN_AND_CURRENT_SOURCE_LOCKS","RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z":"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG","RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z":"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG","RUNNER-MUTATION-CONTRACT-ACCEPTANCE-FIX-20260726T210744Z":"CLOSED_ADAPTER_PREEXECUTION_INTEGRITY_FAILURE_PAYLOAD_NOT_RUN_AND_PAYLOAD_HAS_NO_MUTATION_CALLS"},"do_not_edit_historical_state_files":true},"kind":"homelab-change-plan","linked_preconditions":{"active_config_references":0,"active_process_references":0,"gid":0,"mode":"0755","open_fd_references":0,"path":"/usr/local/sbin/homelab-chat-run-linked","sha256":"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","size":1901,"uid":0},"objective":"Remove only the unused distinct executable /usr/local/sbin/homelab-chat-run-linked and preserve the canonical runner unchanged.","observed_preconditions":{"checks":{"adapter_self_test":true,"adapter_service_healthy":true,"all_four_historical_mutations_closed_by_exact_evidence":true,"linked_exact_metadata":true,"linked_zero_active_config_references":true,"linked_zero_live_process_references":true,"linked_zero_open_fd_references":true,"lookup_local_health":true,"lookup_service_healthy":true,"portal_local_health":true,"portal_self_test_real_identity":true,"portal_service_healthy":true,"preapply_exactly_two_distinct_runner_files":true,"source_lock:/etc/systemd/system/homelab-command-adapter.service":true,"source_lock:/etc/systemd/system/homelab-command-portal.service":true,"source_lock:/etc/systemd/system/homelab-result-lookup.service":true,"source_lock:/usr/local/sbin/homelab-chat-run":true,"source_lock:/usr/local/sbin/homelab-chat-run-linked":true,"source_lock:/usr/local/sbin/homelab-command-adapter":true,"source_lock:/usr/local/sbin/homelab-command-portal":true,"source_lock:/usr/local/sbin/homelab-result-lookup":true,"target_is_pve01":true,"uid_is_root":true},"historical_classifications":{"MINIMAL-RESULT-FEED-EMERGENCY-APPLY-20260727T090755Z":"CLOSED_SUPERSEDED_BY_SUCCESSFUL_SAME_PLAN_AND_CURRENT_SOURCE_LOCKS","RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z":"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG","RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z":"CLOSED_BLOCKED_PRECONDITION_NO_MUTATION_PAYLOAD_OUTCOME_OVERRIDES_LEGACY_WRAPPER_FLAG","RUNNER-MUTATION-CONTRACT-ACCEPTANCE-FIX-20260726T210744Z":"CLOSED_ADAPTER_PREEXECUTION_INTEGRITY_FAILURE_PAYLOAD_NOT_RUN_AND_PAYLOAD_HAS_NO_MUTATION_CALLS"},"runner_inventory":{"distinct_count":2,"entries":[{"device":64513,"gid":0,"inode":5148538,"mode":"0750","path":"/usr/local/sbin/homelab-chat-run","resolved":"/usr/local/sbin/homelab-chat-run","sha256":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d","uid":0},{"device":64513,"gid":0,"inode":5148536,"mode":"0755","path":"/usr/local/sbin/homelab-chat-run-linked","resolved":"/usr/local/sbin/homelab-chat-run-linked","sha256":"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","uid":0}]}},"plan_hash_definition":"SHA256 of UTF-8 canonical JSON of this plan without PLAN_SHA256 and plan_hash_definition, sort_keys=true, separators=(',', ':'), followed by one LF.","plan_id":"RUNNER-LINKED-REMOVAL-CLOSURE-PLAN-FIX1-20260727T165053Z","read_only":true,"rollback_contract":{"available":true,"diagnostics_before_rollback":true,"restore_exact_sha256":"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","restore_gid":0,"restore_mode":"0755","restore_uid":0,"trigger":"Any failed postcondition after linked runner removal."},"rollback_started":false,"schema":1,"scope":{"backup":false,"cluster":false,"gitea":false,"production":true},"source_locks":{"/etc/systemd/system/homelab-command-adapter.service":"74d0f37878652ed9d46b53ae8556bbb30ebd683741f293c3f59b3527876ed2d7","/etc/systemd/system/homelab-command-portal.service":"8453eab30f5c3ccd285fc9f70fff18f564809bb27f7bf84f51f2ba593aa85263","/etc/systemd/system/homelab-result-lookup.service":"4bcc607fd457313f75373ec3d8ec20e7020f13c7cb8a9523fd988a24b0f6609d","/usr/local/sbin/homelab-chat-run":"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d","/usr/local/sbin/homelab-chat-run-linked":"5e8725e129fd2055b36fe2fae13fc95fc4b3271074a0e0d4bb7347e7b2f270a1","/usr/local/sbin/homelab-command-adapter":"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d","/usr/local/sbin/homelab-command-portal":"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52","/usr/local/sbin/homelab-result-lookup":"17f8d2a2ea219cdc02b0f8e821f8054b05c01de1253419b3d23349a2d383889c"},"status":"PLAN_READY","target":"pve01"} OUTPUT_END CHAT_OUTPUT_END