Skip to content

feat(schema): add portable demographic targeting - #6092

Merged
bokelley merged 4 commits into
mainfrom
review-issue-6087
Jul 30, 2026
Merged

feat(schema): add portable demographic targeting#6092
bokelley merged 4 commits into
mainfrom
review-issue-6087

Conversation

@bokelley

@bokelley bokelley commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Summary

  • adds a canonical, age-only targeting_overlay.demographics predicate with explicit open-bound and unknown-age handling
  • advertises product-scoped continuous-range, enumerated-interval, and signal execution modes, with a coarse global capability rollup
  • makes signal demographic predicates authoritative and adds exact requested/applied resolution readback for synchronous and asynchronous workflows
  • documents governance and age_restriction intersection semantics, backed by conformance storyboards, test vectors, and schema tests

Design decisions

  • Gender is intentionally deferred until the working group agrees on portable semantics and privacy expectations.
  • An exact predicate means declared execution semantics, not person-level demographic certainty or model accuracy.
  • Stored packages are exact-only: sellers reject non-equivalent compilation, and buyers resubmit any chosen supported predicate as a new request.
  • Continuous products explicitly declare support for open-lower and open-upper predicates.
  • demographics and age_restriction intersect; unknown ages cannot pass when both are present.

Validation

  • 8 demographic targeting schema tests
  • 27 targeting-overlay vector tests
  • 20 schema-validation tests
  • 118 composed-schema tests
  • 284 schema-backed documentation examples
  • compliance storyboard build and lint, including exact bucket union, open upper bound, unknown mismatch, and empty eligibility intersection
  • documentation navigation, x-entity, link, UTF-8, platform-agnostic, and schema audits

Closes #6087

@bokelley bokelley added this to the 3.2.0 milestone Jul 30, 2026
@bokelley
bokelley marked this pull request as ready for review July 30, 2026 01:19
@aao-secretariat aao-secretariat Bot added the ladon/needs-human-review Ladon has escalated this PR for human review. label Jul 30, 2026

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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_decision is 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) matches static/schemas/source/**; static/schemas/source/core/demographic-targeting-capability.json (added) matches static/schemas/source/**; static/schemas/source/core/demographic-targeting-resolution.json (added) matches static/schemas/source/**; static/schemas/source/core/package.json (modified) matches static/schemas/source/**; static/schemas/source/core/product.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-definition-enrichment.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-definition.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-listing.json (modified) matches static/schemas/source/**; static/schemas/source/core/targeting.json (modified) matches static/schemas/source/**; static/schemas/source/core/x-entity-types.json (modified) matches static/schemas/source/**; static/schemas/source/index.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-media-buys-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matches static/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matches static/schemas/source/**; static/schemas/source/signals/get-signals-request.json (modified) matches `static/schem

…(truncated)…

@bokelley bokelley changed the title [codex] add portable demographic targeting feat(schema): add portable demographic targeting Jul 30, 2026
@bokelley bokelley closed this Jul 30, 2026
@bokelley bokelley reopened this Jul 30, 2026

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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_decision is 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) matches static/schemas/source/**; static/schemas/source/core/demographic-predicate.json (added) matches static/schemas/source/**; static/schemas/source/core/demographic-targeting-capability.json (added) matches static/schemas/source/**; static/schemas/source/core/demographic-targeting-resolution.json (added) matches static/schemas/source/**; static/schemas/source/core/package.json (modified) matches static/schemas/source/**; static/schemas/source/core/product.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-definition-enrichment.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-definition.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-listing.json (modified) matches static/schemas/source/**; static/schemas/source/core/targeting.json (modified) matches static/schemas/source/**; static/schemas/source/core/x-entity-types.json (modified) matches static/schemas/source/**; static/schemas/source/index.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-media-buys-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matches static/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matches static/schemas/source/**; static/schemas/source/signals/get-signals-request.json (modified) matches static/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.

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.json and 16 files under static/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) matches static/schemas/source/**; static/schemas/source/core/demographic-predicate.json (added) matches static/schemas/source/**; static/schemas/source/core/demographic-targeting-capability.json (added) matches static/schemas/source/**; static/schemas/source/core/demographic-targeting-resolution.json (added) matches static/schemas/source/**; static/schemas/source/core/package.json (modified) matches static/schemas/source/**; static/schemas/source/core/product.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-definition-enrichment.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-definition.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-listing.json (modified) matches static/schemas/source/**; static/schemas/source/core/targeting.json (modified) matches static/schemas/source/**; static/schemas/source/core/x-entity-types.json (modified) matches static/schemas/source/**; static/schemas/source/index.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-media-buys-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matches static/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matches static/schemas/source/**; static/schemas/source/signals/get-signals-request.json (modified) matches static/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.

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.json and 16 files under static/schemas/source/** are under a hard approval gate; review_decision is REVIEW_REQUIRED, not APPROVED. 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) matches static/schemas/source/**; static/schemas/source/core/demographic-predicate.json (added) matches static/schemas/source/**; static/schemas/source/core/demographic-targeting-capability.json (added) matches static/schemas/source/**; static/schemas/source/core/demographic-targeting-resolution.json (added) matches static/schemas/source/**; static/schemas/source/core/package.json (modified) matches static/schemas/source/**; static/schemas/source/core/product.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-definition-enrichment.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-definition.json (modified) matches static/schemas/source/**; static/schemas/source/core/signal-listing.json (modified) matches static/schemas/source/**; static/schemas/source/core/targeting.json (modified) matches static/schemas/source/**; static/schemas/source/core/x-entity-types.json (modified) matches static/schemas/source/**; static/schemas/source/index.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-media-buys-response.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/get-products-request.json (modified) matches static/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.json (modified) matches static/schemas/source/**; static/schemas/source/signals/get-signals-request.json (modified) matches static/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.

@bokelley
bokelley merged commit eb9ce94 into main Jul 30, 2026
32 checks passed
@bokelley
bokelley deleted the review-issue-6087 branch July 30, 2026 10:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ladon/needs-human-review Ladon has escalated this PR for human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

RFC: portable demographic targeting intent, capabilities, and exact readback

1 participant