Methods

Methods

Caelus is written from the published record, then checked against two independent references before any figure is quoted. The per-body numbers live on Validation; the source citations live on Provenance. This page covers how a model gets from a paper to a tested result.

Reference-first

Every model lands first in the Python reference. That reference emits golden fixtures: position and event values at fixed instants, written to JSON. The TypeScript engine is a port of the same math, and a conformance suite replays the fixtures against it on every commit. The port has to reproduce the reference to the last digit the fixture records. A red run blocks merge.

The core reads no files and makes no network calls. Coefficient tables are compiled in or loaded as plain data, so the same code path runs in the browser, on an edge runtime, and in Node. A model is not shipped until the reference, its fixtures, and the port all agree.

Two independent yardsticks

Swiss Ephemeris 2.10 is the calibration oracle. It shares the apparent-place definition used here, geocentric ecliptic longitude at the true equinox of date, so a comparison at random instants across 1900–2099 shows whether the model matches the field standard. No Swiss Ephemeris code or coefficient ships in Caelus. It is a test target only.

JPL Horizons is the independent reference. Its apparent geocentric right ascension and declination come from a different source and a different frame, sampled at a separate set of epochs. Agreement with Swiss alone could mean two implementations of the same textbook share a bias; agreement with Horizons as well shows the result tracks the underlying ephemeris. The Sun and inner planets sit near a tenth of an arcsecond against Horizons, the Moon near two tenths, and the giant planets within a few arcseconds.

Recovering effects by fitting

Some effects are not published as a formula you can apply directly. Where that happens, the coefficient or rule is recovered by fitting to a reference and then frozen as data, with the raw samples kept for reproducibility.

What gets reproduced, and how it is checked

LayerCheck
Planet and Moon longitudesSwiss across 1900–2099, plus JPL Horizons at independent epochs
House cusps, 8 added systemsexact against swe_houses_armc, polar cases included
Vertex and east pointexact against swe_houses_armc
Rise, set, meridian transitroot-finds against swe_rise_trans
Crossings and lunar phasesagainst swe_solcross and swe_mooncross
Eclipse typesexact over 1990–2030, zero mismatches

Full per-body bounds, including root-mean-square figures, are on Validation.

Where the method reaches its limit

A few quantities are ill-conditioned, and the accuracy table says so rather than smoothing it over. A planetary station is a speed-zero root with a slope near 0.01° per day squared, so a sub-arcsecond position difference turns into a timing difference of seconds to about a minute. The osculating lunar apogee, sold as "true Lilith", amplifies the lunar theory's own error by roughly a factor of 1/e, which is why its values disagree across every software package at that scale. Numbers like these are quoted with the reason they are large.

Validation tables → Sources → Build Notes →