ANTIGRAVITY LABEN
記事一覧/Antigravity 基本
Antigravity 基本/2026-09-13中級

Rules と Skills のどちらに書くか迷ったとき — 指示の置き場所を決め直しました

Antigravity の Rules と Skills は、載るタイミングが違います。毎ターン全文が載る Rules と、見出しだけが先に載る Skills。受託サイトの規約が二か所で食い違った経験から、置き場所を決める問いと、持ち出し量を測る小さなスクリプトを書き残します。

Antigravity369RulesSkillsエージェント設計21ワークスペース設定

受託でお預かりしているサイトのレビューを見返していた夜、エージェントが色の直値をそのまま書き込んでいるのに気づきました。ワークスペースの規約には「色はトークンを参照する」と書いてあります。

探してみますと、同じ注意書きが二か所にありました。ひとつは規約のファイル、もうひとつは納品前チェックの手順書です。少し前に規約のほうだけを書き直しており、手順書には古い文言が残っておりました。

エージェントが読んだのは、古いほうでした。

原因は指示の中身ではありませんでした。置き場所を決めていなかったことに気づいたのは、二つのファイルを並べて見比べたあとでした。Antigravity には「毎回効かせたい指示」と「呼んだときだけ辿らせたい指示」とで、別々の入れ物が用意されています——そして二つは、載るタイミングがまったく違うのです。

二つの入れ物は、載るタイミングが違います

Rules は、エージェントに守らせる制約を書く場所です。グローバルのものは ~/.gemini/GEMINI.md に置き、すべてのワークスペースへ適用されます。ワークスペース固有のものは、ワークスペースまたは git のルートにある .agents/rules フォルダへ置きます。1 ファイルあたり 12,000 文字が上限です。

Rules には活性化の指定があり、四つから選べます。手動(入力欄で @ を使って呼ぶ)、常時オン、モデル判断(自然言語の説明を読んでモデルが適用を決める)、そして glob(*.jssrc/**/*.ts に一致するファイルへ適用)です。

Skills は、手順や知識をひとまとまりの資産として置く場所です。ワークスペースなら .agents/skills/<名前>/SKILL.md、グローバルなら ~/.gemini/config/skills/<名前>/SKILL.md に置きます。1 枚のファイルではなくフォルダですので、scripts/examples/ を隣に並べられます。

いちばん効いてくる違いは、読み込まれ方です。Skills は段階的な開示という仕組みで動きます。会話が始まった時点でエージェントが見るのは、名前と説明だけです。関係がありそうだと判断したときに初めて、本文が読まれます。

項目RulesSkills
ワークスペースの置き場所.agents/rules/<名前>.md.agents/skills/<名前>/SKILL.md
グローバルの置き場所~/.gemini/GEMINI.md~/.gemini/config/skills/<名前>/SKILL.md
1 枚の Markdownフォルダ(SKILL.md + 付属物)
読み込まれ方有効なら毎ターン全文見出しが先・本文は必要になってから
呼び出し@ 参照/常時オン/モデル判断/glob/名前 またはエージェントの判断
大きさの制約1 ファイル 12,000 文字分割できるため実質の上限なし

置き場所について、ひとつ補足がございます。いまの既定は .agents ですが、旧来の .agent も後方互換として読まれます。両方が残っているワークスペースでは、どちらが読まれているのかを一度確かめておくと安心です。

破られたら困るものと、忘れられたら困るもの

仕分けの問いは、私の場合ひとつに落ち着きました。

破られたら困るものは Rules に、忘れられたら困るものは Skills に。

破られたら困るものというのは、順番を持たない禁止や約束です。「本番のデータベースに接続する設定を新しく足さない」「色の直値を書かない」「git push --force は実行せず提案までにとどめる」——いずれも「いつ」ではなく「常に」の話ですので、常時オンの Rules が合います。

忘れられたら困るものは、手順のほうです。納品前にリンク切れを洗い、画像の幅と高さを確かめ、書き出したレポートを所定の場所へ置く。順番があり、抜けると困り、けれども毎回必要なわけではありません。こちらは Skills です。

判断に迷うものも、もちろんあります。たとえば「CSS を触るときだけ効かせたい表記規則」がそうです。常時オンにすると関係のない作業にも載りますし、Skills にすると呼ばれないことがあります。

ここは Rules の glob 活性化がちょうど間に立ってくれます。*.css に一致したときだけ適用されますので、持ち出しを増やさずに済みます。Rules か Skills かの二択ではなく、活性化の指定まで含めて三段で考えるようにしてから、迷う時間がはっきり減りました。

毎ターンの持ち出しを、一度測っていただきたいのです

頭で分かっていても、実際にどれだけ載っているのかは数えないと見えません。手元で走らせる小さなスクリプトを書きました。

#!/usr/bin/env bash
# instruction-budget.sh — 毎ターン載る指示と、必要になったときだけ載る指示の量を並べます。
# 使い方: ./instruction-budget.sh [ワークスペースのルート]
set -euo pipefail
ROOT="${1:-.}"
RULES_DIR="$ROOT/.agents/rules"
SKILLS_DIR="$ROOT/.agents/skills"
 
# .agents が無いワークスペースでは、後方互換の .agent を見に行きます。
[ -d "$RULES_DIR" ]  || RULES_DIR="$ROOT/.agent/rules"
[ -d "$SKILLS_DIR" ] || SKILLS_DIR="$ROOT/.agent/skills"
 
rules_total=0
echo "== Rules(有効なものは毎ターン載ります) =="
while IFS= read -r -d '' f; do
  n=$(wc -m < "$f" | tr -d ' ')
  printf '  %-28s %6s 文字\n' "$(basename "$f")" "$n"
  rules_total=$((rules_total + n))
  # 1 ファイル 12,000 文字が上限です。超えた分は読まれない可能性があります。
  [ "$n" -gt 12000 ] && echo "     ⚠ 12,000 文字の上限を超えています"
done < <(find "$RULES_DIR" -maxdepth 1 -name '*.md' -print0 2>/dev/null | sort -z)
 
meta_total=0
body_total=0
echo "== Skills(先に載るのは見出しだけです) =="
while IFS= read -r -d '' f; do
  body=$(wc -m < "$f" | tr -d ' ')
  # 先頭の --- から次の --- までが、会話開始時に索引される部分です。
  meta=$(awk '/^---[[:space:]]*$/{c++; next} c==1{print} c>1{exit}' "$f" | wc -m | tr -d ' ')
  printf '  %-28s 見出し %4s 文字 / 本文 %6s 文字\n' \
    "$(basename "$(dirname "$f")")" "$meta" "$body"
  meta_total=$((meta_total + meta))
  body_total=$((body_total + body))
done < <(find "$SKILLS_DIR" -mindepth 2 -maxdepth 2 -name 'SKILL.md' -print0 2>/dev/null | sort -z)
 
echo "---"
echo "毎ターンの持ち出し : Rules ${rules_total} 文字 + Skills の見出し ${meta_total} 文字"
echo "呼ばれたときだけ   : Skills の本文 ${body_total} 文字"

規約 2 枚と Skills 2 つだけを置いた小さなワークスペースで走らせますと、次のように出ます。

== Rules(有効なものは毎ターン載ります) ==
  house-style.md                  156 文字
  no-destructive-ops.md           104 文字
== Skills(先に載るのは見出しだけです) ==
  imageset-build               見出し  101 文字 / 本文    266 文字
  release-check                見出し  101 文字 / 本文    313 文字
---
毎ターンの持ち出し : Rules 260 文字 + Skills の見出し 202 文字
呼ばれたときだけ   : Skills の本文 579 文字

この規模では差はほとんどありません。ここだけを見て「たいした話ではない」と思われるかもしれません。大事なのは数字そのものではなく、毎ターンの持ち出し呼ばれたときだけの二段に分かれて見えることです。Rules を一枚足すと前者がまるごと増えます。Skills を一つ足しても、増えるのは見出しの分だけです。この非対称は、ファイルが育つほど効いてきます。

私自身、最初のうちは何でも Rules に書き足しておりました。確実に効かせたかったからです。結果は芳しくありませんでした。関係のない作業にも規約が全部載り、いちばん守ってほしい一行が埋もれてしまったのです。

なお、規約ファイルそのものを分割すれば済むと考えたこともあります。ただ、分割で減るものと減らないものは別でした。そのあたりは@ 取り込みで規約ファイルを分けたとき、何が減って何が減らないかに実測とともに書いております。

Workflows は 11 月 1 日で終わります

いま仕分けを見直しておきたい理由が、もうひとつございます。従来の Workflows が非推奨となり、2026 年 11 月 1 日に廃止されることが公式ドキュメントに明記されました。それまでは動きますが、以後はスラッシュコマンドからも索引からも外れます。

移行そのものは重くありません。Antigravity 2.0 で次のコマンドを実行しますと、グローバル(~/.gemini/config/workflows/)とワークスペース(.agents/workflows/)の両方が走査されます。

/migrate-workflows

それぞれが .agents/skills/<名前>/SKILL.md として作り直され、元のファイルには .bak が付いて退避されます。同じ名前の Workflow と Skill が並んだ場合は、Skill のほうが優先されます。

ただ、機械的に移すだけですと、ひとつ取りこぼします。説明文です。

Workflows には 12,000 文字の上限がありましたので、私は説明を削って手順を詰め込んでおりました。ところが Skills では、その説明こそがエージェントの判断材料になります。会話の冒頭で読まれるのは名前と説明だけですので、説明が薄いと呼ばれないのです。

移行したあとは、説明を書き直してください。「何をするか」と「いつ使うか」を、三人称で具体的に書きます。

# 呼ばれにくい説明
description: リリースの確認をします。
 
# 呼ばれる説明
description: 納品前のサイトを検査して、リンク切れ・画像の欠落・メタタグの不足を一覧にします。受託サイトを引き渡す前や、本番へ反映する前に使います。

移行の直後にひとつだけ確かめるとすれば、.bak の付いた元ファイルが残っているかどうかです。残っていれば、書き直しに失敗しても戻せます。

迷ったときの三つの問い

いま私は、指示をひとつ書くたびに三つだけ自分に尋ねております。

  1. これは順番のある話でしょうか。順番があるなら Skills です。
  2. 破られたときに、作業をやり直すことになるでしょうか。なるなら Rules の常時オンです。
  3. 特定の種類のファイルを触るときだけの話でしょうか。そうなら Rules の glob です。

三つとも当てはまらないものは、振り返ってみますと、たいていどこにも書かなくてよい指示でした。個人開発で壁紙の素材処理を回している側でも同じで、置き場所を決めないまま書き足した注意書きは、半年後にはほとんど読まれておりませんでした。

まずは .agents/rules のファイルを数えるところから始めていただければと思います。上のスクリプトでも、wc -m .agents/rules/*.md の一行でも構いません。数字が見えてくると、どれを Skills へ移すかは自然と決まってきます。

置き場所を決めてから、指示を書く。 指示が増えるほど、この順番のほうが効いてくると感じております。お読みいただきありがとうございました。

シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

Antigravity 基本2026-08-02
同じ agent.md を別のリポジトリへ置いたら、静かに別の仕事をしていました — 移植先で能力契約を解決してから走らせる
CLI 1.1.6 で agent.md をファイルとして持ち回れるようになりました。同じ定義を8つのリポジトリへ置き、走らせる前に前提が揃っているかを解決する仕組みを実装し、素朴な確認器との差を実測しています。
Antigravity 基本2026-09-02
部分一致のファイル名検索が、エラー文字列にだけ当たらない理由
Antigravity 2.12 で部分一致のファイル名検索が改善されました。手元の 2,088 ファイルのリポジトリで名前引きと全文引きを測ったところ、読む量は 67 倍、エラー文字列の当たり方は 4.5% でした。切り替えの境目を数字で置き直します。
Antigravity 基本2026-08-10
非対話実行でターン境界を守る — コマンド分類テーブルと fail-closed ゲートの実装メモ
使用量を記録するはずの定期ジョブが、実行のたびにモデルを呼んでいました。ターンを開始するコマンドとしないコマンドを分類表にして、未分類を実行させないゲートを実装し、実運用のスクリプトを走査して測った記録です。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます