Context
Surfaced during a v2 canonical-mapping audit of the universalads adapter (scope3data/agentic-adapters#202, PR scope3data/agentic-adapters#203). The adapter's catalog declares a generative-offerings format (which would map to sponsored_placement with item_production_model: seller_pre_rendered_from_brief per #3307 6882b0cf2), and the format is assigned to two products. But the adapter's create_media_buy and sync_creatives runtime do not actually wire the per-item generation path — create_media_buy ignores pkg.offerings, sync_creatives is a single-asset-per-creative loop. The catalog declaration is intended-state; the runtime is media-upload-only.
This is going to bite v2 migration. Adopters will copy v1 catalog declarations forward, claim the new production-source axis (image_source / video_source / item_production_model), and ship — and buyers will discover at sync_creatives time that the per-item rendering doesn't happen. The seller is technically not lying because the spec has no field where they'd be lying.
What the spec already has
_base.json :: status: stable | preview | deprecated (_base.json) — describes the canonical's spec stability, with a stabilization rubric. This is about whether the v2 working group has stabilized the format definition.
since_version / migration_target_version — same axis: spec-evolution, not adopter-runtime.
synthesis_nondeterministic — about per-run output variance, not about whether the runtime fans out at all.
None of these speak to: "this adopter has declared this format/source on this product, but their runtime currently can or can't honor it." That's a different axis — adopter readiness vs canonical maturity.
Proposal
Add an optional runtime_status field on the v2 product-format declaration (not the canonical itself). Values like:
stable — adopter's runtime fully honors the declared format + production source.
preview — runtime supports the basic path; some axes (e.g., per-item fan-out, brief overrides) may be partial.
declared_only — catalog declaration is forward-looking; runtime does not yet implement this path. Buyers SHOULD treat as informational and confirm via validate_input or a sandbox storyboard before purchase.
Defaults to stable. Buyers can filter on it; sandbox compliance storyboards can require stable for cert.
This isn't redundant with status on the canonical: status says "is this canonical itself stable in the spec?"; runtime_status says "does this seller's runtime actually honor what they declared?" Both can vary independently — a stable canonical can have declared_only adopters, and a preview canonical can have stable adopters who built against the preview shape.
Why now
- Migration path matters most. Adopters will declare aspirationally during v2 rollout because the new production-source axis is a strict superset of v1 expressivity. Without
runtime_status, every "I declared seller_pre_rendered_from_brief because that's where I'm headed" silently lies to buyers.
- Compliance storyboards need a way to skip-gate "runtime declared but not wired" gracefully — same pattern as
requires_capability (scope3data/agentic-adapters#151 storyboard fix lineage).
- Cheap to add: optional field, defaults preserve current behavior, no producer breakage.
Alternative considered
Reusing status on the product-format declaration. Rejected: status is on the canonical, not on the per-product instance, and conflating spec-maturity with adopter-runtime confuses two genuinely different signals.
Ref
Context
Surfaced during a v2 canonical-mapping audit of the universalads adapter (scope3data/agentic-adapters#202, PR scope3data/agentic-adapters#203). The adapter's catalog declares a generative-offerings format (which would map to
sponsored_placementwithitem_production_model: seller_pre_rendered_from_briefper #3307 6882b0cf2), and the format is assigned to two products. But the adapter'screate_media_buyandsync_creativesruntime do not actually wire the per-item generation path —create_media_buyignorespkg.offerings,sync_creativesis a single-asset-per-creative loop. The catalog declaration is intended-state; the runtime is media-upload-only.This is going to bite v2 migration. Adopters will copy v1 catalog declarations forward, claim the new production-source axis (
image_source/video_source/item_production_model), and ship — and buyers will discover atsync_creativestime that the per-item rendering doesn't happen. The seller is technically not lying because the spec has no field where they'd be lying.What the spec already has
_base.json :: status: stable | preview | deprecated(_base.json) — describes the canonical's spec stability, with a stabilization rubric. This is about whether the v2 working group has stabilized the format definition.since_version/migration_target_version— same axis: spec-evolution, not adopter-runtime.synthesis_nondeterministic— about per-run output variance, not about whether the runtime fans out at all.None of these speak to: "this adopter has declared this format/source on this product, but their runtime currently can or can't honor it." That's a different axis — adopter readiness vs canonical maturity.
Proposal
Add an optional
runtime_statusfield on the v2 product-format declaration (not the canonical itself). Values like:stable— adopter's runtime fully honors the declared format + production source.preview— runtime supports the basic path; some axes (e.g., per-item fan-out, brief overrides) may be partial.declared_only— catalog declaration is forward-looking; runtime does not yet implement this path. Buyers SHOULD treat as informational and confirm viavalidate_inputor a sandbox storyboard before purchase.Defaults to
stable. Buyers can filter on it; sandbox compliance storyboards can requirestablefor cert.This isn't redundant with
statuson the canonical:statussays "is this canonical itself stable in the spec?";runtime_statussays "does this seller's runtime actually honor what they declared?" Both can vary independently — astablecanonical can havedeclared_onlyadopters, and apreviewcanonical can havestableadopters who built against the preview shape.Why now
runtime_status, every "I declaredseller_pre_rendered_from_briefbecause that's where I'm headed" silently lies to buyers.requires_capability(scope3data/agentic-adapters#151 storyboard fix lineage).Alternative considered
Reusing
statuson the product-format declaration. Rejected:statusis on the canonical, not on the per-product instance, and conflating spec-maturity with adopter-runtime confuses two genuinely different signals.Ref