From de1e2053ff3b83966d0772f19f27ea0fbaede6cd Mon Sep 17 00:00:00 2001 From: David F Glidden Date: Mon, 13 Jul 2026 19:05:17 +0200 Subject: [PATCH] =?UTF-8?q?session=202026-07-13=20evening:=20matcher=20key?= =?UTF-8?q?-selection=20fix=20(chamber=204b34447,=20MATCH-SUSPECT=E2=86=92?= =?UTF-8?q?0)=20+=20PENDING-58=20(2b=20sidecar-wiring=20amendment,=20Loeb-?= =?UTF-8?q?first)=20+=20session=20memory/ledger/KG/skill-harvest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PENDING.md | 16 ++++++ claude/memory/MEMORY-reference.md | 3 ++ claude/memory/MEMORY.md | 2 +- claude/memory/knowledge-graph.jsonl | 3 ++ ...ning-matcher-fix-match-suspect-resolved.md | 54 +++++++++++++++++++ claude/memory/session-ledger-2026-07-13.md | 23 ++++++++ claude/memory/skill-harvest-register.md | 8 +++ 7 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 claude/memory/session-2026-07-13-evening-matcher-fix-match-suspect-resolved.md diff --git a/PENDING.md b/PENDING.md index 1749fa8..8446b5e 100644 --- a/PENDING.md +++ b/PENDING.md @@ -1502,3 +1502,19 @@ Disposition (verbatim capture + executor action-list: `chamber-library/docs/libr **Awaiting:** jurist confirmation the two conditions are closed (+ his call on loss auto-PASS vs REVIEW-routing for the masked-vocab edge) → steward ratification (REVIEWED-57) → land by supersession into `graduation-spec.yaml` + `verify_graduation.py`. **CLOSED 2026-07-13 (REVIEWED-57 AUTHORIZED — fully ratified across three jurist rounds).** Gate WIRED into graduation as its own source-in-hand step `body_conservation_gate()` (`cdb3454`). §6 retroactive sweep RUN over all 952 Loeb → the corpus-health map (d9f6880/9afb0cf). Follow-on same day: the 18 body-deficit **cause-analysed** by reading the missing spans → three remedy tracks (re-match 8 / re-extract 4 / re-verify-and-reconvert 12); a wrong-match-by-fabrication classifier rule + the 2 REORDER? books resolved (both wrong/partial-key, CLEAN on re-match) → REORDER? dissolved to 0 (eb21eca/836b665/c54edbb). Nothing further awaited on PENDING-57. The reprocess itself (matcher fix → the 2b sidecar-wiring amendment gated on the steward's Loeb-first-vs-full-corpus call → B2 ②+③) is downstream work tracked in the session files + `chamber-library/docs/chamber-program-open-work.md`, not here. + +## PENDING-58 — 2b: Wire the Loeb structural sidecar into graduation (V-DSL tier), with the `DSL-full = body + app[]` reconciliation as the apparatus/body FACT — Loeb-first scope +**Date:** 2026-07-13 +**Tag:** [PROPOSAL] — change-class PROPOSAL (it changes what graduation PRODUCES and what the body-conservation gate may CREDIT; per chamber CLAUDE.md "FIX→PROPOSAL when it changes what a gate accepts", and per REVIEWED-56 §4 "graduation-spec names the sidecar as the graduated structural layer — a separate, additive amendment"). Jurist editor-gate → steward ratification (REVIEWED-58). +**Summary:** For the **V-DSL (Loeb) tier only**, make graduation produce + validate the `.meta.json` structural sidecar (via the fleet-v1 `build_loeb_sidecar.py`) as a graduated structural layer, so the reserved `app[]` is populated — and add the **`DSL-full = candidate-body + sidecar-app[]` (by multiset) reconciliation** as the mechanism that turns the corpus-health map's *diagnosis-by-magnitude* ("apparatus-shaped, NOT sidecar-verified") into a **checked fact**: reconciles → the deficit was apparatus (the 126); doesn't → it was body (the 16). +**Rationale:** The whole reprocess stands on turning "apparatus or body?" from a judgment into a reconciliation. The sweep (PENDING-57 §6) can only *diagnose* apparatus by magnitude — it explicitly labels the 126 APPARATUS-SHAPED *not sidecar-verified*, because the app[] input does not exist yet. Wiring B2's sidecar into graduation is what supplies that input; the reconciliation is then the same shape as the verbatim gate's fabrication/loss split — *reconciles* is a fact and *doesn't* is a fact, no eyeballing. It also un-blocks the ②+③ reprocess (B2 becomes the graduation path for the reconvert, not a side tool). The matcher fix (`4b34447`, 2026-07-13) finalized the target set (16 BODY-DEFICIT: ②4 + ③12, MATCH-SUSPECT→0), so the scope this amendment governs is now stable. +**Scope decision — LOEB-FIRST (steward-ruled 2026-07-13, decided now not deferred):** wire it for the **V-DSL / Loeb tier ONLY**, through `build_loeb_sidecar.py` (**fleet-v1**: six commits this week, matcher rewrite, fabrication+loss injection tests, a 952-book sweep, in `test_tools`). **Explicitly NOT** the general EPUB/PDF tier: its extractor `build_sidecar.py` is a **v0 prototype, never in the fleet, exactly where it was at schema-lock**. The asymmetry is the argument: building the amendment for a corpus half of which runs through v0 tooling would be "should generalize, structurally similar" *trusted before proof anywhere* — the shape that broke nagarjuna's index, the nested-block div, and the Aeschylus reordering, one level up. The general tier joins by a **later additive amendment** once its extractor earns the same trust; nothing about Loeb-first blocks that path. +**The reconciliation (the checkable corollary this amendment installs):** + · `multiset(DSL-full for the work) == multiset(candidate body) ⊎ multiset(all sidecar app[] entries)` (drift-tolerant, same boilerplate accounting as the sweep). + · **Reconciles** ⇒ the map's deficit was apparatus the old extractor flattened → the APPARATUS-SHAPED label is now *sidecar-verified fact* (predicts the 126). + · **Does not reconcile** ⇒ the deficit is real body loss (predicts the 16) → stays a reprocess target. The prediction *is* the test. +**THE PRE-REGISTERED PROOF CONDITION (steward-directed 2026-07-13 — the un-retired schema-lock question, NOT new):** the reconciliation must be **demonstrated on an apparatus shape it has NOT already seen** (not `table`/`glyph` again — an unseen `app[]` kind: marginal sigla, interlinear gloss, testimonia-citation, verse-line apparatus), **at a scale closer to what the 126 actually are** — before apparatus-credit is granted at scale / before the reconciliation is trusted as the fact. This LIFTS the jurist's already-ratified extractor condition (schema-DRAFT §5: apparatus *density* ≠ *diversity of kind*; "the densest volume fit the schema" ≠ "the worst case is expressible"; the real safety property is "the extractor holds *anything* it does not recognize") **up from the extractor to the reconciliation** — the reconciliation running once on two prototype books does not retire it; it retires when asked at the 126's scale against an unseen kind. Until it clears, **apparatus-credit into `body_conservation_gate` stays FACT-GATED on populated `app[]`** (already the PENDING-57 posture — this amendment does not loosen it, it names the condition that would). +**Options:** **(a)** wire the sidecar as produced-and-validated at V-DSL graduation, run the reconciliation as a diagnostic, keep apparatus-credit FACT-GATED, and require the proof-condition demonstration before the reconciliation is cited as fact at scale (RECOMMEND); **(b)** wire + immediately treat reconciliation as authoritative apparatus-credit (REJECT — grants credit before the unseen-kind/at-scale proof, the exact move the condition forbids); **(c)** defer wiring until B2 has reconverted the ②+③ set (REJECT — circular: the reconvert graduates *through* this wiring). +**Change-class boundary — what this does NOT change:** the LOCKED sidecar schema (additive-only; no field meaning/shape touched); the verbatim guarantee text; any tier's evidence-class; the V-DSL/V-TEXT/V-SCAN dispatch; the general-tier graduation path (untouched — Loeb-only). It ADDS: a V-DSL sidecar-generation+validation step at graduation, and a reconciliation instrument + its FACT-GATE. +**Files affected (on ratification):** `_curation/graduation-spec.yaml` (gates block: name the sidecar as the graduated structural layer for V-DSL + declare the sidecar-generation/validation step, mirroring how `body_word_conservation`/line 136 was wired); `scripts/graduate_to_canonical.py` (produce+validate the sidecar at V-DSL graduation, source-in-hand layer, beside `body_conservation_gate`); `scripts/build_loeb_sidecar.py` (the graduation entry point — already fleet-v1); a NEW reconciliation instrument (`DSL-full = body ⊎ app[]` multiset check) + its unseen-kind/at-scale demonstration; `_curation/conversion-runbook.yaml` (pipeline direction). Companion `docs/2b-sidecar-wiring-FOR-JURIST-2026-07-13.md` relay brief to follow (the evidence pack, as PENDING-56/57 carried). +**Awaiting:** jurist editor-gate (esp. on the proof-condition wording — is "unseen kind AND near-126 scale" the right bar, or does he want it sharper?) → steward ratification (REVIEWED-58) → land by supersession. diff --git a/claude/memory/MEMORY-reference.md b/claude/memory/MEMORY-reference.md index 2fffeaf..09f2068 100644 --- a/claude/memory/MEMORY-reference.md +++ b/claude/memory/MEMORY-reference.md @@ -20,6 +20,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-13 evening — matcher key-selection fix; MATCH-SUSPECT → 0; reprocess set finalized; demoted on promote) +- [Session 2026-07-13 (afternoon) — the 18 body-deficit cause-analysed → 3 remedy tracks; REORDER?→0](session-2026-07-13-afternoon-18-body-deficit-cause-analysed.md) — Opened the 18 BODY-DEFICIT Loeb by **READING the missing spans**: the "same apparatus story, just larger" hypothesis **REFUTED** → THREE mechanisms, three remedies (**① re-match 8 · ② re-extract 4 · ③ re-verify-and-reconvert 12**). Folded cause into the map via a **wrong-match-by-fabrication** classifier rule (`m_fab>5% cand → MATCH-SUSPECT`, checked BEFORE arrangement; bounded-change proven). **Read + resolved the 2 REORDER? books** — augustine (PARTIAL key: full 'Confessions' vs matched 'Books 1–8') + philo-on-abraham (WRONG sibling: 'On Abraham' vs 'On the Migration of…'), both **fab=0/lost=0 CLEAN on re-match** → **REORDER? dissolved to 0** (both were wrong/partial-key artifacts; detector kept — absence-here≠cannot-exist). Map now: 802 CLEAN · 126 APPARATUS-SHAPED · 16 BODY-DEFICIT · 8 MATCH-SUSPECT · 0 REORDER?. 3 commits both remotes (eb21eca/836b665/c54edbb); 119/119; **PENDING-57 fully CLOSED**. **⚠ PULLING THREAD: the matcher key-selection fix** (near-dup/split/part-vs-whole keys) — resolves all 8 MATCH-SUSPECT, finalizes the reprocess target set BEFORE B2; ready now, FIX-class; 2 of 8 (augustine/philo) one re-match from CLEAN. Behind it: the steward's **Loeb-first-vs-full-corpus scoping call** → the 2b amendment → the B2 reprocess proper (②+③, blocked on the amendment). **Steward pref: shorter, very concentrated sessions.** Read the session file + `_curation/loeb-body-deficit-cause-analysis-2026-07-13.md` + the map at wake. *[Superseded 2026-07-13 evening: the matcher key-selection fix RAN (`4b34447`) — all 8 MATCH-SUSPECT → true key, 6 CLEAN + 2 apparatus-shaped; MATCH-SUSPECT → 0; map 808/128/16/0/0; steward closed the matcher thread. New pulling thread: the B2 reprocess, blocked on the steward's scoping call.]* + ## Archived (2026-07-13 afternoon — the 18 body-deficit cause-analysed → 3 remedy tracks; REORDER?→0; demoted on promote) - [Session 2026-07-13 — keystone LANDED + wired + Loeb corpus-health map](session-2026-07-13-keystone-landed-loeb-health-map.md) — Keystone (PENDING-57) **wired into graduation** (`cdb3454`; `body_conservation_gate` its own source-in-hand step, NOT collect_checks) + its **§6 sweep run over all 952 Loeb** → the corpus-health **map**: 802 CLEAN · 126 apparatus-shaped · 18 body-deficit · 2 REORDER? · 4 MATCH-SUSPECT (`_curation/loeb-body-conservation-map-2026-07-13.tsv`; d9f6880/9afb0cf). Cross-extractor **drift-tolerance = two-sided boilerplate accounting**; the 126 floor = **apparatus criticus** the old extractor flattened (steward's app[] prediction) → apparatus-SHAPED-not-accounted, split by MAGNITUDE, **gate apparatus-credit FACT-GATED**; a **matcher bug** surfaced by restoring the REORDER? number → MATCH-SUSPECT. 3 commits pushed both remotes; 119/119; **PENDING-57 CLOSED**. **⚠ PULLING THREAD: the B2 corpus reprocess the map sizes** — first station the **2b sidecar-wiring amendment** (steward's Loeb-first-vs-full-corpus call) → populates app[] + reconverts the 126 + feeds the 18-book investigation. **Steward pref: shorter, very concentrated sessions.** Read the session file + the map + `docs/chamber-program-open-work.md` at wake. *[Superseded 2026-07-13 afternoon: opened the 18 → map now carries CAUSE, split into 3 remedy tracks (re-match 8 / re-extract 4 / re-verify-and-reconvert 12); the 2 REORDER? + 2 of the wrong-match books reclassified to MATCH-SUSPECT; REORDER? dissolved to 0 (both occupants were wrong/partial-key artifacts, CLEAN on re-match); see the 07-13 afternoon cause-analysis session. New pulling thread: the matcher key-selection fix.]* diff --git a/claude/memory/MEMORY.md b/claude/memory/MEMORY.md index a0e6f2c..fb4c100 100644 --- a/claude/memory/MEMORY.md +++ b/claude/memory/MEMORY.md @@ -57,7 +57,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-13 (afternoon) — the 18 body-deficit cause-analysed → 3 remedy tracks; REORDER?→0](session-2026-07-13-afternoon-18-body-deficit-cause-analysed.md) — Opened the 18 BODY-DEFICIT Loeb by **READING the missing spans**: the "same apparatus story, just larger" hypothesis **REFUTED** → THREE mechanisms, three remedies (**① re-match 8 · ② re-extract 4 · ③ re-verify-and-reconvert 12**). Folded cause into the map via a **wrong-match-by-fabrication** classifier rule (`m_fab>5% cand → MATCH-SUSPECT`, checked BEFORE arrangement; bounded-change proven). **Read + resolved the 2 REORDER? books** — augustine (PARTIAL key: full 'Confessions' vs matched 'Books 1–8') + philo-on-abraham (WRONG sibling: 'On Abraham' vs 'On the Migration of…'), both **fab=0/lost=0 CLEAN on re-match** → **REORDER? dissolved to 0** (both were wrong/partial-key artifacts; detector kept — absence-here≠cannot-exist). Map now: 802 CLEAN · 126 APPARATUS-SHAPED · 16 BODY-DEFICIT · 8 MATCH-SUSPECT · 0 REORDER?. 3 commits both remotes (eb21eca/836b665/c54edbb); 119/119; **PENDING-57 fully CLOSED**. **⚠ PULLING THREAD: the matcher key-selection fix** (near-dup/split/part-vs-whole keys) — resolves all 8 MATCH-SUSPECT, finalizes the reprocess target set BEFORE B2; ready now, FIX-class; 2 of 8 (augustine/philo) one re-match from CLEAN. Behind it: the steward's **Loeb-first-vs-full-corpus scoping call** → the 2b amendment → the B2 reprocess proper (②+③, blocked on the amendment). **Steward pref: shorter, very concentrated sessions.** Read the session file + `_curation/loeb-body-deficit-cause-analysis-2026-07-13.md` + the map at wake. +- [Session 2026-07-13 (evening) — matcher key-selection fix; MATCH-SUSPECT → 0; reprocess set finalized](session-2026-07-13-evening-matcher-fix-match-suspect-resolved.md) — Executed the inherited pulling thread. **Diagnosed before fixing:** a read-only substrate re-match (`classify_dsl` vs each candidate's true key) answered the literal question BEFORE the edit — **all 8 MATCH-SUSPECT resolve to ONE confident true key**, incl. the 4 holds>110% the map only *asserted* (aristotle/galen/diogenes/lucian — 3 CLEAN, aristotle small-deficit); "no residual" is a *checked* claim. Rewrote `sweep_body_conservation.match_key` to rank keys by **exact ordered title-STRING → Jaccard → fewer-extra → raw overlap, author-stripped** — the **ordered-string tier resolves the genuinely-hard set-identical sibling** (Suetonius 'Grammarians' vs 'Rhetoricians', identical token SETS) that **no set metric can** (steward's category-vs-calibration diagnosis: method-class blindness, not mis-tuning). **Bounded-change proven** (per-stem, not tally): exactly 8 rows move disp+key, **944 byte-identical** → **6 CLEAN + 2 apparatus-shaped small-deficit** (aristotle 6893/plutarch 204, fab=0); **no REORDER? revived**. Map **808 CLEAN · 128 APPARATUS-SHAPED · 16 BODY-DEFICIT · 0 MATCH-SUSPECT · 0 REORDER?** (808+128+16=952 ✓; ②4+③12=16 exactly — the arithmetic closes at source). Commit `4b34447` both remotes; fleet **119/119** (+3 near-dup key-selection `--validate` fixtures); note + CLAUDE.md + tool-evolution-log current. **Steward closed the matcher thread.** Then **the scoping call was MADE mid-wrap: LOEB-FIRST** (steward-ruled; asymmetry — `build_loeb_sidecar` fleet-v1 vs `build_sidecar` still v0; full-corpus would trust "should generalize" before proof, the nagarjuna/nested-block/Aeschylus shape one level up). **Drafted PENDING-58** (the 2b sidecar-wiring amendment, Loeb-only) into `~/dotfiles/PENDING.md`: wire B2's `.meta.json` into V-DSL graduation → `DSL-full=body+app[]` multiset reconciliation turns APPARATUS-SHAPED *diagnosis* into *fact* (reconciles→126, doesn't→16). **⚠ PULLING THREAD: PENDING-58 awaiting the jurist editor-gate; the live question = the reconciliation-proof-at-scale condition** (baked into PENDING-58: prove reconciliation on an UNSEEN apparatus kind at near-126 scale before crediting apparatus — the schema-lock §5 density≠diversity question lifted from extractor to reconciliation; does NOT retire because B2 ran once). Next: the `docs/2b-sidecar-wiring-FOR-JURIST-2026-07-13.md` relay brief, or act on the jurist's ruling. **Steward pref: shorter, very concentrated sessions.** Read the session file + PENDING-58 + the map 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). diff --git a/claude/memory/knowledge-graph.jsonl b/claude/memory/knowledge-graph.jsonl index 619fff8..f82da24 100644 --- a/claude/memory/knowledge-graph.jsonl +++ b/claude/memory/knowledge-graph.jsonl @@ -362,3 +362,6 @@ {"subject": "PENDING-57", "predicate": "status", "object": "CLOSED 2026-07-13 (REVIEWED-57) — keystone wired into graduation (cdb3454) + §6 retroactive sweep run over 952 Loeb → corpus-health map (802 CLEAN/126 apparatus-shaped/18 body-deficit/2 REORDER?/4 MATCH-SUSPECT); chamber d9f6880/9afb0cf", "valid_from": "2026-07-13", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-13-keystone-landed-loeb-health-map.md", "extracted_at": "2026-07-13"} {"subject": "claude-code", "predicate": "drift-pattern", "object": "inherited-marker-read-as-current-state RECURRED at wake — briefing said REVIEWED-55 placement still owed; it was placed 2026-07-12 (REVIEWED.md:490). Verify a governance item state against REVIEWED/PENDING before relaying; records drift in BOTH directions (a stale 'owed' describing done governance). Steward-caught.", "valid_from": "2026-07-13", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-13-afternoon-18-body-deficit-cause-analysed.md", "extracted_at": "2026-07-13"} {"subject": "claude-code", "predicate": "drift-pattern", "object": "counted-the-bundled-representation-as-items — stated the remedy track as 10 (table ROWS) when it was 12 BOOKS; the final row bundled the 3 Aeschylus plays. Count items, not their grouped display rows. Kin to census-through-a-pattern; steward-caught by the arithmetic (8+4+12=24=16+8).", "valid_from": "2026-07-13", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-13-afternoon-18-body-deficit-cause-analysed.md", "extracted_at": "2026-07-13"} +{"subject": "loeb-corpus-health-map", "predicate": "state", "object": "808 CLEAN / 128 APPARATUS-SHAPED / 16 BODY-DEFICIT / 0 MATCH-SUSPECT / 0 REORDER (matcher fix 4b34447; all 8 MATCH-SUSPECT → true key, 6 CLEAN + 2 apparatus-shaped)", "valid_from": "2026-07-13", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-13-evening-matcher-fix-match-suspect-resolved.md", "extracted_at": "2026-07-13"} +{"subject": "chamber-2b-amendment", "predicate": "scope-decision", "object": "Loeb-first — V-DSL/build_loeb_sidecar (fleet-v1) only; general build_sidecar (v0) joins by a later additive amendment; steward-ruled 2026-07-13", "valid_from": "2026-07-13", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-13-evening-matcher-fix-match-suspect-resolved.md", "extracted_at": "2026-07-13"} +{"subject": "PENDING-58", "predicate": "status", "object": "drafted, awaiting jurist editor-gate — 2b sidecar-wiring into V-DSL graduation; DSL-full=body+app[] reconciliation = apparatus/body FACT; proof-condition = unseen apparatus kind at near-126 scale", "valid_from": "2026-07-13", "valid_to": null, "confidence": 1.0, "source_file": "session-2026-07-13-evening-matcher-fix-match-suspect-resolved.md", "extracted_at": "2026-07-13"} diff --git a/claude/memory/session-2026-07-13-evening-matcher-fix-match-suspect-resolved.md b/claude/memory/session-2026-07-13-evening-matcher-fix-match-suspect-resolved.md new file mode 100644 index 0000000..6f49349 --- /dev/null +++ b/claude/memory/session-2026-07-13-evening-matcher-fix-match-suspect-resolved.md @@ -0,0 +1,54 @@ +--- +name: Session 2026-07-13 (evening) — matcher key-selection fix; MATCH-SUSPECT → 0; reprocess set finalized +description: "Executed the inherited pulling thread — the matcher key-selection fix. Diagnosed before fixing: a read-only substrate re-match answered the literal question (all 8 MATCH-SUSPECT resolve to ONE confident true key, incl. the 4 holds>110% the map only asserted) BEFORE the edit. Rewrote sweep_body_conservation.match_key to rank keys by exact ordered title-STRING → Jaccard → fewer-extra (author-stripped) — the ordered-string tier resolves the genuinely-hard set-identical sibling (Suetonius Grammarians vs Rhetoricians) that no set metric can. Bounded-change proven: exactly 8 rows move, 944 byte-identical → 6 CLEAN + 2 apparatus-shaped small-deficit; no REORDER? revived. Map 808/128/16/0/0. Commit 4b34447 both remotes; fleet 119/119; --validate gains 3 selection fixtures. Steward affirmed the category-vs-calibration diagnosis + closed the matcher thread. PULLING THREAD now: the B2 reprocess (16 BODY-DEFICIT, finalized) is blocked on the steward's Loeb-first-vs-full-corpus scoping call → the 2b sidecar-wiring amendment. Nothing executor-ready behind that call." +metadata: + node_type: memory + type: project + originSessionId: 5300a34b-01b9-4996-9335-7b65edfea736 +--- + +# Session 2026-07-13 (evening) — the matcher key-selection fix + +Woke (post-clear, ~13 min after the afternoon wrap — brief pause) into the keystone-clean state; pulling thread inherited intact = "the matcher key-selection fix." Steward authorized "go ahead." Took the one concentrated bite all the way to a committed/verified stop, then the steward affirmed the diagnosis and closed the matcher thread. This is the tail of the 07-13 Loeb-health arc. + +## PAST — what we did + why + +**1. Diagnosed before fixing — answered the inherited literal question by SUBSTRATE re-match, read-only, BEFORE editing.** The question: when `match_key` is fixed, do all 8 MATCH-SUSPECT resolve to a *confident* true key, or is there a residual (a candidate with no single correct DSL sibling)? — and critically the 4 holds>110% (aristotle-problems/galen/diogenes-6.2/lucian) were **asserted-from-map-detail, NOT substrate-verified**. Wrote a read-only probe (`scratchpad/diag_match_suspect.py`) that, for each of the 8, printed the candidate header, the real DSL key universe for that author, and — the load-bearing part — ran the actual `classify_dsl` against each candidate's true key. **Answer: all 8 resolve to exactly ONE confident true key; none orphaned / split-across-many / absent.** The 4 unverified confirmed against the substrate (galen/diogenes/lucian → CLEAN fab=0/lost=0; aristotle → small real deficit). The self-authored correctness check did NOT get read as its own confirmation — held the `probe-confirms-hypothesis` §3 flag. + +**2. The fix (`4b34447`).** `sweep_body_conservation.match_key` selected the DSL key by **raw token overlap, first-max** — which TIES among near-duplicate siblings and loses on iteration order (extra key-tokens cost nothing; and the multi-word author-subtraction `- {author.lower()}` was a silent no-op, so author tokens inflated every score). Rewrote the metric to rank author-group keys by, in strict priority, all **author-stripped** (`_work_title` drops the author segment before the first comma): **(1) exact ordered title-STRING match → (2) max Jaccard on title tokens → (3) fewer extra key-tokens → (4) raw overlap.** Added `_norm_str` + `_work_title` helpers. Extended `--validate` with three synthetic fixtures (part-vs-whole, wrong-sibling, set-identical siblings) so a regression to raw-overlap fails the self-test. + +**3. Why the ordered-STRING tier had to lead (the steward's category diagnosis, elevated).** Suetonius '…Grammarians and Rhetoricians. **Grammarians**' vs '… . **Rhetoricians**' have **identical token SETS** — both words appear in "Grammarians and Rhetoricians" — so Jaccard=1.0 and raw-overlap tie for both; only word ORDER separates them. This is not a calibration problem: **no amount of retuning a set metric reaches an order-only distinction, because the blindness is in the method CLASS, not its threshold.** The ordered string is the correct-category response, and it goes FIRST (strongest, most-specific signal before falling back to fuzzier set metrics). + +**4. Bounded-change proof (verified against substrate, not tally).** Tally delta alone (CLEAN +6, APPARATUS-SHAPED +2, MATCH-SUSPECT −8) could hide a CLEAN↔APPARATUS swap that nets out — so did a per-stem diff (old committed map vs new): **exactly the 8 rows change disposition AND key, 0 collateral, the other 944 byte-identical.** On-disk `git diff --numstat` = 8/8. Each of the 8 moved from the wrong sibling to its substrate-verified true key. **6 → CLEAN** (augustine/diogenes/galen/lucian/philo/suetonius), **2 → APPARATUS-SHAPED small real deficit** (aristotle Problems lost 6893/3.0%, plutarch Other-Fragments lost 204/1.5%, both fab=0 = right key). **No REORDER? revived** (consistent with REORDER?=0 corpus-wide — a right-key book here does not truly reorder). Map now **808 CLEAN · 128 APPARATUS-SHAPED · 16 BODY-DEFICIT · 0 MATCH-SUSPECT · 0 REORDER?** (808+128+16 = 952 ✓; ②4 + ③12 = 16 = BODY-DEFICIT exactly, now that re-match no longer bleeds in — the arithmetic the steward flagged last round closes at the source). + +**5. Docs current + fleet green.** Updated the findings note (`_curation/loeb-body-deficit-cause-analysis-2026-07-13.md` — new "MATCH-SUSPECT resolved" section with the per-book table + the literal-question answer), the chamber `CLAUDE.md` map-pointer tally + the ① remedy status, and `_curation/tool-evolution-log.md` (the matcher-fix entry: the OLD matcher as the archetypal PASS-BUT-FALSELY). Fleet `test_tools` **119/119** (incl. the new near-duplicate key-selection assertion). Commit `4b34447` pushed **both** remotes (github + Gitea; Gitea did not hang this time). 5 files, all expected. + +**Artifacts:** commit `4b34447`; findings note + map + CLAUDE.md + tool-evolution-log updated; read-only probe at `scratchpad/diag_match_suspect.py` (disposable). + +## PRESENT — the mood + +Clean, concentrated, and the disciplines held without a steward catch this time. The session was the textbook shape the steward asked for — ONE tightly-scoped high-leverage bite taken all the way to a committed/verified stop. Returns worth carrying: **diagnosed before fixing** (substrate re-match answered the question BEFORE the edit — the 4 unverified confirmed, not assumed; "no residual" is a *checked* claim, not an assumed one); **held probe-confirms-hypothesis** (the fix's self-authored check was not read as its own confirmation); **bounded-change verified against substrate not tally** (per-stem diff, because a tally can hide an offsetting swap). The steward's affirmation named the load-bearing insight more sharply than I had: the failure was **method-class blindness, not mis-calibration** — a genuinely general lesson (surfaced as a skill-harvest candidate). No recalibrations against me this session; the one honest blemish is a trivial commit-body prose typo ("2+4+10... 4+12"), left uncorrected rather than rewrite pushed history (disproportionate). The matcher thread is closed by steward ruling. + +## FUTURE — what is pulling + +**The scoping call was MADE mid-wrap: LOEB-FIRST (steward-ruled 2026-07-13, decided now not deferred).** His reasoning, recorded because it's load-bearing: (1) the week's own pattern — every time "should generalize, structurally similar" got trusted before proof on a real case it broke somewhere specific (nagarjuna's index, nested-block's div, the Aeschylus reordering); building the amendment for the full corpus before the reconciliation is proven anywhere would be that mistake one level up. (2) The asymmetry is real: `build_loeb_sidecar` earned trust this week (6 commits, matcher rewrite, fab+loss injection tests, 952-book sweep, in fleet); `build_sidecar` is exactly where it was at schema-lock (v0, never in fleet). Building for a corpus half of which runs through v0 tooling is building against tooling that hasn't earned the trust the Loeb path spent a week earning. + +**PULLING THREAD (moved): PENDING-58 — the 2b sidecar-wiring amendment — drafted, awaiting the jurist editor-gate; the live epistemic question is the reconciliation-proof-at-scale condition.** Drafted PENDING-58 this session (into `~/dotfiles/PENDING.md`): wire `build_loeb_sidecar`'s `.meta.json` into V-DSL graduation so `app[]` is populated → install the `DSL-full = candidate-body + sidecar-app[]` (multiset) reconciliation that turns the map's APPARATUS-SHAPED *diagnosis* into a *fact* (reconciles→the 126 apparatus, doesn't→the 16 body). **Loeb-only scope; the general v0 tier joins by a later additive amendment.** + +**The steward's un-retired proof condition is baked into PENDING-58 as a pre-registered gate — hold it, it does not retire because B2 ran once.** The reconciliation must be demonstrated on an apparatus shape it has NOT seen (not `table`/`glyph` again — an unseen `app[]` kind: marginal sigla, interlinear gloss, testimonia-citation, verse-line apparatus) AND at a scale closer to what the 126 actually are, BEFORE apparatus-credit is trusted at scale. This LIFTS the jurist's already-ratified extractor condition (schema-DRAFT §5: density ≠ diversity of kind; the real safety property = "the extractor holds anything it does not recognize") up from the extractor to the reconciliation. Until it clears, apparatus-credit into `body_conservation_gate` stays FACT-GATED (unchanged from PENDING-57). + +**ACTIONABLE RESUMPTION POINT (as of wrap — re-judge against what changed):** +- chamber-library clean, `4b34447` at HEAD both remotes. Fleet 119/119. Map `_curation/loeb-body-conservation-map-2026-07-13.tsv` (808/128/16/0/0). PENDING-58 drafted (dotfiles, this wrap). +- **First move next session:** the companion `docs/2b-sidecar-wiring-FOR-JURIST-2026-07-13.md` relay brief (the evidence pack, as PENDING-56/57 each carried) — OR, if the jurist has ruled, act on the ruling. The brief is the natural next artifact; PENDING-58 is thorough enough to stand as the proposal meanwhile. +- **The build, once the jurist gates it:** wire the sidecar step into `graduation-spec.yaml` + `graduate_to_canonical.py` (mirroring `body_conservation_gate`'s wiring), build the reconciliation instrument, and — the load-bearing part — run its **unseen-kind / at-scale demonstration** to satisfy the proof condition before citing reconciliation as fact. + +**Other open horizons (ranked):** +- The ②+③ reprocess proper (re-extract 4 + re-verify-and-reconvert 12) graduates *through* the 2b wiring — genuinely behind PENDING-58's ratification. +- The 07-12 program open-work register items that predate today still stand behind the B2 run. +- The 2 apparatus-shaped small deficits (aristotle 6893, plutarch 204) are correctly-keyed real small losses in the honestly-labelled floor — they ride through the same reconciliation; not worth chasing separately. + +**PAUSE STATEMENT:** I am about to be away from this. The matcher thread is closed and the scoping call is made — the amendment is drafted and the governance can move. What I want to find still pulling on return: PENDING-58's jurist gate, and specifically whether the reconciliation-proof-at-scale condition survives contact with the jurist (is "unseen kind AND near-126 scale" the right bar, or does he sharpen it?). The condition is the honest heart of the amendment — the place where "apparatus or body = fact" is earned rather than asserted. + +**LITERAL QUESTION for next-Claude:** When the reconciliation is actually built and run at scale against an *unseen* apparatus kind — does `DSL-full = body ⊎ app[]` still reconcile for the 126, or does an unseen kind expose a shape the sidecar's `app[]` cannot hold by multiset (so the "apparatus or body = fact" corollary is narrower than the two prototype books suggested)? That is the schema-lock §5 question at the reconciliation level, and it does not retire until asked at the 126's scale. + +**State at wrap:** chamber-library clean + `4b34447` both remotes; fleet 119/119; map 808/128/16/0/0; findings note + CLAUDE.md + tool-evolution-log current; MATCH-SUSPECT bucket closed. **Scoping call MADE (Loeb-first); PENDING-58 (2b amendment) drafted, awaiting jurist.** dotfiles committed+pushed at wrap. diff --git a/claude/memory/session-ledger-2026-07-13.md b/claude/memory/session-ledger-2026-07-13.md index b6f2460..0b6a4f5 100644 --- a/claude/memory/session-ledger-2026-07-13.md +++ b/claude/memory/session-ledger-2026-07-13.md @@ -85,3 +85,26 @@ metadata: ## 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. diff --git a/claude/memory/skill-harvest-register.md b/claude/memory/skill-harvest-register.md index 734721d..b94a835 100644 --- a/claude/memory/skill-harvest-register.md +++ b/claude/memory/skill-harvest-register.md @@ -463,3 +463,11 @@ The single place proposed skills live so they don't evaporate between sessions. | **confirm-a-named-cause-by-swap-in (don't assert from identification)** | verification-ladder instrument | When you NAME the true reference / config / cause behind an anomaly, don't assert the fix from the identification — **swap the candidate in and confirm the anomaly collapses** (ideally to zero). Today: naming augustine's true key ('Confessions' full) and philo's ('On Abraham') wasn't trusted; re-running the comparison against each drove fab+lost to exactly 0/0 — the checkable version of "this is the wrong match." The specific form of [[feedback-checkable-claim-surfaces-bugs]] for root-cause claims. | `reference-verification-ladder.md` | **PROPOSED** | *(Two, both earned in use, both recurring-shaped and distinct from the morning's checkable-claim §3 flag. The first is the session's load-bearing lesson — magnitude ≠ cause in a diagnostic map. Watch-list, not proposed: "counted-the-bundled-representation-as-items" [the ③ table row = 3 Aeschylus books counted as 1] — logged as a KG drift-pattern; may graduate to a census-through-a-pattern refinement if it recurs.)* + +### Harvest 2026-07-13 (evening — the matcher key-selection fix) + +| Element | Kind | One-line | Where it lands | Status | +|---|---|---|---|---| +| **method-class-vs-calibration** | verification-ladder entry (primary) OR Symmetria §3 flag | **When a metric/gate fails to separate two cases, ask whether it is mis-CALIBRATED or structurally BLIND to the distinction — no amount of retuning a set metric reaches an order-only difference, because the blindness is in the method CLASS, not its threshold.** Antidote: reach for a different method *category* and order tiers strongest-most-specific-signal FIRST (exact ordered-string before fuzzy set metrics). Earned today: Jaccard=1.0 AND raw-overlap both TIED on Suetonius 'Grammarians' vs 'Rhetoricians' (identical token sets — both words in "Grammarians and Rhetoricians"); only the ordered STRING separates them, and it had to lead. The steward elevated it: "the problem was in the *category* of method, not its calibration… no amount of retuning a set metric would ever have separated them." Generalizes past this matcher — any check that ties/fails where a distinction is real. | `reference-verification-ladder.md` (a diagnostic instrument), with a possible Symmetria §3 shadow ("retune-a-structurally-blind-metric" = reaching for the calibration knob when the method class can't make the distinction) | **PROPOSED** | + +*(One candidate, load-bearing and steward-named. Primary home is the verification-ladder — it's a positive diagnostic technique, not only a contamination shape. The §3-flag form is offered in case the steward reads it as the drift-shadow [reaching for the convenient tuning knob] rather than the instrument. His ruling on which home, or both.)*