feat(governance): surface km completion callback evidence
Some checks failed
CD Pipeline / tests (push) Successful in 1m10s
Code Review / ai-code-review (push) Successful in 12s
CD Pipeline / build-and-deploy (push) Successful in 4m19s
E2E Health Check / e2e-health (push) Failing after 34s
CD Pipeline / post-deploy-checks (push) Successful in 1m46s

This commit is contained in:
Your Name
2026-05-24 23:55:16 +08:00
parent 318ca645d0
commit 760d6745a5
6 changed files with 423 additions and 15 deletions

View File

@@ -421,6 +421,28 @@ def test_list_callback_replies_response_preserves_callback_evidence() -> None:
"repair_state": "read_only_dry_run",
"needs_human": True,
},
"km_stale_completion_summary": {
"schema_version": (
"km_stale_owner_review_completion_callback_summary_v1"
),
"project_id": "awoooi",
"incident_id": "INC-20260513-79ED5E",
"status": "matched_owner_review",
"ready_count": 3,
"blocked_count": 1,
"completed_count": 2,
"failed_count": 0,
"batch_writes_allowed": False,
"manual_review_required": True,
"related_total": 1,
"related_items": [
{
"entry_id": "km-1",
"readiness": "ready",
"next_action": "preview_stale_km_review_completion",
}
],
},
"run_detail_href": (
"/awooop/runs/5c0306e0-591a-5445-9a33-80f499426b38"
"?project_id=awoooi"
@@ -438,9 +460,77 @@ def test_list_callback_replies_response_preserves_callback_evidence() -> None:
assert dumped["items"][0]["awooop_status_chain"]["repair_state"] == (
"read_only_dry_run"
)
assert dumped["items"][0]["km_stale_completion_summary"]["ready_count"] == 3
assert dumped["items"][0]["km_stale_completion_summary"]["related_total"] == 1
assert dumped["items"][0]["run_detail_href"].endswith("project_id=awoooi")
@pytest.mark.asyncio
async def test_km_stale_completion_summary_matches_callback_incident(
monkeypatch,
) -> None:
async def fake_query_km_stale_completion_queue(**kwargs):
assert kwargs["project_id"] == "awoooi"
assert kwargs["status_bucket"] == "all"
assert kwargs["limit"] == 100
return SimpleNamespace(
project_id="awoooi",
total=2,
returned=2,
pending_count=2,
ready_count=1,
blocked_count=1,
completed_count=0,
failed_count=0,
writes_on_read=False,
manual_review_required=True,
batch_writes_allowed=False,
items=[
SimpleNamespace(
entry_id="km-1",
title="Bitan pharmacy status drift",
dispatch_id="dispatch-1",
governance_event_id="event-1",
readiness="ready",
workflow_stage="waiting_owner_review",
next_action="preview_stale_km_review_completion",
priority_tier="P0",
recommended_completion_outcome="refresh_with_evidence",
can_preview=True,
related_incident_id="INC-20260513-79ED5E",
),
SimpleNamespace(
entry_id="km-2",
title="Other stale KM",
related_incident_id="INC-20260513-OTHER",
readiness="blocked",
),
],
)
monkeypatch.setattr(
platform_operator_service,
"query_km_stale_owner_review_completion_queue",
fake_query_km_stale_completion_queue,
)
summary = await platform_operator_service._fetch_km_stale_completion_summary_for_incident(
project_id="awoooi",
incident_id="INC-20260513-79ED5E",
queue_cache={},
)
assert summary["schema_version"] == (
"km_stale_owner_review_completion_callback_summary_v1"
)
assert summary["status"] == "matched_owner_review"
assert summary["ready_count"] == 1
assert summary["blocked_count"] == 1
assert summary["batch_writes_allowed"] is False
assert summary["related_items"][0]["entry_id"] == "km-1"
assert summary["related_items"][0]["can_preview"] is True
def test_list_approvals_response_preserves_status_chain() -> None:
run_id = UUID("5c0306e0-591a-5445-9a33-80f499426b38")
response = ListApprovalsResponse.model_validate({