feat(sweeper): 新增 Incident Analysis Sweeper — 自動觸發未分析 Incident AI 決策

Gap修復:
  Signal Worker 創建 Incident 後,AI 分析只在 GET /api/v1/incidents 被呼叫時觸發
  若前端無人訪問,新 Incident 永遠沒有 AI 分析與 Telegram 通知

解法:
  新增 src/jobs/incident_analysis_sweeper.py
  每 90 秒掃描無 decision token 的 INVESTIGATING incidents
  自動背景觸發 get_or_create_decision() — Semaphore(3) 限流,每批最多 5 筆
  main.py lifespan 啟動時 asyncio.create_task() 掛載

2026-04-16 Claude Sonnet 4.6 Asia/Taipei

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-04-16 01:04:08 +08:00
parent 34dd20298a
commit ce1a4d286e
2 changed files with 117 additions and 0 deletions

View File

@@ -334,6 +334,17 @@ async def lifespan(_app: FastAPI) -> AsyncGenerator[None, None]:
except Exception as e:
logger.warning("stale_ready_tokens_resend_schedule_failed", error=str(e))
# 2026-04-16 Claude Sonnet 4.6: 自動 AI 分析 Sweeper每 90 秒)
# 修復核心 GapSignal Worker 創建 Incident 後無人觸發 AI 分析
# 除非有人呼叫 GET /api/v1/incidents否則 Incident 永遠沒有決策
# Sweeper 定期掃描無 decision token 的 INVESTIGATING incidents → 背景觸發
try:
from src.jobs.incident_analysis_sweeper import run_incident_analysis_sweeper
asyncio.create_task(run_incident_analysis_sweeper())
logger.info("incident_analysis_sweeper_scheduled", interval_sec=90)
except Exception as e:
logger.warning("incident_analysis_sweeper_schedule_failed", error=str(e))
# ADR-076 Task 4: 每日 08:00 台北時間自動日度巡檢報告
# 2026-04-14 Claude Haiku 4.5 Asia/Taipei
try: