Files
dotfiles/claude/memory/session-2026-07-09-evening-p1-clean-reanchor-then-epub-normalizer-pivot.md
T

53 lines
11 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-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 `<a href="#X" id="Y">`; the note at `id="X"` mirrors back (`href="#Y"`) — traced a full cycle in G&G (`<p class="footnote1"><sup><a href="#ntch28_1" id="ntch28-1">` ← ref `href="#ntch28-1" id="ntch28_1"`). **One predicate** (an `<a>` 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 `<a>` 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 `<a>` 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.