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>
256 lines
7.6 KiB
JSON
256 lines
7.6 KiB
JSON
{
|
||
"game_id": "gen-9305",
|
||
"stage": "stage1",
|
||
"pass": false,
|
||
"repairs": 5,
|
||
"player_rounds_used": 0,
|
||
"design_text": "## 设计稿:Simon Says(记忆序列)\n\n**1. 核心机制** \n电脑随机生成一组颜色序列并逐个闪烁提示,玩家需按相同顺序点击对应彩色按钮。每轮正确复现后,序列长度 +1,进入下一关。错误点击则游戏结束。\n\n**2. 胜负条件** \n- 胜:完成当前关(全部正确点击)→ 进入下一关(序列加长),无最终胜利,分数无限递增。 \n- 负:点击顺序与电脑序列不匹配 → 立即 gameover(失败态),驻留界面,分数固定。\n\n**3. 操作** \n触摸点击按钮(逻辑像素 390×844 竖屏)。按钮为 4 个等大圆形,均匀分布在屏幕下半区(半径约 60,间距 30),分别渲染红/绿/蓝/黄色。\n\n**4. 关键数值** \n- 初始序列长度:3 \n- 每次提示单个按钮闪烁时间:0.5s,间隔 0.2s \n- 玩家点击超时容限:无(不设倒计时,未点击不算错,但不推进) \n- 难度梯度:每关序列长度 +1,连续正确累加(最大 20+)\n\n**5. Juice 反馈** \n- 提示阶段:按钮高亮 + 同时播放对应短促音高(C/E/G/B4) \n- 玩家点击正确:按钮瞬间放大 1.1 倍 + 点击音效(短嘀声) \n- 点击错误:屏幕震动 0.1s + 低沉错误音(引擎必备)\n\n**6. 画面要点** \n- 背景:纯黑色,#000000 \n- 按钮圆形,描边白色、半径 60,填充分别:#FF4136, #2ECC40, #0074D9, #FFDC00 \n- HUD:顶部居中显示当前关卡数(\"Level 5\" 白色 24pt 字体),左下显示最高分(当前连续关卡数)\n\n**7. 可观测进展** \n- 每关正确完成 → 右上角分数(关卡数)+1 → 序列长度 +1(下次提示变长) \n- 失败瞬时:phase 从 \"playing\" → \"lose\",分数冻结,按钮变灰不可点击 \n- 进度量化:玩家每次点击后 `remaining` = 当前关剩余待点击步骤数(初始 = 序列长度,点击正确递减)\n\n```gatespec\n{\n \"exportState\": [\"phase\",\"score\",\"sequenceLength\",\"remaining\",\"userStep\"],\n \"driver\": {\"type\":\"none\"},\n \"controlCheck\": null,\n \"assertAfterPlay\": [\n {\"path\":\"score\",\"op\":\"increased\",\"why\":\"正确复现后关卡数上升\"}\n ],\n \"expectLatch\": true\n}\n```",
|
||
"gatespec": {
|
||
"exportState": [
|
||
"phase",
|
||
"score",
|
||
"sequenceLength",
|
||
"remaining",
|
||
"userStep"
|
||
],
|
||
"driver": {
|
||
"type": "none"
|
||
},
|
||
"controlCheck": null,
|
||
"assertAfterPlay": [
|
||
{
|
||
"path": "score",
|
||
"op": "increased",
|
||
"why": "正确复现后关卡数上升"
|
||
}
|
||
],
|
||
"expectLatch": true
|
||
},
|
||
"attempts": [
|
||
{
|
||
"attempt": 0,
|
||
"role": "code",
|
||
"model": "deepseek-v4-flash",
|
||
"stage_fail": "validate",
|
||
"usage": {
|
||
"in": 4136,
|
||
"out": 5211
|
||
},
|
||
"errors": [
|
||
"违禁:禁 Math.random(用 ctx.random)"
|
||
]
|
||
},
|
||
{
|
||
"attempt": 1,
|
||
"role": "fix",
|
||
"model": "deepseek-v4-flash",
|
||
"stage_fail": "seven_gate",
|
||
"usage": {
|
||
"in": 4181,
|
||
"out": 5627
|
||
},
|
||
"seven_gate_pass": false,
|
||
"guards": {
|
||
"A_boot": true,
|
||
"C_frame": true,
|
||
"I_control": true,
|
||
"D_render": true,
|
||
"E_live": false,
|
||
"B_uncaught": true,
|
||
"F_wiring": false,
|
||
"G_input": false,
|
||
"H_progress": false
|
||
}
|
||
},
|
||
{
|
||
"attempt": 2,
|
||
"role": "fix",
|
||
"model": "deepseek-v4-flash",
|
||
"stage_fail": "seven_gate",
|
||
"usage": {
|
||
"in": 4337,
|
||
"out": 9020
|
||
},
|
||
"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": "validate",
|
||
"usage": {
|
||
"in": 4264,
|
||
"out": 5089
|
||
},
|
||
"errors": [
|
||
"违禁:禁 Math.random(用 ctx.random)"
|
||
]
|
||
},
|
||
{
|
||
"attempt": 4,
|
||
"role": "fix",
|
||
"model": "deepseek-v4-flash",
|
||
"stage_fail": "seven_gate",
|
||
"usage": {
|
||
"in": 4181,
|
||
"out": 7544
|
||
},
|
||
"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": "validate",
|
||
"usage": {
|
||
"in": 4264,
|
||
"out": 4875
|
||
},
|
||
"errors": [
|
||
"违禁:禁 Math.random(用 ctx.random)"
|
||
]
|
||
}
|
||
],
|
||
"seven_gate_verdict": {
|
||
"gameId": "gen-9305",
|
||
"url": "http://localhost:4320/games/_wg1-gen/gen-9305/index.html",
|
||
"ts": null,
|
||
"guards": {
|
||
"A_boot": {
|
||
"pass": true
|
||
},
|
||
"C_frame": {
|
||
"pass": true,
|
||
"f0": 60,
|
||
"f1": 90,
|
||
"delta": 30
|
||
},
|
||
"I_control": {
|
||
"pass": true,
|
||
"skipped": "未声明 controlCheck(向后兼容)"
|
||
},
|
||
"D_render": {
|
||
"pass": true,
|
||
"bright": 117266,
|
||
"maxCh": 255
|
||
},
|
||
"E_live": {
|
||
"pass": true,
|
||
"distinctStates": 62,
|
||
"samples": 62
|
||
},
|
||
"B_uncaught": {
|
||
"pass": true,
|
||
"uncaught": []
|
||
},
|
||
"F_wiring": {
|
||
"pass": true,
|
||
"callCount": 4,
|
||
"sample": [
|
||
"particles.spawnEmitter",
|
||
"audio.synth.synthSfx",
|
||
"audio.synth.synthSfx",
|
||
"audio.synth.synthSfx"
|
||
],
|
||
"expected": []
|
||
},
|
||
"G_input": {
|
||
"pass": true,
|
||
"inputHash": "ce332c9b",
|
||
"controlHash": "10545f53",
|
||
"atFrame": 1664,
|
||
"ctrlFrame": -1
|
||
},
|
||
"H_progress": {
|
||
"pass": false,
|
||
"checks": [
|
||
{
|
||
"path": "score",
|
||
"op": "increased",
|
||
"before": 0,
|
||
"after": 0,
|
||
"pass": false,
|
||
"why": "正确复现后关卡数上升"
|
||
}
|
||
],
|
||
"latch": {
|
||
"pass": false,
|
||
"reason": "真玩未到达 gameover 终态(终态不可达/无失败态/play-spec 未驱动到结束)",
|
||
"phaseNow": "playing"
|
||
},
|
||
"state0": {
|
||
"phase": "playing",
|
||
"score": 0,
|
||
"remaining": 3,
|
||
"progress": null,
|
||
"gameoverReason": "",
|
||
"sequenceLength": 3,
|
||
"userStep": 0
|
||
},
|
||
"state1": {
|
||
"phase": "playing",
|
||
"score": 0,
|
||
"remaining": 3,
|
||
"progress": null,
|
||
"gameoverReason": "",
|
||
"sequenceLength": 3,
|
||
"userStep": 0
|
||
}
|
||
}
|
||
},
|
||
"pass": false,
|
||
"notes": []
|
||
},
|
||
"player": null,
|
||
"tokens": {
|
||
"prompt": 26081,
|
||
"completion": 38590
|
||
},
|
||
"tokens_by_model": {
|
||
"deepseek-v4-flash": [
|
||
26081,
|
||
38590
|
||
]
|
||
},
|
||
"cost": {
|
||
"by_model": {
|
||
"deepseek-v4-flash": {
|
||
"in": 26081,
|
||
"out": 38590,
|
||
"rmb": 0.08201
|
||
}
|
||
},
|
||
"total_rmb": 0.08201,
|
||
"gate_rmb": 0.15
|
||
},
|
||
"wall_s": 564.2,
|
||
"models": {
|
||
"design": "deepseek-v4-flash",
|
||
"code": "deepseek-v4-flash",
|
||
"fix": "deepseek-v4-flash",
|
||
"player_vision": "MiniMax-M3",
|
||
"player_text": "deepseek-v4-flash"
|
||
}
|
||
} |