From 69a63ffa151d4f2515603e2695fc556ffe58f5d3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 30 Jun 2026 01:47:15 +0800 Subject: [PATCH] fix(api): complete release lane readback --- .../services/delivery_closure_workbench.py | 20 ++++++++++++++----- .../test_delivery_closure_workbench_api.py | 14 +++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/apps/api/src/services/delivery_closure_workbench.py b/apps/api/src/services/delivery_closure_workbench.py index 7d9d53a85..9090995e6 100644 --- a/apps/api/src/services/delivery_closure_workbench.py +++ b/apps/api/src/services/delivery_closure_workbench.py @@ -221,19 +221,29 @@ def build_delivery_closure_workbench( ) runtime_secret_surfaces = set(_strings(runtime_rollups.get("secret_surface_ids"))) + release_raw_completion = _percent(status_summary.get("overall_completion_percent")) + release_blocker_count = _int(status_summary.get("blocked_gate_count")) + release_controlled_package_ready = ( + status_summary.get("controlled_status_cleanup_package_ready") is True + and release_blocker_count == 0 + ) + release_completion = 100 if release_controlled_package_ready else release_raw_completion + lanes = [ { "id": "release", "source_id": "status_cleanup", - "completion_percent": _percent( - status_summary.get("overall_completion_percent") - ), + "completion_percent": release_completion, "status": str(status_summary.get("dashboard_status") or "unknown"), - "blocker_count": _int(status_summary.get("blocked_gate_count")), + "blocker_count": release_blocker_count, "metric": { "kind": "blocked_gate", - "blocked": _int(status_summary.get("blocked_gate_count")), + "blocked": release_blocker_count, "total": _int(status_summary.get("gate_count")), + "raw_overall_completion_percent": release_raw_completion, + "controlled_status_cleanup_package_ready": ( + release_controlled_package_ready + ), }, "href": "/governance?tab=automation-inventory", "next_action": _first_string(status_cleanup.get("next_actions")), diff --git a/apps/api/tests/test_delivery_closure_workbench_api.py b/apps/api/tests/test_delivery_closure_workbench_api.py index 760690bc3..247264107 100644 --- a/apps/api/tests/test_delivery_closure_workbench_api.py +++ b/apps/api/tests/test_delivery_closure_workbench_api.py @@ -110,6 +110,20 @@ def test_delivery_closure_workbench_uses_gitea_private_inventory_lane(): ) +def test_delivery_closure_workbench_marks_release_lane_complete_when_controlled_package_ready(): + payload = load_delivery_closure_workbench() + + _assert_delivery_workbench_shape(payload) + lane = {lane["id"]: lane for lane in payload["lanes"]}["release"] + + assert lane["source_id"] == "status_cleanup" + assert lane["status"] == "controlled_status_cleanup_package_ready" + assert lane["blocker_count"] == 0 + assert lane["completion_percent"] == 100 + assert lane["metric"]["raw_overall_completion_percent"] == 74 + assert lane["metric"]["controlled_status_cleanup_package_ready"] is True + + def test_delivery_closure_workbench_exposes_p0_005_credential_escrow_lane(): payload = load_delivery_closure_workbench()