Skip to content

Commit 2ffece8

Browse files
authored
feat(protocol): adopt AdCP 3.2.1 GA for SDK 8.0.0 (#1270)
Adopt signed AdCP 3.2.1 and switch Release Please to stable. Release-As: 8.0.0
1 parent 1fa2b06 commit 2ffece8

1,927 files changed

Lines changed: 2685561 additions & 369 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.

‎.github/workflows/ci.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1033,7 +1033,7 @@ jobs:
10331033
for child in schema_root.iterdir()
10341034
if child.is_dir()
10351035
}
1036-
# Ship released 3.0/3.1 and only the current 3.2 candidate offline.
1036+
# Ship released 3.0/3.1 and the current 3.2 line offline.
10371037
assert packaged_versions == {
10381038
"3.0", "3.1", current_bundle
10391039
}

‎MANIFEST.in‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,32 @@ include LICENSE
44
include MIGRATION*.md
55
recursive-include src/adcp py.typed
66
recursive-include src/adcp/reporting/materializer/assets *.json
7-
recursive-include src/adcp/_compliance/3.2.0-rc.7 *.json *.jsonl *.yaml *.md
7+
recursive-include src/adcp/_compliance/3.2.1 *.json *.jsonl *.yaml *.md
88
# Bundled AdCP JSON schemas. ``scripts/bundle_schemas.py`` mirrors
99
# ``schemas/cache/`` into ``src/adcp/_schemas/`` before ``python -m
1010
# build`` so the validator ships with the wheel. Keep distributions on
11-
# supported released lines and the current 3.2 release candidate.
11+
# supported released lines: 3.0, 3.1 and 3.2 (AdCP 3.2.1).
1212
recursive-include src/adcp/_schemas/3.0 *.json
1313
recursive-include src/adcp/_schemas/3.1 *.json
14-
recursive-include src/adcp/_schemas/3.2.0-rc.7 *.json
14+
recursive-include src/adcp/_schemas/3.2 *.json
1515
prune src/adcp/_schemas/2.5
1616
prune src/adcp/_schemas/3.2.0-beta.6
1717
prune src/adcp/_schemas/3.2.0-rc.3
1818
prune src/adcp/_schemas/3.2.0-rc.6
19+
prune src/adcp/_schemas/3.2.0-rc.7
1920
prune src/adcp/_compliance/3.2.0-rc.6
21+
prune src/adcp/_compliance/3.2.0-rc.7
2022
prune src/adcp/_schemas/3.1.0-*
2123
# A clean VCS source tree has no ignored ``src/adcp/_schemas`` directory.
2224
# Keep the tracked inputs needed by the build_py hook in source distributions
2325
# so wheels built from an sdist have the same schema set as direct VCS wheels.
2426
recursive-include schemas/cache/3.0 *.json
2527
recursive-include schemas/cache/3.1 *.json
26-
recursive-include schemas/cache/3.2.0-rc.7 *.json
28+
recursive-include schemas/cache/3.2 *.json
2729
prune schemas/cache/2.5
2830
prune schemas/cache/3.2.0-beta.6
2931
prune schemas/cache/3.2.0-rc.3
3032
prune schemas/cache/3.2.0-rc.6
33+
prune schemas/cache/3.2.0-rc.7
3134
prune schemas/releases
32-
include schemas/releases/3.2.0-rc.7.json
35+
include schemas/releases/3.2.1.json

‎MIGRATION_ADCP_3.1_TO_3.2.md‎

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# Migrating an integration from AdCP 3.1 to 3.2 beta
1+
# Migrating an integration from AdCP 3.1 to 3.2
22

3-
Python SDK 8 beta supports the AdCP `3.2.0-beta.4` schemas and the compact
3+
Python SDK 8 supports the AdCP `3.2.1` schemas and the compact
44
product/media-buy lifecycle that becomes the foundation of AdCP 4.0. The SDK
55
continues to support AdCP 3.0 and 3.1, and the deprecated
66
`get_products`/`create_media_buy`/`update_media_buy` lifecycle remains available
@@ -11,17 +11,20 @@ seller may expose only the old lifecycle, a direct-buy subset of the compact
1111
lifecycle, or the complete proposal lifecycle. Do not infer supported tools
1212
from the version alone; read `media_buy.lifecycle_tools` or MCP `tools/list`.
1313

14-
## Pin the beta precisely
14+
## Pin AdCP 3.2
1515

16-
Use the release-precision prerelease identifier while 3.2 is in beta:
16+
AdCP 3.2.1 is the 3.2 general-availability release. Pin its release-precision
17+
wire value:
1718

1819
```python
19-
client = ADCPClient(agent, adcp_version="3.2-beta.4")
20-
server = adcp_server("seller", adcp_version="3.2-beta.4")
20+
client = ADCPClient(agent, adcp_version="3.2")
21+
server = adcp_server("seller", adcp_version="3.2")
2122
```
2223

23-
`"3.2"` intentionally does not alias to a prerelease. Exact prerelease pins
24-
prevent a deployment from silently changing contracts when 3.2 stable ships.
24+
Patch releases do not change the wire contract, so `"3.2"` covers 3.2.1 and
25+
later 3.2 patches. AdCP 3.2.0 was withdrawn; do not target it. Prerelease pins
26+
such as `"3.2-beta.4"` or `"3.2-rc.7"` are no longer advertised; this SDK
27+
advertises `3.0`, `3.1` and `3.2`. Replace them with `"3.2"`.
2528

2629
## Beta.4 integration notes
2730

‎MIGRATION_v7_to_v8.md‎

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
# Migrating from Python SDK 7 to 8
22

3-
For the upcoming Reliable Reporting prerelease, read the
4-
[reporting upgrade and release notes](docs/reporting-release-notes.md) before
5-
deploying. They cover the account-qualified `generation_key` API change,
3+
Before deploying Reliable Reporting, read the
4+
[reporting upgrade and release notes](docs/reporting-release-notes.md). They cover the account-qualified `generation_key` API change,
65
PostgreSQL drain/migration/activation sequence, all nine historical comparison
76
boundaries, and the distinction between offline schemas and live rc.6 mounts.
8-
Final package and full-rollout qualification remain pending.
97

10-
SDK 8 beta also updates the generated protocol surface from AdCP 3.1.15 to
11-
AdCP 3.2.0-beta.4 and adds the compact product/media-buy lifecycle. The old
8+
SDK 8 also updates the generated protocol surface from AdCP 3.1.15 to
9+
AdCP 3.2.1 and adds the compact product/media-buy lifecycle. The old
1210
3.x lifecycle remains supported. See
13-
[Migrating an integration from AdCP 3.1 to 3.2 beta](MIGRATION_ADCP_3.1_TO_3.2.md)
11+
[Migrating an integration from AdCP 3.1 to 3.2](MIGRATION_ADCP_3.1_TO_3.2.md)
1412
for lifecycle selection, capability declarations, and the compatibility test
1513
matrix.
1614

‎README.md‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -333,16 +333,18 @@ async with ADCPMultiAgentClient(
333333

334334
## AdCP version support
335335

336-
The SDK 8 beta line is built against **AdCP 3.2.0-beta.10**, makes canonical
337-
creatives the primary Python contract, and negotiates AdCP 3.0, 3.1, and the
338-
exact 3.2 beta wire dialect. The SDK package version and protocol version are
336+
SDK 8 is built against **AdCP 3.2.1**, the AdCP 3.2 general-availability
337+
release, and makes canonical creatives the primary Python contract. It
338+
negotiates AdCP 3.0, 3.1, and 3.2. On the wire, 3.2 is `"3.2"`, because
339+
`adcp_version` carries release precision only. AdCP 3.2.0 was withdrawn and
340+
is not a supported target. The SDK package version and protocol version are
339341
intentionally independent:
340342

341343
```python
342344
import adcp
343345

344-
adcp.get_adcp_sdk_version() # SDK package version, e.g. "8.0.0b11"
345-
adcp.get_adcp_spec_version() # AdCP spec this build targets, e.g. "3.2.0-beta.10"
346+
adcp.get_adcp_sdk_version() # SDK package version, e.g. "8.0.0"
347+
adcp.get_adcp_spec_version() # AdCP spec this build targets, e.g. "3.2.1"
346348
```
347349

348350
If you talk to an agent on a newer spec than this SDK validates, the response
@@ -360,7 +362,7 @@ forward traffic degrades gracefully rather than failing.
360362
- **[Reporting source adapters](docs/reporting-source-adapters.md)** - Per-metric availability evidence, coverage, and control totals for inline delivery fetches
361363
- **[Migrating from SDK 6 to 7](https://github.com/adcontextprotocol/adcp-client-python/blob/main/MIGRATION_v6_to_v7.md)** - Breaking API, security, concurrency, and webhook changes
362364
- **[Migrating from SDK 7 to 8](https://github.com/adcontextprotocol/adcp-client-python/blob/main/MIGRATION_v7_to_v8.md)** - Secure webhook defaults and telemetry changes
363-
- **[Migrating from AdCP 3.1 to 3.2 beta](MIGRATION_ADCP_3.1_TO_3.2.md)** - Compact lifecycle adoption and old/new compatibility matrix
365+
- **[Migrating from AdCP 3.1 to 3.2](MIGRATION_ADCP_3.1_TO_3.2.md)** - Compact lifecycle adoption and old/new compatibility matrix
364366
- **[Durable legacy purchase continuations](docs/legacy-purchase-continuations.md)** - Safe products-only compatibility redemption and crash recovery
365367
- **[Media-buy lifecycle coordinator](docs/media-buy-lifecycle-coordinator.md)** - Negotiated catalog-to-purchase workflow across AdCP 3.0, 3.1, and 3.2; remaining buyer parity is tracked in [#1154](https://github.com/adcontextprotocol/adcp-client-python/issues/1154)
366368
- **[Media-buy action rights](docs/media-buy-action-rights.md)** - Assess product possibilities, accepted change rights, and currently available actions

‎SCHEMA_DELTAS.md‎

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,43 @@
11
# Generated-types delta
22

3+
## Files added
4+
5+
- `core/outcome_target_cost_per.py` — OutcomeTargetCostPer
6+
- `core/product_execution_requirement.py` — Connection, ProductExecutionRequirement, ProductExecutionRequirement1, ProductExecutionRequirement2, ProductExecutionRequirement3, RequiredForItem, Status
7+
- `core/reporting_delivery_offering_id.py` — ReportingDeliveryOfferingId
8+
- `enums/outcome_target_cost_strength.py` — OutcomeTargetCostStrength
9+
- `error_details/execution_requirement_unmet.py` — ExecutionRequirementUnmetDetails, Reason, UnmetRequirement
10+
311
## Field changes
412

513
- `bundled/protocol/get_adcp_capabilities_response.py`
6-
- `SupportedOptimizationMetric`: `+viewable_rate`
7-
- `core/budget_allocation.py`
8-
- `Metric`: `+viewable_rate`
9-
- `OptimizationGoal1`: `+standard`, `+vendor`
10-
- `core/canonical_optimization_goal.py`
11-
- `CanonicalOptimizationGoal1`: `+standard`, `+vendor`
12-
- `Metric`: `+viewable_rate`
13-
- `core/optimization_goal.py`
14-
- `Metric`: `+viewable_rate`
15-
- `OptimizationGoal8`: `+standard`, `+vendor`
14+
- `Features1`: `+seller_optimized_min_spend_targets`, `+seller_optimized_package_budgets`, `+seller_optimized_package_pacing`
15+
- `core/canonical_media_buy_features.py`
16+
- `CanonicalMediaBuyFeatures`: `+seller_optimized_min_spend_targets`, `+seller_optimized_package_budgets`, `+seller_optimized_package_pacing`
17+
- `core/canonical_product.py`
18+
- `CanonicalProduct`: `+collection_targeting_allowed`, `+collections`, `+execution_requirements`, `+targeting_resolution`
19+
- `core/canonical_reporting_capabilities.py`
20+
- `CanonicalReportingCapabilities`: `+reporting_delivery_offering_ids`
21+
- `core/media_buy_features.py`
22+
- `MediaBuyFeatures`: `+seller_optimized_min_spend_targets`, `+seller_optimized_package_budgets`, `+seller_optimized_package_pacing`
1623
- `core/product.py`
17-
- `MetricOptimization`: `+supported_viewability_standards`
18-
- `SupportedMetric`: `+viewable_rate`
19-
- `media_buy/list_creative_formats_request.py`
20-
- `ListCreativeFormatsRequest`: `+account`
21-
- `protocol/get_adcp_capabilities_response.py`
22-
- `SupportedOptimizationMetric`: `+viewable_rate`
24+
- `Product`: `+execution_requirements`
25+
- `core/reporting_capabilities.py`
26+
- **classes removed**: ReportingDeliveryOfferingId
27+
- `governance/sync_plans_response.py`
28+
- **classes added**: Status51
29+
- **classes removed**: Status50
30+
- `media_buy/get_media_buy_delivery_response.py`
31+
- `ReportingPeriod`: `+timezone`
32+
- `media_buy/get_products_request.py`
33+
- `Field1`: `+execution_requirements`
34+
- `Fields`: `-collection_targeting_allowed`, `-collections`, `-targeting_resolution`
35+
- `media_buy/media_buy_delivery_webhook_result.py`
36+
- `ReportingPeriod`: `+timezone`
37+
- `media_buy/outcome_target.py`
38+
- `OutcomeTarget`: `+cost_per`
39+
- `media_buy/product_fields.py`
40+
- `ProductResponseField`: `+collection_targeting_allowed`, `+collections`, `+execution_requirements`, `+targeting_resolution`
41+
- `sponsored_intelligence/si_sponsored_context_receipt.py`
42+
- **classes added**: Status46
43+
- **classes removed**: Status45

‎docs/releasing.md‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,17 @@
22

33
Release Please opens or updates the release PR after a push to `main`. It uses the
44
release App credential so the release PR receives normal CI. The workflow
5-
normalizes the proposed `pyproject.toml` prerelease version to PEP 440. Review
6-
and merge that PR once its required checks and reviews pass.
5+
normalizes the proposed `pyproject.toml` prerelease version to PEP 440 (a
6+
no-op for stable versions). Review and merge that PR once its required checks
7+
and reviews pass.
8+
9+
SDK 8 uses normal SemVer versioning: `release-please-config.json` has no
10+
`versioning: prerelease`, `prerelease-type`, or `prerelease` keys. To choose an
11+
exact version (for example the first stable release after an rc series), the
12+
squash commit that lands on `main` must end its body with a
13+
`Release-As: X.Y.Z` footer. The repository squashes with the branch commit
14+
messages as the default body, so check the final message in the merge dialog
15+
before confirming; the PR title and description alone are not parsed.
716
After re-enabling a disabled Release Please workflow, run it once manually on
817
`main` to process the current head; subsequent main pushes start it automatically.
918

‎docs/reporting-production.md‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ deploying these changes. They collect the historical comparison boundaries,
1111
feature-tier requirements and operational limits; final release qualification
1212
remains separate from the integrated source.
1313

14-
The default protocol is AdCP 3.2.0-rc.7. Set `ReportingProductionSupport`'s
15-
`adcp_version="3.2-rc.7"` or omit the pin for the packaged default. Historical
16-
rc.3 and rc.6 schemas are available offline but are not advertised as live reporting
17-
contracts. See [rc.7 adoption](protocol-3.2-rc7.md) and
14+
The default protocol is AdCP 3.2.1. Set `ReportingProductionSupport`'s
15+
`adcp_version="3.2"` or omit the pin for the packaged default. Historical
16+
rc.3, rc.6 and rc.7 schemas are not advertised as live reporting contracts.
17+
See [rc.7 adoption](protocol-3.2-rc7.md) and
1818
[signed rc.6 inputs and history boundaries](protocol-3.2-rc6.md) for
1919
version-aligned mounts and integrated-parent continuation limits. Existing
2020
schema manifests and stored snapshot bytes are unchanged.
@@ -185,7 +185,7 @@ rejection is never a materializer retry signal.
185185
A generation owes only complete periods whose start is at or after activation
186186
and strictly before deactivation. A period already begun at deactivation remains
187187
owed in full, including its SLA. The producer and captured feed use the same rule.
188-
For the current `3.2-rc.7` contract, an open summary's `next_expected_at` is its
188+
For the current `3.2` contract, an open summary's `next_expected_at` is its
189189
nearest future obligation due time. A **complete summary** instead reports the
190190
nearest future period **start**, strictly after the captured `ledger_as_of`,
191191
across the committed generations in scope. It is absent when no such period

‎docs/reporting-receipt-ingress.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ path or rewrite receipt history to make an error disappear.
9191

9292
## Wire and replay contract
9393

94-
Requests negotiate `adcp_version: "3.2-rc.7"`. This is the wire release spelling;
95-
`3.2.0-rc.7` is the bundle's semantic-version spelling. The reporting handler's
96-
public mount pin also selects unnegotiated traffic; its default is rc.7. General
94+
Requests negotiate `adcp_version: "3.2"`. This is the wire release spelling;
95+
`3.2.1` is the bundle's semantic-version spelling. The reporting handler's
96+
public mount pin also selects unnegotiated traffic; its default is 3.2. General
9797
SDK fallback behavior and unsupported-version rejection remain unchanged.
9898
Pinned, unpinned and fallback MCP inventories use an isolated schema overlay.
9999
Cached upstream schemas, generated models and older required protocols remain

‎docs/reporting-release-notes.md‎

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
# Reliable Reporting upgrade and release notes
22

3-
## 8.0.0 release candidate
3+
## 8.0.0
44

5-
`adcp` 8.0.0rc1 freezes the SDK API for 8.0.0. The final 8.0.0 release
6-
follows AdCP 3.2.0 final. The release candidate includes AdCP 3.0, 3.1 and
7-
3.2.0-rc.7 schema bundles.
5+
`adcp` 8.0.0 is the first stable SDK 8 release. It targets AdCP 3.2.1, the
6+
AdCP 3.2 general-availability release (`3.2` on the wire), and ships the
7+
AdCP 3.0, 3.1 and 3.2.1 schema bundles. The 3.2 release-candidate bundles
8+
are no longer shipped. AdCP 3.2.0 was withdrawn and is not a supported
9+
target.
10+
11+
Buyer receipt submission plans stored under `3.2-rc.6` or `3.2-rc.7` keep
12+
their exact request bytes and idempotency keys. A completed plan still
13+
replays for the same receipt list, and a new `3.2` reservation can follow it.
14+
A pending release-candidate plan remains readable, but the SDK refuses to send
15+
it (`INVALID_SUBMISSION_PLAN`) and never rewrites it as a `3.2` request.
816

917
## PostgreSQL worker contention
1018

@@ -85,13 +93,13 @@ reauthorization and per-session destination authorization.
8593

8694
## Current and historical protocol versions
8795

88-
Live reporting mounts and callers use AdCP `3.2-rc.7`, whose bundle spelling is
89-
`3.2.0-rc.7`. Omit an explicit pin to use the packaged default, or configure the
96+
Live reporting mounts and callers use AdCP `3.2`, whose bundle spelling is
97+
`3.2.1`. Omit an explicit pin to use the packaged default, or configure the
9098
current supported reporting version consistently across the composition and
9199
its mounts. Cross-cohort reporting requests are rejected even when optional
92100
request validation is disabled.
93101

94-
Historical beta.6, rc.3 and rc.6 schema bundles support offline validation and
102+
Historical beta.6, rc.3, rc.6 and rc.7 schema bundles support offline validation and
95103
retained historical walks. Their presence does not enable a historical live
96104
mount or client pin. In rc.6, an exactly scoped bilateral waiver can retire
97105
the public mismatch and project underlying seller health while retaining the

0 commit comments

Comments
 (0)