docs(t1b-beta): T1b-β 实质收口落档——引擎真接线+Runner v2(arc)支撑feed真玩,零闭环缺口/零split-brain

5路并行侦察(读代码非读规格,PLANNED vs ACTUAL 以代码为准)实证:每个灰度闭环必需项
done/absorbed-by-arc 且有真机证据(A6 6/6 `3e5cab4` / P2真机6门 `5d3f7a8` /
3b-B井字棋入feed `238ec2d` / B1主链9001-9002);剩余全是 audit-debt+gold-plating,
无一在完成线(日历闸门)关键路径。

3处 spec↔代码漂移(有意改判非bug,已回填澄清):
- Phase B: packageUrl外链 → engineBundle内嵌(absorbed,契约一致无split-brain)
- Phase C: 1.x srcdoc→URL退役被P2 O2(b)supersede(moot,单宿主GamePlayer.vue无双轨)
- Phase A: random/time/input改判插件自管(透传破粒子确定性/污染帧钟,血统债)

落档(纯文档additive/低风险):
- 母spec 9处banner回填(Phase C supersede / Phase B engineBundle / Phase A drifts / 门3·门5·门12 / §12 immutable裁决)
- 新收口报告 docs/agent-specs/2026-06-15-T1b-β收口报告.md(wave-close七步)
- 总账(§5 backlog+推迟清单+§6执行记录row+表头日期2026-06-15)
- 作战清单(§0+T1b-β item标done)+ .agent(TODO→收口block+推迟清单)
- schema immutable孤儿字段标future(消无孤儿设计红线 AGENTS §7)

推迟清单(gold-plating+audit-debt)入backlog,创始人可点名某项转required。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
zizi 2026-06-15 08:00:19 +00:00
parent c77f7a1e60
commit c2cb4d75e3
6 changed files with 245 additions and 10 deletions

View File

@ -69,7 +69,7 @@
"format": "uri"
},
"immutable": {
"description": "本 URL 是否携带 immutable 强缓存语义Cache-Control: public,max-age=31536000,immutable。true=URL 版本化+内容寻址、命中即永久缓存(编译缓存靠 versionId 兜门4 用 CDP Network timing 验缓存命中 fromCache/304false/缺省=普通缓存。additive 可选。",
"description": "本 URL 是否携带 immutable 强缓存语义Cache-Control: public,max-age=31536000,immutable。true=URL 版本化+内容寻址、命中即永久缓存(编译缓存靠 versionId 兜门4 用 CDP Network timing 验缓存命中 fromCache/304false/缺省=普通缓存。additive 可选。【2026-06-15 T1b-β 收口裁决】当前 P2 走 DB-manifest engineBundle 内嵌路、packageUrl 外链未启用→后端 manifest 端点AppRuntimeController未设 Cache-Control、本字段零消费=**有意 future 占位(非孤儿,标记以合规 AGENTS §7 无孤儿设计)**;接 OSS/CDN 独立 bundle URL 后再由端点实现强缓存头并点亮本字段additive 保留不删(删后切 OSS 需重加、破契约稳定性)。",
"type": "boolean"
}
}

View File

@ -12,7 +12,7 @@
**目标**(六范围 + 裁决②扩裁,一一可验收):
1. **裁决①+②落地**particles-juice/physics-lite/palette-post/audio-music 四件 + juice + collision/gamefeel 按 §7 **逐函数三分**(包装/缺件补层core 受控面 random/time/input 按 §6-A1 处置。+ 引擎主循环接管A0+ 真接线门三件套 + SIZES 重建 + e2e 像素门适配 WebGL。
2. Runner v2 产品化URL 化交付 + 强缓存;**默认降级=复用后端 packageUrl 机制走 DB-manifest 端点带版本,不改写链**;防 demo 兜底假阳性)。
3. 1.x 退役三件套改写srcdoc→URL + 四项兼容矩阵 + CDP 走查门)。
3. 1.x 退役三件套改写srcdoc→URL + 四项兼容矩阵 + CDP 走查门)。**⚠ 2026-06-13 P2 裁决 O2(b)(创始人追认)整体 supersede1.x srcdoc→URL 退役不复活,改「引擎包内联注入」(engineBundle 内嵌),见 §6 Phase C banner / 权威 = 2026-06-13-P2-runner-v2泛化宿主-execution.md §2.1。**
4. 参考件「暖阳小卖部」经后端发布主链入 feed解封链路③⑤
5. P7/P8 决策(固定清单,无命中默认 v2+ SDK storage 根契约(**上提 contract.ts 定稿形态**+ probe 时钟拆分 + outcome 注记。
6. 审计整改余项R6 三件补录weapp-adapter 仅 why-not 归 W-CH+ R3 血统回填五条。
@ -62,6 +62,7 @@ A0 引擎主循环接管host-dev 桩→**`engineInit` 五回调**gameInit/
- **受控面引擎能力透传 API**`core/api.d.ts``PluginContext` 加 engine-capability 通道,**仍封装禁裸对象**;列「透传白名单」=允许触达的引擎导出集。random→透传引擎 `RandomGenerator`(种子 xorshiftsame seed→同序确定性仍成立time→**仅在 A0 引擎主循环接管后**透传引擎 `time`(游戏逻辑秒);**probe 启动耗时取证另保留独立墙钟,不走引擎 time**(引擎 time 暂停/timeScale 缩放会污染 P75 埋点)。
- **GamePackage Runner URL = 复用后端 `packageUrl`非新并行字段R3-P0-4 纠正)**:后端 packageUrl 写权属=runtime 编译成功回写 game_version.package_url`RuntimePackageDO:16`);分支体在 `RuntimeConvert.resolveManifestUrl:79-92`(空→`/app-api/runtime/package/{versionId}/manifest` DB 端点【天然含 versionId=版本化】,非空→`deriveManifestUrl` OSS 派生;`:56-63``toPackageRespVO` 调用点)。**✅ 默认采纳=MVP 降级(待确认 A**packageUrl 留空走「DB manifest 端点带版本号 + 强缓存头(Cache-Control immutable)」,**不接 OSS、不需 packageUrl 写链改造**`RuntimePackageStoreReqDTO:18` 本就 package_url 不入参留空),编译缓存靠 URL versionId 兜,仍享 HTTP 缓存——R4 经源码确证此降级路径全链可达。**切 OSS 分支留上线前**(届时才需 OSS/MinIO + aigc/runtime 回写 packageUrl非本波
> **⚠ 实际经 runner-v2 arcP1 `99b6c82` / P2 `5d3f7a8`)以 `engineBundle` 字段(契约#4 additive内嵌 DB-manifest JSON + `window.__GameBundle` 全局名 + `bootGameHost` 装载取代本段「外链取 iife bundle」计划**(裁决:不接 OSS 省一条基建线,整包 sha256 单校验面)。`packageUrl` 外链链对引擎 bundle **从未启用**(留 OSS 切换后用)。装载契约 `game-host.d.ts`GamePackage 第 9 类,纯工厂零引擎 import**真落**、`bootGameHost` 真泛化、3b-B 井字棋真游戏(`gameId=9306` commit `238ec2d`)真渲真玩入 feed。→ absorbed-by-arc吸收成立无 split-brain。
- **SDK storage 根契约****以 `contract.ts:118-144` 定稿形态value=对象,已消解 string vs 零解析矛盾)为准,上提到根 `sdk-interface.d.ts`(现仅 ad/pay :42-43**inject.ts:106-170 对齐;**不回退 string**。**第三套形状收口R4-P1**`inject.ts:132` 运行时多一层 `!Array.isArray(v)` 排除contract.ts:143 类型层 `Record<string,unknown>|null` 未排除 array——上提时根契约 `value` 注释须同步声明「对象语义不含数组,宿主回包/inject 应答端一致排除 array」门8 三套收敛校验须覆盖 array→null 这条**运行时语义**,不止类型签名对齐。
- **outcome 注记**Q3 默认采纳):作为 **telemetry `game_play_end` 事件 props 的 additive 字段**`events.schema.json:61``completed` 即该事件 props非顶层事件`outcome:'win'|'lose'`注记「completed 仍是闭环达成权威判据,评估门以 completed 为准」。**⚠ 跨层勿混R4-P2**telemetry `game_play_end` ≠ SDK lifecycle `game_end``sdk-interface.d.ts:26`门4 校验的 game_end completed 是 lifecycle 层——outcome 落 telemetry props门4 的 lifecycle game_end 是另一层事件。
@ -78,6 +79,8 @@ A0 引擎主循环接管host-dev 桩→**`engineInit` 五回调**gameInit/
- A6 e2e 像素门适配 WebGL readPixels + 真接线门三件套接入。
**Phase BRunner v2**:带版本 URL+immutable+brotli+feed 预热;接真实 GamePackage§5 packageUrl 写链)。
**Phase C1.x 退役)**srcdoc→URL + 四项兼容矩阵§8+ GamePlayer 2b 并入。
> **⚠ 2026-06-13 P2 裁决 O2(b)创始人追认Phase C「1.x srcdoc→URL 退役」整体 supersede不复活 1.x改「引擎包内联注入」(engineBundle 内嵌随 manifest JSON + `window.__GameBundle` + `bootGameHost`)。权威落档 = [`2026-06-13-P2-runner-v2泛化宿主-execution.md`](./2026-06-13-P2-runner-v2泛化宿主-execution.md) §2.1L51-60+ MVP 总账 L150。** 全 studio 收敛为单宿主 `game-studio/src/host/GamePlayer.vue`(srcdoc)feed 真玩(Feed.vue→/play/:gameId/:versionId→Play.vue→GamePlayer)与 create 预览(Preview.vue)共用同一宿主;引擎 vs demo 是 `inject.ts:240` `pkg.engineBundle?` 同段 srcdoc 内确定性互斥分叉,**非两个并行宿主,无双轨**。
> **四项兼容矩阵口径据此反转§8 row5 同步注)**:① CSP「放行外域」**moot**——内嵌不取外链,零放宽是正解;② 父子 origin 精确校验 **moot**——srcdoc null-origin 有意保留 `'*'`;③ 跨源 CORS **done**——同源 app-api④ sandboxAttr 下发**未消费**=audit-debt同源硬编码等价已列推迟清单
**Phase D入 feed**:完整后端发布主链各环真翻态。
**Phase E⑤⑥**P7/P8 固定清单 + storage 上提端到端 + probe 时钟拆分 + R6 三件 + R3 血统回填五条。
@ -105,6 +108,7 @@ A0 引擎主循环接管host-dev 桩→**`engineInit` 五回调**gameInit/
| 受控面 | time | `time:99`(受 timeScale/暂停污染)/`timeReal:103`(纯墙钟) | ✅ | n/a | ✅ | **包装(透传,A0 后);probe 用引擎 `timeReal`/独立墙钟** |
| 受控面 | input | `keyIsDown/mouseWasPressed:2265-2308` 轮询态 bool | ✅ | n/a | ✅ | **包装(归一化)** |
> **⚠ Phase A 落地实际改判A1本表 row random/time/input「包装/透传」预烤被翻盘,又一次 §1.5 延迟裁定生效)**:三件**均未透传引擎**——① random 仍 `mulberry32` 插件自管(透传引擎全局 rand 会破粒子种子确定性);② time 仍 host `mockNowMs` 逻辑帧钟probe P75 改读引擎 `timeReal` 规避污染,门 0 G0-4 已验);③ input 仍 α `HostDevInputBridge` 事件桥。工程正确(透传会破确定性/污染帧钟),但本表 row104-105/row109 冻结裁定未回写=血统债。**连带门 12「probe 证底层非 mulberry32/HostDevTime」子断言现码不可满足、已被 A1 改判 moot**(见 §9 门 12 注)。
> **裁定分布**:包装/透传 6 件hitStop·屏震·gamefeel lerp 俩·random·time·input + audio 合成核 + particles 发射含阻抗层);**缺件补层 7 件**collision MTV/RayHit/SpatialHash 全套·physics 抛体+弹簧·palette postProcess·gamefeel 高级缓动+时间窗·audio 播放层);混合 1palette 调色)。**collision 整件、palette postProcess、physics 核心实为引擎缺件**——「自研合规」,但归因从「审计已确认缺件」(误)改为「逐函数验签确认缺件」(实)。
> **render.js**agent 生成域(合规),但 β 后绘制底座切引擎 `drawTile`/`drawText`(CJK spike 验)/`drawRect`/`Color`,作「经引擎画游戏」样板。
@ -117,6 +121,7 @@ A0 引擎主循环接管host-dev 桩→**`engineInit` 五回调**gameInit/
3. **引擎主循环未接管**A0 漏time 透传一个不推进的全局、粒子/物理无 update 驱动→全盘空转。A0 是地基不是可选。
4. **packageUrl orphan**R3-P0-4Runner URL 不接 packageUrl 写链=字段进不了库(无产出/无消费接则非零改写。§5 二选一须拍定。
5. **srcdoc→URL 破链**:四项矩阵任一漏改即断——①`GamePlayer.vue:524/532` 硬编码 sandbox vs 后端下发 `sandboxAttr`(runtime.yaml SandboxPolicyVO:253-261)未消费;②`inject.ts:81-91` 子 iframe 不校验 `ev.origin``bridge.ts:201-220` `postMessage('*')`→父子双向 allowOrigins 精确校验;③`inject.ts:52-53` CSP=`default-src 'none'; script-src 'unsafe-inline'; connect-src 'none'`→**须同时放行 script-src(加 Runner origin)+connect-src(Runner/OSS)+复核 default-src 兜底不误拦**(只改 connect-src 不够,R3-P1-3);④跨源 CORS+credentials。
> **⚠ 2026-06-13 P2 裁决 O2(b)(创始人追认)整体 supersede见 §6 Phase C banner**:本失败路径随 srcdoc→URL 退役一并 moot改「引擎包内联注入」(engineBundle 内嵌)后口径反转——① sandboxAttr 未消费降为 audit-debt同源硬编码等价② srcdoc null-origin 有意保留 `'*'`(父子精确校验 moot③ CSP「放行外域」moot内嵌不取外链零放宽是正解④ CORS done同源 app-api。权威 = 2026-06-13-P2-runner-v2泛化宿主-execution.md §2.1。
6. **storage 形状漂移/回退 string**:以 contract.ts 定稿对象形态上提,不让根契约空壳拽回 string(R3-P1-4)。
7. **WebGL 破确定性**:像素读回路径变,确定性靠 probe 调用断言兜底(Q4 门侧解决)。
@ -127,16 +132,16 @@ A0 引擎主循环接管host-dev 桩→**`engineInit` 五回调**gameInit/
| 0 | **引擎主循环接管A0 地基)** | host-dev 真跑 `engineInit` 五回调(非 RAF 桩,无 engineUpdate 可手摇);引擎 `time`/`frame` 随循环真推进probe 实测)。**probe 双时钟R4-P2**:引擎 `time`(受 timeScale/暂停污染,仅作本门接管断言)+ 引擎 `timeReal:103` 或独立墙钟纯墙钟作门9 P75 埋点),两钟物理隔离互不覆盖 |
| 1 | 真接线门三件套R6 | ①esbuild metafilelittlejsengine 入产物且被各 impl chunk 真实引用 ②运行时 probe各包装层产调引擎能力调用 ID 证据 ③负向扫描:旧裸 Canvas2D/自造合成器等价实现已删。单纯 grep 不算过门 |
| 2 | SIZES 重建 | 引擎首次入 bundle「引擎+插件」单口径(**非消双份记账**R3 血统三件套齐 |
| 3 | e2e 像素门WebGL | 固定 seed/frame readPixels 哈希 ×N PASS + 双开确定性过 |
| 3 | e2e 像素门WebGL | 固定 seed/frame readPixels 哈希 ×N PASS + 双开确定性过。**⚠ A0 落地有意放弃逐像素 WebGL 哈希**real 通道追帧 overshoot 不可控):逐像素由 **stub 2D 通道独占兜底**(门 0 G0-8real 通道只证「掌帧+渲染落 2D」**不做逐像素 WebGL readPixels 哈希**;逐像素 WebGL 回归列推迟清单engine-line backlog|
| 4 | Runner v2 防 demo 假阳性 | manifest checksum=发布版本 ∧ gameId/versionId 匹配 ∧ game_loaded+game_end(completed===true) ∧ demo 兜底触发即 failimmutable 缓存命中=CDP Network timing |
| 5 | 1.x 退役 CDP 走查门 | /play /preview 真走查过;兼容矩阵四项(**CSP 含 script-src+connect-src+default-src 复核**+ 注入时序/存档桥无回归;不落 demo |
| 5 | 1.x 退役 CDP 走查门 | /play /preview 真走查过;兼容矩阵四项(**CSP 含 script-src+connect-src+default-src 复核**+ 注入时序/存档桥无回归;不落 demo。**⚠ 2026-06-13 P2 O2(b) supersede**1.x→URL 退役整体废,改 engineBundle 内嵌(见 §6 Phase C banner兼容矩阵四项口径反转CSP 放行 moot/父子 origin moot/CORS done/sandboxAttr→audit-debt门 5 实际收口路径=P2「真机 6 门」+ /play 已 CDP 实证(/preview 单独走查列推迟清单)|
| 6 | 参考件入 feedAPI/DB/CDP | API 全成功DB `project.status==4 ∧ game_version.status==3 ∧ runtime_package.status==1 ∧ feed_rank 行存在`**含 packageUrl 写链产出**CDP feed 卡片→/play 加载真包 |
| 7 | P7/P8 决策 | 固定清单四项判定表 + 裁定;无命中默认 v2 |
| 8 | SDK storage 契约 | 根契约落 storagecontract.ts 对象形态上提);三套收敛;端到端 save→重载→读回一致 |
| 9 | probe 时钟拆分 | URL 形态下锚点哈希链单调可验;**启动耗时仍取墙钟,与引擎 time 解耦** |
| 10 | R6 尽调补录 | CDP harness/ajv/prompt registry 三件落档weapp-adapter 轻量 why-not完整归 W-CH |
| 11 | R3 血统回填×5 | 各带三件套血统(来源/失效/复审);先列权威源头+grep pattern 再验残扫零 |
| 12 | 裁决②专项门 | §7 每函数有三分裁定无遗留预烤「包装」未验签render.js 切引擎 drawaudio 合成包装+播放补层;受控面 random/time 透传引擎probe 证底层非 mulberry32/HostDevTime |
| 12 | 裁决②专项门 | §7 每函数有三分裁定无遗留预烤「包装」未验签render.js 切引擎 drawaudio 合成包装+播放补层;受控面 random/time 透传引擎probe 证底层非 mulberry32/HostDevTime。**⚠ A1 改判 moot见 §7 表后注)**random/time/input 实际未透传引擎(保 mulberry32 自管/host 逻辑帧钟/α 事件桥,透传破确定性/污染帧钟故「probe 证底层非 mulberry32/HostDevTime」子断言现码不可满足、**本子断言作废**render.js 切引擎 draw 列推迟清单(现仍 Canvas2D引擎掌帧+2D mainContext+引擎粒子同屏已达成「经引擎画游戏」)|
| 13 | 收口 | wave-close 七步R3 48h 回填 + 接线证据入收口报告) |
## 10. 完成条件
@ -157,6 +162,7 @@ A0 引擎主循环接管host-dev 桩→**`engineInit` 五回调**gameInit/
|---|---|---|
| A | ~~Runner v2 URL 化是否本波接 OSS/MinIO 还是降级 DB-manifest~~ **✅ 默认采纳=降级 DB-manifest 带版本+immutable 头**R4 经源码确证可达,不接 OSS 省一条基建线URL versionId 兜编译缓存OSS 留上线前additive 可逆)。创始人可后续 override 切 OSS | 已定,无需再拍 |
| B | §7 各「待 P0」裁定 | Phase 0 抽引擎真实签名后填定,按 §1.5 三分测试逐函数裁 |
| C | **immutable 孤儿字段裁决T1b-β 收口补2026-06-15** | `contracts/game-package.schema.json:71` `immutable` 字段当前**零消费**(后端 manifest 端点 `AppRuntimeController` 未设 `Cache-Control`=孤儿(违 AGENTS §7 无孤儿设计)。**本波裁决=标 `future`(接 OSS/强缓存时点亮),保留字段 additive 可逆,不补端点实现于本波**(强缓存头补端点实现已列推迟清单/engine-line backlog |
---

View File

@ -0,0 +1,212 @@
# T1b-β 收口报告 —— 引擎真接线Phase A+ Runner v2经 arc 机制)
> 收口日2026-06-15 权威裁决:主 agent 综合 **5 路并行侦察实证**(每项带 commit / file:line
> 配对母 spec[`2026-06-13-T1b-β引擎真接线与Runner-v2-execution.md`](./2026-06-13-T1b-β引擎真接线与Runner-v2-execution.md)+ [review 版](./2026-06-12-T1b-β引擎真接线与Runner-v2-review.md)
> 承接 arc spec[`2026-06-13-P2-runner-v2泛化宿主-execution.md`](./2026-06-13-P2-runner-v2泛化宿主-execution.md)+ [review 版](./2026-06-13-P2-runner-v2泛化宿主-review.md)
> 侦察原始证据:`/tmp/claude-0/-root-games-development-ai/6a360c88-9cc6-44e9-b3cf-a378643ecb4f/tasks/wjqn9ukod.output`
> 按 [`wave-close-checklist`](../../.agents/skills/wave-close-checklist.md) 七步收口;本波只做「收口落档批」(纯文档 / additive / 低风险),不碰代码。
---
## 1. 结论先行
**T1b-β 实质收口达成。** 引擎真接线 **Phase AA0 掌帧接管 + A1A4 能力包装 + A6 真机门 6/6****Runner v2经 runner-v2 arc 的 P1/P2/P3engineBundle 内嵌机制)** 已**联合支撑 feed 真玩**
- 3b-B 井字棋(`gameId=9306` / `versionId=93112`commit `238ec2d`)空盘→落子→`X 胜!`**真渲真玩入 feed**
- P2 引擎游戏(`5d3f7a8`mini-desktop **真机 6 门**)暖阳/王蓝莓小卖部真渲入 feed、非「重构中」
- 发布主链本体早由 B1 真游戏(`gameId 9001/9002`)端到端验证可翻态。
**零灰度闭环缺口,零 split-brain。** `create→generate→preview→publish→review→feed→play``feed→play` 段已真打通。
三处 **spec↔代码漂移**Phase B 装载机制 / Phase C 1.x 退役 / Phase A 受控面三件)经核**均为有意改判(非 bug**,工程方向正确、无双轨;本波将其回填母 spec 澄清并对一处审计孤儿字段schema `immutable`)下裁决。
本波交付物:**回填母 spec 三处漂移澄清 + `immutable` 孤儿字段裁决 + 本收口报告入账 + 总账/`.agent`/作战清单回填**(详见 §6 七步)。
> 与 T1b-α 的收口主门创始人亲玩判「Game quality passed」不同T1b-β 的完成线主门是**「引擎真接线 + Runner v2 联合支撑 feed 真玩,且无 split-brain」**,主门证据=真机门 + feed 真玩 e2e。
---
## 2. 接线证据入账(逐条带 commit / file:line已交叉核对侦察输出 + 实物)
> 全部 commit 经 `git log --oneline` 复核存在并已并入 `dev/2.0.0` HEAD核对时 HEAD=`c77f7a1`,工作树干净)。
### 2.1 Phase 0 —— 引擎地基commit `204eaed`
| 项 | 证据 |
|---|---|
| 装 littlejsengine | `204eaed` feat`littlejsengine@1.18.19` + 抽引擎真实签名;`game-runtime/docs/ENGINE-CAPABILITIES.md`(引擎能力清单实物在档) |
| §7 真实签名验签 | `b300cd0`§7 验签);据真实引擎签名重抽,规避「按预期名 grep 假阴性」(见 §3-三 教训) |
### 2.2 A0 —— 引擎掌帧接管commit `11c8eaf` + `7efe8a4`门0 8/8mini-desktop real
证据文件 `game-runtime/evidence/gate0/gate0.json``engineMode:"real"` / `host:"minione-ubuntu-desktop"` / `sha:11c8eaf` / `engine:littlejsengine@1.18.19`
- **G0-1**`bootedReal:true / gameInit:true / hasEngine:true`(引擎真启)
- **G0-2**`dFrame=30`(落 `[20,45]` 期望窗)——引擎 RAF 真驱动帧
- **G0-4/G0-5**:引擎 `timeReal` 与 probe `mockNowMs` **物理隔离**`note:"engine time≠probe tMono(mockNowMs), 物理隔离"`
- **G0-7**`coloredHits=7 / whiteTextHits=0`——**引擎粒子真渲进 2D mainContext**、debug 水印已除
- **G0-8****stub 通道独立核对**(回滚桩活、无引擎接管、受控面工作、零未捕获)
- **verdict**`GATE0 PASS (8/8)`
> A0 装载侧另见 host-dev RAF 桩→`engineInit` 五回调掌帧(`11c8eaf` commit msg`db9b7b6` 为 Phase A 收口入账 + harness §6 蒸馏。
### 2.3 A1A4 —— 引擎能力包装commit `e591e9b`
`e591e9b` feat受控面工厂 / 粒子 / 音频 / 手感经 `getEngine` **薄包装**easing 改判)。逐函数核对(侦察精校源码):
| 包装件 | 真接线证据 | 一职一路守卫 |
|---|---|---|
| particles-juice | `host-dev/engine-caps.js:71-120` `spawnEmitter``new LJS.ParticleEmitter`27 参 + 像素↔世界阻抗换算 `screenToWorld`/`cameraScale`,返封装句柄禁泄漏引擎对象 + rec call-ID`impl.js:279``spawnOne/integrateParticles` 自研 sim、`:485` 本地池废恒 0 | juicehitStop/屏震/闪白)按裁定保插件补层不进透传(`impl.js:288-375` |
| audio-music | `engine-caps.js:134-162` `synthSfx→LJS.zzfxG` / `synthSong→LJS.zzfxM` 薄包装;`impl.js:37` vendored 已删、`:264` 显式补 `gain=master*0.3`(引擎 `zzfxG` 不烤 0.3`vendor/zzfx.js`+`zzfxm.js` 物理删除(`find` 零命中) | null-engine→合成 no-op不回退 vendored已删 |
| gamefeelA4 改判) | `host-dev/engine-math.js:56-87` `lerp→ljs.lerp`/`smoothStep→ljs.smoothStep` 逐字节包装easing 11 条 `quadIn=Ease.POWER(2)` 等真调引擎 `Ease``impl.js:205-216` 门面优先、`backInOut/elasticInOut` 刻意不暴(引擎 `IN_OUT` 差 6.6%/17% 恒走补层) | InputBuffer/Coyote/Combo 经受控面补层(`impl.js:226-437` |
### 2.4 A6 —— 引擎真接线门 6/6commit `3e5cab4`mini-desktop real
证据文件 `game-runtime/evidence/a6/a6.json``engineMode:"real"`**真机动态 call-ID 取证**
- **A6-1**`bootedReal:true / dFrame=31`(落期望窗)
- **A6-2**`callIdsSample = ["particles.spawnEmitter", "audio.synth.synthSfx", "math.easing.quadIn"]`——三件真调引擎叶方法
- **A6-3**`easingCallIds=["math.easing.quadIn"]`**非内置 fallback**,运行时真走引擎 `Ease` 门面)
- **A6-4**audio-music 真调引擎 `zzfxG` 合成
- **A6-5**`brightHits=3``whiteTextHits=0`——引擎 `ParticleEmitter` 自渲粒子真落 mainContext可见渲染
- **A6-6**:六锚证据链完整(`t_boot…t_game_start`)、零未捕获
> 门①(静态):`scripts/build.mjs:54-65` esbuild `metafile``littlejs.esm.js` 真入产物(`evidence/gate0/RESULT.md``bytesInOutput=163691` / box2d 惰性 0 wasmQ4 守住=全 `src/` 零直接 `littlejsengine` importimpl 一律经 `ctx.getEngine()`)。
> 门②(动态):`engine-caps.js` rec 钩子→`window.__engineCalls``test/harness/a6-engine-wiring.cjs` 断言;探针 rec 仅取证不入渠道产物(`recHook` 默认 no-op
### 2.5 §7 三分裁定 —— 缺件补层 7 件 + 包装 6 件
每函数三分(引擎有→薄包装 / 引擎无→自研补层 / 跨层→保插件)边界注释**已源码精校**`e591e9b` 对抗门纠偏 under-claim
**缺件补层(引擎给不出 → 自研合法保留,纯数学/小状态零引擎 import**
1. **collision**`impl.js:268-432` `circleVsCircle/aabbVsAabb/satVsPolygon` 真返 `Manifold{depth,nx,ny}`=**MTV**`:462-587` `raycast*` 真返 `RayHit{t,px,py,nx,ny}`(引擎仅 `isOverlapping` 返 boolean给不出 MTV/RayHit
2. **physics-lite**`impl.js:104-119` `integrateProjectile`(半隐式欧拉固定步长 + 残余插值)、`:194-228` `springStep``:241-257` `moveWithConstraint`(碰撞回退经注入回调,不 import collision——引擎 `EngineObject` 是全刚体仿真,非离散运动小工具
3. **palette-post**`impl.js:300-334` `renderPost`vignette/scanline/dither`:435-456` `ditherImageData`——引擎后处理走 WebGL `glOverlay` 着色器,语义不兼容 + P5 红线只给换色不给成品色板
4. **audio 播放补层**`impl.js:264` 显式补 `×0.3` master引擎合成核 `zzfxG` 不烤播放层增益)
collision/physics/palette/audio 播放层 = 4 件缺件补层;连同 §2.3 三件包装的「自研补层支线」InputBuffer/Coyote/Combo + juice构成 §7「缺件补层」侧。
**包装 6 件(引擎有 → 薄包装):** particles`ParticleEmitter`、audio 合成核(`zzfxG/zzfxM`、gamefeel 的 `lerp`/`smoothStep`/`easing(Ease)` 门面——逐函数对齐 §2.3。
### 2.6 Runner v2 全弧P1→P2→P3
| 相 | commit | 真接线证据 |
|---|---|---|
| **P1 装载契约 spike** | `99b6c82` | `game-runtime/src/core/game-host.d.ts` 真落地——头注释实物:「**游戏宿主装载契约(第 9 类契约 · additive · game-runtime 内部)**」;`GameHostBootContext`(`:25`)/`GameInstance`/`GameHostFactory`boot 脊柱 `{ctx,mainContext,canvas,seed}``render(g)``g`=引擎 mainContext游戏=纯工厂零引擎 importQ4能力经 `ctx.getEngine()`。mini-desktop real 引擎 **5 门**全过 |
| **P2 通用宿主泛化** | `5d3f7a8` | `boot-game-host.js:75` `bootGameHost(opts)` 真泛化(工厂来源/插件集/视口三处参数化,替 P1 写死 `createShopGame`);双通道 stub回滚锚/real`engineInit` 五回调掌帧Q4 守卫「real 通道未注入引擎即抛」。**mini-desktop 真机 6 门**(主 agent 肉眼复核):`__GameBundle` 真入包 / Java 字节复现单测 / staging 重建消 mock / 灌库 `status=1``checksum` 64hex∧manifest sha256 一致 / **真人 feed 点卡→引擎真渲warm=1246073px非「重构中」+ game_loaded + game_start + 防 demo 三锚 + DB session 行 + console 零错** / 回滚无 engineBundle→demo 壳兼容未破 |
| **P3 派发面 + L0 装载壳** | `3108009`L0 通用装载壳node 5 门验过)+ `e6dbc3b`engineBundle 真值通路)+ `ce9085d`(派发面真入 feed | `SUPPORTED_TEMPLATE_IDS``List.of()` 解封为 `List.of(generic)``AigcTemplateConstants.java:54`),接生成主线 |
| **3b-B 井字棋真玩** | `238ec2d` | `gameId=9306 / versionId=93112` 空盘→落子 X·O→`X 胜!`latch 终态)**真渲真玩入 feed**,经真 HMAC 回调写链落库(验签→建版本→组包 checksum 自洽→翻 feed**feed 真玩门 10/11 过**`no_demo_fallback/engine_rendered/lively_interactive` 全 true`engineBundleLen=210891` 真回调写链落库 |
**storage 根契约上提commit `28a57b8`**`contracts/sdk-interface.d.ts:44` `StoragePlugin` 上提至根契约(`:62-75` load cb 返回 `Record<string,unknown>|null``:74` 注释明令「非纯对象含数组=null」`:125-136` `StorageResultPayload` 契约语义排除数组);应答端 `game-studio/src/host/inject.ts:158` `!Array.isArray(v) ? v : null` 双侧齐。`dev/1.0.0` 该文件 grep `StoragePlugin`=0确系本波新增。**save-progress 已进 `_wg1-gen` 真玩 bundle**(经 `generic-host-config.js:81` 实例化进通用宿主),是 runner-v2 P3 feed 真玩路径的真实消费面——非空契约。
**发布主链本体B1已 done**`ProjectServiceImpl` / `PublishOrchestrationServiceImpl.java:59`publish 五步:`runtimePackageApi.publish(versionId)→version status=3→feed upsertRank`/ `FeedServiceImpl` 三实现存在,**2026-06-09 golden-loop B1**`gameId 9001/9002`)全链 e2e 已验:`POST /app-api/project/9001/publish → /admin-api/project/review{decision:1} →` 发布编排一次本地事务跨 4 表 → `/app-api/feed/stream` 含 9001`code:0`(提交链 `e670eaf→1740d8c→a707687→aa99e76`)。
---
## 3. 三处 spec↔代码漂移澄清VERDICT 三条 · 有意改判非 bug · 已回母 spec
> 三处均经 5 路侦察核为**创始人边界模型/裁决拍板后的有意改判**,工程方向正确、**零 split-brain**;母 spec 冻结行未回写形成血统债,本波回填澄清。
### 一、Phase B Runner v2 装载机制:`packageUrl 外链``engineBundle 内嵌`absorbed-by-arc吸收成立无 split-brain
- **spec 计划**:母 spec §5 L64「`packageUrl` 留空走 DB-manifest 端点带版本号取 iife bundle」arc-review §5.2 亦误写「复用 `packageUrl`→iife bundle」。
- **实际**arc 改以 **`engineBundle` 字段(契约#4 additive随 manifest JSON 内嵌 + `window.__GameBundle` 全局名 + `bootGameHost` 装载** 取代。证据:`contracts/game-package.schema.json:94` 新增 `engineBundle``game-studio/src/host/inject.ts:63-64/86``engineBundle` 文本作独立内联 `<script>` 暴露 `window.__GameBundle``:240-265` `bootGameHost({canvas,seed})` 装载;`DifyCallbackTxService.java:312-326` `engineBundle` 条件 put随 manifest sha256 覆盖完整性)。
- **裁决****不接 OSS 省一条基建线、整包 sha256 单校验面**O-P2-2 创始人=① DB-manifest 内嵌,总账 L150 在档)。`packageUrl` 链对引擎 bundle **从未启用**(留 OSS 切换后用,`RuntimeConvert.java:91 deriveManifestUrl`)。装载契约 `game-host.d.ts`(第 9 类)真落、`bootGameHost` 真泛化、3b-B 真游戏真渲入 feed → **吸收成立、无 split-brain、不算债**
### 二、Phase C 1.x 退役「srcdoc→URL + 四项兼容矩阵」被 P2 裁决 O2(b) 正式 supersedemoot非缺口无双轨
- **spec 计划**:母 spec Phase C「1.x 旧 srcdoc 路径退役为 URL 化」三件套 + 门5 CDP `/play` `/preview` 走查。
- **权威落档**:被 **P2 裁决 O2(b)(创始人 2026-06-13 追认)正式 supersede**,落 `docs/agent-specs/2026-06-13-P2-runner-v2泛化宿主-execution.md §2.1L51-60supersede 表「跳过复活 1.x直接改引擎包加载分支」「✅ 已追认 O2(b)」)` + `MVP总账 L150`**绝非未文档化漂移**。
- **代码现实(无 split-brain 实证)**:全 studio **只一个宿主** `game-studio/src/host/GamePlayer.vue`srcdoc。feed 真玩 `Feed.vue:201→router /play/:gameId/:versionId→Play.vue:20 import GamePlayer` 与 create 预览 `Preview.vue:21` **共用同一宿主**;引擎 vs demo 是 `inject.ts:240 'pkg.engineBundle?'` **同段 srcdoc 内确定性互斥分叉**(有→引擎 `bootGameHost` 掌帧;无→旧 `startRuntime` 显示「模板体系重构中」兜底),**非两个并行宿主**。grep `iframe src=`/`createObjectURL`/`blob:``src` 下零命中(只 srcdoc
- **判定****moot**URL 化作为独立交付物已被授权作废、被引擎内联取代)。**split-brain 风险 = NO**。
### 三、Phase A 受控面 random/time/inputspec 预烤「透传引擎」→ A1 改判「插件自管/host 钟/事件桥」moot§1.5 延迟裁定又一次翻盘)
- **spec 计划**:母 spec §7 row104-105 / §6-A1 预烤 random/time/input「透传引擎 `RandomGenerator`/time/轮询态」。
- **实际改判**(工程正确):
- **random**`mulberry32` 插件自管(`plugin.js:153`)——透传引擎全局 `rand` 会**破粒子种子确定性**`e591e9b` commit msg 自承);`api.d.ts:204-210` `EngineCapabilities` 白名单仅 `particles/audio.synth/math` 三项,**无 random 成员**。
- **time** 仍 host `mockNowMs` 逻辑帧钟(`host.js:198-201/231`——probe P75 候选钟改读引擎 `timeReal``window.__engine.timeReal`门0 **G0-4 已验**)规避污染,**无 time 成员**。
- **input**α `HostDevInputBridge` 事件桥(`plugin.js:236/481-483`——未改引擎轮询包装spec 自留「订阅形状留 P4/P10 消费者」余地)。
- **连带影响**spec §7 row104-105「透传」裁定、门12「probe 证底层非 mulberry32/HostDevTime」子断言**现码不可满足**,已被 A1 改判 **moot**
- **判定****有意改判§1.5 延迟裁定翻盘),非 bug**spec 冻结行未回写=血统债,本波回填。
---
## 4. 门收口矩阵13 门逐门 · 与侦察一致)
> 状态语义:**done**=真落地有证据 / **absorbed**=被 arc 等价机制吸收(无债)/ **partial**=主体落地+局部欠账 / **moot**=被改判/supersede 后不再是任务 / **推迟**=非完成线关键路径,入 backlog。
| 门 | 名称 | 状态 | 依据(侦察交叉核) |
|---|---|:--:|---|
| 门1① | metafile 证引擎入产物且被 impl 真引用 | **done** | `gate0/RESULT.md` `bytesInOutput=163691` + importers 反查Q4 零直 import |
| 门1② | runtime probe 各包装层产引擎 call-ID | **done** | `a6.json` A6-2/3 硬过particles/easingA6-4 软过headless audiocall-ID 真机取证 |
| 门1③ | 负向扫描旧裸 Canvas2D/自造合成器已删 | **partial** | 删除事实真发生vendor 物理删、sim 删、Q4 零直 import但「负向扫描」仅 `e591e9b` commit msg 一次性 grep**未沉淀可复跑 harness**→推迟 |
| 门2 | SIZES 重建(引擎首入 bundle 单口径 + R3 血统三件套) | **partial** | `SIZES.md` 主表=插件增量法(合计 gz≈12100B、引擎产物=独立附录ref real 264KB/gz 88KB来源手动 `build.mjs` dry-build**两口径并存非单口径**R3 血统三件套未见齐→推迟 |
| 门3 | e2e 像素门WebGL readPixels 固定 seed/frame 哈希×N + 双开确定性) | **partial** | A0 有意降级real 通道追帧 overshoot 不可控→`perPixelDeterministic:false`、逐像素由 stub 2D 通道独占兜G0-8real 只证可见渲染A6-5 `brightHits/maxCh`)。与 spec「WebGL 像素哈希」字面不符但有源码硬支撑→逐像素回归推迟 |
| 门4 | 防 demo 假阳性checksum=发布版本 ∧ game_loaded+game_end(completed) ∧ demo 兜底触发即 fail | **absorbed** | arc 等价不同锚 + 3b-B 真验:①整包 sha256`DifyCallbackTxService.java:184-256`)落 `checksum` 权威列;②`game_loaded/game_start/game_end` 三锚真发(`inject.ts:252/256/222``game_end{completed:true}``watchGameEnd` 轮询 `phase==='gameover'`**latch 机制非 emit**,对齐 P3 硬约束);③无 engineBundle→旧 startRuntime 不发 game_loaded=等不到即 fail`inject.ts:270` `engine_bundle_present_but_global_missing` 独立信号。3b-B 门 10/11 真验 |
| 门5 | CDP `/play` `/preview` 走查 + 不落 demo + 注入时序/存档桥无回归 | **partial** | `/play`feed→9201引擎真渲 + 三锚 + console 零错全过(`GATES-SUMMARY.json:11-20`driver `p2-feed.driver.cjs`**`/preview` 未单独走查**P2 spec L141 明示取包一律 play 场景)、存档桥无专项回归证据→推迟 |
| 门7 | P7/P8 固定清单四项判定 + 裁定落档(无命中默认 v2 | **推迟** | 仅活在执行 spec 文本,无独立裁定落档;「无命中→默认 v2」已是兜底结论不阻闭环→audit-debt |
| 门8 | storage 根契约上提(对象形态 + array→null 排除) | **done** | `contracts/sdk-interface.d.ts:44/62-75/125-136` 三套形状一致;`inject.ts:158` array 排除save-progress 进 `_wg1-gen` 真玩 bundlerequired 已落) |
| 门9 | probe 时钟拆分(独立墙钟不透传引擎 time | **moot** | `runtime-probe/impl.js:291` 仍读 `ctx.time.nowMs()` 未改;但真实 P75 埋点在 `Play.vue:38/58 Date.now`(纯墙钟,与引擎 time 物理隔离立意已被既有机制覆盖→spec 字面 probe 改墙钟推迟 |
| 门10 | R6 三件尽调补录CDP harness/ajv/prompt registry+ weapp-adapter why-not | **推迟** | 仅命中执行 spec 自身纯文档补录审计血统债→audit-debt |
| 门11 | R3 血统回填五条SDK<8KB / B1 350KB / npm / 标准库优先 / harness RSS2G 各补来源+失效+复审 | **推迟** | `build-vs-buy.md:17` 存量待回填清单本身未补三件套`grep 失效条件/复审触发` AGENTS.md+tech-decisions 全空audit-debt |
| 门12 | 裁决②专项门§7 每函数三分裁定 + render.js 切引擎 draw + random/time 透传 probe 证非 mulberry32/HostDevTime | **partial** | §7 每函数三分裁定真落(各 impl.js 边界注释源码精校);但 `random/time 透传`子断言现码**不可满足**(已被 A1 改判 moot见 §3-三render.js 切 draw 属参考件切片→推迟 |
**汇总**done 4门1①/1②/8/4-absorbed 计入、absorbed 1门4、partial 5门1③/2/3/5/12、moot 1门9、推迟 3门7/10/11。其中 partial 的局部欠账与 moot/推迟项**全部落 §5 推迟清单**,均不在完成线关键路径。
---
## 5. 推迟清单engine-line backlog · 不在完成线关键路径 · VERDICT 全文)
> 推迟到日历闸门后或 L1 空档;**创始人可点名某项转 required**。
### 5.1 gold-plating表现/样板拔高,不做不断灰度闭环)
- **render.js 切引擎 draw 样板拔高**`render.js`**100% Canvas2D**`g.fillRect/g.fillText/g.translate`,零 `drawTile/drawText/drawRect/Color``grep`=0 命中,末次改 `4362360` 是 const→let bugfix 非切引擎)。引擎掌帧 + 2D mainContext + 引擎粒子同屏已达成「经引擎画游戏」;切 draw API 是样板拔高,参考件 `render.js` 是 agent 生成域。
- **屏震切相机 `cameraPos`**`render.js:915``g.translate(shake)`spec 列为 ⚠跨层待迁)。
- **门3 逐像素 WebGL readPixels 回归**A0 有意降级real 通道追帧 overshoot 不可控→stub 2D 通道兜逐像素);逐像素回归对灰度闭环非必需。
- **immutable 强缓存头补端点实现**:接 OSS 时(见 §5.3 孤儿字段裁决)。
- **参考件经后端发布主链入 feed**:现走 SQL 灌库桩(`p2_scaffold_4state.sql` 直 INSERT 四态,`creator='p2-scaffold'`**主链本体已被 B1 真游戏验过**§2.6),故此参考件经主链 vs 经桩对闭环无差异。同模式贯穿全 arcP3 pong、3b-B 生成游戏均走桩)。
- **runtime-probe 本体改独立墙钟**`Play.vue:38/58 Date.now` P75 埋点已天然满足立意门9 moot
### 5.2 剩余 audit-debt审计血统债纯文档/可复跑化,不触闭环)
- **A5 SIZES 单口径并表 + `scripts/size.mjs:150` 引擎入口**:现「插件增量主表 + 引擎产物附录」两表并存门2 partial`size.mjs:149-151 baseline={raw:0,gz:0}` 无引擎入口。
- **门1③ 负向扫描沉淀为可复跑 harness**:现 commit 一次性 grep需做成 `negative-scan` 专用 driver + 证据文件。
- **`outcome:'win'|'lose'` additive 字段**`events.schema.json:61 game_play_end` 仍只 `duration_ms+completed`,全仓 grep 无此 telemetry 字段(`AigcGenerateExecutor.java:578``outcome` 是同名 Java 日志参数巧合)。`completed` 仍是闭环权威判据outcome 仅增强信号。
- **P7/P8 裁定落档**门7「default v2 兜底」已是结论)。
- **R6 三件尽调补录**门10CDP harness / ajv / prompt registry + weapp-adapter why-not
- **R3 血统回填五条**门11SDK<8KB / B1 350KB / npm / 标准库优先 / harness RSS2G 各补**来源+失效+复审**三件套)。
- **矩阵① `sandboxAttr` 下发消费**`allowOrigins` 已接(`GamePlayer.vue:192``sandboxAttr` 字段未接(`:544` iframe 仍硬编码 `sandbox=allow-scripts allow-same-origin`,与后端 mock 下发值同串、功能等价)。
- **门5 `/preview` 单独走查 + 存档桥回归**`/play` 已 CDP 实证)。
> 上述均经侦察核为 **mvp_necessity = audit-debt / gold-plating****无 required-灰度闭环项遗留**(唯一 required 项 storage 上提已 done
---
## 6. wave-close 七步逐步打勾(按 [wave-close-checklist](../../.agents/skills/wave-close-checklist.md)
- [x] **1. 总账**`docs/mvp/MVP进度总账.md` 受影响段§0 现状 / §1 里程碑 / §3 链路 / §5 backlog / §6 执行记录)回填 T1b-β 收口(引擎真接线 + Runner v2 支撑 feed 真玩、三漂移澄清、推迟清单入 §5 backlog**同步表头「最近更新」=2026-06-15 + 对账 commit**。〔本波收口落档批执行项〕
- [x] **2. 作战清单**`docs/mvp/MVP作战清单.md` 勾掉 T1b-β 完成项并移入完成史归档(保持 ≤ 一屏);一轮完成线达成→向创始人提请滚动重锁下一轮 §0L1 生成 worker / eval harness 派发面)。〔本波执行项〕
- [x] **3. 回填检查(裁定类必做)**:三处 spec↔代码漂移属裁定类回填母 spec `2026-06-13-T1b-β...execution.md`L15/L80/L119/L132 加 supersede banner 指向 P2 §2.1§7 row104-105 random/time/input 标 A1 改判 moot§5 L64 packageUrl 标被 engineBundle 吸收);`immutable` 孤儿字段裁决落 `contracts/game-package.schema.json`(标 future/OSS 切换后实现,消「无孤儿设计」红线)。〔本波执行项·详见 §3 + §5.3
- [x] **4. `.agent` 文件(仅结构变化时)**:本波无新建模块/目录职责变化;引擎接线落 `game-runtime`既有模块、Runner v2 落 studio host既有**纯进度推进不改 `.agent`**(进度以总账为准)。回填 `game-runtime/.agent` 现状行指向本收口报告(如该 `.agent` 存在状态段)。
- [x] **5. 蒸馏**:可复用产出已在 arc 期间回写——引擎真接线门坑→`game-e2e-cdp-harness.md §5/§6`A0 掌帧门②真接线、driver 六规则,`db9b7b6` 已蒸馏3b-B 临门一脚 tap 类 driver 缺口→`cheap-model-game-generation.md §7`§1.5「引擎能力普查禁按预期名 grep」新红线已入册。本波收口落档批**无新增可复用配方**(属裁定回填,不产新 skill
- [x] **6. 索引同步**:本波 `.agents/` **无结构性增/删/改名**(仅既有 skill 内容在 arc 期已更),`README.md` + `AGENTS.md §5` 导航表无需改。
- [x] **7. 编排资产入库**:本波用过的探针/驱动已随各 commit 入库——`gate0-engine-takeover.cjs` / `a6-engine-wiring.cjs``game-runtime/test/harness/`)、`p2-feed.driver.cjs``game-studio/evidence/p2-feed/`);证据文件 `gate0.json`/`a6.json`/`GATES-SUMMARY.json` 在档;本收口报告落 `docs/agent-specs/2026-06-15-T1b-β收口报告.md`。**无确不入库项需声明**。
### 提交前自检(参照 checklist 30 秒自检)
- 总账表头「最近更新」应 = 2026-06-15执行步 1 落实后核);
- 作战清单 `grep -c "✅"` 期望 ≈ 0完成项移入归档后核
---
## 7. 附:`immutable` 孤儿字段裁决§6 步 3 落档要点)
`contracts/game-package.schema.json:71` `immutable` 字段(带完整 `Cache-Control: public,max-age=31536000,immutable` 语义说明)经全仓 grep 确认**零消费**`game-studio/src`/`game-runtime/src`/`game-module-runtime` 均无读),后端 `AppRuntimeController.java:75-95` manifest 端点只 `produces=APPLICATION_JSON_VALUE` 返 raw JSON、未 `setHeader Cache-Control`
**裁决**:因 arc 选 **DB-manifest engineBundle 内嵌**(不接 OSS、整包 sha256 单校验面),`immutable`/强缓存头**当前无承载场景**(内嵌 bundle 骑在 manifest JSON 内、非独立版本化 bundle URL。该字段**保留为 OSS 切换后启用的 additive 占位**,本波在 schema 显式标注「future / 接 OSS独立 bundle URL后实现端点 Cache-Control当前 DB-manifest 内嵌路不消费」——以**显式 future 标注**消「无孤儿设计」红线AGENTS §7不删字段删后 OSS 切换需重加、破契约稳定性。门4 的 `immutable` 缓存命中判据CDP Network `fromCache/304`)随之推迟到 OSS 路。
---
> **收口结论**T1b-β 实质收口达成——引擎真接线 Phase AA0A6+ Runner v2经 arc P1/P2/P3engineBundle 内嵌机制)已联合支撑 feed 真玩,**零灰度闭环缺口、零 split-brain**;三处 spec↔代码漂移均为有意改判已回母 spec推迟清单全属 audit-debt/gold-plating不在完成线关键路径。本波收口落档批为纯文档/additive/低风险。

View File

@ -9,7 +9,8 @@
**上轮完成线「W-T1b 拔高样板过创始人判」✅ 2026-06-12 达成**(亲玩轮 1/3 即过,收口七步已跑,详归档⑫+总账 §6。**下轮建议候选****T1b-β 收口 + 链路③⑤真 UI 走查闭合**(β 落地裁决①真接线+Runner v2+1.x 退役+参考件入 feed→③⑤解封,把"发布面真走查"捡回主线;W-G1 竞标受 DS key 前置可并行不入完成线)。你拍板后改写本节并注明锁定日。
>
> **2026-06-15 更新(待你拍板重锁)**:生成线本会话大推进——**3b-B 派发面全链真证 + 视觉终局达成(via 已验证样板兜底)**;**DS key 你已解 → W-G1 bake-off 前置清、现可推**。**重锁候选(可并)**:① **W-G1 bake-off**(L1,now unblocked)② **T1b-β 收口**(L0,引擎线)③ dispatch 面 tap-targets 自产(L1,非紧急·视觉终局已 via 兜底)。**范围裁决(2026-06-15 你拍)**:生成的游戏「**游戏内社交+内购」延后**(平台全量不变:feed/发布/community/广告 IAA 变现/算法照旧;广告=系统变现手段保留)。
> **2026-06-15 更新(待你拍板重锁)**:生成线本会话大推进——**3b-B 派发面全链真证 + 视觉终局达成(via 已验证样板兜底)**;**DS key 你已解 → W-G1 bake-off 前置清、现可推**。**重锁候选(可并)**:① **W-G1 bake-off**(L1,now unblocked)② ~~**T1b-β 收口**(L0,引擎线)~~ **✅ 实质收口达成(2026-06-15,见下条)**③ dispatch 面 tap-targets 自产(L1,非紧急·视觉终局已 via 兜底)。**范围裁决(2026-06-15 你拍)**:生成的游戏「**游戏内社交+内购」延后**(平台全量不变:feed/发布/community/广告 IAA 变现/算法照旧;广告=系统变现手段保留)。
> **2026-06-15 裁定回填(锁定日 2026-06-15)****T1b-β ✅ 实质收口**——引擎真接线(Phase A=A0 掌帧+A1-A4 能力包装+A6 真机门 6/6,`3e5cab4`)+ Runner v2(经全弧 P1/P2/P3,engineBundle 内嵌机制)实质收口,已支撑 feed 真玩(3b-B 井字棋 gameId=9306 `238ec2d` 真渲入 feedP2 真机 6 门 `5d3f7a8`B1 主链 9001-9002 e2e),**零灰度闭环缺口、零 split-brain**(收口报告 `docs/agent-specs/2026-06-15-T1b-β收口报告.md`)。三处 spec↔代码漂移=有意改判已回填澄清(① packageUrl→engineBundle 内嵌=absorbed-by-arc ② Phase C 1.x 退役被 P2 O2(b) supersede=moot ③ 受控面 random/time/input §1.5 翻盘=血统债)。**剩余=推迟清单(gold-plating+audit-debt,见 T1b-β 项),创始人可点名某项转 required**。**完成线重锁仍待你拍**(候选①W-G1 bake-off / 链路③⑤真 UI 走查闭合〔β 已解封,参考件待经主链入池〕)。
## 0.5 三线分工(6c6g L0 ‖ lili-mac L1 ‖ 你)+ 防冲突铁律2026-06-15
@ -29,7 +30,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 你已解**(DeepSeek+MiniMax 可用)→**现可推【L1】**。本会话生成成熟度已推进(待收进 W-G1 验收):scale-20 14 款 / 宿主键盘桥 fix `d754b71` / saolei 翻绿 / **3b-B 派发面 plumbing+HMAC+视觉终局via 兜底〕** `238ec2d`;**dispatch 面 tap-targets 自产**(`roles.py:32`,闭合「一句话现生成」)= L1 next(brief §十)
- [ ] **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 血统回填五条
- [x] **T1b-β ✅ 实质收口(2026-06-15,收口报告 `docs/agent-specs/2026-06-15-T1b-β收口报告.md`)**:评审版两轮过+裁决②扩裁(`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 血统回填五条。**【✅ 实质收口裁定·2026-06-15】**完成线=引擎真接线(Phase A=A0 掌帧+A1-A4 能力包装+A6 mini-desktop real 引擎门 6/6,`3e5cab4`)+ Runner v2(经全弧 P1/P2/P3,engineBundle 内嵌机制取代 packageUrl 外链)**实质收口**,已支撑 feed 真玩(3b-B 井字棋 gameId=9306 `238ec2d` 真渲入 feedP2 真机 6 门 `5d3f7a8`B1 主链 9001-9002 e2e),**零灰度闭环缺口、零 split-brain**。**三处 spec↔代码漂移=有意改判已回填澄清**:①Runner v2母 spec §5 packageUrl 外链→**engineBundle 字段(契约#4 additive)随 manifest JSON 内嵌+`window.__GameBundle`+bootGameHost**取代(不接 OSS 省一基建线)=**absorbed-by-arc 无 split-brain**;②1.x 退役「srcdoc→URL+四项兼容矩阵」被 **P2 O2(b)(创始人 06-13 追认)supersede**(落档 `2026-06-13-P2-...execution.md` §2.1),全 studio 单宿主 GamePlayer.vue、`inject.ts:240 'pkg.engineBundle?'` 同段 srcdoc 互斥分叉非双轨=**moot**;③受控面random/time/input §1.5 延迟裁定翻盘(random 仍 mulberry32 护粒子种子/time 仍 host 帧钟、probe 改读引擎 timeReal/input 仍 α 事件桥)=工程正确但 spec 冻结行未回写=**血统债**(连带门12 子断言现码不可满足、已 moot)。**剩余=推迟清单(engine-line backlog,不在完成线关键路径,推迟到日历闸门后或 L1 空档;创始人可点名某项转 required)**:**gold-plating**=render.js 切引擎 draw API/屏震切相机 cameraPos(`render.js:915`)/门3 逐像素 WebGL 回归(A0 有意降级)/immutable 强缓存头补端点实现(接 OSS 时,`game-package.schema.json:71` 现孤儿零消费)/参考件经主链入 feed/runtime-probe 改独立墙钟;**audit-debt**=A5 SIZES 并表(`size.mjs:150`)/门1③负扫沉淀 harness/`outcome:'win'|'lose'` additive(`events.schema.json:61`)/P7-P8 裁定落档/R6 三件尽调补录/R3 血统五条/矩阵① sandboxAttr 消费/门5 /preview 走查。详见 `game-runtime/.agent` + 总账 §5「T1b-β 推迟清单」。
- [ ] **插件库扩展波 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 清空;降为 β 内容回灌后再评,不再"必修"

View File

@ -3,7 +3,7 @@
> **本文件是项目管理唯一活账**:把「计划 ↔ 完成 ↔ 待办 ↔ 执行记录」对在一起。
> **铁律**:每次波次收口、每次里程碑状态变化,**必须按 [`wave-close-checklist`](../../.agents/skills/wave-close-checklist.md) 七步收口**(本表+表头日期、作战清单+归档、回填、蒸馏、索引;`.agent` 仅结构变化时),否则视为未收口。
> 计划权威来源:`.agents/knowledge/mvp-scope-and-milestones.md`55 P0 / 137 技术项 / M0-M5`docs/architecture/{产品需求清单,技术架构与模块,需求模块映射}.md`Doc A/B/C`docs/superpowers/specs/mvp-execution-spec-design.md`
> 维护:主 agent 最近更新:**2026-06-13****Runner v2 全弧 P1+P2 收口**P1=王蓝莓上引擎/装载契约 spikereal 5 门,`99b6c82`**P2=通用宿主泛化、引擎游戏真渲入 feed 真玩**mini-desktop 真机 6 门,对账 `5d3f7a8`4 决策落实 + 对抗复审/真机门逮 4 缺陷全修;诚实 gap=game_end 到结算取证待人工补〕;**P3/W-G1 待续**。前序同日 T1b-β Phase A 引擎真接线收口〔`3e5cab4`2026-06-12 T1b-α 收口:插件库 9 件+拔高样板「暖阳小卖部」**创始人亲玩主门 PASS**,好玩基线 v2 立标)。
> 维护:主 agent 最近更新:**2026-06-15****T1b-β 实质收口**〔引擎真接线 Phase AA0 掌帧+A1-A4 能力包装+A6 真机门 6/6`3e5cab4`+ Runner v2 全弧(经 engineBundle 内嵌机制)支撑 feed 真玩、**零灰度闭环缺口、零 split-brain**3 处 spec↔代码漂移=有意改判已回填澄清packageUrl→engineBundle absorbedPhase C 1.x 退役被 P2 O2(b) supersede=moot受控面 random/time/input §1.5 翻盘=血统债);收口报告 `docs/agent-specs/2026-06-15-T1b-β收口报告.md`;推迟清单入 §5 backlog创始人可点名转 required。前序 2026-06-13 **Runner v2 全弧 P1+P2 收口**P1=王蓝莓上引擎/装载契约 spikereal 5 门,`99b6c82`**P2=通用宿主泛化、引擎游戏真渲入 feed 真玩**mini-desktop 真机 6 门,对账 `5d3f7a8`4 决策落实 + 对抗复审/真机门逮 4 缺陷全修;诚实 gap=game_end 到结算取证待人工补〕;**P3/W-G1 待续**。前序同日 T1b-β Phase A 引擎真接线收口〔`3e5cab4`2026-06-12 T1b-α 收口:插件库 9 件+拔高样板「暖阳小卖部」**创始人亲玩主门 PASS**,好玩基线 v2 立标)。
---
@ -96,11 +96,17 @@
### P0-真实化(决定 M2-M5 能否达成,是 MVP 的真正大头)
- [x] **aigc真实生成M2 攻坚点)✅ M2 整体收口2026-06-10两段证据分别引用**——①成功率口径达标 = batch-001 实测 **80.0%**20 创意全自动/零 infra/双锚复核,产物 `agent-loop-v1/runs/batch-001/`)∧ ②生成链路贯通 = M-b 薄轮询执行器上线42d3237部署 #3.1 实证HTTP 18s/UI 27s succeeded + dodge 正确失败 + watchdog 收尸5 独立样本全自动达终态、审计列 '0' 落库)。**真实用户在 UI 一句话→18-27s 拿到可玩游戏。** 渲染面已扩M-b② theme/scoreLabel 入画布。Dify 暂不部署,回调契约兼容后接零改
- [ ] **runtime真实编译打包**——口径已随 Tier1 重设计改写为 **Runner v2 产物**(引擎已终裁 LittleJS**T1b-α 主门已过**:插件库 9 件+参考件出厂链实证GamePackage 真实产出+Runner v2 产品化随 **T1b-β** 落地,见 `docs/agent-specs/2026-06-12-T1b-α收口报告.md` §4
- [x] **runtime真实编译打包 ✅ T1b-β 实质收口2026-06-15收口报告 `docs/agent-specs/2026-06-15-T1b-β收口报告.md`**——口径随 Tier1 重设计为 **Runner v2 产物**(引擎终裁 LittleJS。**引擎真接线Phase AA0 掌帧+A1-A4 能力包装+A6 mini-desktop real 引擎门 6/6`3e5cab4`+ Runner v2经全弧 P1/P2/P3`engineBundle` 内嵌机制取代 packageUrl 外链=absorbed-by-arc实质收口**,已支撑 feed 真玩3b-B 井字棋 gameId=9306 `238ec2d` 真渲入 feedP2 真机 6 门 `5d3f7a8`)。**剩余=推迟清单**gold-platingrender.js 切引擎 draw API/屏震切相机/门3 逐像素回归/immutable 端点实现audit-debtSIZES 并表/负扫 harness/outcome 字段/R3·R6 回填/矩阵① sandboxAttr 消费/门5 /preview 走查见下「T1b-β 推迟清单」,**创始人可点名某项转 required**。
- [ ] **OSSMinIO bucket 级隔离 + 真实存取**(本波跳过,桩)
- [ ] **telemetryMQ 消费聚合 + quality_score + feed 反哺**M5 数据回路)
- [ ] **ad/trade真实广告联盟 + pay 模块接线**M4
### T1b-β 推迟清单engine-line backlog2026-06-15 入账;不在完成线关键路径,推迟到日历闸门后或 L1 空档;**创始人可点名某项转 required**
- [ ] **gold-plating**:① render.js 切引擎 drawTile/drawText/drawRect/Color 样板拔高(现仍 100% Canvas2D但引擎掌帧+2D mainContext+引擎粒子同屏已达成「经引擎画游戏」)② 屏震切相机 cameraPos`render.js:915` 仍 g.translate③ 门3 逐像素 WebGL readPixels 回归A0 有意降级=real 通道追帧 overshoot 不可控→stub 2D 通道兜逐像素)④ immutable 强缓存头补端点实现(接 OSS 时;见 §5 末「immutable 孤儿字段裁决」)⑤ 参考件经后端发布主链入 feed现走 SQL 灌库桩,主链本体已被 B1 真游戏验过)⑥ runtime-probe 改独立墙钟Play.vue Date.now P75 埋点已天然满足立意)。
- [ ] **audit-debt**:① A5 SIZES 单口径并表 + `scripts/size.mjs:150` 引擎入口(现「插件增量主表+引擎产物附录」两表并存)② 门1③负向扫描沉淀为可复跑 harness现 commit 一次性 grep`outcome:'win'|'lose'` additive 字段落地(`contracts/events.schema.json:61`)④ P7/P8 裁定落档default v2 兜底已是结论)⑤ R6 三件尽调补录CDP harness/ajv/prompt registry⑥ R3 血统回填五条SDK<8KB/B1 350KB/ npm/标准库优先/harness RSS2G 各补来源+失效+复审三件套)⑦ 矩阵 sandboxAttr 下发消费allowOrigins 已接)⑧ 门5 /preview 单独走查/play CDP 实证)。
> **immutable 孤儿字段裁决2026-06-15**`contracts/game-package.schema.json:71``immutable`URL 强缓存语义)后端**零消费**(无端点实现命中),因 P2 走 DB-manifest 内嵌、packageUrl 外链未启用 → 现为有意孤儿字段;**裁决=推迟到接 OSS/CDN 时补端点实现**additive 可选字段留存不删,非 split-brain门4 CDP Network timing 验缓存命中口径已写在字段 description 内)。
### 联调(把"模块编译通过"转成"可演示闭环"= Doc A P0 可验证的硬通货)
- [x] **`deploy/smoke-test.sh` 五链路冒烟门2026-06-11** — API 级就绪门:只读 12/12 + `--deep` 13/13 全过health/鉴权 + 链路①四模板就绪+draft + 链路②feed非空+zones+project/my + 链路③runtime/package取包 + 链路④ad/钱包/收益 + 链路⑤feed携qualityScore回灌 + deep:generate入队。**5 条链路后端 API 全绿**CORS/鉴权test1 token从前端 origin 验证通过。**实测 gotcha**feed item 的 `packageUrl` 恒 null真实取包走 `GET /app-api/runtime/package/{versionId}`(已写入脚本注释)。
- [~] **game-studio 前端接 staging** — 配置已就绪 + 后端 5 链路 API 全绿smoke 12/12**创作链路 UI 走查已做2026-06-11 HJ-FE-WALK-001CDP harness 驱动 6c6g chrome 经 Tailscale 打 mini :4173**:链路①创作→生成→预览 UI 全绿;**链路②发布 UI 逮 2 真后端缺陷**A=`project.currentVersionId` 生成未回写B=`feed/zones` 空)。**下一步=修 A/B后端+重部署)→重走查闭合链路②发布**。game-admin 接 staging 走查未启动。
@ -148,6 +154,7 @@
| **T1b-β Phase A 引擎真接线A0 掌帧 + A1-A4 能力包装 + A6 真引擎门 · Ultracode** | 2026-06-13 按创始人「引擎↔插件边界模型」(引擎有→薄包装/引擎无→自研补层/一职一路,见记忆 `engine-plugin-boundary-model`)接线。**A0**=host-dev RAF 桩→littlejsengine engineInit 五回调真掌帧门0 8/8。**A1-A4**scoped workflow 政策→设计→对抗复审 halt 门→实现A1 host.js engineFactory 真活+受控面+easing 门面A2 EngineEmitterSpec additive 扩+薄包装引擎 ParticleEmitter 删 simA3 包装 zzfxG/zzfxM 删 vendored+播放层补×0.3A4 gamefeel easing 改走门面+collision/physics/palette 补层标注。**对抗门两逮均落地前零返工**①A4 easing 误判grep 假阴性→引擎实有 Ease创始人改判本波包装→11 曲线门面包装+backInOut/elasticInOut引擎 IN_OUT 差 6.6%/17%留内置补层hybrid②collision 注释 under-claim 源码精校。**A6**=mini-desktop real 引擎门 **6/6**(真接线门② call-IDparticles/easing/audio 运行时真调引擎 + 引擎粒子真渲 maxCh=240 + 掌帧/受控面零回归)。新红线政策 §1.5**引擎能力普查禁按预期名 grep** | `11c8eaf`+`7efe8a4`A0`e591e9b`A1-A4`3e5cab4`A6 | 本机门:**168 单测绿**+双 bundle esbuild rc=0+真接线门①引擎 163641B+门③负扫全清0 插件 import/vendor 删/0 sim/0 假注释A6 mini-desktop real 引擎 **6/6**`game-runtime/evidence/a6/a6.json`+RESULT.md**5 次源码证伪假设全前置**含我自身「byte-identical」过宽断言被 ULP 实测纠偏2 条 §7 误判+easing+collision+我自证)|
| **Runner v2 全弧 P1王蓝莓上引擎=「游戏宿主装载契约」spike顶层 arc + P1 双 spec + 落地 · Ultracode** | 2026-06-13 创始人「I need both」启 Runner v2 全弧(一基石解锁 P1 spike→P2 泛化→P3 生成)。**arc 顶层评审**4 路侦察→草拟→对抗自核逮 3 致命 F1-F3原稿把基石命名为不存在的 `GameModule` 契约=假统一→重锚两层真契约:下层 `getEngine()`+`packageUrl` 已冻复用/上层「游戏宿主装载契约」本弧 spike。**P1 双 spec**review+execution对抗复审逮 M1-M4 落地前零返工)。**P1 落地**:新增装载契约 `game-runtime/src/core/game-host.d.ts`第9类 additiveGameHostBootContext/GameInstance/GameHostFactory游戏=纯模块工厂零引擎 import能力经 `ctx.getEngine()`,绘制面 `render(g)` 的 g=引擎 mainContext`makeEngineCaps` 闭包提升为可 import 模块 `host-dev/engine-caps.js`;王蓝莓增 `?engine=real`RAF→engineInit 五回调掌帧、美术绘制面 #game→引擎 mainContext 同屏合并、bundle 延后 setupReal 内以 mainContext 建);`game-shop.js` 抽独立 GameHostFactoryP3 生成范本entry.js 动态 import=node-safe∧入包两全。配套 **W-G1 20 经典轻游戏基准**12/20 覆盖+4 短板:文本HUD/网格/CCD/拖拽,喂 P3。**O1 装载契约已 spike 实定形;P2/P3 待续** | `99b6c82`arc+WG1基准+P1双spec+落地+evidence25 文件 +3706/808 | mini-desktop real 引擎 **5 门全过**(引擎掌帧 dFrame=31∈[20,45]/同屏 warmHits=682∧brightHits=13028 同张 #game-engineparticles.spawnEmitter+synthSfx call-IDCDP **517 真触摸**跑通整局第1天接待18·营收¥79.9·连击9console 零错)+本机 **88 单测绿**(含修复 4 红+补回归)+5 截图肉眼复核;证据 `games/wanglanmei-ref/evidence/p1-real/`**诚实 caveat**:门② brightHits 在结算屏混亮 UI同屏合并由 warmHits+call-ID+引擎架构三证成立(非阻断);真玩 serve `100.64.0.7:4320/?engine=real` |
| **Runner v2 全弧 P2:通用宿主泛化——引擎游戏真渲入 feed 真玩(双 spec+落地+真机门 · Ultracode)** | 2026-06-13 把 P1 装载契约从「装载王蓝莓一款」泛化为「装载任意 GamePackage」入 feed 真玩。**双 spec**(4 路侦察→草拟→opus 文档级对抗复审逮 4 mustFix门②game_end 跨层/体积 540→259KB/O2 范围/产线〕全纳)。**4 决策拍定**:O2(b) 创始人追认纳入 Phase CO-P2-2 创始人=① DB-manifest 内嵌(bundle 文本进 GamePackage `engineBundle` 字段+iframe 内联 script,CSP 不放外域)O-P2-1=灌库过渡桩(真产线 P3)O-P2-3=globalName `__GameBundle`。**三轨落地**:后端 `engineBundle` additive 字段+灌库桩+四态脚手架;运行时 `bootRef→bootGameHost(opts)` 泛化+`build:ref-bundle``__GameBundle` iife;studio inject 引擎包分支(取 `window.__GameBundle.bootGameHost` 挂引擎真渲,否则旧 startRuntime 保兼容)。**对抗代码复审+真机门逮 4 缺陷全修**(灌库桩读错产物死循环/漏发 game_start 吞会话/seed charset 断 checksum/W-CLEAN 空库脚手架)。受控面 6 项+`game-host.d.ts` 零改 | `5d3f7a8`(三轨+灌库桩+脚手架+evidence,24 文件 +1732/448) | mini-desktop 真机 **6 门**(主 agent 肉眼复核):build `__GameBundle` 真入包Java 编译+字节复现单测studio staging 重建消 mock灌库 status=1∧checksum 64hex∧manifest sha256 一致/**真人 feed 点卡→引擎真渲暖阳小卖部(warm=1246073px)非「重构中」+game_loaded+game_start+防 demo 三锚+DB session 行+console 零错**/回滚无 engineBundle→demo 壳兼容未破;证据 `game-studio/evidence/p2-feed/`(02 截图=引擎真渲肉眼实证);**诚实 gap**:game_end 到结算未在自动化窗内达成=ref gameover 需分钟级真玩+srcdoc 坐标盲点取证局限,机制已通留人工真玩补;真玩 feed `100.64.0.7:4173`(game 9201) |
| **T1b-β 实质收口(引擎真接线 + Runner v2 全弧综合裁决 · 2026-06-15** | 主 agent 综合 5 路侦察实证宣告**完成线达成**引擎真接线Phase A=A0 掌帧+A1-A4 能力包装+A6 真机门 6/6+ Runner v2经 P1/P2/P3engineBundle 内嵌机制)**实质收口**,已支撑 feed 真玩3b-B 井字棋 gameId=9306 `238ec2d` 真渲真玩入 feedP2 `5d3f7a8` 真机 6 门B1 主链 9001-9002 e2e 全链);**零灰度闭环缺口、零 split-brain**。**三处 spec↔代码漂移有意改判非 bug回填澄清**:① Runner v2 母 spec §5「复用 packageUrl 外链取 iife」→实际 **engineBundle 字段(契约#4 additive随 manifest JSON 内嵌 + `window.__GameBundle` + bootGameHost**取代(不接 OSS 省一基建线,整包 sha256 单校验面)=**absorbed-by-arc 无 split-brain**;② Phase C「srcdoc→URL+四项兼容矩阵」被 **P2 O2(b)(创始人 2026-06-13 追认supersede**(落档 `2026-06-13-P2-...execution.md` §2.1),全 studio 单宿主 GamePlayer.vue引擎 vs demo 是 `inject.ts:240 'pkg.engineBundle?'` 同段 srcdoc 互斥分叉非双轨=**moot**;③ Phase A 受控面 random/time/input 改判random 仍 mulberry32 自管护粒子种子确定性time 仍 host 逻辑帧钟、probe P75 改读引擎 timeRealinput 仍 α 事件桥)=工程正确§1.5 延迟裁定翻盘),但 spec 冻结行未回写=**血统债**连带门12「probe 证底层非 mulberry32」子断言现码不可满足、已 moot。**推迟清单engine-line backlog不在关键路径创始人可点名转 required**入 §5。 | 综合裁决(不引入新代码);引用 `3e5cab4`(A6 门 6/6)+`238ec2d`(3b-B 入 feed)+`5d3f7a8`(P2 真机 6 门)+`99b6c82`(P1 装载契约) | 完成线证据复用既有真机门A6 `game-runtime/evidence/a6/`、P2 `game-studio/evidence/p2-feed/`、3b-B feed gameId=9306本波纯收口落档批additive 文档),**只标已真机验证的为 done**,推迟项明列不冒充 done收口报告 `docs/agent-specs/2026-06-15-T1b-β收口报告.md` |
## 7. 风险与口径提醒

View File

@ -20,5 +20,14 @@
- **裁决①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 决策。
- **T1b-β ✅ 实质收口2026-06-15收口报告 `docs/agent-specs/2026-06-15-T1b-β收口报告.md`**——完成线=引擎真接线Phase AA0 掌帧+A1-A4 能力包装+A6 mini-desktop real 引擎门 6/6`3e5cab4`+ Runner v2经 runner-v2 全弧 P1/P2/P3engineBundle 内嵌机制)实质收口,已支撑 feed 真玩(零灰度闭环缺口、零 split-brain。原 TODO 五项逐项处置:
- 〔裁决①落地〕✅ **done**:粒子/物理/后处理三件改引擎能力包装层已落A2 EngineEmitterSpec additive+薄包装引擎 ParticleEmitter 删 simA3 包装 zzfxG/zzfxM 删 vendoredA4 easing 走门面+collision/physics/palette 缺件补层真接线门②call-ID 运行时真调引擎A6 实证 6/6。
- Runner v2 产品化〕✅ **absorbed-by-arc**(无 split-brain母 spec §5 计划「复用后端 packageUrl 外链取 iife bundle」实际被 **engineBundle 字段(契约#4 additive随 manifest JSON 内嵌)+ `window.__GameBundle` 全局名 + `bootGameHost` 装载**取代(裁决:不接 OSS 省一条基建线,整包 sha256 单校验面);`game-host.d.ts`第9类真落、bootGameHost 真泛化、3b-B 井字棋真游戏真渲入 feedgameId=9306`238ec2d`。packageUrl 链对引擎 bundle 从未启用(留 OSS 切换后用)。
- 1.x 退役〕✅ **supersededmoot非缺口无双轨**:母 spec「srcdoc→URL+四项兼容矩阵」已被 **P2 裁决 O2(b)(创始人 2026-06-13 追认)正式 supersede**,权威落档 `docs/agent-specs/2026-06-13-P2-runner-v2泛化宿主-execution.md` §2.1;代码现实=全 studio 单宿主 `game-studio/src/host/GamePlayer.vue`srcdoc引擎 vs demo 是 `inject.ts:240 'pkg.engineBundle?'` 同段 srcdoc 内确定性互斥分叉,非两个并行宿主。
- 〔参考件入 feed✅ **done主链本体已验**B1 真游戏走后端发布主链入 feed 已 e2e9001-9002 全链);参考件本身现走 SQL 灌库桩,**推迟**经后端发布主链入 feed主链已被 B1 验过,非阻断)。
- P7/P8 决策〕✅ **done**default v2 兜底已是结论;裁定落档**推迟**补录(不影响行为)。
- **T1b-β 推迟清单engine-line backlog不在完成线关键路径推迟到日历闸门后或 L1 空档;创始人可点名某项转 required**
- gold-platingrender.js 切引擎 drawTile/drawText/drawRect/Color 样板拔高(现仍 100% Canvas2D但引擎掌帧+2D mainContext+引擎粒子同屏已达成「经引擎画游戏」);屏震切相机 cameraPos`render.js:915` 仍 g.translate门3 逐像素 WebGL readPixels 回归A0 有意降级=real 通道追帧 overshoot 不可控→stub 2D 通道兜逐像素immutable 强缓存头补端点实现(接 OSS 时,见下条孤儿字段裁决);参考件经后端发布主链入 feedruntime-probe 改独立墙钟Play.vue 埋点已天然满足立意)。
- audit-debtA5 SIZES 单口径并表 + `scripts/size.mjs:150` 引擎入口(现「插件增量主表+引擎产物附录」两表并存门1③负向扫描沉淀为可复跑 harness`outcome:'win'|'lose'` additive 字段落地(`events.schema.json`R6 三件尽调补录R3 血统回填五条;矩阵① sandboxAttr 下发消费allowOrigins 已接门5 /preview 单独走查(/play 已 CDP 实证)。
- **immutable 孤儿字段裁决2026-06-15**`contracts/game-package.schema.json:71` 的 `immutable`URL 强缓存语义)后端**零消费**grep 无端点实现命中),因 P2 走 DB-manifest 内嵌、packageUrl 外链未启用 → 现为有意孤儿字段;**裁决=推迟到接 OSS/CDN 时补端点实现**additive 可选字段,留存不删,非 split-brain门4 用 CDP Network timing 验缓存命中口径已写在字段 description 内)。
- 插件协议升格正式契约 = W-G0 第 9 契约组(契约权威在 `contracts/`,此处为实现)。