visionA/local-tool/.autoflow/01-requirements/pm-analysis-round2-refactor.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

36 KiB
Raw Blame History

PM 第一輪分析 — visionA-local 方向變更2026-04-14

作者PM Agent 性質:第一輪分析筆記,非正式 PRD 修訂 觸發事件:使用者在 M7 收尾階段提出三項重大方向變更 對應使用者訊息:「推論只需包含 camera / image / video upload」「模型只預設 + 只能上傳」「介面希望是網頁不是包在應用程式中」「Wails 負責顯示 server log / 啟停重啟 / 打開 localhost 網頁」


摘要3 行)

  1. 這是一個 L 級變更,不是 S 級:三項變更疊加起來等於把 visionA-local 從「Wails 內嵌式桌面 app」重新定位為「Ollama / LM Studio / Stable Diffusion WebUI 式的 server 管理器 + 獨立 web UI」PRD 第 1 章(定位)、第 2 章(使用情境)、第 4 章(功能清單)、第 6 章(非功能需求)、第 8 章(風險)全部要改,競品類比也要換。
  2. 最大的哲學衝突:原 PRD 的 北極星指標是「內部 FAE 在客戶現場 5 分鐘內跑出第一次推論 ≥ 95%」,現在多一步「要使用者先在桌面 app 按 Start Server → 再點 Open Browser → 瀏覽器才看到 UI」這對「零摩擦 3 分鐘 demo」體驗是退步而非進步PM 必須先釐清使用者動機,否則會做出一個「技術上更乾淨、但使用體驗更差」的產品。
  3. 目前開發階段是最糟的時機點M1-M6 已經做完dmg 220MB 可跑M7 Windows build 在收尾。此時做這種方向轉彎代價很高——前端 Sidebar / 4 主導航 / Workspace / Settings 全部要重新思考「誰住在 Wails 裡、誰住在瀏覽器裡」。但如果使用者的動機夠強(見 C1延後改比現在改更貴。必須先釐清動機再做決定,不要為了「使用者說了就做」而跳過第一輪分析

A. 變更解讀

A1. 影片來源變更(砍 URL / yt-dlp

新要求:推論只包含 camera / image / upload 影片(avi, mpeg, mp4 瀏覽器能吃的格式)

PM 解讀

  • 使用者明確砍掉 /api/media/urlYouTube / yt-dlp 相關)。
  • 「瀏覽器能吃的格式」是一個關鍵措辭——暗示使用者的 mental model 從「我用桌面 app 解影片」轉向「我用瀏覽器播影片」。這跟 A3 介面變更是同一件事的兩面。
  • 但這裡有個語意陷阱:瀏覽器能播的 <video> 格式(主要是 MP4 H.264/AAC、WebM VP9/Opus、Ogg不等於 Kneron 推論管線能吃的格式。推論仍然需要 ffmpeg decode 成 frame 餵給模型。使用者可能沒意識到這一點。這題必須回去澄清(見 C1
  • 原本 /api/media/upload/video 已經在保留清單,所以「上傳影片」不是新功能,真正被砍的只是 URL 模式

影響範圍(具體):

  • 後端:POST /api/media/url 整個 endpoint 拔掉;server/internal/media/url_handler.go 或類似檔案整包刪。
  • Bundleyt-dlp 35MB 可以拔掉dmg 從 220MB 降到約 185MB符合 6.2 節 macOS ≤ 220MB 的原目標值(目前是壓著上限走)。這是個體積紅利
  • 前端:媒體上傳頁面的「URL 貼上」輸入框、「從 YouTube 下載」tab、相關 Loading 狀態(對應 recent commit a6b71ea fix(local-tool): URL 影片載入提示「正在解析,請耐心等待」)全部拔掉。
  • 授權宣告:4.8 第三方授權宣告的 yt-dlp 條目可以移除LICENSE-yt-dlp.txt 不用打包。
  • RiskP2FAE 不知道有新版)不受影響;但原 R11發佈通路如果本來要放 yt-dlp 需要高流量下載則壓力降低。

還沒確認的疑問

  • 「camera / image / upload 影片」這個措辭漏掉了批次影像 POST /api/media/upload/batch。使用者是忘了、還是也要砍?(見 C2
  • 砍 URL 模式是否連帶砍 US-8User Story我傾向砍但要使用者確認。

A2. 模型管理變更(只預設 + 只能上傳)

新要求:模型除了預設的幾種只能用上傳的。

PM 解讀

  • 現況:預設 8 個 .nef73MB 內嵌)+ 支援使用者上傳自己的 .nef。
  • 新要求:跟現況幾乎一樣,重點是明確否定「從 URL / Model Zoo 下載」這類未來可能性
  • 這有兩個可能讀法:
    • 讀法 A保守:使用者只是確認「不要做 Model Zoo / 遠端下載功能」,目前的預設 + 上傳就是最終狀態。
    • 讀法 B更激進:使用者可能想重新檢視預設清單——是要維持 8 個?還是想精簡到 3-4 個最有代表性的?
  • 傾向讀法 A,因為原 PRD 本來就沒規劃 Model Zoo這句話更像是「再次確認非目標」而非新增要求。但要回去跟使用者確認見 C3

還沒確認的疑問

  • 使用者上傳 .nef 後,是否需要命名、分類、加說明文字、刪除?原 feature-inventory model-upload-dialog 應該已經涵蓋,要請前端 lead 回看現況。
  • 預設模型的「重置」按鈕是否需要?(使用者不小心刪掉預設模型後能不能還原)

影響範圍

  • 若讀法 A 正確,這項變更幾乎不影響程式碼PRD 只需在 4.1 / 4.2 / 4.5 章節明確寫「只預設 + 只上傳,不支援任何形式的遠端模型下載」,並把它列入第 3 章非目標。
  • 若讀法 B 正確,需要重新評估預設模型清單,但這是 Architect / KneronPLUS 範疇的事。

A3. 介面架構巨變Wails 內嵌 → Wails server 控制台 + 瀏覽器 UI

這是最大的、最需要深挖的變更。

新要求(逐字擷取):

我想像中的是 visionA local 安裝完 啟動後 應用程式介面會有可以顯示 local server log 的地方 有可以啟動/停止 重啟 local server 的介面 有打開 localhost 網頁的介面 網頁上會有 scan/connect device 的介面 選模型/上傳模型 推論的介面

PM 解讀 這實質上是把 visionA-local 從「Wails webview 直接顯示 Next.js UI」退化成**「兩個 app」**

  1. Wails 桌面 appserver 控制台):只負責
    • 顯示 Go server 的 stdout / log類似 Docker Desktop 的 Logs 面板)
    • 啟動 / 停止 / 重啟 local server 的按鈕
    • 「Open in Browser」按鈕點了開瀏覽器到 http://localhost:{port}
    • 可能還要顯示server 狀態running / stopped / error、port 號、資料目錄路徑、版本號
    • 不顯示推論 UI
  2. 瀏覽器網頁(真正的 UI:跟現在的 Next.js 前端幾乎一樣(但要適應沒有 Wails bridge 的情況)
    • Scan / Connect Device
    • 選模型 / 上傳模型
    • 推論camera / image / video upload

這是什麼定位?競品類比換人

  • 原本的類比:Photo Booth、Kneron 官方 demo app——桌面 app打開就用。
  • 新的類比:Ollamaserver 跑在背景 + 獨立 web UI / CLI、LM Studio有桌面 app 也有 server 模式、Stable Diffusion WebUI點 bat 啟動 + 瀏覽器打開 127.0.0.1:7860、Docker Desktop桌面 app 只管 daemon真正的操作在 CLI / Dashboard
  • 這個類比轉換會影響所有對外文案
    • 原本「裝起來就能跑」→ 現在更像「一鍵起 local server用瀏覽器操作」。
    • 原本「像一般桌面 app」→ 現在更像「像 Ollama 一樣輕量伺服器」。

為什麼使用者會這樣想PM 的猜測(必須回去問,見 C1 我沒有資料支持,只能猜。列出可能動機讓使用者確認:

# 可能動機 我的評估
a 想要多視窗 / 多分頁,一邊看推論結果一邊看裝置管理 合理。Wails 單視窗架構確實限制了這件事
b 想要瀏覽器的開發者工具inspect / network / console除錯方便 合理。Wails webview 也能開 devtools 但比瀏覽器難找
c 想要分享 localhost 連結給同網段其他人(例如客戶的手機開 http://192.168.1.10:port 看 demo 高度懷疑這一點——原 PRD 6.6 明確寫「絕對不 bind 0.0.0.0」。若這是動機,等於安全模型也要改
d 不想被 Wails 視窗鎖住——想讓 server 在背景跑、瀏覽器關掉也沒差,下次要用再開瀏覽器 合理。這是 Docker Desktop / Ollama 的體驗
e 熟悉瀏覽器操作習慣 合理但薄弱。單一動機不足以支撐這種大改
f 想要能用手機 / 平板當第二螢幕看推論(同上 c 同 c安全模型風險
g 看不慣 Wails webview 的某些 bug(例如 splash regression見 progress.md M7 合理。但這是解 bug 不是改架構
h 想把 web UI 獨立出來,未來可能部署到別處(不綁 Wails 合理長期考量,但目前內部工具用不到
i 單純覺得「server + web UI」架構比較乾淨 工程師審美考量PM 角度會挑戰

不同動機導出不同產品方向——a, b, d, g 導向「架構輕度重整,還是桌面 app 為主」c, f 導向「server 要能被同網段連線安全模型大改」h 導向「web UI 要獨立可部署,跟 Wails 解耦」。必須先知道是哪一個,不能一把梭

PM 的擔憂(一個句子)

這個變更方向在技術上更乾淨,但在使用者體驗上可能是退步——因為它把原本「雙擊 app → 看到 UI」的 1 步流程變成「雙擊 app → 按 Start → 按 Open Browser → 看到 UI」的 3 步流程,違反 P1 Persona Arthur 的核心願望「不要為了環境浪費客戶時間」。

A3.5 多使用者情境:其他使用者是 FAE 還是外部客戶?

第四輪決策是「內部工具」,所以沒處理「分享給外部」。但 A3 如果動機是 c分享 localhost 給同網段),會把產品定位從「內部 FAE 個人工具」推向「內部 FAE 向客戶 demo 的 server」這會改變威脅模型

  • 內部 FAE 個人工具:威脅模型 = 本機127.0.0.1 + 無認證即可)
  • 向客戶 demo 的 server威脅模型 = 區網(可能需要密碼 / token / 限制連線 IP / HTTPS 自簽)

B. 影響範圍

B1. PRD 要改的章節(按影響嚴重度排序)

章節 子檔案 變更性質 嚴重度
1. 產品策略與定位 strategy.md 重寫。競品類比從 Photo Booth 換成 Ollama / LM Studio價值主張要重述「本機 server + 瀏覽器 UI」而非「桌面 app」北極星指標的 5 分鐘門檻是否還合理需要重評 🔴
2. 目標使用者與使用情境 user-research.md 修訂 + 重寫 US。US-1第一次安裝驗收標準 AC-1.3 要加「App 啟動後顯示 server 控制台」US-2 / US-3 / US-4 / US-5 全部要重寫流程(因為真正操作在瀏覽器而非 Wails 視窗US-6 原本已砍US-7上傳影片要保留但砍掉 URLUS-8 砍掉User Journey Map「第一次成功」階段要重畫 🔴
3. 產品願景與非目標 vision-and-non-goals.md 補充非目標。明確寫「不支援遠端模型下載 / Model Zoo」「不支援影片 URL 推論 / yt-dlp」「不 bind 0.0.0.0(除非使用者確認 A3 動機 c/f 🟡
4. 功能清單與 API 對照 features/feature-inventory.md 大幅修訂。4.1 API/api/media/url4.2 前端路由重新切分「Wails shell 顯示什麼 / 瀏覽器顯示什麼」4.3 元件:把 cluster UI、relay-token-sync 一樣明確刪,同時新增 server 控制台元件start/stop 按鈕、log viewer、open browser 按鈕4.5 新增功能表加「server 生命週期控制面板」4.6 要刪的檔案:加 yt-dlp 相關4.8 授權宣告:刪 yt-dlp 條目 🔴
5. 使用者流程 features/user-flows.md 重寫。First-Run / 日常使用 / 離開的流程都要重寫Wails app 變成 server 管理器,使用者第一次啟動要引導「點 Open Browser」 🔴
6. 非功能需求 nonfunctional.md 修訂量化值。6.1 首次推論時間要拆得更細Wails shell 啟動 / server 啟動 / 瀏覽器開啟 / 第一幀6.2 安裝檔大小目標可以降低yt-dlp 35MB 拔掉6.6 安全性需求要根據 A3 動機c/f決定是否改 bind IP6.8 主題跟隨系統這一條在瀏覽器中是「跟隨使用者 OS prefers-color-scheme」而非「Wails webview 繼承 OS」 🔴
7. 發佈與交付策略 release-strategy.md 輕微影響。dmg 變小、發佈說明要寫「啟動後點 Open Browser」 🟢
8. 風險與相依性 risks.md 新增風險。見 D 章 🟡

B2. 要砍的功能(具體清單)

# 項目 出處 動作
1 POST /api/media/url endpoint feature-inventory.md 4.1 刪除
2 yt-dlp 內嵌35MB feature-inventory.md 4.8 / progress.md M6-2 從 vendor / payload / installer 全部拔掉
3 前端「URL 貼上」UI frontend/src/app/media/ 或類似 刪除
4 US-8YouTube / URL 推論) user-research.md 2.3 刪除
5 授權宣告中的 yt-dlp 條目 feature-inventory.md 4.8 刪除
6 「模型從 URL 下載」類功能(若存在) 需確認 確認無後標為非目標
7 (待確認) Wails webview 內嵌 Next.js 前端的架構 server/main.go + Wails config 改為只 serve server 控制台介面
8 (待確認) Wails 首頁 iframe / navigate 到 Next.js build 同上 改為 server 控制台 UI

B3. 要重寫的 user story

US 原標題 變更性質
US-1 第一次安裝 大幅重寫。AC-1.3「安裝完成後系統中出現 app icon」不變但要加 AC-1.7「第一次開啟 app 看到 server 控制台,不是 Dashboard」AC-1.8「控制台有明確引導『按這裡在瀏覽器打開 UI』」
US-2 Mock 模式試玩 重寫。進入 Mock 模式的入口從「First-Run 選擇 Mock」變成「先在控制台啟動 server選 Mock 模式) → 開瀏覽器 → 看到 Mock UI」
US-3 連實體 Kneron 裝置 中度重寫。偵測流程不變,但「看到裝置」的 UI 在瀏覽器,不在 Wails 視窗。邊緣情況若瀏覽器沒開USB 插入事件要不要 push 到 Wails 控制台 toast
US-4 切換 / 上傳模型 中度重寫。「拖放 .nef 到視窗任何地方」—— 哪個視窗Wails 控制台?瀏覽器?兩邊都要?這是體驗面 Design 要回答的關鍵問題(見 E 章)
US-5 跑即時攝影機推論 中度重寫。Workspace 頁在瀏覽器。這裡有個瀏覽器特有的新限制:瀏覽器 navigator.mediaDevices.getUserMedia() 取 webcam 需要 HTTPS 或 localhost目前 localhost 勉強可過但 Chrome 可能提示 permission跟原 Wails 直接走 Go + AVFoundation / DirectShow 的模型不同。這是關鍵技術風險(見 E 章)
US-7 上傳影片 / 圖片做離線推論 輕微修訂,格式限定「瀏覽器能吃的」
US-8 YouTube / URL 推論 砍掉
US-9 查看 server 日誌 升級。原本是 Settings 進階分頁的次要功能,現在變成 Wails 控制台的一級功能,要獨立一個 AC

B4. 原本架構中「為了 Wails 內嵌」做的設計(請 Architect 補完整清單)

PM 只能從 PRD / progress.md 看到的表層:

  1. server/web/out 內嵌M1 收尾的 build-embed target把 Next.js frontend/out 同步到 server/web/out,再 embed 進 Go binary。這個設計在新架構下仍然有效——但要考慮 Wails 控制台是用什麼技術?是 Wails 自己的 UIGo template / Wails 原生 webview 顯示一個極簡 HTML還是另一份 Next.js build
  2. Wails /ipc/raise endpoint + wails-ipc-port 檔案M7 L-3原本用來讓 server 崩潰後可以叫回 Wails 視窗。新架構下這個還有意義嗎server 崩潰時需要通知的是——Wails 控制台?還是瀏覽器?兩邊?
  3. Single-instance 保護PRD 5.5,第四輪決策):使用者第二次雙擊 app 時 raise 既有視窗。新架構下 single-instance 還是要做,但 raise 什麼——Wails 控制台?還是 focus 既有的瀏覽器 tab瀏覽器 tab focus 跨瀏覽器很難做)
  4. ⌘Shift+R 重啟服務(第四輪 R4-6這個快捷鍵是給 Wails webview 用的。新架構下快捷鍵要住在哪——Wails 控制台用 Wails menu bar瀏覽器網頁如果要也要的話得自己用 JS 監聽(還會被瀏覽器預設快捷鍵衝突)。
  5. Mock 模式的 sidebar 標記 / 主視窗標題列標記4.5現在「主視窗」有兩個——Wails 控制台、瀏覽器 tab。兩邊都要標嗎
  6. Wails tray 已砍、改用主視窗 menu bar(第三輪 Q-A新架構下 menu bar 屬於 Wails 控制台。那「上傳模型」這種動作,從 Wails menu bar 按下去是要直接處理,還是要切到瀏覽器?
  7. Fatal 原生對話框L-2這個維持有效。
  8. First-Run 歡迎流程在哪:原本是 Wails webview 載入 Next.js 前端的第一個畫面。新架構下——是 Wails 控制台放一個「首次啟動引導」(講解控制台怎麼用),還是瀏覽器打開後才看到 First-Run跟以前一樣還是兩邊都要Wails 講控制台、瀏覽器講功能)?

請 Architect 補充: 現有 local-tool/server/main.go、Wails wails.json、前端 next.config.js 裡面哪些設定是為了內嵌架構而存在、新架構下哪些要改、哪些可以直接沿用。


C. 待使用者決策的問題

每題都是「必須先問才能繼續」——不是可以延後的。

C1. 🔴【最關鍵】介面架構變更的動機是什麼?

為什麼問A3 章列出 9 種可能動機a ~ i每一種導向不同的產品方向。不問清楚就做會做錯。

選項

  • A:多視窗 / 多分頁的便利性(可以一邊看推論、一邊看裝置)→ 方向是「架構輕度重整Wails 只是 server 生命週期管理器UI 主體仍在本機瀏覽器,127.0.0.1 不變
  • B:想要瀏覽器開發者工具 / 熟悉瀏覽器操作 → 同 A方向相同
  • C:要分享 localhost 給同網段的其他裝置(客戶的手機、平板)→ 方向是「架構重整 + 安全模型大改 + 要加認證 / token / IP 限制」這會是另一個 L 級工作
  • D:想讓 server 在背景跑、瀏覽器關掉也沒差,下次要用再開瀏覽器 → 同 A方向相同但要加「視窗關閉不終止 server」
  • E:單純看不慣 Wails webview 的某些 bug例如 splash 問題)→ 建議不要為此改架構,先解 bug
  • F:想讓 web UI 可獨立部署(未來不綁 Wails→ 方向是「把 web UI 做得跟 Wails 完全解耦,未來可以 deploy 到別處」
  • 其他 / 混合:請使用者直接說

PM 建議

我強烈建議使用者選 A / B / D或混合理由是這三種動機都能在不改安全模型的情況下達成,改動範圍可控。

如果選 C 或 F我會要求暫停 M7 Windows build,重新開一輪三方聯合討論,因為這相當於改變產品的核心定位。

如果選 E我會直接挑戰使用者:解 bug 比改架構便宜一個數量級,先把 bug 修掉再說。

C2. 🟡「camera / image / 上傳影片」有涵蓋批次影像上傳嗎?

為什麼問:原 /api/media/upload/batch(批次多張圖片上傳)在 feature-inventory 是保留的,新要求措辭漏掉。

選項

  • A:保留批次上傳(一次處理多張圖片)
  • B:砍掉,只保留單張圖片 + 單支影片
  • C:保留但降級為 Phase 2

PM 建議

保留(選 A。批次上傳是既有功能砍掉無理由對 FAE 用批次跑回歸測試有價值。

C3. 🟡 模型管理:「只預設 + 只能上傳」的解讀是 A 還是 B

為什麼問:見 A2 章節。

選項

  • A:維持現況的 8 個預設 .nef + 使用者上傳,只是確認「不要做 Model Zoo / 遠端下載」
  • B:重新評估預設清單,可能精簡到 3-4 個
  • C:把預設也砍掉,只留上傳

PM 建議

選 A。原 PRD 本來就沒規劃 Model Zoo這句話更像是再次確認非目標。選 B 會增加決策成本(「要留哪 3 個?」),選 C 會破壞 Mock / 即時體驗Persona P3 Solution Architect 的 demo 場景沒模型就完蛋)。

C4. 🔴 Wails 控制台的 scope 究竟有多小?

為什麼問:使用者說「顯示 log」「啟動/停止/重啟」「打開 localhost」這是最小集合。但還有很多「邊緣功能」不知道要不要也住在 Wails 控制台:

選項(每項都要獨立回答):

功能 要住在 Wails 控制台嗎? PM 預設建議
顯示目前 server port 是(使用者需要知道 URL 是 127.0.0.1:XXXX
顯示資料目錄路徑macOS ~/Library/Application Support/visiona-local/ 是(除錯時常用)
顯示版本號 / 建置資訊
顯示 server 狀態running / stopped / error
Mock 模式切換按鈕 待決定 ⚠️ Mock 是 server 模式,不是業務模式,住控制台合理)
硬體偵測結果(已接上幾台 Kneron 待決定 ⚠️ 不要(屬於業務資訊,住瀏覽器 UI
上傳模型 待決定 ⚠️ 不要(業務功能)
匯入 / 匯出設定 待決定 ⚠️ 是(屬於「工具維護」)
清除 log / 查看歷史 log 檔 待決定 ⚠️
第三方授權宣告 About 待決定 ⚠️ Wails About 對話框)
Settings > 一般 / 語言 待決定 ⚠️ 不要(屬於瀏覽器 UI 的 Settings 頁)
崩潰後的原生對話框通知

請使用者逐項確認,或直接接受 PM 建議。

C5. 🔴 Wails 視窗關閉行為

為什麼問:原 PRD Q7 決定「關閉視窗 = 結束程式」(所以砍 tray。新架構下這個語義要重新定義因為現在視窗關閉影響兩個東西server、瀏覽器 UI。

選項

  • A:關閉 Wails 控制台 = 停 server = 瀏覽器 UI 失效。最簡單。但使用者若關了控制台忘了 server 還在跑,不會發生這種狀況。
  • B:關閉 Wails 控制台 ≠ 停 server。關閉後 server 仍在背景跑,下次重開 Wails 控制台 attach 回去。像 Docker Desktop。但在 macOS / Windows / Linux 實作有差異,且 single-instance 保護要重寫。
  • C:關閉 Wails 控制台時彈確認對話框問使用者「要不要一起停 server」。

PM 建議

初步偏 A最簡單,除非使用者在 C1 選了動機 D想讓 server 在背景跑)。若選 D 則必須是 B。

這題的決定直接影響 B4 第 3 項 single-instance 設計。

C6. 🟡 使用者要不要有機會直接雙擊開瀏覽器(不經過 Wails 控制台)?

為什麼問:既然 UI 在瀏覽器,使用者其實不需要每次都打開 Wails 控制台——他可能想要像 Ollama 那樣「server 背景跑著,直接打開 http://localhost:XXXX」。但這跟 C5 的 B 方案強相關。

選項

  • A:必須先開 Wails 控制台Wails 控制台負責起 server然後才能用瀏覽器
  • B:提供 macOS 的 LaunchAgent / Windows 的啟動項 / Linux systemd user unit讓 server 可以背景常駐(類似 Docker Desktop / Ollama
  • C:不背景常駐,但提供 CLI 啟動模式(使用者可以自己 open -a visiona-localvisiona-local serve

PM 建議

A + 未來考慮 C。這是 MVP先把最小路徑做對。背景常駐會引入 autostart / tray / 開機啟動等一整套複雜度(而 tray 才剛被砍)。

C7. 🟡 瀏覽器選擇:使用者預設瀏覽器 or 指定 Chromium-based

為什麼問webcamUS-5在 Safari / Firefox / Chrome 的權限流程和支援度不同。攝影機 overlay 效能也不同。

選項

  • A:用使用者的 OS 預設瀏覽器Safari on macOS / Edge on Win / Firefox / Chrome 依系統設定)
  • B:強制 Chrome / Edge 系列,其他瀏覽器警告
  • C:內嵌 Chromium如 Electron但整包會變很大 100MB+

PM 建議

A 但在 README / First-Run 控制台提示「推薦 Chrome / EdgeSafari 可能有攝影機權限限制」。選 C 違反整個 MVP 的瘦身原則dmg 會從 220MB 變 400MB+)。

C8. 🔴 Wails 控制台的首次啟動引導如何設計?

為什麼問:原 PRD 的 First-Run 流程(歡迎 → 選擇模式 → 硬體偵測)是長在 Next.js 前端裡的。新架構下這個流程要搬家——是搬去 Wails 控制台、還是維持在瀏覽器但等「使用者第一次開瀏覽器」才看到?

選項

  • A:整套 First-Run 仍在瀏覽器端Wails 控制台的首次啟動只是提示「按 Start Server 然後按 Open Browser」
  • BFirst-Run 拆成兩段Wails 控制台引導「怎麼用這個控制台」,瀏覽器端引導「怎麼用 visionA-local 的功能」
  • CFirst-Run 整套搬到 Wails 控制台,瀏覽器打開後直接進 Dashboard

PM 建議

A。Wails 控制台是次要視窗,不應該搶 First-Run 戲份。但要確保「按 Open Browser 後」瀏覽器會自動打開到正確的 http://localhost:XXXX/onboarding 路由。

C9. 🟢 這次變更是否要重做 progress.md M7 的 Windows build

為什麼問M7 正在收尾,若這輪變更砍了 yt-dlp + 改前端架構Windows build 可能要等改完再跑。

選項

  • A:先把 M7 Windows 收完(拿到 Windows 能跑的 baseline再基於 baseline 套這輪變更
  • BM7 停擺,本輪變更優先
  • CM7 和本輪變更平行做(高風險)

PM 建議

A。理由Windows 能跑的 baseline 是品質保險,即使這輪變更改掉 70% 前端「Windows 能跑 server + 可以打包」這件事本身不會白費。


D. 風險觀察

D1. 【新】「零摩擦安裝」承諾被打破

  • 描述:原 PRD 北極星指標是「5 分鐘內跑第一次推論 ≥ 95%」P1 Persona Arthur 的一句話是「雙擊 app、插 USB就能 demo」。新架構多一步「點 Open Browser」對 Arthur 的心智負擔是 +30%。
  • 可能性:高(結構性變更,不是實作品質問題)
  • 影響:中-高(可能違反北極星承諾)
  • 緩解(1) Wails 控制台啟動時自動 Start Server(不用手動按),(2) Server 就緒後自動 Open Browser(不用手動按),(3) Wails 控制台第一次啟動後可以「隱藏到背景」但不終止 server。這樣 UX 上仍是「雙擊 → 看到 UI」但底層是新架構
  • 等級P0 阻斷項——若沒做到這三點緩解,我會建議使用者回到原架構或放棄變更。

D2. 【新】Safari / Firefox webcam 相容性

  • 描述:瀏覽器 getUserMedia 在 Safari 17+ 雖然支援 localhost HTTP 的 camera permission但跟使用者的直覺不同Firefox 也有類似 permission flow 問題。原 Wails 內嵌架構下,直接走 Go + AVFoundation / DirectShow / V4L2使用者感知不到 permission。
  • 可能性:高(每個 macOS 預設 Safari 使用者都會碰到)
  • 影響US-5 攝影機推論的起步體驗變差)
  • 緩解(1) README / 首次引導推薦 Chrome / Edge(2) 在 Wails 控制台的「Open Browser」按鈕旁邊標示「如使用 Safari 需額外允許攝影機權限」,(3) 攝影機啟動失敗時提供具體錯誤訊息。
  • 等級P1 追蹤項

D3. 【新】Server 只聽 127.0.0.1 vs 同網段需求的衝突

  • 描述:原 PRD 6.6 明寫「絕對不 bind 0.0.0.0」。若使用者在 C1 選動機 C / F就得 bind 0.0.0.0 並加認證,這是另一個 L 級工作。
  • 可能性:未知,取決於 C1 答案
  • 影響:大(安全模型改寫)
  • 緩解C1 先問清楚,動機若非 C / F 則維持 127.0.0.1
  • 等級:待 C1 回答後定級

D4. 【新】Wails 控制台的跨平台 UI 一致性風險

  • 描述現在的架構下Wails 只是 webviewUI 本身是 Next.js 跨三平台一致。若控制台改用 Wails 原生 menu + 原生 button會碰到三平台原生元件差異重回「跨平台原生 UI」的泥沼。若控制台還是用 webview + HTML等於又多一份前端 build。
  • 可能性:高
  • 影響:中(開發成本)
  • 緩解Architect 要在 TDD 裡明確說明「控制台 UI 是用什麼技術」——我建議仍然用 webview + 極簡 HTML 而非 Wails 原生 UI避免三平台 UI 分岔)。
  • 等級P1

D5. 【新】使用者關閉瀏覽器後 server 是否仍在跑的心智模型不清

  • 描述:跟 C5 相關。Docker Desktop / Ollama 的體驗是「server 是常駐的」,使用者不會覺得怪;但 visionA-local 若採 C5-A關 Wails 等於關 server使用者關了瀏覽器再開瀏覽器發現 UI 404 會困惑。
  • 可能性:中
  • 影響:中
  • 緩解:瀏覽器端檢測 server 不可達時顯示「server 已停止,請回到 visionA-local 控制台重新啟動」的友善錯誤頁
  • 等級P2

D6. 【新】「單一動機不足,但 sunk cost 足」的心理陷阱

  • 描述:這是 PM 自己的 meta 風險提醒。使用者花了大量時間做 M1-M6現在提出巨變。若動機薄弱例如 E「看 Wails splash 不順眼」),改架構的成本遠大於解 bug 的成本。PM 有責任挑戰這個決定,而不是順從。
  • 緩解C1 是保護機制。若 C1 答案是「沒特別理由」或 EPM 應該建議不要改
  • 等級:管理風險

D7. 【既有】P2「FAE 不知道有新版」依然成立

  • 描述:不受這輪變更影響,但在新架構下「版本號顯示」變得更重要,因為 Wails 控制台是版本資訊的第一個 touchpoint。
  • 緩解Wails 控制台顯眼處(例如視窗標題列)顯示版本號。
  • 等級P2

E. 給 Design 和 Architect 的議題

E1. 給 Design 的議題(體驗面)

  1. Wails 控制台的資訊架構(對應 C4要放哪些資訊排版色調這是一個全新頁面不能從既有 Next.js sidebar 直接搬。建議 Design Agent 畫 wireframe。
  2. 「Open Browser」按鈕的視覺層級:這是新架構下最重要的單一 CTA。是不是該放在 Wails 控制台的正中央、像 Photo Booth 按拍照鈕那樣顯眼?還是像 Docker Desktop 那樣比較低調?
  3. First-Run 的分段(對應 C8若選 A整套 First-Run 在瀏覽器Wails 控制台的首次引導要怎麼設計才不會打擾到「使用者只是想趕快開 UI」的急迫感。
  4. 拖放 .nef 的目標視窗US-4使用者從 Finder 拖 .nef 檔,應該拖到 Wails 控制台還是瀏覽器兩邊都要支援Design 要決定。
  5. Mock 模式的視覺標記4.5):現在「主視窗」有兩個。兩邊都要打 Mock 標?還是只有其中一邊?
  6. Server 啟動中的 loading 體驗:原本 Wails webview 直接載 Next.js有個 splash 就結束了。新架構下有兩段等待:(a) Wails 啟動後到 server ready、(b) 瀏覽器打開後到頁面渲染完。兩段都要設計。
  7. Wails 控制台的視窗大小:原本 Wails 視窗是 1280x800主 UI。新架構下控制台要小得多可能 600x400 就夠),而且可能不需要 resize。
  8. 錯誤狀態的分佈server 崩潰時要通知誰——Wails 控制台瀏覽器兩邊通知形式toast / modal / native dialog如何分

E2. 給 Architect 的議題(技術面)

  1. Wails 控制台是用什麼實作(對應 D4最務實的選擇是 Wails webview + 極簡 HTML不用 Next.js 那份 build另一個選擇是用 Wails 原生 menu / button三平台原生 UI 不一致);還有第三個選擇是 Next.js 產出兩份 build主 UI + 控制台。Architect 要提方案並分析利弊。
  2. Next.js build 是否要解耦 Wails:原本 build 會 embed 進 Go binary新架構下如果 UI 主體跑在瀏覽器,還要 embed 嗎embed 的意義是什麼?可以改成 server 啟動時直接 http.Handler serve static/ 目錄。
  3. Server 啟停的 IPCWails 控制台按下 Start 要叫 server 起來;按 Stop 要 graceful shutdown。目前 server 是透過 Wails 生命週期管理M7 L-1 的 watchServer新架構下要重新設計 IPC 協定。
  4. Single-instance 保護(對應 C5 + B4-3新架構下「second instance」的定義變了。需要重新設計。
  5. Server port 的分配:目前是隨機 port + wails-ipc-port 檔案L-3。新架構下要讓使用者在瀏覽器打開「固定 URL」還是「每次不同 port」固定 port 方便但有衝突風險,隨機 port 要從 Wails 控制台讀取。建議是「固定 port 優先,衝突時降級為隨機並顯示」。
  6. Wails App 的 Dock icon / taskbar 行為macOS 的 Dock icon 一直亮著、使用者一定會發現有個 app 在跑。跟 Ollama背景 tray + 沒有 Dock icon不同。Architect 要決定要不要做 NSApplicationActivationPolicyAccessorymacOS、hidden from taskbarWindows等。
  7. 瀏覽器打開方式open http://...macOS/ startWin/ xdg-openLinux。Architect 要寫跨平台的 OS helper注意防呆例如使用者沒設預設瀏覽器時的 fallback
  8. 攝影機推論的新通路(對應 D2原本 Go server 直接用 AVFoundation / DirectShow / V4L2 抓 frame 做推論。新架構下如果 UI 跑在瀏覽器,是維持原路徑server 抓 frame、MJPEG 推給瀏覽器)還是改走瀏覽器路徑(瀏覽器 getUserMedia → WebRTC / ImageCapture → POST 給 server強烈建議維持原路徑(伺服器抓 frame + MJPEG效能和權限都簡單。但 Architect 要確認。
  9. server 被同網段連線的防護:即使使用者選 C1-A/B/D也要確認新架構下 server 真的只聽 127.0.0.1 沒意外 bind 0.0.0.0。這點要在 TDD 加驗收。
  10. CORS / CSRF:瀏覽器發 request 到 localhost:XXXX 是同 origin瀏覽器也在 localhost 開),理論上不需要 CORS。但如果使用者把 URL 複製到別台機器的瀏覽器(跟 C1-C/F 相關),會跨 origin。這題跟 D3 綁在一起。
  11. 現有 L-3Wails /ipc/raise是否仍需要:原本 server 崩潰後 raise Wails 視窗是為了顯示 UI。新架構下 server 崩潰後要 raise Wails 控制台(顯示錯誤),瀏覽器端只會顯示 offline 頁面。IPC 協定仍有效但意義變了。

結尾PM 的立場聲明

作為 PM我對這輪變更有三個明確的立場

  1. C1動機釐清是這次變更能不能做的前提。我不建議在沒有 C1 答案之前啟動任何實作。
  2. D1零摩擦承諾是不能妥協的紅線。若新架構無法透過「自動 Start Server + 自動 Open Browser」達成「雙擊就看到 UI」我會建議使用者回到原架構。
  3. 我不建議現在就跳去改前端。正確順序是:(1) 使用者回答 C1-C9(2) PM 根據答案更新 PRD 相關章節;(3) 三方PM / Design / Architect重新聯合審閱(4) 才進實作。這整個循環我估大約要 1-2 個工作日。

下一步(交給 Orchestrator

  • 將本分析文件呈現給使用者
  • 請使用者回答 C1-C9 九個問題C1、C4、C5、C8 為必答;其他可接受 PM 建議)
  • 答案到位後,請 Design Agent 和 Architect Agent 同步做第一輪分析(對應 E1、E2
  • 三方第一輪分析完成後再召開聯合討論,決定是否要做、怎麼做、對 M7 的影響

附錄:本分析文件的資料來源

  • /Users/jimchen/visionA/local-tool/.autoflow/02-prd/PRD.md(索引)
  • /Users/jimchen/visionA/local-tool/.autoflow/02-prd/features/feature-inventory.md
  • /Users/jimchen/visionA/local-tool/.autoflow/02-prd/user-research.md
  • /Users/jimchen/visionA/local-tool/.autoflow/02-prd/nonfunctional.md
  • /Users/jimchen/visionA/local-tool/.autoflow/02-prd/risks.md
  • /Users/jimchen/visionA/local-tool/.autoflow/progress.mdM1-M7 進度)
  • 使用者第四輪變更訊息2026-04-14