fix(api): resolve db-only stale incidents
All checks were successful
CD Pipeline / tests (push) Successful in 1m33s
Code Review / ai-code-review (push) Successful in 11s
CD Pipeline / build-and-deploy (push) Successful in 4m54s
CD Pipeline / post-deploy-checks (push) Successful in 2m8s

This commit is contained in:
Your Name
2026-05-29 11:15:43 +08:00
parent aeaa77bbe1
commit 92316dda04
2 changed files with 84 additions and 5 deletions

View File

@@ -1168,12 +1168,14 @@ class IncidentService:
from src.utils.timezone import now_taipei
# 1. 從 Working Memory 讀取Redis TTL 過期時退回 PostgreSQL。
hydrated_from_episodic = False
incident = await self.get_from_working_memory(incident_id)
if incident is None:
incident = await self.get_from_episodic_memory(incident_id)
if incident is None:
logger.warning("incident_not_found_for_resolve", incident_id=incident_id)
return None
hydrated_from_episodic = True
logger.info(
"incident_resolve_hydrated_from_episodic_memory",
incident_id=incident_id,
@@ -1197,11 +1199,15 @@ class IncidentService:
incident.resolved_at = now_taipei()
incident.updated_at = now_taipei()
# 3. 寫入 Working Memory
redis_success = await self.save_to_working_memory(incident)
if not redis_success:
logger.error("resolve_redis_write_failed", incident_id=incident_id)
return None
# 3. 寫入 Working Memory。Redis TTL 已過的歷史 DB-only 事件只更新 DB
# 不重新灌回 Redis working memory,避免舊事件回流成 active workload。
if hydrated_from_episodic:
logger.info("resolve_db_only_incident", incident_id=incident_id)
else:
redis_success = await self.save_to_working_memory(incident)
if not redis_success:
logger.error("resolve_redis_write_failed", incident_id=incident_id)
return None
# 4. 同步到 Episodic Memory
try: