feat(creative): add stateful display and coordinated placement formats - #6279
feat(creative): add stateful display and coordinated placement formats#6279bokelley wants to merge 5 commits into
Conversation
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated-path change requires human/CODEOWNERS approval.
This PR modifies and adds files under static/schemas/source/**, which is a deterministic hard approval gate (gated_paths: true). The current review_decision is REVIEW_REQUIRED, not APPROVED, so the gate is not satisfied. Per decision-table row 2, the outcome must be escalate.
No critical/high findings were reported. The reviewer confirms schema↔docs coherence holds across canonical-format-kind, product-format-declaration, creative-manifest/asset, _base, and the two docs pages; the minor changeset matches the additive/experimental surface; the new page_takeover oneOf carries a format_kind discriminator; and no dist artifacts were touched. One Medium robustness gap and one Low remain.
Medium findings
- server/src/training-agent/task-handlers.ts:2859 — New
format_options.forEachincollectCanonicalFormatAdvisoriesruns before theArray.isArrayguard (potential runtime error on non-array input in the get_products advisory path).
Escalation reasons
- Touches gated paths under
static/schemas/source/**(multiple modified files plus new canvas-constraint.json, creative-assets.json, multi_state_display.json, page_takeover.json) whilereview_decisionisREVIEW_REQUIRED. Human/CODEOWNERS approval is required before merge.
Medium findings
- server/src/training-agent/task-handlers.ts:2859 — New format_options.forEach in collectCanonicalFormatAdvisories runs before the Array.isArray guard
Why human review
- Touches gated paths under static/schemas/source/** (schema source of truth) while review_decision is REVIEW_REQUIRED — human/CODEOWNERS approval required before merge.
- Medium robustness gap: server/src/training-agent/task-handlers.ts:2859 — format_options.forEach runs before the Array.isArray guard on the get_products advisory path.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/asset-group-vocabulary.json (modified) matches
static/schemas/source/**; static/schemas/source/core/assets/image-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/canonical-format-kind.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/canvas-constraint.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-assets.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/list-creatives-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/enums/error-code.json (modified) matchesstatic/schemas/source/**; static/schemas/source/formats/canonical/_base.json (modified) matchesstatic/schemas/source/**; static/schemas/source/formats/canonical/multi_state_display.json (added) matchesstatic/schemas/source/**; static/schemas/source/formats/canonical/page_takeover.json (added) 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 schema-source paths require human/CODEOWNERS approval.
This PR modifies and adds files under static/schemas/source/**, which are under a hard, non-overridable approval gate (gated_paths: true). The current review_decision is not APPROVED (unknown/none), so decision rule row 2 fires: the gate is not satisfied and Ladon cannot auto-approve regardless of how clean the diff is.
The developer resolved the single prior Medium finding: collectCanonicalFormatAdvisories now guards if (!Array.isArray(product.format_options)) continue; before the FORMAT_SHAPE_PROMOTED forEach (task-handlers.ts:486-487), with the format_ids guard split out, plus a direct regression test seeding a non-array format_options. That is a net improvement — no current blocking or medium findings remain.
The only remaining reason this PR is not approvable is the gated-paths approval gate. Once a human/CODEOWNERS approval is recorded (review_decision: APPROVED), a re-run with no findings would fall through to approve.
Escalation reasons
- Touches gated paths under
static/schemas/source/**(schema source of truth, including added/modified core, enum, and canonical format schemas) whilereview_decisionis not APPROVED — human/CODEOWNERS approval required before merge.
Why human review
- Touches gated paths under static/schemas/source/** (schema source of truth) while review_decision is not APPROVED — human/CODEOWNERS approval required before merge.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/asset-group-vocabulary.json (modified) matches
static/schemas/source/**; static/schemas/source/core/assets/image-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/canonical-format-kind.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/canvas-constraint.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/creative-assets.json (added) matchesstatic/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/list-creatives-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/enums/error-code.json (modified) matchesstatic/schemas/source/**; static/schemas/source/formats/canonical/_base.json (modified) matchesstatic/schemas/source/**; static/schemas/source/formats/canonical/multi_state_display.json (added) matchesstatic/schemas/source/**; static/schemas/source/formats/canonical/page_takeover.json (added) 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.
|
Ladon cannot review this PR until merge conflicts are resolved. |
# Conflicts: # docs/building/verification/compliance-catalog.mdx # docs/building/verification/conformance.mdx # server/src/training-agent/task-handlers.ts
Summary
seller_rendered_stateful_displayandcoordinated_placementscanonical formatsProduct.placements[], keep exclusivity onProduct, and validate namespaced/shared assets through validate, sync, assignment, inline create/update, and readiness flowsThis deliberately treats mobile as a delivery context rather than another canonical: seller-rendered units use
seller_rendered_stateful_display, buyer code useshtml5/MRAID, opaque tags usedisplay_tag, and atomic cross-placement bundles usecoordinated_placements.CTV is separated into #6428. That 3.2 RFC maps IAB Menu/Home to Native and Pause, Screensaver, Overlay, Squeezeback, and In-Scene to NonLinear VAST profiles instead of adding channel-specific canonical kinds.
Closes #5972
Validation
oneOfdiscriminator auditReview
The taxonomy and workflow were reviewed from protocol, product, creative-format, code, and end-to-end workflow perspectives. The resulting model has four buyer-facing profiles but only two new wire canonicals; CTV reuses Native/VAST, and arbitrary mobile playables/multi-object interactions remain HTML5, tags, or typed custom formats until their contracts converge.