Files
awoooi/docs/adr/ADR-054-diagnose-privacy-first-routing.md
OG T 15c7f6fcd3 docs(adr): 起草 ADR-054/055/056/057 — Phase 25 三方向架構決策
ADR-054: DIAGNOSE Privacy-First Routing (已批准)
  - _local_fallback_chain 設計決策
  - NEMOTRON privacy_level=local 首席架構師裁示
  - 全部 local 失敗 → REJECT + Telegram

ADR-055: Knowledge Auto-Harvesting (已批准)
  - AUTO_RUNBOOK DRAFT + ANTI_PATTERN PUBLISHED 設計理由
  - compute_hash() 碰撞風險說明
  - Fire-and-forget GC 防護強制規範

ADR-056: Config Drift Detection 四層架構 (已批准)
  - Detector→Analyzer→Interpreter→Remediator 職責邊界
  - AI 只做意圖分析不做修復決策
  - adopt() 暫停 + _recent_reports Phase 1 限制

ADR-057: adopt() Gitea PR API 實作路徑 (草案,待批准)
  - 解決 API Pod git add -A 安全風險
  - PR review 流程保障

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-05 00:24:50 +08:00

97 lines
3.0 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-054: DIAGNOSE Privacy-First Routing本地隱私邊界
> **狀態**: ✅ 已批准
> **日期**: 2026-04-04
> **決策者**: 統帥 + 首席架構師
> **首席架構師評分**: 技術背書
> **關聯 ADR**: ADR-052 (AI Provider Registry)
> **實作**: Phase 25 P0 — commit 3455044, a562db4
---
## 背景
### 問題陳述
`DIAGNOSE` 任務類型(根本原因分析、服務診斷)會接收到包含機密基礎設施資訊的 Incident 資料Pod 名稱、錯誤堆疊、服務拓撲)。在 ADR-052 的 AI Provider Registry 架構下DIAGNOSE 原本沿用 `_fallback_chain`,可能將機密資料傳送至雲端 ProviderGemini、Claude
### 驅動因素
1. **零信任原則**: 機密基礎設施資料不應離開內網
2. **合規要求**: 避免系統診斷資料上傳至第三方雲端
3. **能力需求**: 診斷任務需要高推理能力,不能只用 Ollama
---
## 決策
### D1: 建立 `_local_fallback_chain`
```python
# ai_router.py
self._local_fallback_chain: list[tuple[AIProviderEnum, str]] = [
(AIProviderEnum.NEMOTRON, self._nemotron_default), # NIM 188主力
(AIProviderEnum.OLLAMA, self._ollama_summary), # Ollama 188備援
]
```
DIAGNOSE 任務強制使用此鏈,不允許降級至任何 `privacy_level="cloud"` 的 Provider。
### D2: NEMOTRON Provider 的 privacy_level 裁定
**首席架構師裁示 (2026-04-04)**
- NEMOTRON Provider 對應 NVIDIA NIM 部署在 **192.168.0.188**(內網 GPU 主機)
- 非 NVIDIA 官方雲端 APIapi.nvidia.com
- 屬於 local infra`privacy_level = "local"`,可納入 DIAGNOSE 隱私邊界
```python
# nemotron.py
@property
def privacy_level(self) -> str:
return "local" # NIM 部署在 192.168.0.188(內網 GPU
```
### D3: 全部 Local Provider 不可用時 → REJECT + Telegram
```python
# 全部 local provider 失敗或不可用時
await tg.send_text("⚠️ DIAGNOSE 本地 Provider 不可用,需要人工介入")
return AIResult(success=False, reason="REJECT_PRIVACY_BOUNDARY")
```
不降級至雲端。必要時通知人工介入。
### D4: route_sync() 同步版本同樣適用隱私邊界
`route_sync()` 補齊相同的 DIAGNOSE → `_local_fallback_chain` 判斷,確保同步路徑不繞過隱私邊界。
---
## 後果
### 正面影響
- DIAGNOSE 資料的隱私保護有制度性保障
- 失敗時告警人工介入,不靜默降級至雲端
- NIM 188 具備足夠診斷能力Nemotron-4 340B 量化版)
### 負面影響 / 風險
- 若 NIM 188 離線且 Ollama 超時DIAGNOSE 功能暫時中斷
- 需要維護 NIM 188 的高可用性
### 未決事項
- NIM 188 是否需要 Startup ProbeK0.5,待維護窗口)
- 若未來引入第三個 local provider`_local_fallback_chain` 需更新
---
## 替代方案
| 方案 | 理由未採用 |
|------|-----------|
| 允許 DIAGNOSE 降級至 Gemini | 違反零信任原則 |
| 只用 Ollama 做 DIAGNOSE | 能力不足,診斷品質差 |
| 所有任務類型一律 local-only | 過於保守,影響正常業務功能 |