# Phase 6 Critic Sign-off — Operation Ollama-First v5.0

> **Date**: 2026-05-03
> **Reviewer**: critic-A11（Phase 6 文件層收尾，第三輪）
> **Scope**: ADR-028 / ADR-029 / ADR-027 附錄 / docs/adr/README.md
> **基準**: 憲法紅線一（事實驅動，狙擊手精神）
> **任務契約**: 驗證每個具體數字、檔案行號、聲稱的決策都有 Phase 0/1/2/3 報告佐證

---

## Verdict

- [ ] APPROVED — Phase 6 ADR 可 commit
- [ ] APPROVED WITH NOTES — 統帥確認 NOTE 後 commit
- [x] **CONDITIONAL** — 修以下 BLOCKER 後 commit；HIGH 可同 commit 內順便修
- [ ] REJECTED

**理由**：ADR-028 / ADR-029 在「事實層」有 5 個 BLOCKER 級錯誤（行號錯、caller 名虛構、provider 白名單與 DB 不一致、OpenClaw 行數錯、減幅算術不自洽）。這兩份文件一旦 commit 會被未來所有 Phase 引用，事實錯誤會成為「憲法級謬誤」傳承。憲法紅線一不容妥協 — 這幾個數字必須改正後再 merge。

ADR-027 附錄與 README 索引部分基本正確，但附錄 A 引用「寫死 IP 已全面消除」用詞過強（aider_heal_executor.py:62 仍有 fallback 字面 IP），降為 HIGH。

---

## 事實核驗（逐項）

### A. 程式碼行數

| 聲稱 | ADR 寫 | wc -l 實測 | 差距 | 判定 |
|---|---|---|---|---|
| `services/openclaw_strategist_service.py` | **1831 行**（ADR-029:18, 113）| **2677 行** | **+846（+46%）** | 🔴 BLOCKER |
| `services/hermes_analyst_service.py` | **573 行**（ADR-029:19）| **607 行** | +34（+5.9%） | 🟠 HIGH |
| 比率 | 4.4× | 4.41× | 湊巧仍對 | ✅ |
| 預估 A10 後 | 1300 行 | — | 但是基準錯，目標 1300 行也失準 | 🔴 連帶 |

**證據**：
```
$ wc -l services/openclaw_strategist_service.py services/hermes_analyst_service.py
2677 services/openclaw_strategist_service.py
 607 services/hermes_analyst_service.py
```

ADR-029 的 1831 / 573 是直接抄 phase0 audit（也錯），而非實際數行。狙擊手精神失守。

### B. 場景 file:line 行號

| 場景 | ADR-028 寫 | 實測 | 判定 |
|---|---|---|---|
| #1 MCP L1 Grounding | `mcp_collector_service.py:163-167` | 163-167 是 `for tools in (...)` Gemini 設定區塊 | ✅ 對得上 |
| #2 MCP L2 Grounding | `mcp_collector_service.py:185-186` | 185-186 是 except 塊內的 1.5-flash 重試 | ✅ 對得上 |
| #3 PPT generator | `routes/openclaw_bot_routes.py:2464-2477` | 2469 是 `_call_gemini` def | ✅ 對得上 |
| #4 openclaw_weekly | `services/openclaw_strategist_service.py:759` | **實際在 1340** | 🔴 BLOCKER |
| #4 openclaw_monthly | `services/openclaw_strategist_service.py:1267` | **實際在 1771** | 🔴 BLOCKER |
| #4 openclaw_annual | 「戰略月年報」（無 file:line）+ caller 名 `openclaw_annual` | **caller 與 function 都不存在**（grep 0 hits）| 🔴 BLOCKER（虛構） |
| #5 code_review_openclaw | `services/code_review_pipeline_service.py:278-286` | 278-286 是 system/user prompt 字串；實際 `_call_gemini` 在 309 | 🟠 HIGH（行號偏移） |
| #6 ea_hitl_prefetch | `services/elephant_alpha_orchestrator.py`（無行號）+ caller 名 `ea_hitl_prefetch` | **caller 不存在**（grep 0 hits） | 🔴 BLOCKER（虛構 caller） |
| #7 openclaw_qa_complex_sku | `services/openclaw_strategist_service.py:56` | line 56 是 feature flag 註解；caller `openclaw_qa_complex_sku` 不存在（grep 0 hits） | 🔴 BLOCKER（虛構 caller + 行號錯） |

證據：
```
$ grep -rn "ea_hitl_prefetch\|openclaw_qa_complex\|openclaw_annual" services/ routes/
（0 hits）
```

ADR-028 的「鎖定 Gemini 7 個場景」表格把 7 個 caller 名直接寫入 ADR，但其中 3 個（#4 annual / #6 EA HITL / #7 complex SKU）**caller 名是憑空編出來的**，至今程式碼從未 emit 這些 caller。等同 ADR 治理規則指向「不存在的東西」。

### C. Provider 白名單一致性

| 來源 | provider 列表 | 數量 |
|---|---|---|
| ADR-028:104-114「Provider 白名單」表格 | `gcp_ollama` / `ollama_secondary` / `ollama_111` / `gemini` / `nim` / `nim_via_elephant` / `openrouter` | 7（**不含 claude，含 ollama_secondary**）|
| ADR-028:114「移除原計畫的 claude provider」聲明 | 7（不含 claude） | 7 |
| ADR-028:208 Verification V1 期望輸出 | 7（不含 claude） | 7 |
| 實際 `migrations/024:92-94` `chk_ai_calls_provider` | `gcp_ollama` / `ollama_secondary` / `ollama_111` / `gemini` / `claude` / `nim` / `openrouter` / `nim_via_elephant` | **8（含 claude）** |
| `services/token_report_service.py:42-50` `_PROVIDER_DISPLAY` | `gcp_ollama` / `ollama_111` / `gemini` / `claude` / `nim` / `openrouter` / `nim_via_elephant` | 7（**含 claude，不含 ollama_secondary**）|
| `migrations/025` budget 種子 monthly 列表 | 7：含 `claude` 但缺 `ollama_secondary` | 7 |

**三處不一致**：
1. ADR-028 表格寫含 `ollama_secondary` 不含 `claude`
2. DB CHECK 兩個都包含
3. token_report `_PROVIDER_DISPLAY` 與 budget 種子兩個都缺 `ollama_secondary`，含 `claude`

判定：🔴 BLOCKER。ADR-028 的 Verification V1「期望輸出」實際跑會驗證失敗（會多出 `claude`、缺 `ollama_secondary`...都不是 — 8 個對照 7 個直接 mismatch）。`phase1_final_critic_signoff_20260503.md:26` 也記成「7 個 provider 與 _PROVIDER_DISPLAY 完全一致」— 這是上一輪 critic 的盲區，現在被 ADR-028 沿襲。

### D. OpenClaw / Hermes Token 流量估算

ADR-029 line 23-25 與 line 91-94 的算術：

- 戰前 Gemini ~50M tokens/月、Hermes ~30M tokens/月
- 任務 3/4/5 遷移省 ~12M tokens
- 任務 11 降頻省 ~3M tokens
- 戰後 Gemini ~38M tokens/月（line 112）
- 減幅 -23%（line 112）

**算術不自洽**：
- 50M − (12M + 3M) = **35M**（非 38M）
- 50→38 = **-24%**（非 -23%）
- 50→35 = **-30%**

三個數字（戰後 38、節省 15、減幅 23）至少有一個錯，三個都互不對齊。

判定：🔴 BLOCKER。憲法級文件出現自相矛盾的關鍵 KPI 數字。

ADR 第 119 行已誠實標示「上述為 Phase 0 audit 推算，Phase 5 報表上線後以 ai_calls 實測值修訂」— 動機可諒解（沒實測），但即便是估算，三個推算值也必須互相對得上。

### E. Meta 自審 6h → 12:00

| 聲稱 | 實際 | 判定 |
|---|---|---|
| `run_scheduler.py:99` 改為每日 12:00 | line 99 `schedule.every().day.at("12:00").do(run_openclaw_meta_analysis_task)` | ✅ 已落地 |
| 月省 ~3M Gemini tokens（ADR-029:93）| `run_scheduler.py:97` 註解寫「~1.875M」 | 🟡 LOW（兩處數字不對齊但量級接近） |
| 對應 task = A10 / Phase 7-8（ADR-029:104）| 註解寫 Phase 4 落地 | 🟠 HIGH（A10 標籤對應 Phase 與實際提交時 Phase 不一致）|

### F. 寫死 IP 是否「全面消除」

ADR-027 附錄 A 寫「寫死 IP 已全面消除（aider_heal_executor.py:48-49 與 code_review_pipeline_service.py:218-225 兩處 N2/N3 修補）」。

實測：
```
$ grep -rn "192.168.0.111" services/ routes/ | grep -v "OLLAMA_HOST_FALLBACK\|test_\|resolve_ollama_host\|#"
services/aider_heal_executor.py:62: return "http://192.168.0.111:11434"   ← 仍有
services/hermes_analyst_service.py:7: 模型：hermes3:latest @ HERMES_URL（預設 192.168.0.111:11434）  ← docstring 仍寫
```

`aider_heal_executor.py:62` 是 `_default_ollama_api_base()` 的最後 except 兜底（line 60-62），技術上是「resolve 失敗才回退到字面 111」，不是「import-time 寫死」，但「全面消除」的措辭過強。

判定：🟠 HIGH。建議改為「`import-time` 寫死 IP 已全面消除（line 48-49 已改為 lazy resolve；line 62 保留 except 兜底字面 IP 作為最終防線）」。

### G. 11.8% AIGenerationHistory 覆蓋率

phase0 audit Section 1.4 line 80-81 寫「4/34 ≈ 11.8%」 → ADR-028 line 19 引用一致 ✅。

### H. Phase 1 / 2 / 3 落地狀態

| Phase | ADR 寫 | 實測 | 判定 |
|---|---|---|---|
| Phase 0 | ✅ 完成 | phase0_audit + phase0_research 都存在 | ✅ |
| Phase 1 | 52/52 tests pass | phase1_final_critic_signoff 確認 | ✅ |
| Phase 2 | 13+43=56 tests pass | phase2_deploy_verify 確認 | ✅ |
| Phase 3 A7 | 已完成（feature flag）| `OPENCLAW_QA_OLLAMA_FIRST` env 在 openclaw_strategist_service.py:51, 61, 162-163, 259 出現，預設 false | ✅ |
| migration 024/025/026 | 存在 | `migrations/024_create_ai_calls_table.sql` / `025_create_mcp_calls_and_budgets.sql` / `026_add_embedding_signature.sql` | ✅ |
| Meta 12:00 | run_scheduler.py:99 | 確認 | ✅ |

---

## Findings

### BLOCKER（事實錯誤，必須改）

#### B1. ADR-029 OpenClaw 行數錯 846 行（+46%）

- **位置**：`docs/adr/ADR-029-hermes-first-twin-tower.md:18, 113`
- **錯誤**：寫 `services/openclaw_strategist_service.py ≈ 1831 行`
- **實測**：`wc -l = 2677 行`
- **影響**：
  - line 18 的「失衡證據」（戰前 1831）失真，但比率 4.4× 湊巧仍接近真實 4.41×（仍在 4× 量級）
  - line 113 的「預估 1300 行（A10 後）」基準錯誤 → 戰後行數要 -29% 應是 ~1900 行才合理；若仍要砍到 1300，是 -51%（戰前 2677 → 1300），是更激進的目標但 ADR 沒揭露
  - 量化效益表的 OpenClaw 程式碼瘦身欄位失準
- **建議修法**：
  - 把 1831 改 2677
  - 重算「-29% 後 ~1900 行」或「若仍鎖定 1300 行則應改寫為 -51%（更大重構工程）」
  - line 142 的「OpenClaw 從 1831 行降至 ~1300 行（A10）」同步修

#### B2. ADR-028 場景 #4 行號錯（759/1267 vs 1340/1771）

- **位置**：`docs/adr/ADR-028-llm-routing-unified-principles.md:75`
- **錯誤**：「openclaw_weekly / openclaw_monthly / openclaw_annual」location 寫 `services/openclaw_strategist_service.py:759, 1267, 戰略月年報`
- **實測**：
  - `caller="openclaw_weekly"` 在 line 1340
  - `caller="openclaw_monthly"` 在 line 1771
  - `caller="openclaw_annual"` **0 hits**（不存在）
- **影響**：未來新工程師看 ADR 找 759 line 會找到 `_legacy_gemini_first_qa` 內部，誤判 caller 對應位置；annual report 根本沒實作但 ADR 列為「鎖定場景」
- **建議修法**：
  - 759 → 1340，1267 → 1771
  - `openclaw_annual` 從鎖定場景表移除（或改為「待實作」並引述 Phase X 計畫）

#### B3. ADR-028 場景 #6 / #7 caller 名虛構

- **位置**：`docs/adr/ADR-028-llm-routing-unified-principles.md:77-78`
- **錯誤**：
  - 場景 #6 caller `ea_hitl_prefetch` — grep 0 hits（程式碼從未 emit 此 caller）
  - 場景 #7 caller `openclaw_qa_complex_sku` — grep 0 hits（同上）
- **實測**：
  ```
  $ grep -rn "ea_hitl_prefetch\|openclaw_qa_complex" services/ routes/
  （無輸出）
  ```
- **影響**：ADR 把治理規則繫於不存在的 caller；DB token report `WHERE caller='ea_hitl_prefetch'` 永遠 0 筆；Phase 5 預算告警會誤判
- **建議修法**：
  - 若是「規劃中」，標示 `(規劃中，Phase X 引入)`
  - 若是「已存在但 caller 名不同」，改為實際 caller（例如 EA HITL 預跑可能走 `hermes_intent` / `hermes_analyst`）
  - line 78 的 `services/openclaw_strategist_service.py:56` 不是 caller 而是 feature flag 註解，行號需重指

#### B4. ADR-028 Provider 白名單與 DB CHECK 不一致

- **位置**：
  - `docs/adr/ADR-028-llm-routing-unified-principles.md:104-114`（白名單表）
  - `docs/adr/ADR-028-llm-routing-unified-principles.md:114`（移除 claude 聲明）
  - `docs/adr/ADR-028-llm-routing-unified-principles.md:208`（V1 期望輸出）
- **錯誤**：ADR 寫 7 個 provider（含 ollama_secondary，不含 claude）
- **實測**：
  - `migrations/024_create_ai_calls_table.sql:92-94` 是 **8 個**（含 claude 與 ollama_secondary）
  - `services/token_report_service.py:42-50` `_PROVIDER_DISPLAY` 是 7 個（**含 claude，不含 ollama_secondary**）
  - `migrations/025` 預算種子 monthly 是 7 個（含 claude，缺 ollama_secondary）
- **影響**：
  - Verification V1 SQL 跑出來會與「期望」對不上 → 部署驗證會誤判 FAIL
  - 「移除 claude」是空話 — DB 並未移除
  - `ollama_secondary` 在 DB 接受但無任何程式碼會 emit → SELECT 永遠 0 筆 → Phase 5 三主機級聯可觀測性失真
- **建議修法**（三選一）：
  - 路線 A：ADR-028 改為「8 provider（含 claude）」，新增程式碼 emit `ollama_secondary` 標籤（patch `code_review_pipeline_service.py:230` 與其他 Ollama caller，根據 resolve 結果動態決定）
  - 路線 B：實際下一個 migration 移除 claude，並在 _PROVIDER_DISPLAY 加 ollama_secondary，讓三層真正一致
  - 路線 C：ADR-028 加一段「Schema vs ADR 差異」誠實揭露，Phase X 統一

#### B5. ADR-029 Token 流量算術不自洽（38M vs 35M vs -23%）

- **位置**：`docs/adr/ADR-029-hermes-first-twin-tower.md:23-25, 91-94, 112`
- **錯誤**：
  - 戰前 50M → 任務 3/4/5 省 12M、任務 11 省 3M = 共省 15M → 戰後應 35M
  - 但 line 112 寫戰後 38M、減幅 -23%
  - 50→38 = -24%（非 -23%）；50→35 = -30%
- **影響**：戰役 v5.0 KPI「Gemini 月支出 -23%」是 README 索引（line 53）的明牌，數字之間互不對齊讓未來無法驗收
- **建議修法**：
  - 三個數字選一個錨定，其他重算：
    - 錨定 -23% → 戰後 38.5M → 節省 11.5M（task 3/4/5/11 拆分需重估）
    - 錨定節省 15M → 戰後 35M → 減幅 -30%（README 索引也要改）
  - 或加註腳「戰後 token 估算為四捨五入區間，實測誤差 ±5M」誠實揭露不確定性

### HIGH（建議改，不一定阻 commit）

#### H1. Hermes 行數差 +5.9%

- 位置：ADR-029:19
- 寫 573 vs 實測 607
- 改為「607 行」即可

#### H2. ADR-027 附錄 A「寫死 IP 全面消除」措辭過強

- 位置：ADR-027 附錄 A 段尾
- 實際 `aider_heal_executor.py:62` 仍有字面 `return "http://192.168.0.111:11434"`（在 except 兜底）
- 建議改為「import-time 寫死已消除；except 兜底保留 111 字面 IP 作為最終防線」

#### H3. ADR-028 場景 #5 行號偏移

- 位置：ADR-028:76
- 寫 `code_review_pipeline_service.py:278-286`，實際 278-286 是 prompt 字串；`_call_gemini` 在 line 309
- 建議改 `:278-310`（涵蓋整個 Gemini 呼叫塊）或 `:309`

#### H4. ADR-028 caller 白名單列了 30+ 個但實際 emit 僅 ~16 個

- 位置：ADR-028:122-138
- 實際 `grep "caller=" services/ routes/` 唯一 16 個（已驗證上方）
- 列表混雜了「已實作」與「規劃中」沒區分標示
- 建議：在每個 caller 後標示 `[A4 已落地]` / `[Phase X 規劃中]`

#### H5. `ollama_secondary` provider 沒有任何 caller emit

- 位置：ADR-028:107（白名單條目）
- 程式碼層 0 hits — 三主機級聯實作只區分 GCP（gcp_ollama）vs 111（ollama_111），Primary/Secondary 在程式中不區分
- 建議：要嘛在 `services/ollama_service.resolve_ollama_host()` 與所有 caller 加上「根據 selected host 決定 provider tag」，要嘛把 `ollama_secondary` 從白名單移除直到實作完成

#### H6. ADR-029 Phase 標籤錯亂

- 位置：ADR-029:104
- 寫「A10 對應 Phase 7-8」
- run_scheduler.py:97 註解寫「Phase 4 降頻」
- ADR-028 Migration Plan line 248 也寫「Phase 7-8 OpenClaw 程式瘦身（A10）」
- 不一致；建議在文件層統一定義 A10 的 Phase 對應

### MEDIUM

#### M1. ADR-029 第 5 行作者列「Codex / A12 planner」，但戰役組織圖中 A12 是 critic，不是 planner

- 位置：ADR-029:6 / ADR-028:6
- planner 角色是 A8（從上下文推斷），但 ADR 寫 A12
- 不影響事實，但角色標籤需與 v5.0 戰役組織圖核對

#### M2. ADR-028 line 156 「Gemini 2.5 Flash vs qwen3:14b 估差 10-20%」引用 phase0_research_report Section 1，但 phase0 報告 Section 1 結論是「黃燈，需 50 題黃金集 A/B 才能定論」，沒給出 10-20% 的硬數字

- 位置：ADR-028:156
- phase0_research line 30-33 寫「推估 10-20%」是未驗證的推估，ADR 直接當事實引用
- 建議改為「**推估** 10-20%（待 Phase 4 黃金集 A/B 確認）」

#### M3. ADR-027 附錄 A 引用「services/code_review_pipeline_service.py:218-225」但實際 218-225 是 prompt 字串

- 位置：ADR-027 line 65
- 實際 `_call_gemini` 與 hermes scan 在 line 230 後
- 行號偏移，phase0 audit 也錯（同樣的 inheritance 錯誤）

### LOW

#### L1. ADR-028:75 寫「`戰略月年報`」中文字摻在 file:line 列，破壞表格格式

- 位置：ADR-028:75
- 應改為「（戰略月/年報，function 待實作）」或拆兩行

#### L2. ADR-028 Migration Plan 列了 Phase 0-12 但 Phase 11 / 12 與其他 ADR（如 ADR-026 收尾路線圖）的 Phase 編號可能重疊

- 跨 ADR 的 Phase 編號需要統一索引避免混淆
- 不阻 commit

#### L3. ADR-029 line 4 沒有 Author 欄位（ADR-028 有）

- 風格不一致

---

## ADR 引用一致性

| ADR-028 / 029 引用 | 實際內容 | 判定 |
|---|---|---|
| ADR-002 pgvector 唯一向量庫 | 確實存在，未被破壞（memory-mcp 在 phase0 也標 🔴 不採用）| ✅ |
| ADR-003 Hermes embedding 本地化 | 存在 | ✅ |
| ADR-004 NemoTron fallback chain | 存在；ADR-028 引「NIM 80 calls/day」與 ADR-004 一致 | ✅ |
| ADR-008 部署實機驗證 | 存在 | ✅ |
| ADR-013 AIOps AutoHeal | 存在 | ✅ |
| ADR-018 四 Agent 控制面 | 存在；ADR-029 「ADR-018 已定四 Agent 角色，但未量化誰處理高頻」描述準確 | ✅ |
| ADR-019 Telegram Agentic Layer | 存在；ADR-029 line 30 描述「openclaw_decide() 把所有用戶輸入導向」與 ADR-019 一致 | ✅ |
| ADR-021 EA HITL pre-fetch | 存在；但 ADR-028 場景 #6 caller 名與 ADR-021 內 Hermes 預跑實作不對應（B3）| 🔴 連帶 |
| ADR-027 「Supersedes: 無（補述 ADR-027，非取代）」 | 措辭合理，因 ADR-027 仍存在且新增了附錄 | ✅ |
| `migrations/024:88-91` provider CHECK | 實際 line 92-94，包含 8 個 provider（含 claude）| 🔴 B4 |
| `migrations/024:104-109` meta/error 大小 | 已驗證（與 phase1 critic H2 一致）| ✅ |
| phase0_audit Section 1.4 11.8% | 一致 | ✅ |
| phase1_final_critic_signoff H5/H6 | 一致 | ✅ |

---

## 鎖定 Gemini 7 場景驗證（LOCKED-GEMINI 註解 vs ADR-028）

| # | LOCKED-GEMINI 程式碼註解 | ADR-028 場景 | 一致？ |
|---|---|---|---|
| #1 | `services/mcp_collector_service.py:32` LOCKED-GEMINI: MCP 即時情報需 Google Search Grounding | 場景 #1 MCP L1 Grounding | ✅ |
| #2 | （無獨立註解，與 #1 同）| 場景 #2 MCP L2 Grounding | ✅（共享）|
| #3 | `routes/openclaw_bot_routes.py:98` LOCKED-GEMINI: PPT 簡報文案需長 context + 繁中商業敘事 | 場景 #3 PPT generator | ✅ |
| #4 | `services/openclaw_strategist_service.py:40` LOCKED-GEMINI: 週/月/年報需長 context + 繁中商業文體 | 場景 #4 weekly/monthly/annual | 🟠（annual caller 不存在 — B3）|
| #5 | `services/code_review_pipeline_service.py:46` LOCKED-GEMINI: Code Review 全 repo diff 可達 100K+ tokens | 場景 #5 code_review_openclaw | ✅ |
| #6 | `services/elephant_alpha_orchestrator.py:88` LOCKED-GEMINI: EA HITL 戰略決策影響統帥行動 | 場景 #6 ea_hitl_prefetch | 🟠（caller 名與註解中的 "AgentCapability" 模型 `gemini-2.0-flash` 對不上 ADR 寫的 `gemini-2.5-flash`）|
| #7 | （無獨立註解）| 場景 #7 openclaw_qa_complex_sku | 🔴（caller 完全不存在 — B3）|

**註解 vs ADR 模型不一致**：
- ADR-028 場景 #6 寫 `gemini-2.5-flash`
- `services/elephant_alpha_orchestrator.py:91` AgentCapability 寫 `model="gemini-2.0-flash"`
- 哪個是真的？需校對

---

## 與既有 ADR 衝突（grep 結果）

```
$ grep -rn "ADR-028\|ADR-029" docs/adr/
（除 ADR-027 / 028 / 029 / README 自身互引以外，其他 ADR-001~026 均無提及）
```

✅ 既有 ADR 沒有提到 028/029，所以沒有外部引用衝突。
✅ ADR-002（pgvector 唯一）：phase0 audit Section 2 已標 memory-mcp 🔴 不採用，ADR-028 沒破壞此決策。
✅ ADR-018（四 Agent 控制面）：ADR-029 是「補述」而非取代，措辭合理。
✅ ADR-027：附錄正式承接，Supersedes 標示「無（補述）」措辭正確。

---

## 核准條件（CONDITIONAL → APPROVED 的必修清單）

- [ ] **B1 修**：ADR-029 line 18, 113, 142 把 `1831` 改 `2677`；A10 預估目標重算（建議 -29% → 1900 或維持 1300 但重標 -51%）
- [ ] **B2 修**：ADR-028 line 75 行號 759 → 1340、1267 → 1771
- [ ] **B3 修**：ADR-028 場景 #4 移除 annual（或標「規劃中」）；場景 #6 改用實際存在的 caller 名（如 `hermes_analyst` 或備註「Phase X 引入」）；場景 #7 同
- [ ] **B4 修**：ADR-028 Provider 白名單表格與 V1 期望輸出與 DB CHECK / token_report `_PROVIDER_DISPLAY` 對齊（含 claude、處理 ollama_secondary 缺口）
- [ ] **B5 修**：ADR-029 line 23-25, 112 三個數字（戰前 50M / 戰後 38M / 減幅 -23% / 任務節省 12M+3M）對齊；建議錨定 README 索引「-23%」並回算其他兩個

修這 5 個 BLOCKER 後可 commit。HIGH 可同 commit 內順便修，不修也不阻 commit（但會留入 Phase 7+ 技術債）。

---

## Sign-off

```
critic-A11 / 2026-05-03 / Phase 6 / 第三輪審查
Verdict: CONDITIONAL（5 BLOCKER 待修）
Files Reviewed:
  docs/adr/ADR-028-llm-routing-unified-principles.md (269 lines)
  docs/adr/ADR-029-hermes-first-twin-tower.md (222 lines)
  docs/adr/ADR-027-primary-ollama-on-gcp.md (114 lines, 含附錄)
  docs/adr/README.md (60 lines)
Cross-checked Against:
  docs/phase0_audit_report_20260503.md (262 lines)
  docs/phase0_research_report_20260503.md (231 lines)
  docs/phase1_db_design_20260503.md (315 lines)
  docs/phase1_final_critic_signoff_20260503.md (317 lines)
  docs/phase2_deploy_verify_20260503.md (205 lines)
  migrations/024_create_ai_calls_table.sql
  migrations/025_create_mcp_calls_and_budgets.sql
  services/openclaw_strategist_service.py (2677 lines, wc -l)
  services/hermes_analyst_service.py (607 lines, wc -l)
  services/ollama_service.py (resolve_ollama_host + mark_unhealthy)
  services/ai_call_logger.py
  services/token_report_service.py (_PROVIDER_DISPLAY)
  services/code_review_pipeline_service.py (LOCKED-GEMINI / provider tag)
  services/mcp_collector_service.py (LOCKED-GEMINI)
  services/elephant_alpha_orchestrator.py (LOCKED-GEMINI)
  services/aider_heal_executor.py (lazy resolve / 兜底字面 IP)
  routes/openclaw_bot_routes.py (LOCKED-GEMINI / caller emit / PPT _call_gemini)
  run_scheduler.py:99 (Meta 12:00)

Discipline: 憲法紅線一（事實驅動 / 狙擊手精神）— 嚴格批評；
不修補 ADR，僅標 BLOCKER / HIGH / MEDIUM / LOW；
所有 finding 附 file:line 並對照 phase 報告。
```
