v0.12.0 — subscripts, and a build that says what it is
Subscripts
convert_pdf_to_markdown already wrote raised glyph runs as Unicode superscripts. It now does the same for lowered ones, so J₁(t) comes out of a paper as J₁(t) rather than as J1(t).
On Shannon's A Mathematical Theory of Communication that is 672 characters across 48 of its 55 pages. Every one is a pure substitution: fold them back and the output reproduces the previous bytes exactly, on every page, and page 40's twelve superscripts are untouched.
What it records is how the page was set, and it stops there. A lowered digit is not asserted to be an index, and a raised one is not called an exponent rather than a footnote marker. Unicode also has no subscript capitals and only some lowercase letters, so a run whose characters have no real subscript form stays flat instead of being approximated with something that looks close.
This changes output you may be diffing. That is why this release is 0.12.0 rather than a patch.
A build that says what it is
Most of this release is release machinery, which usually means nothing you can see. Here it fixes something you could see, in the worst way: a published plugin that claimed a version it was not built from.
- The plugin publish guard now refuses a build it cannot identify, rather than publishing it under a version string it inherited.
- The freshness gate's shipped-path list is bound to what the build actually copies, so a new shipped file cannot slip past it unnoticed.
- CI gets the repository instead of a depth-1 snapshot of its tip.
git describecannot work without history, and anything resting on it was evaluating a truncated repository. - A second writer to the native canvas marker is reported as a second writer. It used to surface as a resource limit, which sent you looking at memory when the actual cause was another process.
Fixed
- One extraction suite was inheriting a timeout it never chose and failing under load rather than on merit.
- The installed-Shannon pins were recaptured against the shipped 0.11.0 build: 44 tools, 26 gaps, 6 replacement characters.
Artifacts
Both were built twice from clean isolated stages and required to be byte-identical.
| SHA-256 | |
|---|---|
pdf-toolkit-mcp.mcpb |
897bfea7f688a70097e5f27a4c6fb8e05cbd835b6ac494b7045d71deb770ea02 |
pdf-toolkit-mcp.zip |
38c149057a1bf90d9e5ec101fdae4bcaf8ae2ea3fc43c30db82bc88f4023b543 |
The .mcpb is 3017 files and carries all five locked native canvas targets plus a CycloneDX 1.6 SBOM whose 106 packaged components each state licence terms. The share bundle carries 122 components on the same terms.
Verified, and not
Packed smoke passed on linux/x64 with 44 tools and 14 prompts, covering a real pdf-lib mutation, source-bound accessibility and compare_pdfs, and native raster rendering. The share bundle builds reproducibly and installs cleanly with npm ci --omit=dev --engine-strict.
Both artifacts report claudeDesktopTested: false and nativeExecutionPerformed: false, because static archive conformance is what a Linux builder can honestly claim. The viewer bundle is byte-identical to the one verified for 0.11.0, so nothing about the viewer changed in this release.