Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
141 changes: 141 additions & 0 deletions .claude/board/EPIPHANIES.md
Original file line number Diff line number Diff line change
@@ -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<i8>, 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
Expand Down
43 changes: 43 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<i8>`, `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
Expand Down
Loading