games-development-ai/.agents/skills/cheap-model-game-generation.md
zizi 7f24a344d0 docs(agent-specs): B2 归档——64 个闭线工作记录移入 _archive/,热目录顶层 90→26
承接目录治理:上轮只压缩内容未减文件数,闭线工作记录仍平铺致目录看着仍一堆(创始人指出)。本次执行 B2 归档。

64 个 ≤06-15 闭线档(25 压缩桩 + 闭线 review/report/纪要/edit-plan)git mv 入 docs/agent-specs/_archive/(文件名不变、仍 git 跟踪可查)。热目录 ≤06-15 仅留 13 活档(决策/纲领/SoT/活spike)+13 个 06-16 在飞。

活资产 20 处旧路径引用(.agents/docs/memory/_index)同步改 _archive/,引用断裂复测=0;_index 活地图 + 治理档状态收口。约束:0 个 06-16 被移、orchestrator 等未跟踪在飞档零误纳。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 13:26:19 +00:00

16 KiB
Raw Blame History

便宜模型直出可玩轻游戏 · L1 生成 worker 配方W-G1 实证)

适用:用 new-api 便宜模型DeepSeek/MiniMax插件库 + 装载契约上生成可真玩的 Tier1 轻游戏;质量由 harness 门保证、非模型自觉HJ-GEN-001。 真玩取证门见 game-e2e-cdp-harness.md §7九门AG 假绿守卫 + H 机制/latch + I 控制手感);本篇讲生成侧(谁生成 / 怎么校验 / 成本 / 坑 / 自产 gatespec。 活样板worker = wg1/gen-worker/lane 分支 wg1/gen-worker);生成产物 + harness = game-runtime/games/_wg1-gen/;交付报告 = wg1/gen-worker/REPORT.md

1. 链路(能生成代码 ≠ 能玩)

brief 题面 → 便宜模型写 generated-factory.js(一个 GameHostFactory)→ 静态校验门 → 套官方 generic 壳entry-generic.js + buildGenericHostConfig§6→ esbuild --global-name=__GameBundle 打 iife引擎内联 ~265KB→ P1 宿主 bootGameHost 装载 → 本机 Chrome+CDP 九门真玩AG 假绿守卫 + H 机制/latch + I 控制手感harness §7→ 失败回喂错因重试 ≤N。必须过真玩门才算 pass——能编译 / 能渲染 / 能动 ≠ 能玩。

2. 模型与成本2026-06-14 网关实测)

模型 定位 实测
deepseek-v4-flash 打底(易档) reasoning 模型;易档 0 重试 ¥0.01;三款冒烟过 AG 核心门H/I 逐游戏可选)
deepseek-v4-pro 难档升档 Simon 0 重试 ¥0.06
MiniMax-M2.7 备选,不优先 completion_ratio=4 拉高成本 ¥0.117 贴 ¥0.15 闸
MiniMax-M3 备选 非 reasoning响应干脆1-token 回 ok

网关 100.64.0.8:3000 共 11 模型,上四款 + MiniMax-M2.7-highspeed 渠道全活(各打 1 发 ping 实测MiniMax 另有 M2/M2.1/M2.5 + highspeed 阶梯横比可按需扩。原「DeepSeek key 未激活」(作战清单:32已过时——经 new-api 网关四模型即时可用。

成本口径(¥上界,不计缓存折扣):quota =(prompt + completion×completion_ratio)× model_ratio × group_ratio¥ = quota / quota_per_unit(500000)× usd_rate(7.3)。闸门 ¥0.15/款。取价 /api/pricing、取率 /api/status;精确 logs.quota 需网关 access tokensk- key 无管理权,故只给上界)。

3. L1 纪律 + 坑红线

  • 裸 openai client不引 AgentScopespike VERDICT框架 token 膨胀 + 本地开销吃便宜档单价);唯一出口 = new-api OpenAI 兼容网关,绝不直连厂商 SDKkey 走 NEWAPI_KEY 环境变量 / .envgitignored绝不入库
  • reasoning 模型flash/pro/M2.7)烧 max_tokens 于 reasoning_tokensmax_tokens 必须给够,否则 finish=lengthcontent 空。
  • 代理旁路坑:本机 clashHTTP(S)_PROXY=127.0.0.1:7897)会把发往 100.64.0.8 的请求经代理转发 → 502NO_PROXY 大小写两版都要含网关 host,且须在 import openai 之前设。
  • 输入坐标契约坑(便宜模型与人皆易错):输入是逻辑像素 x∈[0,390] / y∈[0,844]非归一 [0,1]game-runtime/src/host/boot-game-host.js:295)。写错 → 能编译能渲染能动但点击全失灵(详见 harness §7 G 门,正是这门逮住的)。
  • 静态门禁用 tokenimport / littlejsengine / Math.random / Date.now / addEventListener / requestAnimationFrame / new AudioContext / document. / window.——生成代码只许调插件公开面 + 6 受控面getContext2d/onFrame/getInput/getAudioContext/time/random随机与时钟一律走受控 random / time(确定性可复现)。
  • bundle 入库dist/.gitignore 吞,故 bundle 输出文件名 bundle.iife.js(不落 dist/)——它是交付物须入库。

4. 静态校验门node 侧,出厂前省 CDP 开销)

抽码(```js 块)→ 契约扫描default export + init/update/render/destroy 四方法齐 + getEngine 用法 + 禁用 token 扫描)→ node --check 语法。不过门不进打包,把"必失败件"挡在真玩门前。

5. 边界与未做

  • 只消费冻结契约(game-host.d.ts / 6 受控面 / __GameBundle / bootGameHost零修改;只在 lane 分支,不推 dev/2.0.0。
  • 生产接线已成(3b-B 派发面,c99014c)AigcGenerateExecutor.dispatchGeneric→真 worker service.py(包 run_studio)→HMAC 回调→落库入 feed 全链真证闭合(见 ai-generation-pipeline.md §⓪′)。3b-B 单款一句话「点击小怪物」真生成卡九门(Score 恒 0→质量门正确拒发不可玩=系统履职非故障),run_studio 自修 max_repairs 未救回。⚠️ 但单点失败≠模型壁垒:L1 scale-20 14 款实证(§9)便宜模型实际相当能干(主力 7/8 可玩、自写 CCD/文本HUD/网格/match 全对),多数失败是宿主键盘桥 host bug(已修 d754b71)+ driver-coverage(harness 太朴素),非模型;3b-B 那款真因(driver-coverage 或该款 hit-detection)续查并入 §9 画像。真难点不是模型能力,是 harness driver 覆盖 + 宿主门面完备(§9)。
  • 未做/续(创始人并行)20 款补全(scale-20 已 14 款,见 §9)、四模型横比(过门率/重试/¥每过门)、6 个 driver-coverage 失败款的 driver 增强(flappy/multiball/愤怒小鸟等)、键盘款修后批量重跑、calibration 人锚补全——规划见 2026-06-14-WG1-bakeoff天花板与Claude-free评估门-review.md

6. 官方 latch 终态契约 + 套壳P3 对齐2026-06-14

P3 主线把 L1 产出靶定死为官方通用装载壳game-runtime/games/_generic/dev/2.0.0 3108009。L1 只产 generated-factory.js(一个 GameHostFactory),套官方壳打包:

  • 套壳entry-generic.jsimport ./generated-factory.js + src/host/generic-host-config.jsbuildGenericHostConfig 标准 7 插件装配)→ esbuild --global-name=__GameBundle。本 lane harness 入口(_wg1-gen/_shared/entry-bundle.template.js= 同 buildGenericHostConfig 装配的取证超集(多透传 recHook/onReady 供 F 门studio 调 {canvas,seed} 时 recHook no-op一份 bundle 两用)。
  • 可测性红线:工厂须导出 _forensicsView() → { state: () => ({ phase, score, remaining, progress, gameoverReason, ...实体位置 }) }(纯只读、闭包实时值);host.state()boot-game-host.js:283)透传它。
  • ★ P0 latch 终态phase ∈ 'booting'|'playing'|'gameover',进 gameover恒驻留(禁自动重开)。宿主 inject.ts 每 500ms 轮询 phase 代发 game_end 结算——瞬时终态会被漏读→闭环静默断裂故必须驻留。实证flash 能遵此契约v4/v5 latch ✓)。
  • 位置态(技巧游戏):题面要求时额外导出 ball/paddle 等实体 {x,y,vx,vy,w}——供 harness 适配性真玩(读球位接球)+ 确定性手感门(控制/碰撞)。

7. 确定性门推广design agent 自产 gatespec适任意游戏405394d 实证)

确定性手感门H/I原靠手写 brief 喂判据——每款游戏人工写 assertAfterPlay/driver/controlCheck不可规模化。P1 把它升级为 design agent 自产、studio 抽取合入,确定性门遂适用任意生成游戏实证flash 的 design agent 对 breakout 产出结构合法 gatespec、studio 抽取合入成功):

  • design agent 产 gatespecworker/agent_loop/roles.pyDESIGN_SYSTEM 末尾):在玩法设计末尾输出一段机器可读 gatespec 块,含 exportState(须导出哪些观测态,对齐 §6 可测性红线)/ driver(适配真玩出招式,如 paddle-intercept/ controlCheck(控制体 + 目标 x/ assertAfterPlay(进展断言)/ expectLatch:模型易把 ballPath 写成竖直 .y——prompt 须明确「球水平运动 → ballPath='ball.x'」。
  • studio 抽取合入worker/studio.py_extract_gatespec):从 design 输出抽 gatespec 块(json_repair 兜模型 JSON 残缺)→ 合入 play-spec → 安全归一(如 paddle-intercept 的 ballPath 误写 .y 自动兜回 .x);结果记 gatespec 供取证回溯。prompt 修 + 归一兜底双保险实证唯一内容误差ball.y已被双修。
  • ★ tap/离散点击类自产 driver 缺口(3b-B 重跑实证·dispatch 面致命)design agent 对 tap-target 类游戏(打地鼠/井字棋/点击得分)反复给 driver:{type:none}——dispatch 面 run_studio(play_spec={}) 全恃自产 driver(无手供 play_spec),致 harness 盲打打不中目标 → moves/score 恒 0 → H_progress 挂 + latch 不触发repairs=5 耗尽(3b-B 重跑 gen9306/9307 + 原 gen9303-9305 共 5 款同签名,8/9 门过仅此门挂、游戏本体全对targetX/Y/radiusboardmoves 导出正确G_input/I_control/F_wiring 均过)。根因=自产 driver 缺口,非模型/非游戏本体(样板 tictactoe 过九门靠其 lane brief 手供 play_spec.driver=tap-targets)。修向DESIGN_SYSTEM 对「离散点击目标」类强制产 tap-targets driver(+exportStatetargets[{x,y,occupied}]),或 _extract_gatespec 对 brief 含离散格位/目标时兜底注入 tap-targets。当前 dispatch 面一句话现生成对 tap 类不可靠,须先补此缺口——这是 moat『一句话现生成』腿的真·临门一脚(纯 L1 生成域)。【已修·2026-06-16·a2cbabe6 DESIGN_SYSTEM 规则③改家族二分(离散点击目标类→必产 tap-targets+导出 targets[{x,y,idx,occupied}]、绝不 none;规避/推理族 +safeOnly:true +导出 safe〔仅 _forensicsView 测试可见、不渲染〕+断言 result=="win";安全放置族断言 progress↑;技巧挡板类仍 paddle-interceptball.x 绝不 ball.y;其余 none)——Python roles.py 与 SAA SaaPrompts.java 逐字同改(规则段 1076 chars 公平性铁律)。铁证:tictactoe(放置族)一句话 play_spec={} 整链 9/9 全绿一次过(design 自产 tap-targets→factory 自产 targets→九门含 H_progress+latch 达终态),旧 driver:none 盲打卡死真因已闭;breakout 回归未误伤(恒 paddle-intercept)。残留(正交):saolei 九门未翻绿=便宜模型写扫雷 factory 本身质量(Math.random 违禁/胜负不可达/A_boot 崩),九门正确拦截坏游戏=O1 factory 级生成质量(§9/scale-20 单列),非本修失败。刻意未加 _extract_gatespec 关键词兜底(易误判 paddle/flap,靠门 + 反馈自愈)。
  • 意义:手感门判据从「手写一次性 brief」变成「随游戏生成的自产物」——同一条便宜模型生成链既出游戏码、又出验它的确定性门确定性门覆盖面随生成规模自动扩张harness 复利的一环)。

8. 质量评估:确定性门兜底 + 人锚天花板W-G1 校准实证2026-06-14

确定性门Claude-free优先 已能把多数"坏"变可判:九门 + latch + 控制手感门 + 适配真玩。"上下文是杠杆"实证:同 flash 仅改接地,成本 50%、修复轮次 80%player rubric 锚定1-5 分级 + 空心→≤2把 MAE 1.25→0.75。

但便宜 player agent 做"好玩裁判"有结构性天花板

  • 静态截图M3 视觉)+ 运行数据flash 文本)判不出交互动态质量(物理/碰撞/控制手感)。实证:创始人亲玩把碰撞有问题的 pro 判 fix两个 player 都给 fun=4高估text 还漏了 m27 的控制 bug。
  • gate-H 盲打脚本会假阴性:固定坐标 taps 打不动技巧游戏→"0 进展"≠空心(创始人把被判空心的 v2 排第 2。解法 = 适配性真玩 driver(读 state 接球harness §7
  • founder/人锚不可替代(至少现阶段):没有它会把碰撞有问题的 pro 当"最佳"发出去。校准 harness = wg1/gen-worker/worker/agent_loop/calibrate.py(吃 calibration/labels.json 人锚,算 player vs 人锚 MAE/吻合/反样本否决)。
  • 路线:确定性门做"地板"(能跑/真接线/有进展/latch/跟手),手感尽量拆成确定性检查(碰撞穿透门 J 规划中);拆不掉的主观手感留创始人抽检

9. scale-20 放量实证:模型能力画像 + spec 预判推翻(W-G1 lane v3,2026-06-14)

flash 打底放量 14 款(主力 8 + 压测 6),Opus 对抗审计核实(2 个 ultracode workflow):

  • 主力 7/8 真可玩(0 假绿):井字棋/见缝插针/打砖块/跑酷/太空侵略者/Doodle/扫雷(扫雷=borderline——本体可玩,但门弱断言经"踩雷 lose"路径满足、证据薄)。flappy 唯一未过=driver-coverage(升 pro 仍挂,但源码物理合理、理想 AI 得分→是 flap-to-gap driver 太朴素,非模型天花板)。
  • 压测:match3 ;2048/Tetris/Asteroids 三款键盘游戏全挂于宿主缺键盘桥(非模型,见 game-e2e-cdp-harness.md §8);multiball/愤怒小鸟=driver-coverage。
  • ★ 模型能力画像(flash):文本 HUD / 网格状态机(井字棋胜负+AI、扫雷洪泛)/ 子步 swept CCD(asteroids/multiball)均自写正确;计时/物理精度(Flappy)需题面 pin 死数值 + 收紧观测契约(Doodle 实证:收紧计分 + seek-x driver → regen 首发过)。栽点主要在静态门可拦的纪律滑坡(Date.now/Math.random/缺 render·destroy/没调 getEngine),零 CDP 成本拦下、回喂即修。
  • ★ spec 预判的门面缺口几乎全推翻:CCD / 文本HUD / 网格 / match-finding / 手势均非缺口(便宜模型自带或自写;故"碰撞穿透门 J"已非急需)。真·L0 门面缺口收敛为唯一一处=宿主键盘桥(已 spawn_task 交 L0)。完整数据见 2026-06-14-WG1-scale20-短板量化报告.md
  • M3 视觉 player 当生产过滤器(calibration/m3_test.json):与门 8/9 一致、抓显性空心(flappy fun1)、漏截图不可见失败(键盘死/弱证据,恰被确定性门兜住)→ 三层互补(门=地板 / M3=主观过滤 + 便宜 fun 信号 / 创始人=人锚)。MAE 压低待创始人对新款补锚(框架沿用 calibrate.py)。
  • ★ 规避/推理族:题面须自产「安全位」+ 断言用胜利终态(saolei borderline 修复,2026-06-15):tap-targets 盲点首个对扫雷会盲踩雷秒负、核心玩法零暴露(门弱断言被 lose 路径满足→ false-borderline)。修法 = 题面令 _forensicsView 自产 safe(测试专用 x-ray,=!cell.mine,勿渲染/勿给玩家避雷提示)→ harness driver safeOnly:true 只揭安全格到 win → 断言改 result=="win"flash 一次过且自产 safe 正确(generated-factory.js:337)→ 坐实缺口在题面、非模型能力。通则:凡「盲点首个会致负」的家族(扫雷类),题面给 oracle 安全位 + driver 避负 + 断言用胜利终态;门只证「机制点亮+可赢可达」,好不好玩归 M3+创始人。详见 2026-06-15-WG1-tap-targets-driver-自产缺口-L1brief.md
  • ★ driver-coverage 6 款闭口 + 重生成归因(2026-06-15):scale-20 余 6 款 driver-coverage 失败全部归因(详 driver-coverage 闭口报告 + harness skill §8 四因铁律)——0 个模型造不出 / 0 个 3D 硬界:flappy/multiball 重生成即过(原件『缝隙贴顶』/『底部丢球未实现』=实例缺陷非模型短板,收紧 brief + 增强 drivervy 前瞻 / 弃守排空〕后 flash 翻绿,multiball retries=0);t2048/asteroids 宿主键盘桥(L0 已修)重打包即活;asteroids/angrybirds 盲玩=可测性边界,经 enrich exportState(asteroids 暴露陨石坐标 / angrybirds pin+导出 launch 物理常数)+ 适配 driver(aim-fire / drag-aiming 解析)转确定性闭口(asteroids score 0→6、angrybirds 0→20 清场)。生成侧铁律:单件失败禁直接归『模型造不出』,必重生成区分『实例 bug / 可测性缺口 / 模型短板』——『模型造不出』是最大伪报源(原 flappy『升 pro 仍挂=模型天花板』被本轮证伪=driver+实例)。