visionA/local-tool/.autoflow/03-design/reviews/design-review-of-prd-and-tdd-v2.2-firmware.md
jim800121chen 46514d77d7 docs(local-tool): M9 — Kneron Dongle FW 偵測 + 升降版(A+B、翻案 R5-Q9)
L 級新功能、PRD/Design/TDD/ADR 三方協作 + 互審 + M9-6 SDK 雙驗證、總計 ~9000 行文件。

範圍:
- A 階段(MVP、5 人天):KL520 + KL720 自動升級 KDP1 → KDP2
- B 階段(10.5 人天):手動降版面向一般使用者 + KL630 / KL730 擴展
- 合計 15.5 人天、安裝包 +7MB(保守 bundle 策略)

關鍵決策:
- 翻案 R5-Q9(progress.md 第二輪使用者決策「韌體燒錄 flash → B 砍掉」)
- 跨平台用 KneronPLUS Python C API、不用 DFUT.exe
- 多版本目錄結構選 C metadata(firmware/<chip>/{version}/ + CURRENT_VERSION)
- Kneron firmware redistribution 授權與 R5-B4 預置模型同性質、發佈前評估

文件產出:
- PRD v2.2(PRD-v2.md 495 行 + features/feature-firmware-management.md 599 行)
- Design v2.2(firmware-management.md 948 行 + control-panel.md §6a graceful shutdown)
- TDD v2.2(v2/firmware-management.md 823 行 + ADR-001 218 行)
- 8 份 research(含 M9-6 弱驗證 + 強驗證、~3200 行)
- 3 份三方互審報告(PM/Design/Architect cross-review)

M9-6 強驗證重大發現(影響 B 階段):
- KL730 product_id 實際是 0x732(不是 0x0730)
- KL630/KL730 firmware 是 embedded Linux rootfs(不是 .bin、不同代設計)
- KneronPLUS Python 沒 update_kdp_firmware_from_files 公開 API、warrenchen 走 ctypes
- 不影響 A 階段、B 階段 M9-8 需 spike

下一步:派 backend M9-1 起跑(bridge.py handle_firmware_upgrade)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 07:40:56 +08:00

477 lines
26 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.

# Design 互審報告 — PM PRD + Architect TDD + ADR-001v2.2 Firmware
> 審閱者Design Agent
> 審閱日期2026-05-24
> 審閱對象:
> - PM`.autoflow/02-prd/features/feature-firmware-management.md`v2.2-draft, 523 行)
> - Architect TDD`.autoflow/04-architecture/v2/firmware-management.md`v2.2, 604 行)
> - Architect ADR`.autoflow/04-architecture/adr/ADR-001-firmware-management.md`v1.0, 210 行)
> 對照基準:`.autoflow/03-design/v2/firmware-management.md`Design v2.2, 920 行)
---
## TL;DR
**整體評估**:🟢 三份產出與 Design 整體一致、可進 M9-12 Frontend 實作。共找出 **13 個對齊點**
- **🔴 嚴重(需互審回合解決)**1 個 — Architect TDD 狀態機名稱與 Design 不一致A-MISMATCH-1
- **🟠 中等(需 PM / Architect 補回應)**4 個 — PM 缺 NPS / 任務完成率指標、PRD 沒明示「降版」用詞策略、Architect 沒解 graceful shutdown 拒絕、Architect 缺 token 對比實測
- **🟡 輕微(建議補但不阻塞)**5 個 — PM 沒列「使用者怎麼知道要降版」user story、PRD 沒提 Bundle 多下載 X 秒、Architect ADR Alternatives 缺一條 Design 視角、PM 對 R-FW-12 不夠具體、PRD §10 KL520 升級時間估算不一致
- **🟢 對齊良好**3 個 — 6 個互審待確認點中 4 個已解、API/UI DisplayName 對齊、WebSocket progress event schema 足夠
**結論**:建議先解 🔴 A-MISMATCH-1狀態機對齊其他 🟠 在實作前的 polish 階段補。**不阻塞 M9-1 ~ M9-5 A 階段啟動**A 階段不涉及降版 UI、6 個對齊點都是 B2 才會踩到)。
---
## 一、對 PM PRD 的審閱
### 1.1 對齊良好(🟢)
#### 🟢 P-OK-16 個 Architect 互審待確認點 PM 已涵蓋 3 個
PM PRD §14.2 列了 6 個給 Architect 的互審項A-FW-1 ~ A-FW-6其中
- A-FW-2driver safety guards→ Architect TDD §6.1 + §5.2 已對應寫具體 dispatch 與 `_validate_downgrade_request`
- A-FW-5模組路徑 `server/internal/firmware/`)→ Architect TDD §2.1 已對應
- A-FW-6R-FW-5 與 R5-B4 合併)→ Architect TDD §8.4 已對應
Design 視角確認PM 給 Architect 的問題、Architect 都回答了。**對齊 OK**。
#### 🟢 P-OK-2「降版面向一般使用者」假設§5的支持證據完整
PM §5.1 列 4 個假設H1-H4+ §5.3 5 種降版情境Design 視角檢核:
- 4 個假設都對齊 R5 Persona 定義P1 FAE / P2 開發者)
- 5 種情境覆蓋 Design 設計的 UX 流程Design §6 二次確認 modal、§7 失敗復原都針對這 5 種使用者預期)
- UR-1 ~ UR-4 user research 待驗證項合理Beta 階段 / post-launch 6 個月追蹤)
**對齊 OK**Design 對 PM 的假設沒有體驗面異議。
#### 🟢 P-OK-3AC-FW-2.5 二次確認 modal 警告語 4 條與 Design §6.1 對齊
PM AC-FW-2.5 列 4 條警告語:
- 「降版可能導致現有 model 無法運作」→ Design §6.1 風險列表第 1 點「部分新版 .nef 模型無法載入」
- 「降版過程不可中斷、否則裝置可能損壞」→ Design §6.1 風險列表第 3 點 + §6.3 進度 banner
- 「降版完成後可能需要重新插拔裝置」→ Design §6.4 toast「可能需要重新插拔」
- 「請確認版本相容性、降版至 KDP1 的舊版會限制可用功能」→ Design §6.2 KDP1 額外紅色 banner + 多 1 條風險
**4 條警告語 100% 對應**。Design 用詞略不同(「.nef 模型」vs 「現有 model」但語意一致、Design 用詞更精準。
### 1.2 中等問題(🟠,需 PM 補)
#### 🟠 P-MID-1成功指標缺「使用者感知體驗指標」
**問題**PM §7 列 2 種指標(北極星 5 分鐘首次推論達成率 + 次要指標如升級成功率 ≥ 95% / Brick < 0.1%**全部是技術 / 業務指標**、沒有對應使用者體驗的指標
**Design 視角缺漏**
- 沒有 **降版任務完成率」**使用者點版本切換」→ 真正完成切換的比例可能很多人在二次確認 modal 階段就放棄
- 沒有 **中途放棄率」**多少使用者打到一半DOWNGRADE就取消暗示 UX 過度恐嚇
- 沒有 **FW badge 點擊率」**Devices icon / badge 點擊後是否真的進 Settings 韌體分頁反映 Design IA 是否讓使用者找得到
- 沒有 **使用後 NPS / SUS 分數**特別是 B2 階段一般使用者降版流程的可用性
**建議**PM §7.2 4-5 個體驗指標範例
```
| 指標 | 目標 |
|------|------|
| 升級任務完成率modal 開啟 → 完成)| ≥ 85% |
| 二次確認 modal 中途放棄率 | 50-70%(合理區間、太低暗示 UX 不夠恐嚇、太高暗示嚇跑使用者)|
| Devices 頁 FW badge 點擊率 | ≥ 30%(只算紅 / 黃 badge|
| B 階段 SUS 分數5 人 usability test| ≥ 65 |
```
**阻塞性**不阻塞 A 階段 B 階段上線前應補不然沒指標可衡量 UR-1 ~ UR-3)。
#### 🟠 P-MID-2PRD 沒明示「降版」用詞策略、可能與 UI 矛盾
**問題**
- PM §14.1 D-FW-2「『降版這個詞在 UI 上是否使用標為 Design 待定
- PM 自己文件多處用降版」(§4 US-FW-2 標題就是一般使用者主動切版本」、但內文反覆用降版」)
- Design 已明確採韌體 / 版本切換中性詞UI 不用降版」(Design §2.1 + §3 範例 wireframe 全部用版本切換」)
**體驗面風險**如果 PM PRD user story 文字用降版」、未來測試人員 / 文件譯者可能誤以為 UI 應該叫降版」、造成 UI 文案改錯方向
**建議**PM §14.1 D-FW-2 加註Design 韌體 / 版本切換』、PRD 後續更新時 user-facing 描述應同步」。或在 §4 user story 標題明示「**進階使用者**主動切版本內部 / 技術文件用 downgradeUI 版本切換』)」。
**阻塞性**不阻塞 A 階段 B 階段 PM 應明示
#### 🟠 P-MID-3PRD §10 KL520 升級時間估算不一致
**問題**
- AC-FW-1.7:「KL520 升級預估 30 KL720 預估 180
- §7.2 次要指標:「FW 升降版平均時長KL520 60s / KL720 200s
- AC-FW-1.7 30s vs §7.2 60s 不一致
**Design 視角影響**Design §5.5 進度 modal 顯示預估剩餘 X 」、這個數字從哪裡來如果以 AC 30s 為基準實際拖到 50s 使用者會誤以為failed」;如果以 60s 為基準實際 30s 結束又會讓使用者懷疑真的有寫到 flash ?」
**建議**PM 統一兩處數字Design 建議用 §7.2 的上限(≤ 60s for KL520 / 200s for KL720作為預估剩餘基準 UX 緩衝
**阻塞性**不阻塞 A 階段啟動 Frontend 實作 §5.5 進度 modal 前要釐清
#### 🟠 P-MID-4PM §14.1 D-FW-4「FW badge 三色閾值」沒明示 PM 期待
**問題**PM 列了 D-FW-4Design 需定具體閾值」、把這個皮球丟回 Design
- Design §4.2 已定 3 色規則current = 綠、older = legacy KDP1 = 紅)
- **沒有定義current 之前 1 vs 2 版以上算什麼顏色」**——bundle 三個版本v2.2.0 / v2.1.0 / kdp1v2.1.0 是黃還是紅
- 也沒定壞掉的 firmwareloader modefirmware 字串讀不到)」算什麼顏色
**Design 當前邏輯** §4.2
- = bundled current 完全相同 `v2.2.0`
- = bundle 內較舊但可升 `v2.1.0`
- = KDP1 系列不論版本
壞掉 firmware狀態的處理
**建議**PM D-FW-4 補一句Design 已定 3 色規則 / / )、Architect 需提供 driver `FirmwareIsLegacy` / `FirmwareCanUpgrade` 判定邏輯給 Design」、 Design 直接補一條壞掉 firmware = 灰色 badge狀態未知』」。
**阻塞性**不阻塞 A 階段A 只有 KL520/KL720 current + 升級沒有 older 中間狀態)。
### 1.3 輕微建議(🟡)
#### 🟡 P-LOW-1缺「進階使用者怎麼知道要降版」user story
**問題**PM §4 3 US-FW但缺一個關鍵 user story:「使用者怎麼**發現**需要降版?」
- 情境使用者升版後跑舊 model 出現Error / 模型載入失敗」、怎麼從錯誤訊息推到啊我應該降版」?
- 當前 PRD 沒明示 inference 失敗時是否暗示可能是 FW 版本問題考慮降版
**Design 視角**這個 user story 直接影響 Design 是否要在 Workspace inference 失敗的 error modal 加一條 hint如果問題是 model 不相容可以到 Settings 韌體分頁切換版本」。當前 Design §7 失敗復原**只處理 FW 操作本身的失敗**、不處理模型推論失敗指向 FW 問題」。
**建議**PM US-FW-2.5使用者從推論錯誤推導到需要降版」、Design 後續補對應 hint UX或標為v2.3 未來迭代」。
**阻塞性**不阻塞 v2.2可延後到 v2.3
#### 🟡 P-LOW-2Bundle 策略對使用者的等待感 PRD 沒提
**問題**PM §6 +7MB 安裝包衝擊但沒列使用者下載 / 安裝時可能多感覺到的 X 秒等待」。
- macOS 寬頻 ~50MB/s +7MB = +0.14s(無感)
- 一般使用者 4G hotspot ~5MB/s +7MB = +1.4s(無感)
- 慢速 wifi 1MB/s +7MB = +7s有感、但仍可接受
**Design 視角**這部分 Design 不需要做事Bundle 大小是 PM/Architect 範圍)、 PRD 缺體驗層的描述
**建議**PM §6.3 加一句使用者層面寬頻 +0.14s 安裝時間無感)、慢速網路最多 +7s仍可接受)」。
**阻塞性**不阻塞純文件 polish
#### 🟡 P-LOW-3R-FW-12「使用者看不懂版本」緩解措施不夠具體
**問題**PM §8 R-FW-12多版本管理 UX 複雜度使用者看不懂 v2.2.0 vs v2.1.0 vs KDP1」、緩解寫Design Agent 設計清晰版本說明文案」、太抽象
**Design 視角**Design 已具體做了
- §3.3 每個版本有 displayName 後綴`(current)` / `(older)` / `(legacy)`
- §3.3 每個版本有獨立說明文字(「發布於 2024-08與舊模型相容)」)
- §9 i18n keys 已涵蓋
**建議**PM 把緩解寫具體:「Design v2.2 §3.3 + §9 i18n 已對應 displayName 後綴 + 版本說明文字 + KDP1 額外警告」。 R-FW-12 不再是 open item
**阻塞性**不阻塞純風險追蹤 polish
---
## 二、對 Architect TDD 的審閱
### 2.1 對齊良好(🟢)
#### 🟢 A-OK-1DisplayName 格式對齊
Architect TDD §4.1 `FirmwareVersion` struct
```go
DisplayName string `json:"displayName"` // "v2.2.0 (current)" / "v2.1.0 (older)" / "KDP1 (legacy)"
```
Design §3.1 wireframe 顯示:「KDP2 v2.2.0 (current)」、§9.2 i18n key 對應
- `settings.firmware.card.tag.current` `(current)`
- `settings.firmware.card.tag.legacy` `(legacy)`
**對齊 100%** Design KDP2 v2.2.0 (current)」、Architect v2.2.0 (current)」(沒前綴 KDP2)。
**小釐清**Architect `FirmwareVersion.Version` v2.2.0」、Design displayName KDP2 v2.2.0 (current)」、兩個是version field + displayName field 合併建議 Architect 明示 displayName 包含 KDP 前綴:「`displayName = "{kdpFamily} {version} ({status})"`」。
#### 🟢 A-OK-2WebSocket progress event schema 足夠支撐 Design UI
Architect TDD §4.2 `FirmwareProgress` struct
- Percent: 0-100 對應 Design §5.2 進度條
- Stage: 字串列舉 對應 Design §5.3 階段對應表
- Direction: `upgrade` / `downgrade` 對應 Design §6.3 切換韌體vs升級韌體標題切換
- Message / Error: 對應 Design §7.2 友善訊息
**Design 缺的ETA預估剩餘秒數**Design §5.2 範例顯示預估剩餘 X 」、 Architect schema 沒有 `EstimatedRemainingSeconds` 欄位
**建議**Architect `FirmwareProgress` optional `EstimatedRemainingSeconds int` `ElapsedMs int`Frontend elapsed 自己算 ETA
#### 🟢 A-OK-3多語系策略對齊
Architect TDD §3.3 錯誤碼表`FW_DEVICE_BUSY` / `FW_VERSION_NOT_FOUND` 6 )→ Design §9.8 失敗訊息 8 個對應 friendly message keys
**對齊 OK** Architect 6 個錯誤碼 vs Design 8 個失敗類型數量不對等見下方 A-MISMATCH-2)。
### 2.2 嚴重問題(🔴)
#### 🔴 A-MISMATCH-1狀態機名稱不一致
**問題**
| 來源 | 狀態 / Stage 名稱 |
|------|----------------|
| Design §8 狀態機 | `idle` / `confirming` / **`preparing`** / **`loading`** / **`flashing`** / **`verifying`** / `success_toast` / `error_modal` |
| Architect TDD §4.3 stage 列舉 | `connecting` / `loading_loader` / `loading_firmware` / `verifying` / `done` / `error` |
| Architect TDD §5.1 流程 progressCh stage | `connecting` / `loading_firmware` / `verifying` / `done` |
| PM PRD AC-FW-1.2 | 連線中 / 載入引導程式 / 寫入韌體 / 重新偵測 / 完成」(中文|
**衝突點**
- Design `preparing` / `loading` / `flashing` 三階段Architect `connecting` / `loading_loader` / `loading_firmware` 三階段PM 連線中 / 載入引導程式 / 寫入韌體三階段中文
- 全部都意指同樣的事但名稱完全沒對齊
**Design 視角影響**
- Design §9.6 i18n keys stage `connect` / `loader` / `upgrade` / `verify` 四個 key §5.3 階段對應表
- Design §8 狀態機又用 `preparing` / `loading` / `flashing` / `verifying`
- ** Design 自己內部都不一致**——Design §5.3 `connect/loader/upgrade/verify`Design §8 `preparing/loading/flashing/verifying`
**Design 自承錯誤**這是 Design 自己沒對齊內部章節 + 沒採 Architect TDD 的命名
**建議** **Architect TDD §4.3 stage 列舉** 為標準後端是 source of truth調整
- Design §8 狀態機`preparing` `connecting``loading` `loading_loader``flashing` `loading_firmware`
- Design §5.3 階段表的 `connect` / `loader` / `upgrade` 對齊 Architect `connecting` / `loading_loader` / `loading_firmware`
- PM PRD AC-FW-1.2 不變中文是 user-facing 文案英文 stage code 是技術名稱
- Design §9.6 i18n key suffix `stage.connect` 改為 `stage.connecting`
**阻塞性****M9-3 後端 API 完成前必解**。如果 Frontend 不知道後端會推什麼 stage 字串subscribe WebSocket 時對應不上進度 modal 顯示unknown stage」。
#### 🔴 A-MISMATCH-2Architect 6 個錯誤碼 vs Design 8 個失敗類型不對等
**問題**
| Architect TDD §3.3 錯誤碼 | Design §7.1 失敗類型 |
|------------------------|------------------|
| `FW_DEVICE_BUSY` | |
| `FW_VERSION_NOT_FOUND` | |
| `FW_INVALID_DIRECTION` | |
| `FW_NO_CONFIRM_TOKEN` | |
| `FW_UPGRADE_FAILED` | `upgrade` / `connect` |
| `FW_UPGRADE_BRICK_RISK` | `verify` |
| | `scan` 找不到裝置 |
| | `loader` 寫入失敗 |
| | Timeout>60s |
| — | Disconnect during op |
**衝突點**
- Architect 6 個是「API 層錯誤碼」HTTP 4xx/5xx 對應)
- Design 8 個是「使用者面失敗情境」stage 細分)
- 兩者**不在同一層**、不衝突、但對應關係沒明示
**Design 視角影響**
- Design §7.2 失敗 modal 顯示「錯誤代碼fw_upgrade_stage_loader_E102」、暗示有更細的代碼系統
- 但 Architect 只給 6 個 API 層代碼、沒給 stage-level 代碼
- Frontend 拿到 `FW_UPGRADE_FAILED` 後不知道對應 Design 8 種失敗類型中哪一種
**建議**Architect TDD §3.3 補一段「失敗類型對應 stage」表
```
| 觸發 stage | API 錯誤碼 | 給 frontend 的細分 reason 欄位 |
|----------|----------|---------------------------|
| scan 失敗 | FW_UPGRADE_FAILED | reason: "scan_not_found" |
| connect 失敗 | FW_UPGRADE_FAILED | reason: "connect_failed" |
| loader 寫入失敗 | FW_UPGRADE_FAILED | reason: "loader_write_failed" |
| upgrade 中段失敗 | FW_UPGRADE_FAILED | reason: "upgrade_mid_failed" |
| verify 失敗 | FW_UPGRADE_BRICK_RISK | reason: "verify_mismatch" |
| timeout | FW_UPGRADE_FAILED | reason: "timeout" |
| disconnect | FW_UPGRADE_FAILED | reason: "disconnect_during_op" |
```
或在 `FirmwareProgress.Error` 字串內帶結構化資訊Frontend 解析)。
**阻塞性**M9-3 後端 API 完成前必解、不然 Frontend 拿不到細分 reason。
### 2.3 中等問題(🟠)
#### 🟠 A-MID-1Architect 沒解 graceful shutdown 拒絕
**問題**Design §14.4 懸而未決第 6 點明示問:
- 降版進行中關閉 Wails 控制台 = 結束 server = 中斷降版 = 可能 brick
- Frontend / Backend 是否需要偵測「降版進行中」並擋下關閉動作?
**Architect TDD 沒對應**
- §8.5 「Flash() method 與 restartBridge()」段提到「FW 升降版完成後設 needsReset=true」、但**沒提**降版進行中如何拒絕 server shutdown
- §5.2 流程沒提 graceful shutdown 拒絕邏輯
- §6.4 既有 handler 改動清單沒列「shutdown handler 加 FW 進行中檢查」
**Design 視角影響**
- Design 規格已採「全螢幕 hover 攔截」§6.3)防止 click 關 modal、但**擋不住關 Wails 控制台視窗**
- 如果 Architect 不在 server 層加保護、Design 的 UX 多層 safety net 在這個漏洞前破功
**建議**Architect TDD 補一段 §8.6「降版進行中的 graceful shutdown 拒絕」:
- server 偵測 FW task 進行中、收到 SIGTERM / Wails 視窗關閉 → **延遲 shutdown**、等 FW task 完成或 60s timeout
- 同時推 WebSocket event 通知 frontend「使用者嘗試關閉、已擋下」
- Frontend 在 Wails 控制台顯示「降版中、無法關閉」提示Design §13.3 應補對應 UX
**阻塞性****B2 階段M9-11/M9-12前必解**。A 階段升級不涉及(升級失敗風險小、可中斷)、但降版必須有此保護。
#### 🟠 A-MID-2Architect token 對比比率沒對應 Design §11.2 推導表
**問題**Design §11.2 列了 6 個新 component token 與 Light/Dark 對比比率4.7:1 / 5.2:1 / 4.8:1。Design §11.2 末尾標「Architect 互審重點:請確認 Dark 模式下 legacy.fg 用黑色對紅底對比是否真的足夠」。
**Architect TDD 沒回應**
- TDD §11 測試策略沒提 token 對比驗證
- TDD §13.2 Design 互審注意沒提此項
- ADR-001 也沒提
**Design 視角影響**
- Design 的對比比率是「推算值」、需 Architect / Frontend 用 axe / Chrome DevTools contrast checker 工具實測
- 如果實測 Dark mode 紅底黑字 < 4.5:1Design 必須調整 token可能改 fg 為白色但白配紅可能更糟
- 不解 = 違反 Design A De-A2 verificationWCAG AA 對比度達標
**建議**Architect TDD §11.1 加單元測試項
```
| firmware/tokens.test | 6 個 fw-badge token 對比 ≥ 4.5:1light + dark| axe-core 程式化驗證 |
```
Architect 不主動驗 Design M9-4 / M9-12 Frontend 實作時 Design QA 階段實測
**阻塞性**M9-12 Frontend 實作前必解不解的話 Design verification 過不了
#### 🟠 A-MID-3Architect 失敗復原 §5.3 表只列 4 種、Design §7.1 列 8 種
**問題**
- Architect TDD §5.3 失敗復原表4 device disconnect / firmware load pre-flash / firmware load mid / verify 失敗
- Design §7.1 失敗類型對應8 scan / connect / loader / upgrade / verify / Timeout / Disconnect / 部分成功
**衝突**Architect 表少了 scan 失敗connect 失敗loader 寫入失敗timeout 4
**Design 視角影響**
- Design 已寫對應 friendly message + 復原行動的 i18n(§9.8
- 但如果 Architect 後端沒分這 4 Frontend 拿到的都是 genericFW_UPGRADE_FAILED」、Design 顯示不出 8 種不同 modal
**建議** A-MISMATCH-2 一起處理Architect TDD §5.3 對齊 Design §7.1 8 或在 reason 欄位細分 A-MISMATCH-2 建議)。
**阻塞性**M9-3 後端 API 完成前必解
### 2.4 輕微建議(🟡)
#### 🟡 A-LOW-1Architect TDD §10 風險 R-FW-12 對齊不完整
**問題**Architect TDD §10 R-FW-12多版本管理 UX 複雜度」、緩解寫預設只顯示升級到最新』+『切換 FW 版本』、降版必須展開 + 詳細說明」。
**Design 視角**
- Design 已具體做(§3.3 accordion 收合radio list 含說明
- Architect 預設只顯示...」 Design 不完全一致Design 永遠顯示升級按鈕」、不是預設只顯示」)
**建議**Architect 引用 Design 對應章節:「緩解措施由 Design v2.2 §3.3 落地accordion + radio list + 版本說明)」。
**阻塞性**不阻塞純文件對齊
---
## 三、對 ADR-001 的審閱
### 3.1 對齊良好(🟢)
#### 🟢 ADR-OK-1Decision / Consequences 與 Design 整體理念一致
ADR Decision 5
1. A + B 一次做完 Design 規格已涵蓋 A + B
2. 翻案 R5-Q9 範圍切割 Design §1.2 範圍邊界對齊
3. KneronPLUS Python C API Design 不需要知道後端細節
4. 多版本目錄結構選項 C Design §4.2 對齊顯示版本不涉及目錄結構 Design 假設 bundled 版本有 metadata
5. 保守 +7MB Bundle Design 不影響
**對齊 OK**
#### 🟢 ADR-OK-2Consequences 負面影響第 3 條對齊 Design 多層 safety net
ADR Consequences 法律 / 簽章授權待釐清」、Design 不涉及
Brick 風險未完全消除」、Design 已透過 §6 + §7 + §12 三層應對
- §6.1 二次確認 modal + DOWNGRADE 字串
- §6.3 全螢幕 hover 攔截 + 不可關 modal
- §7 失敗復原 8 friendly message
- §12 R-FW Design 對策明示對應 brick 風險路徑
**對齊 OK**
### 3.2 輕微建議(🟡)
#### 🟡 ADR-LOW-1Alternatives Considered 缺一條 Design 視角
**問題**ADR 5 Alternatives**沒有替代方案先做 dev mode 降版不面向一般使用者」**其實 §3 只做內部 dev mode 降版算半個 ADR 是從工時 / 痛點視角討論沒從 UX 風險視角討論)。
**Design 視角應補**:「替代方案 6只做 dev mode藏在 Settings 進階 開發者選項)」 UX trade-off
- 優點誤觸風險降到 0
- 缺點使用者明確要求面向一般使用者H3 假設藏在 dev mode 反而會讓真正需要降版的人找不到」)
- 否決原因使用者 2026-05-24 拍板面向一般使用者」+ Design 多層 safety net 評估足以擋誤觸
**建議**Architect ADR Alternatives §6 補上面這條 UX 視角的替代方案分析
**阻塞性**不阻塞 ADR 完整度
---
## 四、總結與給 Orchestrator 的建議
### 4.1 對齊狀態總覽
| 類別 | 數量 | 狀態 |
|------|------|------|
| 🟢 對齊良好 | 6 | 不需處理 |
| 🟡 輕微建議 | 5 | 建議補但不阻塞任何 milestone |
| 🟠 中等問題 | 4 | B 階段M9-11 ~ M9-12前必解 |
| 🔴 嚴重問題 | 2 | M9-3 後端 API 完成前必解 |
### 4.2 必解項目(按優先級)
#### 優先級 P0M9-3 後端 API 完成前必解)
1. **A-MISMATCH-1**狀態機名稱不一致
- 行動 Architect TDD §4.3 為準Design 同步調整 §8 + §5.3 + §9.6 i18n key
- 工時Design < 0.5h
- **誰來改**Design AgentDesign 內部對齊+ Architect 確認最終名稱
2. **A-MISMATCH-2**錯誤碼 vs 失敗類型不對等
- 行動Architect TDD §3.3 失敗類型對應 stage + `FirmwareProgress.Reason` 欄位
- 工時Architect < 0.5h
- **誰來改**Architect Agent
#### 優先級 P1B2 階段 M9-11/12 前必解)
3. **A-MID-1**graceful shutdown 拒絕邏輯
- 行動Architect TDD §8.6 + Design Wails 控制台降版中無法關閉UX
- 工時Architect 1h + Design 1h
- **誰來改**Architect Agent+ Design Agent控制台 UX
4. **A-MID-2**token 對比實測
- 行動M9-12 Frontend 實作時 Design QA 階段實測不過則調整 token
- 工時< 0.5h axe 工具
- **誰來改**Frontend / DesignM9-12
5. **A-MID-3**失敗復原表 4 vs 8 對齊
- 行動 A-MISMATCH-2 一起處理
- **誰來改**Architect Agent
6. **P-MID-1**成功指標補體驗指標
- 行動PM §7.2 4-5 個體驗指標
- 工時PM 0.5h
- **誰來改**PM AgentB 階段上線前
#### 優先級 P2可延後 / polish
7. **P-MID-2**降版用詞/ **P-MID-3**升級時間估算/ **P-MID-4**badge 閾值PM
8. **P-LOW-1 ~ P-LOW-3**PM polish
9. **A-LOW-1**Architect TDD R-FW-12 緩解對齊
10. **ADR-LOW-1**ADR Alternatives Design 視角
### 4.3 不阻塞 M9-1 ~ M9-5 A 階段啟動
- A 階段升級 only不涉及 B2 降版狀態機名稱對齊A-MISMATCH-1解決後即可進
- A 階段不涉及 graceful shutdown 拒絕failed type 8 分類也只在 B 階段需要M9-11/12
- 建議 Orchestrator **派 Architect 解 A-MISMATCH-1 + A-MISMATCH-2 之後**即可啟動 M9-1 backend
### 4.4 Design 本輪不改
依任務 prompt不改 design本輪只審」,Design 不主動更新 `firmware-management.md`
**待 Orchestrator 整合三方互審報告後、若決議 Design 需配合調整(如 A-MISMATCH-1 把狀態機名稱換成 connecting/loading_loader/loading_firmware/verifyingOrchestrator 另派 Design Agent 改檔**
### 4.5 Design 自承的內部矛盾
- Design §5.3 階段對應表 vs §8 狀態機名稱不一致Design 自己問題不是 PM/Architect 引起
- 處理 A-MISMATCH-1 時一併修
---
## 變更紀錄
| 日期 | 版本 | 變更 | 作者 |
|------|------|------|------|
| 2026-05-24 | v1.0 | Design 互審 PM PRD + Architect TDD + ADR-001 完成找出 13 個對齊點2 P0 / 4 P1 / 7 P2| Design Agent |