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

60 lines
3.5 KiB
Markdown
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.

# wg1/gen-worker —— W-G1 L1 生成 worker(便宜模型 → 可真玩轻游戏)
> **结论看 [`REPORT.md`](REPORT.md)**(durable)。本文件 = 如何跑。
> 验证 HJ-GEN-001:便宜模型(new-api)在插件库+装载契约上写出可真玩轻游戏,质量由 harness 七门保证。
## 它做什么
`brief(题面)→ 便宜模型写 GameHostFactory 源码 → 静态校验门 → esbuild 打 __GameBundle iife → P1 宿主 bootGameHost 装载 → 本机 Chrome+CDP 真玩七门取证`,失败回喂错因重试 ≤N。**"能生成代码 ≠ 能玩"——必须过真玩门才算 pass。**
## 目录
```
wg1/gen-worker/
├── REPORT.md # 交付报告(结论/四件套/成本/坑/最优模型)
├── requirements.txt # openai==2.41.1 + json-repair
├── .env # NEWAPI_KEY 等(gitignored,绝不入库)
├── worker/
│ ├── _client.py # 裸 openai 客户端 + 代理旁路 + usage(复用 spike 范式)
│ ├── prompt.py # 生成上下文包(契约/能力面/禁用项/few-shot)→ system+user
│ ├── validate.py # 校验门:抽码 + 静态契约扫描 + node --check 语法
│ ├── cost.py # ¥ 折算(new-api quota 口径,/api/pricing+/api/status)
│ └── run.py # 编排(§3 job-in/result-out + 重试门)
├── briefs/ # pong.json / simon.json / whack.json(题面 + CDP play-spec)
└── results/ # 每 run 结果(pass/retries/verdict 七门/tokens)
# 生成游戏产物在 game-runtime/games/_wg1-gen/<game>/(见该目录 .agent,解释为何落那)
```
## 前置(本机一次)
```bash
# 1) 密钥(gitignored,走环境):编辑 wg1/gen-worker/.env 写 NEWAPI_KEY(向创始人要)
# 2) game-runtime 工具链(esbuild + ws,CDP 驱动用)
npm i --prefix game-runtime
# 3) worker venv
uv venv wg1/gen-worker/.venv --python 3.12
uv pip install -p wg1/gen-worker/.venv/bin/python -r wg1/gen-worker/requirements.txt
# 4) 自测连通(列模型,零成本)
wg1/gen-worker/.venv/bin/python wg1/gen-worker/worker/_client.py
```
> 依赖本机 macOS + Google Chrome(headless)+ Tailscale 可达 new-api 网关 `100.64.0.8:3000`。
## 跑
```bash
# 生成 + 真玩一款(默认 deepseek-v4-flash;--model 换模型;--max-retries N)
wg1/gen-worker/.venv/bin/python wg1/gen-worker/worker/run.py pong
wg1/gen-worker/.venv/bin/python wg1/gen-worker/worker/run.py simon --model deepseek-v4-pro
wg1/gen-worker/.venv/bin/python wg1/gen-worker/worker/run.py whack
# 成本表(聚合 results/*.json)
wg1/gen-worker/.venv/bin/python wg1/gen-worker/worker/cost.py
# 仅重放某款已生成 bundle(不重新生成,调试 harness 用)
( cd game-runtime && bash games/_wg1-gen/_shared/serve-and-play.sh pong )
```
新游戏:在 `briefs/<id>.json` 写 `{title, brief, play_spec:{inputs,expectedEngineCallPrefixes}}`,再 `run.py <id>`。
## 七门真玩判据(全过才 PASS,详见 REPORT §2)
A 装载 · B 未捕获 · C 掌帧[20,45] · D 真渲染 · E 活性 · F 真接线(__engineCalls) · **G 输入有效(确定性 A/B 对照)**。
verdict 落 `game-runtime/games/_wg1-gen/<game>/evidence/verdict.json` + 首帧/玩后截图。
## 边界
- 只消费冻结契约(game-host.d.ts / boot-game-host.js / __GameBundle / bootGameHost),零修改。
- 不推 dev/2.0.0;只在 lane 分支 `wg1/gen-worker`。
- 不做(创始人并行 P3/mainline):AigcGenerateExecutor 接线、白名单注册、全 20 游戏 bake-off、judge 评分。