Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .changeset/5595-addie-explicit-org-selection.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

Empty changeset: Addie now requires explicit organization selection for multi-org save-agent flows, accepts explicit organization names/IDs from Slack, and forwards the selected web organization into Addie Home and chat context.
4 changes: 4 additions & 0 deletions .changeset/5642-acme-storyboard-prose.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

Empty changeset: Clarify that the sponsored-context accountability storyboard is scoped to fixed Acme receipt literals, not dynamic echo/substitution behavior, so the upcoming compliance source prose matches the fixture being exercised.
4 changes: 4 additions & 0 deletions .changeset/5655-migration-upgrade-nav.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

Empty changeset: Separate breaking v2 to v3.0 migration docs from additive 3.1 badge prep guides, and align version navigation so the 3.1 upgrade guides are discoverable.
4 changes: 4 additions & 0 deletions .changeset/5664-dependency-impairment-snapshot-gate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

Empty changeset: Fix `dependency_impairment` and `dependency_impairment_cardinality` for #5664 on two fronts. (1) Gate both storyboards on `media_buy.propagation_surfaces` containing `snapshot`, so webhook-only / `out_of_band` sellers grade `not_applicable` instead of false-failing on the snapshot-coherence surface (wiring the opt-out the `propagation_surfaces` schema already documents). (2) Insert `list_creatives` re-reads after each `force_creative_status` rejection so the runner observes the offline status on the wire before the impaired `get_media_buys` read — without it the `impairment.coherence` ledger keeps the pre-rejection status and the scenario false-fails for every snapshot seller. Fixes #5664.
5 changes: 5 additions & 0 deletions .changeset/5665-governance-aware-capability.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"adcontextprotocol": patch
---

Add `media_buy.governance_aware` capability to `get-adcp-capabilities-response` and gate the `governance_denied` / `governance_denied_recovery` storyboards on it, so sellers without outbound governance consultation grade `not_applicable` instead of false-failing on a `GOVERNANCE_DENIED` they cannot produce. Addresses #5665 (Option A).
8 changes: 8 additions & 0 deletions .changeset/base-media-buy-non-guaranteed-baseline.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
---

compliance(media-buy): base `media_buy_seller` flow uses non-guaranteed fixtures so non-guaranteed-only sellers can run the base create/delivery lifecycle.

The base protocol flow (`protocols/media-buy/index.yaml`) seeded guaranteed-only product fixtures and its `create_buy` step hardcoded a guaranteed buy. A seller that declares only `specialisms: ["sales-non-guaranteed"]` correctly rejects a guaranteed buy with `DELIVERY_MODE_NOT_SUPPORTED`, so `create_buy` failed and the dependent `creative_sync` / `delivery_monitoring` steps cascaded — the base lifecycle was unrunnable for the entire non-guaranteed-only seller class. Switches the base lifecycle to the universal non-guaranteed (auction) path; the guaranteed lifecycle remains covered by the `sales-guaranteed` specialism bundle (which carries its own guaranteed fixtures + IO-approval flow).

Note: the packaged compliance cache under `dist/compliance/` is generated from this source and should be regenerated by the build.
2 changes: 2 additions & 0 deletions .changeset/bright-lizards-matter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
5 changes: 5 additions & 0 deletions .changeset/broadcast-entitlements-patch.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"adcontextprotocol": patch
---

Clarify broadcast product/reporting ownership, correct the broadcast compliance channel fixture to `linear_tv`, and document that scheduled broadcast buys should not be modeled as `non_guaranteed` solely because third-party audience measurement settles later.
2 changes: 2 additions & 0 deletions .changeset/clever-tools-check.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
4 changes: 4 additions & 0 deletions .changeset/dependency-impairment-reread-hardening.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

Empty changeset: Harden the `dependency_impairment` / `dependency_impairment_cardinality` storyboards (follow-up to #5675). Declare `list_creatives` in `required_tools` (the re-read steps invoke it, so a seller without it is screened at the applicability layer instead of hard-failing the step); assert each re-read returned the intended creative via `creatives[0].creative_id` (so the cardinality re-reads prove they observed the right creative, not any rejected library entry); and update the capability-gate comment to note that default-`snapshot` sellers (those omitting `propagation_surfaces`) are graded only on `@adcp/sdk >= 9.2.0`, which materializes capability-gate schema defaults (adcp-client#2278).
5 changes: 5 additions & 0 deletions .changeset/fix-hosted-compliance-governance.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"adcontextprotocol": patch
---

Fix hosted compliance auth defaults so static fixture API keys are only inferred for fixture-backed runs, align the async media-buy submitted-state fixture account with the create request, and mark governance-denial storyboards as multi-agent scenarios routed through seller and governance agents.
5 changes: 5 additions & 0 deletions .changeset/get-products-pagination-clarity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"adcontextprotocol": patch
---

Clarify that `get_products` pagination is valid in all buying modes, with `brief` and `refine` pagination bounding returned `products[]` in curated results while `wholesale` pagination walks the product feed. Add conformance coverage for the deterministic wholesale cursor walk without treating brief/refine as exhaustive catalog enumeration.
5 changes: 5 additions & 0 deletions .changeset/registry-feed-stream.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"adcontextprotocol": minor
---

Registry: add `GET /api/registry/feed/stream` as the 3.x Server-Sent Events transport for cursor-based registry feed pages, with heartbeat events while caught up and reconnect recovery through the persisted cursor. `GET /api/registry/feed` responses now include required `freshness` metadata (`generated_at`, `latest_event_created_at`, `lag_seconds`, `retention_days`) so consumers can monitor mirror lag for their selected type filter. Freshness and feed queries are bounded to the 90-day retention window; SDKs should treat the SSE endpoint as the preferred transport and fall back to polling `/api/registry/feed`.
5 changes: 5 additions & 0 deletions .changeset/schema-discovery-stable-pointer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"adcontextprotocol": patch
---

Add stable schema discovery pointers at `/schemas/index.json` and `/schemas/latest.json`, mark prerelease schema directories in root discovery metadata, and keep major/minor schema aliases pointed at stable releases.
5 changes: 5 additions & 0 deletions .changeset/si-storyboard-prose-cleanup.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"adcontextprotocol": patch
---

Apply residual prose cleanups to the `sponsored_context_accountability` storyboard: the `prerequisites.description` second paragraph and the `si_send_message_presentation_accepted` step narrative both still implied dynamic host-echo / different-identity substitution, contradicting the fixed Acme literal fixture the storyboard actually uses. Reword both spots to scope the prose to the static Acme fixture per @bokelley's #5551 review (2026-06-17 13:15 UTC).
2 changes: 2 additions & 0 deletions .changeset/thirty-doodles-retire.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
15 changes: 15 additions & 0 deletions .changeset/tmp-tmpx-macros.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
"adcontextprotocol": patch
---

TMP: provider-scoped TMPX macro trafficking with declared macro names + multi-chunk support. Builds on the `tmpx_providers` map shipped in #5689; reframes the contract to communicate exact macro/value pairs (not provider_id→token strings) and supports values that exceed a single ad-server macro slot.

Provider registrations declare a stable, provider-namespaced list of ad-server macro names in `tmpx_macros` (e.g. `["PIN_TMPX_1", "PIN_TMPX_2"]`) — the names the publisher actually trafficks in GAM / VAST URLs / DOOH play logs. The identity-agent response emits `tmpx_macros[]` as ordered `{name, value}` pairs filling those slots. The router merges per-provider into `tmpx_providers: { provider_id: { macros: [{name, value}] } }` on the response so the publisher walks each provider's pairs and substitutes each `value` verbatim into the slot named by `name`. Multi-chunk values are capped at 2 per provider in v1; the cap MAY rise without a shape change. Macro names MUST NOT be derived from `provider_id` at runtime — trafficking is configured against the registered names ahead of time.

**Breaking change to an experimental surface (sanctioned by `x-status: experimental`)**: `tmpx_providers` was introduced in #5689 as `Map<provider_id, string>` (opaque token per provider). It is reshaped here to `Map<provider_id, {macros: [TmpxMacro]}>`. Consumers that adopted the v1 shape between #5689 and this change MUST migrate to read each provider's `macros[*].value` rather than a single string. The legacy singular `tmpx` field remains supported through 3.x (removed in 4.0).

**Experimental notice window.** `docs/reference/experimental-status.mdx` recommends ~6 weeks of published notice before a breaking change to an experimental surface. `tmpx_providers` shipped in #5689 days ago, so the literal 6-week window can't apply here; in practice nobody could have adopted a field that didn't exist 6 weeks ago, so the risk is bounded. Adopters of the v1 shape (if any) should consult this changeset's migration sketch and pin to the latest schema release before deploying.

**Dual-shape alias waiver.** The experimental policy asks for an alias accepting both the old (`Map<provider_id, string>`) and new (`Map<provider_id, {macros: [TmpxMacro]}>`) forms "where feasible" — typically via a `oneOf` on `additionalProperties` during transition. Skipped here because the v1 shape is hours old and the surface is `x-status: experimental`; the dual-shape carrying cost (validator complexity, ambiguous consumer code paths, perpetual deprecation tail) outweighs the migration cost for a window where the field had no realistic adopters. Routers that want belt-and-suspenders compatibility for any caller that did read the v1 shape MAY mirror one provider's first-slot `value` into the deprecated singular `tmpx` field; that path is already specified.

Schema updates: `tmp/provider-registration.json` adds `tmpx_macros`; `tmp/identity-match-response.json` adds `tmpx_macros` (provider-side) and reshapes `tmpx_providers` (router-merged), plus a shared `TmpxMacro` definition. Spec narrative: IdentityMatchResponse and Provider Registration field tables surface the new fields and the reshape; `§Inventory-specific behavior` walks the per-macro substitution flow; `§Identity Match fan-out` in router-architecture.mdx gets a rewritten normative TMPX-collection paragraph.
5 changes: 5 additions & 0 deletions .changeset/tmp-tmpx-providers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"adcontextprotocol": minor
---

TMP: introduce `tmpx_providers` on IdentityMatchResponse so the router preserves per-provider TMPX attribution across fan-out. The router collects one TMPX token per identity provider that emitted one and exposes them as a `provider_id` → token map; the publisher trafficks `{TMPX_<provider_id>}` in their ad server (GAM key-value, VAST URL macro, DOOH play-log field) and substitutes each value verbatim. `provider_id` in `provider-registration.json` gains a charset constraint (`^[A-Za-z0-9_]+$`, max 64) so the synthesized macro name is always a legal ad-server token without further encoding. The legacy single-token `tmpx` field is deprecated (still emitted by routers as a transitional convenience for consumers that haven't migrated; removed in 4.0). Router-architecture.mdx §"Identity Match fan-out" gains a normative `TMPX collection` paragraph that MUSTs the map on multi-provider fan-outs and forbids collapsing per-provider tokens into a single string. Schema `tmp/identity-match-response.json` adds the new field; the IdentityMatchResponse and Provider Registration field tables in specification.mdx surface the new shape and the macro-trafficking model. Provider-declared macro names plus multi-chunk TMPX values are tracked as a follow-up gated on routers actually hitting the 255-char macro budget in production.
5 changes: 5 additions & 0 deletions .changeset/trusted-match-schema-namespace.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"adcontextprotocol": patch
---

Rename the canonical Trusted Match schema source directory from `tmp` to `trusted-match`, update registry references and examples to the self-describing path, and add schema discovery metadata for protocol layers plus prerelease supersession. Hosted schema routing keeps legacy `/schemas/{version}/tmp/...` URLs working by falling back to the canonical `trusted-match` files when a historical `tmp` artifact is not present.
4 changes: 4 additions & 0 deletions .changeset/video-asset-dimension-rationale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

Empty changeset: Document the rationale for the dimension-policy difference between the hosted `video` asset (width/height required — a file has intrinsic native pixel dimensions) and the `vast` asset (no width/height — renditions are resolved per-`MediaFile` at serve time). Description and `$comment` only; no schema-shape or required-field changes.
29 changes: 0 additions & 29 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,34 +1,5 @@
# Changelog

## 3.2.0

### Minor Changes

- c26cf88: Registry: add `GET /api/registry/feed/stream` as the 3.x Server-Sent Events transport for cursor-based registry feed pages, with heartbeat events while caught up and reconnect recovery through the persisted cursor. `GET /api/registry/feed` responses now include required `freshness` metadata (`generated_at`, `latest_event_created_at`, `lag_seconds`, `retention_days`) so consumers can monitor mirror lag for their selected type filter. Freshness and feed queries are bounded to the 90-day retention window; SDKs should treat the SSE endpoint as the preferred transport and fall back to polling `/api/registry/feed`.
- 96a8c1d: TMP: introduce `tmpx_providers` on IdentityMatchResponse so the router preserves per-provider TMPX attribution across fan-out. The router collects one TMPX token per identity provider that emitted one and exposes them as a `provider_id` → token map; the publisher trafficks `{TMPX_<provider_id>}` in their ad server (GAM key-value, VAST URL macro, DOOH play-log field) and substitutes each value verbatim. `provider_id` in `provider-registration.json` gains a charset constraint (`^[A-Za-z0-9_]+$`, max 64) so the synthesized macro name is always a legal ad-server token without further encoding. The legacy single-token `tmpx` field is deprecated (still emitted by routers as a transitional convenience for consumers that haven't migrated; removed in 4.0). Router-architecture.mdx §"Identity Match fan-out" gains a normative `TMPX collection` paragraph that MUSTs the map on multi-provider fan-outs and forbids collapsing per-provider tokens into a single string. Schema `tmp/identity-match-response.json` adds the new field; the IdentityMatchResponse and Provider Registration field tables in specification.mdx surface the new shape and the macro-trafficking model. Provider-declared macro names plus multi-chunk TMPX values are tracked as a follow-up gated on routers actually hitting the 255-char macro budget in production.

### Patch Changes

- 6f9bdff: Add `media_buy.governance_aware` capability to `get-adcp-capabilities-response` and gate the `governance_denied` / `governance_denied_recovery` storyboards on it, so sellers without outbound governance consultation grade `not_applicable` instead of false-failing on a `GOVERNANCE_DENIED` they cannot produce. Addresses #5665 (Option A).
- 654fcfe: Clarify broadcast product/reporting ownership, correct the broadcast compliance channel fixture to `linear_tv`, and document that scheduled broadcast buys should not be modeled as `non_guaranteed` solely because third-party audience measurement settles later.
- ba72da7: Fix hosted compliance auth defaults so static fixture API keys are only inferred for fixture-backed runs, align the async media-buy submitted-state fixture account with the create request, and mark governance-denial storyboards as multi-agent scenarios routed through seller and governance agents.
- c48c057: Clarify that `get_products` pagination is valid in all buying modes, with `brief` and `refine` pagination bounding returned `products[]` in curated results while `wholesale` pagination walks the product feed. Add conformance coverage for the deterministic wholesale cursor walk without treating brief/refine as exhaustive catalog enumeration.
- d3f1af9: Add stable schema discovery pointers at `/schemas/index.json` and `/schemas/latest.json`, mark prerelease schema directories in root discovery metadata, and keep major/minor schema aliases pointed at stable releases.
- 81496a5: Apply residual prose cleanups to the `sponsored_context_accountability` storyboard: the `prerequisites.description` second paragraph and the `si_send_message_presentation_accepted` step narrative both still implied dynamic host-echo / different-identity substitution, contradicting the fixed Acme literal fixture the storyboard actually uses. Reword both spots to scope the prose to the static Acme fixture per @bokelley's #5551 review (2026-06-17 13:15 UTC).
- 7c237fc: TMP: provider-scoped TMPX macro trafficking with declared macro names + multi-chunk support. Builds on the `tmpx_providers` map shipped in #5689; reframes the contract to communicate exact macro/value pairs (not provider_id→token strings) and supports values that exceed a single ad-server macro slot.

Provider registrations declare a stable, provider-namespaced list of ad-server macro names in `tmpx_macros` (e.g. `["PIN_TMPX_1", "PIN_TMPX_2"]`) — the names the publisher actually trafficks in GAM / VAST URLs / DOOH play logs. The identity-agent response emits `tmpx_macros[]` as ordered `{name, value}` pairs filling those slots. The router merges per-provider into `tmpx_providers: { provider_id: { macros: [{name, value}] } }` on the response so the publisher walks each provider's pairs and substitutes each `value` verbatim into the slot named by `name`. Multi-chunk values are capped at 2 per provider in v1; the cap MAY rise without a shape change. Macro names MUST NOT be derived from `provider_id` at runtime — trafficking is configured against the registered names ahead of time.

**Breaking change to an experimental surface (sanctioned by `x-status: experimental`)**: `tmpx_providers` was introduced in #5689 as `Map<provider_id, string>` (opaque token per provider). It is reshaped here to `Map<provider_id, {macros: [TmpxMacro]}>`. Consumers that adopted the v1 shape between #5689 and this change MUST migrate to read each provider's `macros[*].value` rather than a single string. The legacy singular `tmpx` field remains supported through 3.x (removed in 4.0).

**Experimental notice window.** `docs/reference/experimental-status.mdx` recommends ~6 weeks of published notice before a breaking change to an experimental surface. `tmpx_providers` shipped in #5689 days ago, so the literal 6-week window can't apply here; in practice nobody could have adopted a field that didn't exist 6 weeks ago, so the risk is bounded. Adopters of the v1 shape (if any) should consult this changeset's migration sketch and pin to the latest schema release before deploying.

**Dual-shape alias waiver.** The experimental policy asks for an alias accepting both the old (`Map<provider_id, string>`) and new (`Map<provider_id, {macros: [TmpxMacro]}>`) forms "where feasible" — typically via a `oneOf` on `additionalProperties` during transition. Skipped here because the v1 shape is hours old and the surface is `x-status: experimental`; the dual-shape carrying cost (validator complexity, ambiguous consumer code paths, perpetual deprecation tail) outweighs the migration cost for a window where the field had no realistic adopters. Routers that want belt-and-suspenders compatibility for any caller that did read the v1 shape MAY mirror one provider's first-slot `value` into the deprecated singular `tmpx` field; that path is already specified.

Schema updates: `tmp/provider-registration.json` adds `tmpx_macros`; `tmp/identity-match-response.json` adds `tmpx_macros` (provider-side) and reshapes `tmpx_providers` (router-merged), plus a shared `TmpxMacro` definition. Spec narrative: IdentityMatchResponse and Provider Registration field tables surface the new fields and the reshape; `§Inventory-specific behavior` walks the per-macro substitution flow; `§Identity Match fan-out` in router-architecture.mdx gets a rewritten normative TMPX-collection paragraph.

- e8c21cc: Rename the canonical Trusted Match schema source directory from `tmp` to `trusted-match`, update registry references and examples to the self-describing path, and add schema discovery metadata for protocol layers plus prerelease supersession. Hosted schema routing keeps legacy `/schemas/{version}/tmp/...` URLs working by falling back to the canonical `trusted-match` files when a historical `tmp` artifact is not present.

## 3.1.0

### Minor Changes
Expand Down
Loading
Loading