From f78aab8b2ae06116127a2b78df30364e21374b1d Mon Sep 17 00:00:00 2001 From: OG T Date: Mon, 23 Mar 2026 23:46:21 +0800 Subject: [PATCH] =?UTF-8?q?fix(api):=20DecisionToken=20=E7=8B=80=E6=85=8B?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=20(Y/n=20=E6=8C=81=E4=B9=85=E5=8C=96?= =?UTF-8?q?=E4=BF=AE=E5=BE=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根本原因: - resolve_incident_after_approval 只更新 Incident.decision.state - 沒有更新獨立儲存的 DecisionToken (decision:{token} key) - 導致下次 poll 時 get_or_create_decision 返回 READY 狀態的舊 token - 前端繼續顯示 Y/n 按鈕 修復: - 在 resolve_incident_after_approval 中同時更新 DecisionToken 狀態為 COMPLETED - 確保整個決策鏈路狀態一致 Co-Authored-By: Claude Opus 4.5 --- apps/api/src/services/proposal_service.py | 34 +++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/apps/api/src/services/proposal_service.py b/apps/api/src/services/proposal_service.py index 2b7cd85cd..fd6184423 100644 --- a/apps/api/src/services/proposal_service.py +++ b/apps/api/src/services/proposal_service.py @@ -602,6 +602,39 @@ class ProposalService: error=str(e), ) + # 3. 更新 DecisionToken 狀態為 COMPLETED + # 關鍵修復: DecisionToken 獨立儲存在 decision:{token} + # 必須同步更新,否則下次 poll 會顯示 Y/n + decision_ok = False + try: + from src.services.decision_manager import get_decision_manager, DecisionState + decision_manager = get_decision_manager() + existing_token = await decision_manager._find_existing_token(incident_id) + if existing_token: + await decision_manager.update_token_state( + existing_token.token, + DecisionState.COMPLETED, + ) + decision_ok = True + logger.info( + "resolve_decision_token_updated", + incident_id=incident_id, + token=existing_token.token, + new_state="completed", + ) + else: + decision_ok = True # 沒有 token 也算成功 + logger.warning( + "resolve_decision_token_not_found", + incident_id=incident_id, + ) + except Exception as e: + logger.exception( + "resolve_decision_token_error", + incident_id=incident_id, + error=str(e), + ) + # 只要 Redis 更新成功就算成功(API 只讀 Redis) success = redis_ok logger.info( @@ -611,6 +644,7 @@ class ProposalService: success=success, redis_ok=redis_ok, db_ok=db_ok, + decision_ok=decision_ok, ) return success