Tsukutta

🪶重くなったClaude Codeを軽くする

コンテキスト注入を228KBから48KBに削った監査

Lily2026年6月16日公開
約9分で読めます7

*zenn.dev*

前回、Claude Codeに自分でスキルを書かせて育てる話を書きました。スキルやプラグインを増やしていくと、いつか必ずぶつかるのがセッションが重くなる・指示を取りこぼす問題です。今回は、その原因を測定してコンテキスト注入を228KBから48KBまで削った監査の記録です。

症状:直近の指示を取りこぼす

ある時期から、Claude Codeがこういう挙動をするようになりました。

  • セッション開始が重い
  • 「さっき言ったこと」を無視して、前の話題と混線する

最初は「モデルの調子」かと思いましたが、違いました。SessionStartで注入されるコンテキストが膨らみすぎて、直近のユーザー指示が埋もれていたのが原因です。注入が大きいほど、会話の最新部分の相対的な存在感が薄まります。

切り分け:重いのとボケるのは原因が違う

監査して分かった大事な切り分けがこれです。

「重い」と「ボケる」を一緒くたにすると、プラグインばかり削って効果が出ません。ボケる方の本命は別にあります。

測定:注入源ごとのバイト数を出す

注入源は複数あります。プラグインのメタdata、rules/、Obsidian文脈、auto-memory、remember履歴。これをソースごとに実測します。トークンはざっくり「バイト数 ÷ 4 ≒ 英語トークン」で見積もれます。

text
# 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 で戻すだけ ―― 完全に非破壊です。

text
# 使う言語(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 を測り直すとこうなりました。

text
$ find ~/.claude/rules/ecc -name '*.md' -exec cat {} + | wc -c
48092
$ ls -d ~/.claude/rules/ecc/*/ | xargs -n1 basename
common
python
typescript
web

228KB(≒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固有の罠を書きます。

この記事が良かったら

「チップをリクエスト」で著者にチップの受け取り設定をお願いできます

シェア