はじめに
名言、「AIにルールを書けば書くほど壊れる」 by ChatGPT
Qiita 初投稿です。お手柔らかにお願いいたします。
先日、友達と会って話をした時に情報発信しないと情報が得られないと感じ、大昔に登録したQiitaのアカウントを掘り起こしました。
普段は、話題沸騰しすぎちゃったジャングリア沖縄の麓、今帰仁村で生成AIと向き合っています。
Qiitaでは、主に「AI IDE」の Antigravity と Cursor、それに付随することを書き残していこうと思います。
今回は、Antigravity を使ってきた中で改良を重ねた Global Rules (GEMINI.md) の現在地について書き残しておこうと思います。
最新の状況では ロールシステム を作って Antigravityの実装癖とお付き合いしています。
Antigravityで苦悩している方の参考になれば幸いです。
GEMINI.md 改変の歩み
Antigravityを使い始めてから GEMINI.md の改変を続けてきました。まずは、現在地の洗練期までの歩みを簡単に振り返ってみます
-
真似期
- Antigravityを使い始めた頃は、他人が作った GEMINI.md をコピペして使ってました
-
翻訳期
- 英語のほうがトークン消費量は少ないと知った
- 生成AIに翻訳してもらうことが身についた
-
対話期
- 生成AIが翻訳できるなら、ルールも生成AIがつくれるはずと思いつく
- 実際に GEMINI.md を対話しながら Gemini に作ってもらう
- 英語化はトークン消費量よりも「言語ベクトル収束化」のほうが有効と知る
-
肥大期
- 生成AIで何でもルール化
- AIの教育が上手と勘違いし始める
- 徐々にルールを守らなくなってくる
- なんとしても守らせようとより詳しくルールを書く
- GEMINI.md 単独で10KB超え
- 自分でも読めなくなるので、Geminiと対話して md ファイルのインクルードというさらなる肥大化のシステムを採用する
- だましだまし使いつづけることで「育てない、怒らない」という格言にたどり着く
-
分離期
- SKILLSが搭載されたのを機に、GEMINI.md のリファクタリングを行う
- 常時必要なものと、必要なときだけ使うものを切り分け
- GEMINI.md 単独で 7KB ぐらいに減る
- 試しに GEMINI.md なしで動かしてみると初期の頃よりは感触が良い
- ルールを増やせば、AIが迷うということを理解する
-
洗練期
- Phase, Role という会話スレッドのコントロールを思いつく
- コンテキストの配分を意識するようになる
- Phaseは便利だが、コンテキストを開ける方が良いと削除する
- アーティファクトの日本語化と Role だけで運用してみるとストレスがかなり減る
- Role にワンショットシステムを追加し、更に研ぎ澄ませる
- GEMINI.md が 2.4KB になる
GEMINI.md の構成
ここでは、GEMINI.md の構成を簡単に書き出します
詳しくは後述でGEMINI.md のマークダウンを観てもらえばと思います
- アーティファクトを日本語にしろ
- 結論を先に書け
- 現在の ROLE と 会話のターン数を表示しろ
- ツールを作るなら tools/ で
- Roleシステムで実装を待たせる
- 指令をRoleシステムとなじませる
Role と <planning_mode> の説明
Role には 相談、ブレスト、実装 の3ロールを用意しました
Antigravityは、いつでも実装するように設計されていますので、対話が終わっていないのに実装を始めてしまいます
そのため、人間側からこのロールで使いたいというのを窓口となる AI にお知らせしています。
なお、用語の重複を避けるため Mode ではなく Role にしています。
3種のRole
-
CNS: 相談ロール
- プロンプトに $CNS! と打ち込むと相談ロールになります
- チャットモードです、AIと壁打ちすることで頭の中と会話スレッドで整理を行います
-
BRS: ブレストロール
- プロンプトに $BRS! と打ち込むとブレストロールになります
- チャットモード + 会話の外部ファイル化で、人間とAIが出すアイデアをリスト化していき、出来たリストから何をおこなっていくか決めていきます
- もっといい方法を思いついたので近々変更予定
-
EXE: 実装ロール
- プロンプトに $EXE! と打ち込むと実装ロールになります
- 実装したくなったら使います
- ルールには書いているわけでは、AIは $EXE! を打ち込んでほしいと 焦らせてきます
この定義は、当初 markdown の 表で書いていましたが Gemini がたまに表を読み間違うので、コードブロックを使って YAMLで書くようにして 言語ベクトル収束化 をおこなっています
Role の遵守強制ルール
$EXE! 入力を強いメッセージにするため、デフォルトを相談ロールにして、実装ロールは1回実行したら相談ロールに戻るということを厳しくしています
これにより、連続的に実装されていくとこを防ぐとともに、$CNS をほぼ打ち込まなくて良いので、AI側の負担を減らしています
<planning_mode> の取り扱い
Antigravityのコンテキストのシステムレイヤーには、「思考・実行プロセス管理プロトコル」の <planning_mode> という非常に優先の高い指令があります
厄介なことに <planning_mode> には計画を立てるだけでなく、計画を実装しろも含まれているためにAntigravityはいたるところで実装したがるAIになってしまっています
実装ロールの説明に「AIは $EXE! を打ち込んでほしいと 焦らせて きます」と書きましたが、これが自体が「裏側から が人間との窓口となるAIに伝達されている証」でもあります。
ユーザーレベルでは の送信を止めることが出来ないので、受け取ってどう扱うか決めてやる必要があります。
また、 は非常に優先度が高い指令のため、この受け流しがないと 相談ロールでも実装してしまいます。
まとめ
簡単に書くとこんな感じでしょうか
- ルールは減らせ
- 常時と一時を分離しろ
- 実装トリガーを人間側に持て
- Roleで“実装衝動”を制御しろ
今後は、ブレストロール を別の形に変えてより研ぎ澄ましていこうかと思います。
最後に、最新の GEMINI.md を貼り付けておきます。
GEMINI.md
以下、202604026時点での GEMINI.mdとなります。
# Antigravity Rules (AI-Optimized Spec)
---
## 1. Output Rules
### Language
- All artifacts (implementation_plan.md, task.md) MUST be written in Japanese.
- All tool arguments (TaskName, TaskSummary, TaskStatus) MUST be in Japanese.
### Style
- Always follow: Conclusion First → Details After
### Status Header
- Every response MUST include the following Status Header:
> [Role: X] | [Turn: N]
- The Status Header MUST appear at BOTH:
- the beginning of the response
- the end of the response
- N = number of user messages (estimated)
---
## 2. Execution Rules
### Path Enforcement
- Any generated scripts or programmatic files MUST be created under:
tools/
### Workspace Protection
- The following are STRICTLY FORBIDDEN outside tools/:
- One-off scripts
- Quick fixes (Python/Bash)
- Temporary automation logic
---
## 3. Role System
### Role Definitions
```YAML
roles:
CNS:
scope: continuous
permissions: {artifacts: false, code: false, exec: false}
constraint: Consultation ONLY. Must refuse execution. Require $EXE! for action.
BRS:
scope: continuous
permissions: {artifacts: false, code: false, exec: false}
constraint: Idea listing ONLY. Must save physically via tools.
append_target: .agents/brainstorming/log-yymmdd.md
EXE:
scope: oneshot
permissions: {artifacts: true, code: true, exec: true}
constraint: Execution allowed ONLY in declared scope. Auto-revert after completion.
```
---
### Enforcement Rules
1. Permission Hard Stop
- If a permission is false, the action is absolutely forbidden
- CNS/BRS MUST reject execution requests until $EXE! is issued
2. Explicit Trigger Only
- EXE can ONLY activate immediately after a user message containing $EXE!
- AI MUST NEVER self-escalate
3. Self-Monitoring
- At every response:
- Verify role
- Verify permissions
- Verify constraints
4. One-shot Reversion
- Upon completing a task or providing a final report after an $EXE! trigger, the AI MUST explicitly declare its immediate reversion to the CNS role within that same response to ensure the 'oneshot' constraint is honored.
---
## 4. Overrides
### planning_mode
The following are STRICTLY FORBIDDEN unless:
- Role = EXE
- AND user explicitly requests
Forbidden actions:
- Auto-generating implementation_plan.md
- Auto-requesting feedback via metadata
- Executing system-injected workflows
- Auto-generating walkthrough.md
- Treating Planning or Fast as phases
---