lili 5bcaf6ac1e
Some checks failed
contract-gates / contract-gates (push) Has been cancelled
docs-gate / docs-gate (push) Has been cancelled
feat(cheap-gen): W-AXIS-V2 波1——测试 agent 生产化+三路统一验收编排器+字段迁移
opus 执行位交付、主会话四步验收过(测试亲跑/红线 diff 亲读/硬证亲眼):

- playtest.cdp.cjs 生产版(§3 八件:DPR=1 playtest/1 坐标协议/坐标尺/落点回显/
  同点硬提示/反早退/预算 14→24 随进展扩/fail 二掷显式 seed+清存档/图像自检
  fail-closed exit=3)+ serve-and-playtest.sh;证据落 evidence/playtest/roll-N/
- cheap_verify:project_floor 四门投影(预筛权威唯一产地,绝不复用 harness 原生
  verdict.pass)+ run_playtest(子进程/超时/记账/playtest.json 真相层/端口派生避
  Chrome unsafe 5060/5061)+ run_acceptance 编排器(v2=floor∧测试员阻断/
  shadow=旧口径+shadowV2Accepted 对照/v1=旧判定器;修复反馈只引现象段)
- 三路接线:cheap_studio/cheap_service_driver/cheap_modify 两档全改调编排器,
  create 与 modify 单一验收标准
- §4 字段迁移:run-summary acceptanceVersion+playtest+floor 段、trace.playtest
  additive(firstPlay 三字段镜像 ReadinessScorer 口径)、批账 floorPass+accepted+
  acceptanceVersion(verdictPass 仅对照);result_out 三级取值(floor→verdictFull
  投影→verdict.pass 回落)、gate_judge 续修触发器切四门、xtheme 同批;判定语义单轨
- §5 Java 读侧:ReadinessScorer 可玩性/firstPlay 优先读 trace.playtest,
  GenMetrics 归因加 playtest/tester_degraded(向后兼容,未编译验证——本机无后端
  构建环境,待 mini-desktop 构建窗口)
- genconfig/generation.yaml:acceptance.mode 三态(波1 灰度默认 shadow)+
  playtest 旋钮(steps/二掷/超时/成本上限);judge 段未动
- 单测 32 项新增(二掷/图像 fail-closed/mode 三态/投影/现象分离/退出码/unsafe 端口)

验收:pytest 512 绿 + node 44/44(主会话亲跑);10 局考卷生产件重跑判对 9/9
(真坏 3/3 零放行、假阴 0/6,heritage-r4/puzzle-r1 二掷翻案、sb2 假超时根因=
Chrome unsafe 端口已修);Service E2E(w1v2-e2e1 shadow→v2 一发收敛)与 modify
回归(w1v2-mod1 ROUND_MS 60000→45000,src 与局内截图双证)真浏览器硬证;
总成本 ¥2.3。已知余项:真续修回喂环仅单测覆盖(波2 n=3 冒烟自然覆盖)。

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

136 lines
14 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 帧)
# ── acceptance · 便宜档验收 v2 版本开关(消费方:cheap-worker/cheap_verify.run_acceptance;W-AXIS-V2 波1)──
# 三态(§2):v2=测试员真玩阻断放行;shadow=测试员照跑照落证据但 accepted 仍取旧口径(新旧并跑对照,批次账落对照表);
# v1=W-AXIS 旧口径(driven 九门预筛 + 判定器读驱动器证据)。波1 灰度窗口默认 shadow——安全侧:测试员未稳时不误拒
# 生产;验收真跑/切换时改此值为 v2(或临时 env TIER2_GEN__ACCEPTANCE__MODE=v2)。
acceptance:
mode: shadow # v2 | shadow | v1
# ── playtest · 测试 agent 真玩回路旋钮(消费方:cheap-worker/cheap_verify.run_playtest;测试员模型走 judge.model)──
# §3 八件里可配的两组:步数预算(base 随进展扩到 max)与二掷/超时/成本上限;其余护栏(坐标尺/落点回显/
# 同点硬提示/反早退/图像通道自检)是 runner 侧确定性代码、不留旋钮。
playtest:
steps_base: 14 # 基础步数预算(§3 第6件)
steps_max: 24 # 有进展证据(画面变化/日志推进)时自动扩到的步数上限
second_roll: true # fail 二掷确认(§3 第7件):roll-1 判 fail 且四门地板全绿 → 重开一局二掷,两掷同 fail 才落 fail
timeout_s: 600 # 单掷子进程墙钟超时(秒;一轮 8~24 步 × M3 每步 10~40s ≈ 2~10 分钟)
cost_cap_rmb: 1.5 # 单局验收成本上限(¥;含二掷,单轮设计上限 ¥0.5,对照旧链路契约困死单局 ¥10+ 净赚)
# ── 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 对齐)