feat(schema): audience activation method declarations (#4324) - #6549
feat(schema): audience activation method declarations (#4324)#6549bokelley wants to merge 6 commits into
Conversation
Products declare how buyer audience data can reach them via audience_activation.methods; the seller-level union surfaces as audience_targeting.supported_activation_methods, and buyers filter discovery with filters.audience_activation_methods. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated schema paths require human/CODEOWNERS approval.
This PR modifies/adds files under static/schemas/source/**, which are under a deterministic hard approval gate (gated_paths: true), and review_decision is REVIEW_REQUIRED (not APPROVED). Per decision rule row 2, the outcome must be escalate.
The reviewer found no Medium-or-worse issues: the new audience_activation declarations are additive and optional, the new core/audience-activation-method.json oneOf is cleanly const-discriminated (audit passes), schema↔docs coherence holds across all four docs pages, the filter_diagnostics.excluded_by reference resolves, and a minor/non-breaking changeset is present. On the merits this is a clean, Normative (non-breaking) additive change — but ratification of protocol surface changes is a human act and the gate is not yet satisfied.
Escalation reasons
static/schemas/source/core/audience-activation-method.json(added),product-filters.json,product.json,protocol/get-adcp-capabilities-response.json(modified) — gated protocol-schema paths require human/CODEOWNERS review;review_decisionisREVIEW_REQUIRED, notAPPROVED.
Why human review
- Gated paths under static/schemas/source/** are modified/added and review_decision is REVIEW_REQUIRED (not APPROVED) — human/CODEOWNERS approval required before merge (decision rule row 2).
- Files: audience-activation-method.json (added), product-filters.json, product.json, get-adcp-capabilities-response.json (modified).
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/audience-activation-method.json (added) matches
static/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'REVIEW_REQUIRED', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated paths under static/schemas/source/** require human/CODEOWNERS approval.
This PR adds/modifies protocol source-of-truth schema files under static/schemas/source/**, which are under a hard, non-overridable approval gate (gated_paths: true). The current review_decision is REVIEW_REQUIRED, not APPROVED, so decision rule row 2 applies and the PR cannot be auto-approved regardless of how clean the diff is.
The reviewer found no critical/high/medium findings. The delta since the prior pass is a single editorial change in docs/media-buy/task-reference/get_products.mdx (linking the sync_audiences enum value to its task-reference page). Link target exists; no schema or wire-shape change. Schema↔docs coherence, changeset scope, oneOf discriminator, and artifact-immutability checks are all clean.
The diff is mechanically clean, but the schema-source gate is satisfied only by a recorded human/CODEOWNERS approval, which is not yet present.
Escalation reasons
- Files under
static/schemas/source/**are added/modified (audience-activation-method.jsonadded;product-filters.json,product.json,get-adcp-capabilities-response.jsonmodified) andreview_decisionisREVIEW_REQUIRED, notAPPROVED. Human/CODEOWNERS approval is required before merge.
Why human review
- Gated paths under static/schemas/source/** are added/modified (audience-activation-method.json added; product-filters.json, product.json, get-adcp-capabilities-response.json modified) and review_decision is REVIEW_REQUIRED, not APPROVED — human/CODEOWNERS approval required before merge (decision rule row 2).
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/audience-activation-method.json (added) matches
static/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'REVIEW_REQUIRED', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
|
Ladon cannot review this PR until merge conflicts are resolved. |
…dor-review # Conflicts: # package.json
|
Vendor implementation review requested before merge. This update now makes the activation contract account-safe and separates the capability from account setup:
Please validate these points against real implementations:
Local validation after merging current Holding merge for vendor feedback. |
|
Vendor implementation review — triage pass. Four questions assessed against real vendor flows; protocol and product experts consulted. Q1 and Q2 confirmed solid; Q3 mostly solid with one documentation gap; Q4 surfaces one schema correctness issue worth resolving before merge plus two known deferrals. Q1 — Snowflake, BigQuery, Databricks: confirmed sufficient. The opaque Q2 — LiveRamp, InfoSum, destination platforms: confirmed sufficient. LiveRamp and InfoSum issue destination identifiers only after bilateral setup, matching the "omit until account setup establishes the destination" lifecycle exactly. The Q3 — AMC, Ads Data Hub, PAIR: mostly confirmed; one documentation gap. AMC and Ads Data Hub both map correctly: PAIR is the ambiguous case. PAIR is a cryptographic hashing protocol — coordinated hashing with no centralized query environment — not a shared-compute clean room. In practice PAIR outputs activate via DV360, so the correct composition is Q4 — Flows that cannot be represented: Pre-merge schema correctness issue: the Known deferrals (not blockers):
The merge conflict flagged by the bot is a separate operational blocker. The schema design holds up to these four validation tests pending the filter-schema restructuring and the PAIR documentation note. Generated by Claude Code |
…#6549) Restructure audience_activation_methods filter items in product-filters.json from a flat object into a per-pattern oneOf discriminated union, mirroring the activation-method schema. This prevents semantically incoherent filter entries (e.g. { "pattern": "sync_audiences", "transport": "s3" }) from passing schema validation. Add a note in media-products.mdx clarifying that PAIR-style cryptographic hashing protocols are not shared-compute clean rooms: the correct composition is clean_room (pairing provider as vendor) + platform_distribution (DSP vendor), not tmp_identity_match.
|
Thanks for the thorough vendor review. Two fixes applied in bd610a5: Q3 — PAIR documentation gap (fixed). Added a sentence to the clean-room composition paragraph in Q4 — Filter-items schema correctness (fixed). Restructured Q4 — Known deferrals (not actioned here). The SFTP and proprietary-API-push gaps are understood. Two follow-up issues would be worth filing — one scoping SFTP for v2 and signaling intent to traditional media publishers, one sketching a Merge conflict. The branch already carries a merge-of-main commit ( Generated by Claude Code |
…#6549) Add media-products.mdx clarifying that PAIR-style cryptographic hashing protocols are not shared-compute clean rooms: the correct composition is clean_room (pairing provider as vendor) + platform_distribution (DSP vendor), not tmp_identity_match.
Implements #4324 (audience activation method declarations) per the WG review, decision comments, and the #6540 alignment notes.
What this adds
core/audience-activation-method.json(new) — discriminated union over six patterns:sync_audiences,tmp_identity_match(per-buyerbuyer_agent, per Decision 1),file_transfer(flat transport enums3/gcs/azure_blobvia$reftocloud-storage-protocol.json, SFTP dropped per Decision 2;directionsas array, absent = unspecified),dataset_query(with optionalconsumer_identities[]— cloud/region-qualified principals, framed as routing/cost hints),clean_room(informational; output binds through RFC: external audience sources — pass-through references on sync_audiences #6540 sources), andplatform_distribution(destination_ref+ optionalbind_expiry_days).core/product.json—audience_activation { methods[], preferred_method?, notes? }. Absence = undeclared,methods: []disallowed.protocol/get-adcp-capabilities-response.json—audience_targeting.supported_activation_methodsas the seller-level union for fast-fail discovery; per-product declarations remain the source of truth.core/product-filters.json—audience_activation_methodsfilter: OR across entries, AND within an entry, omitted optional fields as wildcards,directionson non-empty intersection; sellers MUST exclude undeclared products when the filter is present (reported viafilter_diagnostics.excluded_by).Editorial fix list from triage — all folded in
directionsenum values defined;transport$refs the existing enum; per-branchadditionalProperties: falseenforces the forbidden-field table (stronger thannot: {required}guards);destination_reftyped withmaxLength: 256and documented as seller-declared config ref;buyer_agent.agent_urlcarriesformat: urimirroringtrusted_match.providers[];consumer_identities[].identitydocumented as vendor-specific and opaque.Decisions encoded
buyer_agentkept ontmp_identity_match(Option A), with a consistency note againsttrusted_match.providers[].cloud-storage-protocol.jsonprecedent.consumer_identities[]ondataset_queryonly (Option A) — clean-room output binds throughdataset/platform_segmentsources per RFC: external audience sources — pass-through references on sync_audiences #6540, so the granted identity is always thedataset_queryentry's.{cloud, region}qualifiers documented as routing/cost hints, not grant-reachability or compliance boundaries.Not in this PR
The runtime leg — external source references on
sync_audiences— is #6540, deferred pending this. Sibling reporting-direction RFC remains separate.Validation
Schema build clean; schema-validation (29), doc-example validation (79), JSON-block validation (259), and oneOf-discriminator audit all pass on a base rebased to current main.
Closes #4324.
🤖 Generated with Claude Code