
ClaudeCodeのメモリファイルの仕様の検証してみた
こんにちは!
リテールアプリ共創部マッハチームの五反田です。
今回は、Claude Codeのメモリに関して、どういう仕様となっているのか気になったので検証してみました。
はじめに
Claude Codeでメモリとして扱われるものに関して、ユーザーが作成する「CLAUDE.md」とauto-memory機能で利用される「MEMORY.md」がメモリとして扱われセッションの開始時に必ず読み込まれるコンテキストとなります。
この中で、auto-memory機能で利用される 「MEMORY.md」に関しては200行を超えた文字は読み込まれない という仕様が存在します。
この仕様に関して、実際にどういう動作を行うか気になったため今回検証を行うことにしました。
検証結果
| 対象 | セッション開始時の読み込み | 本稿での実測の印象 |
|---|---|---|
| プロジェクト直下の「CLAUDE.md」(直書き) | 公式どおり 全文 | 100〜500 行で先頭・中間・末尾のマーカーいずれも再現可能。トークンは行数にほぼ比例 |
| 「CLAUDE.md」からの「@」インポート | 公式どおり 起動時に展開 | 直書きと実質同じ到達性。「/context」では親子が別表示になり、内訳が追いやすい |
| auto-memory の「MEMORY.md」 | 公式どおり 先頭 200 行または 25KB の短い方まで | 500 行で各行が短い場合は「/context」上は頭打ちに見える。末尾は起動直後の「知識」としては届かず、必要ならファイルツールで読みに行く |
公式ドキュメントの要約
- 「CLAUDE.md」は長さに関係なく読み込まれる — 「This limit applies only to MEMORY.md. CLAUDE.md files are loaded in full regardless of length」(Auto memory 節)。
- 「MEMORY.md」は会話のたびに、先頭から 200 行または 25KB のどちらか短い方だけが読み込まれる — 「The first 200 lines of MEMORY.md, or the first 25KB, whichever comes first, are loaded at the start of every conversation」(同上)。
- 「@path」で参照したファイルは起動時にコンテキストへ展開される — 「Imported files are expanded and loaded into context at launch」(Import additional files 節)。
検証方法
サンプル Markdown の作り方
行数が異なる Markdown を複数用意し、それぞれに次の 3 か所へ、ランダムなサフィックス付きのマーカーを置きました。
先頭:MARKER_HEAD_500_DIRECT_xxxxxx
中間:MARKER_MID_500_DIRECT_xxxxxx
末尾:MARKER_TAIL_500_DIRECT_xxxxxx
配置(比較のため同一内容を三系統で試す)
| 系統 | 内容 | パス・構成 |
|---|---|---|
| プロジェクトメモリ | 「CLAUDE.md」に本文を直書き | リポジトリ直下の「./CLAUDE.md」(検証ケースごとに行数の違うファイルへ差し替え) |
| 「@」インポート | 親の「CLAUDE.md」から本文を「@」で読み込む | 親「./CLAUDE.md」が「@chunks/body_*.md」を参照する構成 |
| ユーザーメモリ (auto-memory) |
上と同じサンプルをユーザーメモリ側に置いて比較 | 「~/.claude/projects/(プロジェクト名)/memory/MEMORY.md」 |
検証が終わるたびに、使ったファイルは削除し、前の検証の残骸が残らないようにしています。
モデルに「覚えているか」を聞く手順
- 起動後、「/context」で読み込み状況を確認する。
- ツールを使わせず、下記のように日本語でマーカーの文字列そのものを聞き、回答がファイルと一字一句一致するかを記録した。
共通のプロンプト(各マーカーで繰り返し使用):
ツールを一切使わずに、知識として持っている範囲だけで答えて。◯◯ マーカーの値は? 答えられなければ「知らない」と言って。
HEADのマーカー:上の ◯◯ を「HEAD」に読み替えたプロンプト
MIDのマーカー:同様に「MID」に読み替えたプロンプト
TAILのマーカー:同様に「TAIL」に読み替えたプロンプト
結果:「CLAUDE.md」を直書きした場合
| 行数 | 「/context」上の目安 | HEAD / MID / TAIL |
|---|---|---|
| 100 | 約 1.8k tokens | いずれも一致 |
| 200 | 約 3.7k tokens | いずれも一致 |
| 500 | 約 9.4k tokens | いずれも一致 |
結果:「@」インポートした場合
| 行数 | 「/context」上の目安 | HEAD / MID / TAIL |
|---|---|---|
| 100 | 約 1.8k tokens | いずれも一致 |
| 200 | 約 3.7k tokens | いずれも一致 |
| 500 | 約 9.4k tokens | いずれも一致 |
トークン総量は、正確には親ファイル(数十 tokens)と子ファイル本文の和のため、「CLAUDE.md」単体よりもトークンは多いです。
しかし、今回に限っては誤差の範囲です。
結果:auto-memory の「MEMORY.md」
| 行数 | 「/context」上の目安 | HEAD / MID / TAIL |
|---|---|---|
| 100 | 約 1.8k tokens | いずれも一致 |
| 200 | 約 3.7k tokens | いずれも一致 |
| 500 | 約 3.8k tokens | HEAD のみ一致、MID・TAIL は「知らない」と回答 |
実務での使い分けのヒント
チーム全体で毎回守ってほしいルールは「CLAUDE.md」にまとめる。
起動時に全文がコンテキストに載るので、長ければその分トークンを消費します。
必要に応じて読み込むようにしたい場合は、skillの機能を利用することが重要です。
auto-memory の「MEMORY.md」は200 行(または 25KB)以内とする。
詳細は別ファイルに記載し、必要ならツールで読ませる。
auto-memoryで保存される「MEMORY.md」の内容も定期的にチェックし、必要な情報が必要な分だけ保存されているか確認し余計な情報をコンテキストに残さないことが必要です。
「CLAUDE.md」に記載された「@」インポートはメンテナンス目的で使用する。
「CLAUDE.md」に「@」インポートを利用する場合、「CLAUDE.md」に全て記載するのとコンテキスト的には変わりありません。
あくまでメンテナンス目的として利用することを念頭に置き、起動時に展開され、コンテキストを消費されることに注意が必要です。
おわりに
当たり前ではありますが、公式ドキュメント通りの結果となりました。
また、検証の最中に何も指定しない場合にはReadツールを使用して「MEMORY.md」を読みに行くという事象が発生することもありました。
そのため実は200行を超えた場合もファイル内部を読み込む可能性があります。
しかし、読むか読まないかをこちらで制御できないため、必要な情報を必要な分だけ保存するというのはどちらにせよ必要なこととして認識しておいて損はないかと思います。
ここまで読んでいただきありがとうございました。







