games-development-ai/docs/agent-specs/_archive/2026-06-14-WG1-scale20-短板量化报告.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

17 KiB
Raw Blame History

《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 的三句话)

  1. 便宜模型(flash)+ 九门 harness 能产可玩轻游戏:主力批 8 款 flash 实过 7/8(井字棋/见缝插针/打砖块/跑酷/太空侵略者/Doodle 经 Opus 对抗审计确认真可玩、0 假绿;扫雷=borderline,本体可玩但门证据过薄,见 §七)。多数款 1 次重试内过,失败基本被静态门零 CDP 成本拦下、回喂即修唯 Flappy 主力批未过——经审计:非模型天花板(升 pro 仍挂、但理想瞄准 AI 可得分),根因是适配 driver 太朴素(driver-coverage,见 §七)。
  2. ⚠️ 推翻 spec 预判:基准 review 预测最痛缺口是「文本 HUD / 网格状态」。实测 flash 这档能自写文本+网格(井字棋、扫雷均过,grid 状态机/洪水填充/AI/计分自管正确)→ 这两类门面优先级应下调
  3. 真天花板 = 计时/物理精度类的生成质量 + harness 适配 driver 的覆盖:Flappy(物理太硬秒死、缝隙观测漏出)flash 2×2 次全挂;Doodle 靠收紧计分语义 + 适配 driver 才救回;太空侵略者靠调 driver 步数才验到 latch。门兜底有效的前提是 harness 有对的适配 driver——本批把 driver 库从 1 种扩到 6 种即为此。

二、方法与口径

  • 生成侧:wg1/gen-worker worker(裸 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 结果待填。


四、短板发现(证据支撑)

  1. 便宜模型主要栽点 = 静态门可拦的契约纪律滑坡。高频违规:Date.now/Math.random(应走受控 time/random)、缺 render/destroy 方法、忘调 getEngine()(真接线门无信号)。全部静态门零 CDP 成本拦下,回喂一次即修——印证"门兜底"是便宜模型路线的命门,且大头开销不在 CDP 而在生成。
  2. 文本 HUD / 网格状态:flash 能自写,非最痛缺口(推翻 spec 预判)。井字棋(3×3 状态机+胜负+AI+文本)、扫雷(洪水填充+雷数文本)均过;仅扫雷的进展观测量 revealed 首发没接对、retry 修。→ text/grid 门面优先级下调;若补,价值在"省 token/一致性",非"造不出"。
  3. 计时/物理精度类:生成质量 + 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 加前瞻,而非简单升档。
  4. 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 分支 · commit d754b71 · 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-pick d754b71 到 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.jsoncalibrate.py 出 MAE/查准查全数值;框架就绪、待人锚。

八、门面优先级建议(定稿,经两轮对抗诊断 workflow)

经压测批实测 + 源码核验,spec 预判的功能门面缺口几乎全部被推翻;真·L0 门面缺口高度收敛为唯一一处

P0 — 唯一真·L0 硬门面缺口(系统性命中 3 款,最高优先)

宿主键盘事件门面缺失 —— game-runtime/src/host/boot-game-host.jsattachInput() 只桥 pointerdown/move/up,完全不桥 keydown/keyupctx.getInput() 键盘通道空。getInput 契约声明「pointer 三态 + key 两态」,实现漏了 key 两态。

  • 证据:失败严格沿「键盘 vs 指针」分界(3 键盘款全挂、所有指针款全过;同射击品类 invaders 走 pointer 即过);bundle 内 _emit 仅 pointer×5、keydown emit 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:159 key() 对 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 覆盖再定门面。论题已立,残留属"调参/重生成"打磨项,非阻塞。