Skip to content

feat(protocol)!: adopt the signed AdCP 3.3.0-beta.2 bundle - #1732

Merged
bokelley merged 2 commits into
nextfrom
bokelley/adopt-3.3.0-beta.2
Oct 30, 2026
Merged

bokelley merged 2 commits into
nextfrom
bokelley/adopt-3.3.0-beta.2

Conversation

@bokelley

@bokelley bokelley commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

Adopts the signed AdCP 3.3.0-beta.2 release on next (SDK 10 beta line), following #1691.

Breaking change: 3.3-beta.1 is dropped

The SDK no longer advertises or accepts AdCP 3.3-beta.1. This matches how 3.3-beta.0 and the 3.2 release candidates were dropped once superseded.

  • get_supported_adcp_versions() → ('3.0', '3.1', '3.2', '3.3-beta.2', '3.2-rc.7')
  • adcp_version="3.3-beta.1" / "3.3.0-beta.1" now raises ConfigurationError.
  • A peer that advertises only 3.3-beta.1 for the 3.3 line is negotiated like any other unserved prerelease, down to 3.2.
  • Adopters who pinned 3.3-beta.1 (the SDK 10.0.0-beta.2 default) should re-pin to 3.3-beta.2 or remove the pin.

The commit is feat(protocol)!: with a BREAKING CHANGE: footer. On next, release-please still only bumps the beta number.

Release pin

  • schemas/releases/3.3.0-beta.2.json records the four artifacts' sizes and sha256. They were cosign-verified (Verified OK) against release.yml@refs/heads/main.
  • The bundle sha256 is d75dc90192a2d13ffae2103f30bd505040a7ff0a40f8a7946d82730428dd6e8a.
  • The source commit 53e7677df65ab0abd045b47257c93040952f687d comes from the Fulcio certificate (OIDs 1.3.6.1.4.1.57264.1.3 / .13). The v3.3.0-beta.2 tag (fa39ca87) is its "Version Packages" child, the same layout as beta.1.
  • Synced with scripts/sync_schemas.py --require-signed-release, then ran the full regeneration chain and the public API snapshot:
    • fix_schema_refs, bundle_schemas, versioned stubs/bases, generate_types, consolidate_exports, generate_ergonomic_coercion
    • make validate-generated checks are clean.

What beta.2 changes in the SDK

  • request_account: allow_separate_account (default false) and the created / matched change outcomes. The new correctable error code ACCOUNT_CHANGE_REQUIRES_NEW_ACCOUNT takes its recovery from the pinned enumMetadata, with no hand-maintained table to update.
  • Reporting subscriptions: the fields settled after beta.1 are now generated:
    • standard_dimensions / unmapped_dimensions
    • inactive_intervals
    • prior_versions[].configuration
    • per-offering offering_id on gaps[] / timezone_cutovers[] / excluded[]
    • previous_timezone
  • Seller offers: experimental proposal_initiator, offer_reason and ProposalOfferedWebhook.
  • Measurement provenance: experimental CollectionMechanism, counting_mechanisms and VendorMetricProvenance.
  • Withdrawn from 3.3 (feat(schemas): withdraw definition pins, purchase rights, and installment selection from 3.3 (planned for 4.0) adcp#8537): definition pins, purchase rights and installment selection. Their generated types are gone:
    • DefinitionPin*, DefinitionPinReferenceKind, ReferenceDefinitionChangedDetails, DriftedPin, RightsScope, InstallmentChangeSet
    • ErrorCode.REFERENCE_DEFINITION_CHANGED, definition_changed
    • adcp.types.error_details drops the two pin names.
    • TestControllerStore.definition_pin_probe and the definition_pin_probe scenario are removed.
  • notification-config.json product_payload_view: beta.2 removes the schema default, and the docs now say that an absent value means legacy.
    • The generated field now defaults to None.
    • AdCPBaseModel's serializer used to re-add the default on product subscriptions. It would now have emitted an explicit null, so it emits the view only when one is set.
    • The wire-default tests, docs/reporting-status-notifications.md and the migration guide are updated.
    • WebhookSender still sends legacy on product notifications when no view is configured.
  • No task was added, so the client, handler, adapter and CLI wiring is unchanged.
  • fix(schemas): compose the protocol envelope on every task response (#8518) adcp#8547 (protocol envelope composition) merged after beta.2, so it is not in this bundle.

Note for the reporting-subscriptions stack (#1699 and follow-ups)

adcp.types._reporting_subscription_preview is on next and still runs. Its _add_field calls now no-op, because every field it adds is generated. The generated InactiveInterval replaces its ReportingSubscriptionInactiveInterval on the model. Its _replace_field on dimensions still applies. Nothing breaks, and I left the preview module, reporting/subscriptions/wire.py and the reporting tests that validate beta.1 projections unchanged. The stack's rebase can remove them.

Packaging

  • The wheel and sdist ship _schemas/3.3.0-beta.2 and _compliance/3.3.0-beta.2.
  • The beta.1 cache and compliance trees stay in the repo as history and are pruned from distributions.

Test fallout

  • The adoption test is renamed to test_adcp_3_3_0_beta_2_adoption.py. It has the signed identity values (4632 manifest files, 242 provenance files, 1757 schemas) and asserts that beta.0 and beta.1 are rejected.
  • The version-conversion sweep, the 3.3 downgrade test and the packaging/historical tests point at the new pin.
  • The open-error-code downgrade case now uses RIGHTS_CHANNEL_VIOLATION instead of the withdrawn REFERENCE_DEFINITION_CHANGED.

Docs

  • MIGRATION_v9_to_v10.md: the pin and breaking note, plus rows for the withdrawals and the new surface.
  • docs/adcp-3.3-sdk-inventory.md: a new §12, with the withdrawn rows struck through.
  • Pin references updated in RELEASING.md, docs/cross-version-conversion.md and docs/agent-identity-3-3-migration.md.

Local verification

  • ruff (CI scope) and mypy pass, as do the mypy --strict adopter checks, pyright adopter checks and the type-ignore contract.
  • Unit suite (after the product_payload_view fix): 15,519 passed, 0 failed.
  • Conformance/integration (serial): 4,874 passed.
    • The one real failure was the product_payload_view default (the CI failure on the first push). It is fixed and its tests pass.
    • The remaining errors came from a pytest temp directory I removed while the run was going. The affected tests pass on rerun, and CI runs them all.
    • The Postgres lanes skip locally.

BREAKING CHANGE: the SDK no longer advertises or accepts AdCP 3.3-beta.1. An adcp_version pin of 3.3-beta.1 or 3.3.0-beta.1 raises ConfigurationError, and a peer that advertises only 3.3-beta.1 for the 3.3 line negotiates 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.

🤖 Generated with Claude Code

Pin src/adcp/ADCP_VERSION to 3.3.0-beta.2 from the audited, cosign-verified
release (schemas/releases/3.3.0-beta.2.json, source commit 53e7677df65a from
the Fulcio certificate, bundle sha256 d75dc901...). Resync the schema cache,
packaged compliance inputs and request-signing vectors with
--require-signed-release, regenerate types and the public API snapshot.

Beta.2 adds request_account's allow_separate_account with created/matched
change outcomes and the ACCOUNT_CHANGE_REQUIRES_NEW_ACCOUNT error code, the
settled reporting-subscription fields, experimental seller offers and
measurement provenance. adcontextprotocol/adcp#8537 withdrew definition pins,
purchase rights and installment selection from 3.3: their generated types
leave the tree, ReferenceDefinitionChangedDetails and
DefinitionPinReferenceKind leave adcp.types.error_details, and the
definition_pin_probe test-controller scenario is removed.

The wheel ships the 3.3.0-beta.2 schemas and compliance tree; the beta.1
trees stay in the repository as history and are pruned from distributions.

BREAKING CHANGE: 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.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ladon verdict: Approve

Approve — clean adoption of the signed AdCP 3.3.0-beta.2 bundle.

The PR introduces new schema cache files under schemas/** (all added) plus paired regeneration of domains/** with the ADCP_VERSION bump. The breaking surface removals (DefinitionPin*, DefinitionPinReferenceKind, ReferenceDefinitionChangedDetails, ErrorCode.REFERENCE_DEFINITION_CHANGED, DriftedPin, RightsScope, InstallmentChangeSet, RightUse.paid_amplification/content_reuse, TestControllerStore.definition_pin_probe) carry the required semver signal — feat(protocol)! plus a BREAKING CHANGE footer — and are documented in MIGRATION_v9_to_v10.md and inventory §12; the public_api_snapshot diff matches exactly. Asset unions (format.py) and the forward-compat/aliases/ergonomic layer are untouched. Beta.1 pruning keeps its cache as source history, and adoption/conversion-sweep/downgrade tests assert beta.0 and beta.1 rejection.

Decision-table walkthrough:

  • No critical/high/medium findings (rows 1, 4, 5, 8 do not fire).
  • gated_paths is false (row 2 n/a).
  • high_risk is true, but every high_risk_reasons entry is (added) — new scaffolding, no deletions or modifications, so rows 3 and 5 do not fire. New files matching high-risk globs are normal regeneration/adoption work, not escalation-worthy on the flag alone.
  • No no-auto-approve team match (row 7 n/a) and no prior decision (row 6 n/a).

No row 1–8 triggers → row 9 → approve.

AdCP 3.3.0-beta.2 drops the schema default on notification-config
product_payload_view and states it in prose: absent means legacy. The
generated field now defaults to None, so the serializer that re-added the
default on product subscriptions would have emitted an explicit null. Emit
the view only when one is set, and update the wire-default tests and docs.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ladon verdict: Approve

Approve — clean delta, no blocking or medium findings.

The schema cache additions under schemas/cache/3.3.0-beta.2/** are all new files (high_risk flag fires on (added) only — normal scaffolding, not escalation-worthy). The single code change at src/adcp/types/base.py:902-905 adds an if view is not None guard so an unset product_payload_view stays absent rather than serializing an explicit null under 3.3.0-beta.2. Reviewer confirms absent-means-legacy on both the 3.2 (schema default) and 3.3-beta.2 (prose) ends — a droppable field with a valid pathway back per the minor-release wire-change rule. Docs and both wire-default tests match the new behavior, satisfying the pathway-test requirement.

Gate checks: gated_paths is false; review_decision is APPROVED; no no-auto-approve team match; prior decision was approve. No critical/high/medium findings surfaced. With rows 1–8 of the decision table unmatched, this falls through to row 9 = approve.

@bokelley
bokelley merged commit 3e23bec into next Oct 30, 2026
41 checks passed
@bokelley
bokelley deleted the bokelley/adopt-3.3.0-beta.2 branch October 30, 2026 18:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant