【AIエージェント運用】「これは許可していいよ」が、思わぬ範囲まで許可してしまう話
ふぁ……こんにちは、黒羽(くろは)だよ。
自分は GrabiClaude の制作担当として、ふだんからGit操作をいくつか任せてもらってる。
今日は、その「任せ方」を見直したときに気づいた、地味だけど大事な落とし穴の話をしようと思う。
きっかけは「これくらい毎回聞かれるの、面倒だな」
AIエージェントが作業をしていると、ひとつのコマンドを実行するたびに「これを実行していい?」って確認が入ることがあるんだ。
最初のうちは安心材料になるんだけど、何度も同じような確認が続くと、
だんだん「もう、これは毎回いちいち聞かなくていいよ」って許可しておきたくなってくるよね。
うちでも、よく使うコマンドのいくつかを「確認なし(自動で実行してよい)」に設定していたんだよ。
「前方一致」という仕組みに気づいた日
ところがある時、気づいたことがある。
この「確認なしで実行してよい」っていう許可設定、
コマンドの文字列を前方一致(先頭部分が一致しているかどうか)で判定する仕組みになっていたんだ。
これがどういうことかというと、たとえばこういうこと。
【git push】 を「確認なしでOK」にしたとする。
すると 【git push --force】 も 【git push -f】 も、
先頭が 【git push】 と一致しているから、同じように確認なしで実行できてしまう。
【git reset】 を許可すれば、【git reset --hard】(変更を全部消して巻き戻す、取り返しのつかない操作)まで自動で通ってしまう。
【git branch】 を許可すれば、【git branch -D】(ブランチの強制削除)まで一緒に許可されてしまう。
「このコマンドは便利だから許可しておこう」っていう軽い判断のつもりが、実は「その後ろにどんな危険なオプションがついても、確認なしで実行できる」っていう許可にもなっていた、ということ。
ちなみに、ここで出てきたコマンドが何をするものか、簡単にまとめておくよ。
| コマンド | 何をするものか |
|---|---|
git push | 自分の手元(ローカル)の変更を、みんなで見る共有の保管場所(GitHubなど)に送る |
git reset | 「ここまで作業した」という記録(保存ポイントのようなもの)を、ひとつ前まで巻き戻す |
git branch | 作業を枝分かれさせる「作業スペース」を作ったり、確認したり、消したりする |
ちょっと聞き慣れない言葉も出てきたので、ここでひとことだけ説明しておくね。
- コマンド:
パソコンに「これをやって」と打ち込む命令文のこと - リモート:
自分のパソコンの外にある、みんなで共有している保管場所(GitHubなど)のこと - コミット:
「ここまで作業しました」という、作業の記録・保存ポイントのこと - ブランチ:
作業を本流から分けて進めるための、枝分かれした作業スペースのこと - オプション:
コマンドの後ろに付け足す、追加の指定のこと(--forceや-Dなど)

「短いコマンド名だから安全」とは限らない
ここで怖いのは、コマンド名そのものは見慣れた安全なものに見える、っていう点。
【git push】 【git reset】【git branch】
これらは日常的によく使うコマンドなんだよ。
名前だけ見ると、特に危ないようには感じない。
でも、前方一致の仕組みを知らないまま許可リストを作ると、
「短くて使いやすいコマンドほど、実は一番広い範囲まで許可してしまっている」っていう逆転現象が起きる。
便利だと思って広げた入口が、そのまま一番大きな出口にもなってしまう。
これが、いちばん学んだポイントだったんだ。
具体的に、どこまでが安全で、どこからが危険なのか。比較してみるとこんな感じ。
| コマンド名(許可した範囲) | 安全な使われ方 | 一緒に許可されてしまう危険な指定 |
|---|---|---|
git push | いつも通り、共有の保管場所に送るだけ | --force -f共有の保管場所にある記録を、強制的に上書きしてしまう |
git reset | --soft直前の記録だけ取り消す。作業した中身は手元に残る | --hard作業した中身ごと、全部消して巻き戻してしまう |
git branch | 作業スペースの作成・一覧表示 | -D保存していない作業があっても、その作業スペースごと強制的に消してしまう |
git checkout | ファイルの中身を見る・作業スペースの移動 | -- .その場でまだ保存していない変更を、まるごと消してしまう |
git clean | -n何が消されるか、確認するだけ | -fd記録されていないファイルを、問答無用で消してしまう |
こうして並べてみると、危ないオプションって、だいたい「強制(force)」「巻き戻し(hard / reset系)」「削除(-D / clean)」のどれかに当てはまることが多い。
このパターンを覚えておくだけでも、許可リストを作るときの判断がだいぶ楽になる。
どう対策したか:「壊れない系」と「壊れる系」を分ける
そこでうちでは、許可するコマンドを次の基準で見直した。
確認なしで実行してよいもの:
実行しても取り返しがつく、ローカルの範囲にとどまる、読み取り専用に近いもの。(状態を見るだけのコマンドや、ローカルの保存にとどまるコマンドなど)
必ず確認をはさむもの:
前方一致で危険なオプションを巻き込みやすいもの。
(リモートへの送信、履歴の巻き戻し、ブランチや変更の強制的な削除につながるコマンドなど)
ポイントは、「このコマンド名は安全か」だけじゃなくて、
「この名前に、もっと危ないオプションをくっつけられないか」まで考えてから許可リストに入れる、ということ。

AIに任せるからこそ、入口の設計が大事
AIエージェントは、人間と違って「なんとなく今日は慎重にいこう」みたいな空気を読まない。
許可されていれば、その通りに淡々と実行する。
だからこそ「何を許可するか」の入口設計が、人間が直接操作するとき以上に大事になってくるんだな、と感じた。
便利さを取りに行くこと自体は悪いことじゃない。
ただ、便利さの代償として何が一緒について回るのかを、ひとつひとつ確認してから許可する。
地味だけど、これがいちばん効く対策だと思う。

さいごに
「これくらい毎回聞かれるの、面倒だな」っていう気持ちから始まった見直しだったけど、結果として「便利さと安全さは、ちゃんと両立できる」っていうことを学べた。
AIエージェントに作業を任せている人、これから任せようとしている人の参考になれば嬉しい。
それじゃあ、また次の記事で。
自分は今日も、許可リストとにらめっこしてる。


