# ADR-082: 多 Agent 協作架構（Phase 2）

> **日期**: 2026-04-15（台北）
> **狀態**: 🟢 批准（統帥 + 首席架構師共同簽核）
> **作者**: Claude Sonnet 4.6（首席架構師）+ 統帥 audit
> **相關**:
> - MASTER 藍圖：§3.2 D2 多 Agent 協作
> - ADR-081：Phase 1 感官縱深（前置）
> - HARD_RULES v1.9：Phase 退出條件鐵律

---

## 背景

Phase 1 完成後，AI 已具備「環境感知能力」（8D 感官 → EvidenceSnapshot）。
Phase 2 的目標是解決 LLM 的根本性弱點：**過度自信 + 幻覺**。

單一 OpenClaw 全包的問題：

| 問題 | 現象 |
|------|------|
| 沒有對抗機制 | LLM 說什麼信什麼，無內部質疑 |
| 根因與方案混為一談 | 根因判斷錯誤直接影響方案，無隔離 |
| 安全審查 = 無 | 危險指令只靠 HARD_RULES 靜態擋 |
| 無 Audit Trail | 無法追責「AI 為何做此決策」 |

## 決策

拆解單一 LLM 為 **5 個分工明確的 Agent**，用辯證 + 投票降低幻覺：

| Agent | 職責 | 輸入 | 輸出 |
|-------|------|------|------|
| **Diagnostician（偵探）** | RCA 根因分析 | `EvidenceSnapshot` | `DiagnosisReport` |
| **Solver（軍師）** | 對每個假設產方案 | `DiagnosisReport` | `ActionPlan` |
| **Reviewer（安全官）** | 安全審查 + 可行性 | `ActionPlan` | `ReviewVerdict` |
| **Critic（質疑者）** | 刻意唱反調，防幻覺 | `DiagnosisReport` + `ActionPlan` | `CriticReport` |
| **Coordinator（指揮官）** | 聚合辯證，拍板決策 | 全部 Agent 輸出 | `DecisionPackage` |

## 架構

```
EvidenceSnapshot
     │
     ▼
Diagnostician (3s)
     │  DiagnosisReport
     ▼
Solver (4s)
     │  ActionPlan
     ├─────────────────┐
     ▼                 ▼
Reviewer (3s)     Critic (3s)   ← 並行
     │ ReviewVerdict    │ CriticReport
     └────────┬─────────┘
              ▼
         Coordinator (2s)
              │  DecisionPackage
              ▼
        (回 decision_manager)
```

**時間預算**：P99 < 20s（含 Investigator 8s = Phase 1 已涵蓋）
**單 Agent 熔斷**：超時 5s → 降級為 rule-based mock，輸出「棄權」，不阻塞流程
**全流程熔斷**：> 30s → Coordinator 強制以現有資訊輸出結論並標 `degraded`

## Redis Streams 訊息匯流

Agent 間不直接 call function，透過 Redis Streams 傳訊：

- Stream Key: `aiops:agent:{session_id}`
- Consumer Group: 各 Agent 獨立消費自己的訊息
- 優勢：單一 Agent 掛掉不影響其他；可 replay 除錯

## AgentSession DB 表（Audit Trail）

每次辯證全程寫入 `agent_sessions`：

```
session_id / incident_id / agent_role / input_hash / output_json / latency_ms / created_at
```

- 不可刪除，只能新增（Immutable Event Sourcing）
- Phase 3 學習閉環依賴此表（記錄「Critic 是否挑戰成功」作為學習信號）

## 安全原則

- Reviewer 必須硬核拒絕任何觸碰 HARD_RULES 的動作（delete node / DROP TABLE 等）
- Critic prompt 強化「你的工作是找漏洞，不是順著說好話」（防 sycophancy）
- Agent 間不得修改彼此 prompt（防 prompt 污染擴散）
- 所有 Agent 輸出先過 `SanitizationService`（ADR-081 防注入）

## 回滾策略

```
AIOPS_P2_ENABLED=False → decision_manager 退回 Phase 1 單 LLM 路徑
```

- `agent_sessions` 表只新增，不影響任何舊表
- Orchestrator 熔斷設計：任一 Agent 失敗 → Coordinator 用現有資訊繼續

## Phase 2 退出條件

| 條件 | 量化指標 |
|------|---------|
| AgentSession 有資料 | 24h 內 ≥ 3 筆（Diagnostician / Solver / Coordinator 各 1）|
| 辯證有效 | 每事件 AgentSession turns ≥ 3 |
| Critic 工作 | CriticReport challenge_count > 0 至少 1 次 |
| 熔斷可用 | Diagnostician timeout → Coordinator 仍完成（降級路徑測試） |
| 延遲達標 | 多 Agent 路徑啟用後 p95 < 8s（避免拖垮主流程）|

## 不決定

- Agent 使用什麼 LLM（保持通過現有 `openclaw.call()` 路由，Phase 4 再優化模型分配）
- Agent 是否有「記憶」（Phase 3 再加 evidence_chain fine-tune）
- Declarative 修復（Phase 5）

---

*2026-04-15 ogt + Claude Sonnet 4.6（亞太）：Phase 2 正式批准*
