OMEGA-Ω
OMEGA is a small software "brain" that plays Hangman. Its distinctive feature: it is allowed to look at the letters already revealed, never the hidden word. So it has to guess like a human — by recognising words it has seen, by "sounding out" what it reads, by leaning on the shape of words. This document explains how it is built, what it can do (≈ 90 % wins cheat-free), what it cannot yet do, and how to use it. The "Plain" button top-left hides the technical tables; "Full" shows everything.
F***) have no button: they are flagged as such.0Methods & conventions
0.1 — Status of claims
Every load-bearing fact is labelled. The scientific value of the project rests on this strict separation:
- measured reproducible empirical result (paired headless run, fixed seeds), dated source.
- design settled architectural choice, not re-argued in this version.
- hypothesis interpretation or conjecture not yet settled by measurement.
- excluded deliberately outside the decision chain (gray cheating or crutch).
0.2 — Three metrics, not to be confused
| Metric | Definition | Role |
|---|---|---|
| Wins (win rate) | Fraction of games won. | Final metric — but not the project's arbiter. |
| Coverage | Fraction of positions correctly revealed before the end. | Finer, less noisy (a game can be lost with high coverage). |
| OS_diss | Dissonance between the direct circle and the mirror circle (RSA, 1−cosine). | Priority structural metric: the goal is self-regulation. |
0.3 — Measurement protocol
- Seeded and paired comparisons (same words, same seeds); A/B/C/D conditions.
- Typical N: 150–2000 games; 8 paired seeds for fine deltas (z statistic).
- Chained games, never reset between plays: learning is inter-game (principle L04). Measuring with a reset invalidates any cumulative mechanism measured (the "30 games × resets" measurement had skewed the evaluation of
F177). - Inertia OFF: a toggle is cleanly disconnectable if, switched off, the output is byte-identical to the baseline.
0.4 — Reproducibility caveat
Fixed in phase46 (Fix#1): the word picker and the bench helpers now go through a seeded omegaRand() → deterministic headless measurements (bit-for-bit repeatable). Only the intentional fallback to Math.random() remains when no seed is set (free interactive play). The "robust" figures come from the seeded paired headless protocols.
0.5 — Version note (read once)
phase47; base phase45 ≈ 9,574 lines) is the system described here. The bugs numbered B1/B3 and the correlation r=−0.153 come from v0.06 and motivated the rebuild; they are flagged as inherited wherever they appear.1Object & framing
OMEGA-Ω is a cognitive architecture that plays Hangman on a hyperdimensional-computing (HDC) substrate. The goal is not to maximise wins but to make the decision emerge (the choice of a letter) from brain-inspired mechanisms.
design Category distinction (internal ref. F169): a solver maximises wins by any means (n-grams, full dictionary); a cognitive architecture that plays Hangman demonstrates learning under impoverished constraints. OMEGA is the latter. Per F169, 30–40 % wins without a lexicon would already be a good result (the human cognitive limit on word prediction).
2Overview & performance
A self-contained web application (a single HTML file) bundling the cognitive engine, the French dictionary and the measurement dashboard. The v0.07 rebuild was motivated by the separation of the spelling/phonology substrates: their cross-contamination made the routes degenerate — an unintended reproduction of surface-dyslexia errors (Plaut & Shallice 1993).
Two reading routes (the written and the sound) linked by a shared concept; two loops per route (one that perceives-decides, a "mirror" one that corrects-learns, the way sleep consolidates the day); and an arbiter (OS) that doses between the written and the sound and stops any source from "cheating" by imposing the answer.
2.1 — Performance: sourced figures
The rate depends on difficulty, configuration and horizon. Always state the regime.
| Regime | Wins | Avg err. | Cov. | Status / source |
|---|---|---|---|---|
| Pure-frequency baseline | ~22–23 % | ~5.5 | — | measured declare e2e 31/05, 150+150 |
| Cheat-free early v7 (hardened Hangman) | ~2.6 % | — | ~45–50 % | measured Blueprint v7 §1.3, 02/05, 200 chained games |
| Cheat-free — reference config (cognition) | ~90 % | ~2.5 | — | measured MESURE_FIX 31/05, paired headless, A1/A2 OFF (89.5±2.6 / 90.6±2.9) |
| Cheat-free + declare NEO (R + Assembled + Cohort) | 97.5 / 98.8 % | — | — | measured NEO 03/06 (§17), 4 seeds × 120, K=1 / K=3 |
| + declare (confidence 0.85) | ~97.7 % | ~1.7 | — | measured same, 31/05 |
| Recall — words already seen | 95.3 % | 1.33 | — | measured declare e2e, bench 400 |
| Never-seen word (clean assembled decoding) | 54.7 % | 4.45 | — | measured same |
| Full config with A2 excluded | ~95 % | — | — | measured REPRISE_MASTER — gray cheating |
| Cohort-oracle (full lexicon = A2 ceiling) | 98.7 % / 100 % | ~1.1 | — | measured declare e2e 31/05 (seen / new) |
w.p legitimate), 22 % in ortho only. Trexquant benchmarks (letters-only, no sound): ~50 % baseline, ~65-68 % good solvers. An honest reading: excellent in-lexicon; good out-of-lexicon via the phon→ortho concept (above good solvers, but while hearing the word); weak in pure ortho — sub-lexical OOV generalisation remains the weak spot (a morphology layer is to come)._neoWBL cache was not invalidated : the "removed" word stayed in the cohort; AUDIT_OMEGA §1.6.1). True measured figures : cognition alone ≈ 11 % (does not generalise sub-lexically), pure sub-lexical spelling ≈ 33 %, the aggregating n-gram route (statistical but cheat-free) ~57-66 %, + gap-aware reasoning → ≈ 64 % (re-verified, 3 seeds, SOTA band) ; +17 pts vs a naive n-gram (46.7 %). The "54.7 % / 70.7 %" cells that remain above and below are kept as a historical trace but obsolete. Detail : memoir docs/MEMOIRE.html §10, and evo/EVO_ROADMAP.md.2.2 — Founding principles (L01–L04)
- L01 — double Möbius design: two antagonistic circles (direct = perception→decision; mirror = result→correction) linked by the OS.
- L02 — functional invariance: concepts emerge above the substrate; the 12 concept cells of M3_d are learned (Hebbian), not hard-wired.
- L03 — OS as dialectical governor: keeps the tension between the two circles without letting either dominate (a construction specific to the project; neighbours: GAN, adversarial RL).
- L04 — inter-game learning: the mirror and the sound↔letter map persist across games; no reset.
2.3 — Four-level learning cascade (F139)
- Phonetic primitive (hard-wired): 14 articulatory features × 26 letters + an HRR ortho component (0.85 / 0.15).
- Emergence of a proto-language: 5 sub-brains of M1_d produce vocabulary.
- Sound↔letter map (
phonGraphMap[26][SDIM]): learned by playing (observation + consolidation). - Hangman: the testbed; decision = comparison of the internal state against the map (and/or the M5_d softmax).
3The task: Hangman (specification)
- Words: length ≥ 7 letters; lexicon 88,939 words (Lexique 4, ≥ 7 subset, upper-cased/deaccented).
- Start: 0 letters revealed ("hardened" Hangman).
- Budget: 6 errors.
- Legitimate information: revealed letters, length, tried letters, knowledge gained through experience.
- Illegitimate information: the hidden word — directly, or by enumerating the dictionary down to the single compatible word.
Hangman is chosen for its context poverty: the player must actively generate hypotheses (like "sounding out" an unknown word). A demanding and revealing testbed.
4Architecture
Two parallel columns, a conceptual bridge, an arbitration module.
- Orthographic route (
M*_d): revealed letters → feature → spatial pattern → concept → lexical candidates → decision. - Phonological route (
M*_phon): conversion into SAMPA phonemes (distinguishes é/è/an/on…), a second reading route (Coltheart 2001). - M_S hub (shared concept): an amodal crossroads, cross-modal auto-encoding (Rogers 2004; Patterson 2007) — enter through one modality, reconstruct the others.
- OS — arbitration module (L03): combines ortho + phon via
w(r) = −r/(1+r)(r= phon strength ÷ ortho strength), decides the letter, dilutes any signal pre-imposing an answer. PublishesOS_diss,OS_lect,OS_mod,OS_speed.
w(r) design: the form −r/(1+r) is a chosen dosing (monotone, bounded); its precise theoretical justification is not documented in the sources consulted — to be treated as a design parameter, not a derived result. measured Learning θ=(α,β) (🧬 Train θ, STATISTICS panel) converges toward α≈1.13, β≈0.65–0.72.4.1 — Structural layers
- Pipeline 0 (statistical priors): in v0.06, three modules
M_E(episodic memory),M_A(letter priors + reward shaping),M_P(pattern matching). measured Absent from the v0.07 build but absorbed: priors → theLETTER_FREQconstant; pattern →A2/computeLex4LetterScores; episodic ≈ the game itself. v0.07 consolidated, it did not lose. - Typed channels: ~32 channels (CONCEPT, VECTOR, EVENT, SCALAR) connect the modules; some cross-route links are dormant.
- Independent substrates: ortho 26D (identity), phon 26D one-hot + 14D features, cross-modal HRR hub — no derivation chain between substrates (a key v0.07 fix).
- Möbius loop (P1/P2) design: a designed closed circuit (P1 direct, P2 mirror, P1→P2→P1). Receiving the word in P2 is by design (simulation, Hesslow 2002), with the OS handling anti-cheat. In practice P2 and the extended mirror modules are disconnected (see §12).
Diagram — two routes, two loops, one arbiter
┌────────────────────────────┐
│ OS — arbitration module │
│ combines ortho + phon │
│ w(r) = -r / (1 + r) │
└────────┬──────────┬─────────┘
ortho decision │ │ phon decision
────────────────────── │ │ ──────────────────────
ORTHO ROUTE (M*_d) │ │ PHON ROUTE (M*_phon)
bottom-up↑ mirror↓ bottom-up↑ mirror↓
M5_d ──► M5_m (reward) M5_phon ─► M5_phon_m (reward)
▲ │ ▲ │
M4_d ◄┄ cross p ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ M4_phon ─► M4_phon_m effective
▲ (M4_PHON_USE_P) ▲ ┆
M3_d ◄─ written ─ M3_m (a-Hebb) M3_phon ┄► M3_phon_m observational
▲ (conceptCells) ▲
M2_d ──► M2_m M2_phon M2_phon_m absent
▲ │ ▲
M1_d ◄─ ≈0.1 ─ M1_m (letScore) M1_phon M1_phon_m absent
Ortho mirror = complete (5 stages) · phon mirror = truncated (M5→M4; M3 obs; M2/M1 absent).
5Modules M1–M5, loops, constants
5.1 — The five stages
| Stage | Ortho route (M*_d) | Phon route (M*_phon) | Role |
|---|---|---|---|
| M1 | proto-language, 5 sub-brains (LDIM=512) | articulatory substrate (40D) | raw perception + proto-vocabulary |
| M2 | 16 dimensional zones, "Mexican-hat" filtering | resonance (40D) | spatial shaping |
| M3 | 12 learned concept cells (SDIM=1024) | concept (1024D) | conceptual representation (M_S hub) |
| M4 | top-10 lexical candidates (70 % semantic + 30 % letter-frequency) | SAMPA candidates | plausible words/sounds |
| M5 | softmax decision, adaptive temperature (26) | decision (26) | per-letter vote |
Clarifications: the 16 zones of M2 are dimensional (compartments of the vector), not positional. The M5 temperature tunes exploration (clear gap → decisive choice; small gap → exploration).
5.2 — Two loops per route
- Bottom-up (M1→M5): perceives and decides; reads the word only at revealed positions (cap §43); never accesses hidden letters.
- Top-down (mirror, M5→M1): receives the result, adjusts the weights; teaches, does not decide.
Mirror wiring. Ortho complete: M5_m (reward) → M4_m (letterPenalty) → M3_m (anti-Hebbian, writes conceptCells) → M2_m (zonePenalty) → M1_m (letterScore). M3 shares its weights (the only stage where the mirror writes); M4/M2/M1 have a separate state fed back in; M1_m.letterScore may co-decide M5 with weight M5_D_M1_M_WEIGHT = 0.1 (F198), but this is now gated by the toggle M5_D_M1_M_ENABLED = default OFF (decision 17/06, AUDIT_OMEGA §1.4.2: M1_m does not earn its 0.1) → in baseline M1_m does NOT influence the decision; the assert only pins the weight (0.1) if it is re-enabled. Obsolete: "0.0 baseline" AND "0.1 without toggle". Phon truncated: M5_phon→M4_phon effective (read by bottom-up M4_phon), M3_phon_m observational, M2_phon_m/M1_phon_m built + called but with no consumer (dormant — not "never built"; cf. AUDIT_OMEGA §1.4/D1).
5.3 — Main constants
| Module | Constants | Value |
|---|---|---|
| M1_d | sub-brains; phases; dim | 5 ; [0,103,207,311,415] ; LDIM=512 |
| M2_d | zones; grid; EMA; σ_exc/σ_inh/weight | 16 ; 4×4 ; 0.05 ; 1.5 / 4.0 / 0.5 |
| M3_d | cells; α_Hebb; α_decay; threshold; dim | 12 ; 0.008 ; 0.001 ; 0.005 ; SDIM=1024 |
| M4_d | cosine/freq weights; top-K | 0.7 / 0.3 ; 10 |
| M5_d | T_min/T_max; gap factor; M1_m weight | 0.05 / 0.5 ; 20.0 ; 0.1 (F198) |
| M5_m | reward HIT/MISS/WIN/LOSE | +1.0 / −0.5 / +2.0 / −1.0 |
| M3_m | anti-Hebbian rate | 0.004 (½ of the direct Hebbian) |
The ratio α_Hebb/α_decay = 8 is an identified debt (unbounded norm, §12).
6Toggle reference (47)
47 flags in total (phase45): 31 exposed as toggle buttons, plus controls in dedicated panels (dictation, bind bridge) and base JS flags. Phase46 adds 6 NEO toggles + 4 parameters → 37 toggles; phase47 adds the M_TREXQUANT_MODE mode → 38 toggles (§17). UPDATE 06/26: +3 cheat-free blue toggles (M_NEO_PHON_COHORT board-derived sound · M_NEO_PHON_COHORT_JOINTE · M_NEO_OS_ARB OS arbitration) → 41 toggles; M_DECLARE_DUAL adopted (preset). UI colour code, 4 categories: green optimal config · blue optional cheat-free · orange reads the SOUND of currentWord (word heard) · red gray cheating (A1/A2/A3). Detail of the 3 new ones: §17.1. Default = state at load. "preset ✔" = switched on by the reference config (§8).
phase45 build. The "UI name" column gives the exact button label and its panel. 31 toggles are buttons (panels Toggles · Phase A + B2 and Débranchable · triche grise [Disconnectable · gray cheating]); the dictation/bind controls live in dedicated panels; the rest are base JS flags. At startup, all toggles are OFF except M4_PHON_USE_P ("φ · Croisement p" [crossing p]) = ON. The "preset ✔" mark flags those the reference config (§8) switches on. Build phase46/47: 6 NEO toggles + the 🎯 Trexquant mode added (38 toggles in total) — see §17.| Code (toggle) | UI name · panel | Default (boot) | Status | Role / measured effect |
|---|---|---|---|---|
L01_A1_M2_ORTHO | « A1 · Orthography » · Débranchable·triche grise [Disconnectable·gray cheating] | OFF | excluded | Orthographic perception (M2): reads the revealed letters (spelling). Legacy ortho base. Feeds the raw-frequency path. |
L01_A2_M4_LEX4 | « A2 · Lexique 4 » [Lexicon 4] · Débranchable·triche grise | OFF | gray cheating | Dictionary filter + letter score by cohort frequency. "The lever that knows French". Ceiling ~95–98.7 % but lexical lookup (see §7). Allowed only to declare. |
L01_A3_M5M_WORDLEX4 | « A3 · Word Lex4 » · Débranchable·triche grise | OFF | excluded | Re-injects the whole word (Lex4) into the top-down correction (M5_m). An oracle-crutch. |
L01_A4_M4M_DECOMP | « A4 · Decomp » · Toggles·Phase A+B2 | OFF · preset ✔ | active | Top-down decomposition (M4_m): converts the word signal into per-letter penalties. |
L01_A5_M2M_POSITIONAL | « A5 · Positional » · Toggles | OFF · preset ✔ | active | Top-down positional correction (M2_m): weights which positions matter. |
L01_A6_OS_CONCEPT_ARBITRAGE | « A6 · OS Arbitrage » · Toggles | OFF · preset ✔ | active | The OS arbitrates between the routes' conceptual signals to decide the letter. |
L01_B2_MOBIUS | « B2 · Möbius » · Toggles | OFF | to measure | Cross-coupling ortho↔phon (Möbius twist). Pure effect not validated (R66). |
M_VOIE_PHON | « φ · Voie Phon » [Phon route] · Toggles | OFF · preset ✔ | active | Phonological route: converts the word into sounds (SAMPA), reasons in parallel with the ortho (dual route, Coltheart). |
M_OS_V07 | « φ · OS v07 » · Toggles | OFF · preset ✔ | active | Lets OS v07 combine ortho+phon and drive the decision. OFF: the phon runs in observation only. |
M4_PHON_USE_P | « φ · Croisement p » [crossing p] · Toggles | ON · preset ✔ | active | Crossing: M4_phon blends a prior from the real phonetics (p/SAMPA field, from the cohort). The only toggle ON at boot. |
M_SUBSTRAT_ORTHO_PURE | « φ · Substrat pur » [pure substrate] · Toggles | OFF · preset ✔ | active | Pure orthographic substrate (anti-contamination). OFF = identical to the legacy base. |
M_PHON_FEEDBACK | « φ · Feedback ↓ » · Toggles | OFF · preset ✔ | active | Top-down phon feedback (Phase 3.6 B): M4 penalty effective, M3 observational. |
M_WORD_DECLARE | « 🎯 Declare mot » [Declare word] · Toggles | OFF | measured | Declares the word when the pattern + misses leave only ONE candidate (cheat-free). CONF field: 1.0 = 100 % sure; ~0.70 = sweet spot. |
M_IG_SELECT | « 🧠 InfoGain » · Toggles | OFF | to measure | Favours the most discriminating letter (entropy, Lindley 1956). W field = weight. Pure IG over-explores. |
M_IG_PSUCCESS | « IG x P(succes) » · Toggles | OFF | to measure | Requires InfoGain ON. Weights the info gain by P(presence) — avoids burning a life on a rare letter (J/Y). |
M_BPC_M3D | « bPC M3_d » · Toggles | OFF · preset ✔ | active | Competitive auto-encoder of the concept (encoder W from M1, tied decoder, reconstruction). Output decoupled from letter scoring. Win rate not regressed (99.25 %). |
M_BPC_READOUT_COUPLE | « Couplage readout » [readout coupling] · Toggles | OFF · preset ✔ | active | Injects the concept's learned letter score (R, by reward). +2 to +3 pts in a stripped config; hurts in a full config (A2 redundant). Requires bPC M3_d. |
M_PHON_READOUT_COUPLE | « Couplage readout φ » [readout coupling φ] · Toggles | OFF · preset ✔ | active | Phon counterpart (R_phon), parity with the ortho coupling. Requires the phon route. |
M_PHON_CONCEPT_BIND | « Concept lié φ (étape 2) » [bound concept φ (step 2)] · Toggles | OFF · preset ✔ | measured: null | The phon readout reads a bound concept (positions bound by permutation) vs a blend: ≈ blend (z ≈ −0.95). Separate buffer, M_S intact. |
M_BPC_DECLARE | « 🎯 Declare BPC » · Toggles | OFF | measured | Declares a word when the M3_d concept points to it (cheat-free via M1_d). +5.42 pts mean multi-seed; 97.25 % vs 94.31 % long horizon. Requires bPC M3_d. |
M_DECLARE_DUAL | « 🦴 Declare DUAL (cheat-free) » · Toggles green/preset | OFF · preset ✔ | adopted 06/26 | Declares via the board buffer (public moves), never currentWord. Board cohort, fusion of freq × ortho-bigram × phon-g2p (a naive-Bayes word model, not the per-letter crossing). ADOPTED in the cheat-free config (§17.5): +1.8 → 99.8 % (word heard) / +2.5 → 97.3 % (without currentWord), 4 seeds, never below; in-lexicon recognition (neutral OOV). (Old cognition measurement: +5 pts 93.7→98.7 %.) |
M_LEARN_FROM_COGNITION | « 🧠 Apprendre depuis la cognition » [Learn from cognition] · Toggles | OFF | measured | Anti-crutch: when a declare forces a letter, the learners learn from the cognitive letter (pre-override). Restores ~2× the θ signal (0.010→0.021). |
M_OS_LEARNING | « θ · Apprentissage » [Learning] · Toggles | OFF · preset ✔ | active | Master switch: lets the OS learn θ=(α,β). Enables the 🧬 Train θ / 📈 Sweep β buttons. |
M_OS_LEARNING_GUARD_1_BOUNDED | « θ · Garde 1 borné » [Guard 1 bounded] · Toggles | OFF · preset ✔ | design | Constrains θ to a bounded parametric family. |
M_OS_LEARNING_GUARD_2_ANALYTIC_AUDIT | « θ · Garde 2 audit » [Guard 2 audit] · Toggles | OFF · preset ✔ | design | Alerts if learned θ drifts from analytic θ (read-only). |
M_OS_LEARNING_GUARD_3_MDL_REGUL | « θ · Garde 3 MDL » [Guard 3 MDL] · Toggles | OFF · preset ✔ | design | Sparsity regularisation (Occam/MDL). |
M_OS_LEARNING_GUARD_4_COHERENCE | « θ · Garde 4 cohérence » [Guard 4 coherence] · Toggles | OFF · preset ✔ | design | Rejects an update that raises the win rate but lowers internal coherence. |
M_OS_LEARNING_ONLINE | « θ · Apprentissage EN LIGNE (SPSA) » [ONLINE learning (SPSA)] · Toggles | OFF | to measure | Online SPSA, per game, no replay. Reads W/c/η, respects the 4 guards. Separate from the batch Train θ. |
M_EMERGENT_DECLARE | « 🦴 Declare émergent · recall » [emergent declare · recall] · Toggles | OFF | measured | Recognises an already-played word (bind of the revealed board vs the bench). 95.3 % seen / 1.33 err. 100 % cheat-free. |
M_EMERGENT_ASSEMBLED | « 🧬 Declare émergent · phon→ortho » [emergent declare · phon→ortho] · Toggles | OFF | excluded from Hangman | Assembled decoding: at a sound position, forces the graph if conf>0.75. 54.7 % new word (generalisation). The shortcut variant = oracle (§9). |
M_EMERGENT_G2P_ONLINE | « 🔤 g2p appris en jouant (online) » [g2p learned by playing (online)] · Toggles | OFF | measured | Phoneme→graph table (EM) learned from the played words only, post-game. Doctrinally clean. Batch ceiling around ~900 games. |
M_DICTEE_LEXICAL | « Dictée d'un mot aléatoire » [Dictation of a random word] · Route sublexicale panel [Sub-lexical route] | OFF | oracle | Lexical dictation mode (lookup, ~92 % known / 0 % new = a memory signature). Not a toggle button. |
M_DICTEE_SUBLEXICAL | « Dictée sublexicale d'un mot » [Sub-lexical dictation of a word] · Route sublexicale panel | OFF | to measure | Sub-lexical dictation (EM, learned cognition). Dedicated button. |
M_PHON_BIND | Pont bind panel [Bind bridge] · « Mesurer (bind vs mélange) » [Measure (bind vs blend)] | OFF | to measure | Phon HRR binding. A measurement control (1024-D), not a toggle button. |
M_PHON_BINDCOND | Pont bind panel | OFF | to measure | Conditioned phon binding (revealed-aware). |
M_PHON_READOUT_AB | Pont bind / readout panel | OFF | to measure | A/B phon readout comparison. |
M_S_ENABLED | JS-only (base) | ON | base active | Transmodal hub M_S — one of the sources of the win rate. |
M5_D_PHONGRAPH_ENABLED | JS-only (base) | ON | base active | phonGraphMap co-decider at M5 — a source of the win rate. |
F75_DAMASIO_ENABLED | JS-only (base) | ON | base active | Somatic marker (reward bias, Damasio). |
E_DEDOUBLE_ENABLED | JS-only (base) | ON | base active | Doubled E service (observation/consolidation). |
M4_M_CONTEXTUAL_ENABLED | JS-only (base) | ON | base active | Contextual letter penalty (mirror). |
M4_M_HOMEO_V2_ENABLED | JS-only (base) | ON | base active | Homeostasis v2 of letterPenalty. |
M4_M_OS_MOD_ENABLED | JS-only (base) | ON | base active | OS modulation of the letter penalty. |
OS_GAP_RELATIVE_ENABLED | JS-only (base) | ON | base active | Relative gap for the M5 temperature. |
OS_SLEEP_DECAY_ENABLED | JS-only (base) | ON | base active | Decay at "sleep". |
M_S_DUAL_ENABLED | JS-only | OFF | to measure | Dual ortho/phon hub. Strong coupling. |
M5_D_POSITION_AWARE_ENABLED | JS-only | OFF | to measure | Position-aware decision. |
PUBSUB_ENABLED | JS-only | OFF | to measure | Inter-module pub/sub bus (R39 independence). |
SLEEP_REPLAY_ENABLED | JS-only | OFF | to measure | Sleep replay. |
M_HRR_CROSSMODAL_ENABLED | JS-only | OFF | to measure | Cross-modal HRR. |
M_BPC_CROSSMODAL_ENABLED | JS-only | OFF | to measure | Cross-modal bPC. |
COUCHE_A_ADAPTIVE_ENABLED | JS-only | OFF | to measure | Adaptive A layer. |
COUCHE_BC_SEPARATION_ENABLED | JS-only | OFF | to measure | B/C layer separation. Strong coupling. |
Note. At startup, only M4_PHON_USE_P ("φ · Croisement p") is ON; the reference config (§8) then switches on the "preset ✔" toggles. The heavily-coupled toggles (M_VOIE_PHON, M_OS_V07, M_BPC_M3D) touch many points in the code — their effect is not local.
7Lexique 4 dossier — the A2 toggle
A2 would let OMEGA consult the entire dictionary to guess. It would win more (~95–99 %), but that would no longer be guessing: it would be looking up the answer. Since the whole point of the project is to think without a dictionary, A2 is banned from letter choice — tolerated only to announce a word.
7.1 — What A2 is
L01_A2_M4_LEX4 (L01 ENH.) operates inside M4_ortho. From the cohort (dictionary words compatible with the pattern + exclusions), it scores each letter by its frequency among the candidates and injects that score into letter scoring — the estimator P(letter ∈ word | board), frequency-weighted. Reference model: the cohort model (Marslen-Wilson & Welsh 1978).
7.2 — Statistics
| Measure | Value | Source |
|---|---|---|
| Cohort-oracle ceiling, seen words | 98.7 % / 1.11 err | declare e2e 31/05 |
| Cohort-oracle ceiling, new words | 100 % / 1.14 err | same |
| Cobweb ↔ A2-presence correlation | 0.845 (vs IG 0.610) | REPRISE_MASTER 25/05 |
| Effect of A2 on the bPC coupling | makes the coupling −1 to −1.2 pt (redundant) | REPRISE_MASTER 27/05 |
7.3 — Why A2 is excluded from scoring
A2 reaches ~98.7 % (seen) / 100 % (new) because it has the whole lexicon: a "new" word is never new to it (its cohort always contains the true word and converges on it). This is the oracle-shortcut OMEGA refuses. Its redundancy is measured (it absorbs Cobweb, corr 0.845; it makes the bPC coupling counterproductive). It carries the 95 % of the full config without cognition.
7.4 — What is allowed instead
A2 remains usable only for DECLARE (proposing a word, as a "teacher"), never as a letter-scoring engine. The cheat-free equivalent is M_DECLARE_DUAL (cohort of the board, not of the full dictionary): +5 pts in a cognition config, without reading the dictionary beyond what is board-compatible.
8Manual
8.1 — Launch
- Open
OMEGA_v0_07_phase47…htmlin any browser: a self-contained monolithic application (code + lexicon inlined). No server, no dependency. - Backup freeze
OMEGA_v0_07_base.html: a stable state for rollback — do not touch it. - Golden rule: the browser console is read-only. Every action goes through a UI button/toggle — never a command that would modify state (reproducibility).
8.2 — The interface panels
| Panel | Buttons / fields | Use |
|---|---|---|
| PENDU · Partie [Hangman · Game] | ▶ Start · +1 Tick · ▶▶ Auto · Abort | Play: random word, one move at a time (observe), full game, abort. |
| État Modules [Modules state] (Direct Circle / Mirror Circle) | vectors, internal norms | Diagnostic of the health of the representations (substrate, D↔M dissonance). |
| Toggles · Phase A + B2 | the 28 configuration toggles (§6) | Compose the cognitive configuration (A4…θ, phon route, bPC, declare…). |
| Débranchable · triche grise [Disconnectable · gray cheating] | A1 · Orthography · A2 · Lexique 4 · A3 · Word Lex4 | The lexical crutches, isolated. OFF in the reference config. |
| Performance Live + bPC santé [bPC health] | 📊 Mesure [Measure] (Mesurer A/B [Measure A/B]) · 🔬 Drivers · 🧬 Train θ · 📈 Sweep β · 🌊 θ online JSON · 🧹 Reset · Exporter JSON [Export JSON] | Seeded A/B protocol + export; OS parameters; health of the 12 concept cells. |
| Bench (perf panel) | ▶ Bench R1 · Bench tick réel [real tick] · 🎯 Trexquant (hors-lexique) [out-of-lexicon] | Trexquant mode — two forms. (a) Playable: the 🎯 Mode Trexquant toggle (NEO group) removes the drawn word from len_index on each New game (cohort/recall blinded) → you watch OMEGA solve true out-of-lexicon; the lexicon is restored on the next turn. (b) Bench: the 🎯 Trexquant button plays 80 out-of-lexicon words (warmup 300) and logs 2 win rates — phon→ortho cascade (with sound) vs ortho only. Both are self-contained (they restore the lexicon). |
| Route sublexicale · cognition apprise [Sub-lexical route · learned cognition] | Dictée d'un mot aléatoire [Dictation of a random word] · Dictée sublexicale d'un mot [Sub-lexical dictation of a word] | A separate dictation mode (the lexical version is gray cheating). |
| Pont bind · mesure (1024-D) [Bind bridge · measure] | Mesurer (bind vs mélange) [Measure (bind vs blend)] | Compares bound vs blended concept (z), separate buffer — does not affect the baseline. |
| Développeur / monitoring [Developer / monitoring] | Smoke load · Smoke runtime (100 ticks) · Bench · Dump 14 canaux [Dump 14 channels] · Dump inventaire global [Dump global inventory] · initOmegaGlobals() | Non-regression, throughput, channel/state inspection. |
8.3 — Reference configuration (cheat-free cognition) — UPDATE 14/06/2026
Optimal preset re-measured on the current code, to be activated in L01 ENHANCEMENTS + Declare NEO:
ON (cognition): A4, A5, A6, M_VOIE_PHON, M_OS_V07, M4_PHON_USE_P,
M_SUBSTRAT_ORTHO_PURE, M_PHON_FEEDBACK, M_BPC_M3D,
M_BPC_READOUT_COUPLE, M_PHON_READOUT_COUPLE, M_PHON_CONCEPT_BIND,
M_OS_LEARNING (+ its 4 guards) [M_OS_LEARNING_ONLINE OFF: measured no gain + drift]
ON (declare NEO): M_DECLARE_NEO, M_NEO_RECALL, M_NEO_ASSEMBLED,
M_NEO_COHORT, M_NEO_G2P_EXP (pen 0.5), M_DECLARE_DUAL (adopted 06/26) (mute/trigger OFF; NEO_CONF 0.75, RECALL_MARGIN 0.20)
cheat-free OPTION WITHOUT currentWord (blue): + M_NEO_PHON_COHORT + M_NEO_PHON_COHORT_JOINTE → ~97.3 % (vs 97.5 % "word heard")
OFF: A1, A2, A3 (gray cheating / crutch)
TO MEASURE: L01_B2_MOBIUS, M_IG_SELECT, M_IG_PSUCCESS ; M_NEO_OS_ARB (a clean alternative to DUAL, ≈ but does not beat it)
Measured win rate (in-lexicon, seed 12345, 120 words, warmup 150): cognition alone (base) 91.46 % (K=1) / 93.75 % (K=3) → +NEO (R+A+Cohort): 97.50 % (K=1) / 98.82 % (K=3) (4 seeds × 120, deterministic harness; cf. NEO notes + §17). Cheat-free, at the level of manual declare.
currentWord ("word heard": NEO assembled if the cohort is OFF, + emergent assembled) · red = dictionary gray cheating (A1/A2/A3, do not activate). NEO assembled flips orange→green as soon as the blue "board-derived sound" is ON (it no longer reads the word's sound).learnExp vs learn), with a bounded penalty (0.5) on the wrong letters tried. Measured falsification: old g2p 98.9 % · revealed-only without penalty 98.3 % · revealed-only + penalty 0.5 = 98.9 % (= the old one). The old one did not cheat measurably, but the new one is doctrinally cleaner (it does not absorb the whole spelling) at no cost → adopted in the reference config.The application starts with all toggles OFF (≈ 2.6 % if run as-is): you must activate the config below. A1 · A2 · A3 stay OFF — this is precisely what makes the game cheat-free: no dictionary lookup to choose a letter.
- Cognition: A4 · A5 · A6 · φ Voie Phon (Phon route) · φ OS v07 · φ Croisement p (crossing p) · φ Substrat pur (pure substrate) · φ Feedback ↓ · bPC M3_d · Couplage readout (readout coupling) · Couplage readout φ · θ Apprentissage (Learning) + its 4 guards.
- Cheat-free declaration: 🦴 Declare DUAL · 🧩 Declare NEO (master) · 🔁 recall · 🧬 assemblé (assembled) · 🎯 cohorte (cohort) · 🧪 g2p révélé (revealed g2p, pen 0.5).
- Full cheat-free (without
currentWord): 🔊 son board-dérivé (board-derived sound, 0.5) · 🔗 jointe son×ortho (joint sound×ortho, 0.3) — the sound comes from the consensus of the board cohort, no more reading of the hidden word's sound.
Measured result (in-lexicon K=1, 4 seeds, deterministic harness): ≈ 97.3 % full cheat-free (never reads currentWord). Benchmarks: ≈ 97.5 % if the assembled route reads the word's sound ("word heard" premise, legitimate in dictation), up to 99.8 % with DUAL; oracle ceiling (lexical lookup, excluded by doctrine) 98.7 %. The 🔇 muette (mute) · 🎚️ trigger · 🧭 arbitrage OS (OS arbitration) options are measured neutral (they do not change the result) — leave to preference.
8.4 — Measurement procedure (replicable)
- Apply the preset, fix the seed.
- +1 Tick to understand one move; Auto for a game; do not conclude performance from the interactive mode.
- Measure: seeded protocol, chained games (never reset between plays — L04), N ≥ 150 (≥ 2000 for long drift), 8 seeds for fine deltas.
- Read coverage and OS_diss as much as wins.
- Verify a new toggle's inertia OFF (byte-identical output) before judging its contribution.
- Export the JSON; compare A/B with z.
8.5 — Working discipline
- Edits on a throwaway extraction (
/tmp/_c.js); the saved build is never touched until a brick is validated. - Save = ZIP, on explicit order only; one at a time.
- Inert OFF: every added brick leaves the baseline byte-identical when off.
- Check the doctrine already accumulated before investigating (time has been lost rediscovering documented findings).
9Anti-cheat framework
- Legitimate: revealed letters, length, tried letters, everything learned by playing (bench of seen words, sound↔letter tables).
- Gray cheating: enumerating the full dictionary to isolate the word (A2, full lexical cohort). Tolerated only to declare.
measured Phon route + bPC M3_d + emergent + g2p, ALONE = <60 %. Coupled with "scrambled phon → rate unchanged", this proves that no isolated route drives the decision. The win rate (~90 %) is emergent from the whole architecture (native M4_d + M_S hub + M_P + readouts + OS + mirror cascade + M1_m co-decider) — a hub-and-spoke / Triangle model.
The anti-cheat does not forbid information: it holds through the compartmentalisation of the loops — the bottom-up decides (on the revealed only), the top-down learns (the "teacher" is allowed to see the word, wake-sleep style) — plus the OS dilution, which neutralises any signal trying to pre-drive.
9.1 — The const ph = G.wp.get(currentWord) case
Reads the target word's phonology = a key→answer lookup. Its status depends on two factors: (1) regime — in Hangman (board-only) the word is not "heard" → hard cheating; in dictation the word is the input → legitimate; (2) destination — confined to P2/end-of-game learning/dictation → tolerated; fed back down into M4_d/M5_d → hard cheating. The "scrambled phon → rate unchanged" test: currently a latent, unexploited oracle. Rule: never wire it into Hangman scoring; for a cheat-free phon route, derive ph from the cohort (at the cost of the ~78 %).
9.2 — Cheat-audit procedure (reusable)
To test whether a source X is exploited by scoring: scramble/neutralise X and measure Δ(rate). If Δ ≈ 0, X is not exploited (a tolerated latent oracle); if Δ < 0 significantly, X pulls the decision (to be cut if X is an oracle). Judge a brick in the full system (ablation), never in isolated override.
10Operating regimes
Each mechanism dominates in the regime that supplies its input.
- Poor context (Hangman, isolated word): shape prevails → phon→ortho and recall dominate. The lever for the last points = recall (recognising), not grammar.
- Rich context (running text): grammar dominates (~92 %); the residue (silent endings) is lifted by grammatical category (POS) — on the silent
-ent, uncertainty drops from 0.93 to 0.019 bit (−98 %, AQUA-type measurement). - Dictation (word heard): phonology is a legitimate input; phonemes + grammar surpass shape alone.
Consequence: in single-word Hangman, 100 % on a never-seen word is impossible cheat-free — this is the very definition of cognition vs oracle.
11Results: success & failure
11.1 — Success
- Integration thesis confirmed measured: pure frequency ~22–23 % → cheat-free reference config ~90 % on the same hardened task. No isolated route carries this score (bricks < the whole; scrambled phon → rate unchanged).
- Recall (seen words): 95.3 % / 1.33 err, within ~3 pts of the oracle (98.7 %) — VSA recognition approaches full lexical coverage without reading the dictionary.
- Generalisation (new words): 54.7 % / 4.45 err by phon→ortho assembled decoding, without any recognition — honest, like a human facing an unknown word.
- Effect of the learning fix (
M_LEARN_FROM_COGNITION, 8 seeds): wrong phon target 20 %→0 %; mirror cascade MISS-frac 71 %→80 % of the healthy level (z=14.6).
11.2 — Failure
- Profile of the losses (phon dyslexia) measured: across 100 losses, 96 % involve a phonetically close pair. Distance 0 (homophones I/Y) 5.8 %; distance 1 (voiced/voiceless P/B, T/D, K/G, F/V, S/Z) 58.3 %; distance 2 29.2 %; distance 3+ 6.7 %. Cause: voiced/voiceless pairs share 13/14 features → near-identical vectors.
- Structural mirror ceiling: the cascade's contribution is capped by
(1−winRate); at ~97 % theamountFactordrops to ~26 % (designF178, not a bug). - Weighted quality capped ~0.80 (max 0.84 OFF / 0.88 ON) vs target 0.90.
- phonGraph inert: ‖Δ‖ ≈ 0 (sign-based learning → zero mean; cos ≥ 0.997 vs substrate).
11.3 — Honest assessment
Cheat-free cognition reaches ~90 % and approaches the oracle on seen words, but: (a) it plateaus below the oracle on new words (expected); (b) the residual losses are dominated by the unresolved voiced/voiceless phon confusion; (c) the M3_d concept cells (shape) are weakly connected to the hub (M3_d.output=0 under bPC) — but its reward-readout cLetterScore is a cheat-free contributor measured at +3.4 (§12; AUDIT_OMEGA §3.1): "M3_d weakly connected" holds only for the cells/hub, not the readout.
12State & limits
Ranked by impact × effort, each point framed as a falsifiable experiment. None degrades the baseline (everything is off/decoupled, byte-identical at rest).
| Point | Impact | Effort | Falsifiable experiment |
|---|---|---|---|
| M3_d cells weakly connected — the readout, though, matters (inherited from v0.06: corr game↔win rate ≈ −0.15; v0.07: 7-9 cells/12, 1 plural concept, M2→M3 projection = permutation, not true HRR compression; cells = shape code) | Low* | Low | DONE (17/06): A/B M_BPC_READOUT_COUPLE → the cLetterScore readout matters = +3.4 cheat-free (8 seeds, never below; AUDIT_OMEGA §3.1). Still weak = the cells (shape/hub); debugging the internals = optional (the readout already carries the value). |
| Phon dyslexia (96 % of losses, voiced/voiceless pairs) | High | Medium | Activate M_PHON_CORRECTION (α=0.10 / β=0.05) at scale; measure the drop in dist≤2 losses. |
| Truncated phon route (M2_phon_m/M1_phon_m absent) | High | High | Build the missing mirrors (predictive coding); measure the phon contribution. |
| B1 — M3_d.output not normalised (inherited from v0.06: norm ~1.76, saturates M_S ~1.46; inert while bPC sets output=0) | Medium | Low | B1 remains inert (output=0 under bPC); the reconnection that would have activated it is falsified (12-cell capacity wall — familiarity lives in the bench). No urgency. |
| Unbounded Hebbian (α_Hebb/α_decay = 8) | Medium | Low | Bound it; measure norm stability over 2000 games. |
B3 — k/tries score wrong on a loss (inherited from v0.06) | Medium | Low | Fix the formula; re-check the scores of lost games. |
| LDIM→SDIM bijective (zero info gain, R42-#9) | Medium | Medium | Random projection (Achlioptas 2003) vs removal; measure the info gain. |
Reproducibility (Math.random not seeded) fixed phase46 | Cross-cutting | resolved | Fix#1: picker + bench → omegaRand() (deterministic headless). Only the intentional fallback remains if not seeded. |
| Centre bias (M2 Mexican-hat grid) | Low | Medium | Symmetrise/normalise the grid. |
P2/Möbius disconnected (the name PIPELINE2_MVP is misleading) | Low | High | Connect P2 gradually; verify inertia OFF then the contribution. |
AUDIT_OMEGA §3/§3.1). The concept (12 cells) = a shape latent whose real contribution is the reward-readout cLetterScore (coupled 0.20): measured +3.4 pts of win rate cheat-free (without A2; A/B 8 seeds, never below zero; reproduces the "+2 to +3 stripped"). It is redundant/harmful only WITH A2 (lexical oracle excluded by doctrine) — hence the old "flat contribution", measured in a full config. Still falsified (bounded scope): lodging the episodic bench in M3_d / the concept→M4 path (−1.3 to −2.0, M3D_reconnexion_banc_FALSIFIE) and familiarity (AUC 0.64 K=12 → lives in the bench; episodic and concept kept separate by design). The cells encode shape (reusable on the dictation side — an early-stage signal, §0).Recommended order: (1) purge non-seed done (phase46 · Fix#1); (2) Math.randomhand-coded done — the NEO/emergent assembled route, L2 learned board-derived (§17); (3) PHON_TO_LETTERS → learned L2 tablelodge the recall bench in M3_d falsified — measured net-negative (concept→M4 contaminates, −1.3 to −2.0); capacity probe: carrying familiarity requires K≈N cells (= the bench), 12 cells AUC 0.64 vs bench 0.98 → familiarity lives in the bench, M3_d stays the small semantic latent (§17); (4) bound the Hebbian + fix the bijective projection to do.
13Open research questions
- θ → (α=1, β=1)? Does the OS, learning on its own (🧬 Train θ), fall back on the analytic dosing?
- Route ratio r ≈ 5.35? Does the ratio
signal_phon / signal_ortho(≥ 1000 games) approach 5.353? - Fraction of dormant channels ≈ 0.079?
- Ortho/phon asymmetry: intrinsic or learned? Does a symmetric init diverge spontaneously?
To become scientific, each correspondence would need a mechanism that predicts the constant from the cognitive setup — otherwise the result remains an analogy.
14References
Status: structural/active · present but inactive · not implemented.
Dual-route reading & dyslexias — Coltheart et al. (2001) DRC (structural); Plaut & Shallice (1993); Castles & Coltheart (1993), Adlard & Hazan (1998) voiced/voiceless confusions (validated: 96 % of losses).
Triangle & hub-and-spoke — Seidenberg & McClelland (1989), Plaut et al. (1996), Harm & Seidenberg (2004); Rogers et al. (2004), Patterson (2007), Lambon Ralph et al. (2017). Structural (M_S).
Loops, prediction, mirror — Hinton et al. (1995) wake-sleep; Bogacz (2025) predictive coding; Hesslow (2002) simulation (P2); Hong & Friston (2021) DMN/TPN.
Learning / plasticity — Hebb (1949); DeSieno (1988); Bardes, Ponce & LeCun (2022) VICReg; Turrigiano (1998, 2008), Zenke (2013); Moraitis et al. (2021) SoftHebb.
Decision / information — Lindley (1956) InfoGain; Fisher (1987) Cobweb; Sutton & Barto (1998); Friston (2025) Active Inference (inactive); Dehaene (1998)/Baars (1988) GNW (inactive).
Cohort / reading in context — Marslen-Wilson & Welsh (1978) cohort model (basis of A2); Hale (2001), Levy (2008), Smith & Levy (2013) surprisal; Jacobs et al. (1991) Mixture-of-Experts.
Vector representation — Plate (1995) HRR (SDIM=1024); Rachkovskij & Kleyko (2022); Achlioptas (2003) random projection (not implemented); Schmidhuber (2003) OOPS (inactive).
Similarity — Kriegeskorte (2008) RSA (internal dissonance measure 1−cosine).
15Glossary
| Term | Definition |
|---|---|
| Ortho / phon | Written / spoken form of a word. |
| SAMPA | Phoneme notation (distinguishes é/è/an/on…). |
| Concept / M_S hub | Amodal representation linking the routes (enter through one, reconstruct the others). |
| bPC | Predictive auto-encoder of the concept (M_BPC_M3D). |
| Bottom-up / top-down (mirror) loop | Perception-decision / correction-learning. |
| P1 / P2 | Direct / mirror circle (double Möbius). P2 currently disconnected. |
| OS | Arbitration module (doses ortho/phon, dilutes, measures dissonance). |
| Cohort | Dictionary words compatible with the board. |
| Coverage | Fraction of positions correctly revealed. |
| Declare | Override: announce a word/a letter. |
| Recall | Recognition of an already-played word. |
| Cheat-free | Never consults the hidden answer. |
| Gray cheating | Injection of the dictionary's frequency/spelling into the letter score (A1/A2). |
| Oracle / key→answer lookup | Reading the hidden answer (wp.get(currentWord)). |
| HDC / HRR | Hyperdimensional computing / Holographic Reduced Representations. |
| Cap §43 / R66 | Read only the revealed / no default activation without empirical validation. |
16Appendices
16.1 — Ablation table (measured effects)
| Toggle / fix (UI name) | Measured effect | N / seeds | Config | Source |
|---|---|---|---|---|
M_BPC_READOUT_COUPLE Couplage readout | +1.8 to +4.2 pts (increasing) | 2000, 3 seeds | stripped | REPRISE_MASTER 27/05 |
| same in a full config | −1 to −1.2 pt (A2 redundant) | — | full | same |
M_DECLARE_DUAL | +5 pts | — | cognition | DECLARE 31/05 |
M_EMERGENT_DECLARE (recall) | 95.3 % seen / 54.7 % new | bench 400, 150+150 | — | DECLARE e2e 31/05 |
M_LEARN_FROM_COGNITION | phon target 20 %→0 %; MISS-frac →80 % (z=14.6) | 8 seeds | reference | MESURE_FIX 31/05 |
M_PHON_CONCEPT_BIND | ≈ blend (z ≈ −0.95) | — | reference | step 2 audit |
M_BPC_DECLARE 🎯 Declare BPC | 97.25 % cumulative vs 94.31 % | long horizon | Rem config | MANIFEST / phase36 |
| A2 (cohort-oracle) excluded | 98.7 % seen / 100 % new | — | oracle | DECLARE 31/05 |
M_DECLARE_NEO (R+Assembled+Cohort) cheat-free | 97.50 % (K=1) / 98.82 % (K=3) | 4 seeds × 120 | strong cognition | NEO 03/06 (§17) |
M_NEO_MUTE + trigger (gap 0.005) | neutral: Δ +0.00 (K=1) / +0.14 (K=3) | 4 seeds × 120 | + R+A+C | NEO 03/06 (§17) |
16.2 — Quick reference of constants
5 M1_d sub-brains, phases [0,103,207,311,415], LDIM=512 · 16 M2 zones (4×4), EMA 0.05, σ 1.5/4.0 · 12 M3_d cells, α_Hebb 0.008, α_decay 0.001, threshold 0.005, SDIM=1024 · M4_d 70/30, top-10 · M5_d T 0.05–0.5, gap×20, M1_m weight 0.1 (F198) · reward +1/−0.5/+2/−1 · anti-Hebbian 0.004.
17Declare NEO (phase 46)
A new emergent and crossed declare added additively on top of phase45: recall (addressed) + assembled (phon→ortho) + cohort (board filter) + mute (via sound, crossed) + trigger. OFF-inert (byte-identical baseline), none of the 5 existing declares modified, bPC M3_d allowed but NEO is not M_BPC_DECLARE. Current build OMEGA_v0_07_phase47_trexquant_mode.html (engine = phase46).
17.1 — The NEO toggles (UI)
UPDATE 06/26: 3 cheat-free blue toggles added (board-derived sound · joint · OS arbitration) + M_DECLARE_DUAL adopted in the reference config (§8.3, §17.5). UI colour code: green optimal config · blue optional cheat-free · orange reads the SOUND of currentWord (word heard) · red gray cheating (A1/A2/A3).
| UI name | Default | Role |
|---|---|---|
M_DECLARE_NEO_ENABLED 🧩 Declare NEO · maître [master] | OFF | Master; all NEO routes inert while it is OFF. |
M_NEO_RECALL_ENABLED 🔁 NEO · recall | ON* | Addressed: VSA recall from the revealed board + the bench of lived words. 100 % on repeated vocabulary, inert on a new word. |
M_NEO_ASSEMBLED_ENABLED 🧬 NEO · assemblé [assembled] | ON* | phon→ortho masked: decodes the sound positions via L2[phoneme]. w.p legitimate, masked align (hidden grapheme → UNI). Generalises to a new word. |
M_NEO_COHORT_ENABLED 🎯 NEO · cohorte [cohort] | OFF | Board-derived filter: allows a letter only if ≥1 word compatible with the revealed pattern carries it. Prunes misses. |
M_NEO_PHON_COHORT_ENABLED 🔊 NEO · son board-dérivé [board-derived sound] blue | OFF | Added 06/26. The decoded SOUND (assembled+mute) comes from the phonemic consensus of the board-compatible cohort (words of the same length matching the revealed), instead of wp.get(currentWord) → removes any reading of the hidden word's sound = full cheat-free, without currentWord. Purity guard M_NEO_PHON_COHORT_PURITY (0.5) against a confident-but-wrong override. Measured (§17.5): parity with true-sound in-lexicon, OOV cost ~7 pts. When ON, the assembled route goes orange→green (it no longer reads the word's sound). |
M_NEO_PHON_COHORT_JOINTE 🔗 NEO · jointe son×ortho [joint sound×ortho] blue | OFF | Added 06/26. Replaces the argmax of the board-derived sound with the JOINT Σ_φ Pcoh(φ\|p)·CR[φ\|revealed neighbours] (the _neoCRS table learned top-down) — "crossing = joint", memoir §6. Measured in-lexicon K=1, 4 seeds: +2.2 pts vs argmax, never below (independent repro: +2.5). Own threshold M_NEO_PHON_COHORT_JOINTE_CONF 0.30. Requires board-derived sound ON. |
M_NEO_OS_ARB 🧭 NEO · arbitrage OS (2 voies DRC) [OS arbitration (2 DRC routes)] blue | OFF | Added 06/26. Replaces the routes' either/or cascade with an OS convex blend — sub-lexical (joint) ⟷ lexical (frequency-weighted cohort) — via the reused M_OS_v07_step (μ=r^α/(β+r^α), forced α=β=1 neutral, decoupled from the reading θ). A true interactive DRC. Measured without currentWord, 4 seeds: +2.0 vs base, never below, ≈ DUAL (within the noise) but cleaner and ~2× faster. Not adopted (alternative) — §17.5. |
M_NEO_G2P_EXP_ENABLED 🧪 NEO · g2p révélé + pénalité [revealed g2p + penalty] | OFF | Learns the phon→graph table (assembled route) from the revealed positions only + a bounded penalty (M_NEO_G2P_EXP_PEN 0.5) on wrong letters, instead of the complete word (learnExp vs learn). Strictly cheat-free; measured = the level of the old g2p (98.9 %). |
M_NEO_MUTE_ENABLED 🔇 NEO · muette [mute] | OFF | Via sound: silent positions predicted by a crossed (joint) phonogram head-phoneme × offset × revealed neighbours. |
M_NEO_TRIGGER_ENABLED 🎚️ NEO · trigger | OFF | (B): the mute overrides only if cognition is uncertain (M5_d.output.gap < 0.005). |
* sub-flags active only if the master is ON. Numeric parameters (NEO_CONF 0.75 · MUTE_CONF 0.85 · TRIGGER_GAP 0.005 · RECALL_MARGIN 0.20) at their measured defaults, not yet tunable in the UI; M_NEO_G2P_EXP_PEN (0.5) is tunable (the "pén" [pen] field of the revealed-g2p toggle).
17.2 — Cheat-free (verified line by line)
| Route | currentWord access | Status |
|---|---|---|
| Recall | _emrg_bind(currentWord, revealedMask); .charAt(p) compared only if revealedMask[p] | revealed only |
| Assembled | wp.get(currentWord) (legitimate input) + align(…, revealedMask) masked | no leak |
| Cohort | revealed pattern + lexicon by length; excludes tried-absent letters | board-derived |
| Mute | head-phoneme (masked align); neighbours charAt(p±1) only if revealedMask[p±1] | revealed only |
| Diag. counters | currentWord.indexOf(proposed) under typeof _neoDbg !== 'undefined' | inert (build) |
| Learning | complete word (neighbours, alignment) in endCurrentGame | top-down |
The only access to the "complete" hidden word: w.p (pronunciation) = a legitimate input (proto-language premise, M4_PHON_USE_P); the masked align blocks any leak of an unrevealed grapheme. A1/A2/A3 remain gray cheating OFF.
17.3 — Crossing ≠ multiplying
The mute crosses sound and ortho — it neither adds them (dual log f + wO·ortho + wP·phon) nor multiplies them. Crossing = joint P(letter | head-phoneme, offset, revealed neighbours) with backoff.
- Resonator networks (Frady 2020): "do not multiply blindly" (decoding a bound product = hard combinatorial search).
- bind = a code retrievable by word (the recall's role: 0 dead cells, ×6 generalisation, 100 % retrievable). It is not the letter engine: on the global dictionary, bind = 19 % vs EM 64 % (frozen spec, capacity wall).
17.4 — Results measured
Deterministic headless harness (reseed before init → bpcW; _omega_OSL_reset; M_OS_v07.α/β=1), strong-cognition cheat-free config, 4 seeds × 120, paired Δ + z.
| Condition | K=1 | K=3 |
|---|---|---|
| base (cognition only) | 91.46 % ±0.86 | 93.75 % ±0.46 |
| R + Assembled + Cohort | 97.50 % ±0.59 | 98.82 % ±0.38 |
| + Mute 0.85 (no trigger) | Δ −0.63 (z=−1.0) | Δ −0.28 (z=−1.1) |
| + Mute + trigger gap 0.005 | Δ +0.00 (z=0.0) | Δ +0.14 (z=0.8) |
Win-rate lever = Recall + Assembled + Cohort (manual-declare level, cheat-free). The trigger takes the mute from −0.6/−0.8 to ≈ 0: it no longer drags.
Brick-by-brick contributions (Δ vs base): recall +1.76 (K=3; 100 % on lived, inert on a new word) · assembled +5.28 (K=1) / +3.43 (K=3) · cohort +0.50 (K=1) / +0.17 (K=3; hit 96.7→98.3 %).
17.5 — UPDATE 06/26 — cohort without currentWord, DUAL adopted, OS arbitration measured
Full detail + reproductions: AUDIT_OMEGA.md §1.1–§1.6. Summary:
Regime honesty (orange). The 97.5 % cheat-free rests on M_NEO_ASSEMBLED reading wp.get(currentWord) = the sound of the word ("word heard" premise). This is legitimate in dictation, but in Hangman it reads a property of the answer → flagged orange in the UI. Benchmarks without this premise: OOV phon→ortho ~70.7 %, pure ortho OOV ~22 %.
Board-derived cohort + joint (full cheat-free, without currentWord). M_NEO_PHON_COHORT derives the sound from the board-cohort consensus (no more wp.get(currentWord)). Measured cost: ~0 in-lexicon, ~7 pts OOV (purity guard 0.5). The joint sound×ortho (_neoCRS, crossing = joint) beats the argmax by +2.2 pts on every seed (K=1, 4 seeds).
| cheat-free declare (in-lexicon K=1, 4 seeds) | win rate | err | moves |
|---|---|---|---|
cohort-joint only (without currentWord) | 94.8 % | 2.13 | 8.18 |
| + DUAL (adopted) — word cohort, freq×ortho×phon | 97.3 % | 1.80 | 7.88 |
| + OS ARBITRATION (alternative, not adopted) | 96.8 % | 1.89 | 7.95 |
DUAL adopted (§8.3): a word-level declare (a naive-Bayes word model, not the per-letter crossing governed by §6/§3.1 → no breach), cheat-free (board + length, never currentWord), +1.8 → 99.8 % word-heard / +2.5 → 97.3 % without currentWord, stable. Caveat: in-lexicon recognition → neutral OOV. OS arbitration: the only *principled* mechanism that beats the base (+2.0, a true interactive DRC via M_OS_v07_step), but does not beat DUAL → kept OFF-inert as a clean alternative.
Directionality (safeguard). The cognition's phon route is ortho→phon (sounds out the revealed letters — reading), the OS arbiter has a reading-tuned θ; the declare is phon→ortho (spelling, Hangman's strength). A bidirectional DRC coexistence; but the declare-level OS arbitration must force its own α=β=1 (done) so as not to inherit the reading θ — otherwise the routes' senses conflict.
Falsified (do not redo, R66): end-distance morphology (−1.0) · dense-backoff morphology (+0.3 noise) · cross-modal crossing at the M3_d concept (−3.0, capacity wall) · word-joint (−2.3) · frequency crossed at the phoneme (−4.3). The cheat-free residue lives in the cohort ambiguity, not in the phon→letter table nor the concept.
17.6 — Reservations hypothesis / to do
- Mute neutral with the trigger, not a lever: an irreducible silent residue, already covered by cognition. Alive and harmless.
- Trigger: SPSA on the gap = flat (constant win rate → no gradient; effect below the measurement quantum). A dense per-decision reward (advantage
[mute∈word] − [cognition∈word]) would be needed to learn it online. - NEO numeric parameters not yet tunable in the UI (only the 6 toggles are).
- Power 4 seeds × 120; R66 suggests ≥ 200 × 4 to tighten (stable directions).
17.7 — UPDATE 06/2026 — honest OOV, the n-gram route, and the cognitive "C" measured
AUDIT_OMEGA §1.6.1–§1.12 · config: docs/CONFIG_TOGGLES.md)
(a) Cohort leak. The earlier "~97 % out-of-lexicon" was a leak (the _neoWBL cache was not invalidated: the "removed" word stayed in the cohort). Fixed. True OOV ≈ 33 % (pure sub-lexical generalisation); cognition alone ≈ 11 %. Cognition does not generalise sub-lexically; the OOV lever is the aggregation of the lexicon's structure.
(b) N-gram route (new toggles). M_NEO_LETTER_NGRAM (a pre-computed positional n-gram, cheat-free) ≈ 57-66 % OOV; M_NEO_OS_ARB_NGRAM wires it in as the sub-lexical route of the OS arbitration (auto-switch: in-lex ~97 % / OOV ~60 %, single config); M_NEO_NGRAM_GAP (nearest revealed neighbour d=1..4) adds +2 pts OOV (~63-65 %, SOTA band) = the 1st cognitive gain > substrate. All OFF by default (R66).
(c) The learned "C" — falsified as a breakthrough. The light C (maxent/GATE/POE) and the heavy C (transformer, the M_NEO_C_HEAVY hook OFF-inert) were built and measured: the heavy one converges toward the gap-aware n-gram without beating it (win rate at optimal config: parity, OOV Δ ≈ −1.3; trained on real games = a regression from lexical coverage). The gap-aware n-gram (free, interpretable) remains the practical ceiling — "cognition > oracle = light/interpretable" confirmed. Design of a future organ (a learned arbitration hub): docs/COGNITION_DESIGN.md.
OMEGA-Ω — reference report & manual. A consolidation of three iterations (plain-language explainer 01/06, loops audit 01/06, v0.07 report) by Claude (Anthropic), directed by Rem. Snapshot as of 03/06/2026 — addendum 14/06/2026: derived application = diagnostic dictation (dys), see dictee/; addendum 18/06/2026: grammar lever + dyslexia corrector + dual-route grammar (Lexique 4 cgram), §18; deployment = compressed embedded lexicon (gzip+base64, browser ≥ 2023), build phase47 (declare NEO + Trexquant mode added — §17). Convention measured/design/hypothesis/excluded. Every toggle mentioned carries its UI name. Doctrine: strict cap §43 · R66 (measure before activation) · cognition > oracle.
UI names, button labels, panels and boot defaults verified on the phase45 build (tooltips included); the 6 NEO toggles verified on phase46 (§17). Still indicative (from docs/memoir, not re-verified line by line): the mapping of the internal F-codes and the detail of the constants. The measured figures are dated and sourced.
18Diagnostic dictation (dyslexia application)
Goal. A derived application targeting written-language disorders (dys), built on the engine's phon↔ortho dual route. The engine diagnoses the type of each spelling error and steers the training. Details & reproducible measurements in dictee/ (JOURNAL, README — which includes the closed audit + the falsified M3_d —, CORRECTEUR, GRAMMAIRE_DOUBLE_VOIE).
Frame = SENTENCE dictation. Measured: on isolated words, 84 % of words have homophones (mostly inflectional) → undecidable from sound alone. The sentence provides context: since the target word is known, homophones and agreements become gradable errors — without M3_d (the experiment "M3_d disambiguates homophones" was falsified at design: M3_d encodes ortho/sound, with no meaning/context input; cf. dictee/README.md § "Falsifié M3_d").
Error families (dysorthographic typology: phonological · lexical-surface · semantic/morphological), multi-label:
- accent (é/è/ê) · voiced/voiceless (p·b, t·d, k·g, f·v, s·z) · inversion · silent letter · extra letter
- homophone (a wrong homophone spelling) · agreement (an inflectional homophone decided by context) · surface (a "plausible-but-wrong" spelling detected by a phonetic normaliser: leson→leçon, bato→bateau)
- omission / extra word (Levenshtein alignment of target vs student words)
Remediation. A persistent error profile (by family); sentence selection prioritises the most-missed family ("we're working on: agreement"). We do not stop at diagnosing: we steer the training.
UI. An additive, OFF-inert panel (an IIFE — it does not alter the Hangman engine; baseline intact, R66 doctrine): the ✍️ Dictée diag (Diagnostic dictation) button (bottom-right) → difficulty choice, spoken dictation (fr-FR synthesis), sentence entry, per-word feedback coloured by family + revealed correction, profile + reset.
Data. Lexique 4 (New et al. 2026, lexique.org, CC BY-SA 4.0): 30 graded sentences (dictee/sentences.json) + a full homophone index (43,580 groups). Measured (synthetic, 30 sentences): recall 100 % on accent/agreement/homophone/omission, surface 17/17.
18.1 Grammar lever — agreement in context
The sentence context makes agreements gradable. The lever (in diag_sentence.py) covers: subject-verb agreement (the governor via function words, measured 94 %), distant subject (skip_pp skips the prepositional group: "le ver de la terre creuse"), past participle (être → subject agreement; avoir → invariable except a fronted direct object "la pomme qu'il a cueillie"), NP gender (gendered determiner + the noun-head's lexical route), and the disambiguation of noun/verb homographs by context ("le lit" vs "elle lit", 5/5). The diagnosis also locates a developmental stage (Ferreiro/Berliocchi: phonological → alphabetic → lexical → morphosyntactic, 4/4).
18.2 Dyslexia corrector (applied outlet)
The same lever, turned around without a reference answer (the corrector does not know the target → it infers intent), yields a grammatical-homophone corrector: a/à, son/sont, on/ont, leur/leurs, -é/-er, peu/peux/peut, ce/se, et/est. 0 false positives on the battery (the cardinal property sought: never "correct" text that is right) — but requalified (06/2026): measured on 16,342 genuinely correct sentences (UD French), the real FP was 6.0 %, brought down to ~2.5 % by 5 batches of FP-safe hardening (invariable/adverb stoplists, capitalised/non-noun-head gender, distant plural subject, irregular participles, homograph-nouns via cgram); permanent guard dictee/fp_stress_test.py. The dys domain (short sentences) is lower, not 0. Detection: 22/24 in corpus, 12/15 held-out (new vocabulary → the rules generalise). Unique angle: it corrects + locates the stage (dys remediation), which no mainstream corrector does. UI: the 🩹 Correcteur (Corrector) button — paste your text, errors underlined, click = apply the correction, stage shown, readable font. Honesty: gender agreement in the corrector was attempted then set aside (measured FP-unsafe: almost all adjectival forms are also nouns in Lexique4 → a POS/tagger is needed; the lexical gender route remains, safely, in the diagnosis).
on/ont at the start of a clause ("On dit…"→ont) and on a relative/coordinated plural subject ("…qui ont commis", "X et Y ont…"→on), a/à before a feminine participle -ée ("à durée limitée"→a, whereas after avoir the participle does not agree → -ée=noun), gender "un son stéréo"→sa (a possessive preceded by an article = a homograph noun). Fixed by abstention guards (FP-safe: they invent no correction, they remove them). (b) Recall lever: classifying the misses by morphological type, the cleanest seam is the missing mirror of noun agreement — a singular determiner glued to a plural noun ("le camps", "un soucis") is always an error in correct French → the accord singulier du nom (singular noun agreement) rule, FP=0 by construction (+435 real corrections; 3 learned guards: number-screen "le 25 mars", non-noun homograph "le savons" verb, -s/-x invariants that no runtime resource distinguishes). Second lever: participle agreement after être with a NOUN subject ("le niveau … est estimée"→estimé, "les cristaux sont composées"→composés) — rule_pp_etre only covered pronoun subjects; a noun-subject branch was added via the same NP-head parser (_np_subject). More FP-prone (subject identification is hard → 9 UD flags on the first pass, ~5 of them real FP), brought to FP=0 on correct text by 4 measured guards (elided pronoun "qu'elle soit emmenée", postposed/inverted subject "est annoncée la reprise", subject >5 tokens from the aux, proper noun between subject and aux) — +405 real corrections. This is the territory of the adjective-gender once set aside (§ above): held FP=0 this time thanks to the POS-tagger + _np_subject + guards. Third lever: -er/-é/-ez endings (existing rule) widened by three measured FP-safe governors — être participle ("a été fabriquer"→fabriqué), reflexive clitic skipped to reach the true governor ("veut se séparé"→séparer; le/la/les excluded as ambiguous with the determiner: "la cité"=noun), causative "faire + infinitive" ("fait déclaré"→déclarer) — +57 corrections. Fourth lever, the most notable: ATTRIBUTIVE adjective agreement ([article + noun + adjective] → gender×number, "les domaines industriel"→industriels) = the adjective-gender once set aside (§18.2, "for lack of a POS/tagger"), re-opened now that we have the tagger: a naive prototype = 60 FP on 2500 correct sentences → brought to 1 (a real error) by five measured guards (ADJ∧NOUN tagger, pure lexical gender, number read on the article and not the noun's -s [otherwise "mois/cursus" invariants], invariants/proper-noun/distributive-coordination/fixed/epicene excluded) — +114 corrections; modest recall because the tight guards that give FP=0 exclude the rest (the FP-safe ceiling of adjective-gender in red; beyond that = green vigilance). WiCoPaCo campaign tally: ~960 real corrections gained, 3 FP fixed, zero FP added. Lesson: FP=0 validation requires, after the correct text (UD), a corpus of real errors (the FP hide in the structures the clean text lacks). All in 3-engine parity (parity_corr.js / parity_core.js); WiCoPaCo data not redistributed.[elision letter]+[word] ("lhopital"→l'hôpital, "dargen"→d'argent, "cetait"→c'était) restored (accents included), safe prefixes l'/d'/j'/c'/s' only (m'/t'/n' excluded: "metre"=mètre≠m'être); elision FP on UD 10→7 (net gain, thanks to the "c' before e/i" guard), vigilance tier. Dys corpus not redistributed.18.5 Sources (corrector & dys)
Typology of dys errors (FR) — Bodard J. (2020), Spécificités des erreurs d'orthographe des personnes dyslexiques : analyse d'un corpus de productions écrites, JEP-TALN-RÉCITAL 2020 (source of the ≈43 % phonetic / 38 % grammatical / 6 % segmentation distribution and of the dys corpus used); Plisson A., Daigle D. & Montésinos-Gelet I. (2013), The Spelling Skills of French-Speaking Dyslexic Children, Dyslexia 19(2), DOI 10.1002/dys.1454 (base typology); Antoine J.-Y. et al. (2019), Ma copie adore le vélo…, TALN 2019, HAL hal-02375246; Sitbon L., Bellot P. & Blache P. (2007), Traitements phrastiques phonétiques pour la réécriture de phrases dysorthographiées, TALN 2007, HAL hal-01321119.
Spelling correction & dys (other languages) — Damerau F. (1964), A technique for computer detection and correction of spelling errors, CACM 7(3), DOI 10.1145/363958.363994 (edit distance); Pedler J. (2007), Computer Correction of Real-word Spelling Errors in Dyslexic Text, PhD thesis, Univ. of London; Rello L., Baeza-Yates R. & Llisterri J. (2014), DysList: An Annotated Resource of Dyslexic Errors, LREC 2014; Brill E. & Moore R. (2000), An Improved Error Model for Noisy Channel Spelling Correction, ACL 2000 (a learned error model, tested in §measurements and set aside); Wilcox-O'Hearn A. (2014), Detection is the central problem in real-word spelling correction, arXiv:1408.3153 (the real-word wall: detecting the subject, not correcting it — frames the OS agreement of §18.4).
Corpora & lexicons (licences) — WiCoPaCo: Max A. & Wisniewski G. (2010), Mining Naturally-occurring Corrections and Paraphrases from Wikipedia's Revision History, LREC 2010, GFDL (grammar validation corpus, ~45k pairs; not redistributed); Lexique: New B., Pallier C., Brysbaert M. & Ferrand L. (2004), Behavior Research Methods 36(3), DOI 10.3758/BF03195598 (frequencies, gender, POS); Universal Dependencies French-GSD (CC BY-SA, at-scale FP guard fp_scale_probe); Catach N. (1986), L'orthographe française, Nathan (graphemes/morphograms). The dys corpus (FFDys, Dys ASEI platform) stays private (personal data, never redistributed).
18.3 Lexique 4 → cgram & dual-route grammar
build_cgram.py extracts from Lexique 4: 12,415 verb forms (the corrector's coverage), 53,050 unambiguous-gender nouns (the lexical gender route), a high-frequency subset embedded in the app (the <script id="vdc-lex"> block) and the adjectival pairs. The grammar then follows OMEGA's signature architecture (GRAMMAIRE_DOUBLE_VOIE.md): a dual route (lexical cgram × sub-lexical rules, crossed as a joint §3) and a dual loop (bottom-up = decide; top-down = learn from known targets — descending_probe.py learns the gender lexicon from usage: 100 % precision, FP=0, but data-bound: its value comes from volume = real corrected copies).
evo/PHRASE_HANGMAN_PROBE.md.18.4 Typing aid, learning loop & deployment update 24/06/2026
Green "vigilance" layer (update 30/06/2026). A second underline level (dotted green, app + extension) flags confusable words — homophones and paronyms (~80 groups curated from Lexique 4, CC BY-SA), with options + a meaning gloss. It does not assert an error → outside FP=0 (the assertive red stays in flags ⊆ Python parity). The distributional (meaning) signal, too noisy to correct, is finally useful here: it orders the options and softens the mark when context confirms the written usage — it never pushes another form (measured: "il porte une paire de lunettes" must not be "corrected"). Single source: dictee/build_confusables.js; candidate miners build_confusables_auto.py / paronyme_miner.py (the auto version is too noisy → curation).
Être/avoir, capitalisation, run-on (update 30/06/2026). Four additions in 3-engine parity on the No. 1 dys error (être/avoir) and punctuation/case:
(1) être↔avoir usage 🔴 — "il est faim"→a, "il a allé"→est, "on est 10 ans"→a (closed lists: avoir idioms, intransitive être verbs, age — never a blind swap; abstain otherwise).
(2) misspelled auxiliary 🔴 — "vous ete"→êtes, "nous avon"→avons (edit distance toward the agreed form; the FULL_AUX guard = all valid forms, "aurait" never touched; abstain if être↔avoir is ambiguous).
(3) capitalisation 🔴 — a lowercase word after . ! ? → capital; never the 1st token (fragment); abbreviation guard ("M. dupont").
(4) run-on 🟢 (vigilance) — two pronoun+verb clauses glued together ("il mange ‖ il dort") → "missing punctuation?" without imposing (meaning depends on it → dissociated from red). Conservative: anti-inversion ("dit-il"), anti-coordination/relative.
All on a segments layer (punctuation/capitals = boundaries), which also stops the subject from crossing a period/comma. FP=0 measured (CI guard recall_probe). Ref: dictee/correcteur_probe.py.
At-scale FP=0 audit & re-tiering (update 30/06/2026). The first FP=0 test on 14,450 correct sentences (UD corpus — any flag = an FP; never done before, the 30–95-sentence batteries did not see it). Verdict: 4.70 % FP. (1) Regression eliminated: misspelled aux 241→0 FP ("ne"→a), capitalisation 180→35 ("L. casei", ellipses, decimals). (2) Grammatical homophones decided by GRAMMAR (not a demotion to green: these are errors with a syntactic role — a=verb vs à=prep, on=subject vs ont=verb…). The FP came from precise gaps, filled with the machinery: segments layer ("qui, à 4°C" no longer crosses the comma), auxiliary frame "a/ont + participle" (reconstructed infinitive checked in the verb lexicon → rules out -é nouns), glued pronouns ("qu'ils"), inversion ("avait-on"), son/sont rewritten on what follows + a plural determiner, sentence-start guards ("Mais…") and proper noun ("et Bob"). é/er (a -é noun guard) and SV agreement (an aux+participle guard) hardened. Result: red 4.70 % → 1.73 % (homophones in red, part of which are real errors: "la mode à largement contribué"→a). The rate is now locked in CI by dictee/fp_scale_probe.py (a ceiling on 2500 correct sentences). Lesson: the UD scan is the real FP=0 test.
Full audit & application by confidence (update 03/07/2026). A cross-checked multi-agent audit (8 subsystems, 78 findings → 47 confirmed + 26 minor) was followed by a fix campaign (PR #57-#66): (1) application by CONFIDENCE — the source text is never rewritten; the correction is shown separately; the safe corrections (FP=0) and spelling candidates (~79 % precision measured on real dys) are applied by default, each word = an undo/reapply toggle; the orange stays on click. (2) Replacement quality locked in CI: a frequency-dominance guard on ranking ("une tres bonne note" no longer becomes "trés", "jamai" no longer "jamal"), capital preserved ("Ecole"→"École"), typographic apostrophe ’ normalised (mobile), "silent final letter" promoted ("dehor"→dehors, FP=0 on 2,500 UD). (3) Delivery guarded in CI: extension zip freshness-checked (it was 53 commits behind), service worker probed (precache reshape → real offline on Cloudflare despite the 308s), POS-tagger finally loaded in the extension, non-destructive contenteditable. (4) Pedagogy: 4 wrong messages fixed (elided governor "l'automne", nominal -ons "maisons", V.CV syllabation, stage aggregated per session). (5) OMEGA·KEY v0.19: generated↔imported key interop repaired, peer seed validated, zero external requests. Current FP-scale: 2.04 % (CI ceiling 3 %).
The real-word agreement wall, cracked — subject OS arbitration (update 07/2026). The real-word agreement error (the verb stays a valid word but wrongly agreed: "les enfants joue", "les rapports que l'entreprise livrera") is, in the literature, the central problem of the corrector (Wilcox-O'Hearn, §18.5): deciding it requires recovering the syntactic subject, often out of reach ("de N" complements, coordination, distant subject). The red agreement parser (_np_subject) abstains there by construction — which is precisely what holds its FP=0. Measured: no subject route alone crosses this wall (nearest-noun 81 %, coherence LM 74 %) and the hard combinations (sum of scores, product of marginals, gate) flood — two routes out of three permanently support "the word is correct", diluting the one reliable vote. What cracked it, exactly the lesson "crossing = arbitrating by reliability, not adding": the Hangman's OS arbitration — a convex blend of subject-routes weighted by reliability (the peakedness of each distribution, μ = r/(1+r)), with a baked language model (~180 KB, UD-GSD held-out, build_os_lm.py) carrying the confidence gradient that makes the threshold useful. On the "de N" residue the parser gives up on, confident OS arbitration recovers the subject's number at ~94-97 %, where no single route could. Shipped as orange vigilance ("agreement to check", never rewrites → the red FP=0 stays intact), in 3-engine parity, guarded in CI (dictee/parity_os.js). Validated on the real chat register (real dys, not formal UD): flood 0 % on chat, 0.04 % on varied text, recall 54 % of number disagreement — after re-inheriting the structural guards of the sibling rules (participle, compound tense, pronoun-subject, elided subject "l'X") that kill the passé-composé FP. A real-word wall reputed impassable for a portable tool (no dependency parser, no large LM) — crossed by the same arbitration geometry as Hangman.
And part of the wall falls in red — the non-adjacent subject (update 19/07/2026). OS arbitration lives in orange because a neighbouring noun-subject cannot be told apart from a complement for certain. But a family of cases can be decided affirmatively, at FP=0 — the principle (formulated by Rem): the subject is read elsewhere than just before the verb. Four screens, four red rules: (1) coordinated verb — "les chats mangent et dort"→dorment, the sibling verb carries the number of the shared subject (rule_accord_verb_coord); (2) object-relative — "les enfants que je vois joue"→jouent, the antecedent carries the number, a finite verb embedded separating the relative from the completive (rule_accord_rel_obj, extended to the dont/où anchors always relative); (3) parenthetical — "les livres, malgré leur prix, reste chers"→restent, subject and verb in the same clause cut by a comma-parenthesis, anchored on the plural determiner at the head of the clause (rule_accord_incise). Each rests on an audible signal (the plural "les/des" heard when the verb mark is silent) and a net that rules out false friends (homograph noun-verbs, invariable colours, enumerations). 0 FP on 2,500 UD sentences + batteries of tricky traps (comparatives, completives, "de N" complements, enumerations). The boundary stays honest: the general subject-complement ("la couleur de la voiture") remains orange — but the structurally recoverable part goes red. The bare imperative ("arrives plus vite"→arrive) was set aside, measured undecidable (imperative vs elliptical "tu arrives").
Hunting "raw" false positives & lexical completeness (update 19/07/2026). On difficult correct sentences (formal/colloquial registers, Certificat Voltaire-style traps), several FP invisible on clean corpus: perception/factitive participle + infinitive = invariable — "se les était vu confisquer"→vue (the guard existed for avoir, was missing for être; + causative "fait"); invariable colours/materials — "des gants crème", "bleu marine" were no longer taken for verbs (the _INVAR_COLOR set, 48 words); quantifiers — "la plupart du temps suffit" (number read on the complement, not forced plural), "nombre de spécialistes doutent" ("nombre" is not an infinitive-subject). A conflict/liaison audit of the pipeline (all rules instrumented per token, 2,500 UD: 0 disagreement; span merge: 0 overlap) lifted one last orange FP: the plural vigilance proposed "les chats mangent"→mangents (mistagged verb) and "yeux marron"→marrons (colour) — fixed. On the lexicon side: the Wiktionary outlet (46k kaikki entries CC BY-SA) is confirmed in production — SP.WORDS 214k words ("unknown word" flood −56 %), gender 21,903 nouns (including +56 slang terms finally injected: crush, docteuse), POS inherited; the IPA is still extracted but measured-refuted as a correction key (dys errors are an approximate phonetics — a faithful key over-distinguishes). All in 3-engine parity, at-scale FP=0 guard (1.5 % on 2,500 UD, CI ceiling 3 %).
Typing aid (completion). The corrector is also a real-time typing aid: for the word under the cursor it offers a completion (longer words sharing the prefix, sorted by frequency and accented: recev→recevoir, télé→téléphone) in addition to the correction. Accents are restored via the speller's lexicon (OMEGA_LEX4 is deaccented — Hangman plays without accents): an embedded, offline solution. Outside the parity scope: a completion is a UI suggestion, not an FP=0 flag (the flags ⊆ Python invariant is not concerned).
Learning loop. A unified dys profile (DysProfile) aggregates the error families of both writing surfaces (dictation = supervised rate, known target; corrector = counting during composition). It drives an adaptive word selection in the dictation — a weighted draw over several weaknesses (no longer only the single most-missed family), with a variety threshold (≈ 45 % free draws + anti-repetition, never 3× the same family in a row) so as not to demotivate — and displays a progress curve per family. Hangman stays out of the loop: guessing letters (on a deaccented word) does not exercise writing — an assumed category error.
Three engines & deployment. The same corrector runs in verified parity across three engines (Python reference correcteur_probe.py ↔ app ↔ browser extension dys-core.js; invariant flags ⊆ Python, FP=0, tested in CI). The monolithic app (Hangman + dictation + corrector, all included) is installable and offline (PWA). Roadmap & status: DICTEE_ROADMAP.md; timeline: dictee/JOURNAL.md; UI: the 🩹 Correcteur (Corrector) and ✍️ Dictée diag (Diagnostic dictation) buttons in the app.
18.6 Voice input — route A (web) & route B (local research) update 31/07/2026
The real dys need for voice is to BE ABLE TO SPEAK (bypass the keyboard), not to be corrected afterwards. Two routes, one deployed, the other relegated to research.
Route A — Web Speech + OMEGA (deployed on the site & the extension). webkitSpeechRecognition (the browser's voice service, Google) returns text all lowercase, with no punctuation → OMEGA re-dresses it automatically: capitals (sentence start + after . ! ?), red FP=0 correction applied on its own (reversible), Copy. Prosodic punctuation measured — we open the mic ourselves in parallel (Web Audio AnalyserNode, zero model): silence (RMS energy) decides a comma (~190 ms) / a period (~600 ms), the pitch rise (F0, autocorrelation) places the "?" (≥ +4 semitones). An indispensable complement: a lexical question cue, because qu- questions ("où en sommes-nous", "comment ça va") fall in pitch — prosody alone misses them. No voice punctuation command (saying "virgule"/"point") — too many false positives (the word may genuinely be dictated: "un point c'est tout") → it would break the text. Honesty (cf. the scoped promise, §0.5): the audio goes to the browser's voice service (opt-in checkbox, OFF by default, explicit notice); the corrector itself stays 100 % offline.
Route B — OMEGA's phonetic route as an ASR back-end (research, closed). "As we correct the text, we can correct the sound" (Rem): a free acoustic model (wav2vec2-french-phonemizer, MIT) outputs phonemes, the dual route phon↔ortho does the rest, zero Google. Measured arc measured (clean voice, 147 words): raw p2g 13.6 % → +trigram grammar 49.7 % (+36 pts — grammar dominates, as in rich context) → +exact homophones (inverse index 116k) 63.3 % → +the speller's 214k lexicon & fuzzy pronunciation recovery 70.1 % → +the red corrector 72.8 % → +the subject parser in confidence mode (gender flips allowed: spoken homophones, free) 76.9 %. On a real (dys) voice the chain holds 81 % — better than clean TTS. Prosodic punctuation = F1 100 % (silence at word boundaries, free in wav2vec2) and pitch→"?" confirmed on a real voice (questions rise: +4 to +17 semitones; 0 false "?"), which synthetic TTS could not show (prosody stripped).
os_subj_lm wins because its rarity does not interfere. (2) OS arbitration (μ=r/(1+r)) for ASR = worse under real noise — its "robustness" measured before was an artefact of synthetic noise; down-weighting the emission of a reliable acoustic model hurts. (3) Lexicality filter = +0 — the bad choices are real rare words, not non-words (a selection problem, not a lexicality one). Cause of the ceiling: the residue = a wrong real word on a mis-heard sound = the acoustic model, not OMEGA. OMEGA is a decoder/LM, not an acoustic model.Verdict measured: for a LOCAL tool, Whisper wins; for the web, OMEGA still makes sense. Whisper small locally (faster-whisper, CTranslate2 int8, open MIT weights — not Google) = 98 % (52/53) on the same real voice, punctuation + capitals + "?" included (even qu- questions) — and the OMEGA corrector on top has "nothing to correct". The phon route (81 %, decoding + prosody + pitch→?) remains the research proof (the same cognitive dual-route, repointed from the keyboard to the mic), superseded for use. But Whisper is too heavy for the browser: on the web, OMEGA's value on voice lives in route A (client-side re-dressing + prosody). Detail: dictee/ASR_VOIE_B.md, dictee/asr_voix.py; UI: the site's Voice input page (in French) + the extension panel.
recherche.html, evo/EVO_ROADMAP.md, scripts evo/evo_o2_*.js.Limits (honest). Validation still synthetic + held-out — no real student copies (field validation with speech therapists / online FR corpus fetch_gec_corpus.py = to do; they validate and feed the top-down loop). The corrector's verb coverage via whitelist + cgram (homographs: cross against context). Gender agreement — measured on real UD (dictee/gender_probe_ud.py, 355k gold words): the determiner is validated and improved (recall 67→73 %, FP 0.10/1000 — verb-homograph guard lifted, wired in parity across the 3 engines, battery FP=0 intact); the adjective is rightly disabled (3.37 FP/1000) — a POS-tagger would remove only ~48 % (→ 1.76/1000, still ~20× the determiner), because adjectival agreement requires scope (noun-head, extent) = parsing, not just a tagger. Approximate "surface" normaliser.