1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code の trust prompt を実測で分類した — 5ファミリの識別と Hook との関係

1
Posted at

はじめに

Claude Code で Hook を使った自動化パイプラインを構築していると、PreToolUseallow を返しているのに 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 の PreToolUseexit 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)

関連記事

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?