Files
dotfiles/claude/memory/session-ledger-2026-07-12.md
T

46 lines
8.0 KiB
Markdown

---
name: session-ledger-2026-07-12
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: ae9583d2-fd25-45e4-85fc-df082fe2e951
---
# Session Ledger — 2026-07-12
## Returns
- 2026-07-12T09:10 — **Return (caught before asserting):** was about to derive the A1 acceptance criterion from scratch. Read the spec first (chamber discipline: check governed doctrine before building) → the §Tiering&Fence evidence-tier table **already RATIFIES** the per-tier method: V-DSL = "re-extract + diff (deterministic)", V-TEXT = "re-convert + prose-word-guard (deterministic; source IS ground truth)", V-SCAN = "OCR-vs-scan, no ground-truth text". The steward's reference-conversion question is answered YES-it's-doctrine; the promotion criterion is `RATIFIED-SHAPE · OPERATION-BLOCKED` = exactly A1. Reframe: A1 is *operationalize a ratified criterion*, not *invent one*. Avoided re-deriving existing doctrine (the exact drift the library exists to prevent).
## Open horizons
- 2026-07-12T09:40 — **A1 feasibility PROVEN (read-only prototype `scripts/verify_body_conservation.py`).** Ratified per-tier method works: re-convert(source) + coverage-align vs candidate. **difflib→shingle-coverage pivot** (steward challenge, well-caught): difflib O(n²) timed out on jacobs @2min; swapped to O(n) hashed-k-gram coverage (in-house patterns: Instrument B fingerprint + verbatim-guard walk; NO new dep) → jacobs 6.8s, manguel 4.3s. Seed ground-truth PASSES (legit boundary trim→REVIEW, interior 120-word deletion→FLAG). All 3 real books FLAG on REAL grep-confirmed cruft (jacobs 888 calibre_link · manguel 2856 []{#…epub…htm} anchor-spans · montaigne footnote-id residue) — each a different signature, all missed by audit_cruft. **KEY IMPLICATION:** gate is MORE sensitive than audit_cruft → large fraction of existing canon will FLAG (= the tool-log's "160 hidden-residue" finding) → big blast radius → confirms PROPOSAL-class + ties A1 to reprocess track B.
- **Residual (jurist-class, unchanged):** (1) boundary drop-vs-keep identification — endnotes/bibliography (keep) sit at the same TAIL position as index (drop); the tool SURFACES trailing runs as REVIEW, does not auto-pass. (2) interior-run threshold calibration (k=8, thr=50 tolerates heading-reformatting deltas of 6-7 words; caught on jacobs ToC). (3) added-direction needs symmetric link/anchor canonicalization so a clean-but-differently-converted candidate isn't confounded (minor tokenizer hardening).
- (superseded) earlier 08:55 A1 horizon — now concrete above. (general `body_word_conservation` verbatim gate), the open-work register's keystone. Criterion-first, not code-first. Weigh the reference-conversion framing (candidate vs plain-pandoc-of-source) before building.
- Closeable-today small items: wire mandatory-at-graduation for the footnote verify (jurist Q1b — flow must not pass `--no-verify`); register hygiene (stale "jurist nod owed" line — Q1a gave it).
- Steward-owed (parallel, not mine): place REVIEWED-55 (verified absent — REVIEWED.md stops at 54); decide the recognizer-maturity question (register A2 `[?]`).
## Confidence to recalibrate
- Carry from last session: drift-pattern **lost-the-forest-for-the-trees** in long execution arcs. Antidote = hold the open-work register (`chamber-library/docs/chamber-program-open-work.md`) as the standing forest view; stay keystone-first. Do not descend into A1 mechanism before the criterion is settled.
- Carry: **don't rank a sequence that ignores a dependency the census already flagged** (07-12 recommended frontmatter-before-reconversion; corrected).
## Tooling-scan reframe (2026-07-12, steward-driven — the pivot of the session)
- Steward challenged the whole approach TWICE ("is difflib best now scope is wider?" → "no extant epub/TEI tools?"). **Load-bearing finding:** the substrate answer was ALREADY in our register (`studium-engine-scan-register.md`, 2026-05-27 pass: Docling+Surya, OCR4all, TEI/IIIF/DTS, §10.3 MD-vs-TEI pending) — and in ~6 weeks since we hand-built ~20 bespoke conversion/verify tools instead. The two-week "every breakthrough → new obstacle" feeling = signature of reimplementing a solved domain. Kin to [[feedback-resurface-banked-notes-before-rederiving]] at pipeline scale.
- **The clean split:** substrate (conversion Docling/GROBID · format TEI · citation DTS) = SOLVED/adoptable; composition (integrity-bound voice-attributed verbatim consultation = the engine) = does not exist, stays ours. Adopt substrate, spend effort on differentiator.
- **Verified from source:** Docling (MIT, local/air-gapped, EPUB+PDF+images, per-element provenance, label taxonomy incl. footnote/page_header/section_header/caption — the semantic layer MD lacks; exports MD/JSON not TEI). GROBID (PDF→TEI, 68 labels incl. footnotes/bibliography = A5). DTS (citable canonical-passage API, engine is natural consumer). Loeb is a `.dsl` file (already structured) → NOT a docling case (steward correction).
- **Register updated** with the 2026-07-12 verified-from-source pass + the reframe.
## Two decisions surfaced (I decide neither)
- **(A) Docling bounded trial — IN PROGRESS** (steward said Proceed). Local isolated venv (py3.13; CapableHands is py3.9.6, too old); harness `scratchpad/docling_trial.py`; sample montaigne.epub + jacobs.epub + infinity-of-lists-eco.pdf (text) + mal-darchive.pdf (scanned = A3/OCR test). Tests: does docling emit clean, semantically-labelled, provenanced output where our pipeline leaves cruft (jacobs 888 calibre_link · manguel 2856 []{#…})? Incumbent-bias: our pipeline IS the incumbent → steward judges.
- **(B) ESCALATE — §10.3 canonical-format decision** (MD+sidecar vs TEI), pending since seed brief. Docling structured-JSON = middle path; A informs B; B is steward+jurist (touches engine consumer contract §X + whole corpus).
## Authorization moves
- 2026-07-12 — **CANONICAL FORMAT DECIDED (steward, on the trial evidence, via AskUserQuestion): Option A — MD-canonical + TEI-mirroring `.meta.json` structural sidecar; + Adopt Docling** as the EPUB/PDF/scan conversion front-end (production OCR on CapableHands M4). Brief written (`chamber-library/docs/canonical-format-decision-FOR-JURIST-2026-07-12.md`), stamped with the decision, **delivered to steward + relayed to jurist for ratification**. **PENDING-56 filed** (dotfiles). REVIEWED-56 to follow after jurist ratification. Flip-condition the jurist tests: does v1 need structured apparatus (A5)-as-data or DTS-interop? (read: no.)
- Docling installed + trialed on M4 (py3.12 venv) + M1 (fallback). Both remotes clean.
- **JURIST RATIFIED PENDING-56 (2026-07-12)** — Option A + D1, independently-verified (flip-condition tested, not triggered). **Two schema-gating Qs CLOSED with substrate evidence (brief §8):** Q1 recognizer-arc REPOSITIONED not retired (Docling emits flat `[*](#…)` not native `[^N]`; epub_backend ignores epub:type) → it becomes the sidecar note-extraction layer, verify stays. Q2 Loeb DSL is TYPED (`[c dimgray]`/`[c darkmagenta]`/`[sup]`, 2.15M+ spans) & current extractor FLATTENS → **CARDINAL PRINCIPLE: extractor PRESERVES source typing into typed sidecar fields, never flatten** (→ TEI-migration mechanical-by-construction). Schema now unblocked. REVIEWED-56 can be placed.
- **Owed / next (execution, mostly post-ratification):** build the `.meta.json` sidecar extractor (TEI-mirroring vocab; EPUB metadata + Docling PDF labels; READ-ONLY, safe to prototype pre-ratification); wire Docling into the graduation pipeline (spec amendment — waits for ratification); retire ocrmac_pdf + EPUB cruft-strippers; reshape reprocess track B (Docling→sidecar→verify→graduate); Loeb B2 DSL→MD+sidecar. Parallel: steward still owes REVIEWED-55 placement.
- A1 build will land as a **PROPOSAL** (changes graduation acceptance for ALL conversions — governed). Mechanism is refusal-only (Q1a FIX-test), but the *criterion* is what the jurist rules on. Surface, don't cross unilaterally.
## Sub-agent dialogues
## Bypasses