为什么这些层是被拼接,而不是被排序
首先看看有多少个交互面,因为大多数人运行的数量比他们想象的要多。
文档列出了 CLAUDE.md 的位置,“按加载顺序,从最广泛的范围到最具体的范围”。一个托管策略(managed policy)文件,被描述为保存“由 IT/DevOps 管理的组织级指令”,位于系统路径——macOS 上的 /Library/Application Support/ClaudeCode/CLAUDE.md,Linux 和 WSL 上的 /etc/claude-code/CLAUDE.md,以及 Windows 上的 Program Files 路径。用户指令位于 ~/.claude/CLAUDE.md。项目指令位于 ./CLAUDE.md 或 ./.claude/CLAUDE.md。
然后是那些容易被遗忘的文件。在工作目录之上的目录层级中的每个 CLAUDE.md 都会在启动时加载。它们旁边的每个 CLAUDE.local.md 也会被加载。你下方子目录中的文件也会被发现——“它们不是在启动时加载,而是在 Claude 读取这些子目录中的文件时被包含进来。” 并且 .claude/rules/ 可以存放任意数量的 markdown 文件。
六个交互面,加上每个目录层级一个,再加上一个规则文件夹。现在来看看其机制:
“所有发现的文件都会被拼接进上下文中,而不是相互覆盖。”
拼接。不是合并出一个胜者,也不是被覆盖——而是追加。顺序是有文档记录的——“内容按从文件系统根目录到工作目录的顺序排列”,因此“距离你启动 Claude 较近的指令最后被读取”,并且在目录内 CLAUDE.local.md 排在 CLAUDE.md 之后,因此“你的个人笔记是 Claude 在该层级读取的最后一项内容”——但顺序并不等于优先级。最后被读取并不意味着获胜。
规则文件夹使这一点从隐式变得显式:
“没有paths前置元数据(frontmatter)的规则在启动时加载,其优先级与.claude/CLAUDE.md相同。”
相同的优先级。直接阐明。文档没有描述这些层之间的平局决胜机制,而没有描述的原因就在整篇文档中最重要的一句话中:
“Claude 将它们视为上下文,而不是强制配置。”
这就是问题的根源。这些文件不是由优先级引擎解析的配置;它们是被放入提示词中的文本。文档坦率地说明了后果——“因为它们是上下文而不是强制配置,你编写指令的方式会影响 Claude 遵循它们的可靠性。具体、简洁、结构良好的指令效果最好”——并指出了逃生通道:“要阻止某项操作,无论 Claude 做出什么决定,请改用 PreToolUse 钩子(hook)。”
这值得欣赏,而不是抱怨。其他工具确实公布了优先级顺序。GitHub Copilot 将个人指令记录为最高优先级,组织指令为最低。Tabnine 记录其管理控制台的优先级高于本地指南文件。Cursor 记录团队规则优于项目和用户规则。这些工具中的每一个都换取了确定性,但代价是让你无法仅通过一个文件就知道模型会看到什么。Claude Code 的答案是,一切都是上下文,没有任何东西会默默胜出,这把调和工作交给了你。
今年这一点之所以更加重要,是因为托管策略层。组织现在可以向每台机器部署一个 CLAUDE.md,并且最近的 Claude Code 版本移除了托管 claudeMd 过去会触发的安全批准对话框——因此它是悄无声息地到达的。该文件是由不了解你项目的人编写的,它与你的文件拼接在一起,当它与你的文件发生冲突时,没有任何机制进行仲裁。这就是许多诸如 Claude 遗忘内部约定 之类报告背后的机制:约定在上下文中,而与其不一致的内容也在上下文中。
人们尝试的其他方法
在项目文件中更强硬地重复该规则。 有时有效,因为文档确实提到具体且结构良好的指令会被更可靠地遵循。但它也会使文件膨胀,而且两条强调的矛盾指令仍然是两条矛盾的指令。
将规则放在 CLAUDE.local.md 中,因为它最后被读取。 基于“最后等于赢家”的假设。文档描述的是顺序,而不是优先级,并明确指出文件是被拼接的,而不是相互覆盖。
删除用户级文件。 有效但代价高昂。你的个人偏好并不是问题所在;它们与项目标准之间的真实冲突才是。
将所有内容移入一个庞大的项目 CLAUDE.md 中。 这确实消除了跨文件冲突,但它违反了大小指南——文档建议每个文件控制在 200 行以内,并指出较长的文件“会消耗更多上下文并降低遵循度”。你用冲突问题换取了遵循度问题。
询问 Claude 它正在遵循哪条规则。 合理的诊断,/context 确实列出了加载的记忆文件,而 /status 命名了生效的托管源。但是,让模型对任意选择进行反思并不能让该选择变得不那么任意。
使用钩子。 文档自身对硬性约束的建议,并且对于阻止操作是正确的。但钩子无法告诉 Claude 你的团队最终决定采用两种代码风格约定中的哪一种。
规律是,这六种方法都试图在冲突中获胜。但没有一种能消除冲突。而两个命令式指令之间的冲突无法通过对它们进行排序来消除,因为对它们进行排序所需的信息并不在任何一个文件中。
解决方法:让矛盾无法发生,而不是可解决
三个步骤:查看实际加载的内容,给每个层分配一个任务,并消除矛盾累积的原因。
步骤 1:列举上下文中实际存在的内容
在会话中运行 /context 并阅读“记忆文件”(Memory files)下的列表。这是权威的答案,而且通常令人惊讶——比如某人去年添加的、位于上级三个目录处的 CLAUDE.md,一个你遗忘的 CLAUDE.local.md,以及 .claude/rules/ 中无条件加载的四个文件。同时运行 /status 并检查 Setting sources 行,它命名了适用于你的托管源,这样你就能知道是否有组织文件在起作用。
审计时需要注意两个记录在案的奇特行为。导入是真实的内容:CLAUDE.md 可以使用 @path/to/import 语法引入其他文件,这些文件在“启动时会被展开并加载到上下文中”,因此一个只有一行的文件也可能会很大。此外,导入解析“会跳过 Markdown 代码跨度(code spans)和围栏代码块(fenced code blocks)”——反引号中的路径保持字面量,而反引号之外的相同路径则会导入文件。如果你记录了没有反引号的路径,你可能会导入你本意只是想提及的内容。
同样有用的是:块级 HTML 注释在“内容注入 Claude 的上下文之前会被剥离”,这使得它们成为给人类维护者留便签的绝佳位置,且不会消耗 token。
在会拾取其他团队文件的单体仓库(monorepo)中,claudeMdExcludes 可以跳过它们。这是针对真实冲突源的真实解决方案,也是此列表中唯一一个从上下文中移除文件而不是重新排序的方法。
步骤 2:给每个层分配恰好一个任务
现在分配范围,使任何两个层都不会产生分歧,因为每个层讨论的都是不同的事情。
托管策略(Managed policy)保存真正属于组织层面的约束——安全要求、合规规则、许可。这些是团队中没人会争论的事情。如果它对框架持有意见,那就是你冲突的来源,你需要去和部署它的人沟通,而不是修改你的项目文件。
用户指令(User instructions)保存你个人的工作喜好:回复风格、终端偏好、快捷键。这里不应该包含任何关于项目的内容——这是导致规则与队友的规则默默产生分歧的最常见原因,也是导致让 Claude 坚持你的编码风格变得异常困难的相同错位。
项目指令(Project instructions)保存关于此仓库的真实情况:命令、约定、架构事实。这是应该共享和评审的文件。
带有 paths 前置元数据的 .claude/rules/ 保存任何有条件的内容。这是重要的一点,因为受路径范围限制的规则不会与针对不同路径的规则发生冲突——它们绝不会同时相关。将规则从无条件文件中移入受 paths 限制的规则中,可以将潜在的矛盾转化为两个互不重叠的陈述。没有 paths 的规则会以与项目文件相同的优先级无条件加载,因此只要规则确实是针对特定文件的,就请使用前置元数据。
技能(Skills)保存特定任务的流程。文档对这种划分非常清晰:规则“在每个会话或打开匹配文件时加载到上下文中”,而对于“不需要一直存在于上下文中的特定任务指令,请改用技能”。
一个能帮你省去一下午时间的客观事实:“Claude Code 读取的是 CLAUDE.md,而不是 AGENTS.md。” 如果你的仓库已经有了针对其他工具的 AGENTS.md,文档中记录的方法是让 CLAUDE.md 导入它,这样两者读取相同的内容,而不是两个文件逐渐偏离。两个偏离的文件就是最纯粹形式的冲突问题。
步骤 3:记录决定,而不仅仅是规则
在步骤 2 之后,你将剩下少数真正的矛盾——即两个层确实对同一件事意见不一,且两位作者都有其理由。
你无法通过对层进行排序来解决这些问题。“使用内部 HTTP 客户端”与“使用标准库客户端”作为两个命令式指令是无法调和的。但如果你知道其中一个是在内部客户端是唯一支持所需代理的客户端时编写的,而标准库在后来的版本中获得了该支持,那么问题就会瞬间解决。
这些信息从未存在于任何一个文件中,因为 CLAUDE.md 是存放命令式指令的地方。这意味着你今天解决的每一个冲突,在下一次有人编写没有写明原因的命令式指令时,都会重新出现。自动记忆在这里有一点帮助——Claude 会在每个仓库维护自己的学习和纠错库,并在每个会话中注入,上限为文档记录的前 200 行或 25KB——但该库是 Claude 根据你的纠错编写的,而不是你团队做出的决定及其原因的记录。
在 MemoryLake 中进行设置
MemoryLake 在每个指令文件之外保存决定及其原因,并通过 MCP 或 API 回答关于它们的问题。你的 CLAUDE.md 文件保持简短和命令式,并完全按照文档记录的方式加载;当其中两个文件不一致时,它们各自存在的原因就在你可以查阅的地方,而不是去猜测哪个层应该获胜。
步骤 1:创建 API 密钥
生成密钥并在大约三十秒内发出你的第一次请求。在上述步骤 2 之前执行此操作,这样在整理各层时,你就有地方记录每个冲突。

步骤 2:上传你的第一批记忆
梳理步骤 2 中的冲突以及你继承的规则。对于每一项,写下决定了什么、拒绝了什么以及原因。没人记得原因的规则是最有价值的条目,因为这些规则将会被重新争论。支持文档和文件也放在同一个地方。

步骤 3:连接你的 AI 和智能体
允许 Claude Code、Codex、Devin 以及你的其他智能体通过 MCP 或 API 进行访问。当某条规则看起来不对时,“为什么这会在这里”的答案会伴随着它的推理过程一起呈现,而不是作为一个声音更大的重复陈述。

这在实践中改变了什么
第一个改变是你的文件变短了。一旦原因存在于其他地方,CLAUDE.md 就是一个命令式指令列表,这正是 200 行以内指南所要求的,也是文档所说的能提高遵循度的方法。
第二个改变是大多数冲突不再存在,而不是被解决。一个受 paths 限制的规则和另一个受不同路径限制的规则绝不会同时存在于上下文中。这是一种结构性的修复,而不是排序。
第三个改变是托管策略层不再令人害怕。当组织文件仅包含真正的组织约束,而你的项目文件包含项目事实时,拼接正是你所期望的——两个互不重叠的陈述集。
第四个改变是,任意选择的那句话不再适用于你关心的任何事情。Claude 可能仍然会在两条矛盾的规则之间任意选择;但你只是不再提供矛盾的规则了。这是对 Claude Code 遗忘项目上下文 以及 智能体忽略你的指令文件 背后这类抱怨的实际解决方法——指令并没有被忽略,它只是被相邻的指令“投票否决”了。
多层 CLAUDE.md 设置的最佳实践
在调试任何内容之前运行 /context。 加载的记忆文件列表是事实来源,它通常比你预期的要长。
每层一个任务。 组织约束、个人偏好、项目事实、条件规则、任务流程。如果两个层可以讨论同一个主题,它们最终一定会讨论。
积极使用 paths 前置元数据。 限定范围的规则不会与针对其他文件的规则发生冲突。这是目前成本最低的冲突消除方法。
保持项目文件在推荐的大小以内。 文档的目标是 200 行以内,并指出较长的文件会降低遵循度。按主题拆分到 .claude/rules/ 中,而不是让一个文件不断膨胀。
绝不要将项目事实放入你的用户文件中。 这是导致规则与队友的规则不一致且无法被评审的最常见原因。
除非你打算导入,否则用反引号包裹路径。 导入解析会跳过代码跨度,因此反引号是提及文件与加载文件之间的区别。
导入 AGENTS.md 而不是复制它。 Claude Code 读取的是 CLAUDE.md,而不是 AGENTS.md,两个手动维护的相同约定副本必然会产生分歧。
对硬性约束使用钩子。 文档明确指出,这些文件是上下文而不是强制配置,而 PreToolUse 钩子是无论 Claude 做出什么决定,你用来阻止某项操作的方法。
结论
Claude Code 诚实地记录了其指令文件:所有发现的文件都会被拼接进上下文中,而不是相互覆盖;没有 paths 前置元数据的规则会以与项目文件相同的优先级加载;整个集合被视为上下文而不是强制配置;如果两条规则相互矛盾,Claude 可能会任意选择其中一条。这里没有需要学习的隐藏优先级引擎,这也意味着当你的两个文件意见不一时,没有任何机制可以进行申诉。
因此,不要再试图在这些冲突中获胜,而是停止提供冲突。列举实际加载的内容,给每个层分配一个主题以使各层不会重叠,用 paths 限制所有有条件的内容,并保持文件足够简短以便被遵循。然后,在所有文件之外的某个地方记录每条规则存在的原因——因为决定冲突的层不是文件路径或加载顺序。而是是否还有人记得这条规则是干什么用的。