zizi 99b6c82dec feat(runner-v2): P1 王蓝莓上引擎=游戏宿主装载契约 spike 实(mini-desktop real 引擎 5 门全过)
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>
2026-06-13 18:32:50 +00:00

358 lines
7.5 KiB
JSON

{
"meta": {
"url": "http://127.0.0.1:4320/?engine=real&seed=305441741",
"seed": 305441741,
"startedAt": "2026-06-13T17:53:05.383Z",
"harness": "e2e-input.cdp.cjs(主会话)",
"engineMode": "real",
"coordMap": {
"rect": {
"l": 0,
"t": 0,
"w": 390,
"h": 844,
"vw": 390,
"vh": 844
},
"map": {
"l": 0,
"t": 0,
"sx": 1,
"sy": 1
},
"canvas": "#game-engine"
},
"endedAt": "2026-06-13T17:54:49.277Z"
},
"gates": {
"engineFrameDrive": {
"dFrame": 31,
"range": [
20,
45
],
"s0": {
"frame": 41,
"time": 0.6666666666666666,
"timeReal": 0.7665380000000002,
"paused": false,
"timeScale": 1
},
"s1": {
"frame": 72,
"time": 1.1833333333333333,
"timeReal": 1.2832379999999994,
"paused": false,
"timeScale": 1
}
},
"engineWiringCallId": {
"hasSpawn": true,
"sample": [
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"particles.spawnEmitter",
"audio.synth.synthSfx",
"particles.spawnEmitter",
"audio.synth.synthSfx",
"particles.spawnEmitter",
"audio.synth.synthSfx",
"particles.spawnEmitter",
"audio.synth.synthSfx",
"particles.spawnEmitter",
"audio.synth.synthSfx"
]
},
"sameScreenPixels": {
"nonEmpty": true,
"width": 780,
"height": 1688,
"warmHits": 682,
"brightHits": 13028,
"maxCh": 254
},
"closedLoopRealInput": true,
"engineTakeover": true
},
"failures": [],
"zonesSeenByPhase": {
"real-prep-day1": [
"dec-soda",
"inc-soda",
"dec-snack",
"inc-snack",
"dec-bread",
"inc-bread",
"price-slider",
"up-speed1",
"up-shelf1",
"up-unlock_ice",
"up-decor1",
"up-unlock_toy",
"up-speed2",
"up-shelf2",
"up-decor2",
"openShop"
],
"real-day2-prep": [
"dec-soda",
"inc-soda",
"dec-snack",
"inc-snack",
"dec-bread",
"inc-bread",
"price-slider",
"up-speed1",
"up-shelf1",
"up-unlock_ice",
"up-decor1",
"up-unlock_toy",
"up-speed2",
"up-shelf2",
"up-decor2",
"openShop"
]
},
"stateSnapshots": [
{
"tag": "real-menu",
"state": {
"phase": "title",
"day": 1,
"cash": 1200,
"reputation": 62,
"priceMul": 1,
"stock": {},
"unlocked": [
"soda",
"snack",
"bread"
],
"upgrades": {},
"customers": 0,
"combo": 0,
"today": {
"revenueJiao": 0,
"soldCostJiao": 0,
"served": 0,
"angry": 0,
"stockout": 0,
"walkaway": 0,
"rescued": 0,
"bigSales": 0,
"maxCombo": 0
},
"lifetime": {
"days": 0,
"served": 0,
"angry": 0,
"netJiao": 0,
"upgradesBought": 0
},
"gameoverReason": null
}
},
{
"tag": "real-after-stock-day1",
"state": {
"phase": "prep",
"day": 1,
"cash": 840,
"reputation": 62,
"priceMul": 1,
"stock": {
"soda": 6,
"snack": 6,
"bread": 6
},
"unlocked": [
"soda",
"snack",
"bread"
],
"upgrades": {},
"customers": 0,
"combo": 0,
"today": {
"revenueJiao": 0,
"soldCostJiao": 0,
"served": 0,
"angry": 0,
"stockout": 0,
"walkaway": 0,
"rescued": 0,
"bigSales": 0,
"maxCombo": 0
},
"lifetime": {
"days": 0,
"served": 0,
"angry": 0,
"netJiao": 0,
"upgradesBought": 0
},
"gameoverReason": null
}
},
{
"tag": "real-after-serving-day1",
"state": {
"phase": "settle",
"day": 1,
"cash": 1239,
"reputation": 41.8,
"priceMul": 1,
"stock": {
"soda": 0,
"snack": 0,
"bread": 0
},
"unlocked": [
"soda",
"snack",
"bread"
],
"upgrades": {},
"customers": 0,
"combo": 0,
"today": {
"revenueJiao": 799,
"soldCostJiao": 360,
"served": 18,
"angry": 0,
"stockout": 13,
"walkaway": 0,
"rescued": 0,
"bigSales": 0,
"maxCombo": 9
},
"lifetime": {
"days": 1,
"served": 18,
"angry": 0,
"netJiao": 39,
"upgradesBought": 0
},
"gameoverReason": null
}
}
],
"hashes": {},
"screenshots": [
"real-menu.png",
"real-prep-day1.png",
"real-sameScreen.png",
"real-settle-day1.png",
"real-day2-upgraded.png"
],
"boot": {
"anchors": [
"t_boot",
"t_plugins_ready",
"t_game_init",
"t_first_paint",
"t_input_bound",
"t_game_start"
],
"initOk": true,
"registeredPlugins": [
"collision",
"physics-lite",
"gamefeel",
"particles-juice",
"palette-post",
"save-progress",
"audio-music",
"runtime-probe"
]
},
"checklist": {
"shougan": {
"tapFeedbackMaxFrames": 0,
"tapFeedbackWithin3": true,
"everyTapScalePulse": true,
"comboUiShown": false,
"flightEasingUsed": true,
"hitStopTriggered": false,
"bufferedServeReplays": 0
},
"meishu": {
"allDrawsViaPalette": true,
"vignetteEnabled": true,
"rushPaletteSeen": false,
"assetsLoaded": "13/13",
"noPrimaryPlaceholderRects": true
},
"yinyue": {
"audioUnlocked": false,
"bgmReady": false,
"bgmCrossfadeSeen": false,
"sfxKindCount": 0,
"sfxKinds": []
},
"shendu": {
"loopReachable": true,
"loopOps": 25,
"failureReachable": true,
"failureReason": "reputation",
"priceTwoSidedLoss": true,
"upgradeTreeSize": 8,
"firstUpgradeDay": 2
},
"juese": {
"keeperSpriteResident": true,
"lineGroups": 14,
"lineTotal": 30,
"linesShownLive": 0
}
},
"measures": {
"particle": {
"gold": 0,
"cream": 0,
"smoke": 0
},
"audio": {
"sfxKinds": [
"tick",
"shelve",
"arrive",
"coin",
"empty",
"upgrade"
],
"bgm": {
"ready": true,
"failed": false,
"idleLevel": 0.23916264021400713,
"rushLevel": 5.689900643400063e-12
}
},
"assetsMissing": [],
"frames": 6152,
"taps": 517,
"tapFeedbackMaxFrames": 1,
"comboUiShown": 1,
"hitStopCount": 0,
"rushPaletteSeen": true,
"bgmCrossfadeSeen": true,
"linesShown": 20,
"bufferedServeReplays": 0
},
"softLive": {
"rushPaletteSeen": true,
"bgmCrossfadeSeen": true,
"sfxKindCount": 0,
"hitStopTriggered": false,
"audioUnlocked": false
},
"pass": true
}