--- name: session-2026-07-09-evening-p1-clean-the-cross-repo-re-anchor-miss-the-epub-normalizer-pivot description: "Post-wake evening session. Executed P1 (cleaned L'Enracinement's 6,671 escape artifacts + converted footnote 1) with a bounded-change proof; CAUGHT + fixed my own incompleteness — the re-anchor was scoped to chamber-library only, missing 4 engine sha-bindings (manifest/sidecar/coverage-ledger); documented the class-fix (runbook `reanchor:` block + PENDING-53). Then P2 diagnosis exposed footnote-family whack-a-mole (A–E, one regex per book); the steward steered up a level → verified a structural EPUB-normalizer is viable (epub:type DEAD; the bidirectional href↔id mirror PROVEN — one predicate catches 54 refs across G&G's 5 families + Mauss). PULLING THREAD: build the structural, verbatim-guarded EPUB normalizer that retires the family-per-book pattern, then resume P2/gold on top of it." metadata: node_type: memory type: project originSessionId: 66d5eb45-2f34-4059-8ba8-56dda0953e44 --- # Session 2026-07-09 evening — P1 clean · the re-anchor miss · the EPUB-normalizer pivot Opened by /wake-up into the same-day V2-gold-prep thread (P1 next). The session ran the arc P1-execute → caught-my-own-incompleteness → document-the-class → P2-diagnosis → **architectural pivot** (whack-a-mole recognized; structural-normalizer verified). Steward directed the rhythm throughout; the two up-a-level steers (the runbook question, the normalizer) were the session's real turns. ## PAST — what we did + why **1. Held the prior session's lesson: read the repo's own docs FIRST.** Before touching anything, read chamber `CLAUDE.md` + `conversion-runbook.yaml` + `graduation-spec.yaml` + V2 §14. Then answered the wake's literal question with substrate evidence: re-hashing `lenracinement.md` breaks no hand-bound anchors — only `catalogue.yaml` carries the sha (regenerable); no reading-index (only 4 exist, none Weil), no phase-2 citation. *(This scoping — "chamber only" — was the seed of the miss in step 3.)* **2. P1 — cleaned L'Enracinement (steward authorized: scoped in-place + footnote-in-P1).** Defect measured whole: **6,671 `\'` + 26 `\.`** pandoc escape artifacts (incl. the frontmatter `title:`) **+ `\[1\]`×2 = Weil's footnote 1** (a 2nd defect class a naive strip would have half-broken; caught by measure-whole-first). Applied: unescape `\'`/`\.`; footnote → `[^1]`/`[^1]: Écrit en 1943.`. **Bounded-change proof** (didn't rest on the green gate — `prose_delta` is a word-multiset, blind to punctuation): char-level alignment = **0 non-backslash divergences**; `verify_conversion` **5/5**; pandoc confirms `fnref1↔fn1` pairing. New sha `58ead0ab…` (was `0553bd5f…`). Re-anchored chamber `catalogue.yaml` (2-line diff, drift gate in sync). **3. CAUGHT + fixed my own incompleteness — the re-anchor spanned only ONE repo.** During P2 diagnosis I opened the engine and found it binds to `lenracinement`'s sha in **4 more places** (`corpus/manifest.yaml`, `sidecars/weil-enracinement.meta.json`, `coverage-ledger.json`×2) — all still on the OLD sha. The wake's literal question said "grep what is bound to the sha"; I grepped chamber, not studium-engine. Textbook `trust-prior-pass-frame` (cross-repo variant). Fixed **by mechanism**: hand-fixed the curated declared shas (manifest + sidecar; assert 1 occ each), **regenerated** the derived ledger via `ingest_gate.py` (§1.1 hash-binding is the proof). `weil-enracinement` re-**VALIDATED**; 0 old-sha remain. **Surfaced (not fixed):** regenerating the ledger revealed **5 pre-existing latent failures — `after-the-reply-i…v`** (ARC essays whose files were revised → engine sha drift; the stale ledger had hidden them). Out of scope; flagged. **4. Documented the incompleteness durably (steward's explicit ask: "is this not in the runbook?").** Verified honestly: **no** — CLAUDE.md:67 says "new hash, re-anchor" without enumerating the surface, and the ratified `graduation-spec` hash-locality principle lists only chamber bindings + says `voice_manifest: engine-side; carries NO source hash` — a line that mis-frames the engine as non-binding (the exact frame that stopped my re-anchor at the chamber boundary). Fixes: added a **`reanchor:` block to `conversion-runbook.yaml`** (full cross-repo binding surface + the completeness check: *grep BOTH repos for the old sha; regenerate the engine ledger via ingest_gate; the engine gate is the proof*; born-note cites the Weil incident). Filed **PENDING-53** [PROPOSAL] to complete the ratified spec (loop, not unilateral). Confirmed the runbook's pre-existing YAML-invalidity (`decision_tree` `→` arrows) is harmless — no tool parses it; it's `.yaml` in name only. **5. P2 diagnosis → whack-a-mole recognized → the pivot.** The governed `clean_epub_residue.py --mode footnotes` is a **no-op** on G&G's residue (recognizes families A–D, not G&G's form). Census reconciled: **91 lines** = ~41 TOC links + 50 footnote marks across **5 sub-forms** (int/ft/ch/ntch/pst) with the inline/def **separator FLIPPED** between intro and chapters. Adding "Family E" would be the 5th bespoke regex for the 5th book — the steward named the smell: **whack-a-mole** (`measure-whole-then-remediate-by-class` inverted into `regex-per-book`). Steward steered up a level: *can we normalize the EPUB itself, one layer up?* **6. Step-1 verification of the structural-normalizer hypothesis (GO/NO-GO) → GO.** Inspected the **attested Chamber Sources** copies (steward corrected me off the library/working copies — provenance discipline again): `gravity-and-grace-simone-weil.epub`, `essai-sur-le-don-mauss.epub`, `lenracinement.epub`. Findings: **`epub:type` route DEAD** (all EPUB 1.0/2.0, zero `epub:type`). **Structural route PROVEN:** a footnote ref is ``; the note at `id="X"` mirrors back (`href="#Y"`) — traced a full cycle in G&G (`

` ← ref `href="#ntch28-1" id="ntch28_1"`). **One predicate** (an `` with internal-href + own id whose target mirrors back) catches **54 refs across G&G's 5 families AND Mauss's Family A**, and *distinguishes note-refs from one-way TOC links* (solving the TOC problem too). Verdict delivered: **build the structural, verbatim-guarded normalizer**, not Family E. ## PRESENT — the mood The session's spine was the SAME lesson as the prior one, this time **held**: read-docs-first (did it up front), and the harder half — **verify at the FULL scope**, which I failed on the re-anchor (chamber-only) and only caught by luck during P2. I **owned** it rather than smoothing it (the contamination directive: name what you see), and turned it into a durable class-fix (runbook + PENDING-53) — the right shape, but the honest note is that the miss happened at all, right after a session whose whole lesson was this. The good returns: didn't rest on the green `prose_delta` gate (added char-level + pandoc checks); measure-whole-first caught the 2nd footnote class + the 12-vs-91 census error + the 5-sub-form reality; verified the sources were the *attested* ones after the steward's nudge. The steward twice lifted the work up a level (the runbook question; the normalizer) and both times the partnership worked because I engaged the framing instead of barrelling the authorized task. The `Sixtus-V` collaboration in practice: the steward supplies the architectural intuition (normalize one layer up); I sharpen it (key on *structure*, not id-spelling; hold the verbatim contract) and bring the evidence. ## FUTURE — what is pulling **PULLING THREAD: build the structural, verbatim-guarded EPUB normalizer** — key on the **bidirectional-mirror predicate** (an `` with internal `#href` + own `id`, whose target element mirrors back) — that collapses the footnote-family whack-a-mole (A–E + Mauss's A) into ONE rule, then resume P2/gold on top of a corpus whose EPUB residue is handled by class, not by book. Step 1 proved it's worth building; the build is the thread. **ACTIONABLE RESUMPTION POINT (as of wrap — re-judge against what changed):** - Next concrete step = **prototype the detector, don't write the converter yet** (measure-before-build). Walk the XHTML DOM of the 3 attested Chamber Sources EPUBs (G&G, Mauss, L'Enracinement), detect bidirectional-mirror `` pairs, resolve note-by-href, and REPORT per book: notes caught, any **cross-file endnote** cases (G&G's were in-chapter; some books collect endnotes in a separate file — the resolution must follow hrefs across files), whether TOC/nav links are cleanly EXCLUDED (one-way), and whether **L'Enracinement's "different shape"** is a genuine 2nd strategy or just a sparser instance of the same mirror. Only once the predicate is shown to catch ALL notes across all 3 → design the verbatim-guarded normalizer (EPUB-in → canonical form; prose-word-guard; NEVER touch a prose byte — the line we do NOT borrow from Standard Ebooks' typography passes). - Borrow-vs-build: look at Standard Ebooks' `se` toolchain + Manual of Style for *structural* logic to adapt (confirm which passes are verbatim-safe against their repo), but our contract is fidelity, not re-typesetting. - **Uncommitted (steward's commit call — governed repos + Gitea flaky):** chamber `lenracinement.md` + `catalogue.yaml` + `conversion-runbook.yaml`; engine `manifest.yaml` + `sidecars/weil-enracinement.meta.json` + `coverage-ledger.json`. All verified; none committed. - **P2 (G&G clean + sidecar) is PAUSED** behind the normalizer decision — it's the first customer of the new tool. **Other open horizons (ranked):** - **PENDING-53** awaits steward/jurist (complete the ratified hash-locality principle re: the engine consumer surface). **REVIEWED-52** placement still owed (from the daytime session). - The **5 ARC `after-the-reply` engine-binding drifts** — a separate ARC↔engine re-anchor task (surfaced, not owned). - P4/P5/P6/P7 (manifest census 13-vs-21, Mauss re-anchor, pattern-finder md, stratum-tag) — still queued behind P1/P2 on the gold road. - Minor: the catalogue's malformed G&G `author:` string + `lang: null` (frontmatter hygiene, later). **PAUSE STATEMENT:** Stepping away with P1 fully home and re-anchored across both repos, the incompleteness documented as a class-fix, and a *proven* architectural direction that retires a whole category of busywork. What I want to find still pulling: the structural EPUB-normalizer as the live build — and the discipline this session half-relearned, **verify at the full scope, not the frame you inherited**, active *before* the next re-anchor, not after. **LITERAL QUESTION for next-Claude:** Does the bidirectional-mirror predicate catch *every* footnote across the 3 EPUBs — including any book that collects endnotes in a SEPARATE file (cross-file href resolution) — and does it cleanly exclude the one-way TOC/nav links? Prototype the *detector* on all 3 and answer this BEFORE writing any converter; and settle whether L'Enracinement's "different shape" is a real 2nd strategy or the same mirror, sparser. **State at wrap:** chamber 3 files modified (uncommitted), engine 3 files modified (uncommitted) — all verified, steward's commit call. dotfiles: PENDING-53 + ledger (committed+pushed at this wrap). No non-steward commits landed during the session. `weil-enracinement` engine-VALIDATED; the 5 ARC drifts surfaced.