Fidelity ledger
What this covers, before any number below. The round-trip guarantee is scoped to decks written by @shbernal/ts-pptx, which is what these 27 decks are. Decks authored in PowerPoint are a deliberate second tier and are not gated by any of this. See Invariant R and the round-trip oracle for what the gate does and does not promise.
This table is not a pass/fail list, and reading it as one gets it backwards. "How many round-trips are green" says nothing while the supported subset is small: a converter that models three constructs and warns about everything else would be entirely green. What moves is the shape of the loss: notes leaving dropped, causes leaving unread, slides leaving the carried lane.
That is also what the hard tier is for. 5 of the decks below are there to be watched moving, not to pass today; they hold features with a known-hard or absent path through the writer, and they earn their place by making a regression visible rather than by being green.
Per deck
Every deck name links to the playground with that deck loaded, so a row is something you can run rather than something you have to take on trust.
| Deck | Tier | Slides | Write calls | Notes |
|---|---|---|---|---|
text-box | primitive | 1 (1 authored / 0 carried) | 1 | 4 |
autoshape | primitive | 1 (1 authored / 0 carried) | 1 | 4 |
preset-geometry | primitive | 1 (1 authored / 0 carried) | 8 | 4 |
custgeom | primitive | 1 (1 authored / 0 carried) | 1 | 5 |
table | primitive | 1 (1 authored / 0 carried) | 1 | 6 |
cell-fill | primitive | 1 (1 authored / 0 carried) | 1 | 6 |
picture | primitive | 1 (1 authored / 0 carried) | 1 | 4 |
picture-svg | primitive | 1 (1 authored / 0 carried) | 1 | 5 |
connector | primitive | 1 (1 authored / 0 carried) | 1 | 4 |
gradient | primitive | 1 (1 authored / 0 carried) | 1 | 4 |
group | primitive | 1 (1 authored / 0 carried) | 1 | 4 |
nested-group | primitive | 1 (1 authored / 0 carried) | 1 | 4 |
hyperlink | primitive | 2 (2 authored / 0 carried) | 2 | 4 |
line-cap | primitive | 1 (1 authored / 0 carried) | 1 | 4 |
bullet | primitive | 1 (1 authored / 0 carried) | 2 | 5 |
autofit-shrink | primitive | 1 (1 authored / 0 carried) | 3 | 4 |
text-decoration | primitive | 1 (1 authored / 0 carried) | 1 | 4 |
paragraph-align | primitive | 1 (1 authored / 0 carried) | 1 | 4 |
paragraph-bullet | primitive | 1 (1 authored / 0 carried) | 1 | 6 |
paragraph-indent | primitive | 1 (1 authored / 0 carried) | 1 | 6 |
master-background | primitive | 1 (1 authored / 0 carried) | 1 | 7 |
layout-chrome | primitive | 1 (1 authored / 0 carried) | 1 | 7 |
chart | hard | 1 (1 authored / 0 carried) | 1 | 5 |
layout-placeholder | hard | 1 (1 authored / 0 carried) | 2 | 9 |
notes | hard | 1 (1 authored / 0 carried) | 1 | 4 |
rotated-flipped | hard | 1 (1 authored / 0 carried) | 2 | 4 |
theme-color | hard | 1 (1 authored / 0 carried) | 2 | 4 |
Where the losses sit
Fidelity notes across the whole corpus, by disposition (what happened to the construct) × cause (why). Both axes are upstream FidelityNote values, not a local restatement of them: one vocabulary, so the differ and this page cannot drift apart.
The cause is also the triage: unread and unwritable name a specific subsystem of the writer and are fixable there, while unsupported is a property of OOXML or of the output tier and will not move however much converter work happens.
unread | unwritable | unsupported | |
|---|---|---|---|
dropped | 28 | 27 | 7 |
flattened | 0 | 27 | 10 |
approximated | 27 | 0 | 5 |
Constructs named
| Deck | Constructs |
|---|---|
text-box | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
autoshape | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
preset-geometry | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
custgeom | deck.docProps, master.background, master.txStyles, shape.custGeom.guides, theme.fmtScheme |
table | deck.docProps, master.background, master.txStyles, table.rowAuto, table.style, theme.fmtScheme |
cell-fill | deck.docProps, master.background, master.txStyles, table.rowAuto, table.style, theme.fmtScheme |
picture | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
picture-svg | deck.docProps, image.svg, master.background, master.txStyles, theme.fmtScheme |
connector | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
gradient | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
group | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
nested-group | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
hyperlink | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
line-cap | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
bullet | deck.docProps, master.background, master.txStyles, text.bullet.picture, theme.fmtScheme |
autofit-shrink | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
text-decoration | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
paragraph-align | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
paragraph-bullet | deck.docProps, master.background, master.placeholders, master.txStyles, shape.placeholder, theme.fmtScheme |
paragraph-indent | deck.docProps, master.background, master.placeholders, master.txStyles, shape.placeholder, theme.fmtScheme |
master-background | deck.docProps, master.background, master.placeholders, master.txStyles, shape.placeholder, text.color.inherited, theme.fmtScheme |
layout-chrome | deck.docProps, master.background, master.placeholders, master.txStyles, shape.placeholder, text.color.inherited, theme.fmtScheme |
chart | chart.workbook, deck.docProps, master.background, master.txStyles, theme.fmtScheme |
layout-placeholder | deck.docProps, master.background, master.placeholders, master.txStyles, shape.placeholder, text.color.inherited, theme.fmtScheme |
notes | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
rotated-flipped | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
theme-color | deck.docProps, master.background, master.txStyles, theme.fmtScheme |
Notes the differ cannot match
None. Every fidelity note in the corpus names a construct the differ has a matcher for. A note it does not know is inert (it looks like honesty while excusing nothing), so the oracle holds this at zero.