Digital One Foundation The Text Layer
Paper 002 · Method

The honest number moved downwards.

What conversion removes is the page image, a flat charge that does not care what is printed on the page, so a percentage divides it by a variable one. A published 64% was counted with another vendor's tokenizer on sixteen private PDFs nobody outside could re-run; re-counted with the vendor's own counter on a public corpus, it came to 53%: the honest number moved downwards.

§1A flat charge divided by a variable one

Of the 2,792 tokens a native page costs in Paper 001, §3, about 1,568 are the page image, and that had to be established rather than looked up. The vendor publishes two tiers — standard, capped at 1,568 visual tokens an image, and high-resolution, for its 4.7-and-later models, capped at 4,784 — and says pages are rasterised server-side at dimensions you do not control.[1] The three models of Paper 001, §3, are 4.7-and-later models, so the table alone would place them on the higher cap, a factor near three; Claude Haiku 4.5, measured alongside them below, sits on the standard one.

The cheapest experiment closes it. One corpus document is a single page, and its whole native cost is 3,007 tokens, text and image together. A page cannot cost less than its own image, so 4,784 is impossible. Subtraction — native minus a plain pdfplumber text dump of the same PDF, no Markdown syntax, per page — puts the median at 1,569 tokens on Claude Opus 5 over all sixteen, range 1,309 to 1,618, and 1,568 on Claude Haiku 4.5 over the thirteen it accepted, range 1,289 to 1,616: one token apart across a supposed threefold boundary. The dump is a proxy for the vendor's own extractor, and where it over-counts, as on dense mathematics, the residual is understated — a bias running away from 4,784, not towards it. At 1,568 the extracted text implied by the corpus is 1,224 tokens a page; the dump came to 1,239, 1.2% apart.

Which is why the reduction column in Paper 001, §3, is mostly arithmetic: what conversion removes is the page image, and the page image does not care what is printed on it. Thirteen of the sixteen save between 1,365 and 1,676 tokens a page — inside 15% of the 1,568-token page image — while their reductions run from 38.3% to 73.1%. The three that save less save 368 to 1,141: a mathematics-heavy paper, a tax booklet, and the two-page tax form whose 11.1% is the floor. Across the corpus 1,469 tokens a page stop being billed. Estimate an estate in tokens, not in percent — what may not be said is that a particular estate will see 1,469.

MIXED PAGES EU regulation, English · 88 pages · 59.3% native · 2,792 tokens/page image 1,613 text 1,179 crunched · 1,136 tokens/page markdown saved 1,656 1,656 tokens/page stop being billed FIELD LABELS ON A GRID tax form · 2 pages · 11.1% native · 3,320 tokens/page image 1,618 text 1,702 crunched · 2,952 tokens/page markdown saved 368 368 tokens/page stop being billed the page image is the part that stops being billed, and it is the same size on both pages where the Markdown costs more than the text it replaces, most of that saving goes back
Figure 1 One page, two bills. Bars are tokens per page at one scale; the text figure is the measured plain-text dump, and the image figure is the remainder after it.

One pair makes the point without interpretation. The GDPR is published by the same office in English and in Hungarian — the same 88 pages, the same page image to within three tokens, 1,613 against 1,610. The Hungarian text costs 1.69× the English, the Markdown 1.71×; the reductions are 59.3% and 46.2%, and the tokens saved are nine apart. Thirteen points worse as a percentage, the same conversion in tokens: the difference is a property of the tokenizer, and it moves both sides together. The Hungarian conversion is not worse. The denominator is larger.

§2The defect: a claim about one vendor, counted with another's tokenizer

The method in Paper 001, §3, is the corrected one. The figure crunch.md published until 7 September 2026 was 64% — 64.4%, rendered 64%. It was obtained in the ordinary way: a corpus, a tokenizer, an arithmetic. Each part was defensible alone. Two were wrong together.

Defect · found by re-measuring with the vendor's own counter, 7 September 2026

A proxy tokenizer, and a corpus nobody outside could re-run

The conditions are ordinary rather than exotic. The counter was tiktoken o200k_base, another vendor's tokenizer, running locally. The corpus was sixteen private PDFs, 152 pages, on one laptop, and nobody outside could re-run it. The page image was read off a documentation table.

as published · 16 private PDFs · 152 pages · one laptop
counter   tiktoken.get_encoding("o200k_base")
native    566 text + 1,568 image = 2,134   image read off a cap
markdown  760
1 − 760 ÷ 2,134 = 64.4%   →   published as "64%"

re-counted · count_tokens · 16 public PDFs · 861 pages
1 − 1,139,102 ÷ 2,404,262 = 52.6%   →   published as "53%"

Two things changed at once. A proxy tokenizer does not fail loudly; it fails plausibly, returning numbers of the right order. And the private corpus was far sparser — part of why its extracted text came out at 566 tokens a page against the 1,224 the public corpus implies, and how much of the rest belongs to the change of counter cannot be recovered now. A private corpus also removed the mechanism that would have caught either: somebody outside re-running it.

The native side moved in the claim's favour; the engine's own output moved further against it. The expectation had been that 64% was conservative. The honest number goes down, not up. The vendor's own documentation says its 4.7-and-later models produce roughly 30% more tokens for the same text than its earlier ones[2] — the size of the error a stale count of its own makes; no published figure relates another vendor's tokenizer to this one, and it was never a stand-in.

A constant that already contained the words

The engine also reports a ratio per conversion, and its estimate of the native cost was the document's own extracted text plus a per-page constant of 1,750 — read as the mid-point of the 1,500–3,000 tokens a page the vendor quotes. The vendor labels that range text and adds the image on top, so the document's words were charged twice.

as shipped · the constant read as "text + page image"
native_estimate = extracted_text_tokens + 1,750 × pages
the document's words are counted once in the first term and again inside the second

corrected · the constant is the page image alone
native_estimate = extracted_text_tokens + 1,568 × pages
one 14-page document · reported ratio 0.688 → 0.657
a private file, counted with the engine's heuristic tokenizer — illustrative only

The documentation is what hid it: a reader checking the line sees a mid-point, a range and an attribution, and reads softness rather than error. A softer estimate would have been forgivable. Double-counting was arithmetic.

A score that fell because detection improved

The engine's other number is a structure score out of 100, and a repair to table detection made it fall.

one partially-ruled table, alternate rows shaded
before   6 one-row lattices; any under 2 rows dropped → 5 lost as prose
after    stitched back into one table
         40 markdown table lines → 89 · 0 words lost · 9 gained
         needs_help       23 → 23    integrity did not move
         structure_score  82 → 78

The conversion had plainly got better — nine words recovered, none lost, five discarded fragments stitched back into the one table they came from. The fall sat in the tables component: a metric is defined only over what the pipeline detected, so what it missed is not scored badly — it is not scored at all. Twice in one session, the same night 64% became 53%, a number got worse because the thing measuring it had got honest.

§3Where it runs, and what the result records

The base conversion path is deterministic by design and by documentation — the same bytes in, the same Markdown out — and it calls no model. An enhancement tier that would call one is planned and does not exist in the code these notes draw on; the property tests that would hold determinism there are a plan rather than a suite, and there are no golden files to diff against.

Across that path one module opens a socket: the fetcher that exists because a caller asked for a URL. One more can — an optional token counter, off by default, needing both a credential and a flag. Naming both is the point. OCR is where a page most obviously could leave, so it ships as a provider protocol with none enabled by default: an installed provider is listed rather than activated, and with nothing named a scan is detected, its pages are named, and the conversion refuses rather than inventing text. Egress is a declared field — local, private_network or third_party — checked before the first page is rendered and recorded on the result, so a cloud provider is turned away before it authenticates.

The shipped provider is local Tesseract with seven language packs (hu, de, en, pl, ro, cs, sk), handed rasters rather than the document; a converter for legacy Office formats declares a risk rung the same way but is handed the file itself, and nothing in its sandbox stops that program opening a socket. The protocol cannot prove a provider opens no socket and does not pretend to: it makes the claim explicit, checkable in advance and recorded.

What conversion buys at the far end is one context, and therefore one answer. RFC 9110 is 194 pages;[3] converted and counted on Claude Haiku 4.5, 126,739 tokens — inside that model's 200K window, the smallest in the range.[4] Three corpus documents were refused outright as native uploads there: a maximum of 100 PDF pages may be provided. All three counted as Markdown, and two fit the window they had been refused from. The third does not. The window decides what fits, not a page count, and the engine caps intake at 2,000 pages — "the longest thing in the estate goes in whole" is not a sentence this paper can write.

Throughput is CPU-bound and per core — about 6 ms a page for a report with a clean text layer, about 513 ms for a dense design-heavy one, median of three runs on one production machine. Neither document is in the public corpus, so these two figures cannot be re-run from this paper. The 86× is the document, not the machine, and there is no GPU in the path: a machine full of accelerators converts an estate with them idle.

On the provenance of this material

The method and measurements here were developed inside crunch.md, a Digital One product, and the defect in §2 was found by re-measuring that product's own published claim. The engine, crunch-core, and its MCP server are Apache-2.0 licensed and run offline; the hosted service is proprietary. The repository is not public yet, so that licence is a statement of intent rather than something a reader can check today. The corpus is public, and the native column in Paper 001 can be re-counted by anyone holding the manifest and a key. Deliberately absent: prices, plans and tiers, and deployment internals.

References

  1. Anthropic, Vision — Resolution and token cost, platform.claude.com/docs/en/build-with-claude/vision, and Coordinates and bounding boxes, platform.claude.com/docs/en/build-with-claude/vision-coordinates, both read 11 September 2026. Neither states what size a PDF page is rendered at, which is why §1 measures it.
  2. Anthropic, Token counting, "Pricing and rate limits" and the tokenizer note for Claude 4.7 and later models. platform.claude.com/docs/en/build-with-claude/token-counting, read 11 September 2026.
  3. R. Fielding, M. Nottingham, J. Reschke (eds), HTTP Semantics, RFC 9110 (STD 97), June 2022, 194 pp. The artefact measured is the RFC Editor's PDF rendering, sha256 60b30efa1048900833d1758440247fe8ac85a3134f2327388dcb24e07d814c89. rfc-editor.org/rfc/rfc9110.pdf, read 11 September 2026.
  4. Anthropic, Models overview, "Compare models" — context windows of 1M tokens for Claude Fable 5.1, Claude Opus 5 and Claude Sonnet 5, and 200K for Claude Haiku 4.5. platform.claude.com/docs/en/about-claude/models/overview, read 11 September 2026.