61 lines
11 KiB
Markdown
61 lines
11 KiB
Markdown
---
|
||
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`.
|