fix(storyboards): resolve 16-fixture actionable drift bundle (adcp#2763)#2798
Merged
Conversation
Third cluster-bundle follow-up to the schema lint landed in #2768, #2781, #2788. Allowlist shrinks 29 → 13. Lint change: isNegativeStep now treats `expect_error: true` as a canonical negative-step marker alongside the existing error_code / http_status_in heuristics. That's the widely-used convention in the suite (20+ sites) and lets reversed_dates and other deliberate error fixtures pass without per-fixture opt-ins. Fixture changes across 14 files. Main themes: - Shape completion (missing required fields): account on state-machine, reason on si_terminate_session, query/uses on get_rights_catalog, external_id on audience-sync add[] entries, event_time on log_event / log_events, event_source_id on sales-social event_logging, package_id on sales-non-guaranteed update_media_buy (with upstream capture), request_type/creative_manifest/assets on preview_display and preview_synced, creatives[] padding on reassign_creative. - Shape corrections: total_budget bare number → { amount, currency } object on two accept_proposal fixtures; flat brand/operator wrapped in accounts[{...}] on deterministic sync_accounts_for_state. - additionalProperty removal: accounts[].brand.name on sales-catalog- driven sync_accounts. - Explicit negative-test opt-in on error-compliance missing_fields (accepts either response or error — doesn't use expect_error). 13 entries remain, all blocked on WG decisions in upstream issues #2774-#2776 or the sales-social/sync_dpa_creative cluster (separate PR). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced Apr 22, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Third cluster-bundle follow-up to the storyboard schema lint from #2768, #2781, #2788. Bundles all remaining actionable drift into one reviewable PR. Allowlist shrinks 29 → 13.
Lint change
isNegativeStepnow treatsexpect_error: trueas a canonical negative-step marker alongside the existingerror_code/http_status_inheuristics.expect_erroris the widely-used convention throughout the compliance suite (20+ sites) and resolves deliberate-error fixtures (reversed_dates, etc.) without needing per-fixture opt-ins.Fixture changes (14 files, 16 allowlist entries resolved)
Shape completion — missing required fields:
protocols/media-buy/state-machine.yaml#setup/create_buy— missingaccountprotocols/sponsored-intelligence/index.yaml#session_lifecycle/si_terminate_session— missingreasonspecialisms/brand-rights/scenarios/governance_denied.yaml#rights_denied/get_rights_catalog— missingquery/usesspecialisms/audience-sync/index.yaml#audience_sync/create_audience— missingexternal_idonadd[]specialisms/sales-catalog-driven/index.yaml#conversion_tracking/log_events— events usedtimestampwhere schema wantsevent_timespecialisms/sales-social/index.yaml#event_logging/log_event— missingevent_source_idat root +event_timeon eventprotocols/creative/index.yaml#build_and_preview/preview_display— missingrequest_type/creative_manifest/assets/format_id; populated the full single-request shapeprotocols/media-buy/creative-reception.yaml#preview/preview_synced— missingcreative_manifest.assetsprotocols/media-buy/scenarios/creative_fate_after_cancellation.yaml#reuse_creative_on_new_buy/reassign_creative—creatives: []required by schema minItems: 1 even for assignment-only calls; added minimalcreatives[]paddingspecialisms/sales-non-guaranteed/index.yaml#adjust_bids/update_media_buy— packages usedproduct_idbut schema requirespackage_id; exposedfirst_package_id/second_package_idviacontext_outputson the create step so update can reference themShape corrections:
protocols/media-buy/scenarios/proposal_finalize.yaml#accept_proposal/create_media_buy—total_budget: 50000→{ amount: 50000, currency: "USD" }specialisms/sales-proposal-mode/index.yaml#accept_proposal/create_media_buy— sametotal_budgetfixuniversal/deterministic-testing.yaml#deterministic_account/sync_accounts_for_state— flatbrand/operator→accounts: [{...}]wrapperadditionalProperty removal:
specialisms/sales-catalog-driven/index.yaml#account_setup/sync_accounts— removedbrand.name(schema rejects)Explicit negative-test opt-in:
universal/error-compliance.yaml#error_responses/missing_fields—sample_request_skip_schema: true(step intentionally tests empty-brief path; accepts either response or error so noexpect_errormarker).Ratchet
Allowlist: 29 → 13. Regenerated in shrink-only mode.
Remaining 13 entries — all blocked:
account— author intuition collides withplan_idscoping #2776 (governanceaccountadditionalProperty)refine[]field naming — schema wants genericid+action, storyboards authorproposal_id/product_id#2775 (refine[]naming)contextfield collision — SI schemas redefine core context as string with semantic meaning #2774 (SIcontext:stringcollision; one of these is in deterministic-testing)sales-social/sync_dpa_creative— creative-manifest assets anyOf cluster (separate PR)Test plan
npm run test:storyboard-sample-request-schema— passes (13 grandfathered, 0 new drift, 0 stale)npm run test:unit— 631 passednpm run typecheck— cleanrequired/additionalProperties/ type constraints🤖 Generated with Claude Code