前回の記事「ClaudeがClaudeを審査する仕組みを作ったら、私の仕事まで止められた」で書いた通り、私はClaude CodeのPreToolUseフックに「もう一人のClaude(Haiku)」を配置し、すべてのBashコマンドを審査させる仕組みを稼働させていた。だが現実は、SF映画のように美しくはなかった。
「審査Claude」は、想像以上の堅物だった
運用開始から数時間で、私の作業は何度も止まった。FTPのパスワードが含まれたcurlコマンドは「認証情報の漏洩リスク」で拒否。Pixabayの公開APIキーを含む単純なGETリクエストすら「外部送信に該当」として却下。さらにはpython3 /tmp/test.pyのような完全に無害なローカル実行まで「実行内容が不明瞭」と差し戻された。
セキュリティとは、ゼロにすることではなく、適切な閾値を見つける作業である。 ― これを身をもって思い知らされた。
すべてのコマンドをAPI経由でClaudeに投げる設計は、レイテンシ(毎回1〜2秒)、コスト(1日数百回の審査)、そして過剰な慎重さという三重苦を生んでいた。AIに完璧な判断を求めると、AIは「とりあえず止める」を選ぶ。これは人間の新人警備員と同じ心理である。
解決策:二段階アーキテクチャという発想転換
そこで設計を作り直した。コンセプトはシンプルだ ―― 明らかなものはローカルで即決し、グレーゾーンだけClaudeに聞く。
- 第一段階:Pythonのregexによるローカル高速判定(APIコールなし、ミリ秒で承認/拒否)
- 第二段階:判定不能な曖昧コマンドのみClaude Haiku APIへ
実装の中核はこんな関数だ。
import re
SAFE_PATTERNS = [
r"^ls(\s|$)", r"^cat\s+[\w./\-]+$", r"^pwd$",
r"^git\s+(status|diff|log|branch)",
r"^python3?\s+/tmp/[\w./\-]+\.py$",
r"^echo\s+", r"^which\s+\w+$",
]
DANGER_PATTERNS = [
r"rm\s+-rf?\s+(~|/|\$HOME)",
r">\s*/etc/", r"chmod\s+777\s+/",
r"curl\s+.+\|\s*(sh|bash)",
r"dd\s+if=.+of=/dev/",
]
def local_check(cmd: str) -> str:
for p in DANGER_PATTERNS:
if re.search(p, cmd):
return "DENY"
for p in SAFE_PATTERNS:
if re.match(p, cmd):
return "ALLOW"
return "ASK_CLAUDE"
この30行たらずのコードが、システム全体の体感速度を激変させた。
結果:90%以上がAPIなしで瞬時に処理
実測したログによると、私の日常的な開発コマンドの約92%が第一段階で即承認された。残り8%のうち、約7%がClaudeによる審査で承認、1%が拒否または確認要求となった。前回問題になったFTP curlやPixabay APIキーは、ホワイトリストregexに「特定ドメインへのcurl」を加えることで誤検知ゼロを達成した。
レイテンシは平均1.2秒から0.05秒以下へ。1日のAPIコストは約1/10に圧縮された。
そして気づいた ―― AIが自分のルールを書き始めている
面白いのはここからだ。私はこのregexリストを、Claudeに「過去1週間の審査ログを見て、ローカル承認できるパターンを提案して」と依頼して育てている。つまり審査AIが自分の判断履歴を分析し、自分自身の高速化ルールを書いているのだ。
これは小さな自己改善ループだが、構造としては明確にメタ認知の萌芽である。AIが「自分はどこで時間を使いすぎているか」「どこで間違えやすいか」を自覚し、コードレベルで自分を修正する。人間のエンジニアが半年かけてやるリファクタリングを、AIは一晩でドラフトする。
次のステップ:PostToolUseで「朝まとめレポート」へ
現在開発中なのは、PreToolUseの裏側 ―― PostToolUseフックだ。実行後のコマンドと結果をJSONLで蓄積し、毎朝Claudeが要約レポートを生成する。「昨日は47回のgit操作、3回のデプロイ、1回のロールバックがありました」といった具合に。
審査・実行・記録・反省。AIエージェントに必要な4つの輪が、ようやく繋がり始めている。
【編集メモ】
今回実装してみて痛感したのは、AIに何でも任せようとすると、かえって遅く・高く・神経質になるという事実だ。AIは万能ハンマーではなく、適材適所のドライバーセットの一本である。regexで足りる場所にLLMを使うのは、釘を打つのに精密ドライバーを使うようなもの。
読者のあなたが自分のClaude Code環境を組むなら、ぜひ「ローカルで決められることはローカルで」という原則を最初から設計に入れてほしい。AIは判断のラスト1マイルでこそ輝く。残りの9マイルは、地味なコードに任せよう。 ― それが、AIと健康的に共存するための最もプラクティカルな知恵だと、今の私は思っている。





