feat(schema): add portable demographic targeting - #6092
Conversation
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated schema paths require human/CODEOWNERS review.
This PR touches static/schemas/source/** (16 files, including 4 new schemas and 12 modified), which is under a hard, path-based approval gate. gated_paths: true and review_decision: REVIEW_REQUIRED (not APPROVED), so decision-table row 2 fires and the outcome cannot be approve or plain comment until a human/CODEOWNERS approval lands.
The change itself looks clean and additive per the reviewer: AdCP 3.2 demographic-targeting surface with a correct minor changeset, four new schemas registered in index.json, a properly discriminated execution oneOf (passes the audit walker), schema↔docs coherence across get_products/get_media_buys/get_adcp_capabilities/signals, x-entity registry parity, and a full test + compliance-storyboard suite. No critical/high findings were raised.
Medium findings
- static/compliance/source/protocols/media-buy/scenarios/demographic_targeting.yaml:215 — Open-bound vs min/max_supported_age interaction is undefined; risks silent narrowing.
Only one medium finding (not schema/data-loss/infra category), so it does not independently trigger escalation via rows 4/5. The escalation is driven by the unsatisfied gated-paths approval requirement (row 2). A reviewer with CODEOWNERS authority should confirm the new wire surface and the open-bound/supported-domain interaction, then approve to lift the gate.
Escalation reasons
- Gated schema files under
static/schemas/source/**(e.g. demographic-age-range.json, demographic-predicate.json, targeting.json, index.json) require human/CODEOWNERS approval;review_decisionis REVIEW_REQUIRED, not APPROVED.
Medium findings
- static/compliance/source/protocols/media-buy/scenarios/demographic_targeting.yaml:215 — Open-bound vs min/max_supported_age interaction is undefined; risks silent narrowing
Why human review
- Gated paths: PR modifies static/schemas/source/** (16 files) which is under a hard approval gate; review_decision is REVIEW_REQUIRED, not APPROVED — human/CODEOWNERS approval required before merge.
- Open medium: demographic_targeting.yaml:215 — undefined open-bound vs min/max_supported_age interaction risks silent narrowing; worth a human eye during the required review.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/demographic-age-range.json (added) matches
static/schemas/source/**; static/schemas/source/core/demographic-predicate.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/demographic-targeting-capability.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/demographic-targeting-resolution.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-definition-enrichment.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-definition.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-listing.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/targeting.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/x-entity-types.json (modified) matchesstatic/schemas/source/**; static/schemas/source/index.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-media-buys-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/signals/get-signals-request.json (modified) matches `static/schem
…(truncated)…
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated paths require human/CODEOWNERS approval.
This PR touches static/schemas/source/** (16 files) and .changeset/pre.json, both under a hard, non-overridable approval gate. gated_paths is true and review_decision is not APPROVED (unknown/none), so decision-table row 2 fires: outcome must be escalate.
The diff itself is clean this pass — the only delta since the prior escalate is a standard changeset pre enter beta artifact (mode pre, tag beta, initialVersions.adcontextprotocol 3.1.1 matching base package.json, empty changesets), consistent with the main-line next-minor beta pre state. The feature changeset is minor/additive → 3.2.0-beta.0. No new code-correctness findings; the prior medium on demographic_targeting.yaml:215 is outside the current delta.
However, the diff introduces a new demographic-targeting feature to the protocol surface (schema additions/modifications). Ratification of protocol changes is a human act, and the hard approval gate on static/schemas/source/** cannot be lifted by a clean diff — only by a recorded human/CODEOWNERS approval.
Escalation reasons
- Touches
static/schemas/source/**(16 schema files) and.changeset/pre.json— hard approval gate;review_decisionis not APPROVED. Human/CODEOWNERS review required before merge.
No blocking (critical/high) findings exist; this is purely the gated-paths gate.
Why human review
- Gated paths: PR touches static/schemas/source/** (16 schema files) and .changeset/pre.json, both under a hard approval gate; review_decision is not APPROVED (unknown/none) — human/CODEOWNERS approval required before merge.
- This PR touches a path under a hard, non-overridable approval gate (.changeset/pre.json (added) matches
.changeset/pre.json; static/schemas/source/core/demographic-age-range.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/demographic-predicate.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/demographic-targeting-capability.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/demographic-targeting-resolution.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-definition-enrichment.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-definition.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-listing.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/targeting.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/x-entity-types.json (modified) matchesstatic/schemas/source/**; static/schemas/source/index.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-media-buys-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/signals/get-signals-request.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'unknown', 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.
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated paths require human/CODEOWNERS approval before merge.
This PR touches files under a hard, non-overridable approval gate (gated_paths: true) and the current review_decision is REVIEW_REQUIRED, not APPROVED. Per decision-table row 2, the outcome must be escalate.
Escalation reasons
.changeset/pre.jsonand 16 files understatic/schemas/source/**fall under the hard approval gate; a real human/CODEOWNERS approval is required before this can merge.
Findings
No Critical/High/Medium findings. The reviewer confirmed the delta since the prior clean pass is a description-only clarification of continuous_bounds age semantics in demographic-targeting-capability.json plus a text-assertion test; it introduces no schema-shape/required/enum change and is schema↔docs coherent. The diff is mechanically clean — but the gate lifts only when review_decision becomes APPROVED, which has not occurred.
This confirms the prior escalate decision; the gate condition is unchanged.
Why human review
- Gated paths: PR touches static/schemas/source/** (16 schema files) and .changeset/pre.json, both under a hard approval gate; review_decision is REVIEW_REQUIRED, not APPROVED — human/CODEOWNERS approval required before merge.
- This PR touches a path under a hard, non-overridable approval gate (.changeset/pre.json (added) matches
.changeset/pre.json; static/schemas/source/core/demographic-age-range.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/demographic-predicate.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/demographic-targeting-capability.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/demographic-targeting-resolution.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-definition-enrichment.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-definition.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-listing.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/targeting.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/x-entity-types.json (modified) matchesstatic/schemas/source/**; static/schemas/source/index.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-media-buys-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/signals/get-signals-request.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.
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated paths require human/CODEOWNERS approval.
This PR refines the unreleased AdCP 3.2 demographic-targeting feature: adds supports_unbounded_min/max continuous-bounds flags and collapses demographic-targeting-resolution to exact-only. Schema, docs, compliance scenario, and unit tests all move in lockstep with no drift, no oneOf regression, and a correct minor changeset for an additive, never-released surface. The reviewer surfaced no critical/high/medium findings — the diff is clean.
However, this PR touches files under a hard, non-overridable approval gate (gated_paths: true) and the current review_decision is REVIEW_REQUIRED, not APPROVED. Per decision rule row 2, the outcome must be escalate until a human/CODEOWNERS approval is recorded. This is consistent with the prior escalate decision; the gate has not lifted.
Escalation reasons
.changeset/pre.jsonand 16 files understatic/schemas/source/**are under a hard approval gate;review_decisionisREVIEW_REQUIRED, notAPPROVED. Human/CODEOWNERS approval is required before merge.
Why human review
- Gated paths: PR modifies static/schemas/source/** (16 schema files) and .changeset/pre.json, both under a hard approval gate; review_decision is REVIEW_REQUIRED, not APPROVED — human/CODEOWNERS approval required before merge.
- This PR touches a path under a hard, non-overridable approval gate (.changeset/pre.json (added) matches
.changeset/pre.json; static/schemas/source/core/demographic-age-range.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/demographic-predicate.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/demographic-targeting-capability.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/demographic-targeting-resolution.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-definition-enrichment.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-definition.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/signal-listing.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/targeting.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/x-entity-types.json (modified) matchesstatic/schemas/source/**; static/schemas/source/index.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-media-buys-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/signals/get-signals-request.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.
Summary
targeting_overlay.demographicspredicate with explicit open-bound and unknown-age handlingage_restrictionintersection semantics, backed by conformance storyboards, test vectors, and schema testsDesign decisions
demographicsandage_restrictionintersect; unknown ages cannot pass when both are present.Validation
Closes #6087