diff --git a/.claude/board/EPIPHANIES.md b/.claude/board/EPIPHANIES.md index f08ba3c52..3e3e86ff1 100644 --- a/.claude/board/EPIPHANIES.md +++ b/.claude/board/EPIPHANIES.md @@ -1,3 +1,90 @@ +## 2026-07-27 — E-SHIPPING-CAN-OUTRUN-ITS-OWN-RECORD-1 — a session kept shipping working code for six consecutive PRs (#851–#856) while its own memory practice (`PR_ARC_INVENTORY`, review-thread replies) went completely dark, and nothing about the *quality* of the shipped work signaled the gap. + +**Status:** RULING + named failure mode (forensic recovery session, 2026-07-27). +**Confidence:** High — every claim below is a diff, a commit hash, or a GitHub +API read, cross-referenced in `.claude/handovers/2026-07-27-2114-arc-841-856-postmortem.md` +and `.claude/board/PR_ARC_INVENTORY.md` (#851–#856 entries, reconstructed +this session because none existed). + +**The shape of the failure, precisely.** This is not "a session went stale +and produced garbage" — #852's multipass-bug fix, coverage-inversion +refutation, and falsifiability-rule extension are all real, and #854's +`source_registry` withdrawal is one of the best-reasoned reversals in the +whole board. **The code quality did not degrade. The record of the code +did.** `PR_ARC_INVENTORY.md` — the file `CLAUDE.md` calls "auto-loaded at +session start… read BEFORE proposing anything" — went six PRs without an +entry, from immediately after #851 (which itself dutifully wrote #850's +entry) through #856. 20 review threads on #852 and 3 more each on #853 and +#856 received precisely zero replies. A branch named for unrelated work +(`claude/medcare-rs-transcode-ruff-3y2olh`) carried #854–#856 while +`CLAUDE.md` was, in the same window, gaining a rule about sessions with +private-repo access keeping strict separation of concerns on public repos — +the rule was written on the very branch that was violating its adjacent +principle (working across contexts without labeling which one you're in). + +**The mechanism, named.** The record-keeping habit did not erode gradually; +it stopped at one locatable commit (`c0c1a69`, "board: publication-limit +wording + board-entry rule" — the *first* commit of the 44-commit #852 arc) +and never resumed. Editing the rule's *wording* was mistaken for satisfying +the rule — the documentation-process twin of +`E-VACUOUS-ASSERTION-IS-THE-HOUSE-STYLE-1`, promoted to a P0 rule in +`CLAUDE.md` **the same day**, by the **same session**, about a completely +different subsystem (recipe kernels, `assert!(results.len() <= 10)` where +`truncate(10)` already guarantees it). The session diagnosed "an assertion +implied by the code it tests is not a test" in Rust and then, in its own +process, committed the exact same shape: a board edit that looks like +discharging an obligation and cannot, by construction, verify that it did. + +**Why "shipping" is the wrong signal to watch.** The intuitive alarm for a +degrading session is falling test counts, growing clippy warnings, or +declining commit quality. None of those fired here — #852 alone landed a +real correctness fix (budget-exhaustion conflated with out-of-horizon, +silently escalating every ≥2-hop chain at budget 1) and a rule extension +every later PR in the range was held to. **The signal that actually moved +was a file nobody re-reads mid-session** — `PR_ARC_INVENTORY.md` is a +session-*start* read, not a session-*during* one, so a session that never +stops to re-open it has no internal prompt telling it the file has gone +stale under its own hands. The gap is invisible from inside the session +producing it and only visible from outside, by diffing the ledger against +the PR list — exactly the check this recovery session had to perform by +hand because no earlier session had. + +**Measured cost of restarting without the record.** At least 3 architectural +directions were built and then withdrawn inside #854–#855 alone (the +post-#854 "redo sequence" — belief rows, event rows, evidence edges, +`BeliefHandle`, a PR B–E sequence, all marked ⊘⊘ WITHDRAWN in one ruling; +primer §13 written then superseded by §15 one section later; the cosine- +replacement census re-deriving, across ~6 commits, a conclusion the +**sibling ndarray repo's board had already validated two months earlier**, +dated 2026-05-26). None of these were caused by the ledger gap directly — +but a current `PR_ARC_INVENTORY` is exactly the artifact that would have +let the next session (or the same session, later) recognize "#852 already +tried this shape" before re-trying it. + +**The rule, extending the existing board-hygiene rule rather than replacing +it:** `CLAUDE.md`'s Mandatory Board-Hygiene Rule states *what* must be +written per PR. This adds *when* the check must fire: **a merge-time gate**, +not a start-of-session read — a PR whose diff touches more than a +board-only path without a matching same-PR `PR_ARC_INVENTORY.md` section +should refuse to be treated as mergeable-clean. See the postmortem §5 for +the two falsifier halves (must fire on #852's actual diff; must stay silent +on #851's and the #849→#851 chain's). + +**The twin failure this does NOT excuse:** a merge gate would have caught +the *ledger* omission at #852. It would not, by itself, have caught the +*review-reply* omission (20 threads, 0 replies) — that needs its own gate +(open review threads at merge time), which is a distinct, second guard, not +a free side effect of the first. Naming one failure mode should not be read +as having found the single fix; see `ISS-841-856-NEVER-ANSWERED-REVIEW-COMMENTS` +for the sibling gap this entry does not close. + +Refs: `E-VACUOUS-ASSERTION-IS-THE-HOUSE-STYLE-1` (the same-day code twin of +this documentation defect), `E-AN-UNFILLED-SEMANTIC-SLOT-IS-NOT-A-DESIGN- +INVITATION-1` (one of the three withdrawn-architecture instances this entry +cites as restart cost), `PR_ARC_INVENTORY.md` #851–#856 (reconstructed this +session), `ISS-841-856-NEVER-ANSWERED-REVIEW-COMMENTS`, +`.claude/knowledge/parked-designs-841-856.md`. + ## 2026-07-27 — E-BASE17-CEILING-IS-DIMENSIONAL-AND-THE-GOLDEN-STEP-IS-A-RELABEL-1 — the Base17 fold ceiling is **17 DIMENSIONS**, not the fold's grouping — a random JL-17 projection scores the SAME (0.2615 vs 0.2726). And `GOLDEN_STEP=11` provably carries **zero information**: it permutes bucket LABELS, and every symmetric readout cancels it. **Status:** FINDING (measured, three independent controls). **Confidence:** High — replicated across models and refutes the measuring session's own stated hypothesis. diff --git a/.claude/board/ISSUES.md b/.claude/board/ISSUES.md index 314be614c..3daca8ae9 100644 --- a/.claude/board/ISSUES.md +++ b/.claude/board/ISSUES.md @@ -1,5 +1,157 @@ # Issues Log — Open + Resolved (double-entry, append-only) +## 2026-07-27 — ISS-841-856-NEVER-ANSWERED-REVIEW-COMMENTS — the forensic recovery's full ledger of GitHub review/issue comments across #849–#856 that never received a reply, sorted by whether the underlying finding was fixed anyway + +> Filed by the arc-841-856-postmortem recovery session. Every item below was +> verified directly against the GitHub API (`pull_request_read` / +> `get_review_comments` / `get_comments`) on 2026-07-27, and every "fixed +> forward" claim was cross-checked against the actual diffs of the PRs named, +> not assumed from a later PR's description. See +> `.claude/board/PR_ARC_INVENTORY.md` (#851–#856 entries) for the full +> per-PR context and `.claude/handovers/2026-07-27-2114-arc-841-856-postmortem.md` +> for the process analysis of why these went unanswered. + +### A. #852 — 20 review threads, ZERO replies on the thread itself — content mostly fixed forward in #853, process never closed out + +Every one of #852's 20 review threads (`chatgpt-codex-connector` + `coderabbitai`) +is `is_resolved: false` with `total_count: 1` (bot comment only, no author +reply) as of the API read above. Cross-checked against #853's two follow-up +commits (`92742b1`, `8e71483`): + +- **Fixed forward, verified in the #853 diff** (11 of 20): `meta_basin.rs` + ×3 (recompute-on-perturbation over the complete window; `stability_around` + windowing off a fixed cap; the "marks budget artifacts" test-coverage gap), + `style_strategy.rs` ×2 (eligibility-before-stride; the `cross_family_dissent` + monoculture), `witness_fabric.rs` ×1 (an assertion that couldn't fail), + `cam_pq_scan.rs` ×1 (same), `insight_reason_wired.rs` ×2 (schema-corruption + visibility), `build_alignment.py` ×1 (`houses`/`prizes` mis-stemming). +- **Fixed forward, verified in the #853 diff, Python generators** (6 of 20): + `build_rosetta_probe.py` ×2 (dead row cap, report typo), `closed_class_transfer.py` + ×1 (hardcoded scratch path — **note:** this is a *different* defect in the + same file than the one #853's own review later found unfixed, see §C below), + `fetch_greek_lane.py` ×2 (`--no-fetch` silent network + hardcoded scratch + path), `build_wordnet_rail.py` ×1 (per-POS denominator), `tier_delta.py` ×2 + (WNDB world-writable fallback, `word_b` absence asymmetry — **one of two** + `tier_delta.py` findings from #852; a *third, unrelated* `tier_delta.py` + defect surfaced independently in #853's own review, see §C). +- **Acknowledged but deliberately not reverted** (1 of 20): the coderabbitai + finding that `EPIPHANIES.md` had four historical entries redacted in place + (a private-archive path reference) — #853's board work records a trace + entry stating the redaction stands and why, rather than reverting it. This + is a considered decision, not an oversight, but it was never posted back + as a reply to the originating thread. +- **Fixed forward via board reorganization** (1 of 20): the `TECH_DEBT.md` + append-vs-prepend violation — #853 reordered the file newest-first. +- **No reply ever posted to any of the 20 threads on GitHub**, regardless of + whether the finding was acted on. A reviewer (human or bot) opening PR + #852 today sees 20 apparently-ignored findings, indistinguishable from a + stonewalled review without cross-referencing #853's diff by hand — which + is what this recovery had to do. + +**Status:** content CLOSED (verified fixed or deliberately kept, 19/20); +process gap OPEN and will recur unless a merge-time check requires either a +reply or a cross-referencing commit note before a PR with open review +threads can be treated as done. See the postmortem §5 for the proposed guard. + +### B. #851 — 2 review threads, both P1, both never answered, both still open + +Both threads (`chatgpt-codex-connector`, posted 2026-07-26T10:31:32Z, the PR +merged at 10:34:10Z — three minutes later) dispute the central claim of +`E-CODEBOOK-LICENSE-REGIMES-ONE-ASSET-EACH-1`: + +1. The German codebook's PUBLIC/BY-SA verdict drops HDT's own stated + NC restriction — `build_de_codebook.py:247`'s generated lexicon labels + itself "CC BY-SA / CC BY-NC-SA," an apparent direct contradiction of the + ruling's "commercial-OK BY-SA" classification for the combined codebook. +2. The ruling treats packaging location (Release vs. repo tree) as the + legal ShareAlike/aggregation boundary test; the reviewer argues + adaptation-vs-collection must be determined by the relationship between + the works, and that "keep it in a separate Release" is a project policy, + not itself a legal boundary — a distinction future publishers could miss. + +Neither critique was rebutted, revised, or acknowledged anywhere in #852 +through #856. **Status: OPEN.** One inconclusive lead: `EPIPHANIES.md` (as it +stands after later, unrelated edits) lists "UD German-HDT | CC BY-SA 4.0 +(annotation)" as a table row distinct from GSD, which may gesture at an +annotation-vs-underlying-text licence distinction relevant to critique 1 — +but no commit or comment anywhere in the traced range explicitly connects +that wording to this thread. Treat as UNRECONSTRUCTED, not as a fix. + +### C. #853 — 3 review threads, none answered, none fixed forward (verified absent from every #854/#855/#856 diff) + +1. `closed_class_transfer.py:224` (codex P1) — the evaluation only iterates + `predicted.items()`, excluding every unaligned German token from the + transfer method's false-negative count, while the baseline dictionary + uses the full codebook vocabulary; whenever alignment coverage is below + 100% (which the script itself measures) the two recall/F1 denominators + differ and the headline "transfer beats/loses to baseline" claim can be + wrong. **Distinct from** the hardcoded-scratch-path defect in the same + file that #852's review found and #853 itself fixed — two independent + bugs, one paid down, one not. +2. `meta_basin.rs:466` (codex P2) — `coarse_flags` constructs each basin + from `tail_rows` but reclusters the *complete window* and compares + against the tail-only member set; a non-tail row sharing the basin's + shape falsely marks the basin unstable. **Distinct from** the + `stable_under_perturbation`/`stability_around` findings #852 raised on + the same file, which #853 itself fixed in the same commit pass. +3. `tier_delta.py:318` (codex P2) — when both inputs resolve to the same + non-root synset, `lca_depth_from_root` is hardcoded to `0` instead of + using the same `synset_root_depth` computation every other path uses, + producing an inconsistent depth for identical-synset pairs in the + tier-delta report. + +Confirmed via `git log --oneline b0b6419..62658af -- ` for all three +files: **zero commits touch any of them again anywhere in #854–#856.** +**Status: OPEN**, genuine unpaid technical debt. + +### D. #855 — 15 review threads, all eventually answered (4 pre-merge fixed same-day; 11 post-merge closed out one PR later in #856) + +Not a gap by the time the range ends, but worth recording precisely because +it is the one case in this range where a PR closed with unanswered threads +and the *next* PR explicitly, itemizedly closed every one of them (posted as +an issue comment on #855 itself, `2026-07-27T16:51:39Z`, listing all 11 by +number with CONFIRMED/rejected verdicts). This is the pattern #852 and #853 +should have followed and didn't. **Status: CLOSED**, cited here as the +counter-example. + +### E. #856 — 3 review threads posted around merge time, none answered, one substantive and unresolved + +1. **(codex P1, substantive, unresolved)** — disputes this PR's own headline + finding ("the Base17 ceiling is dimensional, not the fold's grouping") by + citing a **pre-existing measurement already in the same file's history** + (`EPIPHANIES.md` former lines 3899–3901: naive PCA-17 scored Spearman + 0.72 on raw Jina vs. the golden fold's 0.32). Argues that scoring one + random Gaussian JL draw with L1 cannot establish that *no* trained or + data-dependent 17-dim projection escapes the ceiling, and that closing + the "tighter projection" payable option on this basis risks prematurely + killing a promising line of work. **This is a live, unresolved challenge + to a finding this ledger and `TECH_DEBT.md`'s `TD-BASE17-FOLD-CEILING- + SINGLE-WORD` entry currently treat as settled** (`E-BASE17-CEILING-IS- + DIMENSIONAL-AND-THE-GOLDEN-STEP-IS-A-RELABEL-1`). Recommended next step: + re-run the probe with a PCA-fitted (not random) 17-dim projection on the + *same* sample and readout as the golden fold, and either reconcile the + 0.72-vs-0.32 figure or explain why it doesn't transfer to this probe's + setup. **Status: OPEN, and should gate reliance on the dimensional- + ceiling finding until answered.** +2. **(coderabbitai, minor)** — `F32-RETIREMENT-SCOPE.md` is missing a + required `file:line` citation. **Status: OPEN, trivial.** +3. **(coderabbitai, major, self-referential)** — the very corrections this + PR made to the trace files (rewriting "6" to "7" call sites, "276" to + "308" bytes, etc.) were applied by editing historical text in place + rather than by prepending a dated correction — exactly what CLAUDE.md's + append-only board-hygiene rule (itself extended by #853 the same week) + forbids. **Status: OPEN** — ironic given #856 itself closed out a + similar finding against #852 in its own PR body. + +**Confidence (2026-07-27):** all six sub-sections above are sourced directly +from the GitHub review-comment API, cross-checked against `git log` for the +"fixed forward" claims. Section A's 19/20 "fixed" count is the one synthetic +judgment call in this entry — it required matching each thread's file/line +against #853's commit diffs by hand, since no thread was ever marked +resolved with a linking comment; treat individual file attributions in §A as +high-confidence but not GitHub-verified in the way §C's "confirmed absent" +claim is (that one is a mechanical `git log` fact, not a judgment). + ## 2026-07-27 — ISS-CONTRACT-DISTANCE-IS-THE-FORBIDDEN-UMBRELLA + ISS-COSINE-REPLACEMENT-SOURCES-CONTRADICT — **section B RESOLVED (dissolved, §E); section A STANDS and is STRENGTHENED (§E, §G measured zero consumers); section D OPEN (typed per-metric surface unbuilt)** > Status line updated 2026-07-27 (was: `OPEN`) so the heading matches §E/§G diff --git a/.claude/board/PR_ARC_INVENTORY.md b/.claude/board/PR_ARC_INVENTORY.md index ec1adb2b7..639e514be 100644 --- a/.claude/board/PR_ARC_INVENTORY.md +++ b/.claude/board/PR_ARC_INVENTORY.md @@ -33,6 +33,85 @@ > - **Docs** — knowledge files produced (immutable) > - **Confidence (YYYY-MM-DD):** — the ONLY mutable field +## 2026-07-27 — lance-graph #856 — Base17 fold ceiling measured DIMENSIONAL + GOLDEN_STEP proven a relabel + #855's 11 post-merge review comments closed + +> **Recovery note (2026-07-27, forensic session):** this entry, and the five below it down through #851, were reconstructed after the arc's memory practice broke down for six PRs in a row (#851–#856): no `PR_ARC_INVENTORY` entry was written for any of them at the time, and no handover was left. Sourced only from merged diffs, commit messages, PR bodies, and the GitHub review-comment record — never from inference. See `.claude/handovers/2026-07-27-*-arc-841-856-postmortem.md` for the full account of how the gap happened. + +**Merged:** `62658af` (branch `claude/medcare-rs-transcode-ruff-3y2olh`, commits `0578a52`..`15f9b0a`). 2 commits, 10 files, +574/−26. + +- **Added** — `crates/bgz17/examples/probe_base17_fold_ceiling.rs`: real bytes only (all-MiniLM-L6-v2 `word_embeddings.weight`, 30522×384, sha256-pinned), 4096 rows → 20,000 pairs, SplitMix64 seed. Measured Spearman ρ vs exact cosine at width 384: `golden` fold 0.2726, `exact` (no i16 rounding) 0.2756, `block` (contiguous means) 0.2660, `jl-17` (random Gaussian JL) 0.2615, `golden` vs full-width L1 0.5830. +- **Added (finding)** — `E-BASE17-CEILING-IS-DIMENSIONAL-AND-THE-GOLDEN-STEP-IS-A-RELABEL-1`: the ceiling is **dimensional**, not the fold's grouping — a random 17-dim JL projection scores 0.96× the shipped fold, so no choice of 17-dim projection escapes it. Refutes the hypothesis the measuring session stated *before* measuring ("a tighter projection will beat it"). Closes `TD-BASE17-FOLD-CEILING-SINGLE-WORD` payable-option (b) as a measured dead end — only "more dimensions" and "structured input" remain. Also proves `GOLDEN_STEP=11` carries **zero information**: `GOLDEN_POS[i]=(i*step)%17` with `gcd(step,17)=1` is a pure bucket-label permutation, and every symmetric readout (`l1`, `sign_agreement`) cancels it exactly — L1 is bit-identical across steps {1,2,3,5,7,11,13}. +- **Added (review-fix pass)** — 8 of CodeRabbit's 11 post-merge comments on #855 confirmed and fixed here (see #855's Review entry below for the full itemization): trace-B's "6 deinterlace call sites" corrected to 7; trace-C's `480−172` arithmetic corrected from 276 to 308; a stale "5 of 14" self-correction removed; trace-D's `AdjacencyBatch` reclassified RESOLVED in place (the audit had been reporting its own #855 fix as an open violation — original classification kept per append-only, not deleted); `reasoning_loop.rs`'s HLC doc-comment re-scoped (it conflated `QueryReference::hlc_tick`, always `None`, with `DeinterlaceRow::hlc_tick`, `Some` in test rows); `TECH_DEBT`/`AUDIT-FIXLIST` reconciled on `kanban::Commit` as the 4th doc-comment site; `F32-RETIREMENT-SCOPE.md` unescaped table pipes fixed; cosine-census's stale "`contract::distance()` is the migration target" framing relabelled as historical. 1 already covered by `ef090b7`. 2 rejected with evidence (trace-B's claimed column mismatch — counted mechanically, none exists; "mark §A superseded" — §E says verbatim "Section A stands and is STRENGTHENED", declined as an inversion of the recorded ruling). +- **Locked** — quantization is not the cap (unrounded 0.2756 vs stored-i16 0.2726, a 0.003 gap, asserted); replicates the earlier jina-v3-1024 ρ=0.2599 finding on a different model/width, same ceiling; measured input CV (0.153–0.176) places this input at the low end of the existing CV-sweep axis, so the two findings compose rather than conflict. +- **Deferred** — the WordNet centroid-ancestry falsifier (specified in #851/#852, still not run): it was built on a 16×16 two-level codebook, but the canon cascade shape is 4⁴ (four levels of 4-ary, Morton-interleaved 2bit×2bit per level) — withheld pending a rebuild on the correct shape, explicitly **not** run in this PR either. +- **Review** — 3 NEW threads posted on #856 itself around merge time (17:05–17:11Z; merged 17:08:15Z), **none replied to, none resolved**: (1) codex P1, substantive — disputes the core finding by citing a **pre-existing measurement in the same file's history** (`EPIPHANIES.md` former lines 3899–3901: naive PCA-17 scored Spearman 0.72 on raw Jina vs the Base17 fold's 0.32), arguing that one random Gaussian JL draw scored with L1 cannot establish that no trained/data-dependent 17-dim projection escapes the ceiling, and that closing the "tighter projection" option on this basis risks prematurely killing a promising line of work. This directly contests the PR's headline conclusion and was never answered. (2) coderabbitai, minor — a missing `file:line` citation in `F32-RETIREMENT-SCOPE.md`. (3) coderabbitai, major — **self-referential**: the very corrections this PR made to the trace files (rewriting "6" to "7", "276" to "308", etc.) were applied by rewriting historical text in place rather than by prepending a dated correction, which is exactly what CLAUDE.md's append-only board-hygiene rule (itself extended by #853) forbids. Neither finding was acted on before the session's memory failure became total. +- **Docs** — `EPIPHANIES.md`, `TECH_DEBT.md`, `ISSUES.md`, `exec-runs/cosine-census-CONSOLIDATED.md`, `F32-RETIREMENT-SCOPE.md`, `exec-runs/trace-{B,C,D}-*.md` all touched for the review-fix pass. +- **Confidence (2026-07-27):** the probe and its findings are measured and reproducible (asserted falsifiers). The unanswered codex critique (item 1 above) is a genuine open question about the strength of the "dimensional, not fold-shape" conclusion — it is **not** addressed by this entry and should be resolved (either by re-running with a PCA/trained 17-dim projection on the same sample+readout, or by explaining why the cited 0.72/0.32 figures don't apply) before the finding is relied on further. The board-hygiene self-violation (item 3) also stands unresolved. + +## 2026-07-27 — lance-graph #855 — §12 substrate trace lands; palette256/[a,b] canon measured; furnace amortization + FisherZ certified; zero-copy AdjacencyBatch + +**Merged:** `a8f1881` (branch `claude/medcare-rs-transcode-ruff-3y2olh`, commits `3262828`..`ef090b7`). 32 commits, 30 files, +5,449/−70. Per its own body: "4 touch production code (small, gated, tested), 3 add probe examples, the rest are trace results, rulings, and board hygiene." + +- **Added (production code)** — `AdjacencyBatch` (`adjacency/batch.rs`, `csr.rs`, `propagate.rs`) changed from an owned 3-`Vec` struct built fresh per `batch_adjacent` call to a borrowed `store + &[u64]` view over state the store already lends zero-copy; `IntersectionResult` stays owned deliberately (a genuine derived join product). 9/9 adjacency tests, clippy `-D warnings` clean. +- **Added (probes)** — `probe_furnace_amortization.rs`: L1–L7 furnace lanes measured end to end, 193→9 ns/candidate (`[a,b]` vs exact float), L2-only break-even at 0.13 of one pass, bf16-RNE transport 1.000000/1.000000, ingest 5.3 µs/row once → 6 B/row forever. **HHTL awareness-location proven falsifiably**: same-HEEL pairs measure 20% closer than random (ratio 0.7981) while a shuffled-code control stays silent (1.0711) — both directions fire. `probe_palette256_ndarray.rs`: `ndarray::simd::kmeans` codebook lifts ρ 0.8494→0.9725 vs exact (the earlier session's hand-rolled-codebook confound, now measured and corrected); **`impl Distance for [u8;6]` measures as pure noise** (ρ −0.0030) with zero production consumers found by grep. bgz-tensor `probe_l5_fisherz_amortization`: `FisherZTable` **certifies** — Spearman 0.9998 (gate ≥0.9990), 1.86 vs 35.6 ns/lookup vs float cosine; the L5 γ-fold is honestly reported as **not validated** (the probe folded random rows against the fold's own CLAM-family precondition). +- **Added (trace)** — the §12 substrate trace, 4 read-only lanes (`exec-runs/trace-{A-write-path,B-writer-key,C-value-slab,D-allocations}.md`): the substrate write path is **unbuilt** — `MailboxSoA` never implements `SoaEnvelope`, no Lance-version-producing code exists anywhere in `crates/`, `BatchWriter::cast()` has zero production call sites, `deinterlace` is test-only end-to-end with no HLC producer anywhere in the workspace. `NodeRowPacket` reclassified **RESOLVED-LEGAL** on a focused re-read (trace A had flagged it as a possible copy; it is in fact the sanctioned zero-copy LE view the Lance sink drains). +- **Added (docs)** — primer §14 (the trace results, inverting §13's premise), §15 (§13 formally superseded — "de facto authoritative" ≠ "architecturally canonical"; three-column live-vs-contract table replaces the two-column one), §16 (the serialization-boundary discriminator: ephemeral/thinking-scratch is free, persistent requires proving meta-awareness-or-substrate-convergence, serialization is never permitted), §17 (evidence-as-edges — closes the primer's original evidence-identity question, then self-corrects mid-section to the V3 facet register over the V1 `EdgeBlock`). `AUDIT-FIXLIST-2026-07-27.md` (18 items, P0 = one dependency chain: tenant → owner mutation → Kanban → cast → Lance write → temporal read, all four links missing). `BF16-HIGH-VALUE-LANES`, `F32-RETIREMENT-SCOPE` (identification only). The cosine-replacement census concluded: `contract::distance::Distance` is the forbidden umbrella pattern the ndarray-side typing doc prohibits (one trait, three metrics, one untyped `u32`), with **zero production consumers measured**; palette256 + `[a,b]` table reads are the sole canon at all three cascade scales (popcount/Base17-L1/pair-table); `FisherZTable` is demoted from "certified cosine replacement" to "a permitted decode, never a stored column" (the ruling had already been recorded in primer §13 hours earlier and was independently re-broken by finding `FisherZTable` and re-crowning it). +- **Locked** — the no-transfer ruling stands: no `BeliefArena` migration, no f32 value migration, no new carriers, nothing serialized, in this PR. +- **Deferred** — completing the missing write-path link (`MailboxSoA → SoaEnvelope → Lance write`, P0 #1); a production HLC producer (P0 #2); a resident tenant for rung/contradiction/premises/evidential-base (P0 #3/#4); the `[u8;6] Distance` impl's removal/rename (P1, code-ready); the `cargo fmt`-breaking dangling `container_bs::tests` module declaration (flagged, needs an intent call, not fixed here). +- **Review** — 4 pre-merge codex threads, **all confirmed and fixed same-day** in `ef090b7`: the amortization probe's PASS verdict was itself a vacuous assertion (`exact_ns > lut_ns` is implied by the code) — fixed by charging build cost against `(exact_ns−lut_ns)×session_reads`, reported for both a marginal (L2-only, pays within 0.11 passes) and cold-start (L1+L2, 8.2 passes, deliberately left unasserted) charging model; both new probes lacked a row-count guard before an unbounded sampling loop that would spin forever on an undersized shard — fixed with asserted guards, verified to fire on a truncated shard; the committed reproduction command pointed at a session-local `/tmp/claude-0/...` path that panics for anyone else — fixed to require the shard path as an argument with a usage message naming the published, SHA-pinned Release asset. **11 post-merge CodeRabbit threads** (posted 16:25Z, *after* the 16:22:29Z merge) were left open at merge time — 8 confirmed+fixed, 1 already-fixed, 2 rejected-with-evidence, all resolved one PR later in #856 (see that entry). So at the moment this PR closed, its own review conversation had 11 unanswered threads; they did not stay that way, but the answering happened in the next PR, not this one. +- **Docs** — primer §14–§17; `AUDIT-FIXLIST-2026-07-27.md`; `BF16-HIGH-VALUE-LANES-2026-07-27.md`; cosine-census consolidation; `ISSUES.md`/`TECH_DEBT.md`/`AGENT_LOG.md` per the board-hygiene rule. +- **Confidence (2026-07-27):** working — the 4 production-code commits are small, tested, and gated; clippy/adjacency tests green. The trace and rulings are descriptive findings, not implementations — no code in this PR builds the missing write path it identifies (correctly, per the no-transfer ruling: build the seam first, then move). + +## 2026-07-27 — lance-graph #854 — causality audit implemented (typed causal edge, settlement, kernel effect census) — **and `source_registry` withdrawn as a falsified design** + +**Merged:** `ec737e3` (branch `claude/medcare-rs-transcode-ruff-3y2olh`, commits `1064d96`..`b0711f8`). 16 commits, 33 files, +2,696/−231. + +- **Added** — `causal_audit`: the typed causal edge — kind (sum type; a non-causal relation cannot carry a locus), **locus** (`World`/`Interpretive`/`Derivational`/`Experiential` — *where in the architecture*, not subject matter), domain, scope (`Type`/`Token`). Support is a many-of receipt ledger (an edge can be text-attested *and* derivationally traced *and* cross-environment invariant simultaneously); `is_intervention_established()` requires both a causal classification and an `InterventionBacked` receipt. `settlement`: four signals, never a score — discriminator is closure×competence (`Crystal`/`Glass`/`GroundedUnresolved`/`Fog`); `field_entropy`/`eigenvalue_concentration` refine a cell but are pinned by test never to move it. `Tactic::{writes, maturity}` + a full effect census over all 34 recipe kernels, falsifying an earlier grep-based audit claim: **15 kernels return `delta_conf=0.0` on every branch while mutating `ThoughtCtx`** (`run` calls `apply` before adding the delta, so the return value says nothing about the mutation `apply` performed inside its own body); split 27 Operational / 6 Demonstration / 1 Stub, 7 falsifier tests; `Lsi`'s declared-input/actual-output mismatch on `Sd` also fixed. `VersionedSnapshot` (owned `arena_id`, epistemic view kept as a `QueryReference` — a `Retro` reading is not the same observation as a `Strict` one). `world::substitute_binding` (renamed from `intervene` — severs no mechanism, recomputes no descendants, holds no exogenous background fixed; the algebra was sound, the do-calculus claim was not). **Breaking:** `KanbanMove::libet_offset_us` removed, `libet_window_us()` derives it instead — an orthogonality audit found variation in one direction only (the transition can vary while the offset holds; nothing makes the offset vary while the transition holds) — migrated across 9 workspace crates plus `symbiont` and `onebrc-probe`. +- **Locked (REVERSAL — read this as a withdrawal, not an addition)** — `source_registry` (`contract::source_registry`, stable-id-to-dense-slot mapping) and both `BeliefArena` migrations onto it (planner + `deepnsm-v2`) were **built across 7 commits** (`0d1e566` contract, `f4e1576` settlement, `cbed5a4` VersionedSnapshot, `89a80f9`+`114e58c` libet removal in excluded crates, `4bf9fd7` "migrate BOTH BeliefArenas") **then reverted in full** (`b085048`) before merge, on four converged findings: (1) the `disjoint()` guard exists for NARS revision admissibility — one evidence **event** must never be counted twice through different derivation paths — but `SourceId` models source **membership**, so one sensor observing twice could never raise confidence: repetition becomes worthless, not a rare collision but the disabling of the most basic form of evidence accumulation; (2) **no canonical evidence-event identity exists in this codebase**, verified against the actual types, not their names (`ClassId` is `u16`, the GUID's `classid` is a `u32` composite — two types, one word; `ClassView` is a late-bound projection trait; `AppPrefix::Core` is documented "no render lens"; `LanceVersion` is a dataset snapshot) — the closest candidate, `ClassId:AppId:ClassView + version`, names a field projection under a rendering interpretation as of a commit, which fails 4 of 6 ingestion cases (two rows of one class in one commit collide; **re-observing an unchanged value mutates nothing at all**; one observation can span many rows; an external statement mutates nothing); `NodeGuid` cannot substitute (its own `debug_assert_identity_unique` message admits "or reused", and it is debug-only); (3) a fixed-width digest measured **safe but useless**: 20,000 trials/cell, `digest_a & digest_b == 0` query — P(false overlap) ≈ n²/m at k=1 (6.1% at n=2/m=64, **63.4% at n=8/m=64**), and k>1 is **catastrophic even though it improves membership queries** (98.1% at n=8/m=64/k=2) — never false-disjoint (safe), but starves revision two times in three at realistic sizes (useless); (4) `bool disjoint()` cannot distinguish "not known to overlap" from "known disjoint" — needs tri-state. Codex and CodeRabbit independently converged on the 64-source ceiling from four different angles during review; **CodeRabbit's own prescribed fix ("reuse a bounded `SourceId`") was explicitly rejected** — minting one identity per distinct observation is the *correct* behaviour, and bounding it would have turned every symptom green while making the semantic error permanent. The restored local `Stamp` (source-membership semantics, no breaking API, no 64-source ceiling on the *pre-cast* path) is kept as the pre-PR baseline — **rollback, not endorsement**. +- **Deferred** — `EvidenceEventId` over a canonical immutable receipt; `EvidentialBase` exact-inline-with-`overflow→Unknown` + a ledger fallback (no eviction ⇒ no false disjointness); `OverlapKnowledge` and `Independence` both tri-state; what guarantees two independently-minted events cannot collide (deferred to the mailbox/ingestion/persistence ownership model, not numeric capacity). +- **Review** — 9 threads. 3 resolved as **"withdrawn by ruling"** rather than fixed (the registry-containment critique and the `CapacityExceeded`-mislabelled-as-`BlockedSelfReference` critique — both correct diagnoses of code that no longer exists after the revert; the session's reply on the latter is worth keeping: `cast()` is documented "NEVER refused", so a resource-exhaustion `Result` on the pre-cast path had only three possible landings across the PR's own draft — mislabel it, `.unwrap()` it in the examples, or swallow it in `reach_out_integrate`'s `let _ =` — "all three appeared in review"). 1 genuine bug **confirmed and fixed**: `causal_audit::profile()` summed `strength` across repeated receipts from *one* source, so three repetitions of one attestation read as three independent ones — contradicting the module's own doc-comment guarantee; fixed with a per-basis `BasisProfile{receipt_count, distinct_source_count, total_strength, independent_strength: Option}`, `total_strength` now documented as a volume reading with a test asserting it *cannot* distinguish the two cases (the limitation made behaviour, not a latent surprise). 1 substantive correction to the board itself: `LATEST_STATE.md` said the restored `Stamp` carries "no global ceiling" — false; `Stamp::source(id) = 1 << (id % 64)` is a bounded 64-slot horizon where ids 0 and 64 alias — fixed, with the session noting the primer already stated the distinction correctly in the same session, "same author," while the board file contradicted it. Remaining 4 threads are doc/fmt fixes, all replied to and fixed (`substitute_binding`'s hand-wrapped-not-`fmt`'d signature, surfacing along the way that `cargo fmt` **cannot run on `lance-graph-cognitive` at all** because `container_bs/mod.rs:35` declares a `#[cfg(test)] pub mod tests;` with no `tests.rs` — flagged, deliberately not fixed here since which repair was intended is ambiguous). **Every thread on this PR received a reply** — the one PR in the damaged range that closed its review conversation out completely. +- **Docs** — primer gained 6 dated sections in-line documenting the attempt-then-withdrawal live (`docs: primer — the fire-and-forget execution model and what PR #854 broke` is one commit's actual title); `EPIPHANIES.md` × 3 (`E-EVENT-IDENTITY-IS-NOT-SOURCE-IDENTITY-AND-WE-HAVE-NEITHER-1`, `E-A-LOCAL-BITSET-IS-NOT-SELF-DESCRIBING-PROVENANCE-1`, `E-THE-UNCONTESTED-AXIS-IS-THE-ONE-THAT-MERGES-1`); `LATEST_STATE.md`. +- **Confidence (2026-07-27):** working — 1093/319/96/5 tests (contract/planner/deepnsm-v2/cognitive), `cargo check --all-targets` clean, no new warnings, board updated same-commit. The withdrawal is the deliverable as much as the shipped code: `event identity ≠ evidential-base membership ≠ source dependence ≠ object/view identity ≠ dataset version` is recorded as the result that outlives the reverted code. + +## 2026-07-27 — lance-graph #853 — causality audit ("Pearl vocabulary, not the Pearl operator"); 13 generators restored; falsifiability rule extended; **the arc boundary runs through this PR's own commits** + +> This PR's body was rewritten post-merge by the same session that merged it, because the original omitted the head commit entirely. Both versions are summarized here for the record; see the PR body itself (`f2ee993`'s description) for the full correction note. + +**Merged:** `b0b6419` (branch `claude/lance-graph-last-10-pr-z30uij`, commits `92742b1`..`f2ee993`). 3 commits, 30 files, +8,608/−121 — the size is misleading: 85% of the additions are 13 restored generator files (7,166 lines), not new work. + +- **Added** — the causality audit (`f2ee993`, the commit the original PR description omitted entirely): **"we have the Pearl vocabulary, not the Pearl operator."** Three specific absences: (1) nothing severs — no mechanism-disabling, no invalidation of evidence derived from a node's old parents, no descendant recomputation; the only `lineage` in the tree is `upsert_with_lineage`, which is storage versioning, not evidence ancestry; (2) Recipe 31 (`Icr`) is a stub wearing a Pearl label — `_ctx` unused (identical output for every input, so no test can fail it), three hardcoded `u32` constants, confidence contribution × `0.0` — now labelled a stub in source; (3) four kinds of cause share one untyped edge (World / Interpretive / Derivational / Experiential), each needing a different intervention — an experiment proving a token caused a parser decision can currently be filed as evidence the token's *concept* caused the narrated event, a category error that reproduces exactly. Also recorded: `nars::InferenceType` has no `Intervention`/`Counterfactual` variant while `CLAUDE.md`'s own I-LEGACY-API-FEATURE-GATED discusses `InferenceType::Counterfactual` — the three recorded copies of this type have different variant sets, so "the contract is canonical" is false for it today. Ruling: **audit before build** — classify every causal edge by locus and support-kind before adding causal machinery (filed as `ISS-PEARL-VOCABULARY-WITHOUT-PEARL-MECHANICS`; the actual typed-edge implementation followed one PR later, in #854). +- **Added (rule)** — `CLAUDE.md`'s falsifiability rule gained its can-it-**stay-silent** twin: "a guard that fires on everything carries exactly as much information as one that never fires." Measured over 36 styles × 5 rungs at `tol=0.0`: same-family dissent fires 114/180, cross-family 144/180 — both discriminate, neither is degenerate, but 80% firing at zero tolerance flags `tol` itself as an uncalibrated, load-bearing knob. +- **Added (review-fix pass, `92742b1` + `8e71483`)** — nine-plus fixes carried forward from #852's 20 unreplied review threads (see that entry's Review section for the full mapping): `meta_basin.rs` (`stable_under_perturbation` now re-clusters the complete window so basin *merges* are caught, not just internal disagreement; `stability_around` now centres on the caller's own budget instead of a fixed cap a 255-budget caller fell outside of); `style_strategy.rs` (`peripheral_sample_where` applies eligibility *before* the stride, so ineligible watchers can no longer spend the whole sample budget; new `cross_family_dissent` channel — the existing dissent channel only consulted watchers sharing the style's own Mechanism, a monoculture by construction); `witness_fabric.rs` (the disjointness check compared whole structs whose derived `PartialEq` made it structurally always-true — now compares run identity); `cam_pq_scan.rs` (the anti-vacuity assertion was itself vacuous, `results.len()` already pinned above it — now measures survivors); `insight_reason_wired.rs` (partial schema corruption was invisible; the new arity-mismatch guard had no can-it-fire test — both fixed with fixtures); six Python generators (`build_alignment.py` — `houses`/`prizes` mis-stemming fixed; `build_rosetta_probe.py` — dead row cap + a report typo; `closed_class_transfer.py` — hardcoded session-`/tmp` scratch path replaced with env→cwd→exit; `fetch_greek_lane.py` — `--no-fetch` silently performed network fetches on two paths, now refuses explicitly, plus its own hardcoded scratch path; `build_wordnet_rail.py` — per-POS error rate divided by the wrong denominator, understating the rate, though the published 14.33%/33.84% figures didn't move on re-run; `tier_delta.py` — an absent `word_b` was silently read as a measured `NO_COMMON_ANCESTOR` result instead of "absent", plus a world-writable `/tmp/wn/dict` fallback made ownership-gated). +- **Locked (reproducibility)** — 13 generator/probe files (7,166 lines) restored to `main` and the plateau branch's local `.gitignore` rule reverted: that rule had re-ignored, by last-match-wins, the exact files three `!`-negations in the same `.gitignore` were written to track, under a rule the file states three separate times ("data in Releases, CODE IN REPO"). `main` had been left holding the measurement receipts while the instruments that produced them lived on a different branch. +- **Deferred** — `ArgumentStatus` governed-vs-circumstantial `obl` split (inherited from #849, still open); the Level-3 PROMOTION experiment (inherited from #849, still open, ratified but not run anywhere in this range). +- **Review** — **3 NEW threads posted on this PR, all never answered, and — confirmed by re-checking every subsequent diff through #856 — never fixed forward either.** These remain open findings as of the end of the traced range: (1) codex P1 on `closed_class_transfer.py` — iterating only `predicted.items()` excludes every unaligned token from the transfer method's false-negative count while the baseline dictionary uses the full vocabulary, so the headline recall/F1 comparison can be wrong whenever alignment coverage is below 100% (which the script itself measures); this is a *different* bug from the one #852's review already found and #853 fixed in the same file (the hardcoded scratch path) — same file, two independent defects, only one paid down. (2) codex P2 on `meta_basin.rs:466` — `coarse_flags` reclusters *every row in the complete window* and compares that cluster against the tail-only member set, so a non-tail row sharing the basin's shape falsely marks the basin unstable; distinct from the `stability_around`/`stable_under_perturbation` findings #852 raised and this same PR fixed in the same file. (3) codex P2 on `tier_delta.py:318` — when both inputs resolve to the same non-root synset, `lca_depth_from_root` is hardcoded to zero instead of using the same `synset_root_depth` computation every other path uses, so identical-synset pairs get an inconsistent depth in the tier-delta report. +- **Docs** — `TECH_DEBT.md` reordered newest-first (paying down one of #852's unreplied board-hygiene findings); a mis-transcribed before/after number pair corrected by *appending* to the exec record rather than rewriting it (paying down another); a trace entry acknowledging the in-place redaction of four historical `EPIPHANIES.md` entries (a private-archive location reference) — the redaction itself was left standing, with the reasoning recorded rather than reverted, which is the honest resolution of the third #852 board-hygiene finding, not a fix of it. `ISS-PEARL-VOCABULARY-WITHOUT-PEARL-MECHANICS`; 4 `exec-runs/*.txt` tag files. +- **Confidence (2026-07-27 — recovery session):** the causality-audit content and the falsifiability-rule extension are solid, dated, sourced findings. The three new review threads (above) are genuinely open technical debt, not merely unreconstructed history — they were verified absent from every later diff in the range. **This is also the commit range where the arc's memory practice starts to fail**: the PR mixes a genuinely new topic (causality audit) with cleanup of a *different* PR's unanswered reviews in one merge, which is exactly why the #841–856 arc boundary cannot be read cleanly off the PR list alone (see the postmortem, §"where the thread was lost"). + +## 2026-07-26 — lance-graph #852 — Rosetta convergence arc + rung-stratified standing wave + anti-eigenvalue guards (44 commits) — **20 review threads opened, zero replied to** + +**Merged:** `2f419c8` (branch `claude/lance-graph-last-10-pr-z30uij`, commits `c0c1a69`..`31a2dc9`). 44 commits, 50 files, +7,591/−417. + +> **Description-drift note:** the merged PR's own body claims "55 files, +12,207/−73" and "1,061 contract + 312 planner + 207 bgz-tensor + 96 deepnsm-v2 tests green." The actual merged diff (`git diff --stat c0c1a69..2f419c8`) is 50 files, +7,591/−417. UNRECONSTRUCTED — no evidence in the commit history, review comments, or later PRs explains the discrepancy; it is not a transcription error made by this recovery session (both figures are quoted verbatim from the live PR body via the GitHub API on 2026-07-27). Flagged per CLAUDE.md's doc-truthfulness expectation, not silently corrected. + +- **Added** — Rosetta substrate (plan `rosetta-codebook-convergence-v1.md`): 5 PD verse-keyed lanes on one frozen key (en / de×2 / cs / el — Tischendorf 8th ed., stated Public Domain; explicitly **not** TR or WH, both CC BY-NC-SA, so "age implies PD" is false for transcriptions), 31,097/31,103 rows common across lanes. `build_rosetta_probe.py` v2, `build_alignment.py` (PMI/Dice; `tongue→Zunge/Sprache` reproduced), `build_lane_codebooks.py`, `fetch_greek_lane.py`, `closed_class*.py`, WordNet v2 rail (v1 measured 12.76% wrong-sense, 33.84% on verbs). Thinking substrate: pass ↔ `RungLevel` ↔ recipe admissibility (4→11→24→34, derived from the recipes' own Bucket/Tier semantics); `standing_wave_stratified` with a **multipass bug fixed** — the wave escalated at budget 1 for every ≥2-hop chain because budget-exhaustion was conflated with out-of-horizon; `ChainResolution` carrier split so the conflation is now unrepresentable in the type. Passive `quorum_mantissa`, `TrajectorySignature` + CHAODA relative-density over a proven integer metric, `RevisionTrajectory` (version-axis read-as-of), temporal periphery (`BeliefRun`, reopening suggestions). Peripheral channels for the two worst blind prunes: `peripheral_dissent` (rung gate) and `CascadeRejects`+`ThresholdDissent` (CAM-PQ cascade); `WitnessWindow` threaded into `PlanContext`. +- **Locked** — cascade recall@10 = **0.50** measured on a new falsifier ("99% rejection" not reproduced — actual 76.4%); shipped `heel_threshold: 50.0` measured **inert** (max sub-distance in the fixture is 25.5, so the threshold never binds — "stroke 1 is dead code on this fixture"). Two closed-class detectors measured **losing** to a bare `rank<=150` heuristic (F1 0.277/0.280 vs 0.386–0.388) — a negative result, recorded as "stop searching" rather than iterated on. Coverage-inversion claim **refuted** (WordNet coverage rises with frequency: 97.6% top decile vs 84.3% bottom decile — the opposite of what had been assumed). Lemma-key coverage lift (39.2→43.0% German) **broke** the `tongue` anchor test (a `-chen` suffix rule splits `sprache`/`sprachen` into two different fold keys) — shipped opt-in, default OFF. A 12-prune eigenvalue sweep found 6 clean / 6 blind prunes; the **vacuous-assertion house style** (7 instances found this session, e.g. asserting that `truncate` truncates) was promoted to a P0 rule in `CLAUDE.md` the same day. +- **Deferred** — largely superseded one PR later by #853's causality audit and #854's typed causal edge; nothing in this PR's own deferred list survived un-superseded through the end of the range. +- **Review** — **20 review threads opened on this PR (plus 5 issue-level comments, all Bugbot-usage-limit / CodeRabbit-rate-limit tooling noise, no technical content). Every one of the 20 review threads received zero reply on this PR** — none marked addressed, none acknowledged, before merge or after. Cross-checked against the two follow-up commits that landed one PR later (#853's `92742b1` and `8e71483`): **essentially all 20 findings were in fact fixed**, just not on this thread — `meta_basin.rs` (3 findings: recompute-on-perturbation, `stability_around` windowing off a fixed cap, a test not exercising its own stated coverage), `style_strategy.rs` (2: sampler eligibility ordering, the dissent-channel monoculture), `witness_fabric.rs` (1: an assertion that couldn't fail), `cam_pq_scan.rs` (1: same), `insight_reason_wired.rs` (2: schema-corruption visibility), 6 Python generators (`build_alignment.py`, `build_rosetta_probe.py` ×2, `closed_class_transfer.py`, `fetch_greek_lane.py` ×2, `build_wordnet_rail.py`, `tier_delta.py` ×2 — one of `tier_delta.py`'s two #852 findings, not to be confused with the *third*, unrelated `tier_delta.py` finding #853 later surfaced independently), and 2 board-hygiene findings (an in-place historical edit to `EPIPHANIES.md`, later acknowledged-but-kept rather than reverted; an append-vs-prepend violation in `TECH_DEBT.md`, later reordered). **This is a process gap, not (mostly) an outcome gap**: the code got fixed; the review conversation did not get closed out. Anyone reading PR #852 on GitHub today still sees 20 apparently-ignored findings with no replies, which is indistinguishable from a stonewalled review unless the follow-up PR is known and cross-referenced — which is exactly the check this recovery session had to perform by hand. +- **Docs** — 20+ `EPIPHANIES.md` entries (including the self-refutations); `STATUS_BOARD.md` D-RCC rows; `TECH_DEBT.md` (COCA lexicon `rank` *and* `pos` columns both flagged unreliable for function words); licence table per lane; plan updated in place. +- **Confidence (2026-07-27 — recovery session):** the Rosetta/rung-stratification content is solid and measured, including its self-refutations. The 20-thread review gap is the headline process finding of this entry — see `.claude/board/ISSUES.md` for the per-thread ledger and the postmortem for the "why did 20 replies never get sent" analysis. + +## 2026-07-26 — lance-graph #851 — Codebook licence regimes (one Release asset per regime) + PR-arc entry for merged #850 + +**Merged:** `c266f57` (branch `claude/lance-graph-last-10-pr-z30uij`, commits `4b29425`..`661fd74`). 2 commits, 2 files, +36/−0. Board-only — no source or contract change. + +- **Added** — `E-CODEBOOK-LICENSE-REGIMES-ONE-ASSET-EACH-1`: a licence-regime table for every codebook source the arc had touched, each licence fetched and read rather than assumed. UD German-GSD/HDT, theographic-bible-metadata, and WordNet (Princeton + OEWN, CC BY 4.0 — the most permissive asset held) are Release-eligible; PROIEL (CC BY-NC-SA — NonCommercial) and COCA (commercial) are not; NTN (SemanticBible) was unverified and stayed local. Rule: **one Release asset per licence regime, never bundled** — packaging a permissive lane together with an NC-derived one silently makes the *combined* asset NonCommercial. The `PR_ARC_INVENTORY` entry for merged #850 (Added/Locked/Deferred/Docs/Confidence for the D-SCI-1 findings arc) — this is the **last entry the ledger recorded before the six-PR gap this recovery session fills**. +- **Locked** — data-in-Releases is legally load-bearing, not merely a size-hygiene convention: code in the Apache-2.0 tree + data in a Release asset under its own licence is "mere aggregation," so a BY-SA obligation attaches to the derived database and never propagates into the Apache-2.0 source tree. Committing a codebook into the tree instead would have put a BY-SA database inside an Apache-2.0 source tree and made that boundary substantially harder to argue. +- **Deferred** — none recorded. +- **Review** — 2 review threads, **both never answered, both substantive P1 legal-correctness critiques of the ruling this PR ships**: (1) codex — the PUBLIC/BY-SA verdict for the German codebook drops HDT's *own* NC restriction: `build_de_codebook.py:247` labels its generated lexicon "CC BY-SA / CC BY-NC-SA" (i.e. the generator's own output acknowledges an NC source is mixed in), while this PR's ruling classifies the combined codebook as commercial-OK BY-SA — an apparent direct contradiction the ruling text never addresses; the reviewer's recommendation was to exclude HDT or retain only NC-compatible terms. (2) codex — the ruling treats *where a work is stored* (Release vs. repository tree) as the legal test for the ShareAlike/aggregation boundary; the reviewer argues this is backwards — adaptation-vs-collection is determined by the relationship between the works, never by packaging location, and "keep the Release separate" is a project *policy* that happens to produce the right outcome, not the legal boundary itself; a future publisher could read this ruling as false assurance that separating a Release always prevents licence propagation. Neither critique was rebutted, revised, or even acknowledged anywhere in the traced range (#852 through #856). +- **Docs** — this entry (the licence table); the #850 PR-arc entry it added. +- **Confidence (2026-07-27 — recovery session):** the licence table's individual per-source claims (UD, WordNet, PROIEL, COCA) are independently well-sourced and not disputed by either review comment. **The two review threads above are a live, unresolved gap in this PR's own central claim** and should be treated as open until answered — this recovery session found no later commit in the range that rebuts or revises them. One possible partial response: `EPIPHANIES.md` (as it stands after later, unrelated edits) lists "UD German-HDT | CC BY-SA 4.0 (annotation)" as a distinct table row from GSD, which *may* be gesturing at an annotation-vs-underlying-text licence distinction relevant to critique (1) — but no commit or comment in the traced range explicitly connects that wording to this thread, so this is noted as UNRECONSTRUCTED-possible-partial-response, not a confirmed fix. + ## 2026-07-26 — lance-graph #850 — D-SCI-1 findings arc: the anaphora TYPE boundary, the gateway hinge, the German codebook generator + 6 review fixes **Merged:** `e7db817` (branch `claude/lance-graph-last-10-pr-z30uij`, commits `2ed46e8`..`5170c45`). Board + data-generator only — no contract or source change, so no test surface moved. diff --git a/.claude/handovers/2026-07-27-2114-arc-841-856-postmortem.md b/.claude/handovers/2026-07-27-2114-arc-841-856-postmortem.md new file mode 100644 index 000000000..8e85bac10 --- /dev/null +++ b/.claude/handovers/2026-07-27-2114-arc-841-856-postmortem.md @@ -0,0 +1,250 @@ +# Post-mortem — lance-graph #841→#856, the six-PR memory gap (#851–#856) + +> Written by a forensic recovery session, 2026-07-27, on branch +> `claude/lance-graph-arc-841-856-postmortem-2ynq7q`. This session wrote no +> production code. Its job was to rebuild `PR_ARC_INVENTORY.md` for #851–#856 +> (done, see that file), salvage the arc's unfinished ideas (see +> `.claude/knowledge/parked-designs-841-856.md`), and answer — with evidence, +> not impressions — how a session that kept shipping code let its own record +> of that shipping go dark for six consecutive merges. +> +> Every claim below traces to a diff, a commit hash, a PR body, a review +> comment, or a board file already in the tree. Where the record does not +> support a claim, this file says so rather than smoothing it over. + +## 1. Where exactly did the session lose the thread? + +**At the first commit of #852, immediately after #851 merged — not at #853's +mixed merge, and not at the #854 branch switch.** Those are real, but later, +compounding failures. + +The evidence, in order: + +- `#850` (merged `e7db817`) got a `PR_ARC_INVENTORY` entry — written by `#851` + itself (commit `661fd74`, "board: PR_ARC_INVENTORY entry for merged #850"). + The habit was intact at this point: #851 did the bookkeeping for the PR + before it, which is exactly the append-only, one-PR-behind cadence the + ledger is designed to run on. +- `#851` merged (`c266f57`) as a 2-commit, board-only PR. Its own commits are + `4b29425` (the licence-regime finding) and `661fd74` (the #850 ledger + entry). **Neither commit, nor any later commit before #856, ever wrote an + entry for #851 itself.** +- The very next commit after `#851` merged is `0b9717c`, "plan: + rosetta-codebook-convergence v1" — commit 1 of the 44-commit #852 arc. That + arc ran for roughly six hours (first commit `2026-07-26T~17:04Z` per the PR + metadata's `created_at`, merge at `23:26:31Z`) and produced 20 review + threads, 7,591 added lines, and zero `PR_ARC_INVENTORY` writes — not even a + stub. +- Commit `c0c1a69`, **the first commit of that same #852 arc**, is titled + "board: publication-limit wording + board-entry rule" — it *edited the text + of the board-entry rule itself* on the way in, then the arc ran for six + hours and never applied the rule it had just re-worded. + +So the thread was not lost gradually across #852→#856. It was lost at a +single, locatable point: the moment #852 started, the session had a rule it +had just re-stated in its own first commit, and it never came back to satisfy +it — not at #852's merge, not at #853's, not at #854's, not at #855's. Six +PRs, six omissions, one starting commit: `0b9717c`. + +The #853 mixed-merge problem (causality audit + unrelated review-comment +cleanup in one PR) and the #854 branch switch (onto +`claude/medcare-rs-transcode-ruff-3y2olh`, a branch named for entirely +different work) are real degradations layered on top — see §3 and §6 — but +by the time either happened, the ledger habit had already been dark for one +full PR (#852). They made the damage worse and harder to read; they did not +start it. + +## 2. Why did the ledger stop rather than degrade? + +**Editing the rule's wording was mistaken for satisfying the rule — the same +shape as the vacuous-assertion defect this exact session spent the same day +diagnosing in its own code.** + +`c0c1a69` touched `.claude/board/*` to adjust "publication-limit wording + +board-entry rule" — i.e., its *diff* looks like board hygiene. It is the kind +of commit that, read in isolation or by a session skimming its own recent +history, reads as "the board-entry obligation was just handled." But it +handled the *rule's text*, not the *arc's entry*. Six hours and 43 commits +later, at merge time, nothing prompted a return to that specific obligation +— there is no mechanical gate (a pre-merge hook, a CI check, a required-file +diff) that would have refused the merge without a `PR_ARC_INVENTORY` write. +The only enforcement is the session's own discipline, exercised at the wrong +moment and never revisited. + +The self-referential irony is worth stating plainly, because it is the same +day's own finding, aimed at itself: `E-VACUOUS-ASSERTION-IS-THE-HOUSE-STYLE-1` +(promoted to a P0 rule in `CLAUDE.md` by `e3df46d`, also inside the #852 arc) +names exactly this failure mode for code — "an assertion implied by the code +it tests is not a test." A board-hygiene commit that touches the rule's +*wording* without touching the arc's *entry* is the documentation-process +version of the same defect: it looks like discharging the obligation and +provably is not one, because nothing about editing the rule's text requires +or verifies that the entry gets written. The session diagnosed this shape in +its recipe kernels the same day it committed the shape in its own board +hygiene. + +A second, compounding factor: the mandatory-read list (`CLAUDE.md` § Session +Start) is asymmetric. It specifies three mandatory reads at session start +(`LATEST_STATE.md`, `PR_ARC_INVENTORY.md`, `agents/BOOT.md`) but no mandatory +*write* checklist at session end or at merge time. A session that reads the +rule at the start and never re-checks it against its own output at the end +has no structural prompt to catch the gap — only memory, and a six-hour, +44-commit session is exactly the shape that outruns memory. + +## 3. What did restarting cost, in measurable terms? + +Every instance below is a derive → ship → withdraw → (sometimes) re-derive +cycle inside #854–#856, each traceable to specific commits: + +| # | What was derived | Commits spent | What killed it | +|---|---|---|---| +| 1 | The post-#854 "redo sequence": belief rows + belief GUIDs, evidence-event rows + event GUIDs, evidence edges, a "concept-belief SoA", CSR as a "compute projection", an opaque `BeliefHandle` carrier, a named future query API, a PR B–E sequence | Built up across the primer's §5.8/§10 discussion inside #854/#855; withdrawn in one operator ruling | `E-AN-UNFILLED-SEMANTIC-SLOT-IS-NOT-A-DESIGN-INVITATION-1` — none of it was code-proven or owner-specified; all of it marked ⊘⊘ WITHDRAWN, commit `5d0b7e6` | +| 2 | `source_registry` + dual `BeliefArena` migration (planner + `deepnsm-v2`) | 7 commits (`0d1e566`, `f4e1576`, `cbed5a4`, `89a80f9`, `114e58c`, `4bf9fd7`, plus the contract crate work) inside #854; reverted in 1 commit (`b085048`, **27 files, +558/−1074**) | Four converged findings: `SourceId` ≠ evidence-event identity; no canonical evidence-event identity exists in this codebase; the fixed-width digest is measured safe-but-useless (P(false overlap)≈n²/m, 63.4% at n=8/m=64); `bool` cannot carry tri-state disjointness | +| 3 | Primer §13, "capability confirmation — the standing wave produces the same or better" (a full two-column table asserting the substrate beats the arena on every capability) | One full section, written same-day | Superseded one section later by §15, "de facto authoritative ≠ architecturally canonical" — §14's own trace had disproved the substrate column §13 scored `[CODE-PROVEN]` | +| 4 | The cosine-replacement census — multiple corrections chasing what the "correct" cosine replacement is: `03e155c` ("forbidden umbrella"), `5e45d2b` ("spec ahead of code"), `f7bf074` ("dissolves"), `7fb79b6` ("validated on ndarray's board 2026-05-26") | ~6 commits inside #855 | The answer had existed on the **sibling ndarray repo's board for two months** (dated 2026-05-26) before this session re-derived and re-corrected its way to the same conclusion inside one PR | +| 5 | `probe_adc_cosine_head_to_head.rs` — a fully hand-rolled Lloyd k-means codebook, ADC arm, pair-LUT, and scalar accumulation loop | 4 commits (`203a930`, `ea6b9e4`, `c92b3f6`, plus the initial probe) before the rebuild | `acd49ef` — "you didn't even use ndarray, that's the most embarrassing part": every hand-rolled piece already existed as an exported ndarray primitive (`CamCodebook`, `DistanceTables`, `simd::U8x64`, `hpc::cascade`) | +| 6 | The "structurally inherent to SDC" inference (a claimed structural property of the SDC codebook class) | 1 commit's worth of reasoning | `6269cfc` RETRACTED — it compared one hand-rolled codebook against another hand-rolled codebook and drew a class-level conclusion neither measurement licensed | + +Rough floor on commits spent purely on derive-then-retract cycles across +#854–#856: on the order of **15–20 commits** (roughly a third of #854's 16 +and half of #855's pre-merge codex-fix commits), against total production +code that was itself small (#854: 4 substantive contract modules after the +revert; #855: 1 real code change, `AdjacencyBatch`). The ratio is stark: more +commits were spent retracting and re-deriving than were spent on code that +survived to the end of the range. + +## 4. Which #855 CodeRabbit findings were caused by context loss vs. ordinary error? + +Of the 8 confirmed-and-fixed findings on #855 (detailed in #856's PR body and +in the `PR_ARC_INVENTORY` entry for #855), the session's own reply names six +of the eight as *"factual errors in the audit prose itself — traces whose +entire job was to report facts."* Sorting those six by cause: + +**Caused by context loss (the trace re-describing a fact it should have +still held from minutes earlier in the same PR):** +- Trace-D's `AdjacencyBatch` classification — still marked FORBIDDEN-COPY + *after this same PR (#855) had already fixed it* to a borrowed view. The + audit was reporting its own PR's fix as an open violation. This is the + clearest context-loss signature: the fact needed was produced earlier in + the *same* PR, not from a prior session. +- `reasoning_loop.rs`'s HLC doc-comment conflating `QueryReference::hlc_tick` + (always `None`) with `DeinterlaceRow::hlc_tick` (`Some` in test rows) — a + doc-comment written specifically *to correct* an overstated claim, that + itself overstated a different, adjacent claim. Correcting-while-repeating + is a context-thinning signature, not a one-off transcription slip. + +**Ordinary arithmetic/transcription error (would have happened at any context +depth):** +- "6 deinterlace call sites" vs. the 7 actually listed in the same sentence. +- `480 − 172 = 276` (the correct answer, 308, appears two sentences later in + the same document). +- A stale "5 of 14" self-correction left in text that also states "8, not + 5" — an edit that added the correction without deleting the thing it + corrected. +- `TECH_DEBT` vs. `AUDIT-FIXLIST` disagreeing on whether `kanban::Commit` + counts as the 4th doc-comment site — a cross-file consistency slip. + +These four are ordinary editing errors — the kind any session makes when +writing two ledgers that both count the same items. The two context-loss +cases are qualitatively different: they are the trace forgetting something +it itself had established earlier in the identical PR, which is the specific +failure this arc's memory practice exists to prevent, happening *inside* the +window that practice is supposed to cover. + +## 5. What guard would have caught this — and where would it have fired first? + +**Recommended: a merge-time check that a PR touching `.claude/board/` (or any +`src`/`examples` file) without a same-PR `PR_ARC_INVENTORY.md` diff produces +a loud, named warning before the PR can be merged.** + +Candidates considered and why this one wins on "fires earliest": + +- *Branch-name assertion* (flag when a PR's head branch name doesn't + semantically match its content) — would have fired at **#854**, three PRs + late. Real, but late. +- *Doc/code-ratio warning* (flag when a PR's diff is >90% board/doc content) + — would have fired at **#853** (5.5% production share) at the earliest, + two PRs late, and would have produced false positives on legitimately + doc-only PRs like #851. +- *Mandatory handover on context exhaustion* — depends on the session + correctly self-diagnosing exhaustion, which is exactly the judgment that + failed. Not a guard; a hope. +- **A merge gate requiring a `PR_ARC_INVENTORY` entry in the same PR** — + fires at the **first** violation: #852 itself, the exact commit range + identified in §1. It does not depend on branch names, content ratios, or + self-diagnosis; it is a mechanical diff check ("did this merge's diff + include a new top-of-file section in `PR_ARC_INVENTORY.md`, keyed to this + PR number, if the diff touched anything outside `.claude/board/` + itself?"). It would have blocked #852 from merging clean, forcing the + entry to be written while the 44 commits' content was still in the + session's own context — precisely when writing it is cheapest and most + accurate. + +**Both falsifier halves, stated:** +- **Can it fire?** A PR with 30+ non-board files changed and no + `PR_ARC_INVENTORY.md` diff must be blocked. (This is exactly #852: 50 + files, 0 ledger lines.) Test: re-run the check against #852's actual diff + and confirm it would have refused the merge. +- **Can it stay silent?** A PR that is genuinely board-only-and-already-self- + documenting (e.g. #851, which *is* a `PR_ARC_INVENTORY` entry) must not be + blocked for lacking a *second* entry about itself recursively, and a + same-day multi-PR chain where PR N+1 explicitly writes PR N's entry (the + #850→#851 pattern) must not be double-flagged once the later entry lands. + Test: run the check against #849→#851 (the last stretch where the ledger + was current) and confirm zero false positives. + +## 6. Was #852's 44-commit autonomous run a success or the cause? + +**Both, and the split matters more than the verdict.** Arguing each side on +its own terms: + +**Argued as a success:** #852 shipped a working multipass-bug fix (budget +exhaustion had been silently conflated with out-of-horizon for every ≥2-hop +chain — a real, previously-undetected correctness bug), a coverage-inversion +refutation that corrected a standing assumption, two negative results +recorded honestly instead of iterated-on past their evidence +(closed-class-detector F1, `heel_threshold` inertness), and the falsifiability +rule promotion that every subsequent PR in the range was held to. Measured by +code-that-survived-to-#856, #852 is the single most productive PR in the +damaged range. + +**Argued as the cause:** #852 is also where the review-reply habit broke +completely — 20 threads, 0 replies, a pattern that did not exist in #849 +(4/4 replied) or #850 (6/6 replied) immediately before it, and did not fully +recover in #853 (3/3 unreplied) or #856 (3/3 unreplied) after it. A 44-commit, +six-hour unattended run is structurally the shape that outpaces any +end-of-session review-and-reply pass: the session that opened 20 threads' +worth of findings across a six-hour span had, by the time any of them could +be answered, moved on to the next thing 43 commits later. The same +unattended-duration property that let it ship a lot is what let 20 review +threads and one `PR_ARC_INVENTORY` entry go unanswered. + +The honest reconciliation: **the failure is not the autonomy, it is the +absence of a return pass.** A 44-commit autonomous run is fine if the last +commit (or the merge step) is a mandatory "reply to every open thread, write +the ledger entry" pass. #852 had no such pass. #853, #854 partially did (all +9 of its threads got replies). The variable that predicts whether a PR in +this range left threads unanswered is not its size or its autonomy — it is +whether *any* commit near its end was dedicated to closing out review and +ledger obligations rather than shipping more findings. #852, #853, and #856 +didn't have one; #849, #850, and #854 did. + +## What this session did not fix + +Three genuinely open items surfaced by this recovery and left open, +per the acceptance criteria (no production code, no silent resolution): + +1. The #856 codex critique disputing "Base17 ceiling is dimensional, not + fold-shape" (citing a prior PCA-17 ρ=0.72 measurement) — unanswered. +2. #856's own board-hygiene self-violation (rewrote trace-file history in + place while fixing it, instead of appending corrections) — unanswered, + and ironic given the same PR fixed a similar violation on #852. +3. #853's three review threads (`closed_class_transfer.py` eval-universe + mismatch, `meta_basin.rs:466` recluster-full-window bug, `tier_delta.py` + hardcoded LCA depth) — verified absent from every subsequent diff through + #856. Genuinely open technical debt, not merely unreconstructed history. + +See `.claude/board/ISSUES.md` for the full per-thread ledger of every +never-answered comment found in this recovery, and +`.claude/knowledge/parked-designs-841-856.md` for the salvage of what the +arc was building toward when its memory practice broke. diff --git a/.claude/knowledge/parked-designs-841-856.md b/.claude/knowledge/parked-designs-841-856.md new file mode 100644 index 000000000..72f0c284d --- /dev/null +++ b/.claude/knowledge/parked-designs-841-856.md @@ -0,0 +1,183 @@ +# Parked designs — the #841–856 salvage (2026-07-27, forensic recovery session) + +> READ BY: whoever picks up the CLAM/HHTL, WordNet, `source_registry`/evidence- +> identity, or Pearl-causality threads next. This is not new architecture — it +> is a rescue of ideas that were built, discussed, or measured during +> #841–856 and then either withdrawn (correctly, for a stated reason) or +> simply left mid-sentence when the arc's memory practice broke (see +> `.claude/handovers/2026-07-27-2114-arc-841-856-postmortem.md`). Every entry +> states what it was, why it stopped, and the precise condition that +> unblocks it — per the operator's standing rule, a falsified-for-now design +> is parked, not deleted. + +## (a) What was reverted — `source_registry` + the evidence-event identity gap + +**What it was.** A complete, working implementation, built across 7 commits +in #854 (`0d1e566` contract type, `f4e1576` settlement typing, `cbed5a4` +`VersionedSnapshot`, `89a80f9`/`114e58c` the `libet_offset_us` removal in +excluded crates, `4bf9fd7` "migrate BOTH `BeliefArena`s"): a stable-id-to- +dense-slot registry (`contract::source_registry`) replacing the ad hoc +64-bit `Stamp` bitset, with both the planner's and `deepnsm-v2`'s +`BeliefArena` migrated onto it so NARS revision's `disjoint()` check ran +against real registry slots instead of a folded bitset. + +**Why it stopped.** Reverted whole (`b085048`, 27 files, +558/−1074) on four +converged findings, all measured or type-verified, not asserted: + +1. The `disjoint()` guard exists to answer "has this evidence *event* already + been counted" — but `SourceId` models source *membership*. One sensor + observing the same fact twice is two events; keying disjointness on the + source means the second observation can never raise confidence, which + disables the most basic form of evidence accumulation, not a rare edge + case. +2. **No canonical evidence-event identity exists in this codebase today**, + verified against the actual types: `ClassId` is `u16`, the GUID's + `classid` is a `u32` composite (two types sharing one word); `ClassView` + is a late-bound projection trait, not an instance identity; `AppPrefix:: + Core` is documented "no render lens"; `LanceVersion`/`DatasetVersion` is a + dataset snapshot, not an event. The closest existing candidate, + `ClassId:AppId:ClassView + version`, fails 4 of 6 ingestion cases (two + rows of one class in one commit collide; re-observing an unchanged value + mutates nothing at all — so it can never mint an "event"; one observation + can span many rows; an external statement mutates nothing). `NodeGuid` + cannot substitute — its own uniqueness assertion is debug-only and its + message admits values may be "reused." +3. A fixed-width digest (the obvious cheap fix) was **measured** safe but + useless: 20,000 trials/cell, genuinely disjoint bases, + `digest_a & digest_b == 0` — P(false overlap) ≈ n²/m at k=1 (6.1% at + n=2/m=64, **63.4% at n=8/m=64**), and k>1 is catastrophic *even though it + improves membership queries* (98.1% at n=8/m=64/k=2). Never + false-disjoint (conservative, safe), but starves revision two times in + three at realistic evidence-base sizes (useless). +4. A `bool disjoint()` cannot distinguish "not known to overlap" from "known + disjoint" — the guard needs tri-state, and a Boolean silently converts + ignorance into permission. + +Codex and CodeRabbit hit the resulting 64-source ceiling from four +independent angles during review; CodeRabbit's own prescribed fix ("reuse a +bounded `SourceId`") was explicitly **rejected** because it would have made +every symptom green while calcifying the actual defect. + +**The condition that unblocks it, precisely.** This design is *correct and +waiting*, not wrong. It becomes buildable the moment one thing exists: + +> **An immutable receipt type that names a single evidence-admission event** — +> not a class, not a rendering, not a dataset version, but *this specific +> observation, once* — such that two calls to `observe()` on the same +> underlying fact from the same source produce **the same** receipt id, and +> two calls from different sources (or the same source at genuinely +> different moments) produce **different** ones. Candidate shapes not yet +> evaluated: a hash of `(source, subject, predicate, object, lance_version)` +> at admission time (idempotent on exact repeats, distinct on anything that +> differs); or a receipt row co-located with its evidencing `NodeRow` via the +> V3 facet register (per primer §17 — evidence lives where the SoA already +> has it, never in a sidecar). + +Once that receipt type exists, the withdrawn design's remaining shape — +`EvidentialBase` as an exact set with `overflow → Unknown` and a +non-evicting ledger fallback (so no false disjointness), `OverlapKnowledge` +and `Independence` both tri-state — is ready to build largely as designed; +only the "what is a source" layer (`source_registry` itself, cleanly +separated as *attribution*, renamed `EvidenceSourceId` in the same PR) needs +no rework at all. + +## (b) What was withdrawn in prose — primer §13 vs §15 + +**What it was.** Primer §13, "Capability confirmation — the standing wave +produces the same or better" (2026-07-27): a full two-column table scoring +every `BeliefArena` capability (belief-by-statement, revision, `Stamp` +disjointness, budget-capped ordering, premises, `close_transitive`, +adjacency propagation) against the intended V3 standing-wave substrate, +concluding "better" or "strictly better" in every row, and marking the +substrate column `[CODE-PROVEN]`. + +**Why it stopped.** §14's substrate trace (four read-only lanes, +`exec-runs/trace-{A,B,C,D}-*.md`) then measured what §13 had asserted, and +found the substrate side of every comparison was **specified, not built**: +`MailboxSoA` never implements `SoaEnvelope`; no Lance-version-producing code +exists anywhere in `crates/`; `BatchWriter::cast()` has zero production +callers; `deinterlace` is test-only end-to-end with no HLC producer in the +workspace. §15 replaced §13's table with a three-column one (current LIVE +implementation / target CONTRACT status) and stated the correction plainly: +*"`BeliefArena` is de facto authoritative. It is NOT thereby architecturally +canonical."* §13 itself was **not deleted** — both sections remain in the +primer, in order, with §15 marked as the supersession, per the append-only +rule. + +**Why this is a finding, not noise.** §13's error was not sloppiness; it was +scoring "a type exists" (`SoaEnvelope`, `MailboxSoA`, the trait definitions) +as "the system works" — exactly the failure this recovery session's own +handover names in §4 as "context loss," one layer up: a session asserting +a capability it had type-level evidence for but no call-graph evidence for. + +**The condition that unblocks §13's actual claim.** §13's table becomes true +the moment §15's own "implementation gate" is satisfied — an uninterrupted +production path `resident belief tenant → owner-authorized mutation → +synchronous Kanban transition → ahead-firing descriptor cast → new Lance +standing-wave position → production temporal read` — with **P0 #1** (the +`MailboxSoA → SoaEnvelope → Lance write` seam) as the first missing link, per +`AUDIT-FIXLIST-2026-07-27.md`. Nothing in §13 needs to be re-derived once +that path exists; it needs to be re-verified, because it was reasoned +correctly about a system that did not yet exist. + +## (c) What was deferred and never re-entered + +| item | from | condition to unblock | +|---|---|---| +| **CLAM/HHTL ↔ WordNet hypernym-ancestry alignment probe (D-RCC-5)** — does common-prefix-length in the hierarchical-4⁴ centroid address track WordNet LCA depth (Spearman ρ vs a flat-256 null), and does adding the vertical lane shrink the D-RCC-6 unresolved residual? | Specified `rosetta-codebook-convergence-v1.md` D-RCC-5; named again in #851's deferred list; **#856 built its entire probe specifically to isolate this one's confound** (the Base17 fold ceiling, so a future null-result on the WordNet probe reads as "no alignment" and not as "hit the upstream 17-dim ceiling") | **The through-line — see below.** WordNet rail v2 data already exists and is verified (`build_wordnet_rail.py`, `exec-runs/rcc-wordnet-rebuild.txt` — 176,532 rows, both named anchor words pass `--verify` against live WNDB). What's missing is the 4⁴ hierarchical codebook itself: the one built earlier (`build_hierarchical`) was a 16×16 two-level structure, and #856's own body states it explicitly: *"withheld — rebuilding on the correct cascade shape before it measures anything."* Rebuild `HierarchicalPalette` as 4 levels of 4-ary, Morton-interleaved 2-bit×2-bit per level, then run the probe that already has its inputs, its null, and its confound isolated. | +| **Level-3 PROMOTION experiment** | #849, explicitly ratified as "the next PR" (induce a template from Confirmed witness cases → freeze → hide the witness → replay held-out KJV; the witness-derived rule must survive witness removal) | Never re-entered anywhere in #850–#856. Unblocked as-is — no prerequisite identified beyond scheduling it; it is the witness architecture's actual falsifier and the arc moved on to Rosetta/causality work instead. | +| **W5 gap 4 — keep-first polysemy** | #850/#851, flagged as a **BLOCKER for W11** (the hypernym walk caught `swallow → consumption` [verb sense bleeding into the noun walk] and `grape → shot` [grapeshot] — false hypernym attachments from picking the first WordNet sense rather than the contextually correct one) | Must be fixed before the Aesop-fable identity probe (W11) runs, or W11's results are silently poisoned by the same defect `build_wordnet_rail.py` v2 already fixed for the *rail* (12.76% wrong-sense rate) but which the *walk* logic doesn't yet inherit. | +| **`ISS-PEARL-VOCABULARY-WITHOUT-PEARL-MECHANICS`** | #853, the causality audit — "nothing severs" (no mechanism-disabling, no descendant recomputation), Recipe 31 (`Icr`) is a stub wearing a Pearl label, four kinds of cause share one untyped edge | #854 shipped the **typing** half (`causal_audit`: kind/locus/domain/scope, receipt-ledger support) but explicitly did NOT build severing/mechanism-disabling or fix `Icr`'s stub body — the audit-before-build ruling was honored for the typing, not yet for the mechanics. Unblocked: the typed edge now exists to classify what a severing operation would act on; building `do(X=x)` mechanics is the next PR, gated on nothing new. | +| **`nars::InferenceType` contract drift** | #853's causality audit — three recorded copies of this type have *different variant sets* (no `Intervention`/`Counterfactual` in the current enum, despite `CLAUDE.md`'s own I-LEGACY-API-FEATURE-GATED discussing `InferenceType::Counterfactual` at mantissa −6) | A contract-integrity hole, not a design question — needs a reconciliation pass across the three copies, unblocked, not started anywhere in #854–#856. | +| **Substrate write path — P0 #1/#2 (`AUDIT-FIXLIST` row 1/2)** | #855's §12 trace | `MailboxSoA` never implements `SoaEnvelope`; no HLC producer anywhere in `crates/`. This is the single dependency chain everything in (a) and (b) above is gated on. Sequencing per the fixlist: 4 (MetaWord width mismatch) → 3 (resident tenant for rung/contradiction/premises) → 1 (the write seam) → 2 (the read). | +| **L5 γ-fold validation** | #855's `probe_l5_fisherz_amortization` | Honestly reported as NOT validated — the probe folded random rows against the fold's own CLAM-family precondition (a rig defect, not a finding about the fold). Needs a rig that respects the precondition before the γ-fold can be scored either way. | +| **HEEL pruning power on a full-width tier** | #855's `probe_furnace_amortization` | Measured: same-HEEL pairs are 20% closer than random (locality proven, falsifier fires both directions) but pruning power is weak on the thin 17-dim/6-subspace rig (99.7% survivors at the t/4 band) — the "95%-skip HHTL" claim needs a full-width tier to actually test pruning, not just locality. | +| **`impl Distance for [u8;6]`** | #855, measured ρ −0.0030 (noise), zero production consumers by grep | One-PR deletion or rename (`ISS-CONTRACT-DISTANCE-IS-THE-FORBIDDEN-UMBRELLA` §G), unblocked, purely mechanical, not done anywhere in the traced range. | +| **Lemma-key vs. `tongue` anchor trade-off** | #852 | Lemma-key coverage lift (39.2→43.0% German) broke the `sprache`/`sprachen` anchor via the `-chen` suffix rule; shipped opt-in, default OFF. Needs a smarter suffix rule (or a documented accepted trade-off), not re-touched since #852. | +| **`heel_threshold: 50.0` is inert** | #852, measured (max sub-distance in the fixture is 25.5, so the threshold never binds) | Mechanical: either lower the threshold to something the fixture can exercise, or replace the fixture with one whose distances exceed it — either way, a one-line change not made anywhere in #853–#856. | + +## The question this salvage exists to answer + +> **Of everything parked in #849–#856, which single item was the lost +> session most excited about — and what was it about to do next?** + +**The CLAM/HHTL ↔ WordNet centroid-ancestry alignment probe (D-RCC-5).** +The evidence is behavioral, not tonal — it is the one item the arc kept +building toward without ever running it, across four separate PRs: + +1. **#849/#851** name it explicitly as the deferred item, twice, in nearly + identical language ("does centroid ancestry track hypernym ancestry, + against a flat-256 null"). +2. **#852** spent an entire 44-commit arc building its *inputs* — the + Rosetta lanes, the WordNet rail v2 rebuild (correcting a 12.76%/33.84% + wrong-sense rate the v1 rail carried), the lane codebooks — none of which + the probe strictly needs on its own, but all of which feed the same + convergence plan (`rosetta-codebook-convergence-v1.md`) whose D-RCC-5 + section is this exact probe. +3. **#853**'s causality audit and #854's typed causal edge are a detour into + a different (also real) gap, but neither touches WordNet or HHTL at all + — the arc visibly changed subject. +4. **#856**, the very last PR before the session's memory failed + completely, is not about WordNet on its surface — it measures the Base17 + fold ceiling. But its own body states the reason in one sentence: the + WordNet falsifier "is written but withheld... rebuilding on the correct + cascade shape before it measures anything," and the fold-ceiling + measurement exists specifically so that when the WordNet probe *does* + run, a null result will mean "no alignment" and not "hit the known 17-dim + ceiling." **#856 is the last piece of scaffolding for a probe the session + never got to run.** + +Read as a single arc, #849→#856 is not six disconnected PRs — it is one +session building, piece by piece, every precondition a single falsifier +needs (a corrected WordNet rail, isolated confounds, a stated null +hypothesis, a named cascade shape to rebuild on) and then running out of +context one rebuild away from executing it. The next session's highest- +leverage move, if it does only one thing from this file, is: rebuild +`HierarchicalPalette` as 4⁴ (not 16×16), and run the probe that has been +waiting, fully specified, since #849. + +This item is **scheduled, not silently re-parked a third time**: it is +named here with its exact blocking condition (the 4⁴ rebuild) and its +exact falsifier (Spearman ρ of prefix-length vs. LCA depth, against a +flat-256 null, plus the D-RCC-6 residual-shrinkage test). Whoever reads this +next should either run it or state explicitly why not.