You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Current storyboard validations on read/list tasks are essentially schema + correlation_id echo. Across all field_value checks in static/compliance/source/specialisms/:
~119/125 are path: \"context.correlation_id\" echoes
Only ~6 inspect actual response content (compliant, verdict, deployments[0].type, signal_id.source, success, deleted, status, brand_id)
A seller can return wrong, empty, or unrelated data and pass every read storyboard.
Examples of the gap
get_media_buys is exercised in 6 storyboards (sales-broadcast-tv, sales-guaranteed, sales-non-guaranteed, protocols/media-buy, get-media-buys-pagination-integrity, idempotency). None assert that media_buys[0].media_buy_id == \$context.media_buy_id from the prior create_media_buy. The seller can return any media buy.
get_creative_delivery (creative-ad-server) — schema + correlation_id only. No assertions on impressions, spend, variants, or media-buy linkage.
get_media_buy_delivery — same shallow pattern across 5 specialisms.
Lists (list_creatives, list_property_lists, list_collection_lists, list_content_standards, list_accounts, list_creative_formats) — schema + correlation_id; never asserts the just-created entity appears.
Two tracks
Track A — Data-grounded validations on existing read steps
Add cross-step assertions where state is already threaded through \$context.*:
get_media_buys / get_media_buy_delivery — assert returned media_buy_id matches the captured one
get_creative_delivery — assert returned creative_ids include the synced ones; impressions ≥ 0; spend ≤ buy budget
list_* after a create_* — assert the created id appears in the list response
validate_property_delivery is the existing reference pattern (asserts compliant: false based on input shape) — generalize that approach
Most of these need the cross-step comparison primitive in #2642 (field_equals_context, field_subset_of_context, etc.). Track A is partially blocked on that schema work.
In-step assertions that don't need new primitives (and can land now):
field_present on substantive fields, not just top-level keys (e.g., media_buys[0].packages[0].status, delivery.totals.impressions)
field_value for known-deterministic fields (e.g., when the prior step seeded a fixture, the read should return the seeded brand domain)
Track B — Missing storyboards for 7 tasks
These tasks exist in static/schemas/source/**/*-request.json but appear in zero storyboard steps:
Task
Domain
Notes
search_brands
brand
Brand discovery via natural language; no coverage
get_creative_features
creative
Semantic feature extraction; no coverage
get_media_buy_artifacts
media-buy
IO/PDF artifact retrieval; no coverage
update_rights
brand
Modify acquired rights; no coverage
creative_approval
creative
Review callback; no coverage
tasks_get
core
Async polling — no end-to-end working→submitted→completed storyboard
tasks_list
core
Same
identity_match / context_match (TMP) are intentionally out of scope here — separate track.
Problem
Current storyboard validations on read/list tasks are essentially schema + correlation_id echo. Across all
field_valuechecks instatic/compliance/source/specialisms/:path: \"context.correlation_id\"echoescompliant,verdict,deployments[0].type,signal_id.source,success,deleted,status,brand_id)A seller can return wrong, empty, or unrelated data and pass every read storyboard.
Examples of the gap
get_media_buysis exercised in 6 storyboards (sales-broadcast-tv, sales-guaranteed, sales-non-guaranteed, protocols/media-buy, get-media-buys-pagination-integrity, idempotency). None assert thatmedia_buys[0].media_buy_id == \$context.media_buy_idfrom the priorcreate_media_buy. The seller can return any media buy.get_creative_delivery(creative-ad-server) — schema + correlation_id only. No assertions on impressions, spend, variants, or media-buy linkage.get_media_buy_delivery— same shallow pattern across 5 specialisms.list_creatives,list_property_lists,list_collection_lists,list_content_standards,list_accounts,list_creative_formats) — schema + correlation_id; never asserts the just-created entity appears.Two tracks
Track A — Data-grounded validations on existing read steps
Add cross-step assertions where state is already threaded through
\$context.*:get_media_buys/get_media_buy_delivery— assert returnedmedia_buy_idmatches the captured oneget_creative_delivery— assert returned creative_ids include the synced ones; impressions ≥ 0; spend ≤ buy budgetlist_*after acreate_*— assert the created id appears in the list responsevalidate_property_deliveryis the existing reference pattern (assertscompliant: falsebased on input shape) — generalize that approachMost of these need the cross-step comparison primitive in #2642 (
field_equals_context,field_subset_of_context, etc.). Track A is partially blocked on that schema work.In-step assertions that don't need new primitives (and can land now):
field_presenton substantive fields, not just top-level keys (e.g.,media_buys[0].packages[0].status,delivery.totals.impressions)field_valuefor known-deterministic fields (e.g., when the prior step seeded a fixture, the read should return the seeded brand domain)Track B — Missing storyboards for 7 tasks
These tasks exist in
static/schemas/source/**/*-request.jsonbut appear in zero storyboard steps:search_brandsget_creative_featuresget_media_buy_artifactsupdate_rightscreative_approvaltasks_gettasks_listidentity_match/context_match(TMP) are intentionally out of scope here — separate track.Cross-cutting gaps surfaced during the skim
\$contextare never validated as the response payload (depends on Storyboard schema: cross-step comparison validation primitive #2642).tasks/getis only meaningful after a working/submitted response and there's no storyboard exercising it.Suggested sequencing
tasks_get/tasks_listlikely as one async-polling storyboard underprotocols/).Related