docs(t1-spike): Codex 5.5 Xhigh对抗评审整改 v1.1——P0×6/P1×5全修+三拍板落账
- P0:SDK接线细则(复制工厂+重建双原语shim)/S2七锚点host单时钟(可玩=t_input_bound)/真输入取证纪律(禁evaluate篡改)/CSP硬证据(securitypolicyviolation+CDP双源计数)/Phaser版本统一4.1(3.90=买断代迁移债,v4挂CSP硬门才降级备援)/serve形态钉死(vite build+immutable缓存头+固定端口三开协议) - P1:outcome标注spike-local(契约补丁随W-T1b)/SIZES三列(engine-only·runner-total·helpers)/依赖锁定npm ci/并发模型改mini-desktop暂存目录+git全程主会话/R4口径回填requirements - 评分表加helper依赖成本行;重设计spec §9 拍板落账(Q1 top-2 spike/Q2捆绑好玩基线/Q3 spike先行并行) - 评审通道:按创始人指令首跑Codex 5.5 Xhigh成功,未回落 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
205ca6ffff
commit
a8a565532c
@ -1,67 +1,109 @@
|
||||
# Tier1 引擎 eval-spike · 执行版(HJ-T1-SPIKE-001)
|
||||
# Tier1 引擎 eval-spike · 执行版(HJ-T1-SPIKE-001 · v1.1)
|
||||
|
||||
> **上游**:评审版 = `docs/agent-specs/2026-06-11-Tier1运行时重设计-review.md` §5(spike 设计已创始人确认);约束框架 = `docs/brainstorms/2026-06-11-tier1-runtime-constraints-requirements.md`(KD1-KD6/R1-R19)。
|
||||
> **上游**:评审版 = `docs/agent-specs/2026-06-11-Tier1运行时重设计-review.md` §5;约束框架 = `docs/brainstorms/2026-06-11-tier1-runtime-constraints-requirements.md`(KD1-KD6/R1-R19)。
|
||||
> **目标**:LittleJS vs Phaser 双 lane 同款「落物 action」实测计分 → 引擎终裁包;获胜实现转正为模板五。
|
||||
> **裁决语义(KD3)**:B1 入场券双双已过门(gz≤350KB/raw≤1.5MB),**S2 实测是主考**。
|
||||
> 状态:2026-06-11 开工(双 lane 并行)。
|
||||
> **v1.1(2026-06-11)**:Codex 5.5 Xhigh 对抗评审整改——P0×6 全修(SDK 接线细则/S2 七锚点/真输入取证/CSP 硬证据/Phaser 版本统一 4.1/serve 形态钉死)+ P1×5(outcome spike-local/SIZES 三列/依赖锁定/并发模型改暂存目录/R4 口径回填上游)+ 评分表加 helper 成本行。
|
||||
|
||||
---
|
||||
|
||||
## 1. 范围与边界
|
||||
|
||||
**做**:两个自包含 spike lane(Runner v2 雏形 + 游戏 + 真 SDK 接线 + 严格 CSP)+ 体积/S2/帧率/CJK 实测 + 计分表。
|
||||
**不做(红线)**:不触碰 `game-studio/src`、`contracts/`、编排器、后端任何生产路径;不接 feed/发布链;不做编排器 player 策略;不做微信导出。spike 目录整体可弃置(回滚 = 删目录)。
|
||||
**不做(红线)**:不触碰 `game-studio/src`、`contracts/`、编排器、后端任何生产路径;不接 feed/发布链;不做微信导出。spike 目录可弃置(回滚 = 删目录)。
|
||||
|
||||
**布局**(两 lane 完全自包含、零共享文件——并行零冲突):
|
||||
**布局**(两 lane 完全自包含、零共享文件):
|
||||
|
||||
```
|
||||
docs/agent-specs/2026-06-11-tier1-engine-spike/
|
||||
├── lane-littlejs/ # Vite 项目:runner 页 + 游戏 + SDK 副本 + host 测量页
|
||||
│ ├── host.html # 测量宿主:起 iframe(src=runner)、收 postMessage 生命周期、console 打 JSON 时间线
|
||||
│ ├── src/ index.html vite.config.ts ...
|
||||
│ ├── REPORT.md # 自检报告(见 §5 交付物)
|
||||
│ └── SIZES.md # bundle raw/gz/br 实测
|
||||
└── lane-phaser/ # 同构(Phaser 3.90,理由:训练语料成熟;v4 unsafe-eval grep 作为钉子①另行取证)
|
||||
├── lane-littlejs/ # littlejsengine(1.18.x 最新,锁精确版本)
|
||||
└── lane-phaser/ # phaser@4.1.x(版本裁定见 §2.1)
|
||||
├── host.html # 测量宿主:起 iframe(src=runner dist URL)、收生命周期、host 时钟打 JSONL 时间线
|
||||
├── src/ index.html vite.config.ts package.json package-lock.json
|
||||
├── serve.cjs # 固定 serve(§6.1)
|
||||
├── evidence/ # 截图/时间线 JSONL/输入轨迹日志
|
||||
├── REPORT.md # 自检报告 + 好玩工时账 + API 摩擦记录
|
||||
└── SIZES.md # 三列体积实测(§5.1)
|
||||
```
|
||||
|
||||
## 2. 共同游戏规格——「月光捕手」(两 lane 逐项一致,保公平对比)
|
||||
### 2.1 Phaser 版本裁定(P0-5 整改)
|
||||
|
||||
**lane 用 `phaser@4.1.x` 并全程对它计分**(B1 体积/S2/CSP/unsafe-eval grep 同一对象)。理由:终裁选的是「现在开始采用」的引擎,2026-06 选 3.90 = 主动买入 3→4 断代迁移债,违背重设计前提;v4 语料薄的风险恰由「可生成性」镜头实测(按 Phaser 官方 Claude 教程方法论喂 v4 官方示例)。**备援**:若 v4 挂严格 CSP 硬门(unsafe-eval 不可 patch 绕过),降级 `phaser@3.90` 重测并在终裁包注明。
|
||||
|
||||
## 2. 共同游戏规格——「月光捕手」(两 lane 逐项一致)
|
||||
|
||||
- **玩法**:底部捕手(pointer 水平拖动)接住下落的星星。接住 +1 分;漏接 -1 命(共 3 命)。
|
||||
- **难度爬升**:下落速度与生成频率随时间线性上升(30s 内速度 ×2)。
|
||||
- **终局(好玩基线·失败态首次落地)**:得分 ≥30 → 胜;命数归零 → 败。两者皆发 `game_end`,data = `{ score, completed: true, duration_ms, outcome: 'win'|'lose' }`(**outcome 为框架新增 additive 字段,spike 先行验证**)。
|
||||
- **juice 底线清单(验收硬项)**:① 接住=粒子爆发+捕手缩放回弹(缓动);② 接住/漏接/终局三类程序化音效(LittleJS=ZzFX 原生;Phaser lane 允许内联 zzfx.js ~1KB,计入其体积——这是 Phaser 生产形态的真实做法);③ 漏接/死亡=屏幕震动;④ 胜/败各有 ≥1s 终局演出(粒子+文案)。
|
||||
- **CJK 固定文案(真机渲染测试用,两 lane 一字不差)**:标题「月光捕手」、计分「星星」、命「心」、败「游戏结束·得分 X」、胜「通关!」。
|
||||
- **零外部资产**:图形全程序化绘制(形状/程序纹理),无 image/audio 文件——既是 CSP 最严测试,也是「资产零字节」路线验证。
|
||||
- **终局(失败态首次落地)**:得分 ≥30 → 胜;命数归零 → 败。两者皆发 `game_end`,data = `{ score, completed: true, duration_ms, outcome: 'win'|'lose' }`。**`outcome` 为 spike-local 先行字段**(P1-1:契约 #3/#4 补丁随 W-T1b 走契约先行流程,本 spike 不改 `contracts/`)。
|
||||
- **juice 底线清单(验收硬项)**:① 接住=粒子爆发+捕手缩放回弹(缓动);② 接住/漏接/终局三类程序化音效(LittleJS=ZzFX 原生;Phaser lane 允许内联 zzfx ~1KB,计入 helpers 列);③ 漏接/死亡=屏幕震动;④ 胜/败各 ≥1s 终局演出(粒子+文案)。
|
||||
- **CJK 固定文案**:「月光捕手」「星星」「心」「游戏结束·得分 X」「通关!」。
|
||||
- **零外部资产**:图形全程序化(形状/程序纹理),无 image/audio 文件。
|
||||
|
||||
## 3. 技术契约(两 lane 同口径)
|
||||
|
||||
1. **SDK 真接**:从 `game-studio/src/host/sdk/index.ts` 逐字复制 `createWanxiangSDK` 工厂进 lane(文件头注明出处与日期),channel/信封/生命周期事件名与契约 #3 一致;host.html 收 `game_loaded`/`game_start`/`game_end` 并以 `performance.now()` 打 JSON 时间线(S2 测量原料)。
|
||||
2. **严格 CSP(蓝图口径,比现行更紧)**:runner 的 index.html 带 meta CSP `default-src 'none'; script-src 'self'; style-src 'unsafe-inline'; img-src data: blob:; connect-src 'none'`——**console 零 CSP violation 是硬门**(直接验证钉子④;Phaser 若触发 unsafe-eval 即原样记录,不许绕过 CSP 放宽)。
|
||||
3. **引擎 URL 化交付(KD4)**:引擎与游戏打进 runner 的 Vite bundle,iframe 以 `src=URL` 加载(不是 srcdoc)——编译缓存测量的前提。
|
||||
4. **暂停**:页面 `visibilitychange` → 引擎 pause(LittleJS `setPaused` / Phaser scene pause),host 可验证。
|
||||
### 3.1 SDK 接线细则(P0-1 整改)
|
||||
|
||||
## 4. 环境与流程铁律
|
||||
每 lane 落一个 `src/sdk-bridge.ts`,内容 =
|
||||
1. **逐字复制** `game-studio/src/host/sdk/index.ts` 的 `createWanxiangSDK` 工厂函数体(文件头注明出处+日期;类型 import 仅作本地最小重声明,不跨仓引用);
|
||||
2. **重建两原语**(照 `game-studio/src/host/inject.ts:67-91` 范式重写):`postToHost(type,payload,requestId)` = 按契约 #3 信封 `{channel:'wanxiang-game-sdk', direction:'game_to_host', traceId, payload}` 发 `parent.postMessage`;`onHostMessage(handler)` = 过滤 channel+direction 的 message 监听;
|
||||
3. runner 启动时 `sdk.init({gameId:'spike', versionId:'<lane>', traceId})` → 生命周期经真信封发 host。
|
||||
host.html 按 channel+direction 过滤收包(origin 同源校验),**所有时间锚点以 host 收包时刻为准(单时钟)**。
|
||||
|
||||
- **构建一律 mini-desktop**(本机严禁 npm install/build,记忆 `internal-build-infra-servers`):本地写码 → `git pull --rebase && git push`(只动自己 lane 目录,禁止越界改文件)→ ssh mini-desktop 拉取构建。配方见 `.agents/skills/staging-ops.md`。
|
||||
- **目录命名禁用 `build/`**(根 .gitignore 历史坑会吞源码,记忆 `gitignore-swallows-frontend-source`);Vite 产物用默认 `dist/`(不入库)。
|
||||
- 浏览器/CDP 取证一律 mini-desktop(本机禁 chrome,exit 144 签名)。
|
||||
- 提交规范:`feat(t1-spike): <lane> ...`;两 lane 各自提交,push 前 rebase。
|
||||
### 3.2 S2 时间线七锚点(P0-2 整改)
|
||||
|
||||
host.html 输出 JSONL(evidence/timeline-*.jsonl),锚点全部 = host `performance.now()`:
|
||||
`t_nav`(设 iframe.src) → `t_runner_boot`(runner 首脚本执行 beacon) → `t_sdk_ready` → `t_first_paint`(游戏场景首次 canvas 绘制完成 beacon) → `t_input_bound`(输入监听已挂且主循环在跑 beacon) → `t_game_loaded`(lifecycle) → `t_game_start`(首次真实输入后 lifecycle)。
|
||||
**S2 = t_nav → t_input_bound**(「可玩」=可响应真实输入;`game_loaded` 不得早于 `t_input_bound` 发出——发早即假绿,自检门检查顺序)。
|
||||
|
||||
### 3.3 沙箱与 CSP 硬证据(P0-4 整改)
|
||||
|
||||
- host iframe 属性钉死:`sandbox="allow-scripts allow-same-origin"`(对齐生产 GamePlayer 姿态)。
|
||||
- runner `index.html` meta CSP:`default-src 'none'; script-src 'self'; style-src 'unsafe-inline'; img-src data: blob:; connect-src 'none'`;serve.cjs 同时发同串 CSP 响应头(双保险)。
|
||||
- **取证**:runner 内挂 `securitypolicyviolation` 监听计数并经 beacon 上报(必须恒 0);CDP 侧汇 `Log.entryAdded` 的 CSP/violation 条目(必须 0 条);console 零未捕获异常。Phaser 若触发 unsafe-eval **原样记录定位到行**,禁止放宽 CSP 绕过。
|
||||
|
||||
### 3.4 暂停
|
||||
|
||||
页面 `visibilitychange` → 引擎 pause(LittleJS `setPaused` / Phaser scene pause),host 可观测(beacon)。
|
||||
|
||||
## 4. 环境与并发模型(P1-3/P1-5 整改:spike 专用流程,git 全程主会话)
|
||||
|
||||
- **lane agent 不跑任何 git 命令**。开发即在 **mini-desktop 暂存目录** `/root/spike-t1/<lane>/`(非 staging 克隆,严禁动 staging 服务/克隆):ssh 过去 scaffold/编码/构建/自检一体完成(该机允许 npm 与 headless chrome)。
|
||||
- 收口时 rsync 源码回本仓 lane 目录(exclude `node_modules/`、`dist/`),由**主会话**验证后统一 commit/push。
|
||||
- **依赖锁定**:`package.json` 钉精确版本(littlejsengine / phaser / vite / zzfx),`package-lock.json` 必须随源码回灌;重建只许 `npm ci`。
|
||||
- 本机(6c6g)严禁 npm/chrome(OOM/exit144 红线);目录命名禁用 `build/`(gitignore 历史坑)。
|
||||
|
||||
## 5. 交付物与 lane 自检门(每 lane 收口条件)
|
||||
|
||||
1. mini-desktop 构建绿;`SIZES.md` 报 runner JS bundle 的 raw/gzip/brotli 实测字节(对照 B1:gz≤350KB/raw≤1.5MB)。
|
||||
2. mini-desktop headless Chrome 实跑:console **零 CSP violation、零未捕获异常**;生命周期 JSON 时间线完整(loaded→start→end);胜、败两条路径各通关一次(outcome 两值都出现)。
|
||||
3. CJK 截图留档(标题/计分/终局文案清晰渲染)。
|
||||
4. `REPORT.md`:juice 清单逐项自评 + **好玩工时账**(agent 轮次/实际耗时/踩坑清单——评分卡「好玩工时 30 分」「可生成性 25 分」的原料)+ 引擎 API 摩擦记录。
|
||||
### 5.1 SIZES.md 三列(P1-2 整改)
|
||||
|
||||
同一命令口径(`gzip -9 -c | wc -c`、`brotli -q 11 -c | wc -c`)报三列:**engine-only**(引擎库产物单独字节)/ **runner-total**(dist 全 JS)/ **helpers**(zzfx 等内联辅助库)。对照 B1(引擎列 gz≤350KB/raw≤1.5MB)。
|
||||
|
||||
### 5.2 真实输入取证(P0-3 整改,承接项目取证纪律)
|
||||
|
||||
胜、败两条路径**只许 CDP `Input.dispatchMouseEvent`/`dispatchTouchEvent` 真实输入达成**(拖动捕手真接/真漏),**禁止 evaluate 篡改游戏内部状态、禁止直接注入生命周期事件**。证据落 evidence/:输入轨迹日志(每次 dispatch 的坐标+时间)、分数/命数递进截图序列(≥3 帧)或 canvas hash 序列、终局画面截图(胜/败各一)、完整 JSONL 时间线(含 outcome 两值)。
|
||||
|
||||
### 5.3 自检门清单
|
||||
|
||||
1. mini-desktop `npm ci && npm run build` 绿;SIZES.md 三列落档。
|
||||
2. `serve.cjs` 起服 → headless chrome 实跑:CSP violation 计数=0(beacon+CDP 双源)、零未捕获异常、锚点顺序合法(`t_game_loaded ≥ t_input_bound`)。
|
||||
3. 胜/败双路径按 §5.2 真输入各通关一次,证据齐。
|
||||
4. CJK 三处文案截图清晰。
|
||||
5. REPORT.md:juice 清单逐项自评 + 好玩工时账(agent 轮次/耗时/踩坑)+ 引擎 API 摩擦记录(「可生成性」计分原料)。
|
||||
|
||||
## 6. Phase 2 · 测量与终裁(双 lane 落地后,主会话执行)
|
||||
|
||||
- **S2 协议**(CDP @mini-desktop,CPU 4× throttle + 网络 5Mbps 模拟千元机+4G):每 lane 测 冷开(清缓存)/二开/三开 的「导航→game_loaded→首帧」耗时曲线——三开 vs 冷开差值即编译缓存收益(钉子⑤的 Chromium 代理测量;XWeb 真机留残差声明)。
|
||||
### 6.1 serve 形态钉死(P0-6 整改)
|
||||
|
||||
只测 `vite build`(`base:'./'`)产物:lane 内 `serve.cjs`(node 单文件静态服务)固定端口(littlejs=4311 / phaser=4312),响应头 = hashed assets `Cache-Control: public,max-age=31536000,immutable`、HTML `no-cache`。三开协议:CDP 清缓存 → 同 URL 冷开/二开/三开,每开记完整七锚点时间线。
|
||||
|
||||
### 6.2 测量项
|
||||
|
||||
- **S2 曲线**:CPU 4× + 网络 5Mbps(千元机+4G 代理画像)下冷开/二开/三开的 `t_nav→t_input_bound`;三开 vs 冷开差值 = 编译缓存收益(钉子⑤ 的 Chromium 代理;XWeb 真机留残差声明)。
|
||||
- 帧率:juice 最密时刻 performance trace ≥30fps@4×;内存快照对照 B4(≤150MB)。
|
||||
- 钉子①:grep Phaser v4 dist 的 `new Function`(独立取证,不依赖 lane)。
|
||||
- 计分表(评审版 §5 评分卡)→ **终裁包交创始人拍板**。
|
||||
- 钉子①:grep `phaser@4.1` dist 的 `new Function`/`eval`(独立取证)。
|
||||
- **计分表**(评审版 §5 评分卡)+ **helper 依赖成本行**(建议-1:单列 zzfx 等外挂能力成本,不与引擎原生能力混计)→ 终裁包交创始人。
|
||||
|
||||
## 7. 残差与诚实边界
|
||||
|
||||
- 微信 XWeb/真机不可达(无真机环境):Chromium 节流为代理,终裁包须列「真机残差」清单。
|
||||
- spike 的 Runner 雏形是草案——获胜后进 game-studio 正式建设(W-T1b)时按生产标准重写,spike 代码不直接晋升。
|
||||
- 微信 XWeb/真机不可达:Chromium 节流为代理,终裁包列「真机残差」清单。
|
||||
- spike Runner 雏形是草案——获胜后 W-T1b 按生产标准重写,spike 代码不直接晋升。
|
||||
|
||||
@ -206,6 +206,8 @@ flowchart TD
|
||||
|
||||
## 9. 待拍板项
|
||||
|
||||
> **✅ 拍板落账(2026-06-11,创始人「continue」沿推荐路径全采纳)**:Q1=(b) top-2 spike(执行单 HJ-T1-SPIKE-001 in flight,Phaser 版本统一 4.1 见执行单 §2.1)/ Q2=捆绑好玩基线(`outcome` 字段 spike-local 先行,契约补丁随 W-T1b 契约先行流程)/ Q3=spike 先行与现队列并行,终裁后重锁完成线。下表保留为决策历史。
|
||||
|
||||
| # | 问题 | 选项 | 我的倾向 |
|
||||
|---|---|---|---|
|
||||
| Q1 | 引擎裁决方式 | (a) 直接拍 LittleJS(研究已足够一边倒)/ (b) **top-2 spike(LittleJS vs Phaser)实测终裁** / (c) 三款全 spike | **(b)**——KAPLAY/自研+微库纸面淘汰已稳;LittleJS 两处实证空白(CJK 真机/agent 摩擦)与 Phaser 两座山(unsafe-eval/编译缓存下的 S2 稳态)只有实测能定(tree-shake 已随 B1 放宽档降为优化手段),且 spike 顺产 Runner 底座+模板五,不是纯评测成本 |
|
||||
|
||||
@ -33,7 +33,7 @@ topic: tier1-runtime-constraints
|
||||
- R1. (S1) feed 首屏 < 3s——既有红线保留,比 Facebook Instant Games 的 <5s 更严,属合理自我加码。
|
||||
- R2. (S2) 点卡→可玩:常态(引擎已缓存)≤2s;全新设备首次 ≤3.5s。
|
||||
- R3. (S3) 参考机 juice 全开稳定 ≥30fps;P95 设备走自动降级档,不承诺帧率。
|
||||
- R4. (S4) `game_load_failed` 率 <2%;运行时 `game_error`(含 OOM)率 <0.5%。
|
||||
- R4. (S4) `game_load_failed` 率 <2%;运行时 `game_error`(含 OOM)率 <0.5%。口径:事件源=既有遥测/生命周期事件;分母=滚动 7 天游戏加载总次数;排除鉴权类 4xx;按模板与设备档分桶观测。
|
||||
- R5. SLO 用现有生命周期事件时间戳测量(`game_loaded`/`game_start`),与 W4 单位经济埋点波合流;上线后以真实设备分布校准 KD1。
|
||||
|
||||
**预算层(工程入场券,进 CI/验收门强制)**
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user