adventure-table

P4 — 測試指南

Phase:P4 — Quick Combat
本文件定義 P4-A~P4-F 的自動/人工驗收與 closeout evidence。產品完成條件以 實作規格.md 為準;具體架構、schema、API、MCP與transaction contract以 開發設計方針.md 為準。

最後更新:2026-09-13


1. P4 Subphase 順序

三份 P4 文件固定使用:

P4-A — Monster & Combatant Foundation
P4-B — Combat Lifecycle, Initiative & Action Economy
P4-C — Attack, Damage & Core Action Resolution
P4-D — Spells, Conditions, Concentration & Reactions
P4-E — Quick Combat UI, DM Adjudication & AI Tool Surface
P4-F — Full P4 Integration & Closeout

每個 Subphase的 code與對應 tests同一小階段完成;先focused local驗證與static review,review完成後才依 AGENTS.md gate使用 GitHub Actions。


2. P4 測試核心風險

P4最危險的 regression包括:

P4 minimum gate:

campaign-scoped durable combat
+ one-active-combat concurrency invariant
+ initiative / turn authoritative state
+ action economy validation
+ P3 formal-roll reuse
+ atomic/idempotent attack + damage
+ enemy secrecy at projection layer
+ SRD monster/beast content completeness
+ Quick Enemy lifecycle
+ spell/resource correctness
+ conditions/concentration/reactions
+ no fake Quick geometry
+ DM adjudication path
+ Session-boundary resume
+ Human/AI service parity
+ real PostgreSQL migration/concurrency
+ restart recovery
+ standalone independence
+ real browser Quick Combat
+ real ChatGPT Web combat journey

3. 執行環境與指令原則

沿用 AGENTS.md 與 P3已記錄的 Windows / PowerShell 5.1規則:不使用 &&;backend pytest cwd在 apps/server,interpreter使用 repo root .venv

Backend focused示意:

Set-Location .\apps\server
..\..\.venv\Scripts\python.exe -m pytest tests\test_p4a_monsters.py -q

Frontend:

Set-Location .\apps\web
npm test -- --run
npm run build

E2E必須使用會 rebuild server + web的既有 full-stack路徑或 P4 wrapper,不得只 rebuild web。

若 P4建立 dedicated PostgreSQL env,建議:

P4_POSTGRES_URL

但 workflow仍要同時設定 required legacy test讀取的 env,並以測試輸出證明沒有 skip。


P4-A — Monster & Combatant Foundation

A.1 Content completeness

自動測試必須:

不要只用 3隻 fixture代表「全 SRD已導入」。

A.2 Template / Instance separation

至少測:

  1. Goblin Template建立 Instance A/B。
  2. A扣血、上 condition、消耗 reaction。
  3. B與 Template完全不變。
  4. Save A as Template產生新可重用 template時,不帶 current HP / initiative / reaction spent。

A.3 Quick Enemy

測最低 Name / AC / HP / Speed可加入;沒有 attack時仍可存在;加 Club +4, 1d6+2後可被後續 P4-C resolver讀取。

A.4 Enemy secrecy

同一 instance由 DM / Player actor讀:


P4-B — Combat Lifecycle, Initiative & Action Economy

B.1 Active Combat concurrency

真 PostgreSQL至少兩個 concurrent Start Quick Combat transaction打同 Campaign:只能一個成功建立 active Combat,另一個拿 stable conflict error;DB最後只有一場 active。

B.2 Initiative

測:

每個正式 initiative可追到 P3 RollResult;不得只有 final total無 raw die/audit。

B.3 Turn / economy

至少覆蓋:

B.4 Session boundary

Journey:

Session A start Combat
→ Round 3某人的 Turn
→ End Session A
→ assert Combat仍active、state不清
→ Start Session B same Campaign
→ Resume exact Round / Current Turn / entries

另外測 Abandon Session對 Combat state的產品規格行為不得誤清資料;若 current Session結束後沒有合法 DM可操作,Combat只是等待下一 Session,不自動 end。

Party差異至少再測:


P4-C — Attack, Damage & Core Action Resolution

C.1 Attack rules

Table-driven tests至少含:

C.2 Atomicity / duplicate

對同一 command id:

C.3 DM adjudication boundary

對 ranged attack / AoE等需要 geometry facts的 action:

C.4 Player 自行扣血與 Direct Edit boundary

active Combat至少測:

  1. Character HP=20, Temp HP=5,Player UI輸入「受到 7 damage」→ Temp HP=0, HP=18,不是直接把 current_hp減 7。
  2. damage中的 Character正在 Concentrating → 同一 pipeline建立合法 Concentration save request。
  3. damage把 PC降到 0 → 同 transaction套用 Unconscious + Prone / death-save state。
  4. 一般 Player / AI Player嘗試 raw absolute current_hp patch繞過 pipeline → reject或不可由 Combat gameplay surface取得。
  5. Human DM Direct Edit absolute HP → 作為 correction commit,不觸發新的 damage consequence,且有 audit event。
  6. outside active Combat既有 Current State手動 patch仍維持相容。

C.5 Grapple / Shove / Death

覆蓋 opposed checks、constraints、Grappled / Prone outcome與 death-save所有 nat / threshold branch。

Monster到 0 HP時 assert status沒有自動 dead;只有 DM outcome action改變。


P4-D — Spells, Conditions, Concentration & Reactions

D.0 Shared Character State / JSON compatibility

新增 Concentration、Exhaustion level、Death Save、persistent Temporary Effects時至少驗:

D.1 Spell source / resource

至少用:

確認 Cast後正確 pool扣除;duplicate command不重扣。

D.2 AoE

Fireball類 journey:Player選 proposed targets → DM confirm affected list → 同一 RollGroup建立多個 saves → damage依成功/失敗分支套用。Server不出現 radius coordinate / cell計算。

D.3 Concentration

測:

D.4 Conditions

2014 condition清單逐一至少有:

不能用「Condition名稱可存」代替 mechanical behavior gate。

D.5 Reaction / Ready

測 ReactionRequest reload/reconnect、accept/decline、reaction spent、防 duplicate resolution。Quick OA只有 DM trigger後才建立;Player movement text本身不得自動產生 OA geometry判斷。


P4-E — Quick Combat UI, DM Adjudication & AI Tool Surface

E.1 Browser UI

Playwright至少一條 DM + Player journey:

  1. DM從 Session toolbar Start Combat。
  2. Party auto include。
  3. 加 SRD Monster與 Quick Enemy至少各一。
  4. initiative完成。
  5. Player自己的 Turn能 Attack;非自己 Turn action disabled / server拒絕。
  6. 命中後 HP state與 compact Log同步。
  7. Player UI看不到 exact enemy HP / AC。
  8. DM UI看得到完整資料。
  9. Position Note留空仍可跑;填寫後顯示但不影響 rule calculation。
  10. DM處理一次 range/AoE/OA adjudication。

E.2 Payload secrecy

除了 browser DOM,直接攔 REST / Resume / event / MCP response驗證 forbidden fields不存在。這是 P4 closeout blocker。

E.3 MCP automated protocol

沿 M04的 2026-07-28 modern wire contract測 Combat tools:

E.4 Guide / briefing parity

自動 test確保 tool description、guide、briefing都包含:current turn、action/reaction限制、DM adjudication、resolve後回 wait loop;不能只有其中一處知道 combat workflow。


P4-F — Full P4 Integration & Closeout

F.1 Restart / reconnect

至少一次真 PostgreSQL + app restart整合:

active Combat
Round 4
Player waiting on save or ReactionRequest
→ restart server
→ reconnect Human / AI
→ exact current turn + pending state restored
→ resolve once

不得用 SQLite metadata.create_all當唯一 restart證據。

F.2 Full browser journey

完整 journey至少包含:

F.3 Real ChatGPT Web gate

使用現有 M04 connector / OAuth / AI Join Kit,不建立測試專用 AI入口。

最低人工 gate:

AI DM get_session_context
→ Start Quick Combat
→ add enemy / initiative
→ wait_for_event
→ Human or AI Player declares action
→ AI DM / Player uses formal combat tool
→ attack or save + damage resolves on table
→ advance turn
→ at least one further wait/reconnect continuity
→ End Combat

驗收者要在 Adventure Table UI看到實際 Combat state / Log / HP / turn變化;只有 ChatGPT回答文字不算通過。

若 tool call失敗,照既有 M04規則提供實際 tool error,不得用「可能 connector連不上」代替呼叫。

F.4 Regression / closeout evidence

P4 closeout需記錄:

P4-A~F都各自完成 closeout後,才進 Phase merge gate。


4. 人工驗收重點

自動測試之外,人眼特別確認:


5. P4 closeout blocker

以下任一成立不得關 P4: