spec(media-buy): close empty-valid_actions loophole + specify where partitioning belongs#3016
Merged
Merged
Conversation
… partitioning belongs Post-#2993 follow-up surfaced by expert review of the Tier-2 conformance PR. The merged #2993 text says sellers MUST return every account-owned buy and MUST NOT mark non-AdCP buys read-only — but also that an action MAY be omitted from valid_actions for "business reasons." Those two clauses together let a seller technically comply by returning non-AdCP buys with systematically empty valid_actions, which is indistinguishable from hiding the buy. Two clarifications: 1. Creation surface is not a business reason. MUST NOT omit an action from valid_actions solely because the buy was created outside AdCP. A systematically empty valid_actions on non-AdCP buys is non-conformant. 2. Partitioning belongs at the account boundary. When a seller has a legitimate reason to hide a set of buys (child-seller models, NDA-scoped PMP deals, privacy partitions), the correct mechanism is a separate account the caller is not authorized on — not within- account filtering. Within-account filtering reintroduces the shadow-ledger problem #2963 forbade. Updates specification.mdx (new subsection under Account Ownership vs. Creation Surface), get_media_buys.mdx, update_media_buy.mdx. No schema changes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced Apr 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Post-#2993 follow-up tightening, surfaced by expert review of the stacked Tier-2 conformance PR (#3001). The merged #2993 rules create a loophole at their boundary that a seller could technically comply with while violating the intent. Two small tightenings close it.
The loophole
#2993 (merged) says:
valid_actions.Rules 1 + 2 forbid hiding the buy. Rule 3 says "omit the action you can't support." But taken together, a seller can comply with rules 1 and 2 by returning non-AdCP buys with a systematically empty
valid_actionsset — which is indistinguishable from hiding the buy and defeats the normative intent. A caller seeing "the buy exists but you can do nothing with it" gets the same user experience as "the buy does not exist."Two clarifications
1. Creation surface is never a business reason
Sales agents MUST NOT omit an action from
valid_actions— or returnINVALID_STATEon an otherwise-valid update — solely because the buy was created outside AdCP.valid_actionsomissions are legitimate only when grounded in contractual, platform, or policy constraints that would apply equally to an AdCP-created buy in the same state.A seller that returns non-AdCP buys with a systematically empty
valid_actionsis non-conformant.2. Partitioning belongs at the account boundary
When a seller has a legitimate reason to keep a set of buys outside a caller's operational reach — child-seller models, NDA-scoped PMP deals, sandbox-vs-production separation, tenant-level privacy partitions — the correct mechanism is a separate account the caller is not authorized to reference.
Within-account filtering (returning only a subset of an account's buys to a caller authorized on that account) reintroduces the shadow-ledger problem #2963 was specifically designed to eliminate. The account boundary is the AdCP primitive for access partitioning;
get_agent_capabilitiesis the introspection surface for the scope granted on a given account.Why file as a separate PR
#2993 is merged. Rather than re-opening that conversation, this PR adds a short, targeted tightening. Reviewers who approved #2993 can assess whether this further language is consistent with their prior intent — it reads as clarification, not change — and the diff is small enough (~32 lines across 3 files) to evaluate quickly.
Changes
docs/media-buy/specification.mdx— new Partitioning belongs at the account boundary subsection under Account Ownership vs. Creation Surface; strengthened MUST-NOT language on emptyvalid_actions.docs/media-buy/task-reference/get_media_buys.mdx— mirrors the specification tightening.docs/media-buy/task-reference/update_media_buy.mdx— mirrors the specification tightening and calls out thatINVALID_STATEcannot be used to reject updates on non-AdCP buys that would otherwise be valid.No schema changes.
Test plan
npm run build:schemasregenerates cleanly (verified)npm run typecheckpasses (verified)Related
get_agent_capabilities+attestation_verifierscope (cross-referenced from the new partitioning language)🤖 Generated with Claude Code