Gap
Storyboard runner sends brand: "https://test.example" (string shorthand
form). Our _get_products_impl expects BrandReference (dict with
domain key). AdCP v3 accepts both forms — string is shorthand that
must be coerced server-side to BrandReference(domain=<string>).
Currently the string form fails Pydantic validation at the boundary.
Blocks the storyboard's primary brand-discovery flow.
Documented at #1247 gap #2 (storyboard compliance gap analysis).
Why it matters
- Spec compliance: AdCP v3 explicitly allows both shorthand and full
reference forms
- Blocks storyboard from reaching downstream
get_products scenarios
Contract for "done"
Out of scope
- Brand-resolution semantics (this is purely about shape coercion)
- A2A or REST transports (only MCP is in storyboard scope)
Gap
Storyboard runner sends
brand: "https://test.example"(string shorthandform). Our
_get_products_implexpectsBrandReference(dict withdomainkey). AdCP v3 accepts both forms — string is shorthand thatmust be coerced server-side to
BrandReference(domain=<string>).Currently the string form fails Pydantic validation at the boundary.
Blocks the storyboard's primary brand-discovery flow.
Documented at #1247 gap #2 (storyboard compliance gap analysis).
Why it matters
reference forms
get_productsscenariosContract for "done"
_get_products_impl(or its boundary input model) coerces astring
brandintoBrandReference(domain=brand_string)beforevalidation
{"domain": "..."}continues to work unchangedoutput
Out of scope