
get_products レスポンスがちょうど Sam のオーケストレーターにヒットしました。セラー — Northwind Media — は Acme Outdoor が乗りたいスポーツネットワーク StreamHaus 全体で CTV 在庫を見積もりました。CPM は公正に見え、アベイルはフライトに合い、レスポンスは 1 秒未満で到着しました。
Sam は Northwind とトランザクションしたことがありません。このレスポンスに署名したエージェントが実際に StreamHaus 在庫を販売する認可を受けているか、StreamHaus が彼が認識する親ハウスの下の実パブリッシャーか、賢い攻撃者が先週 northw1nd.example を登録し $25,000 を持ち去ろうとしているかを知りません。
彼は Northwind にセールスデッキで説得してもらう必要はありません。プロトコルにコードでチェーンを検証可能にしてもらう必要があります — レスポンスの署名鍵から、Northwind のブランドアイデンティティを通じて、StreamHaus の認可へ、彼が認識できる親ハウスに戻るまで、すべてのリンク。彼のバイヤーエージェントはチェーンを自動的に歩きます。Sam は判定を読みます。
このウォークスルーはそのチェーンを Sam の目を通じてたどります。
これが検証するものとしないもの。 チェーンは 誰が販売する認可を受けているか に答えます。それは エージェントの背後の法人が誰か(KYC、実オペレーター)、アベイルが配信時に現実を反映するか(カタログ精度、CPM、配信)、ホスティングインフラが信頼できるか(DNS、CDN、レジストラ)には答えません。境界された正直さステップ がすべての制限を明示的に名指します。これは在庫に適用された C2PA の「クレーム非認証」姿勢です — プロトコルは認可クレームを運びそれを検証可能にし、そこで止まります。
一目でわかるチェーン
3 つの発見可能な表面と 1 つの暗号チェック。Sam のエージェントは都合のよい順序でそれらを実行します:
チェーンは設計上双方向です: 各事実はそれに対する権限を持つちょうどその当事者によって主張されます。パブリッシャーが誰が在庫を販売できるか決定します。ブランドオーナーが何を所有するか決定します。セラーがどの鍵がレスポンスに署名するか決定します。第三者レジストリがそれらの間を裁定しません — 誤動作する認可されたセラーは、プロトコル内クレームチェックではなく、パブリッシャーが
adagents.json エントリーを取り消すことで修復されます。
下の 4 ステップのうち 1 つのみが暗号的に基礎付けられています(署名)。他の 3 つは整合性チェックされた発見です — well-known な場所の権威ファイルに対する文字列等価マッチ。チェーンは、パブリッシャーとセラーの自身の DNS、ホスティング、well-known エンドポイントの制御と同じだけ強いです。それが含意するものについては Step 5 を参照。
ステップ 1: レスポンス署名を検証

get_products レスポンスは RFC 9421 Signature と Signature-Input ヘッダーを運びます。keyid パラメーターは Northwind の公開された JWKS の JWK を指します。Sam のクライアントはボディを解析する前に署名を検証します:
keyid とペアの秘密鍵を保持するエンティティがこのレスポンスを生成し、レスポンスは転送中に改ざんされていない。それはまだ keyid が正当な Northwind に属することを伝えません。そのバインディングはステップ 3 の adagents.json から来ます。
なぜ署名検証が最初に来るか
なぜ署名検証が最初に来るか
署名が失敗すると、他のすべてのチェックは無駄な作業です — レスポンスは自身を正しく識別することさえ信頼できません。最初に検証することはまた Sam にクリーンな中止を与えます: 任意のビジネスロジックがそれに触れる前にレスポンスを破棄します。
maxAge と requireCreated はオプションではありません — 鮮度ウィンドウなしでは同じ署名付きレスポンスが無期限にリプレイされうる。maxAge をクロックスキュー予算にチューニング。300s が一般的な出発点です。AdCP 3.0 では、get_products の署名は RECOMMENDED です。支出コミット操作の必須署名は 4.0 に向けて #2307 で追跡されます。今日署名を要求するデプロイはそれをプラットフォーム層で強制します。ステップ 2: Northwind の brand.json を読む

https://northwind.example/.well-known/brand.json をフェッチします。これは Northwind の自己宣言です: それが誰で、署名鍵がどこに存在するか。
- ステップ 1 の
keyidはhttps://northwind.example/.well-known/jwks.jsonで解決しなければならない — Northwind 自身の brand.json が指す JWKS。Sam は今や署名から自己宣言のブランドアイデンティティへのバインディングを持ちます。 - Northwind はスタンドアロンエージェンシー —
house_domainフィールドなし。Northwind 側で検証する親ハウスクレームはありません。重要な認可クレームはパブリッシャー側、ステップ 3 に存在します。
ステップ 3: StreamHaus の adagents.json に対して確認

https://streamhaus.example/.well-known/adagents.json をフェッチします — 誰が在庫を販売する認可を受けているかのパブリッシャー自身の宣言:
urlが一致 Northwind のbrand.jsonがagents[].urlで名指した MCP エンドポイントと。両側で同じエージェント。delegation_type: "delegated"が商業関係を宣言 — Northwind は StreamHaus に代わって販売する認可を受けている。enum はdirect | delegated | ad_network。パブリッシャーがどれが合うか選ぶ。signing_keys[]が、そのkidがステップ 1 の署名で使われたものに一致する JWK を含む。これが Sam が欠いていたリンクです: パブリッシャーの StreamHaus が、自身のファイルでこの特定の公開鍵が自身に代わって署名できると証明します。
5 状態トラストシグナル
5 状態トラストシグナル
ブランドプロトコルの 相互主張モデル は、Sam の下流ロジックが行動できる離散シグナルを生成します:
Sam のチェーンは
mutual_assertion に解決します — inline に次ぐ最強の状態。inline と mutual_assertion のみがチェーンを閉じます。ステップ 4: 親ハウスを歩く

house_domain ↔ Sportshaus Holdings の brand_refs[].domain。両側が一致します。
このステップに 2 つの別個の概念が乗り、文書はそれらを混同しないよう注意します:
- 子の
keller_type(endorsed)はブランドアーキテクチャ関係を記述 — サブブランドが親の隣にどう位置付けられるか。それは Keller アーキテクチャメタデータで、商業認可ではありません。 - Northwind が販売できるようにする商業関係 はステップ 3 の
delegation_type: "delegated"で、親ハウスではなくパブリッシャー(StreamHaus)に存在します。
brand.json → StreamHaus の adagents.json → StreamHaus と Sportshaus Holdings の相互 brand.json 宣言。4 つの発見可能な表面、1 つの暗号アンカー、認可質問のための電話ゼロ。
Step 5: Know what the chain does not prove

そのテーブルの右側に 3 つの名指しされたギャップが存在します。
人間層ギャップ。 AdCP はオペレーター/人間 KYC プリミティブを運びません。暗号チェーンは「このドメインは販売する認可を受けており、この鍵がこのレスポンスに署名した」と言います — 「検証された会社の検証された人間がこのエージェントの反対側にいる」とは言いません。KYC はメンバーシップとアカウント層です。Acme のしきい値を超える新しい相手方には、Sam は依然として、任意の意味ある新ベンダーに対してするのとまったく同様に人間チェックにエスカレートします。
ホスティング層ギャップ。 チェーンは
northwind.example、その DNS、TLS、CDN を制御する誰でも信頼します。レジストラ乗っ取り、CDN 侵害、誤発行された TLS 証明書はチェーン全体を置き換えます — 攻撃者が有効に見えるパイプライン上で攻撃者制御の brand.json、adagents.json、JWKS をサーブします。3.x に公開鍵透明性ログはありません。初回遭遇信頼は trust-on-first-use で、失効は再フェッチによってのみ検出可能です。以前 Northwind とトランザクションしたバイヤークライアントは見た kid をピン留めしローテーションで警告します。初回遭遇のバイヤークライアントはそのシグナルを持ちません。#3925 を参照。
配信時ギャップ。 カタログ精度はプロトコル証明されません。パブリッシャーは個別の製品エントリーに署名せず、製品ごとの証明は在庫が本番でどう運用されるかに一致しません — 予測はドリフトし、価格は動き、供給は動的です。誤動作する認可されたセラーは、プロトコル内クレームチェックではなく、パブリッシャーが adagents.json エントリーを取り消すことで修復されます。配信時の真実は 測定 と課金照合に存在します。
これは C2PA の「クレーム非認証」姿勢です。プロトコルは認可クレームを運びそれを暗号的に検証可能にします。それは — そしてプロトコル層ではすべきでない — 任意の意味ある新相手方に対してバイヤーがする人間層、ホスティング層、配信層のチェックを置き換えません。
Sam が次にすること
Sam のクライアントは、決定時にキャプチャしたbrand.json、adagents.json、JWKS バイトを含めて — ライブファイルへのポインターだけでなく — get_products レスポンスとともに検証結果をログします。数か月後、監査人はそれらのキャプチャされたアーティファクトに対して署名を再検証し Sam の決定を正確に再現できます。ライブ .well-known/ ファイルの再フェッチは不十分です — それらは可変で、単一の鍵ローテーションまたはドメイン移転が素朴なリプレイを無効化します。
検証結果と 5 状態トラストシグナルは候補プランとともに Sam の ガバナンスフロー に移動し、そこで Jordan のガバナンスエージェントが任意の支出がコミットされる前に Acme のポリシーチェックを適用します。
ここからどこに行くか
- brand.json リファレンス — 自己宣言、親ハウスポートフォリオ、Keller アーキテクチャメタデータの完全なスキーマ
- セラーセットアップ — パブリッシャー、ネットワーク、SSP がセラーアイデンティティと認可ファイルをどう公開するか
- adagents.json リファレンス — パブリッシャー側認可、
authorization_type判別子、signing_keys[]JWK 形状 - verify_brand_claim — 検証をブランドエージェントに委譲する Tier-2 実装者ガイド
- セキュリティモデル — 三者ガバナンスとトラスト姿勢
- リクエスト署名 — RFC 9421 詳細、鍵ローテーション、透明性ログロードマップ
- トラスト & セキュリティ — CISO 向け表面マップ。このウォークスルーはバイヤー向けの相棒
- AAO Verified — 上のアイデンティティチェーンの上に層化された継続的動作適合性証明