一个有清晰章节标题的 CLAUDE.md——”## 数据库规则”、”## UI 规则”——每次编辑都把每个章节加载到上下文中。Claude 在生成 React 组件时看到数据库命名规范,有时会应用它们。标题是给人类的组织辅助,不是给模型的执行边界。
.claude/rules/ 中的 path 专属规则才是执行边界。不匹配当前文件路径的规则在结构上不存在于上下文中。它们不是被降低优先级、不是在响应时被过滤、不是被标记为低相关。它们根本不加载。
不匹配规则的行为
编辑 src/components/Button.tsx 时:
| 规则文件 | Paths | 加载? |
|---|---|---|
| react.md | src/components/**/* | 是 |
| terraform.md | terraform/**/* | 否 |
| python.md | src/backend/**/*.py | 否 |
| security.md | (无 paths) | 是 |
没有中间状态。没有”加载了但降低优先级”。没有”在上下文中但标记为不适用”。Terraform 和 Python 规则在这次编辑的模型上下文中不存在。
为什么重要:交叉污染问题
一个项目有 500 行规则,跨 Python、R 和 LaTeX,报告说 Claude 把 Python 风格规则混进 R 代码、在 Python 文件中应用 LaTeX 规范。
加显式指令——“以下规则只适用于 Python 文件”——没用。指令是同一个加载上下文中的文本。模型把所有加载的指令当作潜在适用的引导来处理。
把每个领域的规则移到 .claude/rules/ 并加 path frontmatter(scripts/**/*.py、viz/**/*.R、papers/**/*.tex)完全修复了。交叉污染从每周 8 次降到零。不是因为模型变聪明了——是因为错误的规则停止加载了。
量化影响
一个团队把 500 行 CLAUDE.md 迁移到 5 个 path 范围的规则文件并跟踪了两周结果:
| 指标 | 之前 | 之后 |
|---|---|---|
| 每会话加载行数 | 500 | 80(平均) |
| 配置上下文开销 | 11% | 2% |
| 规则遵循率 | 85% | 94% |
| 错误领域事件/周 | 8 | 0 |
84% 的加载内容减少不是因为规则被删了——它们全都还在。只是在相关时才加载。
遵循率提升(85% → 94%)不是巧合。当 Claude 看到 80 行相关规则而不是 500 行混合内容时,它应用得更可靠。更少噪音意味着更好的聚焦。
“Claude 够聪明”的论点
一个团队负责人提议:“把所有东西留在 CLAUDE.md。Claude 能根据章节标题判断哪些规则适用。”
这混淆了两个独立问题:
- Claude 能识别相关规则吗? — 通常能,但不总能。跨领域的相似模式(命名规范、错误处理)导致交叉应用。
- 无关规则该消耗上下文 token 吗? — 不该,不管模型多聪明。一个有 7 个领域约 700 行规则的项目中,聚焦会话(1-2 个领域)浪费了 70-85% 的规则上下文在永远不会被应用的内容上。
Path 规则同时解决两个问题。它们通过结构性缺席防止交叉应用,并释放上下文 token 给实际工作。
正确的拆分:CLAUDE.md + Path 范围规则
处处适用的通用标准属于 CLAUDE.md——它们始终加载,这对通用规则是正确行为。
领域专属标准属于 .claude/rules/ 加 path frontmatter——只在编辑匹配文件时加载。
一个 Python 会话加载:通用标准(CLAUDE.md 的 100 行)+ Python 规则(python.md 的 120 行)。总计:220 行而不是 450 行。TypeScript 和基础设施规则不在。
在规则文件中对通用标准用 paths: ["**/*"] 技术上能用,但是不必要的复杂。CLAUDE.md 已经提供始终加载的行为,不需要 glob 模式。
跨领域:Path 规则 + MCP 工具
Path 专属规则也补充 MCP 工具配置。一个有 Python linter 和 React 组件 MCP server 的项目可以用 path 范围规则引导工具选择——Python 规则对 src/api/ 文件激活,React 规则对 src/web/ 文件——确保模型对正确的代码区域使用正确的 MCP 工具。
一句话总结: 不匹配的 path 规则从上下文中缺席,不是降低优先级——这种结构性缺席消除交叉污染并释放 70-85% 浪费的规则 token。