{ "schema_version": 1, "channel": "homelab-runtime", "command_id": "RUNNER-MUTATION-CONTRACT-PLAN-20260726T204219Z", "status": "OK", "rc": 0, "host": "pve01", "mode": "verify", "component": "runner", "started_at_utc": "2026-07-26T20:50:10Z", "finished_at_utc": "2026-07-26T20:50:10Z", "reference_register_checked": true, "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e", "error_register_checked": true, "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83", "command_sha256": "18ca7f1fb586bea8de09771fb8a2620d7c1e624494878d745b07a897fb6cb780", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, "changes_made": false, "sanitized": true, "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, "raw_evidence_sha256": "65beaf599a688212c2299703e01dab946a652f2837f41a98f983eee7fadf9909", "sanitized_output_sha256": "65beaf599a688212c2299703e01dab946a652f2837f41a98f983eee7fadf9909", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", "output": "{\"PLAN_SHA256\":\"22eedf9b1090960a7f92cef992f481d8d6cc3f42e4f4ecd6e27bbda4ebf752bd\",\"changes_made\":false,\"command_id\":\"RUNNER-MUTATION-CONTRACT-PLAN-20260726T204219Z\",\"diff\":{\"additions\":285,\"deletions\":8,\"diff_sha256\":\"6ce1b41ad8de334ca804bccee03cae25ca600364473eee1677afde818cfcc192\",\"hunks\":8},\"mutating_states\":{\"closed\":[\"RUNNER-LINKED-REMOVAL-APPLY-20260726T202107Z\",\"RUNNER-LINKED-REMOVAL-APPLY-FINAL-20260726T202825Z\"],\"unresolved\":[]},\"plan\":{\"anti_regression\":[\"mode=change больше не означает changes_made=true\",\"повтор заблокированной команды считается NO_MUTATION\",\"несовпадающий command_id контракта блокируется\",\"несколько контрактов блокируются\",\"отсутствующий контракт блокируется с UNKNOWN\"],\"file\":\"/usr/local/sbin/homelab-chat-run\",\"next\":\"после APPLY обновить Adapter META/state, затем закрыть старые precondition-only записи\",\"operation\":\"УСТАНОВИТЬ_КОНТРАКТ_ФАКТИЧЕСКОЙ_МУТАЦИИ_RUNNER\",\"postconditions\":[\"target SHA совпадает\",\"bash -n проходит\",\"--self-test проходит\",\"verify/read-only всегда changes_made=false\",\"BLOCKED change с контрактом даёт changes_made=false\",\"change без контракта даёт changes_made=null и FAIL\",\"успешная мутация даёт changes_made=true\",\"успешный rollback даёт mutation_outcome=ROLLED_BACK\",\"Adapter и Portal не перезапускаются\"],\"preconditions\":{\"adapter_self_test\":true,\"adapter_здоров\":true,\"portal_identity_self_test\":true,\"portal_здоров\":true,\"известные_старые_попытки_закрыты\":true,\"нет_других_mutating_failure\":true,\"текущая_capsule_корректна\":true,\"точный_source_lock\":true},\"risk\":\"REVERSIBLE\",\"rollback\":{\"atomic_restore\":true,\"copy_before_apply\":true,\"copy_mode\":\"0600\",\"diagnostics_before_rollback\":true,\"verify_sha256\":\"2a88defef9517f89bc60934dce82097f8e316b08af9417e95167ea5d759a10d9\"},\"schema\":1,\"scope\":{\"backup_changed\":false,\"cluster_changed\":false,\"gitea_changed\":false,\"modify\":[\"/usr/local/sbin/homelab-chat-run\"],\"preserve\":[\"/usr/local/sbin/homelab-command-adapter\",\"/usr/local/sbin/homelab-command-portal\",\"/usr/local/sbin/homelab-chat-run-linked\"],\"service_restart\":false},\"source_evidence\":[\"d33b0cb4f775fb6bfb57d7681273a2ae9b3e884088ae794f1c152797cd03f6dd\",\"98474ad0c0c5ab2b6507c2469ea804b3c771f8a8f71c23a8238fd64ae1fe989d\"],\"source_sha256\":\"2a88defef9517f89bc60934dce82097f8e316b08af9417e95167ea5d759a10d9\",\"target\":\"pve01\",\"target_sha256\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\"},\"rollback_started\":false,\"source_sha256\":\"2a88defef9517f89bc60934dce82097f8e316b08af9417e95167ea5d759a10d9\",\"static_tests\":{\"bash_syntax\":true,\"marker_контракта\":true,\"preexecution_block_no_mutation\":true,\"runner_self_test\":true,\"target_sha_отличается\":true,\"unknown_fail_closed\":true,\"нет_mode_change_equals_changed\":true},\"status\":\"PASS\",\"target_sha256\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\"}\n" }