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.5 *.json *.jsonl *.yaml *.md
recursive-include src/adcp/_compliance/3.3.0-beta.6 *.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 @@ -18,6 +18,7 @@ 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
prune src/adcp/_compliance/3.3.0-beta.5
# 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 @@ -26,7 +27,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.5 *.json
recursive-include schemas/cache/3.3.0-beta.6 *.json
prune schemas/cache/2.5
prune schemas/cache/3.2.0-beta.6
prune schemas/cache/3.2.0-rc.3
Expand All @@ -37,9 +38,10 @@ 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/cache/3.3.0-beta.5
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.5.json
include schemas/releases/3.3.0-beta.6.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.5 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.6 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
142 changes: 141 additions & 1 deletion SCHEMA_DELTAS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,146 @@
# Generated-types delta

## Files added

- `core/installment_change.py` — Action, InstallmentChange
- `core/installment_change_set.py` — InstallmentChangeSet

## Files removed

- `core/audience_evidence_target.py` — AudienceEvidenceTarget
- `enums/audience_evidence_relationship.py` — AudienceEvidenceRelationship
- `error_details/price_adjustments_mismatch.py` — PriceAdjustmentsMismatchDetails
- `media_buy/package_forecast_input.py` — CommittedMetrics, CommittedMetrics1, CommittedMetrics2, PackageForecastInput, Qualifier
- `pricing_options/price_adjustments.py` — Kind, PriceAdjustments, PriceAdjustments1, PriceAdjustments2, PriceAdjustments3

## Field changes

- `a2ui/si_catalog.py`
- **classes added**: Action27
- **classes removed**: Action25
- `bundled/protocol/get_adcp_capabilities_response.py`
- **classes added**: SupportedDeliveryType
- `Creative`: `+supports_registry_policy_enforcement`
- `MediaBuy`: `+supported_delivery_types`
- `SupportedDimension`: `+installment_changes`
- `core/canonical_reporting_capabilities.py`
- `CanonicalReportingCapabilities`: `+available_installment_statuses`
- `core/creative_assignment.py`
- `CreativeAssignment`: `-landing_page_url`, `-trackers`
- `core/creative_review_sla.py`
- **classes added**: Clock
- `CreativeReviewSla`: `+business_calendar_id`, `+clock`, `+response_max`
- `core/escalation_sla.py`
- `EscalationSla`: `-clock`
- `core/geo_metro.py`
- `GeoMetro`: `+value_labels`
- `core/measurement_terms.py`
- `BillingMeasurement`: `-counting_mechanisms`
- `core/package.py`
- `Package`: `-start_requires_all_creatives_approved`
- `core/product_filters.py`
- `ProductFilters`: `-target_audiences`
- `core/reporting_capabilities.py`
- `ReportingCapabilities`: `-available_installment_statuses`
- `core/reporting_report_definition.py`
- `ContractVersion`: `+field_1_2`
- `core/requirements/video_asset_requirements.py`
- `Container`: `+field_3gp`, `+m4v`, `+mpeg`
- `core/sla_window.py`
- **classes removed**: Clock
- `SlaWindow`: `-business_calendar_id`, `-clock`
- `core/targeting.py`
- **classes added**: GeoValueLabels
- `GeoMetrosExcludeItem`: `+value_labels`
- `TargetingOverlay`: `+geo_value_labels`
- `core/targeting_input.py`
- `GeoMetrosExcludeItem`: `+value_labels`
- `TargetingOverlayInput`: `+geo_value_labels`
- `core/wholesale_feed_event.py`
- **classes removed**: Range
- **classes added**: Payload20
- **classes removed**: Payload19
- `Payload`: `+canonical_pricing_options`, `+effective_at`, `+previous_pricing_option_ids`, `+pricing_options`, `+retracts_event_id` `-removal_reason`
- `creative/list_creatives_response.py`
- `AssignedPackage`: `+installment_refs`
- `creative/sync_creatives_request.py`
- `Assignment`: `-landing_page_url`, `-trackers`
- `AssignmentOperations1`: `+installment_refs`
- `AssignmentOperations3`: `+installment_refs`
- `enums/error_code.py`
- `ErrorCode`: `+UNRECOGNIZED_TERMS`
- `enums/proposal_decline_reason.py`
- `ProposalDeclineReason`: `+unrecognized_terms`
- `formats/canonical/coordinated_placements.py`
- **classes added**: CardImageSize
- `Params4`: `+card_image_sizes`
- `formats/canonical/image_carousel.py`
- **classes added**: CardImageSize
- `CanonicalFormatImageCarousel`: `+card_image_sizes`
- `media_buy/create_media_buy_request.py`
- `ArtifactWebhook`: `-signing_profile`
- `CreateMediaBuyRequest`: `-lineage_reason`, `-predecessor_media_buy_id`
- `media_buy/get_media_buys_response.py`
- `CreativeApproval`: `+installment_refs`
- `media_buy/get_products_request.py`
- `GetProductsRequest`: `-include_collections`, `-include_execution_readiness`
- `Refine2`: `-package`
- `media_buy/get_products_response.py`
- **classes removed**: ExecutionReadiness
- `GetProductsResponse`: `-collections`, `-execution_readiness`
- `RefinementApplied2`: `-resolved_end_time`, `-resolved_start_time`, `-result_product_id`
- `media_buy/list_products_request.py`
- `ListProductsRequest`: `+include_execution_readiness`
- `media_buy/list_products_response.py`
- **classes added**: ExecutionReadiness
- `ListProductsResponse1`: `+execution_readiness`
- `ListProductsResponse2`: `+execution_readiness`
- `media_buy/package_request.py`
- **classes added**: CommittedMetrics1, CommittedMetrics2
- **classes removed**: CommittedMetrics, CommittedMetrics5
- `PackageRequest`: `-start_requires_all_creatives_approved`, `-target_audiences`
- `media_buy/package_update.py`
- `PackageUpdate`: `-start_requires_all_creatives_approved`
- `media_buy/product_refinement.py`
- **classes added**: Action13
- **classes removed**: Action12
- `media_buy/proposal_refinement.py`
- **classes added**: ProposalRefinement11
- `ProposalRefinement10`: `+installment_changes`
- `ProposalRefinement2`: `+installment_changes`
- `ProposalRefinement3`: `+installment_changes`
- `ProposalRefinement4`: `+installment_changes`
- `ProposalRefinement5`: `+installment_changes`
- `ProposalRefinement6`: `+installment_changes`
- `ProposalRefinement7`: `+installment_changes`
- `ProposalRefinement8`: `+installment_changes`
- `ProposalRefinement9`: `+installment_changes`
- `media_buy/refine_proposals_response.py`
- **classes added**: UnsatisfiedInstallmentChange
- `Results10`: `+unsatisfied_installment_changes`
- `Results11`: `+unsatisfied_installment_changes`
- `Results12`: `+unsatisfied_installment_changes`
- `Results15`: `+unsatisfied_installment_changes`
- `Results16`: `+unsatisfied_installment_changes`
- `Results17`: `+unsatisfied_installment_changes`
- `Results9`: `+unsatisfied_installment_changes`
- `pricing_options/cpc_option.py`
- `CpcPricingOption`: `-price_adjustments`
- `pricing_options/cpcv_option.py`
- `CpcvPricingOption`: `-price_adjustments`
- `pricing_options/cpm_option.py`
- `CpmPricingOption`: `-price_adjustments`
- `pricing_options/cpp_option.py`
- `CppPricingOption`: `-price_adjustments`
- `pricing_options/cpv_option.py`
- `CpvPricingOption`: `-price_adjustments`
- `pricing_options/flat_rate_option.py`
- `FlatRatePricingOption`: `-price_adjustments`
- `pricing_options/vcpm_option.py`
- `VcpmPricingOption`: `-price_adjustments`
- `protocol/get_adcp_capabilities_response.py`
- `Creative`: `+supports_registry_policy_enforcement`
- `MediaBuy`: `+supported_delivery_types`
- `SupportedDimension`: `+installment_changes`
- `protocol/sync_principal_response.py`
- **classes added**: Action37
- **classes removed**: Action35
28 changes: 26 additions & 2 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.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) |
| Wire pin | `src/adcp/ADCP_VERSION` is `3.3.0-beta.6` (was `3.3.0-beta.0`, then `3.3.0-beta.1`, `3.3.0-beta.2`, `3.3.0-beta.3`, `3.3.0-beta.4` and `3.3.0-beta.5`; see sections 11 to 16); bundle key `3.3.0-beta.6` (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.6`, 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.6, 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 @@ -324,3 +324,27 @@ the bundle's `CHANGELOG.md` and adcontextprotocol/adcp#8375, #8409.
| 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 |

## 16. 3.3.0-beta.6 delta

Adopted from the signed `3.3.0-beta.6` bundle (pinned in
`schemas/releases/3.3.0-beta.6.json`, source commit
`aa94f361d7cd290f2cb926a0e3f75c62670f5edc`, bundle sha256
`99c0ba47f42ca03a5ac343540d9d60f62ec91d2afb47c5b58f59a096bd33504b`). Sources:
the bundle's `CHANGELOG.md` and adcontextprotocol/adcp#8501, DR-0036, #8793,
#8458, #8862, #8966, #8967, #8968 and #8971.

| Item | Detail | SDK status |
| --- | --- | --- |
| Wire pin | `3.3.0-beta.6` / `3.3-beta.6`. `3.3-beta.5` is no longer advertised or accepted as a pin; its cache and compliance trees stay in the source tree and leave the wheel. | done |
| Withdrawals from deprecated tasks (#8501) | The 3.3 additions to `get_products`, `create_media_buy` / `update_media_buy` and the `sync_creatives` `assignments[]` row are withdrawn: `include_collections`, `collections`, `execution_readiness` and the refine echo fields on `get_products` (both shapes are 3.2 again), `lineage_reason`, `predecessor_media_buy_id`, the artifact webhook's `signing_profile`, `start_requires_all_creatives_approved` off every package but `PackageControl`, `price_adjustments`, `target_audiences`, `counting_mechanisms`, assignment `landing_page_url` / `trackers`, `PackageForecastInput`. Execution readiness moves to `list_products`. | generated. The `control_media_buy` start-policy gate (#1872, #1878) stays: beta.6 keeps the field on `PackageControl`. The forward-compat bridge for `PackageForecastInput` is removed. Tests that used `get_products` as the 3.3-only example use `list_products` |
| Schemas open within a major (DR-0036) | A schema is closed only for a structural reason; the rest open. | generated: 113 closed models remain. The reporting `scope` fixer keeps an unknown selector as received (never `all_media_buys`, still one key); `prepare_proposal_created` refuses undeclared keys (identifiers only); receipt history accepts only the keys the store writes; unknown keys on reporting adjustments and macro-resolution capabilities are kept |
| Signed terms bind every member | `terms_digest` covers all of `commercial_terms`, unknown members and `ext` included. | already so: `compute_terms_digest` hashes the raw wire mapping (RFC 8785) |
| Installments (#8967, #8968) | Experimental `installment_refs` on `sync_creatives` `assign` / `replace` with readbacks; installment refinement through `refine_proposals` (`installment_changes`, `unsatisfied_installment_changes`, `InstallmentChange`, `InstallmentChangeSet`). | generated. `adcp.negotiation` counts `installment_changes` (and `remove_media_buy_frequency_cap`) as a typed revision, gates it by `supported_dimensions`, takes `unsatisfied_installment_changes` into the `constraint_unsatisfiable` rules, and checks each entry repeats a requested change. Not checked: that a partial result's drafts satisfy the omitted entries. No seller enforcement |
| Report definitions at `contract_version` 1.2 (#8971) | A definition whose `dimensions` include `media_buy_id` must include `package_id`; 1.2 keeps the 1.1 `official_correction_mode` rule; new `reporting-report-definition` vectors. | generated (`ContractVersion` gains `1.2`). The manifest inspector now also validates the definition against the pinned schema, so the 1.1 and 1.2 conditionals the model omits are enforced; the vectors run through the SDK's validator. Serving only 1.0 / 1.1 definitions to a caller pinned below 3.3 is the seller's choice of offering; the SDK does not check it |
| Geo labels (#8966) | `geo_value_labels` on targeting and `value_labels` on geo metros: display names that never change targeting. | generated |
| Capabilities | `media_buy.supported_delivery_types` (#8458), `creative.supports_registry_policy_enforcement`. | generated |
| Reporting delivery (#8793) | Experimental `https_put` file-transfer token and the no-buyer-secrets rule; descriptions only, no shape change. | no `REPORTING_STORAGE_CONTRACT` change, no ledger columns |
| Origin-only `authorized_agents[].url` (#8862) | An entry with the root path and no query authorizes every agent at that origin; an entry with a path still matches exactly. | `find_authorized_agent_entries` (and every adagents verifier through it) and `fetch_publisher_signing_pins`, where an exact URL entry still wins |
| Other | `image_carousel` `card_image_sizes`, video containers `3gp` / `mpeg` / `m4v`, `UNRECOGNIZED_TERMS`, seventeen URL patterns loosened to `^https://`, `sla-window` back to its 3.2.8 shape. | generated. Numbered names renumber where siblings changed (`Action25` → `Action27`, `Payload19` → `Payload20`, ...) |
| Reporting subscriptions | No change: the six vendored coverage-vector files are byte-identical to the bundle's. | the parity test passes unchanged |
2 changes: 1 addition & 1 deletion docs/agent-identity-3-3-migration.md
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,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.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`.
The schemas are the 3.3.0-beta.6 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