fix(compliance): remove payload_must_contain over-fit; extend identifier_paths echo across 4 storyboards#3975
Merged
bokelley merged 2 commits intoMay 3, 2026
Conversation
…ier_paths echo 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
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.
Closes #3969
Summary
Two coupled fixes to the 5 storyboards that adopted
upstream_trafficin #3962.Part A — Remove Meta-shape
payload_must_containover-fit (3 storyboards)sales-social/sync_audiencesandaudience-sync/create_audiencedeclaredpayload_must_contain: [{path: "users[*].hashed_email"}], which assumes Google Customer Match / Meta CAPI nesting. TikTok, Snap, and Pinterest use completely different path shapes — these adopters' conformance runs were failing the check despite forwarding identifiers correctly.identifier_pathsalready provides shape-agnostic value-echo verification (asserts the supplied value appears at any depth);payload_must_containadded only a shape constraint that's redundant in the best case and a false positive in every non-Meta case.signal-marketplace/activate_on_platformhad the same problem withpayload_must_contain: [{path: "segment_id"}]— TTD-shaped, fails Xandr, Amazon DSP, Yahoo DSP, and others. Replaced withidentifier_paths: ["signal_agent_segment_id"](schema spec confirms identifier_paths resolves from the post-substitution request, so the context-resolved segment ID is extracted correctly).Also replaced real brand name
the-trade-desk/agency-123-ttdwith fictionalpinnacle-dsp/agency-123-pdper playbook.Part B — Extend cross-step
identifier_pathsecho (4 storyboards)sales-socialwas the only storyboard using the cross-step pattern (samehashed_emailvalue asserted in bothsync_audiencesandlog_eventupstream traffic). Extended the pattern:identifier_paths: ["signal_agent_segment_id"]replacespayload_must_contain(see Part A)identifier_paths: ["creative_id"]to existingupstream_trafficcheckupstream_trafficcheck withidentifier_paths: ["audiences[*].audience_id"](method-agnostic — noendpoint_patternsince deletion APIs vary by platform)upstream_trafficcheck (noidentifier_paths—media_buy_idis seller-assigned,$context.*value, not a buyer-supplied literal; bare check verifies upstream propagation happened)Non-breaking justification
All changes are to the conformance harness (
static/compliance/source/specialisms/), not published schemas or task definitions.identifier_pathscovers their values.upstream_trafficchecks gradenot_applicablefor any adopter not advertisingquery_upstream_trafficvialist_scenarios. Only opt-in adopters see stricter checks.upstream_trafficwas introduced in feat(compliance): bump @adcp/sdk to 6.7.0 + adopt upstream_traffic on 5 storyboards #3962 (recent); no conformant implementation was relying on the absence of these assertions.--empty(conformance harness, not published protocol spec).Pre-PR review
identifier_pathsis strictly stronger; found 2 blockers (both fixed):endpoint_pattern: "POST *"on delete_audience → removed (method-agnostic);since: create_media_buyon update_media_buy → removed (included create traffic, defeating the check; default window "since this step's request" is correct).identifier_pathsresolves post-substitution values (runner-output-contract.yaml line 395); nit on overclaiming comment (fixed). Raisedsince: create_media_buyas "missing" based on original diff; protocol expert explicitly flagged its presence as a blocker (widens window to include create traffic). Current state — nosince— is the correct resolution per spec (storyboard-schema.yaml lines 1110-1124).Session: https://claude.ai/code/session_01Tmvr85NJQwDR9QWEciSZk7
Generated by Claude Code