BP12.1 · 执法契约重构——从阶段禁令到预算制#
定位:面试官追问 Agent 死锁治理 / 闸设计哲学时的拷问预备。
核心口述(30 秒)#
“一次线上换品类被 planner 误判成复用、阶段闸锁死 item_search 导致 27 轮死循环的事故,暴露了核心问题:效率闸拿着安全闸的执法权。四段重构——热修逃生门止血、看门狗兜底一切停滞、逃生规则通用化、最后用检索预算制替代阶段白名单禁令。阶段机从执法者降级为遥测+提示,死锁场景评测 76.7 → 100。“
拷问链#
Q: 效率闸和安全闸怎么分?#
判定依据是事实(计数器、标志位)→ 安全闸,永远硬拒。判定依据是推定(planner 意图)→ 效率闸,必须 fail open。阶段状态机的问题就是效率闸拿了安全闸的无限硬拒权。
Q: 为什么不修 planner 让它判得更准?#
准确率到不了 100%,禁令制下 1% 误判 = 100% 死锁。修判定不如改判错的代价——预算制让误判代价从死锁降到多花一次检索。
Q: 逃生门够了,为什么还要换成预算?#
逃生门要白挨 2 次拒绝(每次一轮 LLM 往返),它是急救包不是终态。预算制下误判时第一次补搜直接执行,零轮浪费。
Q: 预算设成 0 不就回到禁令了?#
对。所以代码里 max(1, ...) 钉死永不为 0,测试里单独一条断言守这个常量。
Q: 拆掉阶段白名单后效率谁来守?#
逐条对过:reuse 乱检索→小预算 1 次;有候选泛搜→全树检索总量预算+postfork 闸+websearch 闸;精挑完打转→LoopDetector+tool_memo+token 预算+看门狗;没干活就交卷→保留两道安全底线(候选池空/没规划精挑过)。白名单唯一独占的功能恰是它闯祸的功能。
Q: 为什么不直接删状态机?#
遥测和提示仍需要「走到哪一步」。收尾资格底线也用它判「本轮规划过没有」。删执法权,不删观测价值。
Q: 看门狗怎么判「停滞」?#
以工具真实执行成功为唯一进展口径。被拦的不算、回放的不算。停滞 45s 注入收敛指令,再宽限 30s 硬停交部分结果。
压力题#
Q: 四段重构为什么不直接跳到最终态?#
事故 on-call 先最小风险止血(热修),再加全局兜底(看门狗),再推广逃生能力(通用化),最后有足够信心拆墙。每段是下一段的信心基础——你不会在房子着火时开始重新设计消防系统。
Q: 新闸怎么决定用硬拒还是预算?#
立闸三问:① 判定依据是事实还是推定?② 误判后果可逆吗?③ 有没有全局兜底?推定→预算或带逃生;事实→可以硬但必须有看门狗,因为组合死锁不挑单个组件的对错。