eval plan (known vs test) + DistanceLut::circular() + field-ergonomics corrections - #923
Conversation
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."
Correct, and it reverses the recommendation. §12.13 ranked the two bearing
encodes by angular RECONSTRUCTION error — the operation §12.10 rules out and
the substrate exists to avoid. Third instance of that error in one arc, and
this one landed three sections after writing the rule down.
At field scale the ergonomics run the other way:
- nearest-n collapses direction to ONE index in the 256-palette domain, so
comparison is rim.distance_adaptive = two DistanceLut u8 lookups: an L1
metric with the triangle inequality, CAKES/CLAM-safe, U8x64-friendly
(distance.rs:12), and a &[u8] plane that feeds ndarray's
int8_gemm_amx_tiled(a_u8, b_i8, ...) -> [i32] directly.
- direct (polar, azimuth) has a 16-bit CIRCULAR azimuth, which distance.rs:8-10
names explicitly as NOT a metric ("the 2pi wrap ... must never feed CAKES
bounds"). No 256x256 LUT, no tile plane, and comparing would require decoding.
Resolution is a split by OPERATION, not a winner: single-index for
compare/search/correlate over a field (what "pay the inbound tax once" actually
buys, and why palette256 is the same pattern one rank down); direct write only
where one bearing must genuinely be materialized.
Rule extracted: a per-element accuracy number is the round-trip metric wearing
a different hat. A representation can win it while destroying the index-domain
comparison, the metric guarantee, and the tile shape that made the substrate
worth building.
The 10% measurement stands and is kept; only its verdict is corrected. Applied
as an append-only Correction line on the #921 arc entry plus its Confidence,
never an edit to the Locked text.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…the domain Operator: "distance.rs is normalized [a,b] amortizing in LUT." That is the load-bearing property and I had mis-stated it as "a metric/cache". quantize() normalizes [a,b] once per element at ingest; from_floor() folds the SAME normalization into the table. Afterwards there is no lo, no hi, no division, no per-element normalization — a pure index lookup in unit-free units, which is exactly what licenses cross-variable comparison. O(256^2) once instead of O(N^2). This is "pay the inbound tax once", instantiated. The consequence supersedes both §12.13 and §12.14: if the LUT amortizes ANY bounded [a,b], a circular range is just another bounded range needing a different formula. So distance.rs's "raw-azimuth is NOT a metric (the 2pi wrap)" is a statement about the FORMULA, not about angles — linear() is the wrong table for a ring, and distance_heuristic uses no table at all. Adds DistanceLut::circular() = min(|a-b|, 256-|a-b|), the cycle-graph geodesic on Z_256, with three tests: - exhaustive triangle inequality: 0 violations over all 256^3 = 16,777,216 triples (not a stride sample — a circular table is cheap enough to prove) - the wrap falsifier: d_circ(255,0) = 1 vs d_linear(255,0) = 255 - symmetry, identity, positivity, exhaustively Corrected standing for azimuth: u8 palette + circular() gives 0.352 deg mean (1.406 deg step), beats nearest-n's 0.972 deg, AND keeps the field ergonomics (&[u8] plane, 128 KB L1 LUT, U8x64, AMX-tileable). §12.14 was right about the ergonomics and wrong to treat them as disqualifying. Rule: a bounded quantity's TOPOLOGY selects its table formula; it never decides whether the quantity belongs in the palette domain. Gates: helix 80 lib + 15 integration tests green; my three files rustfmt- and clippy-clean. NOT fixed and NOT swept: two PRE-EXISTING clippy findings in files this change does not touch (src/walk_spectrum.rs:81, tests/probe_mantissa_fill.rs:174 — new lints from the 1.97 toolchain), left alone rather than reformatting code outside this change's scope. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…d the comma
Operator: "using [a,b] allows also perturbation ergonomics including testing
spatial gaussian splat (3dgs) over 16k x 16k topk ... or morton tile cascade ...
with irrational number pythagorean comma."
Every piece named already exists; verified rather than theorized:
- Perturbation phase = the DISCRETE Pythagorean comma, a stride-4-over-17
coprime walk, "integer, bit-exact, aperiodic", 0 STORED BITS, regenerated
from the address alone. 17 = 4^2+1 IS the comma ("without the +1, stride 4
mod 16 covers 4/16"). Fence run: comma_three_gap_distinct=3 (Steinhaus <=3),
comma_coprime_full_perm=1.
- Morton tile cascade: motion is O(1) in pixels. Measured dx=7 dy=5
bit_exact=1 motion_bytes=2 sprite_px=576; interior residual 0, only the
disocclusion strip is new (disocc_frac=0.1215).
- 3DGS: ndarray::hpc::splat3d is a feature-gated DIRECTORY (a first check for
splat3d.rs wrongly reported it absent) — gaussian/project/raster/tile/spd3/
sh/ply/depth_cascade, Kerbl SIGGRAPH 2023 SH layout, TILE_SIZE=16. Its
depth_cascade is ALREADY HHTL: HhtlTier, HhtlAction, heel_reject_mask.
At 16384^2 with TILE_SIZE 16 that is 1024x1024 = 1,048,576 tiles — the scale
at which staying in the index domain stops being an optimization.
Why the comma and not phi: in a quantized layer a regular tile grid plus a
regular perturbation aliases. The comma walk is the anti-moire dither and it is
free (phase is convention, not data). OGAR's D-QUANTGATE already rules exactly
this. prove.rs uses log2(3/2) as the CONTROL phi beats in the CONTINUOUS 2-D
discrepancy proof — a different question in a different layer, not a demotion.
Marked [S] and NOT measured: for weather, advection IS a Morton shift, which
would make the wind lane the transport operator for the scalar fields rather
than just another encoded field. Falsifier stated: derive (dx,dy) per tile from
wind across two ERA5 timesteps, shift 2m_temperature, measure residual against
the true next timestep vs a no-shift baseline.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…n Python
Operator: "also check lance-graph / crates / perturbation ... morton allows
64x64 stockfish ergonomics ... also check domino.rs." All three land.
(a) crates/perturbation-sim is the APPLIED instance of this whole thread:
rolling_floor.rs ("Belichtungsmesser cascade with preheated confidence-interval
thresholds"), splat.rs (Gaussian-splat MAGNITUDE side) + sketch.rs (Walsh/XOR
SIGN side) — literally OGAR's two-algebra rule — cascade_key.rs::morton48 (the
OGAR production HHTL address), hhtl.rs (HEEL/HIP/TWIG by Cheeger bisection of
the Laplacian), columns.rs (SoaMemberSpec, the #511 calibration).
(b) The expensive miss: perturbation_sim::RollingFloor ALREADY IS the corrected
evaluation frame of §12.10/§12.11 — threshold() = "the confidence-interval
floor" mu+k*sigma, z() = "the Jirak-honest noise-floor units; significance via
n^(p/2-1), not IID", band() -> Stable..Alarm, preheat(), observe() testing
against the floor as it stood. I rebuilt it by hand in Python after an operator
correction. It is the FOURTH instance of one frame (ndarray Cascade::expose,
perturbation-sim RollingFloor, helix RollingFloor, thinking-engine domino's
"3-sigma top-K"); the weather probe should have been the fifth instance, not a
fifth implementation.
(c) 64x64 "Stockfish ergonomics" is an exact identity: 64x64 = 4096 cells =
4096 bit = 512 byte = 64 x 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.
(d) symbiont/src/domino.rs already proves the AMX path on real hardware: 4x4
Morton BF16 tiles, 16 SoA boards per AMX 16x16 tile GEMM, cascade feedback,
TDPBF16PS on Emerald Rapids. It also states the consumer rule verbatim — all
SIMD through ndarray::simd::*, never ndarray::hpc::* directly.
Consequence, concrete: the P1/P2 probes should be re-expressed against the
shipped frame rather than carried as bespoke Python. The measured numbers stand
— they were computed correctly, just computed twice.
Rule extracted, fourth instance of one lesson: before writing a frame, grep the
workspace for the frame. The "Consult, don't guess" ladder has no rung for
"search the sibling crates for the thing you are about to build".
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…r (DRAFT) Operator: "please 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: [G] committed code/tests; [G-session] probe source committed, fixture fetched, run happened this session; [H] measured but reproducer NOT committed (only K-12/K-13 — the latitude-band and palette-azimuth tables whose scratch tests were deleted; §2 names this split, EV-9 closes it); [G-absence]. §3 TO TEST — EV-1..EV-10 in three waves: Wave 0 no data (EV-9 commits the orphan measurements); Wave 1 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 and window sweeps feeding D-1/D-2, EV-5 U-shaped variables — the shape rule's other half, two-sided by construction — 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 scale (EV-7a the operator-named 16k x 16k 3DGS top-k run over 1,048,576 tiles; EV-7b the comma anti-moire falsifier, 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. Every EV carries the discipline this arc kept tripping on: a named can-it-fail outcome, can-fire AND stay-silent halves on non-trivial inputs, no inert thresholds, provisional pins relative to measured baselines instead of magic numbers, and an apparatus check so a null cannot masquerade as a pass. Status: DRAFT — a 13-agent verify/attack workflow (7 source-verifiers over the K-ledger, 6 falsifier-auditors attacking the EV specs) is running; its verdicts fold in as §8 in the follow-up commit, which flips the plan ACTIVE. Board: INTEGRATION_PLANS.md prepend + STATUS_BOARD EV rows (all Queued), per the new-plan row of the board-hygiene table. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_3e47d5be-abf0-4410-855f-3f22cb2a0751) |
|
Warning Review limit reached
Next review available in: 13 seconds You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (9)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 24f19660c9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| - **Method:** 2 consecutive ERA5 timesteps; per tile (16×16 first, 64×64 | ||
| control) `(dx,dy) = round(mean 10m wind · 3600 s / 27.8 km)`; shift; residual | ||
| vs truth. At 0.25°/1 h, 10 m/s ≈ 1.3 cells — measurable, not sub-cell noise. |
There was a problem hiding this comment.
Convert zonal wind using latitude-dependent cell widths
For the global ERA5 fixture, a 0.25° longitude cell is approximately 27.8 km × cos(latitude), while only the meridional spacing stays near 27.8 km. Dividing both wind components by a constant 27.8 km therefore increasingly underestimates dx toward the poles (by 2× at 60° and much more at higher latitudes), so EV-1 can make the Morton shift appear worse than persistence for purely geometric reasons. Compute zonal displacement from each tile's latitude-dependent longitude spacing, separately from the meridional conversion.
Useful? React with 👍 / 👎.
| - **Method:** ERA5 10m u/v → bearings → three encodes (nearest-`n`; | ||
| u8-palette-circular; u16-linear). For sampled point pairs: true angular | ||
| difference vs table distance. Spearman ρ per encode (Jirak-cited | ||
| significance), plus a wrap-corruption COUNT for `linear()` (pairs straddling | ||
| 0°/360° whose rank inverts). |
There was a problem hiding this comment.
Use a circular high-resolution reference for EV-2
For pairs straddling 0°/360°, the proposed u16-linear arm assigns almost the maximum distance to nearly identical bearings, which is precisely the wrap corruption this EV is meant to detect. The subsequent gate nevertheless treats that arm as the “u16 ground-truth ranking,” so a correct palette-circular result can fail by disagreeing with the deliberately corrupted baseline. Use true angular distance or a high-resolution circular u16 distance as the reference, retaining u16-linear only as the negative control.
Useful? React with 👍 / 👎.
|
|
||
| | ID | Claim | Evidence | Grade | | ||
| |---|---|---|---| | ||
| | K-14 | `perturbation_sim::rolling_floor::RollingFloor` IS the corrected evaluation frame: `threshold()` = "the confidence-interval floor" `mu+k·σ`; `z()` = "the Jirak-honest noise-floor units; significance via n^(p/2−1), not IID"; `band()` → Stable…Alarm; `preheat()`; `observe()` tests against the floor as it stood | `crates/perturbation-sim/src/rolling_floor.rs` (~:93–145) | [G] | |
There was a problem hiding this comment.
Keep bucket-CI logic out of the instability RollingFloor
The cited perturbation_sim::RollingFloor does not implement the corrected P1 evaluation frame: it tracks the mean and standard deviation of mode-instability samples and exposes mu + k·sigma, but it accepts neither quantizer bucket edges nor a physical noise floor and cannot represent the unbounded CI of saturated buckets 0/255. By contrast, p1_ci_vs_floor.py computes each bucket's half-width in original units and handles saturation separately. Treating the former as the shipped replacement will either change the measured quantities or force EV-6 to reimplement the allegedly reused frame, so this claim and the EV-6 dependency should point to an actual bucket-CI abstraction.
Useful? React with 👍 / 👎.
| > integration-lead, measurement-skeptic-analog sessions, and ANY session | ||
| > executing an EV-* probe below. | ||
| > | ||
| > **Status:** DRAFT pending the verify/attack audit pass (§8) → then ACTIVE. |
There was a problem hiding this comment.
Resolve the plan status before queueing its probes
The plan remains marked DRAFT pending an audit in nonexistent §8, while STATUS_BOARD.md says it was audited before becoming ACTIVE and already queues EV-1 through EV-10. Mandatory readers therefore cannot determine whether they are authorized to execute the queue or must wait for an audit that has no section or completion record. Either record the completed audit and mark the plan ACTIVE, or keep the board entries gated.
Useful? React with 👍 / 👎.
… verdict inversions #923 merged with neither board file updated. It shipped a plan, public code, three epiphanies and four knowledge-doc corrections — squarely not hygiene-only, so the merged-PR row's obligations apply in full. The entry records what #923 settled: - Topology selects the TABLE FORMULA; it never decides whether a quantity belongs in the palette domain. circular() = min(|a-b|, 256-|a-b|) proven a metric EXHAUSTIVELY (0 violations / 16,777,216 triples), so distance.rs's "raw-azimuth is NOT a metric (the 2pi wrap)" is about the formula, not angles. - The LUT is the [a,b] amortization point: quantize() normalizes once at ingest, from_floor() folds the same normalization into the table, and afterwards comparisons are pure lookups in unit-free units. O(256^2) once instead of O(N^2). - Judge a normalized representation by what its FIELD does, not by what one element decodes to — a per-element accuracy number is the round-trip metric wearing a different hat. - Three verdict changes on ONE question are recorded as such: §12.13 ranked the bearing encodes by reconstruction error (the banned metric), §12.14 inverted it on field ergonomics, §12.15 found §12.14 too strong — the fix was never "abandon the direct path", it was give the wrapping lane its own table. - The expensive one: perturbation_sim::RollingFloor ALREADY IS the corrected evaluation frame, Jirak citation included, and I re-derived it in Python. It is the fourth instance of one frame in this workspace. Deferrals carried forward: the plan ships DRAFT-pending-audit (§8 folds a 13-agent verify/attack pass and flips it ACTIVE — that audit had NOT completed at merge, so any [H] row stays unconfirmed); no from_bearing minted; EV-1.. EV-10 all Queued; D-1..D-6 open; the dormant-lane defect filed not fixed. Also recorded: helix is root-workspace-excluded and in no CI workflow, so its tests run only by hand; two pre-existing 1.97 clippy findings were deliberately left alone rather than sweeping files outside scope; and the #922 merge race — five commits stacked on merged history, rebased and reopened as #923, with #922's description restored to describe only what it merged. This commit is hygiene-only, so per the termination clause it generates no further board obligations of its own. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…arvest-rfii13 eval plan ACTIVE: audit fold (22/24 claims confirmed, 0/11 specs sound → all v2) + #923 board record
…the ACTIVE plan #924 merged with neither board file updated. It was MIXED — hygiene for #923 plus the audit fold, the §3 v2 rewrite, §8, the DRAFT->ACTIVE flip, §12.18 and two board entries — so the merged-PR obligations apply to the non-hygiene half. The entry records what #924 settled: - The meta-finding: pre-registration review by independent adversarial readers is load-bearing, not ceremony. The audit split sharply by KIND of statement — 22 of 24 KNOWN claims CONFIRMED with file:line, but 0 of 11 EV test specs SOUND. The author was reliable about what IS and near-uniformly unreliable about what would FALSIFY, one document after being corrected for exactly those modes and citing the falsifiability rule inside the specs themselves. - Two [G] ledger corrections: the bitboard primitives are at ndarray/src/bitwise.rs, not src/hpc/; and "whole-field shift" overstated — legA rigid-translates a 24x24 SPRITE within a 256x256 field, toroidally, so §12.16's "2 bytes moves the whole field" is corrected by §12.18. Whole-field advection is one (dx,dy) PER TILE, which is what EV-1 actually tests. - The eleven spec defects catalogued by class, including the ones with teeth: a silence half that was an identity comparison; another that was an arithmetic tautology; a fixture that 404s at the pinned timestep feeding a pipeline whose anomaly step destroys the bound-mass under test; an "exact to 1e-4" gate over 3-sig-fig prose AND Monte-Carlo statistics; a "winter" run that could pass on stale summer bytes; and a missing cos(lat) wrong by up to 2.6x exactly where the probe would fire. Honest limit recorded in the Confidence line: the audit's verify half is [G] (source quotes), but its attack half is a DESIGN REVIEW, not a measurement — a v2 spec is audited, not validated. Validation is the probe run, and zero EVs have run. STATUS_BOARD gains a note that the rows' descriptions summarize v1 shapes while the specs are now v2. EV-9 (Wave 0) needs no data and is the unblocked next move; it closes the only two [H] rows. This commit is hygiene-only, so per the termination clause it generates no further board obligations of its own. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…ng, and the append-only audit could not fail Operator: "930 has comments / check also previous 5 / if you want go back another 5." All 68 review comments on #920-#930 enumerated and checked against the TREE, not the merge. Depth is non-uniform and said so: #922-#930 finding-by-finding; #920 (27) and #921 (5) spot-checked on P1/governance only (both clean), ~30 older findings there left explicitly UNVERIFIED. Clean: #922/#924/#925/#929 zero comments; all 27 of #926's findings fixed in the tree (equal-budget grid_pts + regenerated E2 JSON, seam-wrapping subgrid_min, find_center->None, F7d 35->40, CT_F12 NO-VERDICT, persisted storm metadata, np.roll longitude, __file__-relative write, net-decay E6, the 93-97%->90.9-94.3% headline); #923's plan-status P2 resolved. Three open, all frozen in append-only ledgers, all corrected in NEW entries: 1. "+92.76 Pa moves R2 in the 5th decimal" is refuted by the report's own carve table 15 lines above it: carve A's +92.76 Pa moved R2 0.9212->0.9129 (0.0083, THIRD decimal); carve D's +1.59 Pa moved it 2.4e-06 (SIXTH). The var() BUG was blind at every magnitude; the STATISTIC is near-blind only in the single-digit-Pa regime -- which is exactly where "lossless" was claimed. 2. "10 probe scripts with committed JSON" undercounts: 15 .py added, 11 with a committed .json. 3. "+13/-0, +10/-0, +0/-0": measured +13/-0, +17/-0, and EPIPHANIES absent from the net diff -- it was +1/-1 at 0f9e6bc (the in-place edit), zeroed by the revert. The +0/-0 was a revert artefact, not evidence of purity. And the audit METHOD is replaced: zero-deletions proves ADDITIVE, not PREPEND. The suffix check (new.endswith(old)) proves it. Both halves measured before banking: a constructed end-append scores zero-del=True/suffix=False; a true prepend True/True. It also fires on THIS PR (LATEST_STATE suffix=False at +15/-0) -- correctly, since #930 inserts table rows mid-file and composes an unmerged entry in place. A False is a demand for justification, not a verdict. Same defect shape as #930's relation error, twice in three days: two individually-true numbers asserted of one pair when each belongs to a different one. A figure-by-figure check cannot catch it; the relation must be evaluated as a claim. Already standing in report SS10.1 and the worker preamble of weather-w-probes-v1 (both verified present, not assumed). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
The arc's closing deliverables, rebased onto main after #922 merged mid-push: the evaluation plan (known vs to-test), the field-ergonomics corrections that reshaped it, and
DistanceLut::circular().The evaluation plan —
.claude/plans/weather-substrate-evaluation-v1.md§1 KNOWN: 25 claims (K-1..K-25), each with file:line evidence and an honest grade —
[G]committed code/tests ·[G-session]probe source committed, fixture fetched, run this session ·[H]measured but reproducer NOT committed (exactly two rows: the latitude-band and palette-azimuth tables, whose scratch tests were deleted — §2 names the split, EV-9 closes it) ·[G-absence](helix has no CI anywhere;HelixResiduehas zero writers/decoders).§3 TO TEST: EV-1..EV-10 in three waves
fetch.py)RollingFloorframe, exact-number equivalence gate (0.848/0.820/95.65 + 0.9997/0.999556 to 1e-4 rel) · EV-8 Jirak effective-n · EV-10 second timestep/season§5 decision register D-1..D-6 keeps the operator calls (noise floor · saturation window ·
from_bearingAPI · dormant-lane fix · helix CI · harness-of-record) separate from the tests that feed them.Every EV carries the discipline this arc kept tripping on: a named can-it-fail outcome, can-fire and stay-silent halves on non-trivial inputs, no inert thresholds, provisional pins relative to measured baselines, and an apparatus check so a null cannot masquerade as a pass.
Plan status: DRAFT-pending-audit by its own header. A 13-agent verify/attack workflow (7 source-verifiers over the K-ledger, 6 falsifier-auditors attacking the EV specs) is running; its verdicts land as §8 on this branch and flip the plan ACTIVE.
Also in this diff
DistanceLut::circular()—min(|a−b|, 256−|a−b|), the cycle-graph geodesic onZ_256, proven a metric exhaustively (0 violations / 16 777 216 triples), with the wrap falsifierd(255,0)=1vs linear 255. Topology picks the table formula; it never decides whether a quantity belongs in the palette domain (§12.15).n's single index is the L1-metric,U8x64, AMX-tileable shape. Resolved as a split by operation, then re-opened for the direct path bycircular().[a,b]domain carries perturbation (the discrete Pythagorean comma, 0 stored bits), Morton motion (2 bytes moves a field bit-exact), 3DGS (splat3d,TILE_SIZE=16, depth cascade already HHTL), the 64×64 = 4096 bit = 512 B = CANON-node-stride bitboard identity — and the honest finding that themu+kσevaluation frame ships four times in this workspace, so the weather probe must be its fifth instance, not fifth implementation.🤖 Generated with Claude Code
https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi