# ADR-043: FailureWatcher 與 DecisionManager 協調 > **狀態**: 已批准 > **決策日期**: 2026-03-31 > **決策者**: Claude Code (首席架構師) > **相關**: Phase 18 失敗自動修復閉環 ## 背景 Phase 18 引入 FailureWatcher 自動修復機制,Phase 6.5 有 DecisionManager 處理 Incident 決策。 兩者可能對同一資源產生競爭: - FailureWatcher: 執行失敗 → 自動修復 - DecisionManager: Incident 告警 → AI 決策 → 提案 ## 問題陳述 同一資源 (如 `deployment/api`) 可能同時: 1. 被 FailureWatcher 觸發自動修復 (因執行失敗) 2. 被 DecisionManager 生成修復提案 (因 Incident 告警) 這會導致: - 重複操作 (雙重重啟) - 資源競爭 (同時修改同一 Deployment) - 日誌混亂 (無法追蹤誰觸發了修復) ## 決策 ### 優先級規則 ``` DecisionManager 提案 > FailureWatcher 自動修復 ``` **理由**: - DecisionManager 經過 Trust Engine 評估 - DecisionManager 有完整的 Approval 流程 - FailureWatcher 是「補救」機制,不應覆蓋「主動決策」 ### 實作方式 #### 1. 資源鎖定 (Redis) ```python # FailureWatcher 執行前檢查 lock_key = f"awoooi:resource_lock:{namespace}:{target_resource}" existing_lock = await redis.get(lock_key) if existing_lock: # DecisionManager 已鎖定,跳過自動修復 logger.info("resource_locked_by_decision_manager", resource=target_resource) return {"next_action": "deferred_to_decision_manager"} ``` #### 2. Approval 檢查 ```python # FailureWatcher 執行前檢查是否有 pending approval pending = await approval_repo.get_pending_for_resource(target_resource) if pending: logger.info("pending_approval_exists", resource=target_resource) return {"next_action": "awaiting_existing_approval"} ``` #### 3. 來源標記 ```python # AuditLog 擴展 authorization_channel: str # "auto_repair" | "decision_manager" | "manual" source_system: str # "failure_watcher" | "decision_manager" | "api" ``` ### 協調流程 ``` Incident/執行失敗 ↓ 檢查資源鎖定 (Redis) ├─ 已鎖定 → 跳過,記錄 deferred └─ 未鎖定 → 繼續 ↓ 檢查 Pending Approval ├─ 存在 → 跳過,等待現有流程 └─ 不存在 → 繼續 ↓ 根據來源執行: ├─ DecisionManager → 建立 Approval (帶鎖) └─ FailureWatcher → 自動修復 (LOW 風險) ``` ## 後果 ### 正面 - 避免重複操作 - 明確優先級 - 完整審計追蹤 ### 負面 - 增加 Redis 依賴 - 邏輯複雜度提升 ### 風險 - Redis 故障時需降級策略 (保守跳過) ## 實作狀態 | 項目 | 狀態 | |------|------| | 資源鎖定機制 | 🟡 P1 待實作 | | Approval 檢查 | 🟡 P1 待實作 | | 來源標記 | ✅ 已有 `authorization_channel` | ## 相關文件 - Phase 18: 失敗自動修復閉環 - Phase 6.5: DecisionManager 雙軌決策 - ADR-040: 全域自動修復熔斷 --- **Co-Authored-By: Claude Opus 4.5 **