CHAT_OUTPUT_BEGIN COMMAND_ID=RESULT-API-PLAN-FIX1-20260727T081254Z STATUS=OK RC=0 HOST=pve01 MODE=verify COMPONENT=result-integration REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83 COMMAND_SHA256=9644a497547baa62f28f72c9441e4b258bf9d39522c9194ae9f85f774933641d 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=a6c37d6a632ede775490bc690b6c72649a7b2598a93737d615cd7819bff01f92 SANITIZED_OUTPUT_SHA256=a6c37d6a632ede775490bc690b6c72649a7b2598a93737d615cd7819bff01f92 OUTPUT_BEGIN {"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//.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"} OUTPUT_END CHAT_OUTPUT_END