Claude Code 不照审计报告做:6 个降为「建议」的原因 + 把报告当合同

你给了详细 audit report,Claude Code 我行我素——它把报告当 context 不当 contract。转成编号 checklist、一次一条执行、终点 diff 对账。

你把一份 4 页的 audit report 贴进 prompt,说「按这个全改了」就走开。回来发现:Claude 改了 14 条里的 3 条、还编了 2 条不在 report 里的”改进”、动了你没让它动的目录结构、最高优先级那条根本没碰。你花一小时写的 report 现在成了考古文物。

Claude 把长 unstructured 输入当 context——背景信息——不当 contract——必执行清单。没显式绑定(「执行 REPORT.md 第 N 条」),它读完报告、做自己的 plan、原清单悄悄降级成”建议”。修法:把报告转成编号 checklist、按编号引用、一次一条执行、终点和原清单 diff 对账。

常见原因

按命中率从高到低:

1. 报告太长,Claude 略读 + 自摘要

报告超过约 2 页,Claude 没法每条都全保真——它脑内摘要、按摘要工作。和「context 丢失」是同样的有损摘要问题,只是这次从头就发生。

如何判断:让 Claude「列出报告里所有条目,编号」对照原报告——缺的条目就是被摘掉的。

2. Prompt 说「用这份报告」没绑具体条目

「用这份报告」告诉它什么,没告诉它怎么做每条。Claude 自己出 plan、按自己 heuristic 排序、不会告诉你它偏离了你的清单。

如何判断:回看 prompt——没写「先执行 1、再 2、再 3」就是 Claude 自由挑。

3. 报告条目本身不清晰可分

「改进错误处理 + 加测试 + 更新文档」一个 bullet 三件事。Claude 做一件就当 bullet 完成。

如何判断:bullet 里有「和」「与」或多个动词——每个连词都是个隐藏子项 Claude 可能跳过。

4. 报告里有自相矛盾

第 5 条「用 async/await」,第 11 条「转 Promise chain 给 IE 兼容」。Claude 静默挑了一个方向——矛盾本身是 bug。

如何判断:自己重读报告找矛盾——你找到 Claude 也找到,它会闷不吭声地选一个。

5. 报告混了「现状」和「待办」

报告有「current state」和「changes needed」两段。Claude 误读哪条是哪类、跳过它以为已经做的、或”修”已经对的。

如何判断:有些”done”项被又动了,有些”todo”被跳了——结构性混淆。

6. 报告引用了 Claude 拿不到的领域知识

「按 Linear ticket BIL-42 的 spec 改进 billing 对账精度」——Claude 没 Linear 访问、查不到 BIL-42,就按通用”billing 改进”做了。报告一半条目引用了它访问不到的 context。

如何判断:条目引用 URL / ticket ID / Slack thread / 私 doc——Claude 把这些当 opaque。

最短修复路径

按收益从高到低。Step 1 一步搞定大多数「Claude 没听报告」。

Step 1:把报告转成编号 checklist

存为 AUDIT.md,严格编号格式:

# Audit 2026-05-22

每条独立可执行。Status 初始为 TODO。

## 1. 把密码比较从 `==` 换成 `crypto.timingSafeEqual`
- 文件:src/api/auth/login.ts:42
- 严重度:P0
- 接受标准:函数用常数时间比较;一条测试验时序攻击抗性。
- Status: TODO

## 2. 把密码重置 token TTL 从 24h 降到 1h
- 文件:src/api/auth/reset.ts:23(常量 TOKEN_TTL)
- 严重度:P1
- 接受标准:常量 = 3600;超过 1h 的现存 token 验证 fail。
- Status: TODO

[... 3-14 项类似]

「接受标准」是 Claude 完成绑定的目标——没它,“完成”就模糊。

Step 2:按编号绑 task

读 AUDIT.md。
逐条按编号 + 标题回报告确认你拿到了 14 条。
然后只执行第 1 条。
应用后把它的 Status 在 AUDIT.md 里改成 DONE。
停。等我说「proceed to item 2」。

一次一条 = 不漏 + 不编。

Step 3:执行前验证它真读懂了

读完后:

按编号 + 一行标题列出每条。不要 paraphrase。
第 7 条 quote 不出来——你的 read 不完整,重读。

这能在 session 浪费前 catch「Claude 摘要了」。

Step 4:先解决矛盾再 delegate

报告里有矛盾就在 delegate 前修:

第 5 和第 11 条矛盾。正确方向:到处 async/await。
从 AUDIT.md 删第 11 条或重写它。Claude 不能自己挑。

Step 5:执行后和原清单 diff

Claude 应用完 1-14。现在:
1. 每条确认 AUDIT.md 里 Status 是 DONE。
2. 每条 DONE 把对应 diff 贴出来。
3. 列出 diff 不符合接受标准的条目。

立刻看出哪些是真完成、哪些是声称完成。

Step 6:需要外部 context 的条目先取来

如果第 8 条引用「ticket BIL-42」:

你没 Linear 权限。第 8 条开工前让我把 BIL-42 内容贴给你。
不要用自己的解读填空。

外部 context 显式化,不要假设。

预防建议

  • 给 agent 的报告 = 编号 checklist + 显式接受标准,不是 prose
  • 按编号引用(「执行第 7 条」),不要「关于 X 的那部分」
  • 每个 session 步只一条;按接受标准验证完成再 move on
  • 报告里的矛盾和歧义自己先解决——Claude 不能闷头选
  • 外部引用显式化(把 ticket 内容贴进去),不要靠 Claude 自取
  • session 终点和原清单 diff 对账——状态漂移就是 bug 探测器

相关阅读

标签: #排查 #Claude Code #排查 #审计报告