diff --git a/docs/mvp/MVP作战清单.md b/docs/mvp/MVP作战清单.md index 25f825c2..d635ccbb 100644 --- a/docs/mvp/MVP作战清单.md +++ b/docs/mvp/MVP作战清单.md @@ -13,7 +13,7 @@ - [ ] **W-CH 渠道波(抖音+微信小游戏,✅ 范围已定稿)**:判定=[`渠道适配判定 HJ-CH-001`](../agent-specs/2026-06-12-渠道适配判定-小游戏双渠道.md)——小游戏=精选整包 L1 分发面(一壳多游·主题合集口径)/H5=UGC+L2 主场;W-CH-α 对比 spike(双 spec 齐,Codex 16 条全采纳;LayaAir 尽调出局)→**P0 段 ✅ 完成(2026-06-12 ultracode,验证门 6/6 PASS:adapter 21 测绿〔逮修 1 真 bug〕/合规 schema 30 用例/probe 八锚点哈希链/SIZES 实测 C-A 主包 gz 37.5KB=4MB 闸门 0.92%·每模板边际 gz2.9KB vs C-B Cocos 文献 1.94MB/双 RUNBOOK+证据校验器)**;**P1 只待你三件套**;C1-C2 ✅ 已拍(C1=自研流即时发布+双渠道精选发行/C2=合规为准绳,详归档⑫) - [ ] **W-G0 生成工厂契约波(▶ 现行,α 主门已过)**:第 9 契约组——把参考件实证形状升格为正式契约(取证导出 __refForensics/__refChecklist/__refHost+evidence 四件套+LOOP 协议)+黄金评估集 v0(首件=暖阳小卖部)+9g 预算分档字段;**agentic 基建 ✅ 终裁(2026-06-12):全平台单一框架化基建=AgentScope 2.x 主力**(评审版 HJ-AGI-001;五资产契约边界+L1 裸通路定案;换轨触发写死,W-G1 即 spike 门,验不过切 LangGraph 开源核心);**附带**:TPL 产品命名选项给创始人(产品文档 A/C「玩法模板」是否改名,属产品改名非清毒) - [ ] **W-G1 模型竞标 bake-off(创始人 2026-06-12 裁定:Fable 只造引擎,生产生成=便宜模型)**:同 brief 同 harness,M2.7/M3/DS-V4-Pro/Flash 比 过门率/重试数/¥每过门款,对照 ¥0.15 L1 门;品类=现有 8 插件可承载(经营/回合 RPG/弹幕/氛围);**20 游戏能力矩阵=覆盖目标与插件缺口定义**(矩阵入 W-G1 spec);**spec 增列 agent-loop-v1 处置**(冻结只修 P0/资产〔judge 决策表·ledger 幂等·预算闸〕契约化迁 AgentScope/退役时点——审计②#2);⚠️ 前置=你侧 DS key 激活 -- [ ] **T1b-β(双 spec ✅ 冻结开工,Phase 0 首步)**:评审版两轮过+裁决②扩裁(`2026-06-12-...review.md`),**执行版 HJ-T1B-B-EXEC-001(`2026-06-13-...execution.md`)经 R3 对抗复审逮 5P0(初稿§7预烤『引擎有X→包装』未核真签名=同NIH病)全整改→R4 二轮复审『可冻结』(1P1+3P2补净)→✅冻结**;待确认 A 默认采纳=Runner URL 降级 DB-manifest 带版本(不接 OSS,可逆,创始人可后切);**Phase 0 ✅ 完成(`204eaed`):littlejsengine@1.18.19 装入+ENGINE-CAPABILITIES.md 50+ 能力真签名+§7 验签填定——§1.5 延迟裁定获验证(4 条初判『包装』翻『缺件补层』:collision MTV/RayHit·palette postProcess·physics 抛体;collision 整件/palette postProcess/physics 核心实为引擎缺件,自研合规但归因改逐函数验签)**;**Phase A 解锁**(地基 A0=engineInit 五回调接管),P2 三契约冻结待据签名定。范围:①**裁决①+②落地(Q4 剃刀:自研=引擎外的层)**:〔裁决①〕粒子/物理/后处理三件改引擎能力包装层+〔**裁决② 2026-06-13 Opus 复查〕audio-music(re-vendor ZzFX/ZzFXM→改调引擎 Sound)+受控面 random/time(为取证砌墙→透传引擎 RandomGenerator/time)+juice hitStop·屏震(→引擎 timeScale/engineAddPlugin)+collision·gamefeel·physics-lite 逐函数三分(引擎有→包装/引擎无→缺件补层,废"维持自研"一刀切)**;**前置 P0=littlejsengine 真装入 game-runtime(现 0 字节)**+P1 引擎能力索引+P2 三契约冻结;R6 真接线门三件套(metafile+运行时调用 ID+负向扫);SIZES 重锚;render.js 切引擎 draw API;②Runner v2(防 demo 兜底假阳性);③1.x 退役(srcdoc→URL 四项兼容矩阵+CDP 走查门);④参考件经后端发布主链入 feed(解封③⑤);⑤P7/P8 固定清单(无命中默认 v2)+SDK storage 根契约收敛三套形状+probe 时钟拆分+outcome 注记(Q3 默认采纳);⑥R6 补录三件(weapp-adapter 仅 why-not 归 W-CH)+R3 血统回填五条 +- [ ] **T1b-β(双 spec ✅ 冻结开工,Phase 0 首步)**:评审版两轮过+裁决②扩裁(`2026-06-12-...review.md`),**执行版 HJ-T1B-B-EXEC-001(`2026-06-13-...execution.md`)经 R3 对抗复审逮 5P0(初稿§7预烤『引擎有X→包装』未核真签名=同NIH病)全整改→R4 二轮复审『可冻结』(1P1+3P2补净)→✅冻结**;待确认 A 默认采纳=Runner URL 降级 DB-manifest 带版本(不接 OSS,可逆,创始人可后切);**Phase 0 ✅ 完成(`204eaed`):littlejsengine@1.18.19 装入+ENGINE-CAPABILITIES.md 50+ 能力真签名+§7 验签填定——§1.5 延迟裁定获验证(4 条初判『包装』翻『缺件补层』:collision MTV/RayHit·palette postProcess·physics 抛体;collision 整件/palette postProcess/physics 核心实为引擎缺件,自研合规但归因改逐函数验签)**;**Phase A 解锁**(地基 A0=engineInit 五回调接管);**P2 三契约 ✅冻结**(`28a57b8`+`75243fe`:受控面 getEngine 透传/packageUrl 复用/StoragePlugin 上提);**A0 引擎掌帧接管 ✅码落+本机门全绿(`11c8eaf`)**:8-agent workflow(源码取证→设计→对抗复审→实现)3/3 concerns·0 fatal·17 mustFix(P0×1/P1×9/P2×7)全采纳(P0=real像素门 overshoot→stub通道独占逐像素;P1源码级纠偏 debug水印/clearColor alpha=0/P75取timeReal),主会话亲验 155单测绿/受控面零改/Q4 import边界(仅host.js+entry.js)/真接线门①(littlejsengine 真入产物 163691B·box2d惰性);**A0 ✅完成线达成**:门0 **G0-1~G0-8 全过**(mini-desktop 实测 `11c8eaf` gate0_rc=0,`game-runtime/evidence/gate0/`)——引擎真掌帧(frame Δ30/500ms∈[20,45])·真渲2D mainContext(粒子 coloredHits=7·水印 whiteTextHits=0)·双时钟隔离·受控面零改回归 uncaught=[]·回滚桩活(noEngine=true);**A1-A6 可在此地基接线**。范围:①**裁决①+②落地(Q4 剃刀:自研=引擎外的层)**:〔裁决①〕粒子/物理/后处理三件改引擎能力包装层+〔**裁决② 2026-06-13 Opus 复查〕audio-music(re-vendor ZzFX/ZzFXM→改调引擎 Sound)+受控面 random/time(为取证砌墙→透传引擎 RandomGenerator/time)+juice hitStop·屏震(→引擎 timeScale/engineAddPlugin)+collision·gamefeel·physics-lite 逐函数三分(引擎有→包装/引擎无→缺件补层,废"维持自研"一刀切)**;**前置 P0=littlejsengine 真装入 game-runtime(现 0 字节)**+P1 引擎能力索引+P2 三契约冻结;R6 真接线门三件套(metafile+运行时调用 ID+负向扫);SIZES 重锚;render.js 切引擎 draw API;②Runner v2(防 demo 兜底假阳性);③1.x 退役(srcdoc→URL 四项兼容矩阵+CDP 走查门);④参考件经后端发布主链入 feed(解封③⑤);⑤P7/P8 固定清单(无命中默认 v2)+SDK storage 根契约收敛三套形状+probe 时钟拆分+outcome 注记(Q3 默认采纳);⑥R6 补录三件(weapp-adapter 仅 why-not 归 W-CH)+R3 血统回填五条 - [ ] **插件库扩展波 v2(缺口由 20 游戏矩阵定义,Fable 设计协议+Opus 实现 lane)**:候选四件=平台角色控制器/瓦片关卡与房间系统/2D 光照视野/行为体与程序生成工具箱——补齐后矩阵覆盖 ~19/20(Q1K3 类 3D 出 Tier1 圈归 Tier2) - [ ] **studio 链路③⑤ UI 走查闭合(⛔ 重锚至 β 后)**:5 bug 中 OG 修已落(`1921f85`),余 3 件+真走查全需 feed 有内容——W-CLEAN 后池空(2026-06-12 实测),等 T1b-β 参考件发布入池;cover 无源=生成特性归 W-G1;authorName 扩 API 可先写码但 e2e 同等内容 - [ ] **feed 翻页桩**(触发线已失效:池 50→0,W-CLEAN 清空;降为 β 内容回灌后再评,不再"必修") diff --git a/game-runtime/.agent b/game-runtime/.agent index 7b8b98b4..87edfa45 100644 --- a/game-runtime/.agent +++ b/game-runtime/.agent @@ -19,5 +19,6 @@ - **裁决①(2026-06-12 创始人拍)**:粒子/物理/后处理三件须改**引擎能力包装层**(包 littlejsengine 内建而非裸 Canvas2D 平行重造);β 设真接线门(bundle grep 实证含 littlejsengine)+受控面开包装透传通道+SIZES 按「引擎+包装层」重锚。collision/gamefeel 确为引擎缺件,维持自研。 - T1b-α ✅ 主门过(创始人亲玩 PASS);收口报告=`docs/agent-specs/2026-06-12-T1b-α收口报告.md`。 +- **A0 地基 ✅(`11c8eaf`,门0 8/8 mini-desktop 实测)**:host-dev 真接 littlejsengine——`engineInit` 五回调掌帧(引擎内部 RAF 真推帧)+ `setGLEnable(false)` 纯 2D 渲进 mainContext;受控面 6 项零改(引擎可换边界守住,引擎 import 仅 host.js/entry.js);回滚桩 `?engine=stub` 活(α 等价)。门0 driver=`test/harness/gate0-engine-takeover.cjs`,证据=`evidence/gate0/`,编辑计划=`docs/agent-specs/2026-06-13-A0-引擎掌帧接管-edit-plan.md`。A1-A6 在此地基接线。 - TODO 归 T1b-β(双 spec 先行):裁决①落地 / Runner v2 产品化 / 1.x 退役 / 参考件入 feed / P7-P8 决策。 - 插件协议升格正式契约 = W-G0 第 9 契约组(契约权威在 `contracts/`,此处为实现)。 diff --git a/game-runtime/evidence/gate0/RESULT.md b/game-runtime/evidence/gate0/RESULT.md new file mode 100644 index 00000000..619ba29e --- /dev/null +++ b/game-runtime/evidence/gate0/RESULT.md @@ -0,0 +1,35 @@ +# A0 引擎掌帧接管 — 门0 实测结果(mini-desktop) + +> **运行**:2026-06-13 mini-desktop(`minione-ubuntu-desktop`),scratch 检出 `dev/2.0.0 @ 11c8eaf`, +> 构建 `host-dev/entry.js → host-bundle.js`(engine 真入包,`littlejsengine@1.18.19`), +> `systemd-run` static-serve(:4321,根=host-dev/)+ chrome `--headless=new`(:9222,`--autoplay-policy=no-user-gesture-required`), +> driver=`test/harness/gate0-engine-takeover.cjs`(G0-1~G0-7)+ stub 通道独立核对(G0-8)。机读详情见同目录 `gate0.json`。 + +## 判定:门0 全过(G0-1~G0-8 共 8 门,8 PASS · `gate0_rc=0` · `g08_rc=0`) + +| 门 | 断言 | 实测 | 判 | +|---|---|---|---| +| G0-1 | real 通道引擎真起(非桩) | bootedReal=true · gameInit=true · hasEngine=true · engErr=null | ✅ | +| G0-2 | 引擎内部 RAF 真掌帧(帧单调推进) | frame **42→72/500ms=Δ30** ∈[20,45](排单步假推进/失控空转) | ✅ | +| G0-3 | time≈frame/60 一致性自检 | Δ0.0167s<0.05(**仅自检,非掌帧证据**) | ✅ | +| G0-4 | timeReal 纯墙钟推进(P75 钟可用) | Δ**0.5001s≈500ms** 墙钟 | ✅ | +| G0-5 | 双时钟物理隔离 | 引擎 time(LJS.time) vs probe 6 锚(mockNowMs)不同源不联动 | ✅ | +| G0-6 | 受控面零改回归(smoke) | initOk · verifyOk · **uncaught=[]** · 6 锚齐(AudioContext 告警非 error 级) | ✅ | +| G0-7 | 渲染落 2D mainContext(#game-engine) | 780×1688 · **coloredHits=7**(粒子真渲)· **whiteTextHits=0**(水印已除) | ✅ | +| G0-8 | 回滚桩活(stub 通道) | initOk · verifyOk · uncaught=[] · **noEngine=true** · hasHostdev=true | ✅ | + +## 配套本机门(6c6g,主会话亲验,见 commit `11c8eaf`) +- **155 单测绿**(受控面/插件零改,基线持平) +- **受控面零改**:`src/core/api.d.ts`+`plugin.js` 零 diff(引擎可换边界守住) +- **Q4 边界**:引擎 import 仅 `host.js`+`entry.js`(metafile importers 反查证,未泄进受控面/插件) +- **真接线门①**:`littlejsengine` 真入产物 **163691 bytesInOutput**,box2d 惰性(0 wasm input) + +## 关键纠偏(8-agent workflow 对抗复审逮,经实测兑现) +- **debugWatermark**:dev 构建默认 true,每帧把非确定 averageFPS 画进 mainContext 右上角 → `setDebugWatermark(false)` → G0-7 whiteTextHits=0 实证已除。 +- **canvasClearColor**:引擎默认 CLEAR_BLACK **alpha=0**(透明,不铺底)→ `setCanvasClearColor(BLACK)` → 不透明黑底。 +- **real 像素门 overshoot**(P0):引擎一 RAF 内追帧跑 N 次 gameUpdate(N 受墙钟抖动),异步采样落帧不确定 → 逐像素确定性由 **stub 通道独占**(G0-8 兜),real 通道只证掌帧+渲染落 2D(G0-2/G0-7)。 +- **P75 埋点钟**:real 模式 host mockNowMs 退化为逻辑帧钟 → P75 候选钟改读引擎 `timeReal`(G0-4 已验纯墙钟可用)。 + +## 结论 +**A0「引擎掌帧接管」= 地基立住**:LittleJS 引擎真正成为 host-dev 运行时(`engineInit` 五回调掌帧 + 真渲 2D mainContext), +受控面契约零改(引擎可换边界守住),回滚桩活(`?engine=stub` α 等价)。**A1-A6 可在此地基上接线**。 diff --git a/game-runtime/evidence/gate0/gate0.json b/game-runtime/evidence/gate0/gate0.json new file mode 100644 index 00000000..b123d891 --- /dev/null +++ b/game-runtime/evidence/gate0/gate0.json @@ -0,0 +1,23 @@ +{ + "meta": { + "ts": "2026-06-13T06:45:21.556Z", + "base": "http://localhost:4321", + "seed": 305441741, + "engineMode": "real", + "host": "minione-ubuntu-desktop", + "sha": "11c8eaf", + "engine": "littlejsengine@1.18.19", + "note": "A0 引擎掌帧接管门0;driver=test/harness/gate0-engine-takeover.cjs(G0-1~G0-7)+stub通道独立核对(G0-8)" + }, + "gates": { + "G0-1": { "pass": true, "detail": { "bootedReal": true, "gameInit": true, "hasEngine": true, "hasHostdev": true, "engErr": null } }, + "G0-2": { "pass": true, "detail": { "s0": { "frame": 42, "time": 0.6833333333333333, "timeReal": 0.6831680000000001 }, "s1": { "frame": 72, "time": 1.1833333333333333, "timeReal": 1.1832679999999998 }, "dFrame": 30, "expectRange": [20, 45] } }, + "G0-3": { "pass": true, "detail": { "time": 1.1833333333333333, "frame": 72, "delta": 0.016666666666666607, "note": "consistency-self-check-only" } }, + "G0-4": { "pass": true, "detail": { "t0": 0.6831680000000001, "t1": 1.1832679999999998, "dTimeReal": 0.5000999999999997 } }, + "G0-5": { "pass": true, "detail": { "engineTimeFromLJS": 1.1833333333333333, "probeAnchors": ["t_boot", "t_plugins_ready", "t_game_init", "t_first_paint", "t_input_bound", "t_game_start"], "note": "engine time≠probe tMono(mockNowMs), 物理隔离" } }, + "G0-6": { "pass": true, "detail": { "initOk": true, "verifyOk": true, "uncaught": [], "anchors": ["t_boot", "t_plugins_ready", "t_game_init", "t_first_paint", "t_input_bound", "t_game_start"] } }, + "G0-7": { "pass": true, "detail": { "width": 780, "height": 1688, "coloredHits": 7, "whiteTextHits": 0, "note": "粒子真渲进 2D mainContext;whiteTextHits=0 证 debugWatermark 已除" } }, + "G0-8": { "pass": true, "detail": { "initOk": true, "verifyOk": true, "uncaught": [], "noEngine": true, "hasHostdev": true, "note": "stub 通道:回滚桩活,无引擎接管,受控面工作,零未捕获" } } + }, + "verdict": "GATE0 PASS (8/8)" +}