A cognitive architecture of the dual route.
OMEGA began as a French Hangman engine — a demanding testbed for one idea : a machine that reasons about language (phonology, spelling, morphology) instead of consulting an oracle. The dyslexia corrector is its applied offshoot.
The doctrine : measure or reject
A single rule governs the project : nothing is kept without measurement. Every module is off by default, and the baseline stays byte-identical until a gain is proven. Appealing ideas that don't survive measurement are falsified and documented — not buried.
« Cognition > oracle » : the value is in the reasoning, not in cheating. The reference configuration never reads the hidden word.
The decision isn't an argmax but a probabilistic joint : it marginalizes over latent hypotheses — Σφ P(φ|clue)·P(letter|φ,context) — instead of betting on the most likely one. It cross-references; it doesn't guess.
The testbed : Hangman
Guessing a French word letter by letter, under constraint, is a severe test of a language model : it must integrate spelling structure, neighbors, phonotactics. The fully cheat-free configuration (which never reads the hidden word — neither its letters nor its sound : a « board-derived » cohort) reaches ≈ 97.3 % of games won in-lexicon; the oracle ceiling (which does cheat) sits at 98.7 %.
Harsher still : the out-of-lexicon case (a word never seen, Trexquant-style). And here we say where the score comes from, because that's the project's thesis — distinguishing cognition from statistical consultation : cognition alone does not generalize sub-lexically (≈ 11 %), pure spelling tops out at ≈ 33 %. What carries the out-of-lexicon case is an n-gram aggregation path — statistical but cheat-free (positional letter structure pre-computed from the lexicon, never the hidden word) — at ~62 %, which gap-aware reasoning (nearest revealed neighbor) pushes to ≈ 64 % (stable across 3 seeds). On the same words, this system beats a naive n-gram baseline (46.7 %) by +17 points — that's where the method's added value lies — within the band of good solvers (65-68 %), in a single HTML file, no training, no GPU.
When OMEGA evolves
Beyond playing, OMEGA can copy itself, vary and be selected by Hangman itself : a Darwinian loop on a cognitive engine. It reconstructs its own decision code — the copy is verified byte for byte, and Hangman replays identically — then a variation modifies it, and the game's fitness keeps the best.
Two directions further, now tested — and honesty comes before effect :
- Group work (O1) — negative, owned. Making several versions cooperate does not beat the best one alone : real versions are strong and too similar (all ~97 % in-lexicon, disagreement ≤ 10 %), and the useful routing is already the engine's internal arbitration. External coordination is subsumed by the architecture.
- Multi-task measurement (O2) — positive, and revealing. Measuring in-lexicon Hangman alone is blind : in-lexicon and out-of-lexicon dissociate (a genome that's a Hangman champion can be catastrophic at generalization). And that leads to a deeper question — right below.
And if we take it out of French ? The core is a compressor.
The real O2 question : what carries OMEGA out-of-lexicon — is it French, or a general mechanism ? We pointed its substrate (the n-gram aggregation) at code — without the French lexicon — and measured compression. Because to predict is to compress (Shannon) : compression tells us, in bits per character, how much structure a model captures.
| domain | chance | n-gram substrate | structure captured |
|---|---|---|---|
| French | 3.98 b/char | 2.97 b/char | −1.01 b |
| Code (identifiers, without Lex4) | 4.17 b/char | 3.05 b/char | −1.12 b |
| Code, scrambled (structure destroyed) | 4.17 b/char | 4.41 b/char | +0.24 b — nothing |
It compresses code just as well — a little better even — as French, and gains nothing when the sequence is scrambled. → OMEGA's transferable core is a compressor of structured sequences, domain-agnostic : it works wherever there is structure, not only in French. Powerful and general — but this is structure capture, not understanding (that would be an LLM, another project).
Measured in two independent ways, same verdict : Hangman-style reconstruction (evo_o2_crossdomain.js) and compression in bits (evo_o2_compression.js).
What about meaning, then ? We tried — and here's the frontier.
A compressor captures form, never meaning. Can we add a taste of it ? We tried distributional semantics (« meaning = the company a word keeps », Firth) to disambiguate homophones — the Golding & Roth 1999 method (prior × context, held-out, a real UD corpus). Context helps — especially grammatical homophones (son/sont 55→88 %, ce/se 53→76 %, et/est 60→77 %). But precision tops out at 77-88 %.
But the corrector has an absolute guard : FP=0 — never underline what is correct. At 77-88 % precision, it would raise too many false alarms. We swept the confidence threshold to find an FP-safe net :
| confidence threshold | recall | precision |
|---|---|---|
| ≥ 0.90 | 56 % | 91 % |
| ≥ 0.99 | 27 % | 96 % |
| FP = 0 (conf > 0.9999) | 1.6 % | 100 % |
No net : to reach FP=0, recall collapses to 1.6 % — the « meaning » signal is too noisy to pass the gatekeeper. Measured contrast : the lexical gender lever (clean) passes FP=0 naturally — it was wired in (+6 pts of recall); statistical meaning, on the other hand, is turned away. → understanding stays out of doctrine (that would be an LLM). OMEGA masters form; meaning is the frontier — owned and quantified.
A nuance — and its flip side (LanguageTool cross-check, 06/2026) : on the UD held-out, lexical homophones (père/paire, moi/mois) seemed to pass FP=0 (recall 18-62 %), where the grammatical ones failed. But against real text, the guard breaks : « il porte une paire de lunettes » (correct) gets flagged as « père ». UD didn't cover enough contexts → over-optimistic calibration. Hardened verdict : distributional meaning does not hold FP=0 in production — lexical included — so it isn't wired in. The only clean FP=0 lever remains the lexical-grammatical one (gender, agreement), never the distributional one.
The outcome (06/2026) : a green « vigilance » layer in the corrector — it doesn't assert an error (so it's outside FP=0), it flags confusable words (homophones + paronyms, ~80 groups) with their possibilities & their meanings. The distributional signal finally finds its place there : rank & soften, never decide — the noise that disqualified it for correcting is harmless for suggesting.
Measured : evo_o2_homophone_context.js (Golding&Roth disambiguation) · evo_o2_sense_fpzero.js (FP=0 sweep, grammatical) · evo_lt_confusion_fpzero.js (LanguageTool's 17 lexical pairs).
Replayable : evo/evo_o1_real.js · evo_o2_multitask.js · evo_o2_crossdomain.js · evo_o2_compression.js · plan : evo/EVO_ROADMAP.md.
But a mutation is only useful if you mutate the right level. Mutating the source code breaks almost everything — no improvement possible. Mutating the parameters opens a smooth landscape where 30 % of mutations are beneficial : that's evolvability (Wagner & Altenberg, 1996). Toggle :
Measured end-to-end : P1 copies itself (verified quine), P2 communicate (a code emerges from reward alone), P3 generations (a better version found, validated out-of-sample). Some figures at long lengths remain seed-dependent — kept as-is. Details : evo/EVO_ROADMAP.md, evo/EVO_P3_EVOLVABILITY.md.
The shared substrate : the dual route phono↔spelling
Hangman and corrector are the same machine pointed in two directions along the sound ↔ writing channel :
- The Hangman models
P(spelling)and completes the masked word — it encodes the structure. - The corrector inverts the noise on that same structure : from a corrupted surface, it recovers the intent — it decodes.
Each combines a lexical route (does the word exist ?) and a sublexical route (grapheme↔phoneme rules), arbitrated by their reliability — exactly the dual route of reading in humans.
From Hangman's defeats to dyslexia
The key finding : Hangman's defeat profile resembles a dyslexic signature — it mostly fails on voiced / voiceless confusions (p/b, t/d…), exactly the kind of phonological error at the heart of dyslexia. When the engine loses, it loses like a dyslexic reader.
Hence the diagnostic dictation sub-project, then the dyslexia corrector : the engine that models the error channel becomes the tool that corrects it.
The outcome : the dyslexia corrector
Detecting and correcting without an answer key, in context, with one cardinal guard : zero false positives. A recent result illustrates the method — the « §3 » guard : where a flat rule read a hard grammatical tag (and often a wrong one : « faute » tagged as a verb when 99 % of its uses are nouns), a frequency posterior P(category|form) decides correctly — recovering valid corrections and lowering false alarms at once.
Analyzing the nature of each word — in sequence. The per-word posterior doesn't resolve everything : « la porte » (noun) and « il porte » (verb) share the same form. On top comes a part-of-speech tagger — bigram HMM + Viterbi decoding, trained on Universal Dependencies — which reads the whole sentence to give each word its nature (≈ 95 % accuracy on held-out test). It's what enables agreement and homophone decisions in context rather than on the isolated word : the first gated use is son/sont settled by a true noun-subject, at FP=0. Like everything else, it runs identically in the three engines (Python = app = extension) — parity locked in CI (parity_pos.js).
Re-validation on a corpus of real errors (WiCoPaCo, ~45,000 real mistakes). Correct text isn't enough to prove zero false positives : some only surface on structures a clean corpus lacks (coordination of proper nouns, distant subject, noun/possessive homograph). On real errors, the campaign flushed out 3 invisible false positives — « On dit »→ont, « à durée limitée »→a, « un son »→sa — fixed, and opened four FP-safe recall levers : singular noun agreement, past-participle agreement after être with a noun subject, -er/-é/-ez endings, and attributive adjective agreement — the adjective-gender lever once set aside « for lack of a tagger », reopened and held at FP=0 (60 false positives in the prototype → 1, via POS-tagger + lexical gender + number read off the article + exclusion of invariants/coordinations). The lesson : proving zero false positives requires, after clean text, a corpus of real errors.
Tested against a REAL dyslexia corpus (78 texts from a dyslexic teenager and dys-dysorthographic adults; Bodard 2020 analysis). It reframes the priorities : dys errors are ≈43 % phonetic (and 59 % have the same phonetics as the correct form) → the phonetic channel is lever #1 (measured : our hand-made key already matches 87 % of dys errors); ≈38 % grammatical → the agreement campaign aims true; ≈6 % segmentation → a new elision-merge lever (« lhopital »→l'hôpital). A methodological lesson : the « modest » contribution of phonetics measured on mainstream text (Wikipedia) was a corpus artefact — on real dys writing, it's the central lever.
Quantified at scale, locked in CI. « FP=0 » isn't a slogan : it's 0 on the test battery, and on 2,500 correct encyclopedic sentences (outside the battery) the false-alarm rate is measured at 2.04 % — down from 4.7 %, and automatically locked (fp_scale_probe.py, CI breaks above 3 %); on dys writing, lower still. The downside is owned and quantified, not hidden : at this setting the corrector catches only part of the errors it targets (recall ~41 % on a multi-error dys bench, messy_probe.js) — and most of the misses are deliberate abstentions. That's the price of zero false positives : chosen, not suffered.
A wall falls : « real-word » agreement via Hangman's arbitration. The hardest error is the one where the word is already valid, only mis-agreed : « les enfants joue », « les rapports que l'entreprise livrera ». The literature calls it the central problem of the corrector (Wilcox-O'Hearn, 2014) : to settle it you must recover the subject, often out of reach (« de N » complements, distant subject, coordination). Our agreement parser abstains there — which is exactly what holds its zero false positives. Measured : no subject cue alone clears this wall (the best cue tops out at 81 %), and naive combinations — adding, multiplying the cues — go haywire (two cues out of three loop endlessly on « the word is correct »). What cracked it was Hangman's arbitration machinery itself : blending the subject cues, weighting them by their reliability — the same law μ = r/(1+r) that makes OMEGA play at oracle level — a small language model carrying the confidence that makes the sorting useful. On the cases the parser gives up, this arbitration recovers the subject's number at ~94–97 %. Shipped as vigilance (it suggests « to check », never rewrites : zero false positives stays intact), identically in the three engines. Validated on our real dys corpus : on the chat register, 0 % false alarms — and real catches in the wild (« des haies qui délimite »→délimitent). The same referee that wins at Hangman has just brought down a barrier of French thought to be out of reach for so light a tool — no big model, in a browser tab.
And part of that wall falls even in red : the subject isn't always right beside. The arbitration above lives in vigilance because, when the subject is just a neighboring noun, it can't be told apart from a complement for sure. But there's a family where the subject, absent from beside the verb, can still be recovered with certainty — and there, the correction becomes assertive again, at zero false positives. The principle : the subject can be read somewhere other than right in front. In « les chats mangent et dort », the sibling verb « mangent » carries the number of the shared subject; in « les enfants que je vois joue », the relative clause's antecedent carries it (likewise through « dont », « où »); in « les livres, malgré leur prix, reste chers », the subject and its verb are in the same clause, just split by an interjected phrase. Four screens, four rules — each anchored on an audible signal (the plural « les »/« des » you hear, where the verb's marking is silent) and guarded by a net that rules out false friends (noun-verb homographs, invariable colors, enumerations). Measured : 0 false positives on 2,500 correct sentences and on batteries of tricky traps (comparatives, complement clauses, « de N » complements). The frontier stays honest : the general complement-subject (« la couleur de la voiture ») remains on the vigilance side — but the structurally recoverable part of the wall is now corrected outright.
Sources : dys typology — Bodard 2020 (JEP-TALN-RÉCITAL), Plisson & Daigle 2013 (Dyslexia); « real-word » detection — Wilcox-O'Hearn 2014 (arXiv:1408.3153); corpora — WiCoPaCo (Max & Wisniewski 2010, LREC, GFDL), FFDys dys corpus / Dys ASEI platform (private, not redistributed); lexicon — Lexique (New et al. 2004); FP guard — Universal Dependencies French-GSD (CC BY-SA). Full details : report §18.5.
The corrector's web : everything is interconnected
The corrector isn't a stack of rules : it's a network. Every rule draws on lexicons, on engines (POS tagger, speller, subject referee) and on context signals (audible determiner, non-adjacent subject, punctuation) to decide between red — a sure correction, zero false positives — and orange — vigilance, when doubt remains. Hover a node to light up its threads.
Open the web full-screen ↗ — 36 nodes, 7 families; drag-and-drop to rearrange, filter by family.
What we tried… and rejected
The honesty of negative results is part of the method. Measured, then set aside :
- a light learned « cognitive C », then a heavy transformer — at best on par with a simple heuristic, sometimes worse.
- sentence-level Hangman as a win lever — letter sharing leaks word endings.
- several corrector loosenings (edit-distance 2, relaxed guards…) — each reopened false positives, so not wired in.
Keeping track of what doesn't work avoids redoing it — and makes what does work credible.
A second offshoot : OMEGA·KEY — encrypted messaging
The same engine, pointed elsewhere : an end-to-end encrypted messenger fitting in a single HTML file, offline. OMEGA supplies the lexicon (pronounceable French passphrases); all the cryptography rests on the browser's standard WebCrypto — no home-made algorithm.
The chat. An Encrypted conversation card holds a thread of bubbles, with two transports : server-less — the ciphertext copies itself, you paste it to your correspondent; or via a minimal relay (self-hostable on Deno Deploy in ~2 min) that pushes messages in real time (SSE) and establishes the DH ratchet automatically (public-key exchange, no copy-paste) — the relay only ever sees ciphertext, and the security number detects an interception.
- Pronounceable FR passphrases — real words (12 bits/word) or pseudo-words (8 bits/syllable), entropy drawn from
crypto.getRandomValues, with no modulo bias (2ⁿ-sized lists, exact bit reading — verified). - Shared key — PBKDF2-SHA256 310,000 iterations → AES-256-GCM, a key fingerprint verifiable on both sides.
- Double Ratchet — ECDH P-256 → forward secrecy and post-compromise recovery.
- Per message — random 96-bit IV, integrity via the GCM tag. The relay (optional, self-hostable) never sees the plaintext.
⚠️ A demo, not a security product
Standard, well-used building blocks (WebCrypto, unique IVs, no Math.random in the keys), automated crypto tests in CI (entropy, round-trip, ratchet KAT), an anti-interception security number and an encrypted history at rest — but the protocol is still hand-assembled and has had no formal cryptographic audit. For real secrets, use Signal.
Good to know : the relay sees metadata (room, timing, sizes) · exchange the passphrase over a secure channel and compare the security number with your correspondent.
Going further
The background documents (dense, being updated) :
- Research memoir — architecture, method, results (and negative results).
- Reference report & user manual — configuration, route details.
- The code — everything is measurable and reproducible (
./dev.sh).
A note on honesty : the Hangman is a measurement bench, not a product. The product is the corrector. These two pages describe the project's real state, not a showcase.