Skip to content

client: refuse start_requires_all_creatives_approved: true on control_media_buy to a seller without creative_start_policy #1876

Closed

Description

@bokelley

AdCP 3.3: opting a package into start_requires_all_creatives_approved: true on control_media_buy requires the seller's media_buy.features.creative_start_policy: true, and buyers MUST NOT send true without it.

#1872 enforces the seller half: the dispatcher refuses such a request with UNSUPPORTED_FEATURE (field packages[N].start_requires_all_creatives_approved, recovery: correctable, details.fields, mutation_outcome: not_applied). The buyer half is missing. ADCPClient.control_media_buy sends true to any seller and finds out from the refusal a round trip later.

Suggested fix

When the seller's discovered capabilities don't declare media_buy.features.creative_start_policy: true, fail a control_media_buy that sets any package's start_requires_all_creatives_approved to true with UNSUPPORTED_FEATURE before anything is sent. Mirror #1872's error shape. Let false and omission through. When the client has no discovered capabilities, send as today.

TypeScript counterpart (server side): adcontextprotocol/adcp-client#3649.

🤖 Generated with Claude Code

Activity

  1. added a commit that references this issue on Nov 8, 2026
    8a163c9
  2. bokelley commented on Nov 8, 2026

    @bokelley
    ContributorAuthor

    Fixed on next by #1878 (8a163c9).

    On a 3.3+ session, ADCPClient.control_media_buy now returns a failed TaskResult before sending when the client's cached capabilities lack media_buy.features.creative_start_policy and a package sets start_requires_all_creatives_approved: true. The result has dispatched=False, adcp_error.code UNSUPPORTED_FEATURE, field naming the first opted-in package, and details.feature / details.fields, the same vocabulary as the seller refusal from #1872.

    With unknown capabilities the client still sends. false and omission always pass, and sessions below 3.3 are unchanged.

    🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions