fix(governance): link events to dispatch history
All checks were successful
Code Review / ai-code-review (push) Successful in 11s
CD Pipeline / tests (push) Successful in 5m55s
CD Pipeline / build-and-deploy (push) Successful in 3m38s
CD Pipeline / post-deploy-checks (push) Successful in 1m46s

This commit is contained in:
Your Name
2026-05-19 22:04:31 +08:00
parent 955dbce670
commit e2a2e03c79
2 changed files with 103 additions and 2 deletions

View File

@@ -33,6 +33,7 @@ from src.models.governance import (
)
from src.services.governance_query_service import (
_extract_remediation,
_merge_dispatch_ids,
_query_dispatch_table,
_to_governance_event,
)
@@ -221,6 +222,42 @@ class TestEventsReadSideNormalization:
assert event.remediation == "補齊 SLO emitter"
assert event.impact == "SLO metrics missing"
def test_governance_event_uses_db_dispatch_ids_first(self):
"""events read model 應以 dispatch table ids 補齊 detail/history 鏈路。"""
row = type("Row", (), {
"id": "evt-001",
"event_type": "knowledge_degradation",
"triggered_at": NOW,
"resolved": False,
"resolved_at": None,
"details": {
"message": "KM stale",
"dispatch_ids": ["legacy-dispatch"],
},
})()
event = _to_governance_event(row, dispatch_ids=["db-dispatch", "legacy-dispatch"])
assert event.dispatch_ids == ["db-dispatch", "legacy-dispatch"]
def test_merge_dispatch_ids_deduplicates_and_preserves_db_priority(self):
"""DB truth-firstlegacy payload 只作 fallback。"""
assert _merge_dispatch_ids(
["db-2", "db-1"],
["db-1", "legacy-1", None],
) == ["db-2", "db-1", "legacy-1"]
def test_events_query_joins_dispatch_table_for_history_buttons(self):
"""events endpoint 不可只讀 details.dispatch_ids必須查 dispatch table。"""
import inspect
from src.services import governance_query_service
source = inspect.getsource(governance_query_service._load_dispatch_ids_for_events)
assert "FROM governance_remediation_dispatch d" in source
assert "d.governance_event_id IN :event_ids" in source
assert "ORDER BY d.dispatched_at DESC" in source
# =============================================================================
# 3. queue endpoint graceful fallback