# 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 | 過於保守，影響正常業務功能 |
