Game Template Verification
Archived on 2026-08-12 · roadmap: game-web-phaser-template
Archived: 2026-08-12 · roadmap-id:
game-web-phaser-template
Why
templates/game-web-phaser 今天没有任何测试基建:无 verify.mjs、无 vitest/playwright、
无状态跳转契约、单一构建目标、单一端口。它的 AGENTS.md 用散文要求执行者
「截个真实的图看看」「每个键都按一遍」——而实测证据表明散文式规则会衰减:
同一个模板的硬约束(Scale Manager 配置、
addCapture键盘捕获、端口 8080) 逐字节传导到了产物里;而同一个模板的PROJECT_CONTEXT.md(要执行者回头维护的文档) 产物里一个字没改。
结论:要执行者自觉遵守的东西活不下来;要机器能判定的东西才活得下来。 所以验证能力必须以可执行制品的形式住在模板里,不是以提示的形式住在文档里。
上游那条判据说得更硬:能力不可知的真正危害不是执行者做得差,是它做得差却报告说做完了。 对策是把「算不算做完了」的判定权从执行者手里拿走。
为什么由模板自己跑,而不是读 agent 的 browser 工具结果
上游 2026-08-09 的只读排查(cogito-lib,issue fushenguang/tarit#34)查明:
guest 镜像缺 /dev/shm,chromium 直接 FATAL;加 --disable-dev-shm-usage 即可出图。
而 Shelley 是编译好的二进制、由 init 拉起、只有 4 个环境变量、没有配置文件——
我们没有任何途径让它给 chromium 传这个 flag。
但这不只是绕路。模板自带脚本本来就是更对的架构:闸门靠制品存在性检测,
而 agent 有没有调 browser、验了哪几个维度,是它自己决定的——判定权就还在执行者手上。
Non-goals
🔴 下面每一条都是 Gate ② 明确切出去的,不是执行时自行收窄。
| 不做 | 为什么 / 去处 |
|---|---|
| IA 断言运行器(把验收项编译成断言逐条判定) | 上游 web 侧已落地模板注册表与失败信息格式(acceptance-assertions),但运行器要吃 jump 作驱动器——本刀先把 jump 交付出来,运行器归下一刀 |
| 失败信息回流给 agent | 需要运行器先存在。本刀只产出可读的失败信息,不做结构化回流通道 |
pnpm.onlyBuiltDependencies | 原判 Gate ② 未选;实测证明它是拦路的,已加回 |
模板的 lint 脚本 | Gate ② 未选。模板至今没有 eslint,代码质量靠每轮运气 |
把 templates/game-web-phaser/** 加进 template-validation.yml 的 paths 过滤 | Gate ② 未选。⚠️ 后果是改这个模板目前零 CI 保护——本刀新增的 verify.mjs 与遍历断言在 CI 里不会被跑到 |
修 guest 镜像的 /dev/shm | 归 fushenguang/tarit#34,构建者已定「专门处理」。本刀带 flag 绕过;镜像修好后无非是可以去掉那个 flag |
| VLM 判分 / agent 写测试 | 上游已定:方案 D 一期只做 B。不在本刀 |
状态空间大的游戏 listStates() 返回什么 | 上游明写「不要在没讨论前就在模板里定死」,需要做第一个平台跳跃 track 时验证。本刀只定契约形状,不定离散化策略 |
⚠️ 上面三条 Gate ② 未选的(onlyBuiltDependencies / lint / CI paths)都带着已知代价,
如实写在这里而不是省略——它们是评估文档点名过的缺口,不写下来下次就得重新发现一遍。