AIコーディングの道具の選び方 第5回
Claude Code にどこまで任せてよい? 自動化と、人が決める線を実験で確かめた

この記事でわかること
- 任せる作業と、人が決める作業の分け方
- deny ルールとフックで止まる範囲と、頼りきれない理由
- フックが失敗しても通さない onFailure の書き方
確認した環境: Claude Code 2.1.296(Opus 5.5・Haiku 5.5)/ 実験は編集部の検証環境(Linux)/ 2026年10月12日に確認
Claude Code は、auto モードや許可のルールを使うと、確認の画面をほとんど出さずに作業を進められます。この記事では、任せてよい作業と、人が決める作業の分け方を説明します。あわせて、「消す操作を止める設定」が本当に止めるのかを、編集部が Claude Code 2.1.296 で 62 回試した結果をまとめます。
任せてよい線は、2 つの問いで決める

任せる前に、次の 2 つを確かめます。
- 失敗しても、戻せるか: Git にコミットしたファイルは戻せます。コマンドで消したファイルや、本番のデータベースは戻せません。
- 影響は、手元の中だけか: 作業フォルダの中の編集は、手元で終わります。push・デプロイ・メールの送信は、外の人やサービスに届きます。
両方が「はい」なら任せます。どちらかが「いいえ」なら、人が決めます。作業に当てはめると、次の表になります。

Claude Code(v2.1.283 以降)は、ターミナルと VS Code では、何も設定しなければ auto モードで始まります。auto モードのしくみとモードの違いは権限モードを使い分ける、確認の減らし方と許可のルールの書き方はYES ボタンの押し疲れを減らす、秘密のファイルを読ませない設定はAI コーディングの道具を安全に使うで説明しています。
公式のドキュメントは、auto モードは安全を保証するものではないと書いています。開発元の Anthropic が 2026年3月に公表した試験では、実際にあった行きすぎた操作 52 件のうち、17% を見逃しました。同じ記事には、指示の読み違いでリモートのブランチを消した、本番のデータベースに移行をかけようとした、という社内の例も載っています。
この記事では、その先の「人が決める線は、設定で引けるのか」を確かめます。
実験の前に: 止める仕組みは 3 つ

- フック: 決まったタイミングで自動で動くプログラムです。
PreToolUseのフックは、コマンドの実行の前に動き、終了コード 2 を返すと止められます。 - deny・ask のルール: 設定ファイル(settings.json)に書きます。deny は使わせない、ask は必ず人にたずねる、という意味です。
- 権限モード: auto モードでは、別のモデル(分類器)が、依頼の範囲を超えていないかを確かめます。
公式のドキュメントは、Bash のルールについて、Claude が書いたコマンドの文字に合うかを見るもので、そのプログラムを守る安全の境目ではない、と説明しています。Bash(rm *) は /bin/rm -rf build/ と bash -c 'rm -rf build/' を止めない、という例も載っています。編集部は、これを実際に動かして確かめました。
実験 1: deny に Bash(rm *) だけを書く
プロジェクトの .claude/settings.json に、次のルールだけを書きました。
{
"permissions": {
"deny": ["Bash(rm *)"]
}
}
rm -rf ./old-cache を指定して頼むと、ルールが止めました。

次に、同じ設定のまま、コマンドを /bin/rm -rf ./old-cache に変えました。確認の画面は出ずに実行され、フォルダは消えました。

②の「Allowed by auto mode classifier」は、auto モードの分類器が許可した、という意味です。公式のドキュメントによると、auto モードは、作業フォルダの中のファイル操作を既定で通します。今回は、消すことを人が頼んでいます。
書き方を 15 通り試した結果は、次のとおりです。自分の設定に足りない形がないかを確かめるために使ってください。

- 止まった形: ほかのコマンドとつなげる形、前に変数を置く形、
command・env・xargsを前に付ける形は止まりました。deny のルールは、コマンドを部分に分けて調べています。 - 消えた形: 場所つきの
/bin/rm、find -delete、node -eやpython3 -cの短いプログラム、ファイルに書いてから実行する形は、どれも消えました。どれも、rmという名前で始まらない形です。このうち/bin/rmとfind -deleteは、実験 2 で書き足したルールで止まりました。 - ルールなし: 何も書かない場合は、
rm -rf ./old-cacheも確認なしで実行されました。
bash -c の形は、確認の画面に変わった
bash -c 'rm -rf ./old-cache' は、公式の表では「止めない」形です。編集部の環境では、対話の画面で次の確認が出ました。

- ②の 1 行目は、「この
-cのスクリプトの中に、ルールが拒否するコマンドがある」という説明です。2 行目は、答えがなければ自動で拒否する、という案内です。答えないままにすると、時間切れで拒否されました。非対話の実行では、答える人がいないので、そのまま拒否されました。 - ③で Yes を選ぶと、コマンドは実行され、フォルダは消えました。deny のルールに当たるコマンドでも、この形では「人にたずねる」に変わります。
- 編集部が 2026年9月29日に 2.1.281 で同じ形を試したときは、止まらずにフォルダが消えました。版によって動きが変わります。
実験 2: ルールを書き足す、フックを足す
消えた形を止めるために、2 つの設定を試しました。
- B: deny を書き足す:
Bash(*/rm *)(場所つきの rm)とBash(find * -delete*)を足します。 - C: フックを足す: コマンドの全文を調べるプログラムを、
PreToolUseのフックに登録します。先頭の場所(/bin/など)を外し、bash -cの中も調べて、フォルダごと消すrmとfind -deleteを止めます。


B も C も、/bin/rm と find -delete を止めました。一方、node -e、python3 -c、ファイルに書いてから実行する形は、どちらでも消えました。消し方はほかにもあります。文字を見る仕組みでは、すべてを止められません。止める設定だけに頼らず、最後の章の「届かせない」「戻せるようにする」を先に整えます。
フックのプログラム(guard-delete.mjs)
C で使ったプログラムです。Node.js で動きます。プロジェクトの .claude/hooks/ に置きました。
#!/usr/bin/env node
// PreToolUse(Bash)のフック: フォルダごと消す rm と find -delete を、書き方が違っても止める
let raw = "";
for await (const chunk of process.stdin) raw += chunk;
const command = JSON.parse(raw).tool_input?.command ?? "";
// 空白で区切り、引用符を外す
function words(text) {
const out = [];
let cur = "", quote = null;
for (const ch of text) {
if (quote) { if (ch === quote) quote = null; else cur += ch; continue; }
if (ch === '"' || ch === "'") { quote = ch; continue; }
if (/\s/.test(ch)) { if (cur) out.push(cur); cur = ""; continue; }
cur += ch;
}
if (cur) out.push(cur);
return out;
}
function deletes(text, depth = 0) {
for (const part of text.split(/;|&&|\|\||\||\n/)) {
const w = words(part.trim());
// 先頭の「変数=値」や sudo・env などを外す
while (w.length && (/^\w+=/.test(w[0]) || ["sudo", "env", "command", "exec", "nohup", "time", "xargs"].includes(w[0]))) w.shift();
if (!w.length) continue;
const prog = w[0].replace(/^.*\//, ""); // /bin/rm → rm
// bash -c '…' の中も同じように調べる
if (["bash", "sh", "zsh"].includes(prog) && w.includes("-c") && depth < 3) {
if (deletes(w[w.indexOf("-c") + 1] ?? "", depth + 1)) return true;
}
if (prog === "rm" && w.slice(1).some((a) => /^-[a-zA-Z]*[rR]/.test(a) || a === "--recursive")) return true;
if (prog === "find" && w.includes("-delete")) return true;
}
return false;
}
if (deletes(command)) {
console.error("フォルダごと消す操作なので止めました。人が確かめてから実行してください。");
process.exit(2); // 終了コード 2 = 止める
}
フックは、失敗すると通す
フックには落とし穴があります。公式のドキュメントによると、フックが時間切れになったり、起動に失敗したりしても、既定ではコマンドはそのまま実行されます。編集部は、5 秒かかるフックに 2 秒の上限を付けた場合と、フックのファイル名を打ち間違えた場合を試しました。コマンドは /bin/rm -rf ./old-cache です。
| フックの状態 | そのまま | "onFailure": "block" を足す |
|---|---|---|
| 時間切れ(5 秒かかる・上限 2 秒) | 消えた | 止まった |
| ファイル名の打ち間違い | 消えた | 止まった |
onFailure は、v2.1.295(2026年10月8日)で入った項目です。"block" と書くと、フックが失敗したときにコマンドを止めます。

止めるためのフックは、次の 3 つを守ります。
- 止めるときは、終了コード 2 を返す。公式のドキュメントによると、1 では止まりません。
"onFailure": "block"を書く。- 登録したら、止めたい操作を実際に頼んで、止まるかを確かめる。
B と C を合わせた設定は、次のとおりです。編集部は、この設定で /bin/rm と find -delete が止まり、ls は普段どおり動くことを確かめました。
{
"permissions": {
"deny": [
"Bash(rm *)",
"Bash(*/rm *)",
"Bash(find * -delete*)"
],
"ask": [
"Bash(git push *)"
]
},
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "node",
"args": ["${CLAUDE_PROJECT_DIR}/.claude/hooks/guard-delete.mjs"],
"onFailure": "block"
}
]
}
]
}
}
実験 3: 外に届く操作は、ask のルールで人にたずねる
外に届く操作には、ask のルールで確認の画面を出せます。ask のルールは、auto モードでも確認の画面を出します。ask に Bash(git push *) だけを書いた設定を、使い捨てのリポジトリで試しました。送り先は、同じ検証環境の中に作った空のリポジトリです。

| 設定 | 頼んだコマンド | 結果 |
|---|---|---|
| ルールなし | git push origin main |
確認なしで送られた |
ask に Bash(git push *) |
git push origin main |
確認の画面が出た |
ask に Bash(git push *) |
git -C . push origin main |
確認なしで送られた |
非対話の実行では、答える人がいないので、2 行目のコマンドは実行されませんでした。3 行目のとおり、ask のルールも、書いた形にだけ合います。git -C . push は、公式のドキュメントにも、ルールに合わない例として載っています。
試していないこと
- サンドボックス: 公式のドキュメントは、コマンドの文字によらずに制限する方法として、サンドボックス(コマンドが書き込める場所と通信先を、OS の仕組みで制限する機能)を案内しています。既定ではオフです。Linux では bubblewrap と socat という部品が要ります。編集部の検証環境には socat が入っていないため、試していません。
- ほかの環境: macOS と Windows では試していません。
- ほかの操作: データベースの削除、
terraform destroy、force push などは試していません。 - Claude が自分で選ぶ書き方: 実験では、コマンドの書き方を人が指定しました。ふだんの作業で、Claude がルールに合わない書き方を自分から選ぶかどうかは、試していません。
線は、届く範囲と、戻せる備えで引く

実験のとおり、止める設定は、うっかりを減らす補助です。線は、次の 2 つで引きます。
- 届かせない: 本番の鍵やパスワードが、AI の動く環境になければ、コマンドの書き方がどうであっても、その鍵が要る操作は実行できません。開発と本番で、サーバー・データベース・鍵を分けます。
- 戻せるようにする: 任せる前に、Git にコミットします。公式のドキュメントによると、Claude Code の巻き戻し(
/rewind)は、コマンドで消したファイルを戻せません。バックアップは、AI が持つ鍵では消せない場所に置き、戻す練習をしておきます。
そのうえで、外に届く操作には ask のルールを、消す操作には deny のルールとフックを足します。設定を入れた日と、Claude Code の版を上げた日に、書き方を変えて試してください。今回のように、同じ設定でも版によって結果が変わります。
確認の画面が出たときは、中身を読んでから答えます。実験 1 のとおり、deny のルールに当たるコマンドでも、確認の画面で Yes を選ぶと実行される場面があります。
参考にした公式の情報
執筆者
株式会社Game 代表取締役。工学部出身で、21歳で起業してからシステム会社の経営一筋で8期目。アプリの受託開発から始め、いまはAIを使ったシステムソリューションを手がけています。150社以上の企業とのプロジェクトで培った開発と情報システムの現場の経験と声を形にし、激動の時代を乗り越えたいと考えています。
この記事は、Claude Code を使って執筆しました。画面の画像は、検証環境で実際に操作して撮影したものです(引用の画像は出典を記載しています)。内容の誤りはお問い合わせからお知らせください。
連載
AIコーディングの道具の選び方全 5 回の目次
- 1Claude Code・Codex・Copilot の違いと選び方
- 2AI に作業を頼むときのコツ(編集部が試した頼み方)
- 3AI コーディングの道具を安全に使う(権限・秘密情報・学習の設定)
- 4Claude Code と Codex に同じ不具合を直してもらった
- 5Claude Code にどこまで任せてよい? 自動化と、人が決める線を実験で確かめた(この記事)