Skip to content

Commit e1263e7

Browse files
bokelleyclaude
andcommitted
Merge branch issue-1695-p9-docs into issue-1695-owed-names
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2 parents 268789b + fd0bc4c commit e1263e7

2,100 files changed

Lines changed: 2810846 additions & 1478 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.release-please-manifest.next.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
".": "10.0.0-beta.2",
2+
".": "10.0.0-beta.3",
33
"packages/adcp-reporting-storage": "0.2.0-beta.0"
44
}

‎CHANGELOG.next.md‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,38 @@
11
# Changelog
22

3+
## [10.0.0-beta.3](https://github.com/adcontextprotocol/adcp-client-python/compare/v10.0.0-beta.2...v10.0.0-beta.3) (2026-10-30)
4+
5+
6+
### ⚠ BREAKING CHANGES
7+
8+
* **protocol:** the SDK no longer advertises or accepts AdCP 3.3-beta.1. get_supported_adcp_versions() is ('3.0', '3.1', '3.2', '3.3-beta.2', '3.2-rc.7'); an adcp_version pin of "3.3-beta.1" / "3.3.0-beta.1" raises ConfigurationError, and a peer that advertises only 3.3-beta.1 among the 3.3 line is negotiated like any other unserved prerelease (down to 3.2). Re-pin to 3.3-beta.2 or omit the pin. The definition-pin, purchase-rights and installment-selection types and TestControllerStore.definition_pin_probe are removed.
9+
* **decisioning:** create_property_list / update_property_list fail with INVALID_REQUEST on mixed-case, trailing-dot or URL-shaped domain identifiers, and MCPPropertyListFetcher fails a resolution carrying one. get_products / list_products fail with INTERNAL_ERROR when a product advertises an undeclared measurement_window. get_adcp_capabilities truncates oversized publisher_domains / data_provider_domains. PrincipalService accepts "3.3" async versions by default.
10+
* **compat:** a 3.3 request the 3.2 contract cannot express (a webhook without authentication, a minute-level daypart) now fails with ADCPVersionConversionError / UNSUPPORTED_FEATURE before sending. Earlier SDK 10 betas sent some of these to the peer invalid, for example when the request carried start_time "asap".
11+
12+
### Features
13+
14+
* **compat:** semantic 3.3 → 3.2 downgrade rules ([#1717](https://github.com/adcontextprotocol/adcp-client-python/issues/1717)) ([fab1adf](https://github.com/adcontextprotocol/adcp-client-python/commit/fab1adf1ca606dbe174820deb901d0a62333d849)), closes [#1667](https://github.com/adcontextprotocol/adcp-client-python/issues/1667)
15+
* **decisioning:** AdCP 3.3 seller-side rules ([#1720](https://github.com/adcontextprotocol/adcp-client-python/issues/1720)) ([fbf13c9](https://github.com/adcontextprotocol/adcp-client-python/commit/fbf13c9d180e8e2a9ecd47daedba6c6b246a6bee))
16+
* **examples:** serve the AdCP 3.3 property breakdowns from injected rows in the reference seller ([#1715](https://github.com/adcontextprotocol/adcp-client-python/issues/1715)) ([a998b82](https://github.com/adcontextprotocol/adcp-client-python/commit/a998b82242d262ad45ffded430a8386111cbceec)), closes [#1669](https://github.com/adcontextprotocol/adcp-client-python/issues/1669)
17+
* **protocol:** adopt the signed AdCP 3.3.0-beta.2 bundle ([#1732](https://github.com/adcontextprotocol/adcp-client-python/issues/1732)) ([3e23bec](https://github.com/adcontextprotocol/adcp-client-python/commit/3e23becd8a2cb392ba9cd4df343f0a9a05456394))
18+
* **reporting-storage:** add PostgreSQL stores for reporting subscriptions ([#1724](https://github.com/adcontextprotocol/adcp-client-python/issues/1724)) ([46a1e01](https://github.com/adcontextprotocol/adcp-client-python/commit/46a1e01a65e01d547a22a05a3858709c3309a011)), closes [#1695](https://github.com/adcontextprotocol/adcp-client-python/issues/1695)
19+
* **reporting:** accept reporting subscriptions on sync_principal and track what they owe ([#1698](https://github.com/adcontextprotocol/adcp-client-python/issues/1698)) ([04238b2](https://github.com/adcontextprotocol/adcp-client-python/commit/04238b2a5a18732bddecf03ac925eccb39db2538))
20+
* **reporting:** add buyer client helpers and a tracker for reporting subscriptions ([#1699](https://github.com/adcontextprotocol/adcp-client-python/issues/1699)) ([8a7f482](https://github.com/adcontextprotocol/adcp-client-python/commit/8a7f48206a695e3c5dc3cc7ca46aea1df3c02609))
21+
* **reporting:** apply the AdCP 3.3 reporting rules ([#1707](https://github.com/adcontextprotocol/adcp-client-python/issues/1707)) ([3e177e6](https://github.com/adcontextprotocol/adcp-client-python/commit/3e177e69fc0fcceafc40a8854f2b7099ad905ca0)), closes [#1669](https://github.com/adcontextprotocol/adcp-client-python/issues/1669)
22+
* **reporting:** compute owed reporting-subscription periods and their capabilities ([#1696](https://github.com/adcontextprotocol/adcp-client-python/issues/1696)) ([58e825a](https://github.com/adcontextprotocol/adcp-client-python/commit/58e825a2c0f802b85edd1eba1a9e3aa7f2f160eb))
23+
* **reporting:** persist reporting-subscription engine state through a CAS store ([#1722](https://github.com/adcontextprotocol/adcp-client-python/issues/1722)) ([10643c7](https://github.com/adcontextprotocol/adcp-client-python/commit/10643c7fb31f22ef24956c6841c23f6315da698a)), closes [#1695](https://github.com/adcontextprotocol/adcp-client-python/issues/1695)
24+
* **server:** seller helper for wholesale feed versions ([#1706](https://github.com/adcontextprotocol/adcp-client-python/issues/1706)) ([b014066](https://github.com/adcontextprotocol/adcp-client-python/commit/b014066004782ef312966a90ce0871ac01f2cca2)), closes [#1676](https://github.com/adcontextprotocol/adcp-client-python/issues/1676)
25+
* **signing:** accept any well-formed adcp_use purpose in keygen ([#1708](https://github.com/adcontextprotocol/adcp-client-python/issues/1708)) ([612f97a](https://github.com/adcontextprotocol/adcp-client-python/commit/612f97af9afd66512dc97289d4e8c7f299bcc4e7))
26+
27+
28+
### Bug Fixes
29+
30+
* **codegen:** find generated classes by name, and derive emitted envelope bases from the bundle ([#1705](https://github.com/adcontextprotocol/adcp-client-python/issues/1705)) ([50fe9e8](https://github.com/adcontextprotocol/adcp-client-python/commit/50fe9e8fc73ebc21635e3636d49fd3cbf512a35e)), closes [#1680](https://github.com/adcontextprotocol/adcp-client-python/issues/1680)
31+
* **examples:** stop zero-filling impressions and flat multi-standard viewability in the reference seller ([#1709](https://github.com/adcontextprotocol/adcp-client-python/issues/1709)) ([a63836f](https://github.com/adcontextprotocol/adcp-client-python/commit/a63836f21dbe138d5ce021f9fab7e0a8954dbe20)), closes [#1669](https://github.com/adcontextprotocol/adcp-client-python/issues/1669)
32+
* **media-buy-actions:** project change_term_id for AdCP 3.3 prereleases ([#1721](https://github.com/adcontextprotocol/adcp-client-python/issues/1721)) ([ac5d410](https://github.com/adcontextprotocol/adcp-client-python/commit/ac5d4100778534cfaf235846f275a05cd7d2283b)), closes [#1668](https://github.com/adcontextprotocol/adcp-client-python/issues/1668)
33+
* **types:** defer the import-time model rebuilds that cost adcp.client 560 MiB RSS ([#1713](https://github.com/adcontextprotocol/adcp-client-python/issues/1713)) ([ab39d63](https://github.com/adcontextprotocol/adcp-client-python/commit/ab39d63e0333f94fb6879a8419e6680fdf4ccfb4))
34+
* **webhooks:** drop aggregated_totals from media_buy_delivery webhook results ([#1716](https://github.com/adcontextprotocol/adcp-client-python/issues/1716)) ([875a4fe](https://github.com/adcontextprotocol/adcp-client-python/commit/875a4fed49cba9b92aa92d2007c6c69f3467cc94)), closes [#1669](https://github.com/adcontextprotocol/adcp-client-python/issues/1669)
35+
336
## [10.0.0-beta.2](https://github.com/adcontextprotocol/adcp-client-python/compare/v10.0.0-beta.1...v10.0.0-beta.2) (2026-10-29)
437

538

‎MANIFEST.in‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ recursive-include src/adcp py.typed
66
recursive-include src/adcp/reporting/materializer/assets *.json
77
recursive-include src/adcp/_compliance/3.2.1 *.json *.jsonl *.yaml *.md
88
recursive-include src/adcp/_compliance/3.2.4 *.json *.jsonl *.yaml *.md
9-
recursive-include src/adcp/_compliance/3.3.0-beta.1 *.json *.jsonl *.yaml *.md
9+
recursive-include src/adcp/_compliance/3.3.0-beta.2 *.json *.jsonl *.yaml *.md
1010
recursive-include src/adcp/_compliance/3.2.7 *.json *.jsonl *.yaml *.md
1111
# build_py copies the tracked cache into wheels. Do not duplicate those
1212
# inputs with ignored, generated package copies in the source distribution.
1313
prune src/adcp/_schemas
1414
prune src/adcp/_compliance/3.2.0-rc.6
1515
prune src/adcp/_compliance/3.2.0-rc.7
1616
prune src/adcp/_compliance/3.3.0-beta.0
17+
prune src/adcp/_compliance/3.3.0-beta.1
1718
# A clean VCS source tree has no ignored ``src/adcp/_schemas`` directory.
1819
# Keep the tracked inputs needed by the build_py hook in source distributions
1920
# so wheels built from an sdist have the same schema set as direct VCS wheels.
@@ -22,16 +23,17 @@ recursive-include schemas/cache/3.0 *.json
2223
recursive-include schemas/cache/3.1 *.json
2324
recursive-include schemas/cache/3.1.15 *.json
2425
recursive-include schemas/cache/3.2 *.json
25-
recursive-include schemas/cache/3.3.0-beta.1 *.json
26+
recursive-include schemas/cache/3.3.0-beta.2 *.json
2627
prune schemas/cache/2.5
2728
prune schemas/cache/3.2.0-beta.6
2829
prune schemas/cache/3.2.0-rc.3
2930
prune schemas/cache/3.2.0-rc.6
3031
prune schemas/cache/3.2.0-rc.7
3132
prune schemas/cache/3.3.0-beta.0
33+
prune schemas/cache/3.3.0-beta.1
3234
prune schemas/releases
3335
include schemas/releases/3.2.1.json
3436
include schemas/releases/3.2.4.json
3537
include schemas/releases/3.2.7.json
3638
include schemas/releases/3.1.27.json
37-
include schemas/releases/3.3.0-beta.1.json
39+
include schemas/releases/3.3.0-beta.2.json

‎MIGRATION_v9_to_v10.md‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@ the SDK-relevant inventory is [docs/adcp-3.3-sdk-inventory.md](docs/adcp-3.3-sdk
99

1010
| Change | Update your integration |
1111
| --- | --- |
12-
| The wire pin is AdCP `3.3.0-beta.1` | `get_adcp_version()` returns `3.3.0-beta.1`; the SDK speaks `adcp_version: "3.3-beta.1"` by default and advertises `3.0`, `3.1`, `3.2`, `3.3-beta.1` and the `3.2-rc.7` alias. A stable `"3.3"` is not an accepted pin until the protocol's 3.3 GA. `10.0.0-beta.0` and `10.0.0-beta.1` pinned `3.3.0-beta.0`; that beta is no longer advertised or accepted as an `adcp_version` pin (`ConfigurationError`), and a `3.3-beta.0` peer is negotiated like any other unserved prerelease (down to `3.2`). Re-pin to `3.3-beta.1`, or omit the pin. Pin `adcp_version="3.2"` on a server whose handlers must keep running on the 3.2 contract (see "A server pin governs its handlers" below). On a client, `adcp_version` is a negotiation ceiling; its application models remain current. Generated types, bundled schemas and the versioned validators follow the 3.3 bundle. |
12+
| The wire pin is AdCP `3.3.0-beta.2` | `get_adcp_version()` returns `3.3.0-beta.2`; the SDK speaks `adcp_version: "3.3-beta.2"` by default and advertises `3.0`, `3.1`, `3.2`, `3.3-beta.2` and the `3.2-rc.7` alias. A stable `"3.3"` is not an accepted pin until the protocol's 3.3 GA. `10.0.0-beta.0` and `10.0.0-beta.1` pinned `3.3.0-beta.0`, and `10.0.0-beta.2` pinned `3.3.0-beta.1`; neither beta is advertised or accepted as an `adcp_version` pin any more (`ConfigurationError`), and a `3.3-beta.0` or `3.3-beta.1` peer is negotiated like any other unserved prerelease (down to `3.2`). Re-pin to `3.3-beta.2`, or omit the pin. Pin `adcp_version="3.2"` on a server whose handlers must keep running on the 3.2 contract (see "A server pin governs its handlers" below). On a client, `adcp_version` is a negotiation ceiling; its application models remain current. Generated types, bundled schemas and the versioned validators follow the 3.3 bundle. |
1313
| AdCP 3.3.0-beta.1 adds account requests, media-buy issues and reporting subscriptions | New tasks are wired through `ADCPClient` / `ADCPMultiAgentClient`, `ADCPHandler` (each returns `not_supported()` until overridden), the MCP and A2A adapters, the MCP tool list and the CLI: `request_account` (experimental `account.requests`; it opens, matches or, with `account_id`, changes an account, guarded by `revision`), `report_media_buy_issue` and `get_media_buy_issue`. `RequestAccountRequest` / `Response`, `ReportMediaBuyIssueRequest` / `Response` and `GetMediaBuyIssueRequest` / `Response` are exported from `adcp.types`. `list_accounts` gains `include_requests`, `request_ids` and `requests_pagination`, returning `account_requests[]` and `account_requests_pagination`. Experimental principal-level `reporting_subscriptions` land on `sync_principal` / `get_principal`, with `subscription_coverage[]` on `get_reporting_status`, `configuration_tasks[]` on `media_buy.reporting_delivery`, the `ReportingDimension` enum and the `principal.changed` reason `reporting_subscription_changed`. `sync_accounts` is unchanged and stays supported. Generated class names that the generator numbers can renumber with the bundle; import the semantic names from `adcp.types` rather than a numbered class from a domain module. |
14+
| AdCP 3.3.0-beta.2 withdraws definition pins, purchase rights and installment selection | adcontextprotocol/adcp#8537 moves all three to 4.0, so their generated types leave `adcp.types.domains.*`, `adcp.types._generated` and `adcp.types.error_details`: `DefinitionPin*`, `DefinitionPinReferenceKind`, `ReferenceDefinitionChangedDetails` (and `ErrorCode.REFERENCE_DEFINITION_CHANGED`), `DriftedPin`, `RightsScope`, `InstallmentChangeSet`, `commercial_terms.definition_pins`, `purchases[].rights` / `installments`, `installment_changes` and the `definition_changed` refinement reason. `TestControllerStore.definition_pin_probe` and the `definition_pin_probe` controller scenario are removed. Delete code that builds or reads them; a seller stops listing `media_buy.purchase_rights` and `media_buy.installment_selection` in `experimental_features`. |
15+
| AdCP 3.3.0-beta.2 adds separate-account outcomes, seller offers and measurement provenance | `RequestAccountRequest.allow_separate_account` (default `false`) lets a change request resolve as `created` (a new account carrying the change) or `matched` (an account the caller already holds), and the new correctable error code `ACCOUNT_CHANGE_REQUIRES_NEW_ACCOUNT` reports a change the seller would take only on a new account. Experimental seller offers add `proposal_initiator`, `offer_reason` on `list_proposals` rows and the `proposal.offered` notification (`ProposalOfferedWebhook`); experimental measurement provenance adds `CollectionMechanism`, `counting_mechanisms` and `vendor_metric_provenance[]` (`VendorMetricProvenance`). The reporting-subscription fields settled after beta.1 (`standard_dimensions`, `unmapped_dimensions`, `inactive_intervals`, `prior_versions[].configuration`, per-offering `offering_id`, `previous_timezone`) are now generated. `principal_kind` and `expected_principal_kind` are deprecated. `NotificationConfig.product_payload_view` loses its schema default: it is `None` when unset, and a product subscription's dump no longer adds `product_payload_view: "legacy"` (absent means legacy); read `config.product_payload_view or "legacy"`. These are generated types, imported from their domain packages (for example `adcp.types.domains.core.ProposalOfferedWebhook`); no task was added. |
1416
| A server that restricts `supported_versions` runs on its newest listed release | Any server (`create_mcp_server`, `create_a2a_server`, `serve`, `MCPToolSet`, `ADCPAgentExecutor`, `create_tool_caller`, `PlatformHandler`, `create_adcp_server_from_platform`) with `supported_versions=["3.2"]` and no `adcp_version` runs its handlers on 3.2, instead of raising because the SDK default is outside the list. Pass `adcp_version` explicitly to choose another listed release. |
1517
| `server_version` pins keep wire precision | `ADCPClient(server_version=...)` and `get_server_version()` keep a 3.x pin at release precision: `"3.1.0-beta.1"` reads back as `"3.1-beta.1"` (SDK 9 reported the bundle key, `"3.1.0-beta.1"`). Stable pins still collapse (`"3.0.7"` → `"3.0"`). |
16-
| A server pin governs its handlers | Handlers run on one *application version*: the server's `adcp_version` pin, else the newest release in its `supported_versions`, else the packaged `3.3-beta.1`. Every dispatch path (MCP, A2A, `create_tool_caller`, the Decisioning dispatcher) converts a buyer's request to that release before validation, unknown-field policy and typed parsing, and converts the handler's response back to the buyer's release: up to `3.3-beta.1`, unchanged for a same-release buyer, or down to 3.1 / 3.0. `resolve_requested_adcp_version(params)` inside a handler returns the application version; `ToolContext.application_adcp_version` reports it directly, and `ToolContext.resolved_adcp_version` still reports the buyer's negotiated version. A 3.2-pinned seller's dict handlers therefore see exactly 3.2 payloads, its requests and responses are validated against the 3.2 schemas (with strict validation, a response its own 3.2 contract refuses fails before conversion), and a conversion the target schema refuses fails as `ADCPVersionConversionError` / `VERSION_UNSUPPORTED` instead of reaching the peer invalid. Typed handler parameters (`params: GetProductsRequest`) and typed responses still use the generated 3.3 classes: they are additive supersets of 3.2, so a 3.2 payload parses into them unchanged and dumps back as the same 3.2 payload, but a field 3.3 added reads as unset (its model default) on a 3.2 server. The unpinned default is unchanged: handlers receive `3.3-beta.1`. |
18+
| A server pin governs its handlers | Handlers run on one *application version*: the server's `adcp_version` pin, else the newest release in its `supported_versions`, else the packaged `3.3-beta.2`. Every dispatch path (MCP, A2A, `create_tool_caller`, the Decisioning dispatcher) converts a buyer's request to that release before validation, unknown-field policy and typed parsing, and converts the handler's response back to the buyer's release: up to `3.3-beta.2`, unchanged for a same-release buyer, or down to 3.1 / 3.0. `resolve_requested_adcp_version(params)` inside a handler returns the application version; `ToolContext.application_adcp_version` reports it directly, and `ToolContext.resolved_adcp_version` still reports the buyer's negotiated version. A 3.2-pinned seller's dict handlers therefore see exactly 3.2 payloads, its requests and responses are validated against the 3.2 schemas (with strict validation, a response its own 3.2 contract refuses fails before conversion), and a conversion the target schema refuses fails as `ADCPVersionConversionError` / `VERSION_UNSUPPORTED` instead of reaching the peer invalid. Typed handler parameters (`params: GetProductsRequest`) and typed responses still use the generated 3.3 classes: they are additive supersets of 3.2, so a 3.2 payload parses into them unchanged and dumps back as the same 3.2 payload, but a field 3.3 added reads as unset (its model default) on a 3.2 server. The unpinned default is unchanged: handlers receive `3.3-beta.2`. |
1719
| `UniversalMacro` is a union | AdCP 3.3 adds the parameterized `GDPR_CONSENT_<gvl_id>` family, so `adcp.types.UniversalMacro` is now a `RootModel` over the closed enum (`UniversalMacro3`) and the pattern string (`UniversalMacro4`). Replace `UniversalMacro.MEDIA_BUY_ID` with `UniversalMacro3.MEDIA_BUY_ID` (or compare strings), and read `.root` on a parsed value. |
1820
| The experimental identity preview is the generated 3.3 surface | `adcp.types.experimental_identity` keeps every name (`AgentOnboarding`, `BuyerOnboardingPosture`, `PrincipalRelationship`, `TrustRecord`, `GetPrincipalResponse`, ...) but binds the generated 3.3 types. `adcp.types._identity_preview`, `adcp.signing._identity_schemas` and `scripts/generate_identity_preview.py` are gone. `RequestSigning.profiles` is `list[Profile]` (an enum) rather than `list[str]`; `PrincipalChangedWebhook.reason` is the generated `Reason` enum, which now includes `relationship_changed` and `relationship_expiring`. `AgentOnboardingRequirement.kind` stays open (`AgentOnboardingRequirementKind | str`). `adcp.signing.validate_identity_value` validates against the pinned bundle; `identity_schema_bundle()` is removed. |
1921
| `reporting_webhook.operation_id` is a generated field | The field, its constraints and its never-null marker come from the 3.3 schema. The SDK 9 runtime patch is gone; nothing changes on the wire. |

0 commit comments

Comments
 (0)