「Cordon 的核心想法:semantic transaction」
今天很多 Agent runtime 仍然把工具调用当成一串孤立 RPC:
Agent 请求工具 → runtime 检查或审批 → 工具立即执行 → 结果放回上下文。
这个接口很方便,但它给了 runtime 一个错误的安全边界。 很多风险不是某一个工具调用本身明显危险,而是多个看似正常的步骤组合起来之后才危险。
论文里的例子是一个故障诊断 Agent:
- 读取应用日志;
- 运行命令总结故障;
- 写一份 remediation note;
- 把摘要发到值班 Slack。
单独看,每一步都合理。读日志是为了排障,跑命令是常规操作,写 note 和发 Slack 也符合 incident response 流程。 但如果日志里包含 API key,后续 summary 又从这些日志派生出来,最后进入 Slack 消息,那么风险就不是“某一步是否违规”,而是这条链路:
secret-bearing log → derived summary → Slack message。
真正需要判断的是:这整段任务执行流,是否应该被提交。
Cordon 提出的是 semantic transaction,可以翻译成“语义事务”。
它借鉴了数据库事务的直觉,但事务对象不再是几条数据库写入,而是一段 Agent 任务中的工具意图、结果来源、本地状态、外部副作用、授权和恢复证据。
一个 semantic transaction 会把这些东西绑在一起:
- tool intents:Agent 想做哪些工具操作;
- result lineage:每个结果从哪里来,又影响了后续什么;
- staged local state:本地写入、删除、配置修改先暂存;
- pending external effects:消息、API 调用、网络请求先不真正发出;
- delegated authority:这次任务被授权到什么范围;
- audit/recovery metadata:发生了什么、为什么允许或拒绝、失败后如何恢复。
「语义事务如何工作」
论文把 semantic transaction 抽象成一个 task-level commit protocol。通俗地说,它分三步:

第一步,prepare。
Agent 发出的工具意图进入事务。可回滚的本地修改,比如写文件、删文件、改配置,会先进入 staged state; 外部效果,比如 Slack 消息、API 请求、网络发送,会先进入 pending effect set。
第二步,validate。
系统不是只看最后 payload,而是一起看 lineage、authority、staged state 和 pending effects。 比如一个 Slack 消息是否从 secret-bearing log 派生,一个配置写入是否由不可信输入触发,一个删除集合是否超过策略阈值。
第三步,commit 或 abort。
如果事务有效,本地状态被提升到真实 workspace,外部效果被释放。 如果无效,本地 staged state 被回滚,pending external effects 被阻止,并留下审计记录。

「三个关键机制」
第一,result lineage:追踪结果从哪里来。
Cordon 会把工具返回值、文件内容、命令输出、摘要、临时 artifact、最终回复候选都视为 result object。 每个 result object 都带来源和依赖边。所以风险判断不再只是看字符串里有没有 API key,而是看:这个外发内容是否由敏感结果派生?
这能覆盖很多普通 DLP 或 regex secret scanner 不容易覆盖的情况,比如摘要、编码、改写、跨 turn 上下文携带。
第二,shadow state:本地改动先不要污染真实工作区。
Agent 写文件、删文件、运行命令产生的本地变化,会先进入 transaction-scoped shadow state。 同一个任务后续步骤可以看到这些 speculative changes,但真实 workspace 在 commit 前不会暴露它们。 如果验证失败,shadow state 可以直接丢弃;如果验证通过,再提升到真实 workspace。
第三,effect outbox:外部副作用先不要发出去。
本地文件还能回滚,但外部世界很难回滚。邮件发出去了,Slack 发出去了,webhook 调用了,API 更新生效了,就很难假装没有发生。
所以 Cordon 把外部效果先放进 effect outbox。只有事务验证通过,且具备对应授权后,outbox 里的 effect 才会 release。
这也是 Cordon 的边界意识:它不声称可以撤回已经被外部世界观察到的 effect,而是尽量在 release 之前把它们 stage 住。
「Runtime 架构:在 tool-dispatch boundary 插入事务控制面」
Cordon 的实现不是要求重写整个 Agent,而是在 tool-dispatch boundary 插入一个 transactional control plane。
这个位置很关键:工具名、参数、资源路径、目标 sink 都已经具体化,但真实文件修改、网络发送、服务更新还没有发生。
在运行时,Cordon 会创建或恢复当前 task 的 transaction context。这个 context 记录:
- semantic intents;
- result objects 和 lineage;
- staged writes/deletes;
- pending external effects;
- authority 和 approval obligations;
- audit 与 recovery evidence。
Validation engine 最后消费这个 context,决定 commit、abort、approval,或者进入 audit/recovery。

「关键不是多拦一个点,而是拦住整条链」
最新版论文的评估覆盖了 45 个 risk-bearing multi-tool workflows,另外还有 5 条 deterministic rollback trajectories,以及两个标准 benign agent benchmark。
在 45 个风险工作流中:
- plain execution:45/45 都提交了 policy-violating effect;
- 由现有防御边界抽象出的 strategy adapters:只有 14/45 能在 commit 前拦住,另外 31/45 要么漏掉,要么只能事后发现;
- Cordon:45/45 都在 commit 前拦截。
这个结果说明,Cordon 的优势不是某个单点 classifier 更强,而是它把结果来源、本地变化、外部效果和授权放到同一个事务里验证。

论文还分析了两个典型 case:
- routine helper command:表面看只是普通命令,但实际写入了 .ssh/config 这类敏感路径;
- cleanup command:仍在允许的 workspace 内执行,但组合效果是 high-fanout delete。
这两类问题,单看 tool request 或 sandbox boundary 都可能不明显;Cordon 的 transaction view 能把隐藏写入和 staged delete set 显式化,在 commit 前阻断。
「性能:有事务开销,但也减少了很多无效长链路」
最新版论文里,端到端性能表按 45 个风险工作流统计,task time 包含 approval wait:

如果计入当前原型里的 approval wait,reject-on-risk 平均任务时间从 25.55s 降到 23.64s,降低 7.5%。 approve-all 和 mixed 因为审批交互增加了 21.8% 到 22.7% 的端到端延迟。
但同时,所有 transaction-mediated 模式都显著减少了模型工作量:token 使用下降 23.6% 到 28.4%,LLM calls 从 162 降到 119 到 127。
论文摘要中还特别强调,如果排除 approval wait,transaction-mediated execution 的平均任务时间相对 plain execution 降低 24.6% 到 27.9%。这背后的原因是:在 derived-secret egress 等长链路风险里,Cordon 会更早到达验证边界,不让 Agent 继续走完整个危险执行路径。

「回滚:不是“事后 git reset”那么简单」
Cordon 的 rollback suite 用 5 条 deterministic failed-agent trajectories 测试失败恢复。
结果是:
Git restore/reset 看起来也很快,但会留下 untracked artifacts 和 staged effect traces。 reset+clean 能清掉更多东西,但仍然会在 permission-drift trajectory 上失败。

Cordon 的优势是:它不是按整个 workspace 做粗粒度恢复,而是按 transaction scope 丢弃 staged state, 并且保留 effect、authority、audit 这些恢复语义。
它会不会影响正常任务完成?
论文还用 benign benchmark subset 做了 sanity check:
在这些标准 benign 任务上,它没有显著降低 benchmark-visible correctness。

局限性与边界条件
Cordon 的保证依赖一个前提:相关工具和副作用必须进入它的 mediated transaction runtime。
如果某个插件完全绕过 runtime,或者一个外部 service 隐藏了不可观察的副作用,Cordon 不能假装自己还能完整回滚。 它能做的是记录 lineage、authority context 和 recovery metadata,把这种情况作为 crossed boundary 进入 audit 或 compensation。
另外,Cordon 也不让外部世界“物理可回滚”。已经发出的消息、已经调用的 API、已经被远端看到的网络请求,都不能简单撤销。所以 Cordon 的重点是 staging:尽量在 irreversible commit 之前验证。
「总结」
Tool-using Agent 的风险,不只是“模型是否会说错话”,而是“模型驱动的工具副作用是否应该提交”。
Cordon 的贡献,是把 Agent 工具执行从一串立即生效的 RPC,变成一个 task-level semantic transaction:
其他机制往往只看一个点。Cordon 看的是整段任务执行流,并在副作用真正变成 durable 或 externally visible 之前, 给它一个可以验证、回滚和审计的提交边界。