opus 执行位交付、主会话四步验收过(三套测试亲跑/红线 diff 亲读/冒烟截图亲眼): - 验收消费:check 新增源码级插件调用存在断言(_pluginCallPresenceErrors 词法层, 接替 F_wiring 真接线护栏);_forensicsView「必须实现」拦截摘除,降级为可选调试 接口(handleTap 输入契约与 ctx.log 日志纪律保留);gate_judge 放行措辞对齐四门 - play-spec/驱动器退役(逐件裁定 10 件):gen.mjs done 门自动产 play-spec 摘除、 cheap_gates/cheap_studio/cheap_modify/service_driver 调用摘除、_read_driver_type 改读 evidence/playtest/playtest.json;golden-spec 三工具(auto_vs_golden/bake_off/ compare_node)显式封存;ensure_play_spec 两实现保留一个版本窗口(只摘调用不删码) - prompt 全加载链清洗:cheap-system.md v1.6.3→1.7.0(删 _forensicsView 自动验收 契约红线与全部 targets/occupied 语义,五法句/品类指路同步),cheap_roles 内置 回退逐字节同步(test_roles 12/12 证 parity),modify 切片经运行时切块自动同步; 5 品类 skills+littlejs 手册+recipes×2+模板 8 件+README 6 件教学清洗,真设计 价值(单击 casual/可解性质/双层反馈/latch)保留 - 批账:hard_genre_batch/xtheme 行加 playtest 段,_row_total_cost 修 shadow 下 测试员成本漏算(v2 取 max 防双计) 验收(主会话亲验):pytest cheap-worker 512 绿 + tier2 141 绿 + node 49/49; 25 局基线新旧口径重放对照——真坏 5 局全拦(floor 拦 2/测试员拦 3)、无一例旧拦 新放,翻案 2 局均为破案坐实的仪器误杀;n=3 冒烟(mode=v2)全链绿:w2v2-sim harness verdict.pass=True 而测试员 reject(机械放行测试员逮住,盘上双证)、 w2v2-sim-fix 现象反馈两轮回喂→fix2 收敛(配方显示修成,局内截图亲眼); rg 零残留(模板残留均为「验收不读它」的降级调试接口合规形态);真跑 ¥8.4。 已知余项:repairFeedback 有产地、Service 续修环消费者未接(测试员 reject 不入 RepairMiddleware,续修判据仍四门)——是否接入随波3 校准数据一并裁;v1 配置级 回退窗口关闭为创始人知悉项,genconfig 默认 mode 仍 shadow、切 v2 归创始人。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2.0 KiB
2.0 KiB
recipe: 场景机(menu → play → over 三态)
要做:菜单页 → 游玩 → 结算页,能来回切。
病根九成在这:sceneFsm.define({ menu:{...}, play:{...}, over:{...} }) 一个对象批量注册。define 第一参恒为场景名字符串——传对象 → 第一参被当成场景名 "[object Object]",menu/play/over 全没真注册 → 后续 transition('play') 找不到目标态被静默忽略 → 卡菜单进不去 play(合成/2048 类翻车点)。
根治:每个场景各调一次 define(name, handlers),第一参是字符串。
抄这段形态:
sceneFsm
.define('menu', {
onEnter() { this.startRect = menuStartRect(viewport); }, // 命中区在 onEnter 建(见 hit-rect.md)
render(g) { hudUi.drawButton(g, this.startRect, { label: '开始' }); },
})
.define('play', {
onEnter() { this.score = 0; this.remainMs = ROUND_MS; },
update(dt) { /* 只收 dt!推进玩法、判胜负 */ },
render(g) { /* 画游玩画面,只收 g */ },
})
.define('over', {
onEnter() { sessionScore.isOver() || sessionScore.lose(); }, // 结算态:latch 驻留(见 settlement.md)
render(g) { hudUi.drawButton(g, this.overRestartRect, { label: '再来' }); },
});
sceneFsm.start('menu'); // 起手停在菜单
// update/render 五法里把帧转交场景机:
update(dt) { bundle.tick(dt); sceneFsm.update(dt); }
render(g) { sceneFsm.render(g); }
别踩:
- 回调表里
update(dt)只收 dt、render(g)只收 g——与五法同形,别臆造update(scene, dt)。 - 若写了可选调试接口
_forensicsView():state().phase要实时读sceneFsm.current()(在 state() 函数体内),别在外层先算好闭包返回(host 只在 boot 调一次 _forensicsView,外层算的值会定格成 boot 快照=调试读到的恒是 menu 旧值)。 - 状态名你自己定(menu/play/over 只是惯例);
transition(to)的 to 必须是你 define 过的名。