承接目录治理:上轮只压缩内容未减文件数,闭线工作记录仍平铺致目录看着仍一堆(创始人指出)。本次执行 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>
17 KiB
《W-G1 · 20 经典轻游戏放量 — 短板量化报告》
状态:进行中(主力批 8 款已终;压测批 6 款 + flappy@pro 后台跑中;player 校准待做)· 2026-06-14 lane:
wg1/scale-20(基于dev/2.0.0 @d79f2c3)· 模型:DeepSeek-V4-flash 打底、耗尽升 pro(经 new-api 网关100.64.0.8:3000,无 Claude) 口径:每款过九门(A-G 假绿守卫 + H 机制/latch + I 控制手感),results/<id>.json为原始证据。靶集见 20 经典轻游戏基准 review。
一、结论先行(给创始人/L0 的三句话)
- 便宜模型(flash)+ 九门 harness 能产可玩轻游戏:主力批 8 款 flash 实过 7/8(井字棋/见缝插针/打砖块/跑酷/太空侵略者/Doodle 经 Opus 对抗审计确认真可玩、0 假绿;扫雷=borderline,本体可玩但门证据过薄,见 §七)。多数款 1 次重试内过,失败基本被静态门零 CDP 成本拦下、回喂即修。唯 Flappy 主力批未过——经审计:非模型天花板(升 pro 仍挂、但理想瞄准 AI 可得分),根因是适配 driver 太朴素(driver-coverage,见 §七)。
- ⚠️ 推翻 spec 预判:基准 review 预测最痛缺口是「文本 HUD / 网格状态」。实测 flash 这档能自写文本+网格(井字棋、扫雷均过,grid 状态机/洪水填充/AI/计分自管正确)→ 这两类门面优先级应下调。
- 真天花板 = 计时/物理精度类的生成质量 + harness 适配 driver 的覆盖:Flappy(物理太硬秒死、缝隙观测漏出)flash 2×2 次全挂;Doodle 靠收紧计分语义 + 适配 driver 才救回;太空侵略者靠调 driver 步数才验到 latch。门兜底有效的前提是 harness 有对的适配 driver——本批把 driver 库从 1 种扩到 6 种即为此。
二、方法与口径
- 生成侧:
wg1/gen-workerworker(裸 openai client → new-api 网关),briefs/<id>.json= 题面 + play-spec(九门 driver 配置);闭环 generate→静态门→esbuild→九门真玩→失败回喂重试 ≤2。 - 真玩侧:
game-runtime/games/_wg1-gen/_shared/play.cdp.cjs(macOS 本机 Chrome+CDP)。H/I 门靠"适配性真玩 driver":读_forensicsView().state()实体位/状态自动出招(盲打固定坐标对技巧游戏必假阴)。 - 成本:每款 token 见下表;¥ 折算(cost.py / new-api quota)待最终补;闸 ¥0.15/款。
三、主力批 8 款结果(flash 打底)
| # | 款 | 结果 | 重试 | tokens(in/out) | driver | 首次失败 / 关键 |
|---|---|---|---|---|---|---|
| 1 | 井字棋 tictactoe | ✅ | 1 | 8354/10055 | tap-targets | 静态门:Date.now 违禁 → 回喂修 |
| 7 | 扫雷 saolei | ⚠️ ✅borderline | 1 | 8214/13932 | tap-targets | 本体源码可玩,但该 verdict 的 H 仅 revealed 0→1 且经【踩雷 lose 路径】满足(盲打首 tap 即踩雷、核心玩法零暴露)→ Opus 深审判 borderline,见 §七 |
| 18 | 见缝插针 jianfeng | ✅ | 0 | 3943/7005 | 固定输入 | 首发全过 |
| 5 | 打砖块 breakout | ✅ | 1 | 8115/9646 | paddle-intercept | 静态门:缺 render/destroy + 没调 getEngine + Math.random |
| 16 | 跑酷 runner | ✅ | 1 | 7908/16124 | 固定输入 | 静态门:Date.now;score 自增稳过,G 验跳跃有效、latch 验真撞死 |
| 10 | 太空侵略者 invaders | ✅ | 2 + 步数调 | 12211/25573 | tap-targets | 游戏本身好(score 0→12 全清);仅 driver 步数 30→50 才驱动到 latch |
| 14 | 跳跃者 doodle | ✅ | 0(regen) | 4021/10197 | seek-x | 首版计分语义错(score 卡 118);收紧题面 + seek-x → regen 首发过(score 259→1003) |
| 4 | Flappy flappy | ❌(待 pro) | 2×2 | — | flap-to-gap | 生成物理太硬(vy≈626 秒坠死)+ nextGap 开局漏出;flash 天花板,升 pro 中 |
主力批:flash 实过 7/8。 flappy@pro 结果待填。
四、短板发现(证据支撑)
- 便宜模型主要栽点 = 静态门可拦的契约纪律滑坡。高频违规:
Date.now/Math.random(应走受控time/random)、缺render/destroy方法、忘调getEngine()(真接线门无信号)。全部静态门零 CDP 成本拦下,回喂一次即修——印证"门兜底"是便宜模型路线的命门,且大头开销不在 CDP 而在生成。 - 文本 HUD / 网格状态:flash 能自写,非最痛缺口(推翻 spec 预判)。井字棋(3×3 状态机+胜负+AI+文本)、扫雷(洪水填充+雷数文本)均过;仅扫雷的进展观测量
revealed首发没接对、retry 修。→ text/grid 门面优先级下调;若补,价值在"省 token/一致性",非"造不出"。 - 计时/物理精度类:生成质量 + driver 覆盖双重挑战(原"模型天花板"判断已被审计纠正)。Doodle 首版计分语义错(score 卡 118)→ 收紧题面计分契约 + seek-x driver regen 首发过(score 259→1003),证生成质量可经题面收紧 + 适配 driver 救回。Flappy 经 Opus 审计:非模型天花板——升 pro 三次仍挂、但源码物理参数合理(GRAVITY420/FLAP-260/GAP220),"理想瞄准 AI"多种子可得 5-15 分 → 根因是 flap-to-gap driver 太朴素(无前瞻预测落点),对极端高位缝追不上(driver-coverage)。→ 对策:收紧物理/观测题面 + 给适配 driver 加前瞻,而非简单升档。
- harness 适配 driver 的覆盖 = 门能否兜住的前提。技巧/实时类盲打固定坐标必假阴(H 假阴);shooter 类 latch 需足够 driver 步数(invaders 实证:步数不够≠游戏坏)。本批据此扩 driver 库(见下)。
五、harness 产出:适配 driver 库(1 → 6 种 + drag 事件)
gate-H 推广在实践中落地:把"读 state 自动真玩"覆盖到六类机制族。play.cdp.cjs。
| driver | 机制族 | 覆盖款 | 状态 |
|---|---|---|---|
paddle-intercept |
挡板接球 | 打砖块 / 多球弹球 | 既有 |
tap-targets |
点击离散目标 | 井字棋 / 扫雷 / 太空侵略者(+翻牌/Simon…) | 本批新建,3 款验证 |
flap-to-gap |
重力穿缝 | Flappy | 本批新建,验证中 |
seek-x |
横向趋近接台 | Doodle | 本批新建,✅ Doodle |
tap-pairs |
相邻交换 | Match-3 | 本批新建,压测中 |
key-cycle |
纯按键循环 | Tetris / 2048 / Asteroids | 本批新建,压测中 |
drag(输入事件) |
拖拽手势 | 愤怒小鸟 | 本批新建,压测中 |
六、压测批 6 款结果(测上限/暴露缺口)— 已完成
经第二轮对抗诊断 workflow(7 agents)逐款归因。重大发现:6 款失败严格沿「键盘 vs 指针」分界——所有 key-cycle 键盘款(t2048/tetris/asteroids)集体挂、所有 pointer/tap 款全过,锁定根因 = 宿主键盘门面缺失(见 §八),非模型逐个写坏。
| # | 款 | 结果 | driver | 根因 | 真·门面缺口? |
|---|---|---|---|---|---|
| 13 | Match-3 | ✅ r0 | tap-pairs | 真可玩(score 0→40 真消除、latch 驻留;盲态交换凑出三连) | 无(swipe/match-finding 预判未成立) |
| 20 | 多球弹球 | ❌ latch | paddle-intercept | driver-coverage(游戏含子步 swept CCD、本体正确;9s 既清不完砖又护住末球→终态不可达) | 无;driver 加"建进展→弃守排空"相位即翻绿 |
| 11 | Tetris | ❌ latch | key-cycle | 宿主键盘门面缺失(piecesLocked 0→1 实为重力自动锁定、非键盘;progress 假性过) | 是:键盘桥 |
| 2 | 2048 | ❌ score0 | key-cycle | 宿主键盘门面缺失(50 次按键棋盘零变化;move/合并/终态本体正确) | 是:键盘桥 |
| 12 | Asteroids | ❌ score0 + F_wiring0 | key-cycle | 宿主键盘门面缺失(键盘没到→不开火→不调引擎;子弹已是 swept CCD,CCD 预判未成立) | 是:键盘桥 |
| 15 | 愤怒小鸟 | ❌ score0(latch 过) | 固定 drag | drag-aiming(固定盲拖弹道最近距猪~218px;本体正确、F_wiring 过) | 无;driver 加第 7 型 drag-aiming(读目标反解拖拽矢量)+ 放宽关卡 tuning |
压测批结论:6 款里 0 个是"便宜模型造不出"——match3 真可玩;3 款键盘款挂在同一处宿主缺键盘桥;multiball/愤怒小鸟挂在 harness driver 覆盖。spec 预判的 CCD/match-finding/手势/文本 HUD 缺口全部未成立(详 §八)。
★ host 修复已验证(
fix/host-keyboard-bridge分支 · commitd754b71· 2026-06-14,经创始人授权隔离执行):补宿主键盘桥 + 重打包 3 款重跑九门——键盘输入全部接通:tetris 整盘翻绿(piecesLocked 0→10 + latch✓,修前 0→1 是重力假性)、t2048 score 0→4 真合并(修前 0→0)、asteroids F_wiring 0→27 + latch✓(船真动真开火,修前全冻 0)。残留:t2048 latch(2048 盲态几乎不死锁)、asteroids score(盲射没瞄准)= driver-coverage 跟进,非键盘非模型。→ host 键盘桥根因坐实,供 L0 cherry-pickd754b71到 dev/2.0.0。
七、三方对照:确定性门 vs M3 便宜 player vs Opus 教师审计(核心实证)
对主力批 9 款(7 pass + flappy/tetris fail)做三通道交叉验证。
7.1 M3 视觉 player(生产中间层,Claude-free)
MiniMax-M3 看首帧/玩后截图 + 九门数据判可玩/好玩(production-faithful,roles.player_system 人格)。结果 wg1/gen-worker/calibration/m3_test.json:
- 与门 8/9 一致;独立判出 flappy「空心、开局即死、零得分」(fun=1, verdict=fix)——便宜 player 能抓明显差的。
- fun 压缩(可玩款都给 3、doodle 给 4):细排不行(需创始人锚),但粗筛 hollow(1)↔可玩(3-4)能分开 = 过滤器能力成立。
- 盲点:saolei 给 pass(fun 3)——M3 凭截图+常识判"扫雷骨架完整可玩",没识破该次 run 只踩雷、核心玩法零暴露的弱证据(见 7.3)。 → M3 作生产 player 过滤层:抓明显坏可信;审"门证据质量"不行(那是教师层的事)。
7.2 Opus 教师审计(脚手架期,10 agents 对抗反驳)
每款派对抗审计员读源码+截图+state 尽力反驳"假绿"/归因失败:
- 0 假绿(危险侧无失守):7 个 claimed-pass 中 6 真可玩(tictactoe/jianfeng/breakout/runner/invaders/doodle,refutation 全失败,含独立 node 复算棋局、碰撞数学、分数防灌源码证伪)——没有一个坏游戏被当好游戏放过。
- saolei = borderline(关键告警):游戏本体源码可玩(布雷/邻数/数字渲染/0格洪泛/win 判定全对),但该 verdict 的 H 仅
revealed 0→1且经【踩雷 lose】满足 → 核心玩法在门证据里零暴露。门没误判"游戏不存在",是 driver 盲打无避雷致证据过薄;门+M3 都没抓到,只有 Opus 深审抓到。 - 2 fail 全是 driver-coverage,零 model-gap / 零 hard-ceiling:
- flappy:8 门绿、仅 progress(score 0→0)挂。flap-to-gap driver 太朴素(无前瞻),对极端高位缝(centerY174/鸟559,单拍仅升 80px)追不上→撞管。源码物理合理,理想瞄准 AI 多种子得 5-15 分→游戏可玩。升 pro 三次仍同门挂 → 证 driver 缺陷、非模型档位。
- tetris:8 门绿、仅 latch 挂(piecesLocked 0→1 过但没堆到顶)。key-cycle 盲打 50 步 + clearLines 持续消行→永堆不到 spawn 行→gameover 不可达。源码 latch 契约忠实、对人类可达。换"读盘单列堆顶"driver 或大幅加步即翻绿。
7.3 地板的真实承重件 = latch + G_input,不是 progress 计数
审计核实 play.cdp.cjs:516 H_progress.pass = progressPass && latchPass(硬 AND)。7 款 assertAfterPlay 全是单条弱计数(moves/revealed/inserted/score/remaining 动 1 步即过),其中 saolei(踩雷也 ++)/ runner(score 计时自增、spec 自承"稳过")/ doodle(理论纯自弹也可能蹭高度) 的 progress 子句鉴别力弱。真正隔离"漂亮空壳"的是 expectLatch(真到 gameover + 600ms 驻留、堵自动重开)+ G_input(同帧 A/B 哈希证输入真生效);tictactoe/invaders/breakout 因终局语义(全清/三连/真掉球)progress 才较强。门有鉴别力非橡皮图章:flappy 卡 progress、tetris 卡 latch、t2048 连 E/G 都红——失败分布在不同门。
7.4 三方结论
- 确定性门 = 地板:危险侧 0 假绿、有鉴别力;但地板高度由 driver 覆盖度封顶——driver 太弱则塌成 false-fail(flappy/tetris/saolei 同源),弱 progress 计数靠 latch+G_input 兜。
- M3 便宜 player = 过滤器:抓明显坏(flappy)、粗筛可玩,担生产中间层可信;审不出弱证据(saolei),细排靠创始人。这正是三层 reframe 的中间层落地。
- Opus 教师 = build-then-exit 的硬化工具:抓到 saolei 弱断言 + 把 flappy 错归因"模型天花板"纠正为"driver 缺陷"——审完去硬化门/driver,生产跑 门+M3+创始人(无 Claude)。
方法学诚实标注【inferred/静态】:Opus 审计系源码 + 落盘证据静态交叉验证(本机 serve/CDP 已停,saolei-borderline、flappy@pro-fail、invaders-replay 等部分款未现场重跑);结论可复核但非全量现场实测。
7.5 player-as-filter 量化(Task #6 自主部分)
以 Opus 审计的 playableTruth 为代理真值(创始人锚 MAE 需创始人补,框架沿用 calibrate.py),量化 M3 当过滤器(数据 calibration/m3_test.json):
- M3 vs 确定性门:8/9 一致(唯 tetris 分歧:门判 fail/latch、M3 判 pass——门更严、抓到 M3 看不见的机制失败)。
- M3 vs 审计真值:7/9。M3 正确:6 款 confirmed-playable 全 pass(好游戏 0 误杀)+ flappy 正确判 hollow(fun1)。漏判 2 款:saolei(审计 borderline)、tetris(审计 fail/键盘死)——共性="截图里看着没问题"(saolei 踩雷 lose 屏、tetris 有 1 块落定),M3 凭视觉+常识判可玩,看不出"该次 run 核心玩法没真跑"。
- 过滤器结论:M3 抓视觉显性空心(flappy:鸟死/零分/空屏)有效;漏截图不可见的失败(键盘死、弱证据)——但这些恰好确定性门已兜住(tetris latch 挂、键盘款 score0 挂、saolei 弱断言已列整改)。→ 生产三层互补非冗余:门抓机制失败(地板)、M3 抓视觉空心 + 给便宜 fun 信号(过滤 + 主观层)、创始人抓截图不可见的手感/弱证据(人锚)。M3 边际价值不在"抓门漏的坏"(门更强),而在门通过后的便宜主观 fun 信号 + 减创始人对显性差件的抽检量。
- 压 MAE / 查准下一步:需创始人对这 9+ 新款亲玩给锚(我产不了)→ 入
labels.json跑calibrate.py出 MAE/查准查全数值;框架就绪、待人锚。
八、门面优先级建议(定稿,经两轮对抗诊断 workflow)
经压测批实测 + 源码核验,spec 预判的功能门面缺口几乎全部被推翻;真·L0 门面缺口高度收敛为唯一一处。
P0 — 唯一真·L0 硬门面缺口(系统性命中 3 款,最高优先)
宿主键盘事件门面缺失 —— game-runtime/src/host/boot-game-host.js 的 attachInput() 只桥 pointerdown/move/up,完全不桥 keydown/keyup → ctx.getInput() 键盘通道空。getInput 契约声明「pointer 三态 + key 两态」,实现漏了 key 两态。
- 证据:失败严格沿「键盘 vs 指针」分界(3 键盘款全挂、所有指针款全过;同射击品类 invaders 走 pointer 即过);bundle 内
_emit仅 pointer×5、keydownemit 0 命中;桥白名单已含 keydown/keyup 却无人 emit。 - 修法(L0,2 行,零兼容风险):
attachInput()补window.addEventListener('keydown', ev => { unlockAudioOnce(); inputBridge._emit('keydown',{key:ev.key}) })+ keyup,对齐同仓host-dev/host.js:427-428已有正确范式。一次解锁 t2048 / asteroids / tetris 三款。已 spawn_task 交 L0。 - 配套(我域,已修):
play.cdp.cjs:159key() 对 Arrow 键发key=undefined→ 改为code===key直传(否则桥了 ev.key 游戏仍读空)。
实测未成立的预判(逐条澄清,勿再投入门面)
- CCD swept:asteroids(
lineCircleIntersect线段vs圆)、multiball(SUB_STEP子步 swept)便宜模型已自带连续碰撞,无 tunneling。不是缺口。 - 文本 HUD:6 款
_forensicsView+ HUD 渲染齐全,D_render/E_live 全过。不是缺口。 - 网格状态:井字棋/扫雷/2048/match3 网格逻辑 flash 自写正确。不是缺口。
- match-finding / swipe:match3 盲态 tap-pairs 已凑出三连真过。非 L0 门面(要确定性可在 driver 侧加 grid-swap-finding)。
- 手势(drag-to-aim):愤怒小鸟缺的是 harness driver 第 7 型,driver 域、非门面。
driver-coverage(harness 我域,非门面;是门面定优先级的前置净化步)
"driver-coverage 可修翻绿"已双证:invaders(步数 30→50 翻绿)、tetris(host 键盘修复后整盘翻绿)。其余残留经 driver 调参实测(flap 加速度前瞻 / paddle 弃守排空相位 / 2048 双向堆叠)未轻易翻绿——因玩法特性、收益递减,如实记档(均非门面、非模型,实验已 revert):
- multiball:终局可达,但盲态弃守排空时挡板被钳在屏内、角落仍接球,末球不漏 → latch 难达;需"反接球振荡排空"driver(未做)。
- t2048:2048 盲态无强制终局(随机走总有合法移动,实测双向也只死 1 次合并)→ latch 非盲态可达;需"填库死锁"driver 或 progress-only 门(玩法特性,非缺陷)。
- flappy:flap-to-gap 加速度前瞻仍救不回该 pro 生成件(物理太硬 + 缝隙观测早期 None)→ 需近理想控制 driver 或 pin-易物理重生成。
- 愤怒小鸟:需 drag-aiming driver(读目标反解拖拽矢量)+ 游戏导出目标位;未做。
两轮诊断证实:把这些 false-fail 误记为门面缺口会污染优先级,故先净化 driver 覆盖再定门面。论题已立,残留属"调参/重生成"打磨项,非阻塞。