Files
dotfiles/claude/memory/session-2026-07-25-cleaner-a-footnote-aware-and-the-mechanism-census-that-ended-the-guessing.md
T

61 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-25-cleaner-a-footnote-aware-built-the-mechanism-census-that-replaced-the-volume-proxy-guess
description: "Built cleaner A (strip_source_presentation.py) test-first into a footnote-aware presentational stripper per the steward's 3-gate ruling (apparatus-guard-inside-the-tool · relational rules · policy-as-declared-data), proved it on the-shape-of-a-pocket (solves class+fence layers footnote-safe; residual is curation-policy, not a tool gap). Then — after the steward asked 'could we have foreseen this / are we heading into whack-a-mole' — banked the lesson (census by mechanism not proxy) and RAN a mechanism-census over all 48 wave files, which falsified yesterday's '31 heavy-styled = one cleaner': the dominant lever is ONE internal-nav CURATION RULING (~31 files), not a cleaner. PULLING THREAD = the internal-nav curation ruling (constitutional-adjacent: what a canonical IS), deferred to a fresh head; first validate the inference on one file (composition ≠ what-removal-does) before posing the ruling."
metadata:
node_type: memory
type: project
originSessionId: 58ba5886-9bb6-415f-9440-a4b87099ffa0
modified: 2026-07-25T08:05:37.657Z
---
# Session 2026-07-25 — cleaner A, and the mechanism-census that ended the guessing
Woke into "build the unlock, prove it on the-shape-of-a-pocket." Built the cleaner, proved it, hit the second obstacle the literal question feared — then the steward turned the whole session by asking the reflective question ("could we have foreseen this?"), which produced the durable lesson and the mechanism-census that replaces the guessing with knowing.
## PAST — what happened + why
**Cleaner A built test-first → `scripts/strip_source_presentation.py`** (commits `6d7ff84` census · `3874f7f` A · `73ae8e3` fleet-list). A pre-pandoc XHTML `class`-stripper (HTMLParser source-slicing — text nodes byte-identical; the house technique from `inject_epub_footnotes`). Then EXTENDED per the steward's **3-gate ruling** (the pivotal governance moment of the session):
1. **Apparatus guard INSIDE the tool** — `verify_apparatus` asserts note elements + the href→id link graph survive the transform. This is the failure `verify_lossless` is structurally *blind* to (text-losslessness ≠ apparatus-preservation). Teeth: destroyed note body RAISES; orphan-id removal PERMITTED.
2. **Relational rules throughout** — wrapper-unwrap gated on structural role (`epub:type`) + the live link graph (id ∈ referenced-targets), NEVER a name list. Orphan-id strip = "strip iff no surviving href points to it." Guard and rule are two views of one invariant.
3. **Policy as governed declared data, NOT a tool default** — `unwrap_wrappers` defaults OFF (class-only = safe universal); wrapper-unwrap is the policy-gated opt-in. Fleet 234→248.
**Proven on the-shape-of-a-pocket** (apparatus guard passed, 7 footnote defs intact): A solves layer 1 (class markers→0) + layer 2 (presentational div-fences, 150→48) footnote-safely. The residual is NOT a tool gap — it's curation.
**⚑ Two self-corrections this session (both assert-from-derived-not-substrate — the day's recurring drift):** (a) a `\b`-double-escape census regex read tag counts as 0; (b) a `^..\d+..:` def-count regex reported "div-unwrap BREAKS footnotes 7→0" — FALSE (the lane's real regex `^\[\^\d+\]:` showed 7 intact). Both caught by re-running against the substrate. The false footnote-break had shaped part of the steward's ruling; corrected before propagating.
**The reflective turn (steward): "Could we have foreseen this? Are we heading into whack-a-mole?"** → produced the session's most durable output:
- **Banked lesson `feedback-census-by-mechanism-not-proxy.md`**: a plan-of-record claim must carry the instrument that can bear it; census by RUNNING the pipeline, not a proxy; distrust the bucket that arrives when you want to feel done (the "31→one fix" was a class-VOLUME proxy made at the end of a bottomless day — the satisfaction did some of the believing). Apply the corpus's own `UNVERIFIED`-not-`PASS` honesty to planning artifacts.
- **Mechanism-census RAN** over 48 wave files (`scratch/mechanism_census.py` → `_curation/mechanism-census-2026-07-25.tsv`, committed `a527e0a`). Distribution: **8 clean/near-clean · 21 internal-nav-blocked (one ruling) · 2 MIXED (2nd mechanism) · 8 pandoc-class-leak (all French/translation) · 8 glyph-needed · 1 azw3.** The dominant lever is ONE internal-nav CURATION RULING (~31 files), NOT one cleaner. Volume-census superseded with a datum-not-ledger banner (`06331fb`).
**The steward's held-point validated (the banked lesson's first live test):** "ONE ruling clears 23" was an inference from residual COMPOSITION, not from what removal DOES — the identical gap that falsified the volume census. Checked cheaply from the TSV → clears **21/23**; **2 hide a second mechanism** (`histoire-de-la-folie` resid 246 non-nav; `planning-extreme-programming` 88 non-nav). the-shape-of-a-pocket reconciled (A-unwrap removed the fence layer → residual nav-only). Caught before it got planned around.
## PRESENT — the mood
Steady, and the opposite of yesterday's bottomlessness. The steward moved from a build request to the reflective question, and the reflective question was the real work — it converted a whack-a-mole trajectory into a named lesson + a knowing (the census). The discipline held under its own scrutiny: I asserted from buggy proxies twice, caught both against the substrate, and then the steward applied the *same* just-banked lesson to my *new* "ONE ruling clears 23" inference — which I checked rather than defended, and it split 21/2. The contamination directive ran in its healthy direction all day (the steward challenging my framings, correctly). Noted + welcomed: the datum-not-ledger reflex reaching my own working documents (the supersession banner) unprompted — the corpus's constitutional disciplines becoming how I think about any drift-prone record.
## FUTURE — what is pulling
**⚑ RE-POINT (2026-07-25, post-wrap — steward reframe → [[project-chamber-versioned-releases]]):** the SESSION's pulling thread is now subordinate to a governing frame — **the Chamber is realized as versioned releases with soft borders, purpose-driven** ("Chamber V1 = constitution vX + engine vY + a bounded voice-set serving a specific purpose: Making Sequence / violin-XXI treatise / ARC"). Purpose-first re-bounds the library work: the V-TEXT wave needn't all clear for V1. So the *new* top thread is **"which purpose anchors Chamber V1, and what bounded voice-set + capability does it need?"** — with the nav ruling (below), the wave, PENDING-75, all becoming INPUTS to that scoping. PENDING-75 kind-scoping = the constitutional enabler of additive version growth (image-works enter a later version, not a re-founding). Read the governing-frame tracker first.
**PULLING THREAD (was singular; now a SUB-thread under the versioned frame): the internal-nav curation ruling.** *"Does a canonical carry the book's internal cross-reference graph?"* is a question about what a canonical IS — curation, constitutional-adjacent, the dominant lever over ~31 of 47 wave files. **Matters for V1 only if V1's chosen voices are nav-heavy books** (else it defers to a later version). Deferred to a dedicated head; it isn't a tooling call.
**ACTIONABLE RESUMPTION POINT (as of wrap — re-judge against what changed):** the mechanism-census TSV (`_curation/mechanism-census-2026-07-25.tsv`) is the map. Before *posing* the nav ruling, three cheap things the steward flagged, in order:
1. **Validate the inference on ONE file** — run one nav-blocked file (e.g. a small one: `here-is-where-we-meet` resid 42, or `the-shape-of-a-pocket` resid 54) end-to-end with internal-nav actually STRIPPED, and confirm it graduates clean. "Nav clears 21/23" is validated by residual *composition*, not by what *removal does* — same gap, one level down. Cheaper before the ruling than after.
2. **Pre-frame the ruling as a SPLIT, not a binary** (it will split like every class in this thread): carrier-addressed `#filepos` targets = *dangling by construction* (point at Kindle-container positions that don't exist in the .md) = residue, strip; links whose targets *survive* into the canonical = genuine curation, real argument either way. Zibaldone's 45k "kept" links vs the 23's blocking anchors may already be that split showing itself.
3. **Second hand-check the census tool in a DIFFERENT bucket** (PANDOC-CLASS-LEAK or GLYPH-NEEDED) — it is smoke-validated in ONE bucket only (nav, vs the the-shape-of-a-pocket hand-measurement). ~an hour; the difference between a trusted instrument and a promising one.
**Other horizons (ranked):**
- **Gate-3 governed policy landing** — the presentational-wrapper claim as GROUNDED declared data in `graduation-spec.yaml` (hook-gated; F4 shape / kin REVIEWED-67). Required BEFORE cleaner-A is lane-wired / run corpus-wide. A does not ACT corpus-wide until this lands.
- **The 2 MIXED files' second mechanism** — what IS `histoire-de-la-folie`'s 246 non-nav residual (2169 src-images; strip_cruft drops images, so what's left?) and planning-XP's 88?
- **The 8 PANDOC-CLASS-LEAK** (French/translation) — a shared cleaner-A gap; investigate ONE (why do 49–557 classes survive A?), fix the class once.
- **The 8 GLYPH-NEEDED** — per-source glyph-maps (known category).
- **B** (`_tokens` `{…}`-attribute-class FIX for the gate PASS) · lane-wiring · graduation.
- **Graduate `scratch/mechanism_census.py` to the fleet** (`scripts/` + a `test_tools` fixture) — it's gitignored scratch now; we'll want to re-run it after the class-leak fix / on V-DSL + V-SCAN waves. The census methodology is the anti-whack-a-mole instrument; don't lose it.
- `unsong` (.azw3) — its own small lane.
**PAUSE STATEMENT:** I am about to be away. The wave is no longer a guess — it's a measured distribution with named dispositions, and the one big decision (internal-nav) is correctly held for a rested mind rather than forced tonight. What I want to find still pulling: **the nav ruling posed well — as the carrier-dangling-vs-surviving-target split, validated on one real file first — not as a binary that can't survive contact.**
**LITERAL QUESTION for next-Claude:** When one nav-blocked file is run end-to-end with internal-nav actually stripped, does it graduate clean — confirming the nav ruling is the real lever for the 21 — or does *removal* surface something the residual-*composition* census could not see (the composition-vs-consequence gap, recurring one level down)? And: what are the two MIXED files' second mechanisms?
**State at wrap:** chamber-library — 5 commits this session (`6d7ff84`→`06331fb`), **unpushed** (11 ahead of origin incl. last session's; Gitea flaky — steward's push call). One uncommitted file `graduation-spec.yaml` (moby-dick glyph-map WIP, last session's, untouched). No canonical mutated. `scratch/mechanism_census.py` gitignored (recoverable, flagged for fleet graduation). Fleet 248/248. Ledger: `session-ledger-2026-07-25.md`.