docs(creative): creatives outlast campaigns + signal state changes (#2260)#4628
Merged
Conversation
…2260) Replace the 3.0 "retention seller-defined" hedge with a normative rule: library creatives MUST persist independently of the buys that reference them, regardless of submission path (sync_creatives, inline, or platform-native). Sellers MAY archive unassigned creatives for inactivity, post-flight expiry, or storage policy, but MUST signal any state change on a buyer-synced creative — via impairment on the buy when live assignments exist, via a creative state-change notification otherwise (#2261 owns transport). Widen the creative-status archived enumDescription to acknowledge seller-initiated archive and require the state-change signal. Additive description-only change; no new enum values, no new fields. Frame a library creative as the bundle of buyer-supplied inputs (assets, brief, brand+catalog pointers, or any combination), sidestepping the generative/non-generative fuzziness. Variant addressability is a format-level concern handled by #3305/#3307. Closes #2260. Refs #2261, #3305, #3307. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two blockers from protocol review: 1. Replace "MUST emit via buyer's registered notification channel" with the surface that exists today — list_creatives must reflect the new status on the next read. Aligns with the snapshot-and-log contract, which already names list_creatives as the conformant signal for resource state changes outside an active buy. #2261 owns the future push channel; promoted to SHOULD-additionally once it ships. 2. Add approved → archived (seller-initiated) edge to the creative state machine, scoped to creatives without active package assignments. Sellers MUST NOT seller-archive a creative with active assignments — the approved → rejected revocation path with an impairment is the only conformant route when active serving is involved. Friction note from product review: add explicit "library can be a thin view over per-buy storage" line for CTV/podcast vendors whose ad server has no library object distinct from per-buy attachment. Docs nits: tighten archived enumDescription wording; constrain seller-archive to no-active-assignments; update changeset to reflect the state-machine edit. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Resolves #2260 — the 3.0 spec punted on creative retention with "Retention of unassigned creatives is seller-defined." Platform research (Meta, Google Ads, GAM, DV360, FreeWheel, TTD, Spotify, TikTok, Reddit, Amazon DSP) showed no industry consensus on a numeric floor — GAM is indefinite by policy, Meta ~37mo, FreeWheel 25mo, most others publish nothing. The dominant pattern is "archive, never hard-delete," and the buyer-side guarantee that actually matters is observability of state changes, not a fixed retention number.
This PR drops the hedge and replaces it with two normative rules:
sync_creatives, inline oncreate_media_buy, or platform-native upload.approved→rejected, the seller MUST signal it — viaimpairmentif there's a live buy, via a creative state-change notification otherwise. Transport mechanics are owned by Creative lifecycle webhooks: formalize state-change notifications outside media buy lifecycle #2261.A library creative is the bundle of buyer-supplied inputs (uploaded assets, a brief, brand+catalog pointers, or any combination). This sidesteps the generative/non-generative fuzziness — retention applies to the bundle. Whether a format's rendered outputs are individually addressable (PMax-style fan-out vs. addressable variants) is a format-level concern, handled by RFC #3305 / #3307.
What's intentionally not here
creative.expiredevent type. That's Creative lifecycle webhooks: formalize state-change notifications outside media buy lifecycle #2261's job. We say "MUST signal" and let the webhook foundation work define transport.sync_creatives(already established atcreative-libraries.mdx:252).archivedenumDescription. Fully additive.Files
docs/creative/creative-libraries.mdx— new "Creatives outlast campaigns" subsection, replacing the seller-defined hedge at line 35.static/schemas/source/enums/creative-status.json— widenedarchivedenumDescription to acknowledge seller-initiated archive and require the state-change signal..changeset/2260-creative-retention-outlasts-campaigns.md— minor bump.Cross-refs
Test plan
#health-and-dependency-impairmentcross-link resolve🤖 Generated with Claude Code