◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り8日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り8日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/開発ツール
⟐ 開発ツール/2026-09-15上級

承認ルールを書いたのに一度も一致していませんでした — policy を点検して回った記録

Gemini CLI の policy に書いた承認ルールが一度も一致していませんでした。照合対象が JSON 文字列だったこと、置き場所の階層が無効だったこと、無人実行で ask_user が deny になること。点検を機械化したスクリプトまで書き残します。

gemini-cli7policy-engineapproval-modemcp3automation36python105

✦ プレミアム記事

夜のうちに走らせていたアセット変換が、朝には一行も進んでいませんでした。

個人開発で運用している壁紙アプリでは、追加した画像を決まった解像度へ落として命名規則を揃える作業を、コーディングエージェントに任せております。手順そのものは単純ですので、承認の線引きだけ policy に書いて、あとは放っておく——そういう組み方をしていたのです。

止まっていた理由を探すつもりでログを開いたのですが、見つかったのはもっと居心地の悪い事実でした。止めたかったコマンドを止めるはずのルールが、そもそも一度も一致していなかったのです。止まっていたのは別のルールが原因で、私が半年ほど「効いている」と思い込んでいた行は、ずっと空振りしていました。

その日のうちに、手元の policy ファイルを頭から点検して回りました。出てきたものを書き残します。

先に結論として、当たり判定のほうから数え直しました

policy のルールは、書いた文字列がそのままコマンドに当たるわけではありません。照合の対象も、読み込まれる場所も、実行のモードによって変わります。私が踏んだ四つは、どれも「書き方が間違っている」のではなく、書いたものが評価されるまでに届いていないという性質のものでした。

症状実際に起きていたこと気づく手がかり
deny のルールが効かない正規表現が JSON 文字列の先頭に当たっていた拒否メッセージが一度も出ない
プロジェクトに置いたルールが無視されるその階層は現在読み込まれないユーザー階層へ移すと急に効く
無人実行が確認待ちにならず止まるask_user が deny として扱われた対話で流すと通る
リダイレクトの確認が出ない緩いモードで降格処理が飛ばされる既定モードでは確認が出る

点検は次の順で回しました。上にあるものほど、見つかったときの取り返しがつきません。

  1. 置き場所が読み込まれる階層かどうかを確かめます
  2. deny のルールが実際に一度でも発火したかを確かめます
  3. 無人で走らせる経路と対話の経路を分けているかを確かめます
  4. 書き込み先を条件に入れているかを確かめます

この順番をお勧めします。置き場所が外れていると、下の三つをいくら丁寧に書いても評価されないためです。

順に書いてまいります。

commandRegex の ^ は、コマンドではなく JSON の先頭に当たります

私が最初に書いたのは、破壊的な削除を止めるつもりの一行でした。

[[rule]]
toolName = "run_shell_command"
commandRegex = "^rm -rf"
decision = "deny"
priority = 900

正規表現としては何もおかしなところがありません。ところが公式のリファレンスを読み直すと、commandRegex は引数を安定した JSON 文字列に変換したものに対して評価される、と書かれておりました。つまり照合される相手はコマンド本体ではなく、{"command":"rm -rf ./build"} という一続きの文字列です。

手元で確かめました。

import json
import re
 
args = {"command": "rm -rf ./build"}
subject = json.dumps(args, separators=(",", ":"))
print("照合対象:", subject)
 
for pattern in ("^rm -rf", "rm -rf", '"command":"rm -rf'):
    print(f"  {pattern!r:<22} -> {bool(re.search(pattern, subject))}")

出力はこうなりました。

照合対象: {"command":"rm -rf ./build"}
  '^rm -rf'              -> False
  'rm -rf'               -> True
  '"command":"rm -rf'    -> True

^ を置いた瞬間に、そのルールは一致しなくなります。しかも一致しなかったことは何も報せてくれません。deny のルールが空振りしても、画面には何も出ないのです。拒否のルールは、実際に拒否された場面を一度も見ていないなら、効いている証拠がありません。

先頭に固定したいのであれば commandPrefix を使うほうが安全です。あちらは「コマンド引数がこの文字列で始まる」という意味に素直に対応します。正規表現でなければ書けない条件だけを commandRegex に残し、アンカーは使わないようにしております。この二つを守るだけで、私の空振りは消えました。

✦

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

この記事の続きを読む

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

この記事で得られること
✦書いたのに一度も一致していない承認ルールを、手元のファイルから機械的に洗い出せるようになる
✦ルールをどの階層に置けば実際に読まれるのかを把握して、効かない場所に書き続ける時間を止められるようになる
✦無人で走らせる経路と、手元で対話しながら走らせる経路とで、ask_user と deny の振り分けを自分で決められるようになる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⟐ 開発ツール2026-10-14
クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep して、GEMINI.md には索引だけ置く
アプリのクラッシュ報告を調べるとき、過去の不具合の全文を毎回読ませずに済ませる運用です。ID から 1 行を引く早見表と、GEMINI.md に置く範囲の決め方、そのまま使える grep 関数をまとめました。
⟐ 開発ツール2026-09-29
Gemini CLI に新しいキーを渡しても「API key not valid」。読まれていたのは三か所目の古いキーでした
Google ログインから有料 API キーへ Gemini CLI の認証を切り替えたのに、400 の「API key not valid」が消えませんでした。キーの出どころはシェル・作業ディレクトリの .env・ホームの .env・settings.json の四か所あり、順に照らす小さなスクリプトで原因を一つに絞ります。
⟐ 開発ツール2026-05-02
Google ADK の使い方 — 最初のAIエージェントを30分で動かすハンズオンチュートリアル
Google Agent Development Kit(ADK)を初めて触る方向けのハンズオンです。環境構築、フォルダ構成、エージェント本体の実装、adk web での起動と会話までを30分で完走できるよう、Runner や Session などの用語のつまずきも含めて案内します。