session 2026-07-02 evening: Sennett graduation + Family-D footnote tool + corpus standard/method; PENDING-45; audit-map = next pulling thread

This commit is contained in:
David F Glidden
2026-07-02 23:22:58 +02:00
parent 0848bf2a55
commit 33de643d2d
4 changed files with 101 additions and 0 deletions
+10
View File
@@ -1013,3 +1013,13 @@ The Jurist's six-phase authorization map governs sequencing. Cross-cutting succe
**Design commitments:** operationalizes the chamber spec §§II–VI (which governs on conflict); scope-disciplined per PENDING-42 §VI (encode what we know; grow as protocols declare themselves); the runbook now POINTS to the spec (`policy.graduation_conventions`) rather than restating it.
**Files affected:** `chamber-library/_curation/graduation-spec.yaml` (new, governed), `scripts/verify_graduation.py` (new), `_curation/conversion-runbook.yaml` (pointer added), and the 3 graduated texts + their `_curation/conversions/*.conversion.yaml` provenance records.
**Awaiting:** REVIEWED-46 placement by the steward. **Steward authorized verbally 2026-07-01** ("yes to pending/reviewed"); spec promoted drafts→governed and applied. REVIEWED text owed to close the loop on paper (as with REVIEWED-44/45).
## PENDING-45 — Family-D (stem-suffix) footnote handler added to clean_epub_residue.py
**Date:** 2026-07-02
**Tag:** [HARDENING]
**Summary:** Extended the graduation-rail's footnote converter with a 4th anchor family (stem-suffix: ref `[¹](#…_{stem})` ↔ def `[N.](#…_{stem}a)`, keyed by the globally-unique stem), unblocking the recovery of per-chapter endnote apparatus in z-library/Kindle-derived EPUBs. First use: reconverting Sennett *The Craftsman* (recovered 294 endnotes the prior calibre conversion had silently unlinked).
**Rationale:** Footnote apparatus is the Making-batch's binding constraint — the tool covered 3 of ≥5 anchor families in actual corpus use. `clean_pandoc_html_residue`'s `INTERNAL_LINK` unwrap silently DESTROYS any footnote-link it doesn't recognize (word-guard excludes fn labels), so an uncovered family = silent linkage loss (the exact defect being repaired). Extends the PENDING-44 rail; conventions unchanged.
**Verified:** Sennett 294↔294 paired, 0 orphans, both gates PASS, prose verbatim-preserved. Regression-tested Families B (Winnicott) + C (Virilio) — caught + fixed a real regression (C's `r`-prefixed def targets read as phantom D-refs; fixed in verify_pairing). Reviewed in `_curation/tool-evolution-log.md`.
**Out of scope:** Crawford's `filepos` positional family (ref/def don't share a stem) — a different pairing model, still owed; documented in the tool docstring.
**Files affected:** `scripts/clean_epub_residue.py` (Family D); `canonical_texts/…/environmental/the-craftsman-sennett-richard.md` (Sennett reconverted + spec-normalized headings); `catalogue.yaml`; `_curation/tool-evolution-log.md`.
**Awaiting:** steward acknowledgement (a tool addition within the authorized "build the tool the batch needs" discipline; recorded for the paper loop alongside PENDING-44).
+3
View File
@@ -51,6 +51,9 @@ 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-02 evening — Sennett + Family-D tool + the corpus standard & method](session-2026-07-02-evening-corpus-standard-and-the-method.md) — Short evening session; ONE work graduated but the value was elsewhere. **Reconverted+graduated Sennett *The Craftsman*** (calibre-era canonical had silently-lost note-linkage + old-schema frontmatter + `****` residue) — recovered 294 endnotes, spec-normalized headings (incl. a setext Conclusion), both gates PASS, verbatim-preserved; **committed `10cff59`**. To do it, **built+tested+committed the Family-D (stem-suffix) footnote handler** in `clean_epub_residue.py` (regression caught+fixed against Families B/C) — the 4th of ≥5 anchor families the corpus actually uses (Crawford's `filepos` = a different pairing model, still owed). **PENDING-45.** Then a **corpus-quality census** answered the steward's "is poor-quality-graduated widespread?": **YES, 3 distinct axes** — conventions **8/332 pass** (pre-spec, mechanical), text-health **110/332 damaged** (OCR'd big works: Bringhurst/Hochuli/Taruskin/music-bios), **apparatus UNMONITORED** by either gate (Sennett proves "has notes" ≠ "apparatus intact"). Steward felt the vision slipping (**"mandelbrot set… whack-a-mole… clutching sand… I tremble at making the engine work"**) → named the **STANDARD** (verified verbatim fidelity + provenance + apparatus for ANYTHING the engine cites — a floor not a tier; "graduated"=converted+filed ≠ verified; a quietly-corrupt bounded corpus is WORSE than none; fence the engine to green NOW, grow green→100% by waves) and the **METHOD** (whack-a-mole = working reactively per-file; cure = **measure-the-whole-first → one quality MAP → remediate BY DEFECT-CLASS in finite waves, each a countdown**). **PULLING THREAD: build `audit_corpus.py` + the apparatus check → the full quality ledger/MAP of all 1,284 works (the instrument that ends the whack-a-mole), then plan waves from data. Do NOT resume graduating reactively.** Q: did the map get built + real defect-class distribution + is Wave A (frontmatter migration, ≈8→200) the right first countdown?
## Archived (2026-07-02 evening — corpus standard & the method)
- [Session 2026-07-02 — Chamber source-provenance archive + pipeline](session-2026-07-02-chamber-source-provenance-archive.md) — Woke toward the Making graduation queue; a second Jonas copy opened a full source-provenance arc. **Jonas p248 dissolved** (the "illegible page" held only the "Notes" divider — no content lost). **Built the Chamber Sources archive** (`~/Library/Mobile Documents/com~apple~CloudDocs/Chamber Sources/`, iCloud Keep-Downloaded): **322 verified source COPIES, 3.3 GB** + 14 Braid/L2 in `pending-graduation/`. Covers ~all of the ~332 non-Loeb corpus (1284 canonical; 952 = Loeb, pipeline-sourced/excluded). **Built + committed the pipeline (`7553f59`, pushed):** `build_inventory.py` (reproducible census — Apple Books + unzipped .epub dirs + .zip; the gaps that hid ~25 works), `match_sources.py` (internal-metadata + diacritic-fold + TITLE-coverage scoring + Loeb-skip + author-agreement VERIFICATION; 321/335 non-Loeb confirmed), `archive_sources.py`; runbook `source_provenance:` section. **Crux:** first census excluded Apple Books + accent-blind greps → wrongly called ~25 works "absent" + posed FALSE edition-dilemmas; steward corrected *"the texts exist because I have them"* — every dilemma dissolved to the correct edition once Apple Books included. **Caught+fixed 3 high-conf FPs** (meditations→Daily-Laws→Hays; aesthetics/Adorno→Sontag→Adorno; nietzsche/Zweig→Nietzsche's-Works→Zweig). Steward directive: **source-archiving is now a STEP OF graduation.** **PULLING THREAD: come through the graduation queue (~12 Making + 14 Braid/L2), filing each source as we graduate.** Q: did the short evening session happen + which source graduated first?
## Archived (2026-07-02 — Chamber source-provenance archive)
@@ -0,0 +1,61 @@
---
name: Session 2026-07-02 evening — Sennett + Family-D tool + the corpus standard & the method
description: "Reconverted+graduated Sennett (built/tested/committed the Family-D footnote handler, 10cff59). A corpus-quality census then revealed 'graduated ≠ verified' is corpus-wide (8/332 pass conventions, 110/332 text-damaged, apparatus unmonitored). Steward named the vision slipping ('sand through fingers', 'whack-a-mole') and set the STANDARD (verified verbatim fidelity + provenance + apparatus for anything the engine cites) and the METHOD (measure-the-whole-first, then remediate-by-defect-class in finite waves). PULLING THREAD: build audit_corpus.py + the apparatus check → produce the full quality MAP of all 1,284 works (the instrument that ends the whack-a-mole), then plan waves from data."
metadata:
type: project
originSessionId: 019pnD8uNFC9Q2dbLQa3MBDc
---
# Session 2026-07-02 evening — Sennett, the Family-D tool, and the way through
Started as a short evening session to graduate a few Making-sequence EPUBs "in that order, see how many we can do." Became something more important: a durable tool, a corpus-wide diagnosis, and — most of all — a **method and a standard** the steward now wants to build against. Only ONE work graduated; that is not the session's value.
## PAST — what we did + why
**Graduation-order plan (Sebald → Crawford → Winnicott → Agamben → Steiner → Calasso → Celan).** Recon killed the "clean fast-path" framing: each has a footnote-family issue OR an image question.
- **Sebald DEFERRED** (steward call): integral uncaptioned photographs = content, not decoration; the chamber is a text corpus. Which work (Rings of Saturn / Austerlitz) also unresolved. Needs an image policy.
- **Celan** flagged: verse + bilingual, not a prose fast-path.
- Image census: mostly decoration (covers, ornaments ×18–53) + a few possible-content figures per book (Winnicott squiggle, Calasso root2) — per-book triage owed.
**Footnote-family gap = the batch's binding constraint (the real diagnosis).** The rail's converter (`clean_epub_residue.py`) covered 3 anchor families (A Calibre nfK, B `_fn-N`, C caret chNfnN). The corpus uses ≥2 more, UNCOVERED: Crawford = `filepos` page-anchors (286), Sennett = `{section}fn{N}`/`{…}a` (294). **PASS-BUT-FALSELY trap avoided:** `clean_pandoc_html_residue`'s INTERNAL_LINK unwrap silently DESTROYS any footnote-link it doesn't recognize (word-guard excludes fn labels) → for Sennett/Crawford it previewed "CLEAN" while about to destroy the markers = reproduce the exact lost-linkage defect. Caught by previewing, not applying. (Census regexes gave 2 FALSE family IDs — recalibration: read the exact anchor STRING before trusting a family-count grep.)
**BUILT Family-D (stem-suffix) footnote handler** (steward-authorized "build the generalized converter"). Ref `[¹](#…_{stem})` ↔ def `[N.](#…_{stem}a)`, keyed by the globally-unique stem (section+number, per-chapter-safe). Conversion runs AFTER A/B/C (their anchors consumed first). **Tested + regression-tested:** Sennett 294↔294 (0 orphans); Winnicott (B) clean; Virilio (C) — CAUGHT+FIXED a real regression (INLINE_STEM captured C's `r`-prefixed def targets `rchXfnY` as phantom D-refs → 72 false orphans → verify would wrongly ABORT; fix = subtract both C stem-set AND its `r`-prefixed form in verify_pairing; conversion was always order-safe). Lesson logged: a broad regex added to a multi-family converter must be tested against EVERY family's fixtures. Crawford's `filepos` = a DIFFERENT pairing model (ref/def don't share a stem) — OUT of scope, documented as still-owed in the docstring.
**Reconverted + graduated Sennett *The Craftsman*** (steward chose "Sennett first" — its old canonical was calibre-era: lost note-linkage, old-schema frontmatter, 27 `****` drop-cap heading residue). New pipeline: pandoc → Family-D footnotes (294 recovered+paired) → residue strip (decoration images dropped) → trim (front boilerplate/dedication/ToC/Index) → frontmatter (current schema) + title block + epigraph ("travail, opium unique") → **full spec heading-normalization** (steward chose "normalize first": merged 10 split `### CHAPTER N`+`## Title` → `## N. Title`, title-cased PART labels, promoted book-divisions to L1, recovered the Conclusion which was a SETEXT heading rendered as plain text, region-demoted subsections). **Both gates PASS; body prose word-guarded (delta fully explained: stranded note-digits → `[^]` labels + frontmatter + dropped index/toc — NO content loss, verified by multiset comparison).** Source already in Chamber Sources (sha c46fc577), not engine-registered. **Committed 10cff59** (chamber-library, local, ahead 1). tool-evolution-log + PENDING-45 written.
**CORPUS-QUALITY CENSUS (steward asked: is poor-quality-graduated widespread?).** Ran both gates across all 332 non-Loeb canonical .md (+952 Loeb excluded):
- **Conventions (verify_graduation): 8 PASS / 324 FAIL** — but ~all frontmatter/title-block (pre-spec; the gate is 2026-07-01). Mechanical class.
- **Text health (verify_conversion): 222 PASS / 110 FAIL** — real OCR/cruft damage, CONCENTRATED in big scanned works (Bringhurst, Hochuli, Taruskin, music biographies, Europe-Davies). The genuine concern.
- **Apparatus: UNMONITORED by either gate.** Only 77/332 have a notes heading; Sennett proves "has notes" ≠ "apparatus intact." Old-schema signature: 26 `language:` + 11 `conversion_method:`.
## PRESENT — mood / the pivot
This session's weight was NOT the graduation. Midway, the steward felt the recursion — **"this is starting to feel like a mandelbrot set"**, then **"whack-a-mole… the vision slipping… clutching sand… I need purchase… this was supposed to be the part we could solve; if this is so difficult, I tremble at the thought of making the engine work."** Real distress about the whole vision.
Two things answered it:
1. **The standard** (steward asked directly, "honest answer even if I won't like it"): the corpus must aspire to **verified verbatim fidelity + correct provenance (attribution/structure/apparatus) for EVERYTHING the engine may cite — a floor, not a tier.** Because the engine can't tell corrupt from clean; it cites both with equal confidence; confidence-without-correctness is the exact contamination the project exists to defeat. A quietly-corrupt bounded corpus is WORSE than none (the L1 line, applied). "Graduated" has meant *converted+filed*, not *verified faithful* — a weaker claim than the engine needs. Escape from despair: you don't need 1,284 perfect works — you need a VERIFIED, FENCED subset + a boundary that never lies about its edge (boundedness=trust, turned on the library). Fence the engine to green NOW; grow green to 100% by waves.
2. **The method** (steward: "how do we systematically work through this? I need the WHOLE thing, queryable, reliable"): whack-a-mole = working REACTIVELY, per-file, unbounded. The cure = **invert the order: MEASURE the whole first (one auditor → one quality map), then REMEDIATE BY DEFECT-CLASS in finite waves, each a countdown.** You never get surprised mid-file again because the map told you everything up front.
Returns/recalibrations (from ledger): owned working mole-by-mole tonight (the pattern to break = build the map first); avoided the PASS-BUT-FALSELY footnote-destruction by previewing; caught own false family-ID greps (read the exact string, not the count); named the "convenient-vs-faithful" heading choice and surfaced it rather than deciding unilaterally.
## FUTURE — what is pulling
**PULLING THREAD (singular):** **Build the instrument and draw the map** — `audit_corpus.py` + the apparatus check → a full machine-readable quality ledger of all 1,284 works, one row per file (conventions / text-health / apparatus / provenance-link + defect-class + source-on-hand). This is the deliverable that ends the whack-a-mole; from it, remediation waves are planned from data. The next session's job is NOT "graduate more works" — it is the MAP.
**ACTIONABLE RESUMPTION POINT (as of wrap — re-judge against what changed):**
- chamber-library `main @ 10cff59` (ahead 1; pushed at wrap or note). Family-D tool live in `scripts/clean_epub_residue.py`.
- *First move:* build `scripts/audit_corpus.py` that runs, per canonical file: verify_graduation + verify_conversion + a NEW apparatus check + provenance-link check → writes `_curation/corpus-quality-ledger.tsv` (or .json). Most checks exist; assemble them. The apparatus check (design in ledger + PENDING context): (a) footnote defs `[^x]:` present but unpaired ref `[^x]` → orphan; (b) a Notes/endnotes SECTION present with 0 `[^]` machinery → STRANDED (the calibre-loss signature); (c) ref↔def pairing (reuse `clean_epub_residue --verify` logic).
- Then: classify the ledger into defect-classes and present the wave plan. Expected classes: **A convention-only** (majority, batchable via a frontmatter-migration script — Wave A alone ≈ 8→200 pass); **B text-damage** (~110, reconvert from archive, parallelizable); **C apparatus** (stranded notes, count TBD, reconvert like Sennett). Overlaps exist (Sennett was A+C).
**Other open horizons, ranked:**
- *The remediation waves themselves* (after the map): A (frontmatter migration, near-automatic, biggest count-mover) → B (reconversion of OCR-damaged, finite list) → C (apparatus). Each a countdown; fence the engine to the green set as it grows.
- *Sebald image policy* (deferred; blocks Sebald + informs all image-bearing works).
- *Crawford filepos footnote handler* (the 2nd uncovered family; different pairing model, still owed).
- *The original Making batch* (Winnicott/Agamben/Steiner/Calasso/Celan) — now SUBORDINATE to the map/waves; don't resume graduating reactively.
- *Paper debt:* REVIEWED-44/45/46 unplaced; PENDING-45 filed tonight.
**PAUSE STATEMENT:** Away now, at a low-morale but clarified moment. The vision felt like slipping sand tonight; the answer given was a method that turns the infinite fractal into a finite, countable, wave-by-wave siege. What I most want to find still pulling on return: **the map** — that the next hand builds the auditor and produces the quality ledger of the whole corpus, so we stop meeting the edge one grain at a time and start seeing the whole boundary at once. Do NOT resume graduating works reactively; build the instrument first.
**LITERAL QUESTION for next-Claude:** *Did the map get built — does `audit_corpus.py` exist and has it produced a full quality ledger of all 1,284 works? If so, what did the real defect-class distribution turn out to be (vs tonight's 332-file estimate), and is Wave A (frontmatter migration) the right first countdown to run?*
**State:** chamber-library `main @ 10cff59` (Family-D tool + Sennett graduation committed; 2 pre-existing untracked leftovers `_scratch/`, nature-of-order-alexander.md NOT mine). Sennett canonical replaced + verified. PENDING-45 filed. Census numbers captured in the ledger. Nothing else touched canonical.
@@ -39,3 +39,30 @@ metadata:
## Sub-agent dialogues
## Bypasses
## Evening session (wake ~21:22)
- 2026-07-02T21:22 — Woke into the evening session (~4h after 17:05 wrap). Thread confirmed unchanged: graduate the queue, file each source into Chamber Sources as a step of graduation. Chamber clean @ `7553f59`; nothing moved. Holding drift-pattern *assume-absent-from-filename-grep*. First move if we proceed: one fast EPUB Making source end-to-end through the rail + archive-as-graduation-step proven once.
### Diagnosis (the evening's real finding) — footnote-apparatus is the batch's binding constraint
- 2026-07-02T~22:30 — Set out to graduate the 7 clean-EPUB Making works (Sebald deferred → Crawford; then steward chose **Sennett reconvert first**). Reconnaissance across all of them surfaced a SYSTEMIC gap, not per-book bad luck:
- The graduation tooling's footnote converter (`clean_epub_residue.py --mode footnotes`) covers exactly **3 anchor families**: A=Calibre `nfK`/`anfK`, B=`_r?fn-N`, C=`^([..](#.._chNfnN))`. The actual corpus EPUBs use **≥2 more, uncovered**: Crawford = `filepos` page-anchors (286 markers); **Sennett = `{section}fn{N}` / `{section}fn{N}a`** (e.g. `prologuefn1`/`prologuefn1a`, `ch001fn1`; 536 notes, per-chapter numbered).
- **PASS-BUT-FALSELY trap avoided:** `clean_pandoc_html_residue.py`'s `INTERNAL_LINK` unwrap SILENTLY DESTROYS any surviving footnote-link it doesn't recognize (word-guard excludes fn labels, so loss is uncaught). Its abort-guard only fires on the 3 known families → for Sennett/Crawford it previewed "CLEAN" while planning to unwrap → would have reproduced the exact lost-linkage defect. Caught by previewing, not applying.
- **Sennett corrected picture:** source EPUB notes are WELL-FORMED (visible `<sup>` in-text markers + verbatim per-chapter-grouped definitions, fully paired by anchor stem). The old canonical's lost linkage was a *calibre* artifact. Reconversion CAN recover it — but ONLY with anchor-aware footnote handling; naive pandoc+existing-cleaners destroys the markers. The 460 `[N](#.._page_N)` "markers" the census first flagged are the INDEX's page-links (drop with Index trim) — a red herring.
- Census regexes gave two FALSE family IDs tonight (Crawford mis-read, Sennett `chNfnN=536` false-positive). Recalibration: verify the exact anchor STRING in-file before trusting a family-count grep. (drift: assert-from-grep-hit-without-reading.)
- **Durable fix identified:** a GENERALIZED anchor-stem footnote converter — pair `[vis](#..._STEM)` ref ↔ `[vis](#..._STEMa)`/`[vis](#..._STEM)` def by the globally-unique STEM (the principle Family-A already uses), emit `[^STEM]`. Do-once; covers A/B/C + Sennett + Crawford + likely the rest. This is the batch's real unblock. Surfaced to steward for a spend-the-evening call vs. a lighter faithful pass.
- Nothing written to canonical. Sennett canonical file UNTOUCHED. All work in scratch/ (regenerable).
### Family-D footnote handler BUILT + tested (the durable win)
- 2026-07-02T~23:00 — Steward chose "build the generalized converter." Added **Family D (stem-suffix)** to `clean_epub_residue.py`: ref `[¹](#…_{stem})` ↔ def `[N.](#…_{stem}a)`, keyed by the globally-unique stem (embeds section+number, per-chapter-safe). Tested: **Sennett 294↔294, 0 orphans**; regression-tested **Winnicott (B)** and **Virilio (C)** — caught + fixed a real regression (INLINE_STEM captured C's `r`-prefixed def targets `rchXfnY` as phantom D-refs; fix = also subtract the `r`-prefixed C stem-set in verify_pairing). Conversion is order-safe (D runs after A/B/C consume their anchors); only the verify guard needed the exclusion. Uncommitted; needs tool-evolution-log entry + PENDING (extends PENDING-44's rail).
- Filepos-positional family (Crawford, 286 markers) explicitly OUT of scope — different pairing model (ref/def don't share a stem), documented as still-owed in the tool docstring.
### Symmetria check — Sennett heading approach (return)
### CORPUS-QUALITY CENSUS (steward asked: is poor-quality-graduated widespread?) — 2026-07-03 ~00:40
- Ran both gates across all **332 non-Loeb canonical .md** (+ 952 Loeb DSL excluded). THREE axes:
- **Convention/metadata (verify_graduation):** 8 PASS / **324 FAIL**. ~Universal — but almost all failures are frontmatter/title-block (212 missing req fields, 204 no title-block, 109 NO frontmatter at all, 83 canonical≠true). Only 3 fail a text-content check. Mostly = graduated BEFORE the spec+gate existed (2026-07-01). Mechanical class; not alarming per se.
- **Text health (verify_conversion):** 222 PASS / **110 FAIL**. ~1/3 have real cruft/OCR/encoding issues — CONCENTRATED in the big OCR'd works: music_performance biographies + Oxford History (Taruskin), the typography/style-guide masters (Bringhurst, Hochuli, Teall, Graves), history tomes (Europe-Davies). This is the genuine quality concern.
- **Apparatus integrity: UNMONITORED by either gate.** Only 77/332 have a notes/biblio heading — but Sennett PROVES "has a notes section" ≠ "apparatus intact" (its notes existed but markers were stranded/unlinked; 0 refs). Neither gate checks ref↔def pairing or stranded-apparatus. Scale unknown because nothing measures it. Old-schema signature: 26 files `language:` + 11 `conversion_method:` (Sennett-class).
- **Verdict: YES widespread, but 3 distinct problems, not one.** Metadata (mechanical, ~universal), text-health (~1/3, OCR'd works), apparatus (unmonitored, ≥1 broken). The known_gap "audit the ~12 already-canonical" UNDERCOUNTS — it's ~110 text-health + an unknown apparatus tail.
- **Steward directive/instinct: "add apparatus to our audit tools."** AGREED — the unmonitored axis. Proposed apparatus check (verify_graduation extension OR new verify_apparatus): (a) footnote defs `[^x]:` present but unpaired ref `[^x]` → orphan; (b) a Notes/endnotes SECTION present with 0 `[^]` machinery → STRANDED (the calibre-loss signature); (c) ref↔def pairing integrity. Reuse `clean_epub_residue --verify` pairing logic. → NEXT tool-build (not at 1am; deserves its own focused pass). Likely warrants a governed corpus-audit PLAN (the ~110 + apparatus tail).
- 2026-07-02T~23:15 — CHECK on "finish Sennett preserving source heading levels vs full spec-normalization." Named the flag: "preserve levels" is partly convenient (avoids restructuring 129 messy source headings — split `### CHAPTER ONE`+`## Title`, mixed L1–L4 — late at night) AND partly genuinely faithful. Resolution: heading-normalization-vs-faithful-preservation is a CURATORIAL CALL (steward rules those); surface it, don't decide unilaterally. Core defect (lost notes / old frontmatter / `****`) IS fixed by the mechanical pass. Plan: finish approach-INDEPENDENT work (trims + frontmatter + title-block + gate), present near-final to steward WITH the heading question, commit only on their word (avoids do-once rework). Must NOT overclaim "gold bar" — state precisely what was/wasn't normalized.