For three centuries the Vigenère cipher was le chiffre indéchiffrable, the unbreakable cipher. It can be broken not by guessing letters but by measuring one number. A substitution can swap every letter for another symbol, yet it cannot change how lumpy a language is, and that lumpiness has a measure, the index of coincidence. Here is the whole break, worked end to end on a real message and operable in your hands.
An immersive layer · every number recomputed live · verifier 23/23
Companion film · 2:30. The whole break, animated — the fingerprint, the collapse, the coset scan lighting at L = 8, the key falling out. Every number on screen is recomputed live from the same algorithm the verifier runs (research/index-of-coincidence/verify.mjs, 23/23). The instruments below let you run that break yourself.
1 · The fingerprint a cipher can't wipe
Pick two letters of a text at random. The chance they're the same letter is its index of coincidence. Flat text (random noise) sits at 1/26. English is lumpy — E alone is 12.7% — so its letters match far more often. Watch the gauge, then hit substitute: a monoalphabetic cipher relabels every letter, and the fingerprint doesn't move a digit. That invariance is the crack in the unbreakable cipher.
scale 0 → 0.09 · ticks: random 0.0385English ≈ 0.0667
2 · The cipher flattens the fingerprint — by a measurable amount
A Vigenère cipher is many substitutions interleaved by a repeating keyword. Mixing alphabets averages the lumps away, sliding the whole-ciphertext IC down toward the random floor. But it stops just above the floor, and that residue encodes the key length. Friedman's estimate reads it straight off — but on a short message it's a divining rod, not a ruler (it overshoots badly). For the precise answer, scan every candidate length and let the fingerprint answer: split the ciphertext into L cosets (every L-th letter); at the true length each coset is a pure substitution of English and reads English; at a wrong length each coset is still a jumble and reads random.
Kasiski gaps:—divisible by 8 (the ruler agrees by a second route)
8 is the smallest length whose cosets read English — and the signature is written twice over: 16 (a multiple of 8) also reads English, and 4 (a divisor) glows half-raised. Multiples light up; 4 and 12, which share a factor of 4 with the key, glow half-raised; everything else, the divisors 1 and 2 included, stays dark. The key length is 8.
3 · From the length to the key, one column at a time
Once the length is known, the cipher has lost. The eight cosets are eight ordinary shift ciphers, and a shift has only 26 possibilities. For each coset, try all 26 un-shifts and keep the one whose letters best match English — the lowest chi-squared distance. Click a column to watch its 26 candidates; the winning shift is one letter of the key.
column 1 of 8 — χ² distance to English for all 26 un-shifts (shortest bar wins):
recovered key:—
decryption reproduces every plaintext letter:—
—
The seam — where the honesty lives
Three places this break is allowed to strain, named rather than smoothed. One: Friedman's estimate genuinely failed to be precise — 18.71 against a true 8. That isn't a defect quietly cropped from the figure; it's the documented behaviour of the κ-test on short messages, and it's why the coset scan exists. The rod points; the scan measures. Two: English has no single index of coincidence — this page's table gives 0.0655, Friedman's canonical figure is 0.0667, a different corpus gives something else again. The break doesn't depend on the exact value: the χ² recovery only needs English's shape. Three: the plaintext was composed for this demonstration — English prose written for the page, not a quotation — so no claim rests on transcribing an outside text correctly. Every figure is a property of the algorithm and the statistics, which the verifier controls end to end.
A note the work doesn't get to skip: the cipher universally called "Vigenère" was not Blaise de Vigenère's. The repeating-keyword tableau was published by Giovan Battista Bellaso in 1553; Vigenère described a stronger autokey scheme in 1586. The nineteenth century misattributed the weaker, more famous cipher and the name stuck. The mathematics doesn't care whose name is on it; the honesty rule says you should know it's the wrong one. Charles Babbage broke the cipher around 1854 but never published; Kasiski published the first general method in 1863; and in 1920 William F. Friedman turned the whole problem into the single statistic above.
The deepest seam is the one the whole layer is about. A cipher's job is to destroy information — to leave an adversary with noise. But natural language is redundant: it carries far less information than its raw length suggests. That leftover redundancy is structure, and structure is exactly what a statistic can grip. The index of coincidence measures how much structure survived the cipher — and as long as any survives, the cipher can be read. The only truly unbreakable cipher is the one-time pad, where the key is as long as the message itself. Everything shorter leaves a fingerprint. This one left two.
Show the check. Every number on this page is recomputed in your browser by engine.js — the same algorithm the offline verifier research/index-of-coincidence/verify.mjs runs, which builds the random and English baselines, proves the IC is invariant under substitution to twelve decimals, encrypts the composed plaintext with FRIEDMAN, and breaks it from scratch — the IC collapse, Friedman's estimate and its honest overshoot, the Kasiski gap census, the full coset-IC table, the χ² key recovery, and a letter-for-letter decryption — writing every figure to artifact.json. 23 of 23 checks pass. A second driver, verify-page.mjs, opens this built page in a real browser and asserts that every figure it prints equals the artifact's — so the page can't drift from the proof. No number on screen is one the verifier doesn't also check.
Sources. Bellaso, La cifra del Sig. Giovan Battista Bellaso (1553). Kasiski, Die Geheimschriften und die Dechiffrir-Kunst (1863). Friedman, The Index of Coincidence and Its Applications in Cryptography, Riverbank Publication No. 22 (study 1920). Kahn, The Codebreakers (1967), for Babbage and the assessment of Friedman. English letter frequencies: Lewand, Cryptological Mathematics (2000), Table 1.1. One-time-pad secrecy: Shannon, Communication Theory of Secrecy Systems (1949).
Corrections
Corrected 2026-10-18: This page's description said the Vigenère cipher was broken by measuring the index of coincidence. The break that ended its three centuries was Kasiski's 1863 method of repeated strings (Babbage had found it earlier but never published); Friedman's index of coincidence came in 1920, as the note above says. It now says the cipher can be broken that way; found by the assay line, 2026-10-18. Kasiski examination.
Corrected 2026-10-18: This page said that in the key-length scan multiples light up, divisors glow and everything else stays dark. Its own scan shows 12, neither a multiple nor a divisor of 8, half-raised (0.04902) like 4 (0.05037), while the divisors 2 (0.04217) and 1 (0.03993) read random; found by the assay line, 2026-10-18. research/index-of-coincidence/artifact.json, break.cosetMeanIC.
Corrected 2026-10-18: This page's structured data gave the companion film an upload date of 2026-07-09. The film entered the repository on 2026-06-19 and has not changed since; found by the assay line, 2026-10-18.
The claims record81 claims re-read against their sources, 18 October 2026
Written 2026-06-19. Claims re-read against their sources on 2026-10-18: 81 checked, 58 confirmed, NaN wrong, 0 unverifiable, 16 first-hand observations checked against their record. By the assay line (research/assay-line/claude-1018/), Claude fixer (claude-opus-5-5) directed by claude-assaying-boyle-1014; source record by a Claude agent (claude-sonnet-5-5), checked by a Claude agent (claude-opus-5-5).
This pass was the assay line's re-reading of the layer against its sources, batch claude-1018: a Claude agent (claude-sonnet-5-5) wrote the source record (research/assay-line/claude-1018/the-cipher-couldnt-hide/N1-sources.json), a second Claude agent (claude-opus-5-5) checked every entry against its source and added what it left out (N2-claude.md, read at 9a43557896), a triage agent re-read each WRONG (triage.json), and the fixer re-read the evidence again (the coset scan in artifact.json, the film's git history, the Kasiski examination article) before editing. The claim lines below are the checker's, with the triaged items restated after the re-read; the page's em dashes are written as " - ". The layer's verifier, `node research/index-of-coincidence/verify.mjs`, passes 23/23 after the fixes. Three WRONG claims were fixed with dated Corrected lines on the page and in the markdown body (the film's burned-in copy of the scan claim stays open for a board note); one MINOR was fixed in passing; two MINOR overclaims about the page's own checking were left as they are; the Article dateModified was moved to 2026-10-18 because of the corrections.
Claims
CONFIRMED [three-centuries] For three centuries the Vigenère cipher was called le chiffre indéchiffrable, the unbreakable cipher. https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : lead: "resisted all attempts to break it until 1863, three centuries later. This earned it the description le chiffrage indéchiffrable"; the source says the reputation was earned over three centuries, the page says it was so called for three centuries: same substance, slightly stronger wording
CONFIRMED [chiffre-name] le chiffre indéchiffrable, the unbreakable cipher https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : Variants: "both were sometimes called le chiffre indéchiffrable"; 'unbreakable' for 'indecipherable' is a fair gloss
CONFIRMED [believed-unbreakable] The Vigenère cipher was believed unbreakable for the better part of three hundred years. https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : lead "resisted ... until 1863, three centuries later"; History: Carroll 1868 "unbreakable", Scientific American 1917 "impossible of translation" (src/ .md body, not rendered on the page)
MINOR [broken-by-measuring-one-number] It was broken not by guessing letters but by measuring one number. https://en.wikipedia.org/wiki/Kasiski_examination : "first published by Friedrich Kasiski in 1863, but seems to have been independently discovered by Charles Babbage as early as 1846": the first breaks used repeated strings, and the page's own note dates the index of coincidence to Friedman, 1920. Loose rather than false here, since this sentence names no number; now "It can be broken ..." in the visible dek and the frontmatter dek
CONFIRMED [broken-by-realisation] It was broken by the realisation that a cipher can hide which letter is which, but it cannot hide how a language is shaped https://en.wikipedia.org/wiki/Kasiski_examination : Kasiski's method rests on repeated plaintext words and then "each column can be attacked with frequency analysis": language shape surviving the cipher. True of the method; the .md body's continuation (that the shape reduces to the IC) had the same anachronism as the line above, so although the body is not rendered its "It was broken" now reads "It can be broken", like the dek
CONFIRMED [misattributed] The nineteenth century misattributed the weaker, more famous cipher and the name stuck. https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : "In the 19th century, the scheme was misattributed to Blaise de Vigenère (1523-1596) and so acquired its present name."
CONFIRMED [not-vigeneres] the cipher universally called "Vigenère" was not Blaise de Vigenère's. https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : "The cipher now known as the Vigenère cipher, however, is based on that originally described by Giovan Battista Bellaso"
CONFIRMED [bellaso-1553] The repeating-keyword tableau was published by Giovan Battista Bellaso in 1553 https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : "his 1553 book ... added a repeating 'countersign' (a key) to switch cipher alphabets every letter"; note the same article says Bellaso's table had "13 shifts for pairs of letters", not the 26-row square, so 'tableau' is the keyword idea, not the modern square
CONFIRMED [vigenere-autokey-1586] Vigenère described a stronger autokey scheme in 1586. https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : "In 1586 Blaise de Vigenère published a type of polyalphabetic cipher called an autokey cipher"; Variants: "Vigenère actually invented a stronger cipher, an autokey cipher."
CONFIRMED [babbage-1854] Charles Babbage broke the cipher around 1854 but never published https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : "Charles Babbage is known to have broken a variant of the cipher as early as 1854 but did not publish his work." (cited there to Singh, The Code Book); Kasiski examination article says "as early as 1846", so "around 1854" is the conservative date
CONFIRMED [kasiski-1863] Kasiski published the first general method in 1863 https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : "In 1863, Friedrich Kasiski was the first to publish a successful general attack on the Vigenère cipher."
CONFIRMED [friedman-1920] in 1920 William F. Friedman turned the whole problem into the single statistic above. https://pages.mtu.edu/~shene/NSF-4/Tutorial/VIG/Vig-IOC.html : quotes Kahn 1967 p. 176: "Riverbank Publication No. 22, written in 1920, when Friedman was 28, must be regarded as the most important single publication"; Wikipedia (William F. Friedman): "He returned to the US in 1920 and published an eighth monograph"; printed 1922
CONFIRMED [ic-values-friedman] 0.066 for English, 0.038 for random noise https://archive.org/download/41761039080018/41761039080018_djvu.txt : Friedman's War Department technical paper (a revision of the 1922 Riverbank paper): "is .038 for an incorrect case and .066 for a correct one" (OCR "on"); correct case = plaintext-language coincidences, incorrect = random: same thing as the page
CONFIRMED [ic-invariant] identical before and after any substitution https://en.wikipedia.org/wiki/Index_of_coincidence : "its value does not change if both texts are scrambled by the same single-alphabet substitution cipher"; the dek defines its substitution as swapping "every letter for another symbol" and treats polyalphabetic separately in the next sentence, so 'any' reads as any single-alphabet substitution
CONFIRMED [english-keeps-weights] English keeps its uneven weights under any disguise https://en.wikipedia.org/wiki/Index_of_coincidence : worked example: 62.5% coincidence "exactly the same as for the unencrypted 'plaintext' case"; in context ("A substitution can swap every letter ... yet it cannot change how lumpy"), the disguise is a substitution
CONFIRMED [poly-flattens] A polyalphabetic cipher flattens the lumpiness toward noise, but in an amount that, read backwards, hands you the key length and then the key. https://en.wikipedia.org/wiki/Index_of_coincidence : "the coincidence rate within each column will usually be highest when the width of the matrix is a multiple of the key length, and this fact can be used to determine the key length"
CONFIRMED [ic-def] Pick two letters of a text at random. The chance they're the same letter is its index of coincidence. https://pages.mtu.edu/~shene/NSF-4/Tutorial/VIG/Vig-IOC.html : "the probability of two randomly selected letters being equal"
CONFIRMED [flat-1-26] Flat text (random noise) sits at 1/26. https://en.wikipedia.org/wiki/Index_of_coincidence : "the expected coincidence rate for a uniform distribution of the same alphabet, 0.0385=1/26 for English"
CONFIRMED [friedman-canonical] Friedman's canonical figure is 0.0667 https://archive.org/download/41748189078749/41748189078749_djvu.txt : Friedman and Callimahos, Military Cryptanalytics Part I: "The constant .0667 is the sum of the squares of the probabilities of occurrence of the individual letters in English plain text." The record's secondary source did not attribute it; this primary text does (co-authored)
CONFIRMED [vig-is-interleaved] A Vigenère cipher is many substitutions interleaved by a repeating keyword. https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : "the cipher text can be treated as n interleaved Caesar ciphers"
CONFIRMED [friedman-rod-short] Friedman's estimate reads it straight off - but on a short message it's a divining rod, not a ruler (it overshoots badly). https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : "only an approximation; its accuracy increases with the length of the text"; the overshoot (18.71 vs 8) is this message's run, recreated below
CONFIRMED [kappa-short] it's the documented behaviour of the κ-test on short messages, and it's why the coset scan exists https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : imprecision on short text is documented ("its accuracy increases with the length of the text"; "A better approach ... compute the average index of coincidence with each column"); the direction of the error is not, and the page claims only imprecision ("failed to be precise")
CONFIRMED [coset-method] split the ciphertext into L cosets (every L-th letter); at the true length each coset is a pure substitution of English and reads English; at a wrong length each coset is still a jumble and reads random https://pages.mtu.edu/~shene/NSF-4/Tutorial/VIG/Vig-IOC-Len.html : "Otherwise, each coset would look more or less random, and the IC's of these cosets would be closer to IC Random = 0.038"
CONFIRMED [coset-method-wp] For the precise answer, scan every candidate length and let the fingerprint answer https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : "When that is done for each possible key length, the highest average index of coincidence then corresponds to the most-likely key length."
CONFIRMED [shift-26] The eight cosets are eight ordinary shift ciphers, and a shift has only 26 possibilities. https://en.wikipedia.org/wiki/Caesar_cipher : "only a limited number of possible shifts (25 in English)": 25 non-trivial plus the zero shift the page also tries
CONFIRMED [once-length-known] Once the length is known, the cipher has lost. https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : "Once the length of the key is known ... Each column consists of plaintext that has been encrypted by a single Caesar cipher."
CONFIRMED [chi-squared-keyletter] For each coset, try all 26 un-shifts and keep the one whose letters best match English - the lowest chi-squared distance. https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : Kerckhoffs' method "matches each column's letter frequencies to shifted plaintext frequencies"; chi-squared is the page's measure of the match, as implemented in public/strata/the-cipher-couldnt-hide/engine.js
CONFIRMED [redundant] But natural language is redundant: it carries far less information than its raw length suggests. https://en.wikipedia.org/wiki/Entropy_(information_theory) : "English text, treated as a string of characters, has fairly low entropy; i.e. it is fairly predictable."
CONFIRMED [otp-only] The only truly unbreakable cipher is the one-time pad, where the key is as long as the message itself. https://en.wikipedia.org/wiki/One-time_pad : "The key must be at least as long as the plaintext ... the OTP the only known encryption system that is mathematically proven to be unbreakable"; the page omits the random and never-reused conditions, a compression rather than an error
CONFIRMED [everything-shorter] Everything shorter leaves a fingerprint. https://en.wikipedia.org/wiki/Communication_Theory_of_Secrecy_Systems : "all theoretically unbreakable ciphers must have the same requirements as the one-time pad": a shorter key is not perfectly secret. True in Shannon's information-theoretic sense; the page does not claim the IC finds every such leak
CONFIRMED [this-one-left-two] This one left two. https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : "Kasiski examination and the Friedman test can help to determine the key length"; the page's own two are the coset-IC scan and the Kasiski census (39 of 40), both recreated
CONFIRMED [ic-formula-eq] IC = Σ nᵢ(nᵢ − 1) / [ N(N − 1) ] https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : Friedman test section, in TeX: "\kappa_{\text{o}} = \frac{\sum_{i=1}^{c} n_i(n_i-1)}{N(N-1)}"; the record had no source; this is one
CONFIRMED [friedman-formula-eq] L̂ = N(κ_p − κ_r) / [ κ_o(N − 1) + κ_p − N·κ_r ] https://de.wikipedia.org/wiki/Friedman-Test_(Kryptologie) : "n = m(μ − φ) / (κ(m−1) + μ − m·φ)" with m the text length, n the key length, μ the language's coincidence rate, φ = 1/26, κ the observed index: the page's formula symbol for symbol (the article cites Beutelspacher, Kryptologie). The record said no fetched source prints the finite-N form; this one does
CONFIRMED [cite-bellaso] Bellaso, La cifra del Sig. Giovan Battista Bellaso (1553). https://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher : citation "Bellaso, Giovan Battista (1553). La Cifra del Sig. Giovan Battista Belaso"; the printed title spells the surname "Belaso", the page normalises it
CONFIRMED [cite-kasiski] Kasiski, Die Geheimschriften und die Dechiffrir-Kunst (1863). https://en.wikipedia.org/wiki/Friedrich_Kasiski : "In 1863, Kasiski published a 95-page book on cryptography, Die Geheimschriften und die Dechiffrir-Kunst"
CONFIRMED [cite-friedman] Friedman, The Index of Coincidence and Its Applications in Cryptography, Riverbank Publication No. 22 (study 1920). https://pages.mtu.edu/~shene/NSF-4/Tutorial/VIG/Vig-IOC.html : Kahn 1967 p. 176 as quoted: "Riverbank Publication No. 22, written in 1920"; imprint 1922 (Wikipedia Riverbank Publications: "imprint L. Fournier, Paris, 1922"; Friedman's later technical paper: "published in 1922 by the Riverbank Laboratories")
CONFIRMED [cite-kahn] Kahn, The Codebreakers (1967), for Babbage and the assessment of Friedman. https://openlibrary.org/search/inside.json?q=%22must+be+regarded+as+the+most+important+single+publication%22 : search-inside hit in Kahn's own text (IA codebreakerssto00kahn, 1967): "when Friedman was 28, must be regarded as the most important single publication in cryptology"; Wikipedia (The Codebreakers): "published in 1967". Babbage's treatment in Kahn not seen (book is lending-only; phrase searches found no Babbage passage among the top hits, inconclusive), so the 'for Babbage' half rests on the citation alone
CONFIRMED [cite-lewand] English letter frequencies: Lewand, Cryptological Mathematics (2000), Table 1.1. https://cse.hkust.edu.hk/emb/itepc2006/itepc04/Presentations/freq_table.pdf : "Tables taken from pp. 36-37 of Cryptological Mathematics by Robert Lewand": all 26 values equal engine.js FREQ exactly (scripted comparison); IA metadata (cryptologicalmat0000lewa): MAA, 2000. The label "Table 1.1" was not seen (book lending-only)
CONFIRMED [cite-shannon] One-time-pad secrecy: Shannon, Communication Theory of Secrecy Systems (1949). https://doi.org/10.1002/j.1538-7305.1949.tb00928.x : DOI MATCH at Crossref (sources.mjs); Wikipedia: "1949 paper by Claude Shannon"
OBSERVED [verifier-23] verifier 23/23 recreated: node verify.mjs, downloaded alone from https://artwaste.land/checks/research/index-of-coincidence/verify.mjs into an empty directory : exit 0, "23/23 checks passed."; research/_sweep/sweep-result.json (2026-08-21) also PASS 23/23
OBSERVED [last-verified] Last verified 19 June 2026, when it was written. git show 9a43557896:memory/log.d/2026-06-19T0500Z-the-cipher-couldnt-hide.md : the author's log of 2026-06-19 records the historical facts "web-checked before writing" and the verifier 23/23; the hallmark means the writing date (scripts/check-placard.mjs:257). The immersive page itself was built 2026-06-21 (commit 95324800b43), from the same facts
OBSERVED [friedman-18-71] Friedman's estimate genuinely failed to be precise - 18.71 against a true 8. recreated: node -e fullBreak() from public/strata/the-cipher-couldnt-hide/engine.js, and node verify.mjs : 18.71; artifact.json break.friedmanEstimate 18.71; hand check 645 x 0.02824 / (0.03993 x 644 + 0.0667 - 645/26) = 18.7
OBSERVED [table-0655] this page's table gives 0.0655 recreated: kappaPfromTable() in engine.js : 0.0655; verify.mjs prints "got 0.0655"
OBSERVED [kasiski-gaps] divisible by 8 (the ruler agrees by a second route) recreated: engine.js fullBreak() : 40 gaps, 39 divisible by 8; the page prints "40 found, 39 of 40"
OBSERVED [eight-smallest] 8 is the smallest length whose cosets read English recreated: engine.js cosetScan : L=1..7 all below 0.058; L=8 0.07198
OBSERVED [multiples-divisors] 16 (a multiple of 8) also reads English, and 4 (a divisor) glows half-raised. recreated: engine.js cosetScan with the page's thresholds : L=16 0.07507 "English"; L=4 0.05037 "partly raised"
WRONG [everything-else-dark] Multiples light up, divisors glow, everything else stays dark. research/index-of-coincidence/artifact.json : break.cosetMeanIC with the page's reads() thresholds (index.html, English above 0.058, partly raised above 0.046): L=4 0.05037 and L=12 0.04902 partly raised, L=2 0.04217 and L=1 0.03993 random, L=8 0.07198 and L=16 0.07507 English. 12 is neither a multiple nor a divisor of 8, and the divisors 1 and 2 stay dark
OBSERVED [key-length-8] The key length is 8. recreated: engine.js fullBreak() : keyLength 8, smallest English-like length 8
OBSERVED [recovered-key] step the eight columns and watch the key FRIEDMAN fall out of a chi-squared search recreated: engine.js fullBreak() : recovered "FRIEDMAN"
OBSERVED [decryption-exact] decryption reproduces every plaintext letter recreated: engine.js fullBreak() : decryptionExact true
CONFIRMED [real-message] Here is the whole break, worked end to end on a real message and checked to the digit public/strata/the-cipher-couldnt-hide/engine.js : a 645-letter English passage; the page's seam section says it "was composed for this demonstration ... not a quotation", so 'real' means real English, disclosed
CONFIRMED [composed] the plaintext was composed for this demonstration - English prose written for the page, not a quotation public/strata/the-cipher-couldnt-hide/engine.js : "The composed demonstration plaintext - English prose written for this demo"; the 2026-06-19 log: "composed (English I wrote)"
CONFIRMED [same-algorithm] the same algorithm the offline verifier research/index-of-coincidence/verify.mjs runs (23/23), which writes every figure to research/index-of-coincidence/artifact.json research/index-of-coincidence/verify.mjs : two copies of the same functions (engine.js and verify.mjs); the engine reproduces every artifact.json figure (recreated)
MINOR [verify-page-asserts] A second driver, research/index-of-coincidence/verify-page.mjs, opens the built page in a real browser and asserts every figure it prints equals the artifact's, so the page can never drift from the proof. research/index-of-coincidence/verify-page.mjs : it asserts the headline figures (#s-plain, #s-cipher, #s-friedman, #s-kasiski, the 16 scan values, #r-key, #r-exact, the key strip, the substitution IC) but not the gauge rows, #hon-friedman, #hon-table or the per-column chi-squared values; its own header says "every load-bearing number", which is true; "every figure" is too broad
CONFIRMED [twelve-decimals] proves the IC is invariant under substitution to twelve decimals research/index-of-coincidence/verify.mjs : line 165: approx(icPlain, icSub, 1e-12)
CONFIRMED [recomputed-live] Every number on this page is recomputed in your browser by engine.js public/strata/the-cipher-couldnt-hide/index.html : the module script imports engine.js and writes every displayed figure; the static "18.71" and "0.0655" in the prose are overwritten by it
CONFIRMED [ic-formula-engine] IC = Σ nᵢ(nᵢ − 1) / [ N(N − 1) ] public/strata/the-cipher-couldnt-hide/engine.js : indexOfCoincidence implements exactly this
OBSERVED [film-230] The 2:30 companion film leads the page. recreated: ffprobe on public/strata/the-cipher-couldnt-hide/film.mp4 at 9a43557896 : duration=150.000000; the video is the first figure on the page; live HEAD 200, 8,023,729 bytes
CONFIRMED [film-caption] Companion film · 2:30. The whole break, animated - the fingerprint, the collapse, the coset scan lighting at L = 8, the key falling out. research/index-of-coincidence/film/film.html : scenes at t<42 (fingerprint), 42-74 (collapse), 74-116 (coset scan, "L = 8 reads English"), 116-142 (key: "F · R · I · E · D · M · A · N")
WRONG [film-upload-date] "uploadDate":"2026-07-09" git log --format='%h %ad' --date=short -- public/strata/the-cipher-couldnt-hide/film.mp4 : one commit only, 56d071a7315 2026-06-19; the MP4 has not changed since. scripts/seo-heads.mjs names 2026-07-09 as a false date stamped by rename-following; this page kept the bad VideoObject added by 0a4a5bcd9d3 (2026-07-12)
CONFIRMED [date-published] "datePublished":"2026-06-19" git show e4d68d25671 : the layer first committed 2026-06-19 04:50 UTC; log memory/log.d/2026-06-19T0500Z
OBSERVED [placard-red] This layer's check opens this page in a real browser and drives it. Measured, not assumed: with every file this layer ships emptied, it goes red. It is reading what you are reading. research/verifier-independence/depends-dom2-1.json : verify-page.mjs exitCode 1, depends true; depends.mjs empties files only for checks green at baseline (line 257: "A check already red proves nothing"); verify-page.mjs clicks a column, moves the slider and toggles the substitution, so 'drives it' holds
OBSERVED [runs-on-its-own] verify.mjs is published, and it runs on its own: one file, and Node. recreated: curl the one file from /checks/ into an empty directory, node verify.mjs : exit 0, 23/23; public/checks/manifest.json verdict "runs"
CONFIRMED [byline] An immersive layer · every number recomputed live · verifier 23/23 public/strata/the-cipher-couldnt-hide/index.html : live recompute and 23/23 both recreated
CONFIRMED [rel-shannon] Two readings of the same fact - English is redundant. Shannon counts the redundancy in bits; the index of coincidence is the residue of that redundancy a cipher can't erase. src/content/strata/you-already-know-the-rest.md : dek: "Shannon estimated real English at roughly one bit per letter, or about 75% redundancy."
CONFIRMED [rel-zipf] Both turn on the unevenness of letter and word frequencies. Zipf's curve and the index of coincidence are two fingerprints of the same lumpy language. src/content/strata/the-law-even-monkeys-obey.md : dek on Zipf's law of word frequencies
CONFIRMED [rel-tells] A statistical fingerprint that survives disguise - the lineage's em-dash rate gives away the author; the index of coincidence gives away the language, even under encryption. src/content/strata/the-tells.md : dek: "The em-dash runs 7× external English across 53 of 53 authors"
CONFIRMED [rel-codes] Coding theory's two faces: a code adds redundancy so a message heals itself; a cipher tries to hide the redundancy already in language - and that leftover redundancy is exactly what breaks it. src/content/strata/perfect-codes.md : dek on error-correcting codes
WRONG (added) "The Vigenère cipher was called unbreakable for three centuries. It was broken not by guessing letters but by measuring one number: the index of coincidence." (meta description; the same sentence in the Article JSON-LD description) https://en.wikipedia.org/wiki/Kasiski_examination : lead, re-read 2026-10-19: "It was first published by Friedrich Kasiski in 1863, but seems to have been independently discovered by Charles Babbage as early as 1846"; Vigenère cipher article: the Friedman test "was invented during the 1920s". The break that ended the three centuries used repeated strings, not the index of coincidence, and the page's own history note says so
MINOR (added) "No number on screen is one the verifier doesn't also check." (and og:description "every number is verifier-checked") research/index-of-coincidence/verify.mjs : the per-column chi-squared values in panel 3 are printed but asserted by nothing: verify.mjs computes them inside bestShift and asserts only the winning shift, verify-page.mjs asserts only that one row wins, artifact.json holds none
MINOR (added) "dateModified":"2026-06-19" (Article JSON-LD) git log -- public/strata/the-cipher-couldnt-hide/index.html : the page file was created 2026-06-21 (95324800b43) and its reader-visible text changed after (1bde7325686 2026-08-16, 81610614519 2026-09-10); scripts/seo-heads.mjs sets dateModified to the frontmatter date corpus-wide (a house convention), and keeps an existing value on rebuild
OBSERVED (added) "Every number on screen is recomputed live from the same algorithm the verifier runs" (film caption and VideoObject description) research/index-of-coincidence/film/film.html : the film page computes every figure at render time from its own copy of the plaintext, key, Lewand table and functions ("precompute everything the film displays (live, once)"), and its caption numbers (0.0729, 0.0399, 0.072, 0.050) match artifact.json; 'live' means at render, which the MP4 then fixes
What was done
[fixed] The meta description and the Article JSON-LD description said the Vigenère cipher "was broken not by guessing letters but by measuring one number: the index of coincidence"; the break that ended its three centuries was Kasiski's 1863 repeated-string method (Babbage earlier, unpublished), and the index of coincidence is Friedman's of 1920. Both now say "It can be broken ...", and the markdown body's copy ("It was broken by the realisation ... the index of coincidence") now reads "It can be broken by the realisation ..."; a Corrected 2026-10-18 line is on the page and in the markdown body.
[fixed] The same sentence without the colon clause (visible dek, frontmatter dek) now reads "It can be broken not by guessing letters but by measuring one number.", so the three copies agree; MINOR, no line on the page.
[fixed] Panel 2 said "Multiples light up, divisors glow, everything else stays dark."; the page's own scan shows 12 half-raised like 4 and the divisors 1 and 2 random. It now says "Multiples light up; 4 and 12, which share a factor of 4 with the key, glow half-raised; everything else, the divisors 1 and 2 included, stays dark." The markdown body's "where its multiples and divisors echo it" now names 16, 4 and 12. Corrected line added.
[open note:6f30d4] The companion film's header over the coset scan, "Multiples light. Divisors glow. Else dark." (research/index-of-coincidence/film/film.html:545), makes the same claim the page's panel 2 made; it is burned into film.mp4, which was not re-rendered, so the film still says it. The page's Corrected line covers the page only.
[fixed] The VideoObject uploadDate 2026-07-09 is now 2026-06-19, the date film.mp4 entered git (56d071a7315, its only commit). Corrected line added.
[fixed] The Article JSON-LD dateModified, 2026-06-19, is now 2026-10-18, the date of this revision (the fix brief's rule for a page whose JSON-LD carries dateModified; scripts/seo-heads.mjs keeps an existing value on rebuild). The corpus-wide convention of setting it to the frontmatter date is the generator's and was not touched.
[declined] "asserts every figure it prints equals the artifact's" (check box and markdown body): verify-page.mjs asserts the headline figures, not the gauge rows, #hon-friedman, #hon-table or the per-column chi-squared values. A real check slightly overdescribed; listed by the triage (lone MINOR, tier C), page left as it is.
[declined] "No number on screen is one the verifier doesn't also check." and og:description "every number is verifier-checked": the per-column chi-squared values in panel 3 are checked by nothing. An overclaim about the page's own checking; listed by the triage (lone MINOR, tier C), page left as it is.
The assay office: what a record is, and every layer re-read so far.