lili 9e1e943503 feat(budget): T3 预算两段式统一(软停线 ¥10/¥50 只许收尾+RMB 硬地板 ×1.5 fail-closed 封上界+CLI/Service 同源工厂) (W-ARCH②,创始人 2026-07-03 裁决)
- middleware:soft 档升两段式——越软停线置软停+on_acting 拦新增生成面工具(write_file/write_source/scaffold_init,
  收尾类 finish/check/build/跑门/只读恒放行);越硬地板(软停线×rmb_hard_floor_ratio=1.5)fail-closed 抛熔断,
  spent>floor 后 est≥0 使下次调用必拦 → 整局 ¥ ≤ floor+单笔,上界数学可证明;hard 档单段语义逐字不变
- genconfig+generation.yaml:rmb_hard_limit 3.0(spike 占位)→50.0(富档软停线裁决值)、新增 rmb_hard_floor_ratio=1.5
  / cheap_rmb_hard_limit=10.0 登内置默认,带裁决出处中文注释
- cheap_budget.build_cheap_breaker:便宜档 breaker 唯一装配点——CLI(cheap_studio,原 hard 单段 ¥10 改两段)与
  生产 Service(cheap_service_app,原 soft 无地板补地板)同源读 genconfig,档位参数不可被 overrides 改
- 测试:两段式 11 用例(软停区间放行/生成工具拒·收尾放行/硬地板到线即停/spent>floor 次调必拦/工厂同源 env 同变);
  test_budget_soft_stop 旧「soft 无界」口径按裁决更新为两段式并补越地板用例;既有 hard 档测试全量不动全绿

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 14:15:59 -07:00

39 lines
2.2 KiB
Python
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.

"""cheap_budget.py — 便宜档预算两段式的单一装配点(W-ARCH②,创始人 2026-07-03 一次性裁决)。
裁决口径:软停线 ¥10(便宜档)——越线只许收尾类动作(finish/构建/跑门,新增生成调用被 on_acting 拦);
整局 RMB 硬地板 = 软停线 ×1.5 = ¥15,middleware fail-closed 强制,与轮数/墙钟闸任一先到即停,数学上封死
¥ 上界(软停不等于无界)。富档对应 ¥50/¥75,走 genconfig budget.rmb_hard_limit 同一机制。
为什么要这个模块:此前 CLI(cheap_studio.py)是 hard 单段 ¥10、生产 Service(cheap_service_app.py)是
soft 无地板,同一条安全红线两处取值/行为不同(对账发现一)。本模块把「便宜档 breaker 怎么配」收敛成唯一
工厂——CLI 与 Service 都调 build_cheap_breaker(),数值同源 genconfig(generation.yaml budget 区,带中文注释),
改值只改 YAML、两处同时生效。
"""
from worker import genconfig
from worker.middleware import CircuitBreakerMiddleware
def cheap_soft_limit() -> float:
"""便宜档单局 ¥ 软停线(裁决 ¥10;唯一取数点=genconfig budget.cheap_rmb_hard_limit)。"""
return float(genconfig.get("budget", "cheap_rmb_hard_limit", 10.0))
def build_cheap_breaker(**overrides) -> CircuitBreakerMiddleware:
"""组便宜档两段式 breaker(CLI 与生产 Service 的唯一装配点,三处引用同源)。
固定口径(裁决,调用方不可改):enable_rmb_gate=True、soft_budget=True(两段式:软停 ¥10 +
硬地板 ¥15=×1.5 由 middleware 按 genconfig budget.rmb_hard_floor_ratio 自动派生)。
其余旋钮(max_tool_calls / 超时等)按调用方场景经 overrides 透传:Service 传失控兜底 150 + 续修
放大超时,CLI 用 middleware 默认。overrides 里试图改 rmb_hard_limit/soft_budget 会被本工厂覆盖
(单源纪律:预算档位只在这里定)。
"""
overrides.pop("rmb_hard_limit", None)
overrides.pop("soft_budget", None)
return CircuitBreakerMiddleware(
enable_rmb_gate=True,
rmb_hard_limit=cheap_soft_limit(), # 软停线 ¥10(soft 档语义;硬地板 = ×1.5 middleware 内派生)
soft_budget=True, # 两段式:越软停线只许收尾、越硬地板 fail-closed(裁决)
**overrides,
)