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.

A folio of the Voynich manuscript (Beinecke MS 408): the looping Currier script wrapped around a painted plant.
A folio of the Voynich manuscript (Beinecke MS 408): the looping Currier script wrapped around a painted plant.

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?

A number line: Currier A|B sits far below every real language change and just above the same-engine floor
Computed with our own code (order-2, R=10 seeds, mean). The floor sits on zero (0.00). Every real language change is far to the right — the nearest, French | Latin, costs 0.86. Currier A | B lands at 0.273: clear of the floor, but only 31% of the way to the closest language boundary — about 3.2× short of it.

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.

← All investigations