diff --git a/.changeset/fix-compliance-payload-must-contain-identifier-echo.md b/.changeset/fix-compliance-payload-must-contain-identifier-echo.md new file mode 100644 index 0000000000..4a219b2cd3 --- /dev/null +++ b/.changeset/fix-compliance-payload-must-contain-identifier-echo.md @@ -0,0 +1,4 @@ +--- +--- + +Remove Meta-shape `payload_must_contain` over-fit from 3 storyboards (sales-social, audience-sync, signal-marketplace) and extend cross-step `identifier_paths` echo to signal-marketplace, sales-non-guaranteed, creative-ad-server, and audience-sync delete step. Non-protocol change — storyboard conformance harness only. diff --git a/static/compliance/source/specialisms/audience-sync/index.yaml b/static/compliance/source/specialisms/audience-sync/index.yaml index 2ce56bff21..35ab3fd630 100644 --- a/static/compliance/source/specialisms/audience-sync/index.yaml +++ b/static/compliance/source/specialisms/audience-sync/index.yaml @@ -248,9 +248,6 @@ phases: identifier_paths: - "audiences[*].add[*].hashed_email" - "audiences[*].add[*].external_id" - payload_must_contain: - - path: "users[*].hashed_email" - match: present - id: delete_audience title: "Delete test audience" narrative: | @@ -293,3 +290,11 @@ phases: path: "context.correlation_id" value: "audience_sync--delete_audience" description: "Context correlation_id returned unchanged" + # Anti-façade: an adapter that returns a shape-valid delete response without + # forwarding the deletion to its upstream user graph fails this check. The + # identifier echo confirms the upstream call carries the correct audience ID. + - check: upstream_traffic + description: "delete_audience caused upstream traffic propagating the deletion to the upstream user graph" + min_count: 1 + identifier_paths: + - "audiences[*].audience_id" diff --git a/static/compliance/source/specialisms/creative-ad-server/index.yaml b/static/compliance/source/specialisms/creative-ad-server/index.yaml index e2b37e064c..bf020b1c9c 100644 --- a/static/compliance/source/specialisms/creative-ad-server/index.yaml +++ b/static/compliance/source/specialisms/creative-ad-server/index.yaml @@ -264,9 +264,11 @@ phases: # Ad Manager, Kevel, Equativ, FreeWheel) — the storyboard asserts # "an upstream call happened" rather than naming a platform. - check: upstream_traffic - description: "build_creative caused upstream traffic to the ad server" + description: "build_creative caused upstream traffic to the ad server carrying the creative_id" min_count: 1 endpoint_pattern: "POST *" + identifier_paths: + - "creative_id" - id: track_delivery title: "Track creative delivery" narrative: | diff --git a/static/compliance/source/specialisms/sales-non-guaranteed/index.yaml b/static/compliance/source/specialisms/sales-non-guaranteed/index.yaml index bdd94e76ee..291d98c2ea 100644 --- a/static/compliance/source/specialisms/sales-non-guaranteed/index.yaml +++ b/static/compliance/source/specialisms/sales-non-guaranteed/index.yaml @@ -384,6 +384,14 @@ phases: path: "context.correlation_id" value: "sales_non_guaranteed--update_media_buy" description: "Context correlation_id returned unchanged" + # Anti-façade: a real update propagates bid/budget changes to the upstream + # auction platform. An adapter returning shape-valid responses without touching + # upstream fails this check. No identifier_paths here — media_buy_id is + # seller-assigned (dynamic context variable, not a buyer-supplied literal). + - check: upstream_traffic + description: "update_media_buy caused upstream traffic applying the bid/budget changes" + min_count: 1 + endpoint_pattern: "POST *" - id: delivery title: "Delivery and auction metrics" narrative: | diff --git a/static/compliance/source/specialisms/sales-social/index.yaml b/static/compliance/source/specialisms/sales-social/index.yaml index 3ca48f5584..46d8f10adb 100644 --- a/static/compliance/source/specialisms/sales-social/index.yaml +++ b/static/compliance/source/specialisms/sales-social/index.yaml @@ -252,9 +252,6 @@ phases: identifier_paths: - "audiences[*].add[*].hashed_email" - "audiences[*].add[*].external_id" - payload_must_contain: - - path: "users[*].hashed_email" - match: present - id: creative_push title: "Native creative sync" narrative: | diff --git a/static/compliance/source/specialisms/signal-marketplace/index.yaml b/static/compliance/source/specialisms/signal-marketplace/index.yaml index b19e01149c..a4a1a42af3 100644 --- a/static/compliance/source/specialisms/signal-marketplace/index.yaml +++ b/static/compliance/source/specialisms/signal-marketplace/index.yaml @@ -314,8 +314,8 @@ phases: pricing_option_id: "$context.first_signal_pricing_option_id" destinations: - type: "platform" - platform: "the-trade-desk" - account: "agency-123-ttd" + platform: "pinnacle-dsp" + account: "agency-123-pd" idempotency_key: "$generate:uuid_v4#signal_marketplace_activate_platform" context: correlation_id: "signal_marketplace--activate_on_platform" @@ -354,9 +354,8 @@ phases: min_count: 1 endpoint_pattern: "POST *" since: search_by_spec - payload_must_contain: - - path: "segment_id" - match: present + identifier_paths: + - "signal_agent_segment_id" - id: agent_activation title: "Activate on a sales agent" narrative: |