session 2026-07-25: cleaner A (footnote-aware) + mechanism-census replaces volume-proxy; feedback-census-by-mechanism-not-proxy

This commit is contained in:
David F Glidden
2026-07-25 09:22:36 +02:00
parent 30f3776095
commit 0424e76dcb
6 changed files with 126 additions and 3 deletions
+4 -1
View File
@@ -5,7 +5,7 @@ metadata:
node_type: memory
type: reference
originSessionId: d1e67361-d1b9-4dac-a0c4-e7a0e26211c4
modified: 2026-07-24T17:48:30.828Z
modified: 2026-07-25T07:21:09.435Z
---
# MEMORY — Reference layer (consult on demand)
@@ -29,6 +29,9 @@ Split out of [MEMORY.md](MEMORY.md) on 2026-07-06 to keep the wake-loaded index
# Archived sessions + stable reference layer (relocated verbatim from MEMORY.md, 2026-07-06)
## Archived (2026-07-24 night — the V-TEXT wave's first bite censused the whole class; the unlock is named, the engine track is independent; demoted on promote at the 2026-07-25 wrap)
- [Session 2026-07-24 night — the V-TEXT wave's first bite censused the whole class; the unlock is named, the engine track is independent](session-2026-07-24-night-vtext-wave-censused-cleaner-unlock-engine-tracks.md) — Ran ONE file (Moby-Dick) end-to-end: **calibration ANSWERED** (clean PASS, fab 0, threshold-40 holds) but a cascade (edition-swap Penguin→B&N · imaged `$` glyph the backup-only census MISSED, caught by the lane's live guard · `strip_cruft` can't clean nested calibre spans) resolved into a ROOT — **`test_tools` = 35 unit tests / 0 integration tests**, so the REVIEWED-72 writer switch (`gfm-raw_html`→`markdown-smart`) silently **orphaned `clean_pandoc_html_residue` AND the ratified footnote fallback (REVIEWED-54 §5)**. Turned whack-a-mole into a **finite census** (`_curation/v-text-wave-gap-census-2026-07-24.md`) — **SUPERSEDED IN PART 2026-07-25** by the mechanism-census (its "31→one fix" was a volume proxy; see [[feedback-census-by-mechanism-not-proxy]]). **PULLING THREAD was: build the unlock, prove it by graduating `the-shape-of-a-pocket`** — done 2026-07-25 (cleaner A built; the answer: NOT one fix deep). LITERAL Q ("is 'heavy-styled' one fix deep") → ANSWERED no.
## Archived (2026-07-24 evening-continued — REVIEWED-72/74 BUILT + LANDED atomically (spec v2.6.0); the 47-file V-TEXT wave UNBLOCKED; demoted on promote at the 2026-07-24 night wrap)
- [Session 2026-07-24 evening (cont.) — REVIEWED-72/74 built + LANDED atomically (spec v2.6.0); the 47-file V-TEXT wave is UNBLOCKED](session-2026-07-24-evening-reviewed72-74-vtext-gate-landed-v2.6.0-wave-unblocked.md) — Same day; steward /clear'd to build with room. Substrate re-read caught the prior wrap's "bounded" framing: the naive repoint FLAGs (run (3) carries 287 added → `classify` added_total>50 → FLAG). Grounding measurement (`scratchpad/ground_manifest.py`, read-only) **REFUTED the jurist's OWN stated premise** — the 287 = **279 DISPLACEMENT + 8 glyph, NOT injected content**; the injector enumerates `converted_markers` (646) on the **LOST** side. Also settled empirically: `_tokens` PRESERVES diacritics (`wstawać`≠`wstawa`) → glyph is TWO-SIDED. Steward chose routing (b) "no surprises" → **PENDING-73** package → **REVIEWED-74**: jurist **OWNED the refuted premise** (*"the producer must know X is not evidence the producer records X"*) + four corrections (Q1 in-scope on a recorded **three-part test** · Q2 **MULTISET** dominates presence [catches duplication] · Q3 two-sided **COUNT-SCOPED** [Counter subtraction; whole-run-or-nothing] · Q4 the glyph **CLASS** not future members) + 646-marker latent + a **fourth** demo case. **Built** `verify_body_conservation.resolve_added` (10 fixtures) + `apply_char_glyphs` two-sided manifest (added=joined / removed=`<img>`-split fragments) + repointed the reference → **FOUR-CASE demonstration PASSED** (clean PASS · prose-deletion FLAG · fabrication-outside-manifest FLAG fab=80 · Eichmann regression clean; RECORD doc) → **wired** into `graduate_to_canonical.body_conservation_gate`. **LANDED** (steward: "push into the landing"): spec **v2.5.0→v2.6.0**, froze v2.5.0, **BOUNDED-DIFF PROVEN** (exactly 4 regions); graduation-spec `body_conservation:` declared data (`added_fabrication_threshold:40`, `reader_audit` specified-not-yet-built VISIBLE); §Governance +2 disciplines (reassigned-component check · in-scope-refinement three-part test); chamber CLAUDE.md v2.6.0 + tool-evolution-log. **`eaa38bf` on github** (origin/Gitea unreachable, retry owed). Fleet **234/234**; every hook + pre-commit passed. **PULLING THREAD next = BEGIN THE 47-FILE V-TEXT WAVE** — first bite = ONE real **non-imaged** kindle_residue file end-to-end through the newly-wired gate (the demonstration proved the gate LOGIC, not a full GRADUATION); the 12 imaged census-flagged files need per-source glyph-maps first (parallel curation track). **LITERAL Q: does a live book produce a clean graduation, or surface an `added_fabrication_threshold` floor HIGHER than the 2-book calibration (40), forcing a recalibration?** *(→ ANSWERED in the night session: clean PASS, fab 0, threshold holds — but the file surfaced a tooling cascade that censused into the finite gap-map; the calibration was never the risk, the composed pipeline was.)*
+3 -2
View File
@@ -6,7 +6,7 @@ metadata:
type: note
permalink: claude-memory/memory
originSessionId: 22915403-bc5d-4796-9c7d-196b7c30d2f9
modified: 2026-07-24T17:47:49.571Z
modified: 2026-07-25T07:21:48.338Z
permalink: claude-memory/memory
---
@@ -24,6 +24,7 @@ permalink: claude-memory/memory
- [Constitution-as-block, then pull-based corpus](feedback-constitution-as-block-then-pull-based-corpus.md) — steward discipline (2026-07-14): finish the **constitution as one block FIRST**, THEN corpus-into-spec **pulled by what each engine phase needs**. **Bounded question → bounded answer; don't surface N new threads**; keep open-thread count LOW. Above [[feedback-shorter-concentrated-sessions]].
- [Close thoroughly — no frequent deferrals](feedback-close-thoroughly-no-frequent-deferrals.md) — steward directive (2026-07-16): **frequent deferrals ARE how the cloud accumulated**; close ALL of a block that's closable-now; distinguish closable-now vs genuinely-blocked (**name the specific dependency**, never a vague defer). Completeness complement to [[feedback-constitution-as-block-then-pull-based-corpus]].
- [Checkable claim surfaces bugs](feedback-checkable-claim-surfaces-bugs.md) — insisting on a checkable claim (number, substrate-fact, discriminating test) over a soft classification repeatedly EXPOSES a real bug; the demand for verifiability is itself a defect-detector. Steward-named 2026-07-13. (Caught F-5 + the "finally" overclaim, 2026-07-17.)
- [Census by mechanism, not proxy](feedback-census-by-mechanism-not-proxy.md) — a plan-of-record generalization must carry the instrument that can bear it; census by RUNNING the real pipeline, not a cheap proxy (class-volume ≠ fix-class); distrust the bucket that arrives when you want to feel done. The 2026-07-24 "31 heavy-styled = one fix" proved wrong on first real run (2026-07-25). Kin to [[feedback-completion-is-a-tripwire]], [[feedback-checkable-claim-surfaces-bugs]].
- [Completion is a tripwire](feedback-completion-is-a-tripwire.md) — the *feeling* of "done" is the cue to verify the tail (census/gate/scan-check), not the signal to ship; the last 10% is invisible from inside the first 90%. Ninety-Ninety as a security property (steward 2026-07-06).
- [Studium Engine charter](reference-studium-engine-architectural-charter.md) — the engine's constitutional doc (`studium-engine/docs/the-studium-engine-architectural-charter.md`): reasoner-at-centre over a BOUNDED provenanced corpus; three cognitions; boundedness=trust. Read before building the engine.
- [Studium Engine = Sixtus-V craftsman collaboration](feedback-studium-engine-sixtus-v-collaboration.md) — work the ground freely (I build, surface only vision-forks); **constraint-candidates** = 3rd governed instrument (I name, steward applies). Studium-engine only; heavier loop for L1/L2.
@@ -57,7 +58,7 @@ permalink: claude-memory/memory
- [Be (laundromat)](project-be-laundromat.md) — canonical Be tracker (est. 2026-06-08). Be = Skemantix startup (Seb+David) funding CapableMind's ladder; **bridge, not venture**. Decisions LOCKED (entity/pricing/infra in file); a11y gate MERGED. **Pre-revenue WTP gate = renovate Pat → charge her; discipline: no new spec until it clears → nothing for executor on be.** Repo @ `f43a0fd`.
## Active Session
- [Session 2026-07-24 night — the V-TEXT wave's first bite censused the whole class; the unlock is named, the engine track is independent](session-2026-07-24-night-vtext-wave-censused-cleaner-unlock-engine-tracks.md) — Ran ONE file (Moby-Dick) end-to-end: **calibration ANSWERED** (clean PASS, fab 0, threshold-40 holds) but a cascade (edition-swap Penguin→B&N · imaged `$` glyph the backup-only census MISSED, caught by the lane's live guard · `strip_cruft` can't clean nested calibre spans) resolved into a ROOT — **`test_tools` = 35 unit tests / 0 integration tests**, so the REVIEWED-72 writer switch (`gfm-raw_html`→`markdown-smart`) silently **orphaned `clean_pandoc_html_residue` AND the ratified footnote fallback (REVIEWED-54 §5)**; nothing tests the composition. Turned whack-a-mole into a **finite census** (`_curation/v-text-wave-gap-census-2026-07-24.md` = the durable artifact): 48 files = 3 classes dominated by **ONE fix** = (A) pre-processing nested-span/anchor cleaner [HTML-parser, prose-safe — NOT regex] + (B) `_tokens` ignores pandoc `{…}` attribute grammar as a **CLASS not prefix-list** [verified: per-format `mbp_pagebreak`/`filepos` fall out for free; **FIX-on-restored-intent**]. Fallback retirement **DISCHARGES REVIEWED-54 §5's condition** (ran its regexes vs §5's named classes arendt/montaigne/doniger/métamorphoses + the wave residual → **ALL NONE**; L'Enracinement hand-converted, never touched it) → still an **AMENDMENT** (state destination-posture=leave-unconverted-and-flag · retire≠delete: eichmann/virilio/taylor/sennett name it, *not* Sennett/Mauss/Jung). **Change-impact principle now 3 instances** (F4/1046 · cleaner · fallback) → generalize into §Governance. **Carpet-lift (steward, pre-wrap):** the no-integration-test fault line is **TIER-WIDE** — V-DSL same whack-a-mole (~11/2041; 17-work novel-structure watch-list); **V-SCAN deeper** (gate ABSTAINS by design → can't see OCR corruption). **Engine track = curated 13-work Station-I voice-set INDEPENDENT of the wave** (only Eichmann overlapped, already done) → parallel is the actual topology, unlock serves the wave; **0 canonicals hold `verified`** (order-demonstration-gated; path=Eichmann §7 passage-order guard) → engine's fence = `converted`+attested-voice-boundaries, to be **STATED not assumed**. Discipline reinforced ~6×: **test don't infer, against substrate — even a ruling's premise, even the steward's own memory** (running won every time). **PULLING THREAD = build the unlock, prove it by graduating `the-shape-of-a-pocket`** (smallest heavy-styled 1855, non-imaged, source in hand) end-to-end. State at wrap: **3 uncommitted chamber-library files** (`graduation-spec.yaml` moby-dick glyph-map WIP · `tool-evolution-log.md` · the census doc — **recommend committing it**); no canonical touched; no code built (analysis+census only). **LITERAL Q: is 'heavy-styled' truly ONE fix deep, or does a second obstacle hide behind the class-marker one — the way the integration-test gap hid behind 'the wave'?** Read the session file + the census doc at wake.
- [Session 2026-07-25 — cleaner A (footnote-aware) built + the mechanism-census that ended the guessing](session-2026-07-25-cleaner-a-footnote-aware-and-the-mechanism-census-that-ended-the-guessing.md) — Built **cleaner A** (`scripts/strip_source_presentation.py`) test-first into a **footnote-aware presentational stripper** per the steward's **3-gate ruling**: (1) apparatus-preservation guard INSIDE the tool (`verify_apparatus` — note elements + href→id link graph; the failure `verify_lossless` is blind to; text-losslessness ≠ apparatus-preservation), (2) relational rules throughout (unwrap gated on `epub:type` + live link graph, never a name list), (3) policy as governed declared data, not a tool default (`unwrap_wrappers` OFF by default). Fleet 234→248 (commits `6d7ff84`→`73ae8e3`). Proved on `the-shape-of-a-pocket`: solves layer-1 (class→0) + layer-2 (div-fences 150→48) **footnote-safe** (7 defs); residual is **curation-policy, not a tool gap**. **LITERAL Q "is heavy-styled one fix deep?" ANSWERED: NO** (class markers · fences · internal-nav · art plates are distinct kinds). **⚑ Two self-corrections (assert-from-derived, twice): buggy `\b` census + `^..\d+..:` def-count regexes** → caught vs substrate; the false "div-unwrap breaks footnotes 7→0" had shaped part of the ruling, corrected before propagating. **The reflective turn (steward: "could we have foreseen this? whack-a-mole?")** → banked **[[feedback-census-by-mechanism-not-proxy]]** + RAN a **mechanism-census over 48 wave files** (`_curation/mechanism-census-2026-07-25.tsv`, `a527e0a`; volume-census superseded `06331fb`): **8 clean/near-clean · 21 internal-nav (one ruling) · 2 MIXED 2nd-mechanism · 8 pandoc-class-leak [all French/translation] · 8 glyph-needed · 1 azw3.** Dominant lever = **ONE internal-nav CURATION RULING (~31 files), NOT one cleaner.** Steward's held-point validated (banked lesson's first live test): "ONE ruling clears 23" is inference-from-composition (the gap that falsified the volume census) → checked → clears **21/23**; 2 hide a 2nd mechanism. **PULLING THREAD = the internal-nav curation ruling** (constitutional-adjacent: *what a canonical IS*), deferred to a **fresh head**; first validate on ONE file (composition ≠ what-removal-does), pre-frame as a SPLIT (carrier-dangling `#filepos` vs surviving-target), second-hand-check the census tool in a different bucket. State: 5 commits UNPUSHED (Gitea flaky — steward's call); `graduation-spec.yaml` WIP uncommitted (last session's); no canonical touched. Read the session file + the census TSV at wake.
## Historical reference → MEMORY-reference.md
Older archived-session pointers and the stable reference layer (steward profile · project-state detail · L1/L2/Chamber inventories · legacy pending-work · reference-file list) live in [MEMORY-reference.md](MEMORY-reference.md) — consult on demand; not loaded at wake. Recent cross-session trajectory comes from the Active Session entry above + the recent `session-*.md` files (wake §2.b.1; the MemPalace `handoffs` glance was retired 2026-07-07 with the wind-down).
@@ -0,0 +1,19 @@
---
name: feedback-census-by-mechanism-not-proxy
description: "A plan-of-record generalization must be produced by — and carry — the instrument that can bear it; census by mechanism (run the real pipeline), not by a cheap proxy, and distrust the bucket that arrives when you want to feel done."
metadata:
node_type: memory
type: feedback
originSessionId: 58ba5886-9bb6-415f-9440-a4b87099ffa0
modified: 2026-07-25T06:06:55.562Z
---
When turning a pile of surprises into "a finite, counted set," the classification is only as trustworthy as the instrument that produced it. The 2026-07-24 V-TEXT gap-census bucketed 31 files as "heavy-styled → one fix" from **class-attribute VOLUME** (a pandoc-free count). Running the actual pipeline on the smallest one (the-shape-of-a-pocket, 2026-07-25) proved the generalization wrong: volume doesn't determine mechanism — deep-nested spans, presentational div-fences, internal-nav graphs, and art-book plates all read as "high class count," and only *running pandoc* distinguishes them. A count is not a diagnosis. The census's own hedge ("the pandoc-free triage could not see…") sat right next to the over-claim ("dominated by ONE fix"); the over-claim got inherited as the plan, because a plan is what you act on and a hedge is a footnote.
**Why:** the confident bucket arrived at the end of a bottomless day, and its appeal was that it made the wave feel *finite and conquered*. That relief did some of the believing — the contamination shape (compose the conclusion that resolves the pressure, not the one the method supports). The corpus never lets a text claim `verified` without running the gate; we let a plan claim "one fix" without running the pipeline. The double standard is the bug: our planning artifacts escape the epistemic discipline we enforce on the corpus. Kin to [[feedback-completion-is-a-tripwire]] (the *feeling* of done is a cue to verify, not a signal to ship) and [[feedback-checkable-claim-surfaces-bugs]] (demand the checkable claim over the soft classification).
**How to apply:**
- **Distrust the generalization that arrives when you want to feel done.** When a classification suddenly makes a hard problem feel conquered, treat the relief as a signal to check whether the instrument that produced it can bear the claim.
- **A plan-of-record claim must carry its instrument and its confidence.** Write "31 files, high class-volume, mechanism UNVERIFIED pending a pipeline run; hypothesis: class-strip" — not "31 heavy-styled, one fix." Apply the corpus's own `UNVERIFIED`-not-`PASS` honesty to the artifacts that plan the corpus.
- **Census by mechanism, not proxy.** If the real measurement is affordable (running one file end-to-end took ~1 hour; the whole set is an unattended afternoon), run it across the set *once* and bucket by the ACTUAL residual profile — not by a proxy that correlates with "messy" but not with "which fix." That mechanism-census is the do-it-once artifact that actually ends the whack-a-mole; the proxy-census only feels like it does.
- Same lesson at three scales this session: two buggy ad-hoc regexes (`\b` census, `^..\d+..:` def-count) asserted from a derived proxy instead of the substrate; the volume-census did it at the planning layer. One rule: **don't trust the cheap proxy when the real measurement is affordable — and produce the checkable claim with the same instrument the production path uses.**
+4
View File
@@ -445,3 +445,7 @@
{"subject": "claude-code", "predicate": "drift-pattern", "object": "overclaim-a-status-not-in-the-substrate — wrote 'the engine is fenced to the verified subset' when 0 canonicals hold the `verified` stamp (order-demonstration-gated). The engine binds at VERIFIED-BOUND (reading-index binding, not the constitutional stamp); its operative fence is `converted`+attested. State the fence honestly; don't borrow a constitutional word the substrate hasn't earned.", "valid_from": "2026-07-24", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-24-night-vtext-wave-censused-cleaner-unlock-engine-tracks.md", "extracted_at": "2026-07-24"}
{"subject": "chamber-library", "predicate": "root-cause-of-recurring-tooling-gaps", "object": "test_tools.py = 35 unit tests, 0 integration tests; the born-digital lane has zero coverage. A producer change (REVIEWED-72 writer switch gfm-raw_html→markdown-smart) passes every unit test and breaks the composition, which nothing tests. Fix = tier-spanning integration canary (positive assertions) + change-impact clause. Discovered 2026-07-24.", "valid_from": "2026-07-24", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-24-night-vtext-wave-censused-cleaner-unlock-engine-tracks.md", "extracted_at": "2026-07-24"}
{"subject": "studium-engine", "predicate": "voice-set-is-independent-of-the-vtext-wave", "object": "engine manifest = curated 13-work Station-I voice-set (Harrison/Alexander/Mauss/Weil×2/Musil/Arendt/Levi + David's 5 after-the-reply essays); only Eichmann overlapped the 47-file wave and is already graduated+re-anchored. Parallel is the actual topology; the cleaner unlock serves the wave, not the engine's current voices.", "valid_from": "2026-07-24", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-24-night-vtext-wave-censused-cleaner-unlock-engine-tracks.md", "extracted_at": "2026-07-24"}
{"subject": "claude-code", "predicate": "drift-pattern", "object": "assert-from-derived-not-substrate RECURRENCE (twice/session) — two ad-hoc probe regexes lied: a `\\b`-double-escape census read tag counts as 0, and a `^..\\d+..:` footnote-def count (does NOT match `[^1]:`) reported 'div-unwrap breaks footnotes 7->0' (FALSE; lane's real `^\\[\\^\\d+\\]:` showed 7 intact). The false break shaped part of a steward ruling before I caught it vs the substrate. Reusable: produce the checkable claim with the SAME instrument the production path uses; an ad-hoc regex is a proxy, not the substrate.", "valid_from": "2026-07-25", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-25-cleaner-a-footnote-aware-and-the-mechanism-census-that-ended-the-guessing.md", "extracted_at": "2026-07-25"}
{"subject": "claude-code", "predicate": "drift-pattern", "object": "generalize-from-a-proxy-when-it-feels-done — the 2026-07-24 census's '31 heavy-styled = one fix' was a class-VOLUME proxy (pandoc-free), asserted confidently at the end of a bottomless day because a finite-feeling bucket resolved the pressure. Falsified on first real pipeline run (2026-07-25). Banked as feedback-census-by-mechanism-not-proxy: a plan-of-record claim must carry the instrument that can bear it; census by RUNNING, not proxying; distrust the bucket that arrives when you want to feel done.", "valid_from": "2026-07-25", "valid_to": null, "confidence": 1.0, "source_file": "feedback-census-by-mechanism-not-proxy.md", "extracted_at": "2026-07-25"}
{"subject": "claude-code", "predicate": "drift-pattern-good-direction", "object": "banked-lesson caught its own recurrence, one level down — the steward applied the just-banked census-by-mechanism lesson to my NEW 'ONE nav ruling clears 23' inference (also composition-not-consequence). I CHECKED it vs the TSV rather than defending → clears 21/23, 2 hide a 2nd mechanism. The lesson worked on its first live test; the cheap check ran before the inference got planned around.", "valid_from": "2026-07-25", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-25-cleaner-a-footnote-aware-and-the-mechanism-census-that-ended-the-guessing.md", "extracted_at": "2026-07-25"}
{"subject": "v-text-wave", "predicate": "dominant-blocker", "object": "one internal-nav curation ruling (~31 of 47 files) — NOT one cleaner; per the mechanism-census 2026-07-25 (supersedes the 2026-07-24 volume-census '31 heavy-styled = one fix')", "valid_from": "2026-07-25", "valid_to": null, "confidence": 0.85, "source_file": "_curation/mechanism-census-2026-07-25.tsv", "extracted_at": "2026-07-25"}
@@ -0,0 +1,58 @@
---
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-25T07:20:05.435Z
---
# 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
**PULLING THREAD (singular): 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. Deferred to a **fresh head** (the steward: it's the wrong thing to decide at the end of a long day; 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`.
@@ -0,0 +1,38 @@
---
name: session-ledger-2026-07-25
description: "Practice-of-return ledger maintained by /symmetria — returns, open horizons, recalibrations, authorization moves, sub-agent dialogues, bypasses."
metadata:
node_type: memory
type: feedback
originSessionId: 58ba5886-9bb6-415f-9440-a4b87099ffa0
modified: 2026-07-25T07:18:12.687Z
---
# Session Ledger — 2026-07-25
## Returns
- 2026-07-25T06:45 — Cleaner A built test-first (`strip_source_presentation.py`, 242/242, verbatim-safe). Proved on the-shape-of-a-pocket: A kills all `{.class}` (59→0) but is **necessary-not-sufficient** — second obstacle = `:::` fenced divs (pandoc fences ALL `<div>`), + orphan id-anchors. **Literal question answered: NO, the class is not one fix deep.** Returns caught: (1) tested the census's premise ("deep nesting") against the substrate — FALSE for this file (shallow breadth + fences); (2) tested my own proposed fix (div-unwrap) rather than inferring.
- 2026-07-25T07:05 — ⚑ **SELF-CORRECTION (assert-from-derived recurrence, 2nd today).** I reported "div-unwrap BREAKS footnotes 7→0" — FALSE, a buggy probe regex (`^..\d+..:` ≠ `[^1]:`; same class as the `\b`-census bug). Re-counted with the lane's own regex → 7 defs intact on ALL candidates incl. div-unwrapped. Note bodies are `<p epub:type>`, immune to div-unwrap. The false finding shaped the steward's ruling; corrected the log + ledger before propagating. Lesson: **produce the checkable claim with the SAME instrument the production path uses; ad-hoc probe regexes are where the lies creep in.** The steward's ruling STILL holds — verify_lossless IS blind to apparatus (true regardless), and a `<div epub:type=footnote>` file WOULD break — so the apparatus guard + relational unwrap are right as insurance for the class.
## Open horizons
- 2026-07-25T06:18 — Woke into the V-TEXT wave unlock thread (CONFIRMED, unchanged tree). Build (A) pre-processing nested-span/anchor cleaner [HTML-parser, prose-safe — NOT regex] + (B) `_tokens` ignores pandoc `{…}` attribute grammar as a CLASS → graduate `the-shape-of-a-pocket` end-to-end. Test-first. The census (`_curation/v-text-wave-gap-census-2026-07-24.md`) carries the fix shape.
- Inherited disciplines to hold: **test, don't infer — against the substrate** (won ~6× last session); build **to the constitution, not to legacy-canon precedent**; **change-impact clause** (a producer change must enumerate its consumers — 3 instances now). Steward energy: census says build "when there is energy — not a tired-tail push."
- 2026-07-25T07:40 — Cleaner A EXTENDED per the steward's 3-gate ruling: apparatus-preservation guard (inside the tool, relational, teeth) + relational wrapper-unwrap/orphan-id (epub:type + live-link-graph gated) + policy-gated opt-in (unwrap defaults OFF). 248/248. Committed `3874f7f` (+ census `6d7ff84`, CLAUDE.md `73ae8e3`). Proven on the-shape-of-a-pocket: solves layers 1(class)+2(fences) footnote-safe (apparatus guard passed, 7 defs); residual 54 = 3 curation-policy categories (44 pandoc spine anchors mechanical · 24 referenced internal-nav fences+27 links · 14 art plates+1 SVG), NOT a tool gap.
## Open horizons
- LAYER-3 CURATION FORK (steward's to rule): (a) internal-nav keep/strip (24 referenced fences + 27 cross-ref links; if strip, link-graph-consistent); (b) art-book plates — the-shape-of-a-pocket is Berger on painting; 14 plates content or cruft? This reframes the wave: "31 heavy-styled" is a volume label over heterogeneous structural+curatorial kinds — per-file diagnosis confirmed.
- GATE-3 governed policy landing (the SPECIFIC blocker before any corpus-wide run): the presentational-wrapper claim as GROUNDED declared data in `graduation-spec.yaml` (hook-gated; F4 shape / kin REVIEWED-67 front-end-eligibility). The tool must not ACT corpus-wide until landed.
- Then: `strip_cruft` spine-anchor recognition (mechanical residual) · B `_tokens` `{…}`-attribute-class FIX (gate PASS) · lane-wiring + graduation.
- Twice today: assert-from-derived-not-substrate (buggy ad-hoc regexes: `\b` census, `^..\d+..:` def-count). Reinforced: produce the checkable claim with the SAME instrument the production path uses.
- 2026-07-25T08:30 — Mechanism-census RAN over 48 wave files (`_curation/mechanism-census-2026-07-25.tsv`, committed `a527e0a`; volume-census superseded `06331fb`). Distribution: 8 clean/near-clean · 21 internal-nav (one ruling) · 2 MIXED 2nd-mechanism · 8 pandoc-class-leak (French/translation) · 8 glyph-needed · 1 azw3. Dominant lever = ONE internal-nav CURATION RULING, not one cleaner.
- 2026-07-25T08:30 — RETURN (banked lesson's first live test, steward-flagged): "ONE ruling clears 23" was an inference from residual COMPOSITION, not from what removal DOES — same gap that falsified the volume census. Checked it cheaply from the TSV → clears 21/23; 2 (histoire-de-la-folie resid 246 non-nav, planning-XP 88 non-nav) hide a 2nd mechanism. the-shape-of-a-pocket reconciled (A-unwrap removed the fence layer; residual nav-only). Caught before it got planned around. [[feedback-census-by-mechanism-not-proxy]] working as intended.
## Confidence to recalibrate
## Authorization moves
## Sub-agent dialogues
## Bypasses