# 13 · 六游戏试玩通过标准(playtest criteria,无头测试 agent 断言检查单) > **给测试 agent 的使用说明**:每游戏分三节——**关键路径**(从启动到通关/结算必须按序达成的事件序列,附最大手势/步数预算)、**边界断言**(必须显式验证的容错/保护行为)、**失败即不通过**。测试可用测试钩子(如直接读取 game 实例字段、快进计时器)模拟时间,但手势只能通过引擎回调注入(模拟真实判定路径)。语音缺失不应导致卡死(看门狗是各游戏的既定实现,属被测项)。 --- ## 1. storyline《声命线》 **关键路径**(单结局线,≤40 次手势): 1. 启动遮罩点按 → 音频解锁 → `n00` 旁白开始(voice 层有播放记录)。 2. 沿任一抉择路径行进:每个抉择点断言 `pendingChoice/choiceArmed` 生效,左/右滑各至少使用一次。 3. 到达任一结局节点(4 结局之一)→ 结局语音链 → 结算态单击重开回 `n00`。 **边界断言**: - 语音播放中双击 = 重听当前节点(同一 voice id 重播)。 - 下滑呼出菜单 → 返回剧情后节点不丢(mode 恢复,不重头)。 - 中途选择产生剧情标记:`n09` 右滑后 `knowTrap === true`、`n11` 左滑后 `companion === true`、`n18` 左滑后 `betrayed === true`(标记设置即断言;knowTrap 无下游消费是已知项,roadmap §2.2,不作为失败项)。 - 语音链看门狗:屏蔽某一 voice 资产时流程仍可推进到结局。 ## 2. escape《暗室》 **关键路径**(引导 8 步 + 解谜链,≤80 次手势): 1. 启动 → GUIDE 进入(g0_intro 播放)→ 依次:单击(G0)→ 任意滑动(G1)→ 滑动 ×2(G2)→ 左滑(G3)→ 下滑(G4)→ 单击拾钥匙(G5,断言 `hasKey === true`)→ 双击(G6)→ 进入 PLAY(断言 `phase === 'PLAY'`,localStorage `soundgame.escape.guideDone === '1'`)。 2. PLAY 路径:(0,2)出发 → 右滑×2 到铁柜房 (2,1) → 双击开柜(`cabinetOpen === true && hasFuse === true`)→ 左滑×2+上滑到电箱房 (0,0) → 双修复电箱(`powerOn === true`)→ 右滑×2+下滑×2 到大门 (2,2) → 双击逃脱。 3. ENDING:断言 time_band 语音播出 + 单击重开回 PLAY。 **边界断言**: - 引导期错手势:G3 右滑 → 播 guide_wrong_left;连错 3 次 → guide_blunt_left + warning 震动(监听 vibrate 调用)。 - 撞墙:PLAY 中 (0,0) 左滑 → wall 音效 + error 震动 + 位置不变。 - 卡关提示:计时器快进 60s/120s/180s → 依次播 stuck_*_1 / stuck_*_2 / stuck_*_3 + nav_*;任意进展事件后重置(`_stuckShown` 清空)。 - 单击检查 = 环境音先播、描述 800ms 后播(断言播放顺序)。 - 双击无目标兜底:播背包 + L2 明示,不崩。 ## 3. simon《音序回响》 **关键路径**(教学 + 5 轮 + 复活耗尽,≤120 次手势): 1. 启动 → 0.5s 后教学 T0(t0_welcome 播放)→ T1-T6 每步:听到 tone → 做出对应手势(断言 `teachIdx` 递进)→ T7 → 进入第 1 轮。 2. 第 1-3 轮:playback 阶段手势被忽略(注入手势断言 sequence 不受影响)→ input 阶段按 `game.sequence` 原样复现 → `round` 递增。 3. 触发复活:第 4 轮故意答错 → 断言 `chances` 1→0、序列**不变**重播(`sequence` 引用值相等)→ 复现成功 → 第 4 轮完成时 chances 回 1(每 4 轮 +1)。 4. 主动重听:input 阶段且期望输入非 doubletap 时双击 → 断言 chances 减少、inputIdx 清零、序列重播。 5. 耗尽后再答错 → gameover → 断言 score_band 语音与 `round-1` 匹配 → 单击重开跳过教学直达第 1 轮。 **边界断言**: - 无 BGM:全程无 bgm 层播放调用。 - 双击冲突(裁定①):期望输入恰为 doubletap 时双击 = 答题(inputIdx 前进),不触发重听。 - chances=0 时双击非期望手势:不判错(round 不变、inputIdx 不变)、播 chances_out。 - 序列约束:前 5 轮无三连同手势;全程无四连。 - 速度:第 1 轮 interval 700ms、第 12 轮起 420ms 下限。 ## 4. rhythm《节拍行者》 **关键路径**(教学 + 曲目一通关 + 解锁,≤200 次手势): 1. 启动 → welcome → 教学 T1-T3:按 cues 的 expected 时刻(测试用 AudioContext 时钟对齐)做对应手势 → `tutorialDone === true` → 进曲目一 main。 2. 曲目一:按 `_cues` 全部应答(Perfect 精度注入)→ 结算 phase 'end' → 断言评级 S(全 Perfect)→ `grades.song1 === 's'`、`unlocked === 2`、unlock_song2 播报。 3. 结算单击 = 同曲再来一遍;右滑 = 下一首(已解锁 song2 进入 main)。 **边界断言**: - tap 补偿:tap 音符以"回调时刻 -0.30s"判定(注入 tap 手势的实际回调延迟下仍判 Perfect)。 - Miss=无乐器音:窗口内做错手势 → 无 inst_* 播放 + error 震动 + combo 清零。 - 下滑折中:main 中无临近 down 音符时下滑 → 菜单(phase 'menu'、BGM 断点);有临近 down 应答音符时下滑 = 演奏判定,不开菜单。 - 菜单暂停恢复:关菜单后 cue.expected 平移、BGM 断点续播(断言 `_bgmT0` 平移量 = 暂停时长)。 - 教学失败 2 次 → retry_skip 跳过该步不卡死。 - **结算末位**:song3 结算页右滑 → 不播 song_locked(round3-4 裁定①的回归断言;修正落地前此断言预期失败,标记 known-issue)。 ## 5. space《盲航》 **关键路径**(演练 + 保护期 + 坠毁,≤150 次手势): 1. 启动 → 演练 D1-D4:按 `DRILLS[d].dir` 同向滑 → `drillIdx` 递进 → D5 后进 playing(`drillDone === '1'`)。 2. 保护期(runStart 起 60s):等一颗陨石 → **不滑动任其撞** → 断言 `hits === 0`(训练护盾吸收)+ protect_