11 KiB
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. |
|
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):
- Apparatus guard INSIDE the tool —
verify_apparatusasserts note elements + the href→id link graph survive the transform. This is the failureverify_losslessis structurally blind to (text-losslessness ≠ apparatus-preservation). Teeth: destroyed note body RAISES; orphan-id removal PERMITTED. - 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. - Policy as governed declared data, NOT a tool default —
unwrap_wrappersdefaults 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 ownUNVERIFIED-not-PASShonesty to planning artifacts. - Mechanism-census RAN over 48 wave files (
scratch/mechanism_census.py→_curation/mechanism-census-2026-07-25.tsv, committeda527e0a). 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:
- Validate the inference on ONE file — run one nav-blocked file (e.g. a small one:
here-is-where-we-meetresid 42, orthe-shape-of-a-pocketresid 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. - Pre-frame the ruling as a SPLIT, not a binary (it will split like every class in this thread): carrier-addressed
#filepostargets = 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. - 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.pyto the fleet (scripts/+ atest_toolsfixture) — 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.