39 lines
7.6 KiB
JSON
39 lines
7.6 KiB
JSON
{
|
|
"schema_version": 1,
|
|
"channel": "homelab-runtime",
|
|
"command_id": "RESULT-API-PLAN-FIX1-20260727T081254Z",
|
|
"status": "OK",
|
|
"rc": 0,
|
|
"host": "pve01",
|
|
"mode": "verify",
|
|
"component": "result-integration",
|
|
"started_at_utc": "2026-07-27T08:15:28Z",
|
|
"finished_at_utc": "2026-07-27T08:15:28Z",
|
|
"reference_register_checked": true,
|
|
"reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e",
|
|
"error_register_checked": true,
|
|
"error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83",
|
|
"command_sha256": "9644a497547baa62f28f72c9441e4b258bf9d39522c9194ae9f85f774933641d",
|
|
"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": "a6c37d6a632ede775490bc690b6c72649a7b2598a93737d615cd7819bff01f92",
|
|
"sanitized_output_sha256": "a6c37d6a632ede775490bc690b6c72649a7b2598a93737d615cd7819bff01f92",
|
|
"output_truncated_in_json": false,
|
|
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
|
|
"output": "{\"PLAN_SHA256\":\"356df52cee0e86ffc9aa8280c5c325a15a0c1c422700ab0c8034ae3cf65a1381\",\"changes_made\":false,\"checks\":{\"adapter_healthy\":true,\"adapter_source_lock\":true,\"current_running_once\":true,\"host_pve01\":true,\"no_invalid_states\":true,\"no_other_running\":true,\"portal_healthy\":true,\"portal_source_lock\":true,\"root\":true,\"runner_preserved_lock\":true,\"signing_dir_absent\":true},\"plan\":{\"anti_regression\":[\"key_directory_uid_root\",\"key_directory_gid_root\",\"key_directory_mode_0700\",\"private_key_uid_root\",\"private_key_gid_root\",\"private_key_mode_0600\",\"public_key_uid_root\",\"public_key_gid_root\",\"public_key_mode_0600\",\"adapter_compile\",\"portal_compile\",\"adapter_self_test\",\"portal_self_test\",\"key_pair_verification\",\"command_lookup\",\"terminal_status\",\"evidence_fields\",\"document_sha_valid\",\"signature_valid\",\"latest_result_matches\",\"public_key_matches\",\"health_version_2\",\"command_route_present\",\"key_route_present\",\"no_state_listing_route\",\"runner_unmodified\"],\"change_flags\":{\"backup\":false,\"cluster\":false,\"gitea\":false,\"production\":true},\"exact_change_scope\":{\"backup\":false,\"cluster\":false,\"create\":[\"/var/lib/homelab-command-adapter/result-signing\",\"/var/lib/homelab-command-adapter/result-signing/private.pem\",\"/var/lib/homelab-command-adapter/result-signing/public.pem\"],\"gitea\":false,\"modify\":[\"/usr/local/sbin/homelab-command-adapter\",\"/usr/local/sbin/homelab-command-portal\"],\"preserve\":[\"/usr/local/sbin/homelab-chat-run\",\"existing state files\",\"existing evidence objects\",\"Gitea runtime history\",\"backup\",\"cluster\"],\"production\":true},\"generated_secret_policy\":{\"algorithm\":\"Ed25519\",\"directory\":\"/var/lib/homelab-command-adapter/result-signing\",\"directory_mode\":\"0700\",\"generation\":\"openssl genpkey during APPLY only\",\"owner\":\"root:root\",\"private_key\":\"/var/lib/homelab-command-adapter/result-signing/private.pem\",\"private_key_never_output\":true,\"private_mode\":\"0600\",\"public_key\":\"/var/lib/homelab-command-adapter/result-signing/public.pem\",\"public_key_id_recorded_after_generation\":true,\"public_mode\":\"0600\"},\"operation\":\"INSTALL_SIGNED_READONLY_RESULT_API\",\"postconditions\":[\"Adapter and Portal target SHA installed\",\"Runner SHA unchanged\",\"signing directory mode 0700 root:root\",\"private key mode 0600 root:root\",\"public key mode 0600 root:root\",\"public/private key pair verifies\",\"Adapter and Portal stable NRestarts=0\",\"healthz version 2 returns signed latest_result\",\"public key PEM is retrievable\",\"exact command result route works\",\"document_sha256 recomputes\",\"Ed25519 signature verifies\",\"no secret/private address/local path fields\",\"existing states and evidence unchanged\"],\"public_contract\":{\"discovery_url\":\"https://run.vpn.gram1.ru/healthz\",\"health_version\":2,\"latest_result_in_healthz\":true,\"no_listing\":true,\"public_key_url\":\"https://run.vpn.gram1.ru/.well-known/homelab-result-key.pem\",\"result_url_template\":\"https://run.vpn.gram1.ru/.well-known/homelab-result/<command_id>/<capsule_sha256>.json\",\"signature_algorithm\":\"Ed25519\",\"terminal_only\":true},\"risk\":\"REVERSIBLE\",\"rollback\":{\"diagnostics_before_rollback\":[\"source and target SHA\",\"systemd state and exact RC\",\"journal since APPLY start\",\"healthz response\",\"process tree\",\"state summary\",\"key public ID only\"],\"fresh_directory\":\"/var/lib/homelab-change-rollback/RESULT-API-APPLY-20260727\",\"remove_created_only\":[\"/var/lib/homelab-command-adapter/result-signing\"],\"restore_only\":[\"/usr/local/sbin/homelab-command-adapter\",\"/usr/local/sbin/homelab-command-portal\"]},\"schema\":1,\"service_sequence\":[\"stop Portal and verify inactive\",\"stop Adapter and verify inactive\",\"create fresh rollback copies\",\"generate signing key in temporary directory under the actual service identity\",\"explicitly chown key directory and both keys to root:root\",\"enforce directory 0700 and both key files 0600\",\"verify generated key pair\",\"atomically install key directory\",\"atomically install Adapter and Portal\",\"start Adapter and require three stable healthy samples\",\"start Portal and require three stable healthz v2 samples\"],\"source_lock\":{\"/usr/local/sbin/homelab-chat-run\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\",\"/usr/local/sbin/homelab-command-adapter\":\"8d0af84dcfcf6ddbfd1c4e6cbb059cef66b4cfc6c75bfd66da649acc229c7f5e\",\"/usr/local/sbin/homelab-command-portal\":\"8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2\",\"/var/lib/homelab-command-adapter/result-signing\":\"ABSENT\"},\"target\":\"pve01\",\"target_lock\":{\"/usr/local/sbin/homelab-chat-run\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\",\"/usr/local/sbin/homelab-command-adapter\":\"2601d502303028717864c5e6fed5ba49ebca0e467cac529498cae32ddcc97900\",\"/usr/local/sbin/homelab-command-portal\":\"8a2996c0c15240d3ff31bf76032e1920f23473535bd789eff8f2b6f71976a350\"}},\"rollback_started\":false,\"runner_sha256\":\"b248a4c32c9cc64e5747e7dce6c7fc0a23f5124a77c71ce72e27a81aceae9d2d\",\"source_adapter_sha256\":\"8d0af84dcfcf6ddbfd1c4e6cbb059cef66b4cfc6c75bfd66da649acc229c7f5e\",\"source_portal_sha256\":\"8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2\",\"static_tests\":{\"adapter_compile\":true,\"adapter_self_test\":true,\"command_lookup\":true,\"command_route_present\":true,\"document_sha_valid\":true,\"evidence_fields\":true,\"health_version_2\":true,\"key_directory_gid_root\":true,\"key_directory_mode_0700\":true,\"key_directory_uid_root\":true,\"key_pair_verification\":true,\"key_route_present\":true,\"latest_result_matches\":true,\"no_state_listing_route\":true,\"portal_compile\":true,\"portal_self_test\":true,\"private_key_gid_root\":true,\"private_key_mode_0600\":true,\"private_key_uid_root\":true,\"public_key_gid_root\":true,\"public_key_matches\":true,\"public_key_mode_0600\":true,\"public_key_uid_root\":true,\"runner_unmodified\":true,\"signature_valid\":true,\"terminal_status\":true},\"status\":\"PASS\",\"target_adapter_sha256\":\"2601d502303028717864c5e6fed5ba49ebca0e467cac529498cae32ddcc97900\",\"target_portal_sha256\":\"8a2996c0c15240d3ff31bf76032e1920f23473535bd789eff8f2b6f71976a350\"}\n"
|
|
}
|