免费

让 Claude 把 CLAUDE.md 当宪法用

CLAUDE.md 当宪法写:禁忌、行为指令、默认决策。5 天 92 commits 不偏航。


我用 5 天写了 92 个 commit,做出一个上线的产品(github.com/defi-io/smarts)。中间没翻车、没回滚、没大重构。能做到这件事,靠的不是 Claude 多聪明,靠的是项目根目录那份 565 行的 CLAUDE.md。

这篇讲一份能当宪法用的 CLAUDE.md 该怎么写、写完之后会发生什么。

CLAUDE.md 不是 README

很多人把 CLAUDE.md 写得跟 README 差不多——介绍项目是什么、怎么跑起来。这是浪费。

README 是给人看的,CLAUDE.md 是给 Claude 看的。Claude 每次开 session 会自动加载它。这意味着你写进去的每一句话,会成为它接下来所有决策的前置约束。

当 README 思路写 CLAUDE.md,你得到的是:Claude 知道项目大概是什么、知道怎么跑测试,但每次它做技术选择都是从零判断。

当宪法思路写 CLAUDE.md,你得到的是:Claude 知道哪些路不能走、哪些约定必须遵守、遇到分叉默认走哪边、什么情况下要停下来问。

差别是:前者会"顺手"给你引入一个新依赖、加一层抽象、改一下 Gemfile;后者不会。

smarts.md 的 CLAUDE.md 长什么样

我最近做的项目叫 smarts.md,一个为智能合约生成 live docs 和 MCP server 的平台。CLAUDE.md 565 行,分成这几块:

1.  项目身份(5 行)
2.  产品核心(一句话定义 + 与竞品的结构性差异)
3.  技术栈(硬性约束,YAML 格式)
4.  禁忌(明确的 ❌ 列表)
5.  支持范围(MVP 硬边界)
6.  架构(含 ASCII 图)
7.  目录结构(含每个文件的职责)
8.  Ruby 编码约定(含正反例代码片段)
9.  缓存策略(表格)
10. 测试要求
11. 部署细节
12. Git 工作流
13. Claude Code 使用约定(行为指令)
14. 90 天里程碑
15. 核心原则

每一块都不是装饰。下面挑几块讲清楚为什么要这么写。

禁忌列表是 CLAUDE.md 最有用的部分

我的禁忌列表长这样:

❌ 不引入 TypeScript / Node.js 服务
❌ 不引入 ethers.js / web3.js
❌ 不引入 Sidekiq(用 Solid Queue)
❌ 不引入 React / Vue / Svelte(用 Hotwire)
❌ 不引入 Redis(用 Solid Cache / Solid Queue / Solid Cable 全覆盖)
❌ 不做未验证合约(只接受 Etherscan 已验证)
❌ 不做 Solana / Bitcoin / Move 系(仅 EVM)

这是个 Web3 项目。Web3 圈默认 TypeScript + ethers.js + Redis + React。我反着来,理由我自己有,但 Claude 不知道。如果不写禁忌,Claude 会基于训练数据里的"行业常识"给你建议——很可能是 TypeScript 那条路。

写了禁忌之后,Claude 不会再问"要不要加个 Node 服务跑 web3.js"。它默认这条路被堵死。

禁忌的关键:每一条都要 明确绝对。不要写"尽量不要用 TypeScript",要写"不引入 TypeScript"。模糊会被 Claude 当作可商量。

行为指令比代码风格更重要

CLAUDE.md 的最后一大块是"Claude Code 使用约定",长这样:

### 当我说"开始做 X"时
1. 先检查 CLAUDE.md 的约束是否允许这个做法
2. 再检查现有代码中是否有相关实现(不要重复造轮子)
3. 写代码前先开一个新 branch
4. 实现完成后跑测试
5. 不要自动 git commit——改动写完、测试跑绿后停下来汇报,
   等我明确说 "commit" 再提交

### 当我说"我有个想法"时
不要立刻写代码。先:
1. 确认理解正确(复述一遍)
2. 评估是否符合 CLAUDE.md 约束
3. 指出潜在问题或更好的替代方案
4. 等我确认再动手

### 当遇到技术选择分叉时
CLAUDE.md 没有明确规定时:
1. 默认选"更 Rails 原生"的方案
2. 默认选"更少依赖"的方案
3. 默认选"能让一人开发者更快迭代"的方案
4. 不确定时停下来问我

这部分比"用 snake_case 命名"重要十倍。

代码风格 Claude 看代码就能学。但"什么时候该停下来问"、"听到'我有个想法'要先复述确认而不是立刻写代码"——这些是行为模式,光看代码学不到。

最关键的一条:默认行为遇到分叉时往哪走。这条决定了 Claude 在你不在场时(比如你只说"开始做 X"就走开)会做什么。写清楚这条,你就敢放手让它干活。

修改技术决策时,先改 CLAUDE.md

CLAUDE.md 头部有一行:

这份文档是项目的"第一源"。每个 Claude Code session 开始时会被自动加载。修改技术决策时,先改这里,代码再跟进。

这是个工作流约定。当我决定要换某个技术选择,比如把主力 AI 模型从 gpt-5-mini 切成 gpt-5,第一步不是改 initializer,是改 CLAUDE.md 里那一段:

ai:
  fast: gpt-5-mini      # 之前
  fast: gpt-5           # 改完

改完之后再让 Claude 顺着 CLAUDE.md 改代码。

为什么?因为代码里的某个值改了、CLAUDE.md 没跟上,下次 Claude 看 CLAUDE.md 还是旧的,它会"好心"把代码改回去。冲突的根源是单点失效——CLAUDE.md 是宪法,宪法落后于现实就会引起内乱。

把 CLAUDE.md 当宪法的关键含义:它永远跑在代码前面

写完之后发生了什么

smarts.md 这个项目,5 天 92 commits,包括:

  • Day 1: Rails 8 骨架 + Kamal 部署上线
  • Day 2: 合约文档 MVP + AI 富化 + Uniswap V3 适配器
  • Day 3: MCP server + 5 个 MCP tools + friendly slug
  • Day 4: SEO + OG card + featured contracts + GenericErc20Adapter
  • Day 5: AI-native 发现(llms.txt + .well-known/mcp.json)+ mobile 适配

每个 PR 平均寿命 30 分钟。没有大重构、没有"刚才那个方向不对,回滚"。

不是因为 Claude 神。是因为它每次开 session 都在 565 行的轨道上跑。它知道不能引入 TypeScript,知道 Solid Queue 是默认队列,知道 view 函数缓存 60 秒,知道每个 service 要实现 call 类方法,知道 commit 前要等我确认。

这些约束去掉一半,你会得到:每天花 30 分钟解释"为什么不能用 X"、5 分钟 review "顺手"加进来的依赖、一个崩坏的 Gemfile。

怎么开始写一份

不要从空白文件开始。从你最痛的那个决策开始。

如果你最近被 Claude 折腾的事情是"老引入新依赖",写禁忌列表。
如果是"动不动就改架构",写架构图 + "新增微服务、换数据库等需要确认"。
如果是"测试不写",写"必须单测的部分"。
如果是"提交太激进",写"不要自动 git commit,等明确指示"。

每痛一次,加一条。别的暂时不写。

3 个月之后你会有一份 500 行的 CLAUDE.md,每一行背后都是一次具体的"我不要它再这么干"。这份文档比任何模板都有用,因为它精确对齐你这个项目、这种工作流、这个团队(哪怕只有一个人)的真实约束。

宪法不是一次写好的。是一次次具体冲突结晶下来的。


项目源码:github.com/defi-io/smarts