> ## Documentation Index
> Fetch the complete documentation index at: https://adcp-docs-ja.pier1.co.jp/llms.txt
> Use this file to discover all available pages before exploring further.

# sync_governance

> sync_governance は特定のアカウントにガバナンスエージェントエンドポイントを同期する。セラーはこれらのエージェントを永続化し、メディアバイライフサイクルイベント中に check_governance 経由でそれらを呼ぶ。

特定のアカウントのガバナンスエージェントエンドポイントを同期します。セラーはエージェントを永続化し、メディアバイライフサイクルイベント中に `check_governance` 経由でそれを呼びます。各アカウントエントリーは [アカウント参照](/docs/building/by-layer/L2/accounts-and-agents#account-references) をちょうど 1 つのガバナンスエージェントとペアにし、アカウント id 名前空間（`account_id`）とバイヤー宣言アカウント（`brand` + `operator`）の両方をサポートします。

アカウントは、完全なライフサイクルを所有する 1 つのガバナンスエージェントにバインドします。認可、配信監視、コンプライアンスは、別々の権威が保持する専門分野ではなく、1 つのプランに対する同じ評価のフェーズです。専門レビュー（法務、ブランドセーフティ、カテゴリー）は、複数の登録全体ではなくガバナンスエージェント内で合成します。`governance_agents` は `maxItems: 1` の配列です、なぜなら配列形状は 3.0 が出荷した形状だから — 制約は荷重を担い、緩和に向けたステージングポストではありません。エンベロープの `governance_context` はこの層の下では単数です。上限を緩和するには、計画されていない協調ワイヤー形状変更が必要でしょう。[One governance agent per account](/docs/governance/campaign/specification#one-governance-agent-per-account) を参照。

これは **置換セマンティクス** を使います — 各呼び出しが指定されたアカウントの以前登録されたエージェントを置き換えます。リクエストに含まれないアカウントは既存の構成を保ちます。

**Response Time**: 約 1s。

**Request Schema**: [`/schemas/v3/account/sync-governance-request.json`](https://adcontextprotocol.org/schemas/v3/account/sync-governance-request.json)
**Response Schema**: [`/schemas/v3/account/sync-governance-response.json`](https://adcontextprotocol.org/schemas/v3/account/sync-governance-response.json)

## クイックスタート

アカウント id 名前空間アカウントのガバナンスエージェントを同期:

<CodeGroup>
  ```javascript JavaScript theme={null}
  import { testAgent } from "@adcp/sdk/testing";
  import { SyncGovernanceResponseSchema } from "@adcp/sdk";

  const result = await testAgent.syncGovernance({
    accounts: [
      {
        account: { account_id: "acct-social-001" },
        governance_agents: [
          {
            url: "https://governance.pinnacle-media.com",
            authentication: {
              schemes: ["Bearer"],
              credentials: "gov-token-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            }
          }
        ]
      }
    ]
  });

  if (!result.success) {
    throw new Error(`Request failed: ${result.error}`);
  }

  const validated = SyncGovernanceResponseSchema.parse(result.data);

  if ("errors" in validated && validated.errors) {
    throw new Error(`Operation failed: ${JSON.stringify(validated.errors)}`);
  }

  for (const entry of validated.accounts) {
    if (entry.status === "synced") {
      console.log(`${JSON.stringify(entry.account)}: ${entry.governance_agents.length} agent registered`);
    } else {
      console.log(`${JSON.stringify(entry.account)}: failed — ${JSON.stringify(entry.errors)}`);
    }
  }
  ```

  ```python Python theme={null}
  import asyncio
  from adcp.testing import test_agent

  async def main():
      result = await test_agent.simple.sync_governance(
          accounts=[
              {
                  "account": {"account_id": "acct-social-001"},
                  "governance_agents": [
                      {
                          "url": "https://governance.pinnacle-media.com",
                          "authentication": {
                              "schemes": ["Bearer"],
                              "credentials": "gov-token-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                          }
                      }
                  ]
              }
          ]
      )

      if hasattr(result, 'errors') and result.errors:
          raise Exception(f"Operation failed: {result.errors}")

      for entry in result.accounts:
          if entry.status == "synced":
              print(f"{entry.account}: {len(entry.governance_agents)} agent registered")
          else:
              print(f"{entry.account}: failed — {entry.errors}")

  asyncio.run(main())
  ```
</CodeGroup>

## リクエストパラメーター

| Parameter  | Type  | Required | Description                                                |
| ---------- | ----- | -------- | ---------------------------------------------------------- |
| `accounts` | array | Yes      | アカウントごとのガバナンスエージェントエントリー。各がアカウント参照をそのアカウントのガバナンスエージェントとペア。 |

**各アカウントエントリー:**

| Field               | Type   | Required | Description                                                                                                                                     |
| ------------------- | ------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `account`           | object | Yes      | [アカウント参照](/docs/building/by-layer/L2/accounts-and-agents#account-references): アカウント id 名前空間には `{account_id}`、バイヤー宣言アカウントには `{brand, operator}`。 |
| `governance_agents` | array  | Yes      | このアカウントのガバナンスエージェントエンドポイント。ちょうど 1 エントリーの配列（`minItems: 1`、`maxItems: 1`）。                                                                        |

**ガバナンスエージェント:**

| Field            | Type   | Required | Description                                                                          |
| ---------------- | ------ | -------- | ------------------------------------------------------------------------------------ |
| `url`            | string | Yes      | ガバナンスエージェントの HTTPS エンドポイント URL。                                                      |
| `authentication` | object | Yes      | このエージェントを呼ぶときセラーが提示する認証情報。`schemes`（1 つの認証スキームの配列）と `credentials`（トークン、最小 32 文字）を含む。 |

## レスポンス

**成功レスポンス:**

アカウントごとの結果を伴う `accounts` 配列を返します。操作が成功しても個別のエントリーは失敗しうる。

| Field               | Description                                                        |
| ------------------- | ------------------------------------------------------------------ |
| `account`           | アカウント参照、リクエストからエコー。                                                |
| `status`            | `"synced"` または `"failed"`。                                         |
| `governance_agents` | このアカウントで今アクティブなガバナンスエージェント。永続化された状態を反映。`status: "synced"` のときのみ存在。 |
| `errors`            | アカウントごとのエラー。`status: "failed"` のときのみ存在。                            |

**エラーレスポンス:**

操作レベルエラー（認証失敗、サービス利用不可）を伴う `errors` 配列。`accounts` 配列は存在しない。

## 認可

セラーは、ガバナンスエージェントを永続化する前に、認証されたエージェントが各参照アカウントに対する権限を持つことを検証しなければなりません（MUST）。エージェントが所有しないアカウントを参照するリクエストは、それらのエントリーにエラーを伴う `failed` ステータスを返さなければなりません（MUST）。

## 一般的なシナリオ

### アカウントごとに異なるガバナンスエージェント

単一の `sync_governance` 呼び出しは、アカウントごとに別個のエージェントを登録できます — 各アカウントは依然としてちょうど 1 つのエージェントにバインドしますが、同じ呼び出しのアカウントはそれを共有する必要はありません。

<CodeGroup>
  ```javascript JavaScript theme={null}
  import { testAgent } from "@adcp/sdk/testing";
  import { SyncGovernanceResponseSchema } from "@adcp/sdk";

  const result = await testAgent.syncGovernance({
    accounts: [
      {
        account: { account_id: "acct-social-001" },
        governance_agents: [
          {
            url: "https://governance.pinnacle-media.com",
            authentication: {
              schemes: ["Bearer"],
              credentials: "gov-token-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            }
          }
        ]
      },
      {
        account: { account_id: "acct-social-002" },
        governance_agents: [
          {
            url: "https://governance.acme-buyer.com",
            authentication: {
              schemes: ["Bearer"],
              credentials: "gov-token-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
            }
          }
        ]
      }
    ]
  });

  if (!result.success) {
    throw new Error(`Request failed: ${result.error}`);
  }

  const validated = SyncGovernanceResponseSchema.parse(result.data);

  if ("errors" in validated && validated.errors) {
    throw new Error(`Operation failed: ${JSON.stringify(validated.errors)}`);
  }

  for (const entry of validated.accounts) {
    console.log(`${JSON.stringify(entry.account)}: ${entry.status}`);
  }
  ```

  ```python Python theme={null}
  import asyncio
  from adcp.testing import test_agent

  async def main():
      result = await test_agent.simple.sync_governance(
          accounts=[
              {
                  "account": {"account_id": "acct-social-001"},
                  "governance_agents": [
                      {
                          "url": "https://governance.pinnacle-media.com",
                          "authentication": {
                              "schemes": ["Bearer"],
                              "credentials": "gov-token-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
                          }
                      }
                  ]
              },
              {
                  "account": {"account_id": "acct-social-002"},
                  "governance_agents": [
                      {
                          "url": "https://governance.acme-buyer.com",
                          "authentication": {
                              "schemes": ["Bearer"],
                              "credentials": "gov-token-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
                          }
                      }
                  ]
              }
          ]
      )

      if hasattr(result, 'errors') and result.errors:
          raise Exception(f"Operation failed: {result.errors}")

      for entry in result.accounts:
          print(f"{entry.account}: {entry.status}")

  asyncio.run(main())
  ```
</CodeGroup>

### バイヤー宣言アカウント（brand + operator）

<CodeGroup>
  ```json Request theme={null}
  {
    "$schema": "https://adcontextprotocol.org/schemas/v3/account/sync-governance-request.json",
    "idempotency_key": "e5b9f2c3-1234-48a0-1234-56789012345e",
    "accounts": [
      {
        "account": {
          "brand": { "domain": "nova-brands.com", "brand_id": "spark" },
          "operator": "pinnacle-media.com"
        },
        "governance_agents": [
          {
            "url": "https://governance.pinnacle-media.com",
            "authentication": {
              "schemes": ["Bearer"],
              "credentials": "gov-token-yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
            }
          }
        ]
      }
    ]
  }
  ```
</CodeGroup>

### ガバナンスエージェント認証情報のローテーション

更新された `authentication` で `sync_governance` を再度呼びます。置換セマンティクスは、新しい認証情報が以前の構成を上書きすることを意味します。

### 3.1 以前のマルチエージェント登録からの移行

3.0 の以前のドラフトは、エージェントごとの `categories` を伴うアカウントごと最大 10 のガバナンスエージェントを許可しました。3.1 は `governance_agents` をちょうど 1 エントリーに制約し `categories` を削除します。以前の形状に対して 1 つ以上のエージェントを登録したバイヤーは、次の `sync_governance` 呼び出しで単一エージェントに崩さなければなりません（MUST）。セラーの永続化された状態は置き換えられます。新しいリクエストスキーマは 1 つ以上のエージェントを直ちに拒否するので、「混合モード」ウィンドウは存在しません。

**バイヤー側崩壊決定。** 以前登録されたエージェントのどれが単一エージェントになるかはバイヤー内部の決定です — プロトコルはランク付けや推奨をしません。典型的なパス: (a) 最も広いポリシーカバレッジを持つエージェント（通常は予算/支出権限エージェント）を保ち、専門ロジック（法務、ブランドセーフティ、規制レビュー）を内部ワークフローとしてそれに折りたたむ。(b) 以前の専門家に内部でファンアウトする新しい「フロントドア」ガバナンスエージェントをデプロイし、そのエージェントのみを登録。(c) 常に事実上のガバナンス表面だったエージェントを保ち、他の専門レビューを再登録せずに内部ワークフローとしてそれに折りたたむ。監査証跡が各内部レビュアーが貢献したものを保持するよう、チェックレスポンスの `categories_evaluated` と `findings[].details` 経由で内部分解を監査人に表示します。

**セラー側。** セラーは、新しいスキーマの下での初回ブートで、以前永続化されたマルチエージェント状態を最初のエントリー（元の同期位置で順序付け）に崩し、移行を監査証跡にログしてもよい（MAY）。セラーは、次の `sync_governance` 呼び出しが複数のエージェントを再登録しようとするバイヤーに、この移行ガイダンスを指す明確なエラーを表示すべきです（SHOULD）。

## エラー処理

| Error Code          | Description               | Resolution                                        |
| ------------------- | ------------------------- | ------------------------------------------------- |
| `ACCOUNT_NOT_FOUND` | 参照アカウントが存在しないかアクセス不可      | `list_accounts` または `sync_accounts` 経由でアカウント参照を検証 |
| `UNAUTHORIZED`      | エージェントが参照アカウントに対する権限を持たない | このアカウントへのアクセスを持つエージェントとして認証されているか確認               |

## 次のステップ

* [list\_accounts](/docs/accounts/tasks/list_accounts) — アカウントとその現在のガバナンスエージェントを発見
* [sync\_accounts](/docs/accounts/tasks/sync_accounts) — アドバタイザーアカウントをプロビジョンまたはリンク
* [check\_governance](/docs/governance/campaign/tasks/check_governance) — セラーがメディアバイイベント中にガバナンスエージェントをどう呼ぶか
* [アカウントとエージェント](/docs/building/by-layer/L2/accounts-and-agents) — アカウントモデル、課金、トラスト
