Skip to content

spec(media-buy): close empty-valid_actions loophole + specify where partitioning belongs#3016

Merged
bokelley merged 1 commit into
mainfrom
bokelley/post-2993-valid-actions
Apr 24, 2026
Merged

spec(media-buy): close empty-valid_actions loophole + specify where partitioning belongs#3016
bokelley merged 1 commit into
mainfrom
bokelley/post-2993-valid-actions

Conversation

@bokelley

Copy link
Copy Markdown
Contributor

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:

  1. Sales agents MUST return every account-owned buy regardless of creation surface.
  2. Sales agents MUST NOT mark a buy read-only simply because it was created outside AdCP.
  3. Business constraints on specific actions are expressed by omitting those actions from 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_actions set — 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 return INVALID_STATE on an otherwise-valid update — solely because the buy was created outside AdCP. valid_actions omissions 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_actions is 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_capabilities is 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 empty valid_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 that INVALID_STATE cannot be used to reject updates on non-AdCP buys that would otherwise be valid.

No schema changes.

Test plan

Related

🤖 Generated with Claude Code

… 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>
@bokelley bokelley added this to the 3.1.0 milestone Apr 24, 2026
@bokelley bokelley modified the milestones: 3.1.0, 3.0.1 Apr 24, 2026
@bokelley bokelley merged commit a05b3ab into main Apr 24, 2026
16 checks passed
@bokelley bokelley deleted the bokelley/post-2993-valid-actions branch April 24, 2026 22:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant