Skip to content

PR3b: 预算四界环内执法 + 跨轮通道熔断器(#199) - #200

Merged
steponeerror merged 16 commits into
masterfrom
feature/pr3b-budget-breaker
Oct 25, 2026
Merged

steponeerror merged 16 commits into
masterfrom
feature/pr3b-budget-breaker

Conversation

@steponeerror

Copy link
Copy Markdown
Owner

PR3b: 预算四界环内执法 + 跨轮通道熔断器(#199)

问题与结果

架构审阅(2026-10-25)与最佳实践对照(notes/ops-agent-best-practices-benchmark-2026-10-25.md)共同定位的预算/可靠性半缺面:STANDARD P15 预算四界只有 G_DISPATCH 单点真门(¥0.05 缺省),月度帽/墙钟/token/调用数/重复调用全无执法;P16 跨轮熔断零代码;台账双写面(python append_ledger / bash ledger_append)无锁,跨进程并发追加可丢行。DESIGN.md:74 长期以「已实现」口吻描述未落地机制(文档虚账)。

本批(A+B+典章同批收口)把 P15/P16 从半缺翻为已有,DESIGN 翻正,GLOSSARY 铸词(预算四界/跨轮熔断),建议区两行落地即删(12→10)。

变更

交付 A(merge 7ac7c8d):ops/agent/pipeline/budget.mjs 单源六旋钮(MAX_MODEL_CALLS=12/TOKEN_BUDGET=200000/WALL_CLOCK_S=1800/SPEND_CAP_CNY=3/MONTHLY_CAP_CNY=30/DUP_CALL_LIMIT=3);四界环内执法(引擎检查点:①③attempt 前、②④结算后、等号放行);月度 kill switch 双面准入(pipeline+agent legacy,code=budget_monthly+exit 1+台账留痕);台账双写面加锁(python fcntl ↔ lib.sh flock(1) 同锁域,并发 80 追加零丢);同参调用哈希(第 3 次同参拦 repeat_storm,双面注入);CLOSE 工件 09-budget.json+G_CLOSE 回声哨(读数≤生效帽);ERROR_CODES 9→13。

交付 B(merge 42b0f00):ops/agent/tools/breaker.mjs 跨轮通道熔断器——五通道闭集,计数码恰三员(channel_missing/channel_auth/quota,宁少算:transient/infra 永不计数),连续 3 次开断 6h,半开探活(名额先落盘防双探),fail-closed(坏文件重置闭路不炸轮),开断中调用=结构化 channel_open 信封零 spawn;tools.mjs 单一接线层(守卫序 dup→breaker→cap);readings.breaker 快照入 09-budget.json;ERROR_CODES 13→14。

典章:STANDARD P15/P16 升格五件套+D-5 挂点(30→31);序言计数去硬编码(终审修单 370c3c6,防典章滞后);DESIGN.md:74-75 翻正+一词一拼;GLOSSARY 两词;CHANGELOG 双语双对。

验证

  • 实现者红先绿后:A 期 pipeline 63/5→68/4→72/3→74/3 逐批真红;B 期 t4 装载崩/contract 17/1/pipeline 77/1 真红。
  • 两 merger 独立复算+红测重放(防假红):A=三红测(TOKEN_BUDGET=1 信封 attempts=1 无空烧/篡改 09-budget.json 门真败/第 3 次同参真拦);B=31/31(3×channel_missing→第 4 次真拦/坏删文件 fail-closed/COOLDOWN_S=1 半开恰一条);A merger 曾拦 P1=CHANGELOG 虚报,单写者补齐后合。
  • 终审门(主会话亲跑 @42b0f000+370c3c65):t4 63/0 · pipeline 78/0 · contract 18/0 · golden 9/0 · standard-check 47 OK 挂点 31 · selftest.sh 116/0 · backend ops 子集 271 passed。
  • 双轴终审:Spec 轴 PASS 零发现;Standards 轴单 P1(STANDARD 序言计数滞后)已修(370c3c6),P2×3 report-only 已留档。

部署注记

  • 零迁移:breaker.json 惰性创建(首个计数码通道结果时);ops/breaker.json 缺席=闭路,行为与现状一致。
  • 旋钮缺省即生产口径,env 覆盖经 OPS_* 前缀自动入 spawn 面;SPAWN_CONTRACT_ENV 对拍闭集已扩(6+2 员)。
  • backend 触面恰 2 文件(_ops_store.py 台账锁+并发测试),查询/融合/物化面零改动。

closes #199

- 新模块 ops/agent/pipeline/budget.mjs:六旋钮读面(readBudgetKnobs,点形字面读=对拍
  扫描器可见;校验沿 mkCtx 判例非负有限否则 usage:true exit 2)+四界纯函数
  (overCallsCap/overTokenBudget/overSpendCap/elapsedWallS/overWallClock)。
- pipeline.mjs 检查点:①③ attempt 前(try 外直抛=不重试);②④ 结算后(try 内,
  fatalBudget 标记 catch 首行重抛——宁少算:违界即停,不重试不逐假设降级);
  ③ 步边界(runStages,resume 已记录步/dry 零调用不查);mkCtx 读旋钮入
  state.budget_knobs+ctx.modelCalls;runResume 重建同补。违界已写工件照留(哲学①)。
- ERROR_CODES 闭集 9→13 词一次落:budget_exceeded/wall_clock_exceeded(A1)、
  budget_monthly(A2)、repeat_storm(A4)——词表先立产者随批(验收门3 视 A 批一体)。
- SPAWN_CONTRACT_ENV += 6 旋钮(24→30 名,contract 表对拍同步);selftest-contract
  SRCS += pipelineBudget。
- selftest-pipeline += 5 判例(A1-纯函数边界/墙钟首步拦/token=1 终态且工件留存/
  调用帽=1 DEEP 前拦/旋钮非法 CLI exit 2)。红期:PASS=63 FAIL=5(budget.mjs 缺+零执法);
  绿期:PASS=68 FAIL=0;contract 17/0;t4 58/0;standard-check OK=48 FAIL=0。
- budget.mjs A2 段:monthNow(容器本地 YYYY-MM)/monthSpendOfLedgerText(纯解析:
  当月行 Σcost,缺 cost 行 skipped 计数不猜——无证据即无话;表头/异形日期不计)
  /admitMonthly(等号=帽内放行)/readLedgerTextLocked(flock(1) 同锁域 <ledger>.lock,
  #139 形制;无台账=空起步)/monthlyAdmission(读→解→裁全流程)/appendRefusalTrace
  (经 lib.sh ledger_append,备注列 budget_monthly refused est=X cap=Y)。
- pipeline.mjs runPipeline:mkCtx 后建轮目录前准入;拒=emitFail(budget_monthly)+
  留痕行(写败不翻转裁决:宁拒不跑);读数入 state.monthly_admission(A5 工件面)。
- agent.mjs runRound 同面准入(先于模型装载——拒跑零花费;毒缝哨兵测试钉死);
  main catch 增 e?.usage→exit 2 分支(旋钮非法纯 stderr,mkCtx 判例同形);
  est=OPS_PIPELINE_BUDGET_CNY 同读同校验。
- selftest-pipeline += 4 判例(纯函数解析边界/超帽拒跑 e2e+无轮目录+留痕行/
  帽内放行对照/legacy 面同码同留痕)。红期:PASS=68 FAIL=4(monthNow 等未导出);
  绿期:PASS=72 FAIL=0;contract 17/0;t4 58/0。
- 注:t4 未设 LEDGER_FILE 的 in-process runRound 现读 worktree docs/ops/ledger.md
  (无文件=0 起步过);golden/contract 均显式重定向,不受影响。
- _ops_store.py:LEDGER_LOCK_NAME='ledger.md.lock'+ledger_lock_path()+_ledger_lock()
  (形制同 #139 _queue_lock:O_CREAT 常驻不删,flock 挂 open file description 死即释);
  append_ledger 读-建头-写全段入锁。
- lib.sh ledger_append:建头+追加全段入 flock "$LEDGER_FILE.lock"(内层 bash -c
  位置参数传参;建头窗也入锁——锁外建头=表头覆写已追加行的窗)。
- budget.mjs:ledgerLockPath 派生单源(读面/留痕行/对拍哨共用);readLedgerTextLocked 改用。
- selftest-contract += 锁路径对拍哨:python LEDGER_LOCK_NAME ↔ node ledgerLockPath
  同源同址 + 三面接线钉死(budget 读面 flock/lib.sh 写面 flock/python 写面 _ledger_lock)。
- backend test_append_ledger_concurrent_no_lost_rows(2×40 子进程并发,形制沿
  #139 queue 判例)。红期:期望 80 实际 40(丢行近半,读-建头-写互窗);绿期:
  pytest tests/test_ops_store.py 22 passed;selftest-contract 补哨后复跑见 A-REPORT。
…json 工件面(A5 落)

- budget.mjs A4 段:canonicalJson(递归键序稳定,数组保序)/dupKey(sha256(tool+canonical)
  前 16 hex)/dupRecord(attempt 即计;第 limit 次拦,limit=0 停用)/dupTop(观察面前 N)。
- tools.mjs ToolHost:beforeToolCall 先于每工具计数帽做同参拦(判例 2026-10-24 01:59
  同参白烧:同参数重发零新读数);合法瞬态重试≤2 不受影响(1+1=2<3);registry/limit
  构造期置(host 级,旋钮单源 budget.mjs)。
- microprobes.mjs mkMicroprobeHost:三微探针 execute 前置 dupGuard,拒=repeat_storm
  拒绝信封(与 budget 闸同形:不执行不入登记不发 seed);registry/dupLimit 经
  faux.mjs runRealStep 从 ctx 传导(轮次级累计,ctx.dupRegistry)。
- 红期:selftest-pipeline 72/3(canonicalJson is not a function/block undefined/
  strict-equal);绿期 75/0、contract 18/0、t4 58/0。
- 修作途中事故:python 批量插入 dupGuard 行首跑自嵌套致 SyntaxError(dj 重复声明),
  逐块重排修复;runResume ctx 注释吞属性(fixturesDir/modelFace 被 // 注释掉)已正字。
- steps.mjs CLOSE:先于 pkg 存在性早退写 09-budget.json(报告缺席轮预算面仍必落)——
  env=七旋钮生效值(含 OPS_PIPELINE_BUDGET_CNY,语义注记:DISPATCH 截断=准告警线,
  真执法=A1 四界);readings=usage 快照/model_calls/wall_s/dup_top3(A4 观察面)/
  monthly(A2 准入投影;replay 面 null)。
- gates.mjs G_CLOSE:inputs+=09-budget.json;形状校验(七键 finite+五读数面)+读数≤
  生效帽回声对拍(model_calls/token/cost/wall/monthly 投影;单面超帽=门败 reason 带数字)。
  门=回声哨防工件漂移/篡改,非二次执法(环内 A1 检查点已执法;GATE_SEQUENCE 派生自动跟随)。
- golden cases.json pipeline_health_full_faux += 09-budget.json 桩(七旋钮值+model_calls=4
  +monthly.ok=true+三读数面 matches;判例=#189 04-deep conflict 字段桩同步同形)。
- selftest-pipeline += A5 两测+工件清单收 09-budget.json;测试判例:A5 全轮测试须净树
  (mkTree)——共享 DOCS 树文件尾已积 in-flight 条目,VERIFY 幸存集被先前轮吃空
  (survivors=0≠假设=2 假败,非 A5 回归)。
- 红期:selftest-pipeline 74/3(工件缺+inputs 缺+复评缺);绿期 77/0、golden 9/0、
  t4 58/0、contract 18/0、standard-check OK=48 FAIL=0、selftest.sh 115/0。
- tools/breaker.mjs:纯核(五通道闭集/计数码恰三员 channel_missing,channel_auth,quota——宁少算;
  fail-closed 坏文件重置闭路)+有态壳(原子写跨轮持久/半开探活名额即落盘/三转移台账+events 留痕)
- tools.mjs:信封出口单层包(dup→breaker→cap 顺序自决;开断拦=结构化 code=channel_open;finish 信封码回结算)
- error-codes 13→14 词 channel_open;SPAWN_CONTRACT_ENV 追 OPS_BREAKER_THRESHOLD/COOLDOWN_S
- pipeline mkCtx 轮始校验 breaker 旋钮(同 budget 判例);CLOSE readings.breaker 快照(只读零写,回声律)
- 门:t4 63/0(红期 55/崩:模块缺)+contract 18/0(红期 17/1:14 词)+pipeline 78/0(红期 77/1:快照缺)
…LOG 双语

- STANDARD:P15/P16 半缺→已有(#199 A/B 落地注记);D-5 主张「补课腿」→已接线,挂点行+tools/breaker.mjs#mkBreaker(挂点 30→31);建议区月度 kill switch/跨轮熔断器两行落地即删(建议 12→10)
- DESIGN:74 预算四界【状态:未实现】翻正(A 行,B 批翻);熔断器行补已落地注记
- GLOSSARY:铸词 预算四界(一行式);跨轮熔断词条改落地口径;预扣结算词条去补课清单陈句
- CHANGELOG:交付B 双语条(含部署注记 breaker.json 首个计数事件自动创建/红期数字/典章收口清单)
- 门:standard-check 47/0 挂点31 建议10 原语22(已有12/半缺7/缺3)
@steponeerror
steponeerror marked this pull request as ready for review October 25, 2026 11:24
@steponeerror
steponeerror merged commit a7c0f15 into master Oct 25, 2026
3 checks passed
@steponeerror
steponeerror deleted the feature/pr3b-budget-breaker branch October 25, 2026 11:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PR3b: 预算四界(P15 月度 kill switch+环内执法)+ 跨轮熔断器(P16)

1 participant