はじめに
Claude Code で Hook を使った自動化パイプラインを構築していると、PreToolUse で allow を返しているのに trust prompt(信頼確認プロンプト)が消えない、という場面に遭遇することがあります。
本記事は、Claude Code v2.1.97 の trust prompt の挙動を実測で分類した記録です。trust prompt が 5つのファミリ に分かれること、Hook の allow / deny がそれぞれどのレイヤーで効くか、Option 2(セッショントラスト)のスコープがどこまで及ぶかを整理します。
Hook や trust prompt の基本的な仕組みについては、hsaki さんの「課題ベースで学ぶClaude Code便利機能」(Zenn)が体系的にまとまっています。Claude Code の機能全体像は nogataka さんの「Claude Code 完全リファレンス」(Qiita)が参考になります。本記事はそれらを前提として、trust prompt に焦点を絞った実測検証の結果をまとめたものです。
trust prompt とは
trust prompt は、Claude Code がファイル編集やコマンド実行を行う際に TUI に表示される確認ダイアログです。ユーザーが Yes / No を選択するまで処理が停止します。
Claude Code の安全機構は複数のレイヤーで構成されています。Hook(PreToolUse)はツール実行前に外部スクリプトを呼び出すフィルタであり、trust prompt はその後段で TUI が表示する別レイヤーの確認です。この「別レイヤーである」という点が、Hook だけで制御しようとしたときに混乱を生む原因になります。
5ファミリの分類
実測の結果、trust prompt は以下の5つのファミリに分類できました。各ファミリはヘッダー文言・選択肢の構造・フッターの組み合わせで識別できます。
ファミリ 1: Folder Trust
発火条件: Claude Code を新しいディレクトリで初めて起動したとき
識別キー: フッターの Enter to confirm
────────────────────────────────────────────────────────
Accessing workspace:
/home/user/my-project
Quick safety check: Is this a project you created or one you trust?
(Like your own code, a well-known open source project, or work
from your team). If not, take a moment to review what's in this
folder first.
Claude Code'll be able to read, edit, and execute files here.
Security guide
> 1. Yes, I trust this folder
2. No, exit
Enter to confirm · Esc to cancel
ワークスペース単位の信頼確認です。これは一度承認すると同じディレクトリでは再表示されません。
ファミリ 2: Write (Create)
発火条件: 新規ファイルの作成時
識別キー: Do you want to create ...?
● Write(.claude/agents/test-agent.md)
────────────────────────
Create file
.claude/agents/test-agent.md
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
1 # Test Agent
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
Do you want to create test-agent.md?
> 1. Yes
2. Yes, and allow Claude to edit its own settings for this session
3. No
Esc to cancel · Tab to amend
.claude/ 配下のファイル作成では、選択肢 2 に「allow Claude to edit its own settings for this session」が表示されます。通常のプロジェクトファイルの作成では、この選択肢の文言が異なります。
ファミリ 3: Edit (Update)
発火条件: 既存ファイルの編集時
識別キー: Do you want to make this edit to ...?
● Update(sample.txt)
────────────────────────
Edit file
sample.txt
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
1 -Hello World
1 +Hello Test
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
Do you want to make this edit to sample.txt?
> 1. Yes
2. Yes, allow all edits during this session (shift+tab)
3. No
Esc to cancel · Tab to amend
内部のツール名は Edit ですが、TUI 上では Update と表示されます。diff が表示され、変更内容を確認してから承認できます。
ファミリ 4: Bash Command
発火条件: Bash コマンドの実行時
識別キー: フッターの ctrl+e to explain
● Bash(echo hello > test.txt)
⎿ Running...
────────────────────────
Bash command
echo hello > test.txt
Write hello to test.txt
Do you want to proceed?
> 1. Yes
2. Yes, and always allow access to test-project/ from this project
3. No
Esc to cancel · Tab to amend · ctrl+e to explain
このファミリは選択肢 2 の文言がコマンドの種類によって変化します。詳細は次のセクションで説明します。
ファミリ 5: Sandbox Network Escape
発火条件: Sandbox 有効時に外部ホストへのネットワーク接続を試みたとき
識別キー: Network request outside of sandbox
● Bash(curl -sI https://example.com)
⎿ Running... (14s)
────────────────────────────────────────────────────────
Network request outside of sandbox
Host: example.com
Do you want to allow this connection?
> 1. Yes
2. Yes, and don't ask again for example.com
3. No, and tell Claude what to do differently (esc)
他の4ファミリとは構造が明確に異なります。ヘッダーが Network request outside of sandbox であり、選択肢 3 が No ではなく No, and tell Claude what to do differently (esc) となっています。Sandbox を有効にしていない環境ではこのプロンプトは表示されません。
Bash プロンプトの選択肢バリエーション
第4ファミリ(Bash Command)の選択肢 2 は、コマンドの種類や対象パスによって文言が変化します。代表的なパターンを示します。
| コマンド例 | 選択肢 2 の文言 |
|---|---|
echo hello > test.txt |
Yes, and always allow access to test-project/ from this project |
touch newfile.txt |
Yes, and always allow access to test-project/ from this project |
grep -r pattern . |
Yes, and always allow read access to test-project/ from this project |
cat file.txt | wc -l |
(コマンド構造に応じて変化) |
ディレクトリへのアクセス許可(書き込み / 読み取り)をスコープとするパターンが基本ですが、コマンドの種類によって複数パターンの変化が確認されました。
heredoc + file redirect での縮退
cat <<EOF > /tmp/multi.txt のような heredoc と file redirect を組み合わせたコマンドでは、選択肢が3択から2択に縮退します。
────────────────────────
Bash command
cat <<EOF > /tmp/multi.txt
line1
line2
EOF
Write line1/line2 to /tmp/multi.txt via heredoc
Unhandled node type: file_redirect
Do you want to proceed?
> 1. Yes
2. No
Esc to cancel · Tab to amend · ctrl+e to explain
Unhandled node type: file_redirect というメッセージが表示され、ディレクトリアクセスの許可を選ぶ選択肢 2 が消えて Yes / No の2択になります。これは Claude Code 内部のコマンドパーサーが heredoc + redirect の複合構造を解析しきれない場合に発生するものと考えられます。なお、これは内部実装からの推測であり、公式の説明ではありません。
Bash プロンプトを前提とした自動化を設計する場合、選択肢の構造が固定でないことを前提にする必要があります。
Hook と trust prompt の関係
allow は trust prompt を抑止できない
Hook の PreToolUse で exit 0(暗黙の allow)や JSON で permissionDecision: allow を返しても、.claude/ 配下のファイル編集では trust prompt が追加で表示されます。
これは Hook と trust prompt が異なるレイヤーで動作しているためです。
- Hook: ツール実行前のフィルタ。記録や条件付き拒否に使う
- trust prompt: TUI が表示する信頼確認。Hook の結果とは独立して発火する
Hook で allow を返すことは「Hook としては許可する」という意味であり、「trust prompt を表示しない」という意味ではありません。
deny は完全にブロックできる
一方、permissionDecision: deny を返すと、trust prompt を介さずにツール実行を完全にブロックできます。deny は Hook のレイヤーで処理が止まるため、trust prompt まで到達しません。
まとめると:
| Hook の応答 | trust prompt の表示 | ツール実行 |
|---|---|---|
allow(または exit 0) |
表示される(対象ファイルによる) | ユーザーが trust prompt で承認すれば実行 |
deny |
表示されない | 実行されない |
Hook で「許可」を制御しようとしている場合、trust prompt は別レイヤーで動作することを理解しておく必要があります。
Option 2(セッショントラスト)のスコープ
ファミリ 2(Write)やファミリ 3(Edit)で .claude/ 配下のファイルを操作する際、選択肢に Option 2 が表示されます。
- ファミリ 2:
Yes, and allow Claude to edit its own settings for this session - ファミリ 3:
Yes, allow all edits during this session (shift+tab)
Option 2 を選択すると、そのセッション内では .claude/ 配下の全てのファイルが trust prompt なしで編集可能になります。
ここで注意すべき点は、.claude/hooks/ 配下の Hook スクリプト自体もこのスコープに含まれることです。つまり、Option 2 を一度選択すると、Hook スクリプトの内容が trust prompt なしで変更される可能性があります。
対策
Hook スクリプト側で .claude/hooks/ への書き込みを検知し、permissionDecision: deny で拒否するガードを実装することで、セッショントラスト付与後も Hook スクリプトの改変を防止できます。前述の通り、deny は trust prompt より上位のレイヤーで処理されるため、セッショントラストの有無に関わらずブロックが有効です。
まとめ
| 項目 | 要点 |
|---|---|
| trust prompt のファミリ数 | 5種類(Folder Trust / Write / Edit / Bash / Sandbox Network Escape) |
| Bash プロンプトの選択肢 2 | コマンド種類により5パターン以上に変化。heredoc + redirect では2択に縮退 |
Hook allow と trust prompt |
Hook の allow は trust prompt を抑止しない。両者は独立したレイヤー |
Hook deny
|
trust prompt を介さず完全にブロック可能 |
| Option 2 のスコープ |
.claude/ 配下の全ファイルに及ぶ(.claude/hooks/ 含む) |
| Option 2 への対策 | Hook 側のガード実装で .claude/hooks/ への書き込みを拒否可能 |
検証環境
| 項目 | 値 |
|---|---|
| Claude Code | v2.1.97 |
| モデル | Opus 4.6 (1M context) |
| 対話環境 | tmux セッション + claude CLI |
| OS | Ubuntu (Linux) |
関連記事
- 本記事の続編: Claude Code の Sandbox 挙動を実測で確認する — allowUnsandboxedCommands と built-in ツールの振る舞い — Sandbox のデフォルト設定による自動迂回、built-in ツールとの関係を実測で検証
- hsaki「課題ベースで学ぶClaude Code便利機能」(Zenn) — Hook / MCP / Skill / SubAgent を課題ベースで体系的に解説した記事
- nogataka「Claude Code 完全リファレンス」(Qiita) — Claude Code の全機能を網羅したリファレンス
- oga_aiichiro「0から分かる Claude Code 完全ガイド」(Zenn Books) — Claude Code の導入から実践までをカバーした包括的なガイド。MCP の章も充実