From 6b67e14d2f96d09aa34da6f99df84a97ca01a9e6 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sun, 3 May 2026 12:43:32 -0400 Subject: [PATCH 1/2] =?UTF-8?q?fix(compliance):=20inventory=5Flist=5Ftarge?= =?UTF-8?q?ting=20=E2=80=94=20add=20sandbox:true=20to=20account=20fixtures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 5 account blocks across the 4 phases of this scenario use the brand+operator natural-key variant of AccountReference but omit the sandbox flag. Sellers whose accounts.resolve has separate code paths for sandbox vs production refs (the conventional shape — see the worked hello_seller_adapter_guaranteed example in @adcp/sdk) end up routing create_media_buy and get_media_buys through DIFFERENT account-id namespaces: - create_media_buy enricher (FIXTURE_AWARE_ENRICHERS): builds the request from scratch via resolveAccount(options) which inherits sandbox=true from the test-kit. Adapter routes to its sandbox namespace. - get_media_buys enricher: returns only `{media_buy_ids:[...]}`; request-builder.ts:853 then merges the storyboard fixture, which has account WITHOUT sandbox. Adapter routes to its production namespace. Different accountIds → frame-side mediaBuyStore can't backfill targeting_overlay onto get_media_buys responses → property_list / collection_list assertions in `verify_create_persisted` and `verify_update_persisted` fail with "Expected ..., got undefined". Setting `sandbox: true` on every account block keeps both create and get on the sandbox path, the round-trip becomes consistent, and the storyboard exercises what it intended to: targeting persistence across the create/get/update lifecycle. Refs: - adcontextprotocol/adcp-client#1415 (SDK side: createMediaBuyStore shipped the auto-echo plumbing in dda2a77e; this fixture fix is the last piece needed for the worked example to pass without an EXPECTED_FAILURES allowlist) - adcontextprotocol/adcp-client commit 5fd83f17 (#1453) — Account.mode trust boundary on which the sandbox-vs-production routing depends Co-Authored-By: Claude Opus 4.7 (1M context) --- .../media-buy/scenarios/inventory_list_targeting.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/static/compliance/source/protocols/media-buy/scenarios/inventory_list_targeting.yaml b/static/compliance/source/protocols/media-buy/scenarios/inventory_list_targeting.yaml index 93e3e32627..9502c04168 100644 --- a/static/compliance/source/protocols/media-buy/scenarios/inventory_list_targeting.yaml +++ b/static/compliance/source/protocols/media-buy/scenarios/inventory_list_targeting.yaml @@ -68,6 +68,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" + sandbox: true context: correlation_id: "inventory_list_targeting--get_products_brief" @@ -112,6 +113,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" + sandbox: true idempotency_key: "inventory-list-targeting-create-v1" start_time: "2026-07-01T00:00:00Z" end_time: "2026-09-30T23:59:59Z" @@ -169,6 +171,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" + sandbox: true media_buy_ids: - "$context.media_buy_id" @@ -212,6 +215,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" + sandbox: true media_buy_id: "$context.media_buy_id" packages: - package_id: "$context.package_id" @@ -248,6 +252,7 @@ phases: brand: domain: "acmeoutdoor.example" operator: "pinnacle-agency.example" + sandbox: true media_buy_ids: - "$context.media_buy_id" From bd160ee28ed0ad05fb1c8f0fc0b328c4d4e4ce3e Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Sun, 3 May 2026 13:57:20 -0400 Subject: [PATCH 2/2] changesets: add empty changeset for inventory_list_targeting fixture fix --- .../inventory-list-targeting-sandbox-fixture.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .changeset/inventory-list-targeting-sandbox-fixture.md diff --git a/.changeset/inventory-list-targeting-sandbox-fixture.md b/.changeset/inventory-list-targeting-sandbox-fixture.md new file mode 100644 index 0000000000..b0b2b2d305 --- /dev/null +++ b/.changeset/inventory-list-targeting-sandbox-fixture.md @@ -0,0 +1,12 @@ +--- +--- + +fix(compliance): inventory_list_targeting — add `sandbox: true` to account fixtures + +The 5 account blocks across this scenario use the brand+operator natural-key variant of `AccountReference` but omit the `sandbox` flag. Sellers whose `accounts.resolve` has separate code paths for sandbox vs production refs end up routing `create_media_buy` and `get_media_buys` through different account-id namespaces, which breaks `mediaBuyStore` backfill of `targeting_overlay` and fails `verify_create_persisted` / `verify_update_persisted`. + +Setting `sandbox: true` on every account block keeps both create and get on the sandbox path, the round-trip becomes consistent, and the storyboard exercises what it intended to: targeting persistence across the create / get / update lifecycle. + +Non-protocol (storyboard fixture only). No version bump. + +Refs: adcp-client#1487 — follow-up to fix the underlying enricher asymmetry upstream so future storyboard authors don't trip the same wire.