probe(weather): P1/P2/gate-1 RUN — and the evaluation frame itself was wrong - #920
Conversation
… it tests Steps 0-3 autoattended. Step 0 (P1) is RUN; the envelope-audit gate on P4 returned. Both falsified the knowledge doc written earlier this session. P1 (probes/weather-p1/, re-runnable, real ARCO-ERA5 2m_temperature, 1,038,240 gridpoints): - FISHER-Z DEGRADES A WEATHER PALETTE. Linear MAE 0.0684 K / 0 empty buckets / 115.7 effective, vs Fisher-Z MAE 0.2168 K / 76 empty / 28.1 effective. 3.2x worse, 228 of 256 buckets burned. Mechanism measured: arctanh moves resolution toward the bounds; ERA5 anomaly has 77% of mass inside |s|<0.25 (kurtosis +3.3) where a correlation-like control has 32.7% beyond 0.9. The transform must match the distribution shape. Falsifies doc 1.2; the helix crate is NOT impugned (its own r=sqrt(u) concentrates at the rim by construction). - ARCO-ERA5 HAS NO wind_speed VARIABLE (exhaustive: all 52 arrays). The doc's 6.5 Jensen-gap measurement cannot have come from this store. - Store object confirmed, validating the plan's C3 correction; 404 on a chunk is valid Zarr fill semantics, not a fetch failure. - Re-measured: blosc is variable-dependent (1.794x / 1.771x / 1.248x, not a single 1.27x); BF16 anomaly gain reproduced in DIRECTION only (74.9x under a zonal-mean climatology proxy vs the doc's unreproduced 97x). - Apparatus self-checked before any claim (BF16 helper verified <= 2^-9). Envelope audit (P4 premise): helix360 is NOT a wind-bearing carrier. Signed360 is ONE orientation, not two hemisphere codes; ResidueEdge cannot carry a hemisphere sign at all and has no azimuth; the crate states twice that no 2-DOF direction codec exists. P4 CANCELLED as specified. Also found: no per-value-lane reading selector exists in the contract (zero writers, zero decoders for the lane), and Signed360::sign() decodes a dormant all-zero lane as a definite Sign::Neg, against the CANON zero-fallback ladder. And the sharpest one: the doc's own C2 "correction" was itself the error -- the 12-byte Pair48 it rejected was the structurally correct answer. A correction carries a claim's burden of proof. Doc gains a READ-12-FIRST header + 12 (corrections, sections left standing and regraded, never silently edited). Two EPIPHANIES prepended. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
Board hygiene the previous commit dropped (a prepend used a leading-newline marker against a heading at byte 0, so the insert silently no-op'd while the code commit went through). - E-THE-TRANSFORM-MUST-MATCH-THE-DISTRIBUTION-SHAPE-1: Fisher-Z degrades a weather-anomaly palette 3.2x and burns 228 of 256 buckets; mechanism is distribution shape (mass in the middle vs at the bounds), measured with a control. Falsifies the doc's 1.2. The helix crate is not impugned. - E-A-CORRECTION-IS-A-CLAIM-AND-CARRIES-A-CLAIM-S-BURDEN-1: the ledger's own C2 correction was the error; the 12-byte Pair48 it rejected was right. Plus the structural finding that no per-value-lane reading selector exists, and a pre-existing dormant-lane sign defect. 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_4c6355a8-2a37-4277-a666-7b8115185a0d) |
📝 WalkthroughWalkthroughThe change adds reproducible ERA5 extraction and quantization probes, a Rust reliability validator, Signed360 regression tests, and updated documentation that corrects prior weather-substrate and direction-codec claims. ChangesWeather fixture and export pipeline
Quantization and reliability validation
Codec claims and evidence corrections
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant ERA5Zarr
participant FetchScripts
participant ProbeScripts
participant ReliabilityExample
participant EvidenceLedger
ERA5Zarr->>FetchScripts: metadata and weather chunks
FetchScripts->>ProbeScripts: decoded fixtures
ProbeScripts->>ProbeScripts: quantization and distance measurements
ProbeScripts->>ReliabilityExample: binary truth/reconstruction pairs
ReliabilityExample->>EvidenceLedger: reliability results
ProbeScripts->>EvidenceLedger: P1 and P2 findings
Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
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 |
… transform died Step 1 of the /goal directive. Re-scoped per 12.1 (which killed the shared Fisher-Z) and measured on real ERA5, 3 variables, 200k random cross-variable pairs each, Spearman rho of |palette index delta| against float z-domain truth. Shared canonical floor vs per-variable floors: T x Td (K x K ) 0.9996 vs 0.9994 T x u (K x m/s ) 0.9997 vs 0.8748 Td x u (K x m/s ) 0.9997 vs 0.8570 Anti-vacuity control (a shared window could have cost same-variable resolution, and did not): within-variable rho 0.9995-0.9998 either way, 118-151 effective buckets, ZERO empty. The shared floor beats per-variable exactly where units differ and is indistinguishable where they do not -- the discrimination pattern theory predicts, unturned. So the mechanism was never Fisher-Z, it was standardization; Fisher-Z was an extra layer measured harmful in 12.1. The product claim (correlate the normally-uncorrelatable via one cache-resident 256x256 LUT) STANDS, with a corrected mechanism. Policy: 4's option (a) one canonical z-floor is now the measured recommendation. P2 -> RUN/PASSES; P3 largely answered in the negative; step 3 (Phase A end-to-end) unblocked. Graded [H]: one timestep, zonal-mean climatology proxy, one differing unit -- boundaries stated in 12.8. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
Step 3's verification half. New example crates/jc/examples/ weather_substrate_reliability.rs runs jc::reliability (Pearson, Spearman, Cronbach alpha, ICC(2,1), ICC(3,1)) over the palette256 round-trip on real ERA5, 3 variables x 50k sampled points, shared canonical floor. pooled: r=0.998939 rho=0.999926 alpha=0.999435 icc2_1=0.998869 icc3_1=0.998870 jc rather than ndarray::hpc::reliability deliberately -- the mirror returns 0.0 sentinels where jc returns Option<f64>, so a 0.0 there is undefined-vs-zero ambiguous (the rule 9 already stated). Falsifiability: --shuffle is the can-it-fire control and collapses every statistic to noise (r/rho/alpha/ICC all within 0.013 of zero). And the two ICC forms are reported SEPARATELY on purpose -- consistency vs absolute agreement -- so a scale-shifting quantizer could not hide; measured, they agree to six decimals, so no scale shift is present. Significance is explicitly NOT claimed: per I-NOISE-FLOOR-JIRAK, weather fields are spatially autocorrelated so effective n is far below the nominal 50k and classical intervals would be wrong. Point estimates + control only. cargo fmt + clippy clean on the new example (jc is workspace-excluded; --manifest-path crates/jc/Cargo.toml). Doc gains 12.9. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…floor, not round-trip
Operator correction. Every P1 verdict was scored by encode/decode/reconstruct.
That is the wrong criterion for this substrate: the original is RETAINED
(public knowledge / hydratable column / Lance f32), the code is a one-way
address over it, so the question is whether the code's confidence interval
sits below the original's own noise floor -- deviation only matters where it
EXCEEDS what the original can resolve. Never round-trip.
Re-measured (probes/weather-p1/p1_noise_floor.py, same real ERA5 field),
fraction of points exceeding a candidate floor:
CI(mid) >0.25K >0.5K >1.0K >2.0K max
linear 0.094 K 0.76% 0.70% 0.60% 0.40% 17.55
fisherz varies 36.3% 0.69% 0.58% 0.40% 17.54
12.1 PARTIALLY REVERSED: at a 0.5-1K floor the paths are indistinguishable
and the exceedances are the SHARED saturation tail, not the transform.
"Actively harmful" was a metric artifact. What survives is bucket economy
(28 vs 116 effective addresses) -- a discrimination-granularity cost for
retrieval, which 12.8 already measured frame-correctly on code distances.
12.2 ground narrowed: the structural facts stand, but "no inverse exists"
was never a defect for a one-way address. What a wind lane needs is a
DEFINED bearing->address convention (the mint decision) plus CI-vs-floor
validation -- ~1.4-1.7 deg against the 10 deg METAR increment. The Pair48
successor returns strengthened; P4 stays cancelled as specified.
New finding neither frame gives alone: the shared saturation tail (0.4-0.7%
of points, max ~17.5K) is the ONLY real floor violation, and it lands on the
EXTREMES -- heat waves, cold outbreaks. The 0.4-99.6% window is inherited
from cognitive-substrate defaults; weather wants it widened or an overflow
lane. Now the top open item on the representation.
NOT pinned: the floor itself. 0.25/0.5/1/2 K is a reference class, not a
citation; no published ERA5 uncertainty was verified, so every verdict is
conditional on that class. Prerequisite before any [G] grade.
Meta: 12.3 said a correction carries a claim's burden. 12.1 WAS such a
correction and over-claimed by inheriting an evaluation frame unexamined.
The frame a measurement is scored in is itself a claim requiring an audit.
Also lands the previously-unpushed gate-1 jc commit (1b770fd).
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_1fe31757-3e4c-4e76-b2e4-3796db0c81d8) |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3f3ee72e84
ℹ️ 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".
| out={} | ||
| for name,(dev,ci) in paths.items(): | ||
| ci_mid = ci if ci is not None else float(wid[len(wid)//2]/2) | ||
| row=[float((dev>f).mean()) for f in FLOORS] |
There was a problem hiding this comment.
Compare bucket confidence intervals instead of decoded errors
The advertised noise-floor reframing still computes a round-trip reconstruction metric: dev is the distance from each original anomaly to its decoded bucket center, and this line counts dev > floor. It never compares the per-point bucket confidence interval to the floor (the Fisher widths are used only to print one midpoint), so the committed exceedance fractions and the conclusions in §12.10 are produced by the exact evaluation frame the commit says is invalid. Use the CI width for each encoded bucket, with explicit handling for the saturated edge buckets, when calculating these fractions.
Useful? React with 👍 / 👎.
| for var in ['2m_temperature','total_column_water_vapour','surface_pressure', | ||
| '10m_u_component_of_wind','10m_v_component_of_wind']: | ||
| a,ncomp,nraw=get(var,t) |
There was a problem hiding this comment.
Handle missing Zarr chunks in the initial fetch
On the documented 2021-06-15 fixture, the newly added README identifies total_column_water_vapour, surface_pressure, and 10m_v_component_of_wind as missing chunks with valid all-NaN fill semantics, yet this loop requests those variables through an uncaught urlopen. The second iteration therefore raises HTTPError: 404, terminating the documented python3 fetch.py reproduction before the manifest and aggregate measurements are written. Treat a 404 as a fill-valued chunk as the README specifies, or do not include known-missing variables in this fetch loop.
Useful? React with 👍 / 👎.
…e gate-1 commit
The gate-1 commit ran `cargo fmt --manifest-path crates/jc/Cargo.toml`
WITHOUT a file filter, which reformatted the entire jc crate, and then
`git add -A crates/jc` swept all of it in. Result: 1342 insertions / 489
deletions across 25 files I never authored, in a PR whose real surface is
one new example plus probes and docs.
Pure rustfmt restructuring, no semantic change -- but it triples the review
surface and buries the actual diff, and it is exactly the unique-file write
discipline the autoattended pattern (Rule 1) and the worker guardrails
(scope: touch only the files named) exist to enforce. I applied that rule to
delegated workers this session and then broke it myself in a commit I ran
centrally as orchestrator.
Reverted crates/jc/{src,examples} to the merge-base; only
examples/weather_substrate_reliability.rs (mine) remains. Verified after:
the example is rustfmt-clean in isolation and still runs green (pooled
r=0.998939 rho=0.999926 alpha=0.999435 icc2_1=0.998869 icc3_1=0.998870).
Rule for the next central gate run: scope `cargo fmt` to the file, never the
manifest, and never `git add -A <crate>` after a crate-wide formatter.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
P1 (correct, severe): 12.10 announced "compare CI thresholds to the noise floor, never round-trip" and then measured the round-trip anyway. p1_noise_floor.py computes dev = |bucket_center - original| (a decoded reconstruction error) and counts dev > floor; the CI values it computed were printed and discarded. Every number in 12.10's table was produced by the frame that section declares invalid. New probes/weather-p1/p1_ci_vs_floor.py does the real thing: per point, the confidence interval of the bucket it encodes to, in original units, with saturated edge buckets (0/255) reported separately as UNBOUNDED rather than folded in with a fake finite width. floor linear CI>floor fisherz CI>floor saturated(unbounded) 0.25K 0.0000% 95.65% 0.848% / 0.820% >=0.5K 0.0000% 0.0000% 0.848% / 0.820% interior CI: linear FLAT 0.09412K; fisherz 0.00000-0.42899K (med 0.00561) Versus the bogus table: linear is cleaner than reported (0% not 0.6-0.76%), fisherz at a tight floor is far worse (95.65% not 36.3%), and the mechanism is now explicit -- median CI across BUCKETS is 0.0056K but most POINTS sit in the few wide mid buckets. That is the 28.1-effective-buckets result restated in CI units, so the two measurements now cross-check, which 12.10 lacked. The headline SURVIVES and is cleaner: at a 0.5-1K floor the paths are identical and ONLY saturation matters. 12.1 stays partially reversed on better evidence -- fisherz is an address-economy failure that becomes a validity failure at 0.25K. P2: fetch.py raised an uncaught HTTPError on the first legitimately-missing chunk, killing the documented reproduction before the manifest was written -- while the README correctly documented 404 as valid fill semantics. Now returns the fill array and continues. Third-order lesson recorded: 12.10 was a correction that inherited the defect it was correcting. Naming a frame is not adopting it; the implementation is the claim. An external reviewer caught what two internal passes did not. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
|
@codex both findings accepted and fixed in P1 — you are exactly right, and it was worse than the diff showed. §12.10 announced "compare CI thresholds to the noise floor, never round-trip" and then measured the round-trip anyway: New
Interior CI: linear is flat at 0.09412 K; Fisher-Z spans 0.00000–0.42899 K, median 0.00561. Both directions moved: linear is cleaner than published (0 %, not 0.60–0.76 % — that was reconstruction noise), and Fisher-Z at a tight floor is far worse (95.65 %, not 36.3 %). The mechanism is now explicit: median CI across buckets is 0.0056 K, but most points sit in the few wide mid-range buckets. That's the independently-measured "28.1 effective buckets" result restated in CI units — so the two now cross-check, which the bad table couldn't. The headline conclusion survives on better evidence: at a 0.5–1 K floor the paths are identical and only saturation matters. P2 — correct, and it broke the documented repro. The lesson recorded in §12.11: §12.10 was itself a correction of §12.1, and it inherited the defect it was correcting — right frame in prose, wrong frame in code. Naming a frame is not adopting it; the implementation is the claim. Two internal passes missed this; an external reviewer did not. One thing I did not change: §12.10's wrong table stays in place under a Generated by Claude Code |
There was a problem hiding this comment.
Actionable comments posted: 14
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.claude/board/EPIPHANIES.md:
- Around line 6-21: Revise the Fisher-Z conclusions in the measured
`2m_temperature` entry to explicitly scope them to the tested ERA5 sample and
timestep. Reword “The transform must match the input distribution's shape” and
the generalization statement as sample-specific findings or clearly label them
as conjectures, while preserving the requirement to test a second variable and
season before `[G]`.
- Around line 8-15: Update the measurement record in EPIPHANIES.md to define
“effective buckets,” identify kurtosis +3.3 as Pearson or excess kurtosis, and
map every Blosc ratio to its variable and measurement setup. Add file-and-line
citations supporting end_idx monotonicity and the DistanceLut guarantee,
including the related entries around the cited sections, so all claims are
independently traceable.
In @.claude/knowledge/weather-normalized-substrate.md:
- Around line 703-717: Update the “Reading” text for the within-variable
comparison to acknowledge the measured dewpoint difference: replace claims that
the shared window “costs nothing” and has “zero” cost with wording such as “no
material measured cost at this sample size,” while preserving the reported table
values.
- Around line 745-752: Update section 12.9’s framing around jc::reliability to
identify it as an internal codec/consistency diagnostic for the palette256
round-trip, not evidence that the representation is valid for product use or
supports the noise-floor conclusion. Keep the distinction from the product
evaluation framing in section 12.10 explicit.
- Around line 667-677: Mark the earlier probe-queue tables around the P1/P2/P4
entries and the “not yet runnable” results summary as historical, using a clear
as-of label. Preserve the original statuses and evidence, while directing
readers to the updated §12.6 statuses so they do not treat them as current.
- Around line 612-619: Mark the Pair48 design statement as a conjecture with [S]
and remove language presenting it as the “correct shape” before promotion. Link
the statement to the envelope-audit result in §12.2 and the operator-gated mint
decision in §12.6, while preserving the discriminant and ownership details.
- Around line 836-849: Revise the shared saturation-tail passage to state that
the “only violation” conclusion holds only for noise floors of 0.5 K or higher,
while a 0.25 K floor yields 95.65% Fisher-Z interior CI exceedance. Include the
path-specific saturation rates of 0.848% and 0.820%, explicitly identifying
their denominator, and keep all floor-dependent conclusions conditional until
each per-variable noise floor has a citation.
In `@crates/jc/examples/weather_substrate_reliability.rs`:
- Around line 38-46: Add a #[cfg(test)] module alongside the weather parser
implementation, covering valid little-endian input, truncated payload handling,
negative dimensions, and overflowing dimensions. Exercise the parser entry point
and read_f64s behavior using representative payloads, preserving the
producer-consumer contract defined by export_for_jc.py.
- Around line 81-98: Update the header parsing in the weather reliability
example to validate both i64 dimensions are non-negative before converting them
to usize. Use checked arithmetic when computing the payload size in want, reject
overflow or invalid dimensions with the existing error-and-exit behavior, and
only proceed to payload access after these validations succeed.
In `@probes/weather-p1/fetch.py`:
- Around line 22-24: Implement Zarr missing-chunk handling in both fetch paths:
in probes/weather-p1/fetch.py lines 22-24, either catch HTTP 404 and build the
variable chunk from za["fill_value"] or restrict the script to the documented
temperature-only fetch; in probes/weather-p1/fetch_bg.py line 13, handle HTTP
404 without retries, save the implicit fill-value fixture, and record an
explicit manifest status.
In `@probes/weather-p1/p1_noise_floor.py`:
- Around line 23-24: Update the Fisher-Z width calculation in the `fisher_z`
path to generate 257 transformed bin edges, compute each bucket’s interval from
adjacent edge pairs, and derive the half-bucket widths from those intervals.
Ensure the result has 256 entries so bucket index 255 uses its own span and
produces corrected `ci_mid_K` and `ci_by_position_K` values.
In `@probes/weather-p1/p1_probe.py`:
- Around line 52-68: Compute occupancy entropy from occ and occ_lin using their
normalized bucket probabilities, handling zero-count buckets safely, and persist
the results in r for both the primary palette path and the LINEAR control path.
Use distinct metric keys consistent with the existing palette256 and
palette256_LINEAR naming.
In `@probes/weather-p1/p2_probe.py`:
- Around line 49-51: Update the result handling near the `res['pairs'][key]`
assignment and status print to apply the required rho threshold explicitly,
rather than labeling `SHARED` solely from `r_sh > r_pv`. Record whether each
pair meets the threshold using unrounded values, and mark the run below target
when it does not unless an approved acceptance rule is present.
In `@probes/weather-p1/verify_apparatus.py`:
- Around line 12-13: Update the BF16 self-check around the `rel<=2**-9+1e-12`
condition to terminate unsuccessfully when any relative error exceeds the
threshold. Preserve the diagnostic output, then raise an exception or exit with
a nonzero status before producing mechanism output; retain successful
continuation when all values pass.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: b98a956f-eab0-480f-866a-16eb4cd3c858
⛔ Files ignored due to path filters (1)
probes/weather-p1/jc_input.binis excluded by!**/*.bin
📒 Files selected for processing (39)
.claude/board/EPIPHANIES.md.claude/knowledge/weather-normalized-substrate.mdcrates/jc/examples/ontology_locality_probe.rscrates/jc/examples/osint_edge_traversal.rscrates/jc/examples/probe_p1.rscrates/jc/examples/prove_it.rscrates/jc/examples/sigma_probe.rscrates/jc/examples/splat_jaccard_adamic_adar.rscrates/jc/examples/splat_louvain_modularity.rscrates/jc/examples/splat_lpa_label_propagation.rscrates/jc/examples/splat_perturbationslernen.rscrates/jc/examples/splat_to_ewa_bridge.rscrates/jc/examples/splat_triangle_count.rscrates/jc/examples/style_table_agreement.rscrates/jc/examples/weather_substrate_reliability.rscrates/jc/src/dueker_zoubouloglou.rscrates/jc/src/ewa_sandwich.rscrates/jc/src/ewa_sandwich_3d.rscrates/jc/src/hambly_lyons.rscrates/jc/src/jirak.rscrates/jc/src/koestenberger.rscrates/jc/src/pflug.rscrates/jc/src/precond.rscrates/jc/src/probe_p1_gamma_phase.rscrates/jc/src/reliability.rscrates/jc/src/sigma_codebook_probe.rscrates/jc/src/substrate.rscrates/jc/src/weyl.rsprobes/weather-p1/README.mdprobes/weather-p1/export_for_jc.pyprobes/weather-p1/fetch.pyprobes/weather-p1/fetch_bg.pyprobes/weather-p1/p1_noise_floor.jsonprobes/weather-p1/p1_noise_floor.pyprobes/weather-p1/p1_probe.pyprobes/weather-p1/p1_results_temperature.jsonprobes/weather-p1/p2_probe.pyprobes/weather-p1/p2_results.jsonprobes/weather-p1/verify_apparatus.py
Review Follow-upBoth findings are addressed in
No additional code changes were necessary, so I did not create a redundant commit or stacked pull request. The unrelated pre-existing Testing
|
…t another over-claim 14 review comments triaged; the code fixes surfaced a real defect in my own reported result. THE FIND: p2_probe.py labelled a pair "SHARED" purely because shared > per- variable, never testing the bar. With an explicit pre-registered TARGET_RHO and unrounded printing, T x Td is 0.999556 -- BELOW the 0.9996 bar that 12.8 reported as "0.9996". Two of three pairs pass; the K x K pair does not. 12.8 corrected; the cross-unit conclusion (the case the probe was built for) is unaffected. Code fixes: - verify_apparatus.py: BF16 self-check printed BROKEN and CONTINUED. A guard that cannot fail is not a guard (this repo's own falsifiability rule). Now exits nonzero before emitting any measurement. - p2_probe.py: explicit TARGET_RHO, meets_target + shared_beats_per_variable recorded separately, 6-decimal printing. - jc example: parse_header() validates non-negative dims and uses checked arithmetic -- a negative i64 became a huge usize and could pass a wrapped length check. Plus 6 unit tests (valid, truncated header, truncated payload, negative dims, overflow, read_f64s LE+advance). 6/6 green. - fetch_bg.py: 404 is valid Zarr fill semantics, so retrying 3x can never succeed. Now recorded as missing_chunk_all_fill without retry. - p1_probe.py: persists effective-bucket entropy for both paths (the README quoted numbers the JSON did not contain). - p1_noise_floor.py: SUPERSEDED banner (its dev is a decoded reconstruction error, superseded by p1_ci_vs_floor.py) + fisher widths now from 257 EDGES, not 255 adjacent centre spacings. Doc fixes: - 12.9 scoped: jc::reliability is a round-trip CODEC diagnostic, explicitly NOT product-frame evidence and never citable for the noise-floor claim. - 12.11 saturation: "only violation" now conditional on floors >= 0.5K, with path-specific rates and their denominator; at 0.25K fisherz adds 95.65%. - 12.8: "costs nothing" -> "no material measured cost at this sample size". - 12.2: Pair48 marked [S] conjecture, gated on the operator mint decision. - EPIPHANIES: Fisher-Z generalization labelled [S] and scoped to the tested sample; "effective buckets" and "excess kurtosis" defined; blosc ratios mapped to their variables; file:line added for end_idx monotonicity and the DistanceLut guarantee. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
|
@coderabbitai all 14 addressed in The find: the threshold comment exposed a below-target pairYour point that
§12.8 reported that first pair as "0.9996" — a rounding of 0.999556, which is below the 0.9996 bar. Two of three pass; the same-unit pair does not. Corrected in place with a Code
Docs
One I did not do as asked: the earlier probe-queue tables stay as-is rather than getting an "as-of" label, because §12.6 already re-grades them and the doc's Note the walkthrough is reviewing Generated by Claude Code |
|
Tip For best results, initiate chat on the files or code changes.
The The code changes address the reported failure modes. In particular, the CI-versus-floor measurement now uses the declared evaluation frame, saturated buckets remain unbounded, and Keeping prior tables with the 🐇 ✓ ✏️ Learnings added
If you found this review helpful, would you consider giving us a shout-out on X? Thank you for using CodeRabbit! You are interacting with an AI system. |
…read Operator-directed, closing the helix arc. Authority is .claude/knowledge/helix-cartesian-vs-fisher2z.md — a doc in this repo whose READ BY: header names "ANY session that encodes/decodes/renders an orientation, normal, or direction", which this arc never opened. Source-first was mistaken for doctrine-first; four corrections were written blind. The name: "helix360" does not exist and never did [G-absence]. Pickaxe over full history (all refs + unreachable objects) returns 12 blobs, all authored by this session, zero deletions, zero blast radius. The symbol is Signed360. Three regrades to §12.2 — the FACTS stood, the INFERENCES did not: - Signed360 alone is a COMPLETE full-sphere direction; the sign partition is what makes it whole. No second helix is needed. - ResidueEdge/rim is the METRIC carrier, not a render input; direction lives in (polar, azimuth). This is the operator's "ResidueEdge is turbovec". - The crate's "no free 2-DOF direction codec" means no HELPER, not no CAPACITY: azimuth is a full-360-degree 16-bit field (residue.rs:85); what is absent is from_normal (a nearest spherical-Fibonacci search). - The "metric hazard" was already crate-documented as the raw-azimuth 2-pi wrap (residue.rs:52-59). Rim = L1-metric, azimuth = circular render carrier: a split, not a defect. Routing a bearing through the metric field was my error, not a property of the codec. Decision WITHDRAWN, not deferred: the Pair48 mint. Its premise (a second helix completes the direction) is false. Still standing: no per-value-lane reading selector exists [G-absence]; the Signed360::sign() all-zero dormant-lane defect (filed, unfixed). Board: prepends E-THE-DOCTRINE-DOC-EXISTED-AND-I-NEVER-READ-IT-1 and updates the two affected entries' Status lines (the only edit append-only permits). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
Clears the failing CodeRabbit pre-merge check (61.79% vs an 80% threshold). Measured on the Python probes alone: 47.6% -> 100%. Purely additive (26 insertions, 0 deletions); no logic, no numbers, no control flow touched, all eight scripts still compile. The two module docstrings are the ones that carry real information: fetch.py and fetch_bg.py now state the Zarr v2 fill semantics AT the code that implements them -- a 404 is an all-fill_value chunk, not a fetch failure -- instead of only in README.md. That separation is the same small-scale shape as this arc's main lesson: source that is truthful about what it does, silent about the doctrine that interprets it. Reviewed while here, no change needed: - CodeRabbit's p1_noise_floor.py:24 finding (adjacent-CENTRE spacing, 255 spans for 256 buckets) is already fixed at lines 34-36/51 and the bot self-marked it addressed; its prescribed edge-based formula is exactly what the live replacement p1_ci_vs_floor.py:17,47 already computes (257 edges through tanh, halved adjacent diffs, index 255 using its own span). An independent re-derivation of the 12.11 correction. - p1_ci_vs_floor.json re-verified for internal consistency without the fixture: linear buckets uniform to 3.8e-14 relative (float ulp), Fisher-Z spread 396152x, exceedance monotone non-increasing in floor, and 0.848% / 0.820% / 95.65% matching doc 12.11 exactly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
|
Scope correction on the auto-walkthrough (one point, then I'll stay quiet). The walkthrough lists a "Rust formatting normalization — — all under On the Re-verified the committed results without the fixture (cleared by a container reset), by internal consistency alone: linear buckets uniform to 3.8e-14 relative (float ulp from Docstring check cleared in |
…alone Operator asked "did you test signed360?". No — §12.12 was written from doc comments and a knowledge doc with nothing executed, which is the failure it diagnoses one level down: having just written "reading the primary source is not the same as reading the doctrine", I read both and ran neither. The crate's suite is 77 + 4 + 7 doctests, all green, but a green suite is not evidence for a specific claim. Audited claim-by-claim; two had nothing behind them: - "azimuth is a full-360° field" rested on a doc comment. The existing signed360_azimuth_varies_with_n asserts a != b for ONE consecutive pair, which golden-angle stepping makes true of any sane implementation — it cannot detect a truncated field. Measured over the whole domain: min 0, max 65535, 256/256 coarse arcs occupied, 54319 distinct values. - "an all-zero lane reports a definite sign" was asserted twice and never constructed. Demonstrated: from_bytes([0u8; 6]).sign() -> Sign::Neg. Also measured: polar partitions fill their halves exactly (Pos [128,255], Neg [0,127]), no overlap, no gap. Three tests, each disable-verified red-then-green against an injected defect: 10-bit truncation -> left 1023 right 65535; the #498 centred-at-128 round -> left (0,128) right (0,127); a "fixed" sentinel -> left Pos right Neg. The third pins a DEFECT, not a virtue: when the dormant-lane hazard is fixed it must fail and be re-pinned deliberately, never silently edited. Scope caveat stated in the doc rather than implied: helix is excluded from the root workspace and named in no CI workflow, so these run only by hand. 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_42dcf63b-51a5-4023-852f-d8f4dcf7c991) |
There was a problem hiding this comment.
Actionable comments posted: 11
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
.claude/knowledge/weather-normalized-substrate.md (2)
620-629: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winRetire the stale
Pair48candidate.Section §12.12 states that the
Pair48mint is withdrawn. This block still presents it as a live[S]candidate, assigns a new tenant, and points to §12.6 as an open operator decision. Mark this block as historical and superseded by §12.12, or remove the mint instructions.Proposed wording
-**Candidate shape `[S]` if a from/to pair is genuinely needed** +**Historical candidate shape `[S]`; withdrawn by §12.12 and must not be minted**🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.claude/knowledge/weather-normalized-substrate.md around lines 620 - 629, Retire the stale Pair48 candidate block: remove its live minting and tenant-allocation instructions, or clearly mark it as historical and superseded by §12.12. Eliminate the reference to §12.6 as an open operator decision while preserving any necessary historical context.
762-765: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winDo not record P2 as an unqualified pass.
p2_probe.pyapplies the0.9996target to all three pairs. The K×K pair scores0.999556, so P2 isRUN — PARTIAL. If P2 is intended to gate only cross-unit pairs, state that scope in the queue criterion and status.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.claude/knowledge/weather-normalized-substrate.md around lines 762 - 765, Update the P2 probe-queue status to RUN — PARTIAL because the K×K pair scores 0.999556 against the 0.9996 target. Either preserve that qualified status or explicitly state that P2 gates only cross-unit pairs in both the criterion and status; do not record an unqualified pass.
🧹 Nitpick comments (1)
crates/helix/tests/signed360_claims.rs (1)
40-63: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winAssert every value in each polar partition.
The current minimum and maximum assertions do not prove that every byte in
[128, 255]and[0, 127]occurs. An encoder that emits only the endpoints can pass. Record observed values and assert that all 128 entries in both partitions are present.The contract in
crates/helix/src/residue.rs, Lines 182-204, is the basis for this coverage requirement.Proposed test strengthening
let (mut pos_lo, mut pos_hi) = (255u8, 0u8); let (mut neg_lo, mut neg_hi) = (255u8, 0u8); + let mut pos_seen = [false; 128]; + let mut neg_seen = [false; 128]; for n in 0..65_536usize { let p = enc.encode_signed(7, n, Sign::Pos).polar; let q = enc.encode_signed(7, n, Sign::Neg).polar; pos_lo = pos_lo.min(p); pos_hi = pos_hi.max(p); neg_lo = neg_lo.min(q); neg_hi = neg_hi.max(q); + if p >= 128 { + pos_seen[(p - 128) as usize] = true; + } + if q <= 127 { + neg_seen[q as usize] = true; + } } assert_eq!((pos_lo, pos_hi), (128, 255), "Pos must fill [128,255] exactly"); assert_eq!((neg_lo, neg_hi), (0, 127), "Neg must fill [0,127] exactly"); + assert!(pos_seen.iter().all(|seen| *seen)); + assert!(neg_seen.iter().all(|seen| *seen));🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@crates/helix/tests/signed360_claims.rs` around lines 40 - 63, Strengthen polar_partitions_are_exactly_the_two_halves by recording each observed Pos and Neg polar byte, such as with 128-entry presence tracking, while retaining the existing range assertions. After the loop, assert that every value in 128..=255 was observed for Pos and every value in 0..=127 was observed for Neg, using the partition contract in ResidueEncoder::encode_signed.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In @.claude/board/EPIPHANIES.md:
- Around line 157-160: Update the retained paragraph at the
`helix360`/two-hemisphere codec entry to remove the stale interpretation and
contradiction: either mark it withdrawn or rewrite it to identify `Signed360` as
the complete full-sphere direction codec, consistent with the surrounding
correction.
- Around line 95-97: Revise the provenance conclusion in §6.5 to avoid claiming
the Jensen-gap measurement could not come from Phase-A solely because no array
is named wind_speed. Trace the producer and averaging window for the reported
value, accounting for derivation from the Phase-A u/v wind-component arrays, or
narrow the statement to confirm only that Phase-A lacks an array explicitly
named wind_speed.
In @.claude/knowledge/weather-normalized-substrate.md:
- Around line 898-909: Label section §12.11 explicitly as a probe result, update
its heading or opening metadata without changing the measurements, and record
the exact run or result artifact used for these findings. Preserve the existing
conditional promotion status and ensure the claim follows the claim → probe →
run → record/promote cycle.
In `@crates/helix/tests/signed360_claims.rs`:
- Around line 1-7: Move the regression tests from the integration-test file into
a #[cfg(test)] module alongside Signed360 and ResidueEncoder in residue.rs. Keep
the tests focused on those implementations and preserve their existing coverage;
only retain the integration location if an approved public-API coverage
exception is documented.
- Around line 9-10: Update the CI workflow to run the helix regression tests
using cargo test --manifest-path crates/helix/Cargo.toml. Locate the existing
test steps and add this command without changing the crates/helix test
configuration.
In `@probes/weather-p1/export_for_jc.py`:
- Line 6: Update the docstring for load(v) to describe the returned zonal-mean
anomaly in native units rather than K, since values remain in their
fixture-specific units such as m/s or K.
- Line 7: Update the fixture-loading and anomaly calculation expression in
export_for_jc.py to preserve a validity mask for Zarr fill values, compute each
row’s mean using only valid cells, and reject or omit rows with no valid cells
before subtracting the mean. Handle both NaN and numeric fill values; do not
rely on np.nanmean alone.
In `@probes/weather-p1/fetch_bg.py`:
- Around line 37-38: Update the HTTPError handling in the retry loop around the
attempt request so only transient statuses, such as 429 and 5xx responses,
trigger the existing retry message and delay. Preserve the immediate failure
behavior for 404 and extend it to permanent 4xx responses such as 400, 401, and
403, while retaining retries for classified transient errors.
- Around line 1-7: Update the 404 handling in the fetch flow to reuse get’s
fill-array fallback, save that array to fixture/<var>.npy, and record the
normalized fill value in out[var] before leaving the retry loop. Apply the same
behavior to the corresponding retry branch covering the additional referenced
lines, ensuring export_for_jc.load can consume valid 404 results.
In `@probes/weather-p1/p1_noise_floor.py`:
- Line 18: Split the semicolon-separated statements into separate lines to
resolve Ruff E702: in probes/weather-p1/p1_noise_floor.py lines 18-18, separate
the climatology and anomaly assignments; in probes/weather-p1/p1_ci_vs_floor.py
lines 9-9, separate those assignments, lines 12-12, separate clipping from
return, and lines 45-46, separate the percentile, scale, and Fisher-Z
assignments.
In `@probes/weather-p1/verify_apparatus.py`:
- Around line 15-20: Update the BF16 validation in the apparatus self-check to
use 2**-8 as the normal-finite relative-error limit, replacing the current 2**-9
threshold and corresponding message. Add a midpoint input such as 1.0 + 2**-8 to
the helper validation cases so round-to-nearest-even tie handling is exercised.
---
Outside diff comments:
In @.claude/knowledge/weather-normalized-substrate.md:
- Around line 620-629: Retire the stale Pair48 candidate block: remove its live
minting and tenant-allocation instructions, or clearly mark it as historical and
superseded by §12.12. Eliminate the reference to §12.6 as an open operator
decision while preserving any necessary historical context.
- Around line 762-765: Update the P2 probe-queue status to RUN — PARTIAL because
the K×K pair scores 0.999556 against the 0.9996 target. Either preserve that
qualified status or explicitly state that P2 gates only cross-unit pairs in both
the criterion and status; do not record an unqualified pass.
---
Nitpick comments:
In `@crates/helix/tests/signed360_claims.rs`:
- Around line 40-63: Strengthen polar_partitions_are_exactly_the_two_halves by
recording each observed Pos and Neg polar byte, such as with 128-entry presence
tracking, while retaining the existing range assertions. After the loop, assert
that every value in 128..=255 was observed for Pos and every value in 0..=127
was observed for Neg, using the partition contract in
ResidueEncoder::encode_signed.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 73c7eac0-c41e-4257-9e2e-4a274c6d512a
📒 Files selected for processing (15)
.claude/board/EPIPHANIES.md.claude/knowledge/weather-normalized-substrate.mdcrates/helix/tests/signed360_claims.rscrates/jc/examples/weather_substrate_reliability.rsprobes/weather-p1/export_for_jc.pyprobes/weather-p1/fetch.pyprobes/weather-p1/fetch_bg.pyprobes/weather-p1/p1_ci_vs_floor.jsonprobes/weather-p1/p1_ci_vs_floor.pyprobes/weather-p1/p1_noise_floor.pyprobes/weather-p1/p1_probe.pyprobes/weather-p1/p1_results_temperature.jsonprobes/weather-p1/p2_probe.pyprobes/weather-p1/p2_results.jsonprobes/weather-p1/verify_apparatus.py
🚧 Files skipped from review as they are similar to previous changes (3)
- probes/weather-p1/p1_results_temperature.json
- crates/jc/examples/weather_substrate_reliability.rs
- probes/weather-p1/p2_probe.py
| Also measured: ARCO-ERA5 has **no `wind_speed` variable** (exhaustive, all 52 | ||
| arrays), so §6.5's Jensen-gap measurement cannot have come from the Phase-A | ||
| store; blosc is variable-dependent — **1.794×** (`2m_temperature`), **1.771×** |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -u
printf '%s\n' '--- target file status and changed lines ---'
git status --short -- .claude/board/EPIPHANIES.md
git diff -- .claude/board/EPIPHANIES.md | sed -n '1,240p'
printf '%s\n' '--- file outline and focused sections ---'
if command -v ast-grep >/dev/null 2>&1; then
ast-grep outline .claude/board/EPIPHANIES.md 2>/dev/null | sed -n '1,160p' || true
fi
wc -l .claude/board/EPIPHANIES.md
cat -n .claude/board/EPIPHANIES.md | sed -n '1,190p'
printf '%s\n' '--- provenance and wind references ---'
rg -n -C 4 '§6\.5|6\.5|Jensen|wind_speed|wind speed|wind components|u10|v10|10m.*wind|wind_.*component|component.*wind|ARCO-ERA5|Phase-A' . --glob '!node_modules' --glob '!dist' --glob '!build' | sed -n '1,320p'
printf '%s\n' '--- recent concise history for target file ---'
git log --oneline --follow -- .claude/board/EPIPHANIES.md | sed -n '1,30p'Repository: AdaWorldAPI/lance-graph
Length of output: 50379
🏁 Script executed:
#!/bin/bash
set -u
printf '%s\n' '--- candidate files ---'
fd -i -t f 'weather-normalized-substrate|README|fetch|probe|verify|jensen|wind' .claude probes | sed -n '1,160p'
printf '%s\n' '--- exact §6.5 and Jensen references ---'
rg -n -C 8 '§?6\.5|Jensen|hypot\(ū|hypot|mean.*magnitude|magnitude.*mean|wind speed|wind_speed|component_of_wind' \
.claude/knowledge probes/weather-p1 --glob '*.md' --glob '*.py' --glob '*.json' --glob '*.txt' | sed -n '1,280p'
printf '%s\n' '--- relevant source listings and metadata references ---'
rg -n -C 5 'ARCO|Phase.?A|zarr|wind|speed|component' \
.claude/knowledge/weather-normalized-substrate.md probes/weather-p1 \
--glob '*.md' --glob '*.py' --glob '*.json' --glob '*.txt' | sed -n '1,320p'Repository: AdaWorldAPI/lance-graph
Length of output: 50381
🏁 Script executed:
#!/bin/bash
set -u
python3 - <<'PY'
from pathlib import Path
import re
root = Path(".")
target = root / ".claude/board/EPIPHANIES.md"
knowledge = root / ".claude/knowledge/weather-normalized-substrate.md"
readme = root / "probes/weather-p1/README.md"
fetch = root / "probes/weather-p1/fetch_bg.py"
for path in (target, knowledge, readme, fetch):
print(f"{path}: exists={path.is_file()}")
text = readme.read_text()
arrays = re.search(r"wind-related are exactly\s*\n?([^.]*)\.", text, re.S)
print("README wind-array statement:", " ".join(arrays.group(1).split()) if arrays else "not found")
print("README says no wind_speed:", "`wind_speed` variable at all" in text)
doc = knowledge.read_text()
section = re.search(r"### 12\.4 — Measurement provenance.*?(?=\n### |\Z)", doc, re.S)
print("§12.4 contains no-wind_speed claim:",
bool(section and "no `wind_speed` variable" in section.group(0)))
s65 = re.search(r"\| 6\.5 \|.*", doc)
print("§6.5 ledger row:", s65.group(0).strip() if s65 else "not found")
print("Phase-A fetches both components:",
all(name in fetch.read_text() for name in
("10m_u_component_of_wind", "10m_v_component_of_wind")))
# Deterministic probe of the two quantities described by §6.5.
u = [3.0, 0.0]
v = [0.0, 4.0]
mean_speed = sum((x*x + y*y) ** 0.5 for x, y in zip(u, v)) / len(u)
speed_of_mean = ((sum(u)/len(u))**2 + (sum(v)/len(v))**2) ** 0.5
print(f"derived mean|v|={mean_speed:.6f}, |mean v|={speed_of_mean:.6f}, "
f"Jensen_gap={mean_speed-speed_of_mean:.6f}")
assert mean_speed > speed_of_mean
# Search source/document text for an explicit producer or derivation.
hits = []
for path in root.rglob("*"):
if not path.is_file() or any(part in {".git", "target", "node_modules"} for part in path.parts):
continue
try:
body = path.read_text(errors="ignore")
except OSError:
continue
if re.search(r"\b(?:hypot|sqrt)\s*\(|mean\s*\([^)]*(?:magnitude|speed)|wind_speed", body, re.I):
hits.append(str(path))
print("files mentioning a possible speed producer:")
for path in sorted(hits)[:80]:
print(" ", path)
PYRepository: AdaWorldAPI/lance-graph
Length of output: 4446
Narrow the provenance conclusion.
Phase-A includes u/v wind-component arrays. The §6.5 value can be derived as mean(|v|) from those arrays. Trace the producer and averaging window, or state only that Phase-A has no array named wind_speed.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.claude/board/EPIPHANIES.md around lines 95 - 97, Revise the provenance
conclusion in §6.5 to avoid claiming the Jensen-gap measurement could not come
from Phase-A solely because no array is named wind_speed. Trace the producer and
averaging window for the reported value, accounting for derivation from the
Phase-A u/v wind-component arrays, or narrow the statement to confirm only that
Phase-A lacks an array explicitly named wind_speed.
| "helix360" is this session's coinage — the symbol is `Signed360`, no `helix360` | ||
| exists in any repo `[G-absence]`; and the "2×24 = from AND to" reading below is | ||
| FALSE — one `Signed360` is already a complete full-sphere direction. See | ||
| `E-THE-DOCTRINE-DOC-EXISTED-AND-I-NEVER-READ-IT-1` (top of file).** |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Remove the stale codec interpretation.
Lines 157-160 mark helix360 and the “2×24 = from AND to” reading as false, but Lines 162-163 still state that helix360 is a two-hemisphere codec. This leaves contradictory guidance in the board. Mark the retained paragraph as withdrawn or rewrite it to describe Signed360 as the complete full-sphere direction codec.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.claude/board/EPIPHANIES.md around lines 157 - 160, Update the retained
paragraph at the `helix360`/two-hemisphere codec entry to remove the stale
interpretation and contradiction: either mark it withdrawn or rewrite it to
identify `Signed360` as the complete full-sphere direction codec, consistent
with the surrounding correction.
| ### 12.11 — the CI metric, done properly (codex P1 on #920): the frame was right, my implementation of it was not | ||
|
|
||
| §12.10 announced the correct criterion and then **measured the old one anyway**. | ||
| `p1_noise_floor.py` computes `dev = |bucket_center − original|` — a decoded | ||
| reconstruction error — and counts `dev > floor`. The confidence intervals it | ||
| computed were printed and discarded. Caught by codex, correctly: | ||
|
|
||
| > *"The advertised noise-floor reframing still computes a round-trip | ||
| > reconstruction metric… the committed exceedance fractions and the conclusions | ||
| > in §12.10 are produced by the exact evaluation frame the commit says is | ||
| > invalid."* | ||
|
|
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Label §12.11 as a probe result.
This section records new measurements, but its heading does not identify the content as a finding, conjecture, or probe result. Add an explicit probe-result label and record the exact run or result artifact. Keep the conditional promotion status visible.
As per coding guidelines, knowledge documents must label claims as findings, conjectures, or probe results; architectural claims must follow the claim → probe → run → record/promote cycle.
Proposed wording
-### 12.11 — the CI metric, done properly
+### 12.11 — P1 CI-versus-floor probe result: the CI metric, done properly🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.claude/knowledge/weather-normalized-substrate.md around lines 898 - 909,
Label section §12.11 explicitly as a probe result, update its heading or opening
metadata without changing the measurements, and record the exact run or result
artifact used for these findings. Preserve the existing conditional promotion
status and ensure the claim follows the claim → probe → run → record/promote
cycle.
Source: Coding guidelines
| //! Tests for the three `Signed360` claims that `.claude/knowledge/` | ||
| //! documents but the crate's own suite did not exercise. | ||
| //! | ||
| //! Written 2026-08-11 after a session landed all three in a knowledge doc on the | ||
| //! strength of DOC COMMENTS alone. Per `CLAUDE.md`'s falsifiability rule — *"a | ||
| //! doc-comment claim is not a behaviour; a test must exercise the claim or the | ||
| //! claim must be labelled claimed, unverified"* — they are exercised here. |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Place the regression tests in a #[cfg(test)] module.
This file is an integration test under crates/helix/tests. Move these focused tests beside Signed360 and ResidueEncoder in crates/helix/src/residue.rs, or document an approved exception for public-API integration coverage.
As per coding guidelines, crates/**/*.rs must add Rust unit tests alongside implementations via #[cfg(test)] modules and prefer focused scenarios over broad integration tests.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@crates/helix/tests/signed360_claims.rs` around lines 1 - 7, Move the
regression tests from the integration-test file into a #[cfg(test)] module
alongside Signed360 and ResidueEncoder in residue.rs. Keep the tests focused on
those implementations and preserve their existing coverage; only retain the
integration location if an approved public-API coverage exception is documented.
Source: Coding guidelines
| //! NOTE: `helix` is excluded from the root workspace and appears in no CI | ||
| //! workflow, so these run only when invoked by hand in this crate. |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | 🏗️ Heavy lift
🧩 Analysis chain
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
if [ -d .github/workflows ]; then
rg -n -C 3 'helix|manifest-path|cargo (test|nextest)' .github/workflows || true
fi
fd -t f 'Cargo.toml' . | sort | while IFS= read -r manifest; do
rg -n -C 2 'workspace|members|exclude|name *= *"helix"' "$manifest" || true
doneRepository: AdaWorldAPI/lance-graph
Length of output: 38614
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
python3 - <<'PY'
from pathlib import Path
import re
import tomllib
root = Path("Cargo.toml")
helix = Path("crates/helix/Cargo.toml")
workflows = sorted(Path(".github/workflows").glob("*")) if Path(".github/workflows").is_dir() else []
root_data = tomllib.loads(root.read_text())
helix_data = tomllib.loads(helix.read_text())
print("root_workspace_members_helix:",
"crates/helix" in root_data.get("workspace", {}).get("members", []))
print("root_workspace_excludes_helix:",
"crates/helix" in root_data.get("workspace", {}).get("exclude", []))
print("helix_package_name:", helix_data.get("package", {}).get("name"))
print("helix_has_own_workspace:", "workspace" in helix_data)
matches = []
for path in workflows:
text = path.read_text(errors="replace")
if re.search(r"(?i)\bhelix\b", text):
matches.append(str(path))
print("workflow_files_mentioning_helix:", matches)
for path in workflows:
text = path.read_text(errors="replace")
for i, line in enumerate(text.splitlines(), 1):
if re.search(r"(?i)(cargo\s+(test|nextest)|manifest-path)", line):
print(f"{path}:{i}:{line}")
PY
printf '\nRelevant manifest and workflow context:\n'
cat -n crates/helix/Cargo.toml | sed -n '1,40p'
cat -n Cargo.toml | sed -n '1,70p'Repository: AdaWorldAPI/lance-graph
Length of output: 281
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' 'Manifest and workflow checks:'
rg -n -C 3 '^\[workspace\]|^members|^exclude|crates/helix|^name *= *"helix"' Cargo.toml crates/helix/Cargo.toml
printf '%s\n' 'Workflow mentions and test commands:'
if [ -d .github/workflows ]; then
rg -n -i -C 2 'helix|cargo (test|nextest)|manifest-path' .github/workflows || true
fi
printf '%s\n' 'Helix test file:'
cat -n crates/helix/tests/signed360_claims.rs | sed -n '1,25p'Repository: AdaWorldAPI/lance-graph
Length of output: 16889
Run the helix regression tests in CI.
crates/helix is excluded from the root workspace, and no workflow runs its manifest. Add cargo test --manifest-path crates/helix/Cargo.toml to CI.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@crates/helix/tests/signed360_claims.rs` around lines 9 - 10, Update the CI
workflow to run the helix regression tests using cargo test --manifest-path
crates/helix/Cargo.toml. Locate the existing test steps and add this command
without changing the crates/helix test configuration.
| VARS=['2m_temperature','2m_dewpoint_temperature','10m_u_component_of_wind'] | ||
| def load(v): | ||
| """Load an ERA5 fixture variable and return its zonal-mean anomaly (K).""" | ||
| a=np.load(f'fixture/{v}.npy').astype(np.float64); return a-a.mean(axis=1,keepdims=True) |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Exclude Zarr fill values from the anomaly calculation.
When a fixture contains a fill value, a.mean(axis=1, keepdims=True) includes it. A NaN fill makes each affected row’s mean NaN. A numeric fill biases the mean. Preserve a validity mask, calculate the zonal mean only over valid cells, and reject or omit all-fill rows before standardization. np.nanmean alone is not sufficient for numeric fill values or all-fill rows.
🧰 Tools
🪛 Ruff (0.16.1)
[error] 7-7: Multiple statements on one line (semicolon)
(E702)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@probes/weather-p1/export_for_jc.py` at line 7, Update the fixture-loading and
anomaly calculation expression in export_for_jc.py to preserve a validity mask
for Zarr fill values, compute each row’s mean using only valid cells, and reject
or omit rows with no valid cells before subtracting the mean. Handle both NaN
and numeric fill values; do not rely on np.nanmean alone.
| """Background companion to `fetch.py` for the P2 multi-variable set. | ||
|
|
||
| Fetches the six cross-variable fields (dewpoint, 10m u/v wind, surface | ||
| pressure, total column water vapour, total cloud cover) at the same timestep, | ||
| skipping any `fixture/<var>.npy` already on disk and retrying transient | ||
| failures up to three times. Same Zarr v2 fill semantics as `fetch.py`: a 404 | ||
| means an all-`fill_value` chunk, not an error.""" |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Materialize the valid 404 fill chunk.
probes/weather-p1/fetch.py:get creates and returns a fill array for a 404. This branch only records out[var] and exits the retry loop. It does not write fixture/<var>.npy. When that variable is consumed, probes/weather-p1/export_for_jc.py:load raises FileNotFoundError. Reuse the upstream fallback, save the fill array, and record the normalized fill value. Otherwise, the documented fill semantics are not preserved.
Also applies to: 29-36
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@probes/weather-p1/fetch_bg.py` around lines 1 - 7, Update the 404 handling in
the fetch flow to reuse get’s fill-array fallback, save that array to
fixture/<var>.npy, and record the normalized fill value in out[var] before
leaving the retry loop. Apply the same behavior to the corresponding retry
branch covering the additional referenced lines, ensuring export_for_jc.load can
consume valid 404 results.
| print(f"try{attempt} {var}: HTTPError {e.code}",flush=True) | ||
| time.sleep(5) |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
Retry only transient HTTP errors.
The non-404 path retries every HTTPError, including permanent 4xx responses such as 400, 401, and 403. This causes repeated requests and fixed delays for failures that cannot succeed. Retry only classified transient statuses, such as 429 and 5xx, and fail immediately for other 4xx responses.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@probes/weather-p1/fetch_bg.py` around lines 37 - 38, Update the HTTPError
handling in the retry loop around the attempt request so only transient
statuses, such as 429 and 5xx responses, trigger the existing retry message and
delay. Preserve the immediate failure behavior for 404 and extend it to
permanent 4xx responses such as 400, 401, and 403, while retaining retries for
classified transient errors.
| original itself can resolve.""" | ||
| import numpy as np, json | ||
| a=np.load('fixture/2m_temperature.npy').astype(np.float64) | ||
| clim=a.mean(axis=1,keepdims=True); anom=a-clim |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Split semicolon-separated statements.
Ruff reports E702 at each listed site. Split each statement onto its own line so the probe files pass the configured lint check.
probes/weather-p1/p1_noise_floor.py#L18-L18: Split the climatology and anomaly assignments.probes/weather-p1/p1_ci_vs_floor.py#L9-L9: Split the climatology and anomaly assignments.probes/weather-p1/p1_ci_vs_floor.py#L12-L12: Split clipping andreturn.probes/weather-p1/p1_ci_vs_floor.py#L45-L46: Split percentile, scale, and Fisher-Z assignments.
🧰 Tools
🪛 Ruff (0.16.1)
[error] 18-18: Multiple statements on one line (semicolon)
(E702)
📍 Affects 2 files
probes/weather-p1/p1_noise_floor.py#L18-L18(this comment)probes/weather-p1/p1_ci_vs_floor.py#L9-L9probes/weather-p1/p1_ci_vs_floor.py#L12-L12probes/weather-p1/p1_ci_vs_floor.py#L45-L46
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@probes/weather-p1/p1_noise_floor.py` at line 18, Split the
semicolon-separated statements into separate lines to resolve Ruff E702: in
probes/weather-p1/p1_noise_floor.py lines 18-18, separate the climatology and
anomaly assignments; in probes/weather-p1/p1_ci_vs_floor.py lines 9-9, separate
those assignments, lines 12-12, separate clipping from return, and lines 45-46,
separate the percentile, scale, and Fisher-Z assignments.
Source: Linters/SAST tools
| ok = bool((rel <= 2**-9 + 1e-12).all()) | ||
| print("bf16 rel err (must be <= 2^-9 = 0.00195):", rel, "OK" if ok else "BROKEN") | ||
| if not ok: | ||
| # A self-check that prints BROKEN and keeps going is not a self-check. | ||
| # Every BF16 number downstream would be unvalidated. Fail loudly instead. | ||
| sys.exit("APPARATUS FAILURE: bf16 helper exceeds 2^-9; refusing to emit measurements") |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Use a valid BF16 relative-error limit.
Line 16 uses 2**-9 as a general BF16 bound. Correct round-to-nearest-even BF16 can produce relative error near 2**-8. For example, 1.0 + 2**-8 rounds to 1.0 and has relative error 1/257, which exceeds 2**-9.
Set the normal-finite bound to 2**-8. Add a midpoint input to validate tie handling.
Proposed fix
-# 1) sanity: bf16 implementation must have ~8 bits mantissa -> rel err <= 2^-9
+# 1) sanity: normal finite BF16 RNE has relative error <= 2^-8
...
-v=np.array([1.0,300.0,-6.5,1e-3]); rel=np.abs(bf16(v)-v)/np.abs(v)
-ok = bool((rel <= 2**-9 + 1e-12).all())
-print("bf16 rel err (must be <= 2^-9 = 0.00195):", rel, "OK" if ok else "BROKEN")
+v=np.array([1.0, 1.0 + 2**-8, 300.0, -6.5, 1e-3])
+rel=np.abs(bf16(v)-v)/np.abs(v)
+ok = bool((rel <= 2**-8 + 1e-12).all())
+print("bf16 rel err (must be <= 2^-8 = 0.00391):", rel, "OK" if ok else "BROKEN")🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@probes/weather-p1/verify_apparatus.py` around lines 15 - 20, Update the BF16
validation in the apparatus self-check to use 2**-8 as the normal-finite
relative-error limit, replacing the current 2**-9 threshold and corresponding
message. Add a midpoint input such as 1.0 + 2**-8 to the helper validation cases
so round-to-nearest-even tie handling is exercised.
…d claims #920 merged with neither board file updated (0 references to it in either). This is the retroactive-hygiene pattern CLAUDE.md names as an anti-pattern — unavoidable once the PR is merged, and leaving the board stale is the worse outcome (the rule exists because #223/#224/#225 merged with no entries). PR_ARC_INVENTORY: prepends the #920 entry (Added / Locked / Deferred+WITHDRAWN / Docs / Confidence), and applies the file's own rules 3-4 to #917 — an appended Correction line plus an updated Confidence line, never an edit to its immutable Locked text. #917 had locked two claims #920 falsifies: that "helix360" names something (it does not — the type is Signed360, 12 blobs all from that session, zero deletions) and that the HelixResidue lane reads as 2x24 hemispheres = wind in/out (it does not — one Signed360 is already a complete full-sphere direction; rim is the metric carrier, (polar, azimuth) the render carrier). LATEST_STATE: prepends the #920 entry with the same correction as a leading supersession note. Also records a measurement made after the merge, in answer to an operator question about polar vs equatorial error rates. Signed360 angular error by latitude, N=65536: equator 0.112 deg mean / 0.226 max; pole 3.332 / 4.998 — a ~30x spread, best at the rim. And a correction to the premise: there is NO resolution gain from the sign split at equal bit budget — 7-bit |y| + sign vs 8-bit over [-1,1] measures 0.99-1.02x in every band (step 1/127 vs 2/255 = 0.996x). The 256-sample codebook figures that imply a sqrt(2) gain (full sphere cap 7.17 deg vs hemisphere 5.07) spend an EXTRA bit; at equal budget 128-on-hemisphere is 7.17, identical. What the partition buys at the rim is sign EXACTNESS, not precision — and that is exactly where weather lives, since a wind bearing is near-horizontal (y = 0), the regime where a centred-at-128 round loses the hemisphere (#498). Per the termination clause, this hygiene-only commit 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
…not fit it #921 merged with neither board file updated. It was a MIXED PR (board hygiene for #920 plus the wind bearing-encode finding), so the termination clause does not apply — per the rule, the non-hygiene half is what the entry is for. The entry records what #921 actually settled: - The invention/reuse line. Invention = asserting structure the code already answers. Reuse = applying the shipped codec to a new domain, which is what a normalized substrate is for. A missing entry point for a designed reuse is a plumbing gap, not a design refusal — correcting #920 §12.12, which declined to build the bearing-encode on the wrong grounds. - The finding the reuse surfaced: the knowledge doc prescribes nearest spherical-Fibonacci (n, sign) for encoding a direction, and it does NOT fit weather. Horizontal bearings measure 1.9-2.7 deg via nearest-n vs 0.000 deg via a direct (polar, azimuth) write; mean over 24 cases 0.972 vs 0.097 — 10x. The golden spiral couples latitude and azimuth through ONE index, so a bearing at the horizon cannot be chosen independently; and the lattice is equal-area on the DISK, so latitude density ~ sin(2*lat) is sparsest exactly at the equator. Normals spread over the sphere and never hit this. - The rule: a doctrine written for one domain is not automatically right for the next one that reuses it. Deferrals carried forward, including that no public from_bearing was minted — the API shape is an operator call and must not be built on before it is made. 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
#930 merged as MIXED (started as #929 hygiene, grew into the #920-#930 open-review sweep + report SS10 + weather-w-probes-v1 worker briefs, per its own twice-corrected title/body). Arc entry + LATEST_STATE shipped-PR row added. The #928/#929 shipped-table rows are left untouched (superseded by the sweep entry's correction table, not edited in place -- append-only). Suffix-checked before commit: PR_ARC_INVENTORY suffix=True (pure append); LATEST_STATE suffix=False (a table-row mid-file insert, the justified case the sweep entry itself named). Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
Steps 0–3 autoattended, five commits. Everything is re-runnable (
probes/weather-p1/) against real ARCO-ERA5.The headline: the frame was the error
Every P1 verdict was originally scored by encode → decode → measure reconstruction error. That is the wrong criterion for this substrate: the original is retained (public knowledge / hydratable column / Lance f32), so the code is a one-way address over a kept original. The real question is whether the code's confidence interval sits below the original's own noise floor — deviation only matters where it exceeds what the original can resolve. Never round-trip.
Re-measured correctly (fraction of gridpoints exceeding a candidate floor, 1.04 M points):
At a 0.5–1 K floor the paths are indistinguishable, and the exceedances are the shared saturation tail, not the transform. What survives of the original finding is bucket economy (28.1 vs 115.7 effective addresses) — a discrimination-granularity cost for retrieval, already measured frame-correctly in §12.8 on code distances.
What each step produced
wind_speedvariable (exhaustive, all 52 arrays), so §6.5's Jensen-gap measurement can't have come from the Phase-A store. Store object confirmed (validating the plan's ⊘ C3); a chunk 404 is valid Zarr fill semantics, not a fetch failure. blosc is variable-dependent (1.794/1.771/1.248×, not one 1.27×); BF16 anomaly gain reproduces in direction only (74.9× under a zonal-mean climatology proxy).jc::reliability(not scipy: thendarraymirror's0.0sentinels are undefined-vs-zero ambiguous). Pooled r 0.998939, ρ 0.999926, α 0.999435, ICC(2,1) 0.998869, ICC(3,1) 0.998870.--shufflenegative control collapses everything to noise. The two ICC forms are reported separately so a scale shift can't hide behind consistency — measured, they agree to six decimals.helix360is not a wind-bearing carrier (structural facts stand), but §12.10 narrows the ground: "no inverse exists" was never a defect for a one-way address. ThePair48 = [Signed360; 2]mint returns strengthened. P4 stays cancelled as specified.New finding neither frame gives alone
The shared saturation tail (0.4–0.7 % of points, max ≈ 17.5 K) is the only genuine floor violation — and it lands on the extremes: heat waves, cold outbreaks. The representation is worst exactly where meteorology cares most. The 0.4–99.6 % window is inherited from cognitive-substrate defaults; weather wants it widened or given an overflow lane. Top open item.
Not claimed
The noise floor is not pinned. 0.25/0.5/1/2 K is a reference class, not a citation — no published ERA5 uncertainty figure was verified, so every verdict is conditional on that class. Prerequisite before any
[G]grade, and perI-NOISE-FLOOR-JIRAKany σ-distance against it takes Jirak weak-dependence rates.Meta
§12.3 established that a correction is a claim and carries a claim's burden of proof. §12.1 was such a correction and over-claimed by inheriting an evaluation frame unexamined — the rule caught its own author one section later. The frame a measurement is scored in is itself a claim requiring an audit. That generalization is worth more than either verdict it revised.
Doc corrections are
⊘banners in place, sections left standing, never silently edited. Three EPIPHANIES entries.🤖 Generated with Claude Code
https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
Summary by CodeRabbit
New Features
Documentation
Tests
⊘ §12.12 (final commit) — read before acting on anything helix in this PR
The canonical doctrine doc
.claude/knowledge/helix-cartesian-vs-fisher2z.md(in this repo,
READ BY:= "ANY session that encodes/decodes/renders anorientation, normal, or direction") was never opened during this arc.
Reading it settles the dispute and regrades the envelope-audit line above:
helix360does not exist[G-absence]— the symbol isSigned360.Pickaxe over full history (all refs + unreachable objects): 12 blobs, all
authored by this session, zero deletions, zero blast radius.
Signed360is a COMPLETE full-sphere direction — the sign partitionis what makes it whole; no second helix is needed.
ResidueEdge/rim is the METRIC carrier, not a render input. Directionlives in
(polar, azimuth);azimuthis a full-360° 16-bit field.(
from_normal), not no capacity.Pair48mint is WITHDRAWN, not deferred. Its premise was false.Open operator decisions are now two, not three: the saturation-window
widening, and pinning a citable per-variable noise floor.