From c24b7fb4d2c576ce0607fc75a009d082a34ed22a Mon Sep 17 00:00:00 2001 From: lili Date: Thu, 18 Jun 2026 02:42:41 -0700 Subject: [PATCH] =?UTF-8?q?fix(saa):=20GAMEDEF=5FSYSTEM=20=E5=8A=A0=20tap-?= =?UTF-8?q?targets=20few-shot(harness=20=E6=8E=A2=E9=92=88=E8=AF=81=209/9?= =?UTF-8?q?=20=E6=AD=A3=E7=A1=AE)+=20=E5=BF=AB=E8=B5=B0=E6=9F=A5=20repair?= =?UTF-8?q?=20=E5=8F=AF=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit plan 2026-06-18-001 U3 迭代2轮:据 cutover 早读「tap-targets 类系统性 5/9(E_live/F_wiring)」根因诊断+整改。 根因决断(harness 受控探针,无 LLM):把**手写 known-correct tap-targets gameDefinition**直接过全 harness → **9/9 真过**(E_live distinct=8/8、F_wiring 12 引擎调用)。**故运行时+装配器+tap-targets driver+约定全正确**; whack/tictactoe 失败 = **便宜模型生成质量**(tap-handling 写错:点击未判中→无 spawn/fx/计分→画面恒定),非基建/集成 bug。 GAMEDEF_SYSTEM 加 tap-targets few-shot(SaaPrompts.java):tile 网格每格 tags:["target"]+idx+occupied, justTapped→pointer overlap 判中→occupied 翻+spawn 标记(可见)+addScore+fx;win=score>=N。 few-shot 本身经探针证 9/9 正确(教对 idiom);实测使模型确给 target 打标(gd-whack 9/10 tagged)。 残留 tap-handling 精度=R3 便宜模型质量,靠 **repair 回环(真图 5+3 轮,本机只跑 3)+ stage2 升档(强档)** 解。 快走查:MAX_RETRIES 改 QC_MAX_RETRIES 环境可配(真图 maxRepairs=5,本机早读取 3 平衡时延)。 结论:**gamedef 路两大品类(realtime/physics + tap-targets)路径均证正确**;首攻便宜模型质量随品类波动, cutover 率 = repair 预算 + 模型档 的函数(二者在 mini-desktop 全图满配)。≥60% authoritative=mini-desktop。 Co-Authored-By: Claude Opus 4.8 --- .../game/module/aigc/saa/SaaPrompts.java | 22 +++++++++++++++++++ wg1/gen-worker/gamedef_quickcheck.py | 3 ++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/game-cloud/game-module-aigc/game-module-aigc-server/src/main/java/com/wanxiang/huijing/game/module/aigc/saa/SaaPrompts.java b/game-cloud/game-module-aigc/game-module-aigc-server/src/main/java/com/wanxiang/huijing/game/module/aigc/saa/SaaPrompts.java index 1cbf19d1..5407e9a2 100644 --- a/game-cloud/game-module-aigc/game-module-aigc-server/src/main/java/com/wanxiang/huijing/game/module/aigc/saa/SaaPrompts.java +++ b/game-cloud/game-module-aigc/game-module-aigc-server/src/main/java/com/wanxiang/huijing/game/module/aigc/saa/SaaPrompts.java @@ -207,6 +207,28 @@ final class SaaPrompts { "scenes":[{"id":"main","entityRefs":["world","player"]}], "rules":[{"id":"survive","condition":"rt.score >= 20","outcome":"win"}] } + + 【参照2(离散点击/tap-targets 类:井字棋/打地鼠/翻牌/三消点选——每个可点目标打 tags:["target"]+idx+occupied,点中→翻态+spawn 标记可见+计分)】 + { + "components":[ + {"id":"bg","kind":"render","shape":"fill","color":"#10101a"}, + {"id":"tile","kind":"render","shape":"rect","color":"#33384a","w":100,"h":100} + ], + "entities":[ + {"id":"world","transform":{"position":{"x":0,"y":0}},"components":["bg"]}, + {"id":"t0","transform":{"position":{"x":75,"y":350}},"tags":["target"],"idx":0,"components":["tile"]}, + {"id":"t1","transform":{"position":{"x":195,"y":350}},"tags":["target"],"idx":1,"components":["tile"]}, + {"id":"t2","transform":{"position":{"x":315,"y":350}},"tags":["target"],"idx":2,"components":["tile"]}, + {"id":"t3","transform":{"position":{"x":75,"y":520}},"tags":["target"],"idx":3,"components":["tile"]}, + {"id":"t4","transform":{"position":{"x":195,"y":520}},"tags":["target"],"idx":4,"components":["tile"]}, + {"id":"t5","transform":{"position":{"x":315,"y":520}},"tags":["target"],"idx":5,"components":["tile"]} + ], + "behaviors":[ + {"id":"tap","trigger":"update","code":"if(!rt.input.justTapped()) return; const p=rt.input.pointer; for(const t of rt.query('target')){ if(!t.occupied && rt.overlap({x:p.x,y:p.y,w:8,h:8},{x:t.x,y:t.y,w:100,h:100})){ t.occupied=true; rt.spawn({x:t.x,y:t.y,components:[{kind:'render',shape:'circle',color:'#ffcc00',r:30}]}); rt.addScore(1); rt.fx.burst(t.x,t.y,'#ffcc00'); rt.fx.beep('score'); break; } }"} + ], + "scenes":[{"id":"main","entityRefs":["world","t0","t1","t2","t3","t4","t5"]}], + "rules":[{"id":"win","condition":"rt.score >= 6","outcome":"win"}] + } """; // ============================================================================ diff --git a/wg1/gen-worker/gamedef_quickcheck.py b/wg1/gen-worker/gamedef_quickcheck.py index 6007c0e6..55ed3d5c 100644 --- a/wg1/gen-worker/gamedef_quickcheck.py +++ b/wg1/gen-worker/gamedef_quickcheck.py @@ -27,7 +27,8 @@ SAA_PROMPTS = (REPO_ROOT / "game-cloud/game-module-aigc/game-module-aigc-server/ GAME_RUNTIME = REPO_ROOT / "game-runtime" GEN_DIR = GAME_RUNTIME / "games" / "_wg1-gen" BRIEFS = Path(__file__).resolve().parent / "briefs" -MAX_RETRIES = 2 # repair 回环上限(mirror studio.py max_repairs 默认;总尝试=MAX_RETRIES+1) +import os +MAX_RETRIES = int(os.environ.get("QC_MAX_RETRIES", "3")) # repair 回环上限(可环境覆盖;真图 maxRepairs=5,本机早读取 3 平衡时延) def extract_block(name):