Skip to content
Merged
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
124 changes: 124 additions & 0 deletions .claude/board/EPIPHANIES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,127 @@
## 2026-08-11 — E-THE-FRAME-WAS-ALREADY-SHIPPED-FOUR-TIMES-1

**Status:** FINDING `[G]` — read in source this session.

**The `mu + kσ` calibrate → band → roll-on-drift frame exists FOUR times in this
workspace, and I hand-wrote a fifth in Python after being corrected into it.**

| instance | metered quantity |
|---|---|
| `ndarray::hpc::cascade::Cascade` — `expose()` → `Band`, `observe`/`recalibrate` | Hamming distance |
| `perturbation_sim::rolling_floor::RollingFloor` — `threshold()` = *"the **confidence-interval** floor"*, `z()` = *"the **Jirak-honest** noise-floor units; significance via `n^(p/2−1)`, not IID"*, `band()` → Stable…Alarm, `preheat()` | mode instability |
| `helix::quantize::RollingFloor` — `quantize`/`bucket_center`/`observe`/`roll` | palette `[a,b]` |
| `thinking-engine::domino` — *"3σ top-K focus"* | table attention |
| **`probes/weather-p1/p1_ci_vs_floor.py` — MINE** | ERA5 bucket CI |

`perturbation_sim::RollingFloor` **is** the "corrected evaluation frame" that
took three correction sections (§12.10–§12.12) and an operator intervention to
reach — including the Jirak citation, in the doc comment.

**Also found in the same sweep, all `[G]`:**

- **`crates/perturbation-sim` is the applied instance of the whole stack** —
`splat.rs` (Gaussian-splat **magnitude** side) + `sketch.rs` (Walsh/XOR **sign**
side) is *literally* OGAR's two-algebra rule; `cascade_key.rs::morton48` is the
OGAR production HHTL address; `hhtl.rs` derives `(HEEL,HIP,TWIG)` by **Cheeger
bisection of the Laplacian**.
- **64×64 "Stockfish ergonomics" is an exact identity:** `64×64 = 4096 cells =
4096 bit = 512 byte = 64 × u64` = **the CANON node stride**. A node's bits ARE a
bitboard; `masked_popcount_batch(words, mask)` IS `popcount(attacks & targets)`;
magic bitboards are the same LUT amortization as the `[a,b]` floor.
- **`symbiont/src/domino.rs` already proves the AMX path** — 4×4 Morton BF16
tiles, **16 SoA boards per AMX 16×16 tile GEMM**, cascade feedback, real
`TDPBF16PS` on Emerald Rapids.

**Rule:** **before writing a frame, grep the workspace for the frame.** The
`Consult, don't guess` ladder (card → knowledge doc → board → source) has no rung
for *"search the sibling crates for the thing you are about to build"* — four
misses in one document say it needs one. A measured number computed twice is not
a wrong number; it is a wasted one, and it hides the fact that the first
implementation already carried the caveats you were about to rediscover.

## 2026-08-11 — E-TOPOLOGY-PICKS-THE-TABLE-NOT-THE-DOMAIN-1

**Status:** FINDING `[G]` — `DistanceLut::circular()` proven a metric
EXHAUSTIVELY over all 256³ = 16 777 216 triples (`distance.rs`, 3 tests).

**Supersedes both `E-THE-REUSE-IS-THE-PROCESS-…-1` and
`E-JUDGE-THE-FIELD-NOT-THE-ELEMENT-1`.** Operator: *"distance.rs is normalized
[a,b] amortizing in LUT."*

**The LUT is the AMORTIZATION POINT, not merely a metric or a cache.**
`quantize()` normalizes `[a,b]` once per element at ingest; `from_floor()` folds
the *same* normalization into the table. Afterwards: no bounds, no division, no
per-element normalization — a pure index lookup, in **unit-free** units, which is
exactly what licenses cross-variable comparison. O(256²) once, not O(N²).

**Consequence:** if the LUT amortizes *any* bounded `[a,b]`, a **circular** range
is just another bounded range with a different formula. Built and proven:
`circular()` = `min(|a−b|, 256−|a−b|)`, the cycle-graph geodesic on `Z_256` —
**0 violations / 16 777 216 triples**, symmetric, identity, positive. Falsifier:
`d_circ(255,0) = 1` vs `d_linear(255,0) = 255`.

**So the crate's *"raw-azimuth is NOT a metric (the 2π wrap)"* is about the
FORMULA, not about angles.** `linear()` is the wrong table for a ring;
`distance_heuristic` uses no table at all. A wrapping quantity in the 256-palette
with the circular table is metric-safe and stays in the index domain.

| azimuth as | resolution | metric? | field shape |
|---|---|---|---|
| u16 raw + `linear()` | 0.0055° | **no** | not tileable |
| **u8 palette + `circular()`** | **0.352° mean** | **yes** | `&[u8]` · 128 KB L1 · `U8x64` · AMX |
| nearest-`n` | 0.972° mean | yes | single index |

The palette azimuth beats nearest-`n` **and** keeps the field ergonomics. The
previous entry was right about the ergonomics and wrong to treat them as
disqualifying: the fix was never "abandon the direct path", it was **give the
wrapping lane its own table**.

**Rule:** **a bounded quantity's TOPOLOGY selects its table formula; it never
decides whether the quantity belongs in the palette domain.** Amortization, L1
residency, `U8x64` lane and AMX plane are identical either way — that is what
makes the substrate general rather than per-quantity.

## 2026-08-11 — E-JUDGE-THE-FIELD-NOT-THE-ELEMENT-1

**Status:** FINDING `[G]` (crate-stated: `distance.rs:8-12`; `ndarray`
`int8_tile_gemm::int8_gemm_amx_tiled(a_u8, b_i8, …) -> [i32]`).

**Corrects `E-THE-REUSE-IS-THE-PROCESS-AND-IT-EXPOSED-A-FIT-PROBLEM-1` (below):
its 10× measurement stands, its VERDICT is inverted.**

**Operator:** *"you didn't factor in that due to normalized values the field has
different ergonomics than the single value — meaning AMX matmul, tile ops etc."*

**A normalized representation must be judged by what its FIELD does, not by what
one element decodes to.** The 10× scored **angular reconstruction error** — the
operation the substrate exists to avoid, and the exact metric this workspace
already ruled out for scoring a one-way address over a retained original. Third
instance of that error in one arc; this one landed three sections after the rule
was written down.

At field scale the ergonomics run the other way:

| | nearest-`n` | direct `(polar, azimuth)` |
|---|---|---|
| direction collapses to | **ONE index**, 256-palette domain | 3 lanes, one 16-bit **circular** |
| compare | 2 × `DistanceLut` u8 lookups — **L1 metric**, CAKES/CLAM-safe | **not a metric** — `distance.rs:8-10`, the 2π wrap "must never feed CAKES bounds" |
| LUT | 128 KB, L1/L2-resident, **`U8x64`-friendly** | 65536² is not a table |
| tile shape | a `&[u8]` plane → `int8_gemm_amx_tiled` **directly** | none |
| decode to compare? | **no** | **yes** |
| per-point error | 0.972° | 0.097° |

**Resolution — split by OPERATION, not a winner.** Compare/search/correlate a
field → the single-index path (this is what *"pay the inbound tax once"* buys,
and why palette256 is the same pattern one rank down). Materialize one bearing →
the direct path, 10× finer, but *"never reconstruct per element when the
representation is normalized"* makes that the rare path, not the design centre.

**Rule:** a per-element accuracy number is the round-trip metric wearing a
different hat. A representation can win it and simultaneously destroy the
index-domain comparison, the metric guarantee, and the tile shape that made the
substrate worth building. **Ask what the field does under the ops you actually
run — LUT, SIMD lane, tile/AMX — before ranking encodes.**

## 2026-08-11 — E-THE-REUSE-IS-THE-PROCESS-AND-IT-EXPOSED-A-FIT-PROBLEM-1

**Status:** FINDING `[G]` on the measurement (`crates/helix/tests/bearing_encode_paths.rs`,
Expand Down
29 changes: 29 additions & 0 deletions .claude/board/INTEGRATION_PLANS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,32 @@
## 2026-08-11 — weather-substrate-evaluation-v1 (EVALUATION PLAN; the known-vs-test ledger for the whole #915→#922 arc)

Plan: `.claude/plans/weather-substrate-evaluation-v1.md`. Operator ask: *"create
an evaluation plan with the details known vs what to test."* Two halves. **§1
KNOWN** — 25 claims (K-1..K-25), each with file:line evidence and an honest
grade split `[G]` / `[G-session]` (probe source committed, fixture fetched) /
`[H]` (measured this session, reproducer NOT committed — only K-12/K-13, the
latitude-band and palette-azimuth tables, whose scratch tests were deleted) /
`[G-absence]`. Every K-row was **independently verified against the tree by a
13-agent verify/attack workflow before the plan went ACTIVE** (7 Sonnet
source-verifiers over helix/quantize/probes/perturbation-sim/ndarray/domino/
splat3d/morton-comma; 6 Opus falsifier-auditors attacking the EV specs for
vacuous pass routes, missing silence halves, and inert thresholds — the
session's own recurring failure modes, §12.12–§12.17). **§3 TO TEST** — ten
probes EV-1..EV-10 in three waves: Wave 0 needs no data (EV-9 commits the
K-12/K-13 orphans); Wave 1 needs one `fetch.py` re-fetch (EV-1
advection-as-Morton-shift falsifier · EV-2 wind-lane field-level encode closing
§12.13–§12.15 · EV-3/EV-4 floor & window sweeps feeding operator decisions
D-1/D-2 · EV-5 U-shaped variables, the shape rule's other half · EV-6 harness
re-expression on the SHIPPED `RollingFloor` frame with an exact-number
equivalence gate · EV-8 Jirak effective-n · EV-10 second timestep/season);
Wave 2 is the operator-named 16k×16k 3DGS top-k scale run (EV-7a) + the
comma anti-moiré falsifier (EV-7b, two-sided: the regular-stride control MUST
alias or the fixture cannot falsify). **§5 decision register** D-1..D-6 keeps
the operator calls (noise floor, window, `from_bearing` API, dormant-lane fix,
helix CI, harness-of-record) separate from the tests that feed them. Binding
frame rules restated: bucket-CI vs noise floor never round-trip; Jirak
significance; *grep the workspace for the frame before writing one*. Doc-only.

## 2026-08-10 — weather-substrate-poc-v2 (PLAN; supersedes v1/#914)

Plan: `.claude/plans/weather-substrate-poc-v2.md`. **Supersedes `weather-substrate-poc-v1.md` (#914).** Restructured to the operator's three-phase gate: **A** representation reliability (`jc` battery) → **B** hardware acceleration (`ndarray` parity/throughput) → **C** prediction correctness (`jc` battery). A and C are the SAME instrument on different pairs (`corr(code_dist, field_dist)` vs `corr(predicted, observed)`), so C costs no new statistical machinery; B sits between because a Phase-C number measured on a silently-scalar path would be dishonest about the substrate. **Four corrections to v1 + this plan's own first draft:** (1) **GRIB2 is GONE** — WeatherBench2 publishes `era5/…1440x721.zarr` (= the 1,038,240 grid) on public GCS, so ingest is Zarr→numpy→f32 slab, no eccodes/gribberish, and v1 §6.3 is moot rather than solved; history sizing 58k→**570k** states (65 yr hourly). (2) `ecmwf-opendata` is **Phase C** (live IFS/AIFS), not Phase A (ERA5 reanalysis). (3) **Versioning is CONSUMED, not built** (operator: "lance 900..913++ should have introduced the necessary versioning") — `VersionedGraph::{at_version, current_version, commit_encounter_round}`, `GraphDiff`, `LanceCycleWriter` (#913 +1030), `temporal::{QueryReference::at(v,rung), deinterlace, LanceVersion}` are all shipped and pinned by two existing tests (`a_whole_cycle_of_casts_is_one_wal_write_one_version`, `p4a_drains_…`); **any weather deliverable re-implementing a version writer is the defect.** (4) **S3 is the hydration path, NEVER the store** (#901 doctrine) — the earlier "slabs land on S3, read them back" framing collapsed two layers; object store hydrates, local mmap-capable dir stores, `RAILWAY_VOL` only sets hydration frequency; the network-mount-looks-local trap is called out. **Ingest split** disposable Stage-A (static ERA5, thrown away) vs permanent Stage-C (recurring), sharing the 512 B stride + `soa:*` metadata so Stage-A slabs stay readable. **One dataset, versions are cycles** (operator ruling) — forecast+analysis in the same dataset, joined by version-range read. **All 3 comparison lanes** (forecast-vs-analysis · model-vs-model · encoder-drift; the third guards the substrate claim). **New repos: ZERO** — `crates/weather-poc` workspace-EXCLUDED on the perturbation-sim template; weatherbench2/arco-era5/ecmwf-opendata forks cloned, graphcast zipball-on-demand (under the 3-reads bar). Pins verified against the tree: rust 1.97.1 · lance/lance-encoding/lance-linalg 9.0.0 · lancedb 0.33.0 · arrow 58.3.0 · datafusion 53. Gate D-WXA-5: ρ ≥ 0.98 for ≥1 arm **AND** the shuffled-codebook control must FAIL. Doc-only.
Expand Down
4 changes: 3 additions & 1 deletion .claude/board/PR_ARC_INVENTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
- **Deferred.** **No public `from_bearing` was minted** — deliberately. The measurement says which path is right; the API shape (does the bearing write go through `ResidueEncoder`? where does `rim`'s `n` come from?) is an operator call, `[S]`. Also still open: the saturation-window widening; a citable per-variable noise floor; the U-shaped-variable falsifier. Filed-not-fixed: the `Signed360::sign()` dormant-lane defect.
- **Docs.** §12.13; EPIPHANIES `E-THE-REUSE-IS-THE-PROCESS-AND-IT-EXPOSED-A-FIT-PROBLEM-1`, which corrects `E-THE-DOCTRINE-DOC-EXISTED-AND-I-NEVER-READ-IT-1`'s "deliberately not built" framing while keeping its three surviving findings (`Signed360`-is-complete, the `Pair48` withdrawal, the mandatory `READ BY:` rule).

**Confidence (2026-08-11):** merged. The 10× is `[G]` — a committed, re-runnable test, not a one-off. `helix` is excluded from the root workspace and in no CI workflow `[G-absence]`, so it runs **only by hand**. The API shape is `[S]` and must not be built on before an operator decides it.
**Correction (2026-08-11, same session — operator):** *"you didn't factor in that due to normalized values the FIELD has different ergonomics than the single value — AMX matmul, tile ops etc."* **Correct, and it inverts the verdict.** The 10× scored **angular reconstruction error** — the one operation `§12.10` rules out and the substrate exists to avoid. At FIELD scale the ergonomics run the other way: Path A collapses direction to **one index in the 256-palette domain**, so comparison is `rim.distance_adaptive` = two `DistanceLut` u8 lookups — an **L1 metric**, CAKES/CLAM-safe, `U8x64`-friendly (`distance.rs:12`), and a `&[u8]` plane that feeds `ndarray`'s `int8_gemm_amx_tiled(a_u8, b_i8, …)` directly. Path B's azimuth is **16-bit and circular**, which `distance.rs:8-10` names explicitly as **NOT a metric** ("must never feed CAKES bounds") — no 256×256 LUT, no tile plane, and comparison would require decoding. **So: Path A for compare/search/correlate over a field (the substrate's reason-for-being); Path B only where a single bearing must actually be materialized.** The measurement stands; what was wrong was treating it as the deciding metric.

**Confidence (2026-08-11):** merged. The 10× is `[G]` — a committed, re-runnable test, not a one-off — **but it is not the deciding number; see the Correction above.** `helix` is excluded from the root workspace and in no CI workflow `[G-absence]`, so it runs **only by hand**. The API shape is `[S]` and must not be built on before an operator decides it.

## 2026-08-11 — lance-graph #920 (MERGED) — the probes RAN, and they falsified the doc that queued them: evaluation frame, Fisher-Z economics, and the helix regrade

Expand Down
20 changes: 20 additions & 0 deletions .claude/board/STATUS_BOARD.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
## weather-substrate-evaluation-v1 — EV queue (PRE-REGISTERED 2026-08-11)

Plan: `.claude/plans/weather-substrate-evaluation-v1.md` (known-vs-test ledger;
verify/attack-audited before ACTIVE). Waves: 0 = no data · 1 = one fixture
re-fetch · 2 = scale.

| D-id | Deliverable | Wave | Status | Feeds |
|---|---|---|---|---|
| EV-1 | Advection-as-Morton-shift falsifier (wind (dx,dy) tile shift vs persistence, calm-tile silence half) | 1 | Queued | §12.16 [S] regrade |
| EV-2 | Wind-lane encode at FIELD level (nearest-n vs u8-palette-circular vs u16-linear; wrap-corruption can-fire + 90°-sector silence) | 1 | Queued | D-3 |
| EV-3 | Floor-sensitivity sweep [0.1..2.0] K → per-variable flip-points | 1 | Queued | D-1 |
| EV-4 | Saturation-window sweep → sat% vs interior-CI tradeoff curve | 1 | Queued | D-2 |
| EV-5 | U-shaped variables (total_cloud_cover, sea_ice_cover) — the shape rule's OTHER half, two-sided by construction | 1 | Queued | E-TRANSFORM-SHAPE promotion/refutation |
| EV-6 | P1/P2 harness re-expressed on the SHIPPED RollingFloor frame; equivalence gate 0.848/0.820/95.65 + 0.9997/0.999556 to 1e-4 rel | 1 | Queued | D-6 |
| EV-7a | 16k×16k 3DGS top-k scale run (1 048 576 tiles; heel-reject ∉ {0%,100%}) | 2 | Queued | operator-named capability |
| EV-7b | Comma anti-moiré falsifier at tile scale (regular stride MUST alias; comma must not) | 2 | Queued | D-QUANTGATE evidence |
| EV-8 | Jirak effective-n for the P2 correlations (spatial autocorrelation → n_eff) | 1 | Queued | P5 |
| EV-9 | Commit the K-12/K-13 orphan measurements as disable-verified helix tests | 0 | Queued | honesty-split closure |
| EV-10 | Second timestep + season for P1 ([H]→promotion or timestep-conditional regrade) | 1 | Queued | K-9 robustness |

## oracle-funnel-probe v1 — PROBE-ORACLE-FUNNEL staged (PRE-REGISTERED 2026-08-05)

Plan: `.claude/plans/oracle-funnel-probe-v1.md`. Consumes OGAR #241/#244
Expand Down
Loading
Loading