3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CLAUDE.md は短くするな、移せ — 325行を仕分けて常時ロード156行で運用している話

3
Posted at

CLAUDE.md が長くなってきたとき、「短くしよう」と考えるのはたぶん間違いです。

書いたルールにはそれぞれ理由があったはずで、消していいものはあまりありません。やることは短縮ではなく、毎回読まれる場所から、必要なときだけ読まれる場所へ移すことです。うちの場合、総量はほぼ変えずに常時ロードだけ半分以下になりました。

うちは6月時点で、毎セッション読まれる分だけで約325行ありました。これを仕分け直して常時ロードを約150行まで落とし、いまは156行で運用しています。この記事は、そのときの作業手順と、迷った行をどう処理したかの話です。

なお rules/ と skills/ の線引きをどう設計するか以前の記事に、CLAUDE.md / Skills / Agents の3層構成そのものこちらの記事に書きました。この記事は設計論ではなく、すでに膨らんだ CLAUDE.md を実際に仕分けて戻す作業ログに絞ります。

前提: 何が「毎回」読まれるのか

移す先を決めるには、それぞれがいつ読まれるかを正確に把握しておく必要があります。ここは誤解しやすい部分です。

仕組み 読み込まれるタイミング
CLAUDE.md(+ @ で import したファイル) 毎セッション必ず全文
.claude/skills/<name>/SKILL.md frontmatter の namedescription は毎回本文はタスクが合致したときだけ
サブディレクトリの CLAUDE.md そのディレクトリ配下を触ったときだけ

Skill に逃がしても description は毎回読まれます。つまり 「手順の本体は本文へ、description は起動条件と照合の手がかりまで」 が正しい運用です。ここを勘違いして description に手順まで書くと、Skill 化した意味が薄れます。

長いから読まれない、という単純な話ではありません。効いていてほしい数行が、今日のタスクと無関係な指示に埋もれるのが問題です。

仕分け: 3分類に振り分ける

各行を次のどれかに振ります。

  1. 常時ルール … どの作業の日でも効いてほしい(コミット規約、触ってはいけないファイル)
  2. 条件付きルール … 特定作業のときだけ要る(記事投稿時のタグ上限、リリース手順)
  3. 参照データ … ルールではなく、必要になったら見に行く情報(料金表、エンドポイント一覧、カタログ)

1と2の線引きは前述の記事に譲るとして、実際に手を動かすと 3の「参照データ」が一番かさばっていた というのが今回の発見でした。ルールのつもりで書いていないので意識に上りにくく、しかも表形式なので行数を食います。

迷ったらこの一問です。

「この行、今日の作業と関係ない日に読まれても意味があるか?」

迷った行の実例

実際に迷ったのは「外部サービスへの投稿は、1回失敗しても再送しない」という行でした。

分類上は明らかに2(条件付きルール)です。その投稿作業をする日以外には関係がありません。素直に投稿用の Skill に入れて終わり、のはずでした。

これを常時ルールとして残したのは、踏んだときの結果が取り消せないからです。API がエラーを返したときに反射的に再送すると、同じ記事が二重に公開される可能性があります。公開されてしまうと、消しても痕跡は残ります。Skill に入れた場合、その Skill が呼ばれた文脈でしか効きません。「投稿スキルを経由せず手で API を叩いた」ような日には効かないことになります。

なので分類の一問には、実務上もう一段の例外を足しています。

「この行が効かなかったとき、あとから取り消せるか?」→ 取り消せないなら、条件付きでも常時ルールに残す

行数の節約より事故の回避が優先です。この例外に当たる行は多くありません。うちの場合は 取り消せない外部への発信(二重公開、人への送信)だけで、2〜3行でした。

逃がし先1: 参照データ → 別ファイル+「毎回ロードしない」の明記

読めば分かる情報は、本文ごと CLAUDE.md に置く必要はありません。

<!-- Before: 表をそのまま貼っていた -->
## プラン一覧
| プラン | 価格 | 内容 |
|---|---|---|
| プラン1 | 7,700円/月 | チャット、8時間以内返信 |
| プラン2 | 13,000円/月 | 月2回ビデオ + チャット |
(以下30行ほど続く)
<!-- After: 要点1行と、置き場所と、読むタイミングだけ -->
**プラン**: チャット 7,700円 / ビデオ+チャット 13,000円
(4プラン詳細カタログは `.claude/rules/plans.md` 参照・毎回ロードしない)

肝は 「毎回ロードしない」と明記すること です。パスだけ書いておくと、見つけた時点で読みに行かれることがあります。

逆に常時読ませたいものは @ 記法で明示的に import します。

@rules/workflow.md
@rules/conventions.md

@ を付けたものは毎回展開されるので、@import の数がそのまま常時ロード量です。ここを増やすと元の木阿弥になります。

逃がし先2: 条件付きルール → Skill(description の書き方が要)

.claude/skills/<name>/SKILL.md を作り、descriptionいつ呼ばれるべきか を書きます。ここが効くかどうかで、Skill が呼ばれるかが変わります。

悪い例:

---
name: db-migration-check
description: DBマイグレーションのチェックを行うスキル
---

これは「何をするか」しか書いていません。今のタスクがこれに該当するかを判断する材料がないので、必要な場面で選ばれにくくなります。

良い例:

---
name: db-migration-check
description: マイグレーションファイルを追加・編集したとき、または本番デプロイ前に実行する。ロールバック手順の有無・NOT NULL 追加時のデフォルト値・大量データ更新時のロック時間を確認する。schema.rb を直接編集した形跡があるときも起動。
---

改善点は3つです。

  • 起動条件を書いている(「〜したとき」「〜の前に」)
  • チェック対象を具体語で書いているschema.rbNOT NULL などが照合の手がかりになる)
  • 手順や前提は description に書かない(それは本文の仕事)

「短く」と書きましたが、文字数そのものより 起動条件と照合できる具体語が入っているか が要点です。目安は1〜3文で、上の良い例くらいの分量なら問題ありません。

手順の本体は SKILL.md の本文に書きます。本文はタスクが合致したときだけ読まれるので、常時ロードほどシビアではありません。ただし呼ばれた瞬間は全文が載るので、長くなってきたら references/ に切り出して本文からリンクします。

.claude/skills/post-x-thread-draft/
├── SKILL.md              ← 手順の本体(合致時に読まれる)
└── references/
    ├── templates.md      ← さらに必要になったときだけ
    └── checks.md

常時ロード → 合致時 → さらに必要なとき、と段階を作っておくと、1回のセッションで読まれる量が抑えられます。

逃がし先3: 特定フォルダの作法 → サブディレクトリの CLAUDE.md

「この資材を触るときだけ守ってほしい」種類のルールは、そのフォルダに CLAUDE.md を置きます。配下を触ったときだけ読まれるので、常時ロードには乗りません。

02_メンティー管理/
├── CLAUDE.md       ← このフォルダを触ったときだけ読まれる
├── 田中さん/
└── 佐藤さん/

「命名規則」「このフォルダのファイル構成」のような、対象が明確に限定されるルールはここが一番収まりがいいです。ルートの CLAUDE.md からは、存在と役割を1行だけ書いておきます。

Before / After

Before:  常時ロード 約325行(6月時点・規約・手順・カタログ・トラブル事例が全部同居)

After:
.claude/
├── CLAUDE.md                  65行   ← 常時ルールのみ
├── rules/
│   ├── workflow.md            27行   ← @import(常時)
│   ├── conventions.md         25行   ← @import(常時)
│   ├── pair-review.md         39行   ← @import(常時)
│   ├── plans.md               50行   ← パス言及のみ(毎回ロードしない)
│   └── x-bot.md               14行   ← パス言及のみ(Bot作業時だけ)
└── skills/                    19個   ← description は毎回/本文は合致時のみ

常時ロードは 65 + 27 + 25 + 39 = 156行(+ skills 19個分の description)。仕分け直後は約150行で、その後の追記でいまは156行です。残りは必要なときだけ読まれます。総量はほとんど減っていません。置き場所を変えただけです。

体感として変わったのは、CLAUDE.md を開いたときに「今これ関係あるか?」と読み飛ばす行がなくなったことでした。人が読んで判断しやすい状態になっていれば、指示としても素直になっているはずだ、という考え方でやっています。

AI に仕分けを手伝わせるときの頼み方

この仕分け自体を Claude Code にやらせられますが、頼み方でかなり変わります。

悪い例:

CLAUDE.md が長いので短くして

これは文章の圧縮にいきます。ルールの条件や例外が削られて、残った行の意味が変わることがあります。短くはなりますが、情報は消えています。

良い例:

.claude/CLAUDE.md の各行を次の3分類に仕分けて、表で出して。まだファイルは編集しないで。

1. 常時ルール(どの作業の日でも効いてほしい)
2. 条件付きルール(特定作業のときだけ要る → 移動先の skill 名も案を出す)
3. 参照データ(ルールではない情報 → 切り出すファイル名の案も出す)

分類の根拠を1行ずつ添えて。判断に迷った行は「迷い」として別枠にして。

違いは3点です。

  • 分類の枠を先に与えている(「短くして」は目的だけで、判断基準を渡していない)
  • まず表で出させて、編集させていない(提案を見てから実行できる)
  • 迷った行を別枠にさせている(勝手に決められると、後で気づけない)

3つ目が地味に効きます。迷いを潰させると、AI はどちらかに倒して答えを出します。倒した理由は表に出てこないので、あとで「なぜこの行が消えたのか」を追えなくなります。「迷い」枠を作らせておけば、その数行だけ自分で決めれば済みます。

まとめ

  • 短縮ではなく 移動。消していいルールは思っているより少ない
  • 分類は「毎回要るか」の一問。特に 参照データ(表・カタログ) が一番かさばる
  • ただし 踏むと取り消せない行は、条件付きでも常時ルールに残す
  • Skill に逃がしても description は毎回読まれる。手順の本体は本文、description は起動条件
  • フォルダ限定のルールはサブディレクトリの CLAUDE.md が収まりがいい
  • AI に仕分けさせるときは 分類枠を渡す・表で出させる・迷いを別枠にさせる

今 CLAUDE.md が200行を超えているなら、上の分類プロンプトを一度投げてみると、自分でも忘れていた条件付きルールがそこそこ見つかると思います。


未経験者向けの講座を運営しています

未経験から Next.js + Supabase + Claude Code で Webアプリを公開するまで を、全20セッションで体系化した教材です。Claude Code を学習パートナーにする CLAUDE.md / Skills 設計までセットで含みます。

※ この教材は Qiita 読者の方には易しすぎる内容なので、初心者の知り合いへの紹介や社内研修の参考としてどうぞ。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?