Why
Spun off from #2651, which assumed sales platforms have no preview surface and proposed a new dry_run_substitution capability. That premise doesn't hold — Meta DPA, TikTok, Snap, Amazon Ads, and Walmart Connect all expose preview APIs that exercise catalog-item macro substitution (Meta's creative_preview, etc.). The right move is to require the existing preview_creative capability, not invent a new one.
What
Extend sales-social required_tools (static/compliance/source/specialisms/sales-social/index.yaml:8-12) to include preview_creative, with the obligation that preview output exercises catalog-item macro substitution when a catalog binding is provided.
Hook the existing substitution-observer-runner (modes html_inline and url_fetch) to the preview_creative response — same contract creative-generative already uses post-#2649.
Scope
sales-social only. sales-retail-media is not yet in the specialism enum; same requirement gets added when that specialism lands.
- No new capability or schema. Reuses
preview_creative and the existing observer runner.
Known coverage limitation
Preview-time substitution may diverge from serve-time substitution on platforms where the two execute different code paths. This is the same gap creative-generative carries today and should be documented in the storyboard rather than gated on a new attestation mechanism. Real-impression introspection is out of scope for 3.1.0 — file a follow-up if a platform demonstrates serve-time divergence in production.
Acceptance
Related
Why
Spun off from #2651, which assumed sales platforms have no preview surface and proposed a new
dry_run_substitutioncapability. That premise doesn't hold — Meta DPA, TikTok, Snap, Amazon Ads, and Walmart Connect all expose preview APIs that exercise catalog-item macro substitution (Meta'screative_preview, etc.). The right move is to require the existingpreview_creativecapability, not invent a new one.What
Extend
sales-socialrequired_tools(static/compliance/source/specialisms/sales-social/index.yaml:8-12) to includepreview_creative, with the obligation that preview output exercises catalog-item macro substitution when a catalog binding is provided.Hook the existing
substitution-observer-runner(modeshtml_inlineandurl_fetch) to thepreview_creativeresponse — same contract creative-generative already uses post-#2649.Scope
sales-socialonly.sales-retail-mediais not yet in the specialism enum; same requirement gets added when that specialism lands.preview_creativeand the existing observer runner.Known coverage limitation
Preview-time substitution may diverge from serve-time substitution on platforms where the two execute different code paths. This is the same gap creative-generative carries today and should be documented in the storyboard rather than gated on a new attestation mechanism. Real-impression introspection is out of scope for 3.1.0 — file a follow-up if a platform demonstrates serve-time divergence in production.
Acceptance
preview_creativeadded tosales-socialrequired_toolspreview_creativewith a catalog-bound DPA template and runs the substitution-observer assertions (expect_substitution_safe)Related