Files
awoooi/docs/adr/ADR-105-mcp-agent-loop-governance.md
Your Name b0da6da1e9
Some checks failed
CD Pipeline / tests (push) Successful in 2m50s
Code Review / ai-code-review (push) Successful in 33s
CD Pipeline / build-and-deploy (push) Failing after 25m48s
CD Pipeline / post-deploy-checks (push) Has been cancelled
feat(aiops): structure agent loop shadow output
2026-05-01 15:09:57 +08:00

87 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/SignOzK8s 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 metadatashadow raw response 需正規化為 `agent_loop_shadow.structured`,包含 `root_cause_check``evidence_used``confidence_delta``missing_evidence``human_or_ai_next_step``parse_status`
- Confidence deltacanary 階段只可記錄 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 控制。