feat(creative): make formats canonical in AdCP 3.2 - #6125
Conversation
# Conflicts: # docs/creative/task-reference/list_creatives.mdx # server/src/training-agent/comply-test-controller.ts # server/src/training-agent/task-handlers.ts # server/src/training-agent/types.ts # server/tests/unit/comply-test-controller.test.ts # static/schemas/source/core/creative-filters.json # static/schemas/source/creative/list-creatives-request.json
# Conflicts: # server/public/members.html
There was a problem hiding this comment.
Ladon verdict: Request changes
Request changes — 1 blocking finding.
Blocking findings
- static/schemas/source/protocol/get-adcp-capabilities-response.json:1292 — Breaking optional→required flip on
get_adcp_capabilities.creative.supported_formats[]shipped under aminorchangeset. This is a stable, non-experimental 3.1 wire surface:capability_idgoes optional→required, a new requiredoperationsfield is added, andminItems: 1is imposed. Per the repo's mandatory changeset-scope rule, an optional↔required flip on a published field is a breaking wire change that requires amajorchangeset, notminor. Ship this undermajor(and note that as a Breaking-class change, ratification is a human act — it is never auto-approved).
The rest of the migration (deprecating named format_id/format_ids, adding canonical format_kind/format_option_ref/target_capability_id selectors and the capability_id+operations catalog) is clean, additive Normative work with coherent docs↔schema. New oneOf/anyOf additions are constraint-style discriminators, not undiscriminated unions — no oneOf regression.
Row 1 of the decision table (a high finding present) governs: outcome is request-changes. Note also that gated paths are touched with review_decision: REVIEW_REQUIRED, and this is a Breaking-class change — both independently require human/CODEOWNERS review before merge.
Blocking findings
- static/schemas/source/protocol/get-adcp-capabilities-response.json:1292 — Breaking optional→required flip on get_adcp_capabilities.supported_formats shipped under a minor changeset; requires major
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated protocol schema paths touched and required review not satisfied.
This PR modifies dozens of files under static/schemas/source/**, which are under a hard, deterministic approval gate (gated_paths: true). The current review_decision is CHANGES_REQUESTED, not APPROVED, so the gate is NOT satisfied. Per decision rule row 2, the outcome must be escalate (there are no blocking findings this run to make it request-changes).
The current run surfaces no new findings: the delta since the prior pass is docs-only (five editorial og:title frontmatter additions plus three example edits), all of which correctly align with the head schema shapes — no spec drift. The prior high finding (breaking optional→required flip on get_adcp_capabilities.supported_formats under a minor changeset) is on a schema file absent from this delta and was skipped per subsequent-pass scope rules; it does not carry forward as a fresh blocker.
Escalation reasons:
- Touches gated protocol source under
static/schemas/source/**(e.g.get-adcp-capabilities-response.json,product.json,creative-manifest.json, and many more) whilereview_decisionisCHANGES_REQUESTED. A human / CODEOWNERS approval is required before this can merge.
No new critical/high/medium findings were reported in this run.
Why human review
- Modifies gated protocol schema files under static/schemas/source/** (get-adcp-capabilities-response.json, product.json, creative-manifest.json, and ~35 others) while review_decision is CHANGES_REQUESTED — the hard approval gate is not satisfied; human/CODEOWNERS review required.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/brand/acquire-rights-request.json (modified) matches
static/schemas/source/**; static/schemas/source/content-standards/artifact.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-id.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/offering-asset-group.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/placement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/registry-event.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/requirements/offering-asset-constraint.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/transformer.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/vendor-pricing-option.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-delivery-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-features-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/list-creative-formats-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/list-creative-formats-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/list-cre
…(truncated)…
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated protocol schema files touched while review is not APPROVED.
This PR modifies ~40 files under static/schemas/source/**, a hard, deterministic approval gate (gated_paths: true). The current GitHub review_decision is CHANGES_REQUESTED, not APPROVED, so the gate is not satisfied. Per decision-table row 2, the outcome must be escalate — Ladon cannot auto-approve gated schema paths until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
The reviewer surfaced no critical/high/medium findings. The delta since the prior pass is a single hunk in media-buy/build-creative-request.json converting an undiscriminated oneOf to anyOf; exactly-one semantics are preserved via three sibling allOf not guards while anyOf enforces at-least-one. This is a clean, semantics-preserving refactor and correctly disjoint through the not.anyOf mechanism the oneOf walker does not track — a known walker limitation, not a defect (LADON.md declines to report it). No wire-shape change.
The diff is mechanically clean, but the hard schema-path gate still requires human/CODEOWNERS review before merge.
Escalation reasons
- Modifies gated protocol schema files under
static/schemas/source/**(get-adcp-capabilities-response.json, product.json, creative-manifest.json, build-creative-request.json, and ~35 others) whilereview_decisionisCHANGES_REQUESTED. The hard approval gate is not satisfied; human/CODEOWNERS review required.
Why human review
- Modifies gated protocol schema files under static/schemas/source/** (get-adcp-capabilities-response.json, product.json, creative-manifest.json, build-creative-request.json, and ~35 others) while review_decision is CHANGES_REQUESTED — the hard approval gate is not satisfied; human/CODEOWNERS review required before merge.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/brand/acquire-rights-request.json (modified) matches
static/schemas/source/**; static/schemas/source/content-standards/artifact.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-id.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/offering-asset-group.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/placement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/registry-event.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/requirements/offering-asset-constraint.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/transformer.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/vendor-pricing-option.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-delivery-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-features-request.json (modified) matchesstatic/schemas/source/**; static/schemas/sourc
…(truncated)…
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated protocol schema files modified while review is CHANGES_REQUESTED.
This PR modifies ~44 files under static/schemas/source/**, which are under a hard, deterministic approval gate (gated_paths: true). The current review_decision is CHANGES_REQUESTED, not APPROVED, so decision-table row 2 fires: the gate is not satisfied and Ladon cannot auto-approve regardless of how clean the diff is.
The reviewer reports a clean delta with no critical, high, or medium findings — the additive age-determination-basis surface is schema↔docs coherent and test-covered, the get-adcp-capabilities-response.json required-loosening is a backward-compatible change within the unreleased 3.2 minor and mirrored in code + tests, changesets are correct (minor for the new surface, patch for $id/$ref canonicalization), the new secretariat-queues.ts code has proper timeouts and a verified no-double-count merge, and the billing path is fail-closed. No blocking findings.
Escalation reason: Human/CODEOWNERS review is required on the gated static/schemas/source/** protocol schema files before merge. Once a human/CODEOWNERS approval is recorded (review_decision: APPROVED), this PR — being clean with no findings — can fall through to approve.
Why human review
- Modifies gated protocol schema files under static/schemas/source/** (get-adcp-capabilities-response.json, product.json, creative-manifest.json, build-creative-request.json, and ~40 others) while review_decision is CHANGES_REQUESTED — the hard approval gate is not satisfied; human/CODEOWNERS review required before merge.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/brand/acquire-rights-request.json (modified) matches
static/schemas/source/**; static/schemas/source/compliance/comply-test-controller-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/content-standards/artifact.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-id.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/mcp-webhook-payload.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/offering-asset-group.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/placement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/registry-event.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/requirements/offering-asset-constraint.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/transformer.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/vendor-pricing-option.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-delivery-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-features-request.json (modified) matches `static
…(truncated)…
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — hard approval gate not satisfied.
This PR modifies ~45 gated protocol schema files under static/schemas/source/** (e.g. get-adcp-capabilities-response.json, core/product.json, core/creative-manifest.json, media-buy/build-creative-request.json, and others). gated_paths is true and the current review_decision is CHANGES_REQUESTED, not APPROVED. Per the hard approval gate (decision rule row 2), this cannot auto-approve until a human/CODEOWNERS approval is recorded.
The reviewer's current pass is clean — the only delta since the prior escalate is a single line in static/openapi/registry.yaml removing capability_id from a required list on a not-yet-released field the PR itself introduced. This is outside static/schemas/source/** and dist/**, loosens no released wire contract, and creates no schema↔docs drift. No critical/high/medium findings.
Escalation reason: static/schemas/source/** files are under a hard, non-overridable approval gate and the GitHub review decision is CHANGES_REQUESTED. A human/CODEOWNERS approval is required before merge, regardless of how clean the diff is.
Why human review
- Modifies ~45 gated protocol schema files under static/schemas/source/** (e.g. get-adcp-capabilities-response.json, core/product.json, core/creative-manifest.json, media-buy/build-creative-request.json) while review_decision is CHANGES_REQUESTED — the hard approval gate is not satisfied; human/CODEOWNERS review required before merge.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/brand/acquire-rights-request.json (modified) matches
static/schemas/source/**; static/schemas/source/compliance/comply-test-controller-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/content-standards/artifact.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-id.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/mcp-webhook-payload.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/offering-asset-group.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/placement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/registry-event.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/requirements/offering-asset-constraint.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/transformer.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/vendor-pricing-option.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-delivery-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-features-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/list-creative-formats-request.json (modified) matches `stat
…(truncated)…
|
@andybevan-scope3 All CI checks are green, and Ladon reports no remaining substantive findings. The original compatibility blocker is resolved: |
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated schema paths under a hard approval gate not yet satisfied, plus two open medium schema-coherence gaps.
This PR modifies ~45 gated protocol schema files under static/schemas/source/**, which sit behind a hard, deterministic approval gate. review_decision is CHANGES_REQUESTED, not APPROVED, so the gate is not satisfied (decision-table row 2). Human/CODEOWNERS approval is required before this can merge, regardless of how clean the diff is.
The prior decision was also escalate. Two new medium findings are present in this run (sticky escalation, row 6, still supported by fresh evidence).
Medium findings
- server/src/training-agent/task-handlers.ts:5794 — get_media_buys/update responses emit
formats_to_provide, undocumented by the response schema (schema↔docs/response-shape coherence gap). - server/src/training-agent/task-handlers.ts:5665 — create_media_buy response emits
formats_pending, undocumented by package.json.
The packageReadinessFields helper emits both readiness fields on every media-buy response, but each governing schema documents only one of the pair — reconcile the helper output with the schemas (or document both fields) before merge.
Escalation reasons
- Modifies gated
static/schemas/source/**protocol schema files whilereview_decisionisCHANGES_REQUESTED— hard approval gate not satisfied; human/CODEOWNERS review required.
Medium findings
- server/src/training-agent/task-handlers.ts:5794 — get_media_buys/update responses emit formats_to_provide undocumented by the response schema
- server/src/training-agent/task-handlers.ts:5665 — create_media_buy response emits formats_pending undocumented by package.json
Why human review
- Modifies ~45 gated protocol schema files under static/schemas/source/** (e.g. get-adcp-capabilities-response.json, core/product.json, core/creative-manifest.json, media-buy/build-creative-request.json) while review_decision is CHANGES_REQUESTED — the hard approval gate is not satisfied; human/CODEOWNERS review required before merge.
- Two open medium schema-coherence gaps: media-buy responses emit formats_to_provide/formats_pending readiness fields that the governing response schemas do not document (task-handlers.ts:5794 and :5665).
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/brand/acquire-rights-request.json (modified) matches
static/schemas/source/**; static/schemas/source/compliance/comply-test-controller-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/content-standards/artifact.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-id.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/mcp-webhook-payload.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/offering-asset-group.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/placement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (m
…(truncated)…
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — hard approval gate on gated protocol schema paths is not satisfied.
This PR modifies ~45 gated protocol schema files under static/schemas/source/** while review_decision is CHANGES_REQUESTED (not APPROVED). Per decision rule row 2 (gated_paths: true AND review_decision ≠ APPROVED), this is a hard, non-overridable gate: Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is. Two current medium findings also persist, providing fresh evidence to sustain the prior escalation (row 6).
Medium findings:
server/src/training-agent/task-handlers.ts:5573— create_media_buy response emitsformats_pendingundocumented by package.json (schema↔wire coherence gap on the non-compat surface).server/src/training-agent/task-handlers.ts:5796— get_media_buys response emitsformats_to_provideundocumented by the response schema.
Note: the delta itself is a well-tested 3.0 storyboard compatibility shim with correct behavior and new unit tests. The two prior mediums (previously at :5794 / :5665) are addressed only for the compat surface; the underlying schema-coherence gap persists on the non-compat path and remains medium, not blocking. No critical/high findings.
Escalation reasons:
- Modifies gated protocol schema files under
static/schemas/source/**while the GitHub review decision isCHANGES_REQUESTED— human/CODEOWNERS approval required before merge.
Medium findings
- server/src/training-agent/task-handlers.ts:5573 — create_media_buy response emits formats_pending undocumented by package.json
- server/src/training-agent/task-handlers.ts:5796 — get_media_buys response emits formats_to_provide undocumented by response schema
Why human review
- Modifies ~45 gated protocol schema files under static/schemas/source/** (e.g. get-adcp-capabilities-response.json, core/product.json, core/creative-manifest.json, media-buy/build-creative-request.json) while review_decision is CHANGES_REQUESTED — the hard approval gate is not satisfied; human/CODEOWNERS review required before merge.
- Two open medium schema-coherence gaps persist on the non-compat surface: create_media_buy emits formats_pending (task-handlers.ts:5573) and get_media_buys emits formats_to_provide (task-handlers.ts:5796), neither documented by the governing response schemas — fresh evidence sustaining the prior escalation.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/brand/acquire-rights-request.json (modified) matches
static/schemas/source/**; static/schemas/source/compliance/comply-test-controller-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/content-standards/artifact.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-id.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/mcp-webhook-payload.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/offering-asset-group.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/placement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; s
…(truncated)…
# Conflicts: # docs/creative/canonical-formats.mdx
|
@andybevan-scope3 @patmmccann Final review update: Ladon’s two medium schema/wire coherence findings are now fixed on head |
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated protocol-schema files touched while review is CHANGES_REQUESTED.
This PR modifies ~45 gated protocol schema files under static/schemas/source/** (e.g. core/product-format-declaration.json, core/product.json, media-buy/build-creative-request.json, protocol/get-adcp-capabilities-response.json). gated_paths: true and review_decision: CHANGES_REQUESTED (not APPROVED), so the hard, non-overridable approval gate is not satisfied (decision table row 2). Human/CODEOWNERS approval must be recorded before merge.
Iteration credit: both prior Medium schema-coherence findings are resolved — package.json now declares formats_pending and get-media-buys-response.json now declares formats_to_provide, closing the schema↔wire gaps flagged in the prior escalate pass. This run adds sample_render_url to product-format-declaration.json with matching openapi/registry/UI plumbing (https-only, credential-stripped, noopener/no-referrer, XSS-safe, focus-trapped dialog), matching docs, and a minor changeset. No new blocking or Medium findings.
The escalation is driven solely by the unsatisfied hard approval gate, not by any outstanding code defect. Once a human/CODEOWNERS approval flips review_decision to APPROVED, the clean diff falls through to approve.
Escalation reasons
- Gated paths modified while
review_decisionis CHANGES_REQUESTED — human/CODEOWNERS review required (row 2).
Why human review
- Modifies ~45 gated protocol schema files under static/schemas/source/** (e.g. core/product-format-declaration.json, core/product.json, media-buy/build-creative-request.json, protocol/get-adcp-capabilities-response.json) while review_decision is CHANGES_REQUESTED — the hard, non-overridable approval gate (gated_paths) is not satisfied; a human/CODEOWNERS approval must be recorded before merge.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/brand/acquire-rights-request.json (modified) matches
static/schemas/source/**; static/schemas/source/compliance/comply-test-controller-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/content-standards/artifact.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-id.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/mcp-webhook-payload.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/offering-asset-group.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/placement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/registry-event.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/requirements/offering-asset-constraint.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/transformer.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/vendor-pricing-option.json (modified) mat
…(truncated)…
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated protocol schema files under a hard approval gate, review not yet APPROVED.
This PR modifies ~45 gated protocol schema files under static/schemas/source/** (gated_paths: true) while review_decision is CHANGES_REQUESTED. Per decision-table row 2, the hard, non-overridable approval gate is not satisfied unless a human/CODEOWNERS approval is recorded. Ladon cannot auto-approve until review_decision becomes APPROVED, regardless of how clean the diff is.
Escalation reasons
- Touches ~45 files under the hard-gated path
static/schemas/source/**(e.g.core/product.json,core/product-format-declaration.json,media-buy/build-creative-request.json,protocol/get-adcp-capabilities-response.json,enums/error-code.json) withreview_decision: CHANGES_REQUESTED— human/CODEOWNERS approval required before merge.
Notes on the delta
The reviewer reports a clean pass: two new standard error codes (INVALID_PRICING_OPTION, INVALID_USAGE_DATA) added coherently across all three enum blocks, Recovery-prose classification matching enumMetadata, lint-valid drift dispositions (held-for-next-minor, target 3.2), corrected error.json example, and phantom DUPLICATE_REQUEST row removed. No critical/high/medium findings. However, adding new error codes to the published protocol surface is a normative wire change — the gated-path/human-ratification requirement stands. This sticks the prior escalate because the deterministic gate remains unsatisfied on this head.
Why human review
- Modifies ~45 gated protocol schema files under static/schemas/source/** (gated_paths: true) while review_decision is CHANGES_REQUESTED — the hard, non-overridable approval gate is not satisfied. A human/CODEOWNERS approval must be recorded before merge (decision-table row 2).
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/brand/acquire-rights-request.json (modified) matches
static/schemas/source/**; static/schemas/source/compliance/comply-test-controller-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/content-standards/artifact.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-id.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/mcp-webhook-payload.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/offering-asset-group.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/placement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/registry-event.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/requirements/offering-asset-constraint.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/transformer.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/vendor-pricing-option.json (modified) matchesstatic/schemas/source/**; static/schema
…(truncated)…
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated protocol schema files touched while review is not APPROVED.
This PR modifies ~45 gated protocol schema files under static/schemas/source/** (gated_paths: true), and the current review_decision is CHANGES_REQUESTED, not APPROVED. Decision-table row 2 fires: the hard, non-overridable approval gate is not satisfied, so the outcome must be escalate regardless of how clean the diff is.
The reviewer reports no critical/high/medium findings. The delta since the prior pass is a single infra change to scripts/check-owned-links.js (a resolvesToLocalDocsSource() short-circuit to avoid a CI race), which is clean with no protocol-surface, schema, or changeset impact. This is a net-neutral change with no fresh actionable findings.
The prior decision was also escalate for the same gated-paths reason. Because no findings block on their own merits, the escalation persists solely due to the unsatisfied hard approval gate (row 2), not sticky escalation (row 6 does not apply — no fresh critical/high/medium findings).
Escalation reasons
- Modifies ~45 gated schema files under
static/schemas/source/**whilereview_decisionisCHANGES_REQUESTED. A human/CODEOWNERSAPPROVEDreview must be recorded before merge.
Why human review
- Modifies ~45 gated protocol schema files under static/schemas/source/** (gated_paths: true) while review_decision is CHANGES_REQUESTED — the hard, non-overridable approval gate is not satisfied. A human/CODEOWNERS APPROVED review must be recorded before merge (decision-table row 2).
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/brand/acquire-rights-request.json (modified) matches
static/schemas/source/**; static/schemas/source/compliance/comply-test-controller-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/content-standards/artifact.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-id.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/mcp-webhook-payload.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/offering-asset-group.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/placement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/registry-event.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/requirements/offering-asset-constraint.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/transformer.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/vendor-pricing-option.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-delivery-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-features-request.json (modified) matchesstatic/schemas/source/**; s
…(truncated)…
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated protocol schema files touched under a hard approval gate not yet satisfied.
This PR modifies ~45 gated protocol schema files under static/schemas/source/** (gated_paths: true), and the current GitHub review_decision is CHANGES_REQUESTED, not APPROVED. Per decision-table row 2, the hard, non-overridable approval gate is not satisfied, so this cannot auto-approve.
The reviewer surfaced no critical/high/medium findings — the delta since the prior review is a single benign config change (one ignorePatterns entry added to .markdown-link-check.json, correctly anchored/escaped). The diff is clean, but a clean diff does not lift the gate: a human/CODEOWNERS APPROVED review must be recorded before merge.
Escalation reasons
- Modifies gated protocol schema files under
static/schemas/source/**whilereview_decisionisCHANGES_REQUESTED— hard approval gate (decision-table row 2) requires a human/CODEOWNERSAPPROVEDreview before merge.
Why human review
- Modifies ~45 gated protocol schema files under static/schemas/source/** (gated_paths: true) while review_decision is CHANGES_REQUESTED — the hard, non-overridable approval gate is not satisfied. A human/CODEOWNERS APPROVED review must be recorded before merge (decision-table row 2).
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/brand/acquire-rights-request.json (modified) matches
static/schemas/source/**; static/schemas/source/compliance/comply-test-controller-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/content-standards/artifact.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-id.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/mcp-webhook-payload.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/offering-asset-group.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/placement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/registry-event.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/requirements/offering-asset-constraint.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/transformer.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/vendor-pricing-option.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-delivery-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-features-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/list-creative-formats-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/list-creative-formats-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/list-creatives
…(truncated)…
|
@andybevan-scope3 @patmmccann Final status: all 32 checks are green on |
# Conflicts: # docs/creative/canonical-formats-migration.mdx # docs/creative/implementing-creative-agents.mdx # docs/creative/specification.mdx # docs/creative/task-reference/list_creative_formats.mdx # docs/creative/task-reference/list_creatives.mdx # static/compliance/source/protocols/creative/index.yaml # static/compliance/source/protocols/creative/scenarios/native_in_feed.yaml # static/compliance/source/protocols/media-buy/index.yaml # static/compliance/source/protocols/media-buy/scenarios/creative_reception.yaml # static/compliance/source/specialisms/creative-ad-server/index.yaml # static/compliance/source/specialisms/creative-generative/generative-seller.yaml # static/compliance/source/specialisms/creative-generative/index.yaml # static/compliance/source/specialisms/creative-template/index.yaml # static/compliance/source/specialisms/sales-broadcast-tv/index.yaml # static/compliance/source/specialisms/sales-catalog-driven/index.yaml # static/compliance/source/specialisms/sales-proposal-mode/index.yaml # static/compliance/source/universal/schema-validation.yaml
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — hard gated-paths approval gate is not satisfied.
This PR modifies ~45 gated protocol schema files under static/schemas/source/** (gated_paths: true), and the current GitHub review_decision is CHANGES_REQUESTED, not APPROVED. Under decision-table row 2, this is a hard, non-overridable approval gate: Ladon cannot auto-approve until a human/CODEOWNERS APPROVED review is recorded, regardless of how clean the diff is.
The reviewer found no critical/high/medium findings — the wholesale-feed token scope-keying by cache_scope holds isolation correctly, updated unit assertions and two capability-gated storyboards cover it, the new unchanged descriptions on get-products/get-signals are additive normative clarifications with a minor changeset, the creative-format deprecation carries its own changeset, no dist/** edits, no new undiscriminated oneOf, changesets present. This is a clean diff on the merits.
The prior decision was also escalate for the same gated-paths reason. Because the gate is purely path/review-status based (not evidence-dependent) and review_decision remains CHANGES_REQUESTED, the escalation stands. It lifts automatically once an APPROVED review is recorded.
Escalation reasons
- Modifies gated protocol schema files under
static/schemas/source/**whilereview_decisionisCHANGES_REQUESTED— human/CODEOWNERS APPROVED review required before merge (decision-table row 2).
Why human review
- Modifies ~45 gated protocol schema files under static/schemas/source/** (gated_paths: true) while review_decision is CHANGES_REQUESTED — the hard, non-overridable approval gate is not satisfied. A human/CODEOWNERS APPROVED review must be recorded before merge (decision-table row 2).
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/brand/acquire-rights-request.json (modified) matches
static/schemas/source/**; static/schemas/source/compliance/comply-test-controller-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/content-standards/artifact.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-id.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/mcp-webhook-payload.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/offering-asset-group.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/package.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/placement.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-filters.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/registry-event.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/requirements/offering-asset-constraint.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/transformer.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/vendor-pricing-option.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-delivery-response.j
…(truncated)…
Closes #6094.
This makes canonical format declarations the AdCP 3.2 source of truth across publisher catalogs, product options, portable manifests, creative capabilities, schemas, training agents, compliance scenarios, skills, examples, and documentation while retaining explicit 3.x compatibility surfaces.
Creative production discovery now uses
get_adcp_capabilities.creative.supported_formats[]and registry reverse lookup; publisher lookup adds provenance-aware placement resolution, and catalog change events atomically report format and placement revisions.It also adds canonical capability validation and persistence, registry indexing and migration support, classification vectors, and community-catalog precedence guidance.
Validation passed through the complete commit and push hooks: 1,030 root tests, 4,744 server tests (30 skipped), current and 3.0 storyboard matrices, schema/compliance linting, TypeScript, image checks, and Mintlify broken-link validation.