Skip to content

fix(storyboards): resolve 16-fixture actionable drift bundle (adcp#2763)#2798

Merged
bokelley merged 1 commit into
mainfrom
bokelley/fix-actionable-drift-bundle
Apr 22, 2026
Merged

fix(storyboards): resolve 16-fixture actionable drift bundle (adcp#2763)#2798
bokelley merged 1 commit into
mainfrom
bokelley/fix-actionable-drift-bundle

Conversation

@bokelley

Copy link
Copy Markdown
Contributor

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

isNegativeStep now treats expect_error: true as a canonical negative-step marker alongside the existing error_code / http_status_in heuristics. expect_error is 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 — missing account
  • protocols/sponsored-intelligence/index.yaml#session_lifecycle/si_terminate_session — missing reason
  • specialisms/brand-rights/scenarios/governance_denied.yaml#rights_denied/get_rights_catalog — missing query/uses
  • specialisms/audience-sync/index.yaml#audience_sync/create_audience — missing external_id on add[]
  • specialisms/sales-catalog-driven/index.yaml#conversion_tracking/log_events — events used timestamp where schema wants event_time
  • specialisms/sales-social/index.yaml#event_logging/log_event — missing event_source_id at root + event_time on event
  • protocols/creative/index.yaml#build_and_preview/preview_display — missing request_type/creative_manifest/assets/format_id; populated the full single-request shape
  • protocols/media-buy/creative-reception.yaml#preview/preview_synced — missing creative_manifest.assets
  • protocols/media-buy/scenarios/creative_fate_after_cancellation.yaml#reuse_creative_on_new_buy/reassign_creativecreatives: [] required by schema minItems: 1 even for assignment-only calls; added minimal creatives[] padding
  • specialisms/sales-non-guaranteed/index.yaml#adjust_bids/update_media_buy — packages used product_id but schema requires package_id; exposed first_package_id/second_package_id via context_outputs on the create step so update can reference them

Shape corrections:

  • protocols/media-buy/scenarios/proposal_finalize.yaml#accept_proposal/create_media_buytotal_budget: 50000{ amount: 50000, currency: "USD" }
  • specialisms/sales-proposal-mode/index.yaml#accept_proposal/create_media_buy — same total_budget fix
  • universal/deterministic-testing.yaml#deterministic_account/sync_accounts_for_state — flat brand/operatoraccounts: [{...}] wrapper

additionalProperty removal:

  • specialisms/sales-catalog-driven/index.yaml#account_setup/sync_accounts — removed brand.name (schema rejects)

Explicit negative-test opt-in:

  • universal/error-compliance.yaml#error_responses/missing_fieldssample_request_skip_schema: true (step intentionally tests empty-brief path; accepts either response or error so no expect_error marker).

Ratchet

Allowlist: 29 → 13. Regenerated in shrink-only mode.

Remaining 13 entries — all blocked:

Test plan

  • npm run test:storyboard-sample-request-schema — passes (13 grandfathered, 0 new drift, 0 stale)
  • All 6 other storyboard lints pass
  • 8 lint unit tests pass
  • npm run test:unit — 631 passed
  • npm run typecheck — clean
  • Each fixture cross-checked against its schema's required / additionalProperties / type constraints

🤖 Generated with Claude Code

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>
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