From 6aa848fdd64ed26e03fdf72ba628f49cac9a21b0 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 3 May 2026 14:05:37 +0000 Subject: [PATCH 1/2] fix(compliance): remove payload_must_contain over-fit; extend identifier_paths echo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Part A: Drop Meta-shape payload_must_contain from sales-social/sync_audiences, audience-sync/create_audience, and signal-marketplace/activate_on_platform. The users[*].hashed_email path assumes Google/Meta nesting and fails TikTok, Snap, Pinterest, and others. identifier_paths already covers the anti-façade objective shape-agnostically (value echo at any depth). signal-marketplace's segment_id payload shape was similarly platform-specific (TTD-shaped); replaced with identifier_paths: ["signal_agent_segment_id"]. Part B: Extend cross-step identifier echo to four storyboards: - signal-marketplace/activate_on_platform: identifier_paths replaces payload_must_contain - creative-ad-server/build_tag: add identifier_paths: ["creative_id"] - audience-sync/delete_audience: new upstream_traffic check (method-agnostic; identifier echo) - sales-non-guaranteed/update_media_buy: bare upstream_traffic check (no identifier_paths; media_buy_id is seller-assigned, not a buyer-supplied literal) Also replace real brand name "the-trade-desk" with fictional "pinnacle-dsp" per playbook. Closes #3969 https://claude.ai/code/session_01Tmvr85NJQwDR9QWEciSZk7 --- ...ompliance-payload-must-contain-identifier-echo.md | 4 ++++ .../source/specialisms/audience-sync/index.yaml | 12 +++++++++--- .../source/specialisms/creative-ad-server/index.yaml | 4 +++- .../specialisms/sales-non-guaranteed/index.yaml | 8 ++++++++ .../source/specialisms/sales-social/index.yaml | 3 --- .../source/specialisms/signal-marketplace/index.yaml | 9 ++++----- 6 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 .changeset/fix-compliance-payload-must-contain-identifier-echo.md 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..15d653578f 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,12 @@ 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 audience_id is the same literal used in create_audience, so the echo + # confirms the specific test audience was the deletion target. + - 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: | From db1f4973e8d347b01ec2575249a8be572cf0ea31 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 3 May 2026 14:08:15 +0000 Subject: [PATCH 2/2] fix(compliance): fix overclaiming comment in delete_audience upstream_traffic check https://claude.ai/code/session_01Tmvr85NJQwDR9QWEciSZk7 --- .../compliance/source/specialisms/audience-sync/index.yaml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/static/compliance/source/specialisms/audience-sync/index.yaml b/static/compliance/source/specialisms/audience-sync/index.yaml index 15d653578f..35ab3fd630 100644 --- a/static/compliance/source/specialisms/audience-sync/index.yaml +++ b/static/compliance/source/specialisms/audience-sync/index.yaml @@ -291,9 +291,8 @@ phases: 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 audience_id is the same literal used in create_audience, so the echo - # confirms the specific test audience was the deletion target. + # 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