diff --git a/PENDING.md b/PENDING.md index 4c2e78c..93345e6 100644 --- a/PENDING.md +++ b/PENDING.md @@ -883,3 +883,56 @@ The Jurist's six-phase authorization map governs sequencing. Cross-cutting succe **Recommendation:** **Option 1.** It closes the exact failure class (silent glyph drift) with minimal change, byte-identical output, and is precisely the "unknown = build error" the Hakyll north-star and §5 clause 3 call for. Option 2's derive-from-class is the purer single-source but the slug↔class↔sigil naming is already 1:1; making it structural earns its place only if that convention later strains — a clean follow-on, not required now (proportionality). The SVG sprite stays hand-authored either way. Steward to rule between 1 and 2. **Files affected:** `site.hs` (new build-validation in/near `loadListingDefs`; Option 2 also touches `compassRowsHtml`); `templates/reading-compass-points.html` (read for the symbol-id census; not edited); `data/content-types.yml` + `data/listings.yml` (read, not edited); content-typology §5 cross-reference (records the enforcement; ships with the Stage-G promotion per the spec's own sequencing). Verification: byte-identical compiled-output gate (Option 1) + a deliberate-mismatch test proving the check fires.w **Awaiting:** Steward authorization (choose Option 1 or 2). +**Status (2026-06-09):** STEWARD AUTHORIZED inline (chat, Option 1). Built `4936fc9`: `validateCompass` binds class→glyph→sigil structurally; `_site` byte-identical (570 files); both checks fire on deliberate mismatch. REVIEWED-36 placed by steward. DONE. + +## PENDING-35 — W5.1 / G2: single-source title display (retire the `showTitleField` hardcode) + Dream amendment +**Date:** 2026-06-09 +**Tag:** [HARDENING] +**Summary:** Retire the 11-class hardcoded `titleClasses` list in `showTitleField` (`site.hs:1829`), binding the title-shown decision structurally to `content-types.yml` `title_display` (the matrix's executable shadow) so it cannot drift by hand — the durable form the stopgap's own comment names (G2). **Coupled steward amendment:** Dream moves `title_display: shown → not-shown` (steward editorial ruling, 2026-06-09). +**Rationale:** Audit finding G2. `showTitleField` returns `"true"` for a class iff it is in a hand-maintained 11-element list whose own comment (2026-05-30) admits: *"Durable form is a table lookup (Hakyll audit §4A); until then this list must track the matrix `shown` set."* Diagnosis confirmed the list = the 10 matrix-`shown` classes + `chamber`. **`chamber` is a dead entry** — zero corpus pages carry `class: chamber` (the v1-legacy `content/chamber/**` pages carry real classes: essay/meditation/about/offering/deliberation/lex), so retiring the hardcode in favour of `title_display == "shown"` is **byte-identical** (the one definitional divergence — hardcode shows chamber, YAML marks it `n/a` — has no rendered instance). The census also surfaced classes *outside* the 14-type enumeration (`offering`, `deliberation`, `lex`, `sequence-index`, `not-found`); the replacement lookup is **permissive** (absent → not-shown), matching prior behaviour, and must NOT error on absence (unlike `validateCompass` on unknown listing classes), since `showTitle` runs over every routed item. +**Options:** +1. **Thread the shown-set as a typed parameter (recommended).** Extend the existing `content-types.yml` parser (`TypeFacts`) to capture `title_vignette.title_display`; add `loadTitleShownClasses :: IO [String]` (reuses the decode machinery beside `loadListingDefs`); load once in `main` via `preprocess`; make `showTitleField :: [String] -> Context String` and `postCtx :: [String] -> Context String`, passing the set at the ~10 `postCtx` call sites. Compile-time enforcement → the binding cannot be forgotten (the type forces it). One file read at build start; no per-item re-read. +2. **`loadBody` a tracked data item** (the `_build_info` pattern): localizes the dependency inside `showTitleField`, no call-site ripple, runtime (not compile-time) binding. Adds a parallel data path + Item-body typing. +3. Status quo — hand-synced list; rejected by the promotion gate (G2). +**Recommendation:** **Option 1.** Compile-time binding is the stronger single-source guarantee and the truest to G2's intent (drift made *impossible*, not merely *checked*); it reuses the one `content-types.yml` decode rather than adding a second reader. The call-site ripple is mechanical and contained to `main`. +**Dream amendment (coupled, steward-ruled):** `content-typology-specification.md §2` Sub-table 2 line 746: Dream `title_display` `shown → not-shown` (vignette_eligibility unchanged: `no`). Human-canonical matrix edit → `make content-types` regenerates the YAML shadow → `make content-types-check` confirms no drift. This is a steward editorial decision on the steward's own canonical document; it rides into the Stage-G jurist read (the jurist sees Dream=not-shown with this rationale and may raise it — the loop stays intact). Rendered effect: the single `class: dream` page loses its `

` title heading (the one classified delta). +**Verification (two-hat separation):** Commit 1 = the refactor alone (YAML still says dream=shown) → `_site` **byte-identical** vs pre-change baseline (proves the refactor is pure; chamber's 0 instances make the set-difference invisible). Commit 2 = the Dream amendment (spec §2 + regen) → `_site` delta = **only** the dream page's `

` removed, nothing else (expected-delta gate). Plus a liveness check: temporarily flip a class's `title_display` and confirm the rendered title tracks it (proves the binding is live, not vestigial). +**Files affected:** `site.hs` (`TypeFacts`/parser, new `loadTitleShownClasses`, `showTitleField` + `postCtx` signatures + ~10 call sites, `main` load); `docs/AldineXXI-Codex/content-typology-specification.md` §2 Sub-table 2 (Dream row — human-canonical); `data/content-types.yml` (regenerated, not hand-edited); content-typology §5 cross-reference ships with the Stage-G promotion (W6). +**Awaiting:** Steward AUTHORIZED inline (refactor + Dream amendment). Render-review PASSED ("yes, unquestionably — one can't title their dreams"). +**Status (2026-06-09):** DONE + DEPLOYED + LIVE. Two-hat: `4ea261a` (refactor, `_site` byte-identical to baseline) + `ac39b26` (Dream amendment, delta = the single dream page's `

` removed). `make rebuild` shipped (CloudFlare uploaded 2 files — the dream page + `_redirects`); pushed both remotes (`f8e00e7`→`ac39b26`); live-verified on animalrationiscapax.org (h1.post-title=0, ``+breadcrumb preserved). REVIEWED-37 drafted for steward placement. Remaining Wave 5: W5.3 (G4 clause-1 gate), W5.4 (G1 wildcard→build-error, lands in the Stage-G promotion commit). + +## PENDING-36 — W5.3 / G4 (clause-1 enforcement gate) + W5.4 / G1 (wildcard fallbacks → build errors) +**Date:** 2026-06-09 +**Tag:** [HARDENING] +**Summary:** Close the last two Wave-5 enforcement items. **G4 (W5.3):** a build-time census asserting every authored content file's `class:` is in the content-typology §1 enumeration (clause 1), erroring loudly otherwise — which also guards `default.html`'s unguarded `class="$class$-page"` body emission. **G1 (W5.4):** convert the two `classRouteName`/`classDisplayName` wildcard fallbacks (`other -> other ++ "s"`) into build errors (clause 3/4: unknown = build error, not fallback) — patch prepared now, **lands inside the Stage-G promotion commit** per the spec's own sequencing (clause 4 becomes OPERATIVE at promotion). +**Rationale:** §5 clause 1 ("every authored content file declares exactly one `class:` from §1") and clause 4 ("`site.hs` routing may not fall back to `class: essay`; all pages explicitly typed") are the corpus's two unenforced contract clauses (gap-map G4, G1). Today they hold by convention. Diagnosis (per-directory class census): **content/posts/** — the authored corpus that reaches `classRouteName`/`classDisplayName` via `postCtx` — carries only §1-enumerated classes (dream/essay/fragment/glimpse/gloss/heteronym/hommage/meditation/observation/readings/reverie), so the G1 wildcard is **never triggered** → converting it to `error` is byte-identical. The non-enumeration classes live **outside** the authored corpus: `sequence-index` (content/essays/after-the-reply/index.md — a sequence-index view), `not-found` (content/404.md), and `lex`/`offering`/`deliberation` (the content/chamber/** v1-legacy cluster — known-deferred, not drift, per `project-arc-chamber-v1-legacy-cluster.md`). A naïve clause-1 census would break the build on these legitimate pages; the gate therefore validates against **enumeration ∪ an explicit exempt-set**. +**The one decision (steward's): the exempt-set.** It blesses the non-typology classes the corpus legitimately carries. Proposed: `{ sequence-index, not-found, lex, offering, deliberation }` — each commented by reason (infra view · 404 · v1-legacy chamber ×3, deferred per tracker). It is a **self-tightening ratchet**: when the v1-legacy chamber cluster is finally migrated (the deferred to-do), those three entries are removed and the gate tightens automatically; a brand-new unblessed class anywhere → loud build error. Alternative (path-based: exempt `content/chamber/**` wholesale + infra) is coarser — it wouldn't catch a typo'd class inside the legacy tree (which is frozen anyway). Recommend the class-based set: precise everywhere, every blessing visible. +**Options (gate location):** +1. **site.hs build guard (recommended)** — a `preprocess` census beside `validateCompass`/`loadListingDefs`: glob `content/**/*.md`, read each frontmatter `class:`, assert ∈ (`class_enumeration` from content-types.yml ∪ exempt-set), `error` listing any violator. Fails the actual `make rebuild` that ships the site. Consistent with W5.2/W5.1's home. Output-neutral → byte-identical. +2. **content-types-check (Python)** — extend `generate-content-types.py --check` with the corpus census. Cleaner to write, enumeration already derived there — **but** the pre-commit hook is generic (secrets/debug/large-files only) and does *not* run it, and ARC has no CI server, so it would gate nothing automatically. Weaker. +**Recommendation:** **Option 1** for G4 (the build is the real gate; a check nobody runs isn't enforcement). G1's wildcards→`error`: prepare now (byte-identical), **land at W6** inside the promotion commit per the roadmap's precondition list (W5.1–5.3 ✓ *before* Stage G; G1 lands *with* it). G4 lands now (it is a Stage-G precondition, output-neutral). +**Verification:** byte-identical `_site` gate (both are guards/never-triggered fallbacks — no rendered change); deliberate-mismatch test for G4 (inject a bogus `class:` on a scratch file → build errors with the file named; remove → green), mirroring the W5.2 idiom. +**Files affected:** `site.hs` (new census guard in/near `loadListingDefs`; G1 = `classRouteName`/`classDisplayName` `other ->` arms → `error`, staged for W6); `templates/default.html` (read for the body-class emission; guarded transitively by the census — no edit unless steward wants an inline note); content-typology §5 cross-reference + clause-1/clause-4 promotion text ship with the Stage-G commit (W6). `data/content-types.yml` read (enumeration), not edited. +**Awaiting:** Steward authorization — chiefly to ratify the **exempt-set** `{sequence-index, not-found, lex, offering, deliberation}` and confirm Option 1 (build guard). On the nod: build G4 now (byte-identical), prepare G1 for W6. +**Status (2026-06-09):** STEWARD AUTHORIZED inline (exempt-set confirmed; Option 1). Steward refinement folded: **`sequence-index` reframed as a permanent generated-view class, NOT legacy** — after-the-reply is the only sequence today but more are coming; the exempt-set comments split into two kinds (permanent views/infra: sequence-index, not-found · v1-legacy ratchet: lex, offering, deliberation). **G4 DONE** (`23db039`, pushed both remotes): `validateCorpusClasses` build guard; `_site` byte-identical to `ac39b26` (stash-rebuild diff); deliberate-mismatch fires naming the file; output-neutral → no deploy. **G1 PREPARED** (`9699088` roadmap W5.4) — exact wildcard→error patch recorded, **lands inside the Stage-G promotion commit (W6)** per spec sequencing; byte-identical (never-triggered today). REVIEWED-38 drafted for steward placement. **Wave 5 CLOSED (G2/G3/G4 built; G1 staged).** Remaining to Stage G: W4.4 (jurist multilingual v1.0 sign-off) → Wave 6 promotion. + +## PENDING-37 — Reading measure → 66 characters (rem), fixing the px/rem root-size bug +**Date:** 2026-06-09 +**Tag:** [HARDENING] (deep typographic audit follow-on; jurist disposition #1; steward-authorized inline as a *starting point* for render review) +**Summary:** Set the reading measure to a precise **66 characters** (Bringhurst ideal), expressed in **rem** so the character count holds constant across breakpoints, replacing the two divergent, over-wide px/rem-confused measures. +**Rationale:** The audit measured (font-metric over 91,579 chars of real ARC prose) + render-confirmed (headless Chrome): EB Garamond prose averages **0.377–0.381 em/char**, so the live columns run **~90 characters** (`$narrow-size: 720px`) and **~101 characters** (`$body-column: 38rem` at the 21px root) — both well past Bringhurst's 75–80 "too long" ceiling. Root cause: `$body-column: 38rem` was authored to "38rem ≈ 65 chars" at the **16px** base, but the live `:root` scales to **21px** (137.5/125/131.25% per breakpoint), silently inflating 38rem to 798px (~101 ch). `$narrow-size` is px (720) so its char-count drifts across breakpoints. Two tokens, two confusions, both off-spec — the spec itself says 38rem/"65 characters" (`:165`) but `$narrow-size` comments "68 characters" while rendering ~90. +**Change (provisional — for the steward's eye):** `$narrow-size: 720px → 24.9rem` (`_variables.scss:119`) and `$body-column: 38rem → 24.9rem` (`_sidenotes.scss:33`); 24.9rem = 66 × 0.3771em (measured). Both become the same rem value (they are the same concept — "the reading measure"; a follow-on pass should unify them to one token). NOT a byte-identical change — the reading column intentionally narrows (720px → ~523px @ desktop, a ~27% narrowing; the marginalia-grid body narrows 38→24.9rem). +**Decisions deferred to the render review (steward's "we look, then decide"):** (a) final character target within the Bringhurst band 66–75 (24.9–28.3rem); (b) the **marginalia-grid proportions** — narrowing the body to 24.9rem makes the fixed 14rem sidenote column proportionally much larger (14/24.9 = 56% vs 14/38 = 37%); the sidenote/marker columns may need adjusting, to be judged on the about pages + sidenote/register essays; (c) **spec reconciliation** (AldineXXI §I measure prose: 38rem/65-char → the chosen rem/66) lands after the visual decision; (d) deploy. No deploy in this step — local build + serve only. +**Files affected (this step):** `scss/AldineXXI/_variables.scss` (`$narrow-size`), `scss/AldineXXI/_sidenotes.scss` (`$body-column`). Spec text + token unification deferred. +**Awaiting:** Steward AUTHORIZED inline (66 ch, starting point). Render review of about pages + marginalia essays → then the deferred decisions above. +**Status (2026-06-09):** LOCKED at **72 characters** (`27.2rem`) — steward render-ruling across all content types (66 a touch narrow, 75 a touch wide; 72 "spot on," sidenote/marginalia proportion approved). **Resize bug found + fixed** (the `.page-content` mobile `100vw` override defeated the rem measure <768px — "measure gets longer on resize"; removed). **Proper-homes consolidation** (steward-directed, W3R discipline): one token `$narrow-size` (`$body-column` aliases it), one governing rule (`.page-content`/_base, all viewports), zero measure rules left in `_mobile-responsive` (override removed + a dead `.wrapper main` block deleted). Spec §I Measure reconciled to the measured value + 65/68 inconsistency resolved; §XII grid + token-index updated. Verified: compiles · measure holds across a viewport sweep · no overflow. Committed `06effe4` (behaviour commit; gate = steward render-review, passed). **DEPLOYED + LIVE 2026-06-09** (bundled with the soft-rag pass `a9e5196`): pushed both remotes, `make rebuild` shipped (CloudFlare 2 files = style.css + _redirects — pure CSS, no HTML change), live-verified on animalrationiscapax.org (`max-width:27.2rem` ×9, no 720px). REVIEWED-39 to be drafted. (Deferred token-unification: $body-column now aliases $narrow-size; full removal of the local name is optional tidy, not required.) + +## PENDING-38 — Soft rag: hyphenate reading prose (reverses §I.i hyphens:none) +**Date:** 2026-06-09 +**Tag:** [HARDENING] (deep typographic audit follow-on; steward-approved inline on render; jurist endorsed `hyphens: auto` as the no-JS "rung (i)" in their audit reading) +**Summary:** Reverse the §I.i posture from *ragged-right, un-hyphenated* (`hyphens: none`) to a **soft rag** — ragged-right with judicious auto-hyphenation of reading prose. +**Rationale:** The prior `hyphens: none` was a **tool-quality** decision (web justification/hyphenation judged poor when ARC was built), not philosophical. The deep typographic audit + masters reopened it: Hochuli ranks the soft rag (ragged + narrow hyphenation zone) **above** the hard rag (the hard rag "looks uneven and unsettled"); Rutter — "hyphenate without justifying… reduces the raggedness"; the engine is the universal Liang/`hyph-utf8` patterns, language-correct via the document `<html lang>`. With the measure now properly set (72 ch, PENDING-37 — the old ~90-char measure was itself a reason hyphenation seemed unneeded), the soft rag reads better than the hard rag. Stays **ragged** (does NOT justify — justification on large viewports remains open, needs the JS Knuth–Plass "educated engine," off the table until a logged gate amendment). +**Implementation (proper home — _base, the reading-body home, every viewport):** `.page-content p/li/blockquote { -webkit-hyphens:auto; hyphens:auto; hyphenate-limit-chars:6 3 3; -webkit-hyphenate-limit-before/-after:3; hyphenate-limit-lines:2; -webkit-hyphenate-limit-lines:2 }`; body default → `hyphens: manual`. **The `-webkit-hyphens` prefix was the bug** that made Safari show nothing first (no autoprefixer in the build → prefixes hand-written; the limits were prefixed but the property wasn't). Cross-browser: `hyphens:auto` is Baseline (all engines); limits via standard (Chrome/Edge) + `-webkit-` (Safari); Firefox honours auto, ignores limits (sane defaults) — not Safari-tailored. +**Verification:** steward render-review on desktop AND phone ("few, but perfect"); the phone "none" was iOS-Safari **cache** (fresh-origin test confirmed; no mobile override exists — rule is viewport-agnostic). Live-verified post-deploy. +**Files affected:** `scss/AldineXXI/_base.scss` (the soft-rag rule + body `hyphens: manual`); `scss/AldineXXI/_mobile-responsive.scss` (stale per-phone hyphens comment corrected); `docs/AldineXXI-Codex/AldineXXI-specification.md` §I.i (posture reconciled). +**Awaiting:** Steward APPROVED inline (deploy now). **DONE + DEPLOYED + LIVE** `a9e5196`. **§I.i posture reversal rides the Stage-G read for formal jurist concurrence** (substance already jurist-endorsed). REVIEWED-40 to be drafted. diff --git a/REVIEWED.md b/REVIEWED.md index d22e0bb..ba1a100 100644 --- a/REVIEWED.md +++ b/REVIEWED.md @@ -309,4 +309,25 @@ closes §VII.i's deferred item. Spec records ×4 (apparatus §SEO; versioning × **Decision:** AUTHORIZED (Option 1 — the build-validation guard) **Notes:** Authorized inline during the 2026-06-09 session; executor's recommendation accepted. Option 1 closes the drift class with minimal change and byte-identical output; Option 2 (derive sigil-id from class) deferred as a follow-on, to revisit only if the slug↔class↔sigil naming convention later strains. The SVG geometry stays hand-authored — the guard binds the mapping, not the art. **If AUTHORIZED:** Proceed. — IMPLEMENTED + VERIFIED same session (ARC `4936fc9`): `validateCompass`, run at build via `loadListingDefs` — (A) every Compass sigil-id resolves to a `<symbol id="sigil-…">` in the sprite; (B) every *surfaced* class is covered by a listing or compass special (governed-but-unsurfaced + apparatus-not-route exempt). Loud on any mismatch (content-typology §5 clause 3 spirit). Proof: `site.hs` compiles; clean-build `_site` byte-identical (570 files); both checks fire on deliberate mismatch - (`["sigil-readings"]` / `["readings"]`), backups restored. Output-neutral → no deploy. The §5 spec note recording the enforcement ships with the Stage-G promotion commit (roadmap W6). Commit references PENDING-34. \ No newline at end of file + (`["sigil-readings"]` / `["readings"]`), backups restored. Output-neutral → no deploy. The §5 spec note recording the enforcement ships with the Stage-G promotion commit (roadmap W6). Commit references PENDING-34. + +## REVIEWED-37 — PENDING-35 — W5.1 / G2: single-source title display + Dream amendment +**Date:** 2026-06-09 +**Decision:** AUTHORIZED (inline, chat) — refactor + coupled Dream amendment. +**Notes:** Diagnosis-first confirmed the `showTitleField` hardcode = the 10 matrix-`shown` classes + a dead `chamber` entry (zero corpus instances), so retiring it is byte-identical. Authorized Option 1 (typed-parameter threading, compile-time binding). Coupled editorial ruling: Dream `title_display` shown→not-shown — "one can't title their dreams"; the sleep-recalled register reads truer without a hard <h1>. Render-review passed on the live dream page. +**If AUTHORIZED:** Proceed — DONE. Two-hat commits 4ea261a (refactor, _site byte-identical) + ac39b26 (Dream amendment, delta = the one dream page's <h1> removed). Deployed both remotes, live-verified. Tag any follow-on with REVIEWED-37. + +## REVIEWED-38 — PENDING-36 — W5.3/G4 (clause-1 gate) + W5.4/G1 (wildcard→error) +**Date:** 2026-06-09 +**Decision:** AUTHORIZED (inline, chat). Exempt-set ratified, with steward refinement: sequence-index is a PERMANENT generated-view class (more sequences coming), not legacy — split from the v1-legacy ratchet (lex/offering/deliberation). Option 1 (build guard) confirmed. +**Notes:** G4 = validateCorpusClasses build guard; output-neutral, byte-identical, deliberate-mismatch proven. G1 prepared (exact patch in roadmap W5.4), lands inside the Stage-G promotion commit per §5 clause-4 sequencing. +**If AUTHORIZED:** Proceed — G4 DONE (23db039, pushed). G1 staged for W6. Tag W6 with REVIEWED-38. + +## REVIEWED-39 — PENDING-37 — Reading measure → 72 characters (rem) +**Date:** 2026-06-09 +**Decision:** AUTHORIZED (inline, render-ruled across all types). 72 ch within Bringhurst's 66–75 band (66 narrow, 75 wide). Measured advance, rem, proper-homes consolidation, resize bug fixed. DONE + DEPLOYED (06effe4). + +## REVIEWED-40 — PENDING-38 — Soft rag (hyphenate reading prose; reverses §I.i) +**Date:** 2026-06-09 +**Decision:** AUTHORIZED (inline, render-approved desktop + phone). Soft rag per Hochuli/Rutter; judicious limits; proper home in _base. §I.i posture reversal RIDES the Stage-G read for formal jurist concurrence (substance pre-endorsed). +DONE + DEPLOYED (a9e5196). \ No newline at end of file diff --git a/claude/memory/MEMORY.md b/claude/memory/MEMORY.md index 841907b..e9b3243 100644 --- a/claude/memory/MEMORY.md +++ b/claude/memory/MEMORY.md @@ -37,7 +37,10 @@ permalink: claude-memory/memory - [Be (laundromat)](project-be-laundromat.md) — canonical workstream tracker established 2026-06-08 (Seb-relay of locked decisions). Be = Skemantix startup (Seb+David) funding CapableMind's funding-ladder; **bridge, not venture**. Decisions LOCKED: entity/exit (CapableMind decoupled, grant-funded), pricing (Living $12.99/mo · Archive $69.99/yr · Memorial $49.99/yr · Renovate ~$199 · $8.99 floor), CF Self-Serve Agency + versioned-template-package infra. **a11y gate MERGED (Pat 100/100/100).** Pre-revenue: the WTP gate = renovate Pat → charge her. **Discipline: stop adding spec until the gate clears → nothing for executor on be until then.** Repo @ `f43a0fd`. ## Active Session -- [Session 2026-06-09 — ARC W3R tree CLOSED+DEPLOYED · phone-compass fix · W5.2/G3 build guard; road to Stage G opened](session-2026-06-09-arc-w3r-closed-deployed-compass-fix-w52-guard.md) — **THREE arcs all shipped/landed.** **(1) W3R.2/W3R.3 — the spec-true tree COMPLETE + DEPLOYED live** (8 commits `d4fd852`→`eb7a557`): section-break→`_silence`(2) · layout→closing(9, it holds the *foot* not the grid) · frontispiece→threshold(7, careful @layer-overrides census first) · **`_post` DECOMPOSED** (breadcrumb→`_navigation`[correctness fix], dateline→new `_dateline`(9), images §VIII→new `_images`; marks LEFT; `_base` kept WHOLE — steward: "honest `_post`, not empty; a truer home, not emptying the drawer") · Tier-4 `mix()`/`darken()`→`sass:color` (byte-identical, warnings 6→0; @font-face→_fonts SKIPPED tidier-not-truer · Appendix-B no-op) · two micro-order calls RULED-LEAVE (scale-purity beyond legibility, recorded in main.scss). Every move proven **content-multiset-identity + collision census**; **steward render-review PASSED ("fantastic") → deployed (17-commit set; CloudFlare output diff = 2 files — the render-identical proofs held end-to-end); live-verified.** The cascade now reads as its own self-description (*finis coronat opus*). **(2) phone Reading Compass [FIX]** (`32163af`, live): both compasses wrap to 2 rows on phone (phone-only; desktop/iPad fine; NOT a regression); **found by MEASURING not theory** — built `/tmp/compass-measure/` headless-Chrome box-model harness, truth = **padding asymmetry** (footer's `a.compass-point` all:unset ate the padding; frontispiece's didn't), NOT width; *causal-story-before-reading-render* recurred 2× before measuring (the day's lesson). **(3) W5.2/G3** (`4936fc9`): PENDING-34 **pending-first** → authorized inline Option 1 → `validateCompass` build guard binds class→glyph→sigil structurally (every sigil-id→`<symbol>`; every surfaced class covered); **byte-identical (570 files), both checks proven to fire**; **REVIEWED-36 DRAFTED for steward to place**. **Pulling thread: continue Wave 5 → W5.1 (G2: single-source title_display, retire `showTitleField`; pending-first) → W5.3/W5.4 → W4.4 (jurist) → Wave 6 Stage G.** Literal Q: does `content-types.yml` carry per-class `title_display` to retire the `showTitleField` hardcode, byte-identical? Sub: steward place REVIEWED-36? Wave 5 or pivot to vignette? Seb on be/L1? ARC `main @ f8e00e7` clean, synced both remotes, live current. +- [Session 2026-06-09 (pm) — Wave 5 CLOSED + deep typographic audit + measure→72ch + soft rag, all LIVE](session-2026-06-09-pm-wave5-close-typographic-audit-measure-softrag.md) — **Two arcs, both fully shipped.** **(A) Wave 5 enforcement CLOSED:** W5.1/G2 title single-source + **Dream `title_display` shown→not-shown** ("one can't title their dreams") — two-hat `4ea261a`(refactor byte-identical)+`ac39b26`(Dream delta=1 page's `<h1>`), DEPLOYED; W5.3/G4 `validateCorpusClasses` clause-1 census `23db039` (exempt-set steward-ratified: sequence-index/not-found PERMANENT views + lex/offering/deliberation v1-legacy ratchet); W5.4/G1 wildcard→error PREPARED for W6. **(B) Deep typographic audit** (8 domains, 6 read-only Explore agents + INDEPENDENT verification — caught 2 agent errors: B.2 recalled-not-searched, A.2 measure; masters folded from typography palace + chamber-library/Rutter). From it, 2 items SHIPPED LIVE: **(B.1) MEASURE→72 chars `06effe4`** — MEASURED 0.3771em true advance (render-confirmed 0.381) over 91,579 real chars; column had run **~90 chars not believed ~68** (0.5em convention misestimated 32%); `27.2rem` **rem-not-px** (holds cpl constant — the px/rem root-scaling was THE bug: 38rem→101 chars at 21px root); proper-homes consolidation (1 token, _base governs, removed mobile 100vw override [resize bug] + dead `.wrapper main` block); spec §I reconciled. **(B.2) SOFT RAG `a9e5196`** — `hyphens:auto` reverses §I.i `hyphens:none` (Hochuli soft>hard rag, Rutter); **the `-webkit-hyphens` prefix was the Safari bug** (no autoprefixer in build); steward-approved desktop+phone ("few, but perfect"; phone "none" was iOS cache). Audit brought INTO repo `0bb7f94` (_audits). **Jurist engaged:** confirmed dispositions, 2 precisions recorded (calt "no *body* face"; hanging-punctuation collision REASON), justification-bar = **Bringhurst even-colour/rivers NOT Rutter hyphenation** (corrected my Rutter-leaning), and **ruled the spec division role-structurally: CC = truth-ups (factual) ONLY; jurist = ALL doctrine** (composed against the assembled spec = the review pass; CC flags-not-resolves evidence bearing on doctrine). **Pulling thread: CC's spec TRUTH-UPS** (§I.d "17"→0 bold, head-dup resolved, drop-cap retired — against git, with cites) to make the spec whole for the jurist's doctrine pass. Literal Q: which stale-flag passages need truthing, and does any contradict doctrine the jurist's about to write (carve-out: flag, don't resolve)? Sub: steward place REVIEWED-39/40? truth-up lane or pivot to vignette? Seb on be/L1? ARC `main @ 0bb7f94` clean, synced both remotes, live current. + +## Archived (2026-06-09 morning — W3R tree CLOSED + compass fix + W5.2/G3; road to Stage G opened) +- [Session 2026-06-09 (am) — ARC W3R tree CLOSED+DEPLOYED · phone-compass fix · W5.2/G3 build guard](session-2026-06-09-arc-w3r-closed-deployed-compass-fix-w52-guard.md) — W3R.2/W3R.3 spec-true tree COMPLETE+DEPLOYED (8 commits `d4fd852`→`eb7a557`; `_post` decomposed, `_base` kept whole; render-review "fantastic"); phone-compass [FIX] `32163af` (found by MEASURING — padding asymmetry, the headless-Chrome harness born here); W5.2/G3 `validateCompass` build guard `4936fc9` (byte-identical; REVIEWED-36). The pm session woke from this. ## Archived (2026-06-08 afternoon→evening — W3R Stage 3 the tree begins) - [Session 2026-06-08 (aft→eve) — ARC W3R Stage 3 the tree begins; _utilities dissolved 530→0; ornament pause-level fixed](session-2026-06-08-arc-w3r-stage3-the-tree-utilities-dissolved.md) — Stage 3 opened (read Kerievsky framing chs → confirmed 3rd-amendment middle path); `_utilities` 530→0 dissolved into `_glimpse`/`_per-type`/`_enfilade`/`_silence`; ornament pause-level 2rem→3rem (steward render-ruled "much better"); 9 commits banked UNDEPLOYED (`10c5f6f`→`0fd7acd`); deploy held for W3R.3. (All shipped 2026-06-09.) diff --git a/claude/memory/session-2026-06-09-pm-wave5-close-typographic-audit-measure-softrag.md b/claude/memory/session-2026-06-09-pm-wave5-close-typographic-audit-measure-softrag.md new file mode 100644 index 0000000..c07329c --- /dev/null +++ b/claude/memory/session-2026-06-09-pm-wave5-close-typographic-audit-measure-softrag.md @@ -0,0 +1,87 @@ +--- +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.) diff --git a/claude/memory/session-ledger-2026-06-09.md b/claude/memory/session-ledger-2026-06-09.md index 1cafd07..274931b 100644 --- a/claude/memory/session-ledger-2026-06-09.md +++ b/claude/memory/session-ledger-2026-06-09.md @@ -63,4 +63,20 @@ metadata: ## Sub-agent dialogues +## Open horizons (cont. — new session ~15:23 after lunch pause) +- 2026-06-09 15:23 — Re-entered via /wake-up. Thread CONFIRMED: Wave 5 enforcement toward Stage G; next W5.1/G2 (title_display single-source, retire showTitleField; pending-first). **REVIEWED-36 now ON DISK — steward placed it over lunch** (W5.2 loop fully closed). Seb active on BMF (D1 cross-encoder commits `1a61504` etc.) — L1 front moving, baton his. Drift to hold today: theorize-before-measuring (recurred ×2 yesterday, now a §3-candidate flag) — but W5.1 is diagnosis-first, fits. First act per wrap resumption point: diagnose showTitleField vs content-types.yml title_display, confirm byte-identity, file PENDING-35, await auth. + +## Authorization moves (cont. — new session) +- 2026-06-09 ~15:40 — **PENDING-35 filed** (W5.1/G2 single-source title display + Dream amendment, [HARDENING]). Diagnosis-first (per the day's measure-before-theorize lesson, applied to code not layout): read showTitleField hardcode (11 classes) vs content-types.yml title_display; reconciled — the 10 `shown` match exactly, the 11th (`chamber`) is a DEAD entry (0 corpus pages carry `class: chamber`; content/chamber/** uses essay/meditation/about/offering/deliberation/lex). So retiring the hardcode = byte-identical. Census surfaced non-enumeration classes (offering/deliberation/lex/sequence-index/not-found) → lookup must be PERMISSIVE (absent→not-shown, NOT a build error). **Steward authorized inline + coupled amendment: Dream shown→not-shown** (editorial: sleep-recalled register reads truer without hard <h1>). +- **BUILT + VERIFIED (two-hat), local, NOT deployed.** Commit 1 `4ea261a` (refactor: postCtx :: [String]→Context, loadTitleShownClasses, retire titleClasses) → `_site` BYTE-IDENTICAL to baseline (refactor proven pure). Commit 2 `ac39b26` (Dream amendment: §2 matrix edit → `make content-types` regen → check clean) → `_site` delta = EXACTLY the one dream page losing `<h1 class="post-title">` + the now-empty conditional's blank line (nav breadcrumb/<title>/og/twitter title all preserved). The amendment doubled as the G2 liveness proof (YAML flip → rendered output changed end-to-end). ARC main 2 ahead of origin (`f8e00e7`→`ac39b26`). +- **Returns this session:** none yet — diagnosis-first held (read the code + censused before claiming byte-identity; caught that `chamber` was a dead hardcode entry by census, not assumption). The two-hat separation (skill-harvest proposal 2026-06-08) used in anger for the first time — refactor commit byte-identical, feature commit isolated classified delta. Worked cleanly. +- **DONE + DEPLOYED + LIVE.** Steward render-review PASSED ("yes, unquestionably — one can't title their dreams"). `make rebuild` (CloudFlare 2 files = dream page + _redirects; the byte-true proofs held end-to-end) + pushed both remotes (`f8e00e7`→`ac39b26`) + live-verified animalrationiscapax.org (h1.post-title=0; `<title>`+breadcrumb preserved). REVIEWED-37 DRAFTED for steward placement. ARC main clean, synced, live current. +- Next ARC station: W5.3 (G4 clause-1 enforcement gate) + W5.4 (G1 wildcard→build-error, lands inside the Stage-G promotion commit) — the rest of Wave 5 → W4.4 (jurist) → Wave 6 Stage G. + +## Authorization moves (cont. — W5.3/G4 + W5.4/G1) +- 2026-06-09 ~16:00 — **PENDING-36 filed** (W5.3/G4 clause-1 gate + W5.4/G1 wildcard→error, [HARDENING]). Diagnosis-first: per-directory class census proved content/posts carries only enumerated classes (G1 wildcards never triggered → byte-identical); non-enumeration classes (sequence-index/not-found/lex/offering/deliberation) all live outside the authored corpus. Gate-location reasoned from evidence: pre-commit hook is generic + no CI → only the BUILD is a real gate (Option 1). **Steward authorized inline + refined: sequence-index is PERMANENT (more sequences coming), not legacy** — split exempt-set into permanent-views vs v1-legacy-ratchet. +- **G4 BUILT + VERIFIED + PUSHED** (`23db039`): `validateCorpusClasses` build guard via `getMatches "content/**"`; `_site` byte-identical to ac39b26 (stash-and-rebuild diff); deliberate-mismatch fires loudly naming the file; output-neutral → no deploy. **G1 PREPARED** (`9699088` roadmap): exact wildcard→error patch documented, lands in W6 promotion commit. Wave 5 CLOSED (G2/G3/G4 built, G1 staged). REVIEWED-38 drafted. +- **Returns:** none — diagnosis-first held all the way (read code + per-path census before every claim; gate-location chosen on hook/CI evidence not assumption; the two-hat / byte-identical-then-classified-delta discipline carried from W5.1). The day's measure-before-theorize lesson stayed applied to code. +- Remaining to Stage G: **W4.4** (jurist multilingual v1.0 sign-off, rides the read) → **Wave 6** promotion (content-typology §5 AUTHORED→OPERATIVE, lands G1). Steward flagged: **another audit before the jurist signoff.** + ## Bypasses diff --git a/claude/memory/skill-harvest-register.md b/claude/memory/skill-harvest-register.md index e4174db..0457ed7 100644 --- a/claude/memory/skill-harvest-register.md +++ b/claude/memory/skill-harvest-register.md @@ -94,6 +94,15 @@ The single place proposed skills live so they don't evaporate between sessions. | **Headless-Chrome box-model measurement** | create skill OR verification-ladder note | When a rendered layout *differs* and the cause isn't obvious, **measure the box model before theorizing the mechanism**. Today this caught the phone-compass cause (per-point *padding asymmetry*, not width) after *causal-story-before-reading-render* recurred 2× (a footer-only first pass, then a wrong `align-self:stretch` width-fix). Reusable core: `npm i puppeteer-core` in a tmp dir · `executablePath` = `/Applications/Google Chrome.app/...` · `setViewport({width:375,…,isMobile:true})` · `page.evaluate` reading `getComputedStyle`/`getBoundingClientRect` (widths, padding, row counts). Chrome reproduced the bug → it wasn't the Safari quirk I'd hypothesized. | a `/measure-render` skill, or a verification-ladder entry ("measure the box model before theorizing a layout difference") | **PROPOSED** | | **Symmetria §3 flag: theorize-before-measuring-a-layout** | Symmetria §3 flag | The drift this caught, as a standing flag: a *causal story about why a layout renders as it does*, asserted before the rendered box model is measured, is contamination shape (same family as `causal-story-before-reading-render`, one step more specific — layout/CSS). Antidote: the harness above. | Symmetria §3 | **PROPOSED** (may be redundant with the existing `causal-story-before-reading-render` flag — steward to judge) | +## New proposals (2026-06-09 pm — the typographic audit / measure / soft-rag day) + +| Element | Kind | One-line | Where it lands | Status | +|---------|------|----------|----------------|--------| +| **`/measure-render` (headless-Chrome box-model harness)** | create skill OR ladder note | **RE-FLAG — strongly earned.** Proposed this morning (compass fix); the pm session ran it **4+ more times** (true-advance measurement, viewport resize sweep, auto-vs-none hyphenation test). Proven repeatedly across one day. *Caveat learned: headless Chrome cannot test hyphenation — it ships no hyphenation dictionaries (all configs gave identical heights); the real browser is the only valid hyphenation test.* | `/measure-render` skill OR verification-ladder | **PROPOSED (reinforced)** | +| **Measure the font's true average prose advance before a character-count measure** | verification-ladder entry | When setting a measure to a target character count, **measure the font's average advance over real corpus prose (incl. spaces), not the 0.5em convention.** The convention misestimated EB Garamond by **32%** (0.377em measured vs 0.5em assumed → the column ran ~90 chars, not the believed ~68). The instrument that overturned ARC's measure. | `reference-verification-ladder.md` | **PROPOSED** | +| **ARC build has NO autoprefixer — hand-write `-webkit-` prefixes** | feedback memory | ARC's plain-`sass` build adds no vendor prefixes. When introducing a new CSS property, check Safari's prefix need and hand-write it. The `-webkit-hyphens: auto` Safari bug came from prefixing the *limits* but not the *property* — an inconsistency that read as "hyphenation off in Safari." | `feedback-arc-no-autoprefixer-handwrite-webkit.md` | **PROPOSED** | +| **Justification-judgment bar = Bringhurst even-colour/rivers, NOT Rutter hyphenation** | feedback memory | Load-bearing for the future justification decision: when living with the soft rag to judge whether to justify, ask *"is the colour even, are there rivers"* (Bringhurst paragraph-level), **not** *"is it hyphenating"* (Rutter). The jurist corrected the executor's Rutter-leaning rationale. Either earns the KP/JS gate-amendment or retires it. | `feedback-justification-bar-bringhurst-not-rutter.md` | **PROPOSED** | + --- *Discipline reminder: "no harvest" is a valid outcome; do not manufacture proposals to fill the table (the inverse of Hermes's autonomous self-write). The yardstick is the steward's: did the steward have to re-explain something a skill could have carried?* \ No newline at end of file