Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 5 additions & 3 deletions MANIFEST.in
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ recursive-include src/adcp py.typed
recursive-include src/adcp/reporting/materializer/assets *.json
recursive-include src/adcp/_compliance/3.2.1 *.json *.jsonl *.yaml *.md
recursive-include src/adcp/_compliance/3.2.4 *.json *.jsonl *.yaml *.md
recursive-include src/adcp/_compliance/3.3.0-beta.4 *.json *.jsonl *.yaml *.md
recursive-include src/adcp/_compliance/3.3.0-beta.5 *.json *.jsonl *.yaml *.md
recursive-include src/adcp/_compliance/3.2.7 *.json *.jsonl *.yaml *.md
# build_py copies the tracked cache into wheels. Do not duplicate those
# inputs with ignored, generated package copies in the source distribution.
Expand All @@ -17,6 +17,7 @@ prune src/adcp/_compliance/3.3.0-beta.0
prune src/adcp/_compliance/3.3.0-beta.1
prune src/adcp/_compliance/3.3.0-beta.2
prune src/adcp/_compliance/3.3.0-beta.3
prune src/adcp/_compliance/3.3.0-beta.4
# A clean VCS source tree has no ignored ``src/adcp/_schemas`` directory.
# Keep the tracked inputs needed by the build_py hook in source distributions
# so wheels built from an sdist have the same schema set as direct VCS wheels.
Expand All @@ -25,7 +26,7 @@ recursive-include schemas/cache/3.0 *.json
recursive-include schemas/cache/3.1 *.json
recursive-include schemas/cache/3.1.15 *.json
recursive-include schemas/cache/3.2 *.json
recursive-include schemas/cache/3.3.0-beta.4 *.json
recursive-include schemas/cache/3.3.0-beta.5 *.json
prune schemas/cache/2.5
prune schemas/cache/3.2.0-beta.6
prune schemas/cache/3.2.0-rc.3
Expand All @@ -35,9 +36,10 @@ prune schemas/cache/3.3.0-beta.0
prune schemas/cache/3.3.0-beta.1
prune schemas/cache/3.3.0-beta.2
prune schemas/cache/3.3.0-beta.3
prune schemas/cache/3.3.0-beta.4
prune schemas/releases
include schemas/releases/3.2.1.json
include schemas/releases/3.2.4.json
include schemas/releases/3.2.7.json
include schemas/releases/3.1.27.json
include schemas/releases/3.3.0-beta.4.json
include schemas/releases/3.3.0-beta.5.json
5 changes: 3 additions & 2 deletions MIGRATION_v9_to_v10.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion RELEASING.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ releases ([#1525](https://github.com/adcontextprotocol/adcp-client-python/issues
| --- | --- | --- |
| `main` | Work against the latest ratified AdCP version (3.2.x today) | The current major (9.x), through release-please |
| `release/N.x` (`release/8.x`, `release/7.x`) | Fixes for an older major | Patch releases of that major, from the branch's own release workflow |
| `next` | SDK 10 on AdCP 3.3 (the 3.3.0-beta.4 bundle, agent identity, Web Bot Auth) | Pre-releases only (`10.0.0-beta.N`), from its own release-please configuration |
| `next` | SDK 10 on AdCP 3.3 (the 3.3.0-beta.5 bundle, agent identity, Web Bot Auth) | Pre-releases only (`10.0.0-beta.N`), from its own release-please configuration |

Open a PR against the branch that carries the spec it implements. Code written
to an unratified spec (an open adcontextprotocol/adcp PR or a draft) targets
Expand Down
35 changes: 15 additions & 20 deletions SCHEMA_DELTAS.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,21 @@
# Generated-types delta

## Files added

- `core/match_key.py` — MatchKey
- `enums/match_key_use.py` — MatchKeyUse

## Field changes

- `account/list_account_changes_response.py`
- **classes added**: Status53
- **classes removed**: Status54
- `bundled/protocol/get_adcp_capabilities_response.py`
- `Creative`: `+supports_provenance`
- `compliance/comply_test_controller_response.py`
- **classes added**: SetAccountTimezoneResult
- `error_details/budget_too_low.py`
- **classes added**: Basis
- `BudgetTooLowDetails`: `+basis`, `+budget_field`, `+constraint`, `+related_field`
- `governance/sync_plans_response.py`
- **classes added**: Status96
- **classes removed**: Status97
- `media_buy/create_media_buy_request.py`
- **classes removed**: Opportunity, Status
- `media_buy/get_media_buys_response.py`
- `Package`: `+added_at`
- **classes added**: BrandKitOverride11, PropertyType, SupportedMatchKey, Use, Vendor9
- **classes removed**: Surface
- `MediaBuy`: `+supported_match_keys`
- `core/product_identity.py`
- `ProductIdentity`: `+match_keys`
- `protocol/get_adcp_capabilities_response.py`
- `Creative`: `+supports_provenance`
- `sponsored_intelligence/si_sponsored_context_receipt.py`
- **classes added**: Status76
- **classes removed**: Status77
- `MediaBuy`: `+supported_match_keys`
- `trusted_match/provider_registration.py`
- **classes added**: MatchKey, Use
- `TmpProviderRegistration1`: `+match_keys`
- `TmpProviderRegistration2`: `+match_keys`
24 changes: 21 additions & 3 deletions docs/adcp-3.3-sdk-inventory.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ it adopted the bundle, and what is left to the codegen/wire-fidelity (2) and

| Item | Detail | SDK status |
| --- | --- | --- |
| Wire pin | `src/adcp/ADCP_VERSION` is `3.3.0-beta.4` (was `3.3.0-beta.0`, then `3.3.0-beta.1`, `3.3.0-beta.2` and `3.3.0-beta.3`; see sections 11 to 14); bundle key `3.3.0-beta.4` (prereleases keep their full identifier, `resolve_bundle_key`). The 3.2 cache stays synced from the signed 3.2.4 release as a preview bundle (`PREVIEW_VERSIONS`), beside 3.1.27. | done (1) |
| Advertised versions | `COMPATIBLE_ADCP_VERSIONS = ("3.0", "3.1", "3.2", "3.3")`; `get_supported_adcp_versions()` advertises the exact prerelease `3.3-beta.4`, never a stable `3.3`, so buyers opt into the beta they validated against (DR-0024). Full set: `3.0, 3.1, 3.2, 3.3-beta.3, 3.2-rc.7`. | done (1) |
| Wire pin | `src/adcp/ADCP_VERSION` is `3.3.0-beta.5` (was `3.3.0-beta.0`, then `3.3.0-beta.1`, `3.3.0-beta.2`, `3.3.0-beta.3` and `3.3.0-beta.4`; see sections 11 to 15); bundle key `3.3.0-beta.5` (prereleases keep their full identifier, `resolve_bundle_key`). The 3.2 cache stays synced from the signed 3.2.4 release as a preview bundle (`PREVIEW_VERSIONS`), beside 3.1.27. | done (1) |
| Advertised versions | `COMPATIBLE_ADCP_VERSIONS = ("3.0", "3.1", "3.2", "3.3")`; `get_supported_adcp_versions()` advertises the exact prerelease `3.3-beta.5`, never a stable `3.3`, so buyers opt into the beta they validated against (DR-0024). Full set: `3.0, 3.1, 3.2, 3.3-beta.5, 3.2-rc.7`. | done (1) |
| Negotiation | `negotiate_version` matches prereleases exactly. The client's outgoing conversion treats the SDK's served prerelease as its line (`is_convertible_version`), so a 3.3-beta.0 buyer still negotiates down to a 3.1 or 3.2 seller. | done (1) |
| Translation | `convert_payload` steps 3.3-beta.0 ↔ 3.2 ↔ 3.1 ↔ 3.0 through the bundled schemas; the 3.3 step uses the `3.3.0-beta.0` bundle. Downgrades go through `_require_target_valid`, so a converted payload the older schema refuses fails as `ADCPVersionConversionError` (#1621 / #1630). | done (1); per-field rules below are (3) |
| Restricted servers | A server that lists `supported_versions` without `adcp_version` now pins to the newest listed release (`version_policy.default_adcp_version`), instead of refusing because the SDK default (3.3-beta.0) is outside the list. | done (1) |
Expand Down Expand Up @@ -213,7 +213,7 @@ Tracking issue: #1648 (label `sdk-10`). Items not covered by the tables above:

| Item | Detail | SDK status |
| --- | --- | --- |
| Pinned PSL snapshot | `security.mdx` R3a requires eTLD+1 under a pinned, dated snapshot. The SDK vendors `signing/_psl/public_suffix_list.dat` (publicsuffix.org `2025-04-07_15-51-09_UTC`, commit `5fc8d12c`, the list `tldextract` 5.4.0 bundles) and exposes `adcp.signing.PSL_SNAPSHOT`. | mechanism done, #1652; the reference snapshot is blocked on adcontextprotocol/adcp#8409, #1562 |
| Pinned PSL snapshot | `security.mdx` R3a requires eTLD+1 under a pinned, dated snapshot. The SDK vendors `signing/_psl/public_suffix_list.dat` (publicsuffix.org `2025-04-07_15-51-09_UTC`, commit `5fc8d12c`, the list `tldextract` 5.4.0 bundles) and exposes `adcp.signing.PSL_SNAPSHOT`. | done, #1652. DR-0037 (3.3.0-beta.5, adcontextprotocol/adcp#8409) names no reference snapshot: each verifier uses a list bundled with it, refreshed through dependency updates, which is what the vendored list is |
| Web Bot Auth library migration | RFC 9421 on `http-message-signatures`, `http-sf`; deprecation warnings; resolver type check; PSL PRIVATE quota grouping | done; #1511 closed |
| Agent identity remainder | `account.agent_onboarding` declaration, `security_profiles` declaration (after the preview types are retired by #1662) | (3), #1500 |
| A2A hardening follow-ups | strip `adcp_task_binding` from client-visible task metadata; unsigned-server parser; `input` member; discovery bypass parser | (3), #1637 |
Expand Down Expand Up @@ -305,3 +305,21 @@ adcontextprotocol/adcp#8718, #8717 and #8724.
| Full tzdata 2026f (#8718) | The reference model carries every zone; new vectors in Pacific/Auckland, Pacific/Chatham, Asia/Kolkata and America/Mexico_City. | the parity test runs all 138 vectors under `tzdata==2026.6` |
| Controller (#8717) | `reset_state` (required alongside `reporting_subscription_probe`), `SetAccountTimezoneResult`, the `owed_periods_match` retention window. | `TestControllerStore.reset_state`, checked at registration; probe results nested under `simulated`; the reference seller serves both. No SDK runner implements `owed_periods_match` |
| Generated renames | Numbered names renumber (`Status54` → `Status53`, `Status97` → `Status96`, `Status77` → `Status76`); `create_media_buy_request` drops `Opportunity` / `Status` (#8709). | generated |

## 15. 3.3.0-beta.5 delta

Adopted from the signed `3.3.0-beta.5` bundle (pinned in
`schemas/releases/3.3.0-beta.5.json`, source commit
`5ae065826eaeda7a3d7bc72e228833d9ceea1e32`, bundle sha256
`6c716e67b127cde3c85421e0fe798259187937677ea078ce2b27613d929957e2`). Sources:
the bundle's `CHANGELOG.md` and adcontextprotocol/adcp#8375, #8409.

| Item | Detail | SDK status |
| --- | --- | --- |
| Wire pin | `3.3.0-beta.5` / `3.3-beta.5`. `3.3-beta.4` is no longer advertised or accepted as a pin; its cache and compliance trees stay in the source tree and leave the wheel. | done |
| Match keys (#8375, experimental `media_buy.match_keys`) | `core/match-key.json` and `enums/match-key-use.json`; `media_buy.supported_match_keys` on `get_adcp_capabilities` (at most 64), `Product.identity.match_keys`, `match_keys` on TMP provider registration. Compatibility, `persistent_identifier` and `vendor` rules are normative prose. | generated (`core.match_key.MatchKey`, `enums.MatchKeyUse`, `ProductIdentity.match_keys`); the SDK enforces none of the prose rules |
| `sales-fixed-rate` promoted to stable (DR-0028) | The specialism leaves `preview`; the storyboard is unchanged. | no change: the SDK already lists it with the other `sales-*` specialisms |
| Public Suffix List (DR-0037, #8409) | Verifiers compute eTLD+1 with a bundled list, ICANN and PRIVATE sections, never fetched at runtime; AdCP names no reference snapshot. | no change: the SDK vendors its list (`adcp.signing.PSL_SNAPSHOT`); the trust.json `grantee` description regenerates |
| Compliance fixtures | `deterministic_testing` storyboard account scoping, the legacy creative asset test-kit catalog. | the packaged `_compliance/3.3.0-beta.5` files are byte-identical to beta.4's; only the manifest and provenance change (4712 manifest files) |
| Reporting subscriptions | No change. The six vendored coverage-vector files are byte-identical to the bundle's. | the parity test passes unchanged; no `REPORTING_STORAGE_CONTRACT` bump |
| Generated names | No renumbering. `adcp.types._generated.MatchKey` now resolves to `core.match_key` (a stem match); the signals `MatchKey` stays under `adcp.types.domains.signals`. The bundled capabilities module's TMP `Surface` enum is now `PropertyType`. | generated |
4 changes: 2 additions & 2 deletions docs/agent-identity-3-3-migration.md
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ Framework `serve` dispatch projects authorization failures through the existing

`TrustRecordEvaluator` derives `https://{eTLD+1}/.well-known/trust.json` using the SDK's pinned ICANN and PRIVATE PSL snapshot. It follows one `authoritative_location` pointer while preserving the original owner, follows no HTTP redirects, caps bytes at 2 MiB, rejects ambiguous JSON, and caches no longer than the configured polling interval (default 60 seconds). Negative results are cached for 60 seconds.

The SDK vendors its PSL snapshot instead of using the one bundled in the installed `tldextract`, and `adcp.signing.PSL_SNAPSHOT` gives the snapshot's upstream version, commit and SHA-256. Compare it with a counterparty's when two verifiers disagree on a registrable domain. The spec has not named a reference snapshot yet (adcontextprotocol/adcp#8409).
The SDK vendors its PSL snapshot instead of using the one bundled in the installed `tldextract`, and `adcp.signing.PSL_SNAPSHOT` gives the snapshot's upstream version, commit and SHA-256. Compare it with a counterparty's when two verifiers disagree on a registrable domain. AdCP names no reference snapshot (DR-0037, adcontextprotocol/adcp#8409, in 3.3.0-beta.5): each verifier uses a list bundled with it and refreshes it through dependency updates. On the trust-record path, the spec has a verifier whose list lacks a newly added PRIVATE suffix fail closed.

- **Host budgets.** Fetches to an operator's own hosts are limited per `(operator, host)` (`max_fetches_per_host`, 4). `authoritative_location` hops to hosts outside the operator's registrable domain share a separate global per-host budget (`max_foreign_fetches_per_host`, 16), so a hop never spends the target operator's own budget and many operators cannot multiply fetches to one host. Host cool-downs are scoped to `(operator, host)` and never follow content errors. A budget refusal is a retryable outage that is never cached as a failure.
- **Authority history** (which operators have served a 200, and the last record read from each) is security state. It is never evicted. The in-memory default admits at most `max_history_records` (65,536) operators and `max_history_records_per_operator` (64) per quota group (PSL PRIVATE tenants count under their provider). A new operator over quota is refused as unavailable before fetching, and no other operator's history is lost. Losing this history (a restart, another replica) turns a later 404 into absence, re-enabling brand.json fallback, or turns a delisting into an outage. The evaluator has no pluggable durable history store yet; until it does, run it in one long-lived process per seller, or treat brand.json fallback as unavailable for houses you have seen publish.
Expand Down Expand Up @@ -224,7 +224,7 @@ Typed client results preserve `adcp_error`, including its code, recovery guidanc

Use the preview `RequestSigning` model (`adcp.types.experimental_identity`) to advertise `profiles=["adcp/request-signing/v1", "web-bot-auth"]` on a server accepting both. The preview reader models preserve unknown onboarding requirement kinds so applications can fall back to the posture's message and URL; unknown kinds cannot be satisfied automatically. Authoring validation still enforces the pinned schema, including its conditionals: `aao_verified` requires `role`, and `storyboard` and `experimental_feature` require `id`. A trust record whose posture breaks them fails validation, for readers as for authors.

The schemas are the 3.3.0-beta.4 bundle's (`core/agent-onboarding.json`, `core/buyer-onboarding-posture.json`, `core/principal-relationship.json`, `trust/v1/trust.json` and their enums), the same documents the earlier preview vendored from adcp main after #8168, #8169 and #8170 merged: the buyer posture lives only in trust.json, at `profiles.adcp.onboarding` on the record and on an agent entry; one mode enum (`open`, `application`, `invite_only`) serves sellers and buyers; the `agent_identity` requirement kind and `documentation_url` are gone; `aao_verified` uses `verified_specialisms`; `relationship.status` uses `pending_approval`.
The schemas are the 3.3.0-beta.5 bundle's (`core/agent-onboarding.json`, `core/buyer-onboarding-posture.json`, `core/principal-relationship.json`, `trust/v1/trust.json` and their enums), the same documents the earlier preview vendored from adcp main after #8168, #8169 and #8170 merged: the buyer posture lives only in trust.json, at `profiles.adcp.onboarding` on the record and on an agent entry; one mode enum (`open`, `application`, `invite_only`) serves sellers and buyers; the `agent_identity` requirement kind and `documentation_url` are gone; `aao_verified` uses `verified_specialisms`; `relationship.status` uses `pending_approval`.

Import experimental models from `adcp.types.experimental_identity`: `AgentOnboarding`, its modes/tiers/requirements, `BuyerOnboardingPosture`, `TrustRecord`, `GetPrincipalResponse`, `PrincipalRelationship`, `PrincipalRelationshipStatus`, `PrincipalChangedWebhook`, and `GrantAbsentDetails`. They are the generated 3.3 types (`adcp.types.domains.core.*`, `adcp.types.domains.trust.v1.trust`) under those names; validate behavioral constraints with the trust helpers.

Expand Down
Loading
Loading