前回、Claude Codeに自分でスキルを書かせて育てる話を書きました。スキルやプラグインを増やしていくと、いつか必ずぶつかるのがセッションが重くなる・指示を取りこぼす問題です。今回は、その原因を測定してコンテキスト注入を228KBから48KBまで削った監査の記録です。
症状:直近の指示を取りこぼす
ある時期から、Claude Codeがこういう挙動をするようになりました。
- セッション開始が重い
- 「さっき言ったこと」を無視して、前の話題と混線する
最初は「モデルの調子」かと思いましたが、違いました。SessionStartで注入されるコンテキストが膨らみすぎて、直近のユーザー指示が埋もれていたのが原因です。注入が大きいほど、会話の最新部分の相対的な存在感が薄まります。
切り分け:重いのとボケるのは原因が違う
監査して分かった大事な切り分けがこれです。
「重い」と「ボケる」を一緒くたにすると、プラグインばかり削って効果が出ません。ボケる方の本命は別にあります。
測定:注入源ごとのバイト数を出す
注入源は複数あります。プラグインのメタdata、rules/、Obsidian文脈、auto-memory、remember履歴。これをソースごとに実測します。トークンはざっくり「バイト数 ÷ 4 ≒ 英語トークン」で見積もれます。
# rules/ 配下は「グローバル指示」として全文が自動ロードされる(上限なし)
find ~/.claude/rules/ecc -name '*.md' -exec cat {} + | wc -c
# auto-memory(MEMORY.md は全文注入)
wc -c ~/.claude/projects/*/memory/MEMORY.md
# remember 履歴(now/recent/archive が注入対象)
wc -c ~/.remember/now.md ~/.remember/recent.md ~/.remember/archive.md測ってみると、犯人は一目瞭然でした。**rules/ecc 単独で約57Kトークン(≒228KB)**を占めていて、全注入のなかで群を抜く最大ブロックだったのです。
なぜ rules/ がそんなに重いのか
ここが一番の落とし穴でした。~/.claude/rules/ 配下は、@import で必要な時に読むのではなく、Claude Codeがグローバル指示としてディレクトリ全体を毎回フルロードします。
僕の rules/ecc には、汎用ルールパック由来で 10言語分のルール(angular / golang / swift / php / ruby / arkts / java / kotlin …)が丸ごと入っていました。僕が実際に書くのは Python / TypeScript / Web の3つだけなのに、使いもしないSwiftやRubyのコーディング規約が、毎セッション全文注入され続けていたわけです。
修正:使う言語だけ残して「ツリーの外」へ逃がす
rules/ は @import ではなくディレクトリロードなので、import行をいじる必要はありません。ファイルをツリーの外に mv するだけで注入が止まります。そして戻したい時は mv で戻すだけ ―― 完全に非破壊です。
# 使う言語(common/python/typescript/web)だけ残し、残りはツリー外へ退避
A="$HOME/.claude/.rules-archive/ecc"; mkdir -p "$A"
cd ~/.claude/rules/ecc
for d in angular arkts cpp csharp dart fsharp golang java kotlin perl php ruby rust swift zh; do
[ -d "$d" ] && mv "$d" "$A/"
done
# 復元は mv "$A/rust" ~/.claude/rules/ecc/ で1個ずつポイント
隠しディレクトリ(.rules-archive)でも、rules/ ツリーの中に置くと誤ロードされる恐れがあります。退避先は必ずツリーの外にしてください。
結果
刈り込み後、現在の rules/ecc を測り直すとこうなりました。
$ find ~/.claude/rules/ecc -name '*.md' -exec cat {} + | wc -c
48092
$ ls -d ~/.claude/rules/ecc/*/ | xargs -n1 basename
common
python
typescript
web228KB(≒57Kトークン)→ 48KB(≒12Kトークン)。約79%減。ディレクトリも10言語から4つに減りました。新規セッションを開くと、起動が軽くなり、直近指示の取りこぼしも明確に減りました。
踏んだ落とし穴
ディスク掃除とトークン削減は別物
最初、Obsidianの hot.md が32KBに膨らんでいたので「これを削れば軽くなる」と思いました。間違いでした。Obsidian文脈は注入スクリプト側で hot.md=9000字 / index=2500字 と既に上限カットされていて、ファイルが何KBに膨らもうが注入量は約7Kトークンで一定です。
同じく remember の today-*.done.md も注入対象外。これらを消すのはディスク整理であって、トークンは1bitも減りません。「ファイルが大きい=注入が重い」は成り立たないので、必ず注入源を実測してください。
MAXプランでもメリットはある
「MAXプランなら$/tokenは定額だから関係ないのでは?」と思うかもしれません。コスト面はその通りです。でも削減の本当のメリットは別にあります。
- コンテキスト窓の節約(長い作業で効く)
- キャッシュヒット率の安定化
- セッション起動の高速化
- そして何より、直近指示が埋もれない
disable は可逆、uninstall は非可逆
プラグインを減らす場合、settings.json の enabled: true→false なら即ロールバックできます。claude plugin uninstall はディスクごと回収するので非可逆。まずは disable で様子を見るべきです。ただし、disableするとそのプラグインのスラッシュコマンドはエラーになるので、稀にしか使わないが重要なコマンドは残します。
まとめ
- 「重い」(=プラグイン数)と「ボケる」(=注入総量)は別の問題。混同しない
- ~/.claude/rules/ は @import ではなくディレクトリ全文ロード。最大の注入源になりやすい
- 修正はファイルをツリー外へ mv するだけ。ロールバックも mv =非破壊
- ディスク掃除 ≠ トークン削減。必ず注入源をバイトで実測する
- 結果:228KB → 48KB(約79%減)、起動も応答も軽くなった
次回は、これらの自動化(スキル生成・監査・ブリーフ)を**24時間回すために組んだ launchd の話**と、そこで踏んだmacOS固有の罠を書きます。
この記事が良かったら
「チップをリクエスト」で著者にチップの受け取り設定をお願いできます
