lili 38032c72b4 feat(wg1): tap-targets safeOnly oracle driver——扫雷 borderline 翻绿(自产缺口修复)
driver: runTapTargets 加 safeOnly(规避/推理族只点 safe===true、确定性避负到 win;安全放置族缺省关、零回归)。题面: saolei.json targets 加 safe x-ray 观测位(勿渲染)+ safeOnly + 断言 result==win。重生成 saolei: flash 一次过九门(revealed 0→71 / all_cleared / win-latch),自产 safe 正确→坐实缺口在题面非模型。回归 tictactoe(X)/invaders(win)全绿。沉淀 L1brief §九 + game-e2e/cheap-model skill 二分法。零碰 L0(boot-game-host/契约/门面)。

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

13 lines
2.9 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"title": "扫雷 Minesweeper",
"brief": "做一款经典扫雷。竖屏逻辑视口 390×844。\n- 居中网格(建议 8 列 × 8 行或 9×9,格子足够大可点),用受控 random 随机布置若干地雷(如 10~12 颗)。\n- 点击未揭格:若是雷→失败;否则揭示该格并显示其周围 8 格的雷数(0~8,文本居中显示);若周围雷数为 0 则自动洪水填充揭开相邻空格。\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 · revealed:整数,已揭开的格数(开局必为 0,每揭开一格 +1,洪水填充按实际揭开数累加)\n · minesTotal:地雷总数\n · targets:当前所有【未揭且可点】的格组成的数组,每元素 { x, y, idx, occupied, safe } —— x/y 为该格中心的逻辑像素坐标(与画面一致)、idx 为格序号、occupied 为该格是否已揭开/已不可点(布尔)、**safe 为该格是否【非雷】(布尔;= 非地雷格,由你按内部布雷真值直接给出,如 !grid[r][c].mine)**。\n **【测试专用·勿渲染】safe 仅经 _forensicsView() 测试通道暴露给 harness,用于确定性「只揭安全格」把核心玩法跑到胜利;渲染层/玩家界面绝不可显示 safe、不得据此给玩家避雷提示(否则游戏失去意义)。**\n harness 依据 targets+safe 自动只点安全未揭格真玩、依据 result/revealed/phase 验证进展与终局,务必准确实时。\n- 反馈(juice):每次揭格触发 getEngine().particles.spawnEmitter 粒子 + getEngine().audio.synth.synthSfx 音效;踩雷时额外给一次明显反馈。\n- 画面:深色背景铺满 390×844;网格线 / 数字 / 文字均用亮色绘制,已揭格与未揭格视觉区分清晰。",
"play_spec": {
"driver": { "type": "tap-targets", "safeOnly": true, "steps": 100, "stepMs": 150 },
"expectedEngineCallPrefixes": ["particles.", "audio.synth"],
"assertAfterPlay": [
{ "path": "result", "op": "==", "value": "win", "why": "safeOnly driver 确定性只揭非雷格→揭尽所有安全格触发 win;result==win 证洪水填充/邻数揭示/胜负判定核心循环真跑(而非盲踩雷 lose 的空壳证据)" }
],
"expectLatch": true
}
}