From af2adb5b96db81f221761e2c9cf934256afbe9a7 Mon Sep 17 00:00:00 2001 From: OG T Date: Fri, 17 Apr 2026 22:26:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(telegram):=20ADR-091=20=E7=A6=81=E6=AD=A2?= =?UTF-8?q?=20Agent=20Debate=20=E5=88=86=E6=9E=90=E5=A4=B1=E6=95=97?= =?UTF-8?q?=E6=99=82=E5=BB=A3=E6=92=AD=E3=80=8C=E5=BE=85=E5=88=86=E6=9E=90?= =?UTF-8?q?=E3=80=8D=E5=96=AA=E5=B1=8D=E5=8D=A1=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 問題根因: GET /incidents 觸發 Phase 2 Agent Debate → LLM 全失敗 → description="待分析" + action="" → 每隔幾分鐘廣播新 Telegram 卡片 → 告警疲勞(SRE 最致命的殺手) 架構缺陷 (anti-pattern): GET 請求(讀取操作)產生對外廣播副作用 → 違反 RESTful 原則 修復 (_push_decision_to_telegram): 在 DB 更新完成後、Telegram 推送前加入閘門: description="待分析" AND action="" → 靜默退出,絕不廣播 ADR-091 鐵律: 只有 Alertmanager Webhook POST(真實新告警)可觸發 Telegram 廣播 Agent Debate 失敗分析 → 靜默 DB 更新,不污染頻道 2026-04-17 ogt + Claude Sonnet 4.6 Co-Authored-By: Claude Sonnet 4.6 --- apps/api/src/services/decision_manager.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps/api/src/services/decision_manager.py b/apps/api/src/services/decision_manager.py index c218603d..65c57181 100644 --- a/apps/api/src/services/decision_manager.py +++ b/apps/api/src/services/decision_manager.py @@ -264,6 +264,20 @@ async def _push_decision_to_telegram( error=str(_update_err), ) + # 🚨 ADR-091 鐵律 (2026-04-17 ogt + Claude Sonnet 4.6): 禁止分析失敗廣播 + # 問題: GET /incidents 觸發 Agent Debate → LLM 全部失敗 → description="待分析" + action="" + # → 系統每隔幾分鐘廣播「待分析」喪屍卡片 → 告警疲勞(SRE 最致命的殺手) + # 規則: description="待分析" + action="" = Phase 2 所有 Agent 無有效輸出 → 靜默退出 + # 已完成: DB 狀態已在上方更新 (update_action_by_incident_id),不需要 Telegram 廣播 + # 禁止改動: 此閘門保護全域告警信噪比,任何「加例外」需首席架構師書面授權 + if description.strip() == "待分析" and not action.strip(): + logger.info( + "telegram_push_suppressed_no_analysis", + incident_id=incident.incident_id, + reason="Agent Debate 無有效輸出 (description=待分析, action=空白)", + ) + return + # 建立 approval_id (使用 incident_id 作為追蹤) # 2026-03-27 ogt: 修復 INC-INC-INC- 重複前綴 bug approval_id = incident.incident_id # 已經是 INC-xxx 格式