Skip to content

feat(creative): add stateful display and coordinated placement formats - #6279

Open
bokelley wants to merge 5 commits into
mainfrom
check-issue-5972-status
Open

feat(creative): add stateful display and coordinated placement formats#6279
bokelley wants to merge 5 commits into
mainfrom
check-issue-5972-status

Conversation

@bokelley

@bokelley bokelley commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add experimental AdCP 3.2 seller_rendered_stateful_display and coordinated_placements canonical formats
  • model seller-rendered web/mobile behavior as an explicit bounded transition graph, including gesture, timer, scroll-threshold, and scroll-linked transitions
  • bind coordinated components to real Product.placements[], keep exclusivity on Product, and validate namespaced/shared assets through validate, sync, assignment, inline create/update, and readiness flows
  • preserve legacy custom-shape migration warnings while requiring version projection for 3.1 and older peers
  • add worked examples, documentation, skills guidance, compliance storyboards, runtime tests, and a protocol changeset

This deliberately treats mobile as a delivery context rather than another canonical: seller-rendered units use seller_rendered_stateful_display, buyer code uses html5/MRAID, opaque tags use display_tag, and atomic cross-placement bundles use coordinated_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

  • schema validation suite and oneOf discriminator audit
  • 602 training-agent unit tests, including product-bound coordinated validation and trafficking regressions
  • canonical fixture and premium-display validation suites
  • compliance YAML/schema/path checks and storyboard request/response/check-enum lints
  • TypeScript typecheck
  • error-code drift and docs navigation checks
  • full root and server pre-commit unit suites green (including 5,940 server tests)
  • current-compliance storyboard matrix across all configured tenants
  • AdCP 3.0 compatibility storyboard matrix across all configured tenants

Review

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.

@bokelley
bokelley requested a review from pkras August 8, 2026 07:56
@bokelley
bokelley marked this pull request as ready for review August 8, 2026 07:58
@bokelley bokelley changed the title [codex] Add premium display canonicals for AdCP 3.2 feat(creative): add premium display canonicals for AdCP 3.2 Aug 8, 2026
@bokelley bokelley closed this Aug 8, 2026
@bokelley bokelley reopened this Aug 8, 2026
Comment thread server/src/training-agent/task-handlers.ts Outdated

@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-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.forEach in collectCanonicalFormatAdvisories runs before the Array.isArray guard (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) while review_decision is REVIEW_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) matches static/schemas/source/**; static/schemas/source/core/canonical-format-kind.json (modified) matches static/schemas/source/**; static/schemas/source/core/canvas-constraint.json (added) matches static/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matches static/schemas/source/**; static/schemas/source/core/creative-assets.json (added) matches static/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matches static/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matches static/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matches static/schemas/source/**; static/schemas/source/creative/list-creatives-response.json (modified) matches static/schemas/source/**; static/schemas/source/enums/error-code.json (modified) matches static/schemas/source/**; static/schemas/source/formats/canonical/_base.json (modified) matches static/schemas/source/**; static/schemas/source/formats/canonical/multi_state_display.json (added) matches static/schemas/source/**; static/schemas/source/formats/canonical/page_takeover.json (added) 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 added the ladon/needs-human-review Ladon has escalated this PR for human review. label Aug 8, 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-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) while review_decision is 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) matches static/schemas/source/**; static/schemas/source/core/canonical-format-kind.json (modified) matches static/schemas/source/**; static/schemas/source/core/canvas-constraint.json (added) matches static/schemas/source/**; static/schemas/source/core/creative-asset.json (modified) matches static/schemas/source/**; static/schemas/source/core/creative-assets.json (added) matches static/schemas/source/**; static/schemas/source/core/creative-manifest.json (modified) matches static/schemas/source/**; static/schemas/source/core/format-shape-vocabulary.json (modified) matches static/schemas/source/**; static/schemas/source/core/product-format-declaration.json (modified) matches static/schemas/source/**; static/schemas/source/creative/list-creatives-response.json (modified) matches static/schemas/source/**; static/schemas/source/enums/error-code.json (modified) matches static/schemas/source/**; static/schemas/source/formats/canonical/_base.json (modified) matches static/schemas/source/**; static/schemas/source/formats/canonical/multi_state_display.json (added) matches static/schemas/source/**; static/schemas/source/formats/canonical/page_takeover.json (added) 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.

@bokelley bokelley changed the title feat(creative): add premium display canonicals for AdCP 3.2 feat(creative): add stateful display and coordinated placement formats Aug 12, 2026
@aao-secretariat

Copy link
Copy Markdown
Contributor

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
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.

spec(creative): add multi_state_display and page_takeover canonical formats (premium web display)

1 participant