主力批 7/8 真可玩(Opus 对抗审计 0 假绿)、压测 match3 ✅;失败收敛:3 键盘款(2048/Tetris/Asteroids)挂宿主缺 keydown 桥=唯一真·L0 门面缺口(已 spawn_task 交 L0)、multiball/flappy/愤怒小鸟=driver-coverage(非模型)。spec 预判 CCD/文本HUD/网格/match/手势缺口全推翻(便宜 flash 自带 swept CCD/自写网格文本)。
- driver 库 1→6 型(tap-targets/flap-to-gap/seek-x/tap-pairs/key-cycle/paddle-intercept)+ drag 输入事件 + key() Arrow 修
- M3 视觉 player 当生产过滤器实证(与门 8/9 一致、抓显性空心)→ 门(地板)+M3(主观过滤)+创始人(人锚)三层互补
- 短板量化报告定稿 + 两 skill 沉淀(game-e2e §8 driver库/门承重/键盘缺口 · cheap-model §9 模型能力画像)
- 2 个 ultracode 对抗 workflow(审计10+诊断7 agents)抓 saolei 弱断言、纠 flappy 归因(driver 非模型)、定位宿主键盘根因
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
13 lines
2.3 KiB
JSON
13 lines
2.3 KiB
JSON
{
|
||
"title": "太空侵略者 Space Invaders",
|
||
"brief": "做一款经典太空侵略者。竖屏逻辑视口 390×844。\n- 底部一门炮台。顶部一片敌阵(建议 3 行 × 4 列 = 12 个敌人)整体左右平移,每隔约 1.5 秒整体向下压一格;敌阵下压到炮台所在高度 = 失败。\n- 点击任意位置:炮台水平移动到该点 x,并向上发射一颗子弹;子弹击中敌人则该敌消除、得分 +1。\n- 清光所有敌人 = 胜利;敌阵触底 = 失败。\n- 顶部文本 HUD:显示得分 / 剩余敌数 / 当前状态。\n- 【终态契约·务必遵守】胜或负即把 _forensicsView().state().phase 置 'gameover' 并【驻留】(显示结果文案 + 「点击重玩」提示);玩家点击重玩前 phase 必须恒为 'gameover',**绝不自动重开 / 不下一帧复位回 playing**(宿主每 500ms 轮询 phase 判结束)。**gameover 状态下点击一律忽略**;仅点击明确的「重玩」按钮才允许重开。\n- 【可测性·务必导出状态】_forensicsView().state() 返回纯只读实时真值,除 phase 外导出:\n · result:null | 'win' | 'lose'(对局中为 null)\n · score:整数,得分(开局必为 0,每击毁一敌 +1)\n · enemiesRemaining:当前剩余存活敌数\n · targets:当前【存活敌人】组成的数组,每元素 { x, y, idx, occupied } —— x/y 为该敌当前中心的逻辑像素坐标(实时随敌阵移动)、idx 为敌序号、occupied 恒为 false(存活敌人都是可打目标)。\n harness 依据 targets 自动点击(炮台移到敌人 x 处开火)真玩、依据 score/phase 验证进展与终局,务必准确实时。\n- 反馈(juice):开火 / 击毁敌人触发 getEngine().particles.spawnEmitter 粒子 + getEngine().audio.synth.synthSfx 音效。\n- 画面:深色背景铺满 390×844;炮台 / 敌人 / 子弹 / 文字均用亮色实心绘制。",
|
||
"play_spec": {
|
||
"driver": { "type": "tap-targets", "steps": 50, "stepMs": 260 },
|
||
"expectedEngineCallPrefixes": ["particles.", "audio.synth"],
|
||
"assertAfterPlay": [
|
||
{ "path": "score", "op": "increased", "why": "适配性真玩(炮台移到敌人 x 开火)下击毁敌人→得分上升;打不中/无碰撞则不升" }
|
||
],
|
||
"expectLatch": true
|
||
}
|
||
}
|