jim800121chen 8cd5751ce3 feat(local-tool): M8 重構 — Wails 控制台 + 瀏覽器 Web UI(R5 決策)
依 R5 五輪決策把 visionA-local 從「Wails 內嵌 Next.js」重構為「Wails
本機伺服器控制台 + 瀏覽器 Web UI」模式(類比 Docker Desktop / Ollama)。

程式碼變動
  - M8-1 砍 yt-dlp 全套(後端 resolver / URL handler / 前端 URL tab /
    Makefile vendor / installer / bootstrap / CI workflow,-555 行)
  - M8-2 砍 Mock 模式全套(driver/mock、mock_camera、Settings runtimeMode、
    VISIONA_MOCK 環境變數,-528 行)
  - M8-3 ffmpeg 從 GPL 切換到 LGPL 混合方案:Windows/Linux 用 BtbN 現成
    LGPL binary,macOS 自 build minimal decoder-only 進 git
    (vendor/ffmpeg/macos/ffmpeg 5.7MB + ffprobe 5.6MB,比 GPL 版省 85% 空間)
  - M8-4 Wails Server Controller:state machine、log ring buffer 2000 行、
    preferences.json atomic write、boot-id、Gin SkipPaths、shutdown 7+1 秒、
    notify_*.go 三平台 OS 通知、watchServer 改 Error state 不 os.Exit
  - M8-4b 啟動階段管線 R5-E:6 階段進度 event、20s soft / 60s hard timeout、
    stage 5/6 skip 規則、sentinel file、RestartStartupSequence 5 步驟
  - M8-5 Wails 控制台 vanilla HTML/JS/CSS(9 檔 ~2012 行)取代 M7-B splash:
    state 視覺、log panel、startup progress panel、Stage 6 manual CTA
    pulse、shutdown modal、Settings、Dark Mode、i18n 中英雙語
  - M8-6 上傳影片副檔名擴充(mp4/avi/mov/mpeg/mpg)
  - M8-7 Web UI Server Offline Overlay(role=alertdialog + focus trap +
    wsEverConnected 容錯 + Page Visibility)
  - M8-8 CORS middleware(127.0.0.1/localhost only + suffix attack 防護)+
    ws/origin.go 獨立 WebSocket CheckOrigin 避 package cycle
  - MAJ-4 server:shutdown-imminent WebSocket broadcast 機制
    (/ws/system endpoint + notifyShutdownImminent helper)
  - M8-9 Boot-ID + 瀏覽器 tab 自動重連(sessionStorage loop guard)

品質
  - ~105+ 新 unit test + race detector (-count=2) 全綠
  - 10 個 milestone 全部通過 Reviewer 審查
  - 三方 v2 + v2.1 文件(PRD / Design Spec / TDD)+ 交叉互審紀錄
    收錄在 .autoflow/

交付前待處理(M8-10)
  - 重跑 make payload-macos 把舊 GPL 77MB binary 換成新 LGPL
  - 三平台 end-to-end build 驗證

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 17:57:54 +08:00

501 lines
43 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.12026-04-14**
> 作者PM Agent
> 任務等級L 級(重構方向變更)
> 狀態:**v2.1 補丁:吸收 R5-D1/D2/D3 + R5-E + Design 交叉審閱 4 Major / 4 Minor**
> 前版:`PRD-v2.md` v2.02026-04-14/ [`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 行。
**保留 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 |
| ~~Mock 模式~~ | ~~P3~~ | ~~砍~~ |
---
## 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. 變更追蹤(和 v1.2 的完整差異清單)
| 區域 | v1.2 | v2.0 | R5 依據 |
|------|------|------|---------|
| 產品定位 | Wails 桌面 app 內嵌 Next.js UI | 本機服務 + 網頁控制台 | R5-1 |
| 競品類比 | Photo Booth | Ollama / Docker Desktop / LM Studio / SD WebUI | R5-1 |
| 一句話價值主張 | 裝起來就能跑離線可用零依賴 | 雙擊 自動開瀏覽器 USB 5 分鐘跑第一次推論 | R5-1 / R5-4 |
| 北極星指標終點 | Mock 第一幀 | 瀏覽器第一幀真實硬體| R5-5a |
| Mock 模式 | MVP 必達 | **砍** | R5-5a |
| URL 影片推論 | US-8 / `/api/media/url` / yt-dlp 內嵌 | **砍** | R5 共識 2 |
| yt-dlp vendor35MB| 打包 | **砍** | R5 共識 2 |
| ffmpeg | GPL buildblocker 🔴)| **LGPL 方案 B 混合**Win/Linux BtbNmacOS build decoder-only ~20MB commit| R5-6 / R5-6a / R5-6b / R5-6c |
| 安裝檔大小macOS 目標| 220 MB | ** 185 MB** | R5-6 |
| idle RAM無硬體| 500 MB / 上限 600 MB | 450 MB / 上限 550 MB | Mock / yt-dlp |
| Wails 視窗關閉 | 結束程式 | **同 v1.2**R5-2 復議後維持| R5-2 |
| Tray | v1.2 Q-A| **同 v1.2**R5-3 復議後維持| R5-3 |
| 啟動時自動開瀏覽器 | | **新增,每次啟動都開**R5-D3macOS/Win 預設 ON、**Linux 預設 OFF**R5-D2toggle Wails 控制台 Settings已與 Design 取得共識 | R5-4 / R5-D2 / R5-D3 |
| AC-1.3 啟動預算 | | ** 60 ** v2.0 草案 10 秒硬指標被 R5-E1 取代+ 階段化進度6 階段R5-E2+ 20 秒卡住提示R5-E3+ 60 秒超時進 Error stateR5-E4+ WebSocket 就緒偵測R5-E6 | **R5-E1E6** |
| Server 崩潰 OS 通知 | | **新增**控制台 Error banner 並存R5-D1| R5-D1 |
| First-Run wizard 步數 | 3 歡迎 / 模式選擇 / 硬體偵測 | **2 步**歡迎 / 硬體偵測砍模式選擇無硬體可按稍後再設定略過 | R5-5a / Design review Minor 4 |
| Offline Overlay 硬阻斷 | | **新增驗收特性**`role="alertdialog"` + focus trap + 按鈕 + 純色卡片 | Design review Minor 2 |
| Wails 控制台 Footer 持久警示 | | **新增**「⚠ 關閉此視窗會停止 Local Server取代單次 confirm 作為主要提醒 | Design review Minor 3 |
| Error state 三動作按鈕 | | **新增** `Restart Server` / `View log` / `Report issue`Wails 控制台 Error banner | Design review Minor 3 |
| Wails 控制台 | webview Next.js| **新增 vanilla HTML/JS/CSS**Start/Stop/Restart/Open Browser/log panel/status/port/dir/version | R5-5 / R5 共識 5 |
| Server Offline Overlay | | **新增**Web UI 全螢幕覆蓋層| R5-2 |
| CORS middleware | | **新增**127.0.0.1 / localhost only| R5 共識 6 |
| watchServer 3 次失敗 | `os.Exit(1)` | **改為 Error state不退出** | R5 共識 8 |
| Server boot-id | | **新增**支援 Restart Server 按鈕的 tab 自動重連| R5 共識 14 |
| US-1 | 3 分鐘看到 Dashboard | 5 分鐘瀏覽器跑第一次推論 | R5-1 / R5-4 |
| US-2 | Mock 試玩 | 日常啟動取代| R5-5a |
| US-5 | Wails webview 攝影機 | 瀏覽器 Workspace + 後端攝影機 pipeline不走 `getUserMedia`| R5-1 |
| US-7 / US-8 | 影片 / URL 上傳 | 合併為 US-6 URL | R5 共識 2 |
| US-9 | Settings 進階分頁次要功能 | **升級為 Wails 控制台一級功能** | R5-1 / R5-5 |
| US-7server 崩潰 / 離線| | **新增** | R5-2 |
| 上傳影片副檔名 | mp4 / avi / mov / webm瀏覽器能吃| **mp4 / avi / mov / mpeg / mpg** | R5 共識 11 |
| Persona P3 Sam | 三順位目標 | **實質降級為非目標** | R5-5a |
| 新風險 | | N-R1 瀏覽器相容 / N-R2 macOS ffmpeg 維護 / N-R3 關窗誤解 / N-R4 CI 測試分層 | |
| 解除風險 | R6 ffmpeg GPL blocker | **解除** | R5-6 |
---
## 11. 給 Orchestrator / 下輪審閱的問題
| # | 問題 | v2.1 狀態 |
|---|------|---------|
| 11-1 | auto-open Settings 資料落在哪Web UI Wails 控制台共用同一個 config | **已解決**Architect `preferences.json @ <dataDir>/`write-rename 原子寫fallback DefaultPreferencesauto-open toggle Wails 進程讀取Web UI 不碰此欄位 |
| 11-2 | US-1 AC-1.3 10 秒預算是否可達 | **已解決(由 R5-E 取代)** 整個問題被重新定義為60 秒總預算 + 階段化進度 + perceived performance」,不再是硬時間指標 |
| 11-3 | idle RAM 450 MB 是否可達 | **已解決**Architect 實測Wails + Go server + Python 275405 MB 達標悲觀估含瀏覽器 tab ~500 MB 50 MB但瀏覽器 tab 不在本指標範圍內已於 §6.1 clarify |
| 11-4 | N-R4 Mock CI / E2E 測試分層 | **懸置** Testing Agent 在測試計畫提出不需硬體的 UI 測試vs需硬體測試分層方案 |
| 11-5 | Web UI 要不要加常駐本機服務徽章 | **已解決:不加**Design Agent 決定改由 First-Run Step 1 歡迎頁一次性告知 Design review §D |
| 11-6 | Settings auto-open toggle 住哪裡 | **已解決**Design 仲裁採 PRD 原案 Wails 控制台 Settings menuDesign Spec v2 `v2/settings-update.md` 將同步修正 |
| 11-7 | R5-E 階段化進度 6 階段文案中英雙語定稿 | **懸置**R5-E5 使用者授權 Design Agent 決定最終在 Design Spec v2 wireframe 定版時由使用者審閱 override |
---
## 變更紀錄
| 版本 | 日期 | 作者 | 變更 |
|------|------|------|------|
| v2.0 | 2026-04-14 | PM Agent | R5 五輪決策重寫 Mock / URL 推論 / yt-dlp新增 Wails 控制台 + Server Offline Overlay + 首次自動開瀏覽器 + CORSffmpeg GPL blocker 解除為 LGPL 方案 B 混合Persona P3 降級US-1/US-2/US-5/US-6/US-7 重寫解除 R6新增 N-R1 ~ N-R4 風險完整差異見 §10 |
| v2.1 | 2026-04-14 | PM Agent | 吸收 Design 交叉審閱4 Major + 4 Minor+ R5-D1/D2/D3 + R5-E1E6(1) 首次啟動自動開」→「每次啟動自動開全文修正R5-D3(2) auto-open 平台預設 Linux OFFR5-D2(3) US-7 新增 AC-7.7 Server 崩潰時發 OS 原生通知R5-D1(4) §4 新增 N7 OS 通知N8 啟動階段化進度6 階段(5) **AC-1.3 從 10 秒硬指標改寫為 60 秒 + perceived performance + AC-1.3a/b/c/d 四條新驗收**R5-E1E6(6) US-2 明確日常啟動同樣 auto-openMinor 1(7) Offline Overlay 補齊 `role="alertdialog"` + focus trap + 不可關閉 + 純色卡片Minor 2(8) US-7 AC-7.3 / AC-7.6 Wails 控制台 Footer 持久警示 + Error state 三動作按鈕Minor 3(9) US-1 AC-1.4 First-Run 3 步縮為 2 + 稍後再設定略過Minor 4(10) §6.1 idle RAM 加不含瀏覽器 tab 註記 + Architect 實測佐證(11) §11 懸念 5 題結案 + 新增 11-6 / 11-7保留 11-4 CI 測試分層懸置 |