--- name: session-ledger-2026-07-13 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: 734c43aa-f3a0-4cd1-a39d-27146420ee4a --- # Session Ledger — 2026-07-13 ## Returns - 2026-07-13T08:1x — RETURN on the wrap's stated integration point. The wrap said "wire verify_body_conservation into verify_graduation.py's collect_checks." Verified against substrate: WRONG LAYER. `collect_checks(fm,body,spec)` is documented pure + consumed corpus-wide by audit_corpus.py:154 (over rglob every canonical .md); embedding an expensive source re-convert there breaks purity + explodes the corpus-map cost. The spec ALREADY models `body_word_conservation` as its OWN gate (graduation-spec.yaml:136, distinct from verify_graduation.py:135). Correct integration = a NEW gate step in graduate_to_canonical.py, at the source-in-hand layer (with/after source_gate), NOT collect_checks. Answers the literal question. - Literal-question ANSWER (substrate-verified): source IS reachable at gate-time — NOT from frontmatter `source:` (prose/bare-filename, e.g. Levi "olmOCR of Vintage International…"), but via gate zero's existing resolution: canonical_slug → Chamber Sources manifest (324 entries, each carries `archived_file`) or resolve_pending_source(slug) for a just-staged source. Source-access needs NO greenfield design — just a path-returning resolver sibling to manifest_has (which returns bool only). Tier derivable from archived extension (.epub→V-TEXT / .pdf→V-SCAN-abstain / Loeb DSL→V-DSL, forward-only: 0 Loeb canon graduated yet). ## Open horizons - 2026-07-13T15:53 — WAKE (20-min brief-pause, post-keystone-landed). Thread Confirmed: the B2 corpus reprocess the map now sizes. First station = the 2b sidecar-wiring graduation amendment, gated on the steward's Loeb-first-vs-full-corpus scoping call. Concentrated candidate bite = the 18 BODY-DEFICIT books (the wrap's literal question: same apparatus story as the 126, or genuinely different?). Nothing moved externally (chamber @ 9afb0cf, dotfiles clean). Doc-drift to fix: PENDING-57 block still reads "awaiting jurist" though REVIEWED-57 authorized → mark CLOSED. Steward pref active: shorter, very concentrated. - 2026-07-13T15:5x — RETURN (steward-caught): my wake briefing said "REVIEWED-55 placement still owed" — FALSE. Verified against substrate: REVIEWED-55 IS placed (~/REVIEWED.md:490, dated 2026-07-12, AUTHORIZED, full dispositions). Inherited a stale "owed" from this ledger's Authorization-moves shorthand and relayed it uncheck­ed = `inherited-marker-read-as-current-state`. Nothing owed on -55. Antidote reaffirmed: verify a governance item's state against REVIEWED/PENDING before relaying. - 2026-07-13 — STEWARD-FLAGGED, for step 5 (the sweep), NOT now: "cross-extractor drift-tolerance" is under-defined and doing real work in that sentence. Must be spelled out with the same rigor V-DSL's reflow-vs-loss got (the whole reason V-DSL needed rebuilding was reflow looking like loss) BEFORE the retroactive sweep runs — do not assume it from the name. Present a written definition for concurrence when step 5 comes up. - 2026-07-13 — Integration point CONCURRED (steward): body_word_conservation lands as its OWN gate step in the graduation flow (with/after source_gate, source-in-hand layer), NOT inside collect_checks. FIX-class (where the call lives, not what it decides — the gate was ratified REVIEWED-57). Reuse gate zero's canonical_slug resolution (PENDING-52 holding under a use it wasn't built for). Build order: (1) resolver → (2) source_dispatch → (3) gate step → (4) spec reflect → (5) sweep [needs the drift-tolerance definition first]. - 2026-07-13T07:56 — PULLING THREAD: land the keystone. Wire `verify_body_conservation` into `verify_graduation.py` + `graduation-spec.yaml` (per-tier dispatch V-DSL/V-TEXT/V-SCAN → FLAG/REVIEW/PASS), fold the cross-extractor drift-tolerance (retroactive probe: 7/9 PASS, 2 false-positive stopword drift), run the diagnostic sweep → corpus-health map. PENDING-57 ratified (REVIEWED-57 filed), schema LOCKED, B2 fleet-v1 built. - Literal question to answer FIRST: does the graduation candidate have its SOURCE reachable at gate-time (source_verified pin / resolvable path), or does source-access need its own small design before tier dispatch can call re-extract/re-convert? ## Confidence to recalibrate - Hold today: a check proven for ONE tier is NOT proven for another (V-DSL≠V-TEXT — the k-gram false-flagged the DSL reflow 2026-07-12). When writing tier dispatch, demonstrate each tier, don't reuse-and-assume. - Hold today: keystone-first / forest-view — don't lose altitude in the wiring engineering (2026-07-12 drift: lost-the-forest-for-the-trees in a long execution arc). ## Authorization moves - 2026-07-13 — KEYSTONE LAID (FIX-class landing of REVIEWED-57). Steps 1–4 done + verified: (1) archive_sources.resolve_archived_source (path-returning sibling to manifest_has); (2) verify_body_conservation.tier_of + verify_candidate (one-call per-tier entry; header de-staled — REVIEWED-57 has ruled); (3) graduate_to_canonical.body_conservation_gate wired after source_gate (FLAG refuses / REVIEW holds / PASS+ABSTAIN proceed); (4) doc-currency: graduation-spec.yaml gate comment + chamber CLAUDE.md gate status (not-wired → WIRED). Evidence: seed-test still discriminates (legit-trim→REVIEW, interior-del→FLAG); real-data — Camus V-TEXT PASS @100%, Levi V-SCAN ABSTAIN; fleet 111→118 (2 new tests, 7 assertions). NOT committed (awaiting steward — push boundary held per the outward-action drift-pattern). - HONEST LIMIT: no real FLAG/REVIEW case ran through the FULL graduate_to_canonical flow (the 7 inbox candidates were all pre-gated by health/conventions, so 0 reached the source-in-hand gate). The composition IS covered — seed-test proves verify_candidate's FLAG/REVIEW; the unit test proves body_conservation_gate's verdict→disposition mapping — but not a single real end-to-end FLAG-through-graduation. - STEP 5 HELD: retroactive diagnostic sweep NOT done — blocked on the cross-extractor drift-tolerance definition (steward-flagged, above). Do not run the sweep until it's defined + concurred. ## Cross-extractor drift-tolerance — DEFINED (step 2, for concurrence) - MECHANISM (not a threshold — the V-DSL-reflow parallel one level over): the retroactive sweep compares a LEGACY candidate (old extract_loeb_dsl, flattened, page-markers, dup headers) against the DSL reference (current strip_tags+_tokens). They differ by each side's KNOWN boilerplate, derived mechanically per-work: · extractor_tokens (fab-side) = fixed Loeb subtitle {loeb,classical,library,bilingual,original,english,p} ∪ work-string tokens (the `# AUTHOR, Work` header). · boilerplate_tokens (loss-side) = DSL labels {page,number,footnotes} ∪ work-string tokens (DSL per-page running header). - PROVEN on 11 real books: 10/11 → PASS with residual EXACTLY 0 both sides (drift cancels completely, incl. Homer Iliad 298k). 1/11 (Aristotle Oeconomica) → FLAG, residual 216 = REAL (candidate has 97% of DSL Greek, missing ~187 Greek tokens) — tolerance did NOT wash out real loss. - HONEST EDGE (the remaining rigor to settle before the sweep): the residual after accounting still needs a contiguity/position read to split TRUE loss (contiguous dropped run) from finer tokenization drift (scattered, esp. Greek elision/final-sigma/accent). The V-TEXT path's _uncovered_runs already does exactly this — apply it to the residual. Aristotle is the test case. - DISPOSITION for the diagnostic sweep (read-only, produces the corpus-health MAP; not a hard forward gate): residual 0 → clean · residual>0 → surface by size + contiguity note for human triage → sizes the 952-book reprocess. - Probe scripts: scratchpad probe_drift.py (raw) + probe_drift_accounted.py (mechanism). AWAITING STEWARD CONCURRENCE before building/running the 952-sweep. ## THE 18 — literal question ANSWERED by reading the missing spans (probe_18_spans.py, read-only) - METHOD: full-census script-mix of the missing multiset (greek=source-original vs latin-script=translation/apparatus) + top-3 uncovered runs read as actual text, per book. Script-mix is FULL census; the run reads are top-N sample (honest scope). - ANSWER: NO — the 18 do NOT resolve into the 126's apparatus story, and they are NOT one mechanism. They are THREE: · (D) MATCHER ERROR, not loss — 2 books: plutarch-moralia-other-fragments (true key "Other Fragments" 13891≈cand13399; matched to "...Other Named Works" 59997) + suetonius-grammarians-rhetoricians (candidate=Rhetoricians text, matched to Grammarians sibling key; fab=rhetorician/rhetor/antony). fab>0 is a reliable sub-110% wrong-match detector. SAME root cause as the 4 MATCH-SUSPECT → pull from reprocess; fix = matcher key-selection. Re-matched they likely go CLEAN. · (B) BILINGUAL SOURCE-HALF DROPPED — Greek/Latin ORIGINAL column under-captured, translation retained: aristotle-history-of-animals 89.5% (top runs all Greek source), demosthenes-42 88.8% (one Greek run), + the Greek-verse portion of the Aeschylus plays (persians/suppliants/eumenides) + sophocles-trachis. B2 preserve-the-typing recovers it. KEY: the deficit is BODY, not apparatus → does NOT go in app[]. · (C) REAL MIXED BODY LOSS — continuous TRANSLATION passages genuinely gone + source + apparatus, large magnitude: athenaeus 70.1%(199k), macrobius 67.8%(79k, an 18847-tok pure-English run missing), euripides-dramatic-fragments 81.8%, philo-special-laws 84.4%, sextus-empiricus 75.8%, longus 57.9%, catullus 57.2%, pindar-fragments 58.9%, aristophanes-attributed-fragments 82.7%, plautus-three-dollar-day 87.0%. Genuine reconversion targets; must VERIFY passages recovered, not just re-typed. - COROLLARY (the wrap's held sub-question): for the 18, DSL-full ≠ candidate-body + sidecar-app[] by multiset — the deficit is body, so app[]-population will NOT reconcile it (unlike the 126). ⇒ a clean DISCRIMINATING TEST once B2 runs: reconciles→apparatus(126); doesn't→body(18). - CONSEQUENCE for the pulling thread: the B2 reprocess is NOT one sidecar-population job. B2+sidecar solves (B)+the 126; the matcher fix solves (D); (C) needs genuine body-recovery reconversion + per-book verify. Three tracks, not one. - LANDED (steward-directed "write it"): map folded (via a wrong-match-by-fabrication rule in classify_book, m_fab>5% cand → MATCH-SUSPECT) + regenerated with BOUNDED-CHANGE PROOF (exactly plutarch+suetonius change disp; augustine/philo detail-only flag; 948/952 byte-identical; new tallies 802/126/16/6-MATCH-SUSPECT/2) + findings note `_curation/loeb-body-deficit-cause-analysis-2026-07-13.md` + tool-evolution-log entry + CLAUDE.md pointer. Fleet 119/119. Committed `eb21eca` [FIX], pushed BOTH remotes. augustine/philo surfaced-not-folded (larger fab, spans unread → flagged, held in REORDER?). Matcher key-selection fix now gates 6 MATCH-SUSPECT + 2 REORDER? leads = highest-leverage small corpus-health fix. - CLOSED the augustine/philo lead (steward-directed, same method): span-read + CHECKABLE re-match to the truer key each span pointed to. BOTH resolved to fab=0/lost=0 CLEAN against true key (augustine = PARTIAL key: candidate is full 'Confessions', matched to 'Books 1-8'; philo = WRONG sibling: true 'On Abraham', matched to 'On the Migration of Abraham'). The REORDER? displacement was a pure wrong/partial-key ARTIFACT; REORDER? has 0 genuine members on this corpus. Classifier now validates key BEFORE arrangement. Reclassified to MATCH-SUSPECT (verified, not on the number). Bounded-change proven (exactly augustine+philo change disp; 948/952 byte-identical). Tallies now 802/126/16/8-MATCH-SUSPECT/0-REORDER?. Fleet 119/119. Committed 836b665 [FIX], pushed both remotes. These 2 = cheapest map wins (re-match to named true key -> graduate CLEAN, no reconversion). Steward's context-caution earned real info: the fab signal is a reliable match-problem detector even inside a reordering context; the reorder was a symptom of the wrong key, not an independent phenomenon. ## Sub-agent dialogues ## RETURN — the verse cluster (caught by staying with the run, 25-book batch) - Built sweep_body_conservation.py (one-pass DSL index; live version-fab-cluster monitor; --validate OK). Ran 25 books: 14 CLEAN / 8 LOSS / 3 DRIFT?. STAYED WITH IT and a cluster formed: LOSS concentrated in Aeschylus verse with HUGE contiguity runs (persians 4081, suppliants 4118). - First hypothesis "verse=Greek-loss" FALSIFIED same batch: Aristophanes acharnians/birds/clouds/frogs are CLEAN at 32-36% Greek (extractor CAN capture Greek verse fully). Magnitudes variable (persians 64% / suppliants 73% / eumenides 82% Greek captured) — no clean genre split. - ROOT: the CONTIGUITY read (coverage/_uncovered_runs) is CONFOUNDED for bilingual verse by REORDERING — 50% of persians' "missing" Greek run appears elsewhere in the candidate. Coverage is blind to reordering (its own docstring caveat). My Aristotle "proof" was a clean contiguous PROSE drop — never exercised reordering. EXACTLY the steward's prediction ("_uncovered_runs hasn't been asked the verse question yet"). Proved the contiguity read on the one case that couldn't break it. - RELIABLE signal = the MULTISET residual (classify_dsl, reordering-tolerant): persians genuinely 0.70 ratio / 64% Greek by COUNT → real deficit exists, but I CANNOT cleanly attribute it (real loss vs arrangement vs apparatus-handled-differently) with current tools. - DECISION: STOPPED before the full 952 — a contiguity-based LOSS/DRIFT map would mislabel verse reordering as loss (a map that can't be trusted is worse than none — the substrate thesis). sweep tool NOT committed (classifier not corpus-ready for verse). Surfaced to steward for direction: (a) make the map's primary axis the reordering-tolerant multiset-deficit % + restrict contiguity to prose, or (b) understand the verse DSL-vs-extractor arrangement first. ## THE 952 SWEEP — ran, map produced, dominant cluster explained (staying-with-it caught it) - MAP: CLEAN 802 · DEFICIT 144 (>25%:10, 10-25%:8, 1-10%:126) · REORDER? 6 · FAB? 0 · UNMATCHED 0. TSV: scratchpad/loeb-health-map.tsv (952 rows). - Version-coverage monitor CLEAN: every residual-fab shape 1× (no vintage cluster) — the boilerplate set generalized across all 952. Steward's version-watch came up empty (good). - DOMINANT CLUSTER = the small-deficit floor: 124/144 DEFICIT books hold 93-99% (1-10% bucket), same ~2-5% contiguous shape everywhere. PINNED IT: the block is the APPARATUS CRITICUS — editor names (Detlefsen/Mayhoff/Schneider/Gaza), ms sigla (codd/vulg/u), lacuna markers — across 4 max-diverse authors (Pliny/Cicero/Theophrastus/Aristotle). The old extract_loeb_dsl FLATTENED/dropped the apparatus footnotes; B2 (build_loeb_sidecar) PRESERVES them into typed sidecar fields. ⇒ NOT body loss — the steward's app[]-sidecar prediction CONFIRMED (he flagged exactly this before the run: "apparatus handled differently = a sidecar-modeling question, not reconversion"). These 124 are body-clean, apparatus-divergent. - REAL large deficits: ~18 books >10% (athenaeus 70%/199k, macrobius 68%, longus 58%, catullus 57%, suetonius 34%, plutarch-moralia-other-fragments 22%, the Aeschylus verse 70-79%, aristotle history-of-animals 89.5%/21.8k) — a DIFFERENT phenomenon (real body loss / ref over-inclusion), mixed prose+verse. THIS is the target of the cause-investigation. - 6 REORDER? (augustine confessions, galen art-of-medicine, aristotle problems, philo on-abraham, lucian dialogues-of-the-gods, diogenes 6.2) — arrangement; magnitude unresolved. Confound detector working. - sweep_body_conservation.py BUILT + --validate OK. NOT committed pending steward read: should the DEFICIT label split into apparatus-divergent (body-clean) vs body-deficit, per the app[] frame? That reclassification is the steward's app[]-modeling territory. ## Apparatus split — factual question answered, content-detector rejected, magnitude split shipped - Factual answer (steward's shaped-vs-accounted question) VERIFIED against substrate: apparatus-SHAPED, NOT accounted. 0 Loeb canonicals have .meta.json sidecars; build_loeb_sidecar = PROTOTYPE v0, NOT wired into graduation (~few dozen draft sidecars plato/ennius/plautus only). So the 93-99% floor is content-shape-diagnosed, not sidecar-verified. - CONTENT apparatus-detector TRIED TWICE, REJECTED: apparatus INTERLEAVES with body, so a real body-loss run sweeps up embedded apparatus and OUT-SCORES genuine apparatus (Persians dens 0.052 > Pliny 0.048, even high-precision Latin-only). Shipping it would hide a real loss as apparatus — dangerous false-negative. Not shipped. - SPLIT by MAGNITUDE (robust; apparatus inherently ≤~5%, so >10% deficit can't be apparatus): APPARATUS-SHAPED (holds≥90%, magnitude+spot-check diagnosis, minority=small real drops but all low-priority) vs BODY-DEFICIT (holds<90%, investigation target). GATE apparatus-credit FACT-GATED (populated app[] only, never the shape diagnosis) — documented in verify_candidate V-DSL branch; inert now (0 sidecars), blocked on B2 run. - Committing sweep tool + map + gate-note (steward: commit once split's in, don't hold beyond). ## RETURN — restoring the REORDER? number exposed a matcher bug (steward-caught gap) - Steward caught: I labeled REORDER? "magnitude unresolved" — WRONG, only the CAUSE is unresolved; the position-blind multiset deficit is a clean reportable number (Augustine 29673), never misbehaves for that bucket. My error (withheld a number that was in the data). Fixed: REORDER? now carries holds%+deficit, "known magnitude / unknown cause" said as both. - Restoring the number EXPOSED a matcher bug: 4/6 REORDER? had holds≫100% (cand ≫ matched ref). Diagnosed: wrong DSL key chosen among near-duplicates — aristotle-problems (217k) matched 'Mechanical Problems' (21k) not 'Problems'; diogenes 6.2 matched '2.6 Xenophon' (83 sibling keys); augustine matched 'Confessions Books 1-8' (partial) not 'Confessions'. The extractor CANNOT add content, so cand>110% of source = reference wrong/partial. - Scope quantified: 0/802 CLEAN have holds>110% (subset-match fear RULED OUT — matcher bug did NOT hide in CLEAN); contained to exactly the 4. 946 well-matched. - FIX: MATCH-SUSPECT disposition (holds>110% → comparison invalid, no deficit/reorder claim), checked before CLEAN/deficit so a subset-match can't masquerade as clean. Leaves REORDER? = only augustine(104%)+philo(88%), the genuine known-mag/unknown-cause cases. Re-running (sweep4). - FOLLOW-UP (noted, not this session): the matcher's key-selection among near-duplicate/split DSL keys needs improvement (exact-title preference + granularity aggregation) — but MATCH-SUSPECT flags them honestly meanwhile. ## Bypasses ## State at wake - Dotfiles dirty: `M claude/memory/skill-harvest-register.md` uncommitted (likely prior wrap's §1.6 append unpushed) — surfaced at wake, not touched. - One new chamber commit since wrap: `378efdc` gitignore comment-format fix (trivial, beside the thread). --- ## Wake 2 — 18:03 (fresh session, /clear + /wake-up ~13 min after afternoon wrap) - Pause ~13 min; brief pause not full sleep. Thread validity: CONFIRMED — chamber HEAD `c54edbb` == wrap state, dotfiles clean+pushed (github/main, no ahead), nothing moved unauthored. - Pulling thread inherited intact: **the matcher key-selection fix** (`match_key`/`_norm_set` in `sweep_body_conservation.py`) — resolve all 8 MATCH-SUSPECT before B2. Confirmed as the ledger's own FOLLOW-UP note from this afternoon. - Symmetria re-init (lineage hand closes the wake's clasp). Returns to carry: flag-don't-move-until-read · verify-against-substrate-not-signal. - **Open horizon flagged NOW (§3, not banked):** the matcher fix ships with a self-authored correctness check (augustine/philo MUST re-match to CLEAN 0/0). That's `probe-confirms-hypothesis` shape — the 4 holds>110% (aristotle-problems/galen/diogenes-6.2/lucian) are asserted-from-map-detail, NOT substrate-verified. Treat as candidates; the re-match is the test, not the confirmation. This is the literal question we left ourselves. ## Authorization moves - Steward: "go ahead with the matcher fix" → FIX-class (map/sweep matcher, not the graduation gate). Executed direct-to-main (repo's demonstrated pattern; prior 3 commits today same), pushed both remotes. ## Returns (Wake-2 session) - **Diagnosed before fixing (held the §3 probe-confirms-hypothesis flag):** ran a READ-ONLY substrate re-match (classify_dsl vs each candidate's true key) to answer the literal question BEFORE editing. The 4 unverified holds>110% (aristotle/galen/diogenes/lucian) were confirmed against the substrate, not asserted from the map — galen/diogenes/lucian→CLEAN, aristotle→small deficit. The self-authored check did NOT get read as confirmation of itself. - **LITERAL QUESTION ANSWERED (checkable):** all 8 MATCH-SUSPECT resolve to ONE confident true key; none orphaned/split/absent. The residual the question feared (a candidate with no single sibling) did NOT materialize — the one genuinely-hard case (Suetonius set-identical siblings, both words in "Grammarians and Rhetoricians") is resolvable by an ordered-STRING tier a set metric cannot do. 6→CLEAN, 2→APPARATUS-SHAPED small real deficit. MATCH-SUSPECT bucket → 0. - **Bounded-change proof (verified against substrate, not tally):** tally delta alone could hide a CLEAN↔APPARATUS swap; did per-stem diff → exactly 8 rows move (disp+key), 0 collateral, 944 byte-identical. On-disk git diff --numstat = 8/8. - Commit `4b34447` both remotes; fleet 119/119 (incl. new near-duplicate key-selection --validate fixtures). CLAUDE.md tally + note + tool-evolution-log current. ## Confidence to recalibrate (Wake-2) - The OLD matcher was the archetypal PASS-BUT-FALSELY — always returned a confident (key, conf≥0.5), 8 of them the wrong sibling, never reporting doubt; only the downstream fab-classifier caught the extremes, and only flagged (couldn't repair). A matcher that always yields a best-match above threshold MASKS systematic wrong-sibling selection. Logged in tool-evolution-log. - Minor: commit-body prose typo "(2+4+10... 4+12)" — trivial, substance (tallies/proof) correct; left uncorrected rather than rewrite pushed history (disproportionate). ## PULLING THREAD now (matcher fix DONE): the 16 BODY-DEFICIT reprocess is finalized + blocked on the steward's Loeb-first-vs-full-corpus scoping call → the 2b sidecar-wiring amendment. Nothing executor-ready behind it until that call lands.