GEMINI LABEN
3.8FLASH — gemini-3.8-flash が9月2日に一般提供となりました。長く続く開発作業、自律エージェント、企業のワークフロー向けという位置づけですLYRIA3.5 — 音楽生成の lyria-3.5 がパブリックプレビューに入りました。フル尺の楽曲を 44.1 kHz ステレオで生成でき、テキストと画像の両方を入力に取れます9/30 — gemini-omni-flash-preview の停止まで残り15日です。後継は gemini-omni-1.1-flash で、8月27日に一般提供が始まっていますCACHE — 暗黙キャッシュの最小トークン数は公式には 4,096 ですが、12k を超えるまで発火しないという実測報告が出ています。効いているかどうかは自分で測るほかありませんNEW — BLOCK_NONE を入れても結果が変わらないとき。閾値で通る話と、下げても通らない話の境目を書きました403 — models の一覧は 200 で返るのに generateContent だけ 403 で拒まれる、という質問が毎週のように再発しています。課金を有効にした直後でも起こります3.8FLASH — gemini-3.8-flash が9月2日に一般提供となりました。長く続く開発作業、自律エージェント、企業のワークフロー向けという位置づけですLYRIA3.5 — 音楽生成の lyria-3.5 がパブリックプレビューに入りました。フル尺の楽曲を 44.1 kHz ステレオで生成でき、テキストと画像の両方を入力に取れます9/30 — gemini-omni-flash-preview の停止まで残り15日です。後継は gemini-omni-1.1-flash で、8月27日に一般提供が始まっていますCACHE — 暗黙キャッシュの最小トークン数は公式には 4,096 ですが、12k を超えるまで発火しないという実測報告が出ています。効いているかどうかは自分で測るほかありませんNEW — BLOCK_NONE を入れても結果が変わらないとき。閾値で通る話と、下げても通らない話の境目を書きました403 — models の一覧は 200 で返るのに generateContent だけ 403 で拒まれる、という質問が毎週のように再発しています。課金を有効にした直後でも起こります
記事一覧/開発ツール
開発ツール/2026-09-15上級

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

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

gemini-cli5policy-engineapproval-modemcp3automation36python105

プレミアム記事

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

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

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

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

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

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

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

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

  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/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-04-26
Gemini API × GitHub Actions でコード変更に自動追従するドキュメント更新パイプラインを構築する
コードを書くたびに古くなるドキュメント問題を解決します。Gemini API と GitHub Actions を組み合わせてPRごとにdocstring更新案を自動提案するCIパイプラインの実装ガイドです。
開発ツール2026-04-08
Gemini API でアクセシビリティ監査を自動化する — 誤検出に振り回されない設計
Gemini API で WCAG 2.2 の監査を自動化する実装。計算で出せる項目と AI に判断させる項目を分け、構造化出力・ベースライン差分・CI ゲートで誤検出を抑えながら継続運用に乗せる方法をコード付きで解説します。
開発ツール2026-05-11
Gemini CLIをiOSアプリ開発に1週間使い続けて分かったこと
個人でiOS/Androidアプリを開発してきた経験から、Gemini CLIをiOS開発ワークフローに1週間組み込んで分かった実態を報告します。翻訳補助・リリースノート生成・コードレビューでの具体的な使い方と、Claude Codeとの使い分け方も正直に書きました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます