lili 882ca3f357 feat(cheap-gen): W-AXIS 波2 判定语义重置——独立模型玩法判定阻断+拆残笼+判定档切 M3
裁定三落地:accepted = 机械预筛 ∧ 独立模型玩法判定,九门 pass 降为「未见明显死」预筛。

- 波2a 玩法判定器(cheap_verify.py):读 brief+run-summary+全程截图(含新增局中连拍
  midplay-1..N,play.cdp.cjs 只读并发拍、不进任何门判据),布尔裁 broken/hollow/off_brief,
  fail-closed;判定真相层落 evidence/judge.json + verdict.json 写回 accepted/judge 段;
  金标夹具 fixtures/judge-golden/ + judge_golden.py 校准跑批
- 波2b 拆残笼:check 词法 tokenizer 替换 stripCode 正则(字符串内 // 假阴根修,292 在册
  源零差异);prompt v1.6.3 外科清洗(两层奖励→纯设计语/删盲驱动器围设计/删熔断恐吓),
  registry 热取==内置逐字节一致(cheap_roles 内置回退同步);edit_file 空白归一+近似片段提示
- 判定器补修:空输出有界重试一次(glm 思考吃光 max_tokens 时 content 空)+重试放大公式
  反缩 bug 修(旧 min(×2,6000) 大 base 反缩)+finishReason 落盘;imagesSeen 模型自报+
  盲检微扰重掷、两掷均盲=仪器故障 degraded(闲鱼中转静默丢图实锤,不再错杀 hollow)
- 判定档切 MiniMax-M3(创始人 2026-07-10 拍板,裁定三①边界随 v2 plan 修订):
  generation.yaml judge.model+max_tokens=202752(512K 网关实探 400 拒,取实探上限);
  3 例盲案 M3 重判全 accept、¥0.026/局
- 三路消费对齐:CLI 预筛语义修(cheap_studio 喂 verdict.pass 而非 finished,违裁定三的
  放行已纠)/Service 路 apply_gameplay_judge 显式 prefilter 参数/result_out 权威改读
  accepted(无键回落预筛,旧产物兼容)+trace.gameplayJudge additive 透传;
  tier2 gate_judge/genconfig 同步判定配置与消费

测试:test_gameplay_judge 33 项新增,全仓 pytest 480 绿;真判定闭环 accept ¥0.061。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 04:27:18 -07:00

119 lines
13 KiB
YAML
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.

# ════════════════════════════════════════════════════════════════════════════
# generation.yaml —— tier2 富游戏自治生成线 · 生成器旋钮配置(运行时读 · 单一事实源)
#
# 这是什么:把过去散在 6+ 个 Python 文件里写死的「调生成、优化过门率」旋钮收敛到这一份外部配置。
# worker/genconfig.py 在每次 run 运行时读它(env 覆盖 > 本文件 > 内置默认 > 调用方默认),
# 故【调生成 = 改这个文件重跑,不改码、不重同步到 mini-desktop】。对应图说 B 族「配置注册表
# (唯一事实源 / 版本化 / 运行时读)」在生成器旋钮这一面的落地。
#
# 怎么改:把某个值改掉、保存,下一次跑生成自动生效(genconfig 按文件 mtime 自动重读)。
# 想只对某一批临时压一个值而不动文件:export TIER2_GEN__<区>__<键>=值(全大写、双下划线分隔),
# 例 `export TIER2_GEN__ITERATION__WRITER_MAX_ITERS=60`;实验完 unset 即恢复本文件的值。
#
# 默认行为不变(红线):本文件每个值 = 改造前各源文件里的硬编码值,逐项对齐。只要不动这里、不设 env,
# 生成行为与外置前字节一致;只有人主动改了某个值,它才经 genconfig 流通到取值点生效。
#
# ★ 标记:directional(方向性占位)值——需 mini-desktop 跑 n≥30 真基线后据实测分布校准。
# 调这类值是「优化 20% 过门率」迭代循环的主要着力点(改这里重跑、看过门率)。
#
# 维护纪律:本文件与 genconfig.py 的 _BUILTIN_DEFAULTS 应同值(后者是本文件失效时的兜底副本)。
# 改默认值优先改本文件;若要连兜底也改,同步改 _BUILTIN_DEFAULTS。
# ════════════════════════════════════════════════════════════════════════════
# ── model · 模型客户端构建旋钮(消费方:worker/config.py)──────────────────────────────
model:
default_model_name: MiniMax-M3 # 单写 agent 默认模型(M3 路;model_name_from_env 默认值)
deepseek_flash: deepseek-v4-flash # 便宜主力档名(spike 主问「便宜到什么程度还守得住」)
deepseek_pro: deepseek-v4-pro # 强便宜救场档名(退路树 Q1 读它的过门率)
baseline_opus: claude-opus-4-8 # 强基线 Opus(网关现【无此渠道】、真调 503;待 new-api 开通后改这里即接上)
baseline_fable: claude-fable-5 # 强基线 Fable(同上,网关现无;列出不假设可用,build_baseline_model 取不到诚实报错)
baseline_crosscheck: deepseek-v4-pro # 跨族 cross-check(创始人 2026-06-24 拍:网关无 Opus/Fable,证路当前用它;实测可调)
max_tokens: 512000 # 输出上限(非上下文窗;build_model 硬约束 max_tokens > thinking_budget)。
# 2026-07-09 创始人拍「统一 512K(后面可调)」——把 output 上限抬到不再是瓶颈。
# 依据:16K 是自设限非模型限(实测 M3 单轮能输出 17000 tokens/finish_reason=stop、
# accepts 40K 与 512K 均无报错);cheap 走 OpenAI inline thinking(thinking 吃额度),
# 低上限 + 大文件整写易撞截断丢方法/导出(heritage 黑屏、thrash 病根之一)。512K 彻底消除
# 输出截断顾虑;模型 finish_reason=stop 自然收尾、不会因上限高而空转多花(thinking_budget 8K 仍封顶思考)。
thinking_enable: true # M3 是否开 thinking 分离(便宜档无此约束,只 M3 路用)
thinking_budget: 8000 # M3 thinking 预算(必须 < max_tokens,否则 build_model 抛)
max_retries: 2 # 网关偶发 502 突发的兜底重试次数(wg1 spike 实证有效)
ctx_trigger_ratio: 0.8 # 历史压缩触发比例(超 trigger_ratio×context_size token 才压;2.0.2 约束 0<r<0.9)
ctx_reserve_ratio: 0.1 # 历史压缩保留最近上下文比例(须 < trigger_ratio)
# ── budget · ¥ 累进硬闸 + 四道熔断 + 软刹(消费方:worker/middleware.py)────────────────────
# 这一区是「自治多轮 ReAct 不能无限烧钱」的硬地板。调它们 = 调成本上限与失控保护强度。
budget:
# 预算两段式(创始人 2026-07-03 一次性裁决,裁决记录 = docs/agent-specs/2026-07-03-生成引擎agentic架构-第一性重推演与差量-设计.md §5;
# 单位经济或模型单价大变即复审):软停线越线只许收尾类动作(finish/构建/跑门,禁新增大额生成调用),
# 整局 RMB 硬地板 = 软停线 × rmb_hard_floor_ratio,与轮数/墙钟闸任一先到即停(middleware 强制)。
rmb_hard_limit: 50.0 # 富档单局 ¥ 软停线(soft 档;hard 档=单段硬线)。裁决值 ¥50(原 3.0 是 0号 spike 占位)
rmb_hard_floor_ratio: 1.5 # 两段式硬地板倍率:硬地板 = 软停线 ×1.5(富档 ¥75 / 便宜档 ¥15,fail-closed 封上界)
cheap_rmb_hard_limit: 10.0 # 便宜档单局 ¥ 软停线(裁决 ¥10;生产 Service 与 CLI 经 cheap_budget.build_cheap_breaker 同源读)
max_tool_calls: 100 # step_cap 步数硬顶(工具调用总次数)。2026-07-04 创始人令提阈值 60→100:
# F-2 实证 60 步顶挤掉续修窗(writer 40 轮撞墙后 resume 只剩 ~20 步,美食类
# 硬 brief 修不完就被拦);100 = writer 60 + 续修 ~40 headroom,失控保护交
# ¥ 硬闸(50×1.5)与墙钟。cheap Service 显式传 150 不受此影响;cheap CLI 继承此值(纯兜底,¥10/15 是真闸)。
max_model_calls: 120 # budget 预算闸(模型推理总次数;¥ 取价失败时由它兜底拦飞车)。随步顶 60→100 等比 80→120。
wall_timeout_s: 2700.0 # timeout 整 reply 墙钟超时(秒)。随步顶提到 45min(F-2 美食 R1 在 60 步已跑 1464s,100 步预留 ~2400s)。
step_timeout_s: 420.0 # timeout 单步静默超时(相邻事件间隔超此判单步卡死;秒)
stuck_repeat_threshold: 4 # stuck 连续同一失败签名达此次数 → 判死圈
soft_ratio: 0.8 # 软刹触发比例(达 soft_ratio×硬顶时往 system prompt 注入收敛提醒)
group_ratio: 1.0 # new-api 分组倍率(¥ 折算用)
est_prompt_tokens: 12000 # ¥ 闸首调保守预估的 prompt token 量级(系统提示+历史+设计稿;调用后按实测覆盖)
est_completion_tokens: 2000 # ¥ 闸首调保守预估的补全 token 量级(一轮补全+tool_use)
# ── iteration · 单写 ReAct 轮数 + 外层有界 resume(消费方:worker/agent_loop/studio.py)──────────
# 这一区是「优化过门率」最直接的着力点之一:放开/收紧自治轮数与续修次数。
iteration:
writer_max_iters: 60 # 单写 ReAct 放开的最大轮数。2026-07-04 创始人令提阈值 40→60:F-2 两轮实证美食类
# 硬 brief 在 40 轮墙上反复被截(R1 churn 到 step_cap、R2 设计收敛后仍 40 轮不绿),
# 40 是预算墙不是能力墙;烧钱风险交 ¥ 两段式(50/75)兜。
max_resumes: 6 # 外层有界自纠 resume 上限(agent 过早停下、门未绿且有预算时,带反馈再踹回去续修的次数)
# ── design_team · 阶段 1 工作室星形多 agent 设计预算(消费方:worker/agent_loop/design_team.py)──
# 设计阶段是过门头号杠杆(图说 C1);这一区控制设计团队烧多少 token、跑多久。
design_team:
leader_max_iters: 12 # leader ReAct 总轮数上限(= 调四专家 + 汇总的天花板;默认够各专家 ≤2 次 + 汇总)
per_expert_cap: 2 # 单专家被 leader 调用次数上限(防 leader 反复刷同一专家烧 token)
timeout_s: 420.0 # 整设计团队墙钟硬超时(秒;超时 degrade 回单 agent 设计,不中断主链)。
# 2026-07-04 F-2 R1 实证 240→420:两败局(美食/糖水店)均为 3/4 专家已产出、
# 末段调用/leader 撞 240s 墙钟 → 降级单 agent 设计 → writer 40 轮不收敛 → step_cap;
# 三过门局设计团队全部正常收敛(超时↔失败 5/5 完美相关)。M3 thinking 慢尾单调用
# 可达 120-180s,420 给一次慢尾余量,与 runtime.step_timeout_s=420 同刻度。
# ── gates · 退路树四阈值 + harness 门阈值 ──────────────────────────────────────────────
# 退路树阈值消费方:worker/fallback_tree.py(go/no-go 判定,纯分析侧,import 时读)。
# harness 阈值消费方:tier2/harness/play-phaser.cdp.cjs(Node;经 env TIER2_GEN__GATES__* 注入,
# 或读 genconfig.export_for_harness() 导出的 JSON;.cjs 端按「env > 内置默认」消费,默认 = 现值)。
# ★ 这些多为 directional,真跑校准过门率时改这里。
gates:
qpass_go_min: 0.40 # ★ 退路树 Q1:最强便宜档(v4-pro)过门率 ≥ 此值 → GO 转铺引擎
qpass_floor_max: 0.20 # ★ 退路树 Q4:便宜档全线 < 此值 → 判「全线崩」
qpass_strong_baseline_min: 0.0 # 退路树 Q4:强基线(Opus/Fable)过门率 > 此值(即 >0,至少 1 款过)→「能过」
concentration_ratio: 0.50 # ★ 退路树 Q2/Q3:某失败桶占失败总数 ≥ 此值 → 判「集中」(过半算集中)
human_min_patience_ms: 12000 # ★ harness 人可玩 advisory:订单耐心的人类最小反应窗口(ms);低于金标 min(16s)留余量
color_dist_min: 18 # harness render-reflects-state:有 item 格 vs 空格的色差 > 此值 → 判「渲染反映了状态」
var_delta_min: 120 # harness render-reflects-state:方差增量 > 此值 → 判「渲染反映了状态」(与色差任一满足即过)
# ── judge · 独立模型玩法地板判定(消费方:cheap-worker/cheap_verify.apply_gameplay_judge)──────────
# W-AXIS 波2(质量模型 SoT 裁定三):机械九门降位为「未见明显死」预筛,玩法地板由独立多模态模型看真玩证据
# (首帧/局中连拍/局末截图 + game-log + 取证时间线)裁 broken/hollow/off-brief 三类拒绝,阻断放行。
# ok = 预筛 ∧ 判定;判定只对过筛者跑(省¥);fail-closed(评不出/无证据 → 不放行、标 degraded)。
judge:
blocking: true # 玩法判定是否阻断放行(整体回退位:false=判定只观测、ok 仍=预筛,可一键回退到修订前口径)
model: MiniMax-M3 # 判定模型(创始人 2026-07-10 令切 M3):glm-5.2 唯一通道=闲鱼二手中转,图像支持按池轮换、07-09 整日全盲实证不可依赖;M3 读图亲验可靠(裸图/判定/spike 三路实证,且当场抓出 M3 自己写的渲染 bug)且走 MiniMax Direct 一手通道。裁定三①「出题≠被考」边界随本决策修正(地板只裁「有无」+金标亲玩兜同源盲区),SoT 修订随 v2 双评审落档。
max_tokens: 202752 # 判定输出上限。1500 实测太低(创始人 2026-07-09 令调大):glm-5.2 思考长度随机,21 局里 6 局撞线重试、1 局重试后仍截断被误拒(trpg-r5)。512000 经 new-api 实探 400 拒,202752=glm-5.2 网关实探可过上限;真实成本/时长闸=timeout_s(思考再长也被 120s 截停)。
timeout_s: 120 # 判定 LLM 调用超时(秒);超时 → fail-closed degraded
max_frames: 6 # 最多喂几帧证据截图(首帧 + 局中连拍 + 局末,控 token/成本;超出保头尾均匀采样)
cost_target_rmb: 0.3 # 单局判定成本目标(¥;仅记账对照/告警,不阻断——实测约 ¥0.10/4-6 帧)
# ── archetype · business-sim 品类 driver 参数(消费方:worker/archetypes.py)─────────────────
# 注:这里只放 driver 真玩规格里的【可调数值】(怎么玩);品类的【结构】(三系统/数据表 schema)
# 不在配置层,仍由 fixture 与品类注册表定。改这些 = 调 business-sim driver 怎么把游戏玩到终态。
archetype:
business_sim_driver_steps: 80 # driver 总步数(赢路点合成→凑单→交单→金币达标;够走完一局)
business_sim_driver_step_ms: 280 # driver 步间隔(ms;每步之间的真玩节奏)
business_sim_win_threshold: 100 # 盈利路金币胜利阈值(与 economy/latch 门、数据表 winCondition 对齐)
business_sim_bankrupt_steps: 60 # 破产路观察步数(放任流失,看是否走到 lose)
business_sim_streak_lose: 3 # 连续流失判负次数(与数据表 loseCondition.consecutiveOrderFails 对齐)