zizi d4f16aabff feat(wg1-groupc): 九门 harness 加首局体验门(品类化·additive 派生超集)——3 断言三款真玩全绿+skill 类首反馈 A/B 真判
组C 严谨首反馈:A/B 无输入对照,skill 类升级真判(超上一档诚实化 SKIP):
- 上一档(P1-1)把动画自走类(skill/action,如 breakout)首反馈标 SKIP,因「帧哈希 changed」对动球
  是重言式(球每帧本就在动)非输入因果。本档落地 A/B 无输入对照,把 SKIP 升级为真判——
  动画自走类的输入因果靠「有输入 vs 无输入的差异」鉴别,而非裸帧变。
- 复用 G 门 A/B 范式:三趟 fresh 实例同 seed(缺省 0x1234abcd)+LittleJS 固定步推进到【同一绝对帧】比对:
  A=无输入自走基线 / Ap=无输入纯净探针 / B=派一招首招。real 引擎自由运行(host 不掌 RAF/无法暂停回退),
  三趟落帧有 ≤数帧抖动→动球自走位置略差,故【不】用裸帧哈希等值(过严必假 SKIP),分阶梯判:
    [0] 控制体维度(input-controllable,最干净免动球抖动):spec.controlCheck.paddlePath(如 breakout
        paddle.x)——A 趟控制体停默认位、B 趟点远端边连派 tapsPerTarget 拍被移开;|ctrlB-ctrlA|>moveMin
        =真输入因果 true。这是 prompt「只比 input-controllable 维度」之意。
    [1] 否则 state 级因果(remaining/score/moves/phase A vs B 变)=次强信号,直接 true;
    [2] 否则像素信号/噪声(noise=diff(A,Ap)基线抖动地板,signal=diff(A,B));signal 显著超 noise→true(兜底);
    [3] noise 超顶=非确定性(unseeded random/wall-clock)→不可净判 SKIP(血统债,不假判);
    [4] signal≈noise 且无控制体维度→SKIP(动球抖动可能盖过信号,不假 FAIL)。
- 必须串行跑三趟:headless Chrome 对后台 target rAF 节流/冻结,并发开三个只前台跑(实测 A/Ap frame=-1、
  B=2484 全程跑完=对照失效);串行下每趟=当前唯一活动 target 满速,确定性保同绝对帧自走态可比。
- 纪律:路A 零改契约/prompt/play-spec,只动 play.cdp.cjs(additive,advanceToFrame 加 pollMs 缺省 100 向后兼容,
  G 门逐字不变);静态盘类(placement/avoidance)走原单趟口径不动;首局门 FAIL 不阻断九门;warm-only 标注保留。
- 重验(mini-desktop Chrome/CDP):breakout 首反馈 假 SKIP→真判 (控制体 paddle.x delta=145,A=195/B=50,
  control-body-moved,净判=true);tictactoe/saolei 首反馈仍真(单趟 state变=true);三款九门零回归
  (逐门 base==verify,均 A-I 全 true,base 跑于 pristine ee1b697e);firstPlay.pass 全 true。
- 诚实:breakout A/B 净判靠控制体维度(paddle.x),非裸全帧像素——实测裸全帧 noise≈signal(球每帧动+两趟落帧
  抖动污染),故有控制体路径优先取该维度免污染;无控制体路径的 skill 类退信号/噪声兜底,signal≈noise 即诚实 SKIP。

P2-1 warm-only 局限标注保留:playableMs=预热后 warm 稳态,不覆盖 bundle 首加载退化;warmupMs 记冷启;
真机 first-load 阈值校准留 staging。本门 v0 守得住卡死/装载失败退化,守不住大 bundle/慢首加载退化。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 22:38:33 +08:00
..

game-runtime —— LittleJS 增强发行版(插件协议地基)

协议版本:core-protocol-v0(见 src/core/plugin.js 导出的 CORE_PROTOCOL_VERSION)。 ownerT1b-α lane-coreGate0 奠基)。配对 specdocs/agent-specs/2026-06-12-T1b-α插件库与参考件-execution.mdv1.1/ …W-T1b-Runner与双层模板-review.mdv2.1)。

平台维护一套「LittleJS 增强发行版」:每个插件 = 一项引擎能力(碰撞/粒子/物理/手感/调色/音频…),即插即用、可组合、版本化。 插件不含玩法、不含美术成品、不含关卡、不含 UI —— 这四者是 agent 造游戏时的生成域。 本仓只提供「能力编排 + 受控引擎句柄」,绝不内置任何玩法假设。


协议版本声明

当前协议版本 v02026-06-12 冻结,含 Gate0.1 受控面补丁)
标识来源 src/core/plugin.jsexport const CORE_PROTOCOL_VERSION = 'core-protocol-v0'schema/plugin-manifest.schema.json$id .../v0
冻结状态 Gate0 评审通过即冻结。Gate0.1 补丁(受控面由 4 扩 6+getInput/+getAudioContextrandom 改 per-plugin 派生流useContext 守卫)为向后兼容增量,随 v0 一并冻结,不 bump 版本号
升级规则 受控面只增不破坏既有 API破坏性变更须 bump 版本v0→v1并在本表登记

扩展受控面 / 改 manifest 字段 = 改协议,必须走 Gate0 后的扩展申请,不得 lane 私自加。 受控面 v0 最终成员冻结口径6 项)getContext2d / onFrame / getInput / getAudioContext / time / random


目录结构

game-runtime/
├── README.md                      # 本文件:目录 + 证据约定 + 协议版本声明位
├── src/
│   ├── core/                      # 协议核心core-protocol-v0已冻结对象
│   │   ├── plugin.js              #   Plugin 接口 / PluginRegistry 生命周期 / PluginContext 受控面(6 项) + host-dev 桩(含输入桥)
│   │   ├── api.d.ts               #   手写类型门面lane 读契约的一等入口,与 plugin.js JSDoc 同步)
│   │   └── plugin.test.mjs        #   核心零依赖单测31 测node --test
│   └── plugins/
│       └── _example/              # 空插件样例(五件全,可直接克隆为新插件)
│           ├── impl.js            #   ESM 实现(演示受控面用法,无玩法语义)
│           ├── api.d.ts           #   该插件类型门面
│           ├── manifest.json      #   插件机器契约(过 schema 校验)
│           ├── PLUGIN.md          #   给 agent 读的能力文档PLUGIN-TEMPLATE 活样板)
│           └── test/example.test.mjs  # 该插件零依赖单测7 测)
├── schema/
│   └── plugin-manifest.schema.json  # manifest.json 契约additionalProperties:false
├── docs/
│   └── PLUGIN-TEMPLATE.md          # PLUGIN.md 规格模板(六节固定骨架)
├── scripts/
│   ├── build.mjs                  # esbuild 锁参打包bundle+min+iife+es2019——⚠ 仅集成段跑
│   ├── size.mjs                   # 增量法字节测量zlib gz level9→ SIZES.md ——⚠️ 打包部分仅集成段
│   ├── validate-manifest.mjs      # 零依赖 manifest schema 校验(本机可跑)
│   └── test.sh                    # 遍历 core+全插件 node --test本机可跑
└── test/
    └── harness/
        └── browser-evidence.cjs   # 浏览器视觉证据 harness纯计算口径已实现 + CDP 占位,⚠️ 真跑仅集成段)

下列目录在对应阶段产生,本阶段尚未创建:src/plugins/<P1..P10>/(各 lane 插件)、games/(参考件)、host-dev/(本地挂载页)、dist/(集成段构建产物)、evidence/(集成段/参考件证据)、SIZES.md(集成段 size.mjs 产出)。


源码形态与运行纪律

  • 源码形态:发行版 = ESM JS + JSDoc 类型注释,公开能力面 = 手写 api.d.ts零工具链——lane 阶段 node --test 本地直跑,本机零 npm 依赖、不跑 git。
  • 本机可跑lane 阶段):
    • bash scripts/test.sh —— 跑 core + 全插件单测;
    • node scripts/validate-manifest.mjs —— 校验全部 manifest.json 合 schema
    • node scripts/size.mjs --selftest —— gz 量算口径自检。
  • 仅集成段mini-desktop(需 esbuild / 真 Chrome
    • node scripts/build.mjs <in> <out> —— 锁参打包;
    • node scripts/size.mjs —— 增量法实测 → SIZES.md
    • test/harness/browser-evidence.cjs 的 CDP 真跑(连 Chrome 抓 ImageData/截图。本机6c6g禁启 headless ChromeOOM 红线)。

证据与目录约定(沿 T1 结构)

阶段 证据落点 内容
每 lane <lane>/REPORT.md 实现说明 + 边界 + 红线声明
每 lane <lane>/test/RESULT.txt node --test 原始输出
每插件 <plugin>/PLUGIN.md 给 agent 读的能力文档(六节,见 docs/PLUGIN-TEMPLATE.md
集成段 SIZES.md + evidence/integration/ 构建日志 / 浏览器证据哈希 + 截图
参考件 evidence/round-N/ + LOOP-LOG.md + sha256-manifest.txt 四件套(输入轨迹/截图+canvas 哈希/probe JSONL/checklist+ serve 日志
  • 截图路径约定evidence/<bucket>/<name>.png(集成段 bucket=integration,参考件 bucket=round-N),由 browser-evidence.cjsscreenshotPath() 统一给出。
  • 哈希族:全发行版证据用 FNV-1a 32-bitImageData 哈希与 P10 RuntimeProbe 哈希链同口径)。
  • 字节预算:每插件 manifest.jsongzBudgetBytes,集成段 size.mjs 增量法实测对照;单件超配额→评审,合计>60K→创始人放行执行版 §5

给 lane 开工者的最短路径

  1. src/core/api.d.ts(协议类型契约,一等入口)+ src/core/plugin.js(实现与受控面注释)。
  2. 复制 src/plugins/_example/ 整目录 → 改名为你的插件 → 按 docs/PLUGIN-TEMPLATE.md 六节改写 PLUGIN.md → 改 manifest.jsonnode scripts/validate-manifest.mjs 必须过)。
  3. 实现 impl.js:只经 PluginContext 4 项受控面拿引擎能力,绝不直透 littlejsengine 裸对象
  4. test/*.test.mjs:零依赖 node:test,经 createHostDevContext 拿受控面 + tick 驱动帧vfx/audio 的渲染/发声证据留集成段 harness
  5. bash scripts/test.sh 全绿后,产 REPORT.md + test/RESULT.txt