Skip to content

fix(storyboards): seed per-package products for multi-package create_media_buy#2894

Merged
bokelley merged 11 commits intomainfrom
bokelley/seed-multi-package-fixtures
Apr 22, 2026
Merged

fix(storyboards): seed per-package products for multi-package create_media_buy#2894
bokelley merged 11 commits intomainfrom
bokelley/seed-multi-package-fixtures

Conversation

@bokelley
Copy link
Copy Markdown
Contributor

Summary

After @adcp/client 5.12 (adcp-client#794) makes the storyboard runner emit every authored package on create_media_buy instead of silently dropping packages[1+], sellers without matching products in their default catalog hit PRODUCT_NOT_FOUND: Package 1: Product not found: <id> and cascading step failures in their conformance runs.

Wires adcp-client#790's fixture-seeding feature on the six storyboards whose create_media_buy steps author multi-package payloads. Each now declares controller_seeding: true + a fixtures: block so the runner pre-seeds the per-package products and pricing options via comply_test_controller before phase 1.

Affected storyboards and the products they now seed:

Storyboard Products Pricing
media_buy_seller sports_preroll_q2, lifestyle_display_q2 cpm_guaranteed, cpm_standard
media_buy_seller/delivery_reporting outdoor_display_q2, outdoor_video_q2 cpm_standard (both)
media_buy_seller/governance_approved outdoor_display_q2, outdoor_video_q2 cpm_standard (both)
creative_generative/seller outdoor_display_q2, outdoor_video_q2 cpm_guaranteed, cpm_standard
sales_broadcast_tv primetime_30s_mf, late_fringe_15s_mf unit_primetime_30, unit_fringe_15
sales_guaranteed sports_preroll_q2_guaranteed, outdoor_ctv_q2_guaranteed cpm_guaranteed_fixed (both)

All pricing uses fixed_price rather than floor_price so the non-auction bid-price requirement doesn't trip storyboards that omit bid_price in their create_media_buy sample_request.

Validation

Overlaid the edited YAMLs into @adcp/client's compliance cache locally and re-ran via adcp storyboard run. Seed phase fires end-to-end — e.g. for sales_broadcast_tv:

SEED PHASE: present
  seed_product.primetime_30s_mf pass= True
  seed_product.late_fringe_15s_mf pass= True
  seed_pricing_option.primetime_30s_mf.unit_primetime_30 pass= True
  seed_pricing_option.late_fringe_15s_mf.unit_fringe_15 pass= True

create_media_buy no longer throws PRODUCT_NOT_FOUND. Downstream get_delivery / check_buy_status failures are pre-existing (media_buy_id context-resolution) and tracked separately.

Test plan

  • Schema composition / YAML validity (CI)
  • Local validation via adcp storyboard run with overlaid cache
  • Storyboards CI in dependent repos (e.g. adcp's training agent) picks up the unblock after the next compliance cache rebuild

🤖 Generated with Claude Code

bokelley added 11 commits April 22, 2026 04:38
Picks up the SDK's spec-shaped request-builders for log_event,
create_media_buy, list_creative_formats, si_*, sync_governance
(adcp-client#794, #789, #802) and the VALIDATION_ERROR retry-storm
guard (adcp-client#758). Closes most of the framework-mode zod-parity
gap.

Both legacy and framework regress on the bump because adcp-client#794
makes the runner emit every authored package on create_media_buy,
exposing per-package products our catalog does not seed. Adjusts CI
baselines to the new floor; fixture-seeding follow-up tracked
separately.

Framework-only delta vs. legacy is now 5 storyboards / 7 step
failures, listed in the changeset.
…media_buy

After adcp-client#794 makes the runner emit every authored package
instead of dropping packages[1+], sellers without matching products in
their default catalog hit `PRODUCT_NOT_FOUND: Package 1: Product not
found: <id>` and cascading step failures.

Wire adcp-client#790's fixture-seeding feature on the six storyboards
whose create_media_buy steps author multi-package payloads. Each now
declares `controller_seeding: true` + a fixtures block so the runner
pre-seeds the per-package products and pricing options via
comply_test_controller before phase 1 — and packages[1+].product_id /
pricing_option_id resolve regardless of the seller's default catalog.

Affected storyboards:
- protocols/media-buy/index.yaml
- protocols/media-buy/scenarios/delivery_reporting.yaml
- protocols/media-buy/scenarios/governance_approved.yaml
- specialisms/creative-generative/generative-seller.yaml
- specialisms/sales-broadcast-tv/index.yaml
- specialisms/sales-guaranteed/index.yaml
The initial bump used a local tarball during validation; the committed
lockfile carried that file:// path, breaking CI which can't resolve it.
Reinstall from the registry so the lockfile points at npm.
)

Every use case run-one-storyboard.ts supported is now covered by the
published adcp CLI (shipped in @adcp/client 5.12):

- Single-storyboard diagnostic run: adcp storyboard run <url> <id>
- Single-step debug: adcp storyboard step <url> <id> <step>
- JSON + JUnit output native

run-storyboards.ts stays — the dual-mode CI matrix and per-storyboard
test_kit / /mcp-strict routing it encodes doesn't fit the helper's
single-agent-one-config shape. Retirement tracked as an upstream RFC
for per-storyboard config on runAgainstLocalAgent.
Storyboards load from @adcp/client's bundled compliance cache (a
snapshot synced from this repo on SDK publish). Spec changes in this
repo are invisible to the runner until the SDK republishes. Overlay
the source tree onto the cache before running so CI validates in-repo
spec changes immediately.

Fixes CI on fixture-seeding PRs whose baselines assumed the overlay
(which previously only existed in local dev).
…rlay

My original baselines (42/37) were taken from a local run where I'd
overlaid static/compliance/source/ onto the SDK cache. Without that
overlay, CI sees 38/32 clean on the bump — matching the fixture-seeding
regression documented in the PR. Lower the floor here; the follow-up
fixtures PR (adcp#2894) lifts it back up.
…ackage-fixtures

# Conflicts:
#	.github/workflows/training-agent-storyboards.yml
protocols/governance/index.yaml pre-existed this PR and seeds
outdoor_video_q2 as a guaranteed/video_15s/\$12 product. Three new
fixtures in this PR (delivery_reporting, governance_approved,
creative-generative) diverged (non_guaranteed/video_30s/\$15), so the
SDK's seed store refused the replay with
  seed_product.outdoor_video_q2: INVALID_PARAMS ... diverges from the
  previously seeded fixture
on every storyboard reached after governance/index.yaml had run.

Match the canonical seed shape (guaranteed / video_15s / fixed_price
12.0) across the three PR-added fixtures. The storyboards' create_media_buy
packages only reference pricing_option_id, so delivery_type + format_id
don't affect the flow — this is purely a seed-body alignment.
@bokelley bokelley merged commit 1f11ef5 into main Apr 22, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant