用途:把「我希望它怎么做」写成「它能照着判的条件」。这两者的差距,就是规则写了却不生效的全部原因。
覆盖:AGENTS.md、系统提示、自定义指令、链头文件、技能包说明书。
产出:一份能被判断、能被执行的指令文件。
拿到就能跑:先写「什么时候不适用」,再写「怎么做」。 顺序反了,规则会被套用到所有场景。
大多数人写不好指令文件,是因为把三类东西混在一份里:
| 类型 | 例子 | 写法 |
|---|---|---|
| 偏好 | 称呼、语气、不要用感叹号 | 一句话,不加解释 |
| 规则 | 什么可以做、什么绝对不行 | 每条带判据 |
| 流程 | 某类事按什么顺序做 | 单独的流程文件,用指针连 |
混写的典型后果:偏好被当成规则执行(「不喜欢啰嗦」被理解成「删掉所有解释」),流程被写成规则(「每次都要先备份」变成了绝对命令,连临时文件也要备份)。
输出:三类各自分到哪个文件。
判据只有一句:这句话能不能回答「做到了没有」。
同一个意思,能不能写成可判的形式,决定了它会不会被执行。
输出:每条规则后面能打勾或打叉。
没有例外条款的规则,会被套用到所有场景——包括你说这句话时根本没想到的场景。
规则:删文件前先备份
不适用:临时文件、构建产物、可再生的缓存
这一段不是补充说明,是规则的一部分。省略它,Agent 要么机械执行(备份一堆垃圾),要么自行判断(判断往往和你不一样)。
输出:每条规则至少一个不适用场景。
做不到的时候怎么办?三种出口,选一个写清楚:
⛔ 不写出口,Agent 会自己编一个——通常是「默默按最省事的方式做」。
输出:每条规则的失败动作。
指令文件超过一屏(约 800 字),执行率就会下降。不是模型读不懂,是重点被稀释了。
拆法:
部署.md」输出:一屏以内,其余靠指针。
| 现象 | 最可能的原因 | 处理 |
|---|---|---|
| 规则写了但不照做 | 太抽象,无法判断做到没有 | 改成可判句 |
| 越写越长,还是不管用 | 背景、规则、流程混在一起 | 拆成三类,各归其位 |
| 每条都遵守,结果却不对 | 缺优先级——两条规则冲突时听谁的 | 写明「冲突时以 X 为准」 |
| 换个模型就不灵 | 规则里用了模型不懂的行话 | 换成具体动作,不用行业词 |
| 它自己决定跳过了某条 | 没有出口,它替你选了 | 补上失败动作 |
| 遵守得过死,什么都要问 | 出口写成了「停住」,且没给判断条件 | 给「什么情况下可以自行处理」 |
| 加了新规则,旧行为变了 | 规则之间有隐含冲突 | 逐条过一遍,找矛盾 |
倒数第三条是常见误区:出口写「停住」不等于安全——如果每条都写停住,Agent 会变成一个什么都不敢做的执行器。
指令文件:<文件名> · 长度 <N> 字
分三类:偏好 <n> 条 / 规则 <n> 条 / 流程指针 <n> 条
每条规则:可判句 ☑ / 不适用场景 ☑ / 出口 ☑
优先级:冲突时以 <哪条> 为准
未覆盖:<这份文件不管什么>
file: <path>
size_words: n
sections: {preference: n, rule: n, flow_pointer: n}
rules: [{text, checkable: bool, not_for: [...], on_fail: stop|degrade|error}]
priority: <文本>
out_of_scope: <文本>
checkable 为 false 的规则,会在第一次执行时被跳过——写的时候就要拦住,不要等它不生效再回头找。
N 条规则,全部可判、都带不适用与出口;超出的细节用 3 条指针连出去。
2026-11-06。指令文件的形式随产品不同(AGENTS.md / 系统提示 / 自定义指令),但「可判 + 不适用 + 出口」这三条判据与平台无关。与所执行系统的既定标准冲突时,以那个系统的标准为准。