Summary
In 8.0.0-beta.15, Reliable Reporting configuration generations are keyed globally by (delivery_config_id, delivery_config_version), even though AdCP defines delivery_config_id as caller-selected and unique only within the authenticated caller and account.
This is a cross-account correctness and isolation bug for any multi-tenant seller using one in-memory or PostgreSQL ledger.
Current behavior
ReportingConfiguration.generation_key returns tuple[str, int] without account_id.
InMemoryReportingLedgerStore._configurations and _leases use that key.
PgReportingLedgerStore selects, conflicts, leases, and releases configurations using only delivery_config_id and delivery_config_version.
- Status projection also builds configuration maps from the two-part key.
Two authorized accounts may validly publish daily@1. Today the second write either conflicts with the first account's immutable generation or aliases storage/lease/status behavior that should remain account-scoped.
Required behavior
Make the durable generation identity account-qualified everywhere, ideally through one typed SDK value rather than repeated tuples:
@dataclass(frozen=True)
class ReportingConfigurationGenerationKey:
account_id: str
delivery_config_id: str
delivery_config_version: int
All configuration, obligation, lease, lookup, lock, status, and issue joins should use the same identity.
Acceptance criteria
Adopter impact
Embedded Sales Agent runs many publisher tenants and buyer accounts in one process/database. We cannot safely enable SDK-managed reporting for multiple accounts until this identity matches the protocol's account scope.
Summary
In
8.0.0-beta.15, Reliable Reporting configuration generations are keyed globally by(delivery_config_id, delivery_config_version), even though AdCP definesdelivery_config_idas caller-selected and unique only within the authenticated caller and account.This is a cross-account correctness and isolation bug for any multi-tenant seller using one in-memory or PostgreSQL ledger.
Current behavior
ReportingConfiguration.generation_keyreturnstuple[str, int]withoutaccount_id.InMemoryReportingLedgerStore._configurationsand_leasesuse that key.PgReportingLedgerStoreselects, conflicts, leases, and releases configurations using onlydelivery_config_idanddelivery_config_version.Two authorized accounts may validly publish
daily@1. Today the second write either conflicts with the first account's immutable generation or aliases storage/lease/status behavior that should remain account-scoped.Required behavior
Make the durable generation identity account-qualified everywhere, ideally through one typed SDK value rather than repeated tuples:
All configuration, obligation, lease, lookup, lock, status, and issue joins should use the same identity.
Acceptance criteria
delivery_config_idand version with different valid configuration content.ON CONFLICT,WHERE, lock, and lease path includeaccount_id.Adopter impact
Embedded Sales Agent runs many publisher tenants and buyer accounts in one process/database. We cannot safely enable SDK-managed reporting for multiple accounts until this identity matches the protocol's account scope.