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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user