Once #801's codec exists, every surface that already converts documents gains EPUB as a peer format. This is the wiring half, deliberately its own issue because a new codec and its integration into the engine and interfaces are separate review and release units.
- Conversion engine (documents.js): register epub as both a source and a target in the composition engine's registry; the pathfinder then derives every epub↔{docx, odt, pdf, markdown, …} pair for free, which is the whole point of the registry + pathfinder over hand-written per-pair converters. epub→pdf rides the same flowable-source → fixed-layout-target lowering docx→pdf already takes.
- CLI (document-cli): epub joins the conversion command's format list in both directions.
- MCP server (document-mcp): the conversion tools accept and emit epub.
- Web UI (documents): the converter surfaces epub alongside the existing formats.
- Housekeeping per CONTRIBUTING's new-package checklist: the root README's package tables and the CLAUDE.md targets, the workspace and release-orchestrator registration, and the
.github/release-republish.json entry plus attestation legs if any alternate publish names are wanted.
Blocked by #801 — nothing here is meaningful until a ContentDocument↔EPUB codec exists to wire.
Once #801's codec exists, every surface that already converts documents gains EPUB as a peer format. This is the wiring half, deliberately its own issue because a new codec and its integration into the engine and interfaces are separate review and release units.
.github/release-republish.jsonentry plus attestation legs if any alternate publish names are wanted.Blocked by #801 — nothing here is meaningful until a
ContentDocument↔EPUB codec exists to wire.