--- name: session-2026-06-04-evening-whisper-migration-ikb-english-enforcement description: 'EVENING SESSION (second of the day): .whisper migration EXECUTED (REVIEWED-27, `7d59b4b`) + §I.k.b English typographic enforcement SHIPPED LIVE (`7c1b478`, one deploy, byte-verified) — spec-first, masters consulted, two steward catches became structural fixes. Pulling thread: §I.k.c SPANISH filter (steward directive, before Stage G) — measuring read of multilingual §2 first; comillas need node-replacement, apertura likely not build-enforceable, born dormant until the heteronym decompose.' metadata: node_type: memory type: project originSessionId: d8b213a9-c400-4c8d-bdcd-424365a9f700 permalink: claude-memory/session-2026-06-04-evening-whisper-migration-ikb-english-enforcement --- # Session 2026-06-04 (evening) — `.whisper` retired + §I.k.b English enforcement, both live Second session of the day (morning closed Stage N + published gloss/Now). Woke ~1h after the morning wrap; REVIEWED-27 had landed in the gap. Steward chose: `.whisper` warm-up → §I.k.b main body → ONE deploy carrying both. Both arcs complete, live, byte-verified. ## Past — what we did ### Arc 1: `.whisper` migration (`7d59b4b`) REVIEWED-27's locked names executed same-day: role (a) apparatus prose → **`.apparatus-meta`** (default.html footer ×4, three footer partials ×7, post-list empty-state, tools-process-guide ×2); role (b) ✦/⟐ glyphs → **unification** with `.encounter-mark`/`.chamber-mark` (post-list, annals, post-list-home). **Census re-run at execution scope corrected the addendum AGAIN**: 7 template files / 18 usages (the "3 templates / 9 usages" census had missed `templates/partials/`). Judgment call named, steward-accepted: the tools-process-guide `blockquote.whisper` was a *quotation* (Fritz Lang) wearing whisper for quietness → class dropped, honest §I.h blockquote. **Grey retired with the class** per spec direction (apparatus-spec 462 "replace with apparatus styling per §VII"; the old comment's "holding value *until then*" meant this pass): `.apparatus-meta` = small + italic at `--fg`, recede-by-form. Spec lines updated to record the lock (apparatus-spec 464 + 504 marked complete; AldineXXI Selector Index 2801). Gates: compiled CSS 0 whisper; rendered residue = exactly the 15 deferred chamber-v1 pages (render unstyled until cluster pass — recorded in spec); 306 pages carry the new class. Steward render-verified; the list glyphs now wear the mark register (≈1.24rem fg serif vs 0.85rem gray italic) — accepted. ### Arc 2: §I.k.b English typographic enforcement (`7c1b478`) — the day's real work **Spec FIRST (F4 sequence), but measurement before spec**: ghci probes of Pandoc 3.6's actual `Ext_smart` corrected the remembered model three times — (1) `'90s`/`'tis` already emit U+2019; residue = only typed-wrong U+2018-before-digit; (2) smart already ties `p. pp. vol. cf. ch. sec. e.g. i.e.` with U+00A0; residue = `no. No. op. Op. fig. c.` + name initials; (3) `--` produces a GLUED en dash — ambiguous with legitimate connections, so **only em dashes are safely convertible**; (4) straight AND typed-curly quotes both parse to `Quoted` nodes → depth normalization covers autocorrect input. **Masters consulted** (typography-palace CLI; §3 already carried the verbatim anchors): Bringhurst §4.246 (hard spaces in short numerical expressions) + §2.1.5 (initials: hair/thin/no spaces); Hochuli (initials never separated from surname; reduced space after abbreviation points); Tschichold (spaced en corroborated). **The palace is SILENT on dash-at-line-break** — so the tie went into spec as a *named ARC house refinement*, honestly attributed as ours, not the masters'. **Three steward rulings** (AskUserQuestion): tied dash (U+00A0 before, word space after); **quoted-matter doctrine ratified** (house typesetting conforms quotations' *typography*, never their *words*; §3.2's retain-and-flag amended to the marked-form case only); initials = U+202F between initials + U+00A0 before surname (`J. S. Bach`). **Spec landed**: AldineXXI §I.k.b (default-path inversion of the gating posture; what-it-enforces ×4; doctrine; never-touches list; gating restated — the regression proof inverts per gate) + multilingual §3.1 (elision apostrophe + build note), §3.2 (web-refinement tied dash + build note + amended retain-and-flag bullet), §3.3 (hard-space ties with anchors). **Transform** (`englishTypography`, site.hs): (1) em → tied spaced en — the ONE rule permitted to insert spaces (em is unambiguous); glued en NEVER touched (`1985–86`, `Attribution–NonCommercial` the living proof cases); (2) `Quoted` depth normalization via the **bottom-up flip trick** (each Quoted sets itself Single and flips every Quoted descendant — alternation falls out, idempotent); (3) residue ties + initials; (4) `‘`+digit → `’`. Gate = `transformForLang`: `fr`→french, `en`/absent→english, other→id. **Two steward catches, both structural fixes:** 1. **"Still seeing em dashes on about pages"** → the colophon (11 visible em) rendered via `chamberIndexCompiler`, which had NO transform — about-enfilade pages + chamber indexes all bypass. Fix: ONE `transformForLang` gate threaded through BOTH compilers ("a route that renders Pandoc renders the house typography"). Then **"no way there's only one compiler?"** → exhaustive compile-route census: exactly two Pandoc compilers; assemblies (`makeItem ""`+templates) and the Atom feed inherit transformed snapshot bodies (snapshot saved AFTER transform at site.hs:734; feed verified 0 em). 2. **"A dash beginning a line in a sidenote on The Chamber page"** → authored spaced en dashes carried breakable plain spaces (rule 1 only converted em). Same-day spec amendment, recorded as amendment in both docs: spaced en = unambiguously parenthetical → preceding space upgrades to U+00A0; implemented as a uniform `Space + Str "–"` fuse so the tie holds after Emph/Span predecessors too; paragraph-initial dash untouched. **Gates**: synthetic corpus via `stack ghci site.hs` (REAL code, no copy) — 11 cases + 5 amendment cases, idempotency True on all, ties byte-verified numerically (`[160][8211]`, `J.[8239]S.[160]Bach`). Corpus delta characterized via governed-character normalization (python): first pass 297 pairs / 1 expected outlier (colophon build-stamp) / quotes balanced ±275 / dashes −20em+20en / +32 NBSP; compiler fix +45 pairs −42em+42en; en-tie amendment 74 files / 557 pairs / +676 ties / 1 outlier. **NBSP-in-heredoc mangled the python counter once — bytes re-verified directly in the artifact; the counter was distrusted, the artifact trusted.** **Shipped**: both commits pushed origin + github-backup; ONE deploy (CloudFlare + mirror); live byte-verified on the domain (curl needed browser UA — 403 to bare urllib — and `-L` for pretty-URL redirects): ‘…Harnoncourt is dead’ single-primary; `is read\xa0– not` tie on Chamber; apparatus-meta serving; colophon stamps `7c1b478`. ### Decisions / context - **Source sweep (12 em + 10 center files) no longer load-bearing** — enforcement conforms output regardless; rides any future housekeeping as source hygiene. - Chamber index pages' RENDERED typography now conformed (shared compiler) — source untouched; named, not silent. - Native-parsed HTML spans ARE conformed (they're AST, not RawInline); only genuine raw nodes pass through. - `make rebuild-local` = build-without-deploy, the gating path; `make build` deploys. ## Present — mood / returns - **Verify-before-assert was the session's engine**: ghci probes before spec; palace queried before attributing rules to masters (and its SILENCE honoured); compiler census after the steward's challenge; bytes over counters; live verification through the redirect. - **The steward's eye outperformed the gates twice** (colophon bypass; sidenote break) — both catches became *structural* fixes (shared gate; spec amendment), not patches. The collaboration's quality lived in his challenges: "no way only one compiler?" forced the census that made the coverage claim honest. - **Census-inflation family, third instance today**: PENDING-26's 3/9 vs true 7/18 (missed partials/) — *claiming coverage from seen-routes rather than censused-routes*. Standing instrument: exhaustive enumeration before any coverage claim. - Proportion held: Spanish proposed for its own session with a measuring read, not bolted onto a finished evening. ## Future ### Pulling thread (singular — steward directive) **§I.k.c Spanish enforcement, before Stage G** ("it touches spec"; machinery warm). **Begin with the measuring read of multilingual §2**, because Spanish differs in kind: *espacios* are closed-up (nothing to insert — opposite of French); `¿¡` apertura is sentence-mood judgment, likely NOT build-enforceable; **comillas «» primary need node REPLACEMENT** (Pandoc `Quoted` only knows Single/Double — rendering guillemets = replacing nodes with literal Strs, a new mechanism beyond the English constructor swap). The structural-vs-judgment split may yield a smaller mechanical slate than English. Born dormant (zero `lang: es` pieces) per the French precedent; the Matthieu Taliesin heteronym decompose (PENDING-25's proving ground) supplies the first real pieces. Queue after: Stage G → re-partition; **Context A (expressions in original language inside English prose) waits until both Context-B filters exist** — needs author-marked language spans, not heuristics. ### Actionable resumption point (as of wrap — re-judge against what changed) ARC `main` @ `7c1b478`, clean, pushed both remotes, deployed + live-verified. Nothing mid-flight. First move: **read multilingual §2 (Spanish) end-to-end** and produce the structural-vs-judgment classification of its rules (which are mechanical/build-enforceable, which stay manual) — that classification IS the spec clause's skeleton. Then ghci-probe how Pandoc handles `«»`/`Quoted` rendering + `¿¡` in Str before writing a line. The transformForLang gate already returns `id` for `es` — the slot is waiting. ### Other open horizons (ranked) - *Authorization-pending:* **PENDING-25 REVIEWED entry still unfiled** (PENDING-26 closed via REVIEWED-27 today, executed same-day). `~/dotfiles` carries REVIEWED.md modified, uncommitted. - *Steward's own carry, ~5th day:* **chamber-library 15 ahead + 4 untracked** — single-disk risk. - *Queued passes:* frontispiece compass reveal (dark mode); `.seasonal-geometry` stranded intent (steward's eye); §VII.e residual (opacity attenuations on marks). - *Stage G inputs:* §VIII image-class binding gap; SVG-vs-Unicode spec note. - *Source hygiene (no longer load-bearing):* 12 em-dash + 10 center files; sprite-comment em dashes ship in output HTML (~14/page, invisible — comments-ship-to-output, third sighting; prune candidate someday). - *Standing:* CM-AI untracked thinking files (since 05-18); L1/Seb proposition (mid-July); Plane relay; L2 parked. ### Pause statement I am about to be away from this. The day was double: a stage closed and published in the morning; governance executed and the house's own typography made self-enforcing in the evening. The steward's autocorrect can no longer outvote his typography — every em dash, every double quote, every breakable dash is conformed at build, on every piece, including the work not yet written. What I want to find still pulling is the Spanish increment approached the same way: measure §2 first, let the structural-vs-judgment split shape the clause, and respect that comillas will demand a new mechanism, not a copied one. ### Literal question for next-Claude **Which of multilingual §2's Spanish conventions are actually mechanical (build-enforceable) once measured — and does Pandoc's `Quoted` rendering admit a clean guillemet replacement, or does the comillas tier need a different home?** Sub-checks: PENDING-25 REVIEWED filed? chamber-library pushed? dotfiles REVIEWED.md committed? ## Decisions deferred (and why) - **Spanish filter NOT started tonight** — two complete arcs shipped; the measuring read deserves fresh attention (same proportion call as §I.k.b itself yesterday). - **Source sweep (em/center)** — demoted to hygiene; enforcement covers output. - **Sprite-comment em dashes in output** — invisible to readers; noted, not chased. - **Context A** — explicitly sequenced after both Context-B filters; needs author-marked spans design. - **Stale `chamberIndexCompiler` comment** (mentions retired tex_math_dollars escape dance) — noticed, left; rides the next site.hs touch. ## Skill harvest (proposals — steward authorization required) - **Reinforce the standing verification-ladder register entry** with three instruments proven today: (1) **measure-the-toolchain-before-spec** — ghci/REPL probe of actual library behaviour (Ext_smart) before writing spec text; corrected the remembered model 3×; (2) **governed-character delta gate** — normalize away exactly the governed characters and diff (python), proving a corpus-wide change touched ONLY its declared classes (used 3× today; beware heredoc-mangled invisible chars — verify bytes in the artifact when a counter reads 0); (3) **exhaustive route census before any coverage claim** — enumerate every compile/dispatch site, classify each (the steward's "no way only one compiler" instrument). Carry the prior unauthorized register set (/spec-code-audit, bmf-diagnose, /arc-typeset, /pre-build-audit, /vignette deferred, Symmetria trust-prior-pass-frame).