fix(api): DecisionToken 狀態同步 (Y/n 持久化修復)

根本原因:
- 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 <noreply@anthropic.com>
This commit is contained in:
OG T
2026-03-23 23:46:21 +08:00
parent 8542632cff
commit f78aab8b2a

View File

@@ -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