Summary
Storyboards should be the primary testing surface in @adcp/client, replacing the current scenario-based comply system. Today, storyboard runs call comply() which runs ALL scenarios, then retrofits results onto storyboard steps via comply_scenario string matching. Only 26 of 63 steps have mappings — five media buy storyboards are completely dark.
Problem
Three layers do overlapping work:
@adcp/client — testAllScenarios(), individual scenario functions, SCENARIO_REQUIREMENTS
- Server compliance layer — wraps
testAllScenarios() with track grouping
- Storyboard run endpoint — runs
comply(), then matches results back to steps
Storyboards define the exact tasks and expected behavior. The client library has SingleAgentClient with typed methods for every AdCP task. These should be connected directly.
Proposal
Add src/lib/testing/storyboard/ module to @adcp/client:
runStoryboard(agentUrl, storyboard, options)
- Parse storyboard YAML into executable step sequence
- Iterate phases/steps, calling
SingleAgentClient methods directly (client.getProducts(), client.buildCreative(), etc.)
- Run per-step validations (schema check, field_present, field_value) defined in the YAML
- Propagate stateful context between steps (e.g.,
account_id from sync_accounts feeds into get_products)
- Return per-step pass/fail results with timing and error details
runStoryboardStep(client, step, context)
- Execute a single step for interactive/progressive testing
- Returns result + updated context for next step
- Enables step-by-step debugging from the dashboard UI
Unify with platform types
- Platform type → recommended storyboard(s) mapping replaces
SCENARIO_REQUIREMENTS + DEFAULT_SCENARIOS
comply() calls runStoryboard() instead of testAllScenarios()
Storyboard YAML enrichment
Add context_outputs / context_inputs to steps for stateful data flow:
steps:
- id: sync_accounts
task: sync_accounts
context_outputs:
- path: "accounts[0].account_id"
key: "account_id"
- id: get_products_brief
task: get_products
context_inputs:
- key: "account_id"
inject_at: "account.account_id"
Ship storyboard YAMLs with the package
The docs/storyboards/*.yaml files from the spec repo become the executable test definitions, published alongside @adcp/client.
Task-to-method mapping
Storyboard task |
Client method |
get_products |
client.getProducts() |
create_media_buy |
client.createMediaBuy() |
build_creative |
client.buildCreative() |
sync_accounts |
client.syncAccounts() |
list_creative_formats |
client.listCreativeFormats() |
preview_creative |
client.previewCreative() |
sync_creatives |
client.syncCreatives() |
get_media_buys |
client.getMediaBuys() |
get_media_buy_delivery |
client.getMediaBuyDelivery() |
get_signals |
client.getSignals() |
Migration path
- Build
runStoryboard() / runStoryboardStep() in @adcp/client
- Server's
comply() switches from testAllScenarios() to runStoryboard()
- Dashboard gets step-by-step execution via
runStoryboardStep()
- Deprecate
SCENARIO_REQUIREMENTS, DEFAULT_SCENARIOS, individual scenario functions
- Platform types map to storyboards instead of scenario lists
Related
- Storyboard YAML definitions:
adcontextprotocol/adcp docs/storyboards/*.yaml (12 storyboards)
- Current testing module:
src/lib/testing/
- Server comply wrapper:
adcontextprotocol/adcp server/src/addie/services/compliance-testing.ts
Summary
Storyboards should be the primary testing surface in
@adcp/client, replacing the current scenario-based comply system. Today, storyboard runs callcomply()which runs ALL scenarios, then retrofits results onto storyboard steps viacomply_scenariostring matching. Only 26 of 63 steps have mappings — five media buy storyboards are completely dark.Problem
Three layers do overlapping work:
@adcp/client—testAllScenarios(), individual scenario functions,SCENARIO_REQUIREMENTStestAllScenarios()with track groupingcomply(), then matches results back to stepsStoryboards define the exact tasks and expected behavior. The client library has
SingleAgentClientwith typed methods for every AdCP task. These should be connected directly.Proposal
Add
src/lib/testing/storyboard/module to@adcp/client:runStoryboard(agentUrl, storyboard, options)SingleAgentClientmethods directly (client.getProducts(),client.buildCreative(), etc.)account_idfromsync_accountsfeeds intoget_products)runStoryboardStep(client, step, context)Unify with platform types
SCENARIO_REQUIREMENTS+DEFAULT_SCENARIOScomply()callsrunStoryboard()instead oftestAllScenarios()Storyboard YAML enrichment
Add
context_outputs/context_inputsto steps for stateful data flow:Ship storyboard YAMLs with the package
The
docs/storyboards/*.yamlfiles from the spec repo become the executable test definitions, published alongside@adcp/client.Task-to-method mapping
taskget_productsclient.getProducts()create_media_buyclient.createMediaBuy()build_creativeclient.buildCreative()sync_accountsclient.syncAccounts()list_creative_formatsclient.listCreativeFormats()preview_creativeclient.previewCreative()sync_creativesclient.syncCreatives()get_media_buysclient.getMediaBuys()get_media_buy_deliveryclient.getMediaBuyDelivery()get_signalsclient.getSignals()Migration path
runStoryboard()/runStoryboardStep()in@adcp/clientcomply()switches fromtestAllScenarios()torunStoryboard()runStoryboardStep()SCENARIO_REQUIREMENTS,DEFAULT_SCENARIOS, individual scenario functionsRelated
adcontextprotocol/adcpdocs/storyboards/*.yaml(12 storyboards)src/lib/testing/adcontextprotocol/adcpserver/src/addie/services/compliance-testing.ts