# MANUAL_TEST_PLAYBOOK.md

本 playbook 是 v1.1 人工測試定稿，目標是讓 tester 從乾淨存檔開始，逐段驗證新手教學、階段解鎖、功能 gate、早期節奏、飛升前後系統、跳過教學與離線收益。本文依 M72-draft proposal 建立主流程，並已用 M66-auto + M71 常數補刀後的實測 anchor 校正時間窗口。

測試原則：人工測試不是要複製最優 simulator 操作，而是檢查真實玩家路徑是否符合「快推進派」體感。M71 final 顯示兩個 optimal profile 均通過 8/8 criteria：`optimal-no-tutorial` 在 0 分鐘達成第一次突破、第一座新建築與第 5 位弟子，29 分鐘達成第一次飛升與 Stage 5，30 分鐘達成 Stage 7；`optimal-with-tutorial` 因教學成本第一次突破為 1 分鐘，第一次飛升、Stage 5、Stage 7 為 30 分鐘。人工測試允許比最優 profile 慢，但第一突破、第一座新建築、第五位弟子、教學觸發與功能 gate 必須在合理窗口內可見。

## 1. Pre-flight

測試前先建立乾淨、可追溯的環境。此章的目的不是驗證玩法，而是避免存檔、設定、舊教學狀態或本機時間污染結果。

| 項目 | 操作 | 預期狀態 | Pass/Fail/Note |
|---|---|---|---|
| 清存檔 | 備份後移除目前 `userData/save.json` 或使用遊戲內新存檔槽 | 進入遊戲時視為 fresh save |  |
| 計時器 | 從第一次進入主畫面或 pet 展開主窗開始計時 | 所有 checkpoint 用同一支碼表記錄 |  |
| 教學狀態 | 確認 Settings 內未啟用「跳過所有教學」 | `welcome` 應可於 fresh save 觸發 |  |
| 視窗狀態 | 使用預設桌面視窗尺寸，必要時再補 800x600 smoke | 教學 spotlight、tooltip、表格、按鈕不重疊 |  |
| 記錄方式 | 開一份測試紀錄，逐列填 Pass/Fail/Note | 每個 fail 都有時間、畫面、重現步驟 |  |

本輪必須特別記錄 25 條 tutorial step 的觸發狀態：`welcome`、`first-disciple`、`first-breakthrough`、`first-new-building`、`unlock-dao`、`unlock-autoassign`、`unlock-automation`、`unlock-goals`、`unlock-ascend`、`unlock-echoes`、`unlock-inheritance`、`unlock-fortune`、`unlock-bonds`、`unlock-inventory`、`feat-batch-100x`、`feat-batch-1000x`、`feat-batch-max`、`feat-upgrade-tree`、`feat-enhance-root`、`feat-seclusion`、`feat-skill-tree`、`feat-affinity-match`、`feat-spirit-box`、`feat-enchant`、`feat-tribulation`。

系統起始開放應包含 `inventory`、`buildings`、`disciples`；`recruit` 在擁有 1 位弟子後解鎖；`dao` 在完成 1 次突破後解鎖；`autoassign` 與 `automation` 在 5 位弟子後解鎖；`goals` 在 3 座建築後解鎖；`fortune` 在遊玩 25 分鐘後解鎖；`bonds` 在遊玩 30 分鐘後解鎖；`echoes` 與 `inheritance` 在 1 次飛升後解鎖。若 UI 顯示與這些規則相反，列為 gate bug。

### M71 實測 anchor 參考

下表是本 playbook 的時間校正基準。人工 tester 以「人工窗口」判斷體感與可達性；M71 實測值用來判斷若實測遠慢於窗口時，該記錄為 balance anchor 或操作引導問題。

| Anchor | M71 `optimal-no-tutorial` | M71 `optimal-with-tutorial` | 人工窗口 / 判斷 |
|---|---:|---:|---|
| firstBreakthrough | 0m | 1m | 2m 內應可見；超過 3m 記 High |
| firstNewBuilding | 0m | 0m | 3m 內應可見；超過 5m 記 High |
| fifthDisciple | 0m | 0m | 15m 內應可達；超過 20m 記 balance anchor issue |
| firstAscension | 29m | 30m | 5h 內應可達；人工 30m-3h 需看到明確飛升方向 |
| Stage 5 | 29m | 30m | 5h 內應可達；若 UI 到條件後不解鎖記 gate bug |
| Stage 7 | 30m | 30m | 24h sanity bound；人工可用長跑或測試存檔補驗 |
| feedbackDensity30m | min=60 | min=60 | 前 30m 每窗口至少 5 events |
| spiritQi minute 60 | 720100.0000000002 | 694700.0000000002 | 分別為 M61 baseline 的 9.48x / 9.15x，需留在 3x-10x cap 內 |

## 2. Phase A：Stage 0-2 早期（0-5 分鐘）

此階段驗證新手入口、第一位弟子、第一次突破、第一座建築與核心教學鎖定。M66-auto 的整體 anchor 要求 firstBreakthrough ≤ 2 分鐘、firstNewBuilding ≤ 3 分鐘；人工測試可用 0-5 分鐘窗口確認功能可達，但若 3 分鐘內完全沒有突破或建築進展，需記錄為節奏風險。

| 時間 | 預期事件 | 教學該觸發 | 通過條件 | Pass/Fail/Note |
|---:|---|---|---|---|
| 0:00 | fresh save 進入主畫面 | `welcome` | 歡迎提示出現，非目標區域點擊被攔截，能按「下一步」 |  |
| 0:15 | 第一位弟子可見 | `first-disciple` | 弟子卡存在，spotlight 指向 `[data-tutorial-target="disciple-card"]` |  |
| 0:30 | 初始系統 gate 檢查 | 無新增 | 倉庫、建築、弟子可用；高階系統不應提前全開 |  |
| 1:00 | 操作弟子與靈氣收益 | 無新增或核心引導 | 資源數字持續變化，無 NaN、Infinity、負數 |  |
| M71 0-1m / 人工 1:30 | 準備第一次突破 | `first-breakthrough` | 突破按鈕被 spotlight 指向，按鈕文字不被遮擋 |  |
| M71 0-1m / 人工 2:00 | 完成第一次突破 | `unlock-dao` 可能接續 | 弟子境界提升，Stage 應至少到 2，道學入口按規則出現 |  |
| M71 0m / 人工 2:30 | 第一座新建築可見 | `first-new-building` | 建築 tab 可進入，新建築或新建築卡片可辨識 |  |
| 3:00 | 倉庫教學檢查 | `unlock-inventory` 於打開倉庫時觸發 | 倉庫可顯示物品與配方狀態，教學只觸發一次 |  |
| 4:00 | 基礎建築升級 | 無或 `feat-affinity-match` | 升級後產出變化可見，派別配對提示不應在無匹配情境亂跳 |  |
| 5:00 | 早期總結 | 已觸發核心 4 步 | 無卡死遮罩；可繼續招募、突破、升級建築 |  |

此階段的 fail 優先級很高。若 `welcome`、`first-disciple`、`first-breakthrough`、`first-new-building` 任一核心流程不能正常完成，後續測試仍可繼續，但必須在 bug 表標記為 blocking onboarding issue。核心流程的 `skipLevel` 只有 `all-only`，不可出現「跳過此步」造成流程殘缺。

## 3. Phase B：Stage 3-4 中期（5-30 分鐘）

此階段驗證 5 位弟子、分派、自動化、道學、目標、強化靈根、閉關、升級樹與前 30 分鐘回饋密度。M66-auto 要求 fifthDisciple ≤ 15 分鐘，前 30 分鐘 feedbackDensity 每窗口 ≥ 5 events；人工測試應觀察是否每幾分鐘都有明確解鎖、升級、突破、研究或目標回饋。

| 時間 | 預期事件 | 教學該觸發 | 通過條件 | Pass/Fail/Note |
|---:|---|---|---|---|
| 5:00 | 嘗試持續招募 | 無或招募相關提示 | 弟子數可穩定增加，招募入口不被 gate 誤藏 |  |
| M71 0m / 人工 8:00 | 達成或接近 5 位弟子 | `unlock-autoassign`、`unlock-automation` | 分派與自動化入口出現，教學可單步或群組跳過 |  |
| 10:00 | 檢查派別配對 | `feat-affinity-match` | 將主派或副派弟子放入相符建築，產出倍率或提示可見 |  |
| 12:00 | 檢查建築指派 | 無或分派提示 | `building.assign-disciple` Stage 3 可用，錯配不造成 UI 崩潰 |  |
| M71 0m / 人工 15:00 | 第五弟子 anchor | 無或系統教學排隊 | 若仍少於 5 位弟子，記錄原因：資源不足、入口不明、招募卡死 |  |
| 18:00 | 道學與研究 | `unlock-dao` 若先前未見 | 道學 tab 顯示節點，研究操作不破壞資源顯示 |  |
| 20:00 | Stage 4 功能檢查 | `feat-upgrade-tree`、`feat-enhance-root`、`feat-seclusion` | 升級樹、強化靈根、閉關在 Stage 4 可見；Stage 5+ 功能仍 gate |  |
| 25:00 | 天機時間 gate | `unlock-fortune` | 遊玩 25 分鐘後天機入口出現，過早或過晚都記錄 |  |
| 30:00 | 羈絆時間 gate | `unlock-bonds` | 遊玩 30 分鐘後羈絆入口出現，前 30 分鐘事件密度足夠 |  |

Stage 3 的條件是弟子數 ≥ 5；Stage 4 的條件是突破數 ≥ 5。若 tester 已達條件但 UI 沒有變化，先截圖並記錄當前 discipleCount、breakthroughCount、buildingCount、ascensionCount、playtimeMinutes。若 UI 提前顯示 `building.batch-100x`、`building.batch-1000x`、`building.batch-max`、`disciple.skill-tree`、`fortune.spirit-box`、`fortune.enchant` 或 `fortune.tribulation`，視為 feature gate 提前開放。

## 4. Phase C：Stage 5 飛升前夜（30 分鐘-3 小時）

此階段不是要求一定在 3 小時內完成所有飛升，而是驗證飛升前的長線目標是否清楚：突破曲線、技能樹、飛升按鈕、天劫提示、目標追蹤與資源需求必須能被玩家理解。M65/M66 的方向是第一次完整世界飛升落在 3-5 小時；人工測試在 30 分鐘到 3 小時應至少看到「我正在往飛升靠近」的訊號。

| 時間 | 預期事件 | 教學該觸發 | 通過條件 | Pass/Fail/Note |
|---:|---|---|---|---|
| M71 29-30m / 人工 30:00 | 中期狀態盤點 | 無 | 記錄弟子數、建築數、突破數、最高境界、spiritQi；若已達飛升或 Stage 5，記錄具體時間 |  |
| 45:00 | 目標系統回查 | `unlock-goals` 若 buildingCount ≥ 3 | 目標列表能指出下一個短中期方向，不是空白或過期 |  |
| 60:00 | M71 cap 對照 | 無 | 60m spiritQi 參考值：optimal-no-tutorial 720100.0000000002，optimal-with-tutorial 694700.0000000002；人工可慢，但不應完全停在 Stage 1-2 |  |
| M71 29-30m / 人工 75:00 | Stage 5 候選功能 | `unlock-ascend`、`feat-skill-tree` | 達到飛升條件時，飛升按鈕出現且說明不暗示 reset |  |
| 90:00 | 連續突破壓力測試 | 無 | 多次突破後 UI、事件 log、資源格式仍穩定 |  |
| 120:00 | 飛升前提示 | `feat-tribulation` 可能於對應 feature unlock | 天劫或飛升前選擇如出現，文案、按鈕、結果可讀 |  |
| 180:00 | Phase C 結束盤點 | 無 | 記錄是否已達 Stage 5；未達時記錄卡點，不直接判定玩法 fail |  |

特別注意「永不重置」原則。飛升應讓該弟子離開並留下長期加成，不能清空其他弟子、建築、倉庫、道學、目標或宗門進度。若任何流程出現 prestige、rebirth、reset 類文案或行為，列為高優先級設計違反。

## 5. Phase D：Stage 6-7 後期（3+ 小時）

此階段驗證第一次飛升後的系統串接，以及更後期 gate 是否正確。若 3 小時內尚未飛升，tester 可保留原紀錄並用加速、debug save 或後續 M66/M72-final 提供的測試存檔補跑此章，但必須標記使用了哪種方式。

| 時間 | 預期事件 | 教學該觸發 | 通過條件 | Pass/Fail/Note |
|---:|---|---|---|---|
| M71 29-30m / 人工 3:00+ | 完成第 1 次飛升 | `unlock-echoes`、`unlock-inheritance` | 殘影與傳承入口解鎖；其他既有進度不被清空 |  |
| 3:10+ | 檢查 Stage 5 功能 | `unlock-ascend` 若先前未見 | `overview.ascend-button`、`disciple.ascend`、技能樹符合 Stage 5 gate |  |
| 3:30+ | 第 2 次飛升後 | 無或系統提示 | Stage 6 條件為 ascensionCount ≥ 2 且 playtime ≥ 30 分鐘 |  |
| 3:45+ | Fortune sub-tabs | `feat-spirit-box`、`feat-enchant`、`feat-tribulation` 視 gate | Stage 6 可見 wheel/gacha；Stage 7 才開 spirit-box/enchant/tribulation |  |
| 4:00+ | 羈絆與編隊 | 無或 `unlock-bonds` | bond bonus、同派 stacking 提示與產出不互相矛盾 |  |
| M71 29-30m / 人工 5:00+ | Stage 5 anchor | 無 | M66 目標為 stage5 ≤ 5h；若未達，記錄阻塞乘區與玩家操作 |  |
| M71 30m / 24:00 內 | Stage 7 sanity | 無 | stage7 ≤ 24h 是 sanity bound；人工測試可由長跑或存檔補驗 |  |

Stage 7 的條件是 ascensionCount ≥ 5，代表全部 14 系統與全部 sub-feature 解鎖。此時再檢查 `building.batch-1000x`、`building.batch-max`、`auto.dispatch-toggle`、`auto.dispatch-run`、`auto.recycle-byproducts`、`fortune.spirit-box`、`fortune.enchant`、`fortune.tribulation`。任何 Stage 7 功能若在 Stage 4 以前出現，都要回報為新手 UI 過載；若 Stage 7 已達仍不可見，回報為 gate 遺漏。

## 6. Phase E：跳過教學流程驗證

此章用第二份乾淨存檔或重置教學後執行，不要污染 Phase A-D 的主紀錄。目的在於確認 M60 三層跳過不會破壞 progression：單步跳過只跳當前 step，群組跳過只跳同類系統，全跳過則永久禁用 overlay，但所有系統解鎖與 feature gate 仍照常運作。

| 時間 | 預期事件 | 教學該觸發 | 通過條件 | Pass/Fail/Note |
|---:|---|---|---|---|
| 0:00 | fresh save 觸發 welcome | `welcome` | 只能全跳過核心流程，不能單步跳核心造成半完成 |  |
| 0:30 | 點選跳過全部 | 後續不再出現教學 | 弟子、突破、建築、道學仍可正常解鎖 |  |
| 2:00 | 重置教學後重跑 | `welcome` 重新出現 | Settings 的重新體驗教學可清空 completed |  |
| 5:00 | 系統教學單步跳過 | 例如 `unlock-dao` | 只完成或略過該 step，其他系統 step 仍會排隊 |  |
| 8:00 | 群組跳過 | 例如自動化群組 | 同 group 不再彈，但其他 group 如 fortune/bonds 不受影響 |  |
| 15:00 | skip all profile 對照 | 無 overlay | 操作節奏接近 `optimal-no-tutorial`，不應因隱藏教學而卡流程 |  |

跳過教學不是跳過遊戲內容。若跳過後系統入口消失、存檔不能恢復、已完成 step 重複刷屏，或 group skip 把不相關 step 一起關閉，全部列為 tutorial state bug。若 skip all 後仍出現 overlay，也要記錄當前 step id 與觸發操作。

## 7. Phase F：離線收益驗證

此章驗證 idle 桌面遊戲最重要的信任基礎：關閉或離開後回來，產出、時間、存檔、教學狀態與 gate 都要一致。離線收益不應繞過核心條件，也不應因視窗關閉造成 race 或重複發獎。

| 時間 | 預期事件 | 教學該觸發 | 通過條件 | Pass/Fail/Note |
|---:|---|---|---|---|
| T0 | 記錄當前狀態 | 無 | 寫下資源、弟子、建築、突破、當前教學 step、stage |  |
| T0+1min | 關閉主窗或退出後重開 | 不應重播 completed step | 資源增加或維持合理；無倒退、無 NaN |  |
| T0+5min | 再次離線回來 | 只觸發新解鎖 step | 若離線期間達 unlock condition，回來後可見對應入口 |  |
| T0+30min | 長離線 smoke | `unlock-fortune` / `unlock-bonds` 視時間 | playtimeMinutes gate 不應因系統時鐘錯誤提前大量跳階 |  |
| 飛升後 | 離線前後對照 | `unlock-echoes` / `unlock-inheritance` 已完成則不重播 | 殘影、傳承、既有建築與資源保持一致 |  |

離線收益測試要分辨「允許的 idle growth」與「錯誤的條件繞過」。例如資源增加可以接受，但沒有 5 位弟子就不應解鎖 Stage 3；沒有突破就不應解鎖 Stage 2/道學；沒有 ascensionCount 就不應解鎖殘影或傳承。若離線回來一口氣觸發多條教學，queue 必須順序清楚、能逐步完成，不能多個 overlay 疊在一起。

## 8. Phase G：M71 已知問題與 workaround

M71 final 仍保留一個已知問題：兩個 idle profile 都是 8/8 criteria FAIL。`idle-no-tutorial` 與 `idle-with-tutorial` 的 firstBreakthrough、firstNewBuilding、fifthDisciple、firstAscension、Stage 5、Stage 7 全部為 `null`，feedbackDensity30m 為 `min=0, failingWindows=30/30`，60 分鐘 spiritQi 分別停在 107400 / 107300，均低於 3x-10x cap 下界。

根因不是常數仍未調好，而是 M71 的範圍限制為 constant-only；目前 simulator 的 `applyIdleDecisions()` 會回傳原 state，不會自動招募、建造、突破、飛升或產生 feedback events。因此 M63/M64/M65/M68 的成本、產出與倍率補丁只能改善已有決策路徑，不能讓純 idle profile 自行進行 progression。

| Issue ID | 已知問題 | 影響 | Workaround / 測試方式 |
|---|---|---|---|
| `M72-PHASE-G-001` | idle profiles 8/8 FAIL | 純不操作的 simulator profile 無法代表 v1.1 可玩主路徑；不能用它判定 optimal 玩家節奏失敗 | 主流程驗收以兩個 optimal profile 與人工操作路徑為準；idle/offline 章節只驗證「已有進度」的離線收益與 gate 一致性 |
| `M72-PHASE-G-002` | idle feedbackDensity30m = 0 | 純 idle 不產生招募、建造、突破等進階事件 | 人工測試需執行最小操作序列：確認弟子、招募、建築、突破後再觀察 feedback queue |
| `M72-PHASE-G-003` | idle 60m spiritQi 低於 3x cap | 資源自然增長存在，但沒有決策推進，cap 判斷失去意義 | 只在有決策 profile 上使用 60m cap；離線收益以無倒退、無 NaN、無 gate 繞過為通過條件 |

若後續要讓 idle profile 通過 M66-auto，需另開 milestone 修改 simulator/player-profile decision logic，至少讓 idle profile 在可行且低頻的條件下自動招募、建造、突破與處理基礎教學。M72-final 不應在文件中把 idle FAIL 隱藏，也不應要求 tester 用純 idle 結果推翻兩個 optimal profile 的 8/8 PASS。

## 9. Bug / Issue 記錄表範本

每個 bug 都要能被下一位 tester 或工程師重現。若只是「感覺慢」，也要寫出當時時間、狀態與期望 anchor，方便後續 M72-final 或 M71 調參比對。

| 欄位 | 填寫內容 |
|---|---|
| Issue ID | 例如 `M72-MANUAL-001` |
| 發現時間 | 遊戲內相對時間與真實時間，例如 `12:30 / 2026-05-12 23:40` |
| Phase | Pre-flight、A、B、C、D、E、F、G |
| 嚴重度 | Blocker / High / Medium / Low |
| 類型 | tutorial、unlock gate、balance anchor、UI overlap、save/offline、copy、performance |
| 前置狀態 | discipleCount、breakthroughCount、buildingCount、ascensionCount、playtimeMinutes、stage |
| 重現步驟 | 1-5 步，從可觀察狀態開始，不寫模糊描述 |
| 實際結果 | 畫面、數值、log、錯誤訊息 |
| 預期結果 | 對照本文 checkpoint 或源規則 |
| 證據 | 截圖、錄影、save、console log、event log |
| 暫定判斷 | 可能來源，例如 tutorial queue、feature gate、stage compute、persistence |
| 後續處理 | 待修、已修待驗、非 bug、需設計裁決 |

範例：`M72-MANUAL-001`，Phase A，High，fresh save 後 `welcome` 出現，但點擊遮罩外仍能操作建築 tab。預期是 TutorialOverlay 攔截 target 外點擊；實際是玩家可在教學未完成時改變頁面，導致 `first-disciple` spotlight 指向不存在元素。證據需附截圖與操作順序。

## 10. 驗收結論模板

測試結束後，把本節複製到測試報告底部並填寫。結論要短，但必須能回答三件事：是否可交給 M72-final refinement、是否存在 blocker、哪些 anchor 需要 simulator 或工程再驗。

| 項目 | 結論 |
|---|---|
| 測試日期 / tester |  |
| build / commit / branch |  |
| 主路徑結果 | Pass / Conditional Pass / Fail |
| Phase A 結論 | 核心 4 步教學是否全通；firstBreakthrough / firstNewBuilding 是否在窗口內 |
| Phase B 結論 | 5 位弟子、Stage 3-4、道學、自動化、天機、羈絆 gate 是否合理 |
| Phase C 結論 | 飛升前目標感是否清楚；Stage 5 是否在 5h 目標內可達或有明確卡點 |
| Phase D 結論 | 飛升後殘影、傳承、Stage 6-7 gate 是否正確 |
| Phase E 結論 | 單步、群組、全跳過是否不破壞解鎖 |
| Phase F 結論 | 離線收益是否穩定且不繞過條件 |
| Phase G 結論 | idle profile 已知問題是否已記錄；是否按 workaround 驗證人工路徑 |
| Blocker 清單 |  |
| High/Medium issue 數 |  |
| 需要 M72-final 補充的資料 | 例如 M66-auto 報告、長跑存檔、截圖基準 |
| 驗收判定 | `PASS` / `PASS_WITH_ISSUES` / `FAIL_BLOCKED` |

建議判定規則：若 Phase A 核心教學任一不可完成、存檔會遺失、系統 gate 大面積錯誤、飛升造成重置，直接 `FAIL_BLOCKED`。若主流程可玩但存在中後期節奏或文案問題，判為 `PASS_WITH_ISSUES` 並列入 M72-final。若 10 章 checkpoint 均有紀錄、沒有 blocker，且所有 fail 都有 issue ID 與證據，才可判為 `PASS`。
