0. 今日所有するものを棚卸しする
何かをスワップする前に、手書きスタックが AdCP スタック の各層で何を提供するかを書き留めます。そのドキュメントの L0–L3 チェックリストをルーブリックとして使ってください。各行をマーク: 出荷済み / 部分的 / まだ。 これが操作の順序を決めます。最低リスクのスワップは通常、今日 最も少ない カバレッジを持つ層です。なぜなら、調整する既存の動作が最も少ないからです。1. コードを変える前に、まず仕様適合性に到達する
最も重要な単一のステップ:- エージェントに mock-mode アカウント を立てる。(live/sandbox/mock の区別がまだない場合、下の Account-mode mismatch を参照 — まず境界にフラグを追加する。)
- mock-mode トラフィックをリファレンスモックサーバーにルーティングする。
- エージェントに対して AdCP ストーリーボードを実行する(Conformance と エージェントを検証する を参照)。
- pass/fail レポートを読む。
2. 操作の順序(最低リスク優先)
推奨スワップ順:- 適合性テストサーフェス(
comply_test_controller)。純粋に加算的 — mock-mode トラフィックが今や SDK を通る。ライブトラフィックは触れられない。その場で仕様適合性認証を獲得。 - エラーコードカタログ。エラーエンベロープ構築を SDK のエラービルダーで置き換える。リカバリー分類とコード優先度(例:
INVALID_STATEよりNOT_CANCELLABLE)が無料で来る。Error handling を参照。 - 冪等性キャッシュ。最もリスクの高いスワップ — Two idempotency caches in series を参照。仕様コントラクト: Idempotency。
- 非同期タスクストア + ディスパッチャー。SDK の
task_id+ 終端アーティファクトコントラクトを採用。しばしばワーカーキューに触れる。Task lifecycle を参照。 - ステートマシン、一度に 1 リソース。最も保守時間を費やす場所なら MediaBuy を最初に(ライフサイクルリファレンス)。各後にライフサイクルストーリーボードを再実行。
- Webhook 発出(署名済み、リトライ済み、冪等)。1–5 と独立。並列化できる。Webhooks を参照。
- RFC 9421 署名 + 検証。上のすべてと独立。並列化できる。Security implementation を参照。
- 認証 / アカウントストア。最後。手書きの L2 はおそらく簡単には動かないビジネス決定をエンコードしている。
3. 注意すべき衝突モード
これらは、来るのが見えないと段階的移行を痛みにする「2 つのスタックが互いに戦う」失敗モードです。Two idempotency caches in series
既存のキャッシュは境界でリクエストをフィールドし、SDK のキャッシュはプロトコル境界でリクエストをフィールドします。症状: どのキャッシュが最初にヒットしたかに応じて同じidempotency_key が異なるエンベロープを返す。クロスペイロード再利用が一方で検出され他方で検出されない。
解決。 1 つを選び、他を退役させる。通常あなたのを退役 — SDK のは IDEMPOTENCY_CONFLICT の no-payload-echo 不変条件(盗まれた鍵の read-oracle 脅威)と、仕様が義務付けるクロスペイロード衝突検出を強制します。ストレージバックエンド(Redis、Postgres)を保持する必要があるなら、SDK をフォークする代わりにカスタムバックエンドとして SDK のキャッシュコントラクトをそれに向けます。
Account-mode mismatch
SDK はlive / sandbox / mock アカウントを区別します(Sandbox を参照)。手書きスタックが区別を欠く場合、mock-mode ストーリーボードがライブハンドラーにディスパッチする可能性があります。症状: ストーリーボードが本番状態を変異させる。適合性認証がディスパッチを拒否する。
解決。 SDK の適合性コントローラーを採用する前に、境界にアカウントモードフラグを追加します。comply_test_controller は sandbox または mock でない任意のアカウントに対して実行するのを拒否します — その拒否はバグではなく機能です。
Webhook signature ownership
両スタックがアウトバウンド webhook に署名しようとすると、受信者は 2 つのSignature ヘッダーを見ます(または一方が勝ち他方がプロキシによって黙って上書きされる)。どちらにせよ、署名は検証されません。
解決。 境界で 1 つの署名者を選ぶ。通常 SDK の、なぜなら公開鍵レジストリに対して鍵ローテーションを追跡し RFC 9421 正準化を正しく扱うからです。KMS 裏付けの鍵素材を保持し、それを使うよう SDK の署名プロバイダー抽象を設定します。
State machine drift
手書きのステートマシンはおそらく SDK が拒否するエッジ(例:active をスキップする直接 pending_creatives → completed、または NOT_CANCELLABLE 対 INVALID_STATE 優先度を区別しない active → canceled)を持ちます。症状: 成功を期待した場所でライフサイクルストーリーボードが INVALID_STATE で失敗する。
解決。 ステートマシンをスワップする 前に エージェントに対してライフサイクルストーリーボードを実行します。エッジセットを仕様に調整 — 明白なバグを修正し、曖昧さについて仕様 issue を提出。次に SDK のステートマシンをスワップイン。それはあなたが手で収束させたものを強制します。
Webhook delivery transport
キュー/ワーカースタックが今日 webhook を配信する場合、あなたのを退役させずに SDK のエミッターを配線すると二重配信します。症状: 受信者がわずかに異なる時刻に同じペイロードで重複する冪等性キーを見る。 解決。 SDK はエンベロープを構築します。どう出荷するかはあなた次第です。組み込みの HTTP 配信を実行する代わりに既存のトランスポートに引き渡すよう SDK を設定 — それがシーム。Schema validation collisions
インバウンドペイロードを独自のスキーマバンドルに対して検証し、SDK がその境界で再び検証すると、重複作業(安価)か矛盾する判定(実際のバグ — あなたのバンドルが公開スキーマからドリフトした)のいずれかを得ます。 解決。 SDK が入った後、ローカル検証器を退役させます。両方が実行される間、任意の不一致を SDK が間違っているのではなくあなたのバンドルが古いものとして扱います。4. 適合性を通過する中間状態
各ステップ後、mock-mode ストーリーボードを再実行し再認証できます。適合性を主張するために移行を終える必要はありません — SDK の適合性スイートが強制する任意の切り取りラインでストーリーボードを通過するだけです。
各ステップ後に出荷します。本番トラフィックは維持されます。
ステップごとのロールバック
スワップ順の各ステップは約 5 分以内で可逆であるべきです。一般的なパターン: 各スワップは、削除ではなく 手書きコンポーネントと SDK のものの間のフィーチャーフラグ付きスイッチ です。アカウントごとのフラグの背後でスワップを出荷し、観測し、次にデフォルトを反転します。ロールバックは反対方向の同じフラグです。 スワップごとに計画すべきこと:午前 2 時の本番障害
スワップ N が午前 2 時に本番で失敗した場合、オンコールレシピ:- 影響を受けるアカウント(または影響範囲を分離できないならグローバルに)について、アカウントごとのフラグを手書きコンポーネントに戻す。これが出血を止めるのに必要な唯一のステップ。
- そのステップの上の 漏洩行を確認する。ほとんどのステップはどこかに残余状態を残す — 朝のデバッグがコールドスタートしないようそれが何かをメモする。
- インシデント中に適合性スイートを再実行しない。 それは mock-mode に対して実行される。本番障害は異なるシグナル。
- 一般的な SDK ではなくスワップステップに対してインシデントを提出する。 移行ガイドのスワップ順が調査の単位。SDK のカバレッジマトリクスはその下流。
5. What you can leave hand-rolled
SDK は仕様が意見を持つ場所で意見を持ち、そうでない場所でプラグイン可能です。既存のインフラを諦める必要はありません:- 署名プロバイダー。 KMS 統合を保持。SDK はカスタム署名者を受け入れる。
- アカウントストア。 マルチテナントルーティングを保持。SDK のアカウントストアインターフェースがシーム。
- 冪等性バックエンド。 Redis / Postgres を保持。SDK のキャッシュコントラクトはプラグイン可能。
- Webhook 配信トランスポート。 キューを保持。SDK はエンベロープを構築する。どう出荷するかはあなた次第。
- スキーマ検証ライブラリ。 望むなら検証器を保持。SDK はその境界で独自のを使い、あなたのではない。
6. 移行中のバージョニング
ジャグリングする 2 つのバージョン軸:- バイヤーの仕様バージョン。 移行は、バイヤーバージョンでハンドラーをフォークするのをやめるため呼び出しごとの
adcpVersionピン留めを追加する絶好の瞬間。Version Adaptation を参照。 - SDK バージョン。 最終状態としてレガシーインポートパスに移行しない — それを 通じて 移行する。レガシーサブパスは、残りが古いものに留まる間、新しいエントリポイントで一度に 1 つの専門分野を採用できるよう存在する。同じプロジェクトのグリーンフィールドコードは新しいフレームワークを直接使う。
実践例: 2 バイヤー、スワップ中盤
ステップ 3(冪等性)にいて、バイヤー A は AdCP 2.5、バイヤー B は AdCP 3.0。切り替えたアカウントについて SDK のコントローラー、エラーエンベロープ、冪等性キャッシュを採用済み。バイヤー A は SDK への飛行中、バイヤー B は SDK でグリーンフィールド。 インバウンド側: 各ピアの仕様バージョンを事前に識別(エージェントレジストリ、エージェントカード、または存在すればadcp_version フィールドから)、エージェント / 呼び出しごとに adcpVersion をピン留め、SDK にワイヤー形状を適応させます。@adcp/sdk の例:
1 つのハンドラーコードベース。2 つのワイヤーバージョン。両バイヤーが期待するエンベロープ形状を見る。ステップ 3 で
adcpVersion ピン留めを採用するのは安価 — バージョン作業のほとんどはアダプターモジュールにあり、SDK が既に出荷しています。
フォールバック(ステップ 3 を手書きキャッシュにロールバック)しても、バイヤー A はまだ SDK の変換アダプターを通ります — バージョン機構と冪等性機構は独立です。ロールバックでハンドラーコードを再フォークしません。
7. 移行 しない とき
エージェントが少数の名前付きバイヤーに凍結されたワイヤーサーフェスを提供し、エンジニアがプロトコル保守にほぼゼロの時間を費やすなら、移行 ROI は低いです。妥当な保留:- AdCP 2.5 にいて、どのバイヤーも 3.x を望まず、彼らが望んだら非推奨化する意志がある。
- (ステップ 1 からの)適合性ギャップが、SDK を採用せずにその場で修正するのに十分小さい。
- すべての層をエンドツーエンドで所有するハードな規制または運用上の理由がある。
関連項目
- AdCP スタック — 層アーキテクチャリファレンス
- どこから始めるか — 決定ページ
- Version Adaptation — 3 メカニズムリファレンス
- Conformance — ストーリーボードスイートがエージェントをどうグレードするか
- エージェントを構築する — グリーンフィールドパス。L4-on-SDK の最終状態がどう見えるかのリファレンスとして有用