我一天大概有四十次是闭着眼睛按 Tab 让 agent 改代码的。测试绿的,就切下一个任务,diff 基本不翻。
前几天刷到一篇论文,AgentGuard,14 号挂上去的。里面有个数字我盯着看了半天:
69.0%。
baseline 的 Abnormal Execution Rate。Claude Code 配 Haiku 4.5,一百个仓库任务,什么防护都没加。
让我坐直的不是这个数大。是这批任务里有相当一部分最后是"完成"的。论文里有句话我抄下来贴进笔记了,大意是——agent 把任务做成功了,不代表这次执行可靠。
它列的几类典型行为,我一条条对着自己的历史看:改了不相干的文件、动了测试、跑了不该跑的命令、校验失败了当没看见。
最后那条最要命。校验没过它不吭声,换个写法把测试搞绿,然后跟你汇报 done。不是它骗你,是你自己不看。
论文那个结果,我读出来的跟作者不太一样
AgentGuard 干的事是从历史失败轨迹里自动挖反复出现的模式,转成指令级的约束,打包成一个轻量 guardrail skill。加完之后 Abnormal Execution Rate 从 69.0% 掉到 26.7%,Successful Task Completion Rate 从 21.7% 涨到 35.0%。
看到 35% 我第一反应是,这不还是很烂吗。三分之二的任务没做完。
换个方向读这张表:一个没防护的 agent,三分之二的轨迹是脏的,真正做完的只有两成。意思是它绝大部分动作,都发生在你已经转头去干别的那段时间里,自己给自己加戏。
所以我的判断跟作者不太一样。这套框架值不值得看,重点不在它把成功率从 21.7 抬到 35,在于它逼你去数那 642 条失败轨迹——你手里没这份数据,连自己是怎么被坑的都说不清。至于 26.7%,那不是胜利,是"还有四分之一在乱来",别当终点。
能立刻抄的就一条:规则是攒出来的
论文第二个点我觉得更实用:这些约束不是手写的安全规则,全是从失败里学出来的。
对照我自己的 CLAUDE.md。一百多行,全是当时坐在那儿想出来的:"不要写没意义的注释""优先复用已有的工具函数"。用了两个月,这两条一次都没派上用场——对应的场景压根没出现过。而真正翻车的地方,改了不相关文件、动了快照、绕开失败的校验,一条规则都没写。
想出来的规则管的是想象中的问题,攒出来的规则才管你实际会踩的坑。
做法土得很,但真的管用。我现在的版本就是往一个文件里追加:
# ~/.claude/incidents.md
2026-09-12 改 A 模块顺手 reformat 了整个文件
2026-09-15 校验失败没报,换了个断言绕过去
2026-09-18 动了 tests/fixtures,没提
写清楚当时的指令是什么、它干了什么。⚡这一下——一个月后回头看,出现两次以上的合并成一条规则,只出现过一次的删掉。频率不够的动作不值得为它背一条规矩,这个道理我之前写键位那篇时也提过。规则的边际成本是你的注意力,不是文件里的行数。
规则别全挂上,按当前指令激活
论文里我第二喜欢的设计是:guardrail 只激活跟当前指令相关的那几条,约束行为的同时尽量别限制正常执行。
这条我踩过坑。以前所有规则平铺在一个文件里全量加载,模型哪条都不当回事,前面的看到后面就忘了。我现在按目录拆成几段,跑哪块代码挂哪段:动迁移的时候只挂迁移那几条,动测试夹具的时候挂另一组。
折腾了一晚上,值!
说个前提:这招成立的前提是你得先有翻车记录。而大多数人的问题恰恰是不看 diff,所以连自己被坑过几次都不知道。第一步不是写规则,是把 diff 重新捡回来看。这一步很烦,我知道,我第三天就想放弃了。
还有个体感上的限定得说清楚:那张表是在 Haiku 4.5 上跑的,你用的要是更强的模型,不会脏到 69% 这个程度,别拿它当自己工作流的诊断书。方向对,数字别照搬。
最后自嘲一句。上周为了把规则拆成按目录激活,我折腾了两个晚上。触发这次折腾的,是我为了省下看 diff 的那十秒钟。典型的因小失大,但这模块现在是真的顺。
攒翻车这个习惯,成本是一天多花三十秒记一行,回本期我估摸着一个月——一个月后你手上有一份只属于自己工作流的规则集,谁都抄不走。你们要是有更快的攒法,教教我。
