Files
dotfiles/claude/memory/session-2026-06-09-pm-wave5-close-typographic-audit-measure-softrag.md
T

88 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 `<h1>` removed; nav/`<title>`/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: `<main>` 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.)