Version Packages (beta) - #5785
Conversation
There was a problem hiding this comment.
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.
a3a515c to
3beeb2b
Compare
There was a problem hiding this comment.
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.
ec9b67b to
2591f70
Compare
9a1e0dc to
a1fdf48
Compare
7fa4acb to
6673531
Compare
|
Release gate: do not merge this stable |
6465df7 to
e050b0e
Compare
309080e to
ed40377
Compare
8f83b8e to
f254256
Compare
f254256 to
816e744
Compare
816e744 to
71370b8
Compare
71370b8 to
b0c17da
Compare
b0c17da to
c92c195
Compare
c92c195 to
5438a9b
Compare
cbbf626 to
e24a6bc
Compare
e24a6bc to
7611181
Compare
7611181 to
0bddea5
Compare
9fbde59 to
9780946
Compare
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.
mainis currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, runchangeset pre exitonmain.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-levelsupported_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 declarepixel_ratio; and image slots may userequired_pixel_ratiosto 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 parameterizeddisplay_imagetemplate withformat_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
GetProductsRejectedbusiness-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 throughforce_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_OPTIONandINVALID_USAGE_DATAstandard error codes used byreport_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_urlis 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
biddingblock 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_idbrand-side provenance pointer and clarify how it joins a configured voice toget_rights,acquire_rights, and transformer provenance without creating a build-time authorization gate.4cdebb9: Allow
nullfor 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 returningnullis the correct "not applicable" signal. The schema previously requiredtype: "number"/type: "object"and rejectednull, causing receivers to fail validation on every valid display-inventory delivery report.delivery-metrics.json(totals/by_package[]) now accepts["number", "null"]forcompletion_rateand["object", "null"]forquartile_data;get-media-buy-delivery-response.jsonaggregated_totals.completion_rategets the same loosening so the aggregate path can't re-trigger the failure. Theminimum/maximumconstraints oncompletion_ratestill 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, notnull— 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_rateinreport-plan-outcome-request.json(a governance self-report block, not on theget_media_buy_deliverypath) 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_idcorrelation to webhook activity, registerwindow_updateconsistently, 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_claimandverify_brand_claims. A verifier can now report a cryptographically valid but unbound response asuntrustedthrough the newbrand-response-authorization-resultschema 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_identries and explicitoperationsthroughget_adcp_capabilities;build_creativeandlist_transformersselect 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 absentoperationsasbuild.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 onProduct.format_options[], publishers declare acceptance inadagents.json.formats[], and portable creative manifests continue to carryformat_kindplus an optionalformat_option_refrather than agent-local capability identity. Add normative multi-placement eligibility guidance and reusable canonical classification vectors.Make publisher catalog freshness observable:
publisher.adagents_changednow covers semantic changes in every top-leveladagents.jsonfield, including formats-only and placements-only revisions, and new events populatechanged_fieldsplus format and placement counts. Clarify that the registry publisher lookup—not the origin-onlyvalidateAdAgents()path—provides the community-catalog fallback and its provenance.316d55d: Add
sample_render_urlto 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.changednotifications for cachedget_adcp_capabilitiesresponses, plus account-anchoredaccount.status_changednotifications 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, whileadcp.governance_enforcementadvertises the enforcement modes and covered tasks.Tighten the experimental authorization boundary: buyer intent checks use
plan_id, approved decisions alone issuegovernance_context, downstream services treat that context as the opaque plan binding, and media-buy online execution enforcement follows prepare → check → commit.conditionsis 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.credentialsfield 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-frequencywithweekly,quarterly, andpost_campaignto 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_typestolist_creatives, addziptoAssetContentType, 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_tvandai_assistant.39ef6da: Require AdCP 3.2 producers to emit integer
error.retry_afterseconds 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_excludeto 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). Mirrorscollection_list_excludeand reusesproperty-list-ref.json. Exclude wins on overlap withproperty_listand applies regardless of the product'sproperty_targeting_allowedflag. Sellers declare support via the property/collection list entries in theget_adcp_capabilitiestargeting table.9288de4: Standardize property-list change notifications on the RFC 9421 webhook profile. Keep the undefined legacy body-level
signaturefield 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 requestSignatureandContent-Digestbinary 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_sharepricing option applies a decimalcommission_rateto settledcommissionable_value. Product discovery can filter fixed, auction, and contingent pricing independently; delivery andreport_usageexpose 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 exactformat_idsfields in AdCP 3.2 ahead of their removal in AdCP 4.0.0b5a576: Extract
enums/delivery-status.jsonand$refit fromget-media-buys-response.json,get-media-buy-delivery-response.json, andmedia-buy-delivery-webhook-result.json. These three schemas previously inlineddelivery_statusindependently: theget_media_buyssnapshot path had 6 values (includingnot_delivering), while the delivery report and webhook paths only had 5. A buyer pollingget_media_buy_deliveryor receiving a delivery webhook had no way to observenot_deliveringeven 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.jsonstopped at 4.2, so a buyer trafficking a 4.3 tag had to declare a version the document does not carry.vast_versionmirrors theversionattribute 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.jsonandformats/canonical/video_vast.json) now$refthe shared enum, per the Enum Consolidation rule indocs/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 onecache_scopecannot short-circuit (unchanged: true) a request the agent resolves to another. The reference training agent advertiseswholesale_feed_versioning.cache_scope_account: trueyet keys conditional fetch on a scope-independent token, so it would silently answerunchangedacross scopes — exactly the gap reported in Conformance: wholesale conditional-fetch has no cache_scope-isolation storyboard — global-token implementations pass the suite #5739.signals/get-signals-response.jsonandmedia-buy/get-products-response.json: add a normative cross-scope MUST-NOT to theunchangeddescription, scoped to the conditional-fetch comparator (it MUST key on(cache_scope, wholesale_feed_version), not the token alone).wholesale-feed-signals-scope-isolationandwholesale-feed-products-scope-isolation, gated onwholesale_feed_versioning.cache_scope_account: true; agents without per-account overlays gradenot_applicable.unchangedpath 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_domainfilter fromget_productsbefore the next minor release. The filter was not patch-eligible for the stable 3.1.x line, and its implementation incorrectly accepted the pluralpublisher_domains[]form that product schemas reject.Patch Changes
a2e7888: Add audience dependency-impairment conformance coverage and clarify
list_accountsas 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_actionsscenario uses a non-guaranteed product fixture sosales-non-guaranteed-only sellers can run it.available_actions.yamlseeded a guaranteed-only product, so itscreate_buy_from_productstep (and the whole available-actions enforcement flow that follows) failed with a terminalDELIVERY_MODE_NOT_SUPPORTEDfor sellers that declare onlyspecialisms: ["sales-non-guaranteed"]. Theallowed_actionsbehavior the scenario actually grades is delivery-type-agnostic, so the fixture is switched tonon_guaranteed(floor-priced) — the same fix applied to the basemedia_buy_sellerflow. The packageddist/compliance/cache is generated from this source.918c073: Runner output contract: document the branch-set
any_ofpeer cascade exemption.cascade_rulesnow names abranch_set_cascade_exemption(parallel tosole_stateful_step_exemption) stating that a stateful peer's genuine failure orpeer_branch_takenskip MUST NOT cascadeprerequisite_failedonto a sibling phase sharing the samebranch_set.idunderany_ofsemantics — the peers are mutually-exclusive alternatives, not a dependency chain. The exemption is scoped toany_of, is N-ary-safe (any number of peers), leaves cross-set and within-phase cascade unchanged, and is explicitlydepends_on-agnostic (it fires whether the sibling's dependency is the implicit default or an explicitdepends_onnaming the peer).storyboard-schema.yaml'sdepends_onsection 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/.amountby feetypeincancellation-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, butcancellation_feelisted only["type"]inrequired[]. 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/thenconditionals:percent_remainingrequiresrate,fixed_feerequiresamount;full_commitmentandnoneare unaffected. No prose change — this aligns the schema with the already-documented contract, and no existing example regresses (both doc examples already carryrate). Regression coverage added totests/composed-schema-validation.test.cjs.eac2f7a: Emit canonical version-qualified HTTPS
$idand external$refvalues in published schema artifacts so locally loaded schemas resolve references consistently.f672367: Add the
capabilities_response_schema_invalidcanonical notice code and acapability_pointer(RFC 6901) optional notice field to the runner output contract, so a schema-invalidget_adcp_capabilitiesresponse 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_inputmanifest preflight andsync_creativesdry-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_creativesremains the creative-library query task; v1format_id/format_ids[]remain supported through 4.x. Compliance storyboard steps that calllist_creative_formatsare gated withrequires_tool, producing an explicit non-failingmissing_toolskip when the canonical discovery branch passes.da3954f: Deprecate the legacy
list_creative_formatspricing request fields through 3.x and direct transformation and generation pricing discovery tolist_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, andsync_plansdocumented 13errors[].codevalues that do not exist inenums/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 validateerrors[].codeagainst the published enum reject responses built from the docs literally, the same failure mode as docs(error):FORMAT_INCOMPATIBLEreferenced 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_FAILEDis replaced with guidance that generation-pipeline failures surface as task-level failure with the most specific applicable canonical code, per the open-vocabulary rule onerror-code.json. Also fixes the one liveINVALID_FORMATemission 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 hardcodedcapability_id: "training_image_generation"assertion (capability_id is agent-local; any valid value must pass) and thefield_absentcheck onsupported_formats[1](agents may advertise multiple canonical formats). Fixescontext_outputsfield name fromkey:toname:.evaluator_auth: addsrequires_capabilityguards to all five optional phases so agents that correctly declarecreative.supports_evaluator: falsereceivenot_applicableinstead of failing the evaluator track. Guards evaluate against the raw capabilities response, bypassing a runner-side boolean-false accumulator bug. Fixescontext_outputsfield name fromkey:toname:.c68d545: Fix a misleading
get_media_buy_deliveryexample that implied buyers can look up delivery by their own reference.media_buy_idsare seller-assigned; the top-levelbuyer_reffield was removed in 3.0.0. The example is retitled "Correlating Your Own Reference", uses seller-assignedmb_...IDs, and adds a note pointing buyers to reconcile their own reference viacontextechoed oncreate_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_creativesresponse rows to use either the legacyformat_ididentity or the AdCP 3.1 canonicalformat_kindand optionalformat_option_refidentity.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_afterfield 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_signalnow documentsgovernance_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 ownsync_plans.962acc2: Correct the
video_16x9_30slegacy canonical mapping to retain16:9as 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_buysubmitted-arm compliance storyboard on the seller advertisingforce_create_media_buy_armundercompliance_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_approvaland 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_applicablewith the newcanonical
fixture_unavailableskip 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/sdk13.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 | undefinedtype 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_lifecycleblock torunner-output-contract.yaml(per theConformance 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_SUPPORTEDresponses from being graded as failures against the narrowerBILLING_NOT_PERMITTED_FOR_AGENTcontract.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) carrytmpx_chunks: [{slot_id, value}]. Router-to-publisher responses (identity-match-response.json) reshapetmpx_providers[provider_id]to{ chunks: [{slot_id, value}] }, preserving the emitting provider's slot IDs and order. Chunks share a single definition — the newtrusted-match/tmpx-chunk.jsonschema —$refd from both hops. Both hop schemas add explicit negative constraints (not: {anyOf: […]}) that reject the other hop's fields (tmpx_providers/tmpxon the provider hop;tmpx_chunkson the publisher hop) and envelope-extension fields (context,ext) that would leak across the identity privacy boundary. Both maps carrypropertyNamesconstraints matching theprovider_idcharset (andslot_idcharset on inner maps), so the wire cannot carry map keys outside the registered form.Publisher-owned config.
publisher-tmpx-config.jsoncaptures the publisher-owned deployment configuration astmpx_macro_mapping: { provider_id: { slot_id: destination } }. The publisher's adapter readstmpx_providers[provider_id].chunks[]from the response and, for each chunk, substituteschunk.valueintotmpx_macro_mapping[provider_id][chunk.slot_id]. Publishers use registeredtmpx_slotsto validate the mapping at startup and to detect provider slot-contract drift before serve time. When a response carries aslot_id(or wholeprovider_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(seedocs/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_slotson their registration (opaque provider-local IDs; drop the previoustmpx_macroslist if adopted). Providers emittmpx_chunks: [{slot_id, value}]on their identity-match response (previouslytmpx_macros[{name,value}]ortmpx_values[value]). Routers producetmpx_providers[provider_id].chunks[{slot_id, value}](previously.macros[{name,value}]or.values[value]). Publishers configuretmpx_macro_mapping[provider_id][slot_id] = destination(a slot-keyed map, previously an ordered array). The legacy singulartmpxfield 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.cjsadds 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_idcharset violations on both maps, and duplicate slot IDs ontmpx_slots.Router slot-contract enforcement. The router MUST validate each provider's registered slot contract before forwarding: if the provider has no
tmpx_slotsregistration, or if the returnedslot_idsequence 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_metricsreports 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.