feat(creative): add creative revision identity - #6781
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 the protocol source of truth (static/schemas/source/**), which is under a hard, deterministic approval gate (gated_paths: true). The current review_decision is REVIEW_REQUIRED, not APPROVED, so decision-table row 2 fires: the gate is not satisfied and the PR cannot be auto-approved.
No critical/high findings were reported. The reviewer surfaced two medium findings and two low findings — none blocking on their own — but the deterministic gate takes precedence.
Medium findings (non-blocking, for human reviewer awareness):
- static/schemas/source/core/creative-variant.json:26 — variant_id uniqueness scope tightened (per-creative → per-agent) on a minor changeset
- static/schemas/source/creative/sync-creatives-request.json:150 — New creatives[] per-batch uniqueness constraint not reflected in docs
Escalation reasons:
- Gated paths touched (14 files under
static/schemas/source/**, including additions creative-revision-id.json and creative-revision-content-mismatch.json plus modifications to creative-variant.json, error-code.json, index.json, and several creative task schemas) andreview_decisionisREVIEW_REQUIRED. Human/CODEOWNERS approval is required before merge.
Human reviewers should confirm the two coherence points above (variant_id scope semantics and the undocumented per-batch creative_id uniqueness constraint) as part of that review.
Medium findings
- static/schemas/source/core/creative-variant.json:26 — variant_id uniqueness scope tightened (per-creative -> per-agent) on a minor changeset
- static/schemas/source/creative/sync-creatives-request.json:150 — New creatives[] uniqueness constraint not reflected in docs
Why human review
- Gated paths: 14 files under static/schemas/source/** are modified/added while review_decision is REVIEW_REQUIRED (not APPROVED) — human/CODEOWNERS approval required before merge.
- Medium coherence gaps for reviewer attention: variant_id uniqueness scope tightened per-creative→per-agent, and a new per-batch creative_id uniqueness constraint is undocumented.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/creative-revision-id.json (added) matches
static/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/x-entity-types.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/creative-status-changed-webhook.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-delivery-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/list-creatives-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/preview-creative-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/preview-creative-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/enums/error-code.json (modified) matchesstatic/schemas/source/**; static/schemas/source/error-details/creative-revision-content-mismatch.json (added) matchesstatic/schemas/source/**; static/schemas/source/index.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.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 hard approval gate not yet satisfied.
This PR modifies/adds 14 files under static/schemas/source/**, which are under a hard, deterministic approval gate (gated_paths: true). The current review_decision is unknown/not APPROVED, so per decision-table row 2 the outcome must be escalate — Ladon cannot auto-approve gated protocol-schema changes until a human/CODEOWNERS approval is recorded.
The delta itself is clean: the developer walked back both prior medium findings. variant_id uniqueness is no longer tightened (default stays unique-within-agent-and-creative; agent-unique/immutable only applies when an agent advertises creative.supports_revisions), applied coherently across creative-variant.json, get-creative-delivery-response.json, preview-creative-request/response.json and the corresponding docs, with tests updated. sync_creatives.mdx now documents the creatives[] unique creative_id constraint. Schema↔docs coherence holds. No new findings in this run.
Because both prior mediums are resolved and no fresh actionable findings exist, sticky escalation (row 6) does not apply on its own — but the gated-paths gate (row 2) still stands and requires human review.
Escalation reasons
- 14 files under
static/schemas/source/**are modified/added whilereview_decisionis notAPPROVED— human/CODEOWNERS approval required before merge.
Why human review
- Gated paths: 14 files under static/schemas/source/** are modified/added while review_decision is not APPROVED — human/CODEOWNERS approval required before merge (decision-table row 2). Affected files include static/schemas/source/core/creative-revision-id.json (added), static/schemas/source/core/creative-variant.json (modified), static/schemas/source/enums/error-code.json (modified), static/schemas/source/creative/sync-creatives-request.json (modified) and others.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/creative-revision-id.json (added) matches
static/schemas/source/**; static/schemas/source/core/creative-variant.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/x-entity-types.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/creative-status-changed-webhook.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/get-creative-delivery-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/list-creatives-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/preview-creative-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/preview-creative-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-request.json (modified) matchesstatic/schemas/source/**; static/schemas/source/creative/sync-creatives-response.json (modified) matchesstatic/schemas/source/**; static/schemas/source/enums/error-code.json (modified) matchesstatic/schemas/source/**; static/schemas/source/error-details/creative-revision-content-mismatch.json (added) matchesstatic/schemas/source/**; static/schemas/source/index.json (modified) matchesstatic/schemas/source/**; static/schemas/source/protocol/get-adcp-capabilities-response.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.
Summary
revision_idtosync_creativeswith immutable effective-input semantics and a typed mismatch errorvariant_idan agent-unique immutable execution identity so historical delivery and variant preview remain unambiguousIdentity model
This PR does not add revision history, rollback, or staged serving. Experimental staged activation is tracked separately in #6780.
Verification
npm run test:schemasnpm run test:json-schemanpm run test:docs-navnpm run test:compliance-snippetsnpm run test:error-code-driftnpm run test:oneof-discriminatorsnpm run test:storyboard-context-entitynode --test tests/creative-revisions.test.cjsnode scripts/check-changeset-protocol-scope.cjs origin/mainnpx --yes @changesets/cli@^3.0.0 status --since=origin/mainCloses #6347