docs-first ではここ数日、Claude Code のフックについて3本を公開しました。「PreCompact・PostCompact フック:圧縮の前後に処理を挟む」(2026-10-15、https://note.com/docsfirst/n/n5b17a33bb0de )、「@ 参照とフックの実行条件」(2026-10-16、https://note.com/docsfirst/n/n8af254087535 )、「フック失敗時の動作制御と優先順位」(2026-10-18、https://note.com/docsfirst/n/n36a202be1e74 )です。3本はそれぞれ別の機能を扱っています。圧縮の前後に処理を挟む話、@ 参照の挙動の話、失敗時の優先順位の話で、トリガも書かれた時期も違います。
この総説は、その3本を1枚の地図に重ねます。狙いは要約の再掲ではありません。1本ずつ読むと「フックで色々止められる」で終わりますが、3本を突き合わせると、止め方の文法が3種類に分かれている一方で、根っこの原則が1つに揃っていることが見えます。問いはこうです。トリガも時期も違うこの3つを1枚にしたとき、禁止の設定はどの層に、どの順で置くべきか。そして「許可を後から足せば緩む」という前提は本当に成り立つのか。
中心主張と、それを支える構造
中心主張を1文で宣言します。圧縮を止める終了コード、@ 参照を無効化する環境変数、拒否が最優先になる判定順位。この3つは別々の機能に見えて、どれも「どこで、誰が『させない』を決めるか」という同じ設計を別の文法で書いたものです。だから運用では機能ごとに覚えるのではなく、「禁止がどこで決まるか」という1枚の地図を持つのが実務的です。
支える具体を、3本の由来が辿れる形で並べます。
第一に、圧縮の制御(2026-10-15 の記事)は終了コードという文法を使います。
Exit with code 2 to block compaction
終了コード 2 で圧縮をブロックする、という意味です(出典 [1])。ここでのポイントは、フックの戻り値そのものが「させない」の表明になっている点です。2026-10-19 時点の公式ドキュメントで、終了コード 2 は圧縮を止める合図として定義されています。
第二に、@ 参照の制御(2026-10-16 の記事)は環境変数という別の文法を使い、しかも設定できる層が複数あることを明示します。
set CLAUDE_CODE_DISABLE_FILE_MENTIONS=1 in your shell, user settings, or managed settings
この環境変数を 1 に設定すると機能を無効化でき、設定場所は shell、user settings、managed settings のいずれでもよい、という記述です(出典 [1])。終了コードが「その場の戻り値」で決めるのに対し、こちらは「どの層に置くか」で効き方の広さが変わります。公式は3つを並列の選択肢として説明していますが、実務では「個人の shell に置くか、組織の managed settings に置くか」で意味が変わります。層の選択自体が運用判断になります。
第三に、権限の制御(2026-10-18 の記事)は優先順位という3つ目の文法で、しかも全体の背骨にあたる原則を言い切ります。
deny takes priority over defer , which takes priority over ask , which takes priority over allow
deny が defer に優先し、defer が ask に、ask が allow に優先する、という順位です(出典 [2])。ここから、3本に共通する原則が明示されます。拒否側が勝ちます。allow をいくつ足しても、同じ対象に deny があれば通りません。
3つを時系列と対比で揃えると、構造が見えます。10-15 は終了コード、10-16 は環境変数と層、10-18 は判定順位。文法は3種類ですが、向きは1つで、いずれも「許可を広げる」より「禁止を効かせる」側に重みがあります。終了コード 2 は処理を止める方向、環境変数での無効化は機能をオフにする方向、deny 優先は拒否を勝たせる方向です。「後から allow を足せば緩む」という発想は、少なくとも権限判定では成り立ちません。
明日から取る行動です。第一に、機能別の覚え方をやめ、「禁止がどこで決まるか」で棚卸しします。圧縮は終了コード、@ 参照は環境変数と層、権限は判定順位、と決定点を1枚にします。第二に、組織として強制したい禁止は、個人の shell ではなく managed settings 側に置くことを既定の順序にします。CLAUDE_CODE_DISABLE_FILE_MENTIONS を 1 にする場合、どの層に置くかを先に決めます。第三に、圧縮を止めたい処理は PreCompact フックの終了コード 2 で表現し、戻り値に意味があることを前提にレビューします。第四に、権限設計のレビュー観点を「allow が足りているか」から「deny が意図通り勝つか」に変えます。緩める方向の変更は deny がある限り効かない、という前提でチェックします。
References
[1] https://code.claude.com/docs/en/hooks
[2] https://code.claude.com/docs/en/agent-sdk/hooks
[3] https://note.com/docsfirst/n/n5b17a33bb0de