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

495 lines
42 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

# visionA-local — 產品需求文件PRD v2
> 版本:**v2.22026-05-24**
> 作者PM Agent
> 任務等級L 級v2.2 = 新增 FW 管理 feature翻案 R5-Q9
> 狀態:**v2.2 補丁:新增 Kneron Dongle FW 偵測 + 升降版A + B 一次做完,~15.5 人天,+7MB。詳見 [`features/feature-firmware-management.md`](./features/feature-firmware-management.md)**
> 前版v2.12026-04-14R5-D + R5-E/ v2.02026-04-14R5 重構)/ [`PRD.md`](./PRD.md) v1.22026-04-11
---
## 0. v2 變更摘要(和 v1.2 的差異)
本版本因應 2026-04-14 使用者提出的三項重大方向變更(介面架構、影片來源、模型管理),基於 R5 第五輪決策重新定位產品。本文件採「只更新受影響章節」策略,未影響的章節以「同 v1.2」標註並指向原子檔。
**最關鍵 5 點差異:**
1. **產品定位轉向**從「Wails 桌面 app 內嵌 Next.js UI」改為「本機服務Wails 控制台)+ 網頁控制台(瀏覽器 Web UI競品類比從 Photo Booth 換成 **Ollama / LM Studio / Docker Desktop / Stable Diffusion WebUI**R5-1
2. **砍 Mock 模式**:完全刪除,沒插硬體就讓 UI 空白R5-5a。Persona P3 Solution Architect 的使用情境被迫降級US-2 整條砍掉。
3. **砍 yt-dlp 全套 + URL 影片推論**:媒體上傳只剩 camera / image / upload 影片(`.mp4 / .avi / .mov / .mpeg / .mpg`)。砍 35MB vendor binary。
4. **ffmpeg 授權從 GPL blocker 升級為 LGPL 方案 B 混合**Windows/Linux 用 BtbN LGPL binarymacOS 自 build decoder-only~20MBcommit 到 repoR5-6 / R5-6a / R5-6b / R5-6c
5. **啟動時自動開瀏覽器(每次啟動)**Wails 控制台 server 就緒後**每次啟動**都自動開系統預設瀏覽器Settings 可關R5-4 / R5-D3。平台預設**macOS / Windows ONLinux OFF**`xdg-open` 在極簡 WM 行為不穩R5-D2。用於抵消「多一步摩擦」對北極星指標的傷害。
### v2.1 補丁摘要(相對 v2.0
v2.1 為 Design 交叉審閱發回的小版本修正Major 13 + 4 個 Minor+ R5-D / R5-E 決策落地,**未改動產品定位與核心決策**,只補齊語意與驗收標準。
| 變更 | 內容 | 依據 |
|------|------|------|
| M1 | 「首次啟動自動開」→「每次啟動自動開」(全文 replace | R5-D3 |
| M2 | auto-open 平台預設差異macOS / Windows ONLinux OFF | R5-D2 |
| M3 | US-7 Server 崩潰時 **除控制台 banner 外仍發 OS 原生通知** | R5-D1 |
| M4 | auto-open toggle 住 Wails 控制台Design 仲裁採 PRD 原案) | Design review §G Major 4 |
| **R5-E 大改** | **AC-1.3 從「10 秒硬指標」翻轉為「60 秒 + 階段化進度 + perceived performance」** | R5-E1E6 |
| Minor 1 | US-2 明確:日常啟動(非首次)同樣 auto-open | Design review Minor 1 |
| Minor 2 | Offline Overlay 硬阻斷(`role="alertdialog"` + focus trap + 不可關閉 + 純色卡片) | Design Spec v2 `server-offline-overlay.md` |
| Minor 3 | Wails 控制台 Footer **持久警示**取代單次 confirm / Error state **三動作按鈕**Restart / View log / Report | Design Spec v2 `control-panel.md` |
| Minor 4 | First-Run wizard **從 3 步縮為 2 步**(砍模式選擇),無硬體可按「稍後再設定」 | Design Spec v2 `first-run-update.md` / R5-5a |
**行數目標**v2.1 新增約 40 行、精簡約 20 行,總量仍 ≤ 500 行。
### v2.2 補丁摘要(相對 v2.1
v2.2 為**新增 feature**不是修訂——加入「Kneron Dongle FW 偵測 + 升降版」A + B 一次做完),翻案 R5-Q9progress.md 第二輪使用者決策 Q9 條目「韌體燒錄 flash → B 砍掉」、2026-04-11 拍板)。完整 user stories / AC / 風險 / milestone 在 [`features/feature-firmware-management.md`](./features/feature-firmware-management.md)本檔僅補§4.4 對照表 + 新增 §4.5 索引 + §10 新增一列 + §11 新增 11-8 + 變更紀錄 v2.2。新風險 R-FW-1 ~ R-FW-14 在 feature 子檔 §8 詳述v2.2.1 補強)。安裝包 +7MB保守 bundle 策略dmg 163MB → ~170MB仍在 §6.2 上限內。Kneron firmware redistribution 授權與 R5-B4 預置模型授權合併處理(同性質智財授權)。
**保留 vs 重寫對照表:**
| 章節 | 子檔 | v2 處理 |
|------|------|---------|
| 1. 產品策略與定位 | `strategy.md` | 🔴 重寫(見本檔 §1 |
| 2. 目標使用者與情境 | `user-research.md` | 🔴 重寫 US見本檔 §2 / §5 |
| 3. 產品願景與非目標 | `vision-and-non-goals.md` | 🟡 修訂(見本檔 §3 |
| 4. 功能清單與 API 對照 | `features/feature-inventory.md` | 🔴 大幅修訂(見本檔 §4 |
| 5. 使用者流程 | `features/user-flows.md` | 🔴 重寫(見本檔 §5 |
| 6. 非功能需求與驗收 | `nonfunctional.md` | 🟡 修訂(見本檔 §6 |
| 7. 發佈與交付策略 | `release-strategy.md` | 🟢 同 v1.2(安裝檔數字需更新見 §6 |
| 8. 風險與相依性 | `risks.md` | 🔴 大幅修訂(見本檔 §8 |
| 4.8 第三方授權 | `feature-inventory.md §4.8` | 🔴 改寫(見本檔 §7 |
---
## 1. 產品策略與定位(重寫)
### 1.1 新定位
visionA-local 是一個**本機服務 + 網頁控制台**架構的 Kneron AI 邊緣推論工具:
- **Wails 桌面 app = 本機 server 控制台**類比Docker Desktop 的 Dashboard、Ollama 的 tray app只負責 server 生命週期、log、版本資訊。
- **瀏覽器 Web UI = 真正的工作區**類比Stable Diffusion WebUI、LM Studio 的 web mode所有「選裝置、選模型、推論」在瀏覽器完成。
- 兩者只在本機、只綁 `127.0.0.1`、不做 LAN、不做背景 daemonR5-1 / R5-2
### 1.2 一句話價值主張
> **「雙擊 app → 自動開瀏覽器 → 插 USB → 5 分鐘內跑第一次推論。熟悉的瀏覽器操作、熟悉的 devtools離線可用、零依賴。」**
### 1.3 競品類比更新
| v1.2 類比 | v2.0 類比 |
|-----------|-----------|
| Photo Booth、Kneron 官方 demo app | **Ollama**server + web UI / CLI、**Docker Desktop**(桌面 app 管 daemon、Dashboard 管操作)、**LM Studio**(桌面 app + server 模式)、**Stable Diffusion WebUI**(點 bat → 瀏覽器打開 127.0.0.1 |
### 1.4 北極星指標(更新)
**v1.2 原指標**:內部 FAE 在客戶現場首次安裝後 **5 分鐘內**順利跑出第一次推論的比例 ≥ 95%。
**v2.0 新指標**(處理「多一步開瀏覽器」紅線):
> **內部 FAE 在客戶現場首次安裝後 5 分鐘內,瀏覽器 Web UI 跑出第一次推論的比例 ≥ 95%。**
> 起點雙擊安裝檔終點瀏覽器顯示第一幀推論結果。自動開瀏覽器R5-4 / R5-D3是必要條件 — 使用者不需手動點「Open in Browser」除非關過 Settings。比 v1.2 更嚴格(把瀏覽器冷啟動也納入 5 分鐘)。
### 1.5 策略取捨紀錄
- **砍 Mock 模式的代價**R5-5aP3 Persona Sam 的「零摩擦 demo」情境無法再被支援使用者明確接受此取捨P3 實質降級為非目標§2
- **雙視窗的代價**Wails 控制台 + 瀏覽器比 v1.2 單視窗多一層「誰是主角」的心智負擔。緩解:控制台 UI 極簡4 按鈕 + 1 log panel所有業務操作裝置、模型、Settings > 語言)強制住瀏覽器。
---
## 2. 目標使用者(修訂)
### 2.1 Persona 變動
- **P1 — Arthur內部 FAE**:同 v1.2。核心使用情境「帶筆電到客戶現場跑 demo」在 v2.0 下**多一步自動開瀏覽器**,但 R5-4 / R5-D3 決定每次啟動都自動開,對 Arthur 幾乎無感。
- **P2 — Dora外部開發者**:同 v1.2。她會欣賞「瀏覽器 devtools」R5-1 動機 B這是 v2.0 相對於 v1.2 的潛在加分項。
- **P3 — SamSolution Architect / PM****實質降級為非目標使用者**。R5-5a 砍 Mock 模式後Sam「沒硬體也能 demo」的訴求無法被滿足。保留 Persona 定義只是為了文件完整性,不再為他優化任何 MVP 功能。若未來要重新支援 Sam應提 L 級功能重新討論。
### 2.2 Persona 對新架構的反應PM 預測)
| Persona | 對「Wails 控制台 + 瀏覽器」的反應 | 對「砍 Mock」的反應 |
|---------|---------------------------------|--------------------|
| P1 Arthur | 🟡 中性偏好(第一次會愣一下,但每次啟動自動開瀏覽器大幅緩解) | ✅ 無感(他本來就帶硬體) |
| P2 Dora | ✅ 正面(瀏覽器 devtools 正中下懷) | ✅ 無感(她本來就在評估自家硬體) |
| P3 Sam | 🟡 中性(多一步開瀏覽器) | 🔴 **負面**(他本來就沒硬體) |
---
## 3. 非目標補充(修訂)
相對於 v1.2 `vision-and-non-goals.md`v2.0 明確**新增以下非目標**
-**Mock 模式 / 假資料 / 假裝置**R5-5a。沒插硬體就讓 UI 空白。
-**影片 URL 推論 / yt-dlp / YouTube / Vimeo / Dailymotion 整合**R5 共識 2
-**Model Zoo / 遠端模型下載**R5 共識 9同 v1.2 但再次確認)。
-**LAN / 區網分享 localhost**R5-1使用者明確放棄動機 C/F
-**背景 daemon / tray 常駐**R5-3 維持砍 trayR5-2 維持視窗關閉=結束 server
-**雙 Next.js build**(共識 5Wails 控制台用 vanilla HTML/JS/CSS不搞兩份前端
**保留的非目標**(同 v1.2cluster、relay、tunnel、auto-update、程式碼簽章、telemetry、韌體燒錄、多架構、商店上架、license 啟用機制、WCAG 2.2 AA 正式合規。
---
## 4. 功能清單與 API 對照(大幅修訂)
本節列出**相對於 v1.2 的變動**。v2.0 完整的功能清單後續由 PM Agent 同步更新到 `features/feature-inventory.md` 子檔。
### 4.1 保留(沿用 v1.2
- Device scan / connect`GET /api/devices``POST /api/devices/scan``POST /api/devices/:id/connect|disconnect``POST /api/devices/:id/inference/start|stop`
- 模型管理8 個預設 .nef + 使用者上傳(`GET /api/models``POST /api/models/upload``DELETE /api/models/:id``GET /api/models/:id/download`
- 批次影像上傳(`POST /api/media/upload/batch`R5 共識 10
- 推論引擎camera / image / 上傳影片
- MJPEG 串流(`GET /api/camera/:id/stream`
- WebSocket 推論結果 stream`/ws/devices/*``/ws/server-logs`
- 系統 API`GET /api/system/health|info|deps|metrics``POST /api/system/restart`
- i18n 中英雙語(住瀏覽器 Web UI
- Dark Mode 跟隨系統(住瀏覽器 Web UI`prefers-color-scheme`
- Log 檔案持久化macOS`~/Library/Application Support/visiona-local/logs/`
### 4.2 砍除v2.0 明確刪除)
| # | 項目 | 理由 | R5 依據 |
|---|------|------|---------|
| 1 | `POST /api/media/url` endpoint | 砍 URL 推論 | R5 共識 2 |
| 2 | `server/internal/media/url_handler.go`(或類似檔案) | 同上 | R5 共識 2 |
| 3 | yt-dlp 內嵌35MB binary + `vendor/ytdlp/` + `installer/payload-*` 相關 stage | 砍 URL 推論 | R5 共識 2 |
| 4 | 前端「URL 貼上」tab、source-selector 中的 URL 選項 | 砍 URL 推論 | R5 共識 2 / R5 共識 4 |
| 5 | **Mock 模式全部**Mock 裝置資料、Mock 推論結果 mock、Mock mode 切換按鈕、Mock 視覺標記、`server/internal/mock/`(若存在)、前端 Mock 入口 | 使用者明確砍 | **R5-5a** |
| 6 | Wails webview 載入 Next.js 前端的路由(原 `server/web/out` 不再被 Wails 直接 serve 作為主要 UI | 轉為 server 控制台 | R5-1 |
| 7 | Wails tray 相關(維持 v1.2 Q-A 決策) | 沒意義 | R5-3 |
| 8 | First-Run 流程中的「模式選擇(真實 / Mock」畫面 | Mock 砍了 | R5-5a |
| 9 | v1.2 US-2Mock 模式試玩)整條 user story | Mock 砍了 | R5-5a |
### 4.3 新增v2.0 明確增加)
| # | 項目 | 描述 | R5 依據 |
|---|------|------|---------|
| N1 | **Wails 控制台 UI** | vanilla HTML/JS/CSS 的獨立桌面視窗。包含Start / Stop / Restart Server 按鈕、Open in Browser 按鈕、Server 狀態指示running / stopped / error、Server port 號、資料目錄路徑、版本號、Clear log 按鈕、Log panel自動捲動 + 手動捲動解鎖、Settings menu含 auto-open toggle見 N2。**Footer 持久警示**:右下角固定顯示 `⚠ 關閉此視窗會停止 Local Server`12 px muted隨時可見取代單次 confirm dialog 作為主要提醒)。**Error state 面板**(對應 N6log panel 上方浮動 banner 含三個動作按鈕 `Restart Server` / `View log` / `Report issue`(見 Design Spec v2 `v2/control-panel.md §5`)。**不含**裝置管理、推論、模型、Settings > 語言等任何業務操作。 | R5-1 / R5-5 / Design review Minor 3 |
| N2 | **啟動時自動開瀏覽器(每次啟動)** | Wails 控制台啟動、server 就緒後,**每次啟動**都自動開系統預設瀏覽器到 `http://127.0.0.1:{port}`不是只在首次R5-D3。**auto-open toggle 住 Wails 控制台** 的 Settings menu讀取時機在 Wails `main.go` 啟動階段Web UI 尚未 load已與 Design 取得共識採此位置)。**平台預設**macOS / Windows `autoOpenBrowser = true`**Linux `autoOpenBrowser = false`**(因 `xdg-open` 在極簡 WM 行為不穩定R5-D2。使用者可隨時切換。 | R5-4 / R5-D2 / R5-D3 |
| N3 | **Web UI Server Offline Overlay** | 瀏覽器 Web UI 偵測 server 斷線heartbeat / WebSocket 斷)時,顯示**全螢幕半透明 backdrop`rgba(0,0,0,0.4-0.5)`+ 置中純色卡片**(卡片本體**不是**半透明,以確保 WCAG 4.5:1 對比。卡片內訊息「Local Server 已離線」+「請回到 visionA-local 桌面視窗重新啟動 Server」+「重試連線」Primary 按鈕 +「了解更多 ↓」Ghost 按鈕。**A11y 硬阻斷特性**`role="alertdialog"` + `aria-modal="true"` + focus trap + **不可由使用者手動關閉**(無 ✕ 按鈕,只能 retry 成功或使用者自行 ⌘W / Ctrl+W 關 tab / 重開 app 後自動恢復)。覆蓋層下方 UI 凍結不可操作。 | R5-2 / Design review Minor 2 |
| N4 | **server boot-id 機制** | Go server 啟動時產生 UUID boot-id放進 `/api/system/info` 回應。瀏覽器 Web UI 連上後記下第一個 boot-id後續 poll 發現 boot-id 變了就代表 server 重啟,前端自動 reload state。**Restart Server 按鈕**(住 Wails 控制台)依賴此機制讓瀏覽器 tab 不用手動重載。 | R5 共識 14 |
| N5 | **CORS 中介層** | Go server 加 CORS middleware`Access-Control-Allow-Origin` 只允許 `http://127.0.0.1:*` / `http://localhost:*`,其他 origin 一律拒絕。 | R5 共識 6 |
| N6 | **watchServer() 改為 Error state** | v1.2 watchServer 連續 3 次健檢失敗會 `os.Exit(1)`v2.0 改為把 Wails 控制台的 Server 狀態切為「Error」並在 log panel 顯示錯誤,不強制退出 app。Error state 面板同時顯示三個動作按鈕(見 N1。 | R5 共識 8 |
| N7 | **Server 崩潰 OS 原生通知** | 當 `watchServer()` 偵測連續 3 次健檢失敗進入 Error state 時,**除了**控制台 Error banner 外,**同步發一次 OS 原生通知**macOS Notification Center / Windows Toast / Linux `libnotify`)。使用者可能正在使用瀏覽器 tab靠 OS 通知把他拉回控制台。去重策略(避免 Error 狀態期間重複發通知)由 Architect 在 TDD v2 決定。 | R5-D1 |
| N8 | **啟動階段化進度顯示6 階段)** | Wails 控制台在啟動過程全程顯示階段化進度:`1. 初始化控制台 → 2. 檢查 Python → 3. 啟動 server → 4. 偵測裝置 → 5. 開瀏覽器 → 6. 瀏覽器就緒`。每階段有編號 + 使用者可理解的動作描述 + 視覺回饋spinner / 進度條)+ 中英雙語文案。第 6 階段「ready」的偵測訊號 = Web UI 透過 WebSocket hub 建立第一個 client 連線(不做新 endpointR5-E6。階段文案由 Design Agent 最終決定R5-E5。啟動總預算見 §6.1 AC-1.3 系列。 | R5-E1E6 |
### 4.4 功能對 Persona 對照表(更新)
| 功能 | 對應 Persona | 住哪裡 |
|------|-------------|--------|
| Wails 控制台Start/Stop/Restart/Log| P1, P2 | Wails 桌面視窗 |
| Device scan / connect | P1, P2 | 瀏覽器 Web UI |
| 模型管理 | P1, P2 | 瀏覽器 Web UI |
| Workspace推論| P1, P2 | 瀏覽器 Web UI |
| Settings > 語言 / 深色模式 | P1, P2 | 瀏覽器 Web UI |
| Settings > 自動開瀏覽器 | P1, P2 | **Wails 控制台**(因為它控制的是 Wails 啟動行為)|
| Server Offline Overlay | 全體 | 瀏覽器 Web UI |
| **FW badge + 升級 modal**v2.2 新)| P1, P2 | 瀏覽器 Devices 頁 |
| **Settings → 韌體管理**v2.2 新B 階段)| P1, P2 | 瀏覽器 Settings |
| ~~Mock 模式~~ | ~~P3~~ | ~~砍~~ |
### 4.5 Kneron Dongle FW 偵測 + 升降版v2.2 新增 feature
**翻案 R5-Q9**progress.md 表格條目「Q9 韌體燒錄 flash → B 砍掉」2026-04-11 第二輪決策)。當時砍的是「使用者燒任意 model 到 device flash」這條使用者旅程v2.2 範圍切割後只做「升降版到 Kneron 官方 bundle 版本」,避開原始 brick 擔憂。完整 user storiesUS-FW-1 ~ US-FW-3/ AC / 風險 / milestone 詳見 [`features/feature-firmware-management.md`](./features/feature-firmware-management.md)。
- **A 階段MVP5 人天)**KL520 + KL720 自動升級 KDP1 → KDP2、+0KB 安裝包、Devices 頁 FW badge綠/黃/紅/灰)+ 升級 modalM9-1 ~ M9-5。**KL630/KL730 A 階段只做 FW 偵測(無升降版按鈕)**v2.2.1 吸收 M9-6 弱驗證)
- **B 階段擴展10.5 人天)**手動「韌體版本切換」面向一般使用者UI 文案中性「韌體管理」/「切換到此版本」、不用「降版」字眼;含多層 safety net、不藏 dev mode、二次確認字串「DOWNGRADE」防誤觸+ KL630/KL730 升降版M9-10、含 AC-FW-3.5 生效條件 a/b/c、+7MBM9-6 ~ M9-13M9-6 SDK 弱驗證已完成、強驗證 M9-9/M9-10 啟動前實機)
- **stage 命名統一**v2.2.1preparing / loading / flashing / verifying / done / error採 Design 命名為 source of truth、WebSocket event stage + i18n key 一致)
- **新風險 R-FW-1 ~ R-FW-14**v2.2.1 補 R-FW-13 wheel 三平台版本不一致 P1 / R-FW-14 大小寫繞過 P2詳見 feature 子檔 §8
- **與 R5-B4 合併處理**Kneron firmware redistribution 授權與既有預置模型 redistribution 同性質(智財授權),發佈前一起取得 Kneron 書面授權使用者明示「先不管授權、發佈前再評估」feature 子檔 §9 Q-FW-1
---
## 5. User Stories重寫受影響的
### US-1第一次安裝 → 首次看到推論 UI**重寫**,取代 v1.2 US-1 + 部分 US-5
**身份**:任意目標 Persona主力 P1 Arthur
**情境**:剛拿到 `.dmg` / `.exe` / `.AppImage`,全新機器、客戶現場
**敘述**
> 身為 FAE我希望雙擊安裝檔、按幾下「下一步」、等進度條跑完**視窗自動打開**Wails 控制台)、**瀏覽器自動打開**Web UI插上 Kneron USB 後瀏覽器立刻顯示裝置我按一下「Start」就看到第一幀推論結果。整個流程不超過 5 分鐘。
**驗收標準**
- AC-1.1:下載安裝檔,無 terminal 操作可完成安裝(同 v1.2
- AC-1.2:整個安裝過程 ≤ 3 分鐘(目標)/ ≤ 5 分鐘(上限)(同 v1.2R4-4
- **AC-1.3R5-E 改寫)**:安裝完成後首次啟動,從 Wails 控制台視窗出現到瀏覽器 Web UI 顯示第一幀,**全程 ≤ 60 秒**R5-E1原 10 秒硬指標取消)。啟動過程全程可見、不可出現白畫面或無回饋狀態 — 採 Nielsen Norman perceived performance 原則,使用者感覺進度在推進比硬時間指標重要
- **AC-1.3a(新)**啟動全程顯示階段化進度6 階段,見 §4 N8每階段有編號 + 使用者可理解的動作描述 + 視覺回饋spinner 或進度條)+ 中英雙語文案。階段文案由 Design Agent 決定R5-E2 / R5-E5
- **AC-1.3b(新)**:任一啟動階段卡超過 **20 秒**UI 必須顯示「正在重試」或「這步比預期久」類提示,**不可停留在白畫面或無變化狀態**R5-E3
- **AC-1.3c(新)**:總啟動時間超過 **60 秒仍未進入「就緒」狀態**Wails 控制台進入 Error state顯示「Restart Server」「View log」「Report issue」三個動作按鈕對應 §4 N1 / N6與 watchServer 3 次失敗後行為一致R5-E4
- **AC-1.3d(新)**:「瀏覽器就緒」的定義 = **Web UI 建立 WebSocket 連線到 server**hub 收到第一個 client不是瀏覽器視窗出現時。不做新 endpoint、不做固定延遲R5-E6
- AC-1.4:瀏覽器 Web UI 首次顯示時,若**沒插硬體**Dashboard 顯示空白狀態 + 「請插入 Kneron 裝置」提示文字R5-5a不是 Mock 資料)。**First-Run wizard 從 v1.2 的 3 步縮為 2 步**砍模式選擇R5-5aStep 1 歡迎 → Step 2 硬體偵測。Step 2 在無硬體情況下可按 `稍後再設定` 略過,直接進 Dashboard 空白狀態Design review Minor 4
- AC-1.5Mac 第一次開啟若出現 Gatekeeper 警告Wails 控制台和安裝說明頁提供「右鍵 → 開啟」引導(同 v1.2
- AC-1.6auto-open 可在 **Wails 控制台的 Settings menu** 切換(不在 Web UI Settings見 §4 N2。**平台預設**macOS / Windows ON**Linux OFF**R5-D2。關閉後下次啟動只開 Wails 控制台、不開瀏覽器使用者可手動按「Open in Browser」
### US-2日常啟動**新增**,取代 v1.2 US-2 Mock
**身份**P1, P2
**情境**:第二次以後的日常啟動(非首次安裝,但「啟動時自動開」對首次 / 日常**同樣生效**R5-D3
**敘述**
> 身為日常使用者,我希望雙擊 app icon 後Wails 控制台和瀏覽器都自動開啟(除非我關過 auto-openserver 狀態顯示 running瀏覽器顯示上次的 Dashboard 狀態。
**驗收標準**
- AC-2.1:日常啟動時,若 Wails 控制台 Settings `autoOpenBrowser === true`**仍會自動開瀏覽器**和首次啟動行為一致R5-D3 / Design review Minor 1。AC-1.3 系列的 60 秒預算與階段化進度在日常啟動同樣生效(通常遠低於 60 秒)
- AC-2.2:瀏覽器 Web UI 保留上次的 i18n 語言偏好、深色模式偏好
- AC-2.3:若使用者關過 auto-open或 Linux 平台預設 OFF 且使用者未手動開),啟動時只開 Wails 控制台使用者可點「Open in Browser」手動開
### US-3連實體 Kneron 裝置(**微調**
**身份**P1, P2
**敘述**:同 v1.2,但 UI 住瀏覽器
**驗收標準**
- AC-3.1 ~ AC-3.6:同 v1.2(插 USB → 3 秒內瀏覽器 Devices 頁顯示裝置)
- AC-3.7**新**):若使用者關閉瀏覽器但 Wails 控制台還在server 仍跑),插入 USB 的事件不會通知使用者(不做 toast下次使用者打開瀏覽器會看到裝置。不發原生 OS 通知(維持 v1.2 R4-8 OS 通知策略)。
### US-4切換 / 上傳模型(**微調**
**身份**P1, P2
**敘述**:同 v1.2,但 UI 住瀏覽器
**驗收標準**
- AC-4.1 ~ AC-4.4:同 v1.2
- AC-4.5**新**):拖放 .nef **只在瀏覽器視窗內有效**,拖到 Wails 控制台視窗無反應(不處理跨視窗拖放,避免混淆)
- AC-4.6**新**):預設模型清單**維持 8 個 .nef**,使用者可上傳自己的 .nef但**沒有**任何 Model Zoo / URL download 入口R5 共識 9
### US-5跑即時攝影機推論**重寫,瀏覽器情境**
**身份**P1
**敘述**
> 身為 FAE我希望在瀏覽器 Workspace 頁選一顆 webcam、選一個模型、按 Start看到 MJPEG 即時串流和推論 overlay。
**驗收標準**
- AC-5.1Workspace 頁能列出所有可用 webcam透過後端 `/api/camera`,而非瀏覽器 `navigator.mediaDevices`;這點對 Chrome / Edge / Safari 行為一致)
- AC-5.2:選 webcam + 模型後按 Start≤ 3 秒看到第一幀
- AC-5.3:推論 overlay方框 / 標籤 / 信心度)正確顯示
- AC-5.4:即時 FPS / 延遲 / CPU / RAM 顯示
- AC-5.5:按 Stop 即時停止
- AC-5.6**新****不使用**瀏覽器 `getUserMedia()` API避開 Chrome/Edge/Safari 權限差異 + HTTPS 限制)。所有攝影機存取走後端 AVFoundation / DirectShow / V4L2 pipeline和 v1.2 架構相同)
### US-6上傳影片推論**修訂**,取代 v1.2 US-7 / US-8
**身份**P1, P2
**敘述**
> 身為使用者,我希望能把一段 .mp4 / .avi / .mov / .mpeg / .mpg 影片拖進瀏覽器 Workspace跑離線推論、看到逐幀結果。
**驗收標準**
- AC-6.1:瀏覽器 Workspace 頁支援拖放或 file picker 上傳影片
- AC-6.2:支援副檔名:`.mp4 / .avi / .mov / .mpeg / .mpg`R5 共識 11
- AC-6.3:上傳後後端走 ffmpeg decode → Kneron 推論 → 前端顯示結果
- AC-6.4**不支援** URL 推論 / YouTube / Vimeo / DailymotionR5 共識 2
### US-7Server 崩潰 / 意外中斷(**新增**
**身份**P1, P2
**情境**Go server 子程序因某種原因崩潰OOM、panic、依賴錯誤或使用者關閉 Wails 視窗
**敘述**
> 身為使用者,我希望當 server 斷線時我在瀏覽器看到清楚的「Local Server 已離線」訊息,而不是無聲的網頁卡住。我也希望 Wails 控制台能告訴我發生什麼、我能按 Restart 重啟。
**驗收標準**
- AC-7.1:瀏覽器 Web UI 偵測 server 斷線health check 失敗 or WebSocket 斷 + retry 失敗)→ 顯示全螢幕 Server Offline OverlayR5-2 / N3。**Overlay 無 ✕ 按鈕、不可手動關閉**`role="alertdialog"` + focus trapDesign review Minor 2
- AC-7.2Overlay 卡片內訊息「Local Server 已離線,請回到 visionA-local 桌面視窗重新啟動 Server」+「重試連線」Primary 按鈕 +「了解更多 ↓」Ghost 按鈕。卡片背景純色(非 backdrop 半透明),確保 WCAG 4.5:1 對比
- AC-7.3Wails 控制台 Server 狀態顯示變為「Error」紅色log panel 上方浮現 Error banner 面板,含 **三個動作按鈕**`Restart Server` / `View log` / `Report issue`(對應 §4 N1 / N6Design Spec v2 `v2/control-panel.md §5`Design review Minor 3
- AC-7.4:使用者在 Wails 控制台按 Restart Server 後server 重啟、取得新 boot-id瀏覽器 Web UI 透過 Retry 重連、偵測到新 boot-id、自動 reload stateR5 共識 14 / N4
- AC-7.5:使用者直接關閉 Wails 視窗 → **server 結束**R5-2 維持 v1.2 Q7→ 瀏覽器 Web UI 顯示相同的 Offline Overlay + 提示「請重新啟動 visionA-local」
- AC-7.6:為避免使用者誤解「關閉視窗 = 程式還在背景跑」,**雙保險警示**(a) Wails 控制台 Footer 右下角**持久警示文字** `⚠ 關閉此視窗會停止 Local Server`12 px muted始終可見§4 N1(b) 標題列 / menu bar 的「Close」按鈕 tooltip / confirm dialog 同樣寫明。(a) 是主要手段(避免使用者盲目點 confirm(b) 為輔
- **AC-7.7R5-D1 新)**Server 崩潰事件watchServer 連續 3 次失敗進入 Error state 的瞬間),**除控制台 Error banner 外,同步發一次 OS 原生通知**macOS Notification Center / Windows Toast / Linux `libnotify`)。使用者可能正在使用瀏覽器 tab 而未看控制台OS 通知負責把他拉回來。去重策略Error 狀態期間避免重複發)由 Architect 在 TDD v2 決定
### 砍掉的 User Stories
| US | v1.2 標題 | v2.0 處理 |
|----|----------|-----------|
| v1.2 US-2 | Mock 模式試玩 | **砍**R5-5a |
| v1.2 US-6 | 從 Tray 快速控制 | 維持 v1.2 已砍(第三輪 Q-A |
| v1.2 US-8 | YouTube / URL 推論 | **砍**R5 共識 2 |
| v1.2 US-9 | 查看 server 日誌 | **升級**:住 Wails 控制台成為一級功能N1 |
---
## 6. 非功能需求(更新)
### 6.1 效能指標
| 指標 | v1.2 | v2.0 | 變化說明 |
|------|------|------|---------|
| 安裝時間 | ≤ 3 分 / 上限 5 分 | **同 v1.2** | R4-4 沿用 |
| 首次推論時間(首次啟動)| ≤ 20s / 上限 30s至 Mock 第一幀)| **≤ 20s / 上限 30s至瀏覽器第一幀** | 終點改為瀏覽器 Web UI 顯示第一幀真實推論結果(因 Mock 砍。R5-4 的自動開瀏覽器是達成此指標的必要條件。Architect TDD v2 需驗證預算 |
| 首次推論時間(回訪)| ≤ 10s / 上限 15s | **同 v1.2**(但終點改為瀏覽器)| 同上 |
| 實機接入時間 | ≤ 5s / 上限 10s | 同 v1.2 | — |
| 攝影機串流延遲(首次)| ≤ 200ms / 上限 250ms | 同 v1.2R4-2| — |
| 攝影機串流延遲(穩定後)| ≤ 120ms / 上限 150ms | 同 v1.2R4-2| — |
| idle CPU無硬體狀態| ≤ 3% / 上限 5%Mock 模式)| **≤ 3% / 上限 5%(無硬體狀態)** | Mock 改為「無硬體空白狀態」。CPU 估計值不變,因為 v1.2 Mock 本來就不 spawn Python |
| idle RAM無硬體狀態| ≤ 500 MB / 上限 600 MB | **≤ 450 MB / 上限 550 MB** | 因無 Mock state、無 Python sidecar、無 yt-dlp 子程序,可略降。**此指標不含瀏覽器 tab 記憶體**(由 OS 系統瀏覽器負責,不是 Wails app 的責任範圍。Architect 實測Wails + Go server + Python 樂觀估 275405 MB達標 |
| 真實推論 RAM | ≤ 1 GB / 上限 1.5 GB | 同 v1.2 | — |
### 6.2 安裝檔大小(更新)
| 平台 | v1.2 上限 | v2.0 目標 | 組成變化 |
|------|-----------|-----------|---------|
| macOS `.dmg` | ≤ 220 MB | **≤ 185 MB**(目標)/ 上限 ≤ 220 MB | -35MB yt-dlp、ffmpeg 從 77MB GPL build 換成 ~20MB LGPL decoder-only = 淨 -92MB |
| Windows `.exe` | ≤ 200 MB | **≤ 165 MB**(目標)/ 上限 ≤ 220 MB | -35MB yt-dlp、ffmpeg 換 BtbN LGPL ~40MB差異較小但仍略降 |
| Ubuntu `.AppImage` | ≤ 200 MB | **≤ 165 MB**(目標)/ 上限 ≤ 220 MB | 同 Windows |
> **根據**R5-6 / R5-6a / R5-6b / R5-6c ffmpeg LGPL 混合方案,砍 yt-dlp 全套。實際數字需 Architect 在 TDD v2 實測確認。
### 6.3 瀏覽器相容性(新)
- **預設**:開啟使用者 OS 預設瀏覽器macOSSafari/Chrome/Edge 依 OS 設定WindowsEdgeLinux`xdg-settings`
- **auto-open 平台預設**(見 §4 N2macOS / Windows `autoOpenBrowser = true`**Linux `autoOpenBrowser = false`**`xdg-open` 在極簡 WM 下行為不穩定R5-D2
- **推薦**Chrome 或 EdgeMJPEG decode 穩定性最好、devtools 最完整、WebSocket 穩定)
- **可用但不保證**SafariMJPEG decode 可能較慢;因為 US-5 AC-5.6 決定不走 `getUserMedia`Safari 的攝影機權限流程差異不構成問題)
- **不支援**IE、舊版 Firefox ESR< 115)、行動版瀏覽器不是使用情境
- **WebSocket 就緒偵測**R5-E6 / AC-1.3d依賴瀏覽器支援 WebSocket 所有現代瀏覽器原生支援風險低
> **注意**v1.2 靠 Wails webviewWebView2 / WKWebView是 Chromium/Safari 核心的一個已知固定版本v2.0 改用使用者系統瀏覽器後**多了一維瀏覽器版本差異**。這是 Architect TDD v2 和 Testing Agent 要接受的新測試矩陣。
### 6.4 安全性需求(修訂)
- Server 只監聽 `127.0.0.1`**絕對不 bind 0.0.0.0** v1.2R5 共識 7 再次確認
- **CORS 中介層**`Access-Control-Allow-Origin` 只允許 `http://127.0.0.1:*` / `http://localhost:*`**v2.0 新增**R5 共識 6
- 使用者資料存在 OS 慣例目錄 v1.2
- TLSlocalhost 不需要 v1.2
- 無認證單人工具 v1.2
- 瀏覽器 DevTools 暴露v2.0 使用者可以用 F12 看到所有 API 呼叫WebSocket 流量這不是安全問題因為是單人本機但要在 FAE 訓練文件提醒不要把瀏覽器分頁截圖給外部可能含硬體序號
### 6.5 其他非功能需求
其餘章節相容性可維護性可打包可用性日誌** v1.2**詳見 [`nonfunctional.md`](./nonfunctional.md)
---
## 7. 第三方授權宣告(大改,取代 v1.2 §4.8
### 7.1 依賴對照表v2.0
| 依賴 | 用途 | 授權 | 宣告要求 | v1.2 v2.0 變動 |
|------|------|------|---------|-----------------|
| **ffmpeg LGPL buildBtbN** | Windows / Linux 的攝影機 / 影片 decode | **LGPL v2.1+** | 必須宣告LGPL 條文動態連結About 對話框列 `Powered by FFmpeg (LGPL)` + 連結 | v1.2 GPL build `under legal review` 🔴,v2.0 LGPL 方案 B 解除 blockerR5-6 |
| **ffmpeg LGPL buildmacOS 自 build** | macOS 的攝影機 / 影片 decode | **LGPL v2.1+** | 同上額外說明 binary Innovedus macOS 上自 ffmpeg 官方 source `./configure --enable-shared --disable-gpl` flag build 源碼可取得 | **v2.0 新增**Decoder-only ~20MB只含 mp4/avi/mov/mpeg/mpg 五種 decoderR5-6acommit `vendor/ffmpeg/macos/`R5-6b)。ffprobe 一起包R5-6c|
| **KneronPLUS SDK**wheel| 裝置 / 推論 | Kneron 專有 | v1.2發佈前 gateR5 風險維持| v1.2 |
| **Python runtime**python-build-standalone| 執行 KneronPLUS | PSF 2.0 | v1.2 | v1.2 |
| **Python wheels**numpy / opencv / pyusb | 推論依賴 | BSD / MIT / Apache 2.0 為主 | v1.2 | v1.2 |
| **Wails v2** | Wails 控制台殼 | MIT | v1.2 | 角色改變v1.2 是前端 shellv2.0 是控制台 shell|
| **Next.js / React / shadcn / Radix / Tailwind / Zustand** | 瀏覽器 Web UI | MIT 為主 | v1.2 | v1.2 |
| ~~**yt-dlp**~~ | ~~URL 影片下載~~ | ~~Unlicense~~ | **v2.0 刪除** | 整個 vendor 拔掉 |
### 7.2 macOS ffmpeg 自 build 的長期責任
Architect TDD v2 必須產出 `scripts/build-ffmpeg-macos.sh`記錄 configure flags / source tarball URL / checksum 驗證)。LGPL ffmpeg 幾乎不需更新R5-6b~20MB binary commit repo 可接受2-3 年後 build 系統變化時需 ~0.5 人天重 build
### 7.3 授權檔案落點
v1.2 `<APPDATA>/licenses/`:❌ `LICENSE-yt-dlp.txt`;✅ `LICENSE-ffmpeg.txt` GPL 換成 LGPL v2.1 + v3;✅ 新增 `ffmpeg-macos-build-notes.md` 說明 macOS binary 來源
---
## 8. 風險與相依性(大幅修訂)
### 8.1 技術風險變動
| 風險 ID | v1.2 狀態 | v2.0 處理 |
|---------|-----------|-----------|
| R1KneronPLUS Linux wheel glibc| 高可能 / 高影響 | v1.2不變|
| R2Windows WinUSB UAC| / | v1.2 |
| R3KneronPLUS macOS x86_64| / 已被 Q4 降級 | v1.2 |
| R4Linux venv| / | v1.2 |
| R5Kneron .nef re-distribution| 發佈前 gate | v1.2 |
| **R6ffmpeg GPL blocker** | 🔴 release blocker | ** 解除**R5-6 LGPL 方案 B|
| R11發佈通路| P2 追蹤 | v1.2 |
| R12CI runner| P2 追蹤 | v1.2 |
### 8.2 新增風險v2.0
#### N-R1 — 瀏覽器相容性差異(新)
| 項目 | 內容 |
|------|------|
| 描述 | v2.0 改用使用者系統瀏覽器後MJPEG decode 效能WebSocket 穩定性深色模式判斷都會因瀏覽器而異Safari MJPEG 延遲可能超過 150ms 上限 |
| 可能性 | |
| 影響 | Safari 使用者體驗可能變差 P1 FAE 多用 Chrome|
| 等級 | **P2 追蹤項** |
| 緩解 | 1) 預設推薦 Chrome / Edge2) Safari 列為可用但不保證」;3) Testing Agent 測試矩陣加 Safari4) 發佈說明寫若遇延遲過高請改用 Chrome / Edge |
| PM 行動 | Testing 階段實測 Safari若嚴重超標則在 Wails 控制台自動開瀏覽器時優先選 Chrome / Edge |
#### N-R2 — macOS 自 build ffmpeg 的長期維護成本(新)
| 項目 | 內容 |
|------|------|
| 描述 | macOS 上沒有現成的 LGPL decoder-only ffmpeg binary需要 Innovedus buildR5-6a / R5-6b)。2-3 年後若 ffmpeg build 系統變化 / configure flag 調整 / source tarball 結構變化可能需要重新 build |
| 可能性 | 長期|
| 影響 | |
| 等級 | **P3 追蹤項**不緊急|
| 緩解 | 1) TDD v2 產出 `scripts/build-ffmpeg-macos.sh`記錄完整 build 步驟2) commit 時把 source tarball checksumconfigure flagsbuild 環境一起寫進 commit message3) 2 年做一次 build 演練確保 script 還能跑 |
| PM 行動 | 交付時在 delivery docs ffmpeg rebuild SOP |
#### N-R3 — 使用者誤解「關閉視窗 ≠ 結束 server」
| 項目 | 內容 |
|------|------|
| 描述 | R5-2 決定維持關閉 Wails 視窗 = 結束 server」,但因為 v2.0 多了瀏覽器視窗這個真正的操作介面」,使用者可能誤以為我關掉 Wails 視窗沒關係瀏覽器 tab 還在應該還能用」。這種誤解會導致他在瀏覽器看到 Offline Overlay 時很困惑 |
| 可能性 | |
| 影響 | 體驗面混亂不危險|
| 等級 | **P2 追蹤項** |
| 緩解 | 1) Wails 控制台 Close 按鈕的 tooltip / confirm dialog 明確寫關閉此視窗會結束 Local Server」(AC-7.62) Web UI Offline Overlay 文案引導請回到 visionA-local 桌面視窗重新啟動」;3) First-Run 歡迎頁加一句說明 |
| PM 行動 | Design Agent Design Spec v2 確認這三處文案都到位 |
#### N-R4 — 砍 Mock 後 CI / E2E 測試困難(新)
| 項目 | 內容 |
|------|------|
| 描述 | v1.2 Mock 模式CI runner 沒插硬體也能跑 E2E 測試 Mock pipeline)。v2.0 Mock CI runner 要跑裝置管理 / 模型切換 / 推論 E2E 若沒硬體就測不了 |
| 可能性 | |
| 影響 | 測試覆蓋率下降|
| 等級 | **P2 追蹤項** |
| 緩解 | 1) E2E 測試分層:「不需硬體的 UI 測試」(載入i18nSettingsOffline OverlayWails 控制台 start/stop button可在無硬體 CI ;「需要硬體的測試」(裝置偵測推論只能在有硬體的 runner 2) HTTP fixture mock 後端 API前端 unit 測試層級但不碰 Go server 的推論 pipeline3) Testing Agent 在測試計畫明確區分兩層 |
| PM 行動 | Testing Agent / DevOps 討論是否要建有硬體 CI runner」(M5+ 規劃|
### 8.3 PM 需要進一步確認的事項(寫入 progress.md 未解決問題)
沿用 v1.2 三項R5 授權 / R11 發佈通路 / R12 CI runner新增 **N-R1 瀏覽器相容性**Testing 驗證 Safari/Chrome/Edge/Firefox MJPEG + WebSocket)、**N-R4 CI/E2E 測試分層**Testing + DevOps TDD v2 提出分層方案)。
---
## 9. 策略性路線圖(更新)
- **Now sprint重構實作**PRD v2.1 / Design Spec v2 / TDD v2 三方互審 Architect ffmpeg LGPL vendor script + Wails 控制台實作 + CORS middleware + 刪檔清單 Design 產控制台 wireframe + Offline Overlay + source-selector URL milestone 進開發
- **Next重構完成後**M7 Windows build 重驗R5-7v1.0.0 release gateKneron re-distribution 授權R5 發佈前 gate三平台 smoke test
- **Laterv1.0.0 發佈後**視回饋決定是否放回 v1.2 功能Mock / URL 推論 / tray視需求升級 LAN 模式重走 R5-1 動機 C
---
## 10. 變更追蹤(高階差異,逐項見 git history
v1.2 v2.x 已折成下方 bullet 25 項大表移除以保 500 行上限
- **定位轉向**R5-1Wails 內嵌 Next.js 本機服務 + 網頁控制台Ollama
- ** Mock / URL 推論 / yt-dlp 35MB**R5-5a / 共識 2US-1/2/5/6/9 全面重寫
- **ffmpeg GPL LGPL 方案 B**R5-6 系列Win/Linux BtbN + macOS build ~20MB
- **每次啟動自動開瀏覽器**R5-4/D2/D3+ AC-1.3 60s perceived performanceR5-E1~E6
- **新基礎建設**R5-5/共識 5/6/8/14Wails 控制台 + Offline Overlay 硬阻斷 + CORS + boot-id + watchServer Error state + Footer 警示 + Error 三按鈕 + 崩潰 OS 通知
- **First-Run 3 2 **R5-5a / Minor 4影片副檔名改 mp4/avi/mov/mpeg/mpgmacOS 185MBv2.2 +7MB FW ~170MBidle RAM 450/550MB
**節錄表(僅 v2.2 新項與 v2.x 風險)**
| 區域 | v1.2 | v2.x | R5 依據 |
|------|------|------|---------|
| 新風險v2.x| | N-R1 瀏覽器相容 / N-R2 macOS ffmpeg 維護 / N-R3 關窗誤解 / N-R4 CI 測試分層 + **R-FW-1 ~ R-FW-14v2.2.1 補強 R-FW-13 wheel 三平台版本不一致 P1 / R-FW-14 大小寫繞過 P2** | / v2.2.1 |
| 解除風險 | R6 ffmpeg GPL blocker | **解除** | R5-6 |
| **v2.2 新 feature** | | **FW 偵測 + 升降版**A+B、+7MB、~15.5 人天翻案 R5-Q9v2.2.1 吸收三方互審 + M9-6 弱驗證| **§4.5 + feature 子檔** |
---
## 11. 給 Orchestrator / 下輪審閱的問題
| # | 問題 | 狀態 |
|---|------|---------|
| 11-1 ~ 11-3 / 11-5 / 11-6 | v2.1 五題已解決auto-open 落點AC-1.3 預算idle RAMWeb UI 徽章Settings toggle 位置| **已解決**詳細結論散見 §1.4 / §6.1 / §4.5 N1-N2 / Design Spec v2 `v2/settings-update.md`如需追溯 git log v2.1 提交|
| 11-4 | N-R4 Mock CI / E2E 測試分層 | **懸置** Testing Agent 在測試計畫提出不需硬體的 UI 測試vs需硬體測試分層方案 |
| 11-7 | R5-E 階段化進度 6 階段文案中英雙語定稿 | **懸置**R5-E5 使用者授權 Design Agent 決定最終在 Design Spec v2 wireframe 定版時由使用者審閱 override |
| 11-8 | FW 管理 feature 三方互審項 | **v2.2.1 已吸收**D-FW-1~6 / A-FW-1~6 全部已處理O-FW-1 R5-B4 release blocker 合併+ O-FW-2M9-10 AC-FW-3.5 條件評估 Orchestrator 追蹤項詳見 [`features/feature-firmware-management.md`](./features/feature-firmware-management.md) §14|
---
## 變更紀錄
| 版本 | 日期 | 作者 | 變更 |
|------|------|------|------|
| v2.0 / v2.1 | 2026-04-14 | PM Agent | R5 五輪決策重寫 + Design 互審吸收詳見 §10 / git log |
| v2.2 | 2026-05-24 | PM Agent | 翻案 R5-Q9新增 FW 管理 featureA+B、~15.5 人天、+7MB)。詳見 [`features/feature-firmware-management.md`](./features/feature-firmware-management.md) |
| v2.2.1 | 2026-05-25 | PM Agent | FW feature 吸收三方互審 + M9-6 弱驗證:①stage 命名採 Designpreparing/loading/flashing/verifying)②M9 工時表拆法採 PMArchitect 同意)③AC-FW-3.5KL630/KL730 升降版延後 B 階段 M9-10 + 生效條件 a/b/cA 階段 KL630/KL730 只做 FW 偵測ADR-009 ADR-001 編號統一R5-Q9 行號改描述式引用US-FW-2 2a / 2b + UI 文案中性化 §7.2.1 體驗指標 5 新增 R-FW-13/14 AC-FW-1.9 graceful shutdownbadge 4 補灰色)⑪11-8 解決詳見 [`features/feature-firmware-management.md`](./features/feature-firmware-management.md) §14.4 |