Skip to content
Draft
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
1aafe64
feat(reporting): add managed reporting status schemas
bokelley Aug 27, 2026
c1733e9
fix(reporting): harden managed delivery contract
bokelley Aug 28, 2026
a57960f
feat(reporting): add consumer reconciliation receipts
bokelley Aug 28, 2026
1095b72
fix(reporting): complete receipt tool integration
bokelley Aug 28, 2026
7fda761
fix(reporting): type receipt response status
bokelley Aug 28, 2026
7001b1a
fix(reporting): require manifest resource identity
bokelley Aug 28, 2026
abef289
test(reporting): refresh MCP schema analysis counts
bokelley Aug 28, 2026
afca491
fix(reporting): make delivery independently reconcilable
bokelley Aug 28, 2026
592c854
feat(reporting): declare snapshot and mixed-source coverage
bokelley Aug 29, 2026
a416550
fix(reporting): represent empty configuration scopes
bokelley Aug 29, 2026
2cb411b
test(reporting): refresh schema analysis after rebase
bokelley Aug 29, 2026
1fd3099
docs(accounts): fix released schema links
bokelley Aug 29, 2026
524fde0
Merge origin/main into managed reporting status
bokelley Aug 29, 2026
cbddfd9
fix(reporting): enforce reconciliation integrity schemas
bokelley Aug 29, 2026
8d2bd6f
test(reporting): publish portable reconciliation fixture
bokelley Aug 29, 2026
514ebc7
fix(reporting): start reconciliation before receipt
bokelley Aug 29, 2026
5555949
fix(reporting): pin fixture-bearing source revision
bokelley Aug 29, 2026
615ce33
Merge remote-tracking branch 'origin/main' into protocol-conformance-…
bokelley Aug 29, 2026
104f050
fix(reporting): name generated schema helper types
bokelley Aug 29, 2026
b5ebb24
fix(reporting): repin finalized fixture schemas
bokelley Aug 29, 2026
a4a0d65
fix(reporting): use lifecycle-neutral helper name
bokelley Aug 29, 2026
775a362
fix(reporting): repin neutral generated schema names
bokelley Aug 29, 2026
4b95bb9
fix(reporting): keep codegen names out of prompt projections
bokelley Aug 29, 2026
df3c807
Merge remote-tracking branch 'origin/main' into protocol-conformance-…
bokelley Aug 29, 2026
4185346
test(reporting): repin reconciliation fixture source
bokelley Aug 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .changeset/add-managed-reporting-status.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
"adcontextprotocol": minor
---

Add the experimental managed reporting delivery surface: caller-owned account
configuration with protocol-managed destination provisioning, `get_reporting_status`
summary/period/revision views, independently scheduled feed purposes, consistent
ledger reconciliation, durable delivery capabilities, immutable
obligation/revision/materialization records, a normative file manifest, authenticated
consumer reconciliation through `sync_reporting_receipts`, and the
`reporting.delivery_ready` notification. Advertise snapshot/official schedules as
atomic offerings, bind their applicability to products, and preserve explicit
full/partial/none/unknown package coverage through configuration, revisions, and
status aggregation. Publish portable, byte-exact reconciliation scenarios for SDKs,
machine-identify required canonicalization vectors, and enforce control-value and
physical-checksum discriminants in the source schemas.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@
# have a built-in BOM-strip attribute; rely on editor defaults and review
# to keep them clean.
static/compliance/source/test-vectors/plan-hash/** text eol=lf
static/compliance/source/test-vectors/reporting-reconciliation/** text eol=lf
static/test-vectors/** text eol=lf
1 change: 1 addition & 0 deletions docs/accounts/tasks/list_accounts.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ seller-assigned `account_id` or by the complete buyer-declared natural key.
| `account_scope` | How the seller scoped this account: `operator`, `brand`, `operator_brand`, or `agent`. See [account scope](/docs/building/by-layer/L2/accounts-and-agents#account-scope). |
| `payment_terms` | Payment terms agreed for this account: `net_15`, `net_30`, `net_45`, `net_60`, `net_90`, or `prepay`. Binding for all invoices when the account is active. |
| `governance_agents` | Governance agent endpoints registered on this account. Present when governance agents have been configured via [`sync_governance`](/docs/accounts/tasks/sync_governance). |
| `reporting_delivery_configs` | Experimental caller-visible resolved durable reporting configuration states, including setup/readiness, destination binding, immutable generation, and deactivation cutoff. Another caller's configurations are never returned. |
| `setup` | Present when `status: "pending_approval"`. Contains `url` for completing setup and `message` explaining what's needed. |
| `authorization` | Optional. The calling agent's scope grant for this account — `allowed_tasks`, `field_scopes`, `scope_name`, `read_only`. Applies to every vendor agent type (media-buy, signals, governance, creative, brand) — the Accounts Protocol surface is shared. Vendor agents that support scope introspection SHOULD populate this; media-buy sales agents claiming the `attestation_verifier` standard scope MUST populate it. Absence means the vendor agent does not advertise introspectable scope for this account; callers MUST NOT infer access from absence and fall back to error-driven discovery via the RBAC error codes. See [Caller authorization](/docs/accounts/overview#caller-authorization) for the full shape and semantics. |
| `notification_configs` | Account-level webhook subscribers registered via [`sync_accounts`](/docs/accounts/tasks/sync_accounts#account-level-webhook-subscriptions). Each entry carries `subscriber_id`, `url`, `event_types[]`, and `active`. Present when the account has any persisted subscribers. `subscriber_id` is the account-scoped logical key; re-registering the same subscriber replaces that subscriber's config. `authentication.credentials` is omitted on every entry (write-only). Use this surface to verify what's active after a sync, audit fan-out across multiple subscribers, and detect drift between buyer-side expectations and seller-side persisted state. `account.status_changed` subscribers repair by rereading this account; `account.change_recorded` subscribers drain [`list_account_changes`](/docs/accounts/tasks/list_account_changes) and invoke each record's repair task. |
Expand Down
1 change: 1 addition & 0 deletions docs/accounts/tasks/sync_accounts.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ asyncio.run(main())
| `payment_terms` | string | No | Payment terms for this account: `net_15`, `net_30`, `net_45`, `net_60`, `net_90`, or `prepay`. The seller must either accept these terms or reject the account — terms are never silently remapped. When omitted, the seller applies its default terms. |
| `sandbox` | boolean | No | When true, set up a sandbox account with no real platform calls or billing. Only applicable to buyer-declared accounts (`require_operator_auth: false`). For account-id namespaces, sandbox accounts are pre-existing test accounts discovered via [`list_accounts`](/docs/accounts/tasks/list_accounts) or supplied out-of-band. |
| `notification_configs` | array | No | Account-level webhook subscribers for events that outlive any single media buy: creative lifecycle notifications, account status changes, and wholesale feed change webhooks. Omit to leave existing subscribers unchanged; send `[]` to remove all subscribers; send a full array to replace. Entries are keyed by account-scoped `subscriber_id`; an existing `subscriber_id` is upserted, and persisted IDs absent from the sent array are removed. |
| `reporting_delivery_configs` | array | No | Experimental caller/account-owned durable reporting desired state. Each entry selects one atomic capability `offering_id` and its exact `report_definition_id`, chooses `delivery_only` or `consumer_receipt` reconciliation, and creates an immutable semantic `(delivery_config_id, delivery_config_version)` generation; only lifecycle intent may change in place. Billing uses `consumer_receipt`. Omit to preserve the caller's set; send `[]` to deactivate it. Destination coordinates are secret-free, and a caller-scoped immutable `destination_ref` may be reused across separately authorized accounts. See [`get_reporting_status`](/docs/media-buy/task-reference/get_reporting_status). |

**Natural key**: The tuple `(brand, operator, operator_unit.id, currency, timezone, sandbox)` identifies the advertiser object in the seller system, with `currency` present only for fixed-currency accounts and `timezone` present only for buyer-selected account-fixed timezones. Within `brand`, only `domain`, `brand_id`, and canonicalized `countries[]` participate. Country order has no semantic meaning; send unique uppercase codes in lexical order for stable keys and signatures. `operator_unit.name` and all mutable BrandRef fields are outside identity, so changing display or per-call metadata does not create a new account.

Expand Down
Loading
Loading