- 注册表:docs/architecture/README.md §2,37 份 canonical(frontmatter topic+canonical:true)与表双向机器对账
- 门:.agents/tools/docs-gate.py 六检(品牌根/canonical唯一/死链/入口卫生/留痕隔离/设计档申报),挂 .githooks/pre-commit(本仓已激活)+ .gitea/workflows/docs-gate.yml(待runner)+ wave-close 第8步;旧 check-deadlinks.sh 退役并入 G3
- 清缩:删 54 项历史档(plans 16/agent-specs 设计与spike 20/brainstorms 5/memorys 3/goals+作战清单完成史归档/王蓝莓design/SAA现状html/add-game-template);channel-spike 564K 代码资产迁仓级 spikes/;六件删前蒸馏已迁(代码评审16条open项→进度总账§5、prefix-cache字段表→cheap-model skill、意图基线29条→需求清单附录、九门降级rationale→验收门、A11 TODO→tech-decisions、3layer边界→littlejs-game-dev 指针)
- 修口径约90处:六处SAA『现行主线』旧标、Nacos/RocketMQ『未部署』旧述(07-01反转)、gameDefinition残留、全部死链改 git show 定位;AGENTS.md 249→136行(决策史归tech-decisions);_index 改纯在飞板;对外演示版 md→html
- 依据:docs/agent-specs/2026-07-02-文档治理-{全量普查与裁决-report,SoT注册表与治理门-设计}.md(四路普查191份md+Codex/Opus双评审必修项已折入);恢复基线 8ea97234(单档 git checkout 8ea97234 -- <路径>)
337 lines
39 KiB
Markdown
337 lines
39 KiB
Markdown
# W-G1 基准 · 20 款经典轻游戏靶集与 4 类能力缺口
|
||
|
||
> 🚧 **架构演进中** —— 廉价线 **gameDefinition 已废(错误路线),现行 = A-model 写真 `src/`**;tier2 富游戏自治轨建设中(0 号 spike accept)。文中结论可能随推进变化,以子树 [README](README.md) / 运行时 SoT [`agentic运行时架构图说`](agentic运行时架构图说.md) 与最新裁定为准。
|
||
|
||
> **这是什么**:绘境AI 生成引擎用来回答一个很实在的问题的设计文档——**"便宜的通用模型 + 我们当前这套引擎和插件库,到底能造出什么样的游戏、又造不出什么"**。它把 20 款人人都玩过的经典轻游戏铺成一张靶集,既验证生成管线确实能端到端跑通,又拿这些游戏去压测能力上限、把引擎和插件库的短板逼出来。
|
||
> **给谁看**:负责生成主线的工程师、想知道"哪些品类现在就能放量做、哪些还得先补能力"的产品与创始人,以及做技术尽调时想看清"生成能力真实边界在哪"的架构评审。
|
||
> **怎么读**:先读 §1 那张图,搞清楚"靶集是什么、为什么要这么排";想看每款游戏的覆盖判定读 §3 那张大表;想看四类能力缺口的诊断与证据读 §4;想看怎么分批跑读 §5。
|
||
>
|
||
> **W-G1 是什么**:它是"便宜模型造游戏"这条路线第一批真刀真枪的实测靶集(W = Wave 批次,G1 = Game 第一批)。这份文档是它的策展层主档,把一份调研产出整理成给人读的全景;它本身**未改任何运行时代码**,是一次只读的能力盘点。
|
||
|
||
生成引擎主文档([README.md](README.md))讲的是"一句话怎么变成一款游戏"那条技术主线,验收门文档([验收门.md](验收门.md))讲的是"那条主线怎么对真实用户安全开闸"。本文讲的是第三件事:**开闸之后,我们到底拿什么去喂这台机器、又该期待它产出什么质量**。20 款经典游戏就是那批"考题",它们的覆盖判定和暴露的缺口,直接决定了批量放量时该先做哪些品类、又该先补哪层能力。
|
||
|
||
> ## ⚠️ 实测后修订(2026-06-14 / 06-15 放量已跑完,务必先读)
|
||
> **本档 §3 / §4 的覆盖判定与"4 类门面缺口"是一份 *实测前预判*;放量实测(scale-20,14 款真跑)已把其中的门面缺口判断几乎全部证伪。** 现行结论以 [`.agents/skills/cheap-model-game-generation.md`](../../../../.agents/skills/cheap-model-game-generation.md) §8–§9 与 scale-20 短板量化报告(已删,git 存档:`git show 6d2f8789^:docs/agent-specs/_archive/2026-06-14-WG1-scale20-短板量化报告.md`) 为准。三条要点:
|
||
> 1. **4 类预判门面缺口几乎全部证伪**:便宜模型(flash 这档)**自带或自写** CCD(子步 swept,见 asteroids/multiball)、文本 HUD、网格状态机(井字棋胜负+AI、扫雷洪泛)、match-finding、手势——**均非"造不出"**。文本 / 网格门面价值仅剩"省 token / 一致性",而非"造不出"。
|
||
> 2. **真实的唯一 L0 门面缺口 = 宿主键盘桥**(`getInput` 早期不透 keydown/keyup,导致 2048/Tetris/Asteroids 三款键盘游戏集体挂)——**已修**(commit `d754b71` `fix(host): attachInput 补 keydown/keyup window 桥接`,2026-06-14)。
|
||
> 3. **下文 §1 图、§4 诊断、§5.4 的"补门面优先级预判(文本>网格>swipe>CCD)"均属预判,已被实测推翻**——保留它们是为了让读者看清"预判 vs 实测"的对照,**不要再据此排门面优先级**。失败的真实归因是实例 bug / driver-coverage(harness 适配 driver 不够)/ 宿主键盘桥,**而非模型能力**(scale-20 闭口:**0 个模型造不出 / 0 个 3D 硬界**)。
|
||
|
||
---
|
||
|
||
## 1. 一句话与一张图:W-G1 靶集是什么、为什么这么排
|
||
|
||
W-G1 靶集的本质,是用 **20 款机制各异的经典轻游戏**,去给"便宜模型 + 当前引擎/插件库"这套组合做一次**能力体检**。这里要先把两个判断说清楚,它们决定了整份文档怎么读:
|
||
|
||
- **靶集不是为了"做出 20 款游戏",而是为了"摸清能力边界"。** 选这 20 款,是因为它们刚好铺满了轻游戏的机制谱系——从最简单的回合制点击(井字棋),到最难的连续物理与程序化生成(小行星、多球弹球)。把它们一字排开,哪一档开始崩、崩在什么能力上,就一目了然了。
|
||
- **便宜模型是这条路线的成本前提,不是临时凑合。** 这里的"便宜模型"特指 **M3 / M2.7 / DS-V4** 这一类低成本通用模型(M3 = MiniMax 的一档模型,DS-V4 = DeepSeek V4 系列;它们都不是为游戏代码专门训练的)。整条生成主线的判断就是用便宜模型打底、靠模板约束和验收门补质量缺口(详见[生成引擎主文档](README.md) §1),所以体检也必须用便宜模型来做,而不是用强模型。
|
||
|
||
把这 20 款按"当前能不能造得出"分档,得到的全景是这样的:
|
||
|
||
```mermaid
|
||
flowchart TB
|
||
subgraph 齐备["✅ 能力面齐备 · 约 12 款 · 可立即冒烟"]
|
||
direction LR
|
||
E1["井字棋 / Pong / Simon<br/>打地鼠 / 记忆翻牌"]
|
||
E2["Flappy / 打砖块 / 太空侵略者<br/>Doodle Jump / 跑酷"]
|
||
E3["扫雷 / 见缝插针 / 节奏点击"]
|
||
end
|
||
subgraph 半缺["🟡 半缺口 · 底层有原语但无门面 · agent 须自补层"]
|
||
direction LR
|
||
H1["2048 / 贪吃蛇<br/>(网格 + 文本 HUD)"]
|
||
H2["Tetris / Match-3<br/>(网格状态机上限)"]
|
||
H3["愤怒小鸟<br/>(拖拽手势)"]
|
||
end
|
||
subgraph 硬边界["❌ 真缺口 · 当前造不出 · 已主动规避"]
|
||
X1["高速球穿透类<br/>(连续碰撞 CCD 缺失)"]
|
||
X2["完整 Pacman 鬼 AI<br/>(寻路 A* 缺失 · 未入选)"]
|
||
end
|
||
齐备 -->|"批次1 验管线打通"| 结论["20 款 = 一张能力体检表<br/>暴露 4 类短板"]
|
||
半缺 -->|"批次2/3 量化自补出错率"| 结论
|
||
硬边界 -->|"定死引擎硬边界"| 结论
|
||
```
|
||
|
||
读这张图,记住三句话就够了。**第一,约 12 款(井字棋、2048、Flappy、打砖块、贪吃蛇、Pong、扫雷、Simon、Snake 类……)当前插件和引擎已经直接覆盖**,便宜模型在现有能力面上应该就能产出可玩件——这批先拿来做冒烟,验证管线通不通。**第二,缺口集中在 4 类能力上**,它们决定了 Tetris、小行星、高速打砖块、消消乐这几款难游戏的产出质量,是本基准最核心的产出。**第三,真正"造不出"的硬边界只有两条**——高速小目标的连续碰撞、以及敌人智能寻路,后者已经在选题时主动规避掉了。
|
||
|
||
那 4 类能力缺口,是整份文档的重点,先在这里列出名字(§4 逐个展开):
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
subgraph G["4 类能力缺口(本基准核心产出)"]
|
||
direction TB
|
||
C1["① 文本 / 分数 HUD 渲染<br/>无插件门面<br/>(最高频缺口)"]
|
||
C2["② 网格 / 棋盘状态抽象<br/>无 grid / tilemap 门面"]
|
||
C3["③ 连续碰撞 CCD<br/>collision 仅离散 MTV<br/>(真缺口)"]
|
||
C4["④ 通用状态机 FSM<br/>gamefeel 仅 3 个特化计时器"]
|
||
end
|
||
C1 --> R["决定 Tetris / 小行星<br/>高速打砖块 / Match-3<br/>的产出质量"]
|
||
C2 --> R
|
||
C3 --> R
|
||
C4 --> R
|
||
```
|
||
|
||
这里要钉死一个**最关键的判断,它纠正了一个直觉误区**:真正的短板不在于"造不出来",而在于"**agent 每次都要自己重新补一层**"。上面的 ①②④ 其实引擎或插件库里都有底层原语,或者本就属于"agent 写码生成"的范畴(比如引擎的 `LJS.drawText` 文本绘制函数是存在的,只是没被插件包装出来;网格状态本就该由 agent 自己管)。**但"没有插件门面"意味着每一款游戏的便宜模型都得把这个轮子重造一遍**——结果就是一致性差、token 贵、容易出错。所以本基准给出的核心建议是:**W-G1 实测之后,把高频缺口(文本 HUD、网格)补成插件门面**,而不是放任 20 个 prompt 各自硬写。
|
||
|
||
> **实测修订(2026-06-14):** 上一段的"agent 每次都要重补一层、容易出错"是 *实测前预判*。放量实证显示:flash 这档**自写文本 HUD / 网格状态机 / 子步 swept CCD 均正确**,补门面的价值只剩"省 token / 一致性",而非"造不出来"。即"高频缺口补成插件门面"应理解为**优化项而非必备项**——详见档首"实测后修订"横幅。
|
||
|
||
> 这里反复出现的两个词先解释清楚。**门面(façade)**:指插件对外暴露的那层公开 API——便宜模型只能用这层 API,看不到也碰不到引擎底层。**生成域**:指那些约定让 agent 自己写码实现、不归插件管的东西(玩法逻辑、美术、关卡、UI)。一个能力到底"算不算缺口",判据就是它需要的底层原语有没有门面或引擎透传面兜底(详见 §2.4)。
|
||
|
||
---
|
||
|
||
## 2. 事实基:当前能力面到底有什么(都带证据锚点)
|
||
|
||
要判断 20 款游戏能不能造出来,前提是先把"当前到底有什么能力"盘点清楚。这份盘点有一条很硬的纪律:**只认源码实际导出的东西,不认"我以为有"**。具体来说,覆盖判定的依据是三处源码——插件手写的 API 门面声明(`api.d.ts`)、插件实际的代码返回面(`impl.js`),以及宿主把引擎能力透传出来的那个函数(`host.js` 里的 `makeEngineCaps()`)。下面每一条能力都带 `文件:行号` 的证据锚点,可逐条复核。
|
||
|
||
> **几个专有名词先解释**。**插件库**:在 LittleJS 引擎(我们选定的轻量 H5 游戏引擎)之上加的一层能力插件,把碰撞、粒子、物理、手感等做成可复用的 API。**透传**:引擎本身能力很多,但插件墙只把其中一小部分"透"出来给 agent 用,没透出来的引擎能力就不构成 agent 的"能力词汇"。**受控面**:一组刻意收窄的底层接口(画布、输入、时钟、随机等),它是"引擎将来可替换"的边界——只要这层接口不变,底层换引擎上层无感。
|
||
|
||
### 2.1 插件库实际导出(7 个业务插件 + 1 个埋点插件)
|
||
|
||
这是 agent 能直接调用的能力主体。每个插件只暴露它"源码里真的会 return 出来"的那些函数:
|
||
|
||
| 插件 | 公开能力(源码实际 return 面) | 证据锚点 |
|
||
|---|---|---|
|
||
| **collision**(碰撞) | 离散几何相交:圆碰圆 / 圆碰矩形 / 矩形碰矩形;**凸多边形 SAT + MTV**(SAT = 分离轴定理,判两个凸多边形相不相交;MTV = 最小平移向量,告诉你怎么把它们推开)、射线命中(RayHit)、**空间哈希**(SpatialHash,用均匀网格做碰撞粗筛) | `collision/impl.js:268/295/337/395/462/500`、`SpatialHash:112-264`;api.d.ts `Manifold`/`RayHit:80/97` |
|
||
| **physics-lite**(轻物理) | 离散运动数学:抛体 + 重力、弹簧 / 临界阻尼、带约束移动、限速 / 摩擦 | `physics-lite/impl.js:104/127/181/194/241/268/286` |
|
||
| **particles-juice**(粒子手感) | 粒子发射器、命中停顿(hitStop)、屏幕震动、闪白、缩放脉冲、预设 | `particles-juice/impl.js:438/504/524/544/562`;api.d.ts `:204-240` |
|
||
| **gamefeel**(手感) | 输入缓冲、郊狼时间(CoyoteTimer)、连击窗(ComboWindow)、**11 条 easing 标准缓动曲线**(纯函数,经引擎门面) | `gamefeel/impl.js: InputBuffer:232/CoyoteTimer:319/ComboWindow:390`;api.d.ts `:108/154/196` |
|
||
| **audio-music**(音频) | 音效(blip/thud/chime)、BGM 播放 / 循环 / 停止、强度分层、加载曲目 | `audio-music/impl.js:438/455/463/467/471/481` |
|
||
| **palette-post**(调色后处理) | 调色板映射、HSL 色彩变换、后处理(暗角 / 抖动 / 扫描线) | `palette-post/impl.js:142/210/238/62/90/392/412` |
|
||
| **save-progress**(存档) | KV 持久化:读 / 写 / 删 / 清(命名空间隔离 + 损坏容错 + 单条上限) | `save-progress/impl.js:219/243/285/294` |
|
||
| **runtime-probe**(取证埋点) | 取证记录 / JSONL 导出 / 哈希链校验——**非玩法能力**,专给 e2e 证据用 | `runtime-probe/impl.js:330/335/340` |
|
||
|
||
> **郊狼时间(coyote time)** 是个游戏手感术语:角色刚离开平台边缘的一小段时间内仍允许起跳,避免"明明踩着了却没跳起来"的挫败感。**输入缓冲(input buffer)** 则是提前一点点按键也能被记下来、等条件满足时生效。这两个是平台跳跃类游戏的"手感润滑剂"。
|
||
|
||
### 2.2 引擎透传真实粒度(`createEngineCaps()`,只此三面)
|
||
|
||
除了上面 7 个插件,宿主还从引擎本体直接透出了三面能力。**注意:只有这三面**——引擎(LittleJS)本身远不止这点(它有文本绘制 `drawText`、贴图绘制 `drawTile`、瓦片碰撞、相机等等),但插件墙内**只透出这三面**,其余引擎能力都不构成 agent 的能力词汇:
|
||
|
||
> **锚点说明:** 这个能力背书工厂原是 `host.js` 闭包里的 `makeEngineCaps`,已被提升为独立可 import 模块 `host-dev/engine-caps.js` 的 `createEngineCaps()`(搬运·语义零变,见 `host.js:188-190` 的迁移注与 `engine-caps.js:8`)。host-dev 与 wanglanmei-ref real 通道共用同一份。下表锚点已指向 `engine-caps.js`。
|
||
|
||
| 透传面 | 真实粒度 | 证据锚点 |
|
||
|---|---|---|
|
||
| **particles**(粒子) | 薄包装引擎的 `ParticleEmitter`(全参数映射),做了像素↔世界坐标的阻抗换算 | `engine-caps.js:61-120`(`new ParticleEmitter:91`) |
|
||
| **audio.synth**(音频合成) | 把音效 / 音乐合成为 PCM 样本(只合成不播放,播放层另补) | `engine-caps.js:122-145`(`synthSfx:134`) |
|
||
| **math**(数学) | `lerp` 线性插值 / `smoothStep` 平滑步进 + 11 条等价缓动曲线(POWER/BACK/ELASTIC 族),纯函数 | `engine-caps.js:51-61` + `engine-math.js:56-87` |
|
||
|
||
### 2.3 受控面 6 项(引擎可换边界)
|
||
|
||
这是最底层的一组接口,定义在 `api.d.ts:264-304`,是"引擎将来可替换"的边界:`getContext2d()` 取 2D 画布、`onFrame()` 帧回调、`getInput()` 归一化输入、`getAudioContext()` 取音频上下文、`time` 受控时钟、`random` 确定性随机。
|
||
|
||
这里有一个对触屏轻游戏特别要命的事实必须说清:**输入只有 5 类原始事件**(`api.d.ts:218`,无非是 pointer 的三态和 key 的两态),**没有手势识别**。也就是说,滑动(swipe)和拖拽(drag)这类手势,引擎不给现成的——agent 必须在生成域里自己把一串 pointer 序列(按下→移动→抬起)缓存起来、算出方向和距离来合成手势。这正是后面 2048、消消乐、愤怒小鸟会暴露的一处半缺口(§4)。
|
||
|
||
### 2.4 一条决定"什么算覆盖"的纲领
|
||
|
||
最后这条是判定的总纲,直接决定了 §3 那张表里每一格的 ✅ / 🟡 / ❌ 怎么打。技术决策里有一条终裁(`tech-decisions.md:38`):**玩法、美术、关卡、UI = agent 写码的生成域;插件 = 能力 API**。由此推出覆盖判定的口径:
|
||
|
||
- 某个机制所需的能力,**只要有插件门面或引擎透传面兜底,就算覆盖**;
|
||
- 纯玩法逻辑(回合制、计分、棋盘状态机)是 agent 自写域,**不算缺口**——
|
||
- **除非**它需要的底层原语(比如文本渲染、网格抽象)根本没有门面。那才是真正要补的地方。
|
||
|
||
换句话说:本基准从来不把"agent 要写代码"当缺口(那本就是 agent 的活),它只把"agent 想写代码却连底层原语都没有门面可调"当缺口。
|
||
|
||
---
|
||
|
||
## 3. 20 款经典轻游戏靶集表
|
||
|
||
下面这张表是靶集的主体。每一款游戏给出它的核心机制、所需能力、当前覆盖判定、工程难度档,以及一句话生成种子(就是喂给便宜模型的那句话)。
|
||
|
||
覆盖判定的三档含义是:**✅** 表示插件或引擎透传面已覆盖;**🟡** 表示引擎有底层原语、或属生成域但没有门面(agent 得自己补层,如果高频就建议补门面);**❌** 表示真缺口(没门面、且 agent 自写成本高 / 易错)。难度档则是:**易** = 单机制 + 静态或网格;**中** = 2-3 机制叠加 + 实时;**难** = 多机制 + 连续物理 / 程序化 / 高频碰撞。
|
||
|
||
| # | 游戏 | 核心机制 | 当前覆盖判定 | 难度 | 一句话生成种子 |
|
||
|---|---|---|---|---|---|
|
||
| 1 | **井字棋** | 3×3 落子 / 胜负判定 | 🟡 网格 + 文本🟡、输入✅、AI = 纯逻辑 | 易 | 3×3 棋盘点击落子 X,AI 落 O,三连判胜 |
|
||
| 2 | **2048** | 网格滑动合并 / 数字 | 🟡 网格 + 文本🟡(高频缺口)、swipe = 合成、合并 = 纯逻辑 | 中 | 4×4 数字方块,滑动合并同值,生成新块,显分 |
|
||
| 3 | **贪吃蛇** | 网格移动 / 自增长 / 自碰撞 | 🟡 网格 = agent 自管、输入✅、碰撞 = 网格逻辑、计分文本🟡 | 易 | 蛇沿网格吃食物变长,撞墙 / 撞自己结束 |
|
||
| 4 | **Flappy Bird** | 重力跳跃 / 管道避障 / 无尽 | ✅ physics 抛体 `:104`、collision `aabbVsAabb:337`、输入✅;文本🟡 | 中 | 点击让小鸟上跳,重力下落,穿随机高度管道 |
|
||
| 5 | **打砖块 Breakout** | 弹球反弹 / 挡板 / 砖块网格 | ✅ collision `circleVsAabb:295` + MTV 反弹、physics 限速;**高速球🟡** | 中 | 挡板接弹球击碎砖阵,球随挡板位置改反弹角 |
|
||
| 6 | **Pong** | 双挡板 / 弹球 / 简单 AI | ✅ collision / physics / 输入✅;AI = 纯逻辑 | 易 | 左玩家右 AI 各控挡板,漏球对方得分 |
|
||
| 7 | **扫雷** | 网格揭示 / 数字提示 / 标记 | 🟡 网格 + 文本🟡、输入✅、洪水填充 = 纯逻辑 | 中 | 点击揭示显周围雷数,右键标记,踩雷结束 |
|
||
| 8 | **Simon 记忆** | 序列记忆 / 颜色按钮 / 渐进 | ✅ audio `playSfx:481`、gamefeel 计时、输入✅;序列 = 纯逻辑 | 易 | 四色按钮按序闪烁播音,玩家复现,逐轮加长 |
|
||
| 9 | **记忆翻牌** | 翻牌配对 / 网格 | ✅ easing `:205` / 输入✅;网格🟡、图案 = agent 绘 | 易 | 牌面朝下,翻两张配对,全配对获胜 |
|
||
| 10 | **太空侵略者** | 波次敌阵 / 射击 / 碰撞 | ✅ collision AABB + SpatialHash `:112`、particles 爆炸;文本🟡 | 中 | 炮台左右移动射击,敌阵整体平移下压,清屏过关 |
|
||
| 11 | **俄罗斯方块 Tetris** | 下落方块 / 网格堆叠 / 消行 | 🟡 网格堆叠 = agent 自管(**高频痛点**)、输入✅、文本🟡 | 难 | 七种方块下落,旋转堆叠,满行消除,逐级加速 |
|
||
| 12 | **小行星 Asteroids** | 惯性飞船 / 任意角度 / 程序化碎裂 | ✅ collision `satVsPolygon:395` + RayHit、physics `applyFriction:286`;**高速子弹 CCD❌** | 难 | 飞船惯性漂移射击,大陨石击中裂小块,屏幕环绕 |
|
||
| 13 | **消消乐 Match-3** | 网格交换 / 三连消除 / 下落填充 | 🟡 网格 + 文本🟡(**高频痛点**)、swipe = 合成、消除 = 逻辑、easing✅ | 难 | 8×8 宝石网格,交换凑三连消除,上方填充连锁 |
|
||
| 14 | **跳跃者 Doodle Jump** | 垂直无尽 / 平台跳 / 重力 | ✅ physics 抛体 `:104`、collision AABB、coyote `:319`;相机 = 受控面、文本🟡 | 中 | 持续上跳踩平台,左右移动,平台程序化生成 |
|
||
| 15 | **愤怒小鸟(简版)** | 抛射弹道 / 拖拽蓄力 / 碰撞倒塌 | 🟡 physics 抛体✅ / 弹簧✅、collision MTV✅;**拖拽 = agent 合成 pointer 链** | 难 | 拖拽弹弓蓄力发射,抛物线击中结构使其倒塌 |
|
||
| 16 | **跑酷 Runner** | 横向无尽 / 跳跃滑铲 / 障碍 | ✅ physics 跳、collision AABB、buffer `:232` + coyote;swipe = 合成、文本🟡 | 中 | 自动向右跑,点击跳跃避障,距离计分,逐渐加速 |
|
||
| 17 | **打地鼠** | 随机出现 / 限时 tap / 计分 | ✅ random✅、collision 点 / 圆判、particles 命中;文本🟡 | 易 | 地鼠随机洞口冒出,限时点中得分,超时消失 |
|
||
| 18 | **见缝插针** | 旋转 / 时机 tap / 碰撞检测 | ✅ math 角度、collision `raycastCircle:462`、particles;文本🟡 | 中 | 中心圆持续转,点击射针,针不能相撞,逐根加针 |
|
||
| 19 | **节奏点击** | 时间窗判定 / 节奏 / 连击 | ✅ `ComboWindow:390` + `InputBuffer`、audio、easing;文本🟡 | 易 | 音符落判定线时点击,perfect / good 分级,连击加成 |
|
||
| 20 | **弹球变体(多球)** | 多球 / 道具掉落 / 物理反弹 | ✅ collision 圆 + AABB、physics 限速、particles `shakeScreen:524` / `flashScreen:544`;**高速多球 CCD🟡** | 难 | 挡板接多球击砖,砖落道具(增球 / 扩板),命中屏震闪白 |
|
||
|
||
> 表里反复出现的 **AABB**,是 axis-aligned bounding box(轴对齐包围盒)的缩写,指那种边沿和坐标轴对齐的矩形碰撞框——绝大多数 2D 碰撞都用它,因为判定最快。
|
||
|
||
---
|
||
|
||
## 4. 四类能力缺口诊断(本基准的核心价值)
|
||
|
||
这一节是 W-G1 真正要回答的东西。20 款游戏合计考到的能力维度里,绝大多数都有插件或透传面兜着(✅),它们能立即冒烟;真正暴露问题的,是下面这 4 类(再加 2 条已规避的硬边界)。**缺口判定全部用"源码证伪法"**——不是按名字臆断"应该有",而是 `grep` 搜关键原语全空、再加上插件 `impl.js` 自述的能力边界,两头夹住才下结论。
|
||
|
||
先用一张图把它们的性质分清楚:**❌ 是"真造不出"的硬缺口,🟡 是"造得出但每款重造轮子"的半缺口**。两者的应对动作完全不同:
|
||
|
||
```mermaid
|
||
flowchart TB
|
||
subgraph 真缺口["❌ 真缺口:无门面 + agent 自写成本高/易错"]
|
||
CCD["① 连续碰撞 CCD(swept)<br/>暴露:#5 高速球 / #12 子弹 / #20 多球<br/>后果:高速小球穿砖穿墙(tunneling)"]
|
||
PATH["寻路 A* / 导航<br/>已主动规避(完整 Pacman 鬼 AI 未入选)<br/>→ 明确的引擎硬边界"]
|
||
end
|
||
subgraph 半缺口["🟡 半缺口:底层有原语/属生成域,但无门面 → 每款重造轮子"]
|
||
TEXT["② 文本 / 分数 HUD 渲染<br/>暴露:几乎全部(~15/20 款)<br/>→ 最高频缺口,W-G1 后第一优先补门面"]
|
||
GRID["③ 网格 / 棋盘状态抽象<br/>暴露:#1/2/3/7/9/11/13<br/>→ 2048/Tetris/Match-3 核心难度"]
|
||
GEST["手势识别(swipe / 拖拽)<br/>暴露:#2/13 swipe / #15 拖拽 / #16<br/>→ 触屏轻游戏刚需,宜并入 gamefeel"]
|
||
FSM["④ 通用状态机 FSM<br/>暴露:#8 Simon / #11 Tetris / 回合制类<br/>→ 属生成域,优先级最低"]
|
||
end
|
||
真缺口 -->|"批次3已跑(06-14/15)<br/>结论:门面非必需"| DECIDE["决策:补哪个门面<br/>预判优先级(已被实测推翻)<br/>文本 > 网格 > swipe/拖拽 > CCD swept"]
|
||
半缺口 -->|"已量化:flash 自写多正确"| DECIDE
|
||
```
|
||
|
||
> **实测修订(2026-06-14 / 06-15):** 上图的"补门面优先级预判(文本>网格>swipe>CCD swept)"已被放量实测推翻——这四类**经放量验证均非缺口、不需补门面**(文本/网格门面价值仅剩"省 token/一致性")。下文 §4.1–§4.6 逐条诊断同属*实测前预判*,每条已就地标注实测反证;现行结论以 [`.agents/skills/cheap-model-game-generation.md`](../../../../.agents/skills/cheap-model-game-generation.md) §9 与 scale-20 报告(git 存档:`git show 6d2f8789^:docs/agent-specs/_archive/2026-06-14-WG1-scale20-短板量化报告.md`) §六/§八为准。真实的唯一 L0 门面缺口=宿主键盘桥(已修 `d754b71`)。
|
||
|
||
### 4.1 真缺口之一:连续碰撞 CCD(高速小目标会穿透)
|
||
|
||
**CCD**(Continuous Collision Detection,连续碰撞检测;也叫 swept,扫掠碰撞)指的是这样一种能力:当一个物体一帧之内移动得太快、跨度超过了目标的厚度时,普通的"逐帧看现在有没有重叠"会漏判——物体在两帧之间就"穿"过去了(术语叫 tunneling,隧穿)。CCD 的做法是检查整段移动轨迹有没有掠过目标,而不只看落点。
|
||
|
||
- **性质**:我们的 collision 插件**只有离散的 MTV / 穿透判定**(`circleVsAabb:295`),没有 swept / toi(toi = time of impact,碰撞时刻)。`grep` 搜 `swept|ccd|continuous|toi|tunnel` 全空,`impl.js:21` 也自述能力止于"MTV / 穿透 / RayHit"。
|
||
- **后果(预判)**:**高速小球会穿砖、穿墙**,便宜模型多半会产出"球偶尔卡进砖里 / 直接穿透"的 bug 件。暴露这个缺口的是 **#5 高速打砖块、#12 小行星子弹、#20 多球弹球**。
|
||
- **绕法与建议**:agent 可以用射线 `raycastAabb:500` 沿速度向量手做一个粗糙的 toi(可行,但每款都得重写、容易错)。如果实测发现高频,就给 collision 补一个 swept 门面。**是否本期补,建议等批次 3 实测数据再拍**,不预先投入。
|
||
- **★ 实测反证(2026-06-14 / 06-15,批次 3 已跑)**:这条"造不出 / 易穿透"的预判**未成立**——asteroids 子弹、multiball 弹球的源码经审计**已是子步 swept CCD、本体正确**,便宜模型自写正确。multiball 的 latch 未过是 driver-coverage(9s 内既清不完砖又护不住末球),asteroids 早期挂在宿主键盘桥(已修);**均非 CCD 能力缺口**。故"碰撞穿透门 J / swept 门面"已非急需。
|
||
|
||
### 4.2 真缺口之二:寻路 A* / 导航(已主动规避)
|
||
|
||
- **性质**:`grep` 搜 `astar|pathfind|navmesh` 全空;那个 SpatialHash 只做碰撞粗筛,**不是寻路**。
|
||
- **结论**:**任何需要敌人智能寻路的品类,当前都造不出**——这是引擎和插件库一条明确的边界。正因为如此,本基准在选题时就**主动规避**了完整的 Pacman(吃豆人鬼魂寻路)。真要做,得新增一个寻路插件。
|
||
|
||
### 4.3 半缺口之一:文本 / 分数 HUD 渲染(最高频)
|
||
|
||
**HUD**(Heads-Up Display,抬头显示)指叠在游戏画面上的那层信息——分数、生命、计时之类。这是 20 款里**最高频**的能力需求,却恰恰没有门面:
|
||
|
||
- **性质**:没有任何文本渲染门面(`grep` 搜 `drawText|renderText` 全空)。引擎的 `LJS.drawText` 是存在的,但没经插件透出,引擎能力背书工厂(`createEngineCaps`)那三面也不含文本(`host-dev/engine-caps.js:51-145`)。
|
||
- **后果**:每个游戏的便宜模型都得自己去 `ctx.getContext2d().fillText` 手画 HUD——结果就是风格各异、字体和对齐到处出错。
|
||
- **判定**:**这是最高频缺口**,20 款里约 15 款需要文本。所以**强烈建议补一个 text / HUD 门面插件,作为 W-G1 实测后的第一优先**。
|
||
|
||
### 4.4 半缺口之二:网格 / 棋盘状态抽象
|
||
|
||
- **性质**:没有 grid / tilemap 门面(`grep` 搜 `tilemap|gridMap` 全空)。网格状态本属 agent 生成域,但"坐标↔索引转换、邻接查询、遍历、合并"这些操作每款都得重写。
|
||
- **后果(预判)**:2048、Tetris、Match-3 的网格状态机正是它们的核心难度所在,便宜模型自管很容易出"合并方向错 / 消行错 / 连锁错"的 bug。暴露这个缺口的是 **#1/2/3/7/9/11/13**。
|
||
- **建议**:W-G1 重点观察便宜模型自写网格的出错率;如果高,就补一个 grid 工具门面。
|
||
- **★ 实测反证(2026-06-14)**:flash 这档**自写网格状态机正确**——井字棋(3×3 状态机+胜负+AI)、扫雷(洪水填充+雷数文本)、Match-3(score 0→40 真消除)均跑通。2048/Tetris 早期挂在**宿主键盘桥**(键盘没透出 → 棋盘零变化 / 重力假性锁定),修键盘桥(`d754b71`)后 Tetris 整盘翻绿、2048 真合并;**根因是键盘桥、非网格能力**。故 grid 门面价值降为"省 token / 一致性",非"造不出"。
|
||
|
||
### 4.5 半缺口之三:手势识别(swipe / 拖拽)
|
||
|
||
- **性质**:受控面 `getInput` 只给 5 类原始事件(`api.d.ts:218`),没有 swipe / drag 的合成。
|
||
- **后果(预判)**:agent 必须自己缓存 pointerdown→move→up 这串序列、算出方向和距离;愤怒小鸟那种拖拽蓄力尤其容易错。暴露这个缺口的是 **#2 / #13(swipe)、#15(拖拽)、#16**。
|
||
- **建议**:swipe / drag 是触屏轻游戏的刚需,可以补进 gamefeel 插件——它本就管输入缓冲,手势识别归它最自然。
|
||
- **★ 实测反证(2026-06-14 / 06-15)**:手势"易错"的预判**未成立**——Match-3 的盲态 swipe 交换凑三连真消除(本体正确),愤怒小鸟的拖拽蓄力**本体弹道正确**(F_wiring 过);二者的 score 缺口是 **harness 适配 driver 覆盖**(固定盲拖打不准 / 关卡 tuning),经 enrich 导出 launch 物理常数 + 加 drag-aiming driver 后**愤怒小鸟 0→20 清场**。**根因是可测性 / driver,非模型合成手势的能力。**
|
||
|
||
### 4.6 半缺口之四:通用状态机 FSM
|
||
|
||
**FSM**(Finite State Machine,有限状态机)指那种"在若干个明确状态之间按规则切换"的逻辑结构,序列记忆、关卡阶段、回合流转都用得上。
|
||
|
||
- **性质**:gamefeel 只有 3 个特化计时器,没有通用 FSM 原语。
|
||
- **后果**:多状态玩法自己写状态切换容易乱。暴露这个缺口的是 **#8 Simon、#11 Tetris** 及回合制类。
|
||
- **判定**:它属生成域,**优先级低于文本 / 网格**——因为纯逻辑这块,便宜模型相对擅长。
|
||
|
||
### 4.7 一句话审计结论
|
||
|
||
把上面六条合起来,审计结论是这样的:**20 款里约 12 款能力面齐备(✅),可以立即冒烟;余下 8 款集中暴露 4 类短板。最痛的不是"造不出",而是"文本 HUD + 网格状态"这两个高频能力没有门面——便宜模型 20 个 prompt 各造一遍轮子,在一致性、token、出错率三个维度上三重受损。真正"造不出"的硬边界只有两条:连续碰撞 CCD(高速穿透)与寻路(已规避)。**
|
||
|
||
下面这张表把"谁兜每一类能力、覆盖状态如何"汇总成一览(行号为证据锚点):
|
||
|
||
| 能力维度 | 由谁兜 | 覆盖状态 |
|
||
|---|---|---|
|
||
| 离散几何碰撞(圆 / AABB / 多边形 MTV) | collision `:268-431` | ✅ |
|
||
| 射线命中 / 空间粗筛 | collision `:462` / `SpatialHash:112` | ✅ |
|
||
| 抛体 / 重力 / 摩擦 / 限速 / 弹簧 | physics-lite `:104/286/194` | ✅ |
|
||
| 输入缓冲 / 郊狼 / 连击窗 / easing 11 条 | gamefeel `:232/319/390/205` | ✅ |
|
||
| 粒子 / 屏震 / 闪白 / 命中停顿 | particles-juice `:438/504/524` + 透传 | ✅ |
|
||
| 音效 / BGM / 强度分层 | audio-music `:455-481` + 透传 | ✅ |
|
||
| tap / 方向键输入 · 确定性随机 | 受控面 `getInput:218` / `random` | ✅ |
|
||
| **文本 / 分数 HUD 渲染** | **无插件门面**(引擎 drawText 未透出) | **🟡 缺门面(最高频)** |
|
||
| **网格 / 棋盘状态抽象** | **无 grid / tilemap 门面** | **🟡 缺门面** |
|
||
| **连续碰撞 CCD(swept)** | **collision 仅离散 MTV** | **❌ 真缺口** |
|
||
| **手势识别(swipe / 拖拽)** | **无门面**(agent 合成 pointer 序列) | **🟡 自合成** |
|
||
| **通用状态机 FSM** | **无**(gamefeel 仅 3 特化计时器) | **🟡 agent 自写** |
|
||
| **寻路 A* / 导航** | **无**(grep astar/pathfind 全空) | **❌ 硬边界(已规避)** |
|
||
|
||
---
|
||
|
||
## 5. 分批分档执行建议
|
||
|
||
有了上面的判定,W-G1 就不该 20 款一拥而上,而应**先用能力面齐备的易档验通管线(冒烟),再用中 / 难档加缺口款去压测能力上限、量化便宜模型在缺口处的产出质量**。据此分成三批,逐批加难:
|
||
|
||
> **实测进度(2026-06-14 / 06-15,本分批计划已执行完毕):** 三批均已实跑,结论已出——**主力批 flash 实过 7/8**(flappy 唯一未过=driver-coverage 非模型);**压测批 6 款 0 个"造不出"**,3 款键盘游戏集体挂于**同一处宿主键盘桥**(已修 `d754b71`,修后 Tetris 翻绿 / 2048 真合并 / asteroids 解冻),multiball / 愤怒小鸟挂在 driver-coverage(重生成 / 增强 driver 后翻绿,愤怒小鸟 0→20)。下文各批的验收口径保留原文;**"等批次 3 再拍"一类的待办均已闭口**,结论见 scale-20 报告(git 存档:`git show 6d2f8789^:docs/agent-specs/_archive/2026-06-14-WG1-scale20-短板量化报告.md`) 与 [`cheap-model-game-generation.md`](../../../../.agents/skills/cheap-model-game-generation.md) §9。
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
B1["批次1 · 冒烟批<br/>6 款 · 全 ✅ · 难度易<br/>Pong / Simon / 打地鼠<br/>记忆翻牌 / 贪吃蛇 / 节奏点击"]
|
||
B2["批次2 · 主力批<br/>8 款 · ✅ 为主 · 难度中<br/>Flappy / 打砖块 / 太空侵略者<br/>Doodle Jump / 跑酷 / 扫雷<br/>见缝插针 / 井字棋"]
|
||
B3["批次3 · 压测批<br/>6 款 · 含 ❌ / 难 🟡 · 难度难<br/>Tetris / Match-3 / 小行星<br/>愤怒小鸟 / 多球弹球 / 2048"]
|
||
B1 -->|"验管线零阻塞<br/>≥4/6 过好玩基线"| B2
|
||
B2 -->|"量化文本/网格/swipe<br/>三个高频🟡出错率<br/>≥6/8 可玩"| B3
|
||
B3 -->|"不强求高通过率<br/>重点产缺口实证报告"| OUT["喂决策:<br/>是否补 text/grid/swipe/swept 门面"]
|
||
|
||
style B1 fill:#a9dfbf
|
||
style B2 fill:#f9e79f
|
||
style B3 fill:#f5b7b1
|
||
```
|
||
|
||
### 5.1 批次 1 · 冒烟批(验管线打通)— 6 款 · 全 ✅ · 难度易
|
||
|
||
入选:**#6 Pong / #8 Simon / #17 打地鼠 / #9 记忆翻牌 / #3 贪吃蛇 / #19 节奏点击**。
|
||
|
||
理由是这 6 款能力面 100% 齐备、机制单一。这一批的目标不是出多好的游戏,而是**证明"便宜模型 + 插件库 + new-api 网关 + harness 门"这条链端到端能跑通**、能产出可玩件。(new-api = 绘境AI 内部统一管理模型 key 与计费的网关;harness = 把生成产物放进真实运行环境自动检验的测试夹具。)验收标准:**管线零阻塞 + 至少 4/6 款通过好玩基线评估门**。
|
||
|
||
### 5.2 批次 2 · 主力批(验常见机制覆盖)— 8 款 · ✅ 为主 · 难度中
|
||
|
||
入选:**#4 Flappy / #5 打砖块 / #10 太空侵略者 / #14 Doodle Jump / #16 跑酷 / #7 扫雷 / #18 见缝插针 / #1 井字棋**。
|
||
|
||
理由是这一批覆盖了物理、碰撞、波次、程序化、网格这些主流机制,并带少量 🟡(文本 / 网格 / swipe)。它的核心产出是一组**决策数据**:**量化文本 HUD、网格、swipe 这三个高频 🟡 缺口的便宜模型自写出错率**——这正是"到底要不要补门面"那个决策的依据。验收标准:**至少 6/8 款可玩**;并逐款记录 agent 在 🟡 缺口处是怎么补层的、出了哪些 bug。
|
||
|
||
### 5.3 批次 3 · 压测批(测能力上限 + 暴露缺口)— 6 款 · 含 ❌ / 难 🟡 · 难度难
|
||
|
||
入选:**#11 Tetris / #13 Match-3 / #12 小行星 / #15 愤怒小鸟 / #20 多球弹球 / #2 2048**。
|
||
|
||
理由是每款都压一到多个短板——Tetris / Match-3 / 2048 压**网格状态机上限**,小行星 / 多球弹球压**CCD 缺口**,愤怒小鸟压**拖拽手势缺口**。它的核心产出是**证实 §4 的缺口判定**:便宜模型在 CCD / 网格 / 拖拽处的产出质量到底如何(会不会穿透?消行对不对?蓄力准不准?),给创始人一张"引擎短板实测画像"。验收标准比较特殊:**不强求高通过率**(本批就是测上限的);**重点是产出缺口实证报告**,去喂"是否补 text / grid / swipe / swept 门面"那个决策。
|
||
|
||
> **实测结果(2026-06-14 / 06-15,本批已跑完):** 实证画像与 §4 预判**相反**——便宜模型**不会穿透**(asteroids/multiball 子弹已是子步 swept CCD)、**消行/网格对**(Tetris 修键盘桥后整盘翻绿、Match-3 真消除)、**蓄力准**(愤怒小鸟本体弹道正确)。6 款失败 **0 个"造不出"**:3 款键盘款挂宿主键盘桥(已修 `d754b71`)、multiball / 愤怒小鸟挂 driver-coverage(增强 driver 后翻绿)。**喂决策的结论 = text / grid / swipe / swept 四类门面均非必需**(若补,价值在省 token / 一致性)。详见 scale-20 报告(git 存档:`git show 6d2f8789^:docs/agent-specs/_archive/2026-06-14-WG1-scale20-短板量化报告.md`) §六/§八。
|
||
|
||
### 5.4 跨批观测项(W-G1 真正要回答的三个问题)
|
||
|
||
不管哪一批,W-G1 全程要盯着三个问题——它们才是这次实测真正的产出:
|
||
|
||
1. **便宜模型在三档的产出质量梯度**:M3 / M2.7 / DS-V4 从易到难,哪一档开始崩?这定下能力天花板。
|
||
2. **四类短板各拖垮多少款**:文本 / 网格 / CCD / 拖拽各自影响几款,据此排补门面的优先级。**预判是:文本 HUD > 网格 > swipe / 拖拽 > CCD swept**。 ⚠️ **此优先级已被 06-14 scale-20 实测推翻**:这四类经放量验证**均非缺口、门面非必需**(便宜模型自带或自写正确)——真实唯一 L0 门面缺口=宿主键盘桥(已修 `d754b71`);不要再据此预判排门面优先级。
|
||
3. **harness 门的判定有效性**:那套门能不能稳定逮住"穿透 / 消行错 / 不可玩"?门兜底是便宜模型路线的命门——门不硬,整条路线就立不住。
|
||
|
||
---
|
||
|
||
## 6. 风险与假设(诚实标注)
|
||
|
||
最后把这份基准的证据强度和未决项诚实标清楚,免得把推断当成实测、把假设当成结论:
|
||
|
||
- **[已验证]** 全部覆盖判定都基于源码导出(`api.d.ts` + `impl.js` 的 return 面 + `host.js` 的 `makeEngineCaps()`),证据锚点见 §2–§4 各处的 `文件:行号`。缺口判定用的是"源码证伪法"(关键原语 `grep` 全空 + `impl.js` 自述能力边界),不是按预期名字臆断。
|
||
- **[推断]** "便宜模型能产出 ✅ 款的可玩件"是**推断,不是实测**——这恰恰是 W-G1 要验的。本基准只确证了"能力面齐备",不预断模型的产出质量。
|
||
- **[推断]** 难度档(易 / 中 / 难)是按"机制数 × 实时性 × 缺口数"做的工程推断,不是用户体感难度。
|
||
- **[假设]** 好玩基线的具体判据未在本次检索中定位到原文,验收门的精确判据需在 W-G1 开工前从评估门 spec 取齐。
|
||
- **[未决]** 20 款的最终取舍可由创始人按"想优先验证的机制谱系"调整。CCD 与寻路这两条硬边界是否本期补门面,**建议等批次 3 实测数据再拍**,不预先投入。
|
||
|
||
---
|
||
|
||
## 7. 源档导航
|
||
|
||
本文档是 W-G1 基准的策展层主档,把一份只读调研产出整理成了这份给人读的全景。要看更深的逐款分析、能力盘点的完整证据链与决策史,从下面进去:
|
||
|
||
| 去处 | 回答什么 |
|
||
|---|---|
|
||
| `.agents/skills/cheap-model-game-generation.md` | 便宜模型造游戏的 worker loop、九门真玩 harness、design-agent 自产 gatespec、成本与模型选择、5 个坑(深落地权威源) |
|
||
| `.agents/skills/game-e2e-cdp-harness.md` | Canvas 游戏 e2e 证据 harness:编排形态、driver 六规则、ship 红线、四件套证据(W-G1 复用) |
|
||
| [生成引擎主文档](README.md) | "一句话怎么变成一款游戏"的生成主线全景(本文的上游) |
|
||
| [验收门-W-G1](验收门.md) | 这条主线"对外开闸"要先架的 6 道门 + 两道开闸前置验证 |
|
||
| [引擎与运行时](agentic运行时架构图说.md) | LittleJS 增强发行版、插件库分层、运行时沙箱与边界模型 |
|
||
|
||
> **纪律**:本档是 W-G1 基准的策展层 SoT——读它 = 当前真相。逐款落地与证据链在 `.agents/skills/`,决策史在 git 与带日期的源档里;两者职责不同,不互相重复。当现行真相与某份带日期的源档冲突时,以本档与它引用的最新裁定为准。
|
||
|
||
---
|
||
|
||
> **验证状态**:本文档为架构策展文档,由 W-G1 基准调研产出(只读盘点)改写而成,本身未改任何运行时代码。承重硬事实分两类:**(a) 仍成立的事实基**——7 插件 + 引擎三透传面 + 受控面 6 项、各能力的 `文件:行号` 证据锚点(`makeEngineCaps` 已迁 `host-dev/engine-caps.js`,见 §2.2)、三批分档(冒烟 6 款 / 主力 8 款 / 压测 6 款)及源码证伪法纪律,均沿用源档已抽查属实的结论。**(b) 已被实测推翻的*预判***——§3 / §4 的覆盖判定、"4 类能力缺口(文本 HUD / 网格 / CCD / FSM)"、"约 12 款 ✅ 可立即冒烟"、"补门面优先级预判(文本 > 网格 > swipe / 拖拽 > CCD swept)"均属*实测前预判*;2026-06-14 / 06-15 放量(scale-20,14 款真跑)已将其中的门面缺口判断几乎全部证伪(便宜模型自写正确),**真实唯一 L0 门面缺口=宿主键盘桥(已修 `d754b71`)**,现行结论以档首"实测后修订"横幅及其引用的 [`cheap-model-game-generation.md`](../../../../.agents/skills/cheap-model-game-generation.md) §8–§9 / scale-20 报告(git 存档:`git show 6d2f8789^:docs/agent-specs/_archive/2026-06-14-WG1-scale20-短板量化报告.md`) 为准。品牌统一为"绘境AI",无旧名残留。
|