# ADR-105: MCP Agent Loop Governance

**狀態**: Accepted  
**日期**: 2026-05-01  
**範圍**: MCP audit, Agent Loop, OpenClaw/NemoTron/Hermes/ElephantAlpha tool permissions

## 背景

AWOOOI 已有 MCP provider registry、K8s/SSH/Prometheus/Database/Grafana/RAG/Filesystem 等 provider、PreDecisionInvestigator、EvidenceSnapshot、PostExecutionVerifier。缺口不是「從零安裝 MCP」，而是：

- MCP 呼叫沒有統一 audit trail 與每日統計。
- PreDecisionInvestigator 是 Python pre-gathering 模式，LLM 看到結果但看不到 tool_use 過程。
- 不同 AI Agent 沒有可驗證的工具權限邊界。
- LLM retry storm 修掉後，需要讓真正的新 incident 能用 Agent Loop 深查，而不是回到靜態 prompt。

## 決策

### D1 — 保留 pre-gathering，新增 Agent Loop

PreDecisionInvestigator 仍是穩定 fallback。Agent Loop 作為 provider capability 漸進接入：

```text
Alert -> PreDecisionInvestigator -> EvidenceSnapshot -> LLM text decision
Alert -> Agent Loop -> LLM tool_use -> MCP tool_result -> Final Decision
```

任何 Agent Loop 超過 `max_iterations`、provider 不支援 tool_use、或工具權限不足時，必須降級回既有 pre-gathering / rule-first / Playbook RAG 路徑。

### D2 — 四 Agent 工具權限矩陣

| Agent | 允許 | 禁止 |
|-------|------|------|
| OpenClaw | 所有已註冊 MCP tool，由既有 safety gates 控制執行 | 無額外禁用 |
| NemoTron | Prometheus/Grafana/SignOz，K8s read-only | K8s restart/delete/scale/apply/patch |
| Hermes | Database、RAG、Filesystem、Prometheus | K8s/SSH 執行類操作 |
| ElephantAlpha | 全部 read-only | 任何寫入/通知/執行操作 |

權限定義在 `apps/api/src/services/ai_providers/permissions.py`，provider schema 轉換前必須先過濾。

### D3 — 統一 MCP audit

所有 registry provider 與 PDI tool registry provider 都包成 audited provider，寫入：

- `mcp_audit_log`
- `mcp_daily_stats`

`incident_id` 使用 `VARCHAR(64)`，因為 AWOOOI incident id 是 `INC-*` 字串，不是 UUID。Audit 必須包含 `agent_role`、`session_id`、`flywheel_node`、provider/tool、input/output、latency、success/error。

### D4 — MCP RAG 不獨立建 DB

內部 MCP RAG 沿用現有 PostgreSQL + pgvector + Redis hot cache：

- `knowledge_entries`
- `rag_chunks`
- `playbook_embeddings`
- existing KMWriter / KnowledgeRAG / PlaybookRAG

不另建獨立資料庫。原因：一致性、備份、incident/playbook join、權限治理都在同一 Postgres 邊界內已經存在。只有當向量資料量、查詢延遲、或多租戶隔離需要獨立擴展時，才評估外移專用 vector DB。

## 落地順序

1. P0: audit schema、agent_role、權限矩陣、tool schema、AgentToolExecutor。
2. P1: Claude/Ollama provider 接 `analyze_with_tools()`，但 DecisionManager 先 feature flag，不直接切主路徑。
3. P2: OpenClaw/NemoTron/Hermes/ElephantAlpha 逐一接線，先 read-only / diagnose，再開執行類工具。
4. P3: Langfuse spans、Grafana MCP dashboard、audit replay。

## 2026-05-01 P1 Canary

OpenClaw 先接 read-only shadow investigation，而不是直接替換主決策：

- Feature flag：`ENABLE_OPENCLAW_AGENT_LOOP_SHADOW`
- 輪數上限：`OPENCLAW_AGENT_LOOP_MAX_ITERATIONS`（prod canary 設 2）
- 觸發點：`OpenClawService.generate_incident_proposal_with_tools()` 原 proposal 成功後
- 允許工具：Kubernetes / Prometheus / SignOz / Database / RAG / Grafana 的 read-only tools
- Provider：本地 Ollama 優先，不新增 Gemini/Claude 付費呼叫
- 影響面：只附加 `agent_loop_shadow` metadata，不覆蓋 `action`、`risk_level`、`confidence` 或 Nemotron tool result
- Structured metadata：shadow raw response 需正規化為 `agent_loop_shadow.structured`，包含 `root_cause_check`、`evidence_used`、`confidence_delta`、`missing_evidence`、`human_or_ai_next_step`、`parse_status`
- Confidence delta：canary 階段只可記錄 0 到 -0.15 的保守 metadata，正值一律歸零；任何 score 或 auto-execute gate 變更需另開 ADR/Logbook 並通過 production audit
- 失敗策略：log warning 後回到既有 proposal / Nemotron / Playbook 路徑

## 驗收

- `mcp_audit_log` 24h call count > 0。
- 每筆 Agent Loop tool_use 有 `agent_role`。
- NemoTron / ElephantAlpha 無法取得 K8s 寫入工具。
- LLM ghost-loop 不因 Agent Loop 重啟：仍受 Alertmanager in-flight lock、stable cache、provider circuit breaker、max_iterations 控制。
