我早上打开终端,第一件事是翻 agent 夜里跑完留的汇报。几十条。“这个函数没人调用”“测试全绿”“报错是配置问题,已经改好”。措辞都很像回事,我照着往下做,然后发现三条里有一条是它顺着上下文猜的。
改法不用绕弯:在项目根的 CLAUDE.md 里钉一段标记规则。
## 结论标记(强制)
每条结论前必须三选一:
[P] 已证明 — 附命令输出 / 日志片段 / 文件行号,且证据来源你无法写入
[U] 未证明 — 你有推理,但拿不出上述证据
[F] 失败 — 你尝试取证,取不到
仅凭你自己陈述支撑的,永远只能标 [U]。
⚡ 起作用的是最后那句。“不许编造”“不确定就说不确定”这种提示词我写过十几版,基本一下午就失效;而“仅凭自身陈述永远只能标 [U]”是一个结构性约束:它想打 [P],就必须先跑一条命令、翻一个文件,再把输出贴上来。
为什么是三档而不是两档,这个我试过。只写“已证明 / 未证明”的时候,agent 会把“我查不到”的东西塞进“未证明”里,语焉不详地蒙混过去。加上 [F] 这一档,它必须自己区分“我没查”和“我查了但取不到”。这两种情况的处理方式完全不同,前者我要重新下指令,后者我去补日志源。
第二个改动,给所有 subagent 的 prompt 尾巴上加一句:
汇报时每条结论后附一条能直接粘回终端跑的复现命令。
跑不出同样结果的,标 [U],不要写成结论。
这一条比上一条更管用。要它附命令,它就得真跑一遍;附不出来,多半是根本没查。这周拦下两次“缓存没命中”——一次是它没清缓存就下结论,一次是它读的是前一天的日志。这两次如果我不看,就得自己去翻,二十分钟起步。
这套东西不是我琢磨出来的。Cygnux Labs 的 Bravish Ghosh 上个月底在 arXiv 上挂了一篇 PCM,五十页,戳的点很直接:A2A、MCP 这些协议解决的是信道认证,可发消息的那一方本身就是不可信的,被提示注入的 agent 能把捏造的事实和权限在系统里一路传下去。他的解法是每条声明自带证据——证据取自智能体写不进去的只追加日志,附包含证明,由它控制不了的签署方签名,接收方离线校验。
我一开始觉得这是学术自嗨。三值判定?多签两个算法不就完了。后来想明白我错在哪:签名证明的是“这条消息是某个 agent 发的”,不证明“这个 agent 说的内容有依据”。前者是信道问题,后者才是每天在耗我时间的问题。这两个问题经常被当成一个。
再往下挑,权限那部分我只抄了一半。论文里授权链的根是一条被记录在案的人类批准,链上的范围只能收窄。落到我机器上:
// .claude/settings.json 里给 subagent 的允许清单
// 只给我当前任务要用的那几项,它自己不能加
"permissions": { "allow": ["Read", "Bash(git diff:*)", "Bash(pytest:*)"] }
它不能给自己申请新工具、新目录、新的网络出口,只能从我给的那份里往下减。这周下来它没再自己往外伸手,也可能是我盯得紧,不好说到底是谁的功劳。
还有一条是过期证据。论文基准里 PCM 漏收的那 10 条谎,全是过期证据造成的,1.4%。我这边对应的是另一种情况:它引用的日志是分支切走之前的,引用仍然成立,环境已经变了。所以我的规则里加了个时间窗:
引用超过 6 小时的日志或命令输出,必须重跑一次再标 [P],
否则降级为 [U]。
六小时这个数是拍的,你也可以按自己项目的提交频率改。
数字只记一组就够:926 条真实消息里 712 条是谎言,纯 A2A 全收,六种现有协议的建模实现收 504 到 712 条,PCM 收 10 条。换算一下——你要是一天看八十条 agent 汇报,按这个比例,五十多条在“只认信道”的思路下是会被当真的。这个数不是我测的,是它基准上的结果,我要的只是方向:判据从“谁发的”换成“拿得出什么”。另外两个独立的验证器在全部 926 条上判定完全一致,单条一毫秒级——这意味着校验能在本地跑,不用回连什么服务,这是我愿意把它搬进日常工作流的前提。
坑也说一句。作者摘要里给的材料地址是占位链接,我点进去是空的,一致性测试向量和验证器实现都没拿到。上面这套三档标记,我是照着论文描述自己写的,不是跑过它的实现。真要抠判定一致性,现在没法抠。上次我推荐那个把 Caps Lock 映射成 Ctrl 的方案,后来和另一款软件的全局快捷键撞了,这回学乖了,先把边界说清楚。
最后是频率。如果你手上就一个 agent,一天问三五次,这套东西的收益抵不过写规则的功夫,频率不够的地方较真就是给自己上刑。我做这个是因为一天几十条,其中至少三分之一会真的改我下一步动作,剩下那些标个 [U],我一眼扫过去就知道信到几分。
回本账:CLAUDE.md 那段规则我写了大概四分钟。这周拦下的两次误判,每次排查二十分钟往上。四分钟,一周内回本,之后都是净赚!
你们要是有更狠的写法——比如直接在 hook 里拦,不靠模型自觉——教教我,我还在这儿试。
