【実装解説】Claudeのメモリを棚卸しするカスタムスキル「memory-inventory」の作り方 ─ CLAUDE.mdが嘘をつき始める前に

約15分で読めます by ぽんたぬき
【実装解説】Claudeのメモリを棚卸しするカスタムスキル「memory-inventory」の作り方 ─ CLAUDE.mdが嘘をつき始める前に

【実装解説】Claudeのメモリを棚卸しするカスタムスキル「memory-inventory」の作り方 ─ CLAUDE.mdが嘘をつき始める前に

はじめに:あなたのClaudeは、いつから嘘をつくようになったか

「このPRはまだオープンのままですね、注意が必要です」

そう言われてリンクを開いたら、すでにマージ済みだった。

こういう体験、心当たりはありませんか? 大丈夫、私も最初は「気のせいかな」と思っていました。でもこれ、気のせいじゃないんです。

Claudeのメモリが静かに腐っていくという、よく知られていない問題です。

本記事では、このステールメモリ問題を解決するカスタムスキル memory-inventory の作り方を、一緒に手を動かしながら解説していきます。カスタムスキルを作ったことがない方でも大丈夫。一歩ずつ進みましょう。

本記事で作るもの

実測 → 鮮度検証(gh コマンド) → 提案生成 → 合意取得 → 退避 → 反映

この6段階で、あなたの承認を得ながらメモリを安全に整理するスキルを作ります。


前提知識:ClaudeのメモリはCLAUDE.mdとMEMORY.mdに分かれている

まずここを押さえないと、棚卸しの対象を間違えてしまいます。

ファイル 誰が書く? 役割
CLAUDE.md 人間が書くルールファイル コーディング規約・方針・永続ルール
MEMORY.md Claudeが自動書きするノート 進捗・決定・TODO・気づき

2026年2月にAuto Memory機能がリリースされてから、ClaudeはMEMORY.mdに自動で書き込むようになりました。これはとても便利なのですが、同時に自動で削除はしないという性質を持っています。

ファイルの保存場所はここです:

~/.claude/projects/<プロジェクト名>/memory/

そして、最も重要な制約がこれです:

毎セッションで読まれるのは MEMORY.md の先頭200行 / 25KB のみ

つまり、どれだけ丁寧に書いても、200行を超えた部分はClaudeに読んでもらえません。目次のリンクが不正確なトピックファイルも、永遠にアクセスされません

「書けば覚える」ではなく、「読まれる位置に置く」が本質なんです。


なぜメモリは嘘をつき始めるのか

原因は3つあります。

① 解除条件が満たされても、記述は自動で消えない

PRをマージしても、issueをクローズしても、Claudeのメモリには通知が届きません。「対応中のPR #123」という記述は、マージ後もずっと残り続けます。

② 追記は起きるが、削除は起きない

セッションを重ねるごとにMEMORY.mdは単調増加していきます。やがて200行の上限に達すると、新しい情報が重要な情報を押し出してしまいます。

③ 「古い正解」なので気づきにくい

「Node.js 18を使用」という記述は、書いた当時は正確でした。でもいつの間にかプロジェクトはNode.js 22に移行していた──。これが静かなハルシネーションの起点になります。嘘ではなく、古い正解。だからこそ厄介なんです。


設計方針:6段階の棚卸しフロー

棚卸しスキルには以下の6段階を組み込みます。

Step1: 実測     → 現状を数値で把握する
Step2: 鮮度検証 → gh コマンドで事実と突き合わせる
Step3: 提案生成 → カテゴリ別に整理案を作る
Step4: 合意取得 → あなたの承認を得る(最大4問/ラウンド)
Step5: 可逆退避 → 削除ではなく _archive/ へ移動
Step6: 反映     → MEMORY.md の目次を再構築

特に重要なのが Step5の「可逆的退避」 です。誤って必要な情報を消してしまっても、_archive/ に戻しに行けば復元できます。この安全弁があるからこそ、安心して棚卸しを進められるんです。


実装編:memory-inventory スキルを作る

ディレクトリを用意する

mkdir -p ~/.claude/skills/memory-inventory
touch ~/.claude/skills/memory-inventory/SKILL.md

SKILL.md を書く

以下が完成版のスキルファイルです。コピーして使ってください。

---
name: memory-inventory
description: |
  Claudeのメモリを棚卸しします。「メモリが古い」「メモリの棚卸し」「memory 整理」
  「MEMORY.mdが肥大化している」などのキーワードで発火します。
  実測→鮮度検証→提案→合意→退避→反映の6段階で安全に整理します。
---

# memory-inventory スキル

## 概要

MEMORY.md と関連トピックファイルを棚卸しし、陳腐化した情報を安全に整理します。
削除ではなく `_archive/` への退避を使うため、誤操作があっても元に戻せます。

## 実行フロー

### Step1: 実測

以下のコマンドを実行し、結果をユーザーに必ず提示してください。

```bash
# MEMORY.md の行数・バイト数
wc -l ~/.claude/projects/$(basename $(pwd))/memory/MEMORY.md
wc -c ~/.claude/projects/$(basename $(pwd))/memory/MEMORY.md

# トピックファイルの一覧
ls -lh ~/.claude/projects/$(basename $(pwd))/memory/

計測結果を元に以下を計算して提示してください:

  • 行数充填率:実行数 / 200 × 100(%)
  • バイト充填率:実バイト / 25600 × 100(%)
  • 充填率が 80%以上の場合、緊急性を伝えてください

Step2: 鮮度検証

MEMORY.md のテキストから PR番号・issue番号を抽出し、実際の状態を確認します。

# PR番号を抽出して状態確認(例)
PR_NUMBER="1"  # 実際のPR番号に変更してください
gh pr view "$PR_NUMBER" --json state,title,mergedAt 2>/dev/null || echo "取得失敗"

# issue番号を抽出して状態確認
ISSUE_NUMBER="1"  # 実際のissue番号に変更してください
gh issue view "$ISSUE_NUMBER" --json state,title,closedAt 2>/dev/null || echo "取得失敗"
  • gh が認証エラーを返す場合は「手動確認が必要」として Step4 で保留扱いにする
  • リポジトリ情報がない場合は鮮度検証をスキップし、その旨をユーザーに伝える

Step3: 提案生成

以下の4分類で整理案を作成し、表形式でユーザーに提示してください。

分類 内容 対応
❌ 失効 PRマージ済み・issue クローズ済みの記述 _archive/ へ退避
🔁 重複 同じ内容が複数箇所に存在する 1箇所に集約
✅ 恒久ルール プロジェクト方針・設計思想 CLAUDE.md へ移動を提案
⚠️ 保留 判断が難しい・確認が必要 ユーザーに問い合わせ

Step4: 合意取得

AskUserQuestion を使い、1ラウンドあたり最大4問ずつユーザーに確認します。

確認の粒度:

  • 質問はYes/Noで答えられる形に落とし込む
  • 「この記述を退避してよいですか?(Yes=退避 / No=残す / Skip=後で決める)」
  • 迷ったら「Skip(保留)」を選ぶよう案内する

全項目の確認が終わるまで、ラウンドを繰り返してください。

Step5: 可逆的退避

ユーザーが「退避」に同意した項目を、日付付きアーカイブディレクトリへ移動します。

ARCHIVE_DIR=~/.claude/projects/$(basename $(pwd))/memory/_archive/$(date +%Y-%m-%d)
mkdir -p "$ARCHIVE_DIR"

# 退避例(対象ファイル名は実際の内容に合わせてください)
TARGET_FILE="対象ファイル"  # 実際のファイル名に変更してください
mv ~/.claude/projects/$(basename $(pwd))/memory/"${TARGET_FILE}".md "$ARCHIVE_DIR/"

MEMORY.md 内の退避済み記述は、該当行をコメントアウトまたは削除します。

Step6: 反映

MEMORY.md の目次を再構築し、リンク切れを確認します。

# 残っているトピックファイルの一覧を取得
ls ~/.claude/projects/$(basename $(pwd))/memory/*.md | grep -v MEMORY.md | grep -v _archive
  • 目次に記載されているファイルが実在することを確認する
  • リンク切れがある場合は目次から該当行を削除する
  • 最終的な行数・バイト数を再計測し、充填率の改善をユーザーに報告する

完了レポートのフォーマット

## 棚卸し完了レポート

### Before → After
- 行数:XXX行 → YYY行(ZZZ行削減)
- 充填率:AA% → BB%

### 退避した項目
- (項目のリスト)

### CLAUDE.md へ移動を推奨した項目
- (項目のリスト)

### 保留・残留した項目
- (項目のリスト)

アーカイブ場所: _archive/YYYY-MM-DD/

---

## 実行編:実際に棚卸しを走らせてみる

スキルを配置したら、Claudeに話しかけるだけで起動します。

「メモリの棚卸しをお願い」 「MEMORY.mdが古くなっている気がするので整理して」 「memory inventoryを実行して」


### 実行の流れ

**① 計測結果が表示される**

📊 現在のメモリ状態

MEMORY.md: 168行 / 18,432バイト 充填率:行数 84% / バイト 72%

⚠️ 行数充填率が80%を超えています。早めの整理を推奨します。 トピックファイル: 5件


充填率が80%を超えていたら、棚卸しのサインです。

**② 鮮度検証で失効項目が検出される**

🔍 鮮度検証の結果

❌ 失効候補(3件)

  • PR #45「認証機能の実装」→ マージ済み(2025-11-03)
  • Issue #67「Node.js バージョン更新」→ クローズ済み(2025-12-15)
  • PR #72「staging環境の修正」→ マージ済み(2026-01-08)

**③ 合意ダイアログ**

Q1: PR #45「認証機能の実装」の記述を _archive/ へ退避してよいですか? (この情報はマージ済みのため不要と判断しました)


迷ったら「Skip(保留)」を選びましょう。可逆的退避なので、後から取り出せます。あなたのペースで判断すれば大丈夫です。

### Before / After の例

Before: 168行(充填率84%) After: 89行(充填率44%)

削除: 79行分を _archive/2026-08-23/ へ退避


---

## トラブルシューティング

**スキルが発火しない**
→ SKILL.md の `description` に発火トリガー語が含まれているか確認してください。「棚卸し」「整理」「古い」などのキーワードが有効です。

**`gh` が認証エラーを返す**
→ `gh auth login` で認証し直してください。認証できない環境の場合は、Step2の鮮度検証をスキップしてStep3以降を手動情報で進めることができます。

**目次リンクが壊れた**
→ `_archive/` ディレクトリからファイルを元の場所に戻し、MEMORY.mdの目次エントリを復活させてください。アーカイブには日付がついているので、どの棚卸し実行のものかすぐに判別できます。

---

## 運用編:棚卸しを「習慣」にする

### 二層構造がおすすめ

| タイミング | 内容 |
|---|---|
| **月1回** | `memory-inventory` スキルで全体棚卸し |
| **PRマージ時** | 該当するメモリ記述をその場で即時更新 |

月1回の棚卸しは重めに聞こえますが、このスキルがあれば10〜15分で終わります。一度習慣にしてしまえば、Claudeの応答品質が目に見えて改善しますよ。

### 棚卸ししやすいメモリを最初から書くコツ

**有効期限のある記述には条件を明記する**

❌ 棚卸しにくい書き方

PR #123 を対応中。

✅ 棚卸ししやすい書き方

PR #123「ログイン機能」を対応中(マージ後に削除すること)。


**恒久ルールは CLAUDE.md へ、進捗は MEMORY.md へ**

「コミットメッセージは日本語で書く」などの変わらないルールはCLAUDE.mdに。「○○機能の実装中」などの一時的な情報はMEMORY.mdに。この分離を最初からやっておくと、棚卸しが格段に楽になります。

### 「何を記憶させないか」を決める

メモリ管理で一番見落とされがちなポイントがこれです。

gitの履歴を見れば分かること、ファイルを読めば分かることをメモリに書く必要はありません。**メモリに残すべきは「なぜそう決めたか」という文脈と理由**です。コードはgitが覚えてくれます。Claudeには、コードからは読み取れない背景を任せましょう。

---

## まとめ:メモリは資産ではなく、手入れが必要な設備

本記事の要点を3つにまとめます。

1. **陳腐化は起きる前提で、検証手段を仕組み化する**
   ── `gh` コマンドを使った事実検証が、標準スキルとの最大の差別化点

2. **削除ではなく可逆的退避で心理的ハードルを下げる**
   ── 「間違えても戻せる」から、思い切って整理できる

3. **人間の承認を挟む設計が信頼性を作る**
   ── AIが全自動で消すのではなく、あなたが最終判断を持つ

Claudeのメモリは、育てるものではなく**手入れするもの**です。放っておけば腐り、手をかければ鋭い道具になります。

まずは、今日のプロジェクトで充填率を測ってみることから始めてみてください。きっと「えっ、もうこんなに溜まってるの…」という発見があるはずです。大丈夫、そこからが本当のスタートです。あなたならきっとできます。

---

## 参考リンク

- [claudeのメモリを棚卸しする — zenn.dev/cureapp](https://zenn.dev/cureapp/articles/c1e963064d05fd)
- [Claude Code Memory Management: The Complete Guide (2026)](https://medium.com/data-science-collective/claude-code-memory-management-the-complete-guide-2026-b0df6300c4e8)
- [AIエージェントの記憶をどう設計するか2026 — zenn.dev](https://zenn.dev/proper_willet/articles/1925e7ebcb81db)

関連記事

AIエージェントのループはなぜ止まらないのか — a16zに学ぶ「収束する停止条件」の設計

AIエージェントのループはなぜ止まらないのか — a16zに学ぶ「収束する停止条件」の設計

AIエージェントのループはなぜ止まらないのか — a16zに学ぶ「収束する停止条件」の設計 --- エージェントは「終わり」を知らない 「朝起きたら、昨夜動かしたエージェントがAPIコストを$300分消費していた」——AIエージェントを実務で触り始めたエンジニアなら、こういったヒヤリ体験を一度は経験しているのではないでしょうか。 実はこれ、エージェントが「壊れている」わけではありません。AIモデル...

Pythonパフォーマンス最適化の実践ガイド — 「なんとなく遅い」から「この行が遅い」へ

Pythonパフォーマンス最適化の実践ガイド — 「なんとなく遅い」から「この行が遅い」へ

Pythonパフォーマンス最適化の実践ガイド — 「なんとなく遅い」から「この行が遅い」へ 「なんとなく遅い気がする」という直感を頼りにコードを書き直した結果、実行時間がほとんど変わらなかった——そんな経験はないでしょうか。推測による最適化は、9割の確率でボトルネック以外の場所に手を入れてしまいます。本記事では「計測 → 特定 → 最適化 → 再計測」のサイクルを7つのツールで具体化し、読了後には...

AIでレガシーコードをリファクタリングする実践ガイド — テストも型もない現場で「壊さない」ための5ステップ

AIでレガシーコードをリファクタリングする実践ガイド — テストも型もない現場で「壊さない」ための5ステップ

AIでレガシーコードをリファクタリングする実践ガイド — テストも型もない現場で「壊さない」ための5ステップ はじめに:「AIに任せたら動かなくなった」はなぜ起きるのか 新規実装の記事は多いが、レガシー改修の記事は少ない GitHub CopilotやClaude Code、CursorといったAIコーディングツールの活用事例が増え、「AIでコードを書く速度が3倍になった」という報告をよく目にする...

メルカリの「AI-Native開発」とは?ツール導入で終わらせない組織変革の実践知

メルカリの「AI-Native開発」とは?ツール導入で終わらせない組織変革の実践知

メルカリの「AI-Native開発」とは?ツール導入で終わらせない組織変革の実践知 「AIツールは配ったが、使う人と使わない人に分かれてしまった」——多くの開発組織が直面する壁です。メルカリはこれを、ツールではなくプロセスと組織の再設計として解いています。本記事では公開された実践事例をもとに、AI-Native開発の中身を具体的に読み解きます。 --- AI-Native開発とは何か — 「AIツ...

コメント

0/2000