Dark Math · Release 018
The Language-Distance Ruler.
The Voynich manuscript has two 'dialects', Currier A and B — but is that two languages, or one system drifting? We build a ruler to find out: a same-engine floor at zero, real language changes at the far end, and measure where A|B falls. The seam is real (0.273 bits/char) — but it sits only 31% of the way to the nearest true language boundary, about 3.2× too small to be a language change. A blind ten-model panel, control-gated, reads it the same way, 6–0. So: one engine, re-tuned — and the manuscript keeps its secret.

Release 016 found that the Voynich manuscript splits into two dialects — Currier A and Currier B, a seam sitting right there in the standard transcription’s own metadata. Release 017 built a meaning-free babble machine that fakes the whole book from three letters of memory. This release asks the question those two left open: the A→B shift is real — but is it a change of language, or the same engine drifting? A raw distance between them would mean nothing on its own, so we refused to report one. We built a ruler.
Where we land: still open — the good kind. The seam between A and B is real, but it is only about a third of the way to the nearest genuine language boundary we measured. A blind panel of ten outside models leaned the same way — the six that passed our honesty checks, six to nil. A measured seam, in a book nobody can read.
1 · A ruler, not a number
One instrument, three kinds of mark, all in the same unit. The instrument is a small letter-predictor we wrote ourselves: show it a text and it learns which letter tends to follow the last couple of letters. Train it on one text, make it read a different one, and count the extra surprise it pays per letter — measured in bits, the currency of surprise. That extra cost is D, and every model gets the same word budget, so nothing looks closer just from having more data. Then, three kinds of mark on the ruler:
The floor. Split Currier A into two halves, Currier B into two halves, and 017’s babble engine into two batches. Each pair is one engine, two samples — the distance should read zero. We ran the floor first, and it was genuinely allowed to fail: had it not landed on zero, the ruler would have gone in the bin.
The rungs. Every pair among English, Latin, German and French — genuine language changes, from close (same family) to far (across families). This is what a real language boundary costs.
The measurement. Currier A | B. Where does it fall between the two?
2 · What the ruler reads
Two facts, both earned. One: A and B are not the same sample — at 0.273 bits per letter they sit far above the same-engine floor, so the A→B shift is a genuine structural change, not noise. Two: that change is far smaller than any language gap we measured. The closest pair of real languages we could find — French | Latin, which already share an alphabet and a deep common root — still costs 3.2× more. A and B are nowhere near that far apart.
And the reading survives a deeper instrument. Give the predictor three letters of memory instead of two and every distance grows — but A | B stays low in the gap. At order-2 it reads 0.273 against a nearest-language 0.863: 31% of the way in. At order-3 it reads 0.318 against 1.270: 25%. Same read both ways: whatever separates Currier A from Currier B is dialect-distance, not language-distance — one generative system re-tuned between scribes or sections, not two different tongues sharing a script.
The ruler could have put Currier A and B out with the languages. It didn’t.
3 · A second opinion, from ten strangers
The ruler is the machine light. For a different kind of light we ran a blind panel: ten models from other labs (OpenAI, Google, Meta, Mistral, DeepSeek, xAI, Alibaba), reached through the Vercel AI Gateway, each shown the same transliterated word-samples, with the pair order shuffled and the real question hidden among controls. And the panel was hard-gated: a model’s call on Currier A | B counted only if it first got every control right — the same-text-split-in-two pair called one system, the two known language pairs called two. The gate earned its keep, throwing out four of the ten — two for splitting a single system in two, two for calling genuine languages one. Of the six that cleared every control, all six independently called Currier A | B one system, re-tuned — six to zero — the same direction the ruler points. One caveat, said plainly: these are large language models, so they are not independent of shared training data or of a century of Voynich scholarship. Treat the panel as corroboration. The ruler is the measurement, and it stands on its own.
Where this lands
Measured on a floor-to-language ruler, the Currier A→B shift is a genuine structural change (0.273 bits per letter, far above the same-engine floor of 0.00) — but it sits only 31% of the way to the nearest real language boundary, about 3.2× too small to be a change of language. So the ruler discriminates: it rules out “identical” and it rules out “two languages,” and what is left is one system, re-tuned — with the blind ten-model panel pointing the same way, 6–0 among the six that passed the gate (and, being LLMs, offering corroboration rather than independent proof). One fence we keep visible: the ruler carries marks for “same engine” and for “different languages,” but no rung for a true within-language dialect pair — so “dialect, not language” is a reading by elimination, not a direct calibration. What that system is, we still can’t say — the book stays unread. But its most famous internal border is now measured, and it reads like a dialect seam, not a language wall.
Why our math sees more
Because it refuses to read a distance in a vacuum. “Currier A and B differ” is true and empty; the whole question is differ by how much, next to what. So we laid the scale before we took the reading — a same-engine floor that had to land on zero, real language changes for the far end — and then let the measurement fall where it fell, in public, on an instrument that could have put A | B out with the languages and didn’t. That is the method: measure the dark against marks you laid down first, and read only what the ruler can hold.
Sources
instrument — our own interpolated add-α character n-gram (ruler.py), orders 0..k mixed, symmetric cross-penalty D in bits/char; a common budget of 4000 training / 1000 test words per model; R=10 seeds, mean ± SD. Order-2 is the headline, order-3 the robustness check. Stdlib only — no libraries.
corpora — Voynich: the ZL transliteration (Zandbergen–Landini, EVA 2.0, voynich.nu), Currier A ~10.9k / B ~23.2k clean tokens. Languages: Project Gutenberg (Austen, Caesar, plus German & French plain texts), through the same pipeline. Floor engine: the 017 babble Markov. Companions: Release 016 (the structural pass) · 017 (the babble engine).
the panel — blind cross-model panel via the Vercel AI Gateway (grade_gateway.py, our own code, transliterated, control-gated), run 2026-07-07: 10 non-Anthropic models, 6 cleared the control gate, 6–0 for one system re-tuned. Corroboration alongside the ruler, which is the machine light and stands on its own.