# ADR-070: 全自動 AIOps 閉環 — MCP Phase 1-4

**狀態**: Accepted  
**日期**: 2026-04-11 (台北時間)  
**作者**: Claude Sonnet 4.6 + 首席架構師審查  
**關聯**: `docs/superpowers/specs/2026-04-10-infra-rebuild-sprint-abc-design.md` § 14

---

## 問題

AWOOOI AIOps 告警閉環存在三大盲點：

1. **主機層盲點（70%）**：所有修復動作都在 K8s 層，無法 SSH 到宿主機排查 Docker/Nginx/PM2 問題
2. **情報缺乏**：決策引擎只有告警標籤，無即時 Prometheus 指標輔助診斷
3. **知識沉澱不完整**：KM 只記錄動作，缺少「執行前情境 + 執行後驗證」三段資料
4. **零寫死判斷**：symptom_pattern 應由 AI 動態生成，不應硬編碼

---

## 決定

採用 **MCP Provider 架構**（四個 Phase 遞進實作）：

### MCP Phase 1 — K8s MCP 強化
新增 6 個 K8s 工具：`pod_logs`, `watch_rollout`, `get_events`, `describe_resource`, `get_hpa`, `get_node_status`

### MCP Phase 2 — 主機層 + 情報收集
- **Phase 2a** `ssh_provider.py`：15 工具，群組 A 診斷（9 工具）+ 群組 B 操作（6 工具）
  - 四層守衛：SSH 連線池、asyncssh、already-known-hosts、參數白名單
  - 支援主機：188（ollama）/ 110（wooo）/ 111（ollama）
- **Phase 2b** `prometheus_provider.py`：3 工具（query / range / alert_history）

### MCP Phase 3 — GitOps + 錯誤追蹤
- `argocd_provider.py`：3 工具（list_apps / get_app_status / get_sync_history）
  - TLS verify=False（self-signed）, app name 白名單 `^[a-zA-Z0-9][a-zA-Z0-9._-]{0,62}$`
- `sentry_provider.py`：3 工具（list_issues / get_issue / search_events）
  - issue_id 僅允許數字 `^\d{1,20}$`

### MCP Phase 4 — NemoClaw 整合 + KM 三段資料

**Phase 4a** — NemoClaw Second Opinion（deepseek-r1:14b）：
- 觸發條件：`confidence < 0.7`
- 呼叫 Ollama 188:11434，解析 `<think>...</think>` CoT
- 結果寫入 `proposal_data["advisory_note"]`，由 Telegram 推送

**Phase 4b** — K8s 狀態後驗證：
- 自動修復完成後呼叫 `K8sProvider.kubectl_get(pods)`
- 寫入 `incidents.k8s_state_after`

**Phase 4c** — AI 動態 Playbook 草稿：
- 新 alertname 首次出現時，`qwen2.5:7b-instruct` 生成 5 段結構化草稿
- 去重：semantic_search threshold=0.92（避免重複沉澱）
- 狀態標記 DRAFT，人工審核後升為 APPROVED

---

## 後果

### 正面
- 主機層告警可自動修復（Nginx down / Docker 容器異常 / 磁碟滿）
- KM 三段資料完整（執行前指標 + 動作 + 執行後 K8s 狀態）
- 新告警 AI 自動生成 Playbook 草稿，飛輪冷啟動速度提升

### 風險
- SSH 工具有命令注入風險 → 四層白名單守衛緩解
- NemoClaw 呼叫增加 Ollama 負載 → 僅在信心 < 0.7 觸發，非必經路徑
- Playbook 草稿品質依賴 qwen2.5:7b → DRAFT 狀態人工審核把關

---

## 實作記錄

| Phase | Commit | 檔案 |
|-------|--------|------|
| MCP Phase 1 | a29e5e1 | `k8s_provider.py` +6 工具 |
| MCP Phase 2a | 6351e9a | `ssh_provider.py` 15 工具 |
| MCP Phase 2b | 6351e9a | `prometheus_provider.py` 3 工具 |
| MCP Phase 3 | a2cc985 | `argocd_provider.py` + `sentry_provider.py` |
| MCP Phase 4a | f3ee577 | `decision_manager._nemoclaw_second_opinion()` |
| MCP Phase 4b | 0fa3b35 | `decision_manager._push_auto_repair_result()` k8s_state_after |
| MCP Phase 4c | 7eb49f9 | `decision_manager._generate_playbook_draft_if_new()` |
| providers 全註冊 | a2cc985 | `providers/__init__.py` 10 providers |
| 生產驗收 | 2026-04-11 | 10 providers enabled，2 pods Running |
| 全自動化三大修復 | c439277 | `auto_approve.py` high risk 全開放 + DESTRUCTIVE_PATTERNS；`decision_manager._collect_mcp_context()` MCP 前置收集；`webhooks.py` target_resource 修正 |
| Tier 3 CR 修補 | 8be87b0 | C1 ternary bug / C2 timeout / C3 DESTRUCTIVE_PATTERNS 補全 / I1 RFC-1918 / I4 25 tests |
