1
1

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 Code がCLAUDE.mdを読まないとき — セッション開始時に確実に反映する3層の設定

1
Posted at

「CLAUDE.mdにしっかり書いたのに、新しいセッションを開いたら無視されていた」——Claude Codeを複数プロジェクトで運用していると、このパターンに必ず遭遇します。

CLAUDE.mdは「読んだけど優先されなかった」か「そのセッションの文脈では届いていなかった」状態になることがある。これは設定ミスではなく、CLAUDE.mdというファイルが持つ構造的な特性です。

結論

CLAUDE.mdだけに頼らず、3層で確実性を担保します。

層 仕組み 読まれるタイミング
1層: @import CLAUDE.mdから別ファイルを参照 セッション開始時・コンテキスト読み込み時
2層: UserPromptSubmit Hook settings.jsonのhookで最初のプロンプト時に実行 必ずセッション開始時(LLM判断と独立)
3層: グローバルメモリ ~/.claude/CLAUDE.md すべてのプロジェクトで参照

前提・環境

  • Claude Code(2026-10現在)
  • 確認環境: masatoman.net(Next.js 16 + MDX、記事200本規模)
  • hook実装: UserPromptSubmit / Stop / PreCompact の3種を運用中

なぜCLAUDE.mdだけでは不十分か

CLAUDE.mdは「LLMがコンテキストとして読む」ものです。これは確率的な動作を意味します:

  • 読む確率:高い(ほぼ毎回)
  • 優先される確率:コンテキスト量・プロンプト内容によって変動
  • セッション開始直後:文脈が薄い段階では優先されにくいケースがある

一方、hookは「Claude Codeハーネスが実行する」ものです:

  • 実行確率:定義されたタイミングで必ず実行(LLMの判断と独立)

この違いが3層設計の根拠になります。

1層: @import でファイルを分割する

CLAUDE.mdが長くなってくると後半の指示が「薄く」読まれる問題が起きます。@ファイル名形式で別ファイルを参照することで、役割を分けて管理できます。

# CLAUDE.md の冒頭例

@AGENTS.md           ← フレームワーク固有の注意(Next.js等)
@docs/style-guide.md ← スタイルガイドが長い場合は分割

分割の判断基準:

  • 更新頻度が違うなら分ける(プロジェクトルールは月1更新、フレームワーク注意は年1更新)
  • CLAUDE.md単体が60行を超えてきたら分割を検討
  • 「これだけ読めばこのタスクはできる」という単位で分ける

2層: UserPromptSubmit hook でセッション開始時に確実に情報を注入する

Claude Codeには「SessionStart」という専用hookはありません。代わりにUserPromptSubmit(最初のプロンプト受信時)を使います。

{
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "bash -c 'echo \"[Session] Project: $(basename $(pwd)) | Branch: $(git branch --show-current 2>/dev/null || echo none)\"'"
          }
        ]
      }
    ]
  }
}

この設定は.claude/settings.json(プロジェクトレベル)または~/.claude/settings.json(グローバル)に書きます。

重要な挙動: hookはsettings.jsonを保存した瞬間から有効になります(2026-05-14の実測で確認。セッション再起動は不要)。

3層: グローバルメモリ(全プロジェクト共通)

~/.claude/CLAUDE.mdに書けば、すべてのプロジェクトのセッションで参照されます。

## 全プロジェクト共通ルール
- ファイル削除の前は必ずgit statusを確認する
- コミットメッセージは日本語で書く

ここには「どのプロジェクトでも絶対に守りたいこと」を書き、プロジェクト固有のルールはプロジェクトのCLAUDE.mdに書きます。

3層を使い分ける判断基準まとめ

書くもの 置き場所
プロジェクト固有の戦略・ルール・禁止事項 プロジェクトの CLAUDE.md
フレームワーク固有の注意(長い) @importで別ファイル
セッション開始時に必ず確認したいこと UserPromptSubmit hook
全プロジェクト共通ルール ~/.claude/CLAUDE.md

よくある詰まりパターン

  1. CLAUDE.mdが読まれる前に別の指示が勝っている — システムプロンプトや他のファイルの優先順位
  2. CLAUDE.mdが長くなりすぎて後半が薄く読まれている — @importで分割する
  3. セッション開始直後はまだ文脈が薄い — hookで明示的に注入する
  4. @importで参照しているファイルが実際には読まれていない — ファイルパスの確認

まとめ

  • CLAUDE.mdは確率的に読まれる(ほぼ毎回だが100%ではない)
  • hookはハーネスが実行するため確実(LLMの判断と独立)
  • 3層(@import + UserPromptSubmit hook + グローバルメモリ)で役割を分けると確実性が上がる
  • まず「CLAUDE.mdが60行超え」なら@import分割、「必ず確認させたいことがある」ならhookを入れる

元記事では各層の実際の設定ファイル全文と、masatoman.netプロジェクトでの適用例も載せています → https://www.masatoman.net/articles/claude-code-claude-md-skip-structure-2026?utm_source=qiita&utm_medium=referral&utm_campaign=dist-syndication&utm_content=claude-code-claude-md-skip-structure-2026

1
1
1

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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?