mini-desktop(minione-ubuntu-desktop)scratch 检出 11c8eaf,host-dev/entry.js 经 esbuild 锁参打 host-bundle.js(littlejsengine@1.18.19 真入包),systemd-run static-serve(:4321,根=host-dev/)+chrome --headless=new(:9222,autoplay 放行), driver=test/harness/gate0-engine-takeover.cjs+stub 通道独立核对。 门0 G0-1~G0-8 共 8 门全过(gate0_rc=0/g08_rc=0): - G0-1 引擎真起(非桩):bootedReal/gameInit/hasEngine 皆 true - G0-2 引擎内部 RAF 真掌帧:frame 42→72/500ms=Δ30∈[20,45](排单步假推进/失控空转) - G0-3 time≈frame/60 一致性自检 Δ0.0167s(仅自检非掌帧证据) - G0-4 timeReal 纯墙钟 Δ0.5001s≈500ms(P75 钟可用) - G0-5 双时钟物理隔离(引擎 LJS.time vs probe mockNowMs 不同源) - G0-6 受控面零改回归:initOk/verifyOk/uncaught=[](AudioContext 告警非 error) - G0-7 渲染落 2D mainContext(#game-engine):780×1688·coloredHits=7(粒子真渲)·whiteTextHits=0(水印已除) - G0-8 回滚桩活(stub):initOk/verifyOk/uncaught=[]/noEngine=true 对抗复审纠偏经实测兑现:setDebugWatermark(false)→whiteTextHits=0; setCanvasClearColor(BLACK)→不透明黑底;real 像素门 overshoot→stub 通道独占逐像素。 A0=地基立住:LittleJS 引擎真成为 host-dev 运行时,受控面契约零改(引擎可换边界守住), 回滚桩活。A1-A6 在此地基接线。证据=game-runtime/evidence/gate0/。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
3.0 KiB
3.0 KiB
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-runstatic-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 可在此地基上接线。