Skip to content

Storyboards should negotiate exact AdCP version: 3.0 emits no version, 3.1 opts in #1987

Description

@bokelley

Summary

The storyboard runner currently appears to choose schema/storyboard semantics from the installed JS SDK package line, rather than from an explicit buyer-requested AdCP version and/or exact seller capability metadata.

This makes 3.0 and 3.1 compatibility hard to validate against the same seller:

  • A 3.0 storyboard should emit no version marker, because exact version negotiation did not exist for those clients. Sellers should treat an omitted version as legacy 3.0 compatibility.
  • A 3.1 storyboard should explicitly opt in to 3.1 semantics, so adaptive sellers can return the 3.1 shape.
  • The runner should not infer "3.0 vs 3.1" only from whichever @adcp/sdk package line happened to be installed.

Why this matters

In 3.1 beta, create/update media-buy responses split protocol envelope status from media-buy lifecycle status:

{
  "status": "completed",
  "media_buy_status": "pending_creatives"
}

A legacy 3.0 buyer/storyboard expects lifecycle status at top-level status:

{
  "status": "pending_creatives"
}

One unversioned response cannot satisfy both contracts. The seller needs to know whether the buyer is asking for 3.0 compatibility or 3.1 semantics.

Repro / observed behavior

Against a local Sales Agent using Python SDK adcp==6.1.0b2:

python adcp package: 6.1.0b2
get_adcp_spec_version(): 3.1.0-beta.3

The agent capabilities currently advertise only:

{
  "adcp": {
    "major_versions": [3]
  }
}

Running the default storyboard runner used @adcp/sdk 7.10.2 (AdCP 3.0.12) and failed both MCP and A2A on 3.0 status expectations:

3.0 MCP: 25 passed, 2 failed, 32 skipped; schemas: 3.0.12
3.0 A2A: 25 passed, 2 failed, 32 skipped; schemas: 3.0.12

media_buy_seller/pending_creatives_to_start/create_buy_no_creatives:
Status is pending_creatives because no creatives supplied at /status
expected=pending_creatives actual=completed

Running the beta storyboard runner used @adcp/sdk 8.1.0-beta.9 (AdCP 3.1.0-beta.3) and the status/media_buy_status issue disappeared:

3.1 MCP: 37 passed, 1 failed, 52 skipped; schemas: 3.1.0-beta.3
3.1 A2A: 37 passed, 1 failed, 52 skipped; schemas: 3.1.0-beta.3

The remaining 3.1 failure is unrelated local seller policy about duplicate product IDs across packages.

Expected behavior

The runner should make version intent explicit:

  1. 3.0 storyboards should send no exact version marker / no new 3.1 negotiation field. This preserves legacy behavior for buyers that predate exact version negotiation.
  2. 3.1 storyboards should send an explicit 3.1 marker on requests, or otherwise execute through a versioned negotiation path that an adaptive seller can observe.
  3. If a seller advertises exact supported versions, the runner should use that to select compatible storyboards/schemas or at least report a clear mismatch.
  4. The runner should distinguish "seller supports major v3" from "seller supports the exact 3.1 beta shape".

Notes

This is separate from #1961. That issue was about beta runner post-processing injecting a synthetic status. This issue is about version selection/negotiation across 3.0 and 3.1 storyboards.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions