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

19 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": "Simon 记忆",
"brief": "做一款经典 Simon(记忆复现)游戏。竖屏逻辑视口 390×844。\n- 屏幕中央 2×2 布局四个大彩色按钮:红、绿、蓝、黄(每个约 130×130 逻辑像素,留间隙)。\n- 游戏流程:每轮电脑播放一段【递增】的按钮序列——逐个点亮按钮(点亮=该按钮变亮/轻微放大,可用 getEngine().math.easing 缓动),每个点亮同时播放一个该颜色专属音高的音效 getEngine().audio.synth.synthSfx。\n- 播放完后轮到玩家:玩家依次点击按钮复现序列。点击时该按钮点亮+播放同样音效。\n- 复现正确一整轮:序列长度+1,进入下一轮(短暂停顿后电脑播放更长序列)。复现错误:播放失败音效+粒子,序列重置从头开始。\n- 用 ctx.random 生成每轮新追加的颜色;用 ctx.time 控制点亮节奏(如每个 500ms)。\n- 反馈:每次点亮/点击都有音效;答对一轮或答错都触发 getEngine().particles.spawnEmitter 粒子。\n- 画面:深色背景铺满 390×844;四个按钮暗态用较暗的本色、亮态用饱和本色。可在顶部单行文字显示当前轮数(非必须)。\n- 注意:开局电脑就要自动播放第一个按钮(含点亮+音效),不要停在等待态。",
"play_spec": {
"inputs": [
{ "t": "wait", "ms": 1300 },
{ "t": "tap", "x": 130, "y": 360 },
{ "t": "wait", "ms": 350 },
{ "t": "tap", "x": 260, "y": 360 },
{ "t": "wait", "ms": 350 },
{ "t": "tap", "x": 130, "y": 500 },
{ "t": "wait", "ms": 350 },
{ "t": "tap", "x": 260, "y": 500 },
{ "t": "wait", "ms": 350 }
],
"expectedEngineCallPrefixes": ["audio.synth", "particles."]
}
}