0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AI に「全自動」を許可するために必要だった3つの安全装置 ── Antigravity でターミナル制御を設計した話

0
Posted at

はじめに ── 趣味プロジェクトで AI にファイルを消された

OCR を使ったスクリプトを開発していたときの話。

Antigravity(以下 AG)で Gemini と試行錯誤しながら進めていた。自分が生成したファイルを AG がリファクタリング名目で一括削除したり、別プロジェクトから勝手にデータを引っ張ってきたり、やりたい放題される場面があった。

業務アプリなら AGENTS.md をしっかり定義してある。でも趣味プロジェクトや小さなツール開発では、そこまでルールを固めていない。その状態で AI コーディングツールの自動実行を ON にしていると、rm コマンドが確認なしで走ることがある。実際に走った。😢😢😢

Git がある前提で「まあ戻せるし」と思っていた部分もある。でも、戻す手間は戻す手間だし、そもそも気づかなかったら? という話になる。

この経験から、AG の「Always Proceed」設定は便利だけど、何も考えずに ON にするものではないと思い知った。自由にやらせたい。でも壊されたくない。このバランスをどう取るか。

自分の場合、3つのレイヤーで安全装置を設計することにした。

3層構造の概要

レイヤー 役割 仕組み
L1: AG 設定(Allow / Deny パターン) 物理的な遮断 AG の設定画面で定義する正規表現パターン。AI がどう暴走しても突破できない
L2: AGENTS.md(WF-14) AI への行動指針 プロジェクトの AGENTS.md に明文化したコマンド安全ポリシー。AI 側が「やらない」と判断する根拠になる
L3: Workflow turbo-all 信頼済みコマンドの全自動実行 .agent/workflows/ 内の WF ファイルに // turbo-all を付記して、特定手順のコマンドを承認なしで実行する

L1 で絶対に通さない。L2 で AI 自身に判断させる。L3 で信頼済みの手順だけ高速化する。この3つがないと、安全と生産性は両立できなかった。

L1: AG の設定機能 ── .md に書いても無意味な領域がある

.md ルールの限界

AGENTS.md に「rm -rf は禁止」と書いてあっても、AI にとっては「お願い」でしかない。コンテキストが溢れたり、モデルが切り替わったり、単にハルシネーションしたりすれば、普通に無視される。

Opus 4.6 の制限で、Gemini に変更すると高確率で AGENTS.md が無視されたりした。
タスク WF 完了後、曖昧なプロンプト実行しても勝手に修正されたり、時間経つとなったり。😢😢😢

OCR スクリプト開発で Gemini にファイルを一括削除されたのも、ルールが甘かったからではなく、そもそもルールが物理的な強制力を持っていなかったからだと思っている。

だから、AG のアプリケーション設定レベルで遮断する必要がある。

AG の「Terminal Command Auto Execution」設定では、Deny パターンと Allow パターンを正規表現で定義できる。この設定は AG 自体が評価するので、LLM の出力に関係なく、マッチしたコマンドは実行されない。

Deny パターン例

# 再帰削除
rm\s+-(rf|fr|r)\b

# 権限昇格
^sudo\b

# 権限変更
^(chmod|chown)\b

# リモートスクリプト実行
(curl|wget)\s.*\|\s*(sh|bash|zsh)

# グローバルインストール
brew\s+install
npm\s+install\s+-g
pip\s+install

# 強制プッシュ
git\s+push\s+.*--force

# ハードリセット
git\s+reset\s+--hard

Allow パターン例

# 読み取り系
^(ls|cat|head|tail|wc|find|grep|rg|fd)\b

# Git 参照系
^git\s+(status|log|diff|branch|show)\b

# Xcode ビルド確認
^xcodebuild\s+-list\b

Deny が先、Allow が後

AG の設定では Deny が Allow より優先されるrm -rf . && ls みたいな複合コマンドを生成されても、Deny パターンが先に引っかかるので遮断される。この優先順位がないと成り立たない。

L2: AGENTS.md WF-14 ── AI 側にも「なぜダメか」を伝える

L1 だけだと AI が困る

Deny パターンで遮断すると、AG は「ブロックされました」とだけ返す。AI はなぜブロックされたのか分からないので、同じコマンドを別の書き方で再試行してきたり、「手動で実行してください」と言ってきたりする。

遮断するだけでは足りない。AI 側にも「何がダメで、なぜダメで、代わりに何をすべきか」を伝える必要がある。

WF-14 の中身

AGENTS.md にはこう書いてある。

### WF-14 Command Safety Policy
- ファイル操作の対象パスはプロジェクトルート配下に限定する
  - 許可: プロジェクトルート配下(`AGENTS.md` が存在するディレクトリ)
  - 許可: `~/.gemini/antigravity/` 配下(AG 自身のデータ)
  - 上記以外のパスへの書き込み・削除は禁止
- 以下のコマンドパターンは実行禁止:
  - `rm -rf` / `rm -r`(再帰削除)
  - `sudo`(権限昇格)
  - `chmod` / `chown`(権限変更)
  - `curl | sh` / `wget | bash`(リモートスクリプト実行)
  - グローバルインストール系(`brew install` / `npm install -g` / `pip install`

L1 がコマンド文字列をパターンマッチで止めるのに対して、L2 はパスの制限や文脈を含めた判断を AI に求めている。L1 は正規表現でしか判定できないが、L2 なら「プロジェクトルート外への書き込みは禁止」みたいな柔軟な条件を書ける。

L1 は「何があっても止める壁」で、L2 は「壁に当たる前に止まれるようにする仕組み」。 両方ないと、ブロックされたコマンドの再試行ループに陥る。

L3: Workflow turbo-all ── ここだけは全自動で走らせる

安全装置を固めすぎると開発が止まる

L1 と L2 を整備すると、危険なコマンドは止まるようになる。でも今度は、安全なコマンドまで毎回確認ダイアログが出てくる。git status を叩くたびに「実行しますか?」と聞かれるのは正直キツい。

turbo-all の仕組み

AG の Workflow ファイル(.agent/workflows/ 配下の .md)に // turbo-all と書いておくと、その WF 内のコマンド実行ステップがすべて自動承認される。

たとえば自分の /task(実装タスク開始)ワークフロー。

---
description: 実装タスク開始手順(AGENTS.md読込 → 設計 → 実装 → 検証)
---

// turbo-all

1. `AGENTS.md` を読み、DG/WF ルールを確認する
2. `git status` で作業ツリーの状態を確認する
3. ユーザーの指示内容に基づき、対象 Module の既存コードを調査する
4. implementation_plan.md を作成する
5. Human の承認を待つ。承認されるまでコード編集を開始しない
6. 承認後、実装を開始する
7. 実装完了後、自発的レビューを実施する
8. `xcodebuild -list -project xxx.xcodeproj` で解決確認する
9. 完了報告を出力し、`/completion` の実行を促す

ステップ2の git status やステップ8の xcodebuild -list は、ダイアログなしで即実行される。/completion ワークフローも同様で、git addgit commit の流れが承認なしで走る。

なぜこれが安全なのか

「全自動にして大丈夫なのか?」と思うかもしれないが、L1 の Deny パターンは turbo-all より優先される。turbo-all で自動実行しようとしても、Deny にマッチすればブロックされる。(26年2月時点)

もう一つ。WF ファイルの中身は自分が書いている。AI が勝手に WF を作ったり変更したりすることはない。turbo-all で自動化される手順は、事前に自分がレビューして定義したものだけ。

turbo-all を付けない WF もある

/task/completion には付けた。一方で /review(AGENTS.md のルール改善レビュー)には付けていない。ルール改善は AI が提案する内容を自分で確認して判断したいから。

この「付ける/付けない」の判断が、そのまま「この手順をどれだけ信頼しているか」の表明になっている。

3層構造の全体像

AI が生成したコマンド
        │
        ▼
┌───────────────────────────────────┐
│  L1: AG 設定(Deny / Allow)       │
│  Deny マッチ → ブロック(絶対)     │
│  Allow マッチ → 通過               │
│  どちらでもない → 確認ダイアログ     │
└───────────┬───────────────────────┘
            ▼
┌───────────────────────────────────┐
│  L2: AGENTS.md WF-14              │
│  AI が自主的に禁止コマンドを回避    │
│  パス制限・文脈判断で生成を抑制     │
└───────────┬───────────────────────┘
            ▼
┌───────────────────────────────────┐
│  L3: Workflow turbo-all            │
│  信頼済み WF 内のコマンドは即実行   │
│  ただし L1 Deny は常に優先         │
└───────────────────────────────────┘

やってみて分かったこと

.md だけのルールは「紳士協定」

AGENTS.md に書いたルールは、AI が読んで、理解して、従うことが前提になっている。普段はちゃんと機能する。でもコンテキストが溢れたり、モデルが途中で切り替わったりすると破綻する。

OCR スクリプト開発で Gemini にリファクタリング名目でファイルを消されたのは、まさにこれ。AGENTS.md すらちゃんと定義していないプロジェクトだったし、定義していても突破される可能性はある。

だから設定レベルでの強制遮断(L1)は必須。AI を信頼する部分と、信頼しない部分を分けて考えないと成り立たない。

「何を禁止するか」は簡単。「何を許可するか」が難しい

rm -rfsudogit push --force。禁止するコマンドはすぐ決まった。

問題はグレーゾーン。

  • git add . は許可すべきか?(意図しないファイルを含む可能性がある)
  • open コマンドは?(ブラウザを開くだけなら安全だが、任意の URL を開ける)
  • sed -i は?(ファイルを直接書き換える。AG 自身のコード編集機能と重複する)

結局、グレーゾーンは Allow にも Deny にも入れないことにした。AG の挙動上、どちらにもマッチしないコマンドは確認ダイアログが出る。つまり「迷ったら人間に聞く」がデフォルトになる。

AI の「やりたい放題」は AGENTS.md がないプロジェクトで起きる

業務アプリでは AGENTS.md を整備していて、WF-10(ファイル操作ガード)や WF-14(コマンド安全ポリシー)が機能している。実際、業務コードで AI にファイルを消されたことはない。

一方、趣味プロジェクトやワンショットのスクリプト開発では AGENTS.md を書いていない。AI にとっては「ルールがない=何をしてもいい」に等しい。そこに AG の Always Proceed が合わさると、ファイルの一括削除や別プロジェクトからのデータ持ち込みが平然と起きる。

この差を見て、小さなプロジェクトでも最低限 L1(AG 設定の Deny パターン)だけは入れておくべきだと思った。AGENTS.md は書かなくても、設定レベルの遮断はプロジェクト横断で効く。

まとめ

AI に「全自動で開発してくれ」と言うためには、先に「これだけは絶対にやるな」を決める必要がある。そしてその「絶対」を担保するのは .md ファイルではなく、アプリケーション設定のレベルでないと信用できない。

  1. L1(AG 設定の Deny/Allow): 設定ファイルレベルの強制遮断。AI が無視できない
  2. L2(AGENTS.md WF-14): AI に安全な判断基準を与える。ブロック前に止まれるようにする
  3. L3(Workflow turbo-all): 信頼済みの手順だけ全自動化する。ただし L1 は突破できない

今回紹介した内容で完璧に防げないパターンもあると思うが、何も設定せずに ON にすると痛い目を見るので、しっかりと設定した上で楽しい AI 駆動開発を楽しんで欲しい。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?