ephemerides-spectral
High-precision HDC reference instrument for the Sol Star System.
Status: v0.26.0 — production-ready. Two-stage architecture: three interchangeable integer-ALU phase-residue encoders ( bip Python / c native / complex128 Python reference) feeding an FPU complex64 HD pipeline (syzygy / observer-bind / eclipse-probability); 52-body roster (v0.16.0 Tier-1 expansion: +4 Saturnian Lagrange trojans (Telesto/Calypso at Tethys L4/L5; Helene/Polydeuces at Dione L4/L5 — first L4/L5 entries in BODIES, multiplicity-2 Laplacian degeneracy at host frequency) + 3 Jovian irregulars (Himalia/Pasiphae/Sinope) + Proteus/Nereid (Neptune sub-graph completion); resonance-graph multi-leg find_itn_chains (v0.17.0 — Dijkstra-style graph search over the (body, epoch) state space generalising the v0.8.1 closed-form Hohmann anchor to multi-leg pathways with small-integer (p, q) gear-ratio resonance signatures per leg; pure-Python addition built on top of find_itn_pathways , no ABI bump); bridge.body_architecture (v0.18.0 — first spectral-architecture surface, classifying heliocentric bodies into the canonical inner-8 / outer-5 partition via the resonance-weighted gateway-graph Laplacian Fiedler vector; the cyclic-group encoder discovers the asteroid-belt boundary without being told it exists; Pluto and Neptune share the deepest outer entry via their 2:3 mean-motion lock; pure-Python addition, no ABI bump; research origin notebook §13.8); bridge.predict_itn_accessibility (v0.18.1 → v0.18.2 — closed-form spectral Δv estimate from the §13.9 hybrid Fiedler-distance regression; v0.18.2 upgraded to a 2-D (f₂, f₃) embedding with R² 0.51 → 0.64 and LOOCV MAE 4.24 → 3.12 km/s; useful for fast first-pass triage at microseconds-per-query vs ~1.5 s for the full Dijkstra; not for trajectory design; research origin notebook §13.9 / §13.10 / §14); Sol Electromagnetic Instrument (v0.19.0 — state-at-epoch query surface for the EM sector with bridge.get_em_state(jd_tdb) / list_em_couplings() / em_architecture(target=None) ; 16-body roster (1 star + 7 magnetised + 4 induced + 4 unmagnetised) + 7 pairwise EM couplings (Jupiter–Io flux tube headliner at ~10¹² W; Saturn–Enceladus, Saturn–Titan, Sun–Earth IMF, Jupiter–Europa, Jupiter–Ganymede, Sun–asteroid radiation pressure); not a BIP encoder — EM clocks don't form a low-order rational lattice with orbital periods so the cyclic-group discipline doesn't transplant; research origin notebook §16); full Sol Symphony Times; Sol Terra-Luna Time (STLT) with Meton's 432 BCE solstice as the default epoch; Sol Proper Time (SPrT) with --proper ; Sol Kinematics (v0.12.0) with --state and kinematics query; Sol Dynamics (v0.13.0) with --dynamics and dynamics query — system energy / per-body energy budgets / pair-wise gravitational forces, validated against the textbook 3.54×10²² N Earth-Sun figure to 0.01 % and the virial theorem to 0.5 %; adaptive ("breathing") couplings under their mainstream-literature name (Gross & Blasius 2008); JPL Power-of-Ten audit baseline (v0.11.2) with all ten rules satisfied (v0.13.4 + v0.13.5 + v0.13.6 + v0.13.7 + v0.13.9 — Rules 1, 3, 4, 5 source-side ratchet-pinned; Rule 10 enforced via cross-platform pedantic-build CI matrix; Rules 6+7 manual audits clean); pre-merge docs+parity hygiene check (v0.13.3) as a soft-warning GitHub Actions workflow. See the Status section below for the version-by-version landing record.
Overview
ephemerides-spectral is a hyperdimensional-computing instrument that encodes the barycentric state of our star system using high-precision ephemeris data (NASA JPL DE441 / DE442) as resonant phases over a graph Laplacian.
Two-stage architecture: integer-ALU phase residues, then FPU HD lift
The package separates the phase-residue computation (integer ALU, no FPU on the hot path) from the HD operations (syzygy projection, observer-bind, eclipse-probability — necessarily FPU because channel bases are unit-magnitude complex). The phase-residue stage has three interchangeable encoders; the HD stage runs complex64 natively or complex128 as the reference.
Phase-residue encoders (integer ALU)
bip (default) — bit-serialised integer ALU in pure Python. Phase composition lives in the cyclic group Z_{2^32} ; binding is (φ_1 + φ_2) mod 2^32 , which is implicit uint32 overflow — no FPU in the hot path. 305× faster than the FPU reference; 256 KB state at D=65536 . Always available.
(default) — bit-serialised integer ALU in pure Python. Phase composition lives in the cyclic group ; binding is , which is implicit overflow — no FPU in the hot path. 305× faster than the FPU reference; 256 KB state at . Always available. c (v0.3.1+) — native C library ( libephemerides_spectral.{so,dll,dylib} ) bundled in the platform wheel under _native/ , loaded via ctypes. Byte-for-byte identical phase residues to bip ; ~1000× speedup on the chunk loop (encode at +20 yr: 46 ms Python → 0.04 ms C). Falls back transparently to bip if the binary isn't loadable (sdist installs without a C toolchain, Pyodide / WASM, the pure-Python fallback wheel).
All three phase-residue encoders implement the same algebraic substrate (cyclic-group representation of celestial phase-space, graph-Laplacian eigenbasis) and produce identical uint32[38] residues at any JD; they trade precision for speed (the integer-ALU encoders are exact in Z_{2^32} ; the complex128 reference is float-ULP-quantised).
HD pipeline (FPU, complex64 production / complex128 regression)
Once the integer phase residues are computed, the HD operations (syzygy operator, observer-bind, eclipse-probability) lift them to a D-dimensional hypervector. This stage is necessarily FPU because the channel bases are (cos(φ), sin(φ)) complex pairs.
backend="auto" (default for get_local_view / get_eclipse_probability ) — selects c if the native binary is loaded (Tier 2b ABI v6), else falls back to bip integer phases lifted via the Python complex64 shim.
(default for / ) — selects if the native binary is loaded (Tier 2b ABI v6), else falls back to integer phases lifted via the Python shim. backend="c" — Tier 2b in C ( es_encode_state_hd / es_bind_observer / es_get_eclipse_probability ); complex64 storage (single-precision); ABI v6 since v0.7.0; parity smoke pins both paths to within float-ULP.
— Tier 2b in C ( / / ); storage (single-precision); ABI v6 since v0.7.0; parity smoke pins both paths to within float-ULP. backend="fpu-ref" — Python complex128 reference encoder with unit-norm complex Gaussian bases. Regression baseline only; used to validate the c and bip paths against double-precision ground truth, not as the production HD path. Kept for the same reason scientific software keeps reference implementations alongside production ones.
TL;DR on "pure ALU": phase residues are integer ALU end-to-end (BIP encoder hot path is uint64/int64/uint32, no floats); HD operations (syzygy / observer-bind / eclipse) lift those residues to complex64 and run on FPU. The package is not pure-ALU end-to-end — the HD pipeline can't be, because complex-magnitude bases require trigonometric channels. The integer-ALU discipline applies to the encoder hot path and is enforced by the JPL Power-of-Ten audit (Rule 10 pedantic-build matrix).
Companion Project
ephemerides-spectral lives in the same docs/antikythera-maths/ folder as antikythera-spectral because the two share the spectral / cyclic-group framing and the Pyodide bridge contract. They are not consolidated: antikythera-spectral encodes a specific bronze-age mechanism (940-tooth Callippic gear DAG) while ephemerides-spectral encodes the live JPL DE441 ephemeris with phase-dependent (breathing) gravitational couplings. The chess-spectral notebook §20.13–§20.17 calls out the cross-pollination — chess uses Z_{640} (paying an explicit % 640 per op); ephemerides uses Z_{2^32} (free uint32 overflow).
Key Capabilities
Graph Laplacian Propagator: Diagonal content = Newtonian mean motions + Mercury 43"/century post-Newtonian correction. Off-diagonal = gravitational fiber couplings (planet-sun, moon-planet, mean-motion resonances, asteroid-Jupiter).
Diagonal content = Newtonian mean motions + Mercury 43"/century post-Newtonian correction. Off-diagonal = gravitational fiber couplings (planet-sun, moon-planet, mean-motion resonances, asteroid-Jupiter). Phase 9 Adaptive Couplings (a.k.a. "breathing") (v0.9.2 CLI rename): Off-diagonal weights modulate with the resonant phase difference cos(n_a·φ_a − n_b·φ_b) . Formally a state-dependent (non-autonomous) graph Laplacian / adaptive Kuramoto-family network with phase-difference-dependent coupling (Gross & Blasius 2008, "Adaptive coevolutionary networks") — see the research notebook §1.4 for the full positioning across spectral-graph-theory / dynamical-systems / DNLS-on-a-graph vocabularies. CLI: ephemerides-spectral adaptive --jd ... (canonical) or ephemerides-spectral breathing --jd ... (visual-metaphor synonym; same handler, identical output). Implemented end-to-end without FPU using a 1024-entry int32 cosine LUT (Q1.14 amplitude, 4 KB).
Off-diagonal weights modulate with the resonant phase difference . Formally a / (Gross & Blasius 2008, "Adaptive coevolutionary networks") — see the research notebook §1.4 for the full positioning across spectral-graph-theory / dynamical-systems / DNLS-on-a-graph vocabularies. CLI: (canonical) or (visual-metaphor synonym; same handler, identical output). Implemented end-to-end without FPU using a 1024-entry cosine LUT (Q1.14 amplitude, 4 KB). Sol Star System Roster (v0.5.0+): 38 bodies — Sun, 9 planets (incl. Pluto), 24 moons, 4 main-belt asteroids. The moon set covers Earth's Moon, Mars's Phobos / Deimos, all 4 Galileans (Io, Europa, Ganymede, Callisto) plus the 4 inner regulars (Metis, Adrastea, Amalthea, Thebe) , the canonical 9 Saturnians (Mimas, Enceladus, Tethys, Dione, Rhea, Titan, Hyperion, Iapetus, Phoebe) plus the Janus / Epimetheus co-orbitals , Uranus's Titania, and Neptune's Triton.
— Sun, 9 planets (incl. Pluto), 24 moons, 4 main-belt asteroids. The moon set covers Earth's Moon, Mars's Phobos / Deimos, , , Uranus's Titania, and Neptune's Triton. Mean-motion resonances (v0.5.0+): 7 entries in RESONANCES — Jupiter–Saturn 5:2, Neptune–Pluto 3:2, Io–Europa 2:1, Europa–Ganymede 2:1, Mimas–Tethys 4:2 (Cassini Division), Enceladus–Dione 2:1 (powers Enceladus tidal heating), Titan–Hyperion 4:3 (Hyperion's chaotic rotation) . Natural-resonance gear group: Z_60 = Z_4 × Z_3 × Z_5 .
7 entries in — Jupiter–Saturn 5:2, Neptune–Pluto 3:2, Io–Europa 2:1, Europa–Ganymede 2:1, . Natural-resonance gear group: . Runtime kernel patching (v0.4.0+): Diagnosed-fiber overlay — patches sit beside the published kernel as DATA, not code edits, and contribute per-body residue deltas at encode time. Inspired by Linux ksplice / kpatch; the kernel's published bytes never change. Bridge surface: apply_patch(name) / apply_custom_patch(...) / clear_patches() . Three patches in the bundled CATALOG authored from the v0.3.1 FFT residual analysis. v0.5.1 patch-shrinks-residual benchmark measured the catalog and showed partial vindication : J–S coupled patch shrinks both bodies' residuals by ~77% with phase-recovered authoring (research-side; stays out of the v0.5.x catalog until ≥80% on every body); Mars stays stuck at 3% due to FFT bin leakage. v0.5.2 adds windowed FFT + multi-bin patches for full predictive power.
Diagnosed-fiber overlay — patches sit beside the published kernel as DATA, not code edits, and contribute per-body residue deltas at encode time. Inspired by Linux ksplice / kpatch; the kernel's published bytes never change. Bridge surface: / / . Three patches in the bundled CATALOG authored from the v0.3.1 FFT residual analysis. measured the catalog and showed : J–S coupled patch shrinks both bodies' residuals by ~77% with phase-recovered authoring (research-side; stays out of the v0.5.x catalog until ≥80% on every body); Mars stays stuck at 3% due to FFT bin leakage. v0.5.2 adds windowed FFT + multi-bin patches for full predictive power. SPICE-free runtime (v0.5.0+): pip install works out of the box — both backends use codegen-baked initial phases shipped in _data/initial_phases.json . No SPICE kernel staging required for basic encoding. Skyfield + jplephem stay as optional [ephemeris] extras for callers who want runtime recalibration against custom kernels.
works out of the box — both backends use codegen-baked initial phases shipped in . No SPICE kernel staging required for basic encoding. Skyfield + jplephem stay as optional extras for callers who want runtime recalibration against custom kernels. Observer-Agnostic Views: Unitary binding to generate topocentric "Local View" hypervectors at any (lat, lon) on any body.
Unitary binding to generate topocentric "Local View" hypervectors at any (lat, lon) on any body. Spectral Syzygy Window Search (v0.3.1+): find-syzygies --from-jd ... --to-jd ... enumerates candidate syzygies in closed form via the natural cyclic-group decomposition (synodic + draconic month), then confirms each by spectral projection. ~1000× faster than the v0.3.0 point-evaluation eclipse --jd pattern for window queries.
enumerates candidate syzygies in closed form via the natural cyclic-group decomposition (synodic + draconic month), then confirms each by spectral projection. ~1000× faster than the v0.3.0 point-evaluation pattern for window queries. ITN Pathway / Lagrange-Tube Query (v0.8.1+): find-tubes --from-jd ... --to-jd ... --departure terra --target mars enumerates Hohmann transfer windows via the same closed-form find-syzygies discipline. "Surfing the perturbations" — the natural cyclic structure tells you when launch windows open without integrating any trajectories. First-cut Hohmann math; future versions layer low-energy / heteroclinic-tube candidates under the same surface ( transfer_kind field reserves room). References: Koon-Lo-Marsden-Ross 2011; Lo's Genesis trajectory work.
enumerates Hohmann transfer windows via the same closed-form discipline. "Surfing the perturbations" — the natural cyclic structure tells you when launch windows open without integrating any trajectories. First-cut Hohmann math; future versions layer low-energy / heteroclinic-tube candidates under the same surface ( field reserves room). References: Koon-Lo-Marsden-Ross 2011; Lo's Genesis trajectory work. Sol Symphony Times (v0.3.0 + v0.5.4 + v0.8.0 + v0.9.1): every body in the Sol Star System has a "Sol Time" exposing its rotational + orbital cycles anchored to a conventional epoch — Mars Sol Date / Mars Coordinated Time (Allison & McEwen 2000), Sol Lunar Time (Luna's synodic + sidereal phase observed from Terra), Sol Uranian Time (USD/SUT, anchored at the 2007 northern equinox), Sol Venus / Sol Mercury / Sol Pluto / Sol Terra / Sol Luna (rocky bodies + Sun + Luna in direct Latin proper-noun form), Sol Sol (the Sun, Carrington rotation system), Sol Jovian / Sol Saturnian / Sol Neptunian (gas/ice giants in established adjective form). The Solar System is a natural symphony of overlapping clocks; Sol Time is just the package telling you what time it is on each body so you can correlate that body's local clock with JD. Naming hierarchy for future moon ports: Sol <Parent>-<Body> Time (e.g., Sol Pluto-Charon Time).
Naming convention (v0.9.x)
The body-identity strings use Latin proper nouns: terra , luna . The generic English words earth (= soil, ground) and moon (= any natural satellite) return to their generic meanings.
"Returning to the giants whose shoulders we stand on. We've always had a lunar orbit and a lunar eclipse. We've all had terrain and terrestrial animals. We're just putting the books back in their dewey decimal spot. We no longer kow tow for the sake of leaning forward."
The adjective forms lunar , terran , terrestrial always derived from Luna and Terra — the language already carried the convention. v0.9.0 made the body-identity strings reflect what the language always implied. v0.9.1 extends this to the Sol Time series itself: rocky bodies + Sun + Luna use direct Latin proper nouns; gas/ice giants keep the established astronomical adjective forms (Jovian, Saturnian, Uranian, Neptunian).
Body Sol Time Abbrev CLI Mercury Sol Mercury Time SMeT time-mercury Venus Sol Venus Time SVT time-venus Terra Sol Terra Time STT time-terra Mars Sol Mars Time (= MSD/MTC) SMaT time-mars Luna Sol Terra-Luna Time STLT time-terra-luna Jupiter Sol Jovian Time SJT time-jupiter Saturn Sol Saturnian Time SST time-saturn Uranus Sol Uranian Time SUT time-uranus Neptune Sol Neptunian Time SNT time-neptune Pluto Sol Pluto Time SPT time-pluto Sol Sol Sol Time SSoT time-sol
Moons follow the Sol <Parent>-<Body> Time convention — Luna's primary Sol Time is Sol Terra-Luna Time (STLT) because Luna is gravitationally bound to Terra; the Parent-Body name keeps the moon-stuck-to-parent relationship visible in the time hierarchy. STLT counts synodic months from a historically-significant epoch (default: Meton's 432 BCE summer solstice). The future Pluto-Charon, Jupiter-Io, Saturn-Titan, etc. moon Sol Times will follow the same Sol <Parent>-<Body> Time pattern — see task #86.
A separate, lower-level Sol Luna Time (SLT) also exists — Luna's tidally-locked surface clock (sidereal=orbital=27.32 d, solar=synodic=29.53 d) anchored at J2000. SLT is queryable via time-luna and bridge.jd_to_sol_luna_time ; it's the right surface for "what time is it on Luna's prime meridian" rather than "how many synodic months since a Greek-historical event." The two are complementary, not redundant: STLT is anchored Lunar time (count); SLT is Luna's clock (rate).
Resolution Scaling
Temporal resolution of a residue shift scales inversely with hypervector dimension D :
D Earth resolution Use case 2^16 ~8 minutes default; long-term mapping 2^19 ~1 minute medium-cadence events 2^25 ~1 second high-cadence local readout
Installation
pip install ephemerides-spectral
For full ephemeris support (skyfield + JPL DE-kernels):
pip install "ephemerides-spectral[ephemeris]"
CLI Usage
The package ships a rich ephemerides-spectral console script. Use --help on the top-level or any sub-command:
ephemerides-spectral --help ephemerides-spectral encode --help ephemerides-spectral adaptive --help
Sub-command Cheat-Sheet
# Package version + frozen-data manifest ephemerides-spectral version # All 38 bodies in the Sol Star System Laplacian ephemerides-spectral bodies # Earth temporal resolution at the default D=65536 ephemerides-spectral resolution --body terra # Encode J2000 with the integer ALU backend (default) ephemerides-spectral encode --jd 2451545 .0 # Same JD with the FPU complex128 reference encoder ephemerides-spectral encode --jd 2451545 .0 --backend complex128 # Topocentric view from London at J2000 ephemerides-spectral local-view --jd 2451545 .0 --body terra --lat 51 .5 --lon -0.1 # Syzygy alignment probability AT a JD (point evaluation; encode-then-check). # For window queries, see `find-syzygies` below (closed-form spectral search, # ~1000× faster than encode-then-check across long windows). ephemerides-spectral eclipse --jd 2451545 .0 # Off-diagonal couplings (Laplacian fiber bundle) ephemerides-spectral couplings # Phase 9 adaptive (a.k.a. "breathing") coupling modulation # (Jupiter-Saturn 5:2 by default). Both `adaptive` and `breathing` # work — `adaptive` is the canonical name (matches the adaptive- # networks / adaptive-Kuramoto literature, Gross & Blasius 2008); # `breathing` is the visual-metaphor synonym, kept for users who # learned the couplings as inhaling/exhaling with the resonant phase. ephemerides-spectral adaptive --jd 2458850 .0 # Override resonance: 3:2 Neptune-Pluto ephemerides-spectral adaptive --jd 2451545 .0 \ --pair-a neptune --pair-b pluto --n-a 3 --n-b 2 # Synonym (same handler, identical output): ephemerides-spectral breathing --jd 2458850 .0 # Mars Sol Date / Mars Coordinated Time at a JD (v0.3.0) ephemerides-spectral time-mars --jd 2451549 .5 # → MSD ≈ 44795.99 ephemerides-spectral time-mars --msd 50000 # invert: MSD → JD_UTC # Mean lunar synodic + sidereal age/phase at a JD (v0.3.0) ephemerides-spectral time-lunar --jd 2451545 .0 # Sol Uranian Time (v0.5.4) — third planetary time system alongside Mars + Lunar # USD (sidereal-day count since 2007 northern equinox), SUT (Uranian time-of-day), # orbital phase + season, retrograde flag. ephemerides-spectral time-uranus --jd 2454451 .0 # → USD = 0.0 at SUT epoch ephemerides-spectral time-uranus --usd 4046 # invert: USD → JD_TDB # Sol Symphony Times (v0.8.0) — Venus, Mercury, Pluto, Sol (the Sun!), # Jupiter, Saturn, Neptune each have their own "Sol Time" exposing rotational + orbital phase. # Each handles its body's quirks: Mercury's 3:2 spin-orbit resonance, Venus's # retrograde rotation (sidereal day > year!), Sol's differential rotation # (Carrington system), Jupiter System III, Saturn Cassini-revised System III. ephemerides-spectral time-venus --jd 2451545 .0 ephemerides-spectral time-mercury --jd 2451545 .0 # 3:2 resonance: solar day = 2 × year ephemerides-spectral time-pluto --jd 2457217 .0 # New Horizons closest approach ephemerides-spectral time-sol --jd 2451545 .0 # Sun's own Carrington Rotation Number ephemerides-spectral time-jupiter --jd 2444000 .5 ephemerides-spectral time-saturn --jd 2451545 .0 ephemerides-spectral time-neptune --jd 2451545 .0 # Sol Terra Time (v0.9.1) — Terra's surface clock # Sidereal day 23h 56m 4s (rotation rel. stars), solar day 24h (rel. Sun) ephemerides-spectral time-terra --jd 2451545 .0 # J2000 anchor # Sol Luna Time (v0.9.1) — Luna's surface clock # Tidally locked: sidereal=orbital=27.32d, solar=synodic=29.53d # DISTINCT from Sol Lunar Time (time-lunar) which gives Luna's phase observed from Terra ephemerides-spectral time-luna --jd 2451545 .0 # J2000 anchor # ITN pathway / Lagrange-tube query (v0.8.1) — Hohmann transfer windows # "surfing the perturbations" via closed-form synodic enumeration ephemerides-spectral find-tubes --from-jd 2451545 .0 --to-jd 2470000 .0 \ --departure terra --target mars # Output: 23 Terra->Mars windows over ~50 years, each with transfer time # (~258.9 days) + total Δv (~5.59 km/s) # Lunar-time kernel metadata (LTE440 + LTC status; v0.3.0) ephemerides-spectral lunar-kernels # Resonance-derived natural cyclic group (v0.3.0; expanded to Z_60 in v0.5.0) ephemerides-spectral natural-group # → Z_60 = Z_4 × Z_3 × Z_5 # Spectral-native syzygy window search (v0.3.1+) # Replaces the v0.3.0 point-evaluation `eclipse --jd` for window queries. # ~1000× faster than encode-then-check; uses the closed-form Saros / # Metonic / synodic / draconic-month enumeration. ephemerides-spectral find-syzygies --from-jd 2460311 --to-jd 2460676 # Diagnosed-fiber runtime kernel patching (v0.4.0+) # Patches sit beside the published kernel as DATA, not code edits, and # contribute per-body residue deltas at encode time. The kernel's # published bytes never change. Bundled catalog (11 patches as of v0.5.5): # v0.4.0 originals (3): mars-7.96yr-diagonal, mercury-10.69yr-diagonal, # jupiter-saturn-9.56yr-coupled # v0.5.2 LS-fit recovered (3, planets ≥96% shrinkage): same names with -v2 suffix # v0.5.5 LS-fit moons (5, ≥93% shrinkage): dione/tethys/enceladus/titan/iapetus -v2 ephemerides-spectral patches catalog ephemerides-spectral patches apply --name jupiter-saturn-9.56yr-coupled-v2 ephemerides-spectral patches active ephemerides-spectral patches clear
All sub-commands emit JSON to stdout; pass --no-pretty (top-level flag, before the sub-command) for compact single-line output suitable for piping into jq or downstream tooling. Every response carries an ok field; ok: false returns exit code 1 with an error message.
Python API
from ephemerides_spectral import default_encode , bridge # One-liner: encode a JD as a system state under the default backend. state = default_encode ( jd = 2451545.0 ) # uint32[52] residues (BIP) state = default_encode ( jd = 2451545.0 , backend = "complex128" ) # complex128[D] # JSON-friendly bridge surface (Pyodide / web frontend) bridge . get_version () # version + manifest bridge . list_bodies () # 52-body roster (v0.16.0+) bridge . get_resolution ( body = "mars" , D = 65536 ) # sec/residue bridge . get_system_state ( jd_tdb = 2451545.0 ) # encode + per-body residues bridge . get_local_view ( jd_tdb = 2451545.0 , body = "terra" , lat = 51.5 , lon =- 0.1 ) bridge . get_eclipse_probability ( jd_tdb = 2451545.0 ) bridge . list_couplings () # Laplacian fibers bridge . find_itn_pathways ( 2451545.0 , 2470000.0 , departure = "terra" , target = "mars" ) # v0.8.1 single-leg Hohmann bridge . find_itn_chains ( 2451545.0 , 2470000.0 , departure = "terra" , target = "jupiter" , intermediates = [ "venus" , "mars" ]) # v0.17.0 multi-leg ITN bridge . body_architecture ( target = "terra" ) # v0.18.0 inner/outer Fiedler partition bridge . predict_itn_accessibility ( departure = "terra" , target = "jupiter" ) # v0.18.1 spectral Δv estimate bridge . get_breathing_modulation ( jd_tdb = 2451545.0 ) # Phase 9 LUT inspector # v0.3.0 surface bridge . jd_to_mars_time ( jd_utc = 2451549.5 ) # MSD + MTC (Allison & McEwen 2000) bridge . mars_time_to_jd ( msd = 50000 ) # MSD → JD_UTC inverse bridge . get_lunar_phase ( jd_tdb = 2451545.0 ) # mean synodic + sidereal phase bridge . list_lunar_kernels () # LTE440 metadata + LTC status bridge . get_natural_resonance_group () # Z_60 = Z_4 × Z_3 × Z_5 (v0.5.0+) # v0.4.0 surface — runtime kernel patching (overlay on the spectral kernel) # Catalog grows over time; v0.6.1 ships 11 entries: # v0.4.0 originals (3): mars/mercury/jupiter-saturn at FFT-magnitude amplitudes # v0.5.2 LS-fit recovered (3, planets at ≥96% shrinkage): -v2 suffix # v0.5.5 LS-fit moons (5, ≥93% shrinkage): dione/tethys/enceladus/titan/iapetus -v2 bridge . list_catalog_patches () # bundled CATALOG (11 patches) bridge . apply_patch ( "jupiter-saturn-9.56yr-coupled-v2" ) # vindicated v0.5.2 entry bridge . apply_custom_patch ( name = "my-patch" , kind = "sinusoid" , body = "terra" , amplitude_deg = 0.93 , period_days = 1940.2 ) # FFT-diagnosed custom patch bridge . list_active_patches () # what's currently overlaid bridge . clear_patches () # wipe back to byte-exact baseline # v0.5.4 surface — Sol Uranian Time bridge . jd_to_sol_uranian_time ( jd_tdb = 2454451.0 ) # USD + SUT + season + retrograde bridge . sol_uranian_time_to_jd ( usd = 4046.0 ) # USD → JD_TDB inverse # v0.6.0 Tier 1 parity surface — both methods accept backend={"auto","bip","c"} bridge . find_syzygies ( jd_lo = 2451545.0 , jd_hi = 2451545.0 + 365.25 , backend = "c" ) bridge . get_breathing_modulation ( jd_tdb = 2451545.0 , pair = ( "jupiter" , "saturn" ), n_lobes = ( 5 , 2 ), backend = "c" )
Every bridge method returns a Pyodide-JSON-serialisable dict with ok: True/False . Caller-side errors return {ok: False, error: "..."} rather than raising — designed for crossing the Python/JS boundary cleanly.
Performance & Footprint
ephemerides-spectral is designed for high-performance galactic mapping on edge devices where large SPICE kernels (the 3.3 GB DE441) are prohibitive.
Memory Footprint
Component Format RAM / Flash Description State (BIP) uint32[D] 256 KB At D=65536 ; pure cyclic-group residues. State (complex128) complex128 1.0 MB At D=65536 ; FPU reference encoder. Channel Bases mixed ~52 MB Full 52-body roster (v0.16.0+); pageable from Flash. Laplacian ( L ) complex128 < 45 KB 52 × 52 interaction matrix. Cosine LUT (Phase 9) int32[1024] 4 KB Off-diagonal adaptive ("breathing") modulation. DE441 Truth BSP 3,300 MB Original JPL source (calibration only).
Compression vs DE441: > 100:1. Once calibrated, the HDC instrument functions as standalone algebraic truth — no kernel needed for propagation, local-view extraction, or syzygy detection.
Microcontroller Compatibility
The BIP backend is the natural production target for embedded use:
ESP32-S3 / ESP32-C6 (8 MB+ PSRAM): full 52-body BIP state in PSRAM, microsecond-latency phase updates via uint32 adds.
(8 MB+ PSRAM): full 52-body BIP state in PSRAM, microsecond-latency phase updates via adds. ARM Cortex-M7 (Teensy 4.1, etc.): integer multiply-accumulate suits the omega * delta_t step path natively; cosine LUT fits in tightly-coupled memory.
(Teensy 4.1, etc.): integer multiply-accumulate suits the step path natively; cosine LUT fits in tightly-coupled memory. RISC-V / Edge AI accelerators: (φ_1 + φ_2) mod 2^32 is a single uint32 add — directly mappable to vector-extension lanes.
Instead of searching 3.3 GB of Chebyshev coefficients, these devices evolve the entire Sol Star System phase-space using integer additions and a 4 KB cosine table.
Honest accuracy: DE441 full-epoch sweep (v0.3.0)
research/de441_sweep.py runs the BIP integer-ALU encoder at 15 sample points spanning J2000 ± 14,000 yr (just inside DE441's ~30,000-yr coverage window) and compares per-body ecliptic-longitude residues against DE441 ground truth. Results — sorted by max error, descending:
Body n median (rad) p95 (rad) max (rad) max (deg) jupiter 15 1.357 2.937 3.070 175.92 saturn 15 1.415 2.990 3.062 175.46 neptune 15 0.691 2.748 2.778 159.18 pluto 15 0.791 2.524 2.721 155.92 moon 15 1.084 2.559 2.670 153.00 mercury 15 0.356 1.444 1.461 83.74 mars 15 0.117 0.250 0.253 14.52 uranus 15 0.047 0.120 0.141 8.06 venus 15 0.024 0.114 0.124 7.11 earth 15 0.011 0.104 0.115 6.59
Earth phase error scales roughly linearly with horizon:
Δt (yr) Earth err (deg) 0 0.000 ±1 0.001–0.004 ±10 0.006–0.008 ±100 0.065–0.069 ±1000 0.65–0.68 ±5000 2.93–3.31 ±10000 4.70–5.71 ±14000 5.48–6.59
Three regimes, honestly named
Sub-10° at multi-millennium horizons (Earth, Venus, Uranus): bodies whose mean motion + small eccentricity + the static gravitational fiber couplings approximate the actual orbit well. Earth benefits from being the calibration body for Mercury's PN diagonal.
bodies whose mean motion + small eccentricity + the static gravitational fiber couplings approximate the actual orbit well. Earth benefits from being the calibration body for Mercury's PN diagonal. Tens of degrees (Mars 14.5°, Mercury 83.7°): dynamics include eccentricity + long-period perturbations the Phase-9 model captures only partially. Mars has no resonance entry; Mercury's PN diagonal is linear whereas its actual perihelion precession at multi-millennium scales has higher-order terms.
dynamics include eccentricity + long-period perturbations the Phase-9 model captures only partially. Mars has no resonance entry; Mercury's PN diagonal is linear whereas its actual perihelion precession at multi-millennium scales has higher-order terms. Phase-scrambled (Jupiter, Saturn, Neptune, Pluto, Moon all hit >150°): bodies whose secular drift is dominated by resonant perturbations the Phase-9 model approximates phenomenologically. The α = 0.1 modulation depth is the right order of magnitude but wrong-in-detail; over ±14,000 yr that wrong-detail accumulates to a ~3 rad phase deficit.
This measures how much of multi-millennium ephemeris our v0.3.0 model captures, not how accurate the BIP encoder is at its design horizon. v0.3.0 is calibrated for the ±20-yr horizon (0.0002 rad ≈ 0.012° Earth phase floor); the multi-millennium errors are the cost of running a model trained for short-horizon dynamics far past its design point. The v0.4+ first-principles per-resonance α derivation is the planned fix — see ROADMAP.
Encoding timings (BIP integer-ALU path, default D = 65536 )
Δt (yr) encode wall time 0 0.2 ms ±1 0.7–1.3 ms ±10 4.2–6.8 ms ±100 44.7–45.8 ms ±1000 447–483 ms ±5000 2.38–2.44 s ±10000 4.34–4.44 s ±14000 6.18–6.37 s
Linear in |Δt| — one 30-day chunk per integration step. At the v0.1.0 design horizon (±20 yr, ~243 chunks) the encode is ~1.85 ms; at ±14,000 yr (~170k chunks) it's ~6.4 s. Median across the sweep: 447 ms; max: 6.4 s.
v0.4.1+ C native path drops these by ~1000× (encode at +20 yr: 46 ms BIP → 0.04 ms C). The full DE441 FFT-residual sweep (1024 samples) takes ~14 seconds on the C native path versus ~5 minutes on Python BIP — the truth-lookup against skyfield is the new bottleneck.
Patch-shrinks-residual benchmark — VINDICATED on planets (v0.5.2)
Earn the right to predict the missing data. — measured.
The v0.4.0 catalog patches claimed to predict missing physics; v0.5.1 audited them and surfaced two authoring bugs (amplitude off by 2×, phase=0 assumption wrong); v0.5.2 fixed both with least-squares fitting at the exact target period. Result: VINDICATED on every targeted planet body.
Patch v0.4.0 (mag-only) v0.5.1 (phase-recovered) v0.5.2 (LS-fit) Mars 7.96 yr +2.5% +2.7% +99.2% Mercury 10.69 yr −49.9% (peak GREW) +39.6% +99.9% Jupiter 9.56 yr +30.9% +77.1% +97.6% Saturn 9.56 yr −0.4% +76.4% +96.0%
The vindicated patches ship as CATALOG_V2 alongside the original v0.4.0 CATALOG . Use the -v2 suffix:
bridge . apply_patch ( "mars-7.96yr-diagonal-v2" ) # 99.2% shrinkage bridge . apply_patch ( "mercury-10.69yr-diagonal-v2" ) # 99.9% bridge . apply_patch ( "jupiter-saturn-9.56yr-coupled-v2" ) # 97.6% J / 96.0% S
Empirical findings worth noting:
J–S correlation = +1 (in-phase) , not −1 as v0.4.0 assumed. Anti-correlated-libration intuition was empirically wrong.
, not −1 as v0.4.0 assumed. Anti-correlated-libration intuition was empirically wrong. LS-fit amplitudes are 25–55% larger than FFT-bin extraction — the energy that was leaking into adjacent bins.
than FFT-bin extraction — the energy that was leaking into adjacent bins. Mars's true residual amplitude is 10.69° (LS) vs 3.45° (FFT-bin rank-1) — a 3× underestimate, the worst leakage case in the catalog.
See the v0.5.2 patch-shrinks-residual analysis on the project docs for the full math derivation, methodology, and moon-residual open question.
Status
See the project CHANGELOG and package CHANGELOG for the authoritative version-by-version detail. Headline summary:
v0.26.0 (current) — Schema-gap-driven trigger — the system identifies what it doesn't know. Closes the Mathematical Provenance Method loop the v0.24.x → v0.25.x ships established. New bridge.suggest_gap_collections(*, ood_threshold=0.85) : reads the v0.24.10 OOS probe roster, runs each probe through the v0.24.9 dynamical-regime classifier, identifies regime gaps (OOD / spurious-match / surprise), and matches each gap against attested-source descriptors via their [gap_targeting].regime_labels declarations. The output is a deterministic suggestion list — same MPM discipline as every other v0.24.x / v0.25.x surface; no LLM, no SGD, no random init. Each suggestion: probe_name + calibration_ratio + current_landing + expected_regime + gap_kind (∈ {ood, spurious_match, surprise} ) + target_regime_label + candidate_descriptors (matching descriptors with their human-readable name and matching regime labels). Three real gaps surface immediately on the v0.25.x descriptor set: phobos (chaotic-Mars surprise), ceres (OOD-flagged, no candidate), vesta (v0.24.12-introduced spurious-chaotic-Mars landing). New CLI subcommand suggest-gap-collections [--ood-threshold N] . The CI automation that consumes this surface and opens auto-PRs for targeted T1 collection lives in a future v0.26.x ship; v0.26.0 ships the analysis half — the suggestion surface is itself the deliverable. Pure-Python additive; no ABI bump (thirty-ninth consecutive ship since v0.13.x). 10 new tests in tests/test_attested_collector.py . The system identifies what it doesn't know and points at sources that could populate the gap; the eigenbasis points at its own next ground-proof row.
(current) — Closes the Mathematical Provenance Method loop the v0.24.x → v0.25.x ships established. New : reads the v0.24.10 OOS probe roster, runs each probe through the v0.24.9 dynamical-regime classifier, identifies regime gaps (OOD / spurious-match / surprise), and matches each gap against attested-source descriptors via their declarations. The output is a deterministic suggestion list — same MPM discipline as every other v0.24.x / v0.25.x surface; no LLM, no SGD, no random init. Each suggestion: + + + + (∈ ) + + (matching descriptors with their human-readable name and matching regime labels). Three real gaps surface immediately on the v0.25.x descriptor set: (chaotic-Mars surprise), (OOD-flagged, no candidate), (v0.24.12-introduced spurious-chaotic-Mars landing). New CLI subcommand . that consumes this surface and opens auto-PRs for targeted T1 collection lives in a future v0.26.x ship; v0.26.0 ships the analysis half — the suggestion surface is itself the deliverable. (thirty-ninth consecutive ship since v0.13.x). 10 new tests in . The system identifies what it doesn't know and points at sources that could populate the gap; the eigenbasis points at its own next ground-proof row. v0.25.2 — Attested collector — T3 live query. Completes the four-tier reproducibility model from notebook §18.1 (T0 frozen / T1 CI-baked / T2 user runtime kernel / T3 live query ). New live=True parameter on bridge.get_attested_dataset(source_key, *, live=True, limit=None, offset=0) : when set, the call invokes the descriptor's declared adapter against the upstream archive at call time, returns rows with full per-row attestation (the same 9 mandatory fields T1 collector runs produce), and stamps the response envelope with tier="T3" + retrieved_at + upstream_response_sha256s so a paper appendix can replay against an archived response. Default remains live=False (T0+T1+T2 baseline; baseline-tier responses now also carry an explicit tier="T0+T1+T2" discriminator). CLI: attested-dataset --source <KEY> --live flag wires through. Reproducibility tier : T3 — weakest. Each row's response_sha256 documents the upstream content currently served; replay requires re-fetching against an unchanged upstream OR archiving response bytes alongside the attestation. Adapter errors during live fetches surface as ok=False with diagnostic + retrieved_at so consumers can record the failed attempt. Pure-Python additive; no ABI bump (thirty-eighth consecutive ship since v0.13.x). 7 new tests in tests/test_attested_collector.py (live-fetch happy path; per-row attestation completeness; pagination; unknown-source; adapter-error diagnostic; CLI --live flag).
— Completes the four-tier reproducibility model from notebook §18.1 (T0 frozen / T1 CI-baked / T2 user runtime kernel / ). New parameter on : when set, the call invokes the descriptor's declared adapter against the upstream archive at call time, returns rows with full per-row attestation (the same 9 mandatory fields T1 collector runs produce), and stamps the response envelope with + + so a paper appendix can replay against an archived response. Default remains (T0+T1+T2 baseline; baseline-tier responses now also carry an explicit discriminator). CLI: flag wires through. : T3 — weakest. Each row's documents the upstream content currently served; replay requires re-fetching against an unchanged upstream OR archiving response bytes alongside the attestation. Adapter errors during live fetches surface as with diagnostic + so consumers can record the failed attempt. (thirty-eighth consecutive ship since v0.13.x). 7 new tests in (live-fetch happy path; per-row attestation completeness; pagination; unknown-source; adapter-error diagnostic; CLI --live flag). v0.25.1 — Attested collector — T2 user runtime kernel. Adds the second of three reproducibility-tier extensions promised in notebook §18.1: a local NDJSON cache that overlays the T0+T1 baseline at query time. Surface : bridge.use_local_kernel(path) registers an overlay directory shaped like <source_key>/<table>.ndjson ; once registered, queries ( get_attested_dataset / attestation_audit ) consult the overlay FIRST per source and REPLACE the baseline NDJSON for any source whose table file exists in the overlay; sources with no overlay file fall through to T0+T1 unchanged. bridge.clear_local_kernel() removes the registered overlay. bridge.get_local_kernel_state() returns the registered path + per-source overlay file list + a cache hash (SHA-256 over the canonical-serialised list of (source_key, ndjson_sha256) pairs) — paper appendices record this hash to document exactly which T2 rows were consumed at runtime, enabling deterministic replay against an archived overlay tree. Three new CLI subcommands: local-kernel-use --path <DIR> , local-kernel-clear , local-kernel-state . Reproducibility tier : T2. Within a single user's local cache state, queries are byte-identical; the cache hash uniquely identifies the state. Default policy is REPLACE (overlay file replaces baseline for that source); APPEND policy may land in a later v0.25.x. T3 live query ships v0.25.2 (#160). Pure-Python additive; no ABI bump (thirty-seventh consecutive ship since v0.13.x). 11 new tests in tests/test_attested_collector.py .
— Adds the second of three reproducibility-tier extensions promised in notebook §18.1: a local NDJSON cache that overlays the T0+T1 baseline at query time. : registers an overlay directory shaped like ; once registered, queries ( / ) consult the overlay FIRST per source and REPLACE the baseline NDJSON for any source whose table file exists in the overlay; sources with no overlay file fall through to T0+T1 unchanged. removes the registered overlay. returns the registered path + per-source overlay file list + a (SHA-256 over the canonical-serialised list of pairs) — paper appendices record this hash to document exactly which T2 rows were consumed at runtime, enabling deterministic replay against an archived overlay tree. Three new CLI subcommands: , , . : T2. Within a single user's local cache state, queries are byte-identical; the cache hash uniquely identifies the state. Default policy is REPLACE (overlay file replaces baseline for that source); APPEND policy may land in a later v0.25.x. T3 live query ships v0.25.2 (#160). (thirty-seventh consecutive ship since v0.13.x). 11 new tests in . v0.25.0 — Attested Multi-Source Collector framework v1 — three pilots end-to-end + T1 collect CI workflow + MPR v1 normative format. Completes the v0.25.0a/b ship sequence formalised in notebook §18. The CONFIG-not-CODE escape from the v0.24.x hand-coding pattern is now production-ready: each new attested source is a TOML descriptor + JSON Schema, consumed by a generic 5-adapter shared core, producing canonical NDJSON ground-proof rows with mandatory attestation blocks. Three pilot sources end-to-end : EarthRef SC ( html_scraper — Wessel & Sandwell 2018; ~1,800 seamounts); GMRT ( csv_bulk via GMRT GridServer ESRI ASCII Grid — Ryan et al. 2009; bathymetry rows for v0.24.5 Hawaii / v0.24.7 Mars Tharsis spatial regimes); PetDB v4 ( json_api via EarthChem unified search — Lehnert et al. 2000; igneous-rock geochemistry samples). Adapter coverage: html_scraper , json_api , csv_bulk real impls (lazy requests + bs4 ); netcdf_grid + geotiff_bbox ship as fixture-only stubs gated behind collector-netcdf / collector-geotiff extras (rasterio/gdal stays out of v0.25.0 maintenance). T1 collect CI workflow — new .github/workflows/ephemerides-spectral-collect.yml runs collectors against live archives on schedule (monthly) + manual dispatch; opens auto-PR with refreshed NDJSON; maintainer reviews per-row citation provenance before merging. New codegen/run_collectors.py is the only network-touching code path in the project; regenerate.py does no network I/O (verified by ratchet test). Bridge surfaces shipped in v0.25.0a ( list_attested_sources , get_attested_dataset paginated, get_attested_descriptor , attestation_audit ); CLI subcommands shipped likewise ( attested-list , attested-dataset , attested-descriptor , attested-audit ). Reproducibility tier: T0 frozen baseline + T1 CI-baked extension; T2 user runtime kernel ships v0.25.1 (#159); T3 live query ships v0.25.2 (#160); v0.26.x research thread closes the MPM loop with the schema-gap-driven trigger consuming [gap_targeting] declarations (#161). MPR (Mathematical Provenance Record) v1 is normative — once shipped, future bumps require explicit migration. Format aligns with the discipline name from §0.0: The Mathematical Provenance Method. Pure-Python additive; no ABI bump.
— Completes the v0.25.0a/b ship sequence formalised in notebook §18. The CONFIG-not-CODE escape from the v0.24.x hand-coding pattern is now production-ready: each new attested source is a TOML descriptor + JSON Schema, consumed by a generic 5-adapter shared core, producing canonical NDJSON ground-proof rows with mandatory attestation blocks. : EarthRef SC ( — Wessel & Sandwell 2018; ~1,800 seamounts); GMRT ( via GMRT GridServer ESRI ASCII Grid — Ryan et al. 2009; bathymetry rows for v0.24.5 Hawaii / v0.24.7 Mars Tharsis spatial regimes); PetDB v4 ( via EarthChem unified search — Lehnert et al. 2000; igneous-rock geochemistry samples). Adapter coverage: , , real impls (lazy + ); + ship as fixture-only stubs gated behind / extras (rasterio/gdal stays out of v0.25.0 maintenance). — new runs collectors against live archives on schedule (monthly) + manual dispatch; opens auto-PR with refreshed NDJSON; maintainer reviews per-row citation provenance before merging. New is the only network-touching code path in the project; does no network I/O (verified by ratchet test). Bridge surfaces shipped in v0.25.0a ( , paginated, , ); CLI subcommands shipped likewise ( , , , ). Reproducibility tier: T0 frozen baseline + T1 CI-baked extension; T2 user runtime kernel ships v0.25.1 (#159); T3 live query ships v0.25.2 (#160); v0.26.x research thread closes the MPM loop with the schema-gap-driven trigger consuming declarations (#161). MPR (Mathematical Provenance Record) v1 is — once shipped, future bumps require explicit migration. Format aligns with the discipline name from §0.0: The Mathematical Provenance Method. v0.25.0a — Attested Multi-Source Collector framework — code-only checkpoint toward v0.25.0. Implements notebook §18: CONFIG-not-CODE escape from the v0.24.x hand-coding pattern. Each new attested source is a TOML descriptor + JSON Schema + (eventual) committed NDJSON. Ships MPR v1 normative format (Mathematical Provenance Record — aligned with the discipline from §0.0), descriptor module + 5-adapter shared core via typing.Protocol , universal catalog wrapper, 4 new bridge surfaces ( list_attested_sources , get_attested_dataset paginated, get_attested_descriptor , attestation_audit ), 4 new CLI subcommands ( attested-list , attested-dataset , attested-descriptor , attested-audit ), EarthRef SC pilot descriptor (NDJSON commits via v0.25.0b T1 auto-PR). Adapter coverage: html_scraper (real, EarthRef SC), json_api + csv_bulk (parse-real-fetch-stub for v0.25.0b), netcdf_grid + geotiff_bbox (fixture-only stubs gated behind collector-netcdf / collector-geotiff extras). Determinism preserved: byte-exact NDJSON mirror, no LF normalisation, codegen-determinism CI step passes; regenerate.py does no network I/O. Code-only checkpoint — no PyPI release; v0.25.0 stable publishes when v0.25.0b lands (GMRT + PetDB pilots + T1 collect CI workflow). 37 new tests. Pure-Python additive; no ABI bump.
— Implements notebook §18: CONFIG-not-CODE escape from the v0.24.x hand-coding pattern. Each new attested source is a TOML descriptor + JSON Schema + (eventual) committed NDJSON. Ships (Mathematical Provenance Record — aligned with the discipline from §0.0), descriptor module + 5-adapter shared core via , universal catalog wrapper, 4 new bridge surfaces ( , paginated, , ), 4 new CLI subcommands ( , , , ), EarthRef SC pilot descriptor (NDJSON commits via v0.25.0b T1 auto-PR). Adapter coverage: (real, EarthRef SC), + (parse-real-fetch-stub for v0.25.0b), + (fixture-only stubs gated behind / extras). Determinism preserved: byte-exact NDJSON mirror, no LF normalisation, codegen-determinism CI step passes; does no network I/O. — no PyPI release; v0.25.0 stable publishes when v0.25.0b lands (GMRT + PetDB pilots + T1 collect CI workflow). 37 new tests. v0.24.12 — Loki Patera Eruption Cycle (Io tidal-heating temporal-spectrum cousin to v0.24.8 Axial Seamount; Galilean Laplace 4:2:1 forcing) — eleventh ship in v0.24.x and the second time the project applies a temporal-spectrum observable to a single sub-system (after v0.24.8 Axial). Where Axial is a mid-ocean-ridge submarine volcano driven by mantle-plume magma supply, Loki Patera is driven by tidal heating from the Galilean Laplace 4:2:1 mean-motion resonance — the canonical 3-body orbital lock between Io, Europa, and Ganymede. Same temporal_quasi_periodic_cycle regime label as v0.24.8 — explicitly populates the regime more densely rather than opening a new one. Headline closure : the Galilean Laplace commensurability 4·P_Io ≈ 2·P_Europa ≈ P_Ganymede is verified to ~1% by the published orbital periods, exposing the libration-around-exact structure that Peale-Cassen-Reynolds 1979 used to predict Io tidal heating two weeks before Voyager 1 confirmed it. Loki Patera physics : ~200 km diameter lava lake at ~12.7° N / ~309.6° W on Io; the largest persistent thermal anomaly in the Solar System; accounts for 5-15% of Io's globally-integrated ~10¹⁴ W tidal dissipation budget — 2-3 orders of magnitude larger than Earth's total volcanic output. Quasi-periodic ~540-day brightening / resurfacing cycle (Rathbun 2002 GRL canonical paper; range 480-580 d), proceeding through brightening → resurfacing-wave → cooling → quiescent phases. 6-cycle-peak observation roster spanning 1990-2017 + 6 action-angle modes + 8-entry SOURCES citation dict (Rathbun 2002, de Kleer 2017+, Veeder 1994, Spencer 1990, Rathbun-Spencer 2010, de Kleer 2019, Peale-Cassen-Reynolds 1979, Murray-Dermott 1999). v0.24.12-introduced schema-gap surfacing : adding Loki at spatial_scale_log_km=2.30 made it a near-twin to Vesta (2.42), collapsing Vesta's calibration-ratio from 0.98 (honest "I don't know") to 0.79 — Vesta now lands on rigid_body_chaotic_obliquity as a SPURIOUS classification (the physics doesn't match: small-body radiation-drift, not chaotic obliquity). Pinned in tests as the next schema-gap to close (small-body-radiation ground-proof row needed). The schema-gap loop continues: each ship that lands close to existing rows redensifies the eigenbasis and surfaces new gaps in the OOS roster. Cross-channel reach : cousin to v0.24.8 Axial (same regime, different forcing class — tidal vs mantle-plume); cross-references v0.21.5 (Jupiter-Io flux tube), v0.21.6 (tidal-resonance ↔ orbital migration; the 4:2:1 lock is the canonical example), and v0.24.11 Pluto-Charon (the binary-system analogue of the 4:2:1 lock, with the small moons at near-3:4:5:6 multiples). Three new bridge surfaces: bridge.get_loki_patera_eruption_cycle() / bridge.get_loki_galilean_laplace_signature() / bridge.list_loki_patera_eruption_cycle() . Three new CLI subcommands: loki-patera-eruption-cycle , loki-galilean-laplace-signature , loki-patera-eruption-cycle-full . Pure-Python additive; no ABI bump (thirty-fifth consecutive ship since v0.13.x; ES_ABI_VERSION = 8 unchanged). New tests/test_loki_patera_eruption_cycle.py (41 tests). Naming-discipline addition (per research notebook): the v0.24.x methodology is formally The Mathematical Provenance Method — we don't train, we don't fit, we don't initialise pseudorandomly; we project labelled ground-proof rows through closed-form np.linalg.eigh and accept the eigenbasis as a property of the data, not a fit to it.
— — eleventh ship in v0.24.x and the time the project applies a temporal-spectrum observable to a single sub-system (after v0.24.8 Axial). Where Axial is a mid-ocean-ridge submarine volcano driven by mantle-plume magma supply, — the canonical 3-body orbital lock between Io, Europa, and Ganymede. Same regime label as v0.24.8 — explicitly populates the regime more densely rather than opening a new one. : the Galilean Laplace commensurability is verified to ~1% by the published orbital periods, exposing the libration-around-exact structure that Peale-Cassen-Reynolds 1979 used to predict Io tidal heating two weeks before Voyager 1 confirmed it. : ~200 km diameter lava lake at ~12.7° N / ~309.6° W on Io; the largest persistent thermal anomaly in the Solar System; accounts for 5-15% of Io's globally-integrated ~10¹⁴ W tidal dissipation budget — 2-3 orders of magnitude larger than Earth's total volcanic output. Quasi-periodic ~540-day brightening / resurfacing cycle (Rathbun 2002 GRL canonical paper; range 480-580 d), proceeding through brightening → resurfacing-wave → cooling → quiescent phases. spanning 1990-2017 + 6 action-angle modes + 8-entry citation dict (Rathbun 2002, de Kleer 2017+, Veeder 1994, Spencer 1990, Rathbun-Spencer 2010, de Kleer 2019, Peale-Cassen-Reynolds 1979, Murray-Dermott 1999). : adding Loki at spatial_scale_log_km=2.30 made it a near-twin to Vesta (2.42), collapsing Vesta's calibration-ratio from 0.98 (honest "I don't know") to 0.79 — Vesta now lands on as a SPURIOUS classification (the physics doesn't match: small-body radiation-drift, not chaotic obliquity). Pinned in tests as the next schema-gap to close (small-body-radiation ground-proof row needed). The schema-gap loop continues: each ship that lands close to existing rows redensifies the eigenbasis and surfaces new gaps in the OOS roster. : cousin to v0.24.8 Axial (same regime, different forcing class — tidal vs mantle-plume); cross-references v0.21.5 (Jupiter-Io flux tube), v0.21.6 (tidal-resonance ↔ orbital migration; the 4:2:1 lock is the canonical example), and v0.24.11 Pluto-Charon (the binary-system analogue of the 4:2:1 lock, with the small moons at near-3:4:5:6 multiples). Three new bridge surfaces: / / . Three new CLI subcommands: , , . (thirty-fifth consecutive ship since v0.13.x; unchanged). New (41 tests). Naming-discipline addition (per research notebook): the v0.24.x methodology is formally — we don't train, we don't fit, we don't initialise pseudorandomly; we project labelled ground-proof rows through closed-form and accept the eigenbasis as a property of the data, not a fit to it. v0.24.11 — Pluto-Charon Dynamical Spectrum (binary mutual tidal lock; Path-B closure of v0.24.10 OOS-probe-roster schema-gap) — fourth per-body action-angle ship in v0.24.x (after Mercury / Luna / Mars), and the project's first binary mutual-tidal-lock entry. Pluto-Charon is the Solar System's only known double-synchronous binary planet: mutual orbital period = both spin periods = 6.387 d. Eccentricity 5e-5 (~1100x smaller than Luna's 0.0549) + mutual obliquity 0.0006° confirm the system has reached the END STATE of dyadic tidal evolution. Mass ratio Charon/Pluto = 0.122 (largest binary mass ratio in the Solar System); barycenter sits ~940 km outside Pluto's surface (Pluto radius 1188 km, barycenter offset 2128 km) — both bodies orbit a point in empty space. Cross-channel small-moon observation : Styx/Nix/Kerberos/Hydra orbit the barycenter at near-3:4:5:6 multiples of the mutual orbital period (Hydra closest to perfect commensurability at 0.32% off; Styx furthest at 5.22% off; chaotic in libration on Myr timescales per Showalter-Hamilton 2015 Nature). Path-B closure : prior to v0.24.11 the v0.24.10 OOS probes had Pluto-Charon collapsing onto Mercury-stable in the v0.24.9 classifier — the feature-schema couldn't distinguish commensurabilities-without-Saros-track from self-resonance. Rather than engineer a new feature (which would alter eigenbasis numerics — the project's discipline says don't), v0.24.11 populates the missing regime with a real ground-proof row : Pluto-Charon as a 10th example with a NEW regime label rigid_body_action_angle_mutual_lock . Pluto-Charon probe now self-classifies to the new label (cal_ratio 0). Enceladus + Io probes (also feature-space neighbors of the new row) now land on mutual_lock instead of Mercury — partial closure that surfaces the next remaining gap : asymmetric-satellite-with-partner-resonance (Enceladus 2:1 Dione, Io 4:2:1 Galilean Laplace) is structurally distinct from binary mutual lock but the schema can't distinguish them yet. Future v0.24.x ships (or v0.25.0 multi-source-collector batch ingest) will populate this niche too. Terminology refinement (in code and docs): the v0.24.x catalogs are ground-proof rows , not "training data". Adding Pluto-Charon is a deterministic schema extension, not a re-training: np.linalg.eigh recomputes byte-identically; no SGD, no random init, no validation split, no pseudorandom anywhere. 12-mode action-angle catalog : 3 angle-locked at 6.387 d (mutual orbital + Pluto spin + Charon spin) + 1 slow apsidal libration + 4 actions (eccentricity, mutual obliquity, mass ratio, heliocentric inclination) + 4 small-moon near-3:4:5:6 commensurabilities. Three new bridge surfaces: bridge.get_pluto_charon_dynamical_spectrum() / bridge.get_double_synchronous_signature() / bridge.list_pluto_charon_dynamical_spectrum() . Three new CLI subcommands: pluto-charon-dynamical-spectrum , double-synchronous-signature , pluto-charon-dynamical-spectrum-full . 7-entry SOURCES citation dict (Stern 1992, Tholen-Buie 1990, Brozovic 2015, Stern 2015, Showalter-Hamilton 2015, Showalter 2015 Kerberos, Weaver 2016). Pure-Python additive; no ABI bump (thirty-fourth consecutive ship since v0.13.x; ES_ABI_VERSION = 8 unchanged). New tests/test_pluto_charon_dynamical_spectrum.py (33 tests).
— — fourth per-body action-angle ship in v0.24.x (after Mercury / Luna / Mars), and the project's first entry. Pluto-Charon is the Solar System's only known double-synchronous binary planet: mutual orbital period = both spin periods = 6.387 d. Eccentricity 5e-5 (~1100x smaller than Luna's 0.0549) + mutual obliquity 0.0006° confirm the system has reached the END STATE of dyadic tidal evolution. Mass ratio Charon/Pluto = 0.122 (largest binary mass ratio in the Solar System); barycenter sits ~940 km Pluto's surface (Pluto radius 1188 km, barycenter offset 2128 km) — both bodies orbit a point in empty space. : Styx/Nix/Kerberos/Hydra orbit the barycenter at near-3:4:5:6 multiples of the mutual orbital period (Hydra closest to perfect commensurability at 0.32% off; Styx furthest at 5.22% off; chaotic in libration on Myr timescales per Showalter-Hamilton 2015 Nature). : prior to v0.24.11 the v0.24.10 OOS probes had Pluto-Charon collapsing onto Mercury-stable in the v0.24.9 classifier — the feature-schema couldn't distinguish commensurabilities-without-Saros-track from self-resonance. Rather than engineer a new feature (which would alter eigenbasis numerics — the project's discipline says don't), v0.24.11 : Pluto-Charon as a 10th example with a NEW regime label . Pluto-Charon probe now self-classifies to the new label (cal_ratio 0). Enceladus + Io probes (also feature-space neighbors of the new row) now land on instead of Mercury — partial closure that surfaces the : asymmetric-satellite-with-partner-resonance (Enceladus 2:1 Dione, Io 4:2:1 Galilean Laplace) is structurally distinct from binary mutual lock but the schema can't distinguish them yet. Future v0.24.x ships (or v0.25.0 multi-source-collector batch ingest) will populate this niche too. (in code and docs): the v0.24.x catalogs are , not "training data". Adding Pluto-Charon is a deterministic schema extension, not a re-training: recomputes byte-identically; no SGD, no random init, no validation split, no pseudorandom anywhere. : 3 angle-locked at 6.387 d (mutual orbital + Pluto spin + Charon spin) + 1 slow apsidal libration + 4 actions (eccentricity, mutual obliquity, mass ratio, heliocentric inclination) + 4 small-moon near-3:4:5:6 commensurabilities. Three new bridge surfaces: / / . Three new CLI subcommands: , , . 7-entry citation dict (Stern 1992, Tholen-Buie 1990, Brozovic 2015, Stern 2015, Showalter-Hamilton 2015, Showalter 2015 Kerberos, Weaver 2016). (thirty-fourth consecutive ship since v0.13.x; unchanged). New (33 tests). v0.24.10 — OOS probe catalog + classifier calibration-ratio metric — closes a v0.24.9 loose end and surfaces a latent diagnostic. Two payloads in one ship: (1) a curated 10-probe out-of-sample roster (Yellowstone hotspot, Reunion hotspot, Pluto-Charon, Enceladus, Io Galilean Laplace, Phobos, Ceres, Alpha Centauri B K-dwarf, Vesta, magnetar) that ratchet-pins the v0.24.9 classifier's behaviour on real bodies not in the v0.24.0–v0.24.8 training set; (2) the calibration-ratio metric nearest_distance / 2nd_nearest_distance + nearest_neighbour_margin + out_of_distribution flag, surfaced as first-class fields on classify_dynamical_regime output (the diagnostic was latent in v0.24.9's distances_to_all but never summarised). Reframing : the v0.24.9 classifier looks like nearest-neighbour ML but its "training step" is a single closed-form np.linalg.eigh call — no random init, no SGD, no hyperparameter search, no validation split, no pseudorandom anywhere. The eigenbasis is a property of the labelled data, not a model fit to it. v0.24.10's OOS probes are test vectors, never training data; the classifier's eigenbasis is computed only from the 9 v0.24.0–v0.24.8 training examples. Probe results (8 match expected + 1 correctly OOD-flagged + 1 let-classifier-surprise-us = 0 unexpected): Yellowstone → bounded_local_laplacian_trajectory (Hawaii cousin, ratio 0.24); Reunion → same regime (ratio 0.07); Alpha Centauri B → continuum_normal_modes (Sun cousin, ratio 0.01); Ceres → rigid_body_action_angle_stable ; Vesta → OOD-flagged (ratio 0.98 — honest "I don't know"); Pluto-Charon / Enceladus / Io → rigid_body_action_angle_stable (the v0.24.9 schema gap: bodies with commensurabilities but no Saros-style multi-millennium prediction record can't be distinguished from Mercury without an additional feature axis); Phobos → rigid_body_chaotic_obliquity (let-classifier-surprise-us probe; pinned as documented current behaviour); magnetar → shape_residual_chandrasekhar (surprising classification driven by dimensionality=3 alignment despite size mismatch). The probe roster is honest about both the schema-gap cases and the surprising-classification cases — future feature-schema extensions (e.g., a "commensurability-without-published-track" axis) would let Pluto-Charon / Enceladus / Io land on Luna-commensurate, and the test would FAIL clearly, signaling that the schema gap has been addressed. Three new bridge surfaces: bridge.run_dynamical_regime_probes(n_components=3, ood_threshold=0.85) / bridge.list_dynamical_regime_probes() + (calibration-metric additions) bridge.classify_dynamical_regime now returns calibration_ratio , nearest_neighbour_margin , out_of_distribution , ood_threshold_used . Two new CLI subcommands: regime-probes , regime-probes-list . 10-entry probe SOURCES citation dict (Pierce-Morgan 1992 Yellowstone, Courtillot 1986 Reunion, Stern 1992 Pluto-Charon, Murray-Dermott 1999 Enceladus, Peale-Cassen-Reynolds 1979 Io, Bills 2005 Phobos, Park 2016 Ceres, Kjeldsen 2005 Alpha Cen B, Russell 2012 Vesta, Kaspi-Beloborodov 2017 magnetar). Pure-Python additive; no ABI bump (thirty-third consecutive ship since v0.13.x; ES_ABI_VERSION = 8 unchanged). New tests/test_dynamical_regime_probes.py (33 tests).
— — closes a v0.24.9 loose end and surfaces a latent diagnostic. Two payloads in one ship: (Yellowstone hotspot, Reunion hotspot, Pluto-Charon, Enceladus, Io Galilean Laplace, Phobos, Ceres, Alpha Centauri B K-dwarf, Vesta, magnetar) that ratchet-pins the v0.24.9 classifier's behaviour on real bodies not in the v0.24.0–v0.24.8 training set; + + flag, surfaced as first-class fields on output (the diagnostic was latent in v0.24.9's but never summarised). : the v0.24.9 classifier looks like nearest-neighbour ML but its "training step" is a single closed-form call — no random init, no SGD, no hyperparameter search, no validation split, no pseudorandom anywhere. The eigenbasis is a property of the labelled data, not a model fit to it. v0.24.10's OOS probes are test vectors, never training data; the classifier's eigenbasis is computed only from the 9 v0.24.0–v0.24.8 training examples. (8 match expected + 1 correctly OOD-flagged + 1 let-classifier-surprise-us = 0 unexpected): Yellowstone → (Hawaii cousin, ratio 0.24); Reunion → same regime (ratio 0.07); Alpha Centauri B → (Sun cousin, ratio 0.01); Ceres → ; Vesta → OOD-flagged (ratio 0.98 — honest "I don't know"); Pluto-Charon / Enceladus / Io → (the v0.24.9 schema gap: bodies with commensurabilities but no Saros-style multi-millennium prediction record can't be distinguished from Mercury without an additional feature axis); Phobos → (let-classifier-surprise-us probe; pinned as documented current behaviour); magnetar → (surprising classification driven by dimensionality=3 alignment despite size mismatch). The probe roster is honest about both the schema-gap cases and the surprising-classification cases — future feature-schema extensions (e.g., a "commensurability-without-published-track" axis) would let Pluto-Charon / Enceladus / Io land on Luna-commensurate, and the test would FAIL clearly, signaling that the schema gap has been addressed. Three new bridge surfaces: / + (calibration-metric additions) now returns , , , . Two new CLI subcommands: , . 10-entry probe citation dict (Pierce-Morgan 1992 Yellowstone, Courtillot 1986 Reunion, Stern 1992 Pluto-Charon, Murray-Dermott 1999 Enceladus, Peale-Cassen-Reynolds 1979 Io, Bills 2005 Phobos, Park 2016 Ceres, Kjeldsen 2005 Alpha Cen B, Russell 2012 Vesta, Kaspi-Beloborodov 2017 magnetar). (thirty-third consecutive ship since v0.13.x; unchanged). New (33 tests). v0.24.9 — Dynamical-Regime Classifier (eigenbasis-projection version of the v0.24.x if/else chain) — tenth and capstone ship in v0.24.x; the project's first explicit meta-consumer of the v0.24.x methodology arc. Premise : the v0.24.x conversation framed an aspirational if/else chain that selected which dynamical-spectrum methodology to apply to a given body — Mercury / Luna get rigid-body action-angle (v0.24.0 / v0.24.1); Mars gets KAM small-denominator failure (v0.24.2); Sun gets continuum normal-modes (v0.24.3); Hawaii gets bounded-local-Laplacian-trajectory (v0.24.5); etc. v0.24.9 replaces that chain with a learned eigenbasis projection over the v0.24.x catalogs themselves : each of the nine v0.24.0–v0.24.8 ships becomes a labelled training example in a 7-dimensional feature space; the principal-component decomposition of the standardised feature matrix is the project's dynamical-regime classifier. Feature schema (7 features per ship) : time_scale_log_s (log10 period in s), spatial_scale_log_km (log10 length in km), stability_index (0..1 Diophantine-stability indicator), has_commensurability (1=integer-resonance observable / 0=none), prediction_track_signal (-1=published-MISS observed / 0=no published prediction / +1=HIT-only), dimensionality (0=point / 1=chain / 2=surface / 3=volume), forcing_class_index (0=gravitational / 1=stellar-oscillation / 2=radiation / 3=tectonic / 4=volcanic). Headline payload : top 3 PCs explain ~83% of variance (top 4 PCs ~94%). 9/9 self-classification accuracy (every training example round-trips to itself). Out-of-sample probes do sensible things: Yellowstone hotspot → bounded_local_laplacian_trajectory (Hawaii-like); a generic K-dwarf star → continuum_normal_modes (Sun-like); Enceladus (1.4-day orbital, 2:1 Dione lock) → rigid_body_action_angle_stable with Luna-like as 2nd-nearest. Where the v0.24.5 / v0.24.7 / v0.24.8 ships demonstrate the bounded-local-Laplacian methodology on Earth-surface, Mars-surface, and a temporal cycle, v0.24.9 demonstrates the same eigenbasis discipline applied to the v0.24.x ships themselves as data points — a coherent meta-level closure on the v0.24.x sequence. Three new bridge surfaces: bridge.get_dynamical_regime_eigenbasis(n_components=3) / bridge.classify_dynamical_regime(feature_vector) / bridge.list_dynamical_regimes() . Three new CLI subcommands: regime-eigenbasis , regime-classify , regime-list . 9-entry SOURCES citation dict (one pointer per v0.24.0–v0.24.8 ship); ratchet tests pin every per-ship presence + feature-vector schema invariants. Pure-Python additive; no ABI bump (thirty-second consecutive ship since v0.13.x; ES_ABI_VERSION = 8 unchanged). New tests/test_dynamical_regime.py (48 tests).
— — tenth and capstone ship in v0.24.x; the project's first explicit meta-consumer of the v0.24.x methodology arc. : the v0.24.x conversation framed an aspirational if/else chain that selected which dynamical-spectrum methodology to apply to a given body — Mercury / Luna get rigid-body action-angle (v0.24.0 / v0.24.1); Mars gets KAM small-denominator failure (v0.24.2); Sun gets continuum normal-modes (v0.24.3); Hawaii gets bounded-local-Laplacian-trajectory (v0.24.5); etc. v0.24.9 replaces that chain with a : each of the nine v0.24.0–v0.24.8 ships becomes a labelled training example in a 7-dimensional feature space; the principal-component decomposition of the standardised feature matrix is the project's dynamical-regime classifier. : (log10 period in s), (log10 length in km), (0..1 Diophantine-stability indicator), (1=integer-resonance observable / 0=none), (-1=published-MISS observed / 0=no published prediction / +1=HIT-only), (0=point / 1=chain / 2=surface / 3=volume), (0=gravitational / 1=stellar-oscillation / 2=radiation / 3=tectonic / 4=volcanic). : top 3 PCs explain ~83% of variance (top 4 PCs ~94%). 9/9 self-classification accuracy (every training example round-trips to itself). Out-of-sample probes do sensible things: Yellowstone hotspot → (Hawaii-like); a generic K-dwarf star → (Sun-like); Enceladus (1.4-day orbital, 2:1 Dione lock) → with Luna-like as 2nd-nearest. — a coherent meta-level closure on the v0.24.x sequence. Three new bridge surfaces: / / . Three new CLI subcommands: , , . 9-entry citation dict (one pointer per v0.24.0–v0.24.8 ship); ratchet tests pin every per-ship presence + feature-vector schema invariants. (thirty-second consecutive ship since v0.13.x; unchanged). New (48 tests). v0.24.8 — Axial Seamount Eruption Chronology Catalog (temporal-spectrum eruption-cycle observable on a real-time-monitored submarine volcano; the project's first explicit prediction-reliability ship) — ninth ship in v0.24.x and the first time the project ships a temporal-spectrum observable on a single sub-system rather than a spatial graph or per-body action-angle roster. Where v0.24.5 Hawaii (with plate tectonics) extracts a spatial trajectory and v0.24.7 Mars Tharsis (no plate tectonics) extracts a spatial cogenetic family, v0.24.8 Axial Seamount (mid-ocean-ridge hotspot) extracts a quasi-periodic eruption cycle with measurable methodology track-record — same v0.24.x algebraic discipline; different observable axis. Physics : Axial Seamount is an active submarine volcano on the Juan de Fuca Ridge (~480 km off the Oregon coast), at the unusual intersection of a hotspot with a mid-ocean spreading ridge. Summit caldera ~3 × 8 km, floor ~1500 m below sea surface, sits atop a magma reservoir that inflates between eruptions and deflates explosively. Three confirmed historical eruptions: 1998, 2011, 2015 . The 2015 event is the canonical case for spectral-prediction methodology — Chadwick et al. 2016 publicly forecast it ~6 months in advance using sea-floor inflation rates from the Ocean Observatories Initiative (OOI) Cabled Array (the world's first underwater volcano observatory, online since ~2014). The Chadwick-Nooner methodology assumes an inflation-rate-controlled trigger : the caldera floor must rise to within ~0.5 m of its pre-1998 elevation before the magma reservoir over-pressurises and erupts. THE HEADLINE PAYLOAD : the methodology has a published track record on a single body of one HIT and one MISS . The 2015 forecast hit; the next forecast — for 2024-2025 , based on the 2015-2022 inflation trajectory — has NOT been met as of catalog reference year 2026, because the post-2015 inflation rate has slowed substantially below the 2011-2015 reference, breaking the constant-rate extrapolation underlying the published forecasts. Cross-channel observation : this is a direct parallel to v0.24.2 Mars secular-resonance chaos — a quasi-periodic dynamical mode that is Diophantine-stable over some observation window and small-denominator-fragile outside it. v0.24.2 showed the failure mode at Gyr / arcsec-per-year scale; v0.24.8 shows it at decade / cm-per-year scale. Same algebraic structure on two wildly different observational scales — the project's cleanest cross-system spectral-stability observation to date. Ships : 3-eruption roster (1998 Dziak-Fox / 2011 Caress / 2015 Chadwick), 4 inflation-phase records (pre-1998 / 1998-2011 / 2011-2015 / post-2015), 2 Chadwick-Nooner forecast records (2015 HIT, 2024-2025 MISS), 8-km × 3-km caldera + ~1500 m summit depth + ~0.5 m geodetic trigger threshold. Three new bridge surfaces: bridge.get_axial_seamount_chronology() / bridge.get_axial_inflation_cycle_signature() / bridge.list_axial_seamount() . Three new CLI subcommands: axial-seamount-chronology , axial-inflation-cycle-signature , axial-seamount-full . 10-entry SOURCES citation dict (Dziak & Fox 1999, Embley 1999, Caress 2012, Chadwick 2016, Wilcock 2016, Nooner-Chadwick 2009, Nooner-Chadwick 2016, post-2015 follow-ups, Tolstoy 2018, Kelley 2014 OOI). Pure-Python additive; no ABI bump (thirty-first consecutive ship since v0.13.x; ES_ABI_VERSION = 8 unchanged). New tests/test_axial_seamount.py (40 tests).
— — ninth ship in v0.24.x and the the project ships a temporal-spectrum observable on a single sub-system rather than a spatial graph or per-body action-angle roster. Where v0.24.5 Hawaii (with plate tectonics) extracts a spatial trajectory and v0.24.7 Mars Tharsis (no plate tectonics) extracts a spatial cogenetic family, v0.24.8 Axial Seamount (mid-ocean-ridge hotspot) extracts a — same v0.24.x algebraic discipline; different observable axis. : Axial Seamount is an active submarine volcano on the (~480 km off the Oregon coast), at the unusual intersection of a hotspot with a mid-ocean spreading ridge. Summit caldera ~3 × 8 km, floor ~1500 m below sea surface, sits atop a magma reservoir that inflates between eruptions and deflates explosively. Three confirmed historical eruptions: . The 2015 event is the canonical case for spectral-prediction methodology — publicly forecast it ~6 months in advance using sea-floor inflation rates from the (the world's first underwater volcano observatory, online since ~2014). The Chadwick-Nooner methodology assumes an : the caldera floor must rise to within ~0.5 m of its pre-1998 elevation before the magma reservoir over-pressurises and erupts. : the methodology has a . The 2015 forecast hit; the next forecast — for , based on the 2015-2022 inflation trajectory — has been met as of catalog reference year 2026, because the post-2015 inflation rate has slowed substantially below the 2011-2015 reference, breaking the constant-rate extrapolation underlying the published forecasts. : this is a — a quasi-periodic dynamical mode that is Diophantine-stable over some observation window and small-denominator-fragile outside it. v0.24.2 showed the failure mode at Gyr / arcsec-per-year scale; v0.24.8 shows it at scale. — the project's cleanest cross-system spectral-stability observation to date. : 3-eruption roster (1998 Dziak-Fox / 2011 Caress / 2015 Chadwick), 4 inflation-phase records (pre-1998 / 1998-2011 / 2011-2015 / post-2015), 2 Chadwick-Nooner forecast records (2015 HIT, 2024-2025 MISS), 8-km × 3-km caldera + ~1500 m summit depth + ~0.5 m geodetic trigger threshold. Three new bridge surfaces: / / . Three new CLI subcommands: , , . 10-entry citation dict (Dziak & Fox 1999, Embley 1999, Caress 2012, Chadwick 2016, Wilcock 2016, Nooner-Chadwick 2009, Nooner-Chadwick 2016, post-2015 follow-ups, Tolstoy 2018, Kelley 2014 OOI). (thirty-first consecutive ship since v0.13.x; unchanged). New (40 tests). v0.24.7 — Mars Tharsis Volcanic Chain Catalog (bounded-local Laplacian on a body WITHOUT plate tectonics) — eighth ship in v0.24.x and the second time the project's graph-Laplacian eigenbasis is applied to physical features on a single body's surface rather than to orbital relationships between bodies. Direct cross-body counterpart to v0.24.5 Hawaii: where v0.24.5 catalogued a hotspot track on a body with plate tectonics, v0.24.7 catalogues the Mars Tharsis montes on a body without plate tectonics. Physics : the same mantle-plume mechanism that produces hotspot chains on Earth (Pacific Plate moving over a stationary Hawaii plume) instead produces stationary super-volcanoes on Mars, because the lithosphere is unbroken — a plume sitting under the same patch of crust for ~Gyr timescales builds one giant volcano rather than a chain. Olympus Mons (~22 km from base to summit, 600 km diameter, the largest volcano in the Solar System) is the direct consequence: it would be a chain on Earth, but on Mars the plume never moved relative to the lithosphere. 5-volcano roster : Olympus Mons (the super-volcano outlier; Hartmann 2005 youngest-flow age ~150 Myr), the three Tharsis Montes — Arsia / Pavonis / Ascraeus — aligned NE-SW along a deep-mantle ridge at ~3400 km spacing (Werner 2009 / Hartmann & Neukum 2001 ages 100–130 Myr), and Alba Mons (the much older / much broader / much shorter N outlier; ~1500 km base diameter, ~6.8 km elevation, ~1500 Myr surface age — an earlier Hesperian phase of Tharsis volcanism; Plescia 2004). Two complementary spectral observations : (1) bounded-local Fiedler partition — Gaussian-spatial-proximity Laplacian (σ=1500 km on Mars's 3389.5 km-radius surface) bisects the 5-volcano roster, isolating Alba Mons (the geographically distant N outlier) from the four young Tharsis-region volcanoes. The eigenvalue gap λ₃ − λ₂ ≈ 0.51·λ₂ confirms a meaningful partition. (2) Tharsis Montes ridge alignment + outlier residuals — fit the three Tharsis Montes to a great-circle ridge (~040° azimuth NE-SW), then compute perpendicular residuals: Olympus Mons sits ~1900 km off the ridge axis, Alba Mons ~1200 km off — structural offsets analogous to Hawaii's age-vs-arc-length residuals at the bend, but structural (deep-mantle plume geometry) rather than temporal (plate-motion change). Cross-channel observation : there is no directional bend in the Mars Tharsis system because there is no plate motion to record one. The same eigendecomposition machinery, on a no-plate-tectonics body, surfaces cogenetic-family structure rather than chronological trajectory . Hawaii (with plate tectonics) → trajectory; Mars (no plate tectonics) → family. Three new bridge surfaces: bridge.get_mars_tharsis_chain() / bridge.get_tharsis_fiedler_signature() / bridge.list_mars_tharsis_chain() . Three new CLI subcommands: mars-tharsis-chain , tharsis-fiedler-signature , mars-tharsis-chain-full . 8-entry SOURCES citation dict (Hartmann & Neukum 2001, Hartmann 2005, Werner 2009, Plescia 2004, Smith 2001 MOLA, Anderson 2001, Carr & Head 2010, Morgan 1971); ratchet tests pin every per-row source resolution. Pure-Python additive; no ABI bump (thirtieth consecutive ship since v0.13.x; ES_ABI_VERSION = 8 unchanged). New tests/test_mars_tharsis.py (35 tests).
— — eighth ship in v0.24.x and the the project's graph-Laplacian eigenbasis is applied to rather than to orbital relationships between bodies. Direct cross-body counterpart to v0.24.5 Hawaii: where v0.24.5 catalogued a hotspot track on a body plate tectonics, v0.24.7 catalogues the Mars Tharsis montes on a body plate tectonics. : the same mantle-plume mechanism that produces hotspot on Earth (Pacific Plate moving over a stationary Hawaii plume) instead produces on Mars, because the lithosphere is unbroken — a plume sitting under the same patch of crust for ~Gyr timescales builds giant volcano rather than a chain. (~22 km from base to summit, 600 km diameter, the largest volcano in the Solar System) is the direct consequence: it would be a chain on Earth, but on Mars the plume never moved relative to the lithosphere. : (the super-volcano outlier; Hartmann 2005 youngest-flow age ~150 Myr), the three — — aligned NE-SW along a deep-mantle ridge at ~3400 km spacing (Werner 2009 / Hartmann & Neukum 2001 ages 100–130 Myr), and (the much older / much broader / much shorter N outlier; ~1500 km base diameter, ~6.8 km elevation, ~1500 Myr surface age — an earlier Hesperian phase of Tharsis volcanism; Plescia 2004). : — Gaussian-spatial-proximity Laplacian (σ=1500 km on Mars's 3389.5 km-radius surface) bisects the 5-volcano roster, isolating Alba Mons (the geographically distant N outlier) from the four young Tharsis-region volcanoes. The eigenvalue gap λ₃ − λ₂ ≈ 0.51·λ₂ confirms a meaningful partition. — fit the three Tharsis Montes to a great-circle ridge (~040° azimuth NE-SW), then compute perpendicular residuals: Olympus Mons sits ~1900 km off the ridge axis, Alba Mons ~1200 km off — structural offsets analogous to Hawaii's age-vs-arc-length residuals at the bend, but (deep-mantle plume geometry) rather than (plate-motion change). : there is in the Mars Tharsis system because there is no plate motion to record one. The same eigendecomposition machinery, on a no-plate-tectonics body, surfaces rather than . Hawaii (with plate tectonics) → trajectory; Mars (no plate tectonics) → family. Three new bridge surfaces: / / . Three new CLI subcommands: , , . 8-entry citation dict (Hartmann & Neukum 2001, Hartmann 2005, Werner 2009, Plescia 2004, Smith 2001 MOLA, Anderson 2001, Carr & Head 2010, Morgan 1971); ratchet tests pin every per-row source resolution. (thirtieth consecutive ship since v0.13.x; unchanged). New (35 tests). v0.24.6 — Small-body Yarkovsky/YORP Catalog (thermal-radiation orbital + spin drift) — seventh and final ship in the v0.24.x backlog . Completes the per-body methodology arc: rigid-body action-angle (v0.24.0–v0.24.2) → stellar-oscillation continuum (v0.24.3) → shape-residual (v0.24.4) → bounded-local-Laplacian (v0.24.5) → small-body radiation-coupled drift (v0.24.6). Physics : anisotropic thermal re-emission of absorbed sunlight produces a small net force (Yarkovsky — drifts semi-major axis ~10⁻⁴ AU/Myr for typical NEAs; prograde rotators drift outward / retrograde inward) and net torque (YORP — changes spin rate + obliquity); both effects scale 1/D² so small bodies dominate. 10-asteroid roster : (101955) Bennu (OSIRIS-REx; first directly-imaged Yarkovsky drift, -19×10⁻⁴ AU/Myr inward; Chesley 2014 / Farnocchia 2013), (54509) 2000 PH5 / "YORP" (THE first YORP detection, Lowry 2007; 12-minute rotation period — past the rotational-fission limit; the asteroid that lent its name to the effect), (99942) Apophis (Yarkovsky uncertainty matters for the famous 2068 close approach; Vokrouhlický 2015), (162173) Ryugu (Hayabusa2; top-shaped rubble pile from prior YORP spin-up), (25143) Itokawa (Hayabusa; YORP spin-DOWN — Lowry 2014), (1862) Apollo, (1620) Geographos, (29075) 1950 DA (rotation 2.121 h — AT the fission limit; cohesive forces required), (6489) Golevka (the first-ever Yarkovsky detection; Chesley 2003), (3103) Eger. Threshold constants : rotational-fission limit ~2.2 h (rubble-pile spin-up cap), observability diameter ~30 km (1/D² scaling cuts off larger bodies), YORP obliquity attractors ~55° / ~125° (Vokrouhlický-Čapek 2002 long-term spin-axis end-states). Direction-sign invariant : every retrograde rotator in the catalog drifts inward (negative da/dt) — pinned by test_retrograde_drift_inward . Cross-channel observation : where v0.23.0 catalogs spin-orbit LOCKED bodies (Mercury 3:2; Luna 1:1; Galileans), v0.24.6 catalogs spin-FREE bodies driven by sunlight — the radiation-coupled analogue of v0.24.2 Mars's gravitation-coupled obliquity chaos. Different physics class, similar phase-space attractor structure. Three new bridge surfaces: bridge.get_yarkovsky_yorp(body=None) / bridge.get_yorp_attractor_thresholds() / bridge.list_yarkovsky_yorp() . Three new CLI subcommands: yarkovsky-yorp , yorp-attractor-thresholds , yarkovsky-yorps . 12-entry SOURCES citation dict (Farnocchia 2013, Lowry 2007, Vokrouhlický 2015 Apophis, Watanabe 2019 Ryugu, Lowry 2014 Itokawa, Kaasalainen 2007 Apollo, Durech 2008 Geographos, Farnocchia 2014 1950 DA, Chesley 2003 Golevka, Durech 2012 Eger + framework references Vokrouhlický-Čapek 2002 + Rubincam 2000); ratchet tests pin the per-row source resolution. Pure-Python additive; no ABI bump (twenty-ninth consecutive ship since v0.13.x; ES_ABI_VERSION = 8 unchanged). New tests/test_yarkovsky_yorp.py (34 tests).
— — seventh and . Completes the per-body methodology arc: rigid-body action-angle (v0.24.0–v0.24.2) → stellar-oscillation continuum (v0.24.3) → shape-residual (v0.24.4) → bounded-local-Laplacian (v0.24.5) → small-body radiation-coupled drift (v0.24.6). : anisotropic thermal re-emission of absorbed sunlight produces a small (Yarkovsky — drifts semi-major axis ~10⁻⁴ AU/Myr for typical NEAs; prograde rotators drift outward / retrograde inward) and (YORP — changes spin rate + obliquity); both effects scale 1/D² so small bodies dominate. : (OSIRIS-REx; first directly-imaged Yarkovsky drift, -19×10⁻⁴ AU/Myr inward; Chesley 2014 / Farnocchia 2013), (THE first YORP detection, Lowry 2007; 12-minute rotation period — past the rotational-fission limit; the asteroid that lent its name to the effect), (Yarkovsky uncertainty matters for the famous 2068 close approach; Vokrouhlický 2015), (Hayabusa2; top-shaped rubble pile from prior YORP spin-up), (Hayabusa; YORP spin-DOWN — Lowry 2014), (1862) Apollo, (1620) Geographos, (29075) 1950 DA (rotation 2.121 h — AT the fission limit; cohesive forces required), (6489) Golevka (the first-ever Yarkovsky detection; Chesley 2003), (3103) Eger. : rotational-fission limit ~2.2 h (rubble-pile spin-up cap), observability diameter ~30 km (1/D² scaling cuts off larger bodies), YORP obliquity attractors ~55° / ~125° (Vokrouhlický-Čapek 2002 long-term spin-axis end-states). : every retrograde rotator in the catalog drifts inward (negative da/dt) — pinned by . : where v0.23.0 catalogs bodies (Mercury 3:2; Luna 1:1; Galileans), v0.24.6 catalogs bodies driven by sunlight — the radiation-coupled analogue of v0.24.2 Mars's gravitation-coupled obliquity chaos. Different physics class, similar phase-space attractor structure. Three new bridge surfaces: / / . Three new CLI subcommands: , , . 12-entry citation dict (Farnocchia 2013, Lowry 2007, Vokrouhlický 2015 Apophis, Watanabe 2019 Ryugu, Lowry 2014 Itokawa, Kaasalainen 2007 Apollo, Durech 2008 Geographos, Farnocchia 2014 1950 DA, Chesley 2003 Golevka, Durech 2012 Eger + framework references Vokrouhlický-Čapek 2002 + Rubincam 2000); ratchet tests pin the per-row source resolution. (twenty-ninth consecutive ship since v0.13.x; unchanged). New (34 tests). v0.24.5 — Hawaiian-Emperor Chain Spectral Catalog (bounded-local graph Laplacian) — sixth ship in v0.24.x; the first time the project's graph-Laplacian eigenbasis is applied to physical features on a single body's surface rather than to orbital relationships between bodies. Demonstrates the bounded-local-Laplacian / chess-board insight as an explicit ship: when the phenomenon is bounded and local (a single hotspot track on Earth's Pacific Plate), use a finite local graph instead of the full-sphere harmonic basis. 18-seamount roster spanning ~85 Myr (Meiji oldest → Big Island Kilauea youngest), with K-Ar/Ar-Ar absolute ages from Sharp & Clague 2006 / O'Connor 2013 / Garcia 2010 / Clague 2010 + Tarduno 2003 paleomagnetic context. Two complementary spectral observations : (1) bounded-local Fiedler partition — the graph Laplacian over Gaussian-spatial-proximity edges (σ=500 km) bisects the chain into two clusters with exactly one Fiedler-vector sign change along the age-ordered chain, between Midway (27.7 Myr) and Pearl-and-Hermes Atoll (20 Myr) — the largest spatial gap. The eigenvalue gap λ₃ − λ₂ is ≈3× λ₂, confirming a structurally crisp partition. Same algebraic machinery as v0.18.0 body_architecture's resonance-graph Fiedler partition — applied to a finite physical-feature graph. (2) age-vs-arc-length residuals — linear fit through the post-bend Hawaiian arc gives Pacific Plate velocity 8.5 cm/yr (matches Sharp 2006 published 8-10 cm/yr); the bend at ~47.5 Myr surfaces in the slope residuals , with the largest residual at Meiji (oldest seamount, ~85 Myr; ~1265 km offset from the linear extrapolation back across the bend). The two-step decomposition matters because the bend is directional (a ~60° kink in chain orientation) rather than proximal (no spatial gap there) — the proximity Laplacian doesn't see direction changes, so to recover the bend you use slope-residuals against the post-bend linear regime. Together: spatial-proximity (1) + slope-direction (2) decompose the chain into spatial structure + directional discontinuity. Cross-strand observation : the bend at ~47.5 Myr is observable in both the Hawaiian-Emperor data + independent paleomagnetic records (Tarduno 2003 high-paleolatitude Emperor seamounts) — making this a v0.21.x-style cross-channel coupling event. Bounded-local-Laplacian methodology demonstrated: same Fiedler partition mechanism v0.18.0 uses for inner/outer Solar-System Fiedler partition; same two-eigenvector embedding as v0.18.2 predict_itn_accessibility; here applied to Earth-surface seamount nodes instead of orbital-body nodes. Three new bridge surfaces: bridge.get_hawaii_chain() / bridge.get_hawaii_emperor_bend_signature() / bridge.list_hawaii_chain() . Three new CLI subcommands: hawaii-chain , hawaii-emperor-bend , hawaii-chain-full . 10-entry SOURCES citation dict (Sharp & Clague 2006, Duncan & Keller 2004, Duncan & Clague 1985, Keller 1995 Meiji, O'Connor 2013, Clague & Dalrymple 1989, Garcia 2010, Clague 2010, Morgan 1971, Tarduno 2003); ratchet tests pin both directions. Pure-Python additive; no ABI bump (twenty-eighth consecutive ship since v0.13.x; ES_ABI_VERSION = 8 unchanged). New tests/test_hawaii_chain.py (28 tests).
— — sixth ship in v0.24.x; the the project's graph-Laplacian eigenbasis is applied to rather than to orbital relationships between bodies. Demonstrates the insight as an explicit ship: when the phenomenon is bounded and local (a single hotspot track on Earth's Pacific Plate), use a finite local graph instead of the full-sphere harmonic basis. spanning ~85 Myr (Meiji oldest → Big Island Kilauea youngest), with K-Ar/Ar-Ar absolute ages from Sharp & Clague 2006 / O'Connor 2013 / Garcia 2010 / Clague 2010 + Tarduno 2003 paleomagnetic context. : — the graph Laplacian over Gaussian-spatial-proximity edges (σ=500 km) bisects the chain into two clusters with along the age-ordered chain, between Midway (27.7 Myr) and Pearl-and-Hermes Atoll (20 Myr) — the largest spatial gap. The eigenvalue gap λ₃ − λ₂ is ≈3× λ₂, confirming a structurally crisp partition. Same algebraic machinery as v0.18.0 body_architecture's resonance-graph Fiedler partition — applied to a finite physical-feature graph. — linear fit through the post-bend Hawaiian arc gives Pacific Plate velocity (matches Sharp 2006 published 8-10 cm/yr); the bend at ~47.5 Myr surfaces in the , with the largest residual at Meiji (oldest seamount, ~85 Myr; ~1265 km offset from the linear extrapolation back across the bend). The two-step decomposition matters because the bend is (a ~60° kink in chain orientation) rather than (no spatial gap there) — the proximity Laplacian doesn't see direction changes, so to recover the bend you use slope-residuals against the post-bend linear regime. Together: spatial-proximity (1) + slope-direction (2) decompose the chain into spatial structure + directional discontinuity. : the bend at ~47.5 Myr is observable in both the Hawaiian-Emperor data + independent paleomagnetic records (Tarduno 2003 high-paleolatitude Emperor seamounts) — making this a v0.21.x-style cross-channel coupling event. demonstrated: same Fiedler partition mechanism v0.18.0 uses for inner/outer Solar-System Fiedler partition; same two-eigenvector embedding as v0.18.2 predict_itn_accessibility; here applied to Earth-surface seamount nodes instead of orbital-body nodes. Three new bridge surfaces: / / . Three new CLI subcommands: , , . 10-entry citation dict (Sharp & Clague 2006, Duncan & Keller 2004, Duncan & Clague 1985, Keller 1995 Meiji, O'Connor 2013, Clague & Dalrymple 1989, Garcia 2010, Clague 2010, Morgan 1971, Tarduno 2003); ratchet tests pin both directions. (twenty-eighth consecutive ship since v0.13.x; unchanged). New (28 tests). v0.24.4 — Per-body Toroidal-Residual J₂ Catalog (Maclaurin/Jacobi/bar-ring sequence) — fifth ship in v0.24.x; the shape-side counterpart to v0.24.0–v0.24.3 dynamical-spectrum surfaces. Codifies the user-named insight: rotation makes the body toroidal, self-gravity rounds it back toward spherical — and J₂ (gravitational quadrupole; from v0.20.0 geodetic catalog) is the quantitative measure of where in the Chandrasekhar 1969 ellipsoidal-equilibrium sequence ( Sphere → Maclaurin → Jacobi → bar → ring/torus ) the body sits. Each body's position parameterised by the dimensionless rotation parameter q = ω²R³/(GM) (centrifugal acceleration / gravity at equator). Bifurcation thresholds: q ≈ 0.187 (Maclaurin → Jacobi sequence bifurcation), q ≈ 0.27 (Jacobi → bar instability), q ≈ 0.36 (Roche fission → ring/torus). 14-body roster with measured J₂ from the v0.20.0 geodetic catalog: terrestrial (terra/mars/venus/mercury), Luna, gas + ice giants (jupiter/saturn/uranus/neptune), Galileans (io/europa/ganymede/callisto), titan. Headlines : Saturn closest to the Maclaurin-Jacobi bifurcation (q ≈ 0.158 vs threshold 0.187 — most oblate Solar-System body, 1/10 flattening; cross-references v0.21.4 Mankovich-Fuller 2021 ring-seismology rotation-period revision). Jupiter second (q ≈ 0.089). Earth canonical Maclaurin (q ≈ 0.0035, J₂ ≈ q/3 — matches Darwin-Radau prediction for I_M = 0.33). Luna fossil figure — observed J₂ ≈ 25× current-rotation prediction; Luna's shape was frozen when it rotated faster (closer to Earth before v0.21.6 +3.83 cm/yr tidal recession). Mercury fossil figure — observed J₂ ≈ 50× current 3:2-locked rotation prediction; shape from earlier faster-rotation epoch + solar tidal forcing. Venus essentially spherical — q ~ 6×10⁻⁸ (slowest rotator + retrograde; Anderson 2002 Magellan J₂ ≈ 4.5×10⁻⁶). Three new bridge surfaces: bridge.get_toroidal_residual(body=None) / bridge.get_chandrasekhar_sequence_thresholds() / bridge.list_toroidal_residuals() . Three new CLI subcommands: toroidal-residual , chandrasekhar-sequence , toroidal-residuals . 14-entry SOURCES citation dict (EGM2008, Genova 2016, Anderson 2002, Smith 2012 MESSENGER, Konopliv 2013 GRAIL, Iess 2018 Juno, Iess 2019 Cassini, Jacobson 2014 Uranus, Jacobson 2009 Neptune, Anderson 2001 Galilean, Iess 2010 Titan, Chandrasekhar 1969, Lai 1994, Helled 2011); ratchet tests pin both directions. Cross-references v0.20.0 (J₂ values), v0.21.4 (Saturn rotation), v0.21.6 (Luna tidal recession driving fossil-figure context). Pure-Python additive; no ABI bump (twenty-seventh consecutive ship since v0.13.x; ES_ABI_VERSION = 8 unchanged). New tests/test_toroidal_residual.py (34 tests).
— — fifth ship in v0.24.x; the to v0.24.0–v0.24.3 dynamical-spectrum surfaces. Codifies the user-named insight: — and J₂ (gravitational quadrupole; from v0.20.0 geodetic catalog) is the quantitative measure of where in the Chandrasekhar 1969 ellipsoidal-equilibrium sequence ( ) the body sits. Each body's position parameterised by the dimensionless rotation parameter (centrifugal acceleration / gravity at equator). Bifurcation thresholds: (Maclaurin → Jacobi sequence bifurcation), (Jacobi → bar instability), (Roche fission → ring/torus). with measured J₂ from the v0.20.0 geodetic catalog: terrestrial (terra/mars/venus/mercury), Luna, gas + ice giants (jupiter/saturn/uranus/neptune), Galileans (io/europa/ganymede/callisto), titan. : (q ≈ 0.158 vs threshold 0.187 — most oblate Solar-System body, 1/10 flattening; cross-references v0.21.4 Mankovich-Fuller 2021 ring-seismology rotation-period revision). (q ≈ 0.089). (q ≈ 0.0035, J₂ ≈ q/3 — matches Darwin-Radau prediction for I_M = 0.33). — observed J₂ ≈ 25× current-rotation prediction; Luna's shape was frozen when it rotated faster (closer to Earth before v0.21.6 +3.83 cm/yr tidal recession). — observed J₂ ≈ 50× current 3:2-locked rotation prediction; shape from earlier faster-rotation epoch + solar tidal forcing. — q ~ 6×10⁻⁸ (slowest rotator + retrograde; Anderson 2002 Magellan J₂ ≈ 4.5×10⁻⁶). Three new bridge surfaces: / / . Three new CLI subcommands: , , . 14-entry citation dict (EGM2008, Genova 2016, Anderson 2002, Smith 2012 MESSENGER, Konopliv 2013 GRAIL, Iess 2018 Juno, Iess 2019 Cassini, Jacobson 2014 Uranus, Jacobson 2009 Neptune, Anderson 2001 Galilean, Iess 2010 Titan, Chandrasekhar 1969, Lai 1994, Helled 2011); ratchet tests pin both directions. Cross-references v0.20.0 (J₂ values), v0.21.4 (Saturn rotation), v0.21.6 (Luna tidal recession driving fossil-figure context). (twenty-seventh consecutive ship since v0.13.x; unchanged). New (34 tests). v0.24.3 — Sun Dynamical Spectrum (helioseismology) — fourth per-body dynamical-spectrum surface in v0.24.x; first stellar entry + methodology extension from rigid-body action-angle (Mercury / Luna / Mars) to stellar-oscillation continuum normal-mode spectrum . Where v0.24.0–v0.24.2 decomposed each body's dynamical state into ~10 angle/action modes, v0.24.3 ships the helioseismic asymptotic relation as a closure invariant analogous to Luna's Saros commensurability. Headlines : Δν = 135.1 μHz (large frequency separation between consecutive radial orders n at fixed l; sound-travel-time inverse; ∝ √(M/R³); the asteroseismic-anchor pair with ν_max), δν = 9.0 μHz (small separation between l=0 and l=2 modes; sensitive to the deep-interior sound-speed gradient + helium-core composition), ν_max = 3090 ± 30 μHz (peak amplitude frequency; predicted by Brown 1991 to scale as g/√T_eff and validated extensively across asteroseismic targets). 20-mode sample p-mode catalog (n=18-25 at l=0-2; the high-SNR comb near ν_max). THE HEADLINE PAYLOAD is the Tassoul 1980 asymptotic-relation closure invariant : the relation ν_{n,l} ≈ Δν · (n + l/2 + ε) - δν · l(l+1) / (n + l/2 + ε) predicts the entire continuum mode spectrum from just three constants (Δν, δν, ε ≈ 1.46). Catalog ships asymptotic-consistent reference values (residuals < 0.5 μHz from float roundoff); real BiSON / SOI-MDI / SDO-HMI data has ~0.1-1 μHz residuals from interior-structure "glitches" (helium-ionization zone + base of convection zone — Vorontsov 2002), which are themselves diagnostic of internal structure via the Christensen-Dalsgaard 2002 inversion methodology. The closure invariant is pinned by test_asymptotic_relation_closure_invariant . Cross-channel parallel : this is the stellar-oscillation analogue of v0.24.1's Saros integer-commensurability — three constants → entire mode spectrum, just like 223:239:242 integer triple → entire eclipse-recurrence cycle. The Sun is the only star where individual modes are resolvable to high SNR via spatially-resolved Doppler imaging (BiSON sub-mHz; GOLF/SoHO global modes; SDO-HMI mid-degree). Three new bridge surfaces: bridge.get_sun_dynamical_spectrum() / bridge.get_helioseismic_asymptotic_relation() / bridge.list_sun_dynamical_spectrum() . Three new CLI subcommands: sun-dynamical-spectrum , helioseismic-asymptotic-relation , sun-dynamical-spectrum-full . 8-entry SOURCES citation dict (Davies 2014 BiSON, Schou 1998 SOI/MDI, Christensen-Dalsgaard 2002 review, Tassoul 1980 asymptotic theory, Brown 1991 ν_max scaling, Aerts/Christensen-Dalsgaard/Kurtz 2010 textbook, IAU 2015 Resolution B3 nominal solar constants, Libbrecht-Woodard 1990 solar-cycle frequency modulation). Cross-references v0.20.1 (Sol synoptic magnetic field), v0.21.5 (Earth-Sun IMF coupling). Pure-Python additive; no ABI bump (twenty-sixth consecutive ship since v0.13.x; ES_ABI_VERSION = 8 unchanged). New tests/test_sun_dynamical_spectrum.p