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>
97 lines
3.0 KiB
Markdown
97 lines
3.0 KiB
Markdown
# 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`,可能將機密資料傳送至雲端 Provider(Gemini、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 官方雲端 API(api.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 Probe(K0.5,待維護窗口)
|
||
- 若未來引入第三個 local provider,`_local_fallback_chain` 需更新
|
||
|
||
---
|
||
|
||
## 替代方案
|
||
|
||
| 方案 | 理由未採用 |
|
||
|------|-----------|
|
||
| 允許 DIAGNOSE 降級至 Gemini | 違反零信任原則 |
|
||
| 只用 Ollama 做 DIAGNOSE | 能力不足,診斷品質差 |
|
||
| 所有任務類型一律 local-only | 過於保守,影響正常業務功能 |
|