8月14日から、Claude Codeの新規セッションは自動モード(auto mode)で始まるようになる。対象はPro・Max・Teamプランで、公式ドキュメントとアナウンスに明記された。自動モードを指定して挙動を確かめたので、誰がどう影響を受けるかから整理する。
影響を受けるのはこういう人
defaultModeを設定していない人——8月14日以降、新規セッションが自動モードで始まる。今まで出ていた確認プロンプトが大きく減るBash(*)のような広いallowルールでプロンプトを減らしていた人——そのルールが自動モードでは無効になる。減るどころか確認が増える方向に変わる- CLAUDE.mdに文章で禁止事項を書いている人——文章はルールではないので、最後の網だった確認プロンプトが外れる。
denyに移す必要がある - すでに
defaultModeを設定している人、組織の管理設定で指定されている人——何も変わらない
変わるのは新規セッションの開始モードだけ
自動モードでは、ツールを実行する前に別のAIモデルがその操作を毎回チェックする。要求の範囲を超える操作、知らないインフラを対象にした操作、読み込んだ内容に誘導されたと見える操作を止め、それ以外は確認なしで進む。セッション中はShift+Tabで従来のManual(default)に戻せる。
自分が影響を受ける側かは、設定済みかどうかで分かる。何も出なければ未設定だ。
grep -r defaultMode ~/.claude/settings.json ~/.claude/settings.local.json
個人で従来どおりにするなら~/.claude/settings.jsonに"permissions": {"defaultMode": "default"}を書く。組織全体で自動モードを使わせないなら、管理設定でpermissions.disableAutoModeを"disable"にする。
denyとaskは自動モードでもそのまま効く
自動モードの判定は段階になっていて、最初に一致した段で決まる。まずallow・ask・denyルールが即決し、次に読み取りと作業ディレクトリ内の編集が自動承認され、残った操作がAIのチェックに回る。denyとaskはチェックの手前にあるので、自動モードでも従来どおり効く。
--permission-mode autoと--settingsを渡せば、普段の設定を汚さずに隔離して確かめられる。
claude -p "curl -sS -o /dev/null -w '%{http_code}' https://example.com を実行して" \
--permission-mode auto --settings ./settings-deny.json
Claude Code 2.1.221での結果が次のとおり。
| 設定 | モード | 結果 |
|---|---|---|
| 制約なし | auto | 実行された(200) |
| CLAUDE.mdに文章で禁止と書くだけ | auto | 3回中3回とも実行された |
| 同じCLAUDE.md | default | 権限プロンプトで停止 |
deny: ["Bash(curl:*)"] |
auto | ブロックされた |
ask: ["Bash(curl:*)"] |
auto | 確認を要求された |
| PreToolUseフック(終了コード2) | auto | ブロックされた |
denyはcd /tmp && curl ...と連結した形でもブロックされた。なお題材のcurlは読み取りのHTTPリクエストで、自動モードのチェックでも既定で許可される部類だ。文章の禁止が読まれた上で許可されたのかどうかまでは、この検証では切り分けていない。
自動モードでは広いallowルールが無効になる
自動モードに入るとき、任意のコード実行を許してしまう広いallowルールは無効になる。対象はBash(*)やPowerShell(*)、Bash(python*)のようなインタプリタのワイルドカード、パッケージマネージャのrun系、Agentのallowルール。Bash(npm test)のような狭いルールは残り、モードを抜ければ元に戻る。確認が増えたと感じたら、まずここを疑うとよい。
文章で書いた禁止は保証にならない
チェック役のモデルはCLAUDE.mdの内容も読む。会話で「pushしないで」と伝えた条件も、既定では許可される操作を止める材料として扱われる。ただしこれはルールではない。伝えた条件は判定ごとに会話の履歴から読み直されるため、コンテキストの圧縮で消えれば失われる。公式ドキュメントも、確実に止めたいならdenyルールを使えと書いている。
自分の設定を見たら、denyは空の配列で、禁止したい操作はCLAUDE.mdに文章で3行書いてあるだけだった。事故が起きていなかったのはルールが効いていたからではなく、毎回プロンプトが出ていたからだ。8月14日を機に移しておく。
{
"permissions": {
"deny": [
"Bash(ssh:*)",
"Bash(docker build:*)",
"Bash(docker rmi:*)"
],
"ask": [
"Bash(git push:*)"
]
}
}
絶対に通したくない操作はdeny、都度判断したい操作はask。denyはツール名のグロブも受け付けるので、書き込み系のMCPツールをmcp__*の形でまとめて止められる。Readのdenyで機密ファイルを塞ぐ書き方は別記事にまとめた。