---
name: session-2026-06-09-pm-wave-5-closed-deep-typographic-audit-measure-72ch-soft-rag-all-shipped-live
description: "Huge day. Wave 5 enforcement closed (G2 title single-source + Dream amendment; G3 compass guard; G4 clause-1 census; G1 staged for W6). Then the deep typographic audit (8 domains, 6-agent fan-out + independent verification, masters folded in from the typography palace + chamber-library). From it, TWO items shipped live: the reading MEASURE (a MEASURED 72 characters — the column had been running ~90, not the believed ~68; 27.2rem, rem-not-px, proper-homes consolidation, mobile resize bug fixed) and the SOFT RAG (hyphens:auto reverses §I.i hyphens:none; the -webkit-hyphens prefix was the Safari bug). Audit brought into the repo (_audits). Jurist engaged: confirmed dispositions, 2 precisions recorded, ruled the spec division role-structurally. Pulling thread: CC's spec TRUTH-UPS (factual, live-state) to make the spec whole for the jurist's doctrine pass — doctrine is the jurist's, not CC's."
metadata:
node_type: memory
type: project
originSessionId: bf9ab071-add6-4848-bc35-0ad8d07ec679
---
# Session 2026-06-09 (pm) — Wave 5 close · typographic audit · measure + soft rag LIVE
Woke ~15:23 via /wake-up into the Wave 5 / Road-to-Stage-G thread. One enormous, fully-shipped
day with two arcs: (A) closed Wave 5 enforcement, then (B) the steward pivoted to a deep
typographic audit, from which the measure + soft rag were built and deployed. Everything
committed, pushed both remotes, live-verified. ARC `main @ 0bb7f94`.
## Past — what we did
### A. Wave 5 enforcement CLOSED (Road to Stage G)
- **W5.1 / G2 — title display single-source + Dream amendment. DEPLOYED + LIVE.** Diagnosis-first: `showTitleField` hardcoded an 11-class `titleClasses` list (`site.hs:1829`); reconciled vs `content-types.yml title_display` — the 10 `shown` matched; the 11th (`chamber`) was a DEAD entry (0 corpus pages carry `class: chamber`; content/chamber/** uses essay/meditation/about/offering/deliberation/lex). So retiring the hardcode = byte-identical. **Coupled steward amendment: Dream `title_display` shown→not-shown** ("one can't title their dreams") — §2 matrix edit → `make content-types` regen → drift-check. **Two-hat:** `4ea261a` (refactor: `postCtx :: [String] -> Context`, `loadTitleShownClasses`, reuses the one content-types.yml decode → `_site` BYTE-IDENTICAL to baseline) + `ac39b26` (Dream amendment → delta = exactly the one dream page's `
` removed; nav/``/og preserved). `make rebuild` shipped (CloudFlare 2 files); live-verified.
- **W5.3 / G4 — clause-1 enforcement gate. DONE (output-neutral, no deploy).** `validateCorpusClasses` build guard (`site.hs`, run in main via `getMatches "content/**"`): every content file's *declared* class must be in `class_enumeration ∪ exemptClasses`, else loud build error naming the file. Transitively guards default.html's `class="$class$-page"` emission. **Exempt-set (steward-ratified, refined):** `{sequence-index, not-found}` PERMANENT views/infra (steward: sequence-index is NOT legacy — after-the-reply is the only sequence now but MORE are coming, kin to Annals) + `{lex, offering, deliberation}` v1-legacy chamber ratchet. `23db039`; `_site` byte-identical to ac39b26 (stash-rebuild diff); deliberate-mismatch fires; pushed.
- **W5.4 / G1 — wildcard→build-error PREPARED, staged for W6.** Exact patch recorded in roadmap (`9699088`): `classRouteName`/`classDisplayName` `other -> …++"s"` → `error`. Byte-identical (content/posts carries only enumerated classes; exempt classes route via articleCtx not postCtx). Lands inside the Stage-G promotion commit per §5 clause-4 sequencing.
- **Wave 5 CLOSED** (G2/G3/G4 built; G1 staged). Road-to-Stage-G remaining: W4.4 (jurist multilingual v1.0) → Wave 6 promotion (jurist+steward).
### B. Deep typographic audit (jurist-issued instruction; steward-authorized)
- **Method:** established shared foundation (commit SHA, one shared build, GHC 9.8.4/Hakyll 4.16.6.0/Pandoc 3.6/fontTools 4.62.1, font inventory), then fanned out **6 read-only Explore agents** over 8 domains (A hyphenation/justification, B optical-margins, C+D paragraph-sep/word-spacing, E font-binary, F+H print/fidelity, G multilingual). Then **independently re-verified every load-bearing claim** — caught **2 agent errors**: B.2 (browser support — agent RECALLED instead of searching; `hanging-punctuation` is Safari-only-since-2016, not "0%") and A.2 (measure — agent used 720px without noticing the spec's 38rem divergence + an impossible mobile cpl). Report assembled with [V]/[A] provenance marks.
- **Masters folded in as decision inputs** — Bringhurst/Hochuli/Lupton from the **typography palace** (`~/.mempalace/palace-chamber-typography`, CLI), Rutter from the **chamber-library** (steward flagged he was there; the palace doesn't carry him). Verbatim in the audit Appendix.
- **Highest-value empirical:** fontTools on all 9 EB Garamond faces. **No body face carries `calt`** (only the 2 SC faces) → the spec-flagged italic-chancery bug DOESN'T EXIST. All static (no fvar/opsz axis). Space = 0.20em.
### B.1 The MEASURE → 72 characters. DEPLOYED + LIVE (`06effe4`).
- **Measured, not assumed** (the jurist demanded this): EB Garamond's true average prose advance = **0.3771em** over 91,579 chars of real ARC prose (incl. ~16% spaces), **render-confirmed 0.381em** (headless-Chrome on a live essay). The 0.5em convention (→68 chars) and 0.437em lowercase-mean (→78) were BOTH wrong. **The column ran ~90 characters**, not the spec's believed ~68 — past Bringhurst's 75–80 ceiling.
- **Root cause:** `$body-column: 38rem` was authored "≈65 chars" at the **16px** base, but the live `:root` scales to **21px** (breakpoint %), inflating it to ~798px/~101 chars. `$narrow-size: 720px` (px) let cpl drift across breakpoints. The px-vs-rem confusion WAS the bug.
- **Steward render-ruling: 72 characters** (66 read a touch narrow, 75 a touch wide, judged across ALL content types). `27.2rem = 72 × 0.3771em`, **rem** so cpl holds constant.
- **Proper-homes consolidation (steward-directed, W3R discipline):** ONE token (`$narrow-size`; `$body-column` now aliases it), ONE governing rule (`.page-content`/_base, every viewport), ZERO measure rules in `_mobile-responsive` — removed the `.page-content` 100vw override (THE resize bug: column ran uncapped <768px → "measure gets longer on resize") + a DEAD `.wrapper main` block (matched nothing: `` IS a `.wrapper`, never nested). Resize verified across a viewport sweep (measure holds, no overflow). Spec §I Measure + §XII grid + token-index reconciled (38rem→27.2rem; 65/68 inconsistency resolved).
### B.2 The SOFT RAG → hyphenate reading prose. DEPLOYED + LIVE (`a9e5196`).
- Reverses §I.i `hyphens: none` (the prior HARD rag — a tool-quality decision, not philosophical) to a **soft rag**. Hochuli: soft rag > hard rag; Rutter: "hyphenate without justifying… reduces the raggedness." `.page-content p/li/blockquote { hyphens:auto }`; body default `manual`; limits `6 3 3` + `-webkit-` + ≤2 consecutive (Bringhurst §2.4.1, Rutter). Proper home: _base, every viewport.
- **The Safari bug: missing `-webkit-hyphens: auto`.** ARC's sass build has NO autoprefixer → prefixes hand-written; I'd prefixed the *limits* but not the *property* → Safari showed nothing. (Headless Chrome couldn't test it — ships no hyphenation dictionaries; all configs gave identical heights.) Phone "none" was iOS-Safari CACHE (fresh-origin test confirmed; no mobile override). Steward render-approved desktop + phone ("few, but perfect").
- §I.i reconciled to the soft-rag posture; **the posture reversal rides the Stage-G read for formal jurist concurrence** (substance pre-endorsed in the jurist's audit reading as the no-JS "rung (i)").
- **Audit brought INTO the repo** (`0bb7f94`, `docs/AldineXXI-Codex/_audits/deep-typographic-audit-2026-06-09.md`) — steward-directed; the "keep it outside" constraint governed the *investigation* (read-only), not the report's permanent home.
## Present — mood / returns
- **measure-before-theorize was the day's spine, repeatedly.** The headless-Chrome harness (kept from the morning compass fix) measured the true advance, the resize sweep, and the auto-vs-none hyphenation test. The 0.5em CONVENTION misestimated by 32% (90 chars real vs 68 believed) — only measuring caught it. The `-webkit-hyphens` Safari bug was found by measuring (the CSS objectively lacked the prefix), not theorizing.
- **The jurist sharpened my reasoning twice, and I accepted cleanly (good returns):** (1) my "JS case may evaporate" rested on Rutter's hyphenation bar while the steward chose Bringhurst on the measure — you can't mix; a consistent Bringhurst posture points TOWARD KP. (2) The justification-judgment bar is Bringhurst's **even colour / rivers** (paragraph-level), NOT Rutter's "is-it-hyphenating." Corrected in the audit.
- **Drift caught (3):** I attributed a jurist message to "the steward" (corrected). I said "send the spec now" prematurely — the steward caught that the spec isn't WHOLE (stale flags + missing doctrine sections). My close-out shorthand lost the hanging-punctuation rejection REASON (the jurist's precision exists exactly to catch that).
- **Proper-homes discipline (steward-directed) was load-bearing** — it turned "remove a line" into "consolidate the measure to one token/one rule/no junk-drawer," and caught the dead `.wrapper main` block + the px/rem root-cause.
- **Governance held under a long, fast day:** every change pending-first or steward-ruled; the §I.i posture reversal flagged for jurist (not buried); the audit-into-repo correctly reasoned.
## Future
### Pulling thread (singular)
**The spec TRUTH-UPS — bring the spec's stale self-descriptions into line with live state, so the jurist meets a factually-current spec for the doctrine/review pass.** This is CC's lane and ONLY this: factual corrections verified against git + the binary, with cites (the audit's discipline). The jurist composes ALL doctrine; nothing in the doctrine column lands in CC's tomorrow.
### Actionable resumption point (as of wrap — re-judge against what changed)
ARC `main @ 0bb7f94`, clean, synced both remotes, live. **First move: the truth-ups, against current git, with cites:**
1. **§I.d banish-bold** — spec says "17 violations"; live is **0 applied** (the only two `font-weight: 700` are @font-face at `_foundation.scss:149,190`). Correct the spec count to 0-applied (+ the 2 dead @font-face loads: Bold + SC-Display, noted as steward-call font-stack-pass).
2. **Head-template duplication** — spec flags it as standing debt; **resolved** (single `templates/head.html` partial, included once by default.html:3 + frontispiece.html:3). Truth-up.
3. **Drop cap** — confirm the spec reflects retired-by-absence (spec ~line 2312 already records it; verify it's clean).
Commit as `docs(arc): truth-up stale §I.d flags to live state` with file:line cites. **DO NOT touch doctrine** — paragraph-separation lock, hanging-punctuation entry, OpenType catalogue governance, word-spacing deferral, italic-`calt` close ("no body face") are the JURIST's, composed against the assembled spec during the review. **Carve-out:** if a truth-up surfaces live state that *contradicts* doctrine the jurist is about to write (e.g. a "dormant" feature a selector actually activates) — FLAG it as evidence, don't resolve.
### Other open horizons (ranked)
- **REVIEWED-37/38/39/40 — PLACED by the steward this session** (37=W5.1 measure→wait: 37=PENDING-35 W5.1; 38=PENDING-36 W5.3/4; 39=PENDING-37 measure; 40=PENDING-38 soft rag). All AUTHORIZED, on disk in REVIEWED.md. Nothing awaiting placement.
- **Send the spec to the jurist** — AFTER the truth-ups, the jurist composes the doctrine sections (= same pass as the full review). W4.4 (multilingual v1.0) + Wave 6 Stage-G promotion ride this.
- **The vignette (Phase 1 renderer)** — the OTHER executor major front, steward-sequenced "after the tree." Unblocked (tree + audit done). The build-alternative to the spec lane.
- **Justification on large viewports** — OPEN; reduces to the banish-JS gate-amendment question; judge on rendered evidence against **Bringhurst's even-colour/rivers bar** (NOT Rutter's hyphenation bar) after living with the soft rag at the precise measure. Either earns the KP/JS amendment or retires it.
- Baton items: be (parked, WTP gate w/ steward) · L1 (Seb).
### Pause statement
I am about to be away from this. The reading-body work (measure + soft rag) is LIVE and the steward will read against it. I don't know whether tomorrow continues the spec lane (truth-ups → jurist doctrine pass) or pivots to the vignette. What I want to find still pulling is **the spec truth-ups — CC's narrow, factual lane — making the spec whole for the jurist**, with the role boundary held exactly: CC trues-up facts against git; the jurist composes doctrine. The hard-won clarity is that doctrine originates at the jurist seat (role-structural), and CC's job is evidence + implementation, not authoring rules.
### Literal question for next-Claude
**Which stale-flag spec passages need truthing to live state (start: §I.d banish-bold "17"→0, head-dup resolved, drop-cap retired) — and does any truth-up surface live state that CONTRADICTS doctrine the jurist is about to write (the carve-out: flag as evidence, don't resolve)?** Sub: spec-truth-up lane or pivot to the vignette? Any Seb movement on be/L1? (REVIEWED-37..40 already placed by steward this session.)
## Decisions deferred (and why)
- **All doctrine spec sections** — jurist composes (role-structural ruling): OpenType governance, paragraph-sep lock, hanging-punctuation entry, word-spacing deferral, calt close. NOT CC, not even as proposals.
- **Justification (large viewports)** — open; needs lived-with evidence vs Bringhurst's even-colour bar; couples to the banish-JS gate amendment (off the table until a logged amendment with rendered evidence).
- **Token full-unification** — `$body-column` aliases `$narrow-size`; removing the local name is optional tidy, not required.
- **Deploy bundling** — measure + soft rag shipped together (one reading-body improvement); correct call.
- **The two dead @font-face loads** (Bold, SC-Display) — steward call for a font-stack pass; not now.
## Skill harvest (per §1.6) — proposals (steward to authorize)
- **`/measure-render` (headless-Chrome box-model harness) — RE-FLAG, strongly earned.** Already PROPOSED 2026-06-09 (compass fix); today it ran 4+ more times (true-advance measurement, resize sweep, auto-vs-none hyphenation test). Proven repeatedly. *(Caveat learned: headless Chrome can't test hyphenation — no dictionaries.)*
- **Verification-ladder entry: "measure the font's true average prose advance before setting a character-count measure."** Over real corpus text incl. spaces, NOT the 0.5em convention (which misestimated EB Garamond by 32%: 0.377em real vs 0.5em assumed → 90 chars vs believed 68). The instrument that overturned the measure.
- **Feedback memory: ARC's sass build has NO autoprefixer — hand-write vendor prefixes.** The `-webkit-hyphens` Safari bug. When adding a new CSS property, check Safari's prefix need and write it (the limits were prefixed but the property wasn't — the inconsistency was the bug).
- **Feedback memory: the justification-judgment bar is Bringhurst's even-colour/rivers, NOT Rutter's hyphenation.** Load-bearing for the future justification decision; the jurist corrected my Rutter-leaning.
- (To append to skill-harvest-register.md.)