Skip to content

Cut v0.4.0, and make the docs describe the code that exists - #27

Merged
welshofer merged 1 commit into
mainfrom
jaywelshofer-microsoft-didactic-waffle
Aug 17, 2026
Merged

Cut v0.4.0, and make the docs describe the code that exists#27
welshofer merged 1 commit into
mainfrom
jaywelshofer-microsoft-didactic-waffle

Conversation

@welshofer

Copy link
Copy Markdown
Owner

Two things were out of step with the code: the released version, and the docs.

The repo now matches local truth

PR #25 — 24 commits your main checkout was sitting on, including a Linux DoS fix — was open and green but unlanded. It's merged (merge commit, so the root-cause messages survive). Re-verified with the full ./scripts/verify.sh gate before merging, and the merged tree is byte-identical to the tip that passed.

v0.4.0, because the README advertised a library nobody could install

The feature table promised fitText, FontMetrics, outline(), DeckExport, replaceData and documentKind. The install snippet said from: "0.3.0". v0.3.1 — the newest tag — contains none of them. The entire "Measure & trust" program had shipped into a 400-line [Unreleased].

So [Unreleased] becomes ## [0.4.0] — 2026-08-17, README installs 0.4.0, and ROADMAP marks the v0.4 program shipped rather than open-ended.

What the CHANGELOG was missing

That section was malformed — three separate ### Changed headings inside one version — and silent about the newest work. Each entry below was verified against the source, not the commit messages:

  • slides.add(layout:)add(clonedFrom:) — a public rename with a deprecated shim, previously undocumented anywhere.
  • renderSVGReportingProblems and Shape.markAsPlaceholder — new public API.
  • ShapeCollection.count/subscript no longer walking the whole tree.
  • Builders writing real title placeholders, so generated decks stop being headless.
  • The Linux SIGSEGV. <?target?> — a dataless processing instruction — is a NULL dereference in libxml2 via XMLParser: a denial of service on untrusted input, since Rostrum opens files it did not write. That root-cause writeup existed only inside a lift-up plan.

236KB of audit scratch, one of which held a security writeup

Six lift-up/burn-down artifacts sat at the repo root. Their durable findings moved to where people look for them — what shipped to CHANGELOG.md, what was deliberately not done to a new ROADMAP "Deferred" section (effective-frame inheritance, kerning/shaping, SVGRenderer golden-file tests, DeckRenderer at 923 lines, the headless decks already written). The scratch is gone and gitignored so the next audit doesn't re-land it.

Two claims that were untrue

  • docs/ARCHITECTURE.md promised an orphan-audit API and an opt-in prune(). Neither exists; now stated as intended-but-not-implemented, alongside the readWarnings reporting that is real.
  • ROADMAP.md said read limits default to .unlimited. They have defaulted to 4 GiB since the hardening pass.

I checked every backticked API in README, ARCHITECTURE and COOKBOOK against Sources/prune() was the only phantom. The 178 preset geometries and 150-style catalog both check out.

One code change

SVGRenderer.render bound a dom it never used. Deleting the call would have been wrong: every other read goes through existingSpTree, which swallows the parse with try?, so this is the one thing that turns a malformed slide part into a thrown error instead of a silently blank slide. Now _ = with a comment saying why. The library builds warning-free.

Verification

./scripts/verify.sh green — Rostrum, LecternCore, README snippets, macOS and iOS app builds, and the app-hosted tests.


Still needs your call: tagging v0.4.0 once this lands (the README now points at it), and pruning 9 fully-merged remote branches — one of which, burndown/deck-workbench-20260805, is what your main checkout currently tracks.

The README advertised a library nobody could install. Its feature table
promised `fitText`, `FontMetrics`, `outline()`, `DeckExport`, `replaceData`
and `documentKind`, while the install snippet pointed at `from: "0.3.0"` —
and v0.3.1, the newest tag, contains none of them. The whole "Measure &
trust" program had shipped into an [Unreleased] section 400 lines long.

So: promote it. [Unreleased] becomes 0.4.0, dated, with the program's theme
stated up front; README installs 0.4.0; ROADMAP marks the v0.4 program
shipped rather than open-ended.

The section it promotes was also malformed — three separate `### Changed`
headings inside one version — and silent about the most recent work. Now
recorded, each verified against the code rather than the commit messages:

- `slides.add(layout:)` → `add(clonedFrom:)`, a public rename with a
  deprecated shim, which had gone entirely undocumented.
- `renderSVGReportingProblems` and `Shape.markAsPlaceholder`, both new
  public API.
- `ShapeCollection.count`/subscript no longer walking the whole tree.
- Builders writing real title placeholders, so generated decks stop being
  headless.
- The Linux SIGSEGV: `<?target?>`, a dataless processing instruction, is a
  NULL dereference in libxml2 via `XMLParser` — a denial of service on
  untrusted input, since Rostrum opens files it did not write. That
  root-cause writeup existed only inside a lift-up plan.

Which is the other half of this. Six audit artifacts — 236KB of routing
tables, citation gates and cross-model reviews — sat at the repo root, and
one of them was the only record of a security fix. Their durable findings
move to where they are looked for: what shipped to CHANGELOG, what was
deliberately not done to a new ROADMAP "Deferred" section. The scratch is
gone from the tree and gitignored so the next audit does not re-land it.

Two claims that were simply untrue are now true: ARCHITECTURE promised an
orphan-audit API and an opt-in `prune()`, neither of which exists, and
ROADMAP said read limits default to `.unlimited` when they have defaulted
to 4 GiB since the hardening pass.

One code change, because the warning it fixed was load-bearing:
`SVGRenderer.render` bound a `dom` it never used, and deleting the call
would have been wrong — every other read goes through `existingSpTree`,
which swallows the parse with `try?`. It is the one thing that turns a
malformed slide part into a thrown error instead of a blank slide. Now
`_ =`, with a comment saying so. The library builds warning-free.

`./scripts/verify.sh` green: Rostrum, LecternCore, README snippets, the
macOS and iOS app builds, and the app-hosted tests.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@welshofer
welshofer merged commit 1595667 into main Aug 17, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant