SYNTOLOGY HomeExplorerAtlasCodeMethodologyAboutDevelopersFeedPricing
Paper · 2608.17096 · 2026

A Glyph Is Not a Letter, a Token Is Not a Word, a Space Is Not a Space: What the Units of Voynichese Are Not

Liudmila Rozanova, Alexander Temerev

arXiv · PDF · Open in the Atlas

Code that ran

We lifted 22 functions out of this paper's own repositories and ran 17 of them in a sandbox. "Ran" means the function executed on a synthesized input and returned a value. It is not a reproduction of the paper's results.

RepositoryRoleRan
lrozanova/voynich-units canonical 17 of 22
FunctionStatusWhere it lives
analyse Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v5/e3_positional.py
code served (permissive licence) · get_code("7f5772d07b4007e9")
cipher_corpus Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v5/unit_probe.py
code served (permissive licence) · get_code("f1b692478227265f")
clean_tokens Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack/plant_crib_attack.py
code served (permissive licence) · get_code("c72b375a16593c32")
collapse Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack/plant_crib_attack.py
code served (permissive licence) · get_code("76f2f87098d793b0")
encode Ran lrozanova/voynich-units/analysis/reproduce_edge_order.py
code served (permissive licence) · get_code("26c68a7d492af502")
letters_of Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v6/attack_lib.py
code served (permissive licence) · get_code("867df5f41be3d61a")
load Ran lrozanova/voynich-units/analysis/reproduce_direct_pixel.py
code served (permissive licence) · get_code("7808cd424c8ab1c1")
make_groups Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v5/unit_probe.py
code served (permissive licence) · get_code("ddd4f02f747a004c")
make_tables Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v6/validate_synthetics.py
code served (permissive licence) · get_code("153fe745afb82bb7")
mi_pairs Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v5/e3_positional.py
code served (permissive licence) · get_code("c3a7486ffada34bd")
ngram_generate Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v6/attack_voynich.py
code served (permissive licence) · get_code("32a427ccbf878402")
novowels Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v6/attack_lib.py
code served (permissive licence) · get_code("3df2e006b5064bf5")
parse_seeds Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v6/run_differentials.py
code served (permissive licence) · get_code("65ecd940edbeb392")
posbin Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v5/e3_positional.py
code served (permissive licence) · get_code("a3702afc073aca63")
stratum_breaks Ran lrozanova/voynich-units/analysis/reproduce_dialect_linestart.py
code served (permissive licence) · get_code("4006ba10aa08b1eb")
strip_markup Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack/plant_crib_attack.py
code served (permissive licence) · get_code("2a32d559f8eac93e")
to_lines Ran lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v5/unit_probe.py
code served (permissive licence) · get_code("f28bbf89c484810d")
build_lms Not yet run lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v6/attack_lib.py
code served (permissive licence) · get_code("ee646622f5fa679a")
encipher Not yet run lrozanova/voynich-units/voynich_decipherment_repro_bundle/decipherment_attack_v6/validate_synthetics.py
code served (permissive licence) · get_code("62b4c796898682d8")
load_results Not yet run lrozanova/voynich-units/analysis/reproduce_cipher_calibration.py
code served (permissive licence) · get_code("16f65573a1092dd7")
load_voynich_both Not yet run lrozanova/voynich-units/analysis/reproduce_edge_order.py
code served (permissive licence) · get_code("fe2817e0b555ef71")
stratum_lines Not yet run lrozanova/voynich-units/analysis/reproduce_dialect_linestart.py
code served (permissive licence) · get_code("6c76184ecd8fcc26")

Repositories linked to this paper

Some links come from the archived Papers with Code dataset (CC BY-SA 4.0): attribution and licence.

Abstract

The Voynich manuscript (Beinecke MS 408) is usually analysed on three unstated assumptions: that its glyphs are letters, that the strings between blanks are words, and that every blank is a word space. We test all three against the Zandbergen-Landini transliteration with matched prose, cipher, and pseudo-text controls and quire-level resampling. None holds, and the failures share a shape: the order in Voynichese sits at the edges of tokens and at graded boundaries between them, not in the succession of tokens themselves. Glyph regularity is too strong for one-to-one substitution of any tested plaintext (conditional entropy 2.7 bits against about 3.5 for Latin, Italian, and English) and resolves instead onto a quire-stable scale of recurrent multi-symbol units. Tokens form a plausible vocabulary, yet the identity of one token predicts the next by under 1% of token entropy, below every matched control (2-10%), while the glyphs at token edges share 0.2 bits of mutual information, more than in any prose control. Blanks fall into two regimes: the separators transcribers marked uncertain behave like word-internal junctures, are physically narrower on the page (AUC 0.905 from independent image coordinates, with the same sign in a small blind ink audit), and are crossed by learned units even when every space is erased before learning. This profile is also what discriminates. A published Voynich-imitating cipher and a self-citation text generator both reproduce the low entropy, the unit scale, the weak token order, and the null result of a calibrated substitution attack; neither reproduces the edge-glyph coupling or the open, hapax-rich vocabulary (70% singleton types against 41% and 59-60%). Any account of the manuscript must therefore earn, rather than assume, the step from glyphs, tokens, and separators to letters, words, and word spaces, and these are the measurements on which to do so.

For agents

The same record, over MCP at https://syntology.ai/mcp:

get_harvested_code_for_paper("2608.17096")
get_code_for_paper("2608.17096")
have("2608.17096")

Connect an agent — have() is free.