You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
SDK 10: implement AdCP 3.3 reporting subscriptions in the reliable-reporting runtime #1695
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.
Principal runtime. Opt-in acceptance, validation, readback (core/reporting-subscription-state.json) and versioning of sync_principalreporting_subscriptions, plus principal.changed with reason reporting_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 lowest offering_id), precedence (a caller's own sync_accounts config beats any subscription; account_ids beats all-accounts), cutovers at period boundaries, account timezones, no clipping, and deterministic max_accounts.
Status and lost authority.subscription_coverage[] with exceptions only, each over [from, until); accounts_unauthorized[]; receipts accepted after loss for status_retention_days; re-grant, with and without backfill_on_regrant.
Managed delivery. Destinations from reporting_destinations, path-template expansion, account_id on every row, and per-account destinations.
Capabilities.configuration_tasks, configuration_task only when sync_accounts is listed, the subscriptions block, and media_buy.reporting_subscriptions.
Storage.adcp-reporting-storage PostgreSQL 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).
Open:#1726, the PostgreSQL conformance test (restart, CAS, concurrency).
Still remaining (TypeScript defers the same items in adcp-client#3509):
Ledger materialization of owed subscription obligations. The producer must plan subscription generations keyed by (account, subscription_id, version, offering_id) from the owed periods rather than contiguous ordinals. That is a ledger-schema change and needs its own PR.
Managed delivery wiring, which depends on 1: resolve the subscription's destination, expand path_template, put account_id on every delivered row, and re-check authority per delivery.
Receipts after loss of authority in the sync_reporting_receipts / sync_reporting_status handlers, which depends on 1.
A reference-seller conformance storyboard, once obligations are materialized.
Until 1 lands, don't advertise media_buy.reporting_subscriptions (the engine docs say so).
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…
113 remaining items
fix(reporting): keep backslashes from escaping a path-template segment
feat(reporting): add buyer client helpers and a tracker for reporting…
feat(reporting): track re-grants that keep authorized_at, as adcp#858…
fix(reporting): address the buyer-tracker review of reporting subscri…
feat(reporting): accept reporting subscriptions on sync_principal and…
feat(reporting): add buyer client helpers and a tracker for reporting…
feat(reporting): track re-grants that keep authorized_at, as adcp#858…
fix(reporting): address the buyer-tracker review of reporting subscri…
fix(reporting): refuse a coverage entry for another subscription
feat(reporting): add buyer client helpers and a tracker for reporting…
feat(reporting): persist reporting-subscription engine state through …
test(reporting-storage): add the subscription stores to the public AP…
feat(reporting-storage): add PostgreSQL stores for reporting subscrip…
bokelley commentedon Oct 30, 2026
Status on
next:Merged:
58e825a2: buyer-computable coverage (expected_subscription_periods), selector resolution and capabilities.04238b2a:sync_principalacceptance, readback, versioning,principal.changed, the seller engine (exceptions,max_accounts, lost authority,subscription_coverage[], owed periods) andrender_path_template.8a7f4820: buyer client helpers andReportingSubscriptionTracker.10643c7f:ReportingSubscriptionStateStore, one CAS document per principal, and thePrincipalRecordJSON codec.46a1e01a:PgReportingSubscriptionStateStoreandPgPrincipalRecordStoreinadcp-reporting-storage.Open: #1726, the PostgreSQL conformance test (restart, CAS, concurrency).
Still remaining (TypeScript defers the same items in adcp-client#3509):
(account, subscription_id, version, offering_id)from the owed periods rather than contiguous ordinals. That is a ledger-schema change and needs its own PR.path_template, putaccount_idon every delivered row, and re-check authority per delivery.sync_reporting_receipts/sync_reporting_statushandlers, which depends on 1.Until 1 lands, don't advertise
media_buy.reporting_subscriptions(the engine docs say so).test(reporting): run the reporting-subscription stores against Postgr…