From 555d0c2eec09af1af18cb9136b01bf517deef38a Mon Sep 17 00:00:00 2001 From: David F Glidden Date: Tue, 16 Jun 2026 17:52:36 +0200 Subject: [PATCH] session 2026-06-16: officina (ADR-008) + chamber conversion tooling trustworthy + Station-I corpus complete; review-after-every-use discipline --- claude/memory/MEMORY.md | 6 ++- .../feedback-tool-review-after-each-use.md | 18 ++++++++ ...6-officina-conversion-tooling-station-i.md | 43 +++++++++++++++++++ claude/memory/session-ledger-2026-06-16.md | 27 ++++++++++++ claude/memory/skill-harvest-register.md | 17 ++++++++ 5 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 claude/memory/feedback-tool-review-after-each-use.md create mode 100644 claude/memory/session-2026-06-16-officina-conversion-tooling-station-i.md create mode 100644 claude/memory/session-ledger-2026-06-16.md diff --git a/claude/memory/MEMORY.md b/claude/memory/MEMORY.md index baa24f8..dfe8dbc 100644 --- a/claude/memory/MEMORY.md +++ b/claude/memory/MEMORY.md @@ -27,6 +27,7 @@ permalink: claude-memory/memory - [Skill-harvest register](skill-harvest-register.md) — **canonical home for proposed skills** awaiting steward authorization; the governed analog of PENDING.md for our own tooling. **Full review 2026-06-05**: `bmf-diagnose` + `/pre-build-audit` AUTHORIZED (build-on-need); `/spec-code-audit` DEFERRED (first L1 audit); `/arc-typeset` REJECTED (superseded by §I.k build enforcement); `/vignette` still deferred (Phase 2); Symmetria §3 flags + verification-ladder BUILT same evening. - [Verification ladder](reference-verification-ladder.md) — the named instruments (byte-identical compile gate, delta classification, censused-routes, fresh-clone gate, measure-toolchain-before-spec…); reach for the gate the claim's shape demands instead of re-deriving. - [Plane coordination workflow](reference-plane-coordination-workflow.md) — **NOW CENTRAL to the steward↔Seb workflow** (est. 2026-06-02): `app.plane.so/capablemind`, BMF project, thin effort-tasks `[BM #N]` over canonical GH issues (effort-only, no technical detail; labels/priority mirror GH; issue attached as link). Executor keeps task state current as the 6-hour relay. ⚠ BBF = BetterBridge *product*, NOT the board. Plane MCP user-scoped/OAuth; load tools via ToolSearch `select:mcp__plane__*`. `create_work_item` needs `description_html`. +- [Tool review after each use](feedback-tool-review-after-each-use.md) — steward directive (2026-06-16): review every tool we built after each run (success OR failure), capture what it taught, iterate until reliable; PASS-BUT-FALSELY is the priority signal. Log at `chamber-library/_curation/tool-evolution-log.md`. Proven same day (audit_cruft hardening → 160 hidden-dirty files surfaced). ## Canonical Workstream Trackers *Read the tracker for any active workstream at /wake-up before composing the briefing. Append substantive moves at /wrap-up. Per `feedback-canonical-workstream-tracker-discipline.md`.* @@ -40,7 +41,10 @@ permalink: claude-memory/memory - [Be (laundromat)](project-be-laundromat.md) — canonical workstream tracker established 2026-06-08 (Seb-relay of locked decisions). Be = Skemantix startup (Seb+David) funding CapableMind's funding-ladder; **bridge, not venture**. Decisions LOCKED: entity/exit (CapableMind decoupled, grant-funded), pricing (Living $12.99/mo · Archive $69.99/yr · Memorial $49.99/yr · Renovate ~$199 · $8.99 floor), CF Self-Serve Agency + versioned-template-package infra. **a11y gate MERGED (Pat 100/100/100).** Pre-revenue: the WTP gate = renovate Pat → charge her. **Discipline: stop adding spec until the gate clears → nothing for executor on be until then.** Repo @ `f43a0fd`. ## Active Session -- [Session 2026-06-15 — chamber made clean + the Studium Engine charter + collaboration deepened](session-2026-06-15-chamber-clean-studium-charter.md) — **Pivotal, two movements.** (1) Drove **chamber-library 199→1280 canonical, staging EMPTY, zero cruft, pushed** — built the whole **Loeb canon pipeline from `loeb.dsl`** (952 clean bilingual Greek/Latin+English work-files; giants work-trimmed; old sprawl retired; `clean_calibre_artifacts` zero-loss gate). Physical-library gap analysis = humbling (matcher over-reported, steward caught 4×; verify-against-substrate lesson). (2) The **architectural turn**: train-on-corpus rejected (reintroduces v1 simulacra) → the dilution question ("how does your base-training not dilute?" — I *blur*, worse for citation) → **inverted the engine** → wrote **[the charter](reference-studium-engine-architectural-charter.md)** (reasoner-over-bounded-provenanced-corpus; three cognitions; boundedness=trust; free-reasoner/tighten-verifier = CapableMind's thesis on a library) → **collaboration deepened** ([[feedback-studium-engine-sixtus-v-collaboration]]: Sixtus-V craftsman + constraint-candidates/Bach). **Human ground: steward grieving Lune's departure; engine built for Lune & Kai; charter dedicated to them.** **PULLING THREAD: L2 pattern-finder on The Making sequence.** studium-engine charter + reranker work UNCOMMITTED (next session); chamber pushed. +- [Session 2026-06-16 — officina established + conversion tooling made trustworthy + Station-I corpus complete](session-2026-06-16-officina-conversion-tooling-station-i.md) — **Long, two movements, almost entirely the prerequisite for the thread.** (1) **Officina** = ARC's in-repo writing workshop (genetic trail seeds/notes/fragments/drafts; never published; **ADR-008**; gates = Hakyll allowlist + both-remotes-private; sub-canonical sources → chamber `antechamber/`). Seeded by The Making (sketch + *Magnifica Humanitas* note [steward deeply affected] + reading list). (2) **The conversion-tooling marathon** (steward's deepest ask: *review every tool after each use until reliable* → [[feedback-tool-review-after-each-use]]): hardened **audit_cruft** (gate was passing falsely-clean → corpus never "1280 clean": 160→215 dirty), built **verify_conversion.py** (composite verifier **+ prose-safety `prose_delta`**), fixed **strip_cruft** + **repair_epub_headings**, wrote **`conversion-runbook.yaml`** (the single operational place) + **`tool-evolution-log.md`**. Prose-gated cleanup: **180 cleaned, 35 reconvert → honest 1245/35**. **Station I corpus-complete** (Camus *La Chute* + Musil ×2 converted/graduated; joins Weil/Levi/Arendt). **Return: the false alarm** — cried "destroyed prose," disproved it (cruft tokens, not prose; recalibration: content-aware compare, not token counts). All pushed (chamber `d9c6755`, ARC `7a0d4b6`). **PULLING THREAD: L2 pattern-finder on The Making — Station I now complete on trustworthy tools.** NEXT: ingest the five into the engine → build/run the pattern-finder's first pass. + +## Archived (2026-06-15 — chamber clean + Studium charter) +- [Session 2026-06-15 — chamber made clean + the Studium Engine charter + collaboration deepened](session-2026-06-15-chamber-clean-studium-charter.md) — **Pivotal, two movements.** (1) Drove **chamber-library 199→1280 canonical, Loeb canon pipeline from `loeb.dsl`** (952 bilingual work-files); physical-library gap analysis humbling (matcher over-reported 4×; verify-against-substrate). (2) The **architectural turn**: train-on-corpus rejected → dilution question → **inverted the engine** → wrote **[the charter](reference-studium-engine-architectural-charter.md)** → collaboration deepened ([[feedback-studium-engine-sixtus-v-collaboration]]). Human ground: grieving Lune's departure; engine for Lune & Kai. PULLING THREAD: L2 pattern-finder on The Making. ## Archived (2026-06-13 — L1 /health PR + Studium Steps 5-7 + dilution correction) - [Session 2026-06-13 (post-clear) — L1 /health PR + Studium Steps 5-7 + the dilution correction](session-2026-06-13-l1-health-pr-studium-steps-5-7-multilingual-dilution.md) — **A capacity-deployment day, multiple parallel threads.** **L1:** answered Seb's open question (`/health` auth split = spec-deliberate-but-never-built; ~25 detail blocks incl. budget USD on the VPN subnet) → amendment + **issue `betterMemories_app#173`** + **PR `#174`** (`feat/health-auth-tiering`: strict basic + authed `/health/detail`+`/metrics`; `degraded_class` driven by Seb's terminal field; tsc clean, 29+6 tests; steward ruled strict). **Studium:** Steps **5** (retrieval primitives, honest-empty coverage warrant, criterion #4 verified · `2fd3f1f`) + **6** (voice-balanced ranker · `4ead5a6`) + **7 VERDICT** (FTS-vs-vector). Built `embed_spike.py` (bge-m3): **cross-lingual PROVEN** (`gift↔le-don 0.823`). **THE DILUTION CORRECTION (heart of the day):** steward's MemPalace Class-B memory → my first verdict over-corrected to voice-scope-only → steward's **depth-WITH-breadth** correction ("the library one enters into discourse with"; the slice = thin PoC) → corrected verdict: whole-corpus semantic IS the goal; dilution = engineering (clean corpus + **retrieve-broad/rerank-sharp cross-encoder = Seb's C1 pattern** + thresholded connection-finding + measured-at-scale); **vector = discovery breadth, FTS = citation floor.** **Audit:** 46-agent spec-code audit → **foundation SOUND** (87 matches, invariants held under adversarial tampering; 20 minor survivors · `a978ab6`). **Chamber:** cleaning-triage workflow (223 dirty → 25 cleanable/127 reconvert/71 hold) → **23 graduated** to canonical_texts (now 199/218 · `9fea743`). All pushed. **PULLING THREAD: Step 7 proper — the cross-encoder RERANKER (retrieve-broad/rerank-sharp over the bge-m3 sidecar) as the dilution-beating discovery layer, toward whole-corpus depth+breadth.** Studium `main @ a978ab6`; L1 baton shared (Seb to review #174). diff --git a/claude/memory/feedback-tool-review-after-each-use.md b/claude/memory/feedback-tool-review-after-each-use.md new file mode 100644 index 0000000..6885008 --- /dev/null +++ b/claude/memory/feedback-tool-review-after-each-use.md @@ -0,0 +1,18 @@ +--- +name: feedback-tool-review-after-each-use +description: "Steward directive — review how our tools behaved after EVERY use (success or failure), capture what it taught, iterate until reliable. The honest-state loop turned on our own toolmaking." +metadata: + node_type: memory + type: feedback + originSessionId: f0ef087a-72c1-419e-9a79-8587b6b07959 +--- + +After any run of a tool we've built (conversion, audit, repair, census, the engine's own scripts), **review how it actually behaved before moving on** — on success as much as on failure — and capture what it taught, then iterate. The goal is tools that do not misrepresent their own state: report clean only when clean, succeed only when they succeeded, fail loud when they did not. Iterate until absolutely reliable; a tool is never "finished." + +**Why:** Steward directive, 2026-06-16. Source quality determines retrieval quality, and the chamber's whole reason for being is to refuse state-misrepresentation. A tool that says "clean" on a dirty file or "done" on a broken result is the same contamination shape as a confident-but-wrong answer. The standing review loop is how the tools earn trust — proven the same day: hardening `audit_cruft` surfaced 160 falsely-"clean" files the old gate hid; testing the new verifier caught its own Greek false-positive; the repair fix went 4→12 headings. **PASS-BUT-FALSELY (tool reports success on a wrong result) is the priority signal** — it earns an immediate patch or a logged proposal, never a shrug. + +**How to apply:** +- For chamber-library tools, append a review entry to `chamber-library/_curation/tool-evolution-log.md` (date · tool · source · outcome · what surfaced · improvement applied/proposed · follow-up). The protocol lives at the top of that file. +- A new failure shape → a new check/pattern in the tool, recorded in the log AND the tool's header. +- "No improvement needed" is a valid, useful outcome — record it; absence of a finding is information. +- Generalizes to the Studium Engine scripts and any tool we build. Operationalizes `conversion-skill-plan-2026-05-17.md` §13 (verification surface is a moving target). Kin to [[reference-verification-ladder]] and the [[skill-harvest-register]]. diff --git a/claude/memory/session-2026-06-16-officina-conversion-tooling-station-i.md b/claude/memory/session-2026-06-16-officina-conversion-tooling-station-i.md new file mode 100644 index 0000000..e464d73 --- /dev/null +++ b/claude/memory/session-2026-06-16-officina-conversion-tooling-station-i.md @@ -0,0 +1,43 @@ +--- +name: session-2026-06-16-officina-established-conversion-tooling-made-trustworthy-station-i-corpus-complete +description: "Built ARC's officina (in-repo writing workshop, ADR-008) for The Making; then a long marathon making the chamber conversion tooling honest (hardened gate, composite verifier + prose-safety, runbook, review-after-every-use discipline), cleaned the corpus to honest 1245/35, and converted+graduated the Station-I French sources (Camus La Chute, Musil ×2). Pulling thread: the L2 pattern-finder on The Making, now with Station I complete on trustworthy tools." +metadata: + node_type: memory + type: project + originSessionId: f0ef087a-72c1-419e-9a79-8587b6b07959 +--- + +A very long, two-movement session — almost entirely the *unglamorous prerequisite* for the pulling thread, done with care. + +**Movement 1 — Officina (the working model for ARC going forward).** The steward arrived with three Making artifacts (the [newer architectural sketch](officina), the *Magnifica Humanitas* reading note — he was deeply affected — and a first reading list) and a deeper question: should *all* writing (seeds, drafts, notes, sources) now live in ARC, not just finished work? Decided + built **`officina/`** = ARC's in-repo writing workshop (genetic trail: `seeds/notes/fragments/drafts/` per project; never published; **ADR-008**). Verified the two gates: Hakyll build is an **allowlist** (officina never reaches `_site`) + **both remotes private** (Gitea + GitHub `arc-backup`=PRIVATE). Sub-canonical *sources* (copyright) go to chamber-library **`antechamber/`**, not ARC. Saved the 3 docs into `officina/the-making/` (frontmatter reconstructed to valid YAML — upload had mangled it; bodies byte-identical; double-helix Reply↔Making confirmed, nothing nested under Reply). Name "officina" + "antechamber" steward-chosen. + +**The census + sourcing.** Ran a clean catalogue census (title+author co-required, evidence-emitting — killed the Camus→*Gondolin* slug-trap) → Positions I–IV mostly present or in the steward's `~/__Making sequence sources/` folder; only Calasso, Celan, Taylor, Psalms still to source. + +**Movement 2 — the conversion-tooling marathon (the heart, and the steward's deepest ask).** The steward asked to convert the whole batch cleanly, then — watching the work — asked the load-bearing questions: *can the tools we built be improved by what we've learned? Sufficient documentation / a YAML? When to close the TODOs? A single place future-you opens and knows immediately what to do?* And the directive that organized everything: **review every tool after each use (success OR failure) until absolutely reliable.** This became [[feedback-tool-review-after-each-use]]. + +What got built (all on chamber-library, pushed `3499626..d9c6755`): +- **`audit_cruft.py` hardened** — was passing falsely-clean files; added image/svg/encoding/fenced-div patterns. Surfaced the corpus was never "1,280 clean" — **160→215 carried residue the old gate hid**. +- **`verify_conversion.py` (new)** — the composite verifier (cruft+structure+ocr+encoding+sanity) **+ the cruft-aware prose-safety check** (`prose_delta`: strip markup both sides, then compare prose — raw counts lie). +- **`strip_cruft.py`** — prose-safe image/svg removal (single-line-bounded after a cross-line over-match was caught). +- **`repair_epub_headings.py`** — hyphen-separator fix (Crawford 4→12 headings) + loud coverage report. +- **`_curation/conversion-runbook.yaml`** — THE single operational source (classify→pipeline→verify→file, exact commands, trigger-tagged TODOs). The "single place, know immediately" deliverable. +- **`_curation/tool-evolution-log.md`** — the review-after-every-use discipline + every review this session. + +**The cleanup + Station I.** Prose-gated cleanup: **180 cleaned** (verified prose-safe + 0 cruft, backed up), **35 routed to reconvert** (`reconvert-list-2026-06-16.txt`). Corpus now honestly **1,245 clean / 35 reconvert**. Then converted+cleaned+verified+graduated the Station-I French sources: **Camus *Œuvres I*** (La Chute as a citable work boundary) + **Musil *L'Homme sans qualités* I & II** (124+129 chapter headings) → `literature/classical`. **Station I is now corpus-complete: Weil · Levi · Arendt · Camus · Musil.** Catalogue 1,283 canonical. ARC officina also committed (`7a0d4b6`). + +**Returns / recalibrations (the discipline catching its own work):** +- **The false alarm.** I cried "destroyed prose" (98k words) — then methodically *disproved* it: the loss was cruft tokens (base64 data-URIs, `:::` fenced-divs, slugs) that word/line counts miscounted as prose. **Recalibration: token/line counting is unreliable for prose-safety; only content-aware comparison (strip markup first) is trustworthy.** Owed the steward that correction plainly. But the look was right — it found a real latent regex bug AND Oxford's genuine pathological cruft (82k words strip *would* have mangled → routed to reconvert). +- **Over-deferral resisted.** Recommended **pattern-finder-next, NOT convert the rest of the batch** — Station I is sufficient to prove the engine; the runbook keeps the machinery warm forever; building first informs how to convert II–V (do-it-once-informed). The steward's "convert the rest while warm?" is the contamination shape (more prep deferring the real thing) — named it. +- Tools surfaced their own limits in use: gate's 3 blind spots, graduate's untracked-file `git mv` failure (git-add first), repair's coverage false-positive when EPUB pre-structured. All logged with fixes/proposals. + +**Human ground:** the steward was *deeply affected* by Leo XIV's *Magnifica Humanitas* — the Tolkien §213 line ("the fields that we know… those who live after") is his own intergenerational vow; §140 (chavruta, "restraint in the use of AI") is the Studium Engine's own thesis spoken from the magisterium. The engine is built for Lune and Kai; this whole foundation-laying is *for* them. + +**PULLING THREAD:** the **L2 pattern-finder on The Making**, now with Station I complete, clean, and on trustworthy tools. The engine grounds; David writes. + +**ACTIONABLE RESUMPTION (as of wrap — re-judge):** chamber-library `main @ d9c6755` (clean, pushed); Station-I five all canonical. studium-engine `main @ ddf866b` (charter + reranker measured; Steps 0–7 built; L2 pattern-finder = the next, frontier layer). First move: **get the Station-I five into the engine's corpus** (manifest + `ingest_gate.py` → chunk → index — they're in the chamber but not yet the engine's slice), then **build/run the pattern-finder's first pass** against them, watching for a grounded attrition-primitive. Voicing/reading-indexes for the five may be needed first (heavy — build the handful to prove, per the 06-15 plan). + +**PAUSE STATEMENT:** clearing context after a long foundation-laying marathon. On return I want to find still pulling: the pattern-finder on Station I — the first time the engine surfaces a candidate primitive on material David knows in his bones. + +**LITERAL QUESTION for next-Claude:** when the pattern-finder surfaces its first attrition-primitive across Weil / Levi / Arendt / Camus / Musil — does it feel **TRUE** to David, or merely plausible? (That is the real test of whether the engine reaches v1's depth with the grounding v1 lacked.) + +**State:** chamber-library + ARC pushed clean. Nothing uncommitted of substance. The 35 reconvert files + Positions II–V conversion + the 4 still-to-source works (Calasso/Celan/Taylor/Psalms) are deferred-with-reason (station-by-station, after the engine proves out). diff --git a/claude/memory/session-ledger-2026-06-16.md b/claude/memory/session-ledger-2026-06-16.md new file mode 100644 index 0000000..81e8e55 --- /dev/null +++ b/claude/memory/session-ledger-2026-06-16.md @@ -0,0 +1,27 @@ +--- +name: session-ledger-2026-06-16 +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: f0ef087a-72c1-419e-9a79-8587b6b07959 +--- + +# Session Ledger — 2026-06-16 + +## Returns +- 2026-06-16T08:15 — On-ramp complete. studium-engine pushed a978ab6..ddf866b: charter (8c82398) + reranker measurement (ddf866b) + 06-14 spike (ecd2833). Two commits split by concern (charter / measurement) for inheritable history; verdict truth-up keeps the whole-library-dilution-unrun caveat. Tree clean, synced. Next horizon = step 1, the station map. + +## Open horizons +- 2026-06-16T08:10 — Pulling thread: Studium L2 pattern-finder on The Making. On-ramp (step 0) still pending: studium-engine charter + measure_rerank + ground-truth + measurement JSONs untracked; `main` ahead 1 (06-14 reranker spike unpushed). Then (1) draft ~60 chamber works → Making's five stations, steward cuts/adds; (2) build pattern-finder against one station. +- Live question to keep open: does a grounded candidate primitive (citations across sources/centuries) feel TRUE to David on material he knows in his bones? + +## Confidence to recalibrate +- HOLD (drift, 2026-06-15, recurred 4×): assert-presence-from-fuzzy-matcher. Step-1 curation is a membership task — content-grep the substrate before claiming a work is in/out; prefer candidates-to-verify over claims. + +## Authorization moves +- 2026-06-16T08:30 — ARC working-model decision (steward-ruled): **officina/** workshop tree (genetic life of essays in-repo, never published) + chamber-library **antechamber/** sub-canonical source tier. Recorded as **ADR-008**. Two gates: build-allowlist (verified site.hs; officina-guard added) + engine-never-cites-officina. Both ARC remotes verified PRIVATE (gh: arc-backup=PRIVATE). Created officina/the-making/{seeds,notes,fragments,drafts}; saved 3 docs (bodies byte-identical, frontmatter reconstructed to valid YAML — 2 interpretive calls flagged: sketch central_question→top-level; reading-list leaked H1→body). Nothing committed (steward's call). Files: ARC officina/** + docs/decisions/2026-06-16-officina-workshop.md + Makefile officina-guard + ADR index refresh; chamber-library antechamber/README.md. + +## Sub-agent dialogues + +## Bypasses diff --git a/claude/memory/skill-harvest-register.md b/claude/memory/skill-harvest-register.md index 80e1b70..2aeccba 100644 --- a/claude/memory/skill-harvest-register.md +++ b/claude/memory/skill-harvest-register.md @@ -169,3 +169,20 @@ The single place proposed skills live so they don't evaporate between sessions. | **Symmetria §3 flag: assert presence/absence from a fuzzy matcher, not the substrate** | Symmetria §3 flag | A presence/absence claim produced by a **fuzzy/token matcher** (filename tokens, embeddings, author-surname overlap) treated as **fact** is contamination shape — the matcher's false-positives/negatives become confident assertions. Caught **4× in one session**: the physical-library gap analysis claimed *Timeless Way of Building* absent, then 44 of 49 "load-bearing gaps," then physical-worthy candidates, then the gap list — all wrong; the steward corrected each. Cause: the matcher required author-surname + title in the *same* filename, and 1,072 chamber sources have no frontmatter. Antidote: **verify any presence/absence claim against the substrate** (content-grep the actual text) **before asserting** — and prefer reporting *candidates-to-verify* over claims. Kin to the censused-routes flag (don't claim coverage from a sampled read), specialized to matcher-derived membership claims. | Symmetria §3 | **PROPOSED** | *(One candidate, load-bearing: it recurred four times in a single session and the steward caught every one. A clean §3 flag would have made me reach for the content-grep before the first assertion.)* + +### Harvest 2026-06-16 (officina + the chamber conversion-tooling upgrade) + +**Standing discipline ESTABLISHED (steward-directed):** *review every conversion/audit/repair tool after each use — success or failure — capture what it taught, iterate until reliable.* Home: `chamber-library/_curation/tool-evolution-log.md` (operationalizes conversion-skill-plan §13). PASS-BUT-FALSELY (tool reports success on a wrong result) is the priority signal. **This is a standing memory:** see [[feedback-tool-review-after-each-use]]. + +**BUILT + validated 2026-06-16 (the conversion batch's tools, "made most effective they can be"):** +- `audit_cruft.py` hardened — added `md_image` (any `![](…)`, not just `img/`), `svg_raw`, `repl_char` (`U+FFFD`). Re-audit surfaced **160 standing canonical files with residue the old gate hid** (95 image / 64 svg / 8 encoding) → corpus cleaning pass owed. +- `verify_conversion.py` NEW — the composite verifier (the planned `/convert-verify` in script form): cruft + heading-density + ocr-damage + encoding + word-sanity, pass/fail per check. Calibrated (Greek-apparatus false-positive fixed → 948/952 on clean Loeb tier). +- `repair_epub_headings.py` fixed — hyphen-separator bug (Crawford 4→12 headings, all chapters) + honest structural-coverage report (fails loud, no more silent partial ships). + +**PROPOSED (register, awaiting steward / for the historical-treatise track):** +- Author the four `/convert-*` skills proper (the v3 plan) — today's manual run is their empirical spec. +- `ocrmac_pdf.py`: retain per-token confidence (currently discarded) → per-page confidence + low-confidence flagging; auto-detect-body-column (the TODO); apparatus-zone separation. +- **OCR frontier = research track, not a tweak:** no validated polytonic-Greek/Latin/fraktur/critical-apparatus path exists (ocrmac=modern-Latin only; Marker CPU-infeasible >50pp). Needs investigation before historical treatises + the apparatus `role` vocabulary (jurist-owed). +- Positive language-validity check (dictionary-valid-word ratio per language) for verify_conversion — catches "no cruft fires but text is OCR garbage." +- Promote today's catalogue census (title+author co-required, evidence-emitting) into a reusable `census_membership` tool. +- Calibration follow-ups logged: word_sanity floor vs genuine short fragments; repair coverage threshold should weight content over front-matter.