Claude Code 2.1.275(2026-09-17)の changelog に、こう書かれています。
Fixed
/update-configwritingWrite(path)permission rules, which file permission checks
don't match, instead ofEdit(path)rules
Write(パス) の権限ルールは、ファイルの権限検査に一致しない。 しかもその形を書いていたのは
Claude Code 自身の /update-config です。36回測りました。
deny に Write(ファイル) だけ書く 12回とも書き込まれた
deny に Edit(ファイル) だけ書く 12回とも止まった
両方書く 12回とも止まった
Edit() は Write ツールの新規作成も、Bash のリダイレクトも止める
2.1.275 でも Write() は効かないまま。直ったのは「書く側」だけ
検証環境: Windows 10 / Claude Code 2.1.273 と 2.1.275 を隔離導入 /
claude -p/ 測定は 2026-09-18
測り方: acceptEdits でないと決着がつかない
前回ここで詰まりました。
claude -p には確認に答える人がいないので、「拒否」と「確認待ち」が同じ形になります。
--permission-mode acceptEdits を使うと分かれます。
| ルールの状態 | acceptEdits での結果 |
|---|---|
| 効いている | 自動承認では上書きできない → 止まる |
| 効いていない | 確認が自動承認される → 書き込まれる |
拒否ルールを1種類ずつに分けた捨てディレクトリを3つ。
{ "permissions": { "deny": ["Write(./secret.txt)", "Write(./fresh.txt)"] } }
{ "permissions": { "deny": ["Edit(./secret.txt)", "Edit(./fresh.txt)"] } }
{ "permissions": { "deny": ["Edit(./secret.txt)", "Write(./secret.txt)", ... ] } }
経路も3つ。判定はファイルの中身だけで、自己申告は使いません。
| 経路 | |
|---|---|
| E | Edit ツールで既存の secret.txt を書き換える |
| W | Write ツールで新規に fresh.txt を作る |
| B | Bash で echo ... > secret.txt
|
結果: Write() は1件も止めなかった
3ルール × 3経路 × 2バージョン × 各2回 = 36回。
| 拒否ルール | E: Edit ツール | W: Write ツール | B: Bash リダイレクト |
|---|---|---|---|
Write(...) のみ |
2/2 書き込み | 2/2 書き込み | 2/2 書き込み |
Edit(...) のみ |
0/2(拒否) | 0/2(拒否) | 0/2 |
| 両方 | 0/2(拒否) | 0/2(拒否) | 0/2 |
Claude Code 2.1.273 と 2.1.275 で、1つも違いませんでした。
Write(...) だけのときは、拒否イベントが出ません(両版とも 0/6)。
Edit(...) があるときだけ返り、経路で文言が変わります。
Edit / Write ツール File is in a directory that is denied by your permission settings.
Bash Permission to use Bash with command echo BASH-WROTE > secret.txt has been denied.
Edit() は Write ツールまで止める
Edit(./fresh.txt) と書くと、Write ツールでの新規作成も止まります。
名前は「Edit」ですが、ファイル系の検査はこちらに寄っています。
Write() は、Write ツールすら止めませんでした。
/update-config が書く形は、2.1.275 で変わった
changelog が名指ししているのはここです。
「secret.txt への編集を止めて」と頼み、提案 JSON を読みます。
| Claude Code の版 | 提案された拒否ルール |
|---|---|
| 2.1.273 1回目 |
Edit(secret.txt) / Write(secret.txt)
|
| 2.1.273 2回目 | これに Edit(**/secret.txt) / Write(**/secret.txt) が加わる |
| 2.1.275 2回とも |
Edit(secret.txt) / Edit(**/secret.txt) のみ
|
2.1.273 は2回で件数が違いましたが、どちらも Write() を含みます。
2.1.275 は2回とも Edit() だけでした。
ただし Write() 自体は 2.1.275 でも効きません。
直ったのは「これから書く形」だけで、書かれたルールは効かないままです。
自分の設定を確認する
Write( を探すだけです。
grep -n '"Write(' ~/.claude/settings.json ~/.claude/settings.local.json .claude/settings.json 2>/dev/null
出てきたら Edit( に直します。Edit() だけで3経路とも止まるので、両方書く必要はありません。
自分の環境には Edit(...) しかなく、影響はありませんでした。
言えないこと
-
Write()が全ての文脈で無意味とは言えません。 測ったのはファイルのdenyルールだけ。allow側は未測定です - 測ったのは Claude Code 2.1.273 と 2.1.275 の2点。いつからこうなのかは特定していません
-
acceptEditsでの結果。 対話セッションで確認ダイアログの出方は未確認です -
/update-configは両版とも settings.json の作成権限が下りず、提案 JSON を読んでいます。書き込み後のファイルは未確認 - Windows 10 の環境。パスの扱いが OS で変わる可能性があります
まとめ
denyにWrite(ファイル)と書いても、Claude Code は12回とも書き込んだ-
Edit(ファイル)は3経路すべてを止める。 Edit ツール、Write ツールの新規作成、Bash のリダイレクト -
Claude Code 2.1.275 でも
Write()は効かない。 直ったのは/update-configが書く形だけ - 2.1.273 の
/update-configは、効かないWrite()を混ぜて提案していた - 確認は
grep '"Write('だけ。出てきたらEdit(に直す
拒否ルールは、書けば効く設定ではありませんでした。
前回は「消しても結果が変わらない」、今回は書いてあるのに何もしていないほうでした。
参考
-
Claude Code changelog — 2.1.275 の
/update-config修正
関連記事
- 拒否ルールを全部消しても、Claude Code は eval を止めた。守っていたのは別の仕組みだった — 前編。拒否ルールの手前にある静的解析を測った回
-
Claude Code で編集を拒否したファイルが、tee なら4回中4回書けた — 拒否ルールが
teeをすり抜けていた回
JQITのエンジニアの95%以上は未経験からの採用です。
よければコーポレートサイトにも遊びに来てください。
エンジニア採用も行っています。もしご興味あれば覗いてみてください。
▶ 採用サイト