你以为规则生效了,其实是别的东西在起作用
跑一遍看结果对不对——这是最常见也最不可靠的验证方式。一次运行里至少有四个变量同时在动,结果对未必是你写的规则对。
你写了一份规则——访谈编码的框架、报告的格式要求、术语对照表——放进 CLAUDE.md 或者一个 Skill 里。跑一遍,输出看着对,于是你认为规则生效了。
这个判断多半站不住。
四个变量同时在动,你以为只动了一个
执行一次测试时,至少有四类东西在共同决定输出:
- 你写的规则本身(描述 + 内容)
- 模型和 effort 档位
- 长期上下文——三层 CLAUDE.md 叠加,加上自动记忆
- 临时上下文——当前目录里有什么文件、这个会话之前聊过什么
它们不是彼此独立的。
- 自动记忆里某条笔记会强化某个倾向,让规则看起来“被遵守”
- CLAUDE.md 里一句「结论都要标出处」,会让你的 Skill 看起来在起作用——其实是 CLAUDE.md 在推着它做
- 同一句话在 Opus 上稳定触发,换到 Sonnet 上命中率可能掉一半
- effort 从
low调到xhigh,同一份规则的执行深度能差一个数量级
单次运行只是一个观察样本。一个样本不构成证据。
这篇文章的全部立论就在这一句上。
污染从哪里进来
「上下文被污染」听着抽象,拆开看每一处都有明确的位置和生命周期:
| 污染源 | 在哪儿 | 怎么影响你的判断 | 怎么隔离 |
|---|---|---|---|
| CLAUDE.md | ~/.claude/CLAUDE.md、项目根、.claude/CLAUDE.md |
三层叠加。模型可能在听 CLAUDE.md,而不是听你的规则 | 换一个干净目录测;必要时临时把用户级那份改名 |
| 自动记忆 | ~/.claude/projects/<项目>/memory/ |
归属由当前目录路径决定 | 换目录就换了记忆空间——最省事的隔离手段 |
| 历史会话 | claude --resume |
旧对话整段还在上下文里,模型“已经知道答案” | 永远开新会话,不要 resume |
| 当前目录 | 目录里的文件 | 文件名、README、上次的输出都会被读到,等于额外的提示词 | 用空目录或一次性临时目录 |
| 其他 Skill | 已安装的技能 | 描述相近的会互相抢触发,掩盖真实命中率 | 测试时只留被测的那一个 |
最容易被忘的是自动记忆。它是 Claude 自己写的,你没主动加过任何东西,但它一直在起作用。
一份规则至少要测五件事
「跑通了」是个含糊的说法。拆开至少包含五个独立维度,它们可能在你“看起来跑通”的那一次同时发生,也可能只过了其中一个:
一、该触发的时候触发了吗
描述写得准不准,能不能被该激活的提问命中,又不被不该激活的提问误触发。
做法:同类提问跑 5 次统计命中率,再用反例提问测误触发。
二、触发之后照做了吗
被触发之后,模型是逐条执行了你写的步骤和约束,还是只读了开头就自由发挥?
做法:在规则里埋一个可验证的标记——比如「每段结尾必须写上访谈编号」——事后直接搜这个标记在不在。
这是最实用的一招。 一个可以机器检查的标记,比你肉眼读输出可靠得多。
三、换个模型还成立吗
Opus 上的稳定结果代表不了 Sonnet。小模型对触发描述的要求更显式,对长规则更容易跳步。
做法:核心用例至少在 Opus 5 和 Sonnet 5 上各跑一遍。你日常用哪个,就必须在哪个上验证过。
四、换个环境还成立吗
有没有 CLAUDE.md,行为漂移大不大?漂移大说明你的规则不够稳健,是在借环境的力。
做法:同一个提问跑两次——一次干净环境,一次带上典型的 CLAUDE.md。
五、和别的规则冲突时谁赢
存在描述相近的规则时,哪个被选中?区分度够不够?
做法:故意装上“竞争者”,跑一个两边都可能命中的提问,看分布。
三次成功是结果,一次成功是噪声
把「模型」和「维度」画成一张二维网格,每格独立跑 3–5 次看分布,而不是跑一次看结果。
| Opus 5 | Sonnet 5 | |
|---|---|---|
| 标准提问能触发 | ●●● | ●●● |
| 反例提问不误触发 | ●●● | ●●● |
| 步骤逐条执行 | ●●● | ●●● |
| 干净环境下成立 | ●●● | ●●● |
看起来啰嗦,但这是唯一能把「规则对」和「碰巧对」分开的方式。
实际工作里的简化版
上面那套是完整方法。日常没必要每次都做全套,但有三条是底线:
一、换个空目录测。 一行命令的事,一次性排掉「当前目录 + 自动记忆」两大污染源。
二、埋一个可搜索的标记。 让「有没有照做」变成一个能用 grep 回答的问题,而不是你读完输出的主观感觉。
三、跑三次,不是一次。 如果三次里有一次不对,那不是“偶尔的意外”,是你的规则本来就不稳定,只是你运气好。
一句话
「在我这儿能跑」几乎从来不是规则本身的功劳,而是模型、目录、历史上下文的某个特定组合恰好成立。
换台电脑、换个模型、换个项目,它就不成立了——而那时候你已经把它当成可靠的东西在用了。