adventure-table

M04 — 測試指南

Phase:M04 — Web Chat MCP Integration & AI Join Kit 本文件定義 M04-A~M04-C 每個 Subphase 的自動 / 人工驗收流程與測試證據要求。驗收意圖見 實作規格.md;實作契約見 開發設計方針.md

最後更新:2026-09-11


1. 測試總則

1.1 M04 的 E2E 範圍對照

Subphase diff 性質 Subphase 關門要跑的 E2E
M04-A 只動 tools/m04a-webchat-preflight/ 與 docs,不碰 app 無。以人工 preflight 記錄為證據
M04-B backend:OAuth package、migration、auth 分流、可能的相容層;不碰 apps/web(authorize 頁是 server-rendered) 無新 Playwright;以 protocol/OAuth pytest 與 B.8 人工 gate 為證據。若 4.7 落在 per-role URL 且動到前端顯示 URL,跑 p3e-mcp-browser-integration.spec.ts
M04-C backend 加 guide/briefing;apps/web 兩個面板加 kit m04c-ai-join-kit.spec.ts(新);p3e-mcp-browser-integration.spec.tsm02h-bilingual-site-smoke.spec.ts 若已納入 Lobby 路由則一併跑

合併回 main 前比照 AGENTS.md「Phase 關門」跑全套 Playwright(npm run test:e2e:docker)。


2. 共通測試資料與觀察值

2.1 Fixture

2.2 觀察值


3. M04 Subphase 順序

M04-A — Web Chat MCP Preflight
→ M04-B — Adventure Table Web Chat Integration
→ M04-C — AI Join Kit, Server-hosted Guide & Other Client Compatibility

M04-A — Web Chat MCP Preflight

M04-A 的 app 側只有兩條 static/unit 測試;其餘證據全部是人工 preflight 記錄,依「ChatGPT Plus → Claude chat 個人方案」階梯對每個嘗試的平台各記一輪。以下每項對應實作規格 A.n。

A.0 Prerequisite 與階梯記錄

M04-A_PREFLIGHT.md 開頭記錄:

A.1 測試 server 自檢

tools/m04a-webchat-preflight/README.md 的 smoke 步驟,用 curl 走一遍:metadata 兩個 endpoint 200、/registerclient_id/authorize 表單 200、以 dm 完成 code → token、tools/listdm_only_pingpost_note 回 seq、以 player 重做後 tools/list 不含 dm_only_ping經公開 tunnel URL 打 /admin/add-tool 得 404,經 127.0.0.1:<admin_port> 打得 200;打完 /token 後檢查 JSONL 該行的 response_body 不含 access_tokenrefresh_token 明文。記錄 JSONL 行號。

另有兩條自動測試:

A.2 OAuth 一次成功

記錄表(每列一個 request):endpoint、method、平台送的關鍵欄位(遮罩後)、我們回的關鍵欄位。至少涵蓋:metadata discovery 有無、DCR 有無與 body、authorize query、token request 的 grant_type/PKCE、refresh 是否被呼叫。

A.3 Scan Tools 與 protocol 實錄

記錄:Scan 觸發的每個 JSON-RPC method 依序、MCP-Protocol-Version 值、Mcp-Session-Id 有無、Accept_meta 內容、平台對 initialize 回應中 protocolVersion 的接受情況。

A.4 Read 與 write 各成功一次

A.5 Tool cache/refresh/re-auth

五步各一列:操作、平台端 tool 清單(截圖或文字)、需要的使用者動作(無/Refresh/重新發佈/新 connector)、JSONL 行號。第 4 步(revoke)另記平台的錯誤呈現與是否自動重新 authorize。

A.6 Long-poll 容忍度

wait_seconds 10/30/60(若 60 通過再試 90、120):每次記成功或平台端 timeout 訊息。結論寫成一個數字。

A.7 架構結論

M04-A_PREFLIGHT.md 最後六個小標(開發設計方針 3.4)各一句結論 + 證據行號,第一個是 Target platform。這是 M04-B 開工的輸入;缺任何一項 M04-A 不得關門。判定 Platform Blocked 時,M04-A closeout 同時把 PROJECT_BRIEF 的 M04-B/M04-C 標為延後、下一步改 P4。

A.8 順帶量測(非 gate)

Claude Desktop 若有量,記 A.3 同格式;沒有就寫「未量」。Claude chat 個人方案若已作第二階正式量測則不屬本項。


M04-B — Adventure Table Web Chat Integration

B.1 OAuth endpoint

tests/test_m04b_oauth_endpoints.py

B.2 OAuth token 只對應既有 grant

tests/test_m04b_oauth_grant_binding.py

B.3 Seat 不可在 OAuth 內建立、選擇或切換

tests/test_m04b_oauth_seat_invariant.py

B.4 Protocol 相容層(僅在 preflight 證明必要時)

tests/test_m04b_legacy_protocol.py

B.5 Catalog 呈現

依 4.7 落點:

B.6 wait_for_event timeout 上限

test_m04b_wait_timeout_cap.py::test_mcp_wait_timeout_capped_to_preflight_value:MCP 入口 timeout 超過實測值回 validation error;Human UI long-poll endpoint 上限不變。

2026-09-12 修訂:M04-C 交付時上限改 120,本測試斷言同步改為「120 通過、120.1 拒絕」;Human UI le=60 斷言不變。

B.7 對外入口文件

B.8 真實目標平台 DM 與 Player gate

寫入 M04-B_CLOSEOUT.md,兩場各一表:

步驟 證據
Lobby 產生憑證/Let AI Control 截圖或 UI 文字
平台加 connector、OAuth 貼 token server log 的 authorize/token 行(遮罩)
Scan Tools 看到的清單 截圖或文字;與 4.7 落點一致
get_session_contextstart_session(DM)/post_dialogue(Player) event seq
Human 回應 → AI wait_for_event 收到 → AI 再回應 event seq
Player 場:Human DM request_check → AI roll_pending roll result id
Owner revoke/Human Take Back Control → AI 下一次呼叫失效;若平台嘗試 refresh,refresh 也被拒 平台端錯誤呈現 + server 401/oauth_invalid_grant log

記錄方案、日期、protocol version、認證形態、AI 從 connector 加好到第一次成功 get_session_context 的 tool call 次數。

B.9 回歸


M04-C — AI Join Kit, Server-hosted Guide & Other Client Compatibility

C.1 GET /mcp/guide

tests/test_m04c_mcp_guide.py

C.2 指引與 tool catalog 同源

tests/test_m04c_guide_tool_parity.py

C.3 tool description 加厚

tests/test_m04c_tool_descriptions.py

C.4 briefing

tests/test_m04c_briefing.py

C.5 server/discover.instructions

tests/test_m04c_discover_instructions.py:含 /mcp/guideget_session_contextttlMscacheScope 仍在。

C.6 kit builder 與面板

apps/web/src/features/rooms/AIJoinKit.test.ts

tests/test_m04c_public_origin_endpoint.py

擴充 LobbyAIDMGrantPanel.test.tsPlayerAIControlPanel.test.ts:issued 後 [data-ai-join-kit] 出現、複製內容 == textarea、下載 spy 與檔名、既有 token-once 測試不動。

C.7 E2E

apps/web/e2e/m04c-ai-join-kit.spec.ts

C.8 真實 AI 只憑 kit 進桌

路徑 程序 必須觀察到
MCP client(Bearer) 新開 Claude Code session,工作目錄不在本 repo,只給 kit,提示語僅「依這份檔案進桌當 DM」 claude mcp add(或等價)→ get_session_contextstart_sessionpost_narrationwait_for_event → Human 回一句 → AI 再回
純 HTTP 一個確定具備 outbound network 的 code-execution client(例如 Claude Code 不設定 MCP),只給 kit GET /mcp/guide → 依範例寫 client → 同上迴圈

記錄 client、版本、日期、拿到 kit 到第一次成功 get_session_context 的 tool call 次數、AI 有沒有問指引已寫的事(有就是缺口,回填後再跑)。

2026-09-12 修訂(使用者拍板):上表兩條路徑延後。M04-C 的 C.8 gate 改為 ChatGPT Web Plus(目標平台)憑 Lobby/Session 產出的 kit 進桌一次,由使用者人工執行,結果記入 M04-C_CLOSEOUT.md「C.8」;同日暴露的行為缺口(request_check 友善 ref、擲骰提示進 Chat)以 commit 回填。

C.9 其他 client 相容記錄(非 gate)

M04-C_CLOSEOUT.md「Compatibility」表:非目標平台的網頁版 chat、Codex CLI、Codex Desktop 各一列——平台、版本、日期、OAuth 成功與否、Scan 成功與否、卡點。全部失敗也不阻塞關門。

2026-09-12 修訂(使用者拍板):延後;closeout 不含此表。

C.10 回歸