lili 6201f95146 feat(wg1-gen): 便宜模型生成可真玩轻游戏——L1 worker + 七门真玩 harness(HJ-GEN-001 成立)
W-G1 生成核心:brief→便宜模型写 GameHostFactory→esbuild __GameBundle iife→P1 bootGameHost
装载→本机 Chrome+CDP 七门真玩取证;失败回喂错因重试。只消费冻结契约,零改 P1/P2。

实测(deepseek-v4-flash 最便宜档):Pong/Simon/打地鼠 三款【七门全过真玩】,
单款 ¥0.01–0.03(远低于 ¥0.15 L1 闸门)。最优模型:flash 打底 + 难档升 deepseek-v4-pro(Simon 0 重试 ¥0.06)。

关键:实证「能生成代码 ≠ 能玩」——一处 prompt 输入坐标契约写错(误称 x/y∈[0,1],实为逻辑像素)
让生成游戏能编译/渲染/动但点击全失灵;Pong 因自走动画假绿混过、Simon 被正确判否。
为此加装 G 门(确定性 A/B 对照,隔离自走动画假绿)+ 修 prompt 后三款真过。

- harness:games/_wg1-gen/_shared/{entry-bundle 模板,index 模板,play.cdp.cjs 七门,serve-and-play.sh}(复用 ref buildRefHostConfig + browser-evidence.cjs)
- worker:wg1/gen-worker/worker/{_client(代理旁路),prompt(生成上下文包),validate(静态门+node --check),cost(¥折算),run(§3 编排+重试门)}
- golden-path 自检:ref 工厂 5/6(F=0 菜单态正确)+ probe 工厂 7/7 → harness 无假绿
- game-runtime/package.json:加 ws(CDP 驱动 devDep)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-13 22:50:24 -07:00

21 lines
1.7 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"title": "Pong 弹球",
"brief": "做一款经典 Pong 弹球游戏。竖屏逻辑视口 390×844。\n- 底部一块玩家挡板(水平移动),顶部一块电脑挡板(自动跟随球的 x,速度略慢于球,留出可玩性)。\n- 中间一个球,做斜向匀速运动;碰左右墙反弹,碰挡板反弹(反弹时根据击中挡板的位置微调水平速度)。\n- 球越过玩家挡板(掉到底部)或越过电脑挡板(飞出顶部)则该回合结束,球回到中心重新发球,并把对应一方的分数+1。\n- 球速保持中等:水平+竖直速度合起来大约每秒 300~420 逻辑像素,挡板不要太薄(厚度≥12),避免高速穿透。\n- 控制:玩家触摸屏幕任意位置,底部挡板朝触摸点的 x 平滑移动(每帧朝目标 x 逼近)。\n- 反馈:球每次反弹(撞墙或撞挡板)都触发一次 getEngine().particles.spawnEmitter 粒子爆发 + getEngine().audio.synth.synthSfx 音效。\n- 画面:深色背景铺满 390×844;挡板用亮色实心矩形,球用亮色实心圆;中线画一排虚线。可在顶部用单行文字显示比分(非必须)。",
"play_spec": {
"inputs": [
{ "t": "wait", "ms": 600 },
{ "t": "tap", "x": 100, "y": 740 },
{ "t": "wait", "ms": 450 },
{ "t": "tap", "x": 300, "y": 740 },
{ "t": "wait", "ms": 450 },
{ "t": "tap", "x": 195, "y": 740 },
{ "t": "wait", "ms": 450 },
{ "t": "tap", "x": 130, "y": 740 },
{ "t": "wait", "ms": 450 },
{ "t": "tap", "x": 270, "y": 740 },
{ "t": "wait", "ms": 400 }
],
"expectedEngineCallPrefixes": ["particles.", "audio.synth"]
}
}