""" Publish subsystem — promotes a draft experience to a channel. publisher.py publish(experience, channel) → Publication Publishing flow: 1. Run QA. Refuse to publish if verdict == 'fail'. 2. Build packaged experience (manifest + digest). 3. Compare digest against the most recent publication on the same channel — if identical, return the existing record (idempotent re-publish). 4. Insert ix_publications row with the new manifest + version bumped from the previous one. 5. Update ix_experiences.status = 'published'. Channels supported in v1: 'web_embed', 'studio_preview', 'export'. The channel string lives on the publication row so future channels need no schema change. """ from .publisher import PublishResult, publish __all__ = ["PublishResult", "publish"]