diff --git a/runtime/history/HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z.json b/runtime/history/HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z.json new file mode 100644 index 0000000..b73e7dc --- /dev/null +++ b/runtime/history/HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "verify", + "component": "skladchik-handoff-patch-context-ro-v2", + "started_at_utc": "2026-08-05T13:23:53Z", + "finished_at_utc": "2026-08-05T13:23:53Z", + "reference_register_checked": true, + "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e", + "error_register_checked": true, + "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83", + "command_sha256": "bdbee9327f44bfcf4da9c41496257b1a350c1792ec5f354159da6621124d7f6d", + "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": "645b443333752ee2a7900290eb7a21e410acefb1a4ed929a99c139da80dd1719", + "sanitized_output_sha256": "645b443333752ee2a7900290eb7a21e410acefb1a4ed929a99c139da80dd1719", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "HOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z\",\"command_rc\":0,\"mutation_outcome\":\"NO_MUTATION\",\"output_truncated_in_json\":false,\"rc\":0,\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n{\"active_files\":[{\"anchors\":[{\"line\":427,\"segment_sha256\":\"ba2a9f580ceb6219636a3c6a9c8e21ef038cb66dff11b5482b985947b12905bc\",\"text\":\"1 <= len(argv) <= 128\"},{\"line\":499,\"segment_sha256\":\"8bd3e09d95d346415baa0597f44086071f2798ede0476c1adfad1f3b215c8e78\",\"text\":\"len(payload) > 32\"},{\"line\":536,\"segment_sha256\":\"65bfbef8abd20d6fb32a7594441e172311729afb83b74c9a0fe65938127f7b6d\",\"text\":\"relative in payload_paths\"},{\"line\":565,\"segment_sha256\":\"46eb980bc24c778b9d23e7d87fd5be7a19fa5efb58701ee8cd9608f85b527888\",\"text\":\"total_payload > MAX_PAYLOAD_BYTES\"},{\"line\":602,\"segment_sha256\":\"15f5757fe00d2ce1ed6dda00fe692e7710cb4693f7228fb6de4bec9e5d7127b1\",\"text\":\"relative not in payload_paths\"},{\"line\":1745,\"segment_sha256\":\"191286074b0b5feeb625b5ce92a9677a514dec1fcf9e169ed3968a79517be462\",\"text\":\"runner_document.get(\\\"secrets_included\\\") is not False\"},{\"line\":1756,\"segment_sha256\":\"718c072975da02520b0011252316d9df080b88caa3ef021bad21aafd36c22597\",\"text\":\"key != \\\"argv\\\"\"},{\"line\":2891,\"segment_sha256\":\"874df6b19b74e478b27c859c5194626606613ff18b886fade606d5ba701d6de2\",\"text\":\"(\\n Path(directory) / \\\"payload\\\" / \\\"main.py\\\"\\n ).read_bytes() == payload_content\"}],\"basename\":\"homelab-command-adapter\",\"bytes\":86019,\"functions\":[{\"args\":[\"args\"],\"end\":673,\"header\":\"def run_command(\\n args: list[str],\",\"hotspot\":[{\"end\":668,\"original_sha256\":\"8d44e4eb6b769400040df651f85468ce2751903e298a7b917d0da7720d99877e\",\"start\":665,\"text\":\"665: args,\\n666: stdin=subprocess.DEVNULL,\\n667: stdout=subprocess.PIPE,\\n668: stderr=subprocess.PIPE,\"}],\"keyword_line_count\":5,\"name\":\"run_command\",\"segment_sha256\":\"ae477f09ebbf0c4b47b2def5d2e409b7a751ff9fdf5243f102c9449b4f2a26e9\",\"start\":658},{\"args\":[\"state\"],\"end\":1592,\"header\":\"def sanitize_state(state: dict[str, Any]) -> dict[str, Any]:\\n execution = state.get(\\\"execution\\\")\",\"hotspot\":[{\"end\":1568,\"original_sha256\":\"7c8ebb2ae104e19372bb498b12ef7405e9fd150a596324a214215b4dc8b13959\",\"start\":1565,\"text\":\"1565:\\n1566: evidence = state.get(\\\"evidence\\\")\\n1567: public_evidence = None\\n1568: if isinstance(evidence, dict):\"}],\"keyword_line_count\":5,\"name\":\"sanitize_state\",\"segment_sha256\":\"175e0927b3285f609b85baca34569d3a6c932cfefaa59358dcf45e3a06702ac3\",\"start\":1547},{\"args\":[\"argv\",\"payload_root\"],\"end\":1692,\"header\":\"def substitute_argv(\\n argv: list[str],\",\"hotspot\":[{\"end\":1685,\"original_sha256\":\"83a21c644a9a2942305c2d619e2225be2798ae3f0cb09f1ff49de00c636d7ff1\",\"start\":1682,\"text\":\"1682: raise AdapterError(\\n1683: \\\"payload argv escapes root\\\"\\n1684: ) from exc\\n1685: if not target.is_file() or target.is_symlink():\"}],\"keyword_line_count\":6,\"name\":\"substitute_argv\",\"segment_sha256\":\"e8ba20cbb06e9edbf9c5c450b96698680d515fc4d560889919388697f03b69a5\",\"start\":1670},{\"args\":[\"args\"],\"end\":2102,\"header\":\"def run_existing_runner(\\n args: list[str],\",\"hotspot\":[{\"end\":2058,\"original_sha256\":\"72447a50c01a068395785579cdd058a5630ed22e8f7e73851066981064ca7a04\",\"start\":2055,\"text\":\"2055:) -> subprocess.CompletedProcess[str]:\\n2056: process = subprocess.Popen(\\n2057: args,\\n2058: stdin=subprocess.DEVNULL,\"}],\"keyword_line_count\":8,\"name\":\"run_existing_runner\",\"segment_sha256\":\"485d5c01da41e1e871a9eeadde83cb97a3962adcf6ac4fee8fa74b945f338739\",\"start\":2049},{\"args\":[\"request\"],\"end\":2745,\"header\":\"def dispatch(request: dict[str, Any]) -> dict[str, Any]:\\n operation = request.get(\\\"op\\\")\",\"hotspot\":[{\"end\":2641,\"original_sha256\":\"63ea5ee14fcb5cf84b7f3921b8780888eafc16d31f6e2981e7e55c987219cba6\",\"start\":2638,\"text\":\"2638:\\n2639:def dispatch(request: dict[str, Any]) -> dict[str, Any]:\\n2640: operation = request.get(\\\"op\\\")\\n2641: if operation == \\\"health\\\":\"}],\"keyword_line_count\":23,\"name\":\"dispatch\",\"segment_sha256\":\"3e4fc40ccc43328184094336f2fbe3604cd4e1be4a2cd057dae52b8369ae5bfe\",\"start\":2639},{\"args\":[\"self\"],\"end\":2790,\"header\":\" def handle(self) -> None:\\n credentials = self.request.getsockopt(\",\"hotspot\":[{\"end\":2774,\"original_sha256\":\"09e4d28ded165a82f3fcdcf09253762a4e59749f0503489bf41099a59570ff04\",\"start\":2771,\"text\":\"2771: try:\\n2772: request = json.loads(raw)\\n2773: if not isinstance(request, dict):\\n2774: raise AdapterError(\\\"request not object\\\")\"}],\"keyword_line_count\":8,\"name\":\"handle\",\"segment_sha256\":\"794078bbd307f80c2f6640b374565fa119f03dabd1ba36a9c4d47d9b2d8865c6\",\"start\":2749}],\"mode\":\"0o755\",\"process_sites\":[{\"call\":\"stream.read\",\"keywords\":[],\"line\":197,\"segment_sha256\":\"b132f27ce56f994d404626d8bcf725db9bd3a7476b7d532089ce2a297eb1e355\",\"text\":\"stream.read(1024 * 1024)\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"indent\",\"sort_keys\"],\"line\":204,\"segment_sha256\":\"ee60c2fbdc8f97eff20f4ac617180559018ab7343898037639e94dcff31f7882\",\"text\":\"json.dumps(\\n value,\\n ensure_ascii=False,\\n indent=2,\\n sort_keys=True,\\n )\"},{\"call\":\"json.loads\",\"keywords\":[],\"line\":245,\"segment_sha256\":\"6a36fbe7611c83cf1f9a144d11feb88410bbc002bb2aeeffc19cd9b97fdab2b4\",\"text\":\"json.loads(raw)\"},{\"call\":\"json.loads\",\"keywords\":[\"object_pairs_hook\"],\"line\":288,\"segment_sha256\":\"bf67e3bbc5d4ac5ab0d15340108bb5410b74494961d88fa35c556acbf64afbd4\",\"text\":\"json.loads(\\n raw.decode(\\\"utf-8\\\"),\\n object_pairs_hook=no_duplicates,\\n )\"},{\"call\":\"subprocess.run\",\"keywords\":[\"check\",\"env\",\"stderr\",\"stdin\",\"stdout\",\"text\",\"timeout\"],\"line\":664,\"segment_sha256\":\"fbe36f5d1ed7b23d545f105135de2993138aa4a8dafc9f5419d7c37b36deebae\",\"text\":\"subprocess.run(\\n args,\\n stdin=subprocess.DEVNULL,\\n stdout=subprocess.PIPE,\\n stderr=subprocess.PIPE,\\n text=True,\\n check=False,\\n timeout=timeout,\\n env=(SAFE_ENV if env is None else env),\\n )\"},{\"call\":\"json.loads\",\"keywords\":[],\"line\":706,\"segment_sha256\":\"49c73d21d24e89e31f7701c67025900b8b000fbdde1520e1ce4bbc04d0a543c4\",\"text\":\"json.loads(result.stdout)\"},{\"call\":\"os.read\",\"keywords\":[],\"line\":1053,\"segment_sha256\":\"69a810c779430086a44faf90bb2d5d4bbebbe3ba7a85dd8c3148ad4f9112eda4\",\"text\":\"os.read(fd, min(1024 * 1024, remaining))\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"separators\",\"sort_keys\"],\"line\":1517,\"segment_sha256\":\"8623f260b2f2a1eaf0e8be9c2d4e8370e8567247e20f5e53556b7ac266f75403\",\"text\":\"json.dumps(\\n items,\\n ensure_ascii=False,\\n sort_keys=True,\\n separators=(\\\",\\\", \\\":\\\"),\\n )\"},{\"call\":\"subprocess.Popen\",\"keywords\":[\"close_fds\",\"env\",\"start_new_session\",\"stderr\",\"stdin\",\"stdout\"],\"line\":1626,\"segment_sha256\":\"90bb736720d2877f6704459828dc5551619ba00834a4660e9ed9c7f86e05b8c6\",\"text\":\"subprocess.Popen(\\n [\\n sys.executable,\\n \\\"-B\\\",\\n str(Path(__file__).resolve()),\\n \\\"--worker\\\",\\n short_id,\\n ],\\n \"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"separators\"],\"line\":1758,\"segment_sha256\":\"68a59ab16988992d8cb583f19eee1b55a7f8dc45e355d3655b47d522968e335e\",\"text\":\"json.dumps(\\n state[\\\"manifest\\\"][\\\"argv\\\"],\\n separators=(\\\",\\\", \\\":\\\"),\\n ensure_ascii=False,\\n )\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"indent\",\"sort_keys\"],\"line\":1778,\"segment_sha256\":\"d31eb8080be3fc4f69b562e41f97dd655755ae2cdf26f99434c4521f86b0547c\",\"text\":\"json.dumps(\\n capsule_summary,\\n ensure_ascii=False,\\n indent=2,\\n sort_keys=True,\\n )\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"indent\",\"sort_keys\"],\"line\":1822,\"segment_sha256\":\"e8af89f3e8da544b76204b745215223c8d2381300b60dc0c5e1baf6a4096ffdd\",\"text\":\"json.dumps(\\n meta,\\n ensure_ascii=False,\\n indent=2,\\n sort_keys=True,\\n )\"}],\"schema_fields\":[\"argv\",\"content_b64\",\"mode\",\"payload\",\"risk\"],\"sha256\":\"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d\"},{\"anchors\":[{\"line\":596,\"segment_sha256\":\"bea803e2bf945e9c5008a239e11936ecdbd8475018029010553aae5d638af370\",\"text\":\"path == \\\"/bridge/bridge.cmd\\\"\"},{\"line\":791,\"segment_sha256\":\"528504d107f4e3a9c88fb94943e594ed199c19d14b7398d0499ed62a41c176f9\",\"text\":\"path == \\\"/api/import\\\"\"}],\"basename\":\"homelab-command-portal\",\"bytes\":39936,\"functions\":[{\"args\":[\"request\"],\"end\":91,\"header\":\"def adapter_call(request: dict[str, Any]) -> dict[str, Any]:\\n encoded = (\",\"hotspot\":[{\"end\":46,\"original_sha256\":\"0810613963b5a41789eb5ecf131bf80b45e647dded9b35c5e68d4b9292f8a223\",\"start\":43,\"text\":\"43:\\n44:def adapter_call(request: dict[str, Any]) -> dict[str, Any]:\\n45: encoded = (\\n46: json.dumps(\"}],\"keyword_line_count\":7,\"name\":\"adapter_call\",\"segment_sha256\":\"1d4f3585656373b842054a15f1b11fb43cf9feab695b82df3ea8f5e8a693030a\",\"start\":44},{\"args\":[\"self\",\"status\",\"content_type\",\"body\"],\"end\":504,\"header\":\" def reply(\\n self,\",\"hotspot\":[{\"end\":477,\"original_sha256\":\"aaa0d62cf14511be6509347c1614c7f23cfcf9714885cb1464f9fb9d8961005b\",\"start\":474,\"text\":\"474: content_type: str,\\n475: body: bytes,\\n476: *,\\n477: headers: dict[str, str] | None = None,\"}],\"keyword_line_count\":4,\"name\":\"reply\",\"segment_sha256\":\"0be03d4b20f918f84107b98285a7d9bc750fcb4c717453a041a46ad7271bec53\",\"start\":471},{\"args\":[\"self\"],\"end\":764,\"header\":\" def do_GET(self) -> None:\\n try:\",\"hotspot\":[{\"end\":688,\"original_sha256\":\"dfa2bbf4800083be58a8dfb63301a47bcc206c21d4d158922ec232412fa4a17c\",\"start\":685,\"text\":\"685: f\\\"/r/{short_id}\\\",\\n686: headers={\\\"Set-Cookie\\\": cookie},\\n687: )\\n688: return\"}],\"keyword_line_count\":15,\"name\":\"do_GET\",\"segment_sha256\":\"e49c3c1e64918367b3f4c1d7404beed09ac2fe19b3be22c59b59e3f8c2d52881\",\"start\":553},{\"args\":[\"self\"],\"end\":907,\"header\":\" def do_POST(self) -> None:\\n try:\",\"hotspot\":[{\"end\":774,\"original_sha256\":\"9d3ee7b22c1c1a4de2f9220e8211c79b320c1f378da508e9408877a6ca0349d5\",\"start\":771,\"text\":\"771: if path == \\\"/api/enroll\\\":\\n772: body = self.read_body(512).decode(\\n773: \\\"ascii\\\",\\n774: errors=\\\"strict\\\",\"}],\"keyword_line_count\":14,\"name\":\"do_POST\",\"segment_sha256\":\"6c3b664bc61fb4bc506662a1711d99017254441864528c27da5db76254864694\",\"start\":766},{\"args\":[\"request\"],\"end\":1045,\"header\":\" def fake_adapter_call(request: dict[str, Any]) -> dict[str, Any]:\\n attempts[\\\"count\\\"] += 1\",\"hotspot\":[{\"end\":1043,\"original_sha256\":\"cfdde978ab18d008414db8e692c50d3de47ac561eadbc2d7deb81a5a1b17f669\",\"start\":1040,\"text\":\"1040:\\n1041: def fake_adapter_call(request: dict[str, Any]) -> dict[str, Any]:\\n1042: attempts[\\\"count\\\"] += 1\\n1043: if attempts[\\\"count\\\"] < 3:\"}],\"keyword_line_count\":1,\"name\":\"fake_adapter_call\",\"segment_sha256\":\"ce0cd75c856eb06926ff96b1c3d65c0ef72b6f409b5831122724d22a951fef97\",\"start\":1041}],\"mode\":\"0o755\",\"process_sites\":[{\"call\":\"json.dumps\",\"keywords\":[\"separators\",\"sort_keys\"],\"line\":46,\"segment_sha256\":\"d2796347998c58685d8dfd45d5df5fe51509645aba7a264e7dc25cb1f352c982\",\"text\":\"json.dumps(\\n request,\\n separators=(\\\",\\\", \\\":\\\"),\\n sort_keys=True,\\n )\"},{\"call\":\"json.loads\",\"keywords\":[],\"line\":81,\"segment_sha256\":\"6a36fbe7611c83cf1f9a144d11feb88410bbc002bb2aeeffc19cd9b97fdab2b4\",\"text\":\"json.loads(raw)\"},{\"call\":\"json.dumps\",\"keywords\":[\"separators\",\"sort_keys\"],\"line\":113,\"segment_sha256\":\"e2fb745bae0108aba634dcdc658da4a7423b1439f0ea5f9c725fb8338e962574\",\"text\":\"json.dumps(\\n result,\\n separators=(\\\",\\\", \\\":\\\"),\\n sort_keys=True,\\n )\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"indent\"],\"line\":337,\"segment_sha256\":\"d6f51399c0a5250e2e7ce94f7692c5d23b32e73e2a40cfe39dfe708615296a95\",\"text\":\"json.dumps(\\n {\\n \\\"status\\\": status,\\n \\\"execution\\\": execution,\\n \\\"evidence\\\": evidence,\\n },\\n ensure_ascii=False,\\n indent=2,\\n )\"},{\"call\":\"self.rfile.read\",\"keywords\":[],\"line\":541,\"segment_sha256\":\"e88ccc84bddb9730bf85279cc75080f708954fea1522420d79deeef7f4d4022e\",\"text\":\"self.rfile.read(length)\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"separators\",\"sort_keys\"],\"line\":569,\"segment_sha256\":\"54d09d0aed4fa5af8f08233988dff5e409332754d7767eef48c0e09cad7482d3\",\"text\":\"json.dumps(\\n {\\n \\\"status\\\": \\\"ok\\\",\\n \\\"version\\\": 3,\\n \\\"adapter\\\": result[\\\"status\\\"],\\n \\\"result_sequence\\\": recent[\\n \"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"separators\",\"sort_keys\"],\"line\":745,\"segment_sha256\":\"c69d1ae04da0c2a85f4db115bb6aca05e6712ea223bec16c952e99dcc0df4f64\",\"text\":\"json.dumps(\\n state,\\n ensure_ascii=False,\\n separators=(\\\",\\\", \\\":\\\"),\\n sort_keys=True,\\n )\"}],\"schema_fields\":[\"Authorization\",\"Cookie\",\"risk\"],\"sha256\":\"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52\"}],\"analysis_ready\":true,\"changes_made\":false,\"command_id\":\"HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z\",\"command_rc\":0,\"mutation_outcome\":\"NO_MUTATION\",\"next_action\":\"BUILD_SHA_GUARDED_EPHEMERAL_SECRET_HANDOFF_TRANSACTION\",\"output_truncated_in_json\":false,\"projection\":{\"degraded\":false,\"safe_limit_bytes\":18000,\"strategy\":\"one_hotspot_per_target_function\"},\"rc\":0,\"read_only\":true,\"required_functions\":{\"adapter\":[\"run_command\",\"sanitize_state\",\"substitute_argv\"],\"portal\":[\"adapter_call\",\"do_POST\"]},\"rollback_restored\":null,\"rollback_started\":false,\"root_cause_classification\":\"SHA_GUARDED_COMPACT_PATCH_CONTEXT_CAPTURED\",\"schema\":1,\"status\":\"OK\",\"transaction_requirements\":{\"atomic_replace\":true,\"automatic_exact_rollback\":true,\"byte_for_byte_backup\":true,\"candidate_compile_and_selftest\":true,\"candidate_in_temporary_directory\":true,\"expected_sha_preconditions\":{\"homelab-command-adapter\":\"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d\",\"homelab-command-portal\":\"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52\"},\"read_exact_current_sources\":true,\"secret_never_in_capsule_argv_output_or_evidence\":true,\"service_health_verification\":true},\"units\":[{\"active_state\":\"active\",\"exec_basename\":\"homelab-command-adapter\",\"exec_path_sha256\":\"c2e3b43f1f858c6fa265dc276d6a6a29e0cd25e4a127fbc093b8c8d9512bb739\",\"fragment_path_sha256\":\"afe4d91c280ac4e6e9999498b5f5d8b8842a1f33e30fd45d984879a6392bc045\",\"sub_state\":\"running\",\"unit\":\"homelab-command-adapter.service\"},{\"active_state\":\"active\",\"exec_basename\":\"homelab-command-portal\",\"exec_path_sha256\":\"1132c3c355ed18cdc6406935cd26a128df298f71df7f48df690c72b202ddd7be\",\"fragment_path_sha256\":\"adf87b0f1c821b17e3e2ff19cc024d783b55caf69460d01fa66f7d2579a71f5a\",\"sub_state\":\"running\",\"unit\":\"homelab-command-portal.service\"}]}\n" +} diff --git a/runtime/history/HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z.txt b/runtime/history/HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z.txt new file mode 100644 index 0000000..aa16780 --- /dev/null +++ b/runtime/history/HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z.txt @@ -0,0 +1,34 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z +STATUS=OK +RC=0 +HOST=pve01 +MODE=verify +COMPONENT=skladchik-handoff-patch-context-ro-v2 +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83 +COMMAND_SHA256=bdbee9327f44bfcf4da9c41496257b1a350c1792ec5f354159da6621124d7f6d +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=645b443333752ee2a7900290eb7a21e410acefb1a4ed929a99c139da80dd1719 +SANITIZED_OUTPUT_SHA256=645b443333752ee2a7900290eb7a21e410acefb1a4ed929a99c139da80dd1719 +OUTPUT_BEGIN +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z","command_rc":0,"mutation_outcome":"NO_MUTATION","output_truncated_in_json":false,"rc":0,"rollback_restored":null,"rollback_started":false,"status":"OK","version":1} +{"active_files":[{"anchors":[{"line":427,"segment_sha256":"ba2a9f580ceb6219636a3c6a9c8e21ef038cb66dff11b5482b985947b12905bc","text":"1 <= len(argv) <= 128"},{"line":499,"segment_sha256":"8bd3e09d95d346415baa0597f44086071f2798ede0476c1adfad1f3b215c8e78","text":"len(payload) > 32"},{"line":536,"segment_sha256":"65bfbef8abd20d6fb32a7594441e172311729afb83b74c9a0fe65938127f7b6d","text":"relative in payload_paths"},{"line":565,"segment_sha256":"46eb980bc24c778b9d23e7d87fd5be7a19fa5efb58701ee8cd9608f85b527888","text":"total_payload > MAX_PAYLOAD_BYTES"},{"line":602,"segment_sha256":"15f5757fe00d2ce1ed6dda00fe692e7710cb4693f7228fb6de4bec9e5d7127b1","text":"relative not in payload_paths"},{"line":1745,"segment_sha256":"191286074b0b5feeb625b5ce92a9677a514dec1fcf9e169ed3968a79517be462","text":"runner_document.get(\"secrets_included\") is not False"},{"line":1756,"segment_sha256":"718c072975da02520b0011252316d9df080b88caa3ef021bad21aafd36c22597","text":"key != \"argv\""},{"line":2891,"segment_sha256":"874df6b19b74e478b27c859c5194626606613ff18b886fade606d5ba701d6de2","text":"(\n Path(directory) / \"payload\" / \"main.py\"\n ).read_bytes() == payload_content"}],"basename":"homelab-command-adapter","bytes":86019,"functions":[{"args":["args"],"end":673,"header":"def run_command(\n args: list[str],","hotspot":[{"end":668,"original_sha256":"8d44e4eb6b769400040df651f85468ce2751903e298a7b917d0da7720d99877e","start":665,"text":"665: args,\n666: stdin=subprocess.DEVNULL,\n667: stdout=subprocess.PIPE,\n668: stderr=subprocess.PIPE,"}],"keyword_line_count":5,"name":"run_command","segment_sha256":"ae477f09ebbf0c4b47b2def5d2e409b7a751ff9fdf5243f102c9449b4f2a26e9","start":658},{"args":["state"],"end":1592,"header":"def sanitize_state(state: dict[str, Any]) -> dict[str, Any]:\n execution = state.get(\"execution\")","hotspot":[{"end":1568,"original_sha256":"7c8ebb2ae104e19372bb498b12ef7405e9fd150a596324a214215b4dc8b13959","start":1565,"text":"1565:\n1566: evidence = state.get(\"evidence\")\n1567: public_evidence = None\n1568: if isinstance(evidence, dict):"}],"keyword_line_count":5,"name":"sanitize_state","segment_sha256":"175e0927b3285f609b85baca34569d3a6c932cfefaa59358dcf45e3a06702ac3","start":1547},{"args":["argv","payload_root"],"end":1692,"header":"def substitute_argv(\n argv: list[str],","hotspot":[{"end":1685,"original_sha256":"83a21c644a9a2942305c2d619e2225be2798ae3f0cb09f1ff49de00c636d7ff1","start":1682,"text":"1682: raise AdapterError(\n1683: \"payload argv escapes root\"\n1684: ) from exc\n1685: if not target.is_file() or target.is_symlink():"}],"keyword_line_count":6,"name":"substitute_argv","segment_sha256":"e8ba20cbb06e9edbf9c5c450b96698680d515fc4d560889919388697f03b69a5","start":1670},{"args":["args"],"end":2102,"header":"def run_existing_runner(\n args: list[str],","hotspot":[{"end":2058,"original_sha256":"72447a50c01a068395785579cdd058a5630ed22e8f7e73851066981064ca7a04","start":2055,"text":"2055:) -> subprocess.CompletedProcess[str]:\n2056: process = subprocess.Popen(\n2057: args,\n2058: stdin=subprocess.DEVNULL,"}],"keyword_line_count":8,"name":"run_existing_runner","segment_sha256":"485d5c01da41e1e871a9eeadde83cb97a3962adcf6ac4fee8fa74b945f338739","start":2049},{"args":["request"],"end":2745,"header":"def dispatch(request: dict[str, Any]) -> dict[str, Any]:\n operation = request.get(\"op\")","hotspot":[{"end":2641,"original_sha256":"63ea5ee14fcb5cf84b7f3921b8780888eafc16d31f6e2981e7e55c987219cba6","start":2638,"text":"2638:\n2639:def dispatch(request: dict[str, Any]) -> dict[str, Any]:\n2640: operation = request.get(\"op\")\n2641: if operation == \"health\":"}],"keyword_line_count":23,"name":"dispatch","segment_sha256":"3e4fc40ccc43328184094336f2fbe3604cd4e1be4a2cd057dae52b8369ae5bfe","start":2639},{"args":["self"],"end":2790,"header":" def handle(self) -> None:\n credentials = self.request.getsockopt(","hotspot":[{"end":2774,"original_sha256":"09e4d28ded165a82f3fcdcf09253762a4e59749f0503489bf41099a59570ff04","start":2771,"text":"2771: try:\n2772: request = json.loads(raw)\n2773: if not isinstance(request, dict):\n2774: raise AdapterError(\"request not object\")"}],"keyword_line_count":8,"name":"handle","segment_sha256":"794078bbd307f80c2f6640b374565fa119f03dabd1ba36a9c4d47d9b2d8865c6","start":2749}],"mode":"0o755","process_sites":[{"call":"stream.read","keywords":[],"line":197,"segment_sha256":"b132f27ce56f994d404626d8bcf725db9bd3a7476b7d532089ce2a297eb1e355","text":"stream.read(1024 * 1024)"},{"call":"json.dumps","keywords":["ensure_ascii","indent","sort_keys"],"line":204,"segment_sha256":"ee60c2fbdc8f97eff20f4ac617180559018ab7343898037639e94dcff31f7882","text":"json.dumps(\n value,\n ensure_ascii=False,\n indent=2,\n sort_keys=True,\n )"},{"call":"json.loads","keywords":[],"line":245,"segment_sha256":"6a36fbe7611c83cf1f9a144d11feb88410bbc002bb2aeeffc19cd9b97fdab2b4","text":"json.loads(raw)"},{"call":"json.loads","keywords":["object_pairs_hook"],"line":288,"segment_sha256":"bf67e3bbc5d4ac5ab0d15340108bb5410b74494961d88fa35c556acbf64afbd4","text":"json.loads(\n raw.decode(\"utf-8\"),\n object_pairs_hook=no_duplicates,\n )"},{"call":"subprocess.run","keywords":["check","env","stderr","stdin","stdout","text","timeout"],"line":664,"segment_sha256":"fbe36f5d1ed7b23d545f105135de2993138aa4a8dafc9f5419d7c37b36deebae","text":"subprocess.run(\n args,\n stdin=subprocess.DEVNULL,\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE,\n text=True,\n check=False,\n timeout=timeout,\n env=(SAFE_ENV if env is None else env),\n )"},{"call":"json.loads","keywords":[],"line":706,"segment_sha256":"49c73d21d24e89e31f7701c67025900b8b000fbdde1520e1ce4bbc04d0a543c4","text":"json.loads(result.stdout)"},{"call":"os.read","keywords":[],"line":1053,"segment_sha256":"69a810c779430086a44faf90bb2d5d4bbebbe3ba7a85dd8c3148ad4f9112eda4","text":"os.read(fd, min(1024 * 1024, remaining))"},{"call":"json.dumps","keywords":["ensure_ascii","separators","sort_keys"],"line":1517,"segment_sha256":"8623f260b2f2a1eaf0e8be9c2d4e8370e8567247e20f5e53556b7ac266f75403","text":"json.dumps(\n items,\n ensure_ascii=False,\n sort_keys=True,\n separators=(\",\", \":\"),\n )"},{"call":"subprocess.Popen","keywords":["close_fds","env","start_new_session","stderr","stdin","stdout"],"line":1626,"segment_sha256":"90bb736720d2877f6704459828dc5551619ba00834a4660e9ed9c7f86e05b8c6","text":"subprocess.Popen(\n [\n sys.executable,\n \"-B\",\n str(Path(__file__).resolve()),\n \"--worker\",\n short_id,\n ],\n "},{"call":"json.dumps","keywords":["ensure_ascii","separators"],"line":1758,"segment_sha256":"68a59ab16988992d8cb583f19eee1b55a7f8dc45e355d3655b47d522968e335e","text":"json.dumps(\n state[\"manifest\"][\"argv\"],\n separators=(\",\", \":\"),\n ensure_ascii=False,\n )"},{"call":"json.dumps","keywords":["ensure_ascii","indent","sort_keys"],"line":1778,"segment_sha256":"d31eb8080be3fc4f69b562e41f97dd655755ae2cdf26f99434c4521f86b0547c","text":"json.dumps(\n capsule_summary,\n ensure_ascii=False,\n indent=2,\n sort_keys=True,\n )"},{"call":"json.dumps","keywords":["ensure_ascii","indent","sort_keys"],"line":1822,"segment_sha256":"e8af89f3e8da544b76204b745215223c8d2381300b60dc0c5e1baf6a4096ffdd","text":"json.dumps(\n meta,\n ensure_ascii=False,\n indent=2,\n sort_keys=True,\n )"}],"schema_fields":["argv","content_b64","mode","payload","risk"],"sha256":"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d"},{"anchors":[{"line":596,"segment_sha256":"bea803e2bf945e9c5008a239e11936ecdbd8475018029010553aae5d638af370","text":"path == \"/bridge/bridge.cmd\""},{"line":791,"segment_sha256":"528504d107f4e3a9c88fb94943e594ed199c19d14b7398d0499ed62a41c176f9","text":"path == \"/api/import\""}],"basename":"homelab-command-portal","bytes":39936,"functions":[{"args":["request"],"end":91,"header":"def adapter_call(request: dict[str, Any]) -> dict[str, Any]:\n encoded = (","hotspot":[{"end":46,"original_sha256":"0810613963b5a41789eb5ecf131bf80b45e647dded9b35c5e68d4b9292f8a223","start":43,"text":"43:\n44:def adapter_call(request: dict[str, Any]) -> dict[str, Any]:\n45: encoded = (\n46: json.dumps("}],"keyword_line_count":7,"name":"adapter_call","segment_sha256":"1d4f3585656373b842054a15f1b11fb43cf9feab695b82df3ea8f5e8a693030a","start":44},{"args":["self","status","content_type","body"],"end":504,"header":" def reply(\n self,","hotspot":[{"end":477,"original_sha256":"aaa0d62cf14511be6509347c1614c7f23cfcf9714885cb1464f9fb9d8961005b","start":474,"text":"474: content_type: str,\n475: body: bytes,\n476: *,\n477: headers: dict[str, str] | None = None,"}],"keyword_line_count":4,"name":"reply","segment_sha256":"0be03d4b20f918f84107b98285a7d9bc750fcb4c717453a041a46ad7271bec53","start":471},{"args":["self"],"end":764,"header":" def do_GET(self) -> None:\n try:","hotspot":[{"end":688,"original_sha256":"dfa2bbf4800083be58a8dfb63301a47bcc206c21d4d158922ec232412fa4a17c","start":685,"text":"685: f\"/r/{short_id}\",\n686: headers={\"Set-Cookie\": cookie},\n687: )\n688: return"}],"keyword_line_count":15,"name":"do_GET","segment_sha256":"e49c3c1e64918367b3f4c1d7404beed09ac2fe19b3be22c59b59e3f8c2d52881","start":553},{"args":["self"],"end":907,"header":" def do_POST(self) -> None:\n try:","hotspot":[{"end":774,"original_sha256":"9d3ee7b22c1c1a4de2f9220e8211c79b320c1f378da508e9408877a6ca0349d5","start":771,"text":"771: if path == \"/api/enroll\":\n772: body = self.read_body(512).decode(\n773: \"ascii\",\n774: errors=\"strict\","}],"keyword_line_count":14,"name":"do_POST","segment_sha256":"6c3b664bc61fb4bc506662a1711d99017254441864528c27da5db76254864694","start":766},{"args":["request"],"end":1045,"header":" def fake_adapter_call(request: dict[str, Any]) -> dict[str, Any]:\n attempts[\"count\"] += 1","hotspot":[{"end":1043,"original_sha256":"cfdde978ab18d008414db8e692c50d3de47ac561eadbc2d7deb81a5a1b17f669","start":1040,"text":"1040:\n1041: def fake_adapter_call(request: dict[str, Any]) -> dict[str, Any]:\n1042: attempts[\"count\"] += 1\n1043: if attempts[\"count\"] < 3:"}],"keyword_line_count":1,"name":"fake_adapter_call","segment_sha256":"ce0cd75c856eb06926ff96b1c3d65c0ef72b6f409b5831122724d22a951fef97","start":1041}],"mode":"0o755","process_sites":[{"call":"json.dumps","keywords":["separators","sort_keys"],"line":46,"segment_sha256":"d2796347998c58685d8dfd45d5df5fe51509645aba7a264e7dc25cb1f352c982","text":"json.dumps(\n request,\n separators=(\",\", \":\"),\n sort_keys=True,\n )"},{"call":"json.loads","keywords":[],"line":81,"segment_sha256":"6a36fbe7611c83cf1f9a144d11feb88410bbc002bb2aeeffc19cd9b97fdab2b4","text":"json.loads(raw)"},{"call":"json.dumps","keywords":["separators","sort_keys"],"line":113,"segment_sha256":"e2fb745bae0108aba634dcdc658da4a7423b1439f0ea5f9c725fb8338e962574","text":"json.dumps(\n result,\n separators=(\",\", \":\"),\n sort_keys=True,\n )"},{"call":"json.dumps","keywords":["ensure_ascii","indent"],"line":337,"segment_sha256":"d6f51399c0a5250e2e7ce94f7692c5d23b32e73e2a40cfe39dfe708615296a95","text":"json.dumps(\n {\n \"status\": status,\n \"execution\": execution,\n \"evidence\": evidence,\n },\n ensure_ascii=False,\n indent=2,\n )"},{"call":"self.rfile.read","keywords":[],"line":541,"segment_sha256":"e88ccc84bddb9730bf85279cc75080f708954fea1522420d79deeef7f4d4022e","text":"self.rfile.read(length)"},{"call":"json.dumps","keywords":["ensure_ascii","separators","sort_keys"],"line":569,"segment_sha256":"54d09d0aed4fa5af8f08233988dff5e409332754d7767eef48c0e09cad7482d3","text":"json.dumps(\n {\n \"status\": \"ok\",\n \"version\": 3,\n \"adapter\": result[\"status\"],\n \"result_sequence\": recent[\n "},{"call":"json.dumps","keywords":["ensure_ascii","separators","sort_keys"],"line":745,"segment_sha256":"c69d1ae04da0c2a85f4db115bb6aca05e6712ea223bec16c952e99dcc0df4f64","text":"json.dumps(\n state,\n ensure_ascii=False,\n separators=(\",\", \":\"),\n sort_keys=True,\n )"}],"schema_fields":["Authorization","Cookie","risk"],"sha256":"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52"}],"analysis_ready":true,"changes_made":false,"command_id":"HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z","command_rc":0,"mutation_outcome":"NO_MUTATION","next_action":"BUILD_SHA_GUARDED_EPHEMERAL_SECRET_HANDOFF_TRANSACTION","output_truncated_in_json":false,"projection":{"degraded":false,"safe_limit_bytes":18000,"strategy":"one_hotspot_per_target_function"},"rc":0,"read_only":true,"required_functions":{"adapter":["run_command","sanitize_state","substitute_argv"],"portal":["adapter_call","do_POST"]},"rollback_restored":null,"rollback_started":false,"root_cause_classification":"SHA_GUARDED_COMPACT_PATCH_CONTEXT_CAPTURED","schema":1,"status":"OK","transaction_requirements":{"atomic_replace":true,"automatic_exact_rollback":true,"byte_for_byte_backup":true,"candidate_compile_and_selftest":true,"candidate_in_temporary_directory":true,"expected_sha_preconditions":{"homelab-command-adapter":"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d","homelab-command-portal":"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52"},"read_exact_current_sources":true,"secret_never_in_capsule_argv_output_or_evidence":true,"service_health_verification":true},"units":[{"active_state":"active","exec_basename":"homelab-command-adapter","exec_path_sha256":"c2e3b43f1f858c6fa265dc276d6a6a29e0cd25e4a127fbc093b8c8d9512bb739","fragment_path_sha256":"afe4d91c280ac4e6e9999498b5f5d8b8842a1f33e30fd45d984879a6392bc045","sub_state":"running","unit":"homelab-command-adapter.service"},{"active_state":"active","exec_basename":"homelab-command-portal","exec_path_sha256":"1132c3c355ed18cdc6406935cd26a128df298f71df7f48df690c72b202ddd7be","fragment_path_sha256":"adf87b0f1c821b17e3e2ff19cc024d783b55caf69460d01fa66f7d2579a71f5a","sub_state":"running","unit":"homelab-command-portal.service"}]} + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index 5041d38..b73e7dc 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "HOMELAB-CLUSTER-KB-V1-GITEA-DEFINED-CLUSTER-FACT-GAP-READ-ONLY-20260805T131000Z", + "command_id": "HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z", "status": "OK", "rc": 0, "host": "pve01", "mode": "verify", - "component": "cluster-knowledge-base-error-system", - "started_at_utc": "2026-08-05T13:23:00Z", - "finished_at_utc": "2026-08-05T13:23:08Z", + "component": "skladchik-handoff-patch-context-ro-v2", + "started_at_utc": "2026-08-05T13:23:53Z", + "finished_at_utc": "2026-08-05T13:23:53Z", "reference_register_checked": true, "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e", "error_register_checked": true, "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83", - "command_sha256": "9088e8f5ce54b2b810894f0d1860a25390b3179b29d85f63e19e6f81c9f066a6", + "command_sha256": "bdbee9327f44bfcf4da9c41496257b1a350c1792ec5f354159da6621124d7f6d", "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": "6c2d4b05d4a1d95e2dfbc5ebcff23469e469ec2d5e1550a49d07c3ad51a5f205", - "sanitized_output_sha256": "6c2d4b05d4a1d95e2dfbc5ebcff23469e469ec2d5e1550a49d07c3ad51a5f205", + "raw_evidence_sha256": "645b443333752ee2a7900290eb7a21e410acefb1a4ed929a99c139da80dd1719", + "sanitized_output_sha256": "645b443333752ee2a7900290eb7a21e410acefb1a4ed929a99c139da80dd1719", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "HOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"HOMELAB-CLUSTER-KB-V1-GITEA-DEFINED-CLUSTER-FACT-GAP-READ-ONLY-20260805T131000Z\",\"command_rc\":0,\"mutation_outcome\":\"NO_MUTATION\",\"output_truncated_in_json\":false,\"rc\":0,\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n{\"api\":{\"fetch_failure_count\":0,\"fetched_file_count\":104,\"fetched_total_bytes\":297443,\"route_coverage\":{\"blob\":true,\"branch\":true,\"repo\":true,\"tree\":true},\"text_file_count\":104,\"tree\":{\"blob_count\":125,\"body_emitted\":false,\"complete\":true,\"entry_count\":161,\"exact_commit\":\"fe1221b06643db3b00a621b0230f92a46a4edc2b\",\"json_parse_ok\":true,\"status\":200,\"tree_count\":36,\"truncated\":false}},\"authorization_sent\":true,\"authorization_values_emitted\":false,\"branch\":{\"body_emitted\":false,\"branch\":\"main\",\"commit_sha\":\"fe1221b06643db3b00a621b0230f92a46a4edc2b\",\"json_parse_ok\":true,\"matches_expected_commit\":true,\"status\":200},\"changes_made\":false,\"command_id\":\"HOMELAB-CLUSTER-KB-V1-GITEA-DEFINED-CLUSTER-FACT-GAP-READ-ONLY-20260805T131000Z\",\"command_rc\":0,\"credential_values_emitted\":false,\"endpoint_summary\":{\"address_literal_occurrence_count\":81,\"raw_addresses_emitted\":false,\"raw_url_occurrence_count\":6,\"raw_urls_emitted\":false,\"scope_counts\":{\"external_hostname\":2,\"known_external_gitea\":1,\"private\":1},\"tokens\":[{\"host_scope\":\"external_hostname\",\"host_sha256\":\"8005522570737cc57f67406b7c6fb5d572797e4ba947dfb0bf3befee3639e667\",\"path_depth\":2,\"port\":null,\"scheme\":\"https\"},{\"host_scope\":\"known_external_gitea\",\"host_sha256\":\"92feea413ab6bd72fdd8b9102d872777d284d002a6be3e5323ca6e848105ee88\",\"path_depth\":2,\"port\":null,\"scheme\":\"https\"},{\"host_scope\":\"external_hostname\",\"host_sha256\":\"11d6a89894efa93b767088253526b02bac35874c1f63783507a3fb1d3b194e8a\",\"path_depth\":3,\"port\":null,\"scheme\":\"https\"},{\"host_scope\":\"private\",\"host_sha256\":\"7f25d5297f515cb92000161cbee4cb49a7fbbbd1c0ef2466a5d88644f4bb6d69\",\"path_depth\":1,\"port\":8081,\"scheme\":\"http\"}],\"unique_endpoint_token_count\":4},\"error_fingerprint\":\"dadccd2e354a457c337b9089047ec0a0918a5d3cccd5a188b83f8dce425a59ab\",\"error_registry\":{\"content_sha256\":\"8051e3e761493a1b7088a0f3ed7e0aa9218673f453ca88171178364d26701f64\",\"duplicate_fingerprint_count\":0,\"duplicate_id_count\":0,\"duplicate_ids\":[],\"fingerprint_value_count\":0,\"fingerprint_values_emitted\":false,\"migratable_record_count\":0,\"migration_coverage_ratio\":0.0,\"path\":\"errors/regression-cases.json\",\"present\":true,\"prevention_evidence_count\":0,\"raw_records_emitted\":false,\"record_count\":59,\"status_counts\":{},\"unique_fingerprint_count\":0,\"unique_id_count\":59},\"fact_record_summary\":{\"domain_record_counts\":{\"access\":10,\"freshness\":25,\"identity\":16},\"emitted_record_count\":25,\"raw_record_values_emitted\":false,\"secret_hashes_emitted\":false,\"source_record_counts\":{\"inventory/access-paths.json\":9,\"inventory/cluster-nodes.json\":3,\"observed/cluster-guests.json\":11,\"observed/current-context.json\":2},\"top_fields\":[\"status\",\"id\",\"node\",\"type\",\"name\",\"vmid\",\"address\",\"service\"],\"unique_record_count\":25},\"fact_records\":[],\"fact_records_omitted_but_count_retained\":true,\"files_written\":false,\"http_methods\":[\"GET\"],\"mutation_blueprint\":{\"atomicity_requirements\":[\"read all exact source blobs again at the expected branch commit\",\"build the full candidate tree in a temporary directory\",\"validate JSON, JSONL, schemas, gate self-tests and repository tests\",\"create byte-for-byte backup objects for every modified blob\",\"create one commit against the expected parent commit\",\"verify the new commit tree and CI-visible files\",\"on any failure restore the exact previous branch state\"],\"code_root_choice\":{\"basis\":\"existing_top_level_code_or_directory\",\"existing_python_file_count\":2,\"path\":\"tools/pre_command_gate.py\",\"path_exists\":false,\"root\":\"tools\"},\"files_to_create_or_replace\":[\"docs/CLUSTER-HANDBOOK.md\",\"inventory/cluster-reference.json\",\"docs/ERROR-SYSTEM-V2.md\",\"schemas/error-record.schema.json\",\"errors/error-registry.jsonl\",\"tools/pre_command_gate.py\",\"tests/test_error_system_v2.py\"],\"files_to_update_conditionally\":[\".gitea/workflows/ci.yml\",\"docs/WORKFLOW.md\"],\"migration_requirements\":{\"append_runtime_failures_from_known_error_gate\":true,\"derive_fingerprint_only_from_sanitized_stable_fields\":true,\"mark_parallel_draft_superseded_only_after_validation\":true,\"preserve_all_existing_records\":true,\"require_prevention_test_for_each_active_record\":true},\"migration_source\":\"errors/regression-cases.json\",\"ready\":true,\"transaction_preconditions\":{\"branch\":\"main\",\"exact_source_sha256\":{\".gitea/workflows/ci.yml\":\"b078ac1b57e0846a90fd6acb1f3cb0866dbed0fb3bbde0d7070d29a344907681\",\"docs/WORKFLOW.md\":\"87a6f9a0960ee7240261138ecea122fd8fbd727d87bb0b27b02c103c3bc2f122\",\"errors/regression-cases.json\":\"8051e3e761493a1b7088a0f3ed7e0aa9218673f453ca88171178364d26701f64\",\"schemas/change.schema.json\":\"57fbce7c6ca1f53c5ec2f8cd604d787f01019a2184b611e3b4406b467331d0af\",\"schemas/context.schema.json\":\"84c3c29984402b25c102575b54bdb82544844e455d3d2e115fefc5f42021e043\"},\"expected_branch_commit\":\"fe1221b06643db3b00a621b0230f92a46a4edc2b\",\"proposed_paths\":[{\"creation_precondition\":\"must_remain_absent\",\"exists_at_exact_commit\":false,\"path\":\"docs/CLUSTER-HANDBOOK.md\"},{\"creation_precondition\":\"must_remain_absent\",\"exists_at_exact_commit\":false,\"path\":\"inventory/cluster-reference.json\"},{\"creation_precondition\":\"must_remain_absent\",\"exists_at_exact_commit\":false,\"path\":\"docs/ERROR-SYSTEM-V2.md\"},{\"creation_precondition\":\"must_remain_absent\",\"exists_at_exact_commit\":false,\"path\":\"schemas/error-record.schema.json\"},{\"creation_precondition\":\"must_remain_absent\",\"exists_at_exact_commit\":false,\"path\":\"errors/error-registry.jsonl\"},{\"creation_precondition\":\"must_remain_absent\",\"exists_at_exact_commit\":false,\"path\":\"tests/test_error_system_v2.py\"},{\"creation_precondition\":\"must_remain_absent\",\"exists_at_exact_commit\":false,\"path\":\"tools/pre_command_gate.py\"}],\"repository\":\"homelab-admin/homelab-ops\"}},\"mutation_outcome\":\"NO_MUTATION\",\"network_requests_made\":true,\"next_action\":\"RUN_ONE_IDEMPOTENT_GITEA_TRANSACTION_CREATE_CLUSTER_HANDBOOK_AND_ERROR_SYSTEM_V2\",\"output_truncated_in_json\":false,\"pre_command_known_error_gate\":{\"checked\":true,\"known_error_count\":28,\"known_error_ids\":[\"candidate-file-limit-600-20260805\",\"runner-wrapper-mismatch-after-success-20260805\",\"canonical-cluster-handbook-ambiguous-20260805\",\"pvesh-adapter-context-unreadable-20260805\",\"homelab-ops-bare-repository-not-found-local-20260805\",\"gitea-network-fallback-stage-not-emitted-20260805\",\"gitea-owner-hardcoded-homelab-admin-20260805\",\"gitea-git-auth-required-or-credential-unavailable-20260805\",\"gitea-process-self-match-payload-name-20260805\",\"sanitize-bool-attributeerror-20260805\",\"reader-v3-path-misclassified-as-route-20260805\",\"reader-v3-loopback-assumption-20260805\",\"reader-v3-capability-not-treated-as-secret-20260805\",\"reader-v3-systemd-unit-fed-to-python-ast-20260805\",\"reader-v3-helper-control-flow-not-traced-20260805\",\"reader-v3-post-capability-operation-not-derived-20260805\",\"reader-v3-detected-operations-not-tested-20260805\",\"reader-v3-manifest-global-not-bound-in-sandbox-20260805\",\"reader-v3-result-file-second-source-not-read-20260805\",\"reader-v3-negative-control-mixed-with-production-20260805\",\"reader-v3-manifest-schema-guessed-20260805\",\"reader-result-output-bound-after-compaction-20260805\",\"reader-v3-generation-record-shape-guessed-20260805\",\"reader-v3-result-file-assumed-standalone-json-20260805\",\"reader-v3-gitea-detail-marker-false-inventory-20260805\",\"reverse-proxy-runtime-not-visible-on-host-20260805\",\"gitea-public-owner-not-anonymously-discoverable-20260805\",\"exact-output-long-line-not-projectable-by-portal-view-20260805\"],\"previous_exact_identity_verified\":true},\"previous_exact_verification\":{\"bundle_bytes_ok\":true,\"bundle_sha256_ok\":true,\"capsule_member_match_count\":0,\"capsule_sha256_basis\":\"verified exact lane before command publication; optional bundle member count reported separately\",\"checks\":{\"changes_made_false\":true,\"command_id\":true,\"command_rc_zero\":true,\"contract_ok\":true,\"mutation_outcome_no_mutation\":true,\"projection_ok\":true,\"rollback_started_false\":true,\"runner_rc_zero\":true,\"runner_status_ok\":true},\"embedded_output_match_count\":1,\"exists\":true,\"identity_fully_verified\":true,\"member_count\":6,\"path_from_exact_result\":true,\"runner_json_match_count\":1,\"runner_text_match_count\":1,\"unsafe_member_rejected\":false},\"private_addresses_emitted\":false,\"raw_repository_contents_emitted\":false,\"rc\":0,\"read_only\":true,\"ready_for_idempotent_mutation\":true,\"regression_tests\":{\"endpoint_token_hides_host\":true,\"git_blob_oid_semantics\":true,\"known_error_gate_complete\":true,\"passed\":true,\"private_address_not_emitted\":true,\"safe_record_fingerprint_deterministic\":true,\"sanitize_bool_type_safe\":true,\"secret_value_redacted_before_record_hash\":true,\"strict_handbook_excludes_error_registry\":true},\"repository\":{\"archived\":false,\"default_branch\":\"main\",\"empty\":false,\"full_name\":\"homelab-admin/homelab-ops\",\"identity_safe\":true,\"mirror\":false,\"name\":\"homelab-ops\",\"owner\":\"homelab-admin\",\"private\":true,\"size\":3837},\"result_projection\":{\"budget_bytes\":24976,\"bytes\":24326,\"steps\":[\"source_summaries_24\",\"fact_records_32\",\"drop_json_shapes_and_limit_headings\",\"handbook_candidates_4\",\"omit_fact_records\"]},\"rollback_restored\":null,\"rollback_started\":false,\"root_cause_classification\":\"GITEA_CLUSTER_FACTS_AND_DOCUMENT_GAPS_EXACTLY_ANALYZED_MUTATION_READY\",\"schema\":1,\"secret_hashes_emitted\":false,\"source_summaries\":[{\"blob_sha\":\"7a8cb9e2dd5bc1235937aa211293b47ed4e26263\",\"bytes\":29485,\"content_sha256\":\"8051e3e761493a1b7088a0f3ed7e0aa9218673f453ca88171178364d26701f64\",\"domains\":{\"access\":9,\"backup\":22,\"error_system\":38,\"freshness\":5,\"internal_external\":1,\"repair\":38,\"restore\":9,\"services\":8},\"headings\":[],\"json_parse_ok\":true,\"path\":\"errors/regression-cases.json\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":60},{\"blob_sha\":\"bad7037197f12ce9ce0b8be3b5723345699680b5\",\"bytes\":2289,\"content_sha256\":\"e07ccfac39f862c2bce2da0d31112e8e055ca9d3f23a01a8f33302863239203a\",\"domains\":{\"access\":1,\"backup\":0,\"error_system\":1,\"freshness\":1,\"internal_external\":2,\"repair\":0,\"restore\":0,\"services\":0},\"headings\":[],\"json_parse_ok\":true,\"path\":\"changes/CR-2026-0018/regression-cases-draft.json\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"d072c291ee6b99466be0f4897e9d1308ee02e2b2\",\"bytes\":1134,\"content_sha256\":\"df400edc01d8201665c92e7434f8b0663eac0d34aab35e918abfb9bb873877e8\",\"domains\":{\"access\":0,\"backup\":0,\"error_system\":0,\"freshness\":2,\"internal_external\":0,\"repair\":1,\"restore\":0,\"services\":4},\"headings\":[\"Caller inventory requirements\",\"Search surfaces\",\"Required record\",\"Gate\"],\"json_parse_ok\":false,\"path\":\"changes/CR-2026-0018/caller-inventory-requirements.md\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"823d591344d8b8f67e213e2b890acdbd7bfc9864\",\"bytes\":211,\"content_sha256\":\"d3347712264b62c8768c952575574140c388df6d4d045c824ed9a8722bad1454\",\"domains\":{\"access\":0,\"backup\":0,\"error_system\":0,\"freshness\":0,\"internal_external\":0,\"repair\":1,\"restore\":0,\"services\":0},\"headings\":[\"Changes\"],\"json_parse_ok\":false,\"path\":\"changes/README.md\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"c42de139cdf529611d50ad86291fb40df5bc0d09\",\"bytes\":1652,\"content_sha256\":\"ac5dc881dcd9fcb72644bc893e866f463c9c2b9b4544e32434e21b5d34168fb5\",\"domains\":{\"access\":9,\"backup\":0,\"error_system\":0,\"freshness\":0,\"internal_external\":0,\"repair\":0,\"restore\":0,\"services\":0},\"headings\":[],\"json_parse_ok\":true,\"path\":\"inventory/access-paths.json\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"5a1fb00b587a813cee2a7bd98be451bd22173f5e\",\"bytes\":4952,\"content_sha256\":\"6b732f5ce3af0e8066d020bf10ee81b764b6d93ee5f08a9c8f17d0075eeced32\",\"domains\":{\"access\":0,\"backup\":0,\"error_system\":0,\"freshness\":0,\"internal_external\":0,\"repair\":0,\"restore\":1,\"services\":22},\"headings\":[],\"json_parse_ok\":true,\"path\":\"observed/cluster-guests.json\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"3327f8b644b3f3e83774d5e7748a8dfa6b4f1ebf\",\"bytes\":958,\"content_sha256\":\"5e7236f3b8072ff6115ab5bc50ad448425882e86463e90d85df1a1c8eb502d65\",\"domains\":{\"access\":0,\"backup\":1,\"error_system\":0,\"freshness\":0,\"internal_external\":0,\"repair\":1,\"restore\":0,\"services\":2},\"headings\":[\"Архитектура управления\",\"Разделение ответственности\"],\"json_parse_ok\":false,\"path\":\"docs/ARCHITECTURE.md\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"3b034041ab628d15e74a7167b5545b366aeb4ad1\",\"bytes\":526,\"content_sha256\":\"87a6f9a0960ee7240261138ecea122fd8fbd727d87bb0b27b02c103c3bc2f122\",\"domains\":{\"access\":0,\"backup\":0,\"error_system\":0,\"freshness\":1,\"internal_external\":0,\"repair\":1,\"restore\":0,\"services\":0},\"headings\":[\"Change workflow\"],\"json_parse_ok\":false,\"path\":\"docs/WORKFLOW.md\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"f03826dcf6f8c6af4a8a78206c1b841ffaffd2ca\",\"bytes\":3020,\"content_sha256\":\"91c66d8ee6622d925174055599ad5ece6270c35f8d7d7967a26609f7e290c7e6\",\"domains\":{\"access\":0,\"backup\":1,\"error_system\":3,\"freshness\":4,\"internal_external\":0,\"repair\":1,\"restore\":1,\"services\":0},\"headings\":[\"Одна постоянная команда\",\"Что проверяется автоматически\",\"Правила безопасности\"],\"json_parse_ok\":false,\"path\":\"docs/skladchik-cookie-refresh.md\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":17},{\"blob_sha\":\"b4979003f9bb899f4a5de41ede47eacaeac48dee\",\"bytes\":2264,\"content_sha256\":\"e74454f528cdb5522e2c43d959472a04b7cc36e33da7aa5a5bd664fc79015344\",\"domains\":{\"access\":2,\"backup\":0,\"error_system\":0,\"freshness\":2,\"internal_external\":0,\"repair\":0,\"restore\":0,\"services\":1},\"headings\":[\"Skladchik Moderator Assistant\",\"Назначение\",\"Что планируется подготовить позднее\",\"Что сейчас не делать\"],\"json_parse_ok\":false,\"path\":\"docs/planned/skladchik-moderator-assistant.md\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"9586f62339cc657d18d033c104229458ebcadb58\",\"bytes\":1290,\"content_sha256\":\"cfb21fbf6ead4b3537b5f6f43e19602365b7b16adba5f317e48f8f19f5d40475\",\"domains\":{\"access\":0,\"backup\":0,\"error_system\":2,\"freshness\":0,\"internal_external\":1,\"repair\":1,\"restore\":0,\"services\":0},\"headings\":[],\"json_parse_ok\":true,\"path\":\"policies/operating-policy.json\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":1},{\"blob_sha\":\"2032d3ebab4794625854b8c80d23ab72aac9998b\",\"bytes\":1436,\"content_sha256\":\"e06b7e6285eda2885ef913aa954a70abc7c1d892199a8b7cea2ada98b8edba34\",\"domains\":{\"access\":0,\"backup\":2,\"error_system\":3,\"freshness\":0,\"internal_external\":0,\"repair\":3,\"restore\":2,\"services\":0},\"headings\":[],\"json_parse_ok\":true,\"path\":\"policies/cluster-cloud-quorum.json\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"8352f9a2024afea21049cd7700e460ee096c6c53\",\"bytes\":969,\"content_sha256\":\"57fbce7c6ca1f53c5ec2f8cd604d787f01019a2184b611e3b4406b467331d0af\",\"domains\":{\"access\":0,\"backup\":2,\"error_system\":0,\"freshness\":0,\"internal_external\":0,\"repair\":2,\"restore\":0,\"services\":0},\"headings\":[],\"json_parse_ok\":true,\"path\":\"schemas/change.schema.json\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"7dc9476a8ca0227b4d5bf0cbd2c706c60af21119\",\"bytes\":539,\"content_sha256\":\"84c3c29984402b25c102575b54bdb82544844e455d3d2e115fefc5f42021e043\",\"domains\":{\"access\":0,\"backup\":0,\"error_system\":0,\"freshness\":0,\"internal_external\":0,\"repair\":0,\"restore\":0,\"services\":0},\"headings\":[],\"json_parse_ok\":true,\"path\":\"schemas/context.schema.json\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"3d6801bd6e7faefd1fc4579c41dc387f3dd1a9f0\",\"bytes\":318,\"content_sha256\":\"b078ac1b57e0846a90fd6acb1f3cb0866dbed0fb3bbde0d7070d29a344907681\",\"domains\":{\"access\":0,\"backup\":0,\"error_system\":1,\"freshness\":0,\"internal_external\":0,\"repair\":0,\"restore\":0,\"services\":1},\"headings\":[],\"json_parse_ok\":false,\"path\":\".gitea/workflows/ci.yml\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"68ae87029a1660255df02ff192e5b9206e9a6c05\",\"bytes\":13579,\"content_sha256\":\"d3108777e5094468aa3e633740ce8a56c90ca957a9a62932be896bbe784680b0\",\"domains\":{\"access\":22,\"backup\":23,\"error_system\":16,\"freshness\":3,\"internal_external\":1,\"repair\":22,\"restore\":10,\"services\":13},\"headings\":[],\"json_parse_ok\":true,\"path\":\"tasks/skladchik-reports-monitor-controlled-reauth-v1/task.json\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":43},{\"blob_sha\":\"6e22f5ca60d95965765c03ac1d012631aaae68b0\",\"bytes\":6750,\"content_sha256\":\"3a8fdfb6b4b64880012fcc3bc6fee4be6f101377310325541f9776de6d1623f7\",\"domains\":{\"access\":0,\"backup\":4,\"error_system\":16,\"freshness\":4,\"internal_external\":2,\"repair\":18,\"restore\":1,\"services\":28},\"headings\":[],\"json_parse_ok\":true,\"path\":\"tasks/homelab-logrotate-namespace-latch-clearance-v1/task.json\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"a1528e7cbc2b1027bfd7faa220bf1f096cdde1f5\",\"bytes\":3665,\"content_sha256\":\"666072447ba11d346772f62f274dadc974c4463e20f67e67f82f228f1fcf2ce8\",\"domains\":{\"access\":20,\"backup\":17,\"error_system\":1,\"freshness\":1,\"internal_external\":0,\"repair\":4,\"restore\":10,\"services\":7},\"headings\":[],\"json_parse_ok\":false,\"path\":\"tasks/cluster-cloud-quorum-vm160-canary-v1/phases/rollback.sh\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"d2adf1bf345063da2b02040697f4358ba4ca4ae1\",\"bytes\":4667,\"content_sha256\":\"a49bcb32ac7212d7fb9768db8a277cb5525c873c84dd6fb633edae35dc6de532\",\"domains\":{\"access\":8,\"backup\":14,\"error_system\":9,\"freshness\":1,\"internal_external\":0,\"repair\":1,\"restore\":6,\"services\":10},\"headings\":[],\"json_parse_ok\":false,\"path\":\"tasks/cluster-cloud-quorum-vm160-canary-v1/phases/preflight.sh\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"c6f94aa845bc4cd8fc061e5e03e0fd7771a01bc6\",\"bytes\":7440,\"content_sha256\":\"636254d2526f0f62184d47cdb4c30c2831b11869c2000c557666f60b55d7691b\",\"domains\":{\"access\":13,\"backup\":24,\"error_system\":13,\"freshness\":0,\"internal_external\":0,\"repair\":12,\"restore\":4,\"services\":8},\"headings\":[],\"json_parse_ok\":true,\"path\":\"tasks/cluster-cloud-quorum-vm160-canary-v1/task.json\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":2},{\"blob_sha\":\"9cc7d2fa3bc044d311500a5cf798273c79e39c35\",\"bytes\":4233,\"content_sha256\":\"ac0885c9762b99f360256ad3b3894f9cbcc4a8deab529a19ef264fe446bff029\",\"domains\":{\"access\":8,\"backup\":16,\"error_system\":8,\"freshness\":1,\"internal_external\":0,\"repair\":7,\"restore\":0,\"services\":11},\"headings\":[],\"json_parse_ok\":false,\"path\":\"tasks/cluster-cloud-quorum-vm160-canary-v1/phases/verify.sh\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":0},{\"blob_sha\":\"774e2b0e591c9ada9aac9700a1b8427645284f1e\",\"bytes\":4665,\"content_sha256\":\"34de7dd0cc60c90c1b74e7a91334cb737d33c761882d1483d5b39f15b439c6f1\",\"domains\":{\"access\":13,\"backup\":19,\"error_system\":1,\"freshness\":1,\"internal_external\":0,\"repair\":1,\"restore\":0,\"services\":7},\"headings\":[],\"json_parse_ok\":false,\"path\":\"tasks/cluster-cloud-quorum-vm160-canary-v1/phases/apply.sh\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":3},{\"blob_sha\":\"938db71d80350ac328ec90fe7bb5176a4d6d50ac\",\"bytes\":2867,\"content_sha256\":\"3b8687392163cf5b6f8b0874087320fe74ceaa5fee897dd0e7762d8c71476a1c\",\"domains\":{\"access\":4,\"backup\":4,\"error_system\":1,\"freshness\":0,\"internal_external\":0,\"repair\":8,\"restore\":11,\"services\":3},\"headings\":[],\"json_parse_ok\":false,\"path\":\"tasks/skladchik-reports-monitor-controlled-reauth-v1/phases/rollback.sh\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":2},{\"blob_sha\":\"aefe7ac6860ec2107c281485b35c8cba1f1196ef\",\"bytes\":4846,\"content_sha256\":\"cfde805604d58d87d975584431aeb024bef21e863c4293d4726e5504415fe9bc\",\"domains\":{\"access\":0,\"backup\":6,\"error_system\":5,\"freshness\":2,\"internal_external\":1,\"repair\":3,\"restore\":9,\"services\":0},\"headings\":[],\"json_parse_ok\":false,\"path\":\"tests/test_cr_2026_0012_skladchik_cookie_refresh_runbook.py\",\"raw_content_emitted\":false,\"secret_key_name_occurrence_count\":21}],\"status\":\"OK\",\"strict_handbook\":{\"candidates\":[{\"canonical_phrase_hits\":0,\"content_sha256\":\"91c66d8ee6622d925174055599ad5ece6270c35f8d7d7967a26609f7e290c7e6\",\"covered_domains\":[\"backup\",\"error_system\",\"repair\",\"restore\"],\"headings\":[\"Одна постоянная команда\",\"Что проверяется автоматически\",\"Правила безопасности\"],\"path\":\"docs/skladchik-cookie-refresh.md\",\"score\":80,\"title_signal\":false},{\"canonical_phrase_hits\":1,\"content_sha256\":\"5e7236f3b8072ff6115ab5bc50ad448425882e86463e90d85df1a1c8eb502d65\",\"covered_domains\":[\"backup\",\"repair\",\"services\"],\"headings\":[\"Архитектура управления\",\"Разделение ответственности\"],\"path\":\"docs/ARCHITECTURE.md\",\"score\":75,\"title_signal\":false},{\"canonical_phrase_hits\":1,\"content_sha256\":\"d9cb129e009176a7dde2a07f59760acddd9e17237eef563e97a55b3e62838bd1\",\"covered_domains\":[\"repair\"],\"headings\":[\"homelab-ops\",\"Порядок работы\",\"Локальная проверка\"],\"path\":\"README.md\",\"score\":55,\"title_signal\":true},{\"canonical_phrase_hits\":0,\"content_sha256\":\"e74454f528cdb5522e2c43d959472a04b7cc36e33da7aa5a5bd664fc79015344\",\"covered_domains\":[\"access\",\"services\"],\"headings\":[\"Skladchik Moderator Assistant\",\"Назначение\",\"Что планируется подготовить позднее\",\"Что сейчас не делать\",\"Условие возобновления\"],\"path\":\"docs/planned/skladchik-moderator-assistant.md\",\"score\":40,\"title_signal\":false}],\"path\":null,\"previous_loose_candidate_rejected\":\"errors/regression-cases.json\",\"qualified_count\":0,\"rejection_reason\":\"error registry is not a cluster handbook under the strict source-class definition\",\"status\":\"NOT_FOUND\",\"strict_definition\":{\"allowed_source_classes\":[\"docs\",\"inventory\",\"root index\"],\"excluded_source_classes\":[\"errors\",\"changes\",\"tasks\",\"tests\",\"workflows\",\"schemas\"],\"minimum_domains\":6,\"requires_canonical_phrase\":true,\"requires_cluster_title\":true}},\"verified_gaps\":[{\"evidence\":{\"qualified_count\":0,\"strict_status\":\"NOT_FOUND\"},\"gap_id\":\"canonical_cluster_handbook_absent\",\"remediation\":\"create one canonical docs/CLUSTER-HANDBOOK.md and link every fact to an exact machine-readable source\",\"severity\":\"BLOCKING\"},{\"evidence\":{\"path_verified_absent\":true},\"gap_id\":\"machine_readable_cluster_reference_absent\",\"remediation\":\"create inventory/cluster-reference.json with source_sha256, verified_at and stale/unknown states\",\"severity\":\"BLOCKING\"},{\"evidence\":{\"record_count\":0},\"gap_id\":\"structured_backup_restore_facts_absent\",\"remediation\":\"materialize backup_restore facts into the machine-readable cluster reference\",\"severity\":\"HIGH\"},{\"evidence\":{\"record_count\":0},\"gap_id\":\"structured_repair_facts_absent\",\"remediation\":\"materialize repair facts into the machine-readable cluster reference\",\"severity\":\"HIGH\"},{\"evidence\":{\"record_count\":0},\"gap_id\":\"structured_scope_facts_absent\",\"remediation\":\"materialize scope facts into the machine-readable cluster reference\",\"severity\":\"HIGH\"},{\"evidence\":{\"error_record_count\":59,\"fingerprint_count\":0},\"gap_id\":\"error_registry_has_no_fingerprints\",\"remediation\":\"seed stable normalized fingerprints and block duplicate failed fingerprints before publication\",\"severity\":\"BLOCKING\"},{\"evidence\":{\"error_record_count\":59,\"prevention_evidence_count\":0},\"gap_id\":\"error_registry_has_no_prevention_evidence\",\"remediation\":\"require one positive and one negative prevention test for every active error record\",\"severity\":\"BLOCKING\"},{\"evidence\":{\"ci_mentions_fingerprint\":false,\"ci_mentions_pre_command_gate\":false},\"gap_id\":\"ci_does_not_enforce_error_fingerprint_gate\",\"remediation\":\"wire the pre-command gate and registry/schema tests into .gitea/workflows/ci.yml\",\"severity\":\"BLOCKING\"},{\"evidence\":{\"both_present\":true,\"content_sha256_equal\":false},\"gap_id\":\"parallel_draft_and_canonical_error_registries_diverge\",\"remediation\":\"declare canonical ownership and mark the draft superseded after migration\",\"severity\":\"MEDIUM\"},{\"evidence\":{\"matching_path_count\":0},\"gap_id\":\"superseded_command_registry_absent\",\"remediation\":\"record superseded command_id/capsule/result relationships during post-result ingestion\",\"severity\":\"HIGH\"}],\"workflow_gate_signals\":{\"ci_mentions_error_registry\":false,\"ci_mentions_fingerprint\":false,\"ci_mentions_pre_command_gate\":false,\"ci_present\":true,\"repository_mentions_duplicate_failed_command_blocked\":false,\"repository_mentions_error_register_checked\":false,\"repository_mentions_reference_register_checked\":false}}\n" + "output": "HOMELAB_RESULT_CONTRACT={\"changes_made\":false,\"command_id\":\"HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z\",\"command_rc\":0,\"mutation_outcome\":\"NO_MUTATION\",\"output_truncated_in_json\":false,\"rc\":0,\"rollback_restored\":null,\"rollback_started\":false,\"status\":\"OK\",\"version\":1}\n{\"active_files\":[{\"anchors\":[{\"line\":427,\"segment_sha256\":\"ba2a9f580ceb6219636a3c6a9c8e21ef038cb66dff11b5482b985947b12905bc\",\"text\":\"1 <= len(argv) <= 128\"},{\"line\":499,\"segment_sha256\":\"8bd3e09d95d346415baa0597f44086071f2798ede0476c1adfad1f3b215c8e78\",\"text\":\"len(payload) > 32\"},{\"line\":536,\"segment_sha256\":\"65bfbef8abd20d6fb32a7594441e172311729afb83b74c9a0fe65938127f7b6d\",\"text\":\"relative in payload_paths\"},{\"line\":565,\"segment_sha256\":\"46eb980bc24c778b9d23e7d87fd5be7a19fa5efb58701ee8cd9608f85b527888\",\"text\":\"total_payload > MAX_PAYLOAD_BYTES\"},{\"line\":602,\"segment_sha256\":\"15f5757fe00d2ce1ed6dda00fe692e7710cb4693f7228fb6de4bec9e5d7127b1\",\"text\":\"relative not in payload_paths\"},{\"line\":1745,\"segment_sha256\":\"191286074b0b5feeb625b5ce92a9677a514dec1fcf9e169ed3968a79517be462\",\"text\":\"runner_document.get(\\\"secrets_included\\\") is not False\"},{\"line\":1756,\"segment_sha256\":\"718c072975da02520b0011252316d9df080b88caa3ef021bad21aafd36c22597\",\"text\":\"key != \\\"argv\\\"\"},{\"line\":2891,\"segment_sha256\":\"874df6b19b74e478b27c859c5194626606613ff18b886fade606d5ba701d6de2\",\"text\":\"(\\n Path(directory) / \\\"payload\\\" / \\\"main.py\\\"\\n ).read_bytes() == payload_content\"}],\"basename\":\"homelab-command-adapter\",\"bytes\":86019,\"functions\":[{\"args\":[\"args\"],\"end\":673,\"header\":\"def run_command(\\n args: list[str],\",\"hotspot\":[{\"end\":668,\"original_sha256\":\"8d44e4eb6b769400040df651f85468ce2751903e298a7b917d0da7720d99877e\",\"start\":665,\"text\":\"665: args,\\n666: stdin=subprocess.DEVNULL,\\n667: stdout=subprocess.PIPE,\\n668: stderr=subprocess.PIPE,\"}],\"keyword_line_count\":5,\"name\":\"run_command\",\"segment_sha256\":\"ae477f09ebbf0c4b47b2def5d2e409b7a751ff9fdf5243f102c9449b4f2a26e9\",\"start\":658},{\"args\":[\"state\"],\"end\":1592,\"header\":\"def sanitize_state(state: dict[str, Any]) -> dict[str, Any]:\\n execution = state.get(\\\"execution\\\")\",\"hotspot\":[{\"end\":1568,\"original_sha256\":\"7c8ebb2ae104e19372bb498b12ef7405e9fd150a596324a214215b4dc8b13959\",\"start\":1565,\"text\":\"1565:\\n1566: evidence = state.get(\\\"evidence\\\")\\n1567: public_evidence = None\\n1568: if isinstance(evidence, dict):\"}],\"keyword_line_count\":5,\"name\":\"sanitize_state\",\"segment_sha256\":\"175e0927b3285f609b85baca34569d3a6c932cfefaa59358dcf45e3a06702ac3\",\"start\":1547},{\"args\":[\"argv\",\"payload_root\"],\"end\":1692,\"header\":\"def substitute_argv(\\n argv: list[str],\",\"hotspot\":[{\"end\":1685,\"original_sha256\":\"83a21c644a9a2942305c2d619e2225be2798ae3f0cb09f1ff49de00c636d7ff1\",\"start\":1682,\"text\":\"1682: raise AdapterError(\\n1683: \\\"payload argv escapes root\\\"\\n1684: ) from exc\\n1685: if not target.is_file() or target.is_symlink():\"}],\"keyword_line_count\":6,\"name\":\"substitute_argv\",\"segment_sha256\":\"e8ba20cbb06e9edbf9c5c450b96698680d515fc4d560889919388697f03b69a5\",\"start\":1670},{\"args\":[\"args\"],\"end\":2102,\"header\":\"def run_existing_runner(\\n args: list[str],\",\"hotspot\":[{\"end\":2058,\"original_sha256\":\"72447a50c01a068395785579cdd058a5630ed22e8f7e73851066981064ca7a04\",\"start\":2055,\"text\":\"2055:) -> subprocess.CompletedProcess[str]:\\n2056: process = subprocess.Popen(\\n2057: args,\\n2058: stdin=subprocess.DEVNULL,\"}],\"keyword_line_count\":8,\"name\":\"run_existing_runner\",\"segment_sha256\":\"485d5c01da41e1e871a9eeadde83cb97a3962adcf6ac4fee8fa74b945f338739\",\"start\":2049},{\"args\":[\"request\"],\"end\":2745,\"header\":\"def dispatch(request: dict[str, Any]) -> dict[str, Any]:\\n operation = request.get(\\\"op\\\")\",\"hotspot\":[{\"end\":2641,\"original_sha256\":\"63ea5ee14fcb5cf84b7f3921b8780888eafc16d31f6e2981e7e55c987219cba6\",\"start\":2638,\"text\":\"2638:\\n2639:def dispatch(request: dict[str, Any]) -> dict[str, Any]:\\n2640: operation = request.get(\\\"op\\\")\\n2641: if operation == \\\"health\\\":\"}],\"keyword_line_count\":23,\"name\":\"dispatch\",\"segment_sha256\":\"3e4fc40ccc43328184094336f2fbe3604cd4e1be4a2cd057dae52b8369ae5bfe\",\"start\":2639},{\"args\":[\"self\"],\"end\":2790,\"header\":\" def handle(self) -> None:\\n credentials = self.request.getsockopt(\",\"hotspot\":[{\"end\":2774,\"original_sha256\":\"09e4d28ded165a82f3fcdcf09253762a4e59749f0503489bf41099a59570ff04\",\"start\":2771,\"text\":\"2771: try:\\n2772: request = json.loads(raw)\\n2773: if not isinstance(request, dict):\\n2774: raise AdapterError(\\\"request not object\\\")\"}],\"keyword_line_count\":8,\"name\":\"handle\",\"segment_sha256\":\"794078bbd307f80c2f6640b374565fa119f03dabd1ba36a9c4d47d9b2d8865c6\",\"start\":2749}],\"mode\":\"0o755\",\"process_sites\":[{\"call\":\"stream.read\",\"keywords\":[],\"line\":197,\"segment_sha256\":\"b132f27ce56f994d404626d8bcf725db9bd3a7476b7d532089ce2a297eb1e355\",\"text\":\"stream.read(1024 * 1024)\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"indent\",\"sort_keys\"],\"line\":204,\"segment_sha256\":\"ee60c2fbdc8f97eff20f4ac617180559018ab7343898037639e94dcff31f7882\",\"text\":\"json.dumps(\\n value,\\n ensure_ascii=False,\\n indent=2,\\n sort_keys=True,\\n )\"},{\"call\":\"json.loads\",\"keywords\":[],\"line\":245,\"segment_sha256\":\"6a36fbe7611c83cf1f9a144d11feb88410bbc002bb2aeeffc19cd9b97fdab2b4\",\"text\":\"json.loads(raw)\"},{\"call\":\"json.loads\",\"keywords\":[\"object_pairs_hook\"],\"line\":288,\"segment_sha256\":\"bf67e3bbc5d4ac5ab0d15340108bb5410b74494961d88fa35c556acbf64afbd4\",\"text\":\"json.loads(\\n raw.decode(\\\"utf-8\\\"),\\n object_pairs_hook=no_duplicates,\\n )\"},{\"call\":\"subprocess.run\",\"keywords\":[\"check\",\"env\",\"stderr\",\"stdin\",\"stdout\",\"text\",\"timeout\"],\"line\":664,\"segment_sha256\":\"fbe36f5d1ed7b23d545f105135de2993138aa4a8dafc9f5419d7c37b36deebae\",\"text\":\"subprocess.run(\\n args,\\n stdin=subprocess.DEVNULL,\\n stdout=subprocess.PIPE,\\n stderr=subprocess.PIPE,\\n text=True,\\n check=False,\\n timeout=timeout,\\n env=(SAFE_ENV if env is None else env),\\n )\"},{\"call\":\"json.loads\",\"keywords\":[],\"line\":706,\"segment_sha256\":\"49c73d21d24e89e31f7701c67025900b8b000fbdde1520e1ce4bbc04d0a543c4\",\"text\":\"json.loads(result.stdout)\"},{\"call\":\"os.read\",\"keywords\":[],\"line\":1053,\"segment_sha256\":\"69a810c779430086a44faf90bb2d5d4bbebbe3ba7a85dd8c3148ad4f9112eda4\",\"text\":\"os.read(fd, min(1024 * 1024, remaining))\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"separators\",\"sort_keys\"],\"line\":1517,\"segment_sha256\":\"8623f260b2f2a1eaf0e8be9c2d4e8370e8567247e20f5e53556b7ac266f75403\",\"text\":\"json.dumps(\\n items,\\n ensure_ascii=False,\\n sort_keys=True,\\n separators=(\\\",\\\", \\\":\\\"),\\n )\"},{\"call\":\"subprocess.Popen\",\"keywords\":[\"close_fds\",\"env\",\"start_new_session\",\"stderr\",\"stdin\",\"stdout\"],\"line\":1626,\"segment_sha256\":\"90bb736720d2877f6704459828dc5551619ba00834a4660e9ed9c7f86e05b8c6\",\"text\":\"subprocess.Popen(\\n [\\n sys.executable,\\n \\\"-B\\\",\\n str(Path(__file__).resolve()),\\n \\\"--worker\\\",\\n short_id,\\n ],\\n \"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"separators\"],\"line\":1758,\"segment_sha256\":\"68a59ab16988992d8cb583f19eee1b55a7f8dc45e355d3655b47d522968e335e\",\"text\":\"json.dumps(\\n state[\\\"manifest\\\"][\\\"argv\\\"],\\n separators=(\\\",\\\", \\\":\\\"),\\n ensure_ascii=False,\\n )\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"indent\",\"sort_keys\"],\"line\":1778,\"segment_sha256\":\"d31eb8080be3fc4f69b562e41f97dd655755ae2cdf26f99434c4521f86b0547c\",\"text\":\"json.dumps(\\n capsule_summary,\\n ensure_ascii=False,\\n indent=2,\\n sort_keys=True,\\n )\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"indent\",\"sort_keys\"],\"line\":1822,\"segment_sha256\":\"e8af89f3e8da544b76204b745215223c8d2381300b60dc0c5e1baf6a4096ffdd\",\"text\":\"json.dumps(\\n meta,\\n ensure_ascii=False,\\n indent=2,\\n sort_keys=True,\\n )\"}],\"schema_fields\":[\"argv\",\"content_b64\",\"mode\",\"payload\",\"risk\"],\"sha256\":\"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d\"},{\"anchors\":[{\"line\":596,\"segment_sha256\":\"bea803e2bf945e9c5008a239e11936ecdbd8475018029010553aae5d638af370\",\"text\":\"path == \\\"/bridge/bridge.cmd\\\"\"},{\"line\":791,\"segment_sha256\":\"528504d107f4e3a9c88fb94943e594ed199c19d14b7398d0499ed62a41c176f9\",\"text\":\"path == \\\"/api/import\\\"\"}],\"basename\":\"homelab-command-portal\",\"bytes\":39936,\"functions\":[{\"args\":[\"request\"],\"end\":91,\"header\":\"def adapter_call(request: dict[str, Any]) -> dict[str, Any]:\\n encoded = (\",\"hotspot\":[{\"end\":46,\"original_sha256\":\"0810613963b5a41789eb5ecf131bf80b45e647dded9b35c5e68d4b9292f8a223\",\"start\":43,\"text\":\"43:\\n44:def adapter_call(request: dict[str, Any]) -> dict[str, Any]:\\n45: encoded = (\\n46: json.dumps(\"}],\"keyword_line_count\":7,\"name\":\"adapter_call\",\"segment_sha256\":\"1d4f3585656373b842054a15f1b11fb43cf9feab695b82df3ea8f5e8a693030a\",\"start\":44},{\"args\":[\"self\",\"status\",\"content_type\",\"body\"],\"end\":504,\"header\":\" def reply(\\n self,\",\"hotspot\":[{\"end\":477,\"original_sha256\":\"aaa0d62cf14511be6509347c1614c7f23cfcf9714885cb1464f9fb9d8961005b\",\"start\":474,\"text\":\"474: content_type: str,\\n475: body: bytes,\\n476: *,\\n477: headers: dict[str, str] | None = None,\"}],\"keyword_line_count\":4,\"name\":\"reply\",\"segment_sha256\":\"0be03d4b20f918f84107b98285a7d9bc750fcb4c717453a041a46ad7271bec53\",\"start\":471},{\"args\":[\"self\"],\"end\":764,\"header\":\" def do_GET(self) -> None:\\n try:\",\"hotspot\":[{\"end\":688,\"original_sha256\":\"dfa2bbf4800083be58a8dfb63301a47bcc206c21d4d158922ec232412fa4a17c\",\"start\":685,\"text\":\"685: f\\\"/r/{short_id}\\\",\\n686: headers={\\\"Set-Cookie\\\": cookie},\\n687: )\\n688: return\"}],\"keyword_line_count\":15,\"name\":\"do_GET\",\"segment_sha256\":\"e49c3c1e64918367b3f4c1d7404beed09ac2fe19b3be22c59b59e3f8c2d52881\",\"start\":553},{\"args\":[\"self\"],\"end\":907,\"header\":\" def do_POST(self) -> None:\\n try:\",\"hotspot\":[{\"end\":774,\"original_sha256\":\"9d3ee7b22c1c1a4de2f9220e8211c79b320c1f378da508e9408877a6ca0349d5\",\"start\":771,\"text\":\"771: if path == \\\"/api/enroll\\\":\\n772: body = self.read_body(512).decode(\\n773: \\\"ascii\\\",\\n774: errors=\\\"strict\\\",\"}],\"keyword_line_count\":14,\"name\":\"do_POST\",\"segment_sha256\":\"6c3b664bc61fb4bc506662a1711d99017254441864528c27da5db76254864694\",\"start\":766},{\"args\":[\"request\"],\"end\":1045,\"header\":\" def fake_adapter_call(request: dict[str, Any]) -> dict[str, Any]:\\n attempts[\\\"count\\\"] += 1\",\"hotspot\":[{\"end\":1043,\"original_sha256\":\"cfdde978ab18d008414db8e692c50d3de47ac561eadbc2d7deb81a5a1b17f669\",\"start\":1040,\"text\":\"1040:\\n1041: def fake_adapter_call(request: dict[str, Any]) -> dict[str, Any]:\\n1042: attempts[\\\"count\\\"] += 1\\n1043: if attempts[\\\"count\\\"] < 3:\"}],\"keyword_line_count\":1,\"name\":\"fake_adapter_call\",\"segment_sha256\":\"ce0cd75c856eb06926ff96b1c3d65c0ef72b6f409b5831122724d22a951fef97\",\"start\":1041}],\"mode\":\"0o755\",\"process_sites\":[{\"call\":\"json.dumps\",\"keywords\":[\"separators\",\"sort_keys\"],\"line\":46,\"segment_sha256\":\"d2796347998c58685d8dfd45d5df5fe51509645aba7a264e7dc25cb1f352c982\",\"text\":\"json.dumps(\\n request,\\n separators=(\\\",\\\", \\\":\\\"),\\n sort_keys=True,\\n )\"},{\"call\":\"json.loads\",\"keywords\":[],\"line\":81,\"segment_sha256\":\"6a36fbe7611c83cf1f9a144d11feb88410bbc002bb2aeeffc19cd9b97fdab2b4\",\"text\":\"json.loads(raw)\"},{\"call\":\"json.dumps\",\"keywords\":[\"separators\",\"sort_keys\"],\"line\":113,\"segment_sha256\":\"e2fb745bae0108aba634dcdc658da4a7423b1439f0ea5f9c725fb8338e962574\",\"text\":\"json.dumps(\\n result,\\n separators=(\\\",\\\", \\\":\\\"),\\n sort_keys=True,\\n )\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"indent\"],\"line\":337,\"segment_sha256\":\"d6f51399c0a5250e2e7ce94f7692c5d23b32e73e2a40cfe39dfe708615296a95\",\"text\":\"json.dumps(\\n {\\n \\\"status\\\": status,\\n \\\"execution\\\": execution,\\n \\\"evidence\\\": evidence,\\n },\\n ensure_ascii=False,\\n indent=2,\\n )\"},{\"call\":\"self.rfile.read\",\"keywords\":[],\"line\":541,\"segment_sha256\":\"e88ccc84bddb9730bf85279cc75080f708954fea1522420d79deeef7f4d4022e\",\"text\":\"self.rfile.read(length)\"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"separators\",\"sort_keys\"],\"line\":569,\"segment_sha256\":\"54d09d0aed4fa5af8f08233988dff5e409332754d7767eef48c0e09cad7482d3\",\"text\":\"json.dumps(\\n {\\n \\\"status\\\": \\\"ok\\\",\\n \\\"version\\\": 3,\\n \\\"adapter\\\": result[\\\"status\\\"],\\n \\\"result_sequence\\\": recent[\\n \"},{\"call\":\"json.dumps\",\"keywords\":[\"ensure_ascii\",\"separators\",\"sort_keys\"],\"line\":745,\"segment_sha256\":\"c69d1ae04da0c2a85f4db115bb6aca05e6712ea223bec16c952e99dcc0df4f64\",\"text\":\"json.dumps(\\n state,\\n ensure_ascii=False,\\n separators=(\\\",\\\", \\\":\\\"),\\n sort_keys=True,\\n )\"}],\"schema_fields\":[\"Authorization\",\"Cookie\",\"risk\"],\"sha256\":\"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52\"}],\"analysis_ready\":true,\"changes_made\":false,\"command_id\":\"HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z\",\"command_rc\":0,\"mutation_outcome\":\"NO_MUTATION\",\"next_action\":\"BUILD_SHA_GUARDED_EPHEMERAL_SECRET_HANDOFF_TRANSACTION\",\"output_truncated_in_json\":false,\"projection\":{\"degraded\":false,\"safe_limit_bytes\":18000,\"strategy\":\"one_hotspot_per_target_function\"},\"rc\":0,\"read_only\":true,\"required_functions\":{\"adapter\":[\"run_command\",\"sanitize_state\",\"substitute_argv\"],\"portal\":[\"adapter_call\",\"do_POST\"]},\"rollback_restored\":null,\"rollback_started\":false,\"root_cause_classification\":\"SHA_GUARDED_COMPACT_PATCH_CONTEXT_CAPTURED\",\"schema\":1,\"status\":\"OK\",\"transaction_requirements\":{\"atomic_replace\":true,\"automatic_exact_rollback\":true,\"byte_for_byte_backup\":true,\"candidate_compile_and_selftest\":true,\"candidate_in_temporary_directory\":true,\"expected_sha_preconditions\":{\"homelab-command-adapter\":\"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d\",\"homelab-command-portal\":\"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52\"},\"read_exact_current_sources\":true,\"secret_never_in_capsule_argv_output_or_evidence\":true,\"service_health_verification\":true},\"units\":[{\"active_state\":\"active\",\"exec_basename\":\"homelab-command-adapter\",\"exec_path_sha256\":\"c2e3b43f1f858c6fa265dc276d6a6a29e0cd25e4a127fbc093b8c8d9512bb739\",\"fragment_path_sha256\":\"afe4d91c280ac4e6e9999498b5f5d8b8842a1f33e30fd45d984879a6392bc045\",\"sub_state\":\"running\",\"unit\":\"homelab-command-adapter.service\"},{\"active_state\":\"active\",\"exec_basename\":\"homelab-command-portal\",\"exec_path_sha256\":\"1132c3c355ed18cdc6406935cd26a128df298f71df7f48df690c72b202ddd7be\",\"fragment_path_sha256\":\"adf87b0f1c821b17e3e2ff19cc024d783b55caf69460d01fa66f7d2579a71f5a\",\"sub_state\":\"running\",\"unit\":\"homelab-command-portal.service\"}]}\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index 687b9d6..aa16780 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,15 +1,15 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=HOMELAB-CLUSTER-KB-V1-GITEA-DEFINED-CLUSTER-FACT-GAP-READ-ONLY-20260805T131000Z +COMMAND_ID=HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z STATUS=OK RC=0 HOST=pve01 MODE=verify -COMPONENT=cluster-knowledge-base-error-system +COMPONENT=skladchik-handoff-patch-context-ro-v2 REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83 -COMMAND_SHA256=9088e8f5ce54b2b810894f0d1860a25390b3179b29d85f63e19e6f81c9f066a6 +COMMAND_SHA256=bdbee9327f44bfcf4da9c41496257b1a350c1792ec5f354159da6621124d7f6d DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true CHANGE_DECLARED=false @@ -24,11 +24,11 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=6c2d4b05d4a1d95e2dfbc5ebcff23469e469ec2d5e1550a49d07c3ad51a5f205 -SANITIZED_OUTPUT_SHA256=6c2d4b05d4a1d95e2dfbc5ebcff23469e469ec2d5e1550a49d07c3ad51a5f205 +RAW_EVIDENCE_SHA256=645b443333752ee2a7900290eb7a21e410acefb1a4ed929a99c139da80dd1719 +SANITIZED_OUTPUT_SHA256=645b443333752ee2a7900290eb7a21e410acefb1a4ed929a99c139da80dd1719 OUTPUT_BEGIN -HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"HOMELAB-CLUSTER-KB-V1-GITEA-DEFINED-CLUSTER-FACT-GAP-READ-ONLY-20260805T131000Z","command_rc":0,"mutation_outcome":"NO_MUTATION","output_truncated_in_json":false,"rc":0,"rollback_restored":null,"rollback_started":false,"status":"OK","version":1} -{"api":{"fetch_failure_count":0,"fetched_file_count":104,"fetched_total_bytes":297443,"route_coverage":{"blob":true,"branch":true,"repo":true,"tree":true},"text_file_count":104,"tree":{"blob_count":125,"body_emitted":false,"complete":true,"entry_count":161,"exact_commit":"fe1221b06643db3b00a621b0230f92a46a4edc2b","json_parse_ok":true,"status":200,"tree_count":36,"truncated":false}},"authorization_sent":true,"authorization_values_emitted":false,"branch":{"body_emitted":false,"branch":"main","commit_sha":"fe1221b06643db3b00a621b0230f92a46a4edc2b","json_parse_ok":true,"matches_expected_commit":true,"status":200},"changes_made":false,"command_id":"HOMELAB-CLUSTER-KB-V1-GITEA-DEFINED-CLUSTER-FACT-GAP-READ-ONLY-20260805T131000Z","command_rc":0,"credential_values_emitted":false,"endpoint_summary":{"address_literal_occurrence_count":81,"raw_addresses_emitted":false,"raw_url_occurrence_count":6,"raw_urls_emitted":false,"scope_counts":{"external_hostname":2,"known_external_gitea":1,"private":1},"tokens":[{"host_scope":"external_hostname","host_sha256":"8005522570737cc57f67406b7c6fb5d572797e4ba947dfb0bf3befee3639e667","path_depth":2,"port":null,"scheme":"https"},{"host_scope":"known_external_gitea","host_sha256":"92feea413ab6bd72fdd8b9102d872777d284d002a6be3e5323ca6e848105ee88","path_depth":2,"port":null,"scheme":"https"},{"host_scope":"external_hostname","host_sha256":"11d6a89894efa93b767088253526b02bac35874c1f63783507a3fb1d3b194e8a","path_depth":3,"port":null,"scheme":"https"},{"host_scope":"private","host_sha256":"7f25d5297f515cb92000161cbee4cb49a7fbbbd1c0ef2466a5d88644f4bb6d69","path_depth":1,"port":8081,"scheme":"http"}],"unique_endpoint_token_count":4},"error_fingerprint":"dadccd2e354a457c337b9089047ec0a0918a5d3cccd5a188b83f8dce425a59ab","error_registry":{"content_sha256":"8051e3e761493a1b7088a0f3ed7e0aa9218673f453ca88171178364d26701f64","duplicate_fingerprint_count":0,"duplicate_id_count":0,"duplicate_ids":[],"fingerprint_value_count":0,"fingerprint_values_emitted":false,"migratable_record_count":0,"migration_coverage_ratio":0.0,"path":"errors/regression-cases.json","present":true,"prevention_evidence_count":0,"raw_records_emitted":false,"record_count":59,"status_counts":{},"unique_fingerprint_count":0,"unique_id_count":59},"fact_record_summary":{"domain_record_counts":{"access":10,"freshness":25,"identity":16},"emitted_record_count":25,"raw_record_values_emitted":false,"secret_hashes_emitted":false,"source_record_counts":{"inventory/access-paths.json":9,"inventory/cluster-nodes.json":3,"observed/cluster-guests.json":11,"observed/current-context.json":2},"top_fields":["status","id","node","type","name","vmid","address","service"],"unique_record_count":25},"fact_records":[],"fact_records_omitted_but_count_retained":true,"files_written":false,"http_methods":["GET"],"mutation_blueprint":{"atomicity_requirements":["read all exact source blobs again at the expected branch commit","build the full candidate tree in a temporary directory","validate JSON, JSONL, schemas, gate self-tests and repository tests","create byte-for-byte backup objects for every modified blob","create one commit against the expected parent commit","verify the new commit tree and CI-visible files","on any failure restore the exact previous branch state"],"code_root_choice":{"basis":"existing_top_level_code_or_directory","existing_python_file_count":2,"path":"tools/pre_command_gate.py","path_exists":false,"root":"tools"},"files_to_create_or_replace":["docs/CLUSTER-HANDBOOK.md","inventory/cluster-reference.json","docs/ERROR-SYSTEM-V2.md","schemas/error-record.schema.json","errors/error-registry.jsonl","tools/pre_command_gate.py","tests/test_error_system_v2.py"],"files_to_update_conditionally":[".gitea/workflows/ci.yml","docs/WORKFLOW.md"],"migration_requirements":{"append_runtime_failures_from_known_error_gate":true,"derive_fingerprint_only_from_sanitized_stable_fields":true,"mark_parallel_draft_superseded_only_after_validation":true,"preserve_all_existing_records":true,"require_prevention_test_for_each_active_record":true},"migration_source":"errors/regression-cases.json","ready":true,"transaction_preconditions":{"branch":"main","exact_source_sha256":{".gitea/workflows/ci.yml":"b078ac1b57e0846a90fd6acb1f3cb0866dbed0fb3bbde0d7070d29a344907681","docs/WORKFLOW.md":"87a6f9a0960ee7240261138ecea122fd8fbd727d87bb0b27b02c103c3bc2f122","errors/regression-cases.json":"8051e3e761493a1b7088a0f3ed7e0aa9218673f453ca88171178364d26701f64","schemas/change.schema.json":"57fbce7c6ca1f53c5ec2f8cd604d787f01019a2184b611e3b4406b467331d0af","schemas/context.schema.json":"84c3c29984402b25c102575b54bdb82544844e455d3d2e115fefc5f42021e043"},"expected_branch_commit":"fe1221b06643db3b00a621b0230f92a46a4edc2b","proposed_paths":[{"creation_precondition":"must_remain_absent","exists_at_exact_commit":false,"path":"docs/CLUSTER-HANDBOOK.md"},{"creation_precondition":"must_remain_absent","exists_at_exact_commit":false,"path":"inventory/cluster-reference.json"},{"creation_precondition":"must_remain_absent","exists_at_exact_commit":false,"path":"docs/ERROR-SYSTEM-V2.md"},{"creation_precondition":"must_remain_absent","exists_at_exact_commit":false,"path":"schemas/error-record.schema.json"},{"creation_precondition":"must_remain_absent","exists_at_exact_commit":false,"path":"errors/error-registry.jsonl"},{"creation_precondition":"must_remain_absent","exists_at_exact_commit":false,"path":"tests/test_error_system_v2.py"},{"creation_precondition":"must_remain_absent","exists_at_exact_commit":false,"path":"tools/pre_command_gate.py"}],"repository":"homelab-admin/homelab-ops"}},"mutation_outcome":"NO_MUTATION","network_requests_made":true,"next_action":"RUN_ONE_IDEMPOTENT_GITEA_TRANSACTION_CREATE_CLUSTER_HANDBOOK_AND_ERROR_SYSTEM_V2","output_truncated_in_json":false,"pre_command_known_error_gate":{"checked":true,"known_error_count":28,"known_error_ids":["candidate-file-limit-600-20260805","runner-wrapper-mismatch-after-success-20260805","canonical-cluster-handbook-ambiguous-20260805","pvesh-adapter-context-unreadable-20260805","homelab-ops-bare-repository-not-found-local-20260805","gitea-network-fallback-stage-not-emitted-20260805","gitea-owner-hardcoded-homelab-admin-20260805","gitea-git-auth-required-or-credential-unavailable-20260805","gitea-process-self-match-payload-name-20260805","sanitize-bool-attributeerror-20260805","reader-v3-path-misclassified-as-route-20260805","reader-v3-loopback-assumption-20260805","reader-v3-capability-not-treated-as-secret-20260805","reader-v3-systemd-unit-fed-to-python-ast-20260805","reader-v3-helper-control-flow-not-traced-20260805","reader-v3-post-capability-operation-not-derived-20260805","reader-v3-detected-operations-not-tested-20260805","reader-v3-manifest-global-not-bound-in-sandbox-20260805","reader-v3-result-file-second-source-not-read-20260805","reader-v3-negative-control-mixed-with-production-20260805","reader-v3-manifest-schema-guessed-20260805","reader-result-output-bound-after-compaction-20260805","reader-v3-generation-record-shape-guessed-20260805","reader-v3-result-file-assumed-standalone-json-20260805","reader-v3-gitea-detail-marker-false-inventory-20260805","reverse-proxy-runtime-not-visible-on-host-20260805","gitea-public-owner-not-anonymously-discoverable-20260805","exact-output-long-line-not-projectable-by-portal-view-20260805"],"previous_exact_identity_verified":true},"previous_exact_verification":{"bundle_bytes_ok":true,"bundle_sha256_ok":true,"capsule_member_match_count":0,"capsule_sha256_basis":"verified exact lane before command publication; optional bundle member count reported separately","checks":{"changes_made_false":true,"command_id":true,"command_rc_zero":true,"contract_ok":true,"mutation_outcome_no_mutation":true,"projection_ok":true,"rollback_started_false":true,"runner_rc_zero":true,"runner_status_ok":true},"embedded_output_match_count":1,"exists":true,"identity_fully_verified":true,"member_count":6,"path_from_exact_result":true,"runner_json_match_count":1,"runner_text_match_count":1,"unsafe_member_rejected":false},"private_addresses_emitted":false,"raw_repository_contents_emitted":false,"rc":0,"read_only":true,"ready_for_idempotent_mutation":true,"regression_tests":{"endpoint_token_hides_host":true,"git_blob_oid_semantics":true,"known_error_gate_complete":true,"passed":true,"private_address_not_emitted":true,"safe_record_fingerprint_deterministic":true,"sanitize_bool_type_safe":true,"secret_value_redacted_before_record_hash":true,"strict_handbook_excludes_error_registry":true},"repository":{"archived":false,"default_branch":"main","empty":false,"full_name":"homelab-admin/homelab-ops","identity_safe":true,"mirror":false,"name":"homelab-ops","owner":"homelab-admin","private":true,"size":3837},"result_projection":{"budget_bytes":24976,"bytes":24326,"steps":["source_summaries_24","fact_records_32","drop_json_shapes_and_limit_headings","handbook_candidates_4","omit_fact_records"]},"rollback_restored":null,"rollback_started":false,"root_cause_classification":"GITEA_CLUSTER_FACTS_AND_DOCUMENT_GAPS_EXACTLY_ANALYZED_MUTATION_READY","schema":1,"secret_hashes_emitted":false,"source_summaries":[{"blob_sha":"7a8cb9e2dd5bc1235937aa211293b47ed4e26263","bytes":29485,"content_sha256":"8051e3e761493a1b7088a0f3ed7e0aa9218673f453ca88171178364d26701f64","domains":{"access":9,"backup":22,"error_system":38,"freshness":5,"internal_external":1,"repair":38,"restore":9,"services":8},"headings":[],"json_parse_ok":true,"path":"errors/regression-cases.json","raw_content_emitted":false,"secret_key_name_occurrence_count":60},{"blob_sha":"bad7037197f12ce9ce0b8be3b5723345699680b5","bytes":2289,"content_sha256":"e07ccfac39f862c2bce2da0d31112e8e055ca9d3f23a01a8f33302863239203a","domains":{"access":1,"backup":0,"error_system":1,"freshness":1,"internal_external":2,"repair":0,"restore":0,"services":0},"headings":[],"json_parse_ok":true,"path":"changes/CR-2026-0018/regression-cases-draft.json","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"d072c291ee6b99466be0f4897e9d1308ee02e2b2","bytes":1134,"content_sha256":"df400edc01d8201665c92e7434f8b0663eac0d34aab35e918abfb9bb873877e8","domains":{"access":0,"backup":0,"error_system":0,"freshness":2,"internal_external":0,"repair":1,"restore":0,"services":4},"headings":["Caller inventory requirements","Search surfaces","Required record","Gate"],"json_parse_ok":false,"path":"changes/CR-2026-0018/caller-inventory-requirements.md","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"823d591344d8b8f67e213e2b890acdbd7bfc9864","bytes":211,"content_sha256":"d3347712264b62c8768c952575574140c388df6d4d045c824ed9a8722bad1454","domains":{"access":0,"backup":0,"error_system":0,"freshness":0,"internal_external":0,"repair":1,"restore":0,"services":0},"headings":["Changes"],"json_parse_ok":false,"path":"changes/README.md","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"c42de139cdf529611d50ad86291fb40df5bc0d09","bytes":1652,"content_sha256":"ac5dc881dcd9fcb72644bc893e866f463c9c2b9b4544e32434e21b5d34168fb5","domains":{"access":9,"backup":0,"error_system":0,"freshness":0,"internal_external":0,"repair":0,"restore":0,"services":0},"headings":[],"json_parse_ok":true,"path":"inventory/access-paths.json","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"5a1fb00b587a813cee2a7bd98be451bd22173f5e","bytes":4952,"content_sha256":"6b732f5ce3af0e8066d020bf10ee81b764b6d93ee5f08a9c8f17d0075eeced32","domains":{"access":0,"backup":0,"error_system":0,"freshness":0,"internal_external":0,"repair":0,"restore":1,"services":22},"headings":[],"json_parse_ok":true,"path":"observed/cluster-guests.json","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"3327f8b644b3f3e83774d5e7748a8dfa6b4f1ebf","bytes":958,"content_sha256":"5e7236f3b8072ff6115ab5bc50ad448425882e86463e90d85df1a1c8eb502d65","domains":{"access":0,"backup":1,"error_system":0,"freshness":0,"internal_external":0,"repair":1,"restore":0,"services":2},"headings":["Архитектура управления","Разделение ответственности"],"json_parse_ok":false,"path":"docs/ARCHITECTURE.md","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"3b034041ab628d15e74a7167b5545b366aeb4ad1","bytes":526,"content_sha256":"87a6f9a0960ee7240261138ecea122fd8fbd727d87bb0b27b02c103c3bc2f122","domains":{"access":0,"backup":0,"error_system":0,"freshness":1,"internal_external":0,"repair":1,"restore":0,"services":0},"headings":["Change workflow"],"json_parse_ok":false,"path":"docs/WORKFLOW.md","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"f03826dcf6f8c6af4a8a78206c1b841ffaffd2ca","bytes":3020,"content_sha256":"91c66d8ee6622d925174055599ad5ece6270c35f8d7d7967a26609f7e290c7e6","domains":{"access":0,"backup":1,"error_system":3,"freshness":4,"internal_external":0,"repair":1,"restore":1,"services":0},"headings":["Одна постоянная команда","Что проверяется автоматически","Правила безопасности"],"json_parse_ok":false,"path":"docs/skladchik-cookie-refresh.md","raw_content_emitted":false,"secret_key_name_occurrence_count":17},{"blob_sha":"b4979003f9bb899f4a5de41ede47eacaeac48dee","bytes":2264,"content_sha256":"e74454f528cdb5522e2c43d959472a04b7cc36e33da7aa5a5bd664fc79015344","domains":{"access":2,"backup":0,"error_system":0,"freshness":2,"internal_external":0,"repair":0,"restore":0,"services":1},"headings":["Skladchik Moderator Assistant","Назначение","Что планируется подготовить позднее","Что сейчас не делать"],"json_parse_ok":false,"path":"docs/planned/skladchik-moderator-assistant.md","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"9586f62339cc657d18d033c104229458ebcadb58","bytes":1290,"content_sha256":"cfb21fbf6ead4b3537b5f6f43e19602365b7b16adba5f317e48f8f19f5d40475","domains":{"access":0,"backup":0,"error_system":2,"freshness":0,"internal_external":1,"repair":1,"restore":0,"services":0},"headings":[],"json_parse_ok":true,"path":"policies/operating-policy.json","raw_content_emitted":false,"secret_key_name_occurrence_count":1},{"blob_sha":"2032d3ebab4794625854b8c80d23ab72aac9998b","bytes":1436,"content_sha256":"e06b7e6285eda2885ef913aa954a70abc7c1d892199a8b7cea2ada98b8edba34","domains":{"access":0,"backup":2,"error_system":3,"freshness":0,"internal_external":0,"repair":3,"restore":2,"services":0},"headings":[],"json_parse_ok":true,"path":"policies/cluster-cloud-quorum.json","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"8352f9a2024afea21049cd7700e460ee096c6c53","bytes":969,"content_sha256":"57fbce7c6ca1f53c5ec2f8cd604d787f01019a2184b611e3b4406b467331d0af","domains":{"access":0,"backup":2,"error_system":0,"freshness":0,"internal_external":0,"repair":2,"restore":0,"services":0},"headings":[],"json_parse_ok":true,"path":"schemas/change.schema.json","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"7dc9476a8ca0227b4d5bf0cbd2c706c60af21119","bytes":539,"content_sha256":"84c3c29984402b25c102575b54bdb82544844e455d3d2e115fefc5f42021e043","domains":{"access":0,"backup":0,"error_system":0,"freshness":0,"internal_external":0,"repair":0,"restore":0,"services":0},"headings":[],"json_parse_ok":true,"path":"schemas/context.schema.json","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"3d6801bd6e7faefd1fc4579c41dc387f3dd1a9f0","bytes":318,"content_sha256":"b078ac1b57e0846a90fd6acb1f3cb0866dbed0fb3bbde0d7070d29a344907681","domains":{"access":0,"backup":0,"error_system":1,"freshness":0,"internal_external":0,"repair":0,"restore":0,"services":1},"headings":[],"json_parse_ok":false,"path":".gitea/workflows/ci.yml","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"68ae87029a1660255df02ff192e5b9206e9a6c05","bytes":13579,"content_sha256":"d3108777e5094468aa3e633740ce8a56c90ca957a9a62932be896bbe784680b0","domains":{"access":22,"backup":23,"error_system":16,"freshness":3,"internal_external":1,"repair":22,"restore":10,"services":13},"headings":[],"json_parse_ok":true,"path":"tasks/skladchik-reports-monitor-controlled-reauth-v1/task.json","raw_content_emitted":false,"secret_key_name_occurrence_count":43},{"blob_sha":"6e22f5ca60d95965765c03ac1d012631aaae68b0","bytes":6750,"content_sha256":"3a8fdfb6b4b64880012fcc3bc6fee4be6f101377310325541f9776de6d1623f7","domains":{"access":0,"backup":4,"error_system":16,"freshness":4,"internal_external":2,"repair":18,"restore":1,"services":28},"headings":[],"json_parse_ok":true,"path":"tasks/homelab-logrotate-namespace-latch-clearance-v1/task.json","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"a1528e7cbc2b1027bfd7faa220bf1f096cdde1f5","bytes":3665,"content_sha256":"666072447ba11d346772f62f274dadc974c4463e20f67e67f82f228f1fcf2ce8","domains":{"access":20,"backup":17,"error_system":1,"freshness":1,"internal_external":0,"repair":4,"restore":10,"services":7},"headings":[],"json_parse_ok":false,"path":"tasks/cluster-cloud-quorum-vm160-canary-v1/phases/rollback.sh","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"d2adf1bf345063da2b02040697f4358ba4ca4ae1","bytes":4667,"content_sha256":"a49bcb32ac7212d7fb9768db8a277cb5525c873c84dd6fb633edae35dc6de532","domains":{"access":8,"backup":14,"error_system":9,"freshness":1,"internal_external":0,"repair":1,"restore":6,"services":10},"headings":[],"json_parse_ok":false,"path":"tasks/cluster-cloud-quorum-vm160-canary-v1/phases/preflight.sh","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"c6f94aa845bc4cd8fc061e5e03e0fd7771a01bc6","bytes":7440,"content_sha256":"636254d2526f0f62184d47cdb4c30c2831b11869c2000c557666f60b55d7691b","domains":{"access":13,"backup":24,"error_system":13,"freshness":0,"internal_external":0,"repair":12,"restore":4,"services":8},"headings":[],"json_parse_ok":true,"path":"tasks/cluster-cloud-quorum-vm160-canary-v1/task.json","raw_content_emitted":false,"secret_key_name_occurrence_count":2},{"blob_sha":"9cc7d2fa3bc044d311500a5cf798273c79e39c35","bytes":4233,"content_sha256":"ac0885c9762b99f360256ad3b3894f9cbcc4a8deab529a19ef264fe446bff029","domains":{"access":8,"backup":16,"error_system":8,"freshness":1,"internal_external":0,"repair":7,"restore":0,"services":11},"headings":[],"json_parse_ok":false,"path":"tasks/cluster-cloud-quorum-vm160-canary-v1/phases/verify.sh","raw_content_emitted":false,"secret_key_name_occurrence_count":0},{"blob_sha":"774e2b0e591c9ada9aac9700a1b8427645284f1e","bytes":4665,"content_sha256":"34de7dd0cc60c90c1b74e7a91334cb737d33c761882d1483d5b39f15b439c6f1","domains":{"access":13,"backup":19,"error_system":1,"freshness":1,"internal_external":0,"repair":1,"restore":0,"services":7},"headings":[],"json_parse_ok":false,"path":"tasks/cluster-cloud-quorum-vm160-canary-v1/phases/apply.sh","raw_content_emitted":false,"secret_key_name_occurrence_count":3},{"blob_sha":"938db71d80350ac328ec90fe7bb5176a4d6d50ac","bytes":2867,"content_sha256":"3b8687392163cf5b6f8b0874087320fe74ceaa5fee897dd0e7762d8c71476a1c","domains":{"access":4,"backup":4,"error_system":1,"freshness":0,"internal_external":0,"repair":8,"restore":11,"services":3},"headings":[],"json_parse_ok":false,"path":"tasks/skladchik-reports-monitor-controlled-reauth-v1/phases/rollback.sh","raw_content_emitted":false,"secret_key_name_occurrence_count":2},{"blob_sha":"aefe7ac6860ec2107c281485b35c8cba1f1196ef","bytes":4846,"content_sha256":"cfde805604d58d87d975584431aeb024bef21e863c4293d4726e5504415fe9bc","domains":{"access":0,"backup":6,"error_system":5,"freshness":2,"internal_external":1,"repair":3,"restore":9,"services":0},"headings":[],"json_parse_ok":false,"path":"tests/test_cr_2026_0012_skladchik_cookie_refresh_runbook.py","raw_content_emitted":false,"secret_key_name_occurrence_count":21}],"status":"OK","strict_handbook":{"candidates":[{"canonical_phrase_hits":0,"content_sha256":"91c66d8ee6622d925174055599ad5ece6270c35f8d7d7967a26609f7e290c7e6","covered_domains":["backup","error_system","repair","restore"],"headings":["Одна постоянная команда","Что проверяется автоматически","Правила безопасности"],"path":"docs/skladchik-cookie-refresh.md","score":80,"title_signal":false},{"canonical_phrase_hits":1,"content_sha256":"5e7236f3b8072ff6115ab5bc50ad448425882e86463e90d85df1a1c8eb502d65","covered_domains":["backup","repair","services"],"headings":["Архитектура управления","Разделение ответственности"],"path":"docs/ARCHITECTURE.md","score":75,"title_signal":false},{"canonical_phrase_hits":1,"content_sha256":"d9cb129e009176a7dde2a07f59760acddd9e17237eef563e97a55b3e62838bd1","covered_domains":["repair"],"headings":["homelab-ops","Порядок работы","Локальная проверка"],"path":"README.md","score":55,"title_signal":true},{"canonical_phrase_hits":0,"content_sha256":"e74454f528cdb5522e2c43d959472a04b7cc36e33da7aa5a5bd664fc79015344","covered_domains":["access","services"],"headings":["Skladchik Moderator Assistant","Назначение","Что планируется подготовить позднее","Что сейчас не делать","Условие возобновления"],"path":"docs/planned/skladchik-moderator-assistant.md","score":40,"title_signal":false}],"path":null,"previous_loose_candidate_rejected":"errors/regression-cases.json","qualified_count":0,"rejection_reason":"error registry is not a cluster handbook under the strict source-class definition","status":"NOT_FOUND","strict_definition":{"allowed_source_classes":["docs","inventory","root index"],"excluded_source_classes":["errors","changes","tasks","tests","workflows","schemas"],"minimum_domains":6,"requires_canonical_phrase":true,"requires_cluster_title":true}},"verified_gaps":[{"evidence":{"qualified_count":0,"strict_status":"NOT_FOUND"},"gap_id":"canonical_cluster_handbook_absent","remediation":"create one canonical docs/CLUSTER-HANDBOOK.md and link every fact to an exact machine-readable source","severity":"BLOCKING"},{"evidence":{"path_verified_absent":true},"gap_id":"machine_readable_cluster_reference_absent","remediation":"create inventory/cluster-reference.json with source_sha256, verified_at and stale/unknown states","severity":"BLOCKING"},{"evidence":{"record_count":0},"gap_id":"structured_backup_restore_facts_absent","remediation":"materialize backup_restore facts into the machine-readable cluster reference","severity":"HIGH"},{"evidence":{"record_count":0},"gap_id":"structured_repair_facts_absent","remediation":"materialize repair facts into the machine-readable cluster reference","severity":"HIGH"},{"evidence":{"record_count":0},"gap_id":"structured_scope_facts_absent","remediation":"materialize scope facts into the machine-readable cluster reference","severity":"HIGH"},{"evidence":{"error_record_count":59,"fingerprint_count":0},"gap_id":"error_registry_has_no_fingerprints","remediation":"seed stable normalized fingerprints and block duplicate failed fingerprints before publication","severity":"BLOCKING"},{"evidence":{"error_record_count":59,"prevention_evidence_count":0},"gap_id":"error_registry_has_no_prevention_evidence","remediation":"require one positive and one negative prevention test for every active error record","severity":"BLOCKING"},{"evidence":{"ci_mentions_fingerprint":false,"ci_mentions_pre_command_gate":false},"gap_id":"ci_does_not_enforce_error_fingerprint_gate","remediation":"wire the pre-command gate and registry/schema tests into .gitea/workflows/ci.yml","severity":"BLOCKING"},{"evidence":{"both_present":true,"content_sha256_equal":false},"gap_id":"parallel_draft_and_canonical_error_registries_diverge","remediation":"declare canonical ownership and mark the draft superseded after migration","severity":"MEDIUM"},{"evidence":{"matching_path_count":0},"gap_id":"superseded_command_registry_absent","remediation":"record superseded command_id/capsule/result relationships during post-result ingestion","severity":"HIGH"}],"workflow_gate_signals":{"ci_mentions_error_registry":false,"ci_mentions_fingerprint":false,"ci_mentions_pre_command_gate":false,"ci_present":true,"repository_mentions_duplicate_failed_command_blocked":false,"repository_mentions_error_register_checked":false,"repository_mentions_reference_register_checked":false}} +HOMELAB_RESULT_CONTRACT={"changes_made":false,"command_id":"HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z","command_rc":0,"mutation_outcome":"NO_MUTATION","output_truncated_in_json":false,"rc":0,"rollback_restored":null,"rollback_started":false,"status":"OK","version":1} +{"active_files":[{"anchors":[{"line":427,"segment_sha256":"ba2a9f580ceb6219636a3c6a9c8e21ef038cb66dff11b5482b985947b12905bc","text":"1 <= len(argv) <= 128"},{"line":499,"segment_sha256":"8bd3e09d95d346415baa0597f44086071f2798ede0476c1adfad1f3b215c8e78","text":"len(payload) > 32"},{"line":536,"segment_sha256":"65bfbef8abd20d6fb32a7594441e172311729afb83b74c9a0fe65938127f7b6d","text":"relative in payload_paths"},{"line":565,"segment_sha256":"46eb980bc24c778b9d23e7d87fd5be7a19fa5efb58701ee8cd9608f85b527888","text":"total_payload > MAX_PAYLOAD_BYTES"},{"line":602,"segment_sha256":"15f5757fe00d2ce1ed6dda00fe692e7710cb4693f7228fb6de4bec9e5d7127b1","text":"relative not in payload_paths"},{"line":1745,"segment_sha256":"191286074b0b5feeb625b5ce92a9677a514dec1fcf9e169ed3968a79517be462","text":"runner_document.get(\"secrets_included\") is not False"},{"line":1756,"segment_sha256":"718c072975da02520b0011252316d9df080b88caa3ef021bad21aafd36c22597","text":"key != \"argv\""},{"line":2891,"segment_sha256":"874df6b19b74e478b27c859c5194626606613ff18b886fade606d5ba701d6de2","text":"(\n Path(directory) / \"payload\" / \"main.py\"\n ).read_bytes() == payload_content"}],"basename":"homelab-command-adapter","bytes":86019,"functions":[{"args":["args"],"end":673,"header":"def run_command(\n args: list[str],","hotspot":[{"end":668,"original_sha256":"8d44e4eb6b769400040df651f85468ce2751903e298a7b917d0da7720d99877e","start":665,"text":"665: args,\n666: stdin=subprocess.DEVNULL,\n667: stdout=subprocess.PIPE,\n668: stderr=subprocess.PIPE,"}],"keyword_line_count":5,"name":"run_command","segment_sha256":"ae477f09ebbf0c4b47b2def5d2e409b7a751ff9fdf5243f102c9449b4f2a26e9","start":658},{"args":["state"],"end":1592,"header":"def sanitize_state(state: dict[str, Any]) -> dict[str, Any]:\n execution = state.get(\"execution\")","hotspot":[{"end":1568,"original_sha256":"7c8ebb2ae104e19372bb498b12ef7405e9fd150a596324a214215b4dc8b13959","start":1565,"text":"1565:\n1566: evidence = state.get(\"evidence\")\n1567: public_evidence = None\n1568: if isinstance(evidence, dict):"}],"keyword_line_count":5,"name":"sanitize_state","segment_sha256":"175e0927b3285f609b85baca34569d3a6c932cfefaa59358dcf45e3a06702ac3","start":1547},{"args":["argv","payload_root"],"end":1692,"header":"def substitute_argv(\n argv: list[str],","hotspot":[{"end":1685,"original_sha256":"83a21c644a9a2942305c2d619e2225be2798ae3f0cb09f1ff49de00c636d7ff1","start":1682,"text":"1682: raise AdapterError(\n1683: \"payload argv escapes root\"\n1684: ) from exc\n1685: if not target.is_file() or target.is_symlink():"}],"keyword_line_count":6,"name":"substitute_argv","segment_sha256":"e8ba20cbb06e9edbf9c5c450b96698680d515fc4d560889919388697f03b69a5","start":1670},{"args":["args"],"end":2102,"header":"def run_existing_runner(\n args: list[str],","hotspot":[{"end":2058,"original_sha256":"72447a50c01a068395785579cdd058a5630ed22e8f7e73851066981064ca7a04","start":2055,"text":"2055:) -> subprocess.CompletedProcess[str]:\n2056: process = subprocess.Popen(\n2057: args,\n2058: stdin=subprocess.DEVNULL,"}],"keyword_line_count":8,"name":"run_existing_runner","segment_sha256":"485d5c01da41e1e871a9eeadde83cb97a3962adcf6ac4fee8fa74b945f338739","start":2049},{"args":["request"],"end":2745,"header":"def dispatch(request: dict[str, Any]) -> dict[str, Any]:\n operation = request.get(\"op\")","hotspot":[{"end":2641,"original_sha256":"63ea5ee14fcb5cf84b7f3921b8780888eafc16d31f6e2981e7e55c987219cba6","start":2638,"text":"2638:\n2639:def dispatch(request: dict[str, Any]) -> dict[str, Any]:\n2640: operation = request.get(\"op\")\n2641: if operation == \"health\":"}],"keyword_line_count":23,"name":"dispatch","segment_sha256":"3e4fc40ccc43328184094336f2fbe3604cd4e1be4a2cd057dae52b8369ae5bfe","start":2639},{"args":["self"],"end":2790,"header":" def handle(self) -> None:\n credentials = self.request.getsockopt(","hotspot":[{"end":2774,"original_sha256":"09e4d28ded165a82f3fcdcf09253762a4e59749f0503489bf41099a59570ff04","start":2771,"text":"2771: try:\n2772: request = json.loads(raw)\n2773: if not isinstance(request, dict):\n2774: raise AdapterError(\"request not object\")"}],"keyword_line_count":8,"name":"handle","segment_sha256":"794078bbd307f80c2f6640b374565fa119f03dabd1ba36a9c4d47d9b2d8865c6","start":2749}],"mode":"0o755","process_sites":[{"call":"stream.read","keywords":[],"line":197,"segment_sha256":"b132f27ce56f994d404626d8bcf725db9bd3a7476b7d532089ce2a297eb1e355","text":"stream.read(1024 * 1024)"},{"call":"json.dumps","keywords":["ensure_ascii","indent","sort_keys"],"line":204,"segment_sha256":"ee60c2fbdc8f97eff20f4ac617180559018ab7343898037639e94dcff31f7882","text":"json.dumps(\n value,\n ensure_ascii=False,\n indent=2,\n sort_keys=True,\n )"},{"call":"json.loads","keywords":[],"line":245,"segment_sha256":"6a36fbe7611c83cf1f9a144d11feb88410bbc002bb2aeeffc19cd9b97fdab2b4","text":"json.loads(raw)"},{"call":"json.loads","keywords":["object_pairs_hook"],"line":288,"segment_sha256":"bf67e3bbc5d4ac5ab0d15340108bb5410b74494961d88fa35c556acbf64afbd4","text":"json.loads(\n raw.decode(\"utf-8\"),\n object_pairs_hook=no_duplicates,\n )"},{"call":"subprocess.run","keywords":["check","env","stderr","stdin","stdout","text","timeout"],"line":664,"segment_sha256":"fbe36f5d1ed7b23d545f105135de2993138aa4a8dafc9f5419d7c37b36deebae","text":"subprocess.run(\n args,\n stdin=subprocess.DEVNULL,\n stdout=subprocess.PIPE,\n stderr=subprocess.PIPE,\n text=True,\n check=False,\n timeout=timeout,\n env=(SAFE_ENV if env is None else env),\n )"},{"call":"json.loads","keywords":[],"line":706,"segment_sha256":"49c73d21d24e89e31f7701c67025900b8b000fbdde1520e1ce4bbc04d0a543c4","text":"json.loads(result.stdout)"},{"call":"os.read","keywords":[],"line":1053,"segment_sha256":"69a810c779430086a44faf90bb2d5d4bbebbe3ba7a85dd8c3148ad4f9112eda4","text":"os.read(fd, min(1024 * 1024, remaining))"},{"call":"json.dumps","keywords":["ensure_ascii","separators","sort_keys"],"line":1517,"segment_sha256":"8623f260b2f2a1eaf0e8be9c2d4e8370e8567247e20f5e53556b7ac266f75403","text":"json.dumps(\n items,\n ensure_ascii=False,\n sort_keys=True,\n separators=(\",\", \":\"),\n )"},{"call":"subprocess.Popen","keywords":["close_fds","env","start_new_session","stderr","stdin","stdout"],"line":1626,"segment_sha256":"90bb736720d2877f6704459828dc5551619ba00834a4660e9ed9c7f86e05b8c6","text":"subprocess.Popen(\n [\n sys.executable,\n \"-B\",\n str(Path(__file__).resolve()),\n \"--worker\",\n short_id,\n ],\n "},{"call":"json.dumps","keywords":["ensure_ascii","separators"],"line":1758,"segment_sha256":"68a59ab16988992d8cb583f19eee1b55a7f8dc45e355d3655b47d522968e335e","text":"json.dumps(\n state[\"manifest\"][\"argv\"],\n separators=(\",\", \":\"),\n ensure_ascii=False,\n )"},{"call":"json.dumps","keywords":["ensure_ascii","indent","sort_keys"],"line":1778,"segment_sha256":"d31eb8080be3fc4f69b562e41f97dd655755ae2cdf26f99434c4521f86b0547c","text":"json.dumps(\n capsule_summary,\n ensure_ascii=False,\n indent=2,\n sort_keys=True,\n )"},{"call":"json.dumps","keywords":["ensure_ascii","indent","sort_keys"],"line":1822,"segment_sha256":"e8af89f3e8da544b76204b745215223c8d2381300b60dc0c5e1baf6a4096ffdd","text":"json.dumps(\n meta,\n ensure_ascii=False,\n indent=2,\n sort_keys=True,\n )"}],"schema_fields":["argv","content_b64","mode","payload","risk"],"sha256":"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d"},{"anchors":[{"line":596,"segment_sha256":"bea803e2bf945e9c5008a239e11936ecdbd8475018029010553aae5d638af370","text":"path == \"/bridge/bridge.cmd\""},{"line":791,"segment_sha256":"528504d107f4e3a9c88fb94943e594ed199c19d14b7398d0499ed62a41c176f9","text":"path == \"/api/import\""}],"basename":"homelab-command-portal","bytes":39936,"functions":[{"args":["request"],"end":91,"header":"def adapter_call(request: dict[str, Any]) -> dict[str, Any]:\n encoded = (","hotspot":[{"end":46,"original_sha256":"0810613963b5a41789eb5ecf131bf80b45e647dded9b35c5e68d4b9292f8a223","start":43,"text":"43:\n44:def adapter_call(request: dict[str, Any]) -> dict[str, Any]:\n45: encoded = (\n46: json.dumps("}],"keyword_line_count":7,"name":"adapter_call","segment_sha256":"1d4f3585656373b842054a15f1b11fb43cf9feab695b82df3ea8f5e8a693030a","start":44},{"args":["self","status","content_type","body"],"end":504,"header":" def reply(\n self,","hotspot":[{"end":477,"original_sha256":"aaa0d62cf14511be6509347c1614c7f23cfcf9714885cb1464f9fb9d8961005b","start":474,"text":"474: content_type: str,\n475: body: bytes,\n476: *,\n477: headers: dict[str, str] | None = None,"}],"keyword_line_count":4,"name":"reply","segment_sha256":"0be03d4b20f918f84107b98285a7d9bc750fcb4c717453a041a46ad7271bec53","start":471},{"args":["self"],"end":764,"header":" def do_GET(self) -> None:\n try:","hotspot":[{"end":688,"original_sha256":"dfa2bbf4800083be58a8dfb63301a47bcc206c21d4d158922ec232412fa4a17c","start":685,"text":"685: f\"/r/{short_id}\",\n686: headers={\"Set-Cookie\": cookie},\n687: )\n688: return"}],"keyword_line_count":15,"name":"do_GET","segment_sha256":"e49c3c1e64918367b3f4c1d7404beed09ac2fe19b3be22c59b59e3f8c2d52881","start":553},{"args":["self"],"end":907,"header":" def do_POST(self) -> None:\n try:","hotspot":[{"end":774,"original_sha256":"9d3ee7b22c1c1a4de2f9220e8211c79b320c1f378da508e9408877a6ca0349d5","start":771,"text":"771: if path == \"/api/enroll\":\n772: body = self.read_body(512).decode(\n773: \"ascii\",\n774: errors=\"strict\","}],"keyword_line_count":14,"name":"do_POST","segment_sha256":"6c3b664bc61fb4bc506662a1711d99017254441864528c27da5db76254864694","start":766},{"args":["request"],"end":1045,"header":" def fake_adapter_call(request: dict[str, Any]) -> dict[str, Any]:\n attempts[\"count\"] += 1","hotspot":[{"end":1043,"original_sha256":"cfdde978ab18d008414db8e692c50d3de47ac561eadbc2d7deb81a5a1b17f669","start":1040,"text":"1040:\n1041: def fake_adapter_call(request: dict[str, Any]) -> dict[str, Any]:\n1042: attempts[\"count\"] += 1\n1043: if attempts[\"count\"] < 3:"}],"keyword_line_count":1,"name":"fake_adapter_call","segment_sha256":"ce0cd75c856eb06926ff96b1c3d65c0ef72b6f409b5831122724d22a951fef97","start":1041}],"mode":"0o755","process_sites":[{"call":"json.dumps","keywords":["separators","sort_keys"],"line":46,"segment_sha256":"d2796347998c58685d8dfd45d5df5fe51509645aba7a264e7dc25cb1f352c982","text":"json.dumps(\n request,\n separators=(\",\", \":\"),\n sort_keys=True,\n )"},{"call":"json.loads","keywords":[],"line":81,"segment_sha256":"6a36fbe7611c83cf1f9a144d11feb88410bbc002bb2aeeffc19cd9b97fdab2b4","text":"json.loads(raw)"},{"call":"json.dumps","keywords":["separators","sort_keys"],"line":113,"segment_sha256":"e2fb745bae0108aba634dcdc658da4a7423b1439f0ea5f9c725fb8338e962574","text":"json.dumps(\n result,\n separators=(\",\", \":\"),\n sort_keys=True,\n )"},{"call":"json.dumps","keywords":["ensure_ascii","indent"],"line":337,"segment_sha256":"d6f51399c0a5250e2e7ce94f7692c5d23b32e73e2a40cfe39dfe708615296a95","text":"json.dumps(\n {\n \"status\": status,\n \"execution\": execution,\n \"evidence\": evidence,\n },\n ensure_ascii=False,\n indent=2,\n )"},{"call":"self.rfile.read","keywords":[],"line":541,"segment_sha256":"e88ccc84bddb9730bf85279cc75080f708954fea1522420d79deeef7f4d4022e","text":"self.rfile.read(length)"},{"call":"json.dumps","keywords":["ensure_ascii","separators","sort_keys"],"line":569,"segment_sha256":"54d09d0aed4fa5af8f08233988dff5e409332754d7767eef48c0e09cad7482d3","text":"json.dumps(\n {\n \"status\": \"ok\",\n \"version\": 3,\n \"adapter\": result[\"status\"],\n \"result_sequence\": recent[\n "},{"call":"json.dumps","keywords":["ensure_ascii","separators","sort_keys"],"line":745,"segment_sha256":"c69d1ae04da0c2a85f4db115bb6aca05e6712ea223bec16c952e99dcc0df4f64","text":"json.dumps(\n state,\n ensure_ascii=False,\n separators=(\",\", \":\"),\n sort_keys=True,\n )"}],"schema_fields":["Authorization","Cookie","risk"],"sha256":"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52"}],"analysis_ready":true,"changes_made":false,"command_id":"HOMELAB-SKLADCHIK-HANDOFF-PATCH-CONTEXT-READ-ONLY-V2-20260805T131200Z","command_rc":0,"mutation_outcome":"NO_MUTATION","next_action":"BUILD_SHA_GUARDED_EPHEMERAL_SECRET_HANDOFF_TRANSACTION","output_truncated_in_json":false,"projection":{"degraded":false,"safe_limit_bytes":18000,"strategy":"one_hotspot_per_target_function"},"rc":0,"read_only":true,"required_functions":{"adapter":["run_command","sanitize_state","substitute_argv"],"portal":["adapter_call","do_POST"]},"rollback_restored":null,"rollback_started":false,"root_cause_classification":"SHA_GUARDED_COMPACT_PATCH_CONTEXT_CAPTURED","schema":1,"status":"OK","transaction_requirements":{"atomic_replace":true,"automatic_exact_rollback":true,"byte_for_byte_backup":true,"candidate_compile_and_selftest":true,"candidate_in_temporary_directory":true,"expected_sha_preconditions":{"homelab-command-adapter":"a1a7a615c99568bf915d084cc476f0ebf54ab0eedf3ecd578c4b0e072f58c43d","homelab-command-portal":"97c69bd4fccf7272dadc911281c1503f411bae2dc11dac4b22b87f33d678ae52"},"read_exact_current_sources":true,"secret_never_in_capsule_argv_output_or_evidence":true,"service_health_verification":true},"units":[{"active_state":"active","exec_basename":"homelab-command-adapter","exec_path_sha256":"c2e3b43f1f858c6fa265dc276d6a6a29e0cd25e4a127fbc093b8c8d9512bb739","fragment_path_sha256":"afe4d91c280ac4e6e9999498b5f5d8b8842a1f33e30fd45d984879a6392bc045","sub_state":"running","unit":"homelab-command-adapter.service"},{"active_state":"active","exec_basename":"homelab-command-portal","exec_path_sha256":"1132c3c355ed18cdc6406935cd26a128df298f71df7f48df690c72b202ddd7be","fragment_path_sha256":"adf87b0f1c821b17e3e2ff19cc024d783b55caf69460d01fa66f7d2579a71f5a","sub_state":"running","unit":"homelab-command-portal.service"}]} OUTPUT_END CHAT_OUTPUT_END