diff --git a/.claude/board/EPIPHANIES.md b/.claude/board/EPIPHANIES.md index da91d3c62..2799a70a1 100644 --- a/.claude/board/EPIPHANIES.md +++ b/.claude/board/EPIPHANIES.md @@ -1,3 +1,144 @@ +## 2026-09-15 (5) — E-THE-99-90-PERCENT-IS-1023-OVER-1024-THE-CLUSTERED-SKIP-SATURATES-A-256x256-TILE-RATHER-THAN-APPROACHING-IT-1 — §8a's best measured order is the tile's arithmetic ceiling, so 256×256 is the skip's UNIT and not the fixture's accident + +**Status:** FINDING. Arithmetic over an already-recorded measurement — no new +measurement was taken, and none is claimed. +**Confidence:** HIGH on the identities (each is one line of arithmetic, restated +below so a reader can check them without running anything); the pairings in +§"8 B to 128 KiB" and §"why not bigger" are structural readings of numbers +measured elsewhere and cited to their source. + +### The identity + +`adaptive_order_probe.rs` measures the clustered regime's best ordering at +**99.90 %** of words skipped (§8a, `crates/lance-graph-quack/src/lib.rs`; the run is +65 536 rows × five conjuncts × all 120 orderings). The skip's granularity is the +**64-row word** — `MaskOp::Pred`'s own doc states it (`crates/lance-graph-mask-risc/src/ir.rs:88-94`: +*"Its granularity is the facade's: 64-row WORDS"*), and `ndarray`'s `pack_under` +is where it physically happens (`simd_masking_ops.rs:1541-1546`). + +65 536 rows ÷ 64 = **1024 words**, and + +``` +1023 / 1024 = 0.9990234… → 99.90 % +``` + +The measured figure is not near the ceiling. It **is** the ceiling: one live word +out of 1024, the least a non-empty mask can occupy. The probe's own `skipped_words` +ramp says the same thing a second way — `[4092, 3069, 2046, 1023, 0]`, where +`4092 = 4 × 1023` exactly and every adjacent delta is `−1023`. One unit, counted +four times down to zero. + +So there is **no tuning headroom above 99.90 % on a 256×256 tile**, and a future +session trying to push past it is chasing an arithmetic impossibility rather than +an unoptimised path. + +### What that reframes + +256×256 stops being the fixture's geometry and becomes the skip's **unit**: a tile +is exactly 1024 skip-units, and an address prefix collapses it to one. The tile and +the word ladder are one object counted twice (65 536 bits ÷ 64). + +The complement is equally exact and is already in the quack doc: at 21.8 % survival +with survivors SCATTERED a word is all-dead with probability `0.78163⁶⁴ ≈ 1.42e-7`, +so no ordering skips anything. Contiguity, not density — and the two ends of that +statement are both closed-form. + +### The carriers hand off at 10 bits of 16 + +A 16-bit tile coordinate against 64-row words splits **10 / 6**: the top 10 bits +select the word, the bottom 6 select a bit inside it. So descending a prefix buys +skip for exactly 10 bits and then stops — the last 6 bits are structurally +invisible to a mask carrier however precisely they are named, because they never +cross a word boundary. + +That is a ceiling, not a defect, and it says where the mask form stops being the +right carrier. Above 10 bits the skip does the work; below it the mask cannot +discriminate at all. + +### Both questions have an 8-byte form; what differs is the CONDITION + +| reading | size | answers | +|---|---|---| +| literal mask | **8 KiB** | *which* cells — ANY subset | +| prefix range (`Cmp::MatchU32`'s pattern+care) | **8 B** | *which* cells — a STRUCTURED subset | +| `FisherZTable` materialized (i8, k=256) | **64 KiB + 8 B** | *how far* — one load | +| `FamilyGamma` alone | **8 B** | *how far* — PARAMETERS, plus `atanh`/`tanh` + affine | + +`le-contract.md` §"The canonical cosine/centroid replacement is ANALYTIC" is +explicit that **"a materialized k×k table is a CACHE of the formula, never the +canon"**, the canon being `bgz-tensor::fisher_z` (cosine → `atanh` → per-family +affine → normalized i8; certified ρ≥0.999, `E-PALETTE-NNUE-COSINE-GREEN-1`). +Verified in source rather than from that prose: `FamilyGamma { z_min: f32, +z_range: f32 }` with `BYTE_SIZE = 8`, and `FisherZTable { entries: Vec, k, +gamma }` whose `byte_size()` is `k*k + 8` — so at k=256 the materialized form is +**64 KiB + 8 B**, entries at ONE BYTE each because the codec's output grade is +the normalized i8. The palette index is 8 BITS; the family's affine is 8 BYTES; +they are different objects and this table keeps them apart. + +**The 8 B is parameters, not answers.** A distance from `FamilyGamma` still costs +an `atanh`/`tanh` and the affine — it is compute-versus-table, not a smaller +answer. Quoting the two sizes without that is the elision this row exists to +prevent. + +**And the mask's compact form exists too — for STRUCTURED sets.** A prefix range +is `Cmp::MatchU32 { pattern, care }`, 8 bytes of the same order as the gamma, and +matrix row R5 says the same of DuckDB's `SequenceVector` ("a contiguous range to +3 scalars", which DuckDB then throws away at the first predicate and V3 keeps). +So the asymmetry is NOT metric-compacts / set-does-not: + +- *how far* compacts UNCONDITIONALLY — a metric is a function of two coordinates, + so a formula always exists and the 8 bytes are its parameters. +- *which* compacts CONDITIONALLY — only when the set is structured. An arbitrary + subset of 65 536 cells is one of 2^65536 and has no compact form at all. + +The clustered regime of §8a **is** the structured case (its conjunct is an address +prefix), so in exactly the regime this entry is about, both carriers have their +8-byte form and the 8 KiB / 64 KiB materializations are the caches. + +⊘ An earlier draft of this section, corrected before merge: it gave the +materialized LUT as **128 KiB** and claimed the mask has no analytic form. The +128 KiB u16 figure is `E-X265-PROBE-GPU-LUT-1`'s GPU table — a DIFFERENT object +from `bgz-tensor`'s i8 `FisherZTable`, matched on "256² LUT" and carried across. +The no-analytic-form half was true of arbitrary sets and false of the prefix +ranges the entry is otherwise entirely about. + +### Why 256×256 and not bigger — the bound is measured, elsewhere + +D-GTM-0n measured chained ternlog paying (`T3/T1 → 0.50` by K=8) **only while the +masks stay L2-resident**, with the ratio back to `1.03` at a **512 KiB** mask +(`STATUS_BOARD.md` D-GTM-0n / P3; the bound rides with the number and may not be +dropped when it is cited). + +`512 KiB / 8 KiB = 64`. A 512 KiB mask at one bit per cell is 4 194 304 rows — +**2048×2048**. So the tile at which chaining stops paying is exactly 8× per side +from the one that works, and 256×256 sits 64× inside the measured-good band. +That is a coincidence worth naming precisely because it is *not* load-bearing yet: +nothing measured a tile-size sweep, and D-GTM-0n's fixture is not §8a's. + +### What this does NOT say + +- **Not that the skip is good in general.** §8a's permissive (94.3 %) and moderate + (21.8 %) rows are `0.00 % → 0.00 %` and are unchanged by anything here. The + ceiling is reachable only under the three conditions + `E-FUSING-FORFEITS-THE-SKIP-AND-ADAPTIVEFILTER-FAILS-IN-TWO-PLACES-NOT-ONE-1` + names: gated lowering × plane-free conjunction × contiguous survivors. +- **Not a claim about the facet carrier.** The 12-byte `6 × (u8:u8)` facet is not a + compressed mask — it expresses six points, never a set — and nothing measured + here ranged over it. `E-CAM96-DISTRIBUTION-MEASURED-1` is a ranking result and + stays one. +- **Not an identification of a facet RAIL with a cascade TIER.** Both are two + bytes and both index a 256×256 tile; the path carries three, the facet six. + Shape identity, not object identity. The 10/6 split above is arithmetic on a + 16-bit index against a 64-row word and needs neither of those namings. +- **Not a measurement.** Every number above is either re-stated from §8a / + D-GTM-0n / E-X265-PROBE-GPU-LUT-1 with its source, or one line of arithmetic on + such a number. The contribution is the identity, not the data. + +**Cross-ref:** `E-FUSING-FORFEITS-THE-SKIP-AND-ADAPTIVEFILTER-FAILS-IN-TWO-PLACES-NOT-ONE-1` +(2026-09-15 (4)) — the conditions under which the lever exists at all, and the A1 +seed/loop split; `ISS-QUACK-AND-BY-SKIP-IS-INERT-UNDER-A-PLANE`; `ISS-NO-MASK-HOP-OP` +(the hop that would consume a saturated gate still does not exist). + ## 2026-09-15 (4) — E-FUSING-FORFEITS-THE-SKIP-AND-ADAPTIVEFILTER-FAILS-IN-TWO-PLACES-NOT-ONE-1 — the fused lowering is order-independent BY CONSTRUCTION, two readers derived it from source because the crate doc does not say so, and DuckDB's A1 turns out to have a dead seed as well as an unrunnable loop **Status:** FINDING. Convergent — derived independently in two sessions from the same diff --git a/CLAUDE.md b/CLAUDE.md index 02598a188..fedf56453 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -412,6 +412,49 @@ anti-pattern. The 2026-04-20 session surfaced this gap between PR #223/#224/#225 merges and the LATEST_STATE / PR_ARC update; this rule exists so it does not recur. +### The matching rule (P0, operator-ruled 2026-09-15 — 5 instances in one session) + +**Matching without reading is strictly prohibited.** A shared surface feature — +a width, a count, a phrase, a file path, a name — is never evidence that two +things are the same thing. **Before claiming A tells you about B, read B.** + +Measured instances, all in one session +(`E-I-GRAFTED-HELIX-ONTO-HEXAGON-AND-THEN-DEPRECATED-THE-OPERATORS-TENANTS-ON-MY-OWN-AUTHORITY-1` +carries 1–3 with their censuses): + +| # | matched on | transferred | what B actually was | +|---|---|---|---| +| 1 | `6 B == 6 rails` | helix residue → a Hexagon synapse surface | 6 B is ONE 48-bit `Signed360` sphere angle (`canonical_node.rs:868-871`) | +| 2 | `48 bit == 48 bit` | cam_pq's ranking result → `HelixResidue` | the measurement never ranged over `HelixResidue` | +| 3 | the words "multi-hop" | jc's synthetic-SPD EWA bound → graph recall | that pillar never traverses a graph | +| 4 | a citation in a neighbouring entry | `le-contract.md:160-170` cited for the LUT | `:160-170` is CausalEdge64 residual carriers; the LUT section starts at `:169` | +| 5 | the phrase "256² LUT" | 128 KiB u16 → `bgz-tensor`'s Fisher-z canon | that table is `Vec`, `byte_size() = k*k + 8` → 64 KiB + 8 B | + +**Instances 2, 4 and 5 occurred INSIDE the correction of 1, 3 and 4.** The rule +therefore binds the correction as hard as the claim; a retraction written by +matching is another instance, not a fix. + +Consequences, non-negotiable for new work: + +- **A cardinality is not a mapping.** Two things being six wide, or 48 bits, or + `256²` says nothing about whether they are the same object. Shape identity is + not object identity — state it that way when both are true. +- **Name the read, not the match.** A claim of the form "A tells you about B" + must name the measurement, declaration, or line that ranged over **B**. If the + only thing that ranged over B is a resemblance to A, there is no claim yet. +- **A citation you did not open is not a citation**, including one copied from a + neighbouring entry that looked authoritative. Copying a `path:line` forward + without reading the target is instance 4 exactly. +- **Prefer the precise form, because precision is what makes a claim + falsifiable.** Instance 4 was invisible while the path was partial + (`UNVERIFIABLE`); widening it to repo-relative is what let + `citation_decay.py` check it and fail. A vaguer citation is not safer — it is + merely unfalsifiable. +- **Grep is a heuristic for presence, never a proof of absence** — the prior + statement of one corner of this rule + (`E-ABBREVIATION-GREP-MANUFACTURED-AN-ABSENCE-1`), kept here because it is the + same move in the other direction: a non-match read as evidence. + ### `SUPERSESSION-INDEX.md` is generated and CI-gated — never hand-edit it `.claude/board/SUPERSESSION-INDEX.md` is produced by