规格、提示、约束的分工
一次性的写规格,反复的写约束,临时的写提示。
同一句话该写在哪,取决于它要管多久。临时的写在提示里,一个模块内通用的写进规格,整个项目通用的写进约束文件。
你会遇到的现象:
- 每次对话都要重复交代同样的规矩
- 约束文件越写越长,最后它开始不遵守了
- 改到第三轮,它推翻了第一轮定好的数据结构
三层各放什么
约束是背景,规格是这个模块的设定,提示是当下的动作。生成代码时三层同时生效,冲突时以下层为准——但下层要覆盖上层,最好明确说出来,不要指望它自己判断。
| 层 | 放在哪 | 写什么 | 典型内容 |
|---|---|---|---|
| 约束 | CLAUDE.md | 整个项目一直成立的规矩 | 组件必须实现四态、间距只用这六个值、权限一律后端校验 |
| 规格 | docs/specs/模块名.md | 某个模块的数据、状态、边界 | 评论支持两层楼中楼、删除是软删除、超 500 字折叠 |
| 提示 | 你打的那段字 | 这一次要做的具体事 | 把这个按钮挪到右上角、这里的间距改成 24 |
规格这一层最容易被跳过。跳过之后,模块内的决定只存在于对话历史里,而对话历史会随着长度变长逐渐失效。「改到第三轮它推翻了第一轮定好的数据结构」,根因几乎都在这里。Claude Code 的官方最佳实践也强调把长期约定沉淀成文件,而不是靠每次对话重讲。claude-practices
举一个例子:「评论支持两层楼中楼」这句话,只在某次提示里说,下一轮它可能就忘了;写进评论模块的规格,这个模块内每次改动都会遵守;如果全站所有列表都要分页,这条就该进约束文件。同一句话放在不同层,效果完全不同。
什么时候往上挪
- **同一句话说了三次,挪进规格。**三次是个不错的阈值,比「感觉说得有点多」可靠。
- **在两个以上模块里都要重申,挪进约束。**只在一个模块成立的,留在规格里。
- **规格改了,代码也要跟着改。**反过来也一样——改了代码不改规格,规格就废了。让 AI 每次改动前先更新规格文件。
- **约束文件要定期删。**项目变了之后,过时的约束比没有约束更糟,它会让 AI 做出你已经不想要的东西。
约束不是命令
约束文件不是硬性开关。它作为一段普通内容进入上下文,模型是按概率去遵守的,不是保证执行。这意味着两件事。这就像入职手册:写得再好,新员工也不会逐条背下来,能记住的永远是那几条每天用到的。
- **所以要精简。**每一行都问一遍:删掉它会不会导致出错。不会就删。大部分人的约束文件里,一半内容是在描述项目而不是在约束行为。控制在两百行以内,写得越长,每一条被遵守的概率越低。
- **所以要复查。**关键约束不能只写在文件里,还要在当下这条指令里重申一次。做完之后让它对照约束自检一遍,成本很低。
约束往下一层,就是规格本身怎么写——见先规格后代码,四块内容里最值钱的是「未定项」,它会逼出你自己都没想清楚的地方。
