Repository navigation
Version Packages (beta) - #8624
aao-release-bot[bot] wants to merge 1 commit into
Conversation
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
|
HOLD: generated release branch requires human reconciliation/review. Automation is preparing a leased update. The PR must remain Draft. |
408014f to
bb17e36
Compare
|
HOLD: generated release branch requires human reconciliation/review. Automation is preparing a leased update. The PR must remain Draft. |
bb17e36 to
8f52fb4
Compare
|
HOLD: generated release branch requires human reconciliation/review. Automation is preparing a leased update. The PR must remain Draft. |
8f52fb4 to
778cd39
Compare
|
HOLD: generated release branch requires human reconciliation/review. Automation is preparing a leased update. The PR must remain Draft. |
778cd39 to
49fdb40
Compare
|
HOLD: generated release branch requires human reconciliation/review. Automation is preparing a leased update. The PR must remain Draft. |
49fdb40 to
95c99c0
Compare
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and publish to npm yourself or setup this action to publish 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.3.0-beta.3
Minor Changes
30e24b6: Reporting subscriptions (experimental): billing coverage has no unowed stretch, and the flight ends when delivery stops.
stub: true(core/reporting-obligation.json, billing only). This covers account timezone changes on billing offerings, so no billable hour goes unreported. Pacing and analytics feeds still leave the stretch unowed.cancellation_effective_at(experimental), a sibling ofcancellationoncore/media-buy.jsonandget_media_buys, is when delivery stops under the cancellation, later thancanceled_atwhen the seller delivers through a notice period. Sellers advertisingmedia_buy.reporting_subscriptionsMUST populate it, and the coverage rule's stop time uses it instead of the instant the cancellation was recorded.media_buy.reporting_subscriptionsMUST NOT deliver on a buy outside its flight. To deliver later, including a make-good undermakegood_policyremedyadditional_delivery, it first extendsend_time; a canceled or completed buy's make-good goes on a subsequent buy.stub: truerows) and thebilling-cutover-owes-a-stubcase, and readcancellation_effective_at(cancellation-notice-period-is-owed-through-the-delivery-stop).sync_accountsreporting_delivery_configs) follow the same rules: a new generation or an account timezone change is a cutover that owes a stub when E isn't an incoming boundary, and a seller with an active billing generation delivers on a buy only inside its flight (x-adcp-validation.billing_continuity).8b5584e: Experimental live creative updates (RFC: declare which changes a sales agent applies to a live creative, and refuse the rest #8404, folds in staged activation from Experimental staged activation for live creative revisions #6780). A buyer changes a creative that is serving by syncing it again under the same
creative_id; the seller declares increative.live_updateswhich kinds of change (click_through,trackers,asset_content,format) it applies in place and how the creative serves meanwhile:uninterrupted(decided inside the sync call),staged(the approved prior version keeps serving until the change is approved, then is promoted atomically;on_rejectioniskeeps_priororstops), orpaused_for_review(the existing lifecycle). Name and tag changes are always accepted.list_creativesreturnsstaged_updatewhile a staged change awaits promotion;sync_creativesreturnsstaged_updateon the item;dry_runreturns the exact outcome of one change. There is no per-creative policy readback: the capability is the general floor anddry_runanswers for one change.creative.staged_update_changed(creative/creative-staged-update-changed-webhook.json) reports a staged update's review outcome (promotedorrejected), only to subscribers that register it.creative.status_changedis unchanged: a staged outcome is not a status transition, so a buyer on an earlier release never receives anapproved → approvedfire its closed validator would reject.CREATIVE_LIVE_UPDATE_UNSUPPORTED(witherror-details/creative-live-update-unsupported.json) replacesINVALID_STATEfor declaring sellers only. Sellers that do not declarecreative.live_updateskeep the original rule: creatives on active, non-paused packages cannot be updated, and the refusal isINVALID_STATE.comply_test_controllerforce_creative_statusforces a pending staged update's review outcome.media_buy_seller/creative_live_updatesandmedia_buy_seller/creative_live_update_refusal; the training agent's sales tenant implements the surface.dc4490e: Reporting subscriptions (experimental): a deactivated subscription no longer reads as active in
get_reporting_status.subscription_coverage[].statusgainsinactive, with a requireddeactivated_at. Periods that started before deactivation stay owed, and no later ones are. An inactive subscription is listed only while it still has retained obligations for the account; after that its entry is omitted. Before, the status enum had no inactive value, so a deactivated subscription still in scope could only read asactive.2a28649: Reporting subscriptions (experimental): period arithmetic and cutover edge cases found while building the canonical coverage vectors (test(compliance): canonical reporting-subscription coverage vectors and reference model #8616) are settled, and the vectors and reference model pin them.
PT24HequalsP1D; before, a nonexistent midnight left a 47-hourPT24Hperiod, andPT2Hdidn't nest. New vectors:havana-pt24h-equals-p1d-when-midnight-does-not-existandhavana-pt2h-nests-in-the-day.reactivation-after-a-schedule-change-never-owes-twice.UTCandEtc/UTC.billing_cycleneeds a date component. A sub-dailybilling_cyclewould ignore its anchor, so it is now invalid (schema-enforced). New vector:sub-daily-billing-cycle-is-refused.P7D) underutc,account_timezone, andsource_timezonestart on Thursday (1970-01-01);billing_cyclewith an anchor sets another week start.status_retention_dayscounts exact 24-hour days.1b3a93a: Reporting subscriptions (experimental): deterministic resolution and admission, and fewer versions at agency scale.
max_accountsis now normative. It is sticky, ordered by the account'sauthorization.authorized_atand thenaccount_idin byte order, and the same for every subscription of a principal. Accounts without covered buys count, so admission is computable fromlist_accounts.match: exactwithdimensions(schema-enforced).destination_overrides[]routes accounts, byaccount_idsoroperator_domains, to other destinations inside one subscription.account_ids, and changingexclude_account_ids, no longer need a newsubscription_version. Each edit is recorded per account as anexcluded_by_buyerexception interval.prior_versionslists the 16 newest inline, and the account lists stay capped at 1,000. Each list carries a total count, andget_principalgains areporting_subscription_pagerequest for the rest.subscription_idowes it and the other records a package-leveloverriddenexception. Billing stays one per account at a scope level.get_reporting_statusin the caller'sallowed_tasks. A grant withoutsync_reporting_receiptsorsync_reporting_statuskeeps the account covered, and the seller refuses the missing task for that account withSCOPE_INSUFFICIENT, not as an unknown identifier. A billing obligation the buyer can't receipt stays receipt-pending, attributed to the buyer.account_idon delivered rows. A seller advertising subscriptions publishes every managed-delivery offering with a row schema that declaresaccount_idas a required string and lists it inprimary_keys, so consolidated destinations validate and never collide.exactorfinest, a buy whose packages come from different products can owe two offerings. The coverage vectors and reference model now pin sticky resolution:a-newly-available-offering-never-re-resolvesreplacesresolution-change-is-a-cutover, andwithdrawal-of-the-resolved-offering-is-a-cutoveris new.1f08104: Reporting (experimental): revocation means no access.
sync_reporting_receiptsandsync_reporting_statusno longer accept receipts and statuses after the caller loses authority for an account. Before, they stayed open forstatus_retention_daysfor revisions the caller had read. Once authority ends, every reference to the account, receipts included, resolves like an unknown identifier, so a seller responding to fraud or a compromised agent stops everything at once.A seller that wants a buyer to finish reconciling after a relationship ends, for example after an agency-of-record change, keeps a reduced grant instead of revoking: an
authorizationwhoseallowed_taskslists only the reconciliation tasks it permits (such asget_reporting_status,sync_reporting_receipts, andsync_reporting_status), withread_only: false. The account stays in reporting-subscription coverage while that grant listsget_reporting_status, so the buyer keeps receiving final revisions and adjustments for its buys.Patch Changes
931a9d6: Every task response schema and async status payload now composes
core/protocol-envelope.jsonthrough its rootallOf, as the envelope's notes already require. On MCP and REST the envelope fields (status,task_id,context_id,context,message,timestamp,replayed,adcp_error,push_notification_config,governance_context) are siblings of the body fields at the response root, but 47 of the 124 tool response and async status schemas did not compose the envelope, and 18 closed roots andoneOf/anyOfbranches rejected envelope fields outright, because draft-07additionalPropertiesdoes not see properties declared throughallOf. Generated SDK types therefore could not represent a conforming response.core/protocol-envelope.jsoncomposescore/version-envelope.json, soadcp_versionandadcp_major_versionare envelope fields on every response, stamped by the server framework rather than carried as task data. Request schemas keep composing the version envelope directly; response schemas no longer do.list_collections,list_proposals,get_media_buy_issueandreport_media_buy_issueresponses, which are new in 3.3, and theget_reporting_statusfailure branches, which are experimental. Closed value objects and rows inside response bodies stay closed. No build step adds the envelope: source and published schemas agree.statusconst or enum, aconstpin such as the fixedmessageandadcp_errorof an unavailableget_reporting_statuslookup, andcontextas a$reftocore/context.json. The 66 other local copies (task_id×23,message×21,replayed×11, theget_reporting_statusfailure branches'adcp_version,adcp_major_version,context_id,timestampandadcp_error,governance_contextoncheck_governance, andstatusonget_task_status) are removed, so the envelope's declarations govern. The untrusted-input guidance on the asyncmessagecopies moves tocore/task-message.json. The rootstatusenums ondecline_proposals,request_proposalsandrefine_proposalsare removed; their branch consts discriminate.replayedtotrue(12 locations); the envelope's boolean governs, so a response acceptsreplayed: false.messagehas one bound of 2,000 characters, in one definition:core/task-message.json(type: string,maxLength: 2000, untrusted input to the receiver). The envelope, the MCP webhook payload and the response wrapper refer to it, so the bound does not depend on the delivery path. The 23 response nodes that cappedmessageat 2,000 themselves no longer restate it. A seller whose text is longer MUST truncate it rather than fail the task. 3.2.7's envelope, webhook payload and wrapper declared no bound; DR-0036 records the change as correction (d), at the 2,000 that 3.2.7 published on the compact and submitted responses. Aconstpin onmessage, such as the fixed text of an unavailableget_reporting_statuslookup, is kept.core/error.json,core/warning.jsonand messages inside task bodies keep their own bounds.task_idhas one definition,core/task-id.json(type: string,minLength: 1), that everytask_iddeclaration refers to: the envelope,tasks/getandget_task_statusrequests and responses, the task list responses and filters, the MCP webhook payload and the compliance controller (which keeps its ownmaxLength: 128). An emptytask_ididentifies no task, so it is rejected; 3.2.7 already publishedminLength: 1oncore/compact-task-submitted.json. DR-0036 records this as correction (c). A submitted response requirestask_idthroughcore/task-submitted.json(status: submittedand a requiredtask_id), which every submitted response body and branch composes throughallOf, so none restates the rule; generated types see the requirement. Likewise every working body composescore/task-working.json(status: working) and every input-required body composescore/task-input-required.json(status: input-required), so an async status payload accepts only its own status.core/protocol-envelope.jsonstates that an absentreplayedmeansfalseand that a response may carryreplayed: false;replayed: trueappears only on a replay.status, which the envelope already made required on every task response. Webhookresultexamples carry the task'sstatus.No body field is added, renamed or removed.
73b098c: Make media-buy compliance scenarios respect auction-only sellers and declared optional capabilities. Price-independent lifecycle, reporting, discovery, and format fixtures use non-guaranteed CPM floors, with bids supplied for auction buys. Product filtering tests no longer require sellers to seed guaranteed inventory.
Discover native reporting and canonical compatibility support before seeding optional feature fixtures; unsupported native shapes produce visible coverage gaps, while malformed discovery and failed advertised operations remain failures. Canonical compatibility checks no longer require vendor metrics and match product/format contracts independently of catalog order.
Currency filtering follows the account's effective transaction currency and checks every returned media price without assuming fixture IDs, rate-card IDs, ordering, or exact counts. Correct invalid native/audio channel fixtures to display/streaming_audio.
Canonical compatibility and final currency checks collect all wholesale catalog pages with physical-page schema and invariant checks. The runner reports the logical catalog separately from actual exchanges, preserves later-page producer advisories, and safely skips this feature on older runners. Valid empty currency results leave positive-price coverage explicitly unproven.
0c4553c: Give the three hand-authored AdCP 3.2 request-signing vectors (
profile-3.2/positive/001,profile-3.2/negative/001andprofile-3.2/negative/002) operation-validcreate_media_buybodies, re-derive their Content-Digest and signatures, and restore the legacypositive/002andnegative/018bodies fix(compliance): make request-signing vector bodies schema-valid #7580 made valid. Each vector keeps its single intended fault. Restore the regression check that every routed signing vector carries an operation-valid body, extended toprofile-3.2/.b1ebc1c:
media_buy_sellernow checks thatget_media_buysreturns each package's persistedcontext. Thecreate_media_buysample requests (both the default and the buyer-selected-timezone branches) send a distinctcontext.buyer_refon each of their two packages, andcheck_buy_statusrequires each package to come back with its ownproduct_idand thatcontext, in any order (field_containsovermedia_buys[0].packages[*]).get_media_buysalready says sellers MUST include a package's persistedcontextwhen the package was created through AdCP with one, but onlypending_creatives_to_startchecked it, and that scenario isnot_applicablefor any seller without auto-approval and a creative library. A seller that drops packagecontexton readback now fails the core lifecycle. No schema, task definition or released artifact changes.023bbd2: Add canonical reporting-subscription coverage vectors (experimental
media_buy.reporting_subscriptions) understatic/compliance/source/test-vectors/reporting-subscriptions/, with a case schema and a pinned IANA tzdata release (2026f). There are 113 cases. 81 are ported from the TypeScript SDK's parity table and re-derived from the spec text. The new cases cover:max_accountscapacity per offering.The set also freezes two vocabularies both SDKs use verbatim:
error-codes.json: the subscription and coverage error codes, each with its recovery class, whether the task was dispatched, and its fix.reason-codes.json: the coverage reason codes, which say why a period is or isn't owed, with the fixed rule order.A brute-force reference model in
scripts/reference/reporting-coverage/reproduces every case. It evaluates the zic source itself and shares no time zone code with either SDK. Property tests also check the model: exceptions only remove periods, nothing is owed twice, prefix stability, no retroactive extension, and calendar invariants.c788bbc: Gate the universal media-buy and signals error/schema storyboards on their
declared protocol. Agents that do not offer that protocol receive the existing
capability applicability skip before controller and tool requirements are
evaluated. Claimants still need the required tools, fixture setup and successful
checks. Existing released compliance artifacts are unchanged.