Repository navigation
Description
Python parity for adcontextprotocol/adcp-client#3504, on next (SDK 10 / AdCP 3.3).
Why
SDK 10 on AdCP 3.3.0-beta.1 ships the generated types for principal-level reporting subscriptions (RFC adcontextprotocol/adcp#8543 Part B, adcontextprotocol/adcp#8552), but no runtime. A seller built on the SDK can't list sync_principal in configuration_tasks, and a buyer has no helper to calculate the periods it's owed. Obligations, the ledger and receipts already live in the SDK, so the subscription runtime belongs here too. A host supplies only what it alone knows: which accounts a principal may read, and which buys an account holds.
Scope
The requirements are those of adcontextprotocol/adcp-client#3504, mapped to the Python runtime:
- Principal runtime. Opt-in acceptance, validation, readback (
core/reporting-subscription-state.json) and versioning ofsync_principalreporting_subscriptions, plusprincipal.changedwith reasonreporting_subscription_changed. With the option off, keep today's behaviour. - Obligations. Host hooks for authorized accounts, authorization changes and buy facts. Selector resolution (
exact/finest/all, ties to the lowestoffering_id), precedence (a caller's ownsync_accountsconfig beats any subscription;account_idsbeats all-accounts), cutovers at period boundaries, account timezones, no clipping, and deterministicmax_accounts. - Status and lost authority.
subscription_coverage[]with exceptions only, each over[from, until);accounts_unauthorized[]; receipts accepted after loss forstatus_retention_days; re-grant, with and withoutbackfill_on_regrant. - Managed delivery. Destinations from
reporting_destinations, path-template expansion,account_idon every row, and per-account destinations. - Capabilities.
configuration_tasks,configuration_taskonly whensync_accountsis listed, thesubscriptionsblock, andmedia_buy.reporting_subscriptions. - Storage.
adcp-reporting-storagePostgreSQL migrations for subscription versions, resolutions, exceptions and authority intervals; history retained as long as the obligations that cite it. - Buyer. A pure
expected_subscription_periods(...)coverage function over plain data, and consumer-runtime and client support. - Conformance. Buyer-computed periods must equal seller-owed periods, period by period, across the cases listed in adcp-client#3504.
The spec is normative where it differs from the issue text. In particular, coverage starts at the first boundary at or after the latest of the version's accepted_at, the buy's confirmed_at and the account's authorization.authorized_at (see .changeset/pre/reporting-subscriptions.md in the spec repo).
10.0.0-beta.2 waits for this and for #1692.
Activity
fix(reporting): derive subscription periods exactly as the TypeScript…
feat(reporting): accept reporting subscriptions on sync_principal and…
feat(reporting): add buyer client helpers and a tracker for reporting…
feat(reporting): accept reporting subscriptions on sync_principal and…
feat(reporting): add buyer client helpers and a tracker for reporting…
fix(reporting): announce a subscription's recovery from action_required
feat(reporting): add buyer client helpers and a tracker for reporting…
fix(reporting): order max_accounts by the current grant chain
feat(reporting): add buyer client helpers and a tracker for reporting…
fix(reporting): keep max_accounts slots with the accounts already served
feat(reporting): add buyer client helpers and a tracker for reporting…
feat(reporting): count withheld periods from host delivery facts when…
feat(reporting): add buyer client helpers and a tracker for reporting…
feat(reporting): adopt the reporting-subscription rules settled in ad…
feat(reporting): accept reporting subscriptions on sync_principal and…
174 remaining items
fix(reporting): observe a served authorization that lists no tasks
feat(reporting-storage): one storage decision with versioned migrations
fix(reporting-storage): keep adcp free of imports of the storage dist…
feat(accounts)!: ensure returns an AccountOutcome and routes to reque…
fix(accounts): read requests back by request_ids and dedupe across in…
fix(accounts): compare normalized pending actions in refresh
feat(reporting): fail closed on a coverage period budget
docs(reporting): guides, README section and agent notes for reporting…
feat(reporting): use "owed" and list_subscription_principals, as the …
feat(reporting): mirror the TypeScript SDK's advanced path, engine er…
feat(reporting): use owed and list_subscription_principals, as the Ty…
feat(reporting): mirror the TypeScript SDK's advanced path, engine er…
fix(reporting): count a rejected authorized_at once and refuse buys o…
bokelley commentedon Nov 8, 2026
Implemented through #1696/#1698/#1699, persisted engine #1722/#1724/#1726, ledger/service #1723/#1725/#1729, authority/delivery #1728/#1731/#1733/#1734, API #1736/#1737/#1739/#1740/#1746/#1751 and beta.4 rules #1851. TS counterpart TS #3504 is implemented too. The comment saying #1726 and ledger/delivery/receipt integration are still open is stale. Current five vector-file blobs match exactly across SDKs; isolate any missing runner assertion as a new evidence issue.
Closed in a 3.3 triage pass. Reopen if anything here is still outstanding.
🤖 Generated with Claude Code