31 lines
12 KiB
JSON
31 lines
12 KiB
JSON
{
|
|
"schema_version": 1,
|
|
"channel": "homelab-runtime",
|
|
"command_id": "RUN5-QUALITY-GATE-PLAN-20260726T064045Z",
|
|
"status": "OK",
|
|
"rc": 0,
|
|
"host": "pve01",
|
|
"mode": "verify",
|
|
"component": "command-quality-gate",
|
|
"started_at_utc": "2026-07-26T11:23:43Z",
|
|
"finished_at_utc": "2026-07-26T11:23:43Z",
|
|
"reference_register_checked": true,
|
|
"reference_sha256": "5763f2f8edc75fcf6f3951f8c95896d1cc112ceccb6cf5b64a383f540a4deb8e",
|
|
"error_register_checked": true,
|
|
"error_register_sha256": "24934a2c7fa5c26f6e828583c4aefac7f143b40c0171736ed7571e617d55ab83",
|
|
"command_sha256": "dc7bb28d40500504adc63f37c89ed919c69d503e2e71f570ecd636cdcd04bb1f",
|
|
"duplicate_failed_command_blocked": false,
|
|
"block_reason": null,
|
|
"execution_started": true,
|
|
"changes_made": false,
|
|
"sanitized": true,
|
|
"secrets_included": false,
|
|
"private_addresses_included": false,
|
|
"raw_evidence_retained_locally": true,
|
|
"raw_evidence_sha256": "86cdb1747be64f368435b841ec9a8145646db26e6387fbb2a6b8e69176b236bc",
|
|
"sanitized_output_sha256": "86cdb1747be64f368435b841ec9a8145646db26e6387fbb2a6b8e69176b236bc",
|
|
"output_truncated_in_json": false,
|
|
"full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt",
|
|
"output": "RUN5_COMMAND_QUALITY_GATE_PLAN=PASS\nPLAN_SHA256=99fac83369ee8d5098c07cf243398d8b6b144e4fbc9ef9b39ef75436b109d607\n{\"backup_changed\":false,\"cluster_changed\":false,\"gitea_changed\":false,\"plan\":{\"acceptance\":[\"new adapter self-test as root\",\"new portal self-test as homelab-command-portal\",\"schema-v1 read-only capsule remains accepted\",\"schema-v1 change capsule is rejected\",\"schema-v2 change missing any gate field is rejected\",\"schema-v2 APPLY with unknown plan is rejected\",\"schema-v2 APPLY with wrong plan SHA is rejected\",\"schema-v2 APPLY with failed plan is rejected\",\"valid PLAN accepted and stored\",\"valid APPLY bound to exact PLAN accepted\",\"Portal renders gate and disables execute on failure\",\"real read-only browser flow still passes\",\"temporary test state and MinIO evidence cleaned\"],\"adapter_enforcement\":{\"changed_plan_sha_forbidden\":true,\"duplicate_ids_forbidden\":true,\"empty_required_arrays_forbidden\":true,\"failed_plan_reuse_forbidden\":true,\"portal_is_display_and_approval_layer\":true,\"same_failed_apply_without_new_plan_forbidden\":true,\"security_boundary\":true,\"shell_string_forbidden\":true,\"undeclared_path_mutation_forbidden\":true,\"unknown_quality_gate_fields_forbidden\":true},\"anti_regression_ids\":[\"QG-001-SOURCE-EVIDENCE-LOCK\",\"QG-002-PLAN-APPLY-SHA-BINDING\",\"QG-003-SERVICE-IDENTITY-REHEARSAL\",\"QG-004-EXPECTED-DIFF-SCOPE\",\"QG-005-DIAGNOSTICS-BEFORE-ROLLBACK\",\"QG-006-CLEANUP-VERIFICATION\",\"QG-007-POSTCONDITION-SEAL\",\"QG-008-FAILED-CAPSULE-REPLAN-REQUIRED\",\"QG-009-EXECUTABLE-SYMLINK-TARGET-VERIFIED\",\"QG-010-PORTAL-SERVICE-USER-FILE-ACCESS\",\"QG-011-BOUNDED-HEALTH-AND-RESTART-LOOP\",\"QG-012-SESSION-BOUND-HMAC-CSRF\",\"QG-013-SIGV4-CANONICAL-QUERY-SORTED\",\"QG-014-OVERLAY-TECHNOLOGY-DETECTED-NOT-ASSUMED\"],\"capsule_contract\":{\"apply_requires_exact_plan_capsule_sha256\":true,\"apply_requires_exact_plan_evidence_sha256\":true,\"apply_requires_no_unresolved_failure\":true,\"apply_requires_plan_status_ok\":true,\"apply_requires_prior_plan_state\":true,\"apply_requires_same_target\":true,\"apply_requires_source_evidence_sha256\":true,\"apply_requires_unexpired_plan\":true,\"change_capsule_required_schema\":2,\"change_capsule_requires_plan_phase\":true,\"change_capsule_requires_quality_gate\":true,\"read_only_compatibility\":\"SCHEMA_V1_PRESERVED\"},\"current_state\":{\"executables\":{\"/usr/bin/python3\":{\"is_symlink\":true,\"path\":\"/usr/bin/python3\",\"resolved_mode\":\"0o755\",\"resolved_path\":\"/usr/bin/python3.13\",\"resolved_sha256\":\"4703a3d15898c0b5d81c3f939e93bdd8ca6116342093fb160ab1e01860dd7d8b\"},\"/usr/bin/systemctl\":{\"is_symlink\":false,\"path\":\"/usr/bin/systemctl\",\"resolved_mode\":\"0o755\",\"resolved_path\":\"/usr/bin/systemctl\",\"resolved_sha256\":\"848c70d7e2c2f43f4f93287897ac8946e8eda45e7daa5f2975d9728071856b1a\"},\"/usr/sbin/runuser\":{\"is_symlink\":false,\"path\":\"/usr/sbin/runuser\",\"resolved_mode\":\"0o755\",\"resolved_path\":\"/usr/sbin/runuser\",\"resolved_sha256\":\"572f3c018101cb1bb8885951388d4f4501e1354cb8ab986e18265265b54970d7\"}},\"files\":{\"/etc/systemd/system/homelab-command-adapter.service\":{\"bytes\":665,\"gid\":0,\"group\":\"root\",\"is_symlink\":false,\"mode\":\"0o644\",\"owner\":\"root\",\"path\":\"/etc/systemd/system/homelab-command-adapter.service\",\"sha256\":\"74d0f37878652ed9d46b53ae8556bbb30ebd683741f293c3f59b3527876ed2d7\",\"uid\":0},\"/etc/systemd/system/homelab-command-portal.service\":{\"bytes\":981,\"gid\":0,\"group\":\"root\",\"is_symlink\":false,\"mode\":\"0o644\",\"owner\":\"root\",\"path\":\"/etc/systemd/system/homelab-command-portal.service\",\"sha256\":\"8453eab30f5c3ccd285fc9f70fff18f564809bb27f7bf84f51f2ba593aa85263\",\"uid\":0},\"/root/_1/run3d.json\":{\"bytes\":6966,\"gid\":0,\"group\":\"root\",\"is_symlink\":false,\"mode\":\"0o600\",\"owner\":\"root\",\"path\":\"/root/_1/run3d.json\",\"sha256\":\"700db9263402ea88b838f04f971c768e1f1f9b7e8746d96ca73fa0f8a9789f69\",\"uid\":0},\"/root/_1/run4.json\":{\"bytes\":3115,\"gid\":0,\"group\":\"root\",\"is_symlink\":false,\"mode\":\"0o600\",\"owner\":\"root\",\"path\":\"/root/_1/run4.json\",\"sha256\":\"f6da0ca4cf8ca18d301e4b45c683d1f2d6de103dfa7649cf91f600493d90ec07\",\"uid\":0},\"/usr/local/sbin/homelab-chat-run\":{\"bytes\":11864,\"gid\":0,\"group\":\"root\",\"is_symlink\":false,\"mode\":\"0o750\",\"owner\":\"root\",\"path\":\"/usr/local/sbin/homelab-chat-run\",\"sha256\":\"2a88defef9517f89bc60934dce82097f8e316b08af9417e95167ea5d759a10d9\",\"uid\":0},\"/usr/local/sbin/homelab-command-adapter\":{\"bytes\":77441,\"gid\":0,\"group\":\"root\",\"is_symlink\":false,\"mode\":\"0o750\",\"owner\":\"root\",\"path\":\"/usr/local/sbin/homelab-command-adapter\",\"sha256\":\"f2410cd328e2837b99e8ce4a28e25cb031a6bdd596d0286ac77a1822ef1cecd0\",\"uid\":0},\"/usr/local/sbin/homelab-command-portal\":{\"bytes\":39362,\"gid\":990,\"group\":\"homelab-command-portal\",\"is_symlink\":false,\"mode\":\"0o750\",\"owner\":\"root\",\"path\":\"/usr/local/sbin/homelab-command-portal\",\"sha256\":\"8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2\",\"uid\":0}},\"service_identity_tests\":{\"adapter_as_root_identity\":\"PASS\",\"portal_as_service_user\":\"PASS\"},\"source_features\":{\"adapter\":{\"change_requires_production_true\":true,\"change_requires_rollback\":true,\"plan_apply_binding_present\":false,\"quality_gate_present\":false,\"schema_version_1_only\":true,\"unknown_top_level_fields_forbidden\":false},\"portal\":{\"csrf_present\":true,\"plan_apply_render_present\":false,\"quality_gate_render_present\":false}},\"state_inventory\":{\"BLOCKED\":0,\"FAIL\":0,\"IMPORTED\":1,\"OK\":1,\"RUNNING\":1,\"UNKNOWN\":0,\"capsule_root_present\":true,\"change_total\":0,\"change_unfinished\":0,\"duplicate_command_ids\":[],\"total\":3},\"units\":{\"adapter\":{\"ActiveState\":\"active\",\"ExecMainStatus\":\"0\",\"ExecStart\":\"{ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 -B /usr/local/sbin/homelab-command-adapter --serve ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=364681 ; code=(null) ; status=0/0 }\",\"FragmentPath\":\"/etc/systemd/system/homelab-command-adapter.service\",\"Group\":\"homelab-command-portal\",\"Id\":\"homelab-command-adapter.service\",\"LoadState\":\"loaded\",\"NRestarts\":\"0\",\"Result\":\"success\",\"SubState\":\"running\",\"UnitFileState\":\"enabled\",\"User\":\"root\",\"is_active_rc\":\"0\",\"is_active_value\":\"active\",\"is_enabled_rc\":\"0\",\"is_enabled_value\":\"enabled\"},\"portal\":{\"ActiveState\":\"active\",\"ExecMainStatus\":\"0\",\"ExecStart\":\"{ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 -B /usr/local/sbin/homelab-command-portal ; ignore_errors=no ; start_time=[Sun 2026-07-26 09:18:49 MSK] ; stop_time=[n/a] ; pid=536586 ; code=(null) ; status=0/0 }\",\"ExecStartPre\":\"{ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 -B /usr/local/sbin/homelab-command-portal --self-test ; ignore_errors=no ; start_time=[Sun 2026-07-26 09:18:49 MSK] ; stop_time=[Sun 2026-07-26 09:18:49 MSK] ; pid=536585 ; code=exited ; status=0 }\",\"FragmentPath\":\"/etc/systemd/system/homelab-command-portal.service\",\"Group\":\"homelab-command-portal\",\"Id\":\"homelab-command-portal.service\",\"LoadState\":\"loaded\",\"NRestarts\":\"0\",\"Result\":\"success\",\"SubState\":\"running\",\"UnitFileState\":\"enabled\",\"User\":\"homelab-command-portal\",\"is_active_rc\":\"0\",\"is_active_value\":\"active\",\"is_enabled_rc\":\"0\",\"is_enabled_value\":\"enabled\"}}},\"declared_changes\":{\"backup\":false,\"cluster\":false,\"gitea\":false,\"production\":true,\"service_evidence_publication\":true},\"exact_diff_scope\":[{\"action\":\"REPLACE\",\"after_sha256\":\"TO_BE_FIXED_IN_APPLY_CAPSULE\",\"before_sha256\":\"f2410cd328e2837b99e8ce4a28e25cb031a6bdd596d0286ac77a1822ef1cecd0\",\"group\":\"root\",\"mode\":\"0750\",\"owner\":\"root\",\"path\":\"/usr/local/sbin/homelab-command-adapter\"},{\"action\":\"REPLACE\",\"after_sha256\":\"TO_BE_FIXED_IN_APPLY_CAPSULE\",\"before_sha256\":\"8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2\",\"group\":\"homelab-command-portal\",\"mode\":\"0750\",\"owner\":\"root\",\"path\":\"/usr/local/sbin/homelab-command-portal\"}],\"explicitly_out_of_scope\":[\"homelab-chat-run source\",\"systemd unit files\",\"Nginx\",\"Windows Bridge\",\"MinIO bucket policies\",\"backup configuration\",\"cluster topology\",\"Gitea repository configuration\"],\"kind\":\"homelab-command-quality-gate-plan\",\"plan_id\":\"RUN5-COMMAND-QUALITY-GATE\",\"portal_display\":{\"disable_execute_button_on_gate_failure\":true,\"show_anti_regression_ids\":true,\"show_cleanup\":true,\"show_diagnostics_before_rollback\":true,\"show_exact_diff\":true,\"show_gate_status\":true,\"show_plan_reference\":true,\"show_plan_sha\":true,\"show_postconditions\":true,\"show_rollback\":true,\"show_service_identity_tests\":true,\"show_source_evidence_sha\":true},\"quality_gate_version\":1,\"required_change_fields\":[\"phase\",\"source_evidence\",\"plan_reference\",\"target_identity\",\"preconditions\",\"expected_diff\",\"service_identity_tests\",\"rollback_plan\",\"postconditions\",\"diagnostics_plan\",\"cleanup_plan\",\"anti_regression_ids\"],\"rollback\":{\"diagnostics_before_restore\":true,\"post_restore_external_browser_path_test\":true,\"post_restore_service_identity_test\":true,\"restore_adapter_sha256\":\"f2410cd328e2837b99e8ce4a28e25cb031a6bdd596d0286ac77a1822ef1cecd0\",\"restore_portal_sha256\":\"8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2\",\"strategy\":\"EXACT_TWO_FILE_RESTORE\"},\"schema_version\":1,\"source_lock\":{\"adapter_unit_sha256\":\"74d0f37878652ed9d46b53ae8556bbb30ebd683741f293c3f59b3527876ed2d7\",\"installed_adapter_sha256\":\"f2410cd328e2837b99e8ce4a28e25cb031a6bdd596d0286ac77a1822ef1cecd0\",\"installed_portal_sha256\":\"8056faf4ef6348f0b06319ad3c49fbfeeadf25b6370f857ea19569bd27652ee2\",\"portal_unit_sha256\":\"8453eab30f5c3ccd285fc9f70fff18f564809bb27f7bf84f51f2ba593aa85263\",\"run3d_report_sha256\":\"700db9263402ea88b838f04f971c768e1f1f9b7e8746d96ca73fa0f8a9789f69\",\"run4_report_sha256\":\"f6da0ca4cf8ca18d301e4b45c683d1f2d6de103dfa7649cf91f600493d90ec07\",\"runner_sha256\":\"2a88defef9517f89bc60934dce82097f8e316b08af9417e95167ea5d759a10d9\"},\"structured_requirements\":{\"check_item\":[\"id\",\"type\",\"target\",\"expected\"],\"expected_diff_item\":[\"path\",\"action\",\"before_sha256\",\"after_sha256\",\"owner\",\"group\",\"mode\"],\"plan_reference\":[\"command_id\",\"capsule_sha256\",\"evidence_sha256\",\"plan_sha256\"],\"source_evidence\":[\"command_id\",\"capsule_sha256\",\"evidence_sha256\"],\"target_identity\":[\"node\",\"component\",\"service_user\",\"service_group\"]}},\"plan_sha256\":\"99fac83369ee8d5098c07cf243398d8b6b144e4fbc9ef9b39ef75436b109d607\",\"production_changed\":false,\"stage\":\"RUN5_COMMAND_QUALITY_GATE_PLAN\",\"status\":\"PASS\"}\n"
|
|
}
|