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

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

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

Antigravity343エージェント65設定管理3権限設計7CI6

プレミアム記事

リリースノートを組み立てるだけのサブエージェントが、なぜか 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 も、既定値を定数として先頭にまとめてあります。

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

この記事の続きを読む

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

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

この記事を購入する

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

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

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

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

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

関連記事

Agents & Manager2026-07-12
書き込みより怖いのは到達先だった — エージェントの外向き通信を許可ホストだけに絞る
エージェントに実作業を委ねるとき、私が一番警戒しているのはファイルの書き換えではなく、どこへ通信するかです。到達先を deny-by-default で絞る小さなゲートの実装と、21晩の無人運用で拾った通信の内訳をまとめました。
Agents & Manager2026-07-10
エージェントが書いたファイルが .gitignore に飲まれる — commit 前に気づくための検出ゲート
エージェントが生成したファイルが .gitignore に一致していると、差分レビューでは正常に見えるのに commit には含まれません。ignored な生成物を push 前に検出するゲートスクリプトと、その運用調整をまとめました。
Agents & Manager2026-07-17
エージェントに渡した参照メモの7割は届いていませんでした — head で切る運用の限界を測った記録
定期実行のエージェントに参照メモを cat と head で渡していたところ、肝心な行が黙って落ちていました。切り取り位置を実測し、行数ではなくセクション単位の契約に置き換えるまでの記録です。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →