Skip to content

08 · 熔断器状态机 ​

The breaker

为什么有它:评审者也是 LLM,会退化、会被骗。如果它开始乱拒绝(或乱放行不可观测),自动档就不可信了 → 熔断:转人工、停自动倒计时。

8.1 状态与双轨阈值 ​

计数器键语义
denials权威会话 id连续被 LLM 判定拒绝的次数
totalDenials权威会话 id累计被 LLM 判定拒绝的次数
denialLog权威会话 id最近拒绝原因(上限=maxConsecutiveDenials 条,交给人工看)

触发(breakerTripped):maxConsecutiveDenials > 0 && 连续 ≥ 阈值(默认 3)或 maxTotalDenials > 0 && 累计 ≥ 阈值(默认 20);任一轨为 0 = 关闭。

8.2 状态转移表 applyBreaker decision.ts:LapplyBreaker ​

本次决议来源连续累计denialLog
human-allow / human-deny(人决定了)清零清零清空
llm-allow(LOW 放行 或 MEDIUM 接管放行)不变不变不变
llm-deny 且 llmDecided=true(真·LLM 拍板拒绝)+1+1push(超上限 shift)
timeout-* / auto-* / advisory 拒绝 / llm-failed / llm-blocked / 静态名单不变不变不变

并发安全

并发安全:计数器读-改-写(连续两个 await 之间)用 createKeyedMutex(decision.ts:LcreateKeyedMutex,接口 decision.ts:LKeyedMutex,per-key Promise 链)串行化——同会话并发审批不会丢失一次 +1;不同会话保持并发。

生命周期

生命周期:session/disposed 在锁内删除该会话键;/approval-reset 清两个计数器 + denialLog + 全部 6 张 approvalState 表(reviewStates/followExpiry/reviewVerdicts/resolvedCallIds/timeoutFeedback/decisionFeedback)。

8.3 触发生效后的人工面 ​

恢复路径:① 人做任何决定 → 双清零;② /approval-reset(命令为可选注册,slashCommandsEnabled 默认关——未注册时熔断只能靠人工决定/会话销毁恢复);③ 会话销毁 → 删键。LLM 放行不清零:applyBreaker 对 llm-allow 返回「不变」——只有 human-allow / human-deny 清零,llm-deny 且 llmDecided=true 递增。评审失败(llm-failed)不计熔断 —— 失败怪线路/超时,不怪 LLM 判断。