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

11 KiB
Raw Permalink Blame History

name, description, metadata
name description metadata
session-2026-07-25-cleaner-a-footnote-aware-built-the-mechanism-census-that-replaced-the-volume-proxy-guess 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.
node_type type originSessionId modified
memory project 58ba5886-9bb6-415f-9440-a4b87099ffa0 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.