Build Notes
VSOP87 evaluation is a few hundred lines and matched professional ephemerides on the first pass. The bugs were in timescales, frames, and geometry: invisible in a spot check, obvious in the golden suite.
ΔT: Textbook Extrapolation vs Earth Since 2016
Ephemerides use TT; civil time follows Earth rotation. ΔT bridges the two. The Espenak–Meeus (2006) polynomials, copied into decades of software, assume Earth's spin keeps slowing: they predict ΔT ≈ 158 s for 2080. Earth's rotation began accelerating around 2016; observed ΔT has sat near 69 s since 2020 and is drifting down. The textbook curve is already ~6 s high today and runs ~90 s high by 2080. The Moon moves 0.55″ per second of ΔT error, so a faithful implementation of the old formula misses the Moon by tens of arcseconds within a lifetime. Caelus interpolates IERS observations through 2025, continues the observed near-flat trend, and rejoins the slow tidal rise decades out: an 80-year ΔT forecast carries roughly ±37 s of uncertainty (Huber 2006), so a steeper slope would be false precision.
Node Longitude: 11× Frame Sensitivity
Lunar nodes mark where the Moon's plane crosses the ecliptic. The ecliptic of date drifts ~47″/century. With the Moon inclined only 5.1°, a frame error in the reference plane scales by 1/sin(5.1°) ≈ 11× in node longitude. Using J2000 instead of ecliptic-of-date produced ~500″ node error while planetary longitudes barely moved.
Chiron Fit: Double Light-Time
The first Chebyshev fit sampled Horizons “heliocentric” positions that already included Sun→body light-time (~6,900 s of motion, ~55,000 km). The pipeline then applied Earth→body light-time again: ~9″ steady bias. Fix: fit geometric states; validate the fit, then the Earth vector, then assemble geocentric positions from the oracle's parts.
Aspect Dates: ±90° Geometry
Code review found find_aspect_dates root-finding only +90° separations, dropping half of sextile/square/trine hits. The engine was fine; the MCP search was wrong. Fixed with a seven-year Mars sextile oracle. Nine hits matched an independent scan to the minute, including a retrograde triple pass.
Golden Suite
Swiss Ephemeris checks the Python reference; 1,438 fixtures pin the TypeScript port (worst delta 0.82 nano-arcseconds). CI runs both on every commit. The TS port was mostly agent-written with one gate: keep the suite green.
Playground: / (~85 KB, ~2 ms/chart). Provenance · Validation · GitHub.