◉ANTIGRAVITY LABEN
記事一覧/Agents & Manager
◈ Agents & Manager/2026-07-29上級

agent.md の綴り誤りが権限を広げていた — frontmatter を厳格に検証する lint を書く

agent.md の frontmatter は綴りを間違えてもエラーになりません。既定値へ静かに落ちた結果、意図と逆の権限が適用されていた実例と、権限キーだけを厳しく検証する lint の実装・実測を記録しました。

Antigravity401エージェント76設定管理4権限設計11CI11

✦ プレミアム記事

リリースノートを組み立てるだけのサブエージェントが、なぜか MCP のツール一覧を持っていました。

個人開発で回している構成なので、サブエージェントの権限はできるだけ狭く保つようにしています。そのエージェントにも MCP を継承させないつもりでいました。agent.md にもそう書いたはずでした。開いてみると、確かに書いてあります。

inheritMCP: false

Mcp ではなく MCP。たった1文字の大小の違いです。

そしてこの1文字が、私の意図を正反対にひっくり返していました。

エラーにならないから、気づけない

厄介なのは、この設定ファイルが読み込みに失敗しなかったことです。起動時に警告も出ません。エージェントは何食わぬ顔で立ち上がり、普通に動きます。

理由は単純で、frontmatter は YAML として完全に正しいからです。手元で確かめてみました。

import yaml
 
raw = open("agents/release-notes.md").read().split("---")[1]
d = yaml.safe_load(raw)
 
print("parse: OK, keys =", list(d))
print("d.get('inheritMcp') ->", d.get('inheritMcp'))
print("d.get('inheritMCP') ->", d.get('inheritMCP'))

実行結果です。

parse: OK, keys = ['subagent', 'inheritMCP', 'commandExecutionPolicy', 'model']
d.get('inheritMcp') -> None
d.get('inheritMCP') -> False

パーサーから見れば inheritMCP は単なる有効なキーです。値が false であることも正しく読めています。ただ、その名前を誰も探しに来ないというだけ。

設定を読む側は inheritMcp を探し、見つからず、既定値を適用します。私が書いた false は、YAML の中に正しい形で存在したまま、一度も参照されずに終わります。

想定と逆だったのは、フォールバックの向き

ここが、私が事前に予想していたことと逆でした。

設定ミスは安全側に倒れるものだと、なんとなく思い込んでいました。読めない設定があれば厳しい方へ寄せる、という発想です。ところが実際には、未指定のキーは「使いやすい既定値」へ落ちます。そして権限に関する設定では、使いやすい既定値とはたいてい緩い方を指します。

キー私が書いた意図綴り誤りで実際に適用された値差分の向き
inheritMcpfalse(MCP を継承しない)既定値(継承する)権限が広がる
commandExecutionPolicydeny 相当を意図既定値(ask)実行経路が残る
hiddentrue(一覧に出さない)既定値(出る)露出が増える

つまり権限を絞る側の記述ほど、綴りを間違えたときに無効化されやすいのです。緩める側の記述は既定値と方向が同じなので、間違えても症状が出にくく、気づく機会もありません。

構文エラーは教えてくれるのに、意味の取り違えは教えてくれません。設定ファイル全般に言えることですが、対象が権限だと結果の重さが変わります。

なお既定値の具体的な内容はバージョンによって変わり得ます。ここに書いた表は私の環境で観測したものなので、実際に使うときはご自身のバージョンで一度確かめていただくのが確実です。後述する lint も、既定値を定数として先頭にまとめてあります。

キー名についても同じ断りが必要です。Antigravity CLI の公式ドキュメント(agents のページ)で例示されている frontmatter は name と description だけで、本文のキー名(inheritMcp など)はそこでは確認できませんでした。ここで扱うキー名と値は、私の環境の agent.md で観測したものです。ご自身の環境では KNOWN_KEYS と SECURITY_KEYS を実際のスキーマに合わせて置き換えてお使いください。

✦

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

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦綴り誤りが「エラー」ではなく「既定値へのフォールバック」として通過し、権限が意図と逆向きに広がる仕組み
✦権限に関わるキーだけを ERROR、それ以外を WARN に分ける lint の実装(PyYAML + difflib・約120行)
✦手元7ファイルで ERROR 6件・200ファイルで約100ms という実測と、CI へ組み込む際の線引き
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

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

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

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

関連記事

◈ Agents & Manager2026-10-22
引き継ぎ文書の古い参照は 17 件に見えて実際は 2 ファイルでした。本当に危なかったのは、別のサイトの手順書が混ざっていたことでした
エージェントに読ませるリポジトリ直下の .md を点検する Python スクリプトの全文です。素朴な版は壊れた参照を 17 件と数え、直すと 7 件、実体は 2 ファイル。別の問題が見つかるまでの過程を残します。
◈ Agents & Manager2026-10-16
エージェントに .zip を渡す前に、.git を除いて 29 MB を 15 MB にし、秘密情報の警告 28 件を見分けました
Antigravity アプリ v2.23.0 で .zip を添付できるようになりました。自分のリポジトリを実際に固めて .git の重さと秘密情報検査の誤検知を数え、除外・検査・マニフェストを一度に行う Python スクリプトの全文を残します。
◈ Agents & Manager2026-10-14
位置で読む API 応答を変えるとき、出荷済みの旧版を起動時に落とさないための門番を置きました
壁紙アプリのように、サーバーの一覧応答を「何番目の項目か」で読むクライアントは、出荷済みの旧版が長く残ります。項目の削除や並び替えで旧版を起動時に落とさないよう、末尾追加だけを通す検査と、出荷済みの版ディレクトリを凍結する台帳の作り方を、動かした出力つきで書き残します。