Context
After PR #322 closed the original 5 fixture-dependent storyboard failures, local end-to-end against examples/seller_agent.py reports:
overall_status: passing
total: 47, passed: 45, failed: 0, skipped: 2
controller_detected: true
But CI's storyboard job (with continue-on-error: true) reports:
overall_status: partial
total: 59, passed: 25, failed: 13, skipped: 21
controller_detected: true
Same code, same npx -y -p @adcp/client@latest invocation (resolves to 5.21.1 in both per npm view @adcp/client version), same Python 3.12. Different storyboard outcomes.
Symptoms in CI not present locally
Repeated stderr from the runner (printed by @adcp/client/dist/lib/core/TaskExecutor.js:1119):
Schema validation failed for get_products: [
"/products/2/name: must have required property 'name'",
"/products/2/description: must have required property 'description'",
"/products/2/publisher_properties: must have required property 'publisher_properties'",
"/products/2/reporting_capabilities: must have required property 'reporting_capabilities'",
"/products/2/format_ids/0/agent_url: must have required property 'agent_url'",
...
]
The dumped response in the CI log shows products[2] does have all of those fields populated correctly. The schema validator is reporting them as missing anyway — and CI shows the failures cascade (21 dependent steps skipped due to unresolved context variables from prior steps).
The runner expects schema URL /schemas/3.0.1/media-buy/get-products-response.json. Local cache may be serving an older schema; CI's fresh install fetches 3.0.1 and validates more strictly — but the products are spec-compliant 3.0.1 shape, so the strict validation should pass.
Likely root cause
The 3.0.1 product schema is a oneOf discriminated union (per delivery_type, or pricing_options[*].pricing_model). @adcp/client@5.21.1's validator may iterate each variant and emit must have required property errors from the variants that DIDN'T match — even though one variant DOES match and validation should pass overall.
Two products at indices 0 and 1 (premium-homepage, run-of-site) pass; new products 2-5 fail. The structural difference is pricing_option_id value (po-cpm-homepage / po-cpm-ros for passing vs cpm_standard / cpm_guaranteed for failing) and product_id (hyphenated for passing vs underscored for failing). Neither has a schema-level pattern restriction visible in the cache. May be runner schema-validator bug or CI-vs-local schema-cache divergence.
Why this isn't blocking
Investigation paths
- Reproduce locally with a fresh
npm cache clean --force — see if local also starts failing with fresh schema fetch.
- Diff the runner's schema cache between local and CI. If CI gets newer schemas, that's the issue.
- Inspect
@adcp/client/dist/lib/validation/index.js Ajv setup — does it use oneOf errors-collection or first-match-passes?
- File upstream against
@adcp/client if confirmed runner bug.
References
Context
After PR #322 closed the original 5 fixture-dependent storyboard failures, local end-to-end against
examples/seller_agent.pyreports:But CI's storyboard job (with
continue-on-error: true) reports:Same code, same
npx -y -p @adcp/client@latestinvocation (resolves to 5.21.1 in both pernpm view @adcp/client version), same Python 3.12. Different storyboard outcomes.Symptoms in CI not present locally
Repeated stderr from the runner (printed by
@adcp/client/dist/lib/core/TaskExecutor.js:1119):The dumped response in the CI log shows products[2] does have all of those fields populated correctly. The schema validator is reporting them as missing anyway — and CI shows the failures cascade (21 dependent steps skipped due to
unresolved context variables from prior steps).The runner expects schema URL
/schemas/3.0.1/media-buy/get-products-response.json. Local cache may be serving an older schema; CI's fresh install fetches 3.0.1 and validates more strictly — but the products are spec-compliant 3.0.1 shape, so the strict validation should pass.Likely root cause
The 3.0.1 product schema is a
oneOfdiscriminated union (perdelivery_type, orpricing_options[*].pricing_model).@adcp/client@5.21.1's validator may iterate each variant and emitmust have required propertyerrors from the variants that DIDN'T match — even though one variant DOES match and validation should pass overall.Two products at indices 0 and 1 (
premium-homepage,run-of-site) pass; new products 2-5 fail. The structural difference ispricing_option_idvalue (po-cpm-homepage/po-cpm-rosfor passing vscpm_standard/cpm_guaranteedfor failing) andproduct_id(hyphenated for passing vs underscored for failing). Neither has a schema-level pattern restriction visible in the cache. May be runner schema-validator bug or CI-vs-local schema-cache divergence.Why this isn't blocking
continue-on-error: true(per ci: run AdCP storyboard suite against examples/seller_agent.py on every PR #305 / ci(adcp): add storyboard CI job for seller_agent.py compliance checks #309).Investigation paths
npm cache clean --force— see if local also starts failing with fresh schema fetch.@adcp/client/dist/lib/validation/index.jsAjv setup — does it useoneOferrors-collection or first-match-passes?@adcp/clientif confirmed runner bug.References
@adcp/client/dist/lib/core/TaskExecutor.js:1119