Repository navigation
PR3b: 预算四界环内执法 + 跨轮通道熔断器(#199) - #200
Merged
Merged
Conversation
- 新模块 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)
… P0/P1,P2×2 留档)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 双语双对。
验证
部署注记
closes #199