fix(gen): tap 类 design-agent 自产 driver——规则③家族二分补 tap-targets,闭 driver:none 临门一脚(Python+SAA 逐字同改)
DESIGN_SYSTEM 规则③旧「纯点击类用 driver:none」一刀切 = moat「一句话现生成」对 tap 族不可靠真因(盲打打不中离散目标→H_progress 卡)。改家族二分:
- 离散点击目标类(井字棋/打地鼠/扫雷)→ 必产 tap-targets + 导出 targets[{x,y,idx,occupied}];规避/推理族 +safeOnly +导出 safe(仅 _forensicsView 测试可见不渲染)+断言 result==win;安全放置族断言 progress↑
- 技巧挡板类→ 仍 paddle-intercept(ball.x,绝不 ball.y);其余→ none
roles.py(Python worker)与 SaaPrompts.java(SAA backend)规则段逐字一致(1076 chars,公平性铁律),SAA test-compile 绿。
验证(Python 派发面,play_spec={} 逼自产,stage1=deepseek-v4-flash):
- tictactoe(放置族)整链 9/9 全绿一次过=design 自产 tap-targets→factory 自产 targets→九门含 H_progress+latch 达终态(铁证)
- saolei(避负族)driver 自产正确 3/4,但九门未翻绿=便宜模型扫雷 factory 质量(Math.random违禁/win不可达/A_boot崩),九门正确拦截,与本修正交(O1 factory 级,§9/scale-20 跟踪)
- breakout 回归未误伤=恒 paddle-intercept,H_progress 绿;成本闸内(¥0.014~0.052/款);仅改 prompt 未加 extractGatespec 兜底
源:2026-06-15-WG1-tap-targets-driver-自产缺口-L1brief.md / driver-coverage §6
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
afa0771599
commit
a2cbabe647
@ -17,7 +17,7 @@ import java.util.regex.Pattern;
|
||||
* <ul>
|
||||
* <li>{@link #SYSTEM} ≡ wg1/gen-worker/worker/prompt.py:24-107(模块形状/能力面/12 禁止/硬规则/P0 latch/few-shot 挂点);</li>
|
||||
* <li>{@link #buildMessages} ≡ prompt.py:110-119(system 注入 few-shot;user 末尾回喂上轮失败原因,全量重出非 diff);</li>
|
||||
* <li>{@link #DESIGN_SYSTEM} ≡ roles.py:8-32(设计 agent + 末尾自产 ```gatespec);</li>
|
||||
* <li>{@link #DESIGN_SYSTEM} ≡ roles.py:8-32(设计 agent + 末尾自产 ```gatespec;规则③已同步 tap-targets 家族二分:离散点击目标类自产 tap-targets〔避负族再带 safeOnly+safe 位〕);</li>
|
||||
* <li>{@link #playerSystem} ≡ roles.py:38-57(玩家 agent 人格 + 1-5 分锚 + 空心必判 fix);</li>
|
||||
* <li>{@link #extractGatespec} ≡ studio.py:72-102(正则抠 ```gatespec → 容错解析 → 缺省补 expectLatch / ballPath .y→.x 归一)。</li>
|
||||
* </ul>
|
||||
@ -159,14 +159,14 @@ final class SaaPrompts {
|
||||
设计正文之后另起一个 ```gatespec 代码块,块内为 JSON,声明本游戏怎样被确定性验证:
|
||||
```gatespec
|
||||
{
|
||||
"exportState": ["phase","score","remaining","progress","<关键实体位置:如 ball:{x,y,vx,vy}、paddle:{x,y,w};纯点击类可省位置>"],
|
||||
"exportState": ["phase","score","remaining","progress","<关键实体位置:如 ball:{x,y,vx,vy}、paddle:{x,y,w};纯点击类可省位置,但离散点击目标类必须导出 targets:[{x,y,idx,occupied[,safe]}]>"],
|
||||
"driver": {"type":"paddle-intercept","ballPath":"ball.x","paddleY":800},
|
||||
"controlCheck": {"paddlePath":"paddle.x","tapXs":[50,340]},
|
||||
"assertAfterPlay": [{"path":"remaining","op":"decreased","why":"击碎砖块→剩余下降"}],
|
||||
"expectLatch": true
|
||||
}
|
||||
```
|
||||
规则:① `expectLatch` 恒 true(游戏必须能真玩到 gameover 且驻留);② 有"连续控制体(挡板/角色随手指平滑移动)"才给 `controlCheck`,纯点击/无连续控制给 null;③ 技巧类(挡板接球/接物)`driver.type="paddle-intercept"`,`ballPath`=**球的水平 x 坐标字段**(挡板水平移动去对齐它,几乎总是 `ball.x`,**绝不要填 ball.y**),`paddleY`=挡板所在 y;纯点击类用 `{"type":"none"}`;④ `assertAfterPlay` 至少一条"真有进展"断言(op ∈ increased/decreased/changed/>/>=/</<=/==/in),path 用你让代码导出的字段名(须与 exportState 一致)。""";
|
||||
规则:① `expectLatch` 恒 true(游戏必须能真玩到 gameover 且驻留);② 有"连续控制体(挡板/角色随手指平滑移动)"才给 `controlCheck`,纯点击/无连续控制给 null;③ 按【玩法形态】二分选 driver(这是判"机制是否真点亮"的命门,别一律给 none):(a)技巧类(挡板接球/接物,玩法=连续控制体随手指水平移动去拦截)`driver.type="paddle-intercept"`,`ballPath`=**球的水平 x 坐标字段**(挡板水平移动去对齐它,几乎总是 `ball.x`,**绝不要填 ball.y**),`paddleY`=挡板所在 y。(b)离散点击目标类(井字棋/五子棋/打地鼠/翻牌/Simon/扫雷/见缝插针:玩法=逐个点击网格或离散目标)**必须** `driver.type="tap-targets"`,并让代码 agent 在 `_forensicsView().state()` 导出 `targets:[{x,y,idx,occupied}]`(每个可点目标的逻辑坐标 x/y、序号 idx、是否已占用 occupied);**绝不可用 none**(否则 harness 不点目标→H_progress 必挂)。其中再按"有无致负目标"细分:——规避/推理族(存在"点了立即致负"的目标,如扫雷雷格):driver 加 `"safeOnly":true`,targets 每元素额外导出 `safe`(布尔=该目标非致负,如扫雷 `!mine`;**仅供测试·只现于 `_forensicsView`,渲染层与玩家界面绝不可显示、不得据此给避险提示**);`assertAfterPlay` 用 `{"path":"result","op":"==","value":"win"}`(确定性避负逐格揭至 win,把核心循环跑透)。——安全放置族(无致负目标,如井字棋/打地鼠:任一未占用目标都是合法推进招):不加 safeOnly,`assertAfterPlay` 给推进断言(如落子数/命中数 `increased`)。(c)其余既无连续控制体、又无可枚举离散目标 → `driver.type="none"`;④ `assertAfterPlay` 至少一条"真有进展"断言(op ∈ increased/decreased/changed/>/>=/</<=/==/in),path 用你让代码导出的字段名(须与 exportState 一致)。""";
|
||||
|
||||
// ============================================================================
|
||||
// ③ player_system —— 逐字移植 roles.py:38-57(玩家 agent 人格 + 1-5 分锚 + 空心必 fix)。
|
||||
|
||||
@ -22,14 +22,14 @@ DESIGN_SYSTEM = r"""你是轻量 H5 小游戏的【设计 agent】。输入是
|
||||
设计正文之后另起一个 ```gatespec 代码块,块内为 JSON,声明本游戏怎样被确定性验证:
|
||||
```gatespec
|
||||
{
|
||||
"exportState": ["phase","score","remaining","progress","<关键实体位置:如 ball:{x,y,vx,vy}、paddle:{x,y,w};纯点击类可省位置>"],
|
||||
"exportState": ["phase","score","remaining","progress","<关键实体位置:如 ball:{x,y,vx,vy}、paddle:{x,y,w};纯点击类可省位置,但离散点击目标类必须导出 targets:[{x,y,idx,occupied[,safe]}]>"],
|
||||
"driver": {"type":"paddle-intercept","ballPath":"ball.x","paddleY":800},
|
||||
"controlCheck": {"paddlePath":"paddle.x","tapXs":[50,340]},
|
||||
"assertAfterPlay": [{"path":"remaining","op":"decreased","why":"击碎砖块→剩余下降"}],
|
||||
"expectLatch": true
|
||||
}
|
||||
```
|
||||
规则:① `expectLatch` 恒 true(游戏必须能真玩到 gameover 且驻留);② 有"连续控制体(挡板/角色随手指平滑移动)"才给 `controlCheck`,纯点击/无连续控制给 null;③ 技巧类(挡板接球/接物)`driver.type="paddle-intercept"`,`ballPath`=**球的水平 x 坐标字段**(挡板水平移动去对齐它,几乎总是 `ball.x`,**绝不要填 ball.y**),`paddleY`=挡板所在 y;纯点击类用 `{"type":"none"}`;④ `assertAfterPlay` 至少一条"真有进展"断言(op ∈ increased/decreased/changed/>/>=/</<=/==/in),path 用你让代码导出的字段名(须与 exportState 一致)。"""
|
||||
规则:① `expectLatch` 恒 true(游戏必须能真玩到 gameover 且驻留);② 有"连续控制体(挡板/角色随手指平滑移动)"才给 `controlCheck`,纯点击/无连续控制给 null;③ 按【玩法形态】二分选 driver(这是判"机制是否真点亮"的命门,别一律给 none):(a)技巧类(挡板接球/接物,玩法=连续控制体随手指水平移动去拦截)`driver.type="paddle-intercept"`,`ballPath`=**球的水平 x 坐标字段**(挡板水平移动去对齐它,几乎总是 `ball.x`,**绝不要填 ball.y**),`paddleY`=挡板所在 y。(b)离散点击目标类(井字棋/五子棋/打地鼠/翻牌/Simon/扫雷/见缝插针:玩法=逐个点击网格或离散目标)**必须** `driver.type="tap-targets"`,并让代码 agent 在 `_forensicsView().state()` 导出 `targets:[{x,y,idx,occupied}]`(每个可点目标的逻辑坐标 x/y、序号 idx、是否已占用 occupied);**绝不可用 none**(否则 harness 不点目标→H_progress 必挂)。其中再按"有无致负目标"细分:——规避/推理族(存在"点了立即致负"的目标,如扫雷雷格):driver 加 `"safeOnly":true`,targets 每元素额外导出 `safe`(布尔=该目标非致负,如扫雷 `!mine`;**仅供测试·只现于 `_forensicsView`,渲染层与玩家界面绝不可显示、不得据此给避险提示**);`assertAfterPlay` 用 `{"path":"result","op":"==","value":"win"}`(确定性避负逐格揭至 win,把核心循环跑透)。——安全放置族(无致负目标,如井字棋/打地鼠:任一未占用目标都是合法推进招):不加 safeOnly,`assertAfterPlay` 给推进断言(如落子数/命中数 `increased`)。(c)其余既无连续控制体、又无可枚举离散目标 → `driver.type="none"`;④ `assertAfterPlay` 至少一条"真有进展"断言(op ∈ increased/decreased/changed/>/>=/</<=/==/in),path 用你让代码导出的字段名(须与 exportState 一致)。"""
|
||||
|
||||
|
||||
# 玩家 agent:看截图 + 运行数据,像真玩家一样判完整度/好玩/问题。M3 视觉位用截图,文本位仅用数据。
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user