From 855b7f5593eecf6415595ba63cd4e7ed0b554691 Mon Sep 17 00:00:00 2001 From: OG T Date: Thu, 26 Mar 2026 22:24:03 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=BE=A9=20Telegram=20?= =?UTF-8?q?=E8=BD=9F=E7=82=B8=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 問題: 765ee39 的修改導致 COMPLETED 狀態下 incident 未解決時 會建立新 decision,每次 poll 都觸發 Telegram 發送 修復: COMPLETED 狀態直接返回 existing_token,不建立新 decision Co-Authored-By: Claude Opus 4.5 --- apps/api/src/services/decision_manager.py | 26 ++++------------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/apps/api/src/services/decision_manager.py b/apps/api/src/services/decision_manager.py index 54854818f..b313ad3b8 100644 --- a/apps/api/src/services/decision_manager.py +++ b/apps/api/src/services/decision_manager.py @@ -347,19 +347,9 @@ class DecisionManager: # READY 或 EXECUTING 狀態: 直接返回 if existing_token.state in (DecisionState.READY, DecisionState.EXECUTING): return existing_token - # COMPLETED 狀態: 只有 incident 也已解決才返回,否則創建新 decision - # 修復: 避免 incident 未解決但 decision 已完成導致 Y/n 按鈕永久禁用 + # COMPLETED 狀態: 直接返回,避免重複建立 decision 導致 Telegram 轟炸 if existing_token.state == DecisionState.COMPLETED: - from src.models.incident import IncidentStatus - if incident.status in (IncidentStatus.RESOLVED, IncidentStatus.CLOSED): - return existing_token - # incident 仍在處理中,需要新的 decision - logger.info( - "decision_reset_for_active_incident", - token=existing_token.token, - incident_id=incident.incident_id, - incident_status=incident.status.value, - ) + return existing_token # 2. 建立新 token token = DecisionToken( @@ -780,17 +770,9 @@ class DecisionManager: # READY 或 EXECUTING 狀態: 直接返回 if existing_token.state in (DecisionState.READY, DecisionState.EXECUTING): return existing_token - # COMPLETED 狀態: 只有 incident 也已解決才返回 + # COMPLETED 狀態: 直接返回,避免重複建立 decision 導致 Telegram 轟炸 if existing_token.state == DecisionState.COMPLETED: - from src.models.incident import IncidentStatus - if incident.status in (IncidentStatus.RESOLVED, IncidentStatus.CLOSED): - return existing_token - logger.info( - "decision_reset_for_active_incident_consensus", - token=existing_token.token, - incident_id=incident.incident_id, - incident_status=incident.status.value, - ) + return existing_token # 建立新 token token = DecisionToken(