Measured against an oracle, not a feature list.
Every fixture renders through the CPU backend and is diffed against LibreOffice. Page counts, collision gates, and geometry are CI-enforced; regressions fail the build.
Page counts are this engine's output against a LibreOffice oracle on the
five-document review corpus (tools/opendoc-fidelity); the documents
themselves are not redistributable, so only the measurements are published.
Numbers move with every fidelity PR. They are evidence, not a Word-grade claim.
Support by construct family
The oracle numbers above summarize whole documents; this is the granular breakdown behind them. Support is tracked per DOCX construct family across four stages — modeled, rendered, editable, and round-trips on export. A construct can be fully modeled and round-tripped while still not being editable or fully painted yet, and this table never claims support a stage does not actually have.
How to read a cell
- Full — implemented and exercised by tests.
- Partial — common cases work; documented gaps remain.
- Placeholder — a visible stand-in, not the real content (e.g. undecodable images, EMF/WMF, math,
w:altChunk). - Preserved, not rendered — kept losslessly for export (the retention floor) but not painted.
- Not yet — not implemented.
| Construct family | Modeled | Rendered | Editable | Round-trips |
|---|
Notes, placeholders, and explicit non-support
- Editing is a developer test harness, not a product. The Editable column reflects what the current in-browser editor can actually change today, not a supported product surface.
- Every editable surface takes every editing operation. Body, header, footer, footnote/endnote body, text box, and a box inside a shape group each accept typing, selection, character and paragraph formatting, cut/copy/paste, find and replace, comments, and tracked changes. This is pinned by an operation × surface matrix in CI, not by sampling.
- Not authorable yet: shape rotation and flip (they render and round-trip, but there is no handle or control to set them), custom shape geometry, replacing an existing picture's bytes in place, text-box body properties (internal margins, vertical anchor, autofit), inserting or splitting a section, and creating or updating a named style.
- Math (OMML) is fully typed and round-trips; the common constructs typeset inline. Box/border-box rules and full Word-parity math typesetting are partial, and math is not editable — there is no equation editor.
- Charts and SmartArt are modeled as first-class references and preserved byte-for-byte on export, but are not painted as live charts/diagrams — an embedded preview image shows if the file provides one, otherwise a text placeholder (⊟).
- Non-PNG/JPEG images (EMF/WMF, SVG on the browser build), undecodable images, and
w:altChunkpaint a visible placeholder that reserves layout space, so nothing silently vanishes (▢). - Color fonts and color emoji are not supported. Emoji render, but through a monochrome face — the CPU rasterizer paints glyph outlines and has no color glyph-table (COLR/CBDT/sbix) path.
- No PDF export. The design is written (docs/98, ADR-031) but not implemented; printing goes through the browser from engine-rendered pages.
- Text wrap around floats reserves shared flow for top-and-bottom and square wrapping, including inside table cells, headers and footers. Tight and through contour wrapping, and page-coupled reflow, remain partial.
.docmmacro-enabled files are rejected at open. Strip-and-open versus explicit non-support is an undecided policy question, not an oversight.- Round-trips means a semantic fixed point (import → export → reopen yields an equal model), not a byte-identical file. Byte-exact preservation applies to the retention/no-edit floor.
- No silent data loss: anything not modeled is preserved verbatim via the retention floor and reported, per the disposition taxonomy.