lili a205929f15 feat(wg1-gen): L1 对齐官方 latch 壳 + 确定性手感门 + player 校准(founder 锚揭天花板)
W-G1 生成主线 L1 worker 本轮收口(lane wg1/gen-worker;便宜模型 + harness 门兜底,HJ-GEN-001):

机制/契约
- 可测性红线 + P0 latch 终态:生成工厂导出 _forensicsView().state().phase
  (booting|playing|gameover,进 gameover 恒驻留、禁自动重开),对齐官方 P3 契约;
  flash 实测能遵此契约(v4/v5 latch 驻留 ✓)。
- 套官方 generic 壳:worker 产 generated-factory.js → entry-bundle 用 buildGenericHostConfig
  装配(=官方 entry-generic.js 的取证超集,多透传 recHook 供 F 门)→ esbuild __GameBundle。

真玩门(七门→九门)
- 门 H 机制+latch:assertAfterPlay 进展断言(剩余↓ 等,证非空心) + expectLatch 真玩到
  gameover 且驻留。
- 门 I 控制手感:controlCheck 连点验控制体平滑逼近(逮"一格一跳"/卡死)。
- 适配性真玩 driver:读 state 实体位置自动接球,解"盲打固定坐标打不动技巧游戏"的
  H 假阴性(创始人亲玩 + v4/v5 regen 双重实证)。

质量评估(player 校准)
- studio(design/code/fix/player panel on AgentScope 2.0.1) + calibrate.py 校准 harness。
- 创始人亲玩锚揭结构性天花板:便宜 player(静态截图+数据)判不出物理/碰撞/控制手感
  (把碰撞有问题的 pro 高估为最佳);gate-H 盲打会假阴性;founder/人锚不可替代。
  "上下文是杠杆"实证:接地使成本 −50%、修复轮次 −80%;rubric 锚定使 player MAE 1.25→0.75。

含从 dev/2.0.0 @3108009 拉入的官方 P3 通用装载壳(_generic/ + generic-host-config.js + 双 spec)
作 L1 套壳靶(为 lane 自洽,内容与 dev/2.0.0 一致,后续 merge 自去重)。

未提交:AGENTS.md/.gitignore 的 localagents 改动(非本人);生成产物游戏目录(构建 artifact)。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 04:58:25 -07:00

253 lines
6.1 KiB
JSON

{
"game_id": "breakout-flash-v5",
"model": "deepseek-v4-flash",
"pass": false,
"retries": 3,
"attempts": [
{
"attempt": 0,
"stage": "play",
"errors": [],
"usage": {
"prompt_tokens": 4017,
"completion_tokens": 12376,
"total_tokens": 16393,
"wall_s": 134.487,
"id": "a5e9a083-492d-4160-b9b0-5b71eced7260",
"finish_reason": "stop"
},
"play_pass": false,
"verdict_guards": {
"A_boot": true,
"C_frame": true,
"I_control": true,
"D_render": true,
"E_live": true,
"B_uncaught": true,
"F_wiring": true,
"G_input": true,
"H_progress": false
}
},
{
"attempt": 1,
"stage": "play",
"errors": [],
"usage": {
"prompt_tokens": 4149,
"completion_tokens": 6604,
"total_tokens": 10753,
"wall_s": 65.824,
"id": "868072d4-cd1e-43bb-a2ef-30ca4bb97caa",
"finish_reason": "stop"
},
"play_pass": false,
"verdict_guards": {
"A_boot": true,
"C_frame": true,
"I_control": false,
"D_render": true,
"E_live": true,
"B_uncaught": true,
"F_wiring": true,
"G_input": true,
"H_progress": false
}
},
{
"attempt": 2,
"stage": "play",
"errors": [],
"usage": {
"prompt_tokens": 4245,
"completion_tokens": 7460,
"total_tokens": 11705,
"wall_s": 69.351,
"id": "e21364b2-d252-4faf-b13c-ef2c0a4ebb7e",
"finish_reason": "stop"
},
"play_pass": false,
"verdict_guards": {
"A_boot": true,
"C_frame": true,
"I_control": true,
"D_render": true,
"E_live": true,
"B_uncaught": true,
"F_wiring": true,
"G_input": true,
"H_progress": false
}
},
{
"attempt": 3,
"stage": "play",
"errors": [],
"usage": {
"prompt_tokens": 4150,
"completion_tokens": 7543,
"total_tokens": 11693,
"wall_s": 78.659,
"id": "ed11ed20-dfbf-43c7-bf62-6683ab7b1b17",
"finish_reason": "stop"
},
"play_pass": false,
"verdict_guards": {
"A_boot": true,
"C_frame": true,
"I_control": false,
"D_render": true,
"E_live": true,
"B_uncaught": true,
"F_wiring": true,
"G_input": true,
"H_progress": false
}
}
],
"factory_path": "game-runtime/games/_wg1-gen/breakout-flash-v5/generated-factory.js",
"bundle_path": "game-runtime/games/_wg1-gen/breakout-flash-v5/bundle.iife.js",
"verdict": {
"gameId": "breakout-flash-v5",
"url": "http://localhost:4327/games/_wg1-gen/breakout-flash-v5/index.html",
"ts": null,
"guards": {
"A_boot": {
"pass": true
},
"C_frame": {
"pass": true,
"f0": 51,
"f1": 82,
"delta": 31
},
"I_control": {
"pass": false,
"paddlePath": "paddle.x",
"results": [
{
"tapX": 50,
"before": 155,
"after": 16.12409472465515,
"moved": -138.87590527534485,
"distToTarget": 33.87590527534485,
"pass": true
},
{
"tapX": 340,
"before": 16.12409472465515,
"after": 249.47618775739102,
"moved": 233.35209303273587,
"distToTarget": 90.52381224260898,
"pass": false
}
]
},
"D_render": {
"pass": true,
"bright": 160281,
"maxCh": 255
},
"E_live": {
"pass": true,
"distinctStates": 11,
"samples": 11
},
"B_uncaught": {
"pass": true,
"uncaught": []
},
"F_wiring": {
"pass": true,
"callCount": 495,
"sample": [
"particles.spawnEmitter",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx",
"audio.synth.synthSfx"
],
"expected": [
"particles.",
"audio.synth"
]
},
"G_input": {
"pass": true,
"inputHash": "19eb47b9",
"controlHash": "f0e8788b",
"atFrame": 530,
"ctrlFrame": 531
},
"H_progress": {
"pass": false,
"checks": [
{
"path": "remaining",
"op": "decreased",
"before": 30,
"after": 30,
"pass": false,
"why": "适配性真玩(挡板自动接球)下击碎砖块→剩余下降;接不住/碰撞失效则不降"
}
],
"latch": {
"pass": true,
"dwelledMs": 600,
"after": "gameover",
"reason": ""
},
"state0": {
"phase": "playing",
"score": 0,
"remaining": 30,
"progress": 0,
"gameoverReason": "",
"ball": {
"x": 111.00585468634965,
"y": 515.7535326413795,
"vx": -98.81664154547158,
"vy": -346.1723145395567
},
"paddle": {
"x": 155,
"y": 820,
"w": 80
}
},
"state1": {
"phase": "gameover",
"score": 0,
"remaining": 30,
"progress": 0,
"gameoverReason": "ball_lost",
"ball": {
"x": 21.229435960708493,
"y": 836.175170770526,
"vx": -206.15460802245252,
"vy": 295.1275615578947
},
"paddle": {
"x": 251.78406952933614,
"y": 820,
"w": 80
}
}
}
},
"pass": false,
"notes": []
},
"tokens": {
"prompt": 16561,
"completion": 33983
},
"request_ids": [
"a5e9a083-492d-4160-b9b0-5b71eced7260",
"868072d4-cd1e-43bb-a2ef-30ca4bb97caa",
"e21364b2-d252-4faf-b13c-ef2c0a4ebb7e",
"ed11ed20-dfbf-43c7-bf62-6683ab7b1b17"
]
}