Skip to content

v0.12.0 — subscripts, and a build that says what it is

Choose a tag to compare

@silverstein silverstein released this 21 Aug 12:56
· 137 commits to master since this release
0baf06b

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 describe cannot 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.