你把 AGENTS.md 写成咒语大全,Agent 还是会乱改

AGENTS.md 最该做的不是塞满规则,而是把 Agent 带到正确的规则门口:OpenSpec 管 WHAT,Superpowers 管 HOW,AGENTS.md 管 WHERE。

AGENTS.md 分层职责图

晚上十一点多,我盯着终端里那段 diff,第一反应不是生气,是有点懵。

我明明只让 Agent 改一个很小的接口判断。结果它顺手动了 service,改了 model,又把测试绕过去了。最后还很认真地补了一段解释:这些改动是为了保持架构一致性。

这句话最气人。

它不是胡来。它看起来甚至很努力。可你知道,这个项目里权限逻辑不能这么碰,数据库字段不能顺手改,测试没跑就说“已验证”更不能接受。

于是你打开 AGENTS.md,开始往里面加规则。

不要乱改。不要跳过测试。不要引入没确认的依赖。不要动工作区外的文件。不要提交。不要重构。不要假装验证。

过几天,它还是会在另一个地方犯同类错误。

更烦的是,它不是每次都乱。小改时挺听话,一到多文件联动、接口变更、数据库字段、安全策略,它又开始像一个拿到权限但没进过项目组的人:先动手,动完再解释。

这时候很多人的第一反应是继续加规则。

AGENTS.md 越写越长,CLAUDE.md 越写越像公司制度,Cursor Rules、OpenSpec、Superpowers、各种 skill 又各写一套。最后真正开工前,Agent 先读半天,人也要猜半天:今天到底该按哪份规则来?

问题不一定是规则太少。

更多时候,是你把不同层级的规则塞进了同一个入口。

AGENTS.md 不该是咒语大全。它更像 Agent 的入职导航。

它最重要的工作,不是把每一条纪律都背给 Agent 听,而是告诉它:这类问题去哪里读、什么事情必须先停下来、哪些文件才是当前项目真正的制度。

AGENTS.md 越长,未必越稳

AGENTS.md 官网对它的定位很朴素:README 是给人看的,AGENTS.md 是给 Coding Agent 看的。构建步骤、测试命令、代码约定、安全注意事项,这些不适合塞进 README 的 Agent 细节,可以放在这里。

这句话容易被误读。

很多人会把它理解成:既然 Agent 会读 AGENTS.md,那所有规则都往里面放。

于是一个文件开始膨胀:项目背景、架构说明、业务概念、测试命令、提交规范、分支策略、重构原则、安全边界、调试流程、代码风格、长期 roadmap,全放进去。

看起来很完整。

但 Agent 真正执行任务时,完整经常不等于清楚。

你让它修一个拼写错误,它读到一堆“重大变更必须先开 proposal”;你让它改认证策略,它又在同一个文件里看到“低风险修改可以直接执行”。规则没有分层,它就只能临场猜:这次到底算 typo,还是架构变更?

不给 Agent 分级,它就会把 typo 和架构重构用同一种速度处理。

这不是模型笨,而是制度没说清。

人类团队不会把新人入职手册、年度规划、数据库迁移审批、单元测试规范、代码评审 checklist 全塞进同一页 Notion。因为每类信息解决的问题不一样。

Agent 也一样。

它需要入口,但入口不是仓库垃圾桶。

一个更好的结构:让 AGENTS.md 只负责带路

我最近看到 Linux DO 上 Hexon-X 分享的一套做法,核心不是“写了一个很长的 AGENTS.md”,反而是把根目录 AGENTS.md 压成了入口。

根据主楼贴出的文件内容,它大概指向这些层:

1
2
3
4
5
/AGENTS.md                  # 入口索引 + 环境/工具链事实
/CLAUDE.md                  # 仓库级 AI 协作规则
/OpenSpec/AGENTS.md         # spec-driven 变更流程
/OpenSpec/project.md        # 项目领域知识与架构约定
/OpenSpec/roadmap.md        # 长期规划、缺口和优先级

这套结构真正有价值的地方,不是文件名本身。

你完全可以不用 CLAUDE.md,也可以不用 OpenSpec。重要的是它把几种经常混在一起的东西拆开了。

AGENTS.md 只告诉 Agent:本项目的总规则去哪读,变更流程去哪读,项目知识去哪读,roadmap 去哪读;当前 shell、OS、包管理器和常用命令有什么坑。

它像一个门牌系统。

门牌系统不负责审批预算,也不负责写代码。它只负责让人不要走错楼层。

真正的协作章程,放到 CLAUDE.md 或等价文件里:哪些事能直接做,哪些事要先收集上下文,哪些事必须等人确认。比如把任务分成 L0、L1、L2:

1
2
3
L0:拼写、注释、格式化、单文件小修,可直接执行并验证
L1:多文件联动、局部重构、中等功能,先理解上下文再给计划
L2:新模块、数据库/权限/安全/性能策略、跨模块重构,先走 proposal

变更治理,再交给 OpenSpec 这类 spec-driven 文件:proposal 怎么写,tasks 怎么拆,design 什么时候需要,spec delta 怎么归档,实施中发现范围变了该怎么办。

项目知识,放到 project.md:技术栈、架构分层、业务概念、API 路径、安全约束、并发热点、验证命令。

roadmap 只放长期缺口和治理方向。它不是任务单,更不是让 Agent 自己发挥的愿望池。

这样拆完以后,AGENTS.md 反而可以更短。

短不是偷懒。短是因为它终于不抢别的文件的工作了。

OpenSpec 管 WHAT:这次到底要改什么

OpenSpec 的价值,不是让你显得流程很正规。

它解决的是一个更具体的问题:高风险变更不能只存在于聊天里。

你让 Agent “顺手把授权逻辑优化一下”,这句话在人脑里可能只是一个小需求,但落到代码里可能牵涉权限模型、数据库字段、API 契约、兼容性、测试策略。

如果没有一个变更对象,Agent 很容易直接开工。

开工之后,范围就开始滑。

先改 service,再改 model,再改 handler,再补测试,最后突然发现前端也要改。你问它为什么动这么多,它会给你一段很合理的解释。合理不代表可控。

OpenSpec 这类流程适合管 WHAT:

1
2
3
4
5
proposal.md  # 为什么要改,改到什么边界
spec.md      # 外部行为或能力契约是什么
design.md    # 必要时说明技术方案和取舍
tasks.md     # 实施步骤,做完一项勾一项
archive/     # 完成后归档,沉淀正式约定

它的核心不是文档,而是审批门。

什么算新能力?什么算破坏性变更?什么算安全策略调整?什么算性能优化但可能有回归风险?这些都应该在变更流程里说清楚。

只写“重大变更先规划”没有用。

Agent 不知道什么叫重大。

你要写成可判断的触发条件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
必须先开 proposal:
- 新增模块、新接口、新能力
- 跨模块重构或抽象重塑
- 数据模型、API 契约、权限策略变化
- 认证、限流、安全策略调整
- 大规模性能优化或缓存策略变化

可以直接做:
- bug 修复
- 拼写、注释、格式化
- 非破坏性配置调整
- 已有行为的测试补充

这才是制度。

不是因为它严肃,而是因为它把“能不能直接动手”从模型感觉变成了项目规则。

Superpowers 管 HOW:动手时用什么纪律

另一个常见混乱,是把 OpenSpec 和 Superpowers 放在同一层比较。

这很容易吵偏。

OpenSpec 更像变更治理。它关心的是:要改什么,为什么改,边界在哪,谁批准,怎么归档。

Superpowers 更像执行方法。它关心的是:怎么 brainstorm,怎么写计划,怎么 TDD,怎么系统性 debugging,怎么在完成前 verification,怎么请求 code review。

一个管 WHAT,一个管 HOW。

你不能指望 OpenSpec 替你执行 TDD,也不该让 Superpowers 替代项目审批制度。

比如一个 L2 变更已经通过 proposal,接下来进入实现阶段。这时候 Superpowers 这类方法论就有用:先写计划,先复现问题,先定义验证标准,小步提交,完成前跑测试,请求 review。

但如果一开始就没说清楚这次变更能不能做、边界在哪里、哪些行为不能破坏,再强的执行方法也只是更认真地跑偏。

社区里也有人提到 Comet 这类把 OpenSpec 和 Superpowers 编排成管道的工具。这个方向很有意思,因为它承认两者不是替代关系,而是阶段关系:open、design、build、verify、archive。

但这里要收住。

Superpowers、Comet 都是社区工具,不是必选项。你完全可以不用它们,只保留自己的 TDD、debug、verification、review checklist。

关键不是装哪个工具。

关键是你有没有把“做什么”和“怎么做”分开。

很多项目的混乱,恰恰来自这里:审批制度还没建立,执行纪律先堆了一堆;或者流程文档写得很漂亮,真正写代码时没有任何验证习惯。

结果就是,一边有 proposal,一边还是不跑测试。

AGENTS.md 管 WHERE:让 Agent 去正确的地方读规则

AGENTS.md 最稳的位置,是 WHERE。

它告诉 Agent 去哪里找。

去哪里找仓库总规则。去哪里找变更流程。去哪里找项目知识。去哪里找 roadmap。去哪里找验证命令。当前机器是 Windows、macOS 还是 Linux,shell 是 bash 还是 PowerShell,rgfdjqgh 这些工具是否可用,PATH 有什么坑。

这些信息很适合放在入口文件里。

因为它们影响 Agent 第一轮行动。

一个好的 AGENTS.md,开头应该像这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Agent entrypoint

- 仓库协作总规则:./CLAUDE.md
- 变更治理流程:./OpenSpec/AGENTS.md
- 项目知识与架构:./OpenSpec/project.md
- 长期规划与缺口:./OpenSpec/roadmap.md

执行前:
- 先判断任务等级:L0 / L1 / L2
- 涉及 L2 变更时,不直接改代码,先按 OpenSpec 开 proposal
- 任何验证结果必须来自真实命令输出,不要凭感觉说“已验证”

这比写一百条“不要乱来”有效。

因为它不是在训话,它在路由。

AGENTS.md 不该和 OpenSpec 抢“变更流程”的职责,也不该和 Superpowers 抢“执行方法”的职责。它只要把 Agent 带到正确位置,已经很有价值。

WHAT HOW WHERE 三层职责分离

全局规则越短,项目规则越具体

Linux DO 那个讨论里,13 楼有个简化派观点很重要:全局规则不要太长。

这点我很认同。

全局规则应该只放普适纪律:不越权,不碰工作区外文件,不假装验证,不做未请求的抽象,不引入投机性功能,版本敏感问题先查官方文档。

这些规则每个项目都适用。

越通用,越应该短。

项目规则则相反。它应该具体到当前仓库:技术栈是什么,目录结构怎么分层,哪些模块不能乱动,测试命令是什么,认证逻辑有什么坑,数据库迁移要怎么验证,提交信息要不要避开内部协作痕迹。

全局规则太长,会和工具本身的系统提示词打架。

项目规则太短,Agent 又只能靠猜。

一个比较稳的分层是:

1
2
3
4
5
6
全局纪律:少而硬,约束基本行为
项目入口:短而准,告诉 Agent 去哪读
协作章程:定义任务等级、确认边界、验证要求
变更流程:proposal / tasks / design / archive
项目知识:架构、业务、技术栈、坑点、验证命令
roadmap:长期缺口、优先级、完成标准

注意这里的顺序。

不是越重要越往 AGENTS.md 塞。

而是越入口,越短;越项目化,越具体;越高风险,越需要审批门。

规划文件不是无人值守许可证

很多人上 OpenSpec 或类似流程时,心里其实有一个期待:是不是 spec 写好后,就能让 Agent 放一晚上,第二天回来收 80% 的成果?

有时候可以。

但不要把这个当目标。

规划文件的价值,不是取消人工判断,而是把人工判断提前。

没有 proposal 时,你是在 Agent 改完之后才发现它理解错了。那时候你要 review diff、追溯动机、回滚错误、重新解释需求。

有 proposal 时,你可以在它动手前发现问题:范围太大,任务拆错,验证不足,影响面没写,兼容性没考虑。

这已经省了很多时间。

但它不等于无人值守。

权限、安全、数据模型、计费、认证、核心链路,仍然需要人类 checkpoint。Agent 可以执行得很快,但快不是授权。

越是高风险变更,越不能把“写了规划”当成“批准开工”。

规划文件不是无人值守许可证,它只是把人工审批点提前了。

你明天可以怎么改自己的项目

如果你现在已经有一个越来越长的 AGENTS.md,不用推倒重来。

先做一件事:把它拆开。

第一步,把入口瘦身。

只保留这些:规则入口、项目知识入口、变更流程入口、roadmap 入口、工具链事实、读取顺序。其他东西先挪出去。

第二步,补一张任务分级表。

不用复杂,先写清楚 L0、L1、L2。小修能直接做,中等改动要先计划,高风险变更必须 proposal。关键是把“高风险”写成具体触发条件。

第三步,把验证写成表,而不是口号。

1
2
3
4
5
逻辑修改:跑单测 / 类型检查
接口修改:跑接口冒烟 / 集成路径
前端交互:跑构建 / 浏览器检查 console
数据库变更:验证迁移、回滚、读写影响
配置变更:验证启动、配置解析、默认值

第四步,把项目知识从规则里拿出来。

技术栈版本、架构分层、业务概念、API 路径、安全约束、性能热点,这些不是纪律,是上下文。它们应该在 project.md 这类文件里稳定存在,而不是散落在聊天记录和 AGENTS.md 角落。

第五步,给 roadmap 一个边界。

roadmap 只写方向、缺口、优先级、完成标准。它不直接授权 Agent 开工。真正开工要变成 proposal 和 tasks。

这五步做完,你的 AGENTS.md 可能会变短。

这是好事。

因为一个项目真正成熟的标志,不是入口文件越来越厚,而是每类规则终于有了自己的位置。

约束 Agent 靠的不是更多咒语,而是更清楚的分层。

OpenSpec 管 WHAT。

Superpowers 或你自己的执行纪律管 HOW。

AGENTS.md 管 WHERE。

把这三件事分开,Agent 不会突然变聪明,但它至少不再需要猜:这一次,它到底该去哪找答案。

如果你已经在用 Coding Agent,不妨回头看一眼自己的 AGENTS.md。

它是在带路,还是在堆咒语?