この記事の中心となる主張は、エージェントへの指示は確率的だということである。著者によれば、CLAUDE.md の規約、スキル、プロンプトはモデルのアテンションを奪い合い、セッションが長くなるにつれて遵守率は低下しがちである。コードスタイルの好みについてならそれでも許容できるが、その指示がシークレットのフォルダ、本番の設定ファイル、CI/CD の標準を守るものである場合には許容できない。著者は、より良い指示が役に立つこと、そしてドメインの専門知識をエージェントのコンテキストに組み込むことが依然として効果の大きい取り組みであることを明言しつつも、決定論的なプロンプトは存在しないとする。

そこから記事は役割分担を導き出す。エージェントフック は、エージェントのライフサイクルの決まった時点でランタイムが実行するコードであり、実行するかどうかをモデルが決めることはない。そのためフックは、エージェントの非決定的な性質に対する決定論的な釣り合いとなる。議論は Claude Code を中心としており、著者はこれを利用可能なものの中で最も充実したフックの実装を持つと評している。後半の節では同じ考え方が他のエージェントや IDE にどう広がったかを概観し、記事はフックを控えめに使うべきだという主張で締めくくられる。

要点

  • コンテキストウィンドウを通じてエージェントに与えられるものはすべて保証ではなく提案であり、長いセッションでは遵守率が低下しがちである。
  • フックが決定論的なレイヤーであるのは、実行するかどうかを決めるのがモデルではなくランタイムだからである。フックは普通のコードであり、毎回まったく同じように振る舞う。
  • 3 種類のハンドラーのうち、著者はシェルスクリプトが適切な道具だと論じる。HTTP エンドポイントはタイムアウトしうるネットワーク呼び出しに依存し、LLM のプロンプトフックは本質的に非決定的であり、それはまさにガードレールが許容できない性質だからである。
  • ガードレールとしての価値の大部分は PreToolUse が担う。何かが実行される前にツール呼び出し全体を JSON として受け取り、それを許可する、モデルにフィードバックされる理由を添えて拒否する、パーミッションプロンプトにエスカレーションする、あるいはツールの入力を書き換える、ということができるからである。
  • PreToolUse での拒否は、呼び出しが実行されることがないため確実な停止となる。一方、Stop でのブロックは理由をモデルにフィードバックして続行を求めるものであり、保証ではなく強い後押しにとどまる。
  • PreToolUse の 2 つの判定メカニズムは、正反対の方向に失敗する。stdout 上の不正な JSON は解析されることがなく、呼び出しはすり抜けてしまう(フェイルオープン)。一方、exit 2 は stdout の内容にかかわらずブロックする(フェイルクローズ)。著者は exit 2 を、ごく少数の重要なものに限って使っている。
  • フックをどこに置くかが、そのポリシーのスコープとなる。個人のセーフティネットにはユーザー設定、チームの標準にはプロジェクトの .claude/settings.json、組織のガードレールにはマネージドポリシー設定である。
  • フックはランタイムがユーザーの権限で自動的に実行するコードであり、SessionStart フックはプロジェクトを開いたときに実行される。そのため、設定ファイルに書き込める者は誰でも、そのマシン上で何が実行されるかを支配できる。著者は、リポジトリの設定に悪意ある SessionStart フックを仕込んだ 2026 年 4 月の PyPI ワームを挙げ、クローンしたリポジトリを開く前にその .claude フォルダを確認するよう勧めている。
  • 著者は、あらゆるアクションをフックで包むことには反対している。フックはエージェントループの内部で実行され、該当するツール呼び出しのたびにスクリプトを起動するコストがかかるからである。示されている経験則は、フックを破壊的なコマンド、シークレットと機密性の高いパス、そして常に守られなければならない 1 つか 2 つの CI/CD の標準に限定することである。
  • 記事による目的の捉え方は、フックはエージェントを制御するためにあるのではなく、少数の望ましくない結果を起こりえないものにし、それによってエージェントに素早く動くことを許すためにある、というものである。

補足

記事は、ファイルアクセスをめぐる事例が理論上のものではないことの証拠として 2 つの出来事を報告している。エージェントが rm -rf ~/ を試みた後に安全のためのフック集を公開した開発者と、エージェントが本番の認証情報をコミットされたファイルにコピーしていたことに気づいた別の開発者である。いずれも著者自身の経験ではなく、コミュニティからの報告として紹介されている。

エコシステム全体での収束について、記事は次のように報告している。Cursor はバージョン 1.7 で preToolUse と beforeReadFile のイベントを備えたフックを導入し、同じ終了コードのセマンティクスを維持し、既存の Claude Code のフック設定を読み込む。Cursor はさらに、高速なモデルが自然言語の条件を評価するプロンプトベースのフックも追加しており、著者はこの考え方がセマンティックフックと呼ばれることもあると述べている。OpenAI Codex は、Claude Code の命名を踏襲した 5 つのイベントを持つ実験的なフックを機能フラグの背後に追加した。そして Gemini CLI と GitHub Copilot CLI も独自のフックシステムを出荷した。著者の見立てでは、Claude Code の設計、すなわち stdin での JSON と、ブロックのための exit 2 が、事実上の慣行となっている。