
ここ一ヶ月ちょっとで、Claude Code 用の補強ツールを 3つ npm に出した。
- Throughline — コンテキストの肥大化を退避する
- Caveat — 同じ罠を二度踏まないように過去ノートを浮上させる
- Spotter — ツール呼び忘れを別のClaude が監査する
それぞれ別々の問題を解いてるんだけど、根っこは同じ。Claude本体に「気をつけて」って書いて直る問題は、もう全部直してた。残ってたのは構造的に直らない問題だった。
「気をつけて」を書き続けた時期
最初の頃、自分も CLAUDE.md やプロンプトに「気をつけて」をたくさん書いてた。
「ファイルを推測で説明しないで、必ず read してから答えて」 「コンテキストが肥大化したら /compact してね」 「過去に踏んだ罠は CLAUDE.md に書いてあるから読んで」
書けば書くほど、CLAUDE.md は肥大化する。肥大化したCLAUDE.mdは、Claudeが流し読みするだけになる。書いてあるのに守られない。
書き方が悪いのか、と思って表現を変える。それでもダメ。何回言い方を変えても直らない問題が、ある一定数あることに気づいた。
直せる問題と、直せない問題がある
ある日、自分の中で線を引いた。
「気をつけて」と書いて直る問題と、書いても直らない問題は、根本的に違う種類の問題だ。
書いて直る問題は、Claudeが「忘れてた」だけ。指示を見れば思い出す。これは指示の改善で対処できる。
書いても直らない問題は、Claudeが自分の限界を自覚できないから起きる。
- コンテキストが肥大化してることに気づけない (リクエストを送る瞬間に決まってるから、自分のサイズが見えない)
- 過去のセッションで踏んだ罠を覚えていない (セッションは独立、CLAUDE.md にどんどん追記すると重い)
- ツールを呼び忘れていることに気づけない (「分からない」と分からないから、取りに行けない)
こういう問題は、Claudeに「気をつけて」と頼んでも直らない。Claude自身が直せない問題だから。
諦めて、外側から補強し始めた
じゃあ Claude に頼むのをやめて、外から介入すればいい。
Claude Code には hook 機構がある。プロンプトを送る前、ツールが動いた後、セッションが終わる時、それぞれにフックを挟める。Claude自身は気づいていなくても、外から状態を観察して、必要な処理を差し込める。
これに気づいてから、補強ツールを 3つ作った。
Throughline (引き算)
コンテキストが肥大化する問題に対して、ツール入出力をSQLiteに退避してコンテキストから抜く。
ファイルを read した中身、grep の結果、Bash の出力。AIが使って判断して、次に進んだ時点で役目を終えてる。なのに最後まで残ってトークンを食う。これを hook で SQLite に逃がす。Claudeが必要なら自分で取り出せる。
「肥大化に気づく」という負担を Claude から完全に外した。
Caveat (蓄積)
同じ罠を二度踏む問題に対して、過去に書き留めた罠ノートを、似た場面で自動浮上させる。
罠を踏んだら markdown に書いておく。次に似たプロンプトを送ったとき、似たツールエラーが出たとき、セッション終了時に「もがきシグナル」が観測されたとき、関連する過去ノートが hook で Claude のコンテキストに注入される。
「過去の罠を覚えておく」という負担を Claude から外した。
Spotter (足し算)
ツール呼び忘れ問題に対して、ツールカタログを完全に把握した別の Claude を並走させて、呼び忘れたら指摘する。
メインの Claude は普段通り動く。横にもう一人の Claude (Haiku 4.5) が常駐してて、ユーザーの入力と最終応答を見てる。「web_search 使えば答えられたよね」と気づいたら、メインの Claude に hook 経由で指摘が届く。
「自分が何を呼び忘れたか自覚する」という不可能な負担を Claude から外した。
共通パターン
3つに共通するのは、Claude本体には何も期待しない設計。
| Throughline | Caveat | Spotter | |
|---|---|---|---|
| 何を Claude に頼まない | コンテキスト管理 | 過去の記憶 | 自分の見落とし検知 |
| 代わりに誰がやる | hookとSQLite | hookと過去ノート | hookと別Claude |
| Claudeに必要な変更 | なし | なし | なし |
「Claudeに必要な変更」がゼロなのが大事。プロンプトもCLAUDE.mdも、当たり前に書きたいことだけ書けばいい。「気をつけて」を増やさない。
まだ補強してない構造的問題
3つ作って気が済んだわけじゃない。直したい構造的問題はまだある。
- 長期的なrole drift: 長時間セッションで Claude のキャラが流される問題。プロンプトで「あなたは厳格なレビュアーです」と書いても、20ターン経つと丸くなる
- サブエージェント越しのコンテキスト消失: Task ツールで起こしたサブエージェントは、親セッションの暗黙の文脈を持たない。毎回同じ説明を子に渡し直すのが地味に辛い
- ツール選択の精度: 複数のツールから「どれを使うか」の判断が時々雑。Spotterは呼び忘れを検出するけど、間違ったツール選択は検出しない
結論
Claude に「気をつけて」と書いて直る問題は、もう全部直した。残ってる問題は、Claude自身が直せない種類のものだ。
だから外から補強する。hook で挟むだけ。Claude本体は何も知らなくていい。
1ヶ月で3つ作ってみて、補強の型は見えた気がする。3つとも MIT で npm に出してるので、同じ構造的問題で困ってる人がいたら、気が向いたら覗いてみてください。