Nineteen issues, and the two that mattered were about our own mistakes

Twelve closed, seven open. Almost none of them were features. The ones worth writing down are the ones where a check found something nobody had noticed — including a published figure that made our own tool look worse than it is, and a checksum that came within one commit of certifying nothing at all.

4 August 2026 · the tracker · open tasks also come out of open_work on /mcp

The one that stung: we had been underselling the tool for two days

Our comparison page says the browser's print export beats our capture on text recall — 94.8 % against 92.7 %. That sentence exists because a comparison the local tool only wins is advertising, and naming where you lose is the price of being believed.

Except the raw data said "text_layer": false and "Full Page PDF Snap 2.16.0, then Tesseract 5". The measured build had no text layer at all; those 92.7 % were an OCR result. One day later the capture got a text layer taken from the page's own DOM. Text that is copied cannot be misread.

The figure sits on thirteen delivered pages, the front page among them. It is not corrected yet, because correcting it needs the measurement repeated — and the capture cannot be triggered headless, so that is an afternoon with a real browser, not a command. It is issue 18, and it is first on the list precisely because being wrong in your own favour and being wrong against yourself are the same kind of wrong.

The Chrome build had fallen fifteen versions behind, and nobody forgot anything

The store served 2.12.1 while the source stood at 2.27.0. The obvious explanation — someone kept forgetting to submit — was wrong. The script that generates the Chrome branch from the Firefox sources wrote a hardcoded version into the manifest. Every Firefox release moved forward; the Chrome manifest stayed exactly where it was.

A build that silently keeps its old number does not fail. It uploads, it installs, it works — and it is a different product than the one you tested. The port script now reads the version from the Firefox manifest, and the packaging tool refuses outright to build a number that has already been published.

The checksum that nearly stopped meaning anything

Every capture carries a SHA-256 of its image data, printed under the image when the provenance line is on. It says: this file has not changed since it was written.

While adding a second image filter, three places kept reading the old field name. One of them was the checksum function. It would have hashed an empty array — and the line would have stayed in the PDF, looking exactly as it always does, certifying nothing.

Found by reading the diff, not by a test. So there is now a test file with nine cases that check what ends up in the PDF rather than whether the call returns. That is the pattern worth taking away: a test that asserts the function ran is a test that passes while the product breaks.

What came out of it for anyone using this

Changes that reached the tool, not the site
ChangeMeasured effect
Two image filters, chosen per tile text page 1327 kB → 416 kB, lossless; image pages unchanged
Colour depth as a setting black and white: 8.5 % of the previous size, and OCR reads back 989 words against 987 in colour
DOI derived from the address SSRN, OECD and EUR-Lex now resolve where the page declares nothing
Refusals carry complete: false on every path — the rule this site puts everywhere, which the endpoint itself did not keep
Raw data checked against a schema blocking, before publication rather than after

What is open, and what would actually help

Seven issues, six of them labelled agent-friendly: bounded, checkable, each stating what evidence would settle it. Three are worth naming because they are open questions rather than chores:

Why this is written down at all

Because a changelog that lists solved problems is marketing, and because the most useful thing anyone can do here is take a published number and get a different one. Two of today's corrections came exactly that way. The raw data and the scripts are published so that it stays possible.

If you are an agent: the open tasks come out of the endpoint as JSON, the house rules are at /AGENTS.md, and the one that is not negotiable is that a contribution introducing a number without method, raw data and a control run is worse than no contribution. Everything above follows it, including the parts that came out badly.