visionA/docs/autoflow/03-design/review/design-review-of-prd-tdd.md
jim800121chen fb7da5d180 chore(autoflow): migrate .autoflow/ 共享層文件至 docs/autoflow/
依 autoflow-agent workspace v2 設計把 PRD / 設計 / 架構 / 交付類
共享文件從個人層 .autoflow/(ignored)搬到 docs/autoflow/(進 git),
讓團隊可共享產品與架構文件,個人層只留 progress / review / testing 等
per-branch 筆記。

- 02-prd/        21 個檔(PRD、features、market-analysis 等)
- 03-design/     18 個檔(design-spec、wireframes、flows 等)
- 04-architecture/ 31 個檔(TDD、design-doc、ADR×14、API 規格等)
- 07-delivery/   3 個檔(project-summary、phase-0.6-handover、stage-deployment-setup)

合計 73 檔。原檔已從 .autoflow/ 移除(migration 工具執行 git mv,
但因 .autoflow/ 在 .gitignore 中、git 將此操作視為新增、無 rename history)。
2026-05-04 16:55:55 +08:00

122 lines
8.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Design 對 PRD + TDD 的交叉審閱
| 項目 | 內容 |
|------|------|
| 審閱者 | Design Agent |
| 審閱日期 | 2026-04-21 |
| 審閱對象 | PRDv0.1+ Design Doc / TDDv0.1+ api-spec.md + tunnel.md |
| 基準 | 設計規格 `03-design/`(含 Pairing 與 Offline 兩大流程)|
---
## 1. 總評
**體驗完整度評分3.5 / 5 ⚠️ 有改善空間**
骨架與關鍵流程REST 轉發、tunnel 斷連語意、Pairing API在三方文件間**對得上**,但在 **Pairing token 格式、離線訊號來源、錯誤語意、雛形 stub 的 UX 落點**有幾處**跨文件不一致**會直接讓 Phase 0 雛形體驗破功。建議在進入雛形骨架前修正 Critical 項。
---
## 2. 流程完整性檢查
| 流程 | PRD | TDD / API | Design 規格 | 判定 |
|------|-----|----------|------------|------|
| Pairing 正向 | ✅ | ✅API `/api/pairing/token` + `/status`| ✅3 步 stepper| 🔴 **Token 格式三方不一致**(見 C1|
| Pairing Token 過期 | ✅ 15min | ✅ TTL 可調 | ⚠️ 設計規格寫 **72 小時** | 🔴 **C2** |
| Pairing Token 已使用 | ✅ `409 Conflict` | ⚠️ POC 行為「後來覆蓋前」| ⚠️ 設計規格顯示「此 token 已被其他裝置使用」 | 🟡 **M1**(語意衝突)|
| 裝置掉線tunnel 斷)| ⚠️ 僅提「自動重連」| ✅ `502 TUNNEL_DISCONNECTED` | ✅ 完整NetworkErrorBanner + 全頁遮罩 + 60s 倒數)| 🟡 **M2**(心跳 / lastSeen 未定義)|
| Workspace 推論中斷線 | ⚠️ 「立即提示 + 自動重連」| ✅ 不 transparent retry | ✅ 覆蓋遮罩 + 不自動重啟推論 | ✅ 對齊 |
| 登入 / 註冊stub| ✅ 可 stub | ✅ 回 501 | ⚠️ flow-auth 寫「送出直接跳 Dashboard」| 🔴 **C3**501 vs 直接跳轉矛盾)|
| Model 上傳大檔 | ⚠️ 未提進度 | ✅ presigned PUT不走 tunnel| ❌ **設計規格缺上傳進度 / 失敗重試 UI** | 🔴 **C4** |
| 雛形多 user 隔離 | ✅ 驗收條件要求 | ⚠️ Q4 裁決:**StaticAuthService 永遠 demo-user單一使用者**| ✅(預設隔離)| 🟡 **M3**(驗收條件無法通過)|
---
## 3. UX 風險(技術選型 → 體驗)
**R1 · Tunnel 延遲對即時感的衝擊 🔴**
TDD 延遲預算 P95 < 500msheartbeat 30syamux `flow-offline-handling.md` 45 秒判定掉線」、「15 秒心跳」。**兩套數字不一致**。使用者在 Workspace 按停止推論卻要等 30s 才看到狀態變化會被誤以為 App 當了建議 heartbeat 10-15s判定掉線 30s UI 離線最大感知延遲 30 明確
**R2 · MJPEG 單向流無回壓 🟡**
api-spec `GET /api/camera/stream` 透過 yamux stream MJPEG若瀏覽器 tab 切到背景或頻寬不足MJPEG 會造成 yamux window 塞爆拖慢控制通道切換 slider停止推論按鈕)。TDD 未定義**背景 tab 時是否暫停 stream**。設計規格也沒寫頁面不可見時行為Chrome 預設 throttle setInterval MJPEG 是伺服器 push 需要前端 visibilitychange 主動關 stream
**R3 · 501 回應如何呈現 🔴**
TDD 雛形大量端點回 `501 NOT_IMPLEMENTED`登入pairing token 產生revokeconverterbatch 推論)。設計規格**沒有 501 的統一 UX 呈現**。目前 flow-auth 送出直接跳 Dashboard是繞過 API 的前端 hack PRD 驗收條件 US-01 要求看到登入頁」,US-02 要求完成註冊」— 三方對雛形 auth 的期望不一致
**R4 · Pairing Token 顯示格式與 API 脫鉤 🟡**
Q7 裁決:「API 回傳純 hex前端加空格顯示」。TDD `api-spec.md` 範例用 `pk_AbCd1234...`前綴 + base62PRD `vAc_` + 32 hex設計規格用 16 字元 hex + 8+8 分隔。**三方 token 格式各自為政**。雛形實作時必須選一個否則前端格式化 `.replace` 會錯字元數
**R5 · ConnectedDevicesList / 全域 Badge 缺資料源 🟡**
設計規格要求 `RemoteDeviceBadge` 顯示最後心跳 X 秒前」,TDD `Device` 結構與 `InMemoryDeviceRepository` 未定義 `lastSeenAt` 欄位只有 `SessionStore.Summary` 需明確**前端取 lastSeen 走哪支 API** `/api/pairing/status`單一 tunnel還是每個 device 都要有一個欄位
**R6 · i18n 缺 key 🟢**
設計規格列出 ~40 `pairing.*` / `remote.*` / `network.*` i18n keyTDD / 前端改造章節(§10未提及 i18n 擴充工作需要在前端任務清單加一項新增 i18n key」。
---
## 4. 設計規格 vs PRD / TDD 的矛盾點
| # | 類別 | Design 規格寫的 | PRD / TDD 寫的 | 建議解法 |
|---|------|----------------|--------------|---------|
| **C1** | Token 格式 | 16 字元 hex`a1b2c3d4 e5f6g7h8` 顯示 | PRD`vAc_` + 32 hexTDD`pk_AbCd1234`範例| **三方統一**建議採 PRD 格式 `vAc_` + 32 hex設計規格改為 8+8+8+8 分四段顯示 |
| **C2** | Token TTL | **72 小時** | PRD / TDD**15 分鐘** | 設計規格改 15 分鐘72 小時安全風險過高PRD |
| **C3** | Auth 雛形行為 | 送出表單直接跳 Dashboard | TDD 501 | 設計規格增加雛形 stub 模式版本前端偵測 501 前端強制過 Dashboard + banner雛形模式尚未接入認證 |
| **C4** | Model 上傳 | 無進度 / 失敗 UI | presigned PUT 流程 | `pages.md` 模型上傳頁的上傳進度條 / 大小限制 / checksum 失敗 / presigned expire四個狀態 |
| **M1** | token 多連線 | 被其他裝置使用錯誤提示 | POC 行為後來覆蓋前 | Q5 已裁決沿用 POC設計規格改為顯示 token 已配對過 舊連線已被取代」,或隱藏該錯誤因為覆蓋是成功的 |
| **M2** | 心跳 / 掉線判定 | 15s 心跳 + 45s 判定 | tunnel.md30s yamux keepalive | 統一**10s 心跳 / 30s 判定**TDD tunnel.md 補充 |
| **M3** | user 隔離驗收 | 設計要求裝置列表隔離 | Q4 裁決雛形單一使用者 | PRD US-10 / feature-inference 驗收條件不同使用者互相隔離改為 **Phase 1 必須** |
| **M4** | `remoteStatus` 欄位 | Device 新增 5 個欄位 | `InMemoryDeviceRepository` / `Device` struct 未涵蓋 | TDD database.md 補上 `remoteStatus` / `lastSeenAt` / `hostName` / `pairedAt` / `errorMessage` |
---
## 5. 發現的問題
### Critical阻擋雛形進入開發
- **[C1]** Pairing Token 格式 PRD / TDD / Design 三方不一致 先對齊格式
- **[C2]** Pairing Token TTL 設計寫 72hPRD 15min 安全性必須是 15min
- **[C3]** 雛形 Auth 的三方預期不一致501 vs 前端強跳)→ 定義雛形模式 banner
- **[C4]** 設計規格缺大檔上傳的進度 / 失敗 / 重試 UIfeature-inference Phase 1 還有影片上傳
### Major
- **[M1]** token 多連線語意顯示錯誤 vs 靜默覆蓋 統一
- **[M2]** 心跳 / 掉線判定數字三方不一致
- **[M3]** user 隔離驗收條件與 Q4 裁決衝突
- **[M4]** Device 結構缺 `remoteStatus` 等欄位前端 UI 無資料可顯示
- **[M5]** 501 回應的統一 UX 呈現未定義
### Minor / Suggestion
- **[m1]** Background tab MJPEG stream 行為未定
- **[m2]** flow-pairing.md token 顯示範例16 hex PRD32 hex長度不同導致 QR Code 尺寸需重估
- **[m3]** TDD §10 未提 i18n key 擴充任務
- **[m4]** WebSocket `/ws/pairing/status` 設計規格沒用還在 pollingStep 3建議改用 WS 即時
- **[m5]** Reduce Motion flow-offline-handling 重連倒數需特別測試不要閃爍
---
## 6. 設計規格需修改清單
| 檔案 | 修改 |
|------|------|
| `flow-pairing.md` §4.1 / §4.5 | Token 格式改 `vAc_` + 32 hexTTL 15 分鐘對齊 PRD|
| `flow-pairing.md` §6.4 | polling 改用 `WS /ws/pairing/status`TDD 已定義|
| `flow-auth.md` | 新增雛形模式 banner」,說明 401/501 時的 UX |
| `flow-offline-handling.md` §12 | 心跳 10s / 判定掉線 30s |
| `pages.md`模型管理頁| **新增**上傳進度 / 錯誤 / presigned expire 狀態 |
| `components.md` `RemoteDeviceBadge` | 標注資料來源 = `/api/pairing/status` `last_seen_at` |
| `design-spec.md` §5.2 Architect 提醒 | 需要 Device.remoteStatus / lastSeenAt 欄位」|
---
## 7. 結論
PRD TDD **骨架堅實** **Pairing Token 格式TTL心跳參數501 UX大檔上傳雛形 Auth 流程**六處跨文件不一致若不先對齊雛形實作時會出現前端以 72h UI後端 15min 失效等漏洞建議
1. **先開 30 分鐘同步**統一 C1-C4 Orchestrator 召集 PM / Architect / Design
2. 三方同步修文件後再次互審設計規格依第 6 節修訂
3. 通過後再進入雛形骨架
完整度達標才進入開發可避免雛形一跑起來就遇到規格對不上的尷尬