{ "schema_version": 1, "channel": "homelab-runtime", "command_id": "RESULT-INTEGRATION-DESIGN-PREFLIGHT-20260727T064218Z", "status": "FAIL", "rc": 1, "host": "pve01", "mode": "verify", "component": "result-integration", "started_at_utc": "2026-07-27T07:21:08Z", "finished_at_utc": "2026-07-27T07:21:09Z", "reference_register_checked": true, "reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e", "error_register_checked": true, "error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83", "command_sha256": "2abcd8ed3caba3c56dfe1df39f3d834c9ed9e4972caf331a8e3d2132922beb6a", "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": 1, "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": "9d100401351f949bb1c6fb06d107acda5f52729fbcaedc717a0c0ce64222b74b", "sanitized_output_sha256": "e3e004dbf0b954143046f1135c5c929091333d74b8210438c0cdf9dc959aac55", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", "output": "{\"architecture\":{\"adapter_functions\":{\"dispatch\":{\"calls\":[\"AdapterError\",\"bind_enrollment\",\"consume_bootstrap\",\"enroll_device\",\"evidence_url\",\"get\",\"import_capsule\",\"public_state\",\"response_ok\",\"start_execution\",\"str\"],\"line\":2419,\"names\":[\"AdapterError\",\"Any\",\"bind_enrollment\",\"consume_bootstrap\",\"dict\",\"enroll_device\",\"evidence_url\",\"import_capsule\",\"operation\",\"public_state\",\"request\",\"response_ok\",\"start_execution\",\"str\"],\"strings\":[\"\",\"bind_enrollment\",\"client_ip\",\"consume_bootstrap\",\"device_token\",\"enroll\",\"evidence_url\",\"execute\",\"health\",\"import\",\"ok\",\"op\",\"session_token\",\"short_id\",\"state\",\"status\",\"token\",\"unsupported operation\",\"upload_path\",\"version\"]},\"evidence_url\":{\"calls\":[\"AdapterError\",\"GlobalLock\",\"authorize_session\",\"get\",\"isinstance\",\"load_json\",\"sign_evidence\",\"state_path\",\"str\"],\"line\":2186,\"names\":[\"AdapterError\",\"Any\",\"GlobalLock\",\"authorize_session\",\"client_ip\",\"dict\",\"digest\",\"evidence\",\"isinstance\",\"load_json\",\"object_key\",\"session_token\",\"short_id\",\"sign_evidence\",\"signed\",\"state\",\"state_path\",\"str\"],\"strings\":[\"evidence\",\"evidence not ready\",\"expires_at_utc\",\"object_key\",\"sha256\",\"url\"]},\"public_state\":{\"calls\":[\"GlobalLock\",\"authorize_session\",\"load_json\",\"sanitize_state\",\"state_path\"],\"line\":1311,\"names\":[\"Any\",\"GlobalLock\",\"authorize_session\",\"client_ip\",\"dict\",\"load_json\",\"sanitize_state\",\"session_token\",\"short_id\",\"state\",\"state_path\",\"str\"],\"strings\":[]},\"sanitize_state\":{\"calls\":[\"get\",\"isinstance\"],\"line\":1327,\"names\":[\"Any\",\"dict\",\"evidence\",\"execution\",\"isinstance\",\"key\",\"public_evidence\",\"public_execution\",\"state\",\"str\"],\"strings\":[\"bytes\",\"capsule_bytes\",\"capsule_sha256\",\"command_object\",\"error\",\"evidence\",\"execution\",\"finished_at_utc\",\"gateway_verified\",\"imported_at_utc\",\"manifest\",\"object_key\",\"runner_document_rc\",\"runner_json_sha256\",\"runner_rc\",\"runner_status\",\"runner_text_sha256\",\"runner_wrapper_matches_document\",\"schema_version\",\"sha256\",\"short_id\",\"started_at_utc\",\"status\"]},\"upload_evidence\":{\"calls\":[\"AdapterError\",\"remote_evidence_presign\",\"run_command\",\"sha256_file\",\"sign_evidence\",\"str\",\"token_hex\",\"unlink\"],\"line\":1668,\"names\":[\"AdapterError\",\"FileNotFoundError\",\"Path\",\"RUN_DIR\",\"bundle\",\"digest\",\"object_key\",\"remote_evidence_presign\",\"result\",\"run_command\",\"secrets\",\"sha256_file\",\"sign_evidence\",\"signed\",\"signed_get\",\"str\",\"verify\",\"verify_path\"],\"strings\":[\"--connect-timeout\",\"--fail\",\"--fail-with-body\",\"--max-time\",\"--output\",\"--request\",\"--resolve\",\"--show-error\",\"--silent\",\"--upload-file\",\".tgz\",\".verify-\",\"/usr/bin/curl\",\"10\",\"120\",\"; stderr=\",\"PUT\",\"evidence gateway SHA verification failed\",\"evidence gateway verification failed: \",\"evidence upload failed: rc=\",\"evidence.vpn.gram1.ru:443:[PRIVATE_IP]\",\"url\"]},\"worker\":{\"calls\":[\"AdapterError\",\"GlobalLock\",\"Path\",\"atomic_json\",\"chmod\",\"create_evidence_bundle\",\"dict\",\"ensure_layout\",\"get\",\"getpid\",\"int\",\"isinstance\",\"iso\",\"load_json\",\"open\",\"read_bytes\",\"run_existing_runner\",\"select_runner_artifacts\",\"sha256_bytes\",\"sha256_file\",\"state_path\",\"str\",\"substitute_argv\",\"time\",\"type\",\"update\",\"upload_evidence\",\"validate_capsule\",\"verify_command_object\",\"verify_local_integrity\",\"worker_state_owned\",\"write\",\"write_text\"],\"line\":1994,\"names\":[\"AdapterError\",\"Exception\",\"GlobalLock\",\"KeyError\",\"Path\",\"RUNNER\",\"RUN_DIR\",\"SAFE_ENV\",\"TypeError\",\"ValueError\",\"_\",\"argv\",\"atomic_json\",\"bundle\",\"command_object\",\"create_evidence_bundle\",\"current\",\"dict\",\"display\",\"document_rc\",\"document_status\",\"ensure_layout\",\"environment\",\"evidence_bytes\",\"evidence_sha\",\"exc\",\"int\",\"isinstance\",\"iso\",\"load_json\",\"object_key\",\"os\",\"path\",\"payload_root\",\"prefix\",\"raw\",\"result\",\"run_existing_runner\",\"runner_args\",\"runner_document\",\"runner_json\",\"runner_txt\",\"select_runner_artifacts\",\"sha256_bytes\",\"sha256_file\",\"short_id\",\"started_epoch\",\"state\",\"state_path\",\"str\",\"stream\",\"substitute_argv\",\"time\",\"type\",\"upload_evidence\",\"validate_capsule\",\"verify_command_object\",\"verify_local_integrity\",\"worker_state_owned\",\"wrapper_log\",\"wrapper_matches\"],\"strings\":[\"--\",\".runner.log\",\"/\",\"/evidence.tgz\",\":\",\"FAIL\",\"HOMELAB_TIMEOUT\",\"RUNNING\",\"RunnerWrapperMismatch\",\"WORKER_ERROR=\",\"\\\\n\",\"a\",\"argv\",\"bytes\",\"capsule SHA changed\",\"capsule manifest changed\",\"capsule_bytes\",\"capsule_path\",\"capsule_sha256\",\"command object state missing\",\"command-portal-smoke\",\"command_id\",\"command_object\",\"component\",\"error\",\"evidence\",\"execution\",\"existing runner returned a different rc after writing its public artifact; runtime publication or wrapper completion failed\",\"finished_at_utc\",\"gateway_verified\",\"local_bundle\",\"manifest\",\"message\",\"mode\",\"object_key\",\"payload_root\",\"portal\",\"portal-tests\",\"rc\",\"replace\",\"runner artifact rc invalid\",\"runner_document_rc\",\"runner_json\",\"runner_json_sha256\",\"runner_rc\",\"runner_status\",\"runner_text\",\"runner_text_sha256\",\"runner_wrapper_matches_document\",\"sha256\",\"status\",\"timeout_seconds\",\"type\",\"utf-8\",\"worker finalization ownership lost\",\"worker state invalid: \"]}},\"command_templates\":{\"adapter\":[[\"/usr/bin/curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",\"--connect-timeout\",\"10\",\"--max-time\",\"120\",\"--request\",\"PUT\"]],\"portal\":[],\"runner\":[]},\"portal_classes\":{\"Handler\":{\"line\":451,\"methods\":[\"content_length\",\"do_GET\",\"do_POST\",\"error_reply\",\"log_message\",\"path_parts\",\"read_body\",\"redirect\",\"reply\"],\"strings\":[\"\",\"\\n\",\" - \",\"(/enroll/)[A-Za-z0-9_-]{32,160}\",\"([?&]t=)[^&\\\\s]+\",\",\",\".hcmd\",\".upload-\",\"/api/enroll\",\"/api/import\",\"/api/state/([A-Z2-7]{10,20})\",\"/bridge-setup.cmd\",\"/bridge-setup.cmd\\\">Скачать установщик

\\n

После запуска установщика файлы .hcmd будут открываться двойным кликом.

\\n\",\"/bridge/bridge.cmd\",\"/enroll/\",\"/healthz\",\"/r/\",\"/r/([A-Z2-7]{10,20})\",\"/r/([A-Z2-7]{10,20})/evidence\",\"/r/([A-Z2-7]{10,20})/execute\",\"0\",\":\",\"; Max-Age=\",\"; Path=/; Secure; HttpOnly; SameSite=Strict\",\"\\n\\n\\nHomelab Bridge\\n\\n\\n

Установка Homelab Bridge

\\n

Профиль: \",\"

\\n

Ссылка одноразовая и уже привязана к этому NetBird-адресу.

\\n

Скачать проверенное evidence

\",\"/r/([A-Z2-7]{10,20})/evidence\",\"/run/homelab-command-adapter/adapter.sock\",\"/var/lib/homelab-command-portal/inbox\",\"Gitea runtime evidence\",\"adapter result not object\",\"evidence\",\"evidence_url\",\"gitea\",\"result\"],\"runner\":[]},\"runner_functions\":{}},\"backup_changed\":false,\"candidate_directories\":{\"adapter_root\":{\"exists\":true,\"gid\":990,\"is_dir\":true,\"is_symlink\":false,\"mode\":\"0o750\",\"path\":\"/var/lib/homelab-command-adapter\",\"uid\":0},\"result_documents_candidate\":{\"exists\":false,\"path\":\"/var/lib/homelab-command-adapter/public-results\"},\"result_signing_candidate\":{\"exists\":false,\"path\":\"/var/lib/homelab-command-adapter/result-signing\"},\"runner_public\":{\"exists\":true,\"gid\":0,\"is_dir\":true,\"is_symlink\":false,\"mode\":\"0o700\",\"path\":\"/var/lib/homelab-chat-run/public\",\"uid\":0},\"runner_raw\":{\"exists\":true,\"gid\":0,\"is_dir\":true,\"is_symlink\":false,\"mode\":\"0o700\",\"path\":\"/var/lib/homelab-chat-run/raw\",\"uid\":0},\"runner_root\":{\"exists\":true,\"gid\":0,\"is_dir\":true,\"is_symlink\":false,\"mode\":\"0o700\",\"path\":\"/var/lib/homelab-chat-run\",\"uid\":0}},\"changes_made\":false,\"checks\":{\"adapter_expected_sha\":true,\"adapter_has_final_evidence_state\":true,\"adapter_healthy\":true,\"evidence_health_public\":true,\"git_publication_present\":false,\"known_history_command_matches\":true,\"known_history_json_public\":true,\"known_history_text_public\":true,\"portal_expected_sha\":true,\"portal_health_public\":true,\"portal_healthy\":true,\"runner_expected_sha\":true,\"ssh_keygen_available\":true},\"cluster_changed\":false,\"command_id\":\"RESULT-INTEGRATION-DESIGN-PREFLIGHT-20260727T064218Z\",\"design_decision\":{\"adapter_state_auth_required\":true,\"authoritative_reader_source\":\"command-scoped Gitea history document, not mutable latest pointers\",\"final_document_publisher\":\"Adapter after evidence upload and final state commit\",\"latest_pointer_authoritative\":false,\"public_key_path\":\"runtime/keys/result-signing-ed25519.pub\",\"public_path\":\"runtime/final//.json\",\"reader_inputs_known_before_execution\":[\"command_id\",\"capsule_sha256\"],\"runner_history_preserved\":true,\"signature_scheme_preference\":\"Ed25519 detached signature over canonical JSON using dedicated result-signing key\",\"terminal_only\":true},\"gitea_changed\":false,\"inventory\":{\"adapter\":{\"exists\":true,\"expected_match\":true,\"is_symlink\":false,\"path\":\"/usr/local/sbin/homelab-command-adapter\",\"sha256\":\"8d0af84dcfcf6ddbfd1c4e6cbb059cef66b4cfc6c75bfd66da649acc229c7f5e\"},\"portal\":{\"exists\":true,\"expected_match\":true,\"is_symlink\":false,\"path\":\"/usr/local/sbin/homelab-command-portal\",\"sha256\":\"8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2\"},\"runner\":{\"exists\":true,\"expected_match\":true,\"is_symlink\":false,\"path\":\"/usr/local/sbin/homelab-chat-run\",\"sha256\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\"}},\"known_history_fields\":[\"block_reason\",\"change_declared\",\"changes_made\",\"channel\",\"command_id\",\"command_rc\",\"command_sha256\",\"component\",\"duplicate_failed_command_blocked\",\"error_register_checked\",\"error_register_sha256\",\"execution_started\",\"finished_at_utc\",\"full_sanitized_output_url\",\"host\",\"mode\",\"mutation_outcome\",\"output\",\"output_truncated_in_json\",\"private_addresses_included\",\"raw_evidence_retained_locally\",\"raw_evidence_sha256\",\"rc\",\"reference_register_checked\",\"reference_sha256\",\"result_contract_error\",\"result_contract_status\",\"result_contract_valid\",\"rollback_restored\",\"rollback_started\",\"sanitized\",\"sanitized_output_sha256\",\"schema_version\",\"secrets_included\",\"started_at_utc\",\"status\"],\"plan_requirements\":{\"modify_candidates\":[\"/usr/local/sbin/homelab-command-adapter\"],\"must_preserve\":[\"/usr/local/sbin/homelab-chat-run\",\"/usr/local/sbin/homelab-command-portal\",\"existing evidence publication\",\"existing Gitea runtime history\",\"backup\",\"cluster\"],\"possible_new_helpers\":[\"/usr/local/sbin/homelab-result-publish\"],\"possible_new_state_dirs\":[\"/var/lib/homelab-command-adapter/result-signing\",\"/var/lib/homelab-command-adapter/public-results\"],\"required_postconditions\":[\"exact command URL resolves without auth\",\"document contains terminal Adapter state\",\"evidence SHA and gateway_verified present\",\"canonical document SHA validates\",\"signature validates with published key\",\"no secrets or private addresses\",\"mutable latest not used for lookup\"]},\"private_addresses_included\":false,\"public_probe\":{\"evidence_health\":{\"http_code\":200,\"json_keys\":[\"service\",\"status\"],\"reachable\":true},\"history_json\":{\"http_code\":200,\"json_keys\":[\"block_reason\",\"change_declared\",\"changes_made\",\"channel\",\"command_id\",\"command_rc\",\"command_sha256\",\"component\",\"duplicate_failed_command_blocked\",\"error_register_checked\",\"error_register_sha256\",\"execution_started\",\"finished_at_utc\",\"full_sanitized_output_url\",\"host\",\"mode\",\"mutation_outcome\",\"output\",\"output_truncated_in_json\",\"private_addresses_included\",\"raw_evidence_retained_locally\",\"raw_evidence_sha256\",\"rc\",\"reference_register_checked\",\"reference_sha256\",\"result_contract_error\",\"result_contract_status\",\"result_contract_valid\",\"rollback_restored\",\"rollback_started\",\"sanitized\",\"sanitized_output_sha256\",\"schema_version\",\"secrets_included\",\"started_at_utc\",\"status\"],\"reachable\":true},\"history_text\":{\"http_code\":200,\"json_keys\":null,\"reachable\":true},\"portal_health\":{\"http_code\":200,\"json_keys\":[\"adapter\",\"status\",\"version\"],\"reachable\":true}},\"rollback_started\":false,\"sanitized\":true,\"schema\":1,\"secrets_included\":false,\"service_files\":{\"adapter\":{\"content\":\"[Unit]\\nDescription=Homelab command adapter\\nAfter=network-online.target\\nWants=network-online.target\\n\\n[Service]\\nType=simple\\nExecStart=/usr/bin/python3 -B /usr/local/sbin/homelab-command-adapter --serve\\nUser=root\\nGroup=homelab-command-portal\\nUMask=0027\\nRuntimeDirectory=homelab-command-adapter\\nRuntimeDirectoryMode=0750\\nRestart=on-failure\\nRestartSec=2\\nNoNewPrivileges=false\\nPrivateTmp=true\\nProtectClock=true\\nProtectControlGroups=true\\nProtectKernelLogs=true\\nProtectKernelModules=true\\nProtectKernelTunables=true\\nRestrictRealtime=true\\nLockPersonality=true\\nMemoryDenyWriteExecute=true\\nSystemCallArchitectures=native\\nTimeoutStopSec=15\\n\\n[Install]\\nWantedBy=multi-user.target\\n\",\"exists\":true,\"path\":\"/etc/systemd/system/homelab-command-adapter.service\",\"sha256\":\"74d0f37878652ed9d46b53ae8556bbb30ebd683741f293c3f59b3527876ed2d7\"},\"portal\":{\"content\":\"[Unit]\\nDescription=Homelab command portal\\nAfter=network-online.target homelab-command-adapter.service\\nRequires=homelab-command-adapter.service\\nWants=network-online.target\\nStartLimitIntervalSec=30\\nStartLimitBurst=3\\n\\n[Service]\\nType=simple\\nExecStartPre=/usr/bin/python3 -B /usr/local/sbin/homelab-command-portal --self-test\\nExecStart=/usr/bin/python3 -B /usr/local/sbin/homelab-command-portal\\nUser=homelab-command-portal\\nGroup=homelab-command-portal\\nUMask=0077\\nRestart=on-failure\\nRestartSec=2\\nNoNewPrivileges=true\\nPrivateTmp=true\\nPrivateDevices=true\\nProtectSystem=strict\\nProtectHome=true\\nReadWritePaths=/var/lib/homelab-command-portal\\nProtectClock=true\\nProtectControlGroups=true\\nProtectKernelLogs=true\\nProtectKernelModules=true\\nProtectKernelTunables=true\\nRestrictSUIDSGID=true\\nRestrictRealtime=true\\nLockPersonality=true\\nMemoryDenyWriteExecute=true\\nRestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX\\nSystemCallArchitectures=native\\nTimeoutStopSec=15\\n\\n[Install]\\nWantedBy=multi-user.target\\n\",\"exists\":true,\"path\":\"/etc/systemd/system/homelab-command-portal.service\",\"sha256\":\"8453eab30f5c3ccd285fc9f70fff18f564809bb27f7bf84f51f2ba593aa85263\"}},\"services\":{\"adapter\":{\"active\":\"active\",\"pid\":\"976008\",\"restarts\":\"0\",\"sub\":\"running\"},\"portal\":{\"active\":\"active\",\"pid\":\"976035\",\"restarts\":\"0\",\"sub\":\"running\"}},\"signing_tools\":{\"gpg\":{\"available\":true,\"path\":\"/usr/bin/gpg\",\"version\":\"gpg (GnuPG) 2.4.7\\nlibgcrypt 1.11.0\\nCopyright (C) 2024 g10 Code GmbH\\nLicense GNU GPL-3.0-or-later \",\"version_rc\":0},\"openssl\":{\"available\":true,\"path\":\"/usr/bin/openssl\",\"version\":\"OpenSSL 3.5.6 7 Apr 2026 (Library: OpenSSL 3.5.6 7 Apr 2026)\",\"version_rc\":0},\"ssh-keygen\":{\"available\":true,\"path\":\"/usr/bin/ssh-keygen\",\"version\":\"unknown option -- ?\\nusage: ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile]\\n [-m format] [-N new_passphrase] [-O option]\\n [-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa]\",\"version_rc\":1}},\"status\":\"FAIL\"}\n" }