weather-p1: the storm spine — center + ring profile + wn-1 dipole (90.9–94.3%), moderators identified but unwired - #926
Conversation
… raw vs u8 palette EXPLORATORY (operator frame: "am Ende ist es volumetrisches Voxel-Schach"). Pre-registered E1-E6 in the docstring BEFORE the run; NOT an EV — promotion requires the adversarial audit gate per plan section 8, and this session measured why (0/11). The chess mapping made operational: threshold masks over the voxel grid ARE bitboards (Tiefdruck = p' < -sigma, Zyklonal = zeta > 0), and the rotation verdict is popcount(zeta_pos & lows & hemisphere) — Stockfish's popcount(attacks & targets) with weather masks. Measured (WB2 ERA5 6h, t=91246, 2021-06-15 12Z): - E1/E2 PASS with the built-in inversion control: NH lows ccw-frac 0.636, SH lows 0.402 — the SAME statistic inverts across the equator. Highs mirror, stronger: NH 0.151 / SH 0.719. - E4 PASS, the substrate headline: u8-palette arm reproduces every popcount verdict to max deviation 0.0047. Gradients of bucket-center fields keep the vorticity sign structure — the rotation physics SURVIVES the palette. - E5 PARTIAL FAIL, as pre-registered bars demand honesty: geostrophic corr NH 0.389/0.433 (below the 0.5 bar), SH 0.862/0.736 (pass). The palette reproduces the failure too (0.384/0.422) — the substrate is not the problem; the surface-wind==geostrophic approximation is weakest in the NH sample. Candidate mechanisms (summer gradients, land friction, ageostrophy) are [S] hypotheses, explicitly NOT findings — this session's own lesson: "finding to investigate" is not "finding". - E6 PASS, the Gluecksrad: deepest NH low (55.75N, p'=-2954 Pa), tangential wind +10.2 m/s at 75 km rising to +12.4 at 525 km (torque / solid-body zone), decaying to +1.2 at 1425 km (momentum zone) — the Rankine-vortex shape, measured, cyclonic at every ring. Formulas were NOT invented: geostrophic balance, vorticity, Rankine vortex — existing dynamic meteorology, evaluated on the substrate. cos(lat) zonal spacing per the EV-1 audit lesson; |lat|<15 masked (f->0). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…red: 2 PASS, 2 FAIL, 1 parity Operator frame: "die goldene Spirale encodiert das ganze Tiefdruckgebiet akin to sunflower ripples". EXPLORATORY, pre-registered E1-E5 before the run, bars mine and unaudited — and two of them FAILED, reported as prominently as the passes per this session's discipline. Same storm, same timestep as voxel_chess_probe E6 and ndarray's geostrophic_stencil (WB2 msl, t=91246, center 55.75N/334.5E). E1 FAIL (marginal): ring-mean radial profile explains 0.639 of in-disk pressure variance vs the 0.70 bar. A real midlatitude cyclone carries fronts — it is ~64% axisymmetric, not a hurricane. E4 PASS (the control that makes E1 meaningful): recentering 750 km off-storm collapses the index 0.639 -> 0.005. The metric genuinely measures centeredness — sharp enough that axisymmetry-maximization would work as a storm-center DETECTOR (by-product, [S]). E2 FAIL as written: spiral does NOT beat uniform grid at equal budget (N~256: 119.1 vs 111.6 Pa; N~1024: 58.9 vs 57.8). Apparatus caveat stated, not used as a rescue: the grid arm got 8-25% more points from the clip-to-disk construction; correcting roughly yields parity, still not the pre-registered spiral win. Both beat random decisively (164.2 / 84.2). E3 FAIL, INVERTED — the informative one: delta-entropy along the spiral walk is 7.13 bits/sample vs 5.95 raster. The "ripples" intuition assumes consecutive spiral samples differ only by a tiny radial step; but the golden angle jumps ~137.5 deg in azimuth each step, so at 64% axisymmetry the serial deltas are dominated by the azimuthal residual the spiral ignores. Low-discrepancy = uniform COVERAGE, not serial smoothness. The ripple claim would need the axisymmetric SHARE of the field, not the field. E5 PASS: u8 palette adds 0.1 Pa on top of 119.1 Pa sampling error (bucket 17.2 Pa) — quantization is free here; sampling dominates by 7x. What survives the failures: (a) the radial profile compresses 64% of the storm into 24 ring means; (b) the natural successor encoding is profile + low-order azimuthal harmonics per ring (fronts are wavenumber-1/2), NOT raw spiral samples — that is a next probe, not a rescue of this one; (c) highheelbgz's (start, stride, len) spiral ADDRESS would apply to the profile stage, and only if (b) measures well; (d) tropical cyclones are far more axisymmetric than this midlatitude low — E1 might pass there ([S]). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…mmitted as-is
Operator frame: overlapping golden spirals, Flaechen-vs-Nahkampf like Go.
Pre-registered, run to completion before the operator's interrupt; committed
with the failures front and center rather than left uncommitted (the K-12/13
orphan lesson).
A-E1 FAIL (marginal): K=10 greedy multi-center radial atoms explain 0.530 of
NH-band p_anom variance vs the 0.55 bar. Close, not met.
A-E2 FAIL (the informative one): RANDOM-center atoms explain 0.417 — far
above the <=0.265 bar. Ring-mean radial atoms are so expressive that even
arbitrary centers soak up variance; the control unmasked that A-E1 mostly
measures atom POWER, not center CORRECTNESS. The matched-vs-random GAP
(0.53 vs 0.42) is real but modest.
A-E3 (curiosity, no bar): marginal-gain ratios mean 1.42, nothing like
1/phi=0.618 — no golden-ratio decay; gains are lumpy, not geometric.
B ALL FAIL, INVERTED: contested cells carry LOWER |gradT| than secured
(0.80x at thresh 0.8, monotone 0.77/0.80/0.83; secured 3.55 > band 2.83;
random-center control 1.24 sits at its bar edge). The meteorology the
design assumed is wrong: FRONTS ARE NOT AT TERRITORY BOUNDARIES — warm/
cold fronts spiral INTO the low, so the highest gradients live in the
low's OWN near-center territory ("secured" under r^-2 influence). Go's
fight-at-the-border does not transfer; the fight is inside the stone's
territory. 19 of 20 detected centers were lows at this timestep, which
also starved the H-vs-T boundary the design imagined.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
… aligned left-of-motion, 2/2
Operator: "die fehlende Achsensymmetrie mit Flugzeug-Formel x Traegheit
berechnen (wie beim Kometen dessen Schweif nach hinten drueckt)". The physics
is textbook, not invented: a translating vortex = vortex in steering flow;
geostrophy makes it SIGNED — background gradient perpendicular to motion,
low pole LEFT of motion (NH); a linear background survives ring-mean removal
entirely as wavenumber-1 with amplitude ~ r.
Pre-registered CT-E1..E5, two storms (replication), ALL BARS MET:
CT-E1 wn-1 share of the azimuthal residual: 0.924 / 0.895 (bar 0.40) —
the comet tail is not just the dominant asymmetry mode, it is
nearly ALL of it.
CT-E2 trackable: 279 km/6h and 440 km/6h displacements.
CT-E3 the SIGNED test: low pole at -42 deg and -40 deg from the predicted
left-of-motion bearing — both HIT (+/-45 bar), both storms on the
SAME side. n=2, null p=0.0625, stated not overclaimed. The
systematic ~-40 deg common offset is an OBSERVATION [S] (Ekman
surface-wind rotation is a candidate mechanism, unexamined).
CT-E4 profile + per-ring wn-1 explains 0.972 / 0.926 of in-disk variance
(bar 0.80) — up from 0.635 / 0.294 profile-only. This RESOLVES the
sunflower probe's E1 fail: the missing third of the storm WAS the
tail. Storm 2: one dipole takes 0.294 -> 0.926.
CT-E5 a1(r) vs r correlation 0.800 / 0.998 — the linear-background
signature, near-perfect on storm 2.
Encoding consequence (design, [S] until specced): a storm compresses to
PLACE (center) + ~12 ring means + ONE dipole vector = 93-97% of in-disk
structure — the highheelbgz (start,stride,len) spiral-address plus a few
bytes. And the dipole ENCODES THE MOTION: bearing(low pole) - 90 deg
estimated the 6h displacement direction within 45 deg on both storms from a
SINGLE timestep — a single-frame motion predictor, next falsifier.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
probes/weather-p1/COMET_TAIL_REPORT.md — the documentation artifact for db57aac, written for a meteorology-literate product lead: physical basis (translating vortex = vortex in steering flow; geostrophic left-of-motion low pole; linear background = pure wavenumber-1 with a1 ∝ r), method, the pre-registered falsification table (CT-E1..E5, all bars met on 2/2 storms), what it resolves (the sunflower axisymmetry FAIL — one missing mode, not many), and the follow-up section the operator asked for: - the systematic −42°/−40° offset with three ranked [S] candidates (steering-level/baroclinic-tilt rotation > Ekman surface friction > center-finder bias) and pre-registered falsifiers CT-F1 (repeat at z500), CT-F2 (measured 10m cross-isobar inflow angle), CT-F3 (center jitter/apparatus exclusion FIRST) — proposed, NOT run, n>=10 before any offset constant is baked in. - encoding consequence kept [S]: center + ~12 ring means + ONE dipole = 93–97%, dipole encodes motion; single-frame motion predictor named as next falsifier, gated behind the plan-§8 audit. Board: EPIPHANIES.md prepend E-CYCLONE-ASYMMETRY-IS-ONE-DIPOLE-1 (same-commit per the board-hygiene rule). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…-40 deg constant is dead, the height ladder is real CT-F1/F2/F3 as pre-registered in COMET_TAIL_REPORT.md sec.5. Bars written before the run; committed unmodified apart from a grad_p shape-bug fix and one ADDED DIAGNOSTIC field, both recorded in the probe's own RUN LOG. No bar was added, removed, or loosened. CT-F3 APPARATUS (ran FIRST, as the rule requires) — FAILED its gate. +/-100 km center jitter moves the alignment error by up to 29.4 deg (storm1; storm2 19.4) against a 20 deg bar. The -42/-40 offset is INSIDE the apparatus noise => no offset constant is measurable at this centering precision. CT-E3 re-graded in place: the +/-45 left-of-motion HIT stands, the magnitude does not. CT-F1 STEERING LEVEL — strong signal, formally mixed. All 13 levels ship in one chunk, so the yes/no became a ladder: alignment error climbs MONOTONICALLY from ~-40 deg at 1000 hPa through zero in the mid-troposphere (~600-650 hPa storm1, ~400-500 storm2), spread 101.8/91.6 deg = 3-5x the apparatus noise. That is the baroclinic-tilt prediction. Storm2's own-center path tripped the dead-absurd flag at 100 hPa, but the added diagnostic shows its center finder SATURATED at the 600 km search radius (586-599 km) and had locked onto a different system => NO-VERDICT on that path, not a refutation. CT-F2 FRICTION — bounded. Measured 10m cross-isobar inflow +14.7 deg (storm1, 99% ocean) and +13.0 deg ocean-only (storm2). Right sign, textbook 10-30 deg magnitude, and 13-15 << 40 => friction owns ~1/3 of the offset at most. Unplanned can-it-fire check: storm2 is 46% land and its all-points median (+22.0) exceeds its ocean-only median (+13.0) — turning is stronger over land, as textbook, so the measurement discriminates in the right direction. Candidates after F1-F3: tilt FAVOURED, friction BOUNDED CONTRIBUTOR, center-bias LIVE AND NOT EXCLUDED. Not mutually exclusive. The 3-5x size comparison is recorded as a POST-HOC OBSERVATION and routes to CT-F4 (sub-grid center fit), NOT used to override the failed gate — that override is the indictment-fired/post-hoc-rescue anti-pattern already on this arc's open-P1 list. CT-F4 is now the blocking item ahead of the single-frame motion predictor. Headline claim untouched: wn-1 dominance (0.924/0.895), R2 lift to 0.972/0.926, and left-of-motion 2/2 never depended on the offset. Board: EPIPHANIES prepend E-THE-OFFSET-WAS-THE-APPARATUS-THE-LADDER-WAS-THE-PHYSICS-1 (same commit). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…friction contrast — and re-scopes the candidate it was testing CT-F4 SUB-GRID CENTER — the blocking item, CLEARED. F3 condemned the -40 deg offset using a +/-100 km jitter I CHOSE, not one I measured. F4 asks the non-circular question: how far apart do INDEPENDENT center definitions land? Four definitions across three physical fields (sub-grid MSLP min; grad^2 p centroid; 10m vorticity centroid; sub-grid z850 min) agree to 20.3 km (storm1) / 73.0 km (storm2), and the errors they give span 2.3 / 6.5 deg. Apparatus noise is ~+/-3-7 deg, not +/-15-30 => the offset IS measurable. F3 was not wrong; its amplitude was unjustified. Storm2 PASSES F4a (6.5 <= 10) with the anti-vacuity guard satisfied (73 km = 2.4x the grid diagonal). Storm1 is NO-VERDICT by my own pre-registered F4c guard — its centers agree to 20.3 km, BELOW the 31.9 km grid diagonal, so a 2.3 deg spread proves nothing about method sensitivity; the guard refused the free pass and storm1 is bounded <= 6.5 deg via the F4b curve instead. F4b sensitivity curve monotone on both (storm1 25/50/100/200 km -> 6.5/13.8/30.9/77.2 deg; storm2 -> 5.0/9.8/19.3/35.8). Real center variants cluster along a preferred axis, so isotropic jitter is an UPPER bound — the second reason F3 over-stated the problem. CT-F7 FRICTION OVER LAND (operator-requested) — both bars pass. Storm selected blind to its inflow: deepest NH low with >=70% land in its 300-1000 km ring -> 28.50N 67.50E (80% land, -2609 Pa). Orography guard dropped 826/2642 land points above 1000 m (MSLP over high terrain is an extrapolated fiction whose gradient would corrupt the geostrophic reference). F7b, the paired half that controls for depth/latitude/curvature: +34.2 deg land vs +20.5 deg ocean INSIDE THE SAME DISK. F7a also passes but is latitude-confounded. F7d False (34.2 < 35), so friction turning is ~2.4x larger over land and the bound is surface-type dependent, as pre-warned. Caveat stated: blind selection was blind to storm TYPE too — at 28.5N in mid-June this is a monsoon thermal low, a valid test of the inflow apparatus over land and a weaker dynamical analogue of storms 1-2. SELF-CORRECTION, worth more than either pass: F2/F7 bound the rotation of the WIND relative to the isobars, but the CT-E3 offset is a rotation of the PRESSURE DIPOLE. Friction does not rotate the pressure field except at second order, so candidate 2 was partly mis-specified from the start. An unplanned pairing already sitting in the F2 output points the wrong way for it too: storm1 is 1% land (+14.7 inflow), storm2 is 46% land (+22.0), yet offsets are -42.0 and -40.2 — the MORE frictional storm has the SMALLER offset. [S], n=2, undesigned, recorded as suggestive. CT-F9 written to test the mechanism candidate 2 should have been about (Ekman pumping vs land-fraction ASYMMETRY across the disk, not mean land fraction). Candidates now: tilt LEADING and near-unopposed; center bias BOUNDED at ~+/-5 deg (~1/8 of the offset); friction RE-SCOPED. Binding constraint is n >= 10 storms, not the apparatus. Refactor guard: geom_ll is a strict generalisation of geom to a continuous center; the identity geom_ll(lat[ci],lon[cj]) == geom(ci,cj) is asserted numerically at max|diff| = 0.0 so the baseline cannot silently move. Board: EPIPHANIES prepend E-A-JITTER-AMPLITUDE-YOU-CHOSE-IS-NOT-AN-UNCERTAINTY-YOU-MEASURED-1. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…its the comet-tail claim into two -- structure generalizes, sign does not CT-F5 WALKING-CENTER GEOPOTENTIAL SWEEP -- fixes the named §5.2 defect. Search near the PREVIOUS level's found center (250 km/step) instead of a fixed 600 km radius from the surface. Storm2's winning level (500 hPa, -4.5 deg) is reached by a 0.0 km step -- untouched by the saturation that appears one step later (500->400 hPa), OUTSIDE the tested 400-850 band. F5a PASSES cleanly for both storms; F5b fails narrowly for storm2 (exactly at the 250km cap, above the tested band -- explained, not hand-waved); F5c verified post-hoc (storm1 bit-identical to the original sweep) -- admitted as a gap in this probe's own pre-registration (field never coded) rather than silently smoothed over. CT-N N=10 BLIND STORM SAMPLE -- the headline result of this whole chain. Ten independent synoptic times, 2015-2021, all four seasons, NH, each storm found BLIND (no hint, no inspection before recording). Anchor date (storm1) included; its t-index reproduces the pinned T0=91246 exactly (guard asserted before anything else runs). Unplanned data-boundary finding: the store's filename claims "1959-2022" coverage; actual last valid timestep is 2021-12-31 18Z, six months short. One planned date 404'd against this -- diagnosed against the .zarray shape, a bounds guard added (report+exclude, never crash), the date swapped for an in-range one. No bar touched. Results: wn1-dominance and explanatory power REPLICATE at scale (CT-N3 median wn1_frac=0.723 PASS >=0.40; CT-N4 median R2=0.900 PASS >=0.80). The SIGNED left-of-motion claim that made storms 1-2 exciting does NOT (CT-N1: 6/10=0.60 same-sign vs a 0.70 bar -- a naive p=0.5 null already gives P(>=6/10)~=0.38, statistically unremarkable; what looked like 2/2 at p=0.0625 is close to a coin flip on independent storms). CT-N5/F8: does the wind-center advantage seen on storm2 alone (F4) generalize? FAILS, 6/10. CT-F9: does land-fraction asymmetry correlate with the unexplained residual (the mechanism candidate 2 should have been about)? Clean non-support, corr=-0.295. Two post-hoc leads, explicitly NOT used to rescue CT-N1's FAIL: restricting to the 4 storms with displacement >=250km/6h (closer to storms1/2's own 277/440km regime) lifts sign-consistency to 3/4=0.75; dropping only the single most extreme low-displacement/near-polar outlier (2016-04-18, 113km, 75N, err=+165.7deg -- essentially orthogonal to the prediction) lifts it to 6/9=0.667. Both point at real, testable, DIFFERENT confounds: motion-bearing noise at small displacement (mechanical/apparatus), and storm-type contamination in a purely blind sample (2020-07-20 at 32N in July has the sample's worst wn1_frac 0.23 AND R2 0.32 -- very plausibly a monsoon low, not the baroclinic system the whole steering-flow argument targets, same caveat CT-F7's land storm already carried). Filed as CT-F10 (pre-registered displacement filter) and CT-F11 (pre-registered regime filter) for a proper rerun -- not a re-scoring of this one. REPORT UPDATED throughout: executive summary caveat, §5.8/§5.9 new sections, candidate table reframed as within-storm-1/2 (not yet general), §6 encoding consequence flagged (compression generalizes per N3/N4; motion-encoding half gated on CT-F10/F11), next-falsifiers list closed out through CT-N/F5/F8/F9 with CT-F10/F11 as the new open items. Board: EPIPHANIES prepend E-N-EQUALS-TWO-LOOKED-LIKE-PHYSICS-AND-WAS-HALF-COIN-FLIP-1 -- the reusable lesson: a probe at n=2 can be right about STRUCTURE while being wrong about GENERALITY, and only a genuine blind n>=10 sample separates the two. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…s the
n=10 verdict, proper stats keep it borderline, the regime hypothesis fails
its own check while the apparatus hypothesis strengthens
CT-F13 RAW REPLICATION on a fresh, mechanically-generated sample (fixed start
1980-02-10 + fixed 411-day stride x 15 candidates, chosen before any code
ran, landing entirely in 1980-1995, zero overlap with the 2015-2021 sample):
8/10 = 0.80 sign-consistency, REVERSING the first sample's 6/10=0.60 FAIL
on its own 0.70 bar. 5/15 candidates (33%) failed CT-E2 trackability this
time vs 0/10 before -- 4 of those 5 cluster at 26-33N,67-134E in Jun-Sep,
the same monsoon-season geography already flagged twice (F7's land storm,
N's worst storm).
PROPER STATISTICS, not just the pass/fail bar: neither sample clears a
conventional two-sided 0.05 alone (sample1 p=0.754, sample2 p=0.109).
Pooled across BOTH fully independent samples: 14/20=0.70, one-sided
p~=0.058 -- landing almost exactly on the pre-set 0.70 bar by coincidence,
still short of significance. The reversal is real; it converts a FAIL into
a STILL-BORDERLINE with double the sample.
THE TWO COMPETING EXPLANATIONS FROM THE PRIOR ENTRY WERE BOTH CHECKED, and
the answer INVERTED which one looks better supported:
- Regime-contamination (favoured after the first n=10 sample): checked by
retroactively applying wn1_frac>=0.40 to SAMPLE 1's own data. Removes its
two lowest-structure storms (2020-07-20, 2019-10-25) -- BOTH were
negative-signed, agreeing with the prediction. Removing two hits, not two
misses, drops sample1 from 6/10 (0.60) to 4/8 = EXACTLY 0.500. Does not
survive contact with its own predicted mechanism.
- Apparatus (motion-bearing noise on slow storms): pooling the
displacement>=250km/6h subset from BOTH independent samples (n=4+3=7,
two decades) gives 6/7=0.857, one-sided p~=0.0625 -- the single most
consistent number in the whole chain (n=7 still small; this pooling was
NOT itself pre-registered before either sample ran, stated plainly).
CT-F10 (displacement filter) on sample2 alone: NO-VERDICT, n=3 below the
pre-registered minimum of 6 -- correctly withheld rather than reported as
a misleading 3/3=1.00.
CT-F11 (regime filter) on sample2 alone: 8/9=0.89 PASSES -- but this is the
number that does NOT survive the cross-sample check above.
Report updated: §5.10 new section with the full statistical treatment, both
executive-summary caveats layered (not replaced), next-falsifiers list closed
out through F10/F11/F13 with CT-F14 (a single properly-powered n>=25-30
displacement-filtered-ONLY sample) as the correctly-scoped next step, CT-F15
(geo-fence the monsoon band) as a secondary lead. Closing status section
rewritten to state the full non-monotone arc honestly: dead(F3) -> alive with
error bar(F4) -> apparently general(first N run misread in isolation) ->
reversed(second sample) -> converging on real-for-fast/undetermined-for-slow.
Board: EPIPHANIES prepend E-THE-RESCUE-THAT-WEAKENED-ITSELF-UNDER-SCRUTINY-1
-- the reusable lesson: apply the SAME scrutiny to a result that helps your
preferred story as to one that hurts it. The regime-contamination hypothesis
was mine, felt right after the prior entry, and did not survive being
checked against the data that was supposed to support it -- reported as a
weakening of my own prior explanation, not smoothed into a win.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
… n>=20-30 sample, committed before running The correctly-scoped next step named in COMET_TAIL_REPORT.md sec 5.10: a SINGLE properly powered test of the displacement>=250km/6h subset, since the regime-contamination explanation was checked and failed against sample1's own data while the apparatus explanation (pooled disp>=250 across both prior samples, 6/7=0.857, p~=0.0625) is the one with surviving support. Fresh mechanically-generated dates (start 1996-01-15, stride=61d x 85 candidates, landing 1996-2014), zero overlap with sample1 (2015-2021, hand-picked) or sample2 (1980-1995, stride=411d). N_CANDIDATES sized from the two prior samples' combined empirical qualifying rate (7/25~=0.28) to target n>=20-30 -- an estimate, not a guarantee; actual attrition reported however it lands. Pre-committed interpretation of the COMBINED three-independent-sample p-value (decided now, before running, so the read cannot be tuned to the result): p<0.05 established/audit-gate-ready; 0.05<=p<0.10 suggestive, needs more n; p>=0.10 not established, apparatus explanation itself in question, retire directional claim to [S]. Committed before execution per the arc's pre-registration discipline. Result to follow in a separate commit. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…ear its
own bar; pooled figure technically passes but is graded down on sensitivity
scrutiny, and a gap in the pre-registration itself is named
CT-F14 ran: 85 mechanically-generated candidates (1996-2010, zero overlap
with either prior sample), 64/85 trackable, 19 qualified at disp>=250km/6h
-- one short of the pre-registered n=20 floor. Correctly NO-VERDICT by the
pre-registered rule.
CT-F14's own qualifying subset, taken alone: 13/19=0.684, one-sided
p=0.0835 -- BELOW the 0.70 bar and not significant, even ignoring the n<20
power floor. The single test this whole probe was built to produce does not
independently support the directional claim.
The pooled 3-sample figure (n=26, 19/26=0.731) crosses the pre-committed
p<0.05 "established" threshold (p=0.0145) -- by the LETTER of the
pre-registration this licenses reporting "established, audit-gate ready."
Sensitivity check (same scrutiny applied to a result that HELPS as was
applied to the reversal in the prior entry):
all three pooled: n=26, 0.731, p=0.0145
excluding smallest/saturated (n=3): n=23, 0.696, p=0.0466 (still <0.05,
barely -- not purely an artifact of
one tiny fragment)
CT-F14 alone (the properly-powered test): n=19, 0.684, p=0.0835 (NOT sig)
two small prior fragments alone: n=7, 0.857, p=0.0625
GAP NAMED: the pre-registration specified thresholds for a POOLED figure
without specifying what to do if the new properly-powered sample DISAGREES
with the pooled verdict on its own terms -- a configuration I did not
anticipate when writing the pre-registration. Reporting only the pooled
"established" number, though technically licensed, would exploit that gap
the same way cherry-picking data would -- just one level up, at
which-valid-reading-to-report time instead of which-data-to-report time.
Graded the verdict DOWN to "still suggestive" instead, and recorded the
pre-registration's own gap as the finding.
Second, smaller walk-back: sec5.10's striking monsoon-band exclusion pattern
(4/5 in the small 1980-1995 sample) thinned to 2/21 at 4x the exclusion
count here -- the small-n-looked-like-a-pattern theme recurring one level
below the main directional claim.
Report updated: sec5.11 new section with full sensitivity table, both
executive-summary caveats layered again (third layer), sec6 marker updated
(compression ready for audit queue; predictor "suggestive at best, not yet
earned"), next-falsifiers/status closed out honestly: structural claim solid
throughout every sample this arc ran; directional claim tested four separate
ways across 41 total storms and still does not clear a real bar on its
strongest test.
Board: EPIPHANIES prepend E-MY-OWN-PRE-REGISTRATION-HAD-A-GAP-AND-I-NAMED-IT-1
-- pre-registration protects against post-hoc rationalization of DATA; it does
not automatically protect against post-hoc selection among multiple valid
readings of the rule itself when the rule admits more than one -- that needs
the same discipline applied one level up, at read time not just design time.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…ssing (operator ruling), incl. the unmodeled moist/entropy sector Operator framing, recorded because it is the statistically correct reading of the chain, not spin: a 0.68-0.73 directional main effect whose residual runs MONOTONICALLY with a measured variable (the 92-102 deg height ladder, 3-5x apparatus noise) is the signature of a MISSING MODERATOR, not a null — a null does not produce a ladder. §9.1 the spine [G]: center + ~12 ring means + 1 wn-1 dipole = 93-97% of in-disk variance, unshaken across 3 independent samples / 41+ storms / 1980-2021 — an explicit ~14-byte skeleton for the center and the first asymmetry mode of the dynamics. §9.2 dry moderators [H], measured but unwired: steering level (CT-F16 = score the dipole against steering-level motion, not 6h surface displacement), displacement/label noise, friction/surface type, latitude/regime. §9.3 moist sector [S], not modeled at all (operator: "Feuchtigkeit und Abregnen im Aufwind an der Kollision zwischen den Gebieten — eine Art Entropie"): rain-out in the collision-zone updraft as irreversible moist entropy production, theta-e the state variable, precipitation the sink (Emanuel/Pauluis frame). Tractable now — the store carries specific_humidity/temperature/TCWV/total_precipitation_6hr/vertical_velocity, and theta-e/TCWV are scalar fields so the SAME ring/wn-1 decomposition applies verbatim. CT-M1..M3 named. The July failures (wn1 0.19-0.36) are plausibly the diabatically-dominated storms -> diabatic dominance as a computable intake gate. §9.4 the brutal step [S] (operator-directed): moderators as W in domino.rs' symbiont C=A·W tile-GEMM (stencil-as-GEMM already byte-proven on real WB2 in ndarray geostrophic_stencil.rs) + LSTM-shaped recurrence over 6h spine states (byte-parity int8 LSTM exists, E-OCR-LSTM-1). Explicit physics as spine, learned weights as moderators — gated by disjoint-decade train/test + the plan-§8 audit. Board: EPIPHANIES prepend E-SPINE-FOUND-MODERATORS-MISSING-1. Co-Authored-By: Claude Fable 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_c7e81542-83ab-419a-9100-05ec90c65495) |
📝 WalkthroughWalkthroughThe pull request adds ERA5 weather probes, Comet-tail cyclone analyses, L4 carrier experiments, result datasets, script-relative output handling, and research documentation. It evaluates cyclone structure, center definitions, steering levels, friction, directional generality, territory structure, sampling, quantization, vortex profiles, and register encodings. ChangesComet-tail cyclone analysis
Auxiliary weather probes
Estimated code review effort: 5 (Critical) | ~120 minutes Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 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 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: feec4b77c4
ℹ️ 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".
| a1[b] = 2 * ((v - prof[b]) * c).mean() | ||
| b1[b] = 2 * ((v - prof[b]) * s).mean() | ||
|
|
||
| resid0 = vals - prof[rings] # after profile | ||
| wn1 = a1[rings] * np.cos(tt) + b1[rings] * np.sin(tt) |
There was a problem hiding this comment.
Constrain the dipole to the advertised two values
This reconstruction fits independent a1[b] and b1[b] coefficients for every one of the 12 rings and then indexes those arrays per sample, so the reported 93–97% R² requires 24 dipole values in addition to the 12 ring means. This does not support the two-value “amplitude slope + bearing” representation claimed in COMET_TAIL_REPORT.md:738-741 and used to justify the ~16-value board state; ring phases and amplitudes are currently free to vary. Evaluate the R² using an actually constrained two-parameter dipole, or account for all per-ring coefficients in the storage and architecture claims.
Useful? React with 👍 / 👎.
| side = int(np.ceil(np.sqrt(n * 4 / np.pi))) | ||
| g = (np.arange(side) + 0.5) / side * 2 * R_DISK_KM - R_DISK_KM | ||
| gx, gy = np.meshgrid(g, g) | ||
| m = np.hypot(gx, gy) <= R_DISK_KM | ||
| return gx[m], gy[m] |
There was a problem hiding this comment.
Enforce the equal sampling budget for the grid control
When the requested budget is not exactly reproduced by the clipped square lattice, this function returns more than n samples, biasing E2 in favor of the grid because nearest-neighbor reconstruction improves with additional samples. The committed results compare 64 spiral samples against 80 grid samples, 256 against 293, and 1024 against 1085 despite the pre-registered equal-budget requirement, so the spiral-versus-grid verdict is not a valid controlled comparison. Select exactly n grid points or compare all arms at their actual common count.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Actionable comments posted: 14
🧹 Nitpick comments (3)
probes/weather-p1/comet_tail_f5_n10.py (2)
392-404: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winDelete the discarded
dlanddecomposition instead of computing it.Line 392 runs a full ring/wavenumber-1 decomposition over the whole disk, and Line 404 deletes the result unused. The land dipole is recomputed inline immediately after. Each call performs a global
geom_llgrid evaluation, so this doubles the per-storm cost for no output.♻️ Proposed cleanup
- dland = decompose_ll(lsm.astype(np.float64), la_a, lo_a) - errA = err_deg(dA["low_pole_rad"], mth) @@ - del dland # decompose_ll's own amp_by_ring omitted b1; land dipole recomputed below _, _, r_, th_ = geom_ll(la_a, lo_a)🤖 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/comet_tail_f5_n10.py` around lines 392 - 404, Remove the unused dland = decompose_ll(lsm.astype(np.float64), la_a, lo_a) computation and its corresponding del dland cleanup. Preserve the subsequent inline land-dipole recomputation and all row.update fields unchanged.
279-291: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRemove the unused index computation in the walk loop.
Lines 281-282 compute
ciandcjfromcur, and no later statement uses them.find_centerreceivescurdirectly.♻️ Proposed cleanup
for li in order: lev = int(levels[li]) - ci = int(np.argmin(np.abs(lat - cur[0]))) - cj = int(np.argmin(np.abs(((lon_deg - cur[1] + 180) % 360 - 180)))) found = find_center(z0[li], near=cur, radius_km=250.0)🤖 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/comet_tail_f5_n10.py` around lines 279 - 291, Remove the unused ci and cj index computations from the walk loop over order; keep find_center’s direct use of cur and all subsequent walk processing unchanged.probes/weather-p1/comet_tail_f4_f7.py (1)
335-412: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueVerify the blind-selection loop reports the skipped candidates.
The loop masks an 800 km disk after each rejected candidate (Line 362), so nearby deeper lows are never listed in
tried. The JSON shows only two scanned candidates for 40 iterations. This is consistent with the mask, but the record does not show how much of the NH field the mask removed. Consider recording the number of grid points masked per rejection so the blind selection stays auditable.🤖 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/comet_tail_f4_f7.py` around lines 335 - 412, Update the blind-selection loop around tried and work so each rejected candidate records how many previously unmasked grid points are removed by the r < 800.0 mask. Compute the count before applying the mask and include it in that candidate’s tried record, while preserving the existing candidate-selection and masking behavior.
🤖 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 13-18: The conclusion in the “Why this is the statistically
correct reading” passage overstates what the monotonic residual establishes.
Revise the final claim to say the pattern is consistent with a missing moderator
and requires independent validation, while acknowledging it may also reflect
misspecification, labeling or center errors, selection effects, or chance; keep
the directional predictor suggestive and unpromoted.
In `@probes/weather-p1/comet_tail_f10_f11.json`:
- Around line 201-205: Update the CT_F12 result in the report so its pass field
uses the explicit no-verdict value rather than true when n is below the minimum
evaluable sample size; preserve the existing reported-only status and metrics.
In `@probes/weather-p1/comet_tail_f14.py`:
- Around line 163-178: The subgrid_min helpers fail at longitude seams because
their 3x3 extraction does not wrap columns. In
probes/weather-p1/comet_tail_f14.py#L163-L178,
probes/weather-p1/comet_tail_f4_f7.py#L181-L197,
probes/weather-p1/comet_tail_f5_n10.py#L188-L203, and
probes/weather-p1/comet_tail_f10_f11.py#L146-L161, update subgrid_min to obtain
columns cj-1 through cj+1 with np.take(..., axis=1, mode="wrap") and clamp row
indices to maintain a 3x3 neighborhood. Also add the lat_step fallback for the
final row in probes/weather-p1/comet_tail_f4_f7.py#L181-L197; the other three
sites already have that guard. Extract the shared helper into one module under
probes/weather-p1/ if practical, preserving the existing fitting behavior.
- Around line 270-322: Gate the combined three-sample interpretation using the
same MIN_N threshold applied to CT-F14: when len(qualifying) is below MIN_N,
prevent any promotion-ready interpretation and record an explicit
insufficient-sample outcome or subset_below_min_n flag. Update the block
producing CT_F14_combined_3sample while preserving the existing pooled
statistics for qualifying subsets meeting the gate.
In `@probes/weather-p1/comet_tail_f4_f7.py`:
- Around line 399-400: Update the F7d_friction_alone_could_own_40deg_over_land
condition to use the documented and key-aligned 40.0 threshold, preserving the
existing None guard.
In `@probes/weather-p1/comet_tail_f5_n10.py`:
- Around line 147-157: The masked minimum check in find_center must return None
whenever no finite candidate exists, including near-constrained searches; fix
the inverted guard in probes/weather-p1/comet_tail_f5_n10.py lines 147-157,
preserving the NOT-TRACKABLE handling at lines 376-376. Apply the same None
return in probes/weather-p1/comet_tail_f10_f11.py lines 108-116 and record the
affected row as NO-CENTER-FOUND at lines 195-197. Apply it in
probes/weather-p1/comet_tail_f14.py lines 125-133 and skip the candidate at
lines 223-225.
In `@probes/weather-p1/comet_tail_followup.py`:
- Around line 223-235: Persist the computed baseline storm metadata by replacing
the empty `"storms": {}` value in `out` with a serialization of `STORMS`.
Preserve each storm’s name, center, motion bearing, and displacement so the
per-storm CT-F1, CT-F2, and CT-F3 records retain their provenance.
In `@probes/weather-p1/COMET_TAIL_REPORT.md`:
- Around line 708-720: Update the CT-F14 entry to reflect the completed §5.11
run: state that 19 qualifying storms were analyzed, the pre-registered n ≥ 20
floor was not met, and the result was NO-VERDICT. Remove the stale “NOT yet run”
wording and the n ≥ 25–30 requirement, while preserving the
displacement-filtered-only sample scope.
In `@probes/weather-p1/go_territory_probe.py`:
- Around line 195-206: The output-writing code around json.dump must derive
go_territory_probe.json from __file__ so it is created beside the probe, and
open it through a context manager to ensure the file is closed. Keep the
existing JSON payload and completion message unchanged.
- Around line 96-109: The explained-variance calculation in
probes/weather-p1/go_territory_probe.py lines 96-109 must keep the
centered-field denominator fixed while computing residual SSE without
re-centering res; update the metric around fit_atom and explained so residual
mean is included. Regenerate probes/weather-p1/go_territory_probe.json lines
9-76, including explained_by_k, E1, E2_random, and all derived decay ratios; no
separate direct code change is required there beyond updating these generated
values.
In `@probes/weather-p1/sunflower_cyclone_probe.py`:
- Around line 115-121: The grid_pts function currently returns all in-disk
lattice points instead of honoring the requested count. Update grid_pts to
select exactly n spatially distributed points from the clipped grid, preserving
the existing grid construction, and regenerate the result artifact so E2 records
the requested 256 samples.
In `@probes/weather-p1/voxel_chess_probe.py`:
- Around line 172-178: The E6 criterion in the profile result around vts and
rises_then_decays must verify an actual rise before the peak and decay
afterward, not merely an interior maximum. Define the allowed profile behavior
with explicit smoothing and tolerance, then test adjacent or smoothed values
against that rule so the decreasing-then-rising example is rejected while valid
rise-then-decay profiles remain accepted.
- Around line 152-156: Update the center-selection logic using nh_rows, pa_nh,
and np.unravel_index so it finds the minimum of MSLP p rather than the anomaly
field p_anom. Keep the Northern Hemisphere masking and downstream center/output
calculations unchanged.
- Around line 115-125: The geo_corr function in
probes/weather-p1/voxel_chess_probe.py:115-125 must correlate each geostrophic
field with explicitly passed observed wind fields instead of module-level u and
v; update its signature and call sites so the palette arm passes u8 and v8.
Regenerate the palette correlation values in
probes/weather-p1/voxel_chess_probe.json:28-31 using the corrected calculation.
---
Nitpick comments:
In `@probes/weather-p1/comet_tail_f4_f7.py`:
- Around line 335-412: Update the blind-selection loop around tried and work so
each rejected candidate records how many previously unmasked grid points are
removed by the r < 800.0 mask. Compute the count before applying the mask and
include it in that candidate’s tried record, while preserving the existing
candidate-selection and masking behavior.
In `@probes/weather-p1/comet_tail_f5_n10.py`:
- Around line 392-404: Remove the unused dland =
decompose_ll(lsm.astype(np.float64), la_a, lo_a) computation and its
corresponding del dland cleanup. Preserve the subsequent inline land-dipole
recomputation and all row.update fields unchanged.
- Around line 279-291: Remove the unused ci and cj index computations from the
walk loop over order; keep find_center’s direct use of cur and all subsequent
walk processing unchanged.
🪄 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: a66af143-7979-4ac7-8dfc-8a68dd86d07c
📒 Files selected for processing (20)
.claude/board/EPIPHANIES.mdprobes/weather-p1/COMET_TAIL_REPORT.mdprobes/weather-p1/comet_tail_f10_f11.jsonprobes/weather-p1/comet_tail_f10_f11.pyprobes/weather-p1/comet_tail_f14.jsonprobes/weather-p1/comet_tail_f14.pyprobes/weather-p1/comet_tail_f4_f7.jsonprobes/weather-p1/comet_tail_f4_f7.pyprobes/weather-p1/comet_tail_f5_n10.jsonprobes/weather-p1/comet_tail_f5_n10.pyprobes/weather-p1/comet_tail_followup.jsonprobes/weather-p1/comet_tail_followup.pyprobes/weather-p1/comet_tail_probe.jsonprobes/weather-p1/comet_tail_probe.pyprobes/weather-p1/go_territory_probe.jsonprobes/weather-p1/go_territory_probe.pyprobes/weather-p1/sunflower_cyclone_probe.jsonprobes/weather-p1/sunflower_cyclone_probe.pyprobes/weather-p1/voxel_chess_probe.jsonprobes/weather-p1/voxel_chess_probe.py
| json.dump({ | ||
| "store": B, "time_index": T_IDX, "band_lat": [25, 75], | ||
| "A": {"explained_by_k": expl, "centers": [ | ||
| {"lat": float(lat[r0 + ci]), "lon": float(lon_deg[cj])} | ||
| for ci, cj in centers], | ||
| "E1": a_e1, "E2_random": a_e2, | ||
| "E3_decay_ratios": ratios.tolist(), "E3_mean": float(ratios.mean())}, | ||
| "B": {"n_centers": len(det), "by_thresh": out_b, | ||
| "E2_secured_le_bandmean": b_e2, "E3_random_ratio": b_e3, | ||
| "gradT_band_mean_K_per_100km": float(band_mean)}, | ||
| }, open("go_territory_probe.json", "w"), indent=2) | ||
| print("\nwrote go_territory_probe.json") |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Write the result artifact beside the probe.
Running this probe from the repository root writes go_territory_probe.json to the repository root. The committed artifact at probes/weather-p1/go_territory_probe.json then remains stale.
Derive the output path from __file__. Use a context manager to close the output file.
🤖 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/go_territory_probe.py` around lines 195 - 206, The
output-writing code around json.dump must derive go_territory_probe.json from
__file__ so it is created beside the probe, and open it through a context
manager to ensure the file is closed. Keep the existing JSON payload and
completion message unchanged.
…dline External review of PR #926 (14 CodeRabbit + 2 Codex). Four findings changed measured numbers; two of those IMPROVED results, one worsened the headline. CHANGED NUMBERS 1. THE COMPRESSION HEADLINE MEASURED A MODEL NOBODY CLAIMED (codex P1). decompose() fits a1[b], b1[b] PER RING -- 12 rings x 2 = 24 free dipole parameters -- so the published R2 0.972/0.926 belongs to a 36-PARAMETER model, while the storage claim describes 14 values ("~12 ring means + ONE dipole = 2 values"). Measured properly, the constrained 2-parameter dipole (one amplitude slope + one bearing -- the linear-background form the report's own §2 derives) gives 0.943/0.909. Corrected headline: 90.9-94.3%, NOT 93-97%. The finding survives (14 values still lift 29-63% -> 91-94%), but claim and measurement had drifted ~2.5x in parameter count across six probes and several report rewrites. comet_tail_probe.py now measures BOTH and emits the parameter counts so the two cannot drift again. 2. SUNFLOWER E2 WAS NOT A CONTROLLED COMPARISON (codex P2 + coderabbit). grid_pts(n) returned every in-disk lattice point: 80 grid samples against 64 spiral (293 vs 256, 1085 vs 1024), and NN reconstruction improves with samples. With exactly n enforced the verdict improves IN THE SPIRAL'S FAVOUR -- 234.5 vs 269.0 Pa (n=64), 119.1 vs 123.3 (256), 58.9 vs 59.9 (1024): the spiral now wins at every budget where the arc had recorded "parity". The original result was PESSIMISTIC, not optimistic. 3. THE VOXEL-CHESS PALETTE ARM WAS A HYBRID (coderabbit). geo_corr took the palette geostrophic winds but closed over module-level RAW u/v, so "u8 max dev 0.0047" compared palette geostrophy against raw observations. Observed fields are now explicit parameters; the palette arm passes u8/v8. 4. go_territory's explained variance re-centred the residual after every atom (res.var()), excluding the residual mean from the error. Fixed to a fixed centered-field denominator over the residual mean-square: K=10 matched 0.530 -> 0.523, and NO verdict flips (A-E1/A-E2 still fail their bars). VACUOUS ASSERTION (the arc's house style, 4th instance) E6's rises_then_decays required only an interior maximum plus a lower final value, so it accepted a profile that DECREASED before rising -- which the committed run literally did (12.190 -> 12.163 m/s before the 525 km peak) while reporting true. Now asserts monotone rise-to-peak and decay-after, with a stated 0.05 m/s tolerance. Still passes, but now because the profile is Rankine-shaped rather than because the test could not fail. LATENT BUGS (no committed run hit them, so no numbers move) - find_center returned grid cell (0,0) when a `near`-limited mask was fully masked, instead of None. Guarded in all six probes. - subgrid_min's 3x3 slice did not wrap in longitude and would have raised on any centre at the 0 deg seam (centres come from a global scan, so it is reachable). Columns now wrap; rows clamp -- the poles are not periodic. LABELLING / PROVENANCE CT-F12 can no longer emit pass=true below its evaluable minimum; F7d's test now uses the 40 deg its own key and docstring pre-register (it tested 35); comet_tail_followup.json persists per-storm centre/bearing/displacement instead of "storms": {}; go_territory_probe.json is written beside the probe. Dead code dropped (unused dland decomposition, unused ci/cj). BOARD - EPIPHANIES: "the signature of a missing moderator, NOT of a null" softened to "consistent with a missing moderator and requires independent validation" -- a monotonic residual does not by itself exclude misspecification, centre/label error, selection, or chance (coderabbit). - New entry E-THE-HEADLINE-NUMBER-MEASURED-A-MODEL-NOBODY-CLAIMED-1 with the extracted rule: a number in a headline must be produced by code whose parameter count matches the headline's own description of the object. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
The board half of commit 5302828, which failed silently: the edit script asserted on ASCII hyphens where the file uses en-dashes, so the probe and report fixes committed while the board changes did not. Caught by re-reading the file rather than trusting the commit. Two changes: 1. CORRECTION in E-SPINE-FOUND-MODERATORS-MISSING-1. It read "is the signature of a missing moderator, NOT of a null. A null does not produce a ladder." That overstates what a monotonic residual establishes -- it SUPPORTS the hypothesis but does not discriminate it from model misspecification, centre/label error, selection effects, or chance. Now reads "consistent with a missing moderator and requires independent validation", with the original wording and its reason preserved in a correction note (CodeRabbit on PR #926). 2. NEW ENTRY E-THE-HEADLINE-NUMBER-MEASURED-A-MODEL-NOBODY-CLAIMED-1 -- the compression headline (93-97%) was computed from a 36-parameter per-ring fit while the storage claim describes 14 values; the constrained 2-parameter model actually gives 90.9-94.3%. Also records that two review findings IMPROVED results (sunflower's spiral now wins at every N once the sampling budget is equal; the voxel-chess palette arm was a hybrid), and that E6 carried a fourth vacuous assertion found by a reviewer rather than the author. Extracted rule: a number in a headline must be produced by code whose parameter count matches the headline's own description of the object. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
The last open CodeRabbit pre-merge check on PR #926. The probes carry extensive MODULE docstrings (the pre-registration blocks), but the helper functions they share -- geom_ll, find_center, decompose_ll, subgrid_min, wrap_deg, err_deg, sep_km, the binomial tails, the derivative kernels -- were undocumented in every copy. Since those helpers are duplicated across six files, a one-line contract on each is worth more than the line count suggests: it is the only place a reader learns, for instance, that d_dy flips sign because the row index grows southward, that find_center can return None, or that subgrid_min wraps in longitude but clamps in latitude. Docstrings state the CONTRACT (units, sign conventions, None-returns, what the metric is computed over), not a restatement of the function name. Coverage 34.25% -> 91.5% (107/117 functions). Verified after the pass: all 22 probe/support files compile, and comet_tail_probe.py re-ran end-to-end reproducing its committed numbers (wn1 0.924/0.895, R2 0.972/0.926 per-ring and 0.943/0.909 constrained, CT-E3 2/2) -- so the insertion touched no behaviour. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…solute anchor, and rank-normalised palette256 is the only frame where cross-variable distance is defined at all Operator correction (2026-08-11): "du lebst noch in der Vorstellung dass alles absolut ist -- die Relativitaetstheorie widerlegt sogar das" + "in der Statistik ist es gold wert alles auf Palette256 normalized zu haben". I had encoded pressure against a FIXED 1000 hPa reference and called it "a stable convention". It is an ABSOLUTE anchor and there is none: 994 hPa is unremarkable over Iceland and a record in the subtropics. Measured on the real global ERA5 field (t=91246, n=1,038,240), three 1-byte readings of one value: band A affine B rank C fisher-rank storm tail (bottom 1%) 10.71 204.54 24.74 lower shoulder (1-10%) 10.76 51.13 45.38 bulk (40-60%) 10.79 2.34 16.50 high tail (top 1%) 10.71 88.22 6.86 OVERALL 10.77 27.58 24.55 [Pa RMSE] R1 A flat across bands (1.01, bar <=1.5) PASS -- the band decomposition is meaningful, not an artefact. R2 B beats A in the bulk (2.34 vs 10.79, 4.6x) PASS -- equal-probability buckets are denser in Pa exactly where the mass is. R3 B WORSE than A in the storm tail (204.54 vs 10.71) PASS -- the cost of the rank register, measured rather than assumed. R4 C beats B in the storm tail (24.74 vs 204.54, 8.3x) PASS -- the rim stretch does what helix's fisher_z.rs says it does. NOT pre-registered, and it does NOT hold: C does not beat A in the storm tail (24.74 vs 10.71). The MSLP distribution is left-skewed -- the low tail runs 70 hPa below the median, the high tail only 25 hPa above -- and the rim stretch does not fully compensate that asymmetry, while the uniform register covers it by construction. C DOES beat A in the high tail (6.86 vs 10.71). Recorded because it is the one expectation this probe disappointed. R5, the actual payoff -- after rank normalisation the SAME u8 denotes the same rarity in MSLP, 2m temperature and 10m wind: max spread 0.00007 against a one-bucket tolerance of 0.00391 (56x inside). For the ABSOLUTE register the same question is not worse-answered but UNDEFINED: Pa, K and m/s share no unit, so byte 128 of each denotes no common quantity. CONSEQUENCE for my own earlier objection. "Fisher-Z breaks the stencil" was right about affinity but judged C by the WRONG metric -- Pa reconstruction is not what an extremity register is for; R5 is. The three are not competing candidates for one job but three readings of one value: A carries quantitative differences (affine, the stencil/GEMM lane), B carries probability mass (bulk resolution), C carries cross-variable comparability (the only frame in which a multi-variable storm state has a defined distance). Scope limit stated in the probe: the reference distribution is the global field at ONE timestep, the population a rolling floor would have observed. A multi-year climatology is the honest reference for operational extremity. 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_48943371-77b7-4ad9-a739-d92735c419e1) |
The pre-merge Docstring Coverage check still reports 34.25%, byte-identical to its value BEFORE the earlier docstring pass, on a run whose own header says it reviewed up to ec1b079. Measured on that exact commit, counting modules + classes + functions the way a coverage tool plausibly would: 135/145 = 93.10%. So the reported figure is stale. Rather than argue about a cached number, the 10 genuinely-undocumented functions it would have found are now documented, taking the tree to 145/145 = 100.00% — which removes the question of whether the check is stale OR whether I am counting differently from it. The 10: ev4_apparatus_sensitivity {shape, main}, ev4_window_sweep load_anom, ev3_flip_points main, ev10_winter main, go_territory contested_secured, sunflower delta_entropy, voxel_chess {ddy, physics, popfrac}. Docstrings state the CONTRACT, not the function name back: contested_secured explains that influence is |amplitude|/r^2 floored at 50 km and that the ratio is runner-up/leader; delta_entropy says it measures FIRST DIFFERENCES, i.e. traversal-order predictability, which is the quantity E3 compares between spiral and raster order; physics records that u_g takes -dp/dy and v_g +dp/dx and that returning one tuple is what keeps the raw and palette arms on an IDENTICAL chain; popfrac says it returns NaN rather than 0 for an empty denominator so an absent population stays visibly absent. Verified after the pass: all 23 files compile, and three_register_probe re-ran end-to-end reproducing its committed numbers exactly (storm tail 10.71 / 204.54 / 24.74, bulk 10.79 / 2.34 / 16.50, R1-R5 all PASS) — the insertion touched no behaviour. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
There was a problem hiding this comment.
Actionable comments posted: 7
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
probes/weather-p1/COMET_TAIL_REPORT.md (1)
749-758: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winCorrect the stale executive summary.
This correction states that the 14-value model explains 90.9–94.3% and that motion prediction is still suggestive. However, Section 1, Lines 88-91 still states
93–97 %and “the dipole encodes the motion”. Update that summary so the report has one headline claim.🤖 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/COMET_TAIL_REPORT.md` around lines 749 - 758, Update the executive summary in Section 1 around the stale 93–97% claim to report 90.9–94.3% for the 14-value model, and replace the definitive “the dipole encodes the motion” wording with language that describes motion prediction as suggestive at best. Ensure the summary matches the corrected compression and predictor conclusions in the referenced report sections.
🤖 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:
- Line 76: Update the compression percentage in the “Spine [G]” entry to
90.9–94.3%, replacing the superseded 93–97% claim while preserving the rest of
the entry.
In `@probes/weather-p1/comet_tail_f10_f11.py`:
- Around line 182-184: Align the wrap_deg helpers with the signed-error
classification by choosing one endpoint convention and applying it consistently:
probes/weather-p1/comet_tail_f10_f11.py lines 182-184,
probes/weather-p1/comet_tail_followup.py lines 177-179,
probes/weather-p1/comet_tail_f4_f7.py lines 182-184, and
probes/weather-p1/comet_tail_f5_n10.py lines 255-257 must use the same interval,
ensuring exactly 180 degrees is classified consistently by stratum_verdict.
In `@probes/weather-p1/comet_tail_f4_f7.py`:
- Around line 234-239: Update d_dx to compute centered longitude differences
periodically, using the final column as the wrapped left neighbor for column 0
and the first column as the wrapped right neighbor for column NX - 1. Preserve
the existing per-kilometer cos(phi) metric and centered-difference behavior for
all columns.
In `@probes/weather-p1/three_register_probe.py`:
- Around line 198-211: Update the R5 validation around probe_bytes and
max_spread to evaluate all 256 palette codes when determining PASS/FAIL, while
retaining the five existing bytes only as display samples. Compute or serialize
the spread maximum across every code, and ensure the reported R5 result compares
that full-range maximum against one_bucket.
- Around line 88-119: Align the rank convention used by reg_c_fisher_rank with
the midpoint ranks used to build z_ref. Update _ranks so its returned ranks use
the same empirical midpoint definition, while preserving the existing reg_b_rank
bucketing and Fisher-z reconstruction flow.
- Around line 60-66: Update the metadata setup in the three-register probe
around B, T0, and meta to record WeatherBench2 provenance: add the time
attributes identifying 2021-06-15 12:00 UTC and its ARC correspondence, plus
spatial grid shape [721, 1440] and chunk layout [1, 721, 1440]. Include these
fields in the JSON output before performing cross-dataset comparisons.
In `@probes/weather-p1/voxel_chess_probe.py`:
- Around line 192-201: Update the Rankine profile validation around decay_ok and
rises_then_decays so a valid post-peak profile must end meaningfully below
vts[pk], while retaining the existing tolerance-based adjacent-ring checks.
Ensure profiles with a flat tail such as [1, 2, 2] are rejected, and include the
net-decline condition in the rises_then_decays result.
---
Outside diff comments:
In `@probes/weather-p1/COMET_TAIL_REPORT.md`:
- Around line 749-758: Update the executive summary in Section 1 around the
stale 93–97% claim to report 90.9–94.3% for the 14-value model, and replace the
definitive “the dipole encodes the motion” wording with language that describes
motion prediction as suggestive at best. Ensure the summary matches the
corrected compression and predictor conclusions in the referenced report
sections.
🪄 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: 68ff44e7-4ed9-4616-99ea-e5fd97300c85
📒 Files selected for processing (17)
.claude/board/EPIPHANIES.mdprobes/weather-p1/COMET_TAIL_REPORT.mdprobes/weather-p1/comet_tail_f10_f11.pyprobes/weather-p1/comet_tail_f14.pyprobes/weather-p1/comet_tail_f4_f7.pyprobes/weather-p1/comet_tail_f5_n10.pyprobes/weather-p1/comet_tail_followup.pyprobes/weather-p1/comet_tail_probe.jsonprobes/weather-p1/comet_tail_probe.pyprobes/weather-p1/go_territory_probe.jsonprobes/weather-p1/go_territory_probe.pyprobes/weather-p1/sunflower_cyclone_probe.jsonprobes/weather-p1/sunflower_cyclone_probe.pyprobes/weather-p1/three_register_probe.jsonprobes/weather-p1/three_register_probe.pyprobes/weather-p1/voxel_chess_probe.jsonprobes/weather-p1/voxel_chess_probe.py
🚧 Files skipped from review as they are similar to previous changes (4)
- probes/weather-p1/sunflower_cyclone_probe.json
- probes/weather-p1/voxel_chess_probe.json
- probes/weather-p1/sunflower_cyclone_probe.py
- probes/weather-p1/comet_tail_f14.py
…r, 6x(8:8) Operator correction: "was ist mit 6x Palette256:Palette256 centroid, was ja die Verteilung anzeigen soll -- palette256 alleine ist ja nur 'attention header'". Every encoding in this arc treated one scalar -> one byte as the unit. le-contract SS3 row L4 is a PAIR: 6 x (8:8), palette256^2, "each byte pair indexes the 256x256 palette distance/compose tables". The single byte is the selector; the pair is a cell in the centroid tile. EXPLORATORY, not an EV. Four pre-registered bars; two FAILED as written. RESULT -- the 12-byte facet is LOSSLESS against the f64 spine. Carve D (dipole rail + 10 ring bytes SPREAD over the full radius, missing rings linearly interpolated) reproduces the f64 constrained spine to 4 decimals on BOTH storms: R2 0.9434 / 0.9090, |D - f64| = 0.0000. R2 is demonstrably sensitive here -- carve B (12 rings, no dipole) gives 0.635 / 0.294 -- so this is recovery, not insensitivity. L1 FAILED as written (storm1 0.0222 vs bar 0.02), and the decomposition names the cause exactly: quantization loss +0.0000, dropped rings 10-11 +0.0222. The carrier's PRECISION is free; its CAPACITY was the whole miss. Carve D spends the same 12 bytes across the full radius instead of the inner 10 plus a held edge, and the miss disappears. L3 FAILED, and so did my proposed fix. Fisher-z centroid axes are 5x WORSE than uniform on the ring means (18.07 vs 3.84 Pa). I hypothesised the population was wrong -- ranks taken against the 24 encoded values rather than the field -- and measured that too (L3b): 19.00 Pa, no rescue. The refinement failed. Mechanism: ring means are a smooth NARROW-BAND quantity sitting mid-distribution, so a rim-stretch spends levels in tails where no ring mean lives. This does not contradict three_register_probe's R4 (Fisher-z 8x TIGHTER in the storm tail on the raw field) -- it demarcates it. Fisher-z wins a RANK/TAIL read and loses an INTERPOLATE/LEVEL read. That is precisely why le-contract says a ClassView MAY declare an analytic codebook: per class, by measurement. This corrects my own over-generalisation that Fisher-z is "the" L4 codebook axis. L4x was VACUOUS on first run and the guard that caught it is now in the file. A uniform codebook is fixed by its population's min/max alone, so because storm1's profile range strictly CONTAINS storm2's, storm1's "own" codebook IS the pooled codebook -- the bar compared an array against itself and passed for free. It looked real only because the earlier fisherz run gave differing numbers. Both directions are now reported with an explicit degeneracy flag; the informative direction (storm2's codebook applied to storm1) gives 620.79 Pa vs 4.48 Pa shared, a 139x penalty -- strong evidence the codebook must be global, which is the "one table read" property the carrier is for. Scope: 2 storms, 1 timestep, 1 variable. Structural fit measured; nothing about forecast skill. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…defects CodeRabbit on PR #926. Each finding checked against the DATA before being accepted or dismissed -- and the two that mattered are recorded with what actually moved. STALE HEADLINE IN TWO PLACES (report SS1 prose, EPIPHANIES x2). I corrected the 93-97% -> 90.9-94.3% figure in the correction BLOCK and left the prose under it saying 93-97%, so the document contradicted itself. Same class of error the correction was about. Also propagated the "the dipole encodes the motion" phrasing that CT-F14 had already demoted to suggestive, and the "a null does not produce a ladder" sentence that was corrected in EPIPHANIES but not in the report's own SS9 copy -- one claim, two homes, fixed in one. EPIPHANIES entries regraded IN PLACE per the allowance the file already uses at line 67, never deleted. R5 SAMPLED 5 OF 256 BYTES and the verdict was quantified over all 256. Now swept exhaustively. The worst byte is 0, which the sample MISSED entirely: spread 0.00043 vs <= 0.00005 at every sampled byte -- the sparse probe was understating by ~9x. Verdict still PASS (bar 0.00391), but it was not measuring what it claimed. _ranks USED LEFT-BOUND RANKS while reg_c_fisher_rank's own z-reference uses midpoints -- asymmetric, and worst in the lower tail, which is exactly where R4 is decided. Both halves now use midpoints. Re-measured: bulk B 2.34 -> 2.33 Pa, every other figure unmoved, all four verdicts still PASS. Small, and it had to be checked rather than assumed. d_dx ZERO-PADDED A GLOBAL LONGITUDE GRID -- columns 0 and 1439 are neighbours on a 1440x0.25deg grid, and both were left at exactly zero: a fabricated zero gradient on a real meridian. Fixed with np.roll. Impact on published numbers measured rather than asserted: only those two columns change, and both storm disks clear them -- max |new-old| INSIDE each 1200 km disk is exactly 0.0. storm2 misses the seam by 16.5 km. Latent, not active. wrap_deg's DOCSTRING was wrong, not its code: it returns [-180, 180), not "(-180, 180]". Kept the implementation (+/-180 means the dipole points OPPOSITE the motion, which is correctly scored negative) and documented the consequence. Audited: 283 angle-like values across every committed result JSON, 0 boundary hits, closest 0.91 deg. E6's decay test ACCEPTED A FLAT TAIL -- [1,2,2] passes a TOL-tolerant monotone check because every step falls by <= TOL. Added a net-change requirement, and to BOTH arms: the rise side had the identical hole, and fixing only the one that was pointed at would have left a half-vacuous assertion behind. Still true on the real profile (net rise +2.171, net decay +11.199 m/s, both >> TOL=0.05) -- this is E6's THIRD strengthening. Provenance now pinned in three_register_probe.json (time units/calendar, grid 721x1440, chunk, dtype, compressor) so a future re-run can separate "the numbers moved" from "the store moved". Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…SS6.1, SS6.2) SS6.1 -- the storm spine measured against the ACTUAL carrier. The 12-byte V3 facet read as 6x(8:8) is LOSSLESS against the f64 spine (carve D: R2 0.9434 / 0.9090, |D - f64| = 0.0000), with the two FAILED bars written up at least as prominently as the pass: L1's miss decomposes to quantization +0.0000 / dropped rings +0.0222 (capacity, not precision), and L3 killed my own hypothesis twice over -- Fisher-z axes are 5x worse on ring means, and the population-was-wrong rescue I proposed measured 19.00 Pa, no rescue. SS6.2 -- the three-register result had been committed with NO report section, so the SS6.1 cross-reference was dangling AND a measured result was undocumented. Both fixed. It is the necessary counterpart: Fisher-z is 8.3x TIGHTER than plain rank in the storm tail there and 5x WORSE on ring means here. Not a contradiction -- a demarcation. Fisher-z wins a RANK/TAIL read and loses an INTERPOLATE/LEVEL read, which is why le-contract says a ClassView MAY declare an analytic codebook: per class, by measurement, never as a default. This corrects an over-generalization I made earlier the same session. Also fixed a SS6 pointer that claimed CT-F14 established the motion-encoding half; it did not, and the append-only paragraph now says so inline. EPIPHANIES: E-THE-BYTE-WAS-ONLY-THE-SELECTOR-THE-PAIR-IS-THE-CARRIER-1, carrying the ninth vacuous falsifier of this arc and its mechanism -- L4x passed by comparing an array against ITSELF, and what made it vacuous was switching to the codebook the PREVIOUS bar had just named as best. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
… and a second, hidden drift The review flagged the stale CT-F14 entry and marked it "Addressed in commits dcfb8a0 to d4e8175". It was NOT addressed. Verified against the file: lines 598 and 737 both still said "not run" / "NOT yet run" while SS5.11 -- in the same document -- reports the completed run. Fixed here. Worth recording as its own lesson: an automated "addressed" label is a claim about a commit range, not a check of the file. Reading the file is what settled it, exactly as with the 93-97% inconsistency the same reviewer caught. SECOND DRIFT, found while fixing the first and NOT flagged by anyone. Both stale entries specify a n >= 25-30 floor for CT-F14. The test as actually pre-registered and executed used n >= 20 (SS5.11 line 623: "n<20, pre-registered floor"). The floor was loosened between planning and execution and no one noticed. This is E-THE-HEADLINE-NUMBER-MEASURED-A-MODEL-NOBODY- CLAIMED-1 again -- claim and measurement drifting apart -- in the sample-size dimension instead of the parameter-count one. Recorded in place rather than harmonised silently, because it changes how SS5.11's "fell one storm short" reads: short of 20, not of the 25-30 the plan asked for. Both entries now carry the actual result (19 storms, 0.684, p=0.0835, NO-VERDICT) and say plainly that the directional claim is not gated-and-pending but measured-and-unsupported at this power. Docstring coverage: the failing pre-merge check reports 69.23% against an 80% threshold. Measured three ways by AST -- the probe directory (154/154), every PR-changed .py file (133/133), and functions-only -- all 100.00%, zero missing modules, functions or classes. The tool's denominator is 13 items and I cannot reproduce it from this PR's contents. Not fabricating a fix for a number I cannot reproduce; flagged as unresolved instead. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
Docstring Coverage check (69.23%) — not reproducible, and its remedy is not actionableAll six review findings are addressed (see
Zero modules, functions or classes lack a docstring anywhere in this PR. Two things suggest the value is stale rather than measuring this branch:
I have deliberately not run the "Generate docstrings" finishing touch and not manufactured any change to move this number, since there is no missing docstring for it to write and I can't account for the denominator. Flagging it as unresolved rather than papering over it — if the threshold is meant to gate this PR, the check likely needs a re-run or its file scope inspected. Everything above is reproducible from the branch with Generated by Claude Code |
…tifact-stale Checked all 23 review threads. 18 resolved, 5 open; of those, 2 were already fixed and verified so (the constrained 2-param dipole emits 14 vs 36 params; sunflower budgets are 64/64/64, 256/256/256, 1024/1024/1024). The 3 real ones: T6 (MAJOR) -- comet_tail_f14.json said CT_F14 "NO-VERDICT-INSUFFICIENT-N" and, in the SAME file, interpretation "ESTABLISHED at this n ... ready for audit-gate queue as [H]-graded". The pre-registered pooling rule reads only p_combined, so a component that failed its own n>=20 floor still carried a PROMOTION RECOMMENDATION in the machine-readable artifact -- contradicting the report's own SS5.11 conclusion. The prose was corrected days ago; the artifact a consumer actually parses was not. Now gated: `applied_verdict` is the field to read and says NOT PROMOTED; the rule's own output is KEPT as `interpretation_preregistered_rule` (deleting it would hide what the pre-registration said) plus an explicit `subset_below_min_n` flag. T4 -- CT_F12 (n=3) carried `pass: true` while CT_F10, same n=3, correctly said NO-VERDICT. The CODE was already fixed earlier this session (stratum_verdict's min_n gate, docstring cites the finding) but the JSON was never regenerated. Same failure mode as T6, one file over. Both JSONs regenerated from their STORED `rows` -- no re-fetch, since only the verdict-formatting changed -- with every underlying number asserted bit-identical to what was committed, so the transformation is proven faithful rather than assumed. T12 -- probes wrote their .json to the CWD, so running one from the repo root left the committed artifact stale. Flagged on one probe; ALL 14 in this directory had it. Fixed everywhere: paths derive from __file__, and the 11 single-line dumps became with-blocks (3 keep expression form -- their payload literal spans lines). Verified functionally, not just by parsing: every one of the 14 write sites was executed from /tmp and lands beside the script, with the committed artifacts confirmed undisturbed. SELF-INFLICTED BREAKAGE, caught and reverted. My first attempt at T12 used a re.S non-greedy regex that matched from a newly-inserted helper's own json.dump all the way down to the file's real dump call, in all 14 files at once: the helper became infinitely self-recursive and each tail call became `json.dump(out)` with no file object. `py_compile` passed on all 14 -- the syntax was fine and the damage was purely semantic, which is exactly why a compile gate is not a correctness gate. Reverted the .py files to HEAD (keeping the JSON data fixes), re-applied T6 by hand, and redid the path fix as a pure literal substring replacement with an ast.parse gate before every write and a from-a-different-cwd functional test after. Recorded because "it compiled" was the false reassurance. Co-Authored-By: Claude <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_c4956b7e-bc8b-47b0-b0d2-b059a9b7d204) |
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
probes/weather-p1/COMET_TAIL_REPORT.md (3)
1046-1055: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winCalibrate the “statistically correct” framing.
The evidence supports a working hypothesis, not a statistically established interpretation. The paragraph reports n=2 and lists several competing explanations. Replace “statistically correct reading” with “working hypothesis supported by a structured residual”.
🤖 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/COMET_TAIL_REPORT.md` around lines 1046 - 1055, Revise the paragraph heading and framing around the “not spin” claim to present it as a working hypothesis supported by a structured residual, rather than a statistically correct interpretation. Preserve the reported n=2 limitation, competing explanations, and independent-validation requirement, and update the related wording so it does not overstate statistical certainty.
1130-1145: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy liftDo not describe
domino.rsas an implemented moderator or LSTM model. Indomino.rs,Ais a 16×32 BF16 board batch,Wis a fixed 32×16 tridiagonal kernel, andCis a 16×16 BF16 GEMM result. The sweep overwrites board lanes and updatesEnergy; it has no learned weights, gate-specific matrices, hidden state, or cell state. Define the weather tensor shapes, training procedure, and recurrent update before claiming that this path executes the proposed architecture “exactly”.🤖 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/COMET_TAIL_REPORT.md` around lines 1130 - 1145, Correct the architecture claims in the report section describing domino.rs: do not characterize its symbiont step as an implemented moderator or LSTM model. State that its fixed 16×32 BF16 A batch, fixed 32×16 tridiagonal W kernel, 16×16 BF16 C result, lane overwrite, and Energy update do not provide learned weights, gate matrices, hidden state, or cell state; define the weather tensor shapes, training procedure, and recurrent update before asserting the proposed architecture is executed exactly.
1092-1101: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy liftDefine the moist-process budget before using it as a moderator.
θeis a useful moist-adiabatic proxy, not a complete entropy state for variable moisture composition. Precipitation is an exported water and entropy flux, not the full entropy-production term. Treatθe, precipitation, and vertical velocity as proxies. Define the water-vapour, phase-change, latent-heat, precipitation, and dissipation terms before using the diabatic gate for CT-M1–CT-M3.🤖 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/COMET_TAIL_REPORT.md` around lines 1092 - 1101, Revise the moist-process discussion before applying it as the CT-M1–CT-M3 diabatic gate: define the water-vapour, phase-change, latent-heat, precipitation, and dissipation terms, and explicitly treat θe, precipitation, and vertical velocity as proxies rather than complete entropy-state or entropy-production variables.
🤖 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 147-153: Update the Spine [G] statement to describe the 14 model
values as one center, approximately 12 ring means, and one wn-1 dipole,
replacing “~14 bytes + an address” with “~14 model values.” Keep the 12-byte
carrier budget out of this statement and mention it only in the encoding
section.
In `@probes/weather-p1/COMET_TAIL_REPORT.md`:
- Around line 88-98: Update the product-consequence wording in
COMET_TAIL_REPORT.md to distinguish the 14 logical fit values from their
encoding: describe the center position as metadata, retain the 12-byte 6×(8:8)
measured carrier, and revise the nearby “14 bytes” wording so it does not equate
logical values with encoded bytes.
- Around line 808-831: The report’s claim that the 12-byte facet is “lossless”
overstates carve D’s result. In the carve D comparison near the f64 spine
results, replace that wording with the registered R² tolerance claim, explicitly
stating that |carveD_r2 - f64_r2| <= 0.02 while preserving the reported
approximate values and avoiding any assertion of exact or bitwise recovery.
In `@probes/weather-p1/l4_rail_probe.py`:
- Around line 125-129: Update r2_of to compute the numerator from the mean
squared reconstruction error rather than the variance of s["vals"] - rec, while
preserving the existing denominator and R² formula. Regenerate
l4_rail_probe.json using the corrected calculation.
---
Outside diff comments:
In `@probes/weather-p1/COMET_TAIL_REPORT.md`:
- Around line 1046-1055: Revise the paragraph heading and framing around the
“not spin” claim to present it as a working hypothesis supported by a structured
residual, rather than a statistically correct interpretation. Preserve the
reported n=2 limitation, competing explanations, and independent-validation
requirement, and update the related wording so it does not overstate statistical
certainty.
- Around line 1130-1145: Correct the architecture claims in the report section
describing domino.rs: do not characterize its symbiont step as an implemented
moderator or LSTM model. State that its fixed 16×32 BF16 A batch, fixed 32×16
tridiagonal W kernel, 16×16 BF16 C result, lane overwrite, and Energy update do
not provide learned weights, gate matrices, hidden state, or cell state; define
the weather tensor shapes, training procedure, and recurrent update before
asserting the proposed architecture is executed exactly.
- Around line 1092-1101: Revise the moist-process discussion before applying it
as the CT-M1–CT-M3 diabatic gate: define the water-vapour, phase-change,
latent-heat, precipitation, and dissipation terms, and explicitly treat θe,
precipitation, and vertical velocity as proxies rather than complete
entropy-state or entropy-production variables.
🪄 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: 6f479f62-f7cd-4813-a469-717b6efd41c1
📒 Files selected for processing (22)
.claude/board/EPIPHANIES.mdprobes/weather-p1/COMET_TAIL_REPORT.mdprobes/weather-p1/comet_tail_f10_f11.jsonprobes/weather-p1/comet_tail_f10_f11.pyprobes/weather-p1/comet_tail_f14.jsonprobes/weather-p1/comet_tail_f14.pyprobes/weather-p1/comet_tail_f4_f7.pyprobes/weather-p1/comet_tail_f5_n10.pyprobes/weather-p1/comet_tail_followup.pyprobes/weather-p1/comet_tail_probe.pyprobes/weather-p1/ev10_winter.pyprobes/weather-p1/ev3_flip_points.pyprobes/weather-p1/ev4_apparatus_sensitivity.pyprobes/weather-p1/ev4_window_sweep.pyprobes/weather-p1/go_territory_probe.pyprobes/weather-p1/l4_rail_probe.jsonprobes/weather-p1/l4_rail_probe.pyprobes/weather-p1/sunflower_cyclone_probe.pyprobes/weather-p1/three_register_probe.jsonprobes/weather-p1/three_register_probe.pyprobes/weather-p1/voxel_chess_probe.jsonprobes/weather-p1/voxel_chess_probe.py
🚧 Files skipped from review as they are similar to previous changes (7)
- probes/weather-p1/voxel_chess_probe.json
- probes/weather-p1/comet_tail_f14.json
- probes/weather-p1/comet_tail_probe.py
- probes/weather-p1/comet_tail_followup.py
- probes/weather-p1/sunflower_cyclone_probe.py
- probes/weather-p1/comet_tail_f4_f7.py
- probes/weather-p1/comet_tail_f10_f11.py
…+92.76 Pa bias CodeRabbit, PR #926. The headline finding is NOT the arithmetic, it is what the arithmetic was concealing. THE BUG. R2's numerator must be the UNCENTERED mean squared error. Every one of the 11 R2 sites in this arc (8 files) used `var(y - yhat)`, which discards the squared MEAN residual -- so any BIASED reconstruction is flattered. Fixed everywhere, by hand: the reviewer's committable suggestion dropped a `\` line-continuation and is a SyntaxError, so it was not applied. MEASURED IMPACT, not assumed: * ZERO wherever a ring-mean profile is present -- mean(resid) is 1e-12 by construction. Every f64 headline (0.9434 / 0.9090 / 0.972 / 0.926) is unchanged, so no other probe JSON needed regenerating. * carve A moved 0.9212 -> 0.9129, loss_dropped_rings 0.0222 -> 0.0306. * carve D moved 0.943406 -> 0.943403 (2.4e-06). WHY carve A MOVED 3400x MORE. It holds the two outer rings at a fixed value, so it carries a systematic offset -- and var() cannot see an offset at all. In Pa: carve A **+92.76 Pa bias**, carve D +1.59 Pa, f64 +0.00. In-disk variance is ~1e5 Pa^2, so tens of Pa of bias perturbs R2 in the 5th decimal. CONSEQUENCE, and the reason wording changed rather than just digits: I called the 12-byte facet "LOSSLESS" on the strength of an R2 agreeing to four decimals. R2 is structurally near-blind to exactly the defect that matters for an ENCODER, so I inferred losslessness from the one statistic that could not detect loss. Corrected to what is actually true: carve D recovers the f64 spine to within 0.07 Pa RMSE (0.03%) carrying a +1.59 Pa bias -- close, not lossless. The probe now emits RMSE and mean bias in Pa beside every R2, because those are what distinguish the carves. ALSO CORRECTED (all CodeRabbit, all verified before accepting): * 14 LOGICAL VALUES != 14 BYTES -- the model size and the carrier budget are different quantities, conflated in THREE places (report SS1, SS9.1, EPIPHANIES). The measured encoding is the 12-byte 6x(8:8) facet. * domino.rs does NOT "execute exactly this". Checked the source: its W is a FIXED 32x16 kernel whose top 16x16 is a tridiagonal smoothing kernel (domino.rs:113); no learned weights, no gates, no hidden or cell state. The tile-GEMM SHAPE and substrate exist; the model does not. Also flagged that the byte-parity int8 LSTM is an OCR model with its own trained weights -- evidence the primitives exist, not that anything is wired. * theta_e is a moist-adiabatic PROXY, not a complete entropy state, and precipitation is an exported flux, not the entropy-production term. The CT-M1..M3 diabatic gate needs its budget written down first. * "the statistically correct reading" survived in a HEADING one line above its own correction -- the third instance in this document of fixing a claim in one place and leaving its twin. Now "a working hypothesis supported by a structured residual". Docstring Coverage now reports 100.00% PASSED, confirming the 69.23% was stale and that declining to manufacture docstrings for it was correct. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
Post-merge board hygiene mandated by CLAUDE.md's Mandatory Board-Hygiene Rule: a merged PR requires a PR_ARC_INVENTORY prepend + a LATEST_STATE table entry, and both can only be written after the merge lands. The arc entry records what #926 established (the 90.9-94.3% spine, the 12-byte 6x(8:8) L4 carrier at 0.07 Pa RMSE, the Fisher-z rank/tail-vs-level demarcation), what it explicitly does NOT claim (CT-F14 NO-VERDICT, domino.rs is a fixed tridiagonal kernel not a moderator model, theta_e is a proxy not a budget), and the two methodological rules worth carrying forward: * R2 is structurally near-blind to encoder bias -- var() at 11 sites hid a +92.76 Pa offset, and "lossless" was inferred from the one statistic that could not detect the loss. Report RMSE and mean bias in the physical unit beside every R2. * The dominant defect class is PROPAGATION, not judgment. All five documentation defects were one claim corrected in one home and left standing in another -- prose vs artifact, body vs heading, code vs JSON, report vs PR description. When correcting a claim, grep for its twins. Per the rule's own termination clause this commit is hygiene-only and generates no further obligations: it adds no type, plan, deliverable, epiphany or code, and is discharged by the entries it writes. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
Caught by verifying this PR's OWN board entry against the committed JSONs before landing it: 18.07 / 3.84 = 4.71, not 5. A 6% rounding in the FAVOURABLE direction, one commit away from being frozen into an append-only record. Fixed in all four places the claim lives -- PR_ARC_INVENTORY, LATEST_STATE, EPIPHANIES, and COMET_TAIL_REPORT SS6.1 -- because the arc's dominant defect class is a claim corrected in one home and left standing in another, and fixing three of four would have reproduced it exactly. Nine of ten figures in the new entry verified exactly against the JSONs (0.9434 / 0.9090 spine, 0.07 Pa carveD RMSE delta, +1.59 Pa carveD bias, +92.76 Pa carveA bias, 0.9129 carveA R2, 0.684 CT-F14, 8.3x storm-tail, 139x L4x penalty). This was the tenth. Makes the PR mixed (hygiene + one correction) rather than hygiene-only, so the correction is recorded as a dated line inside the #926 arc entry it corrects, per the append-only convention -- not as a separate entry. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…nly) Self-caught, prompted by the append-only learnings CodeRabbit surfaced on #927: "the append-only rule applies to entries that have merged to main ... After merge, preserve the historical entry unchanged except for permitted Status and Confidence updates." The EPIPHANIES entry carrying "5x WORSE" merged with #926. My previous commit changed that number to 4.7x IN PLACE and UNMARKED -- which is history rewriting, not correction, and is the one thing an append-only ledger exists to prevent. Restored verbatim. The correction still stands where it belongs: in the newly-prepended #926 arc entry, which now also records that the merged line is deliberately frozen and why. A newest-first ledger is read from the top, so a frozen historical line is not a trap -- it is the audit trail. COMET_TAIL_REPORT.md keeps the 4.7x fix; it is not a board file and carries no append-only constraint. Noting the shape without excusing it: I made an unmarked edit to a frozen ledger inside a commit whose subject was propagation discipline. The rule I was citing is the rule I broke. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…arvest-rfii13 board: record merged PR #926 (arc entry + LATEST_STATE)
#927 was MIXED, not hygiene-only -- it landed board hygiene for #926 AND a correction to COMET_TAIL_REPORT.md AND an append-only revert. The termination clause exempts only the pure case, so its non-hygiene half owes this entry. (#927's own description called itself "hygiene-only"; that was written before the correction landed and was wrong by the time it merged.) The entry records two things a future session needs: * The Fisher-z ring-mean ratio is 4.7x, not 5x -- caught by verifying the entry's own figures against the committed JSONs before landing. 9 of 10 matched exactly; this was the tenth, a 6% overstatement in the favourable direction, one commit from being frozen into an append-only record. * LIVING DOCUMENTS and APPEND-ONLY LEDGERS take OPPOSITE correction discipline. A living document (report, code, JSON, PR description) is landed on directly, so a stale claim is a trap -> correct every copy. An append-only ledger is read newest-first and its value IS the audit trail -> freeze the merged entry, correct in a new one. I applied the first rule to the second kind of file while citing that very rule. The failure mode is a correct rule generalized past its domain -- the same shape as #921's doctrine-vs-domain finding and this arc's own Fisher-z result. Also banks the falsifier that closed "where else did I do this": a pure prepend cannot delete, so `git diff origin/main..HEAD -- .claude/board/` showing zero removed lines is a structural append-only audit. Measured +13/-0, +10/-0, +0/-0. THIS PR IS PURE HYGIENE -- no type, plan, deliverable, epiphany or code. Per the termination clause it generates no further obligations and the chain stops here. The living-vs-ledger lesson is deliberately recorded in the arc entry rather than minted as an EPIPHANIES entry, which would make this PR mixed and restart the chain; promote it on request. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
…h, fixed in all three homes Codex P2 on #930: "identical R-bar with mu shifted 100.3 deg" fused two different comparisons. Identical R-bar belongs to steering<->rotated (0.343 = 0.343, mu shifted exactly 90 -- rotation preserves concentration by construction); the 100.3 deg separation belongs to surface<->rotated, where R-bar is NOT identical (0.516 vs 0.343). The composite was false in all three homes: LATEST_STATE, the #929 arc entry, report SS5.13. Stated correctly the finding is STRONGER -- the control separates from surface in BOTH channels. Unmerged board entries composed in place (append-only rule's unmerged-PR allowance); the merged report gets a dated correction note. Lesson banked: the 13/13 figure verification checked every NUMBER and still missed this -- a relation between two individually correct numbers can be false. Verify comparative claims AS claims: every "identical/same/larger" must name both operands, and the check must evaluate the relation. Also codex P2 #2: the LATEST_STATE shipped-PR table had stalled at #780. Added #926-#929 rows plus an explicit gap-note row for #781-#925 (carried by PR_ARC_INVENTORY) -- honest gap, not silent reconstruction of ~150 rows. Co-Authored-By: Claude <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
… feel at home (regime x geometry x calibration) Operator framing, three messages: hold different situations constant (over water) vs flatland vs storm with high velocity differences/turbulence; good geometry vs badly calibrated; then find out where the substrate formulas feel at home. Hypothesis to falsify: a badly-calibrated substrate that maps DYNAMICALLY beats a well-calibrated absolute one in strong storms -- miscalibration as a regime-dependent property, not a uniform defect. Not fresh speculation. Three already-measured findings converge here: Fisher-z's opposite verdicts (8.3x better in the storm tail, 4.7x worse on ring means, #926); the three-register result that rank-normalised palette256 is the ONLY frame where cross-variable distance is defined (so "no absolute anchor" and "the only frame that works" are one property seen from two sides); and the operator-ruled golden index floor (#932), reused as the geometry axis's pre-existing good/bad split rather than inventing a new quality scale. SS1 PREFLIGHT ALREADY RUN -- the W6 lesson applied prospectively for the first time, and it corrected the plan before any bar existed: 1. "Flatland" is NOT one regime. It spans calmer-than-ocean (Amazon |grad p|=10.2) to 3x-ocean (W Siberia 43.8). Defining the middle regime by its surface-type LABEL would have scored two physically opposite fields as one condition. The regime axis is now defined by MEASURED |grad p|; surface labels are only the a-priori strategy for finding boxes along it. 2. Elevation confounds MSLP -- it is extrapolated over terrain, so its gradient is partly a reduction-formula artifact. Only elev sigma <= 150 m admissible, excluding US Great Plains (698 m), Argentine pampas (792 m), N European plain (319 m), Sahara (299 m) on evidence. 3. Wind SPEED does not discriminate (ocean 5.33 vs flatland 5.47 m/s); |grad p| separates them 14.96 vs 39.90. Scoring uses |grad p| and speed VARIANCE, never mean speed. Adopted ladder: R1 Amazon 10.2 -> R2 ocean 14.9 -> R3 W Siberia 43.8 -> R4 storm 95.6, a 9.3x dynamic range. Bars, controls first: C0 two controls (shuffled codebook + degenerate geometry), each cheap-smoke-tested for LOSABILITY before the full run (the E-A-CONTROL-THAT-CANNOT-LOSE lesson, plus W5's cannot-DIFFER twin); C1 ladder stability across >=3 timesteps; C2 THE CROSSOVER, two-sided with both failure directions pre-registered as reportable; C3 miscalibration penalty vs turbulence; C4 geometry floor on a sampling-fidelity metric (a NULL is expected-plausible per W5's B4 and must be said plainly); C5 the comfort matrix as the deliverable. Output contract carries raw operands, codebook edges actually used, drawn sample counts (equal-budget proof not intent), and units on every dimensional field -- the artifact-completeness and c_bow-is-km^-1 lessons. Board hygiene: INTEGRATION_PLANS prepend + STATUS_BOARD rows D-CZ-0..6 (D-CZ-0 already DONE -- the preflight). ~150 MB, minutes. Doc-only, nothing run beyond the preflight. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi
What this PR establishes
We found a spine. A surface low compresses to a center address + 14 logical fit values (~12 ring-profile means + a 2-value wavenumber-1 dipole) = 90.9–94.3 % of in-disk MSLP variance — replicated across three independent blind samples spanning 1980–2021, 41+ storms, four seasons, never shaken once. It is an explicit skeleton for the storm's center and the first asymmetry mode of its dynamics, mapping onto
highheelbgz's(start, stride, length)address form. That is more explicit structure than a learned weather model exposes.Those 14 logical values are measured to fit the real carrier: a 12-byte
6×(8:8)L4 facet (10 ring bytes spread over the radius with 2 interpolated, plus a 2-byte dipole rail), recovering the f64 spine to within 0.07 Pa RMSE (0.03 %) with a +1.59 Pa mean bias. 14 logical values ≠ 14 bytes — model size and carrier budget are kept separate throughout.What is not yet done is the modulation: the directional claim (dipole ↔ motion) is a real main effect (0.68–0.73 sign consistency across 41 storms) whose residual is structured, not random — it runs monotonically with measured covariates (a 92–102° height ladder at 3–5× the measured apparatus noise). Main effect + structured residual + identified covariate is consistent with a missing moderator and requires independent validation; it does not by itself exclude model misspecification, centre/label error, selection effects, or chance.
Canonical document:
probes/weather-p1/COMET_TAIL_REPORT.md(product-lead level, full falsification ledger, §6.1 carrier, §9 reframe).Two corrections worth reading before the table
decompose()fittinga1,b1per ring — 36 parameters, not the 14-value form the storage claim describes. Re-measured properly: 0.943 / 0.909. Every "93–97 %" in this PR's earlier description was that 36-parameter fit.var()instead of the uncentered MSE, at 11 sites. It discards the squared mean residual, so any biased reconstruction is flattered. Effect is exactly zero wherever a ring-mean profile is present (so all f64 headlines are unchanged) — but it hid a +92.76 Pa systematic bias in one carve. The 12-byte facet was called "lossless" on the strength of an R² agreeing to four decimals; R² is structurally near-blind to exactly the defect that matters for an encoder. The probes now emit RMSE and mean bias in Pa beside every R².The falsification chain (every bar pre-registered before its run)
comet_tail_probel4_rail_probe(new)6×(8:8)carrier?Every reversal got the same scrutiny in both directions — results that helped the claim were attacked as hard as results that hurt it.
The missing moderators (report §9)
Dry (measured here, unwired): steering level (the ladder — CT-F16), displacement/label noise, surface friction, latitude/regime.
Moist (not modeled at all): Feuchtigkeit + Abregnen im Aufwind an der Kollisionszone. θe, TCWV, precipitation and vertical velocity are proxies — θe is a moist-adiabatic proxy, not a complete entropy state, and precipitation is an exported flux, not the entropy-production term; the budget must be written down before the diabatic gate is used as a moderator (CT-M1..M3 named).
Forward path (§9.4): moderators as
Win aC = A·Wtile-GEMM. The shape and substrate exist —domino.rs's symbiont step is a 16-board AMX BF16 tile-GEMM, and the stencil-as-GEMM path is byte-proven on real WB2 data. The model does not: domino.rs'sWis a fixed tridiagonal smoothing kernel with no learned weights, gates, hidden state or cell state. Weather tensor shapes, a training procedure, and the recurrent update are all still undefined — that is the work, not a wiring job.Contents
probes/weather-p1/COMET_TAIL_REPORT.md— the canonical documentComposition: 9,919 insertions across 28 files — 47 % measured-results JSON, 36 % probe scripts, 17 % prose. Zero Rust, zero production/library code, no test harness. This PR adds measurement apparatus and its output; it changes no product surface.
Exploratory probes, NOT promoted EVs — the audit gate (plan §8) is the promotion path. The compression half is queue-ready; the predictor half is measured-and-unsupported at this power, not merely pending.
🤖 Generated with Claude Code
https://claude.ai/code/session_01CcpLeEC3XK8Eye53GKBVvi