Guide — how memo № 202 was made
The letterform that heals itself
HAMMING is a Bell-Labs-memo page where a message streams as live Hamming(7,4) codewords. Noise flips bits; three parity checks triangulate each wound; the corrupted glyph — lurched across the Recursive variable font's axes — snaps back healed. Its single job: make redundancy feel like armour, not overhead.
¶ 1Concept
Wave 9 is signal versus noise, and this site takes the error-correction link in the chain. The fiction is a 1950 technical memorandum that computes itself: the sentence THE MESSAGE REPAIRS ITSELF travels as twenty-six Hamming(7,4) codewords, one per glyph, under continuous synthetic noise. The audience is anyone who has heard “ECC memory” and never seen the arithmetic point at a wound. Nothing on the page is scripted theatre — every syndrome shown is computed from the received bits at that moment.
¶ 2Palette — argued from the 1950 memo
¶ 3Type — the corruption axis is the design
MONO 1 · CASL 0 · CRSV 0 · slnt 0 · wght 450 — a composed, typewriter-adjacent
voice that matches the memo.MONO 0 · CASL 1 · CRSV 1 · slnt −15 · wght 300 or 860–999. The noise doesn't
swap glyphs — it drags the letter across the variable axes, so damage and repair are
continuous, not a cut.¶ 4Techniques
Genuine Hamming(7,4). encode() places parity at positions
1·2·4 over data at 3·5·6·7; syndrome() XORs the three cover sets
(1·3·5·7, 2·3·6·7, 4·5·6·7) and reads the failing checks as a binary address;
decode() re-derives the nibble from the received bits. The displayed letter is
always decode() of the current codeword, so a data-bit flip really does print
the wrong letter (the message's sixteen-slot codebook maps nibbles to glyphs, thirteen
assigned, three spares that print as garble). QA drives all 16 codewords through all 7
single-bit flips — 112 cases — and asserts every syndrome equals the flipped position.
The signature choreography. A strike flips a bit in the SVG bit-lattice,
red-flags the cell, and tweens the glyph's font-variation-settings to the
corrupt pose over 650 ms with a back-overshoot ease. The parity inspector then runs the
three checks live at 360 ms intervals, stamps the syndrome, rings the located cell for
620 ms, flips the bit back, and eases the axes home over 820 ms. One rAF drives
all axis tweens; it pauses on document.hidden and every phase writes absolute
state so a throttled tab never desyncs.
Honest failure. One auto-strike in twelve is a double fault. The syndrome then genuinely points at a third, innocent bit; correction lands on a valid but wrong codeword; the exhibit compares against what was sent, stamps DOUBLE FAULT — SYNDROME MISLED, retransmits, and counts it separately in the ledger. Striking a queued codeword twice by hand reproduces it on demand.
Everything is measured. The ledger increments only on verified events —
located requires the computed syndrome to name the one genuinely flipped bit;
corrected requires the received word to equal the sent word again. A state probe
(window.__hamming) exposes struck/located/corrected, the live syndrome, the
service phase and per-block axes, so the QA harness gates on state, never wall-clock.
No raster anywhere. Bit-lattices and the parity Venn are inline SVG; the paper grain is a repeating CSS gradient; the wordmark's opening wound-and-heal is the same axis tween the exhibit uses.
¶ 5Iteration log
- Stat-card headlines (“4 / 7 ≈ 0.571”, “16 × 8 = 2⁷”) wrapped mid-equation at desktop widths — set nowrap and stepped the size down a notch.
- The history margin-note quoted the corruption slant as −12 while the code lurches to −15 — corrected the copy and retuned the note's own casual stroke to the same −15, so the number on the page is the number in the code.
- Codebook spare rows read “unassigned — garble” and wrapped to two ragged lines; shortened to “garble”.
- Ledger had dead space under the counters — filled it with the measured noise schedule (one strike every 4.3–5.7 s, one in twelve a double) instead of ornament.
- Found and fixed a real intake bug by driving the behaviour: the service machine
started synchronously inside
strike(), so the second flip of every double fault was refused — the signature failure mode could never occur. Deferred the intake one tick; the QA harness now produces and verifies a genuine miscorrection. - Second-read micro-interaction: rest the cursor on any idle block and the inspector audits it — three PASS checks and syndrome 000, so the calm state is inspectable, not just the crisis.
- Codebook rows highlight every block in the stream carrying that nibble on hover.
- Entrance: the wordmark's second M loads struck (red, casual, slanted) and heals over
1.4 s, gated on
fonts.ready— the whole thesis in the first breath.
- 375px: the 62px bit-lattice overhung its 44px block column; blocks are now a fixed 64px so the tape wraps cleanly — nav, wordmark and scrollWidth verified inside the viewport headlessly.
- Reduced motion: no auto-noise, no tweens — the page loads with one instantly-completed worked example (ledger 1/1/1, syndrome shown, residual 0) as the settled frame, and the two-frame hash check confirms it holds still.
- Chanel rule: removed the exhibit panel's offset drop-shadow — the memo sits flatter and truer to paper.
- Closed an unclosed
<div>in the noscript fallback; zero console errors across desktop, 375px and reduced-motion runs; rAF and the noise timer both stop while the tab is hidden.
¶ 6Measured at sign-off
Headless verification on the shipped build: 16/16 codewords encode clean (syndrome 0),
112/112 single-bit flips located at the exact flipped position, every injected strike healed
with struck = located = corrected in the ledger and residual 0, one injected double fault
owned and retransmitted, glyph axes back at
MONO 1 · CASL 0 · CRSV 0 · slnt 0 · wght 450 after service, zero console
errors on every run.