3b-B e2e(mini-desktop 真跑·证据 wg1/gen-worker/evidence-3bB/): ✅ P0-P4 安全面+全自动管线=真证闭合(铁证 backend-callback-hmac.log + p4*.txt): - HMAC 双向证:缺签名头→HTTP 401 / 错签(deadbeef≠482147b5)→HTTP 401 / 正签→过门(走到下游"任务不存在"非401) =关死 /dify/callback-internal 裸 @PermitAll 缺口 - 全自动派发链真通:执行器认领 taskId→dispatchGeneric 投 §6.1 job→worker 真生成(真烧模型)→ HMAC 签名回调→验签通过→handleCallback 落库(gen-9303/9304/9305 三轮齐全) ❌ P5 一句话真生成=未达终局:三款全 nine_gate_failed。但截图(gen-9303-after-play.png)证生成 真出 on-theme 可渲可动的「点击小怪物」游戏(Score/3s 倒计时/多彩怪物 monsters/targetScore=12), 仅点击→计分坏(Score 仍 0)→九门确定性地板正确拦截「看着像但玩不了」=质量门正确履职、拒发不可玩。 判:L0 交付(管线+安全+质量门)已完成且证;缺=便宜模型把「点击命中→计分」写对=L1 生成域 (prompt 点击坑+模型档+player/calibration,run_studio 自修 max_repairs 未救回)→转 L1 v3 迭代。 附带:serve-and-play.sh 跨平台 Chrome 探测(CHROME_BIN 覆盖>Linux /usr/bin>macOS>PATH 兜底, Linux 在前因 mini-desktop x86 是权威 e2e 机);p3bB_*.sql 发布四态/翻 feed 桩。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
317 lines
8.5 KiB
JSON
317 lines
8.5 KiB
JSON
{
|
||
"game_id": "gen-9304",
|
||
"stage": "stage1",
|
||
"pass": false,
|
||
"repairs": 5,
|
||
"player_rounds_used": 0,
|
||
"design_text": "【轻量接球游戏·设计稿】\n\n1. **核心机制**:手指左右滑动,控制底部挡板接住从顶部随机位置下落的小球。每接住一颗得1分,漏掉则立即结束游戏,追求最高分。\n\n2. **胜负条件**: \n - 输:漏掉任意一颗小球,游戏结束(失败态)。 \n - 赢:无限模式,分数可不断累积,目标为获得更高分数(无固定胜利,仅追求高分)。\n\n3. **操作**:触摸滑动手指,挡板 x 坐标平滑跟随手指 x,限制在屏幕左右边缘(0~390px 内)。无其他按键。\n\n4. **关键数值**(逻辑像素 390×844): \n - 挡板:宽 120px,高 20px,底部 y = 814(距离底边 30px)。 \n - 小球:半径 10px;初始下落速度 150px/s;每得 5 分速度提升 10%。 \n - 生成间隔:随机 0.5~1.5s;x 范围 [20,370]。\n\n5. **juice 反馈**: \n - 接住小球:播放“叮”声效(引擎音频),小球缩小的动画。 \n - 漏球:引擎震动(shake 0.2s),短暂红屏,低沉失败音。\n\n6. **画面要点**: \n - 背景:从上到下渐变色(深蓝→浅蓝),铺满。 \n - 挡板:白色半透明圆角矩形。 \n - 小球:随机亮色(红/黄/青)。 \n - HUD:顶部分数显示(白色大字号,带轻微的缩放脉冲动画)。\n\n7. **可观测进展**:分数实时增加(每接住一次 +1)。漏球后 phase 从 \"playing\" 切换为 \"gameover\",分数锁定并显示“最终分数”及重玩按钮。\n\n```gatespec\n{\n \"exportState\": [\"phase\",\"score\",\"ballPosX\",\"paddleX\"],\n \"driver\": {\"type\":\"paddle-intercept\",\"ballPath\":\"ballPosX\",\"paddleY\":814},\n \"controlCheck\": {\"paddlePath\":\"paddleX\",\"tapXs\":[50,340]},\n \"assertAfterPlay\": [{\"path\":\"score\",\"op\":\"increased\",\"why\":\"接住小球得分\"}],\n \"expectLatch\": true\n}\n```",
|
||
"gatespec": {
|
||
"exportState": [
|
||
"phase",
|
||
"score",
|
||
"ballPosX",
|
||
"paddleX"
|
||
],
|
||
"driver": {
|
||
"type": "paddle-intercept",
|
||
"ballPath": "ballPosX",
|
||
"paddleY": 814
|
||
},
|
||
"controlCheck": {
|
||
"paddlePath": "paddleX",
|
||
"tapXs": [
|
||
50,
|
||
340
|
||
]
|
||
},
|
||
"assertAfterPlay": [
|
||
{
|
||
"path": "score",
|
||
"op": "increased",
|
||
"why": "接住小球得分"
|
||
}
|
||
],
|
||
"expectLatch": true
|
||
},
|
||
"attempts": [
|
||
{
|
||
"attempt": 0,
|
||
"role": "code",
|
||
"model": "deepseek-v4-flash",
|
||
"stage_fail": "seven_gate",
|
||
"usage": {
|
||
"in": 4060,
|
||
"out": 6004
|
||
},
|
||
"seven_gate_pass": false,
|
||
"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": 1,
|
||
"role": "fix",
|
||
"model": "deepseek-v4-flash",
|
||
"stage_fail": "seven_gate",
|
||
"usage": {
|
||
"in": 4278,
|
||
"out": 5191
|
||
},
|
||
"seven_gate_pass": false,
|
||
"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": 2,
|
||
"role": "fix",
|
||
"model": "deepseek-v4-flash",
|
||
"stage_fail": "seven_gate",
|
||
"usage": {
|
||
"in": 4189,
|
||
"out": 9126
|
||
},
|
||
"seven_gate_pass": false,
|
||
"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,
|
||
"role": "fix",
|
||
"model": "deepseek-v4-flash",
|
||
"stage_fail": "seven_gate",
|
||
"usage": {
|
||
"in": 4189,
|
||
"out": 7909
|
||
},
|
||
"seven_gate_pass": false,
|
||
"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": true
|
||
}
|
||
},
|
||
{
|
||
"attempt": 4,
|
||
"role": "fix",
|
||
"model": "deepseek-v4-flash",
|
||
"stage_fail": "seven_gate",
|
||
"usage": {
|
||
"in": 4187,
|
||
"out": 6430
|
||
},
|
||
"seven_gate_pass": false,
|
||
"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": 5,
|
||
"role": "fix",
|
||
"model": "deepseek-v4-flash",
|
||
"stage_fail": "seven_gate",
|
||
"usage": {
|
||
"in": 4189,
|
||
"out": 6097
|
||
},
|
||
"seven_gate_pass": false,
|
||
"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": true
|
||
}
|
||
}
|
||
],
|
||
"seven_gate_verdict": {
|
||
"gameId": "gen-9304",
|
||
"url": "http://localhost:4320/games/_wg1-gen/gen-9304/index.html",
|
||
"ts": null,
|
||
"guards": {
|
||
"A_boot": {
|
||
"pass": true
|
||
},
|
||
"C_frame": {
|
||
"pass": true,
|
||
"f0": 60,
|
||
"f1": 90,
|
||
"delta": 30
|
||
},
|
||
"I_control": {
|
||
"pass": false,
|
||
"paddlePath": "paddleX",
|
||
"results": [
|
||
{
|
||
"tapX": 50,
|
||
"before": 195,
|
||
"after": 195,
|
||
"moved": 0,
|
||
"distToTarget": 145,
|
||
"pass": false
|
||
},
|
||
{
|
||
"tapX": 340,
|
||
"before": 195,
|
||
"after": 195,
|
||
"moved": 0,
|
||
"distToTarget": 145,
|
||
"pass": false
|
||
}
|
||
]
|
||
},
|
||
"D_render": {
|
||
"pass": true,
|
||
"bright": 1091360,
|
||
"maxCh": 255
|
||
},
|
||
"E_live": {
|
||
"pass": true,
|
||
"distinctStates": 31,
|
||
"samples": 31
|
||
},
|
||
"B_uncaught": {
|
||
"pass": true,
|
||
"uncaught": []
|
||
},
|
||
"F_wiring": {
|
||
"pass": true,
|
||
"callCount": 89,
|
||
"sample": [
|
||
"particles.spawnEmitter",
|
||
"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",
|
||
"particles.spawnEmitter"
|
||
],
|
||
"expected": []
|
||
},
|
||
"G_input": {
|
||
"pass": true,
|
||
"inputHash": "2f4267bc",
|
||
"controlHash": "1ceee3f7",
|
||
"atFrame": 1176,
|
||
"ctrlFrame": 1181
|
||
},
|
||
"H_progress": {
|
||
"pass": true,
|
||
"checks": [
|
||
{
|
||
"path": "score",
|
||
"op": "increased",
|
||
"before": 0,
|
||
"after": 2,
|
||
"pass": true,
|
||
"why": "接住小球得分"
|
||
}
|
||
],
|
||
"latch": {
|
||
"pass": true,
|
||
"dwelledMs": 600,
|
||
"after": "gameover",
|
||
"reason": ""
|
||
},
|
||
"state0": {
|
||
"phase": "playing",
|
||
"score": 0,
|
||
"remaining": 1,
|
||
"progress": null,
|
||
"gameoverReason": "",
|
||
"ballPosX": 210.06992567097768,
|
||
"paddleX": 195
|
||
},
|
||
"state1": {
|
||
"phase": "gameover",
|
||
"score": 2,
|
||
"remaining": 0,
|
||
"progress": null,
|
||
"gameoverReason": "ball_lost",
|
||
"ballPosX": -1,
|
||
"paddleX": 195
|
||
}
|
||
}
|
||
},
|
||
"pass": false,
|
||
"notes": []
|
||
},
|
||
"player": null,
|
||
"tokens": {
|
||
"prompt": 25813,
|
||
"completion": 42252
|
||
},
|
||
"tokens_by_model": {
|
||
"deepseek-v4-flash": [
|
||
25813,
|
||
42252
|
||
]
|
||
},
|
||
"cost": {
|
||
"by_model": {
|
||
"deepseek-v4-flash": {
|
||
"in": 25813,
|
||
"out": 42252,
|
||
"rmb": 0.08738
|
||
}
|
||
},
|
||
"total_rmb": 0.08738,
|
||
"gate_rmb": 0.15
|
||
},
|
||
"wall_s": 785.7,
|
||
"models": {
|
||
"design": "deepseek-v4-flash",
|
||
"code": "deepseek-v4-flash",
|
||
"fix": "deepseek-v4-flash",
|
||
"player_vision": "MiniMax-M3",
|
||
"player_text": "deepseek-v4-flash"
|
||
}
|
||
} |