18
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Write() で拒否しても、Claude Code は12回とも書き込んだ。効いていたのは Edit() だけだった

18
Last updated at Posted at 2026-09-17

Claude Code 2.1.275(2026-09-17)の changelog に、こう書かれています。

Fixed /update-config writing Write(path) permission rules, which file permission checks
don't match, instead of Edit(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 で変わる可能性があります

まとめ

  • denyWrite(ファイル) と書いても、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( に直す

拒否ルールは、書けば効く設定ではありませんでした。
前回は「消しても結果が変わらない」、今回は書いてあるのに何もしていないほうでした。


参考

関連記事


JQITのエンジニアの95%以上は未経験からの採用です。
よければコーポレートサイトにも遊びに来てください。

コーポレートサイト

エンジニア採用も行っています。もしご興味あれば覗いてみてください。

採用サイト

18
15
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
18
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?