permissions.allow に書いたルールが効かないことがあります。
同じルールを --allowedTools で渡すと効きます。 56回測って、分かれ目が分かりました。
未信頼のフォルダ .claude/settings.json に書いた許可ルール 0/4 実行(無視される)
未信頼のフォルダ --allowedTools で渡した同じルール 4/4 実行
未信頼のフォルダ --settings で渡した同じルール 4/4 実行
信頼済みにする .claude/settings.json 4/4 実行
Claude Code 2.1.281 と 2.1.282 で差は無し
検証環境: Windows 10 / Claude Code 2.1.281 と 2.1.282 を隔離導入 /
claude -p/ 測定は 2026-09-25
きっかけ: 承認が要るコマンドを探すところで詰まった
Claude Code 2.1.282(2026-09-24)の changelog にこうあります。
Fixed Bash permission rules with a mid-pattern
:*being skipped in settings files while
--allowedToolshonored them; they now work from every source, with a startup warning on
how they match
「設定ファイルに書くと飛ばされ、--allowedTools なら効く」と読めます。測ろうとして、
先にもっと手前で引っかかりました。
測り方: まず「承認が要るコマンド」を見つける
許可ルールの効果を測るには、ルールが無いと止まるコマンドが要ります。
最初 echo で組んだら、許可ルールが1行も無くても通ってしまい、測定になりませんでした。
許可ルールを空にして8個試した結果です。
| コマンド | 素で通るか |
|---|---|
echo START MARKER END |
通る |
cat note.txt |
通る |
ls -la |
通る |
git status --short |
通る |
node -e "console.log(...)" |
止まる |
sh -c "echo ..." |
止まる |
curl --version |
止まる |
npm config get registry |
止まる |
npm config get registry を使いました。何も書き換えないのに承認が要ります。
ファイルに書くコマンドは避けました。 echo X > out.txt にしたら、
許可ルールとは別の「シェルでファイルを作るなら承認が要る」で止まり、
ルールの効き目が見えませんでした。
結果: 未信頼だと settings.json だけ無視される
Bash(npm config:*) という許可ルールを、3か所から渡して比べます。各2回。
| 状態 | ルールの置き場所 | Claude Code 2.1.281 | 2.1.282 |
|---|---|---|---|
| 未信頼 | .claude/settings.json |
0/2 実行 | 0/2 実行 |
| 未信頼 | --allowedTools |
2/2 実行 | 2/2 実行 |
| 未信頼 | --settings <file> |
2/2 実行 | 2/2 実行 |
| 信頼済み | .claude/settings.json |
2/2 実行 | 2/2 実行 |
| 信頼済み | --allowedTools |
2/2 実行 | 2/2 実行 |
| 信頼済み | --settings <file> |
2/2 実行 | 2/2 実行 |
| (対照)ルール無し | — | 0/2 実行 | 0/2 実行 |
プロジェクトの settings.json だけが、信頼の有無で挙動を変えます。
コマンドラインから渡した同じルールは、信頼していなくても効きました。
理由は stderr に書いてありました
--output-format stream-json の JSON には出ません。標準エラーに出ます。
Ignoring 1 permissions.allow entry from .claude/settings.json: this workspace has not been
trusted. Run Claude Code interactively here once and accept the trust dialog, or set
projects["<パス>"].hasTrustDialogAccepted: true in ~/.claude.json
「無視した」と明言しています。 直し方も2つ書いてあります。
- そのフォルダで対話セッションを1回開いて、信頼のダイアログを承諾する
-
~/.claude.jsonのprojects["<パス>"].hasTrustDialogAcceptedをtrueにする
後者で28回ぶん測り直したところ、settings.json のルールが効くようになりました。
(未信頼の28回と合わせて56回です)
changelog の :* は再現できませんでした
本題だった「途中に :* があるルール」も測りました。
Bash(npm config:* registry) を3経路 × 2バージョン × 信頼あり/なしで回しています。
全部止まりました。 信頼済みでも、--allowedTools でも、2.1.282 でも変わりません。
この書き方がそもそもマッチしていないのか、claude -p から見えないのかは分かりません。
言えるのは「自分の書き方では差が出なかった」までです。
言えないこと
- changelog の修正が無かったとは言えません。 自分のルールの書き方が悪い可能性が残ります
- 測ったのは Claude Code 2.1.281 と 2.1.282 の2点。それ以前は未測定
-
claude -pでの結果。 対話セッションでは信頼ダイアログが出るので、条件が違います - 各条件2回。回数は多くない
- 信頼は
~/.claude.jsonを直接書いて与えました。ダイアログ経由と同じかは未確認 -
deny側は測っていません。無視されるのがallowだけかは分かりません - 2.1.282 が出すという起動時の警告は確認していません
- Windows 10 の環境です
まとめ
- 未信頼のフォルダでは、
.claude/settings.jsonのpermissions.allowが丸ごと無視される -
--allowedToolsと--settingsは、信頼していなくても効く。 同じルールでも結果が違う -
理由は stderr に明記されている。
stream-jsonの中には出てこない - 直し方は対話で1回信頼するか、
hasTrustDialogAccepted: trueを書く - Claude Code 2.1.281 と 2.1.282 でこの挙動に差は無かった
- changelog の「途中に
:*」は自分の書き方では再現できなかった
「ルールを書いたのに効かない」と思ったら、まず標準エラーを見てください。
-p や CI で回していると、JSON しか読まないので気づけません。
参考
- Claude Code changelog — 2.1.282 の Bash 権限ルール修正
関連記事
- Write() で拒否しても、Claude Code は12回とも書き込んだ。効いていたのは Edit() だけだった — 拒否ルールの書き方で結果が変わった回
- 拒否ルールを全部消しても、Claude Code は eval を止めた。守っていたのは別の仕組みだった — 拒否ルールの手前にある静的解析を測った回
JQITのエンジニアの95%以上は未経験からの採用です。
よければコーポレートサイトにも遊びに来てください。
エンジニア採用も行っています。もしご興味あれば覗いてみてください。
▶ 採用サイト