关于「常驻指令」的争论已经围着文件名转了一年,而文件名是桌面上最无关紧要的那样东西。真正把 AGENTS.md、CLAUDE.md、Cursor 的 .mdc rules 与 Agent Skills 分开的,是它们的文字在什么时候进入上下文窗口——每一轮都进、路径匹配时才进、模型自己判断需要时才进,还是只有人打出它的名字才进——以及首先是谁被允许把文字放进那里。照这个方式归类,两件事会发生:可移植性之争塌缩成一个符号链接,而你一直没在做的那个决定浮出水面,那就是你的指引里有多少本该待在「始终加载」这一档之外。
一眼看全
四种格式,各问一个问题:谁会读它,以及什么会让它加载?
| 格式 | 谁会读 | 何时加载 | 它住在哪个作用域 |
|---|---|---|---|
AGENTS.md |
约 30 个 harness;由 Agentic AI Foundation 治理 | 始终,每一轮 | 仓库,可按目录嵌套 |
CLAUDE.md |
Claude Code | 始终,每一轮 | 仓库、用户与企业三层 |
.cursor/rules/*.mdc |
Cursor | 可声明:始终、按 glob、模型主动要,或手动 | 仓库与用户 |
SKILL.md 包 |
Claude Code、Cursor、Codex、Gemini CLI、Antigravity | 名称与描述始终在;正文按需 | 仓库、用户、市场 |
为什么「何时加载」就是全部的决定
始终加载的文字是一笔带复利的税
一个始终被加载的指令文件,会在项目的整个生命周期里被前置到每一个请求上。一份 3,000 token 的代码风格文档,就是模型在读你的问题之前先读的 3,000 token,在一次四十轮的会话里每一轮都读一遍,而代价不只是账单。长上下文的退化是有选择性的:处在一大段前言中部的指令,被遵循的可靠性不如同样的指令处在一段短前言里——于是把一切都写下来的团队,得到的服从率反而不如只写了五件事的团队。这就是值得内化的那个反直觉结论:过了某个长度之后,再加一条规则会降低对已有规则的遵循。机理在有效上下文与标称上下文里。
按需加载的文字把「服从」变成了一个检索问题
把同一份文档挪到一个「模型拿去做匹配的描述」后面,代价就降到了一句话——但你刚刚获得了一种不产生任何报错的新失效模式。一个从不被触发的技能,看起来和一个毫无效果的技能完全一样;而它唯一始终在上下文里的部分是那段描述,这意味着描述就是全部的接口,也是你唯一能调试的东西。团队常常写出一份出色的 400 行技能正文,配一句含糊的一行描述,然后得出「技能不管用」的结论。
值得抓住的那份不对称:一条始终加载的规则吵吵闹闹地失败——你会看见智能体在遵循一条过时的指令——而一条按需加载的规则安静地失败,方式是干脆没到场。所以正确的迁移次序是:先把最大、最不普适的那些文档往下挪一档,而把那些短小、真正普适的约束原封不动留在原处。
AGENTS.md——可移植的那一个,也是已经尘埃落定的那一个
它是什么
仓库根目录下一个没有 schema 的纯 Markdown 文件:构建命令、测试命令、约定,以及一个新贡献者会问的那些事。它被 Codex、Cursor、Copilot、Gemini CLI、Aider、Windsurf、Zed、Jules 以及约二十个其他工具原生读取,出现在六万多个仓库里,而它的治理已连同 MCP 与 goose 一起移交给 Linux Foundation 之下的 Agentic AI Foundation。嵌套的行为符合开发者的预期:子目录里的一份文件适用于其下的工作。
它不是什么
它不是一套激活机制。没有 front-matter、没有条件加载、除目录树之外没有作用域划分——这恰恰是它能如此轻易地移植到三十个工具的原因,也恰恰是它无法表达「只在动到 migrations 时」的原因。一个文件、始终加载、每个目录一份。它的胜利是真实的,它的天花板是低的,而两者都来自同一个设计选择。
它适合谁
每一个仓库,作为那个短小的普适层。如果你的 AGENTS.md 超过一页,那你几乎肯定往里放了本该往下挪一档的东西。
CLAUDE.md——同一档,而自九月起多了一条兜底
它是什么
Claude Code 自己的指令文件,带着一套 AGENTS.md 没有的分层模型:企业托管、用户级与项目级文件会合并,于是一个组织可以下推仓库无法覆盖的指引。真正实质性的差别是那套分层,而不是那个名字。
那次收敛
Claude Code 2.1.277 加入了对 AGENTS.md 的原生支持,以一个内置 mod 的形式交付;到 2026 年 9 月 19 日的 2.1.278,行为已经定下来了:如果没有 CLAUDE.md,Claude Code 就去读 AGENTS.md。两者同时存在时,CLAUDE.md 默认优先,而配置可以让两者都加载。这就是这场争论现已结束的那部分——那个长期挂着的「双读」请求落地了,而这两个文件剩下的差别是分层与优先级次序,不是可移植性。
它适合谁
当你需要企业层或用户层,或者需要写会让别的工具犯糊涂的 Claude 专属指引时,留着 CLAUDE.md。否则就写 AGENTS.md,让兜底去干活——这比人们一直在维护的符号链接和双文件同步脚本都要好。
Cursor rules——唯一一处「何时加载」可被声明的地方
它是什么
.cursor/rules/*.mdc 文件,带三个 front-matter 字段——description、globs、alwaysApply——它们组合出四种激活模式:给普适约束用的 Always Apply、在 glob 匹配上当前涉及的文件时的 Auto Attached、由模型读描述自行决定的 Agent Requested,以及只在 @rule-name 被提及时才加载的 Manual。老的单文件 .cursorrules 在功能上已被这个目录取代。
为什么这件事比「绑在一家厂商上」更要紧
没有别的格式让你说出一个文件坐在哪一档。这让 Cursor rules 成了这个问题上现成最好的思考工具——即便你一条都不打算交付:把你自己那份始终加载的文件过一遍,对每一段问一句,它该属于那四种模式里的哪一种。实践中,多数仓库会落在「一页普适约束、三四个按 glob 限定的约定文件、一两份手动引用」上——而发现这件事本身就是价值,因为同一种划分用技能与目录嵌套在别处也实现得出来。
它适合谁
以 Cursor 为主的团队,以及任何想审一审自己那份指令文件究竟在要求什么的人。代价是这些东西一点都不能移植:它们只被一个工具读,所以一个混用工具的团队是在 AGENTS.md 之外额外维护它们,而不是用它们取代 AGENTS.md。
Agent Skills——按需那一档,以及一种不同性质的制品
它是什么
一个文件夹,含 SKILL.md 以及可选的脚本、模板与参考文件,以渐进式披露加载:harness 把名称与描述留在上下文里,只在任务匹配时才把正文拉进来。这个格式由 Anthropic 在 2025 年 10 月引入,如今被 Claude Code、Cursor——它在 2.4 版加入 Agent Skills,读取 .cursor/skills/,并为兼容性读取 .claude/skills/ 与 .codex/skills/——以及 Codex、Gemini CLI 与 Antigravity 读取。它是继 AGENTS.md 本身之后,第二个真正立住的跨厂商约定。
技能是动词,其余的是形容词
让这场比较保持诚实的那个区分:AGENTS.md 与 rules 描述你的项目是什么,而一个技能描述智能体能做什么——而且可以挂上可执行脚本与参考材料,这是任何指令文件都没有的。这也让技能成了一件供应链制品而不是一份文档:它能携带代码、它从市场里来,而且无论它是不是 Markdown,它都是代码,依智能体技能。
它适合谁
任何长过一段、却只适用于少数会话的流程:发布手册、一份迁移配方、你部署流程的那八个步骤。请把描述当成一个检索键来写,而不是当成一个标题——「在本仓库里编写或修改数据库 migration 时使用」远胜过「Migrations 指南」,而那一句话是你唯一能调试的部分。
真正把它们分开的那几根轴
第二根轴是没人放进对比表、却会被安全评审第一个问到的那一根。这一页上每一种仓库作用域的格式,在你检出别人分支的那一刻都是受攻击者控制的:一个 fork 的 AGENTS.md、一个 PR 分支的 .mdc rules、一个被内嵌进来的技能包。这些文件是在你的第一条消息之前被加载的,而它们在功能上就是一份由「提出这个 pull request 的人」提供的系统提示词。评审一段动到指令文件的 diff,值得你给一次 CI 修改的那份注意力;而在一个不可信分支上跑智能体,值得你给「运行它的代码」的那份注意力——这与上下文污点追踪里描述的档位混淆是同一回事。
第三根轴解释了为什么那些「试过技能又回到一个大文件」的团队,通常是出于错的理由做了对的决定。始终加载的指引容易调试,因为你在每一份对话记录里都看得见它;按需加载的指引要求你先按会话记录下「哪些文件被加载了」,才谈得上对它做推理。如果你的 harness 不告诉你这件事,诚实的选择就是留在始终加载那一档,直到它告诉你为止。
什么时候选哪个
| 你想要…… | 用 | 因为 |
|---|---|---|
| 把构建、测试与约定的基本事项说一次,给所有工具用 | AGENTS.md | 三十个 harness 会读它,包括经由兜底的 Claude Code |
| 下推你的仓库无法覆盖的指引 | CLAUDE.md 的企业层 | 它是这里唯一带托管层级的格式 |
| 只对某些文件类型施加约定 | 带 globs 的 Cursor rule | 路径匹配让它不进到无关的会话里 |
| 交付一份只在少数任务里用到的长流程 | 技能包 | 渐进式披露把正文挡在基础开销之外 |
| 给一个流程挂上脚本或模板 | 技能包 | 没有哪个指令文件能携带可执行文件 |
| 不让你的智能体去遵循一个 fork 里的指令 | 用户作用域文件加评审 | 仓库作用域的文件是不可信输入 |
常见问题
Claude Code 现在会读 AGENTS.md 吗?
会,但有一个条件:自 Claude Code 2.1.277 起、并在 2026 年 9 月 19 日的 2.1.278 定下来,它在没有 CLAUDE.md 时会读 AGENTS.md。两者同时存在时 CLAUDE.md 默认优先,而配置可以让两者都加载——所以对常见情形来说,那些符号链接的绕法已经不必要了。
我该删掉 CLAUDE.md、只留 AGENTS.md 吗?
在一个没有托管策略的单仓库项目里,该——一个被所有东西读的文件,胜过两个需要保持同步的文件。如果你依赖企业层或用户层,或者你有会误导其他工具的 Claude 专属指令,那就留着 CLAUDE.md。
一份始终加载的指令文件该多长?
短到你能凭记忆把里头的东西一一说出来。一页以内是个好目标;实用的信号是:当你加了一条规则、而对已有规则的遵循度下降时,你已经越过了有用的长度,而下一条要加的东西该进技能或按 glob 限定的 rule。
技能是要取代 rules 和指令文件吗?
不是——它们占的是不同的档位。你仍然需要始终加载的文字来承载适用于每一个任务的约束,因为一条必须永远成立的规则,不能依赖于「它被检索到了」。技能取代的是一份大指令文件里那些只在某些时候才要紧的部分。
这些文件的安全暴露面是什么?
它们是在你的第一条消息之前被加载的,所以在一个不可信分支上,它们的作用等同于一份由攻击者提供的系统提示词;而一个技能包还能额外携带可执行脚本。请把指令文件的 diff 当代码评审来对待,并把「在一个刚克隆的不可信仓库里启动智能体」当作「运行那个仓库」来对待。
延伸阅读
本站相关:
- 智能体技能——按需的打包模型,以及它为何是代码。
- 上下文工程——在任务进入窗口之前,先给进去的东西做预算。
- 长上下文:有效与标称——为什么更多指令可能意味着更少遵循。
- 智能体 harness——这四种格式所配置的那一层。
- 生命周期钩子与 harness 配置——同一批包里的另一个配置面,带 shell 权限。