Runner v2 全弧第一相(HJ-RUNNER-ARC-001 / P1):用王蓝莓把"上层游戏宿主装载契约"
从零 spike 到"引擎真掌帧 + 游戏美术与引擎粒子同屏可玩",解锁 P2 泛化 / P3 生成。
契约与共享件
- 新增装载契约 game-runtime/src/core/game-host.d.ts(第9类 additive·暂名):
GameHostBootContext / GameInstance / GameHostFactory;游戏=纯模块工厂,零引擎 import,
能力经下层 ctx.getEngine()(受控面 6 项零改),绘制面 render(g) 的 g=引擎 mainContext
- makeEngineCaps 闭包提升为可 import 模块 host-dev/engine-caps.js(createEngineCaps):
host-dev/ref/未来生成游戏共用;engineMode 短路 / __engineCalls 探针 / null-engine 语义逐行不变
王蓝莓 real 通道(games/wanglanmei-ref)
- 增 ?engine=real:主循环从浏览器 RAF 改挂 engineInit 五回调(掌帧唯一源=引擎);
游戏美术绘制面从 #game 改引擎 mainContext(同屏合并);bundle 延后到 setupReal 内以
mainContext 建(getContext2d 闭包快照修);保 ?engine=stub 逐像素确定性回滚
- game-shop.js 抽为独立 GameHostFactory(零引擎 import,P3 生成 agent 可复制范本)
- entry.js 动态 import('littlejsengine')=node-import-safe ∧ esbuild iife 入包两全
- 驱动 e2e-input.cdp.cjs real 改造:禁 stepFrames 手摇(防双掌帧),真触摸+轮询;
门②同屏像素判据(暖色 warmHits ∧ 引擎粒子 brightHits 同张 #game-engine)
真机验收(mini-desktop real 引擎,5 门)
引擎掌帧 dFrame=31∈[20,45] / 同屏 warmHits=682∧brightHits=13028 同张 #game-engine /
particles.spawnEmitter+synthSfx call-ID 运行时真调引擎 / CDP 517 真触摸跑通整局
(第1天接待18·营收¥79.9·连击9) / console 零错;本机 88 单测全绿(含修复 4 红+补回归)
证据:games/wanglanmei-ref/evidence/p1-real/(e2e-evidence.json pass=true + 5 截图肉眼复核)
诚实 caveat:门② brightHits 在结算屏混入亮 UI,同屏合并由 warmHits(美术落引擎画布)+
call-ID(粒子真调引擎)+ 引擎架构(粒子渲同一 mainContext)三证成立,非阻断。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
19 KiB
《W-G1 · 20 经典轻游戏基准》设计稿(review 版)
状态:review 版 · 2026-06-13 · 只读调研产出(未改任何运行时代码)。 定位:本基准是"便宜模型(M3/M2.7/DS-V4)+ 当前引擎(LittleJS)/插件库"能产出什么的实测靶。20 款经典轻游戏铺满机制谱系,既验生成管线打通,又压测能力上限、暴露引擎/插件库短板。 调研口径:覆盖判定只认源码导出(api.d.ts 手写门面 + impl.js 实际 return 面 + host.js
makeEngineCaps()),不认"我以为有"。证据锚点全部带 file:line。 关联:边界模型见 memoryengine-plugin-boundary-model;本基准是 Runner v2 全弧 P3(W-G1)的靶集,见2026-06-13-runner-v2-arc-review.md。
结论先行(给创始人的三句话)
- 能打的多数:20 款里约 12 款 ✅当前插件/引擎已直接覆盖(井字棋/2048/Flappy/打砖块/贪吃蛇/Pong/扫雷/Simon/Snake 类…),便宜模型在现有能力面上应能产出可玩件——这批先做冒烟,验管线。
- 缺口集中在 4 类能力(本基准核心产出):① 文本/分数 HUD 渲染(无插件门面)、② 网格/棋盘状态抽象(无 grid/tilemap)、③ 连续碰撞 CCD(collision 仅离散 MTV,高速小球会穿透)、④ 通用状态机 FSM(gamefeel 仅 3 个特化计时器)。这 4 类决定 Tetris/Asteroids/Breakout-高速/Match-3 的产出质量。
- 真短板不在"造不出",在"agent 要自己补层":上述①②④引擎/插件其实有底层原语或属 agent 生成域(LJS.drawText 存在但未包装、网格状态属 agent 生成域),但没有插件门面=每款游戏的便宜模型都要重造一遍轮子→ 一致性差、token 贵、易错。建议:W-G1 实测后,把高频缺口(文本 HUD / 网格)补成插件门面,而非让 20 个 prompt 各自硬写。
A. 事实基:当前能力面盘点(verified,带证据锚点)
A.1 插件库实际导出(7 个业务插件 + 1 example)
| 插件 | 公开能力(源码实际 return 面) | 证据锚点 |
|---|---|---|
| collision | 离散几何相交:circleVsCircle/circleVsAabb/aabbVsAabb/satVsPolygon(凸多边形+MTV);射线 raycastCircle/raycastAabb(RayHit);SpatialHash(均匀网格 broadphase 粗筛) |
collision/impl.js:268/295/337/395/462/500、SpatialHash:112-264;api.d.ts:Manifold/RayHit:80/97 |
| physics-lite | 离散运动数学:integrateProjectile/Projectile(抛体+重力)、springStep/criticalDamping、moveWithConstraint、clampSpeed/applyFriction |
physics-lite/impl.js:104/127/181/194/241/268/286 |
| particles-juice | spawnEmitter(preset/config)、hitStop、shakeScreen、flashScreen、pulseScale、getPreset;渲染输出经受控面偏移 |
particles-juice/impl.js:438/504/524/544/562、getPreset:163;api.d.ts façade :204-240 |
| gamefeel | InputBuffer、CoyoteTimer、ComboWindow、easing 标准库 11 条(纯函数,经引擎门面) |
gamefeel/impl.js: InputBuffer:232/CoyoteTimer:319/ComboWindow:390/makeEasingFacade:205;api.d.ts :108/154/196 |
| audio-music | playSfx(blip/thud/chime)、play/loop/stop(BGM)、setIntensity/setIntensityLayering、loadSong |
audio-music/impl.js:438/455/463/467/471/481;preset :71-75 |
| palette-post | 调色板映射 applyPaletteMap/lerpPaletteMap、HSL shiftHsl/rgbToHsl/hslToRgb、后处理 setPost(vignette/dither/scanline)/renderPost |
palette-post/impl.js:142/210/238/62/90/392/412;dither :435 |
| save-progress | KV 持久化 get/set/remove/clear(命名空间隔离+损坏容错+单条上限) |
save-progress/impl.js:219/243/285/294 |
| runtime-probe | 取证埋点 getRecords/toJSONL/verify(哈希链)— 非玩法能力,e2e 证据用 |
runtime-probe/impl.js:330/335/340 |
A.2 makeEngineCaps() 引擎透传真实粒度(host.js,只此三面)
| 面 | 真实粒度 | 证据锚点 |
|---|---|---|
| particles | spawnEmitter(spec) 薄包装引擎 ParticleEmitter(27 参全映射),像素↔世界阻抗换算 |
host.js:213-273(构造 :243-266) |
| audio.synth | synthSfx(包 zzfxG)/synthSong(包 zzfxM)→ PCM 样本(不播放,×0.3 播放层补) |
host.js:279-316 |
| math | lerp/smoothStep + easing 11 条等价曲线(POWER/BACK/ELASTIC 族),纯函数 |
host.js:204-209 + engine-math.js:56-87 |
引擎本体(LittleJS)远不止这三面(有
drawText/drawTile/tileCollision/相机等),但插件墙内只透出这三面;其余引擎能力不构成 agent 的能力词汇(一职一路,见边界 memory)。
A.3 受控面 6 项(api.d.ts:264-304,引擎可换边界)
getContext2d() / onFrame() / getInput()(归一化输入:pointer 三态+key 两态)/ getAudioContext() / time(受控时钟)/ random(确定性随机)。输入只有 5 类事件(api.d.ts:218),无手势识别(swipe/拖拽需 agent 在生成域自合成 pointer 序列)。
A.4 模板哲学(决定"什么算覆盖")
tech-decisions.md:38 终裁:玩法/美术/关卡/UI = agent 写码生成域;插件=能力 API。故"覆盖判定"口径:该机制所需能力,是否有插件门面或引擎透传面兜底;纯玩法逻辑(回合制、计分、棋盘状态机)是 agent 自写域,不算缺口——除非它需要的底层原语(文本渲染、网格抽象)无门面。
B. 20 款经典轻游戏基准表
覆盖判定:✅ 插件/引擎透传面已覆盖 | 🟡 引擎有底层原语/属生成域但无门面(agent 须自写补层,高频则建议补门面)| ❌ 缺口(无门面且 agent 自写成本高/易错) 难度档:易=单机制+静态/网格 | 中=2-3 机制叠加+实时 | 难=多机制+连续物理/程序化/高频碰撞
| # | 游戏 | 核心机制 | 所需能力清单 | 当前覆盖判定 | 难度 | 一句话生成种子 |
|---|---|---|---|---|---|---|
| 1 | 井字棋 | 3×3 落子棋/胜负判定 | 网格状态、tap、文本"X/O"、胜负 AI | 🟡 网格/文本🟡、输入✅、AI=纯逻辑 | 易 | 3×3 棋盘点击落子 X,AI 落 O,三连判胜 |
| 2 | 2048 | 网格滑动合并/数字 | 4×4 网格、swipe、文本数字、合并逻辑 | 🟡 网格+文本🟡(高频缺口)、swipe=合成、合并=纯逻辑 | 中 | 4×4 数字方块,滑动合并同值,生成新块,显分 |
| 3 | 贪吃蛇 | 网格移动/自增长/自碰撞 | 网格、方向键、自碰撞(网格等值)、计分 | 🟡 网格=agent 自管、输入✅、碰撞=网格逻辑、计分文本🟡 | 易 | 蛇沿网格吃食物变长,撞墙/撞自己结束 |
| 4 | Flappy Bird | 重力跳跃/管道避障/无尽 | 重力(抛体)、tap、AABB 碰撞、程序化管道、计分 | ✅ physics 抛体:104、collision aabbVsAabb:337、输入✅;文本🟡 |
中 | 点击让小鸟上跳,重力下落,穿随机高度管道 |
| 5 | 打砖块 Breakout | 弹球反弹/挡板/砖块网格 | 弹球物理、AABB/圆碰撞、挡板输入、砖块网格、反弹角 | ✅ collision circleVsAabb:295+MTV 反弹、physics 限速;高速球🟡 |
中 | 挡板接弹球击碎砖阵,球随挡板位置改反弹角 |
| 6 | Pong | 双挡板/弹球/简单 AI | 弹球、AABB 碰撞、挡板输入、AI 追球 | ✅ collision/physics/输入✅;AI=纯逻辑 | 易 | 左玩家右 AI 各控挡板,漏球对方得分 |
| 7 | 扫雷 | 网格揭示/数字提示/标记 | 网格、左右键 tap、文本数字、洪水填充 | 🟡 网格+文本🟡、输入✅、洪水填充=纯逻辑 | 中 | 点击揭示显周围雷数,右键标记,踩雷结束 |
| 8 | Simon 记忆 | 序列记忆/颜色按钮/渐进 | 序列状态机、tap、音效反馈、计时 | ✅ audio playSfx:481、gamefeel 计时、输入✅;序列=纯逻辑 |
易 | 四色按钮按序闪烁播音,玩家复现,逐轮加长 |
| 9 | 记忆翻牌 | 翻牌配对/网格 | 网格、tap、翻转动画(easing)、配对逻辑 | ✅ easing:205/输入✅;网格🟡、图案=agent 绘 |
易 | 牌面朝下,翻两张配对,全配对获胜 |
| 10 | 太空侵略者 | 波次敌阵/射击/碰撞 | 敌阵网格移动、射击 tap、子弹 AABB、波次、HUD | ✅ collision AABB+SpatialHash:112、particles 爆炸;文本🟡 |
中 | 炮台左右移动射击,敌阵整体平移下压,清屏过关 |
| 11 | 俄罗斯方块 Tetris | 下落方块/网格堆叠/消行 | 网格(堆叠态)、方向键旋转移动、消行、计时下落、文本 | 🟡 网格堆叠=agent 自管(高频痛点)、输入✅、文本🟡 | 难 | 七种方块下落,旋转堆叠,满行消除,逐级加速 |
| 12 | 小行星 Asteroids | 惯性飞船/任意角度/程序化碎裂 | 惯性物理、旋转射击、多边形碰撞、程序化分裂、环绕 | ✅ collision satVsPolygon:395+RayHit、physics applyFriction:286;高速子弹 CCD❌ |
难 | 飞船惯性漂移射击,大陨石击中裂小块,屏幕环绕 |
| 13 | 消消乐 Match-3 | 网格交换/三连消除/下落填充 | 网格、swipe 交换、三连检测、重力下落、连锁、HUD | 🟡 网格+文本🟡(高频痛点)、swipe=合成、消除=逻辑、easing✅ | 难 | 8×8 宝石网格,交换凑三连消除,上方填充连锁 |
| 14 | 跳跃者 Doodle Jump | 垂直无尽/平台跳/重力 | 重力跳(抛体)、左右倾斜、平台 AABB、程序化平台、相机 | ✅ physics 抛体:104、collision AABB、coyote:319;相机=受控面、文本🟡 |
中 | 持续上跳踩平台,左右移动,平台程序化生成 |
| 15 | 愤怒小鸟(简版) | 抛射弹道/拖拽蓄力/碰撞倒塌 | 抛体弹道、拖拽手势、多体碰撞、弹簧/冲量 | 🟡 physics 抛体✅/弹簧✅、collision MTV✅;拖拽=agent 合成 pointer 链 | 难 | 拖拽弹弓蓄力发射,抛物线击中结构使其倒塌 |
| 16 | 跑酷 Runner | 横向无尽/跳跃滑铲/障碍 | 自动横移、tap/swipe 跳铲、AABB、程序化障碍、加速、HUD | ✅ physics 跳、collision AABB、buffer:232+coyote;swipe=合成、文本🟡 |
中 | 自动向右跑,点击跳跃避障,距离计分,逐渐加速 |
| 17 | 打地鼠 | 随机出现/限时 tap/计分 | 随机定时生成、tap 命中(点 vs 圆)、计时、计分、反馈 | ✅ random✅、collision 点/圆判、particles 命中;文本🟡 | 易 | 地鼠随机洞口冒出,限时点中得分,超时消失 |
| 18 | 见缝插针 | 旋转/时机 tap/碰撞检测 | 旋转角积分、tap 时机、角度/扇区碰撞、渐进 | ✅ math 角度、collision raycastCircle:462、particles;文本🟡 |
中 | 中心圆持续转,点击射针,针不能相撞,逐根加针 |
| 19 | 节奏点击 | 时间窗判定/节奏/连击 | 时间窗(combo)、tap 精度、音效、连击计分、easing | ✅ ComboWindow:390+InputBuffer、audio、easing;文本🟡 |
易 | 音符落判定线时点击,perfect/good 分级,连击加成 |
| 20 | 弹球变体(多球) | 多球/道具掉落/物理反弹 | 多体弹球、圆/AABB 碰撞、道具 AABB、屏震闪白 juice、HUD | ✅ collision 圆+AABB、physics 限速、particles shakeScreen:524/flashScreen:544;高速多球 CCD🟡 |
难 | 挡板接多球击砖,砖落道具(增球/扩板),命中屏震闪白 |
C. 能力覆盖审计(本基准核心价值)
C.1 20 款合计考到的能力维度 × 谁兜
| 能力维度 | 由谁兜 | 覆盖状态 | 涉及款数 |
|---|---|---|---|
| 离散几何碰撞(圆/AABB/多边形 MTV) | collision :268-431 |
✅ | 4,5,6,10,12,15,17,18,20 |
| 射线命中(RayHit) | collision :462/500 |
✅ | 12,18 |
| 空间粗筛(broadphase) | collision SpatialHash:112 |
✅ | 10,20 |
| 抛体/重力 | physics-lite :104 |
✅ | 4,12,14,15,16 |
| 摩擦/限速/惯性 | physics-lite :286/268 |
✅ | 12,16 |
| 弹簧阻尼 | physics-lite :194 |
✅ | 15 |
| 输入缓冲/郊狼/连击窗 | gamefeel :232/319/390 |
✅ | 8,14,16,19 |
| easing 标准库(11 条) | gamefeel/math 门面 :205 |
✅ | 9,11,13,18,19 |
| 粒子/屏震/闪白/命中停顿 | particles-juice :438/504/524/544+引擎透传 |
✅ | 10,12,17,20 |
| 音效/BGM/强度分层 | audio-music :455-481+引擎透传 |
✅ | 8,19,20 |
| 调色/后处理 | palette-post :392/412 |
✅(可选) | 全部可选 |
| 存档/进度 | save-progress :219-294 |
✅ | 高分榜可选 |
| tap/方向键输入 | 受控面 getInput :218 |
✅ | 全部 |
| 确定性随机/程序化 | 受控面 random :35 |
✅ | 4,7,10,11,13,14,16,17 |
| 文本/分数 HUD 渲染 | 无插件门面(引擎 drawText 未透出) | 🟡 缺门面 | 几乎全部 |
| 网格/棋盘状态抽象 | 无 grid/tilemap 门面(agent 生成域自管) | 🟡 缺门面 | 1,2,3,7,9,11,13 |
| 连续碰撞 CCD(swept) | collision 仅离散 MTV(grep swept/ccd 全空) | ❌ 缺口 | 5,12,20(高速小目标) |
| 通用状态机 FSM | 无(gamefeel 仅 3 特化计时器) | 🟡 agent 自写 | 8,11、回合制类 |
| 手势识别(swipe/拖拽) | 无门面(agent 合成 pointer 序列) | 🟡 自合成 | 2,13,15,16 |
| 寻路 A/导航* | 无(grep astar/pathfind 全空) | ❌ 缺口(已规避) | (完整 Pacman 鬼 AI——故未入选) |
C.2 点名"会暴露能力缺口"的款 + 缺口性质
❌ 真缺口(无门面+agent 自写成本高/易错):
-
连续碰撞 CCD(swept) — 暴露款 #5 高速球/#12 子弹/#20 多球。
- 性质:collision 只有离散 MTV/穿透判定(
circleVsAabb:295),无 swept/toi(grepswept|ccd|continuous|toi|tunnel全空;impl.js:21自述能力止于"MTV/穿透/RayHit")。 - 后果:高速小球穿砖/穿墙(tunneling),便宜模型多半产出"球偶尔卡进/穿透"的 bug 件。
- 绕法:agent 用
raycastAabb:500沿速度向量手做 toi(可行但每款重写、易错)→ 高频则补 collision swept 门面。
- 性质:collision 只有离散 MTV/穿透判定(
-
寻路 A/导航网格* — 本基准已主动规避(完整 Pacman 鬼寻路未入选)。
- 性质:grep
astar|pathfind|navmesh全空;SpatialHash只做粗筛非寻路。 - 结论:任何需要敌人智能寻路的品类当前造不出=引擎/插件库明确边界。需要时须新增寻路插件。
- 性质:grep
🟡 半缺口(底层原语存在/属生成域,但无门面→每款重造轮子):
-
文本/分数 HUD 渲染 — 暴露款 几乎全部(2/3/7/10/11/13/16…)。
- 性质:无任何文本渲染门面(grep
drawText|renderText全空);引擎LJS.drawText存在但未经插件透出,makeEngineCaps()三面不含文本(host.js:210-317)。 - 后果:每个游戏的便宜模型都得自己
ctx.getContext2d().fillText手画 HUD——风格各异、字体/对齐易错。 - 最高频缺口:20 款里 ~15 款需文本 → 强烈建议补 text/HUD 门面插件(W-G1 实测后第一优先)。
- 性质:无任何文本渲染门面(grep
-
网格/棋盘状态抽象 — 暴露款 #1/2/3/7/9/11/13。
- 性质:无 grid/tilemap 门面(grep
tilemap|gridMap全空);属 agent 生成域,但坐标↔索引/邻接/遍历/合并每款重写。 - 后果:2048/Tetris/Match-3 网格状态机是核心难度,便宜模型自管易出"合并方向/消行/连锁"bug。
- 建议:W-G1 观察便宜模型自写网格出错率;若高,补 grid 工具门面。
- 性质:无 grid/tilemap 门面(grep
-
手势识别(swipe/拖拽) — 暴露款 #2/13(swipe)/#15(拖拽)/#16。
- 性质:受控面
getInput只给 5 类原始事件(api.d.ts:218),无 swipe/drag 合成。 - 后果:agent 须自缓存 pointerdown→move→up 算方向/距离;愤怒小鸟拖拽蓄力尤其易错。
- 建议:swipe/drag 是触屏轻游戏刚需 → 可补进 gamefeel(已管输入缓冲,自然归属)。
- 性质:受控面
-
通用状态机 FSM — 暴露款 #8 Simon/#11 Tetris 及回合制类。
- 性质:gamefeel 仅 3 个特化计时器,无通用 FSM 原语。
- 后果:多状态玩法自写状态切换易乱;属生成域,优先级低于文本/网格(纯逻辑模型相对擅长)。
C.3 一句话审计结论
20 款里 ~12 款能力面齐备(✅),可立即冒烟;余 8 款集中暴露 4 类短板。最痛的不是"造不出",而是"文本 HUD + 网格状态"两个高频能力没有门面——便宜模型 20 个 prompt 各造一遍轮子,一致性、token、出错率三重受损。真·造不出的硬边界只有两条:连续碰撞 CCD(高速穿透)与寻路(已规避)。
D. 分批/分档执行建议
原则:先用能力面齐备的易档验管线打通(冒烟),再用中/难档+缺口款压测能力上限、量化便宜模型在缺口处的产出质量。
批次 1 · 冒烟批(验管线打通)— 6 款 · 全 ✅ · 难度易
#6 Pong / #8 Simon / #17 打地鼠 / #9 记忆翻牌 / #3 贪吃蛇 / #19 节奏点击
- 理由:能力面 100% 齐备,机制单一。目标=证明"便宜模型+插件库+new-api+harness 门"端到端跑通,产可玩件。
- 验收:管线零阻塞 + ≥4/6 过好玩基线评估门。
批次 2 · 主力批(验常见机制覆盖)— 8 款 · ✅ 为主 · 难度中
#4 Flappy / #5 打砖块 / #10 太空侵略者 / #14 Doodle Jump / #16 跑酷 / #7 扫雷 / #18 见缝插针 / #1 井字棋
- 理由:覆盖物理/碰撞/波次/程序化/网格主流机制,带少量 🟡(文本/网格/swipe)。
- 核心产出:量化文本 HUD/网格/swipe 三个高频 🟡 的便宜模型自写出错率——"是否要补门面"的决策数据。
- 验收:≥6/8 可玩;逐款记录 agent 在 🟡 缺口处的补层方式与 bug。
批次 3 · 压测批(测能力上限+暴露缺口)— 6 款 · 含 ❌/难 🟡 · 难度难
#11 Tetris / #13 Match-3 / #12 Asteroids / #15 愤怒小鸟 / #20 多球弹球 / #2 2048
- 理由:每款压一/多个短板——Tetris/Match-3/2048=网格状态机上限;Asteroids/多球弹球=CCD 缺口;愤怒小鸟=拖拽手势缺口。
- 核心产出:证实 C.2 缺口判定——便宜模型在 CCD/网格/拖拽处的产出质量(穿透 bug?消行 bug?蓄力 bug?),给创始人"引擎短板实测画像"。
- 验收:不强求高通过率(本批测上限);重点产出缺口实证报告→ 喂"是否补 text/grid/swipe/swept 门面"的决策。
跨批观测项(W-G1 真正要回答的问题)
- 便宜模型(M3/M2.7/DS-V4)在三档的产出质量梯度 → 哪档开始崩,定能力天花板。
- 四类短板的实测影响:文本/网格/CCD/拖拽各拖垮多少款 → 排补门面优先级(预判:文本 HUD > 网格 > swipe/拖拽 > CCD swept)。
- harness 门的判定有效性:能否稳定逮住"穿透/消行错/不可玩"——门兜底是便宜模型路线的命门。
风险与假设(诚实标注)
- [verified] 全部覆盖判定基于源码导出(api.d.ts + impl.js return 面 + host.js makeEngineCaps),证据锚点见 A/B/C 各 file:line。缺口判定用"源码证伪法"(grep 关键原语全空+impl.js 自述能力边界),非按预期名臆断(遵 memory 红线
engine-plugin-boundary-model§1.5)。 - [inferred] "便宜模型能产出 ✅ 款的可玩件"是推断非实测——这正是 W-G1 要验的;本基准只确证"能力面齐备",不预断模型产出质量。
- [inferred] 难度档(易/中/难)是按"机制数 × 实时性 × 缺口数"的工程推断,非用户体感难度。
- [assumption] 好玩基线 v2 的具体五要素未在本次检索中定位到原文(
add-game-template.md:7仅言"改挂评估门"),验收门精确判据需在 W-G1 开工前从评估门 spec 取齐。 - [未决] 20 款最终取舍可由创始人按"想优先验证的机制谱系"调整;CCD/寻路两条硬边界是否本期补门面,建议等批次 3 实测数据再拍,不预先投入。