docs(M1-plan): 便宜档 M1 达标门绿细化 plan — 双评审定稿
切片一第一里程碑细化(4 实现单元:护栏 / 自动 spec / 达标门 / 预算闸)。 过 Codex + Opus 双评审(均判修后可执行)+ 创始人三项口径已定: - U2 防自证假绿:expectedEngineCallPrefixes 取预置品类映射表作 held 期望、非从实际反推(否则 F_wiring 退化自证必过) - M1 收口钉死 = M3 20 款实测、tap-targets 三品类逐品类 pass_count/total≥0.8;小批=联调非收口替代 - R5/U3/R3 串行→前台进程内有界并发(conc≤15,对齐 002 run_multi);U3 补 U4 偏序 - U2 同质数值化(逐门全等 / delta=0 / 关键门不低于金标);落点校正(middleware 类 172 / cost.py 路径前缀 / fetch_pricing_params 107) - 创始人定:覆盖面只 tap-targets 三品类 / 横比延后 / 取价沿用既有降级 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
618eca14d4
commit
f0355f98ef
247
docs/plans/2026-06-26-003-feat-cheap-worker-M1-达标门绿-plan.md
Normal file
247
docs/plans/2026-06-26-003-feat-cheap-worker-M1-达标门绿-plan.md
Normal file
@ -0,0 +1,247 @@
|
||||
---
|
||||
title: "feat: 便宜档 M1 达标门绿 — 生成幻觉护栏 + 生产自动 spec + ≥80% 达标门 + 预算闸"
|
||||
type: feat
|
||||
date: 2026-06-26
|
||||
origin: docs/plans/2026-06-25-生成引擎统一执行计划-AgentScope三档-plan.md
|
||||
slice: 切片一 · M1(达标门绿 · 本机/实验室口径)
|
||||
predecessor: docs/plans/2026-06-26-002-feat-cheap-worker-multi-genre-plan.md
|
||||
reviewed: 2026-06-26 Codex + Opus 双评审(plan 双评审门),均判修后可执行,必修已在档内修;创始人三项材料级口径已定
|
||||
---
|
||||
|
||||
# 便宜档 M1 达标门绿(切片一第一里程碑)
|
||||
|
||||
## Summary
|
||||
|
||||
便宜档的生成框架已重写进 Python/AgentScope,三个 tap-targets 品类的金标对照证明 Python 路与 Node 路等价(002 已坐实)。框架对了,但生成质量还没到达标线:当前 HEAD 干净重跑五款代表游戏,九门 3/5——点击得分、经营上菜、跑酷三款全绿,打地鼠与 2048 两款卡在 E_live(进不了对局、停在菜单),根因是两类能静态识别的生成幻觉。M1 要把便宜档从"框架等价、质量 3/5"推到"按品类稳定 ≥80% 达标"的本机口径,为 M2 的 Node 退役条件、M3 的真上线铺好质量地基。
|
||||
|
||||
这一步纵向纳进四块此前分散在不同关注面的工作:救回卡住品类的生成幻觉护栏、让生产自己产够格驱动器的自动 play-spec、按品类判定的 ≥80% 达标门、以及一次生成不超过 ¥10 的预算硬闸。四块串成一条可验收的成果线——护栏把卡死的品类救回达标门的样本池,自动 spec 给达标门提供脱离金标 fixtures 的生产级驱动器,达标门按品类给出“够不够格上线”的确定性判定,预算闸保证这条线在成本红线内跑。
|
||||
|
||||
## Problem Frame
|
||||
|
||||
框架收敛解决的是"能不能用 Python 跑同一套生成范式",答案已经是肯定的。M1 解决的是下一个问题:这套范式生成出来的游戏,质量够不够稳定到可以放进 feed 给真人玩。
|
||||
|
||||
衡量"够不够"需要三样东西同时成立,而当前三样都缺一角。第一,生成质量本身——两类生成幻觉让 LLM 写出的游戏卡在菜单进不去,得有护栏在打包前把它们拦下、逼生成修对。第二,一把不依赖人工、不依赖金标手写件的尺子——生产环境里每款游戏的驱动器要能自动产出,且产得和手写金标一样厚,否则达标门量出来的过门率不可信。第三,一道确定性的达标判定——按品类算过门率、≥80% 才算达标,且必须按品类判而非看总体平均,否则两类卡死的品类会被三类过关的品类拉平、达标门变成自欺。这三样之外还有一条横切的成本约束:便宜档单次生成必须在 ¥10 红线内,机制虽已在 tier2 框架里具备,但便宜档侧主动关掉了、阈值也没设。
|
||||
|
||||
侦察把四块的现状落点和缺口都钉到了代码行:护栏在 `game-runtime/tools/amodel-gen/tools.mjs` 的 `check()`,已有针对两类幻觉的硬编码形状门、但匹配面窄且对"过 check 却运行炸"的语义盲区敞口;自动 spec 通路在 `cheap-worker/cheap_run.py` 的 `ensure_play_spec` 已接但产物偏薄;达标门可复用 `compare_node.py` 的按品类聚合逻辑;预算闸机制在 `tier2/gen-worker/worker/middleware.py` 的 `CircuitBreakerMiddleware` 完整具备、只是便宜档侧 `enable_rmb_gate=False` 关着。M1 是把这四个半成品补到能验收,不是从零造。
|
||||
|
||||
一条边界先划清楚:护栏所在的 `tools.mjs` 是两条生成路 shell-out 共享的校验码,改它让 Python 新路生成的源码也被更严地静态把关,这是救生成质量、不是"投入救行将退役的 Node 旧路"。Node 旧路的生成核心(`amodel-gen` 的多轮编排)M1 一行不碰,只灰度兜底活到 Python 达标。
|
||||
|
||||
## Requirements
|
||||
|
||||
- **R1 护栏救回卡死品类**:`tools.mjs` 的 `check()` 静态护栏要能在打包前接住打地鼠(幻觉①:返 void 的绘制 API 被误当返回值使用)与 2048(幻觉②:形状定义批量误用)这两类幻觉,使重新生成的 base2 / base3 过九门;同时不误杀已绿的 base1 / base4 / base5。
|
||||
- **R2 自动 spec 加厚到金标同质(tap-targets 族)**:`ensure_play_spec` 生产自产的 play-spec 要补齐金标 spec 的关键断言字段,使自动 spec 驱动九门对 tap-targets occupied 族达到与手写金标同等的过门率。key-cycle 族的自动 spec 因缺输入键契约延后,不在本里程碑。
|
||||
- **R3 ≥80% 达标门(按品类 · 不依赖 Claude)**:建一道达标门,代表样本按品类跑生成→自动 spec→九门,按品类聚合过门率,**逐品类判 ≥80%、核心品类全覆盖**;某品类卡死不得被其余品类平均成总体达标。判定全程走确定性九门,不调 Claude 或任何 LLM 当裁判。主模型 MiniMax-M3 必跑出达标证据。
|
||||
- **R4 预算闸 <¥10 fail-closed**:便宜档开启 ¥ 预测闸、设便宜档专属 ¥10 硬上限,在发起每次模型调用前预估本次花费、累计预估越线即终止本次生成;每款生成的成本按 new-api quota 口径落盘;取价通路不可达时走显式降级策略、不静默超支也不静默阻断。
|
||||
- **R5 真跑纪律**:达标门与护栏验证涉及真实批量生成,走前台进程内有界并发(禁后台子代理 / `tail -f` monitor / 自我唤醒重试,002 的 `run_multi` 已落此能力);并发不超过 15、本机 N=4–6 起步压测,不同 gameId 用品类前缀隔离。
|
||||
- **R6 口径与边界**:M1 是本机/实验室口径,20 款代表样本对应生产 prompt 分布的代表面;生产真实分布的达标复验在 M3。达标门是统计批跑,与 tier2 的 n=5 收敛环是两套口径、不混用。
|
||||
|
||||
## Key Technical Decisions
|
||||
|
||||
- **KTD1 护栏落在共享 oracle、按"可静态判的子集"拓宽**。`check()` 已有的两道形状门是对两种已知翻车形态的点补丁,M1 把它们从"只匹配一种写法"拓宽到覆盖同类幻觉的多种写法,并补一层针对返 void API 误用的语义校验。不追求完整类型推断(那是 WU-C 5.4 的更宽范围),只补"能静态判、且能救回 base2/base3"的子集。救回两款卡死游戏是这块的验收靶,不是把 oracle 做成通用静态分析器。
|
||||
|
||||
- **KTD2 先验证形状门是否已治住,再决定拓宽幅度**。base2 / base3 的翻车产物早于现有形状门落地。M1 第一动作是用当前 `check()` 重跑这两款的生成(或对其源码跑 check),看形状门①②对它们的实际写法到底接没接住。若已接住,U1 收敛为"补 ③ 语义盲区 + 加防回归测试";若因匹配窄仍漏,U1 才扩到拓宽匹配面。这道前置避免凭空假设缺口、把工作量定在真实需要上。
|
||||
|
||||
- **KTD3 自动 spec 复用既有插点、只补厚度,且只补 tap-targets occupied 三品类**。`ensure_play_spec` 的“据 smoke state 推 driver、已存在不覆盖”机制不动,只把它产的 spec 补齐金标缺的断言字段。覆盖面收敛到 tap-targets occupied 族(点击得分 / 打地鼠 / 经营点客)——这正是 002 金标对照覆盖的三品类族,自动 spec 与金标可逐字段对齐验同质。key-cycle 族的驱动器需要“两路绑同一套输入键”的契约,那是生成侧 / WU-C 的事,M1 不碰,达标门也相应只对这三品类判定。
|
||||
|
||||
- **KTD4 达标门按品类判、判定零 LLM**。复用 `compare_node.py` 已验证的按品类聚合逻辑(`gates_from_verdict` / `_pass_rate`),逐品类卡 `pass_count/total ≥ 0.8`、品类缺样本即报“覆盖不足”。判定完全由确定性九门给出,不引入任何模型当裁判——这既是防 Goodhart(让模型评分会优化成“看起来好”),也是达标门可复现的前提。M1 先只跑 M3 主模型达标(创始人 2026-06-26 定);“四模型横比”延后到选型阶段、不在 M1 收口。
|
||||
|
||||
- **KTD5 预算闸开既有机制、设便宜档专属阈值**。`CircuitBreakerMiddleware` 的发起前预估 + fail-closed 熔断是 tier2 已落、feie-005 实测过的机制,M1 在便宜档侧把 `enable_rmb_gate` 打开、把硬上限从 tier2 的 ¥3 口径改成便宜档的 ¥10(reframe 口径,图音另算)。成本落盘读已有的 `RecordingOpenAIChatModel.records` 台账、按 `tier2/gen-worker/observability/cost.py` 的 new-api quota 折价口径算。取价不可达时沿用 middleware 既有降级行为(降级到次数/token 闸兜底 + 告警,创始人 2026-06-26 定),不改宁停。
|
||||
|
||||
- **KTD6 零生产路由改动**。M1 全部落在生成质量与本机验收侧:`tools.mjs` 护栏、`cheap-worker/` 的自动 spec / 达标门 / 预算闸。路由 flag、A2A 任务状态、幂等 key、D12 网关扣退、在途任务、灰度切换这些生产路由件一概不动,归 M2 设计、M3 接线。M1 不改任何用户当前在跑的链路。
|
||||
|
||||
## High-Level Technical Design
|
||||
|
||||
四块的咬合关系——护栏与自动 spec 喂给达标门,预算闸横切每次生成:
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph U1["U1 生成幻觉护栏(tools.mjs check)"]
|
||||
G["拓宽形状门①② + 补 ③ 语义盲区<br/>打包前拦截、逼生成修对"]
|
||||
end
|
||||
subgraph U2["U2 生产自动 spec(ensure_play_spec)"]
|
||||
S["薄 spec 加厚到金标同质<br/>tap-targets occupied 族"]
|
||||
end
|
||||
subgraph U4["U4 预算闸(CircuitBreakerMiddleware)"]
|
||||
B["开 ¥ 预测闸 + ¥10 硬上限<br/>发起前预估、越线 fail-closed + 成本落盘"]
|
||||
end
|
||||
subgraph U3["U3 ≥80% 达标门 bake-off"]
|
||||
direction TB
|
||||
R["代表样本 × M3(+ 横比)<br/>自动 spec 驱动九门<br/>按品类聚合、逐品类 ≥80% 判定"]
|
||||
end
|
||||
subgraph OUT["M1 交付"]
|
||||
D["便宜档按品类稳定 ≥80%(本机口径)<br/>预算闸接线 + 自动 spec 够格<br/>→ M2/M3 前置就绪"]
|
||||
end
|
||||
|
||||
G -->|救回 base2/base3 进样本池| R
|
||||
S -->|够格驱动器| R
|
||||
B -.横切每次生成.-> G
|
||||
B -.横切每次生成.-> R
|
||||
R --> D
|
||||
```
|
||||
|
||||
护栏与自动 spec 是达标门的两个输入前置:护栏决定样本池里有多少品类不再卡死,自动 spec 决定达标门量过门率用的尺子可不可信。预算闸不在主数据流上,横切在每一次真实生成里。
|
||||
|
||||
## Implementation Units
|
||||
|
||||
### U1. 生成幻觉护栏:形状门拓宽 + 语义盲区覆盖
|
||||
|
||||
**Goal**:`check()` 静态护栏在打包前接住打地鼠(幻觉①)与 2048(幻觉②)这两类幻觉,使重新生成的 base2 / base3 过九门,且不误杀已绿三款。
|
||||
|
||||
**Requirements**:R1。
|
||||
|
||||
**Dependencies**:无(起点单元)。
|
||||
|
||||
**Files**:
|
||||
- `game-runtime/tools/amodel-gen/tools.mjs`(`check()` 174–297:拓宽形状门 287/291、补返 void API 误用的语义校验层、维持 `stripCode` 135 先去注释字符串)
|
||||
- `game-runtime/tools/amodel-gen/api.d.ts`(读取:从中提取返 void 的插件 API 名集,作语义校验的输入)
|
||||
- 测试:`game-runtime/tools/amodel-gen/tests/`(若无既有 oracle 测试则新建 `check.test.mjs`;以 base2/base3 翻车源码片段与 base1/4/5 合法源码片段为 fixtures)
|
||||
|
||||
**Approach**:先按 KTD2 验证——用当前 `check()` 对 base2 / base3 已 staged 的 `game-logic.js` 跑一遍,确认形状门①②对它们的实际写法接没接住。据结果定拓宽幅度:形状门①(返 void API 被误用)从"只匹配赋值返回值"拓到覆盖被当条件、被当参数、被链式调用等同类误用;形状门②(形状定义误判)从"只匹配 `.define({` 对象首参"拓到覆盖数组批量等同形态。补 ③ 盲区——API 静态门当前只验"方法名 ∈ api.d.ts 名集"、对非插件键 over-permissive 跳过;补一层对返 void API 返回值使用的语义检查,把"过 check 却运行期卡 menu"的这一可静态判子集堵上。所有匹配都在 `stripCode` 去注释/字符串之后做,避免把注释里的 API 名当真代码误判。改完对 base1/4/5 跑回归,确认合法写法零误杀。
|
||||
|
||||
**Patterns to follow**:现有形状门 `tools.mjs:278-294`(注释已标 base2/base3 实证来源);API 名集构建 `tools.mjs:155-165 apiMethodSet`;去码 `tools.mjs:135 stripCode`。
|
||||
|
||||
**Test scenarios**:
|
||||
- base2 翻车片段(返 void API 误用)被新护栏 catch、check 判 fail。
|
||||
- base3 翻车片段(形状定义误用)被新护栏 catch、check 判 fail。
|
||||
- 返 void API 的多种误用写法(赋值 / 条件 / 参数 / 链式)逐一被 catch。
|
||||
- base1 / base4 / base5 的合法源码不被误杀(零 false positive)。
|
||||
- 注释或字符串里出现的 API 名(经 stripCode 后)不触发护栏。
|
||||
|
||||
**Verification**:重新生成 base2 / base3 过九门(E_live 进对局、H_progress 有真进展);base1/4/5 重新生成仍全绿;护栏单测全绿。
|
||||
|
||||
### U2. 生产自动 spec 加厚到金标同质(tap-targets 族)
|
||||
|
||||
**Goal**:`ensure_play_spec` 生产自产的 play-spec 补齐金标的关键断言字段,使自动 spec 驱动九门对 tap-targets occupied 族达到与手写金标同等的过门率。
|
||||
|
||||
**Requirements**:R2。
|
||||
|
||||
**Dependencies**:U1(救回的 base2/base3 是同质验证的样本之一)。
|
||||
|
||||
**Files**:
|
||||
- `cheap-worker/cheap_run.py`(`ensure_play_spec` 205–240:补产金标缺的断言字段,维持"据 smoke state 推 driver、已存在不覆盖"语义)
|
||||
- 测试:`cheap-worker/tests/test_ensure_play_spec.py`(新建)
|
||||
|
||||
**Approach**:逐字段对比三份金标 spec(`cheap-worker/fixtures/golden-specs/` 的 click-score / whack-mole / shop-serve)与 `ensure_play_spec` 当前产物。经核实两者的 driver / assertAfterPlay / expectLatch 已一致,唯一实质差异是金标的 `expectedEngineCallPrefixes`(品类语义期望,如打地鼠期望调到 `sessionScore.` / `audioMusic.` / `juice.`)。这个字段是 F_wiring 门的期望基准,**必须取自预置的“品类→通用 L2 插件前缀”映射表、作为 held 期望**,绝不能从该局实际调用反推——一旦反推,期望恒等于实际、F_wiring 退化成自证、必过、假绿(002 用金标 held constant 防的正是这层,U2 换自动 spec 后必须在此重建)。据 smoke state 形态(targets 数组→tap-targets occupied 推断逻辑)定品类、查映射表取期望前缀,补齐 spec。覆盖面收敛 tap-targets occupied 族;推断为 key-cycle 的品类自动 spec 仍产薄版并标记“待输入键契约”,不强行加厚成可能驱不动的 key-cycle 厚 spec。
|
||||
|
||||
**Patterns to follow**:`cheap_run.py:205-240 ensure_play_spec`(原子写 + 不覆盖语义);金标对位源 `cheap-worker/fixtures/golden-specs/*.play-spec.json`;字段消费方 `game-runtime/games/_wg1-gen/_shared/play.cdp.cjs`。
|
||||
|
||||
**Test scenarios**:
|
||||
- 加厚后自动 spec 对 tap-targets 族含金标的关键断言字段(`expectedEngineCallPrefixes` 等)。
|
||||
- 自动 spec 驱动 base1 / base4 的逐门过门率等于金标 spec 驱动(同质)。
|
||||
- **防自证**:`expectedEngineCallPrefixes` 取自预置品类映射表、不随该局实际调用变(构造一个实际多调一个插件的局,期望前缀不跟着改),F_wiring 不退化成自证。
|
||||
- `ensure_play_spec` 仍“已存在不覆盖”(不踩既有金标 fixtures)。
|
||||
- 推断为 key-cycle 的品类自动 spec 产薄版 + 标记延后,不误产 key-cycle 厚 spec。
|
||||
|
||||
**Verification**:auto-vs-golden 对 tap-targets 族的同质操作定义 = 逐门 pass/fail 与金标完全一致、过门率 delta=0,关键门 F_wiring / H_progress 不得低于金标;达此即同质、报告落盘,单测全绿。这是 M2 面向生产的 Node 退役授权(auto-vs-golden delta gate)的证据起点,M1 只证 tap-targets 族同质、不产生产退役许可。
|
||||
|
||||
### U3. ≥80% 达标门 bake-off(按品类 · 不依赖 Claude)
|
||||
|
||||
**Goal**:建达标门,代表样本按品类跑生成→自动 spec→九门、按品类聚合过门率、逐品类判 ≥80%、核心品类全覆盖,主模型 M3 跑出达标证据。
|
||||
|
||||
**Requirements**:R3, R5, R6。
|
||||
|
||||
**Dependencies**:U1(护栏救回卡死品类)、U2(自动 spec 够格驱动);U4 偏序——真跑前预算闸须已接上,以便每款采成本落盘(否则成本采不到、需重跑)。
|
||||
|
||||
**Files**:
|
||||
- `cheap-worker/bake_off.py`(新建:代表样本批跑编排 + 按品类聚合 + ≥80% 逐品类判定 + 覆盖不足检测;复用 `compare_node.py` 的 `gates_from_verdict` / `_pass_rate` 纯逻辑)
|
||||
- 测试:`cheap-worker/tests/test_bake_off.py`(新建)
|
||||
- `cheap-worker/results/`(达标门报告产物,按批次分文件)
|
||||
|
||||
**Approach**:代表样本 = tap-targets occupied 三品类(点击得分 / 打地鼠 / 经营点客,创始人 2026-06-26 定的 M1 覆盖面),共 20 款按三品类均分(每品类最小 6–7 款,精确分布表执行前定),brief 取自 base1 / base2 / base4 样本与品类引导框架。主模型固定 MiniMax-M3 跑达标判定;四模型横比延后选型阶段、不在 M1 收口。每款生成→U2 自动 spec 驱动九门→`gates_from_verdict` 取门结果,按品类聚合过门率,取整规则 = 逐品类 `pass_count / total ≥ 0.8`。任一品类样本缺失即报“覆盖不足”、任一品类 <0.8 即整体未达标——绝不用总体平均掩盖卡死品类。判定纯走确定性九门,不调任何 LLM。真跑走前台进程内有界并发(复用 002 `run_multi`),禁后台子代理 / monitor / 自我唤醒重试;并发不超过 15、本机 N=4–6 起步压测;gameId 用品类前缀隔离;报告按批次分文件不覆盖。
|
||||
|
||||
**Patterns to follow**:`compare_node.py` 的按品类聚合与逐门 `_pass_rate`、`run_multi` 前台进程内有界并发(`04dbd060`);002 的真跑纪律(前缀隔离、报告不覆盖、禁后台子代理)。
|
||||
|
||||
**Test scenarios**:
|
||||
- 按品类聚合过门率正确(mock verdict 构造各品类样本)。
|
||||
- 假绿防护:某品类全挂、其余品类全过,达标门判"未达标"而非被平均成总体达标。
|
||||
- 覆盖不足检测:核心品类缺样本时报"覆盖不足"、不出达标结论。
|
||||
- 判定零 LLM:达标判定路径不含任何模型调用。
|
||||
- 报告不覆盖:两次批跑产两份报告、历史不被覆盖。
|
||||
- 上限纪律:并发参数有上限夹取,不可超 15。
|
||||
|
||||
**Verification**:M1 收口判据(硬)= M3 主模型 20 款实测、tap-targets 三品类逐品类 `pass_count/total ≥ 0.8`;达标门机制先用小批(每品类 n=1–2)联调跑通聚合与判定逻辑,但小批是联调步骤、不替代 20 款收口实测。报告标明“本机/实验室口径,生产真实分布达标在 M3 复验”。
|
||||
|
||||
### U4. 预算闸 <¥10 fail-closed 接线(本地预测闸)
|
||||
|
||||
**Goal**:便宜档开启 ¥ 预测闸、设 ¥10 专属硬上限、成本落盘、取价不可达显式降级,使每次生成在发起模型调用前预估、越线即 fail-closed。
|
||||
|
||||
**Requirements**:R4。
|
||||
|
||||
**Dependencies**:无(可与 U1–U3 并行,但达标门真跑应在预算闸接上之后,以便采成本)。
|
||||
|
||||
**Files**:
|
||||
- `cheap-worker/cheap_studio.py`(84:`enable_rmb_gate=True` + 便宜档 `rmb_hard_limit=10.0`;161–176 run-summary 补 cost/¥/token 字段)
|
||||
- `cheap-worker/`(成本落盘:读 `RecordingOpenAIChatModel.records`、按 `tier2/gen-worker/observability/cost.py:174-216 compute` 折 new-api quota 口径;确认 cheap-worker 跨包 import 该模块的通路)
|
||||
- `cheap-worker/`(取价不可达沿用既有降级:`tier2/gen-worker/observability/newapi_pricing.py` 的 `fetch_pricing_params`(107)返 None 时,middleware 既有行为即降级到次数/token 闸兜底 + 告警)
|
||||
- 测试:`cheap-worker/tests/test_budget_gate.py`(新建)
|
||||
|
||||
**Approach**:把 `cheap_studio.py:84` 的 `CircuitBreakerMiddleware(enable_rmb_gate=False)` 改为开启,硬上限设便宜档专属 ¥10(区别 tier2 的 ¥3 口径)。复用既有 `CircuitBreakerMiddleware`(类定义起 `middleware.py:172`)的 `on_model_call` 预测闸(343–393)与 `_estimate_call_rmb`(429–454)——发起模型调用前用自适应均价或首调保守 token 估本次 ¥,`已花 + 预估 > ¥10` 即抛 `Tier2CircuitBreak(budget)` fail-closed。成本落盘:run-summary 补 `cost_rmb` / `token` 字段,从 `RecordingOpenAIChatModel.records` 台账读、按 `cost.py` 的 quota 口径(`quota×model_ratio×group_ratio / qpu × usd_rate`)折人民币。取价通路 `newapi_pricing` best-effort 返 None 时**沿用 middleware 既有降级行为**(创始人 2026-06-26 定):不硬拦、降级到次数/token 闸兜底 + 告警(便宜档高频,不因取价抖动阻断生成),绝不静默超支、绝不静默放行。key 读取沿用 `_bootstrap.py:34-57`(env 或从 `docs/内网凭据与端点.md` 抠 `sk-`)。
|
||||
|
||||
**Patterns to follow**:`tier2/gen-worker/worker/middleware.py`(`CircuitBreakerMiddleware` 类起 172、`on_model_call` 预测闸 + `_estimate_call_rmb` 343–454,feie-005 实测过);`tier2/gen-worker/observability/cost.py:174-216`(quota 折价);`tier2/gen-worker/observability/newapi_pricing.py`(`fetch_pricing` 50、`fetch_pricing_params` 107、best-effort 降级);`_bootstrap.py:82 RecordingOpenAIChatModel`(成本台账)。
|
||||
|
||||
**Test scenarios**:
|
||||
- 开闸后单次生成累计预估超 ¥10 → fail-closed 抛 `Tier2CircuitBreak(budget)`。
|
||||
- 正常生成(约 ¥1 量级)不被闸误拦。
|
||||
- run-summary 落盘 `cost_rmb` / `token` 字段,数值来自 `.records` + quota 折价。
|
||||
- 取价不可达 → 沿用 middleware 既有降级到次数/token 闸 + 告警,不静默超支、不静默阻断。
|
||||
- 便宜档硬上限是 ¥10、与 tier2 的 ¥3 口径互不串。
|
||||
|
||||
**Verification**:开闸 fail-closed 单测绿;一次真实生成的成本落盘且 <¥10;取价降级路径有日志可查。
|
||||
|
||||
## 迁移对账(承接 002 · M1 兑现的移交项)
|
||||
|
||||
002 把这几项明列为"移交他 WU、本计划只列明对账"。M1 是它们纵切落地的里程碑,逐项兑现并守住边界:
|
||||
|
||||
| 002 列明的移交项 | 002 归属 | M1 兑现 | 守的边界 |
|
||||
|---|---|---|---|
|
||||
| 生成质量 3/5→达标(生成幻觉护栏) | WU-B 实例 + WU-C 5.4 + WU-F | U1 救回 base2/base3 | 只治三类已知靶子,不做完整类型推断 |
|
||||
| 便宜档生产自验 play-spec 自动生成 | WU-C 5.4 | U2 加厚到金标同质 | 只 tap-targets 族,key-cycle 延后 |
|
||||
| ≥80% 达标门统计批跑 | WU-F | U3 按品类达标门 | 本机 20 款代表,生产复验在 M3 |
|
||||
| per-gen 预算闸 <¥10 接线 | WU-F | U4 本地预测闸接线 | 只 worker 本地闸,D12 网关 / 后端扣退在 M3 |
|
||||
|
||||
## Scope Boundaries
|
||||
|
||||
**移交后续里程碑 / 他 WU(M1 不做)**:
|
||||
- key-cycle 品类(2048 合成 / 躲避)的自动 spec 与驱动器加固 → 待输入键契约(WU-C 5.4 / 生成侧);M1 达标门只覆盖 tap-targets occupied 三品类(点击得分 / 打地鼠 / 经营点客,创始人 2026-06-26 定),其余品类族随自动 spec 加固在 M1 后纳入。
|
||||
- 灰度切换基础设施(路由 flag / A2A 任务状态 / 幂等 key / D12 网关扣退 / 在途任务 / 切换门槛 / 回滚)→ M2 设计 + M3 接线。
|
||||
- auto-vs-golden 面向生产的 Node 退役授权 → M2;M1 只产 tap-targets 族自动 spec 同质的证据起点。
|
||||
- 后端集成(D12 网关配额闸、game-cloud studio 模块、发布门入 feed)→ M3。
|
||||
- WU-C 5.4 超出三类已知靶子的完整语义 / 类型校验 → WU-C 后续。
|
||||
|
||||
**Deferred to follow-up**:
|
||||
- 四模型横比的非 M3 模型选型清单 → 延后选型阶段(创始人 2026-06-26 定:M1 先只 M3)。
|
||||
- 生产真实 prompt 分布的达标复验 → M3。
|
||||
- key-cycle 族纳入达标门 → 输入键契约就位后。
|
||||
|
||||
## Risks & Dependencies
|
||||
|
||||
- **R1 护栏拓宽误杀合法写法**。拓宽匹配面可能把合法代码判 fail。缓解 = base1/4/5 零 false-positive 回归测试 + `stripCode` 先去注释字符串 + 拓宽幅度按 KTD2 验证结果定、不过度。
|
||||
- **R2 形状门可能已治住 base2/base3(验证未跑)**。若 KTD2 的验证发现现有形状门已接住,U1 缩为"补 ③ 盲区 + 防回归测试",工作量降——这是好结果,不是计划失败。
|
||||
- **R3 达标门真跑的成本与时延**。20 款 M3 实测是统计批跑、耗 CPU 与墙钟。缓解 = 前台进程内有界并发(conc≤15)+ 缩单局时延优先于堆并发(便宜档容量画像:瓶颈是 CPU 突发非 RAM);小批(每品类 n=1–2)先联调达标门逻辑,再按机器产能跑满 20 款收口(横比已延后、不在 M1)。
|
||||
- **R4 自动 spec 加厚后仍不同质**。若 tap-targets 族加厚后 auto-vs-golden 仍有 delta,定位到具体字段差收敛;M1 成功定义是 tap-targets 族同质,不强求一次覆盖所有品类族。
|
||||
- **R5 取价通路不稳(new-api best-effort)**。`fetch_pricing` 失败返 None。缓解 = 沿用 middleware 既有降级(降级到次数/token 闸 + 告警,创始人 2026-06-26 定),不静默超支、不静默阻断。
|
||||
- **R6 过门不等于好玩(继承 plan① R6)**。九门是机制地板,达标门量的是"机制可玩",不是设计完整性与好玩度;后者归人工终审,M1 不声称达标门绿 = 游戏好玩。
|
||||
- **依赖**:护栏改 `tools.mjs` 影响两路共享校验,需 base1/4/5 回归把关;预算闸复用 tier2 `middleware` / `observability` 模块,维持其现有显式传参接口;达标门复用 `compare_node.py` 纯逻辑层。
|
||||
|
||||
## Verification(里程碑收口)
|
||||
|
||||
M1 达标门绿的收口判据:
|
||||
- U1:base2 / base3 重新生成过九门、base1/4/5 回归不破、护栏单测绿。
|
||||
- U2:tap-targets 族 auto-vs-golden 过门率持平、单测绿。
|
||||
- U3:M3 主模型 20 款实测、tap-targets 三品类逐品类 ≥80%(`pass_count/total ≥ 0.8`)、判定零 LLM、报告落盘。
|
||||
- U4:预算闸 fail-closed 单测绿、一次真实生成成本落盘且 <¥10、取价降级有日志。
|
||||
- 里程碑级(硬收口):M3 主模型 20 款实测、tap-targets 三品类逐品类 `pass_count/total ≥ 0.8`(本机/实验室口径,生产真实分布达标在 M3 复验);预算闸 ¥10 接线;自动 spec 对三品类族同质——M2(Node 退役条件)与 M3(真上线)前置就绪。
|
||||
|
||||
## Sources & Research
|
||||
|
||||
- 主计划 plan① `docs/plans/2026-06-25-生成引擎统一执行计划-AgentScope三档-plan.md`:§4 切片一 M1 四块定义、迁移安全契约、§7 设计面对账(WU-C 5.4 / WU-F 下钻)。
|
||||
- 前序 002 `docs/plans/2026-06-26-002-feat-cheap-worker-multi-genre-plan.md`:框架等价坐实、迁移契约对账表、金标 spec 与自动 spec 之别、真跑纪律。
|
||||
- 设计 SoT `docs/architecture/架构/生成引擎/agentic运行时架构图说.md`:§4.1 便宜档闭环链、§5.2 预算三层闸与取价策略、§5.4 三层校验与九门 / driven 感知 advisory、§5.5 能力面工具。
|
||||
- 现状侦察(本会话只读 Explore,均带文件行号锚点):护栏在 `game-runtime/tools/amodel-gen/tools.mjs:174-297 check()`、形状门 287/291 窄、API 门 ③ 盲区;五款九门 base2(幻觉①)/ base3(幻觉②)卡 E_live、base1/4/5 全绿;自动 spec 通路 `cheap-worker/cheap_run.py:205-240 ensure_play_spec` 已接但薄;预算闸机制 `tier2/gen-worker/worker/middleware.py:343-454` 具备但 `cheap_studio.py:84 enable_rmb_gate=False` 关闭、成本 `.records` 采了未落盘、`<¥10` 未设;取价 `observability/newapi_pricing.py`、折价 `observability/cost.py:174-216`、key `_bootstrap.py:34-57`。
|
||||
|
||||
## 创始人已定口径(2026-06-26)
|
||||
|
||||
三个材料级决策点已拍,落进上文各 U:
|
||||
- **达标门覆盖面**:M1 只覆盖 tap-targets occupied 三品类(点击得分 / 打地鼠 / 经营点客);key-cycle 等族待输入键契约、M1 后纳入。“核心品类全覆盖”即指这三品类全覆盖。
|
||||
- **四模型横比**:M1 先只跑 M3 主模型达标,四模型横比延后到选型阶段、不在 M1 收口。
|
||||
- **取价不可达降级**:沿用 middleware 既有降级(降级到次数/token 闸兜底 + 告警),不改宁停。
|
||||
Loading…
x
Reference in New Issue
Block a user