规格、提示、约束的分工
同一句话该写在哪,取决于它要管多久。临时的写在提示里,一个模块内通用的写进规格,整个项目通用的写进约束文件。
你会遇到的现象
- 每次对话都要重复交代同样的规矩
- 约束文件越写越长,最后它开始不遵守了
- 改到第三轮,它推翻了第一轮定好的数据结构
三层各放什么
| 层 | 放在哪 | 写什么 | 典型内容 |
|---|---|---|---|
| 约束 | CLAUDE.md | 整个项目一直成立的规矩 | 组件必须实现四态、间距只用这六个值、权限一律后端校验 |
| 规格 | docs/specs/模块名.md | 某个模块的数据、状态、边界 | 评论支持两层楼中楼、删除是软删除、超 500 字折叠 |
| 提示 | 你打的那段字 | 这一次要做的具体事 | 把这个按钮挪到右上角、这里的间距改成 24 |
三层之间有个顺序关系:约束是背景,规格是这个模块的设定,提示是当下的动作。生成代码时三层同时生效,冲突时以下层为准——但下层要覆盖上层,最好明确说出来,不要指望它自己判断。
什么时候往上挪
- 同一句话说了三次,挪进规格。三次是个不错的阈值,比「感觉说得有点多」可靠。
- 在两个以上模块里都要重申,挪进约束。只在一个模块成立的,留在规格里。
- 规格改了,代码也要跟着改。反过来也一样——改了代码不改规格,规格就废了。让 AI 每次改动前先更新规格文件。
- 约束文件要定期删。项目变了之后,过时的约束比没有约束更糟,它会让 AI 做出你已经不想要的东西。
约束不是命令
有一点要清楚:约束文件不是硬性开关。它作为一段普通内容进入上下文,模型是按概率去遵守的,不是保证执行。这意味着两件事。
每一行都问一遍:删掉它会不会导致出错。不会就删。
控制在两百行以内。写得越长,每一条被遵守的概率越低。
关键约束不能只写在文件里,还要在当下这条指令里重申一次。
做完之后让它对照约束自检一遍,成本很低。
