If you’re trying to figure out how to test an AdCP agent, three things in this ecosystem share overlapping vocabulary. They are not the same. Confusing them produces wrong conclusions — including the kind that get reported as protocol gaps that aren’t actually gaps.Documentation Index
Fetch the complete documentation index at: https://docs.adcontextprotocol.org/llms.txt
Use this file to discover all available pages before exploring further.
TL;DR
| What it is | Where it lives | Normative? | |
|---|---|---|---|
| Storyboards | YAML files defining a workflow end-to-end + every wire-shape assertion. The conformance specification. | /compliance/{version}/universal/*.yaml, protocols/*/*.yaml, specialisms/*/index.yaml | ✅ Yes |
comply_test_controller scenarios | Protocol-level tool operations a seller exposes (force_*, simulate_*, seed_*) so storyboards can drive deterministic state. | The scenario parameter of the seller’s comply_test_controller MCP tool. | ✅ Yes |
@adcp/sdk/testing/scenarios/*.ts | Legacy TypeScript test runners predating storyboard-driven comply(). | node_modules/@adcp/sdk/dist/lib/testing/scenarios/*.js | ❌ No |
node_modules/@adcp/sdk/dist/lib/testing/scenarios/media-buy.js and trying to figure out what AdCP requires — stop. That’s not the spec. Read the storyboards instead.
Storyboards (normative)
Storyboards are the conformance specification. Each one defines:- A workflow (e.g. sales-guaranteed proposal/refine/finalize lifecycle)
- The exact tool calls a buyer agent makes
- Every wire-shape assertion the seller’s responses must satisfy
- The
comply_test_controlleroperations the runner uses to seed deterministic state
conformance.mdx calls these “the truth” — and means it. The AdCP Verified (Spec) badge is issued by running these YAML files through comply() and observing every assertion pass.
You’ll see storyboards at:
/compliance/{version}/universal/*.yaml— every AdCP agent must pass/compliance/{version}/protocols/{protocol}/index.yaml— anyone claiming the protocol/compliance/{version}/specialisms/{id}/index.yaml— opt-in claims
npx @adcp/sdk storyboard run <id> or interactively through Addie.
comply_test_controller scenarios (normative — but different)
The word “scenario” also appears in the comply_test_controller MCP tool that sellers expose to support deterministic testing. Storyboards call this tool with scenario: <name> to drive seller state without waiting for real time to pass: e.g. force_task_completion to finish a pending async media buy, simulate_delivery to inject impressions, seed_product to install a fixture.
These are protocol operations, not test runners. They’re documented at comply_test_controller. Sellers MUST implement them to be testable; the storyboards MUST use them to stay deterministic.
So when you hear “the seller doesn’t support that scenario,” it usually means: “the seller’s comply_test_controller doesn’t expose force_X yet.” Not “no storyboard tests X.”
@adcp/sdk/testing/scenarios/*.ts (NON-normative legacy)
The SDK ships TypeScript files under testing/scenarios/ — media-buy.ts, signals.ts, creative.ts, and a dozen siblings. These predate the storyboard-driven comply() engine. They are:
- Not the conformance spec. Reading them to learn what AdCP requires will produce wrong answers.
- Not maintained in lockstep with storyboards. A scenario file may hard-code parameters that the storyboard equivalent has long since corrected. Example:
scenarios/media-buy.tshard-codesbuying_mode: 'brief'at four call sites; the YAML storyboard forsales-guaranteedexercisesbuying_mode: 'refine'+action: 'finalize'via theproposal_finalizestoryboard. Both are validbuying_modevalues; the scenario file just doesn’t cover the lifecycle. - Callable, but for different purposes. Internal smoke tests in the SDK, integration-test fixtures for downstream tooling, and some legacy paths still use these. They are not what AAO Verified (Spec) runs against.
testing/scenarios/*.ts to understand AdCP, you’ve taken a wrong turn. The right path:
- Find the storyboard that matches your declared specialism:
npx @adcp/sdk storyboard list - Read the YAML:
npx @adcp/sdk storyboard show <id> - Run it:
npx @adcp/sdk storyboard run <id> --agent-url <url>
Three-line decoder
| If you see… | …you’re looking at | Trust as spec? |
|---|---|---|
A .yaml under /compliance/{version}/... | A storyboard | ✅ Yes |
A seller responding to comply_test_controller with a scenario parameter | A protocol-level test-control operation | ✅ Yes (the contract is normative; the seller MAY refuse with UNKNOWN_SCENARIO) |
A .ts or .js under @adcp/sdk/dist/lib/testing/scenarios/ | A legacy SDK test runner | ❌ No |
Cross-repo
The disambiguation work in the SDK itself — marking the legacy scenarios as@deprecated, mirroring the storyboard CLI verbs, or removing the export entirely — lives in adcp-client. The decision on whether testing/scenarios/* stays public-but-deprecated or becomes internal-only is tracked in #4035.
For now: if you want to test an AdCP agent, the answer is storyboards. The other two things named “scenario” have their place, but they aren’t it.