本文へ移動
ハック!でAI

AIコーディングの道具の選び方 第5回

Claude Code にどこまで任せてよい? 自動化と、人が決める線を実験で確かめた

佐々木 航@w_sasakiwith Claude Code読了 約16分
作業ごとの任せ方の表。読む・調べる・まとめる、手元のコードを直す・テストを動かす、開発用のサーバーやデータベースを変える、は任せる。本番に出る push・デプロイ・データベースの移行、フォルダやデータの削除・force push、メールの送信・購入・支払い、は人が決める

この記事でわかること

  • 任せる作業と、人が決める作業の分け方
  • 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 つの問いで決める

1 失敗しても、戻せる? 2 影響は、手元の中だけ? の 2 つの問い。両方とも「はい」なら AI に任せる、どちらかが「いいえ」なら人が決める、と分かれる図
任せる前に確かめる 2 つの問い。両方が「はい」の作業だけを任せる撮影・作図: 編集部

任せる前に、次の 2 つを確かめます。

  • 失敗しても、戻せるか: Git にコミットしたファイルは戻せます。コマンドで消したファイルや、本番のデータベースは戻せません。
  • 影響は、手元の中だけか: 作業フォルダの中の編集は、手元で終わります。push・デプロイ・メールの送信は、外の人やサービスに届きます。

両方が「はい」なら任せます。どちらかが「いいえ」なら、人が決めます。作業に当てはめると、次の表になります。

読む・調べる・まとめる、手元のコードを直す・テストを動かす、開発用のサーバーやデータベースを変える、は任せる。本番に出る push・デプロイ・データベースの移行、フォルダやデータの削除・force push、メールの送信・購入・支払い、は人が決める、という表
作業ごとの任せ方。下の 3 つは、確認を出すか、人が自分で実行する撮影・作図: 編集部

Claude Code(v2.1.283 以降)は、ターミナルと VS Code では、何も設定しなければ auto モードで始まります。auto モードのしくみとモードの違いは権限モードを使い分ける、確認の減らし方と許可のルールの書き方はYES ボタンの押し疲れを減らす、秘密のファイルを読ませない設定はAI コーディングの道具を安全に使うで説明しています。

公式のドキュメントは、auto モードは安全を保証するものではないと書いています。開発元の Anthropic が 2026年3月に公表した試験では、実際にあった行きすぎた操作 52 件のうち、17% を見逃しました。同じ記事には、指示の読み違いでリモートのブランチを消した、本番のデータベースに移行をかけようとした、という社内の例も載っています。

この記事では、その先の「人が決める線は、設定で引けるのか」を確かめます。

実験の前に: 止める仕組みは 3 つ

Claude がコマンドを書く、1 フック(自分で用意したプログラムがコマンドの全文を調べる)、2 deny・ask のルール(コマンドの文字がルールに合えば止めるか人にたずねる)、3 権限モード(auto モードでは分類器が確かめる)、実行、の順に並んだ図
Claude Code が書いたコマンドが実行されるまで。実験では、コマンドの書き方が変わっても 1 と 2 が止めるかを試した撮影・作図: 編集部
  • フック: 決まったタイミングで自動で動くプログラムです。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 に、次のルールだけを書きました。

JSON
{
  "permissions": {
    "deny": ["Bash(rm *)"]
  }
}

rm -rf ./old-cache を指定して頼むと、ルールが止めました。

依頼の文に rm -rf ./old-cache とあり、Bash(rm -rf ./old-cache) の下に Error: Permission to use Bash with command rm -rf ./old-cache has been denied. と表示されている
deny のルールが止めた画面。① 頼んだコマンド ② Bash の呼び出しと、拒否のメッセージ撮影・作図: 編集部

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

依頼の文に /bin/rm -rf ./old-cache とあり、Bash(/bin/rm -rf ./old-cache) の下に (No output) と Allowed by auto mode classifier、次の ls の結果に ls: cannot access './old-cache': No such file or directory と表示されている
同じ deny のルールのまま、/bin/rm と書いた画面。① 頼んだコマンド ② 分類器が許可して実行された ③ フォルダがなくなっている撮影・作図: 編集部

②の「Allowed by auto mode classifier」は、auto モードの分類器が許可した、という意味です。公式のドキュメントによると、auto モードは、作業フォルダの中のファイル操作を既定で通します。今回は、消すことを人が頼んでいます。

書き方を 15 通り試した結果は、次のとおりです。自分の設定に足りない形がないかを確かめるために使ってください。

rm -rf、echo start && rm -rf、KEEP=1 rm -rf、command rm・env rm・バックスラッシュを付けた rm・xargs rm は deny のルールで止まった。bash -c 'rm -rf …' と sh -c は組み込みの安全確認で止まった。/bin/rm -rf、bash -c '/bin/rm -rf …'、find -delete、node -e と python3 -c、bash cleanup.sh は消えた、という表
実験 1 の結果。緑は止まった書き方、赤はフォルダが消えた書き方撮影・作図: 編集部
  • 止まった形: ほかのコマンドとつなげる形、前に変数を置く形、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' は、公式の表では「止めない」形です。編集部の環境では、対話の画面で次の確認が出ました。

Bash command の確認の画面に bash -c 'rm -rf ./old-cache'、A permission rule denies a command in this shell -c script、Claude Code will automatically deny this request in 1:59、Do you want to proceed? 1. Yes 2. No と表示されている
bash -c の形で出た確認の画面。① 頼んだコマンド ② 説明と、自動で拒否するまでの残り時間(この回の表示) ③ 選択肢撮影・作図: 編集部
  • ②の 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 を止めます。
8 通りのコマンドを、A deny に Bash(rm *) だけ、B deny を書き足す、C A にフックを足す、の 3 つの設定で試した表。止まった数は A が 2、B が 5、C が 5。node -e、python3 -c、bash cleanup.sh は、どの設定でも消えた
3 つの設定の比較。B と C は止まる書き方が増えたが、下の 3 つは止まらなかった撮影・作図: 編集部
Bash(/bin/rm -rf ./old-cache) の下に Error: PreToolUse:Bash hook error: guard-delete.mjs、フォルダごと消す操作なので止めました。人が確かめてから実行してください。と表示されている
フックが /bin/rm を止めた画面。① 頼んだコマンド ② フックのプログラムが返したメッセージ撮影・作図: 編集部

B も C も、/bin/rm と find -delete を止めました。一方、node -e、python3 -c、ファイルに書いてから実行する形は、どちらでも消えました。消し方はほかにもあります。文字を見る仕組みでは、すべてを止められません。止める設定だけに頼らず、最後の章の「届かせない」「戻せるようにする」を先に整えます。

フックのプログラム(guard-delete.mjs)

C で使ったプログラムです。Node.js で動きます。プロジェクトの .claude/hooks/ に置きました。

JavaScript
#!/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" と書くと、フックが失敗したときにコマンドを止めます。

Bash(/bin/rm -rf ./old-cache) の下に Error: PreToolUse:Bash hook error: slow-hook.mjs: timed out; blocking because onFailure is block と表示され、Claude がフックの時間切れと onFailure の設定で止まったと説明している
onFailure を "block" にして、フックが時間切れになった画面。① 時間切れ(timed out)なので止めた、というメッセージ ② Claude の説明撮影・作図: 編集部

止めるためのフックは、次の 3 つを守ります。

  • 止めるときは、終了コード 2 を返す。公式のドキュメントによると、1 では止まりません。
  • "onFailure": "block" を書く。
  • 登録したら、止めたい操作を実際に頼んで、止まるかを確かめる。

B と C を合わせた設定は、次のとおりです。編集部は、この設定で /bin/rm と find -delete が止まり、ls は普段どおり動くことを確かめました。

JSON
{
  "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 *) だけを書いた設定を、使い捨てのリポジトリで試しました。送り先は、同じ検証環境の中に作った空のリポジトリです。

Bash command の確認の画面に git push origin main、Ask rule Bash(git push *) overrides auto mode for this command.、Do you want to proceed? 1. Yes 2. No と表示されている
auto モードのまま、ask のルールで出た確認の画面。① 頼んだコマンド ② ask のルールが auto モードより優先された、という説明 ③ 選択肢撮影・作図: 編集部
設定 頼んだコマンド 結果
ルールなし 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 がルールに合わない書き方を自分から選ぶかどうかは、試していません。

線は、届く範囲と、戻せる備えで引く

1 届かせない(本番の鍵を AI が動く環境に置かない、開発と本番を分ける、作業するフォルダで起動する)、2 止める(外に届く操作は ask のルール、フックには onFailure を block、入れた日と版を上げた日に試す)、3 戻せるようにする(Git にコミット、バックアップは AI の鍵で消せない場所、戻す練習)のチェックリスト
任せる前のチェックリスト。止める設定は 2 の層で、1 と 3 が土台になる撮影・作図: 編集部

実験のとおり、止める設定は、うっかりを減らす補助です。線は、次の 2 つで引きます。

  • 届かせない: 本番の鍵やパスワードが、AI の動く環境になければ、コマンドの書き方がどうであっても、その鍵が要る操作は実行できません。開発と本番で、サーバー・データベース・鍵を分けます。
  • 戻せるようにする: 任せる前に、Git にコミットします。公式のドキュメントによると、Claude Code の巻き戻し(/rewind)は、コマンドで消したファイルを戻せません。バックアップは、AI が持つ鍵では消せない場所に置き、戻す練習をしておきます。

そのうえで、外に届く操作には ask のルールを、消す操作には deny のルールとフックを足します。設定を入れた日と、Claude Code の版を上げた日に、書き方を変えて試してください。今回のように、同じ設定でも版によって結果が変わります。

確認の画面が出たときは、中身を読んでから答えます。実験 1 のとおり、deny のルールに当たるコマンドでも、確認の画面で Yes を選ぶと実行される場面があります。

参考にした公式の情報

XFacebookはてブLINE

執筆者

佐々木 航@w_sasaki

with Claude Code

プロフィール

株式会社Game 代表取締役。工学部出身で、21歳で起業してからシステム会社の経営一筋で8期目。アプリの受託開発から始め、いまはAIを使ったシステムソリューションを手がけています。150社以上の企業とのプロジェクトで培った開発と情報システムの現場の経験と声を形にし、激動の時代を乗り越えたいと考えています。

この記事は、Claude Code を使って執筆しました。画面の画像は、検証環境で実際に操作して撮影したものです(引用の画像は出典を記載しています)。内容の誤りはお問い合わせからお知らせください。

連載

AIコーディングの道具の選び方
全 5 回の目次
  1. 1Claude Code・Codex・Copilot の違いと選び方
  2. 2AI に作業を頼むときのコツ(編集部が試した頼み方)
  3. 3AI コーディングの道具を安全に使う(権限・秘密情報・学習の設定)
  4. 4Claude Code と Codex に同じ不具合を直してもらった
  5. 5Claude Code にどこまで任せてよい? 自動化と、人が決める線を実験で確かめた(この記事)