diff --git a/PENDING.md b/PENDING.md index f2a6de8..151e2b3 100644 --- a/PENDING.md +++ b/PENDING.md @@ -1385,3 +1385,18 @@ Disposition (verbatim capture + executor action-list: `chamber-library/docs/libr - **Parked separately (jurist §3, not folded in):** is the graduated corpus uniformly title-first or genuinely mixed? Per-candidate resolution is robust either way. - **Full FIX for graduate_to_canonical's follow-on line:** `body_word_conservation` (the 3rd declared gate, still "tracked as follow-on, not yet enforced") is untouched here — out of PENDING-52 scope. **Awaiting only:** steward placement of **REVIEWED-52** (the authorization record). + +## PENDING-53 — Hash-locality principle omits the engine consumer surface (re-anchor spans both repos) +**Date:** 2026-07-09 +**Tag:** [PROPOSAL] +**Summary:** Complete the graduation-spec `layers` hash-locality principle to name the studium-engine binding surface (`corpus/manifest.yaml` sha · `corpus/sidecars/*.source_sha256` · `corpus/coverage-ledger.json`) that a chamber-canonical re-hash invalidates — the ratified doc currently lists only chamber-internal bindings, and its `voice_manifest: engine-side; carries NO source hash` line mis-frames the engine as non-binding. +**Rationale:** P1 (2026-07-09, `lenracinement` source-clean) re-anchored chamber `catalogue.yaml` but left the engine's manifest sha + sidecar `source_sha256` + coverage-ledger bound to the OLD sha. The engine `ingest_gate` §1.1 hash-binding would have FAILED `weil-enracinement`, but nothing runs it after a chamber edit and the stale ledger hid it — caught only by chance during P2 diagnosis. Root cause is a governed-doc gap: the ratified hash-locality principle enumerates reading-index + source-match (chamber) and declares the engine voice_manifest hash-free — the exact frame that stopped the re-anchor at the chamber boundary. The engine SOURCE manifest + sidecars DO bind and ARE enforced. +**Change-class:** Documentation-completing in substance (names an existing, enforced binding reality; changes no gate acceptance) — but it touches the RATIFIED graduation-spec, so it runs the loop, not a unilateral edit. +**Already landed (operational, not the ratified spec):** `_curation/conversion-runbook.yaml` gained a `reanchor:` block — the 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. +**Options:** +1. Complete the graduation-spec `layers` note to enumerate the engine consumer surface + a cross-repo re-anchor pointer to the runbook `reanchor:` block. *(recommended)* +2. Runbook note only — weaker; the mis-framing line stays in the governed doc. +3. Follow-on tool: a `reanchor` helper that, given a canonical, greps both repos for the old sha, updates all bindings, and runs both gates (a real class-fix; larger; own PENDING). +**Recommendation:** Option 1 now (correct the governed doc's frame + point to the runbook); Option 3 as a follow-on if re-hash/re-anchor recurs across the ~30-source Making batch. +**Files affected:** `_curation/graduation-spec.yaml` (layers/hash-locality note). Runbook already updated. No gate-acceptance change. +**Awaiting:** Steward authorization + jurist review (touches the ratified spec). diff --git a/claude/memory/MEMORY-reference.md b/claude/memory/MEMORY-reference.md index 2379bb3..3f30da6 100644 --- a/claude/memory/MEMORY-reference.md +++ b/claude/memory/MEMORY-reference.md @@ -20,6 +20,9 @@ Split out of [MEMORY.md](MEMORY.md) on 2026-07-06 to keep the wake-loaded index # Archived sessions + stable reference layer (relocated verbatim from MEMORY.md, 2026-07-06) +## Archived (2026-07-09 evening — P1 clean + the cross-repo re-anchor miss + the EPUB-normalizer pivot; demoted on promote) +- [Session 2026-07-09 — V2 design review + Handke de-gold graduation; the read-repo-docs-first lesson](session-2026-07-09-v2-review-handke-graduation-process-lesson.md) — Opus post-Fable session. Fable's V2 design doc was **already done** overnight → became the **review seat**: jurist-reviewed it + **independently re-verified the substrate** (all §1 findings reproduced to the line; sole correction manifest **21≠13**; fence-check on the uniform-20% first-batch passed V0 §5; converged with the relayed jurist review; folded 2 mechanical fixes). Ran the **conversion-artifact sweep** (1285 files, jurist-ruled measure-before-charter: **C1 escaped-apostrophes systemic 79 files**; **C3c smart-quotes ~80%** = the standing fidelity@2 glyph flag; **C3b footnote-markers contained (5)**; `065c0b9`). Built a **calm map artifact** (the 'endless' made bounded; `https://claude.ai/code/artifact/f4f52ed8-0f13-421c-a821-a934a44c35fb`). **Graduated the German Handke *Wunschloses Unglück*** (V2 precondition **P3**) — born-digital, byte-faithful, 3 gates pass (honest `heading_density` red-gate fix = title-as-heading, NOT invented chapters), archived+attested(`by:steward`)+catalogued (`9702f95`). **BUT re-derived the whole documented graduation process** instead of reading chamber `CLAUDE.md`+runbook first — **steward corrected ~4×** (source location; 'it's in the runbook'; 'is this not in the CLAUDE.md'; **provenance-is-not-a-loose-end**). Fixed the 2 tool gaps it exposed (`archive_sources` INDEX-crash + `--add` single-source mode; fleet 68→73/73; `e8eb3ed`); filed **AND BUILT PENDING-52** (source-archiving now enforced as graduation **gate zero**; `4be2265`; **only REVIEWED-52 placement remains**). New memory: [[reference-governance-files-are-dotfiles-symlinks]]. Chamber **4 commits unpushed** (Gitea, steward's call); studium V2 design doc committed+pushed (`be906c7`). + ## Archived (2026-07-09 — V2 design review + Handke de-gold graduation + the read-repo-docs-first lesson; demoted on promote) - [Session 2026-07-08 — Fable-window → Studium V2 charter; MemPalace decommissioned; BMF report](session-2026-07-08-fable-window-v2-charter-mempalace-decommission.md) — Opus session; the wake's chamber thread was **superseded** by a 3-day free-Fable-5 window (through **2026-07-12**). **Allocated it to Studium V2** (the multilingual/archaic entailment-validation harness) over ARC C1 — the steward's **microcosm insight**: Studium is CM's *unfettered sandbox* (code-separable, but breakthroughs transfer CM-ward → V2 pays twice; C1 = low-regret Opus/credits fallback). **Wrote + TWICE-jurist-gated the V2 Fable scope charter** (`studium-engine/docs/v2-validation-harness-scope-charter-2026-07-08.md`, `98d322c`; the /model-handoff discipline; §1 fence + §4 full open surface; the **œ/æ resolution** — exclusion re-derived from the ratified *closed* fold-list, not the executor flag — was the standout). **Fully decommissioned palace-memory MemPalace** (hooks + MCP server removed; all dead instances + the typography *backup* cold-archived to external `/Volumes/Temp storage 2020/…`; the **live typography palace KEPT**). **Wrote the BMF lessons report** (`CM-AI/…/l1-reliability/mempalace-decommission-report-for-bmf-2026-07-08.md`, `a5c7120`; CM index reconciled 35→38). New memory: [[project-studium-cm-sandbox-and-transfer]]. **⚠ PULLING THREAD = Studium V2; the NEXT session is BARE Fable (no /wake-up, no /wrap-up)** — the charter is its context, the design doc its only record; the thread points **past** it to the Opus resumption that jurist-reviews Fable's output (same seat), folds the jurist-gate-flags, and continues V2 build → V3. diff --git a/claude/memory/MEMORY.md b/claude/memory/MEMORY.md index 51859e6..9309e4d 100644 --- a/claude/memory/MEMORY.md +++ b/claude/memory/MEMORY.md @@ -55,7 +55,7 @@ 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-07-09 — V2 design review + Handke de-gold graduation; the read-repo-docs-first lesson](session-2026-07-09-v2-review-handke-graduation-process-lesson.md) — Opus post-Fable session. Fable's V2 design doc was **already done** overnight → became the **review seat**: jurist-reviewed it + **independently re-verified the substrate** (all §1 findings reproduced to the line; sole correction manifest **21≠13**; fence-check on the uniform-20% first-batch passed V0 §5; converged with the relayed jurist review; folded 2 mechanical fixes). Ran the **conversion-artifact sweep** (1285 files, jurist-ruled measure-before-charter: **C1 escaped-apostrophes systemic 79 files**; **C3c smart-quotes ~80%** = the standing fidelity@2 glyph flag; **C3b footnote-markers contained (5)**; `065c0b9`). Built a **calm map artifact** (the 'endless' made bounded; `https://claude.ai/code/artifact/f4f52ed8-0f13-421c-a821-a934a44c35fb`). **Graduated the German Handke *Wunschloses Unglück*** (V2 precondition **P3**) — born-digital, byte-faithful, 3 gates pass (honest `heading_density` red-gate fix = title-as-heading, NOT invented chapters), archived+attested(`by:steward`)+catalogued (`9702f95`). **BUT re-derived the whole documented graduation process** instead of reading chamber `CLAUDE.md`+runbook first — **steward corrected ~4×** (source location; 'it's in the runbook'; 'is this not in the CLAUDE.md'; **provenance-is-not-a-loose-end**). Fixed the 2 tool gaps it exposed (`archive_sources` INDEX-crash + `--add` single-source mode; fleet 68→73/73; `e8eb3ed`); filed **AND BUILT PENDING-52** (source-archiving now enforced as graduation **gate zero** — jurist-ruled via a 4-doc exchange whose shape came from repo-evidence the jurist couldn't see, steward-authorized; `graduate_to_canonical.source_gate` + `--add` idempotency + declarative precondition; `4be2265`; **only REVIEWED-52 placement remains**). New memory: [[reference-governance-files-are-dotfiles-symlinks]]. **⚠ PULLING THREAD = V2 gold prep continues at P1 (clean L'Enracinement) — and READ chamber CLAUDE.md + conversion-runbook FIRST** (the session's lesson). Chamber **4 commits unpushed** (Gitea, steward's call); studium V2 design doc committed+pushed (`be906c7`). +- [Session 2026-07-09 evening — P1 clean + the cross-repo re-anchor miss + the EPUB-normalizer pivot](session-2026-07-09-evening-p1-clean-reanchor-then-epub-normalizer-pivot.md) — Post-wake evening session. **P1: cleaned L'Enracinement** (6,671 `\'` + 26 `\.` escape artifacts + Weil's footnote 1 → `[^1]`; bounded-change proof — char-level **0 non-backslash divergences**, verify **5/5**, pandoc pairs; new sha `58ead0ab…`, re-anchored chamber `catalogue.yaml`). **CAUGHT + fixed my own incompleteness:** the re-anchor was scoped to chamber-library ONLY — the ENGINE bound the sha in **4 more places** (`manifest`/`sidecar`/`coverage-ledger`×2); fixed **by mechanism** (regenerate ledger via `ingest_gate`; `weil-enracinement` re-**VALIDATED**); surfaced **5 pre-existing ARC `after-the-reply` engine drifts** (out of scope). **Documented the class-fix** (steward's ask 'is this not in the runbook?'): `conversion-runbook.yaml` **`reanchor:` block** (grep BOTH repos + engine-gate-is-the-proof) + **PENDING-53** (the ratified `graduation-spec` hash-locality principle omits the engine consumer surface + mis-frames it 'hash-free'). **Then P2 diagnosis exposed footnote-family whack-a-mole** (A–E, one regex per book); **steward steered up a level → verified a structural EPUB-normalizer is viable**: `epub:type` **DEAD** (all EPUB1.0/2.0), the **bidirectional href↔id mirror PROVEN** (one predicate catches **54 refs across G&G's 5 families + Mauss's A**; also excludes one-way TOC links). **⚠ PULLING THREAD: build the structural, verbatim-guarded EPUB normalizer** that retires the family-per-book pattern, then resume P2/gold on it — NEXT step = prototype the *detector* on the 3 attested Chamber Sources EPUBs (cross-file endnotes? TOC excluded? is L'Enracinement a genuine 2nd shape?) BEFORE writing the converter. Chamber+engine P1 changes **uncommitted** (steward's call). **REVIEWED-52 + PENDING-53 await.** ## Historical reference → MEMORY-reference.md Older archived-session pointers and the stable reference layer (steward profile · project-state detail · L1/L2/Chamber inventories · legacy pending-work · reference-file list) live in [MEMORY-reference.md](MEMORY-reference.md) — consult on demand; not loaded at wake. Recent cross-session trajectory comes from the Active Session entry above + the recent `session-*.md` files (wake §2.b.1; the MemPalace `handoffs` glance was retired 2026-07-07 with the wind-down). diff --git a/claude/memory/knowledge-graph.jsonl b/claude/memory/knowledge-graph.jsonl index e58d171..281d27c 100644 --- a/claude/memory/knowledge-graph.jsonl +++ b/claude/memory/knowledge-graph.jsonl @@ -338,3 +338,5 @@ {"subject": "claude-code", "predicate": "drift-pattern", "object": "provenance-treated-as-a-loose-end (called source-attestation + archiving 'loose ends/deferrable'; steward: they ARE the process, not the tail). Kin to completion-is-a-tripwire.", "valid_from": "2026-07-09", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-09-v2-review-handke-graduation-process-lesson.md", "extracted_at": "2026-07-09"} {"subject": "claude-code", "predicate": "drift-pattern", "object": "barrel-forward-instead-of-read/plan-first (kept executing autonomously while the steward repeatedly stopped to slow / read docs / plan; the 'calm and orderly' ask).", "valid_from": "2026-07-09", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-09-v2-review-handke-graduation-process-lesson.md", "extracted_at": "2026-07-09"} {"subject": "claude-code", "predicate": "drift-pattern", "object": "swallowed-tool-error-read-as-absence (eza `ls -t` errored at wake → read the failed listing as an empty folder = 'no design doc', when the folder had it). A failed command is not evidence of absence.", "valid_from": "2026-07-09", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-09-v2-review-handke-graduation-process-lesson.md", "extracted_at": "2026-07-09"} +{"subject": "claude-code", "predicate": "drift-pattern", "object": "re-anchored a re-hashed canonical in ONE repo when the sha-binding surface spanned TWO (chamber catalogue done; engine manifest/sidecar/coverage-ledger missed). After any chamber re-hash, grep BOTH chamber+studium-engine for the old sha and run ingest_gate. Cross-repo trust-prior-pass-frame.", "valid_from": "2026-07-09", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-09-evening-p1-clean-reanchor-then-epub-normalizer-pivot.md", "extracted_at": "2026-07-09"} +{"subject": "chamber-epub-conversion", "predicate": "design-direction", "object": "structural EPUB normalizer keyed on the bidirectional href<->id mirror predicate (a footnote ref = with internal #href + own id whose target element mirrors back) retires the footnote-family-per-book whack-a-mole; epub:type route DEAD (sources are EPUB1.0/2.0, no epub:type). One predicate caught 54 refs across G&G's 5 families + Mauss. Verified 2026-07-09; prototype the detector before building.", "valid_from": "2026-07-09", "valid_to": null, "confidence": 0.9, "source_file": "session-2026-07-09-evening-p1-clean-reanchor-then-epub-normalizer-pivot.md", "extracted_at": "2026-07-09"} diff --git a/claude/memory/session-2026-07-09-evening-p1-clean-reanchor-then-epub-normalizer-pivot.md b/claude/memory/session-2026-07-09-evening-p1-clean-reanchor-then-epub-normalizer-pivot.md new file mode 100644 index 0000000..c5cc166 --- /dev/null +++ b/claude/memory/session-2026-07-09-evening-p1-clean-reanchor-then-epub-normalizer-pivot.md @@ -0,0 +1,52 @@ +--- +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. diff --git a/claude/memory/session-ledger-2026-07-09.md b/claude/memory/session-ledger-2026-07-09.md index 0954b0b..c911b7d 100644 --- a/claude/memory/session-ledger-2026-07-09.md +++ b/claude/memory/session-ledger-2026-07-09.md @@ -14,6 +14,8 @@ metadata: - 10:35 — Fable's V2 design doc is REAL (thread now **confirmed**, not superseded). Did the jurist-review same-seat + independent substrate re-verification rather than trusting the doc's "every claim verified" self-attestation (holding the day's two drift-patterns). Result: §1 substrate findings reproduce **exactly** (1124 escaped apostrophes; Mauss 943/864/817; German-source finding; G&G Thibon paratext). Sole correction: §1.5 manifest census says 13, substrate = 21 (→ matches plan; P4; immaterial). Fence check (V0 §5) passed: uniform-20% first-batch distribution is compliant. Converges with the actual jurist's relayed review (don't redo with Fable). +- 17:16 — **Wake (post-clear) into the same-day thread.** Thread-validity = **confirmed** (V2 gold prep; P3 done, P1 next). Caught the day's own `swallowed-tool-error-as-absence` drift **twice in the wake itself**: (1) `ls session-*.md` returned empty → did not read as "no session files"; (2) `ls session-ledger-*.md` returned empty → **checked `test -f` before Write**, found today's ledger EXISTS — overwriting would have destroyed the prior entries. The drift-pattern I woke holding is the one I nearly repeated; naming it here so the return strengthens, not just avoids. Holding for the session: read-repo-docs-first + calm/plan-first before P1. + ## Authorization moves - 10:40 — Folded 2 jurist-requested mechanical fixes into the V2 design doc (D-1, recorded not silent): §2.2 cross-ref §11.4→§11.3; added precondition P7 (stratum-tag pre-existing gold). Owed REVIEWED entries: (a) charter's V0-gate + œ/æ ratification (still unfiled, steward); (b) this V2-design jurist-review outcome. @@ -34,3 +36,16 @@ metadata: ## Sub-agent dialogues ## Bypasses + +## P1 — L'Enracinement source-clean (post-clear, read-repo-docs-first held) +- 17:55 — **Read the governing docs FIRST** (chamber CLAUDE.md + conversion-runbook + graduation-spec + V2 §14) — the exact step 2026-07-09-daytime skipped. Then answered the wake's literal question with substrate evidence: re-hashing `lenracinement.md` breaks **no hand-bound anchors** — only `catalogue.yaml:11471` carries the sha (regenerable), no reading-index (only 4 exist, none Weil), no phase-2 citation. Re-anchor = one `build_catalogue.py`. +- 17:56 — **Finding (would have shipped past on a naive strip):** the C1 defect is TWO classes, not one — 6,671 `\'` + 26 `\.` (pure pandoc escapes, faithfully removable) **plus `\[1\]`×2 = Weil's footnote 1** (marker L1279 + def L2624), which a blanket `\[→[` would half-break. keep_notes governs → convert to `[^1]`/`[^1]:`. The measure-whole-first discipline caught it (the frontmatter `title:` also carried `\'`). +- 17:57 — **Green-gate insufficiency compensated:** `prose_delta` is a word-multiset → structurally blind to the punctuation edit → reads 0 regardless. Did NOT rest on it; added a char-level faithfulness alignment (0 non-backslash divergences) + pandoc footnote-pairing render check. (Holds today's `green-gate-reads-as-thoroughness` + `verification-passed-vacuously` patterns.) +- 18:00 — **APPLIED (steward-authorized both recommendations: scoped in-place + footnote-in-P1).** Bounded-change proof: prose_delta 0; char delta 6698; residual backslashes 305; 1125 lines changed; verify_conversion **5/5 PASS**; catalogue re-anchor bounded to 2 lines (title+sha), drift gate in-sync; pandoc fn1 pairs. New sha `58ead0ab…` (was `0553bd5f…`). Footprint: canonical .md + catalogue.yaml, both **uncommitted** (governed repo + Gitea flaky → steward's commit call, joining the prior 4). Backup at `scratch/making/lenracinement.pre-p1.bak`. +- **NEXT (do not barrel):** P2 (G&G sidecar + EPUB-residue clean), then P4/P5/P6/P7 — steward directs the rhythm. + +## Return — P1 re-anchor was INCOMPLETE (caught during P2 diagnosis) +- 18:20 — **Named + fixed my own miss.** In P1 I claimed "only catalogue.yaml binds to the sha" — but I scoped the grep to **chamber-library only**. The **engine** carried 4 more bindings to the old sha (`corpus/manifest.yaml:184`, `coverage-ledger.json:316/330`, `sidecars/weil-enracinement.meta.json:5`). The wake's literal question said "grep what is bound to lenracinement's sha" — the binding surface spans **both repos**; I checked one. Textbook `trust-prior-pass-frame` / verify-at-the-scope-of-the-extension. Found it only because P2 diagnosis opened the engine sidecars — luck, not rigor. **New standing check: after any chamber canonical re-hash, grep BOTH chamber AND studium-engine for the old sha.** +- 18:22 — **Fixed correctly by mechanism:** manifest.yaml + sidecar are curated → hand-fixed the declared sha (assert 1 occ each); coverage-ledger is `generated_by: ingest_gate.py` → regenerated via the gate (recomputes live sha; §1.1 hash-binding is the proof). Result: 0 old-sha remain; weil-enracinement **VALIDATED**; line count unchanged (2624) so sections/`source_lines` stayed valid. +- 18:23 — **Pre-existing finding surfaced (NOT mine, NOT fixed):** regenerating the ledger revealed **5 latent failures — `after-the-reply-i…v`** (ARC essay reading-sources; manifest+sidecar sha drift from ARC revisions). The stale ledger had hidden them behind a false "validated: 15". Honest-degradation win, but a separate ARC↔engine re-anchor task to flag. Engine now: validated 8 / failed 5 (the 5 ARC) / blocked 0. +- Engine footprint (uncommitted, D-1): manifest.yaml (1 line), weil-enracinement.meta.json (1 line), coverage-ledger.json (regenerated).