feat(new8): 批次1收口——radio/dungeon 双双标记可交付(R3 synthesis×2 + H1 热修 + 定向live复验PASS)

- radio:R3 放行(4/4 人设满分档 5/5、愿意玩、P0=0;live 四修坐实+SA3 真声入局)
- dungeon:R1 0/4→R3 4/4 翻案达成;H1 死亡结算链截断根修(真凶=双击窗幽灵 tap 死后回调路由进 SETTLE,800ms 手势死窗;7 断言含旧代码反证)+ 定向 live 复验 PASS(两局含 R3 同款幽灵场景,结算链 7 句逐句完整)
- 章程账本更新:批次 1 验收 ☑(R4-R6 经用户裁定暂停,视上手反馈续;v2 首条=漫游迷路抢救盲区)
- 断言账面:radio 246 / dungeon 1649 / 9 套件全绿
This commit is contained in:
xsl
2026-09-03 03:01:45 +08:00
parent f7509ad5d8
commit 45124a1b9b
11 changed files with 464 additions and 3 deletions
+35
View File
@@ -677,3 +677,38 @@ choice 签名本作不使用(无抉择态;菜单是 menu)。菜单回绕
人测(roadmap §4)。
- 教学跳过标志跨会话不一致、探针通道隔离:harness/仪器侧。
- P3 建议「上滑加第 6 句最近铁器方位」「撞墙归因句」:未列入本轮清单,留终审裁定。
### H1 热修(dev,2026-09-02):死亡结算链被「在途手势」截杀——结算入口手势死窗
- **现象(R3 live A 局 2787.057,唯一阻塞交付的 P1)**:Boss 重击致死后结算链只播了
`die_intro` 前 0.18s(vstart 2786.88 → vend kill 2787.057),`die_cause_2`/`die_adv_*`/
`st_floor_3`/金币档/`settle_stronger`/`settle_again` 后 6 句零 fetch 零 vstart,结算屏
静默 76s,直到玩家下一次单击——而那次单击开出的是 `sys_new_run`(新周目),不是结算重听。
- **根因(events.jsonl 逐事件推演,非 live 报告猜想的语音链调度竞态)**:
① 引擎 gesture.js 非即时模式下单击要等双击窗(`doubleTapWindow=300ms`)关闭才回调
`onGesture('tap')`(gesture.js `pendingTapTimer`);② 致命前摇 resolve(t=2786.78
`_enemyResolve` → `_die`)落地时,玩家上一记 tap 还压在双击窗里;③ 2787.057 tap 回调时
`onGesture` 按「当时」状态路由——state 已是 SETTLE → `_onSettleGesture('tap')` →
**`_enterTitle()`**:`_session++` 作废结算会话 + `audio.stopVoice()` 无回调掐死
`die_intro`(引擎约定「打断即作废整链」,onComplete 不触发 → 后 6 句永不接续),
且 run 已清 → TITLE 空链全静默。证据闭环:vend 时刻恰有 gesture.js 的 confirm 震
([20],2787.057),三次 tap 的「记录→回调」间隔均为 ~360ms(touchend+300ms),
「单击开出新周目」正是 TITLE 态 tap 语义。虚拟时钟 playtest 未抓到:旧 mock 直通
`onGesture`,从不在死亡后补派在途手势。
- **修法(web/dungeon/game.js,最小面)**:新增 `SETTLE_GRACE_MS=800` 手势死窗——
`_die()`/`_settleWin()` 进结算时盖 `this._settleGraceUntil` 戳;`onGesture` 在 SETTLE 态、
非菜单、戳内的一律吞掉(ghost 手势不算玩家输入,不碰 `_stuck.pending`)。窗口上界取
手势最迟回调时刻 touchstart+450ms(长按判定)+300ms(双击窗)≈750ms,800ms 全盖;
死窗后结算手势照常(tap 回标题 / 双击重听链 / 下滑菜单),设计出口不受影响。
战斗收尾链不需 abort:死亡时战斗语音链早已自然播完(swish onComplete 才会进前摇),
死亡链独占通道的前提本就成立——本次截杀者是 stopVoice 而非排队顶号,与 R2
「`_finishVoice` token 校验/加载竞态」语义无涉,引擎零改动。
- **断言(playtest 场景 6d,7 条)**:mock 构造 live 同款序列(挥空 → btl_swish 收尾链 →
敌前摇 → 致命 resolve),死亡后同拍与 +300ms 各补派一枚在途 tap:①两枚 tap 均被吞
(仍在 SETTLE);②结算链 7 句完整有序播出(结算屏有内容);③`die_intro` 恰播一次
(未被 `_enterTitle`/stopVoice 截杀);④死窗后 tap 正常 → TITLE(出口不受死窗影响)。
**旧代码验证**:stash 修复后同场景 5/7 断言即挂(tap 跳 TITLE、链断),与 live 签名一致。
- **回归**:dungeon 1642→**1649 全绿**;escape 140 / radio / rhythm 141 / rpg 188 /
simon 132 / space 155 / storyline 八套件全 PASS。
- **遗留**:真机 live 定向复验待下一轮(「挥空瞬间被打死 + 死亡瞬间按着屏幕」场景);
`_settleWin`(终局通关结算)同栅已顺手盖住,但通关路径无 live 负样本。