Free

CLAUDE.mdを「憲法」として書く

CLAUDE.md を憲法として書く。禁止事項、振る舞いルール、既定の判断。5 日 92 commits、迷走なし。


5 日間で 92 コミットを積み、プロダクトを本番投入した(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 はプロジェクトの大枠とテストの走らせ方を知っているが、技術判断は毎回ゼロから下す。

憲法風に書くと、こうなる: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 は「web3.js を動かす Node サービスを足しますか?」と訊かなくなる。その道はデフォルトで閉ざされている。

ポイント:各項目は 明確絶対 であること。「TypeScript はなるべく避ける」ではなく「TypeScript を入れない」と書く。曖昧さは Claude にとって「交渉可」と読まれる。

振る舞い指令はコードスタイルより 10 倍重要

CLAUDE.md の最後の大きなブロックは「Claude Code 使用規約」、こう書かれている:

### 私が「X を始めて」と言ったら
1. CLAUDE.md の制約がそのアプローチを許すか先に確認
2. 既存コードに関連実装がないか確認(車輪を再発明しない)
3. コードを書く前に新しいブランチを切る
4. 実装後にテストを走らせる
5. 自動 commit しない——コードが書け、テストが緑になったら止まって
   報告する。私が明示的に "commit" と言うまで commit しない

### 私が「アイデアがある」と言ったら
すぐにコードを書かない。先に:
1. 理解が正しいか確認(言い直す)
2. CLAUDE.md の制約と照らす
3. 潜在的な問題やより良い代案を指摘
4. 私の確認を待ってから動く

### 技術的な分岐に出会ったら
CLAUDE.md に明示がないとき:
1. デフォルトで「より Rails ネイティブ」を選ぶ
2. デフォルトで「依存が少ない」を選ぶ
3. デフォルトで「一人開発者がより速く回せる」を選ぶ
4. 迷ったら止まって尋ねる

これは「snake_case で命名」よりも 10 倍重要だ。

コードスタイルはコードを読めば学べる。だが「いつ立ち止まって尋ねるか」「『アイデアがある』と聞いたらまず言い直して確認する、すぐに書かない」——こういう振る舞いパターンはコードからは学べない。

いちばん効くのは:分岐でどちらにデフォルトするか。この一行で、あなたが部屋にいないとき(例えば「X を始めて」とだけ言って離席するとき)に Claude が何をするかが決まる。これを明文化すれば、放っておいて働かせられる。

技術判断を変えるときは、先に 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 カード + featured contracts + GenericErc20Adapter
  • Day 5: AI ネイティブ発見(llms.txt + .well-known/mcp.json)+ モバイル対応

PR の平均寿命は 30 分。大規模リファクタなし、「さっきの方向が違った、巻き戻し」もなし。

Claude が魔法だからではない。session ごとに 565 行のレールの上を走っていたからだ。TypeScript を入れないこと、Solid Queue がデフォルトキューであること、view 関数のキャッシュが 60 秒であること、各 service が call クラスメソッドを実装すること、commit の前に私の確認を待つこと——全部知っている。

これらの制約を半分剥がせば、こうなる:毎日 30 分「なぜ X を使わないか」を説明し、5 分「ついでに」入った依存をレビューし、Gemfile が静かに崩れていく。

自分のを書き始めるには

白紙から始めるな。直近で痛かった判断から始めろ。

最近 Claude にやられたのが「すぐ新しい依存を入れる」なら、禁忌リストを書け。
「すぐにアーキテクチャを変える」なら、アーキテクチャ図 +「マイクロサービス追加・DB 入れ替えは要確認」。
「テストを書かない」なら、「単体テスト必須の範囲」。
「コミットが攻撃的すぎる」なら、「自動 git commit 禁止、明示指示まで待つ」。

痛むたびに 1 行追加する。それ以外は当面書かない。

3 ヶ月後には 500 行の CLAUDE.md ができている。そのすべての行が、具体的な「もう二度とこれをやらせたくない」の裏返しだ。このドキュメントはどんなテンプレートよりも効く。あなたのプロジェクト、あなたのワークフロー、あなたのチーム(一人でも)の現実的な制約に厳密に合わせ込まれているからだ。

憲法は一発で書き上がるものではない。具体的な衝突が一つひとつ結晶化していく。


ソース: github.com/defi-io/smarts