Skip to main content

Campaign Governance specification

実験的機能。 キャンペーンガバナンスは、実験的サーフェスとして AdCP 3.0 の一部です — 少なくとも 6 週間の予告をもって 3.x リリース間で変更される可能性があります。これを実装するセラーは experimental_featuresgovernance.campaign を宣言しなければなりません(MUST)。完全なコントラクトについては 実験的ステータス を参照。
Status: Request for Comments Last Updated: March 2026 本ドキュメント内のキーワード “MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”、“OPTIONAL” は、RFC 2119 に記載のとおりに解釈されます。 本ドキュメントは、キャンペーンガバナンスのデータモデル、検証ロジック、統合パターンを定義します。

Campaign plan

キャンペーンプランは、すべての検証における真実の源泉です。プランは sync_plans を通じてガバナンスエージェントにプッシュされ、キャンペーンのプランパラメーター — 予算制限、チャンネル、フライト日程、プラン市場 — を定義します。ガバナンスエージェントはブランドのコンプライアンス設定から適用可能なポリシーを解決します。プランは policy_ids でレジストリポリシーを直接参照したり、custom_policies でキャンペーン固有のルールを含めたりすることもできます。

Purchase types

ガバナンスプランは、メディアバイだけでなくすべての金銭的コミットメントを管理します。check_governancepurchase_type フィールドが、どの種類のコミットメントが検証されているかを識別します。 すべての購入タイプは同じガバナンスループを共有します: sync_planscheck_governance → 実行 → report_plan_outcome。ガバナンスエージェントは、すべてのタイプにわたって予算権限、ジオコンプライアンス、フライトコンプライアンスを検証します。メディアバイ固有の検証(チャンネルコンプライアンス、セラー集中度、配信ペーシング)は、purchase_typemedia_buy の場合、またはペイロードが関連フィールドを含む場合にのみ適用されます。 purchase_type が省略された場合、ガバナンスエージェントは media_buy を想定します。
将来の購入タイプ: コンテンツ標準、プロパティリストのキュレーション、測定/検証サービス(ブランドリフト調査、ビューアビリティ、フラウド検出)はすべて、スキーマに pricing_options を運び、report_usage を通じて課金します。これらのサービスは現在、バイヤーがサービスにコミットする明示的な有効化ツールを欠いています — 課金関係は暗黙的です。プロトコルがこれらのサービスの有効化サーフェスを追加する際、コミットメント時点でのガバナンスチェックを可能にするために、対応する購入タイプが追加されます。

Budget reallocation

budget.reallocation_threshold(必須の数値)は、予算再配分の自律性を管理します。これは、データ主体に影響する決定の必須の人間によるレビューをカバーしません — それについてはプランレベルの human_review_required フィールドを参照。

Budget allocations

プランは任意で、allocations を使って総予算を購入タイプ間で分割できます。
allocations が存在する場合、ガバナンスエージェントはタイプごとの割り当てと全体の総額の両方に対して支出を検証します。存在しない場合、購入タイプに関係なくすべての支出が単一の総額に対してカウントされます。割り当てはガードレールであり、ハードな分割ではありません — 割り当ての合計は総額と異なってもかまいません(MAY)。 allocations が存在するが購入タイプがリストされていない場合(例: media_buyrights_license のみを割り当てるプランに対して signal_activation が試みられる)、ガバナンスエージェントはアクションをプランの総予算のみに対して検証します。リストされていないタイプは拒否されません — 共有プールから引き出します。支出をリストされたタイプのみに制限するには、明示的な制約を持つ custom_policies を設定します。

Human review required

human_review_required は、予算再配分の自律性とは独立に、プラン上のすべてのアクションの人間による監督を義務付けるプランレベルのブール値(デフォルト false)です。 ガバナンスエージェントは、プラン上の解決されたポリシーまたは policy_category が requires_human_review: true を運ぶ場合、human_review_required: true を自動的に設定します。これには、fair_housingfair_lendingfair_employmentpharmaceutical_advertising などの規制業種、および附属書 III のユースケースにおける決定をカバーする eu_ai_act_annex_iii ポリシーが含まれます。 human_review_required が true の場合、ガバナンスエージェントは — プランの reallocation_threshold に関係なく — プラン上のあらゆるアクションを実行前に人間のレビューにエスカレーションしなければなりません(MUST)。プランが human_review_required: true を運ぶとき、寛容な再配分しきい値は人間のレビューをバイパスしません。2 つの次元は合成されます。 このフィールドは budget.reallocation_threshold とは異なります。 呼び出し元は、トリガーとなるポリシーが存在しない場合でも、プラン上で human_review_required: true を明示的に設定してもかまいません(MAY)。呼び出し元は、人間のレビューを要求するポリシーをオーバーライドするために false に設定してはなりません(MUST NOT)— ガバナンスエージェントはすべての同期でこのフラグを解決されたポリシーから再評価し、トリガーとなるポリシーが存在する場合、呼び出し元が提供した false をオーバーライドします。

Spend-commit invocation

バイヤー側のガバナンス呼び出しは、アドバイザリではなく強制可能です。プランにガバナンスエージェントが設定されている場合、バイヤーエージェントは、セラーに支出コミットリクエストを送信する前に check_governance を呼び出さなければならず(MUST)— 例外なく — そのリクエストに添付する意図フェーズgovernance_context トークンを生成します。ガバナンスエージェントは、プランの budget.reallocation_thresholdhuman_review_required フィールドに従って、自動承認、条件適用、拒否、または人間のレビューへのエスカレーションを内部的に決定します。呼び出しルールにドル金額、ベースライン計算、オペレーター宣言の下限は現れません — それらの自動承認の高速パスは、呼び出すかどうかというバイヤーの決定ではなく、ガバナンスエージェント自身のポリシーの内部に属します。

Spend-commit tasks

呼び出しの MUST は、リクエストの時点で金銭的義務を付与するすべての AdCP タスクに適用されます。 呼び出しは、ディスカバリータスク(例: get_productsget_signals)、レポートタスク(例: get_media_buy_delivery)、または運用ステータスタスクには必須ではありません。MUST は金銭的義務の時点で特に発火します。 プランにガバナンスエージェントが設定されていない場合、check_governance の呼び出しは必須でも意味もありません — 呼び出す対象がありません。セラーは、独自の商業ポリシーの問題として、ガバナンスエージェントが設定されていないプランでの取引を拒否してもかまいません(MAY。エンタープライズセラーは通常拒否します)。プロトコルはガバナンスエージェントを義務付けず、ブランドが公開する設定が、セラーが 1 つ存在するかどうかを発見する手段です。 同じプランを複数のセラーにファンアウトするオーケストレーターは、aud がターゲットセラーにバイト単位でバインドされるため、セラーごとに 1 つの意図トークンを生成します。これは正しいプロトコル形状ですが、ガバナンスエージェントがプラン上のバイヤーの完全な買い物リストを見ることを意味します。買い物の意図を商業的に機密と見なすオペレーターは、データ処理の姿勢を信頼できるガバナンスエージェントを選ぶべきです(SHOULD)。

Seller enforcement

ガバナンスエージェントが設定されたプランの支出コミットリクエストを受け取ったセラーは、リクエスト上で有効で期限内の意図フェーズgovernance_context トークンを要求しなければならず(MUST)、セラー検証チェックリストに従って検証します。トークンは phase: "intent" を運び、(sub を通じて)リクエストの plan_id に一致し、(aud)このセラー宛てでなければなりません。トークンのないリクエスト、検証に失敗するトークンを持つリクエスト、または別のプラン・別のセラー・非意図フェーズ向けに発行されたトークンを持つリクエストは、PERMISSION_DENIED で拒否しなければなりません(MUST)。次にセラーは、planned_delivery と受け取った governance_context を伴って check_governance を呼び出すことで自身の実行チェックを実行します。その呼び出しは、メディアバイライフサイクルの残りに使われる purchase フェーズのトークン(セラーが割り当てた media_buy_id にバインド)を生成します。この 2 段階のフローが、バイヤー側の MUST を実効化します。check_governance をスキップするバイヤーは有効な意図トークンを生成できず、支出コミットはセラーが実行チェックに到達する前に拒否されます。 セラーは、受け入れた意図トークンとその後保持するライフサイクルトークンを、最低限 jti をキーとして、issaudsub(plan_id)、phase、決定結果、受け入れのタイムスタンプとともに永続化しなければなりません(MUST)。保持はセラーの規制上の保持期間に従います。セラー側の保持がなければ、監査ログはガバナンスエージェントからの単一ソースになります。セラー記録と get_plan_audit_logs の間の独立した照合が、侵害されたまたは不正なガバナンスエージェントを捕捉するクロスチェックです。 セラー側ガバナンス(セラー自身がアカウントにガバナンスエージェントを設定している場合)は独立した層です。バイヤーの成功した check_governance は、セラーにリクエストの受け入れを義務付けません。セラー自身のコンプライアンスポリシーは、依然として PERMISSION_DENIED を通じてアクションを拒否してもかまいません(MAY)。 承認されたトークンは、検証時点で権威を持つ exp を運びます。トークンの有効ウィンドウ内でのポリシー変更は、あらゆる署名決定システムの受容される残余リスクです。厳しい exp 値(意図トークンは JWS プロファイルに従い 15 分以内に期限切れになるべき(SHOULD))は、ウィンドウを閉じるのではなく制限します。ウィンドウを許容できないオペレーターは、キャッシュに関係なくすべてのアクションが内部の人間によるレビューを通るよう、reallocation_threshold0 に、または human_review_required: true に設定しなければなりません(MUST)。

Audit logging

すべての check_governance 呼び出しは、get_plan_audit_logs を通じて取得可能な監査ログエントリを生成しなければならず(MUST)、次を捕捉します。
  1. タイムゾーンオフセット付き ISO 8601 文字列としての呼び出しタイムスタンプ
  2. 検証されるツール(create_media_buyacquire_rights など)とプランの通貨でのコミット額
  3. 結果(approveddeniedconditions。および人間のレビューが内部的に呼び出されたかどうか)
  4. 人間のシグナルが記録された場合の人間のアクターの識別と権限
  5. ダウンストリームの支出コミットタスクの監査エントリおよび report_plan_outcome からのクロスリファレンス用の check_id
バイヤー側の意図チェックとセラー側の実行チェックはそれぞれ別個の check_id を生成します。report_plan_outcome は単一のチェック識別子ではなく plan_id を通じて相関させます。支出コミットを再構築する監査人は、バイヤー側エントリ、セラー側エントリ、セラーが永続化したトークン記録を照合します。

Interaction with idempotency

  • 以前の意図フェーズ governance_context を運ぶ同一ペイロードのリトライ: 再呼び出しなし。キャッシュされたガバナンスレスポンスが再利用されます。トークンの署名と鮮度が再検証されます。セラー側のリプレイ重複排除キー(検証チェックリストを参照)は、同じ idempotency_key を運ぶ繰り返された jti を、リプレイ攻撃ではなく正当なリトライとして扱わなければなりません(MUST)— これが唯一の狭い適用除外です。
  • 異なるペイロードでの再プラン(冪等性に従う新しい idempotency_key): 新しい check_governance 呼び出しが必要です。新しい governance_context トークンが発行されます。
人間の承認後のリトライはガバナンスを再呼び出ししません。既存のトークンは期限切れになるまで認可のままです。実行後のライフサイクルリトライは、セラーの purchase フェーズトークンに対して動作します。これは、バイヤーの意図チェックではなく、セラーの実行チェックによって管理される別個のアーティファクトです。

Channel mix targets

mix_targets フィールドは、許容される配分範囲を定義します。ガバナンスエージェントは、すべてのメディアバイにわたる集計支出がこれらの範囲内に収まることを検証します。ビデオ支出を総予算の 70% 超に押し上げる create_media_buy は、conditions または denied のステータスをトリガーします。

Delegations

プランは、どのエージェントがプランに対して実行を認可されているか、どのような制約でかを指定する delegations 配列を含めることができます。これにより、ブランドとエージェンシー間の委任関係がプロトコル内で明示的になります。
権限レベル: 委任が存在する場合、ガバナンスエージェントは、アクションを承認する前に check_governancecaller URL が委任の agent_url に一致することを検証します。マッチングは厳密な URI 比較(RFC 3986 に従う正規化後、大文字小文字を区別)によります。フランスでメディアバイを要求するエージェントは、markets にフランスを含む委任を持たなければなりません。execute_only 権限を持つエージェントは、チャンネル間で予算を再配分できません。 委任が存在しない場合、ガバナンスエージェントはどのエージェントがプランに対して行動できるかを制限しません。
delegations.authority は、委任された実行エージェントがプランを代行して何ができるかを管理します。これはプランの予算自律性(budget.reallocation_threshold / budget.reallocation_unlimited)とは無関係で、plan.human_review_required とも無関係です。3 つの別個の関心事: エージェントごとのスコープ、予算運用、決定ごとのレビュー。

Portfolio governance

ホールディングカンパニーやマルチブランド組織のために、プランはクロスブランド制約を定義する portfolio オブジェクトを含めることができます。ポートフォリオプランはメンバープランを管理します — メンバープランに対して検証されるあらゆるアクションは、ポートフォリオプランの制約に対しても検証されます。
ポートフォリオ制約:
  • total_budget_cap: すべてのメンバープランにわたる最大集計支出。ガバナンスエージェントはすべてのメンバープランにわたってコミット済み予算を追跡し、上限を超えるアクションを拒否します。
  • shared_policy_ids: 個々のブランドコンプライアンス設定に関係なく、すべてのメンバープランにわたって強制されるレジストリポリシー。どのブランドチームもオーバーライドできないコーポレートレベルの規制。
  • shared_exclusions: PolicyEntry 形状を使って、すべてのメンバープランに適用されるビスポークな除外ポリシー。追加のみ — プランレベルの custom_policies と同じ制約。
ガバナンスエージェントは、メンバープランのアクションを、メンバープラン自身の制約とポートフォリオプランの制約の両方に対して検証します。どちらのレベルからの拒否もアクションをブロックします。 ポートフォリオプランがガバナンスエージェントがまだ認識していない member_plan_id を参照する場合、ガバナンスエージェントはポートフォリオプランを受け入れ、メンバープランが同期されるにつれてポートフォリオ制約の強制を開始すべきです(SHOULD)。これにより、特定の順序を要求することなく、メンバープランの前にポートフォリオプランを同期できます。
並行性: オーケストレーターは、複数のセラーに同時に create_media_buy リクエストを送信し、それぞれが committed チェックをトリガーする場合があります。予算チェックは特定時点のもので予算を予約しないため、同時承認が合計でプラン予算を超える場合があります。ガバナンスエージェントは結果レポート時にオーバースペンドを検出します。同時のオーバースペンドを防ぐには、実行エージェント間で予算を分割するために、エージェントごとの budget_limit を持つ 委任 を使います。

Aggregated-spend evaluation (fragmentation defense)

ガバナンスしきい値(reallocation_thresholdhuman_review_required のトリガーポイント、レジストリポリシーのドル下限)は、プランごとまたはメディアバイごとに単独ではなく、トレーリングウィンドウにわたる集計コミット済み支出に対して評価しなければなりません(MUST)。意図した 999,900 ドルの支出を 100 × 9,999 ドルのバイに分割するバイヤー — それぞれが個別にはオペレーターの 10,000 ドルの人間レビューしきい値を下回る — は、そうでなければレビューを完全にバイパスします。これはガバナンスに対するフラグメンテーション攻撃であり、正当な利用パターンではありません。ガバナンスエージェントはこれを閉じなければなりません(MUST)。 ガバナンスエージェントは、任意のしきい値を評価する際、次のすべてにわたってコミット済み支出を集計しなければなりません(MUST)。
  • 同じ (buyer_agent, seller_agent, account_id) タプルに帰属可能なすべてのプラン — 同じアカウント上のプラン間でのフラグメンテーションは集計をリセットしません。委任されたサブエージェント(委任を参照)は委任元バイヤーの集計を共有します: キーの buyer_agent 要素は委任元プリンシパルであり、サブエージェントの agent_url ではありません。委任は新しいエージェントごとの集計ウィンドウを作りません。そうでなければ委任サーフェス自体がフラグメンテーションの穴を再び開くからです(999,900 ドルを 100 のサブエージェントに分割し、それぞれが独自の 9,999 ドルの予算を得る)。
  • すべての 支出コミットタスク — タスクサーフェス間でのフラグメンテーションは集計をリセットしません。支出コミットタスクのインベントリが唯一の権威あるリストです。そこに追加される新しい支出コミットタスクは、本セクションでの別個の編集なしに自動的に集計に加わります。
  • governance.aggregation_window_days ケイパビリティを通じて宣言されるトレーリングウィンドウ(下記 get_adcp_capabilities を参照)。ウィンドウはプラン境界ではなく実時間でスライドします。
評価時のセマンティクス(テスト可能)。 支出コミットの時点で、ガバナンスエージェントは次を計算します。
次に、aggregate を適用可能な各しきい値に対して評価します。現在の受信コミットは合計に含まれます。完全に拒否されたコミットは寄与しません。承認された、または条件付きで承認されたコミットは寄与します。now は評価時のガバナンスエージェントの実時間です。スライディングウィンドウの境界はプランやカレンダーの境界にスナップされません。 コミットメントはウィンドウ内でスティッキーです。 c.amount は承認時にコミットされた額であり、配信された額ではありません。アンダーデリバリー、キャンセル、メイクグッド、承認後の予算削減は、トレーリングウィンドウがそれをロールオフする前に、コミットの集計への寄与を減じてはなりません(MUST NOT)。そうでなければ、バイヤーは承認済みコミットをキャンセルして直ちにしきい値未満で再コミットすることでフラグメンテーションの余地を解放できます — ラウンドトリップにわたって完全な支出が移動し、各レグが単独で通過します。コミット済み予算を増やす update_media_buy はデルタ(新コミット済み予算 − 以前のコミット済み)として入ります。減少は減じません。 個々のコミットが単独ではしきい値を下回るが、トレーリングウィンドウの集計をしきい値超に押し上げる場合、ガバナンスエージェントはそのコミットにしきい値の帰結(人間レビューへのエスカレーション、拒否、または条件)を適用しなければなりません(MUST)。ガバナンスエージェントは、監査人が完全な結果ストリームから再導出せずにフラグメンテーション防御の決定を再構築できるよう、get_plan_audit_logs レスポンスに aggregate_committed フィールドを公開してもかまいません(MAY)。フィールドの形状(単位、通貨、ウィンドウ境界のレポート)は 3.x ではガバナンスエージェント固有で、後の改訂で標準化されます。それを公開する実装は、get_plan_audit_logs レスポンスとともに形状を文書化すべきです(SHOULD)。 ガバナンスエージェントは、より狭い集計スコープ(ブランドごと、キャンペーンごと)を追加で評価してもかまいませんが(MAY)、オペレーターの署名なしに宣言されたウィンドウより広いスコープを評価してはなりません(MUST NOT)。「より広い」は両方の次元をカバーします: より長いトレーリングウィンドウ(時間)とより広いキータプル(例: account_id にまたがって折りたたみ、2 つのアカウントが集計を共有する)。いずれかの次元での黙って広げられたスコープは、黙って狭められたスコープと同じくらいオペレーターにとって驚きです。

Composition with reallocation_threshold

再配分自体が支出コミットです: update_media_buy は増分コミットデルタ(新コミット済み予算 − 以前にコミットされた額)を運び、そのデルタは集計に入り reallocation_threshold 評価にカウントされます。バイヤーは、1 つの 30,000 ドルの再配分を 6 つの 4,999 ドルの更新に分割することで 25,000 ドルの再配分しきい値を回避できません — 各更新のデルタはトレーリングウィンドウの集計に蓄積され、累積デルタがそれを超えるとしきい値をトリップします。

Conformance example

エージェントが aggregation_window_days: 30 を宣言します。プランはコミット済み支出 10,000 ドルで human_review_required トリガーを設定します((buyer_agent, seller_agent, account_id) をキーとする)。 エスカレーションなしに行 2 を承認するガバナンスエージェントは非準拠です: 30 日ウィンドウにわたる集計に失敗したか、正しいタプルでキー付けに失敗したか、受信コミットを合計に含めることに失敗したかのいずれかです。

Governance aggregation capability

セラーとガバナンスエージェントは、get_adcp_capabilitiesgovernance.aggregation_window_days を通じて集計ウィンドウを宣言します。コンプライアンスのために特定のウィンドウに依存するバイヤー(例: ブランドレベルの週次ケイデンスレビュー)は、集計セマンティクスに依存する前にこのケイパビリティを確認しなければなりません(MUST)— aggregation_window_days: 7 を宣言するガバナンスエージェントは、30 日の四半期末プッシュにまたがって広がるフラグメンテーションから防御しません。宣言がないことは、エージェントがいかなる集計ウィンドウにもコミットしていないことを意味し、バイヤーはコミットごとの評価のみを想定しなければなりません(MUST。フラグメンテーション攻撃サーフェスが開いている)。スキーマのデフォルトはありません: 省略は宣言された 30 日ウィンドウと同等ではありません。

Brand compliance configuration

コンプライアンスポリシーは、個々のキャンペーンプランではなくブランドレベルに存在します。ブランドのポリシーチームがブランドのコンプライアンスプロファイルを設定し、ガバナンスエージェントがそのブランドのプランを処理する際にそれを解決します。
ブランドコンプライアンス設定のスキーマとホスティングメカニズムは、AgenticAdvertising.org ガバナンスワーキンググループによって開発中です。以下は概念モデルを説明します。実装は異なる場合があります。
ブランドのコンプライアンス設定には 2 種類のポリシーが含まれます。
  • レジストリポリシー: AdCP ポリシーレジストリ の標準化されたポリシーへの ID による参照。各参照は、ブランド向けにポリシーをカスタマイズする設定パラメーターを含んでもかまいません(MAY)。
  • カスタムポリシー: 自然言語文字列として表現されるブランド固有のルール。プロンプトベースのポリシーと同じアプローチでガバナンスエージェントが評価します。
ポリシーチームはブランドに適用されるレジストリポリシーを選択し、必要に応じてパラメーターを設定し、ブランド固有のカスタムポリシーを追加します。バイイングチームはこの設定と対話することはありません — ブランドを参照するキャンペーンプランを作成し、ガバナンスエージェントが適用可能なポリシーを自動的に解決します。 ブランドの業種が自動ポリシーマッチングに情報を与えます — 例えば、飲料業界のブランドはその業界向けにタグ付けされたレジストリポリシーを受け取ります。

Policy registry

ポリシーレジストリは、標準化された機械可読な広告コンプライアンスポリシーのコミュニティ管理ライブラリです。ブランドは独自に記述する代わりに ID でポリシーを参照します。 レジストリは 3 つのカテゴリをカバーします。 レジストリの各ポリシーには、ID、適用管轄、説明、およびガバナンスエージェントがプログラム的に評価できる機械可読なルールがあります。ポリシーは規制の変更に応じてバージョン管理されます。ブランド参照は特定のバージョンにピン留めしてもかまいません(MAY)。バージョンなしの参照は現在のバージョンに解決されます。レジストリ形式とホスティングメカニズムは AgenticAdvertising.org ガバナンスワーキンググループによって開発中です。 このモデルは、IEEE 7012(Machine Readable Personal Privacy Terms)が確立したパターンに従います。IEEE 7012 は、当事者が個別に起草するのではなく参照する標準化された合意の中立的な名簿を維持します。

Policy resolution

ポリシーは policy_idscustom_policies を通じてプラン上で直接宣言されます。プランが同期されると、ガバナンスエージェントはアクティブなポリシーセットを解決します。
  1. policy_ids で参照されるレジストリポリシーを読み込む
  2. プランの countriesregions と交差させる — プランの市場に適用可能なポリシーのみがアクティブ
  3. すべての custom_policies を含める(これらは地理に関係なく適用される)
custom_policies は追加のみです。 ガバナンスエージェントは、レジストリソースのポリシーテキストをシステムレベルの指示としてピン留めしなければならず(MUST)、custom_policies(またはプランの objectives フィールド)がレジストリソースのポリシーを緩和、オーバーライド、または無効化することを許可してはなりません(MUST NOT)。カスタムポリシーはより厳しい制限を追加できます — 強制レベルを下げたりカテゴリを免除したりできません。レジストリポリシーと矛盾する custom_policies エントリは、その代わりにではなく並行して評価されます。より厳格な制約が支配します。
プランの countriesregions フィールドはジオ強制としても機能します: ガバナンスエージェントは、プランの許可された地理の外の市場をターゲットにする被管理アクションを拒否しなければなりません(MUST)。regions: ["US-MA"] のプランは、他の点でコンプライアントであっても、明示的にマサチューセッツをターゲットにしないアクションを拒否します。これらのフィールドは product-filtersofferingscreate_media_buy と同じ ISO コードとセマンティクスを使います。 解決されたポリシーセットは、ガバナンスエージェントが check_governance 中に評価するものです。brand_policyregulatory_compliance カテゴリについて、ガバナンスエージェントはこの解決されたセットに対して検証します。 プランに policy_ids または custom_policies がない場合、ガバナンスエージェントはポリシーベースのカテゴリについて空のポリシーセットで動作します。他のカテゴリ(budget_authoritystrategic_alignment など)は、プランのパラメーターに基づいて依然として適用されます。

Audience governance

キャンペーンプランは、オーディエンスターゲティング制約、制限属性、ポリシーカテゴリを宣言します。ガバナンスエージェントはこれらを使って、セラーのターゲティングが規制要件とキャンペーンの意図に準拠していることを検証します。

Three-layer model

オーディエンスガバナンスは 3 つの関心事を分離します。 製薬会社は常にファーマ(アイデンティティ)ですが、一般的な認知キャンペーンは製薬広告規制をトリガーしないかもしれず(レジーム)、EU 管轄のキャンペーンのみが健康データターゲティングを制限するかもしれません(制限)。

Audience constraints

プランは、オーディエンスセレクターを使って audience.includeaudience.exclude 配列を宣言できます。各セレクターは signal_ref または自然言語の説明のいずれかです。 ガバナンスエージェントは、check_governance でこれらの制約をセラーのターゲティングに対して評価します。
  1. planned_delivery.audience_targeting をプランの audience.include/exclude と比較
  2. planned_delivery.audience_targeting を同じ制約と比較(コミット済みチェック用)
  3. オーケストレーターが要求したものとセラーが有効化するものの間の乖離を検出

Structural governance matching

シグナル定義は restricted_attributespolicy_categories を自己宣言できます。そうする場合、ガバナンスエージェントは構造的マッチング — プランの制限とシグナルの宣言の間の集合の交差 — を実行します。これは決定的で、LLM 推論を必要としません。 ガバナンスメタデータを宣言しないシグナルについて、ガバナンスエージェントはセマンティックマッチング — シグナル名と説明から機密性を推論する — にフォールバックします。構造的マッチングはセマンティックマッチングより高信頼度の検出事項を生成します。 制限属性は includeexclude の両方のターゲティングに適用されます。制限データを使ってオーディエンスを除外すること(例: 製薬広告から健康状態のある人を除外する)は、それを包含に使うのと同じくらい禁止されています — どちらもターゲティング決定のための制限された個人データの使用を構成します。

Audience distribution drift

配信中、セラーは delivery_metricsaudience_distribution をレポートします。インデックス値は、宣言されたベースライン(census、platform、または custom)に対する人口構成を示します。値 1.0 は同等を意味します。大幅に上または下の値はスキューを示します。 ガバナンスエージェントは、期間ごとのインデックスとすべてのレポート期間にわたる累積インデックスの両方を追跡します。これにより、単一のレポート期間では見えないかもしれない体系的なバイアスの検出が可能になります。

State tracking

ガバナンスエージェントは 2 つのレベルで状態を追跡します。
  • プランレベル: コミット済み総予算、チャンネル配分パーセンテージ、プランステータス
  • キャンペーンレベル: governance_context ごとのコミット済み予算、アクティブなメディアバイ参照、検証履歴
単一のプランが複数のキャンペーンにまたがることがあります。check_governance が予算権限をチェックするとき、プランに紐付けられたすべてのキャンペーンを考慮します。report_plan_outcome がセラー確認をレポートするとき、ガバナンスエージェントは要求された額ではなくセラーの実際の額から予算をコミットします。

Plan status

ステータスが suspended の場合、ガバナンスエージェントは、エスカレーションが解決されるまで、すべての check_governance および report_plan_outcome リクエストを CAMPAIGN_SUSPENDED エラーで拒否しなければなりません(MUST)。

Budget tracking

予算は、検証されたアクションではなく確認された結果に基づいてコミットされます。フロー:
  1. tool + payload(意図チェック)を伴う check_governance が、提案された支出がプランに収まるかをチェックします。まだ予算はコミットされません。
  2. オーケストレーターがセラーとアクションを実行します。
  3. report_plan_outcome がセラーの確認済み額をレポートします。ガバナンスエージェントはこの額をプラン予算にコミットします。
これにより、予算追跡が現実を反映します。セラーが予算を 150K ドルから 120K ドルに削減した場合、ガバナンスエージェントは 120K ドルをコミットし、差異について検出事項を返します。アクションが完全に失敗した場合、ガバナンスエージェントは 0 ドルをコミットします。 実行チェックの承認は、セラーの計画された配信をプランに対して検証しますが、予算をコミットしません。予算は、オーケストレーターがセラーの確認済みレスポンスを伴って report_plan_outcome を呼び出すときにのみコミットされます。 予算チェックは特定時点のものです: check_governance は現在のコミット済み総額に対して検証しますが、予算を予約しません。複数のエージェントが同じプランに対して同時に実行する場合、2 つのチェックが両方通過し、組み合わせた結果が認可された予算を超える可能性があります。ガバナンスエージェントは結果レポート時にオーバースペンドを検出し、budget_authority 検出事項を返します。同時のオーバースペンドを防ぐには、実行エージェント間で予算を分割するために、エージェントごとの budget_limit を持つ 委任 を使います。

Drift detection

監査ログには、プランの存続期間にわたる集計ガバナンストレンドを表面化する drift_metrics が含まれます。
これらのメトリクスは監視ドリフト — 人間から制御が徐々に移行すること — を検出します。人間レビュー率の低下は、ガバナンスエージェントが適切にキャリブレーションされていることを示すかもしれず、または監視が侵食されていることを示すかもしれません。トレンドを表面化させることで、組織がその判断を下せます。 組織はドリフトメトリクスにしきい値を設定できます。メトリクスがしきい値を超えると、ガバナンスエージェントは次のガバナンスチェックに検出事項(深刻度 warning)を含めるべきです(SHOULD)。
この例では、両方のしきい値が破られています — 人間レビュー率(0.01)が最小値(0.02)を下回り、自動承認率(0.97)が最大値(0.95)を超えています。これは、ガバナンスエージェントが広く承認しすぎていることを示すかもしれず、または低リスクキャンペーンにポリシーが適切にキャリブレーションされていることを示すかもしれません。しきい値の破れが問いを表面化させます。組織が答えを決めます。 組織は懸念に関連するしきい値のみを設定します。human_review_rate_min は監視の侵食を捕捉します。human_review_rate_max はポリシーの誤キャリブレーションを捕捉します。human_override_rate_max は、推奨が一貫して間違っているガバナンスエージェントを捕捉します。すべてのしきい値フィールドは任意です。

Plan amendments

既存の plan_idsync_plans を呼び出すと、プランが更新されます(upsert)。ガバナンスエージェントは plan_version をインクリメントし、新しいパラメーターを直ちに適用します。以前のプランバージョンで承認されたアクティブなメディアバイは自動的に再検証されません — ガバナンスエージェントは次の check_governance 呼び出し(例: 次の配信チェック)でそれらを更新されたプランに対して評価します。修正が予算を現在のコミット済み額を下回るように削減する場合、ガバナンスエージェントは次のガバナンスチェックでこれを検出事項としてフラグを立てます。

Validation logic

ガバナンスエージェントは、各 検証カテゴリ を独立して評価します。
  • いずれかのカテゴリがステータス failed を持ち、その失敗が修正可能な場合、ステータスは提案された修正を伴う conditions です
  • いずれかのカテゴリがステータス failed を持ち、その失敗が呼び出し元によって修正不可能な場合、ステータスは denied です
  • すべてのカテゴリが通過するが全体のリスクプロファイルが人間のレビューを正当化する場合、ガバナンスエージェントはレビューを内部的に処理し(タスクは非同期になる)、最終的に approved または denied に解決します
  • すべてのカテゴリが通過する場合、ステータスは approved です
conditions 配列は、ステータスが conditions の場合にのみ存在します。各条件は、特定のフィールド、その現在の値、提案された値、変更の理由を識別します。

Finding confidence

ガバナンスの検出事項には、確実な違反を曖昧なものから区別する任意の confidence スコア(0-1)と uncertainty_reason が含まれます。
信頼度は適切な応答に情報を与えます。
  • 高信頼度(0.9 以上): 検出事項は確定的です。EU ユーザーを明示的にターゲットにしたキャンペーンでの GDPR 違反。
  • 中信頼度(0.6-0.9): 検出事項は、ガバナンスエージェントが完全に解決できないコンテキストに依存します。未成年者を含む可能性のあるオーディエンスセグメント、規制管轄と部分的に重なるジオターゲティング。
  • 低信頼度(0.6 未満): 検出事項は推測的です。ガバナンスエージェントは、自律的に行動するのではなく、人間のレビューのためにフラグを立てます。
信頼度がなければ、すべての検出事項が等しく確実として提示され、(確実として扱えば)過剰にブロックするか、(多くが偽陽性なら)人々に検出事項を無視するよう訓練します。ガバナンスエージェントは、評価が自然言語の解釈や確率的マッチングを伴う場合、信頼度を含めるべきです(SHOULD)。

Phase inference

ガバナンスエージェントは、check_governancetool パラメーターから検証フェーズを推論します。 フェーズコンテキストは累積的です。購入中、ガバナンスエージェントはディスカバリー中に発見されたものを考慮します。 check_governance が返す check_id は、report_plan_outcome がセラーのレスポンスを検証されたアクションにリンクするために使われます。

Capability declaration

ガバナンスエージェントは、get_adcp_capabilities でキャンペーンガバナンスのサポートを宣言します。

Integration with create_media_buy

バイヤーは create_media_buy リクエストに plan_id を、プロトコルエンベロープに governance_context を含めます。これらのフィールドは、どのガバナンスプランが適用されるかをセラーに伝え、セラー側のガバナンスチェックを可能にします。
セラーのレスポンスには planned_delivery — セラーが実際に実行するもの — が含まれます。
planned_delivery は、リクエストに対するセラーの解釈 — 使用する実際の配信パラメーター — です。2 つの目的を果たします。
  1. ガバナンスチェック — アカウントにガバナンスエージェントが設定されている場合、セラーはメディアバイを確認する前に検証のために planned_delivery をガバナンスエージェントに送信します。
  2. 透明性 — バイヤーは、配信開始前に早期に差異を捕捉するために、planned_delivery を要求したものと比較できます。

Governance checks

キャンペーンガバナンスのバイヤー側検証には信頼の限界があります: バイヤーのオーケストレーターが自分の宿題を採点します。LLM エージェントはガバナンス承認を幻覚したり、検証をスキップしたり、何が検証されたかを誤って表現したりする可能性があります。セラー側のガバナンスチェックは、購入が承認されていることをセラーが独立して確認する方法を与えることで、このギャップを閉じます。 被管理アクションイベントが発生すると、セラーはバイヤーが設定したガバナンスエージェント URL に POST します。ガバナンスエージェントはすべての状態を維持し、plan_id + governance_context でリクエストを相関させます — セラーはガバナンス履歴を追跡したり、呼び出し間で ID をチェーンしたりする必要はありません。

Both checks must pass

すべての被管理アクションは、バイヤー側の意図チェックとセラー側の計画配信チェックの両方に合格しなければなりません(MUST)。両方の呼び出しは同じ権威(バイヤーのガバナンスエージェント)に到達するため、「2 つのエージェントが意見を異にする」ケースはありません — しかし両方の呼び出しが成功しなければならないという不変条件は負荷を担っています。
  • バイヤー側の意図チェックは、プランが原則として支出を許可することを確認します。
  • セラー側の計画配信チェックは、セラーの実際の配信パラメーターが承認されたプランと一致することを確認します。
これらは冗長ではありません。バイヤーの意図チェックが通過し(プランはプレミアムビデオに 100K ドルを許可する)、セラーの計画配信チェックが失敗する(セラーの計画されたラインナップにプランが除外するインベントリが含まれる)ことがあります。どちらかが denied を返す場合、アクションは進めてはなりません(MUST NOT)。両方が空でない conditions を伴って approved を返す場合、適用されるセットは両方のレスポンスの条件の和集合です。矛盾する条件(一方が X を要求し、他方が NOT X を要求する)は、黙った優先ではなく、構造化された finding を伴う denied に解決されます。 自身のコンテンツ標準や商業的理由で取引を拒否するセラーは、ガバナンス競合に参加しているわけではありません — それは別個の商取引層の拒否(例: TERMS_REJECTED)であり、通常の拒否パスに従います。ガバナンスはバイヤーのプランについてのみ語ります。

Setup

バイヤーは sync_governance を通じてガバナンスエージェントを同期し、各アカウントを呼び出すガバナンスエージェントエンドポイントとペアリングします。各エージェントには、ガバナンスエージェントがセラーの識別を検証できるよう認証情報が含まれます。
セラーはこれらのエンドポイントを保存し、check_governance を呼び出す際に認証情報を提示します。ガバナンスエージェントは、Bearer トークンが plan_id に関連付けられたアカウントの登録済み認証情報に一致することを検証しなければならず(MUST)、認識されないまたは一致しない認証情報を持つリクエストを拒否しなければなりません(MUST)。

Governance modes

ガバナンスモード(audit、advisory、enforce)は、ガバナンスエージェントの内部実装の詳細であり、プロトコルレベルのフィールドではありません。呼び出し元は check_governance を送信し、approveddenied、または conditions を受け取ります — どのモードがその決定を生成したかを知る必要はありません。 これは次を意味します。
  • audit モードのガバナンスエージェントは、内部的に常に検出事項を添付して approved を返します
  • advisory モードのガバナンスエージェントは、内部的に denied を返す場合がありますが、組織はそれを非ブロッキングとして扱います
  • enforce モードのガバナンスエージェントは denied を返し、呼び出し元が停止することを期待します
モードは、プロトコル経由ではなく、ガバナンスエージェント自体でバイヤーのポリシーチームによって設定されます。ガバナンスエージェントは、事後分析のために監査ログや get_plan_audit_logs レスポンスにモード情報を含めてもかまいませんが(MAY)、呼び出し元はモードに基づいて動作を分岐してはなりません(MUST NOT)— 受け取ったステータスに基づいて行動します。 クロール・ウォーク・ランの採用パスについては 安全モデル を参照。

Governance context

governance_context フィールドは、check_governance レスポンスでガバナンスエージェントが発行する不透明な文字列です。任意の被管理アクションのライフサイクルを相関させ、主要な監査/レポートキーです。ガバナンスエージェントは、必要な内部状態(プラン参照、予算スナップショット、チェック履歴)をこの値にエンコードします。 呼び出し元は governance_context を解釈してはなりません(MUST NOT)。永続化して転送します。
  • バイヤー: check_governance レスポンスから governance_context を受け取り、メディアバイをセラーに送信する際にプロトコルエンベロープに添付します。
  • セラー: エンベロープで governance_context を受け取り、メディアバイとともに保存し、そのメディアバイのライフサイクルの後続のすべての check_governance 呼び出しに含めます。
  • ガバナンスエージェント: governance_context を使って各ライフサイクルイベントを元のプラン、キャンペーングルーピング、予算状態に再接続します。
最初の check_governance 呼び出し(コンテキストが存在する前)では、ガバナンスエージェントは payloadplan_id から必要なものを抽出します。後続の呼び出しでは、governance_context が継続性を提供するため、ガバナンスエージェントはペイロードから状態を再導出する必要がありません。 ガバナンスエージェントは、governance_context をガバナンス状態のプレーンテキストエンコーディングとしてではなく、サーバー側状態へのルックアップキーまたは署名付きトークンとして扱うべきです(SHOULD)。状態が直接エンコードされる場合、中間者による改ざんが検出可能になるよう署名されなければなりません(MUST。例: HMAC)。 AdCP 3.0 では、エンコードされた値は AdCP JWS プロファイルに従って署名されたコンパクト JWS です。トークンは、証明をガバナンスエージェントが評価した正確なプラン状態にバインドする必須の plan_hash クレームを運びます(下記 Plan binding and audit を参照)。呼び出し元は依然として値を相関のために不透明として扱います。検証にオプトインするセラーは セラー検証チェックリストに従い、トークンの真正性、認可スコープ、鮮度を検証します — バイヤーのプランは検証しません。

Plan binding and audit

plan_hash クレームは、署名付き governance_context 証明を、ガバナンスエージェントが評価した正確なプラン状態に永遠にバインドする暗号学的レシートです。これは監査層プロパティです — セラーはそれを検証せず、検証することも期待されません。バイヤーのプランは、バイヤーがセラーと共有しない商業的に機密なデータ(クロスセラー配分、セラーごとの上限、目標、approved_sellers リスト、カスタムポリシー、ext)を運びます。3.x にはプラン取得メカニズムはなく、計画もされていません。plan_hash は、JWS がすでにガバナンスエージェントが生成する署名付きアーティファクトであるため JWS の内部に同行しますが、ワイヤー検証コントラクトの一部ではありません。 クレームが提供するもの:
  • 事後の説明責任。 すべてのガバナンス証明は、それが証明したプラン状態に永遠にバインド可能です。規制当局とフォレンジック監査は、保持された JWS とガバナンスエージェントのリビジョン記録のみを使って、何年も後に「このトランザクションは時刻 T にプラン状態 X の下で認可された」ことを証明できます。
  • ガバナンスエージェントの自己整合性。 すべての check_governance 呼び出しで、ガバナンスエージェントは現在のプラン状態を再評価し再ハッシュします。呼び出し間でガバナンスエージェントの永続化されたプランを改ざんすると、保持されたリビジョン記録に対する不一致として表面化します。
  • バイヤー側のコンプライアンス検証。 バイヤー自身のツールは、そのガバナンスエージェントがバイヤーが実際にプッシュしたプランに一致するトークンを生成していることを検証できます — 侵害されたまたは不正なガバナンスベンダーを捕捉します。

Canonicalization

plan_hash = base64url_no_pad(SHA-256(JCS(plan_payload))) ここで:
  • JCSRFC 8785 JSON Canonicalization Scheme冪等性ペイロード等価性に使われるのと同じスキームです。ガバナンスエージェントと監査人の検証者は、そこにリストされているのと同じライブラリ実装を使うべきです(SHOULD)。JCS はオブジェクトキーをコードポイントで辞書順にソートし(sync_plans リクエストでの呼び出し元のキー順はハッシュに影響しません)、省略された任意フィールドと明示的な null の区別を保持します(これらは異なるハッシュを生成します)。ガバナンスエージェントはプランを供給されたままハッシュしなければならず(MUST)、省略された任意項目をデフォルト値に合成してはならず(MUST NOT)、明示的な null を削除してはなりません(MUST NOT)。
  • plan_payloadsync_plans で供給された plans[] 配列の 1 要素 です — 単一のプランオブジェクトであり、sync_plans リクエストエンベロープでも plans ラッパー配列でもありません。プリイメージは証明時点での現在のプランリビジョン状態、すなわちガバナンスエージェントがちょうど評価したプランオブジェクトです。プリイメージを構築する実装は、プランリビジョンオブジェクトから開始し、下記にリストされた閉じた帳簿フィールドのセットを削除します。
  • base64url_no_pad は、末尾の = パディングを取り除いた RFC 4648 §5 に従います — JWS プロファイルの jti や他の base64url 値と一貫しています。ガバナンスエージェントはパディングなしの形式を発行しなければなりません(MUST)。検証者(自身のトークンを再検証するガバナンスエージェント、監査人、バイヤー側コンプライアンスツール)は、両側を base64url デコードして生の 32 バイト SHA-256 ダイジェストにし、バイトを比較して比較しなければならず(MUST)— エンコードされた形式の文字列等価性ではなく — パディング、大文字小文字、アルファベットの変動が、偽の不一致を生成するのではなくデコード失敗として拒否されるようにします。正確に 32 バイトにデコードされない plan_hash は拒否しなければなりません(MUST)。

Excluded fields

閉じたリスト — ガバナンスエージェントはそれを拡張または縮小してはならず(MUST NOT)、追加はプロファイルバージョンのバンプを要求する破壊的変更で、ペイロード等価性と同じルールです。
  • version — ガバナンスエージェントのリビジョンカウンター、各再同期でエージェントが設定
  • status — エージェントが管理するプランライフサイクルステータス
  • syncedAt — 各再同期で書き込まれるタイムスタンプ
  • revisionHistory — エージェント内部の追記のみのリビジョンログ(追記のみのアーカイブでなければならず(MUST)、実装は revisionHistory エントリをハッシュに使うアクティブなプランオブジェクト形状に読み戻してはなりません(MUST NOT))
  • committedBudget — ダウンストリームの check_governance / report_plan_outcome アクティビティから導出
  • committedByType — 同じアクティビティから導出
これらはいずれも sync_plans リクエストスキーマ(プランアイテムの additionalProperties: false)に現れません。ガバナンスエージェントの永続化されたプラン状態にのみ存在します。リストは、内部状態構造体を素朴にハッシュする実装者が正しいフィールドを取り除くよう、明示的に述べられています。このリストを超えて永続化されたプラン状態に追加の GA 内部フィールドを発見した実装は、プロファイルバージョンがバンプするまでそれらのフィールドをプリイメージ内として扱わなければなりません(MUST)— 除外ではなく包含へのフェイルセーフ。「帳簿のように見えるもの → 取り除く」というショートカットは、異なる推測をするすべての実装を黙って乖離させます。安全なデフォルトは「閉じたリストになければ、ハッシュの一部である」です。 他のすべてのフィールド — extcustom_policiesobjectivesdelegationshuman_override、および sync_plans プランアイテムスキーマで宣言されたすべてのフィールドを含む — はプリイメージ内です。呼び出し元へのガイダンス:
  • ext はプリイメージの一部です。 バイヤーは、プラン上の ext 内に回転するトークンやリトライ不安定な値を置いてはなりません(MUST NOT)。再同期間で変わる値は、バイヤーの宣言された意図が変わらない場合でも、プランのすべての未処理の governance_context トークンを無効化します(冪等性の ext の扱いと一貫)。
  • delegations[].expires_at は宣言された意図であり、同じプランの再同期間で安定しているべきです(SHOULD)。すべての同期で「now + N days」から再生成すると、ハッシュのチャーンを引き起こします。
  • 配列順序policy_idspolicy_categoriescustom_policiesapproved_sellersdelegationscountriesregionschannels.requiredchannels.allowed において意味的に重要ではありませんが、JCS はそれを保持します。バイヤーはこれらを再同期間で安定した順序で発行すべきです(SHOULD)。
  • JCS は Unicode 正規化しません。 RFC 8785 §3.2.5 に従い、JCS は文字列を供給されたまま保持します — 視覚的に区別できない Unicode 変種(ラテン a 対キリル а、NFC 対 NFD 合成、混同可能なホモグリフ)は異なるバイトを生成し、したがって異なるハッシュを生成します。plan_hash はこの乖離を暗号層で正しく検出しますが、プランセマンティクス層はそうではありません: policy_ids または policy_categories がホモグリフ置換のみで異なる 2 つのプランは、ガバナンスエージェントおよびダウンストリームコンシューマーで異なる強制結果を認可します。バイヤーとガバナンスエージェントは、policy_idspolicy_categories を発行または評価する前に、サーバー側で正規の許可リストに対して検証すべきです(SHOULD)。これはハッシュルールではなくプランコンテンツルールです — plan_hash の整合性はどちらの場合も無傷です。許可リストが、ホモグラフ置換が異なる認可決定を生成するのを防ぐものです。

Governance-agent obligations

ガバナンスエージェントは次を行わなければなりません(MUST)。
  • すべての check_governance 呼び出しで現在のプラン状態にわたって plan_hash を計算し、署名付き JWS ペイロードに含める。ハッシュはエージェントがちょうど評価したプランにわたってでなければなりません。変異したプランにわたる古い証明を生成してはなりません(MUST NOT)。
  • すべての check_governance 呼び出しで署名をリフレッシュする — 新しい jtiiatexpplan_hash。ガバナンスエージェントは、プランリビジョンにまたがって以前に署名された governance_context トークンをキャッシュして再発行してはなりません(MUST NOT)。エンベロープの冪等性レスポンスキャッシュは別個のレジームです — governance_context は、リプレイ時に回転できるよう、ペイロード等価性の閉じた除外リストに含まれています。
  • 各内部プランリビジョン記録とともにリビジョンごとの plan_hash を保持するaudit_log_pointer が公開されているかどうかに関係なく MUST。保持が永遠にバインドするプロパティを提供するものです。普遍的な保持がなければ、audit_log_pointer を使わないすべてのガバナンスエージェントは、そのトークンコーパス全体の監査層を黙って無効にします。証明されたプラン状態に結合し直せない監査ログは監査証跡の半分であり、自身の履歴トークンを検証できないガバナンスエージェントは、自身のストアの改ざんを検出できません。保持された値は実装内部で、get_plan_audit_logs の正規化されたレスポンスを通じて以外はワイヤー上で決して公開されません。それはエントリごとに plan_hash をエコーするため、監査人はガバナンスエージェントのプライベート記録から再構築する必要はありません。

Wire-verification contract

plan_hashcrit にリストされません。crit はワイヤー検証者のセマンティクス(RFC 7515 §4.1.11)です: リストされたクレームを処理できない検証者にトークンを拒否させます。plan_hash を処理するワイヤー検証者はありません — プリイメージを取得できる唯一の当事者(ガバナンスエージェント、監査人、バイヤーコンプライアンス)はオフワイヤーです。crit にリストすると、検証する根拠のないトークンをセラーに拒否させ、相殺する利益はありません。ガバナンスエージェントはクレームを発行しなければならず(MUST)、crit にリストしてはなりません(MUST NOT)。 セラーは governance_context をそのまま永続化して転送し、15 ステップの JWS 検証チェックリスト — 真正性、認可スコープ、鮮度 — を実行します。トークン内の plan_hash を不透明なカーゴとして扱い、決して検査しません。

Verification recipes

監査人レシピ。 プランの監査ログにアクセスできる規制当局やサードパーティ監査人は、次のように履歴証明を検証します。
  1. include_entries: true を伴って get_plan_audit_logs を呼び出して監査証跡を取得します。各 check エントリは plan_hash(発行時に主張されたクレーム)と governance_context(署名付き JWS)を運びます。
  2. 各 governance_context について、コンパクト JWS をデコードし、ガバナンスエージェントの公開 JWKS に対して 15 ステップの JWS コントラクト(署名、brand.json の issaudexp など)を検証します。
  3. デコードされた JWS ペイロードから plan_hash クレームを抽出し、base64url デコードして 32 生バイトにします。
  4. エントリレベルの plan_hash を 32 生バイトにデコードし、クレームとバイト比較します。不一致は、保持された監査記録が署名付きトークンと矛盾することを意味します — トークンが改ざんされたか記録が改ざんされたかのいずれかで、ガバナンスエージェントの整合性が疑われます。
  5. 任意: ガバナンスエージェントの保持されたリビジョンごとのプラン記録から plan_hash を再計算し(監査人がガバナンスエージェントのリビジョンストアへの認証済みアクセスを持つ場合)、再度バイト比較します。ここでの不一致は、署名と監査の間にガバナンスエージェント自身のストアが改ざんされたことを意味します。
バイヤー側コンプライアンスレシピ。 自身のツールがガバナンスエージェントが正直なトークンを生成していることを検証したいバイヤー:
  1. プロトコルエンベロープを通じてセラーに流れる governance_context トークンを観察します(バイヤーはすでにこれらを持っています。取得不要)。
  2. 各トークンについて、JWS をデコードし、plan_hash クレームを抽出し、base64url デコードして 32 バイトにします。
  3. トークンが証明するリビジョンでのバイヤー自身のプランのコピーにわたって plan_hash を再計算します。バイヤーは自身の sync_plans 呼び出しから権威あるプラン状態を持っています。
  4. バイト比較します。不一致は、ガバナンスエージェントがバイヤーが実際にプッシュしたプランに一致しない証明に署名していることを意味します — ベンダーの侵害またはバグのいずれかです。どちらもバイヤーがエスカレーションすべき重大な検出事項です。
このパスは、セラー、監査人、プロトコルを関与させずに不正なガバナンスベンダーを捕捉します。データはすでにバイヤー側にあります。 定数時間比較。 3 種類の検証者すべて — ガバナンスエージェントの自己整合性、監査人、バイヤー側コンプライアンス — は、plan_hash ダイジェストを比較する際に定数時間バイト比較(例: Node の crypto.timingSafeEqual、Python の hmac.compare_digest、Go の crypto/subtle.ConstantTimeCompare)を使うべきです(SHOULD)。SHA-256 長の比較でのタイミングサイドチャネルは今日実際には悪用可能ではありません。ルールは、より短いダイジェストで比較コードを再利用する将来のデプロイや、検証者ホスト上でのコテナンシーを持つ攻撃者に対する安価な保険です。

Privacy considerations

再同期にわたる plan_hash の変化は、何が変異したかを明かさなくても、プランが変異したことを明かします。トークンを長期保持する当事者(governance_context をそのまま転送するセラー、監査人、規制当局)は、特定の plan_id について観察する別個のハッシュのシーケンスから、プランの変異ケイデンスを推論できます。ほとんどのデプロイでこれは許容可能または望ましいものです — 変異ケイデンスは監査シグナルの一部です。変異頻度自体が商業的または運用的に機密である機密ガバナンスデプロイ(例: バイヤーがセラーにキャンペーンポートフォリオ全体の再プランケイデンスを推論されたくない)は、これをトークン保持ポリシーに織り込むべきです(SHOULD): governance_context のより短いセラー側保持ウィンドウ、またはクロストークンのリンク可能性を断つためのプランの jti 名前空間の定期的な回転。

Reference test vectors

static/compliance/source/test-vectors/plan-hash/ の 11 個のベクターが、正規化をビット単位で正確にピン留めします: 最小限のプラン、すべての任意フィールドを行使するプラン、帳簿を取り除いたケース(GA 内部フィールドが保存されたプランに存在するがハッシュ前に取り除かれ、帳簿なしの等価物と同じハッシュを生成する)、省略対明示 null、policy_categories の配列順序、回転する ext.trace_id がすべて別個のハッシュを生成することを証明するペアベクター、JCS が RFC 8785 §3.2.5 に従い正規化しないことを確認する Unicode ケース、および手作りの JSON.stringify + key sort ではなくライブラリの選択をピン留めする小数パーセンテージ付きの数値正規化ケース。各ベクターは、プリイメージ、正規の JCS バイト、SHA-256 16 進ダイジェスト、最終的な plan_hash クレーム値を記録します。ガバナンスエージェントと監査人の検証者は、これらのハッシュをビット単位で正確に再現しなければなりません(MUST)。

Governance phases

ガバナンスチェックは、3 つのフェーズを通じてメディアバイのライフサイクル全体をカバーします。 phase フィールドは省略された場合 purchase にデフォルトするため、既存の実装は変更なしに動作し続けます。 ガバナンスエージェントはすべての状態を維持し、plan_id + governance_context でリクエストを相関させます。セラーはチェック ID をチェーンしたり会話履歴を追跡したりしません — 何が起きたかをポストし、ガバナンスエージェントがコンテキストをルックアップします。

Purchase phase

セラーが governance_agents を持つアカウントで create_media_buy リクエストを受け取ったとき:
  1. セラーはリクエストを解釈し、その planned_delivery を決定します。
  2. セラーは phase: "purchase"plan_idplanned_delivery を伴って check_governance を呼び出します。
  3. ガバナンスエージェントは計画された配信をキャンペーンプランに対して検証します。
  4. approved なら、セラーはメディアバイを確認します。
  5. denied なら、セラーは GOVERNANCE_DENIED エラーでメディアバイを拒否します。
  6. conditions なら、セラーは条件を満たすように計画された配信を調整して再検証するか、拒否します。

Modification phase

セラーが update_media_buy リクエストを受け取ったとき:
  1. セラーは更新を解釈し、新しい planned_delivery を決定します。
  2. セラーは phase: "modification"、更新された planned_deliverymodification_summary を伴って check_governance を呼び出します。
  3. ガバナンスエージェントは plan_id + governance_context で被管理アクションをルックアップし、変更をプランに対して評価します。
  4. approved なら、セラーは更新を確認します。
  5. denied または conditions なら、セラーは購入フェーズと同じフローに従います。
ガバナンスエージェントは、初期購入とは異なるロジックを修正に適用できます。例えば、reallocation_threshold 内の小さな予算増加は自動承認され、一方で大きな予算増加や新しいジオ市場はより厳格な精査を必要とするかもしれません。

Delivery phase

セラーは、アクティブな配信中に定期的に phase: "delivery" を伴って check_governance を呼び出します。これにより、セラーとバイヤーのガバナンスエージェントの間に直接のレポートチャネルが作られます。
  1. セラーはレポート期間の配信メトリクスを収集します。
  2. セラーは phase: "delivery"、現在の planned_deliverydelivery_metrics を伴って check_governance を呼び出します。
  3. approved なら、レスポンスには next_check — セラーが次にレポートすべき時 — が含まれます。
  4. denied なら、セラーは直ちに配信を一時停止します。
  5. conditions なら、セラーは配信を調整し(例: ペーシングを遅くする、ジオターゲティングをシフトする)、直ちに再検証します。
ガバナンスエージェントは、購入承認レスポンスに next_check を含めることで配信レポートにオプトインします。購入レスポンスに next_check がない場合、ガバナンスエージェントは配信レポートを期待しません。 ガバナンスエージェントは next_check を通じてレポートケイデンスを制御します。ドリフトや条件を検出したときにケイデンスを締め(より短い間隔)、配信が安定しているときに緩める(より長い間隔)ことができます。ガバナンスエージェントは、見逃した next_check の期限を次の配信チェックでの検出事項として扱ってもかまいません(MAY)。

Verification examples

購入リクエスト:
承認(配信オプトイン付き購入):
next_check フィールドは、ガバナンスエージェントが配信レポートを期待していることを示します。存在しない場合、配信レポートは期待されません。 拒否(購入):
承認(配信):

Enforcement

アカウントに governance_agents が存在する場合、セラーは任意のメディアバイを確認する前に check_governance を呼び出さなければなりません(MUST)。バイヤーは、購入が独立して検証されるように特にエンドポイントを提供しました — それをスキップすることは目的を無に帰します。 governance_agents が存在しない場合、セラーはメディアバイリクエストを通常どおり処理します。バイヤー側のガバナンスループ(意図チェック → 実行 → report_plan_outcome)は依然として適用されますが、セラー側の検証はありません。 セラーは、すべてのアカウントの前提条件としてガバナンスチェックを要求してはなりません(MUST NOT)。governance_agents のないアカウントからのメディアバイの処理を拒否するセラーは、キャンペーンガバナンスを使わないバイヤーとの相互運用性を壊します。 purchase フェーズのガバナンスが使われる場合でも、delivery フェーズは任意です。セラーは、継続的な配信レポートなしに購入承認をサポートしてもかまいません(MAY)。ガバナンスエージェントは、購入レスポンスに next_check が存在することを通じて、配信レポートを期待するかどうかを示します。 ガバナンスエージェントに到達できない場合(タイムアウト、ネットワークエラー)、セラーはメディアバイを進めてはなりません(MUST NOT)。ガバナンスチェックは、登録済み governance_agents を持つアカウントでの購入確認の前提条件です。セラーは短い遅延の後にチェックを再試行すべきで(SHOULD)、エージェントが到達不能なままなら GOVERNANCE_UNAVAILABLE エラーでメディアバイを拒否すべきです。 オーケストレーターがセラーから GOVERNANCE_UNAVAILABLE を受け取ったとき、遅延の後に create_media_buy を再試行すべきです(SHOULD)。ガバナンスエージェントが利用不可のままなら、オーケストレーターは代替セラーを試みるのではなく人間にエスカレーションすべきです(SHOULD)— ガバナンス障害は同じアカウント上のすべてのセラーに影響します。オーケストレーターからの以前の意図チェック承認は、セラーの実行チェックの代替にはなりません。セラーは独立して検証し、オーケストレーターの承認を使えません。

Performance expectations

ガバナンスエージェントの実装は、意図チェックについては 5 秒以内、実行チェックについては 10 秒以内に check_governance 呼び出しに応答すべきです(SHOULD)。セラーは適切なタイムアウトを設定し、タイムアウトを利用不可と同じように扱うべきです(再試行し、その後 GOVERNANCE_UNAVAILABLE で拒否)。

Wire format

セラーは、MCP over HTTP(Streamable HTTP トランスポート)を使って、登録された URL で各ガバナンスエージェントを呼び出します。リクエストは、ツール名 check_governance とツール入力としてのリクエスト引数を持つ MCP tools/call 呼び出しです。認証は、Authorization ヘッダーのエージェントの authentication.credentials からの Bearer トークンを使います。

One governance agent per account

アカウントは、sync_governance ごとに正確に 1 つのガバナンスエージェントにバインドされます。登録はスキーマによって単一エージェントです — governance_agents は 3.0 が出荷したものであるため配列ですが、負荷を担う不変条件として maxItems: 1 に制約されています(緩和に向けた段階ではありません)。エンベロープは単一の governance_context トークンを運びます。すべてのライフサイクル呼び出しはその 1 つのエージェントにルーティングされます。上限を緩めるには、sync_governance、プロトコルエンベロープ、トークンをスレッドするすべてのライフサイクルタスクにまたがる協調的な変更が必要です — その変更は計画されていません。 これは意図的です。ガバナンスプランは単一的です — 予算権限、配信監視、ブランドセーフティ、規制コンプライアンスは、異なる権威が持つ独立した専門分野ではありません。それらは同じプラン状態に対する同じ評価のフェーズとファセットです。
  • 認可、忠実性、ドリフトは専門分野ではなくフェーズです。 check_governance はすでにそれらを phase 軸(purchase / modification / delivery)で分離しています。それらをエージェント間で分割すると、同じプラン状態を別個の権威に分割することになり、ドリフト、不一致、または同じプランの重複した再読み取りしか生成できません。
  • 規制ルールはプランにエンコードされ、別個のエージェントが保持しません。 enforced_policiesrestricted_attributespolicy_idshuman_review_required はプラン自体に存在します。「支出権限」エージェントとは別の「規制コンプライアンス」エージェントは、同じプランを再評価して同じ決定に達するか、乖離します — どちらも有用ではありません。
  • 内部の専門家レビューはガバナンスエージェントの内部に属します。 法務、ブランドセーフティ、カテゴリ専門家のレビューを望むバイヤーは、それらのレビュアーを単一のガバナンスエージェントエンドポイントの背後で構成します(人間レビュー、内部ルーティング、複数レビュアーの合意はすべてガバナンスエージェント内部の関心事)。プロトコルは 1 つのエージェントを見ます。エージェントの内部組織はエージェントの問題です。
  • 1 つのライフサイクル、1 つのトークン、1 つの監査証跡。 プランバインディング(plan_hash)、署名付きコンテキスト(governance_context)、get_plan_audit_logs はすべて単一エージェント設計です。単一エージェントが、事後の説明責任(「このトランザクションは時刻 T にエージェント Y によってプラン状態 X の下で認可された」)をクリーンで検証可能なクレームにするものです。
内部の専門家レビュー(法務、ブランドセーフティ、カテゴリ)を必要とするバイヤーは、それらのレビュアーを設定するガバナンスエージェント内部で構成します — プロトコルは分割を表面化しません。 内部分解は check-governance-response.findings[] を通じて監査可能です。各検出事項は category_id(エージェント内部のタクソノミー — ファーマ MLR、ブランドセーフティ、法務コンプライアンス、どの専門分野がフラグを立てたか)と policy_id(検出事項をトリガーした特定のポリシー)を運びます。バイヤーとセラーは 1 つの統合された決定を見ます。検出事項ごとの帰属により、読者は、分割を別個のプロトコルレベルエージェントとして表面化させることなく、ガバナンスエージェント内のどの専門家が拒否や条件に寄与したかを追跡できます。 違反が、プロデューサーがタグ付けしたサーフェス — バイヤーが作成した feature_requirements[i].policy_id、クリエイティブエージェントが記録した creative-feature-result.policy_id、またはプロパティリストエージェントが発行した validation-result.features[i].policy_id — に遡る場合、ガバナンスエージェントはエンドツーエンドのトレーサビリティのためにその policy_id を検出事項にエコーします。プロデューサーコントラクトについては ポリシー帰属 を参照。 キャンペーンガバナンスの内部ではなく隣接する関連する専門家レビュー — クリエイティブのブランドセーフティ事前スクリーン、プロパティリストポリシー、コンテンツ標準評価 — は、独自のエージェントと独自のライフサイクルを持つ別個のガバナンスサーフェスです(build_creative、プロパティガバナンス、コンテンツ標準ガバナンスを参照)。キャンペーンガバナンスはプランについてのみ語ります。

Governance checks and the governance loop

ガバナンスチェックはバイヤー側のガバナンスループを補完します。置き換えません。 delivery フェーズは、セラーが実際に配信しているものへのリアルタイムの可視性をガバナンスエージェントに与えます。バイヤー側の report_plan_outcome はオーケストレーターの正直なレポートに依存します。delivery フェーズはセラーから直接レポートを得ます。 バイヤー側とセラー側のガバナンスチェックは同じエージェント — sync_governance を通じてアカウントに登録されたもの — に到達します。オーケストレーターは意図チェックのためにそれを呼び出し、セラーは実行チェックのためにそれを呼び出します。両方の会話が同じプラン状態を持つ同じ権威に到達します。

Orchestrator integration pattern

ガバナンスチェックは、オーケストレーターのアクションループにおける同期呼び出しです。オーケストレーターは、セラーにリクエストを送信する前に tool + payload(意図チェック)を伴って check_governance を呼び出します。セラー側の実行チェックはオーケストレーターに対して透過的です — オーケストレーターは、ガバナンスチェックが設定されているかどうかに関係なく同じ create_media_buy リクエストを送信します。修正と配信フェーズのチェックは、オーケストレーターのガバナンスループとは独立に、セラーとガバナンスエージェントの間で発生します。

Audit trail

すべてのプランは、get_plan_audit_logs を通じて取得可能な、すべての検証されたアクションとレポートされた結果の順序付き監査証跡を維持します。証跡には次が含まれます。
  • チェック ID、タイムスタンプ、ツール
  • ステータスとカテゴリ評価
  • 結果ステータスとコミット済み予算
  • 結果レポートからの検出事項
  • 内部エスカレーションとその解決(ガバナンスエージェントが記録)
  • 人間の承認者の識別(人間レビューが内部的に発生した場合)
  • 時間経過に伴う配信メトリクス
この監査証跡はコンプライアンスとレポートのニーズに応えます。規制カテゴリ(政治広告、金融サービス)について、証跡はすべてのトランザクションにガバナンスが適用されたという証拠を提供します。

Conformance testing

ガバナンスエージェント実装のための適合性テストスイートが計画されています。テストベクターは構造化された入出力ペア — プラン、ポリシーのセット、check_governance リクエスト、期待されるレスポンスステータスと検出事項 — を提供します。ガバナンスエージェントはこれらのベクターを実行して、ポリシー評価が一貫した結果を生成することを検証できます。 ポリシーレジストリの exemplar(ポリシーごとの合否シナリオ)が原材料を提供します。テストベクターはこれらを、任意のガバナンスエージェントが検証できる実行可能なアサーションに形式化します。AdCP クライアントテストライブラリは、標準テストスイートの一部としてこれらのベクターを含めます。

Property list governance

キャンペーンガバナンスは、メディアバイがプロパティリストを参照するときにプロパティガバナンスと交差します。ガバナンスエージェントは、メディアバイリクエストで参照されるプロパティリストがプランのブランドセーフティとコンプライアンス要件を満たすことを検証してもかまいません(MAY)。これにより、プロパティリストがブランドのコンプライアンス設定と強制されたポリシーに整合することを保証します。