Skip to content

Version Packages (beta) - #5785

Draft
aao-release-bot[bot] wants to merge 1 commit into
mainfrom
changeset-release/main
Draft

Version Packages (beta)#5785
aao-release-bot[bot] wants to merge 1 commit into
mainfrom
changeset-release/main

Conversation

@aao-release-bot

@aao-release-bot aao-release-bot Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

main is currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, run changeset pre exit on main.

⚠️⚠️⚠️⚠️⚠️⚠️

Releases

adcontextprotocol@3.2.0-beta.0

Minor Changes

  • 5638ce3: Add basis-aware age targeting without weakening the canonical age predicate. Buyers can constrain demographics.age.accepted_bases, products declare user-level supported_bases, and package readback records effective applied bases and verification methods. Age compliance continues to override demographic permissions, and World ID threshold claims must entail the requested age predicate. This new capability should be reflected in future media-buy certification coverage.

  • 48ccce9: Add immutable product audience evidence, buyer-authored admissibility and ranking requirements, seller capability discovery, digest-pinned package readback, portable attestation evaluation, and conformance vectors for AdCP 3.2.

  • 1c8d320: Add deterministic brand.json locale fallback and whole-array localization for tone and asset metadata.

  • b07891e: Add pixel-density and rendition-set support for 3.2 canonical images. Canonical image declarations now separate logical render dimensions from accepted intrinsic pixel_ratios; image assets may declare pixel_ratio; and image slots may use required_pixel_ratios to require coverage such as 1x plus 2x while leaving 1.5x optional. Top-level and slot density sets combine by intersection for both singular assets and rendition arrays. SDK inference, ambiguity, intersection, rendition coverage, and v2-narrows-v1 comparison are pinned by shared positive and negative vectors. The unversioned legacy reference catalog gains distinct 2x-only and paired 1x-plus-2x compatibility IDs that become discoverable across 3.x when deployed; their density and coverage annotations are forward-projection metadata for 3.2-aware SDKs, not pre-3.2 canonical semantics. New integrations use the 3.2 parameterized display_image template with format_id.pixel_ratio, and the v1-to-v2 registry exposes machine-readable rules that preserve its dimensions and density during SDK projection.

  • cac7e69: Add a structured GetProductsRejected business-outcome arm for sellers that understand a well-formed brief or refinement but deliberately decline it. Define transport-success and mutual-exclusion semantics, expose deterministic conformance coverage through force_get_products_arm, and keep no-match, incomplete, async, and technical-failure outcomes distinct.

  • fa8c262: Add compact, self-contained JSON Schema 2020-12 input and output artifacts for MCP 2026-07-28 tool discovery.

  • 6468688: Add the INVALID_PRICING_OPTION and INVALID_USAGE_DATA standard error codes used by report_usage, with canonical descriptions and recovery metadata. Align the shared pricing-option example and clarify that idempotent replays return the original response without emitting a duplicate-request advisory.

  • 71953f8: Add a materialized creative-localization contract with source-only or source-plus-target variants, a shared cross-protocol BCP 47 language-tag primitive with an explicit AdCP wire profile, contextual text/markdown language conformance, strict RFC 4647 Lookup over externally supplied delivery preferences, explicit language-family fallback rules, default and unmatched-locale behavior, creative-wide review, transactional replacement, exact request-to-sync-to-list identity, per-item fail-closed readback, localized delivery attribution, and seller-enforced product-format locale policies using RFC 4647 Basic Filtering. Document the separate architecture patterns for authoritative agent input declarations, observable response-language selection, whole-value published content maps, and executable creative so later surfaces reuse language semantics without copying creative topology. Translation and generation remain separate creative-production operations.

  • b2fc579: Add the AdCP 3.2 OAuth capability declaration and capability-gated universal compliance storyboard for RFC 9728/RFC 8414 discovery consistency, backed by a credential-free, SSRF-bounded runner contract and deterministic metadata-graph vectors.

  • 48ccce9: Add reference-first portable attestation schemas, evaluator capability discovery, normative resolution and verification rules, and conformance vectors for AdCP 3.2.

  • 3934dda: Add buyer-opt-in asynchronous rendering to preview_creative while retaining synchronous default behavior; build_creative's existing async contract is unchanged.

  • 6307ff1: Add optional audio loudness constraints and document canonical file-based radio :15, :30, and :60 creative contracts, including industry identifiers and the absence of VAST or tracker semantics.

  • 487df50: Add issuer-bound rights-grant attestations for AdCP 3.2. Rights constraints now carry digest-pinned portable attestation references, sellers advertise and return verifier-of-record evaluations, and the legacy buyer-controlled verification_url is explicitly non-authoritative and never fetched for authorization.

  • 48ccce9: Add portable runtime signal-quality attestations to check_governance, including action-specific capability policy, normalized evaluation results, signed-context binding, audit readback, and conformance vectors.

  • 19fd2d5: Add seller-optimized shared budgets and explicit bidding policy placement across media-buy packages. Media buys and proposals can delegate cross-package allocation to the seller under an aggregate budget, optimization goals, pacing, package caps, and soft minimum-spend targets, while preserving fixed package budgets as the default. A new media-buy/package bidding block separates objective functions from automatic bidding, manual bids, auction ceilings, average-cost controls, and ROAS controls, with complete-block inheritance and authored-scope-preserving readback. Media-buy outcome controls bind to allocation goals in seller-optimized mode and compatible package goals in fixed mode; package controls bind to package goals. All canonical monetary fields use one media-buy currency, ROAS event sources declare supported value currencies, and structured capabilities advertise support by scope, allocation context, mode, strength, and combination.

  • 1656819: Add optional storyboard coverage for search_brands, get_creative_features, and get_media_buy_artifacts without gating agents that do not advertise the experimental tasks.

  • 1eb51fe: Add the optional voice_synthesis.rights_offering_id brand-side provenance pointer and clarify how it joins a configured voice to get_rights, acquire_rights, and transformer provenance without creating a build-time authorization gate.

  • 4cdebb9: Allow null for video-only delivery metrics (quartile_data, completion_rate). Sellers running non-video inventory (display, audio-only, DOOH-without-video) legitimately have no value for these metrics, and returning null is the correct "not applicable" signal. The schema previously required type: "number" / type: "object" and rejected null, causing receivers to fail validation on every valid display-inventory delivery report.

    delivery-metrics.json (totals / by_package[]) now accepts ["number", "null"] for completion_rate and ["object", "null"] for quartile_data; get-media-buy-delivery-response.json aggregated_totals.completion_rate gets the same loosening so the aggregate path can't re-trigger the failure. The minimum/maximum constraints on completion_rate still apply to non-null values, and the type stays narrowed to null (no strings/arrays). Every other delivery metric continues to signal "not applicable" by omission, not null — this exception is scoped to the two video-only fields. Spec-loosening for the receiver contract: producers already sending numbers/objects remain valid.

    The separate inline completion_rate in report-plan-outcome-request.json (a governance self-report block, not on the get_media_buy_delivery path) is intentionally left unchanged.

  • 7213f46: Define the snapshot/log contract as authoritative current-state convergence for state notifications and capability-scoped data parity for delivery notifications. Add optional, migration-safe notification_id correlation to webhook activity, register window_update consistently, and document exact repair keys and recovery procedures across current push/read pairs.

  • fb744bd: Add the 3.2 advisory brand-authorization binding for verify_brand_claim and verify_brand_claims. A verifier can now report a cryptographically valid but unbound response as untrusted through the new brand-response-authorization-result schema instead of treating the brand-agent's assertion or rejection as authoritative.

    The security and task docs define the advisory lookup, canonical agent-URL matching, authorized-JWKS scoping, batch deduplication, and safe failure behavior. Conformance vectors plus an executable reference evaluator cover authorized, unavailable, ambiguous, wrong-agent, wrong-key, and forged rejection cases. Mandatory cryptographic brand authorization and hard rejection remain deferred to 4.0.

  • f36f565: Make canonical creative formats the AdCP 3.2 authoring and discovery path. Creative agents now advertise stable creative.supported_formats[].capability_id entries and explicit operations through get_adcp_capabilities; build_creative and list_transformers select those capabilities with string IDs; and the registry supports reverse discovery by canonical format, publisher format option, and creative operation. Consumers retain 3.x compatibility with catalog entries that omit either new routing field, treating absent operations as build.

    Deprecate list_creative_formats, compound named format IDs, and format-attached transformer I/O throughout the schemas and current documentation while retaining explicit 3.x compatibility branches. Sales agents declare deliverability on Product.format_options[], publishers declare acceptance in adagents.json.formats[], and portable creative manifests continue to carry format_kind plus an optional format_option_ref rather than agent-local capability identity. Add normative multi-placement eligibility guidance and reusable canonical classification vectors.

    Make publisher catalog freshness observable: publisher.adagents_changed now covers semantic changes in every top-level adagents.json field, including formats-only and placements-only revisions, and new events populate changed_fields plus format and placement counts. Clarify that the registry publisher lookup—not the origin-only validateAdAgents() path—provides the community-catalog fallback and its provenance.

  • 316d55d: Add sample_render_url to canonical format declarations and registry summaries so publisher catalogs retain a human-facing preview path without a creative agent owning the format. Define declaration-scoped authority and safe consumer behavior without implying buyer-asset rendering, validation, creative approval, publisher acceptance, or live-delivery fidelity.

  • 5bf55d3: Add agent-level capabilities.changed notifications for cached get_adcp_capabilities responses, plus account-anchored account.status_changed notifications for durable account lifecycle changes. Includes freshness metadata, registration schemas, webhook payload documentation, and read-side account webhook activity.

  • 3f1bfeb: Define governance enforcement as a cross-role core capability. Consequential request schemas now declare x-governed-commitment, while adcp.governance_enforcement advertises the enforcement modes and covered tasks.

    Tighten the experimental authorization boundary: buyer intent checks use plan_id, approved decisions alone issue governance_context, downstream services treat that context as the opaque plan binding, and media-buy online execution enforcement follows prepare → check → commit. conditions is now an intent-only counterproposal with a separate non-authorizing consultation handle.

    Harden governance identity and accounting at the same boundary. Authenticated buyer identity controls delegations across the full lifecycle, while the intent's target audience controls seller authorization. Purchase checks may run before a durable media-buy ID exists, must authenticate as that audience, and may narrow but never widen or change the currency of the intent authorization. For media-buy updates, buyers propose a positive-delta ceiling and sellers independently compute and enforce the actual delta from authoritative state. Indirectly priced tasks require an explicit commitment, including amount zero for verified no-cost work. Critical JWS extensions bind the monetary ceiling, exact task, and canonical payload hash so services can verify authorization without reading governance-private state. Outcome reports authenticate as the original buyer, preserve purchase type, settle an opaque action binding once across all lifecycle check IDs, cache identical retries before mutable plan lookup, validate all monetary inputs, and reserve the governance-owned approved budget rather than trusting a buyer-reported amount.

    Publish one cross-language fixture set with JCS payload hashes, decision tables, and 27 byte-exact Ed25519 compact-JWS cases. The cases cover critical markers, audience/caller/task/payload bindings, commitments, time bounds, replay identifiers, signature tampering, and zero-cost authorization using an explicitly test-only public keypair.

    This intentionally changes validation on the experimental campaign-governance schemas in the next minor release; integrations on that experimental surface must update together when adopting 3.2.

  • 9ceac99: Deprecate inline provider credentials in secured artifact access. Signed URLs are now the recommended default for one-off delivery, while credential-free workload identity remains available for established relationships and bounded bearer tokens remain available for origins that require them.

    Document the AdCP 3.2 migration path and require secret-safe handling of legacy credentials, bearer tokens, and complete signed URLs during the compatibility window. The deprecated service_account.credentials field remains schema-valid throughout 3.x and is eligible for removal in 4.0 or later once the six-month notice and full-release-cycle policy gates are satisfied.

  • 133f1f8: Extend reporting-frequency with weekly, quarterly, and post_campaign to match audience-currency publication cadences in measured channels (OOH, radio, print), with guidance that a product's declared cadence gates mid-flight optimization eligibility. Surface the print channel guide in docs navigation.

  • 9c66556: Add CreativeFilters.asset_types to list_creatives, add zip to AssetContentType, define exact OR-within-field and AND-across-fields matching semantics for top-level creative assets, and add focused published-post and HTML5-bundle conformance coverage. Generated SDK types expose these additions only after the matching SDK release is published; pinned consumers must upgrade explicitly.

  • b41666f: Align brand property and verification schemas with the canonical property-type enum, including linear_tv and ai_assistant.

  • 39ef6da: Require AdCP 3.2 producers to emit integer error.retry_after seconds while preserving the released numeric wire type for 3.x compatibility, and define ceiling-before-clamp behavior for clients that encounter legacy fractional values.

  • eb9ce94: Add portable age-targeting intent, product-scoped continuous/bucket/signal execution capabilities, authoritative demographic signal predicates, and lossless exact package readback for AdCP 3.2.

  • e75f12f: Add property_list_exclude to the targeting overlay: a reference to a property list whose properties must not carry the buyer's ads, for brand-safety do-not-run lists (apps and sites). Mirrors collection_list_exclude and reuses property-list-ref.json. Exclude wins on overlap with property_list and applies regardless of the product's property_targeting_allowed flag. Sellers declare support via the property/collection list entries in the get_adcp_capabilities targeting table.

  • 9288de4: Standardize property-list change notifications on the RFC 9421 webhook profile. Keep the undefined legacy body-level signature field as a required, deprecated compatibility marker through 3.x; remove it in 4.0.

  • 0b772e7: Require every AdCP 3.2 request signature on a body-bearing request to cover content-digest, retain legacy digest modes only for 3.0/3.1 compatibility, migrate 3.2 request Signature and Content-Digest binary fields from the legacy Base64URL override to RFC 8941 padded Base64 while keeping webhook v1 on its explicitly routed legacy encoding throughout 3.x, add versioned body-substitution conformance coverage, and reject non-canonical release versions with leading zeros or malformed prerelease suffixes across AdCP version-negotiation surfaces.

    The external signed-request storyboard remains explicitly 3.1-compatible until profile-aware vector selection lands; repository CI provides the 3.2 body-integrity coverage in the interim.

  • 3bdadda: Add contingent revenue-share pricing for affiliate and other outcome-priced media.

    The new revenue_share pricing option applies a decimal commission_rate to settled commissionable_value. Product discovery can filter fixed, auction, and contingent pricing independently; delivery and report_usage expose the commission basis for formula-checked reconciliation.

    Revenue-share packages bind billing to an event source and measurement window, do not use bid_price, and treat package budget as the maximum payable commission.

  • ec02269: Settle TMP router merge behavior for 3.2: Context Match duplicate offers use provider priority with arrival-order tie-breaking, while Identity Match uses an explicit responder-scoped union that preserves silent-ignore privacy semantics.

  • 60f368f: Use stable structural schema titles for generated type names, consistently annotate deprecated fields with deprecated: true, and deprecate exact format_ids fields in AdCP 3.2 ahead of their removal in AdCP 4.0.

  • 0b5a576: Extract enums/delivery-status.json and $ref it from get-media-buys-response.json, get-media-buy-delivery-response.json, and media-buy-delivery-webhook-result.json. These three schemas previously inlined delivery_status independently: the get_media_buys snapshot path had 6 values (including not_delivering), while the delivery report and webhook paths only had 5. A buyer polling get_media_buy_delivery or receiving a delivery webhook had no way to observe not_delivering even though that is precisely the "zero delivery during flight" signal those paths exist to surface. All three now resolve to the same 6-value enum.

    Fixes delivery_status enum inconsistent across get-media-buys-response, get-media-buy-delivery-response, and webhook schemas #6103.

  • 56c03e9: Add VAST 4.3 to the VAST version enum. IAB Tech Lab released VAST 4.3 in December 2022, but vast-version.json stopped at 4.2, so a buyer trafficking a 4.3 tag had to declare a version the document does not carry. vast_version mirrors the version attribute on a VAST document's root element, and the enum already carries 2.0 and 3.0, so the roster is the published-version list rather than a curated feature set. The two schemas that restated the list inline (core/requirements/vast-asset-requirements.json and formats/canonical/video_vast.json) now $ref the shared enum, per the Enum Consolidation rule in docs/spec-guidelines.md. VAST 4.4 is deliberately excluded: its XSD is annotated "DRAFT for working group discussion" and is not a published specification.

  • 5997d58: signals + media-buy: enforce cache-scope isolation for wholesale-feed conditional fetch

    The schemas already state the wholesale-feed token is keyed by (cache_scope, wholesale_feed_version), but nothing exercised that a token minted under one cache_scope cannot short-circuit (unchanged: true) a request the agent resolves to another. The reference training agent advertises wholesale_feed_versioning.cache_scope_account: true yet keys conditional fetch on a scope-independent token, so it would silently answer unchanged across scopes — exactly the gap reported in Conformance: wholesale conditional-fetch has no cache_scope-isolation storyboard — global-token implementations pass the suite #5739.

    • Schemassignals/get-signals-response.json and media-buy/get-products-response.json: add a normative cross-scope MUST-NOT to the unchanged description, scoped to the conditional-fetch comparator (it MUST key on (cache_scope, wholesale_feed_version), not the token alone).
    • Storyboards — new universal wholesale-feed-signals-scope-isolation and wholesale-feed-products-scope-isolation, gated on wholesale_feed_versioning.cache_scope_account: true; agents without per-account overlays grade not_applicable.
    • Reference agent — scope-key the wholesale feed/pricing tokens so the comparator rejects cross-scope tokens (and the existing same-scope unchanged path still matches).

    Closes Conformance: wholesale conditional-fetch has no cache_scope-isolation storyboard — global-token implementations pass the suite #5739.

  • 81cf467: Withdraw the incorrectly specified publisher_domain filter from get_products before the next minor release. The filter was not patch-eligible for the stable 3.1.x line, and its implementation incorrectly accepted the plural publisher_domains[] form that product schemas reject.

Patch Changes

  • a2e7888: Add audience dependency-impairment conformance coverage and clarify list_accounts as the recommended cold-start recovery read for buyer-declared accounts.

  • e7b8f2f: Add literal v1 canonical mappings for observed duration-, dimension-, and VAST-suffixed legacy format ids, with reference vectors that preserve encoded constraints and fail closed for durationless placements.

  • a72fbd7: Clarify that future brand relationship declarations do not extend trust before their effective time and that omitted declaration timestamps age from a durable first observation.

  • d54e7d8: Autolink machine-resolved error codes and task names in compliance reference docs, with build-failing unknown-symbol checks and reviewed exceptions.

  • 0fe5101: compliance(media-buy): the available_actions scenario uses a non-guaranteed product fixture so sales-non-guaranteed-only sellers can run it.

    available_actions.yaml seeded a guaranteed-only product, so its create_buy_from_product step (and the whole available-actions enforcement flow that follows) failed with a terminal DELIVERY_MODE_NOT_SUPPORTED for sellers that declare only specialisms: ["sales-non-guaranteed"]. The allowed_actions behavior the scenario actually grades is delivery-type-agnostic, so the fixture is switched to non_guaranteed (floor-priced) — the same fix applied to the base media_buy_seller flow. The packaged dist/compliance/ cache is generated from this source.

  • 918c073: Runner output contract: document the branch-set any_of peer cascade exemption. cascade_rules now names a branch_set_cascade_exemption (parallel to sole_stateful_step_exemption) stating that a stateful peer's genuine failure or peer_branch_taken skip MUST NOT cascade prerequisite_failed onto a sibling phase sharing the same branch_set.id under any_of semantics — the peers are mutually-exclusive alternatives, not a dependency chain. The exemption is scoped to any_of, is N-ary-safe (any number of peers), leaves cross-set and within-phase cascade unchanged, and is explicitly depends_on-agnostic (it fires whether the sibling's dependency is the implicit default or an explicit depends_on naming the peer). storyboard-schema.yaml's depends_on section gains a cross-reference. Documents-only; codifies the runner behavior shipped in adcp-client#2306 (closing adcp-client#2305), root-caused in adcp#5337. No schema or wire change.

  • 5a7668c: Enforce cancellation_fee.rate / .amount by fee type in cancellation-policy.json. Both fields are documented as conditionally required — rate "Required when type is 'percent_remaining'", amount "Required when type is 'fixed_fee'" — and the requirement is restated in the pricing-models reference, but cancellation_fee listed only ["type"] in required[]. A validator therefore accepted { "type": "percent_remaining" } (or { "type": "fixed_fee" }) with no fee value at all, leaving a money-path term that declares nothing computable for a buyer accepting the product's cancellation terms.

    Adds if/then conditionals: percent_remaining requires rate, fixed_fee requires amount; full_commitment and none are unaffected. No prose change — this aligns the schema with the already-documented contract, and no existing example regresses (both doc examples already carry rate). Regression coverage added to tests/composed-schema-validation.test.cjs.

  • eac2f7a: Emit canonical version-qualified HTTPS $id and external $ref values in published schema artifacts so locally loaded schemas resolve references consistently.

  • f672367: Add the capabilities_response_schema_invalid canonical notice code and a capability_pointer (RFC 6901) optional notice field to the runner output contract, so a schema-invalid get_adcp_capabilities response is reported once as a root cause ahead of the track results instead of fanning out into unrelated-looking track failures.

  • 4eda22a: Clarify the boundary between validate_input manifest preflight and sync_creatives dry-run trafficking rehearsal.

  • a00cff9: Clarify that 3.1 SDKs preserve pixel-ratio registry metadata without interpreting it, while typed validation, precedence, and error semantics begin in 3.2.

  • 54afa6a: Complete the sponsored-intelligence training tenant with the SDK's native SI platform surface, accountable sponsored-context fixtures, and required storyboard coverage.

  • 6f2172e: Document the 3.2 creative-format discovery deprecation posture and relax conformance so agents that declare equivalent canonical-format discovery are not required to expose list_creative_formats. Buyers MUST NOT assume the v1 discovery tool when canonical discovery is declared. list_creatives remains the creative-library query task; v1 format_id / format_ids[] remain supported through 4.x. Compliance storyboard steps that call list_creative_formats are gated with requires_tool, producing an explicit non-failing missing_tool skip when the canonical discovery branch passes.

  • da3954f: Deprecate the legacy list_creative_formats pricing request fields through 3.x and direct transformation and generation pricing discovery to list_transformers.

  • 266264c: Fail closed during release signing when the current protocol tarball is missing.

  • 19a6447: Move stale active-window dates in compliance fixtures and 3.0 compatibility bundles forward so storyboard runs continue to exercise protocol behavior instead of calendar drift.

  • f38101a: Replace phantom error codes in creative and campaign-governance task docs with canonical enum members. sync_creatives, build_creative, the Creative Protocol specification, check_governance, and sync_plans documented 13 errors[].code values that do not exist in enums/error-code.json (INVALID_FORMAT, ASSET_PROCESSING_FAILED, BRAND_SAFETY_VIOLATION, FORMAT_MISMATCH, CREATIVE_IN_ACTIVE_DELIVERY, ASSET_MISSING, ASSET_INVALID, GENERATION_FAILED, INVALID_MANIFEST, AMBIGUOUS_CHECK_TYPE, SELLER_NOT_RECOGNIZED, INVALID_PLAN, BUDGET_BELOW_COMMITTED). SDKs that validate errors[].code against the published enum reject responses built from the docs literally, the same failure mode as docs(error): FORMAT_INCOMPATIBLE referenced in error table but not defined in error-code.json enum #4852 and docs(spec-guidelines): enum-membership criterion + reconcile sync_catalogs phantom error codes #5307. Each phantom is remapped to the existing code with matching semantics (UNSUPPORTED_FEATURE, VALIDATION_ERROR, CREATIVE_REJECTED, INVALID_STATE, INVALID_REQUEST, PERMISSION_DENIED); GENERATION_FAILED is replaced with guidance that generation-pipeline failures surface as task-level failure with the most specific applicable canonical code, per the open-vocabulary rule on error-code.json. Also fixes the one live INVALID_FORMAT emission in the training-agent reference implementation. Docs and reference implementation only; no wire change.

  • c8f3ba5: Fix false failures in creative compliance storyboards (canonical_supported_formats, evaluator_auth).

    canonical_supported_formats: removes the hardcoded capability_id: "training_image_generation" assertion (capability_id is agent-local; any valid value must pass) and the field_absent check on supported_formats[1] (agents may advertise multiple canonical formats). Fixes context_outputs field name from key: to name:.

    evaluator_auth: adds requires_capability guards to all five optional phases so agents that correctly declare creative.supports_evaluator: false receive not_applicable instead of failing the evaluator track. Guards evaluate against the raw capabilities response, bypassing a runner-side boolean-false accumulator bug. Fixes context_outputs field name from key: to name:.

  • c68d545: Fix a misleading get_media_buy_delivery example that implied buyers can look up delivery by their own reference. media_buy_ids are seller-assigned; the top-level buyer_ref field was removed in 3.0.0. The example is retitled "Correlating Your Own Reference", uses seller-assigned mb_... IDs, and adds a note pointing buyers to reconcile their own reference via context echoed on create_media_buy / get_media_buys.

  • 877bedb: Fix the creative-fate compliance storyboard to build creative assets from the required slots declared by the seller's selected product format. Clarify that runners must resolve context substitutions recursively before sending requests.

  • b1df4a3: Allow list_creatives response rows to use either the legacy format_id identity or the AdCP 3.1 canonical format_kind and optional format_option_ref identity.

  • 55296ef: Remove hard-coded request-signing conformance vector counts from the compliance runner header and request-signing documentation. The guidance now describes the applicable profile and vector directories without totals, so future fixture additions cannot make the prose stale. Comment and documentation text only — no schema, runner logic, or generated artifact is affected.

  • 0a51bac: Align idempotency and rate-limit guidance with the canonical top-level error.retry_after field across schemas, documentation, and compliance storyboards.

  • 82ddfd0: Remove a literal tab character from a comment line in
    static/compliance/source/universal/runner-output-contract.yaml (line 303).
    Tabs cannot start a token in YAML, so strict parsers fail to load the file
    entirely — platform engines consuming the packaged 3.1.4/3.1.5 compliance
    caches could not parse the runner output contract. Comment text unchanged;
    no semantic content changes.

  • a335070: Clarify and enforce governed signal activation: activate_signal now documents governance_context, signal agents fail closed on governed accounts without a valid approval context, and signal governance compliance checks no longer require the signals tenant to own sync_plans.

  • 962acc2: Correct the video_16x9_30s legacy canonical mapping to retain 16:9 as an aspect ratio, guard ratio tokens from pixel misclassification, and publish observed AAO-namespace static-display literals with their declared size constraints.

  • 582b724: Gate the create_media_buy submitted-arm compliance storyboard on the seller advertising force_create_media_buy_arm under compliance_testing.scenarios. Sellers without that sandbox-only forcing capability now skip the whole storyboard before its independent downstream phase can incorrectly fail their otherwise conformant synchronous or provisional media-buy flow.

  • 19599f3: Generate compliance error-code and storyboard documentation from the canonical machine sources, with build-failing drift checks.

  • 24a83c5: Allow governance checks to accept human approval from ext.human_approval and use that approval to clear reallocation-threshold human review.

  • aa99113: Require governance-aware media-buy storyboards to prove approved execution through durable seller readback and governance audit evidence, without requiring a response echo.

  • 298d99c: Grade creative-asset fixture coverage gaps as not_applicable with the new
    canonical fixture_unavailable skip reason instead of failing the seller,
    preflight future directives before intervening side effects, preserve the skip
    as non-failing untested coverage in registry aggregation, require explicit
    text-slot mappings, and add common image fixtures for 970x250,
    300x600, 336x280, and 1080x1920 formats. Storyboards that previously stopped on
    a missing common-size fixture can now execute and produce real behavioral
    signal; valid formats the runner still cannot synthesize no longer count
    against the agent under test.

  • 2eb4526: Migrate the application and training-agent compatibility facade to @adcp/sdk 13.0.0-rc.11.

  • ca0092e: Modernize the package build and release toolchain to Node.js 24 and the native TypeScript 7 compiler while retaining a TypeScript 6 API package for documentation-tool compatibility. Generated declarations now preserve the inferred string | undefined type for the optional storyboard-runner tenant path, and CI exercises the complete canonical test manifest in parallel shards.

  • 348ae53: Preserve withdrawn and unpublished release status when generating file-based schema discovery so exact artifacts remain available without becoming stable alias targets.

  • a81067a: Remove an incidental video-only constraint from the inventory list targeting storyboards so single-channel sellers can exercise the channel-agnostic scenarios.

  • b438eb4: Rewrite the governance-conditions compliance flow around the cross-role authorization contract: conditions now yield only a consultation handle, the adjusted intent must receive approval, seller execution is binary, and committed state plus the plan outcome replace response-echo assertions.

  • b03bb8d: Restore frozen AdCP 3.0 storyboard compatibility with the fail-closed training-agent comply controller sandbox gate.

  • 502b22d: Mark all AdCP v2 schema releases as deprecated in discovery metadata after their end-of-life date while preserving the historical v2 and v2.5 aliases and pinned schema URLs.

  • d6b16c6: compliance: SHOULD-level session-lifecycle guidance for conformance runners

    Adds a session_lifecycle block to runner-output-contract.yaml (per the
    Conformance runner: fresh-transport-per-call session lifecycle causes ~5x step latency and silent 4xx storms against streamable-HTTP sellers #6204 triage): runners SHOULD establish one MCP session per storyboard and
    reuse it across that storyboard's steps, SHOULD close sessions gracefully at
    storyboard end, and SHOULD treat an HTTP 404 on a known-terminated session id
    as terminal rather than retryable. A fresh streamable-HTTP session per call
    spends 4-5 protocol round trips on handshake alone (~5x per-step wall time,
    attributed to the agent under test rather than the runner), and orphaned
    GET-stream reconnects against expired sessions generate silent 4xx volume
    that is easily misread as rate limiting. Guidance only — no wire or schema
    change; the session-per-storyboard implementation lands in adcp-client.

  • ba9d7ad: Skip the per-agent billing permission phases when a seller does not advertise agent billing, preventing capability-level BILLING_NOT_SUPPORTED responses from being graded as failures against the narrower BILLING_NOT_PERMITTED_FOR_AGENT contract.

  • 193e430: Prevent automated release pull request commits from rerunning local pre-commit hooks after release workflow validation.

  • 847b0b2: TMP: publisher-owned TMPX macro mapping with provider-declared slot IDs and split provider→router / router→publisher response schemas.

    Provider slot contract. Providers declare a stable, provider-local slot list on their registration (tmpx_slots: [string] in provider-registration.json), e.g. ["primary","secondary"]. Slot IDs are opaque provider-namespaced tokens, NOT ad-server macro names — distinct providers MAY reuse the same slot_id because publisher lookup is keyed on (provider_id, slot_id). Ordering carries the ordered-prefix invariant: shorter responses emit an ordered prefix of the registered slots and are never shifted or sparse.

    Response schemas. Provider-to-router responses (provider-identity-match-response.json) carry tmpx_chunks: [{slot_id, value}]. Router-to-publisher responses (identity-match-response.json) reshape tmpx_providers[provider_id] to { chunks: [{slot_id, value}] }, preserving the emitting provider's slot IDs and order. Chunks share a single definition — the new trusted-match/tmpx-chunk.json schema — $refd from both hops. Both hop schemas add explicit negative constraints (not: {anyOf: […]}) that reject the other hop's fields (tmpx_providers/tmpx on the provider hop; tmpx_chunks on the publisher hop) and envelope-extension fields (context, ext) that would leak across the identity privacy boundary. Both maps carry propertyNames constraints matching the provider_id charset (and slot_id charset on inner maps), so the wire cannot carry map keys outside the registered form.

    Publisher-owned config. publisher-tmpx-config.json captures the publisher-owned deployment configuration as tmpx_macro_mapping: { provider_id: { slot_id: destination } }. The publisher's adapter reads tmpx_providers[provider_id].chunks[] from the response and, for each chunk, substitutes chunk.value into tmpx_macro_mapping[provider_id][chunk.slot_id]. Publishers use registered tmpx_slots to validate the mapping at startup and to detect provider slot-contract drift before serve time. When a response carries a slot_id (or whole provider_id) the mapping does not cover, the adapter MUST fail closed for that provider on that impression — none of that provider's chunks are fired into the ad-serving path and the adapter logs a configuration error; other providers on the same response are unaffected.

    Security-motivated reshape. Restores the direction described in RFC: Prebid Server TMP integration architecture #2203 by removing publisher-local names from the untrusted-provider boundary, and closes the cross-provider name-hijack surface tracked as Security report moved to private advisory #5945 by construction — the router never accepts destination names from providers.

    Why 3.1.x, not 3.2 — bounded pre-production correction. TMP has no production use yet, and this corrected shape will be in place before any 3.1 TMP production deployment ships. That fact — not the general experimental-surface rule — is the primary justification: the surface exists but has no live consumers to migrate. x-status: experimental (see docs/reference/experimental-status.mdx) is what makes the reshape technically permissible inside 3.x; the pre-production posture is what makes it practically safe. feat(trusted-match): provider-declared TMPX macros + multi-chunk values #5729 shipped the surface being reshaped 26 days ago into 3.1.1–3.1.4, but this changeset does not lean on that as a general precedent — the reshape is bounded to the pre-production window regardless of what came before. The change lives on the single-source schema tree, so it rolls forward into 3.2 automatically with no 3.1.x fork to maintain.

    Migration. Providers declare tmpx_slots on their registration (opaque provider-local IDs; drop the previous tmpx_macros list if adopted). Providers emit tmpx_chunks: [{slot_id, value}] on their identity-match response (previously tmpx_macros[{name,value}] or tmpx_values[value]). Routers produce tmpx_providers[provider_id].chunks[{slot_id, value}] (previously .macros[{name,value}] or .values[value]). Publishers configure tmpx_macro_mapping[provider_id][slot_id] = destination (a slot-keyed map, previously an ordered array). The legacy singular tmpx field remains supported through 3.x (removed in 4.0). Blast radius: the shape being replaced shipped only in 3.1.1–3.1.4 on an experimental field with no production adopters; the earlier working-tree ordinal variant introduced in this PR was never released.

    Test coverage. tests/example-validation-simple.test.cjs adds twenty new fixtures (positive + negative) proving each schema-encoded invariant actually rejects the wrong shape: wrong-hop fields on both hop schemas, legacy carrier fields (tmpx_values, tmpx_macros) on both hops, envelope-extension bleed-through, provider_id/slot_id charset violations on both maps, and duplicate slot IDs on tmpx_slots.

    Router slot-contract enforcement. The router MUST validate each provider's registered slot contract before forwarding: if the provider has no tmpx_slots registration, or if the returned slot_id sequence is not an exact non-empty ordered prefix of the registered list, the router MUST drop that provider's chunks atomically. This covers duplicate, reordered, sparse, and unregistered slot IDs before they reach publisher mappings.

  • 32b0128: Close the metric-accountability loop in the reference seller and conformance suite. Package commitments are seller-stamped and read back, vendor values and deferrals are reconciled per package, and unified missing_metrics reports overdue standard or vendor commitments. Packages without a snapshot fall back to current product reporting capabilities, while metrics not yet measurable in the current window stay out of the gap list.

@aao-release-bot aao-release-bot Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Argus is not auto-reviewing this PR because it is a generated Changesets release PR.

A human release reviewer should verify CI, package/version/changelog changes, and generated dist/** artifacts. Argus will resume on source PRs before the next release PR is generated.

@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch 5 times, most recently from a3a515c to 3beeb2b Compare July 8, 2026 08:40

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Argus is not auto-reviewing this PR because it is a generated Changesets release PR.

A human release reviewer should verify CI, package/version/changelog changes, and generated dist/** artifacts. Argus will resume on source PRs before the next release PR is generated.

@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch 2 times, most recently from ec9b67b to 2591f70 Compare July 13, 2026 13:07
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch 9 times, most recently from 9a1e0dc to a1fdf48 Compare July 20, 2026 11:28
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch 5 times, most recently from 7fa4acb to 6673531 Compare July 21, 2026 20:46
@bokelley

Copy link
Copy Markdown
Contributor

Release gate: do not merge this stable 3.2.0 Version Packages PR yet. The 3.1.x patch pool and v3.1.5 release must land/reconcile first. After that, main must re-enter beta pre-mode so this regenerates as 3.2.0-beta.0; merging the current form would cut stable 3.2 prematurely.

@bokelley
bokelley marked this pull request as draft July 23, 2026 00:07
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch 4 times, most recently from 6465df7 to e050b0e Compare July 24, 2026 20:49
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch 3 times, most recently from 309080e to ed40377 Compare August 3, 2026 10:24
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch 2 times, most recently from 8f83b8e to f254256 Compare August 3, 2026 11:43
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch from f254256 to 816e744 Compare August 3, 2026 12:44
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch from 816e744 to 71370b8 Compare August 3, 2026 16:52
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch from 71370b8 to b0c17da Compare August 6, 2026 13:53
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch from b0c17da to c92c195 Compare August 6, 2026 15:24
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch from c92c195 to 5438a9b Compare August 7, 2026 04:37
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch 2 times, most recently from cbbf626 to e24a6bc Compare August 7, 2026 07:23
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch from e24a6bc to 7611181 Compare August 8, 2026 03:35
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch from 7611181 to 0bddea5 Compare August 8, 2026 04:13
@aao-release-bot
aao-release-bot Bot force-pushed the changeset-release/main branch 2 times, most recently from 9fbde59 to 9780946 Compare August 8, 2026 05:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant