From c53cbca4a26d03e8b8a9cff38d7acfe698f7089d Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 29 Jun 2026 09:22:27 +0800 Subject: [PATCH] feat(delivery): expose non110 autostart readback --- .../services/delivery_closure_workbench.py | 18 +++++++++++++++ .../test_delivery_closure_workbench_api.py | 22 ++++++++++++++++++- apps/web/src/lib/api-client.ts | 4 ++++ docs/LOGBOOK.md | 8 +++++++ ...tion-deploy-readback-blocker.snapshot.json | 11 ++++++---- 5 files changed, 58 insertions(+), 5 deletions(-) diff --git a/apps/api/src/services/delivery_closure_workbench.py b/apps/api/src/services/delivery_closure_workbench.py index 2acc8d0d..cfb64759 100644 --- a/apps/api/src/services/delivery_closure_workbench.py +++ b/apps/api/src/services/delivery_closure_workbench.py @@ -230,6 +230,15 @@ def build_delivery_closure_workbench( "non110_runner_online_label_match" ) is True, + "non110_runner_autostart_path_armed": production_deploy_readback.get( + "non110_runner_autostart_path_armed" + ) + is True, + "non110_runner_ready_autostart_path_count": _int( + production_deploy_readback.get( + "non110_runner_ready_autostart_path_count" + ) + ), "non110_runner_registration_condition_required": production_deploy_readback.get( "non110_runner_registration_condition_required" ) @@ -525,6 +534,15 @@ def build_delivery_closure_workbench( production_deploy_readback.get("non110_runner_online_label_match") is True ), + "production_deploy_non110_runner_autostart_path_armed": ( + production_deploy_readback.get("non110_runner_autostart_path_armed") + is True + ), + "production_deploy_non110_runner_ready_autostart_path_count": _int( + production_deploy_readback.get( + "non110_runner_ready_autostart_path_count" + ) + ), "production_deploy_non110_runner_registration_condition_required": ( production_deploy_readback.get( "non110_runner_registration_condition_required" diff --git a/apps/api/tests/test_delivery_closure_workbench_api.py b/apps/api/tests/test_delivery_closure_workbench_api.py index 36814ba3..8719db86 100644 --- a/apps/api/tests/test_delivery_closure_workbench_api.py +++ b/apps/api/tests/test_delivery_closure_workbench_api.py @@ -108,6 +108,16 @@ def test_delivery_closure_workbench_endpoint_returns_product_summary(): data["summary"]["production_deploy_non110_runner_online_label_match"] is False ) + assert ( + data["summary"]["production_deploy_non110_runner_autostart_path_armed"] + is True + ) + assert ( + data["summary"][ + "production_deploy_non110_runner_ready_autostart_path_count" + ] + == 1 + ) assert ( data["summary"][ "production_deploy_non110_runner_registration_condition_required" @@ -167,7 +177,7 @@ def test_delivery_closure_workbench_endpoint_returns_product_summary(): assert lanes["production_deploy"]["blocker_count"] == 4 assert lanes["production_deploy"]["metric"][ "observed_source_control_main_short_sha" - ] == "88607eae4d36" + ] == "f84269453834" assert lanes["production_deploy"]["metric"][ "production_image_tag_short_sha" ] == "af45811e87" @@ -266,6 +276,16 @@ def test_delivery_closure_workbench_endpoint_returns_product_summary(): lanes["production_deploy"]["metric"]["non110_runner_online_label_match"] is False ) + assert ( + lanes["production_deploy"]["metric"]["non110_runner_autostart_path_armed"] + is True + ) + assert ( + lanes["production_deploy"]["metric"][ + "non110_runner_ready_autostart_path_count" + ] + == 1 + ) assert ( lanes["production_deploy"]["metric"][ "non110_runner_registration_condition_required" diff --git a/apps/web/src/lib/api-client.ts b/apps/web/src/lib/api-client.ts index 5d35e0aa..1183da03 100644 --- a/apps/web/src/lib/api-client.ts +++ b/apps/web/src/lib/api-client.ts @@ -2569,6 +2569,8 @@ export interface DeliveryClosureWorkbenchSnapshot { production_deploy_non110_runner_host_label: string production_deploy_non110_runner_ubuntu_label: string production_deploy_non110_runner_online_label_match: boolean + production_deploy_non110_runner_autostart_path_armed: boolean + production_deploy_non110_runner_ready_autostart_path_count: number production_deploy_non110_runner_registration_condition_required: boolean production_deploy_non110_runner_ready_config_count: number production_deploy_non110_runner_ready_service_count: number @@ -2626,6 +2628,8 @@ export interface DeliveryClosureWorkbenchSnapshot { non110_runner_host_label: string non110_runner_ubuntu_label: string non110_runner_online_label_match: boolean + non110_runner_autostart_path_armed: boolean + non110_runner_ready_autostart_path_count: number non110_runner_registration_condition_required: boolean non110_runner_ready_config_count: number non110_runner_ready_service_count: number diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index 5df82c91..351c2d59 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -1,3 +1,11 @@ +## 2026-06-29 — 09:15 Delivery Workbench non-110 autostart watcher 投影 + +**完成內容**: +- 將 non-110 runner verifier 的 `READY_AUTOSTART_PATH_COUNT=1` 與 autostart path armed evidence 投影到 production deploy snapshot、Delivery Workbench summary 與 `production_deploy` lane metric。 +- 刷新 source readback 觀測 SHA 為 `f84269453834`;safe next step 改為 registration metadata 出現後由 autostart path enable runner service,再重跑 verifier。 + +**邊界**:只改 committed source / snapshot / API type / tests;未使用 GitHub;未讀 token / `.runner` 內容 / cookie / session / secret;未操作 host / Docker / K8s / runner service;未 workflow_dispatch。 + ## 2026-06-29 — 09:13 post-reboot verifier false-positive 收斂與 service green readback **背景**: diff --git a/docs/operations/awoooi-production-deploy-readback-blocker.snapshot.json b/docs/operations/awoooi-production-deploy-readback-blocker.snapshot.json index 1b4b5c2e..c0346bc6 100644 --- a/docs/operations/awoooi-production-deploy-readback-blocker.snapshot.json +++ b/docs/operations/awoooi-production-deploy-readback-blocker.snapshot.json @@ -1,12 +1,12 @@ { "schema_version": "awoooi_production_deploy_readback_blocker_v1", - "generated_at": "2026-06-29T08:51:04+08:00", + "generated_at": "2026-06-29T09:15:03+08:00", "status": "blocked_waiting_authorized_gitea_workflow_dispatch_and_runner_queue", "priority": "P0", "scope": "awoooi_production_truth", "readback": { - "observed_source_control_main_sha": "88607eae4d368416d04f5fe14fc47a53cd4f04a6", - "observed_source_control_main_short_sha": "88607eae4d36", + "observed_source_control_main_sha": "f84269453834a123eb40c6974e941f806b175b42", + "observed_source_control_main_short_sha": "f84269453834", "governance_closure_merge_sha": "27b96f0450d0e3ca6651d6b5f274a341dd727ef2", "governance_closure_commit_sha": "9e3e7fbb6ba3ffd324b45abf3ad1e7b6ec826b22", "production_image_tag_sha": "af45811e876fda322ee63c036fbc39c9f07ffd76", @@ -41,6 +41,8 @@ "non110_runner_host_label": "awoooi-non110-host", "non110_runner_ubuntu_label": "awoooi-non110-ubuntu", "non110_runner_online_label_match": false, + "non110_runner_autostart_path_armed": true, + "non110_runner_ready_autostart_path_count": 1, "non110_runner_registration_condition_required": true, "non110_runner_ready": false, "non110_runner_ready_config_count": 1, @@ -53,7 +55,7 @@ "runner_service_not_active", "no_active_runner_service" ], - "non110_runner_safe_next_step": "run_safe_registration_helper_from_interactive_tty_without_capturing_token_then_enable_service_and_rerun_verifier" + "non110_runner_safe_next_step": "run_register_awoooi_non110_runner_script_without_printing_token_then_autostart_path_will_enable_service_and_rerun_this_verifier" }, "blockers": [ { @@ -106,6 +108,7 @@ "authorized_dispatch_channel_ready": false, "non110_runner_ready": false, "non110_runner_online_label_match": false, + "non110_runner_autostart_path_armed": true, "non110_runner_remaining_blocker_count": 3, "runtime_write_performed": false, "secret_values_collected": false