文章揭示 AI Agent 权限控制中,规则描述用排序而非窄化策略效果更好;通过 AST 解析 gate.py 保证 World.commit 只有一个调用点,使越权行为可被结构化检查。
Level 2 的 Arc Ops 决定了 Agent 可以花多少钱。没有任何层级决定了它可以做什么。这是唯一一个守卫不是数字而是一个人的层级,首先需要衡量的是这个人是在回路中,还是只存在于 Prompt 里。
def fire(self, effect, approval=None, *, now=0, idempotency_key=""):
reason = self._check(effect, approval, now, idempotency_key)
if reason:
self.refusals.append((effect.id, reason)); raise Refused(reason)
self._world.commit(effect, now) # ONE call site, after the guard
结构化的主张是被检查的,而不是被断言的。one_door() 用 AST 解析 gate.py,精确报告:只有一处 World.commit 调用位点在守卫之后;零个子类覆盖 fire;零个 _check 方法被允许读取 Approval.read,因此没有任何层级可以评价自己的警觉性。
然后 34 个 Agent 程序——plan、ask、edit、fire、retry、stop——穿过该规则的四个层级,由一个 Gate 无法触及的账本评分。地面真值是世界的一个属性,而不是你的配置:如果一个 effect 的类型是不可逆的,那么它需要一个 yes,所以收窄策略永远不会收窄什么被算作失败。
这一结论将第 70 天的收件箱分流邮件结果独立地泛化到了任何不可逆 effect。Level 2 是几乎所有框架都自带的 Gate,它提交了 9 个没人读过的 effect:edited、regenerated、truncated、target-changed、approved as a stub、fired after the kill switch。Level 1 到 2 是关于谁批准的,六个程序。Level 2 到 3 是关于他们批准了什么,九个。
Repo: https://github.com/dev48v/arc-ops - MIT,依赖 = [],513 个 pytest 其中 144 个新增于此,commit 30ef14d,218 个页内断言:https://dev48.infy.uk/arcops/level3-approval-gates.html
反转,这是整个系列中最尖锐的一个
将 require_human_for 扩展到不可逆类型之外,有害事件从 8 上升到 11,增长了 1.38 倍——而覆盖率保持在 1.0000,未批准不可逆事件保持在 0。Gate 可以报告给自己的每一个数字都是平的,而实际损害却在上升,并且所有 11 个有害 effect 都持有一份正确签名、未过期、范围内、一次性的批准。
机制在于评审者。在全范围内,55.8% 的批准是橡皮图章式的,并且每小时超过 30 次批准后,有一半的 yes 是未被阅读的。这个 effect 在零中断成本下存活了下来,只在每小时 2400 秒的评审时间——每小时四十分钟,一个全职评审者——时才被清除。
而修复方法不是更窄的策略。是一个 sorted()。保持全范围,但先读不可逆项:有害事件从 11 降到 7,胜过每一个更窄的范围。
另外两个花钱的。单次使用不能修复重放,因为重试和重放在线路上是字节级相同的,所以严格花费拒绝了 25 次尝试,其中 4 次是真正被批准的,而 {strict, declared-intent} x {L0 store, none} 的 2x2 矩阵只有一个干净的格子。在 70 个单元上的摘要消融给每个字段定价:target 值 20 次 miss,amount 值 20,verb 值 10——所以一个仅 payload 的摘要,也就是人们写的那个,miss 了 30。
接下来是 L4,确定性和重放。L3 可以证明一个人对这些确切字节说了 yes;但它不能告诉你为什么 Agent 提出了它们,也不能确定它是否会再次提出它们。九个层级,四个解锁:https://dev48.infy.uk/arcops.php