diff --git a/.agents/skills/cheap-model-game-generation.md b/.agents/skills/cheap-model-game-generation.md index a62f4be2..084c57ba 100644 --- a/.agents/skills/cheap-model-game-generation.md +++ b/.agents/skills/cheap-model-game-generation.md @@ -55,7 +55,7 @@ P3 主线把 L1 产出靶定死为**官方通用装载壳**(`game-runtime/game - **design agent 产 gatespec**(`worker/agent_loop/roles.py` 的 `DESIGN_SYSTEM` 末尾):在玩法设计末尾输出一段**机器可读 gatespec 块**,含 `exportState`(须导出哪些观测态,对齐 §6 可测性红线)/ `driver`(适配真玩出招式,如 `paddle-intercept`)/ `controlCheck`(控制体 + 目标 x)/ `assertAfterPlay`(进展断言)/ `expectLatch`。**坑**:模型易把 `ballPath` 写成竖直 `.y`——prompt 须明确「球水平运动 → `ballPath='ball.x'`」。 - **studio 抽取合入**(`worker/studio.py` 的 `_extract_gatespec`):从 design 输出抽 gatespec 块(`json_repair` 兜模型 JSON 残缺)→ 合入 play-spec → **安全归一**(如 paddle-intercept 的 `ballPath` 误写 `.y` 自动兜回 `.x`);结果记 `gatespec` 供取证回溯。prompt 修 + 归一兜底**双保险**,实证唯一内容误差(ball.y)已被双修。 -- **★ tap/离散点击类自产 driver 缺口(3b-B 重跑实证·dispatch 面致命)**:design agent 对 tap-target 类游戏(打地鼠/井字棋/点击得分)反复给 `driver:{type:none}`——dispatch 面 `run_studio(play_spec={})` **全恃自产 driver**(无手供 play_spec),致 harness 盲打打不中目标 → `moves/score` 恒 0 → **H_progress 挂 + latch 不触发**,repairs=5 耗尽(3b-B 重跑 gen9306/9307 + 原 gen9303-9305 共 5 款同签名,**8/9 门过仅此门挂、游戏本体全对**:`targetX/Y/radius`、`board`、`moves` 导出正确,G_input/I_control/F_wiring 均过)。**根因=自产 driver 缺口,非模型/非游戏本体**(样板 tictactoe 过九门靠其 lane brief 手供 `play_spec.driver=tap-targets`)。**修向**:`DESIGN_SYSTEM` 对「离散点击目标」类强制产 `tap-targets` driver(+`exportState` 含 `targets[{x,y,occupied}]`),或 `_extract_gatespec` 对 brief 含离散格位/目标时兜底注入 tap-targets。**当前 dispatch 面一句话现生成对 tap 类不可靠,须先补此缺口**——这是 moat『一句话现生成』腿的真·临门一脚(纯 L1 生成域)。 +- **★ tap/离散点击类自产 driver 缺口(3b-B 重跑实证·dispatch 面致命)**:design agent 对 tap-target 类游戏(打地鼠/井字棋/点击得分)反复给 `driver:{type:none}`——dispatch 面 `run_studio(play_spec={})` **全恃自产 driver**(无手供 play_spec),致 harness 盲打打不中目标 → `moves/score` 恒 0 → **H_progress 挂 + latch 不触发**,repairs=5 耗尽(3b-B 重跑 gen9306/9307 + 原 gen9303-9305 共 5 款同签名,**8/9 门过仅此门挂、游戏本体全对**:`targetX/Y/radius`、`board`、`moves` 导出正确,G_input/I_control/F_wiring 均过)。**根因=自产 driver 缺口,非模型/非游戏本体**(样板 tictactoe 过九门靠其 lane brief 手供 `play_spec.driver=tap-targets`)。**修向**:`DESIGN_SYSTEM` 对「离散点击目标」类强制产 `tap-targets` driver(+`exportState` 含 `targets[{x,y,occupied}]`),或 `_extract_gatespec` 对 brief 含离散格位/目标时兜底注入 tap-targets。~~当前 dispatch 面一句话现生成对 tap 类不可靠,须先补此缺口~~——这是 moat『一句话现生成』腿的真·临门一脚(纯 L1 生成域)。**【已修·2026-06-16·`a2cbabe6`】** `DESIGN_SYSTEM` 规则③改**家族二分**(离散点击目标类→必产 `tap-targets`+导出 `targets[{x,y,idx,occupied}]`、绝不 none;规避/推理族 +`safeOnly:true` +导出 `safe`〔仅 `_forensicsView` 测试可见、不渲染〕+断言 `result=="win"`;安全放置族断言 progress↑;技巧挡板类仍 `paddle-intercept`〔`ball.x` 绝不 `ball.y`〕;其余 none)——Python `roles.py` 与 SAA `SaaPrompts.java` **逐字同改**(规则段 1076 chars 公平性铁律)。**铁证**:tictactoe(放置族)一句话 `play_spec={}` 整链 **9/9 全绿一次过**(design 自产 tap-targets→factory 自产 targets→九门含 H_progress+latch 达终态),旧 `driver:none` 盲打卡死真因已闭;breakout 回归未误伤(恒 paddle-intercept)。**残留(正交)**:saolei 九门未翻绿=便宜模型写扫雷 factory 本身质量(`Math.random` 违禁/胜负不可达/A_boot 崩),九门**正确拦截坏游戏**=O1 factory 级生成质量(§9/scale-20 单列),非本修失败。**刻意未加 `_extract_gatespec` 关键词兜底**(易误判 paddle/flap,靠门 + 反馈自愈)。 - **意义**:手感门判据从「手写一次性 brief」变成「随游戏生成的自产物」——同一条便宜模型生成链既出游戏码、又出验它的确定性门,确定性门覆盖面随生成规模自动扩张(harness 复利的一环)。 ## 8. 质量评估:确定性门兜底 + 人锚天花板(W-G1 校准实证,2026-06-14) diff --git a/docs/agent-specs/2026-06-16-W-G1开闸验收门-review.md b/docs/agent-specs/2026-06-16-W-G1开闸验收门-review.md new file mode 100644 index 00000000..b1444c7a --- /dev/null +++ b/docs/agent-specs/2026-06-16-W-G1开闸验收门-review.md @@ -0,0 +1,128 @@ +# W-G1 开闸验收门 · 评审版 master spec + +> **状态**:review 版 · 2026-06-16 · 给创始人决策(结论先行 / Mermaid / 降认知负荷)。 +> **触发**:全量文档普查指认"一句话生成**对外开闸**的前提" = W-G1 验收门 6 项硬交付(此前任务清单漏列;创始人 2026-06-16 裁定**优先于 O6**)。 +> **底稿(已读)**:`2026-06-12-游戏生成系统总体架构-review.md`(D9/D11/D12/GP9/9d/首局门 设计源)|opus gap-map 接地(6c6g 现行代码 file:line 勘察:"已设计 × 现有代码 × 净缺口")。 + +--- + +## 0. 结论先行 + +1. **开闸 = 把"一句话生成"对真实创作者放开**。6 项验收门里,真正"不做不能放"的只有 **2 项**;其余 4 项是"放了要能管 / 追溯 / 不雷同"——可 v0 并行、不卡门。**别等 6 项全齐才开闸,也别裸奔开闸。** +2. **2 项硬阻塞(先做)**: + - **D12 控制平面 v0**(配额 + 并发上限 + 背压 + 防刷缓存)——没它,单用户能压垮**全局串行**单作业 worker(serve:4320 / CDP:9222)+ token 成本失控。**好消息:取消 / 幂等 / 补偿 / 墙钟预算 / watchdog 收尸 执行器已就位,v0 只需在 `submitGenerate` 一处加 3 道前置门。** + - **GP9 合规先行段**(生成前 prompt 审查 + 10 条违规负例 100% 阻断)——没它,违规内容直入生成与 feed(法务红线)。**性价比最高:prompt 契约已就绪,只差 10 条数据 + 一处接线。** +3. **3 项 v0 并行(不卡"能不能放",卡"放了能不能管 / 追溯")**:D11 就绪评分落库 / 9d trace 账本 / D9 反同质化告警——**首版都只落库 / 告警不阻断**,且 **9d + D9 可大量移植"已有但未接线"的 agent-loop-v1 部件**(ledger.jsonl 账本 + 查重归一),改造成本远低于从零。 +4. **1 项同批焊地板**:首局体验子门(品类化:可玩 ≤2s / 首反馈即时 / 60s 核心闭环)——技术上不卡门,但 = 产品级首局 30s SLO,与"补 L1 driver 自产 / 焊可玩地板"同批做最自然。 +5. **1 处跨轨路由**:D12 的"**真实计费扣退**"维度阻塞于网关(new-api `AddToken` 硬编码 UserId),**拆出去随 M4**(支付真实化,ICP + 进件 3-5 周);D12 的配额 / 背压 / 缓存 / 降级(生成引擎线)开闸前就能做。**两者拆开排期,别捆死。** +6. **一句诚实**:agent-loop-v1(clicker 批量 QA 轨)里**确有** BudgetGuard / 查重门 / 对抗 P0 / JSONL 账本 等 v0 部件,但**全绑旧四模板、未接现行 wg1 worker / SAA 主线**——是"可移植",不是"已满足"。spec 须写"移植 / 重接",不可当"已有"。 + +--- + +## 1. 背景:为什么是这 6 项 · 现状两条轨 + +**两条生成轨(贯穿性事实,强烈影响下列全部归类)**: + +| 轨 | 是什么 | 这 6 项的现状 | +|---|---|---| +| **现行 W-G1 主线** | `wg1/gen-worker`(便宜模型 agent 写码于插件库 HJ-GEN-001)+ 九门 harness(`play.cdp.cjs` A–I)+ 后端 `game-module-aigc`(执行器 / SAA 派发 / 回调入库) | **trace / 相似度 / 合规 / 就绪评分 4 项 ≈ 零落地**;取消 / 幂等 / 补偿 / 九门 已有 | +| **agent-loop-v1 批量 QA 轨(已 supersede)** | `docs/agent-specs/2026-06-09-agent-loop-v1/orchestrator/`(run_batch / judge / ledger / evalflow) | 含 D9/GP9/9d/D12 的 **v0 雏形**,但**绑 clicker 单模板、未接现行轨** = 可移植参考,非现行交付 | + +> 这 6 项在 2026-06-12 架构评审里**已设计**(D12 §2.1 / GP9 :147 / D9 :113 / D11 :115 / 9d :58 / 首局门 :189),被任务清单漏列。普查把它们补回(任务清单普查 §4.1)。 + +--- + +## 2. 六项交付 · 排序与缺口(评审级) + +```mermaid +flowchart TD + subgraph A[组A·开闸闸 — 硬阻塞·先做] + D12[D12 控制平面 v0
配额+并发+背压+防刷缓存
submitGenerate 加3道前置门] + GP9[GP9 合规先行段
prompt审查+10负例100%阻断] + end + subgraph B[组B·落库组 — v0并行·移植优先] + N9D[9d trace 账本
移植 ledger.jsonl 6维] + D11[D11 就绪评分
三维落库+可见] + D9[D9 反同质化 v0
相似度分布+告警不阻断] + end + subgraph C[组C·同批焊地板] + FIRST[首局体验子门
可玩≤2s/60s品类核心闭环] + end + A -->|2门焊死| OPEN((对外开闸)) + OPEN -.放了要能管/追溯.-> B + C -.随补L1 driver自产.-> OPEN + M4[[跨轨·随M4:真实计费扣退
new-api AddToken 阻塞]] -.推迟.-> D12 +``` + +| 交付 | 一句话设计 | 现状(关键证据) | v0 净缺口 | 阻塞分级 | track | +|---|---|---|---|---|---| +| **D12 控制平面** | 配额/计费时点/背压/取消幂等/补偿/防刷/降级 | 取消/幂等/补偿/墙钟/watchdog **已就位**(`AigcTaskServiceImpl`/`AigcGenerateExecutor`);配额/背压/防刷缓存/计费扣退**未见**(`submitGenerate` 无任何前置检查;promptHash 已落库但从不命中缓存) | `submitGenerate` 加 3 道前置门(配额+并发 / 队列深度背压 / promptHash 命中复用免计费)+ 降级开关 | **硬阻塞** | 生成引擎(计费扣退跨网关) | +| **GP9 合规先行段** | 生成前 prompt 审查 + 10 负例 100% 阻断 | prompt 契约**已就绪**(`safety.prompt-check`,registry 留 eval 位);10 负例集**缺**(eval 目录空);后端**未接线**(`UNSAFE_PROMPT` 仅枚举占位) | 写 10 负例 + 生成入口接 `safety.prompt-check` → 阻断不入队 | **硬阻塞** | 生成引擎 | +| **9d trace** | 6 维全链可回放(提示词/模型/工具/资产/决策/成本) | traceId **贯穿**(单字段,非账本);成本明细 worker 侧有但散在 FS;agent-loop-v1 `ledger.jsonl` = 最接近的 v0 账本但**未接线** | 移植 ledger.jsonl → 6 维账本结构化落后端 + 契约定 trace schema | v0 并行 | 生成引擎 + 契约 | +| **D11 就绪评分** | 可玩/首局/性能 三维门随产物落库、双台可见 | 仅单维 `qualityScore`(且执行器**显式回 null**);九门 verdict 不转评分不落库;审核台**零 aigc 入口** | `game_aigc_task` 加三维列 + 九门 verdict→三维映射落库 + 双台读取(审核台属产品轨) | v0 并行(卡"能不能管") | 质量 + 产品·审核台 | +| **D9 反同质化** | 同 prompt×10 相似度分布 + 告警(只告警不阻断) | 现行主线**零相似度代码**;agent-loop-v1 `_norm`+E2 查重门 = 撞重即杀 v0 雏形但**口径不同 + 未接线** | 相似度度量 v0(config/palette 距离 + 精确撞重)+ ×10 分布报告 + 告警 | v0 并行(不卡) | 生成引擎/质量 | +| **首局体验子门** | 品类化:可玩≤2s/首反馈即时/60s 核心闭环 | 九门有 H_progress(机制进展)+latch,**非品类化首局**;9a 协议"按品类声明首局断言"**未见** | 9a 协议按品类声明 + play 驱动加 3 条首局断言 | 不卡门·强烈建议开闸前补 | 质量/harness | + +--- + +## 3. 推荐路径(三组顺序) + +**组 A · 开闸闸(硬阻塞,先做)** +- **D12 v0 最小可开闸形态**:`AigcTaskServiceImpl.submitGenerate` 入队前加 3 道前置门——① per-creatorUserId 日配额 + 并发上限(L1=1,查 `game_aigc_task` 计数)② 队列深度背压(queued+running 计数上限,超限拒绝)③ promptHash 命中已成功产物即复用免计费(promptHash 已落库,只差命中查询 + 复用分支)。取消/幂等/补偿/墙钟/watchdog **复用执行器现有**;降级 = 配置表 / Redis 开关(§6.1 已定载体)。 +- **GP9**:`contracts/prompts/eval/safety.prompt-check/` 写 10 违规负例 + 生成入口调 `safety.prompt-check` → `safe=false` 即 `callbackFailed(UNSAFE_PROMPT)` 阻断不入队 / 不烧生成。 + +**组 B · 落库组(v0 并行,移植优先)** +- **9d trace**:移植 agent-loop-v1 `ledger.jsonl` 范式 → 6 维账本结构化落后端,契约层定 9d trace schema;worker 现有 result JSON(已含 model/tokens/cost/attempts)汇入。 +- **D11 就绪评分**:`game_aigc_task` 加三维列(playability/firstPlay/performance 或 readiness JSON),九门 verdict→三维映射落库;创作台 + 审核台读取展示(审核台需新建 aigc 就绪评分页 = **产品轨**)。 +- **D9 v0**:相似度度量 v0(config 距离/palette 距离/完全相同 config 精确撞重,移植 `_norm`)+ 同 prompt×10 分布报告 + 告警(只告警不阻断)。 + +**组 C · 同批焊地板** +- **首局门**:9a 模板/插件协议按品类声明首局断言(action=胜败闭环;经营/合成/放置=完成一轮核心循环 + 数值反馈),`play.cdp.cjs` 加"可玩≤2s"+"首反馈即时"+"60s 品类核心闭环"。**与"补 L1 driver 自产 / 焊可玩地板"同批**(任务清单普查 §2)。 + +--- + +## 4. 关键取舍 + +| 取舍点 | 选项 | 建议 | +|---|---|---| +| worker 级 BudgetGuard(per-idea/批量) vs D12 多租户控制面(per 用户×级别·运行时) | —— | **不同物**,别拿前者当后者交付(gap-map 已证伪:BudgetGuard 在 agent-loop-v1 轨、改值走 PR) | +| agent-loop-v1 部件:移植重接 vs 从零 | 移植 / 从零 | **移植**(ledger.jsonl / 查重归一是现成 v0,但须解绑旧四模板、重接现行 wg1) | +| v0 只告警/落库 vs 完整阻断 | 不阻断 / 阻断 | **v0 不阻断**(九门已是硬地板挡坏游戏;D9/D11/9d 首版只观测,避免误杀好游戏 + 快上线) | +| D12 真实计费扣退:现在做 vs 随 M4 | —— | **随 M4**(网关 AddToken 阻塞 + MVP 无真支付);配额/背压用"额度记账"骨架先行 | +| 配额载体:`game_aigc_task` 计数 vs 独立配额表 | —— | **v0 用计数查询**(零新表,加 `level` 字段即可),量大再独立表 | + +--- + +## 5. 爆炸半径 / 兼容 + +- **改动面**:`submitGenerate` 加 3 前置门 + `game_aigc_task` 加列(level / 三维评分 / 可选 readiness JSON / trace 关联)+ prompt 审查接线 + 9d trace 账本(新表或对象存储)+ `play.cdp.cjs` 首局断言 + 审核台 aigc 页(产品轨)。 +- **不动**:九门确定性判定 / SAA 框架 / 8 契约现有语义(trace/readiness 是 **additive** 扩展)/ 现行 worker 生成逻辑。 +- **兼容**:前置门 feature-flag 默认关 = 现行行为不变;落库组 additive 不影响生成;移植 agent-loop-v1 部件须解绑旧四模板。 +- **公平性**:验收门接在**后端单一入口**(`submitGenerate`/执行器,Python/SAA 两臂共用),无双臂分叉问题。 + +--- + +## 6. 验收(W-G1 门 · 各一条自动化用例) + +| 门 | 用例 | +|---|---| +| D12 | 配额超限→429+排队位 / 并发上限 L1=1 / 队列深度背压拒绝 / promptHash 命中免计费 各一例 | +| GP9 | 10 违规负例 100% 阻断 | +| D9 | 同 prompt×10 相似度分布报告出分 + 完全相同 config 重复交付率=0 | +| D11 | 三维就绪评分随产物落库 + 创作台/审核台可见 | +| 9d | 抽 10 款整局回放字段完整率 100% | +| 首局门 | 真输入脚本按品类断言 可玩≤2s / 首反馈即时 / 60s 核心闭环 跑过 | + +--- + +## 7. 待确认 + +1. **排序确认**:组 A(D12 v0 + GP9)先做、组 B(D11/9d/D9 v0)并行、组 C(首局门)同批焊地板——是否照此? +2. **真实计费扣退拆 M4**:D12 只做配额/背压/缓存/降级 + 额度记账骨架,真扣退随 M4——确认拆开? +3. **agent-loop-v1 部件移植**:9d 账本 / D9 查重 从 agent-loop-v1 移植重接(非从零)——确认走移植? +4. **审核台可见入口**:D11 就绪评分 / 合规复核的审核台页属**产品轨**,谁建 / 何时(现 game-admin 零 aigc 入口)? +5. **会员档位**:D12 配额按 L1/L2/L3 档(需 `game_aigc_task` 加 `level` 字段)——档位 / 额度数值谁定? + +--- + +> **一句话**:开闸不是"6 门全齐",是"**2 门焊死(D12 v0 控制面 + GP9 合规先行)→ 放 → 3 门 v0 落库追溯并行 + 1 门同批焊地板**"。最省力的路:D12 复用执行器现成的取消/幂等/补偿、只在 `submitGenerate` 补 3 道前置门;GP9 接现成 prompt 契约 + 10 负例;落库组移植 agent-loop-v1 现成 v0 部件——**大半是"重接"不是"从零"**。