visionA/local-tool/.autoflow/02-prd/reviews/design-review-of-prd-v2.md
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

30 KiB
Raw Permalink Blame History

Design 交叉審閱 PRD v22026-04-14

審閱者Design Agent 審閱對象:/Users/jimchen/visionA/local-tool/.autoflow/02-prd/PRD-v2.md484 行) 對照基準Design Spec v203-design/design-spec-v2.md + 03-design/v2/*.md,共 1452 行子檔)+ R5 決策表 + R5-D 補充決策 本審閱使用繁體中文台灣用語


摘要3 行)

  • 總結論需小改(整體體驗面完整度 85%4 個 Major + 4 個 Minor
  • 發現問題數Major 4、Minor 4
  • 是否阻擋進開發⚠️ 部分阻擋。R5-D1/D2/D3 三題是使用者已做的決策PRD v2 沒完整吸收 → PRD 必須先修正 Major 13 才能進 M 級開發;其餘問題可在補充 FAQ / UX writing 階段處理

A. 使用者體驗完整性檢查

檢查項 檢查結果
US-1 首次啟動有無明確寫「每次啟動都會自動開瀏覽器」R5-D3Linux 預設 OFF 的差異處理有沒有寫? Major 1。PRD v2 §0 摘要、§4 N2、§5 US-1 全部沿用「首次啟動自動開瀏覽器」字面。R5-D3 已明確「每次啟動都自動開」PRD 必須把「首次」改為「啟動時自動開瀏覽器每次啟動都生效」。§6.3 / §4 也完全沒提 Linux 預設 OFF 的差異R5-D2
US-2 日常啟動:同上 ⚠️ Minor 1。US-2 AC-2.1 寫「≤ 5 秒」但沒明確寫「日常啟動時瀏覽器 auto-open 預設仍會發生」。AC-2.3 有提「若使用者關過 auto-open 則只開 Wails」這一條是正確的,但和 §0 的「首次啟動自動開」字面有矛盾
US-5 關閉 app:有無明確寫「關閉 Wails 視窗會觸發 Offline Overlay」文案是否清楚 通過。US-7 AC-7.5 + AC-7.6 有寫
US-6 上傳影片:副檔名是否正確寫 mp4/avi/mov/mpeg/mpg 通過。AC-6.2 正確
US-7 server 離線情境(新)Offline Overlay 是否正確描述?有沒有漏寫 Design Spec v2 的硬阻斷特性? ⚠️ Minor 2。§4 N3 寫「半透明覆蓋層」和「覆蓋層下方的 UI 凍結不可操作」。「半透明」這個措辭會誤導 Architect/Frontend — Design Spec v2 server-offline-overlay.md §ARIA 明確規定「卡片背景必須是純色(不是半透明),才能達到 4.5:1 對比」。PRD 的「半透明」只指 backdrop,不指訊息卡片本體。建議改為「全螢幕半透明 backdrop + 置中純色卡片」。不可關閉 特性也沒在 PRD 任何一條驗收標準出現(硬阻斷 + focus trap + role="alertdialog" 全部缺失)
§4 新功能「每次啟動自動開瀏覽器」R5-D3 Major 1(同上)
§4 新功能「Linux 預設 OFF 切換」R5-D2 Major 2。完全缺失。§4 N2、§6.3、§6.4、§8 任何一節都沒提這個跨平台差異。這會導致 Architect 不知道要在 config loader 做平台判斷
§4 新功能「Server 崩潰時除控制台 banner 外仍發 OS 通知」R5-D1 Major 3。PRD v2 AC-3.7 只說「插 USB 時不發原生 OS 通知」,但 R5-D1 是另一個情境server 崩潰)— 使用者明確決定「保留 OS 通知」。PRD v2 §4 / §5 US-7 完全沒寫Architect 如果只看 PRD 會以為「crash 時不用發通知」
§6 瀏覽器相容性Safari 攝影機警告、Edge/Chrome 推薦)是否明確? 通過。§6.3 寫法清楚,且 §US-5 AC-5.6 解釋了為什麼不走 getUserMedia(所以 Safari 沒有攝影機權限問題)
§6 i18n 中英雙語是否沒被砍? 通過。§4.1 明確保留
§6 Dark Mode 跟隨系統是否保留? 通過。§4.1 明確保留

A 區結論PRD v2 吸收 R5 主決策沒問題,但 R5-D 補充決策三題全部沒吸收(這是使用者後來加的三個決定)。這三題是 PRD v2 Major 等級的缺漏。


B. Design Spec v2 子檔對應檢查

Design Spec v2 子檔 PRD v2 對應章節 檢查結果
v2/control-panel.md §4 新功能 N1 Wails 控制台 + US-1 AC-1.3 / US-7 AC-7.3 覆蓋。但 PRD 沒有明確提到 Footer 的「持久警示文字」設計Design Spec v2 §4.6 control-panel.md 行 178。PRD 的 AC-7.6 只提 tooltip + confirm dialog遺漏 Footer 持久警示。見 Minor 3
v2/server-offline-overlay.md §5 US-7 + §4 N3 ⚠️ 覆蓋不完整。見 Minor 2硬阻斷 / 不可關閉 / focus trap 沒寫進 AC
v2/source-selector-update.md §5 US-6 + §4 砍除 #1/#3/#4 + §4 保留「批次影像上傳」 覆蓋
v2/first-run-update.md §5 US-1 + §4 砍除 #8 First-Run 模式選擇步驟 ⚠️ 遺漏。PRD 沒提「First-Run wizard 從 3 步縮為 2 步Design Spec v2 first-run-update.md 說明「砍模式選擇,只剩歡迎 / 偵測」)。開發階段 Frontend Agent 可能不知道要砍那一步。見 Minor 4
v2/settings-update.md §4 保留 Settings + §4 N2「自動開瀏覽器」toggle ⚠️ 位置矛盾。Design Spec v2 settings-update.md §1.1 表格把 auto-open toggle 放在「Web UI 裡的 Settings 一般 tabsidebar navigation 到 Settings 頁),但 PRD v2 §4 N2 和 §4.4 功能對照表把 Settings「自動開瀏覽器」放在 Wails 控制台兩個文件對這個 toggle 住哪裡意見分歧見 Major 4

B 區結論5 個子檔大致都有被 PRD 提到,但 Settings auto-open toggle 住哪裡 這個定位問題是 Design Spec v2 和 PRD v2 之間的實質分歧,這是 Major 等級的不一致。


C. 體驗紅線 / 缺漏

C.1 北極星指標的時間預算

PRD v2 §1.4 新北極星「≤ 5 分鐘從雙擊到瀏覽器第一幀推論」是正確更新,符合 Design Spec v2 的無摩擦設計(每次自動開瀏覽器)。

C.2 砍 Mock 後的 P3 fallback 體驗

Design Spec v2 v2/first-run-update.md 行 319320 + §Error state 有「偵測不到硬體 → 可略過進 Dashboard 空白狀態 + 引導文字」的設計。PRD v2 AC-1.4 確實有寫「沒插硬體顯示空白 + 提示文字」, 通過。但是 PRD 沒寫「使用者能不能按 Skip / 繼續」 — 意味 First-Run wizard 的 Step 2 「硬體偵測」是不是強制卡關?建議在 AC-1.4 補一句「First-Run Step 2 在無硬體情況下可按 稍後再設定 略過,進 Dashboard 空白狀態。」見 Minor 3

C.3 Server Crash 的錯誤處理體驗

Design Spec v2 v2/control-panel.md §5「Server Error 面板」有完整設計Error banner + 三個動作按鈕Restart Server / View log / Report。PRD v2 US-7 AC-7.3 只說「顯示 Error 狀態 + log panel 顯示錯誤」,完全沒提 Restart Server / View log / Report 三個動作按鈕。Architect 可能不知道要實作這三個動作。見 Minor 4(同時也是上面 Major 3 的配套)

C.4 關閉 Wails 視窗的 race condition

Design Spec v2 v2/control-panel.md 行 178「Footer 右側持久提示:⚠ Closing this window will stop the server. 12px muted」是一個重要的無需彈窗的被動警示設計。PRD v2 AC-7.6 只寫 tooltip / confirm dialog沒提 Footer 持久提示。兩者設計理念不一樣PRD 是「按下 Close 才顯示」Design Spec v2 是「始終可見」。前者體驗差,因為使用者按 Close 後可能直接盲目點「確定」Design Spec v2 行 182 已警告過這件事)。見 Minor 3(必須把 Footer 持久提示寫進 AC-7.6

C.5 Offline Overlay 的硬阻斷特性

如上面 Minor 2 所述,PRD v2 §4 N3 沒告訴 Architect

  • Overlay 是 role="alertdialog" + aria-modal="true" + focus trap
  • 不可被使用者手動關閉(只能靠重試成功 / reload
  • 卡片背景必須純色(不是 backdrop 的半透明)

這三條是 WCAG A11y 關鍵設計決策PRD v2 必須在 §4 N3 或 AC-7.1/7.2 補齊。


D. 對 PM 懸念 §11-5 的回答(常駐徽章)

PM 問題Web UI 要不要加一個「Server 是從 visionA-local 跑的」常駐徽章?

Design Agent 決定 不加(支持 PM 的傾向)

理由FAANG Senior Product Designer 視角):

  1. 視覺雜訊成本 vs 防誤解收益不對等。常駐徽章會佔用每一個瀏覽器畫面的固定像素(通常 3240 px但它防止的「誤以為是網頁服務」情境只在「使用者截圖給外部」的極小機率事件發生。以 FAE Arthur 為主要使用者,他自己知道這是 local app截圖給客戶時「自己加註解」比「產品永遠帶徽章」的 ROI 好太多。
  2. 資訊已由其他管道傳遞。瀏覽器網址列就是 http://127.0.0.1:3721,這是最權威的「這是本機服務」證據,而且是瀏覽器原生 UI設計成本 0。再加徽章是重複告知。
  3. 和設計語言衝突。Web UI 的設計語言shadcn + Tailwind + 淡色背景)追求資訊層級乾淨常駐徽章會像浮水印一樣破壞這個語言。Ollama Web UI / LM Studio / SD WebUI 都沒有這種徽章,這是業界慣例。
  4. 替代方案:如果 PM 仍擔心「使用者不知道這是本機服務」Design Spec v2 v2/first-run-update.md 的 Step 1歡迎頁可以加一句「你正在使用 visionA-local 的本機 Web 控制台」一次性文案,既不佔用永久視覺空間,又能在關鍵時刻傳達訊息。

建議 PM 在 PRD v2 §11-5 寫「不加常駐徽章Design 決定)。改由 First-Run Step 1 的歡迎文字一次性告知。」


E. 對 Architect Q6 的回答Overlay 關閉 tab 按鈕)

Architect 問題window.close() 在瀏覽器主動開的 tab 不能用UX 取捨)

Design Agent 決定 Offline Overlay 不設「關閉 tab」按鈕

理由

  1. 技術限制已確認。瀏覽器安全規範:window.close() 只能關閉window.open() 開的 tab。visionA-local 的 tab 是使用者手動開的(xdg-open / open / start 透過 OS 層開瀏覽器 → 瀏覽器建立新 tab不是 JS 開的 → window.close() 一律失效Chrome/Edge/Safari/Firefox 全部一致)。
  2. Design Spec v2 v2/server-offline-overlay.md 已經沒有這個按鈕(見行 3841 原型、行 8081 元件表)。目前只有兩個按鈕:
    • 重試連線Primary, lg
    • 了解更多 ↓Ghost, sm展開 help text
  3. 使用者的兩條恢復路徑都不需要「關閉 tab」按鈕
    • 路徑 A雙擊重開 appDesign Spec v2 行 142 已設計「Overlay 顯示期間 polling /api/health 每 3 秒」,使用者只要重開 app → 自動恢復 → Overlay 自動消失,不需手動關 tab。
    • 路徑 B不想用了:使用者直接按瀏覽器的 ⌘W / Ctrl+W / 點 tab 的 ✕,是瀏覽器原生操作,完全不需要 JS 協助。
  4. 「了解更多」展開 help text 已足夠。如果使用者真的困惑「為什麼按鈕關不了 tab」help text 裡補一句「要結束使用 visionA-local請直接關閉瀏覽器分頁 (⌘W / Ctrl+W)」就好。

建議 Architect 在 TDD v2 Q6 寫「Offline Overlay 不提供關閉 tab 按鈕Design 決定)。恢復路徑 A重開 app → auto recovery與路徑 B使用者自行 ⌘W已足夠不需 JS 介入。」

額外建議Design Spec v2 v2/server-offline-overlay.md 行 154157 的「了解更多」英文 / 中文 copy 應補一句「要離開本頁,請直接關閉瀏覽器分頁」。這是 Design 自己要補的 UX writing 後續項。


F. 臆測 / 誤解 / 超範圍清單

# 類別 位置 內容 處理建議
F1 誤解 R5-D3 §0 摘要點 5、§4 N2、§5 US-1 敘述 / AC-1.3、§10 變更追蹤 沿用「首次啟動自動開瀏覽器」字面,沒反映使用者 R5-D3「每次啟動都自動開」的決定 全文 replace「首次啟動自動開瀏覽器」→「啟動時自動開瀏覽器每次啟動
F2 遺漏 R5-D2 §4 N2、§6.3 瀏覽器相容性 沒寫 Linux 預設 OFF、macOS/Windows 預設 ON 的差異 §4 N2 補一句「平台預設macOS / Windows ONLinux OFFxdg-open 在極簡 WM 下行為不穩定R5-D2
F3 遺漏 R5-D1 §5 US-7 AC-7.3、§4 新增功能 Server crash 時使用者決定「保留 OS 通知」PRD 沒寫 §5 US-7 補 AC-7.7「Server 崩潰時,除控制台 Error banner 外,同步發一次 OS 原生通知macOS Notification Center / Windows Toast / Linux libnotifyR5-D1
F4 和 Design Spec v2 分歧 §4 N2 / §4.4 對照表 PRD 把 auto-open toggle 放在 Wails 控制台Design Spec v2 放在 Web UI Settings > 一般 tab 見 Major 4 的仲裁方案
F5 沒臆測新增功能 PRD v2 沒有超出 R5 範圍的功能(已確認) 通過
F6 Offline Overlay 描述失真 §4 N3 寫「半透明覆蓋層」可能誤導為整個 overlay 都半透明 補強為「半透明 backdroprgba(0,0,0,0.4-0.5)+ 置中純色卡片(光模式 color.surface)」

G. 問題清單

Major阻擋開發必須改

Major 1PRD v2 沒吸收 R5-D3「每次啟動都自動開瀏覽器」

  • 位置§0 §4 N2 §5 US-1 §10
  • 影響若不改Architect 會把「只在 firstRunCompleted === false 時 auto-open」寫進 TDD導致第二次啟動不自動開瀏覽器違反使用者決定
  • 修正PRD 全文去掉「首次」二字,改為「啟動時自動開瀏覽器(預設每次啟動生效)」

Major 2PRD v2 沒寫 R5-D2 Linux 平台預設差異

  • 位置§4 N2 / §6.3 / §6.5
  • 影響若不改Architect 會寫「三平台統一預設 ON」Linux 使用者第一次啟動會看到瀏覽器沒開、不知道發生什麼
  • 修正§4 N2 補平台預設表§6.3 瀏覽器相容性加一行「Linuxauto-open toggle 預設 OFF見 §4 N2」

Major 3PRD v2 沒寫 R5-D1 Server 崩潰仍發 OS 通知

  • 位置§5 US-7
  • 影響Architect 會以為「crash 時只顯示控制台 banner」違反使用者決定
  • 修正US-7 新增 AC-7.7 / AC-7.8:「崩潰事件同步發一次 OS 原生通知;只在前景切換回控制台時不重複發(去重策略由 Architect 在 TDD v2 決定)」

Major 4Settings auto-open toggle 住哪裡 — PRD 和 Design Spec v2 分歧

  • 位置PRD v2 §4 N2 / §4.4 vs Design Spec v2 v2/settings-update.md §1.1
  • 背景PRD 說住 Wails 控制台Design Spec v2 說住 Web UI Settings > 一般 tab
  • Design Agent 仲裁應該放 Wails 控制台PRD 是對的)。理由:
    1. auto-open 是 Wails 啟動時的行為,讀取 config 的時機點在 Wails main.go 啟動階段,那時 Web UI 還沒 loadconfig 必須被 Wails 進程讀到
    2. 使用者心智模型:「我要改 Wails 的行為 → 去 Wails 控制台改」比「我要改 Wails 的行為 → 去瀏覽器改」更直覺
    3. Design Spec v2 v2/settings-update.md 本節需要修正。這是 Design Agent 自己的文件錯位,我會在下一輪更新
  • 修正PRD v2 §4 N2 不用改原本就對Design Spec v2 v2/settings-update.md 下一輪迭代時改為「auto-open toggle 住 Wails 控制台的 Settings menu不住 Web UI」

Minor可在後續補不阻擋開發

Minor 1US-2 AC 沒寫清楚日常啟動時 auto-open 預設仍會發生

  • 位置§5 US-2 AC-2.1
  • 修正:在 AC-2.1 補一句「日常啟動時,若 Wails 控制台 Settings autoOpenBrowser === true,仍會自動開瀏覽器」

Minor 2Offline Overlay 的 A11y 硬阻斷特性沒寫進 PRD

  • 位置§4 N3 / §5 US-7 AC-7.1
  • 修正§4 N3 補「Overlay role="alertdialog" + aria-modal="true" + focus trap + 不可手動關閉(只能 retry 成功 / 重 loadAC-7.1 補「Overlay 無 ✕ 按鈕」

Minor 3US-7 沒寫 Wails 控制台 Footer 持久警示 + Error state 三個動作按鈕

  • 位置§5 US-7 AC-7.3 / AC-7.6
  • 修正:
    • AC-7.3 補「Error state 面板含 Restart Server / View log / Report issue 三個動作按鈕(見 Design Spec v2 v2/control-panel.md §5)」
    • AC-7.6 把「tooltip / confirm dialog」升級為「Footer 持久警示 + tooltip / confirm dialog 雙保險」

Minor 4US-1 沒寫 First-Run wizard 從 3 步縮為 2 步

  • 位置§5 US-1 敘述 / AC-1.4
  • 修正AC-1.4 補「First-Run wizard 只剩 Step 1 歡迎 + Step 2 硬體偵測,砍 Mock 模式選擇步驟R5-5aStep 2 在無硬體時可按 稍後再設定 略過進 Dashboard 空白狀態」

H. 通過 / 不通過 結論

不通過(需要先處理 Major 13 才能進下一步)。

Major 1/2/3 是使用者已做的決定被 PRD 漏寫,必須由 PM Agent 修訂 PRD v2 一次小版本v2.1),補齊三個 R5-D 決策。Major 4 Design 自己承諾下一輪修正 Design Spec v2(把 auto-open toggle 從 Web UI Settings 移到 Wails 控制台 Settings menuPRD v2 本身不用改。

Minor 14 可由 PM 在同一次 v2.1 修訂時順便補齊,或記入「未解決問題」清單在開發前補齊,不阻擋 M 級架構動工,但必須在 Architect 寫 TDD v2 之前補上,否則會再次發生文件間矛盾。

建議流程

  1. PM Agent 收到本 review → 產出 PRD v2.1,修正 Major 13 + Minor 14預估 20 分鐘)
  2. Design Agent 同時修正 Design Spec v2 v2/settings-update.mdMajor 4auto-open 位置更正)
  3. Architect 拿 PRD v2.1 + 更新後的 Design Spec v2 寫 TDD v2
  4. 三方再次互審後進 M 級開發

附錄:引用對照

  • R5-D1progress.md「R5-Design 補充」第 1 題 — 保留 OS 通知
  • R5-D2progress.md「R5-Design 補充」第 2 題 — Linux 預設 OFF
  • R5-D3progress.md「R5-Design 補充」第 3 題 — 每次啟動都自動開
  • Design Spec v2 v2/control-panel.md 行 77 / 178 — Footer 持久警示
  • Design Spec v2 v2/control-panel.md §5 — Error state 面板三個按鈕
  • Design Spec v2 v2/server-offline-overlay.md 行 3841 / 8081 / 203 / 216217 — Overlay 元件 + 硬阻斷 + focus trap
  • Design Spec v2 v2/first-run-update.md 行 24 / 5152 — auto-open 預設 ON、兩步 wizard
  • Design Spec v2 v2/settings-update.md §1.1 — auto-open toggle 位置(本文認定需修正)
  • PRD v2 §0 / §4 N2 / §5 US-1 / §5 US-7 — 以上被指出的段落

Design 第二輪審閱 PRD v2.12026-04-14

審閱者Design Agent 審閱對象:/Users/jimchen/visionA/local-tool/.autoflow/02-prd/PRD-v2.mdv2.1500 行) 對照基準:第一輪審閱(本檔 §A§H+ R5-D / R5-E 決策 + Design Spec v2.1 03-design/v2/startup-progress.md417 行6 階段已定版) 範圍:只審 v2.1 補丁差異,不重審 v2.0 未動章節 本審閱使用繁體中文台灣用語


摘要3 行)

  • 總結論 通過(不需第三輪 PRD 修訂;可直接進 M8 開發前 TDD v2 撰寫)
  • 第一輪 4 Major / 4 Minor 修復情況Major 全部修好4/4、Minor 全部修好4/4。R5-E1E6 全數正確落地進 US-1 AC-1.3 系列。
  • 是否阻擋 M8 不阻擋。第二輪只發現 1 個 Minor 文字殘留 + 1 個 Minor Linux skipped 狀態未在 PRD 提及(可由 TDD / Design Spec 側吸收,不需 PRD 再修)。

A. 第一輪 Major 修復檢查

第一輪 Major v2.1 修復位置 判定
Major 1 R5-D3「每次啟動自動開」 §0 §22 摘要點 5 改寫為「每次啟動都自動開」§0.1 補丁表 M1 明列 replace§2.1 P1 描述、§4 N2、§5 US-1 AC-1.6、§5 US-2 AC-2.1、§10 變更追蹤行 456 全部一致 修好
Major 2 R5-D2 Linux 預設 OFF §0 摘要點 5 + §4 N2 + §5 US-1 AC-1.6 + §5 US-2 AC-2.3 + §6.3 + §10 變更追蹤行 456 全部明確列出「macOS/Windows ONLinux OFF」+ 引用 R5-D2 + 引用 xdg-open 行為不穩理由 修好
Major 3 R5-D1 Server 崩潰 OS 通知 §5 US-7 新增 AC-7.7(行 275明寫「除控制台 Error banner 外,同步發一次 OS 原生通知」+ 平台對應Notification Center / Toast / libnotify+ 去重策略授權 Architect 在 TDD v2 決定§4 N7行 167也新增「Server 崩潰 OS 原生通知」功能條目 修好(同時於 US 與功能清單兩處落地,比第一輪要求更完整)
Major 4 auto-open toggle 位置 §4 N2行 162明標「auto-open toggle 住 Wails 控制台的 Settings menu (已與 Design 取得共識)§4.4 對照表行 179 同步§11-6 標 已解決 修好

A 區結論:第一輪 4 個 Major 全部修好,無殘留。


B. 第一輪 Minor 修復檢查

第一輪 Minor v2.1 修復位置 判定
Minor 1 US-2 沒寫日常 auto-open §5 US-2 AC-2.1(行 214改寫「日常啟動時若 Wails 控制台 Settings autoOpenBrowser === true仍會自動開瀏覽器和首次啟動行為一致R5-D3 / Design review Minor 1 修好
Minor 2 Offline Overlay 硬阻斷特性 §4 N3行 163A11y 硬阻斷特性role="alertdialog" + aria-modal="true" + focus trap + 不可由使用者手動關閉(無 ✕ 按鈕§5 US-7 AC-7.1(行 269也補「Overlay 無 ✕ 按鈕、不可手動關閉」+ 引用 Design review Minor 2§4 N3 同時補強為「全螢幕半透明 backdroprgba(0,0,0,0.4-0.5)+ 置中純色卡片」(解除 F6 措辭誤導) 修好
Minor 3 Footer 持久警示 + Error state 三按鈕 §4 N1行 161補完整段Footer 持久警示:右下角固定顯示 ⚠ 關閉此視窗會停止 Local Server12 px muted」+「Error state 面板log panel 上方浮動 banner 含 Restart Server / View log / Report issue 三個動作按鈕」§5 US-7 AC-7.3(行 271+ AC-7.6(行 274同步 修好
Minor 4 First-Run wizard 3 步→2 步 §5 US-1 AC-1.4(行 202「First-Run wizard 從 v1.2 的 3 步縮為 2 步砍模式選擇R5-5aStep 1 歡迎 → Step 2 硬體偵測。Step 2 在無硬體情況下可按 稍後再設定 略過」§10 變更追蹤行 459 同步登記 修好

B 區結論:第一輪 4 個 Minor 全部修好,無殘留。


C. R5-E 落地檢查v2.1 最大新增)

R5-E PRD v2.1 落點 判定
R5-E1 AC-1.3 改 60 秒 §5 US-1 AC-1.3(行 197改寫「全程 ≤ 60 秒R5-E1原 10 秒硬指標取消)... 採 Nielsen Norman perceived performance 原則」§11-2 標「 已解決(由 R5-E 取代)」 正確落地
R5-E2 階段化進度6 階段) §5 US-1 AC-1.3a(行 198「啟動全程顯示階段化進度6 階段,見 §4 N8每階段有編號 + 動作描述 + 視覺回饋spinner 或進度條)+ 中英雙語文案」§4 N8行 168同步新增完整功能條目 正確落地
R5-E3 20 秒 retry hint §5 US-1 AC-1.3b(行 199「任一啟動階段卡超過 20 秒UI 必須顯示『正在重試』或『這步比預期久』類提示,不可停留在白畫面或無變化狀態 正確落地
R5-E4 60 秒 Error state §5 US-1 AC-1.3c(行 200「總啟動時間超過 60 秒仍未進入『就緒』狀態Wails 控制台進入 Error state顯示『Restart Server』『View log』『Report issue』三個動作按鈕對應 §4 N1 / N6與 watchServer 3 次失敗後行為一致)」 正確落地(按鈕命名與 Design Spec v2.1 §3.7 完全一致)
R5-E5 階段文案 Design 決定 §4 N8 行 168 末句:「階段文案由 Design Agent 最終決定R5-E5§5 AC-1.3a 同樣引用§11-7 標「 懸置R5-E5 使用者授權 Design Agent 決定)」— 但 Design Spec v2.1 已經定版(見 §D 正確落地PRD 不列文字本身,授權 Design 主導)
R5-E6 WebSocket 就緒 §5 US-1 AC-1.3d(行 201「『瀏覽器就緒』的定義 = Web UI 建立 WebSocket 連線到 serverhub 收到第一個 client不是瀏覽器視窗出現時。不做新 endpoint、不做固定延遲R5-E6§4 N8 + §6.3「WebSocket 就緒偵測」一節(行 321同步 正確落地

C 區結論R5-E1E6 六項全部正確、完整落地進 PRD v2.1,且分布合理(功能條目 §4 N8 / 驗收標準 §5 AC-1.3 系列 / 非功能 §6.3 / 變更紀錄 §10 / 懸念 §11 都有同步),不會發生 Architect 漏看的情況。


D. PRD 與 Design Spec v2.1 一致性

對照 Design Spec v2.1 03-design/v2/startup-progress.md

對照點 Design Spec v2.1 PRD v2.1 判定
階段數量 6 階段§4 表格) §4 N8 + AC-1.3a 都明寫「6 階段」 一致
階段順序與名稱 1 初始化控制台 / 2 檢查 Python / 3 啟動 server / 4 偵測裝置 / 5 開瀏覽器 / 6 等待 Web UI 連線 §4 N8 順序:「初始化控制台 → 檢查 Python → 啟動 server → 偵測裝置 → 開瀏覽器 → 瀏覽器就緒」 一致PRD 第 6 階段稱「瀏覽器就緒」Design Spec 稱「等待 Web UI 連線」語意對齊不衝突Design 為 ground truth
Error state 三按鈕命名 重試 / Retry檢視 log / View Log回報問題 / Report Issue AC-1.3c「Restart Server / View log / Report issue」AC-7.3:「Restart Server / View log / Report issue ⚠️ Minor 5PRD 把第一顆按鈕寫成「Restart Server控制台原本既有的按鈕命名Design Spec v2.1 §3.7 行 219 寫「重試 / Retry」(重置進度面板,重新跑階段 1兩者語意不同Restart Server 是重啟 server 子程序、Retry 是重置啟動流程跑階段 1。建議 PRD 在 AC-1.3c 與 AC-7.3 統一為「Retry / 重試」(與 Design Spec v2.1 一致),或請 Architect 在 TDD v2 決定兩個是否合併為同一動作。不阻擋開發,但 TDD 必須仲裁。
60 秒總預算 §3.7 + §1R5-E4 AC-1.3 / AC-1.3c 一致
20 秒卡住 hint §3.6 + §2.2 wireframe AC-1.3b 一致
WebSocket = ready 訊號 §4 階段 6 完成條件 AC-1.3d + §4 N8 一致
Linux 階段 5 跳過 / 階段 6 manual hint Design Spec v2.1 §4.1「階段 5 Linux/Settings OFF 情境:pending → skipped」+「階段 6 Settings OFF 情境description 改為 請點擊控制台的「在瀏覽器開啟」按鈕 PRD v2.1 §4 N2 / §6.3 / §5 AC-1.6 / AC-2.3 都有寫 Linux 預設 OFF 與「使用者可手動按 Open in Browser」但**沒明寫階段化進度面板在 Linux 下「階段 5 跳過 + 階段 6 改 manual hint」**這個細節 ⚠️ Minor 6:缺 Linux 路徑下的階段面板行為描述。但這純屬實作層細節Design Spec v2.1 已是 ground truthFrontend 看 Design Spec 即可。不阻擋、不需 PRD 修訂
Reduced motion / WCAG 4.5:1 Design Spec v2.1 §6 PRD v2.1 §6.4 / §4 N3 已寫卡片純色 4.5:1未提 startup panel 的 reduced-motion但這已超出 PRD 顆粒度 可接受(細節由 Design Spec 與 TDD 承擔)

D 區結論:核心一致,唯一需要警示的是 Minor 5按鈕命名分歧TDD v2 必須仲裁。


E. §11 懸念狀態核對

# v2.1 標示 第二輪判定
11-1 preferences 落點 已解決 確認
11-2 AC-1.3 10 秒可達 已解決(由 R5-E 取代) 確認
11-3 idle RAM 450 MB 已解決 確認
11-4 N-R4 CI/E2E 分層 懸置 → Testing 維持懸置(屬於 Testing 範疇,不阻擋 PRD
11-5 常駐徽章 已解決:不加 確認
11-6 auto-open toggle 位置 已解決Wails 控制台 確認
11-7 R5-E 階段文案定稿 懸置 🟡 可改為 已解決 — Design Spec v2.1 §4 已定版 6 階段中英雙語文案zh-TW + en且使用者已授權 Design 決定R5-E5。建議 PRD 下次小修時把 §11-7 改為 並指向 03-design/v2/startup-progress.md §4 / §7不阻擋

E 區結論懸念狀態合理§11-7 可以順手結案但非必要。


F. 第二輪新發現問題

Major阻擋

Minor不阻擋建議交 TDD / Design Spec 階段順手處理)

# 標題 位置 修正建議 接手者
Minor 5 Error state 第一顆按鈕命名分歧Restart Server vs Retry PRD §5 AC-1.3c / AC-7.3 vs Design Spec v2.1 §3.7 TDD v2 仲裁兩個動作是否合併。建議Startup Error 階段用「Retry重置進度重跑階段 1」、Running 階段 watchServer 失敗用「Restart Serverkill + 重 spawn server 子程序)」,是兩個獨立動作 ArchitectTDD v2
Minor 6 PRD 未描述 Linux/auto-open OFF 情境下啟動進度面板的階段 5 skipped + 階段 6 manual hint 行為 PRD §4 N8 / AC-1.3a 不需修 PRDFrontend 依 Design Spec v2.1 §4.1 實作即可 FrontendM8 開發)
Minor 7極輕微 §變更紀錄行 499 v2.0 那一列仍寫「首次自動開瀏覽器」 PRD 行 499 純歷史紀錄、非生效規格,不需修

G. 第二輪通過 / 不通過 結論

通過

理由

  1. 第一輪 Major 4/4 + Minor 4/4 全部修好,無殘留。
  2. R5-E1E6 六項全部正確落地分布合理功能、AC、非功能、變更紀錄、懸念全部同步
  3. 與 Design Spec v2.1 startup-progress.md 主要一致唯一分歧Error state 按鈕命名 Minor 5屬於語意層差異由 TDD v2 仲裁即可。
  4. §11 懸念狀態合理§11-7 可順手結案但非必要。
  5. PRD v2.1 控制在 500 行,符合文件管理策略;模組化結構未被破壞。

不需第三輪 PRD 修訂。建議流程:

  1. PRD v2.1 凍結,進入 M8 開發前 TDD v2 撰寫
  2. Architect 撰寫 TDD v2 時:
    • 仲裁 Minor 5 Error state 按鈕命名Retry vs Restart Server
    • 接手 Minor 6 細節Frontend 依 Design Spec v2.1 §4.1 實作 Linux 路徑)
    • 接手 R5-D1 OS 通知去重策略PRD 已授權)
  3. Design Agent 同步:
    • 確認 v2/settings-update.md 已修正 auto-open toggle 位置Major 4 後續)
    • startup-progress.md §4 6 階段文案定版告知 PM請 PM 在下次小修時把 §11-7 改

對 M8 開發的訊號🟢 GO。