climb_stairs

產品需求文件 (PRD)

PRD — Ladder Room Online

Document Control

欄位內容
Version1.0
StatusDraft
Date2026-04-21
AuthorAI PM Agent(devsop-autodev STEP-03)
Based OnBRD v1.0 + legacy-PRD v1.4 + legacy-PDD v2.2
Stakeholders前端工程師、後端工程師、QA、設計師、DevOps

§1 Purpose & Background

§1.1 Purpose

Ladder Room Online 是一款基於 LINE 爬樓梯玩法的 HTML5 線上多人互動抽獎遊戲,支援最多 50 位玩家從不同地點透過瀏覽器加入同一場抽獎活動。本 PRD 定義系統的完整使用者故事、功能需求及驗收標準,作為工程實作的主要規格依據。

§1.2 Background

LINE 原生爬樓梯遊戲是廣泛使用的抽獎互動形式,但存在以下限制:

問題說明
人數限制超過約 25 人後走線過程不完整顯示,核心互動體驗降級
視覺不完整人數多時畫面顯示不完整,體驗大打折扣
規則僵化難以自訂房間機制與獎項規則
無法獨立部署不適合作為獨立品牌活動頁或大型線上互動玩法
異地參與障礙不支援異地多人同房、主持人掌控揭曉節奏、結果公正可驗證

目標用戶

技術邊界:Node.js 20 + Fastify + WebSocket(ws)+ Redis(唯一持久層)+ Vanilla TypeScript + Vite + Kubernetes,單一伺服器實例支援 100 並發房間、5,000 WebSocket 連線。


§2 Goals & Success Metrics

§2.1 可驗收指標(來自 BRD §3)

KPI目標值量測方式量測時機優先級
建立房間成功率> 99.5%Server 端日誌統計MVP 上線後第 1 個月P0
玩家加入成功率> 99%Server 端日誌統計MVP 上線後第 1 個月P0
同房間最大人數50 人k6 壓力測試(50 並發連線)MVP 上線前 CIP0
開局後結果一致性100%多客戶端結果比對;1,000 次 seed 自動化驗證MVP 上線前 CI 閘門P0
揭曉動畫流暢度(桌機)≥ 30fpsChrome DevTools,50 人滿員,1080pMVP E2E 測試P1
揭曉動畫流暢度(手機)≥ 24fpsChrome DevTools Moto G4 throttling,10 秒平均MVP E2E 測試P1
房間同步延遲(P95)< 2 秒WebSocket 打點計算端對端延遲k6 壓測P1
重連恢復成功率100%自動化測試模擬 WebSocket 強制斷線MVP E2E 測試P1
重連完成時間(P95)< 3 秒Playwright 量測:DOMContentLoaded 至狀態渲染完成MVP E2E 測試P1
前端 JS bundle(首頁,gzip)< 80KBLighthouse CI bundle 分析每次 PRP1
前端 JS bundle(遊戲頁,gzip)< 150KBLighthouse CI bundle 分析每次 PRP1
FCP(Simulated Slow 4G)< 1.5sLighthouse CI每次 PRP1
LCP(Simulated Slow 4G)< 2.5sLighthouse CI每次 PRP1
CLS< 0.1Lighthouse CI每次 PRP1

§2.2 Go/No-Go 條件

Go 條件(全部必須滿足)

No-Go 條件(任一觸發即阻止)


§3 User Stories

主持人(Host)User Stories


US-H01: 建立房間

As a 主持人,I want to 建立一個帶有唯一 6 碼房間碼的房間,so that 玩家能快速找到並加入我的抽獎活動。

Priority: P0

Acceptance Criteria:


US-H02: 設定中獎名額

As a 主持人,I want to 設定中獎名額(W),so that 我可以控制本局有多少玩家會獲獎。

Priority: P0

Acceptance Criteria:


US-H03: 開始遊戲

As a 主持人,I want to 在所有玩家就緒後開始遊戲,so that 可以正式進入揭曉流程。

Priority: P0

Acceptance Criteria:


US-H04: 手動逐步揭曉路徑

As a 主持人,I want to 以手動逐步揭曉每條路徑,so that 我可以配合現場節奏製造懸念。

Priority: P0

Acceptance Criteria:


US-H05: 設定自動揭曉間隔

As a 主持人,I want to 設定自動揭曉間隔(1~30 秒/格),so that 遊戲可以在無人操作時自動進行。

Priority: P1

Acceptance Criteria:


US-H06: 一鍵揭曉全部路徑

As a 主持人,I want to 一鍵揭曉全部路徑,so that 在時間緊迫時可以快速完成抽獎。

Priority: P0

Acceptance Criteria:


US-H07: 踢除玩家

As a 主持人,I want to 踢除指定玩家,so that 我可以移除測試帳號或不當參與者。

Priority: P1

Acceptance Criteria:


US-H08: 再玩一局

As a 主持人,I want to 在一局結束後發起「再玩一局」,so that 我可以用同一房間繼續下一輪抽獎。

Priority: P1

Acceptance Criteria:


US-H09: 複製邀請連結

As a 主持人,I want to 在等待大廳複製邀請連結,so that 參加者能快速加入房間。

Priority: P1

Acceptance Criteria:


玩家(Player)User Stories


US-P01: 加入房間

As a 玩家,I want to 輸入暱稱並透過 6 碼房間碼加入房間,so that 我可以參與抽獎活動。

Priority: P0

Acceptance Criteria:


US-P02: 觀看即時玩家列表更新

As a 玩家,I want to 在遊戲開始前看到即時更新的玩家列表,so that 我可以知道還有誰加入了房間。

Priority: P0

Acceptance Criteria:


US-P03: 觀看路徑揭曉動畫

As a 玩家,I want to 觀看自己路徑的揭曉動畫,so that 我可以體驗抽獎的緊張感。

Priority: P0

Acceptance Criteria:


US-P04: 確認中獎結果

As a 玩家,I want to 在結果揭曉後立即知道自己是否中獎,so that 我可以確認抽獎結果。

Priority: P0

Acceptance Criteria:


US-P05: 斷線後重連恢復狀態

As a 玩家,I want to 在斷線後能重新連上房間並恢復狀態,so that 我不會因網路波動而遺失參與資格。

Priority: P1

Acceptance Criteria:


US-P06: 被踢除後收到明確通知

As a 玩家,I want to 在被踢除後收到明確通知,so that 我可以了解自己已無法繼續參與。

Priority: P1

Acceptance Criteria:


§4 Functional Requirements

FR-01: 房間管理 [P0]

對應 User Stories: US-H01, US-H02, US-H08

FR-02: 玩家管理 [P0]

對應 User Stories: US-P01, US-P02

FR-03: WebSocket 連線管理 [P0]

對應 User Stories: US-P02, US-P05

FR-04: 梯子生成算法 [P0]

對應 User Stories: US-H03

FR-05: 路徑計算 [P0]

對應 User Stories: US-H03, US-P03, US-P04

FR-06: 動畫系統 [P1]

對應 User Stories: US-P03, US-P04

FR-07: 結果顯示 [P0]

對應 User Stories: US-P04, US-H06

FR-08: 本地儲存與用戶偏好 [P2]

對應 User Stories: US-P01, US-H09

FR-09: 房間狀態機 [P0]

對應 User Stories: 全部

FR-10: 斷線重連 [P1]

對應 User Stories: US-P05

FR-11: 踢除玩家 [P1]

對應 User Stories: US-H07

FR-12: 再玩一局 [P1]

對應 User Stories: US-H08

FR-13: 揭曉控制 [P0]

對應 User Stories: US-H04, US-H05, US-H06

FR-14: 邀請連結 [P2]

對應 User Stories: US-H09, US-P01


§5 Non-Functional Requirements

NFR-01: 效能

指標目標值量測方式
Canvas 動畫 FPS(桌機)≥ 30fpsChrome DevTools,50 人滿員房間,1080p Chrome
Canvas 動畫 FPS(手機)≥ 24fpsChrome DevTools Moto G4 throttling profile,10 秒錄製平均值
WebSocket 廣播延遲(P95)< 2 秒伺服器發出到客戶端完成狀態更新
房間建立 API 回應(P99)< 2 秒Server 端計時
玩家加入 WebSocket 握手(P99)< 1.5 秒Playwright 量測:click 至 waiting 元素可見
斷線重連時間(P95)< 3 秒頁面 DOMContentLoaded 至狀態快照渲染完成
FCP(Simulated Slow 4G)< 1.5 秒Lighthouse CI
LCP(Simulated Slow 4G)< 2.5 秒Lighthouse CI
CLS< 0.1Lighthouse CI

NFR-02: 並發與容量

指標目標值量測方式
並發房間數100 個k6 模擬 100 房間 × 50 人 WebSocket 並發
每房間玩家數50 人k6 壓力測試
WebSocket 連線數5,000 個k6 壓力測試
建立房間成功率> 99.5%正常負載下量測
玩家加入成功率> 99%正常負載下量測
Redis 記憶體~8.8 MB(100 房間)每房間 ~88 KB

NFR-03: 結果一致性

NFR-04: 可靠性與斷線容忍

指標目標值
重連恢復成功率100%
重連完成時間(P95)< 3 秒
主持人斷線容忍主持人斷線後 60 秒內重連,其他玩家連線不中斷

NFR-05: 安全性

安全需求規格
JWT 認證所有 Host 操作須驗證 JWT;非法/過期回傳 401;非 Host 回傳 403
playerId 不可猜測UUID v4
踢除禁令持久化kickedPlayerIds 存於 Redis,同局有效
WebSocket 訊息大小上限 64KB,超過則拒絕並關閉連線
seed 防洩漏seed 及完整樓梯資料在 status=finished 前禁止傳送給任何客戶端
自動揭示間隔驗證T 非整數或超出 1~30 秒範圍時回傳 INVALID_AUTO_REVEAL_INTERVAL

NFR-06: 前端效能預算

資源目標值量測方式
首頁 JS bundle(gzip)< 80KBLighthouse CI bundle 分析
遊戲頁 JS bundle(gzip)< 150KBLighthouse CI bundle 分析
CSS< 30KBLighthouse CI

NFR-07: 測試覆蓋率

NFR-08: 瀏覽器相容性


§6 Edge Cases & Error Handling

§6.1 斷線重連邊界情況

情境預期行為
玩家在 waiting 狀態斷線後重連自動恢復等待大廳狀態,isOnline=true 更新並廣播
玩家在 revealing 狀態斷線後重連回傳狀態快照,呈現已揭曉靜態結果,不重播動畫
玩家在 finished 狀態斷線後重連回傳完整結算頁面狀態
同一 playerId 多分頁連線後來的連線視為重連(更新 isOnline=true),舊 session 收到 SESSION_REPLACED 後斷線
localStorage 遺失(Ghost Player)視為新玩家;waiting 狀態可輸入新暱稱加入;running/revealing 狀態回傳 ROOM_NOT_JOINABLE

§6.2 房間滿員與人數不足

情境預期行為
房間已達 50 人上限新連線回傳 ROOM_FULL,顯示「房間已滿,無法加入」
開始遊戲時 N < 2回傳 INSUFFICIENT_PLAYERS,顯示「人數不足(至少需要 2 位玩家)」
再玩一局後在線玩家 < 2回傳 INSUFFICIENT_PLAYERS,不啟動新局

§6.3 超時與回退

情境預期行為
原子寫入(running 狀態)逾時 10 秒未完成Server 清除部分已寫入資料,狀態回退至 waiting,廣播 ROOM_STATE(reason=ROLLBACK_TIMEOUT
原子寫入拋出異常Server 清除部分已寫入資料,狀態回退至 waiting,廣播 ROOM_STATE(reason=ROLLBACK_ERROR
客戶端 15 秒計時器先觸發(廣播遺失)顯示「連線逾時,請重新整理頁面」提示

§6.4 暱稱衝突

情境預期行為
暱稱與在線玩家重複回傳 NICKNAME_TAKEN,提示「此暱稱已被使用,請換一個」
暱稱與離線玩家(isOnline=false)重複同樣回傳 NICKNAME_TAKEN(離線玩家暱稱在再玩一局前保留)
被踢玩家暱稱踢除後立即釋放,其他玩家可使用

§6.5 防作弊邊界

情境預期行為
客戶端嘗試在 finished 前取得 seedServer 不回傳 seed;seed 僅在 finished 狀態廣播 ROOM_STATE 時包含
同一 playerId 被踢後嘗試重連回傳 PLAYER_KICKED,拒絕重連;被踢者需以全新 playerId(新暱稱)加入新局
非 Host 嘗試執行 Host 操作回傳 HTTP 403
JWT token 過期回傳 HTTP 401(含 TOKEN_EXPIRED

§6.6 主持人斷線期間

情境預期行為
主持人在 waiting 狀態斷線房間維持 waiting,其他玩家連線不中斷;主持人重連後恢復控制權
主持人在 running 狀態斷線房間維持 running,其他玩家連線不中斷;主持人重連後可繼續操作(例如點擊「開始揭曉」)
主持人在 revealing 狀態斷線(自動揭曉進行中)自動揭曉計時器繼續(Server 端),主持人重連後可繼續控制
主持人斷線超過 60 秒其他玩家仍保持連線,房間狀態維持;主持人以原 playerId 重連後恢復

§6.7 無效房間碼與加入限制

情境預期行為
玩家輸入不存在或已過期的 Room Code伺服器回傳 ROOM_NOT_FOUND 錯誤,前端顯示「找不到此房間,請確認房間碼」
玩家嘗試加入狀態為 running/revealing 的房間伺服器回傳 ROOM_NOT_JOINABLE 錯誤,前端顯示「此房間遊戲已開始,無法加入」
房間狀態為 finished 時有新玩家嘗試加入伺服器回傳 ROOM_NOT_JOINABLE 錯誤(遊戲已結束),前端顯示「此房間已結束,無法加入」

§6.8 並發操作邊界

情境預期行為
主持人重複快速點擊「開始遊戲」第一個請求成功後,後續請求因狀態已非 waiting 而收到 INVALID_STATE,seed/ladderMap 不重新生成
主持人在 revealing 狀態重複點擊「下一位」(多次快速點擊)每次 REVEAL_NEXT 僅遞增一次 revealIndex,伺服器以原子操作防止重複遞增
自動揭曉計時器與手動 REVEAL_NEXT 同時觸發伺服器以原子操作確保 revealIndex 僅遞增一次,不產生重複廣播

§7 Constraints & Dependencies

§7.1 技術約束

約束說明
Node.js 20 LTSRuntime 環境,不支援其他版本
Redis 6+唯一持久層,需支援 WATCH/MULTI/EXEC 原子操作
Kubernetes(Rancher Desktop)本機開發環境;MVP 單一 Pod 部署
Vanilla TypeScript + Vite前端技術棧,不使用 UI 框架(React/Vue 等)
WebSocket(ws 套件)即時通訊協定,不使用 Socket.IO
FastifyHTTP 伺服器框架
Monorepo 結構packages/server、packages/client、packages/shared
繁體中文 UIMVP 以繁體中文為唯一介面語言

§7.2 MVP 不包含功能(Out of Scope)

  1. 使用者帳號系統:主持人身份以一次性 JWT token 管理
  2. 行動原生 App(iOS / Android):MVP 僅支援行動瀏覽器
  3. 觀眾模式(Spectator):所有連線者皆為 Host 或 Player
  4. 多房間管理後台:不提供管理員儀表板
  5. 自訂獎品名稱或分組抽獎:結果槽僅區分「中獎」與「未中獎」
  6. 動畫主題或皮膚自訂:使用單一視覺主題
  7. 抽獎結果匯出(PDF / CSV):不提供結果下載
  8. 國際化(i18n)多語言支援:僅繁體中文
  9. 多 Pod 水平擴展(HPA Multi-node):MVP 單一 Pod 部署
  10. 聲音效果與背景音樂:視覺動畫為唯一反饋形式

§7.3 依賴項

依賴項類型說明
Node.js 20 LTS技術依賴Runtime 環境
Redis 6+基礎設施依賴唯一持久層
Kubernetes(Rancher Desktop)基礎設施依賴本機開發環境
GitHub ActionsCI/CD 依賴自動化測試與部署
Vitest測試依賴後端覆蓋率 ≥ 80%,前端 ≥ 70%
Playwright測試依賴E2E 測試,覆蓋所有 P0 User Story
k6壓測依賴WebSocket 並發壓力測試
Lighthouse CI效能依賴前端效能監控,每次 PR 自動量測

§8 Open Questions

#問題狀態影響範圍
OQ-01台灣 PDPA 對暱稱/playerId 的適用性是否需要隱私聲明?[OPEN]合規、首頁設計
OQ-02MVP 後商業模式:免費基礎版(15 人)+ 付費進階版(50 人),是否確認方向?[OPEN]商業模式
OQ-03Post-MVP 是否需要觀眾模式(Spectator)?預計哪個 Sprint?[OPEN]範疇規劃
OQ-04抽獎結果匯出(PDF/CSV)的優先序?是否列入 Post-MVP P1?[OPEN]產品路線圖
OQ-05主持人斷線超過 60 秒後是否需要自動轉交主持權?或房間自動暫停?[OPEN]可靠性設計
OQ-06finished 後 seed 公開是否需要主持人確認,或自動隨 ROOM_STATE 廣播?[OPEN]防作弊設計
OQ-07多語言支援(英文)是否列入 Post-MVP 路線圖?時程?[OPEN]國際化
OQ-08k6 壓測中「100 房間 × 50 人」是否需要在 CI 強制閘門執行,或僅週期性執行?[OPEN]CI/CD 設計

Appendix: Requirement Traceability

US → FR → BRD §X 對照表

User Story功能需求BRD 來源
US-H01:建立房間FR-01-1, FR-01-2, FR-01-3, FR-01-4BRD §3.4 REQ-01, §5.1
US-H02:設定中獎名額FR-01-3, FR-09-2BRD §3.4 REQ-02, §5.1
US-H03:開始遊戲FR-04-1~FR-04-6, FR-05-1~FR-05-3, FR-09-2BRD §3.4 REQ-03, §5.1
US-H04:手動逐步揭曉FR-13-1, FR-13-4, FR-09-2BRD §3.4 REQ-04, §5.1
US-H05:自動揭曉間隔FR-13-2, FR-09-3BRD §3.4 REQ-05, §5.1
US-H06:一鍵全揭FR-13-3, FR-06-6, FR-07-1BRD §3.4 REQ-06, §5.1
US-H07:踢除玩家FR-11-1~FR-11-4BRD §3.4 REQ-07, §5.1
US-H08:再玩一局FR-12-1~FR-12-3BRD §3.4 REQ-08, §5.1
US-H09:複製邀請連結FR-14-3, FR-14-4BRD §3.4 REQ-09, §5.1
US-P01:加入房間FR-02-1~FR-02-3, FR-02-6, FR-08-1~FR-08-2, FR-14-2BRD §3.4 REQ-10, REQ-11, §5.1
US-P02:即時玩家列表FR-02-4, FR-03-1, FR-09-4BRD §3.4 REQ-12, §5.1
US-P03:路徑揭曉動畫FR-06-1~FR-06-6BRD §3.4 REQ-13, §5.1
US-P04:中獎結果確認FR-07-1~FR-07-3, FR-05-3BRD §3.4 REQ-14, §5.1
US-P05:斷線重連FR-10-1~FR-10-4BRD §3.4 REQ-15, §5.1
US-P06:被踢通知FR-08-4, FR-11-4BRD §3.4 REQ-16, §5.1

驗收標準優先序總表

User Story優先級狀態
US-H01:主持人建立房間並取得 6 碼 Room CodeP0待開發
US-H02:主持人設定中獎名額 WP0待開發
US-H03:主持人開始遊戲P0待開發
US-H04:主持人手動逐步揭曉路徑P0待開發
US-H05:主持人設定自動揭曉間隔P1待開發
US-H06:主持人一鍵揭曉全部路徑P0待開發
US-H07:主持人踢除玩家P1待開發
US-H08:主持人發起再玩一局P1待開發
US-H09:主持人複製邀請連結P1待開發
US-P01:玩家輸入暱稱並加入房間P0待開發
US-P02:玩家觀看即時玩家列表更新P0待開發
US-P03:玩家觀看自己路徑的揭曉動畫P0待開發
US-P04:玩家確認自己的中獎結果P0待開發
US-P05:玩家斷線後重連恢復狀態P1待開發
US-P06:玩家被踢除後收到明確通知P1待開發

PRD 版本:v1.0

生成時間:2026-04-21

基於 BRD v1.0 + legacy-PRD v1.4 + legacy-PDD v2.2

變更追蹤

ECR-20260422-001:新增「再玩一場」功能