Version: 2.0 Date: 2026-03-23 Runtime target: Python 3.14
This document covers Moira subsystems that are experimental, modernized, or not normally validated against a single canonical astrology package. In this layer, the validation standard is a mix of:
The goal is truthfulness, not false symmetry with the core astronomy and astrology validation docs.
| Domain | Validation basis | Status |
|---|---|---|
| Sovereign fixed-star positions | sovereign catalog/schema/search tests in tests/unit/test_stars_sovereign_catalog.py, identity tests in tests/integration/test_stars_sovereign_identity.py, Swiss audit in tests/integration/test_stars_external_reference.py, and SOFA/ERFA audit in tests/integration/test_stars_erfa_reference.py |
Validated |
| Stellar quality mapping | boundary and vessel tests in the sovereign star suite; no external oracle exists for the interpretive mapping itself | Validated |
| Variable stars | catalog integrity, phase arithmetic, light-curve behavior, extremum helpers in tests/unit/test_variable_stars.py, plus external ephemeris spot checks for Algol (AAVSO VSX), Delta Cephei, and Eta Aquilae (GCVS) in tests/integration/test_variable_stars_external_reference.py |
Validated |
| Extended physical bodies | Horizons / kernel-backed fixture suites for TNOs, centaurs, asteroids, and selected minor bodies | Validated |
| Galactic transforms and reference points | invariant tests in tests/unit/test_experimental_validation.py plus Astropy/ERFA oracle audit in tests/integration/test_galactic_oracle_reference.py |
Validated |
| Uranian bodies / Transpluto | locked formulas and range checks in tests/unit/test_experimental_validation.py |
Validated |
| Astrocartography | dedicated geometry and wrapper suite in tests/unit/test_astrocartography.py plus validated planetary positions |
Validated |
| Local space | dedicated spherical-astronomy and wrapper suite in tests/unit/test_local_space.py plus validated topocentric positions |
Validated |
| Longevity | doctrine tables and scoring logic in tests/unit/test_experimental_validation.py |
Validated |
| Timelords | doctrine and structural invariants in tests/unit/test_experimental_validation.py and tests/unit/test_timelords.py |
Validated |
| Gauquelin sectors | canonical diurnal-arc logic in tests/unit/test_experimental_validation.py |
Validated |
| Arabic lunar mansions (Manazil) | equal-station arithmetic and boundary tests in tests/unit/test_experimental_validation.py |
Validated |
| Varga divisions | explicit geometric-division doctrine tests in tests/unit/test_varga.py plus public-surface coverage |
Validated |
| Synastry composites | midpoint and reference-place composite behavior in tests/unit/test_synastry.py |
Validated |
| Sothic cycle | doctrine, policy, and profile structure in tests/unit/test_sothic.py |
Validated |
| Multiple star systems | dedicated unit suite for catalog lookup, orbital behavior, resolvability, magnitudes, wrappers, and public surface, plus Sirius AB orbit spot checks against a published yearly ephemeris in tests/integration/test_multiple_stars_external_reference.py |
Validated |
Experimental subsystems do not all admit the same kind of truth claim.
Moira should not claim stronger validation than the subsystem actually has.
Current state:
moira/data/star_registry.csv, moira/data/star_lore.json, and
moira/data/star_provenance.jsontests/unit/test_stars_sovereign_catalog.py and
tests/integration/test_stars_sovereign_identity.pyExternal reference coverage:
tests/integration/test_stars_erfa_reference.py
uses an independent SOFA/ERFA path built from registry RA/Dec, proper motion,
and parallax via erfa.pmsafe, erfa.pnm06a, and true-obliquity rotationtests/integration/test_stars_external_reference.py
audits the same anchor stars against an offline Swiss swetest fixture
generated by scripts/build_stars_swetest_fixture.pyStatus: Validated
Measured residuals:
0.003971602° (14.30") in longitude for ome Dra; latitude
residuals are materially smallerSirius, Algol, Spica, and Aldebaran from
J1000 to J3000: worst residual 0.000000133772° (0.00048") in
longitude for Sirius; worst latitude residual 0.000000006849°
(0.000025")0.007512431°
(27.04") in longitude for Sirius at J1900; this residual is not
materially driven by TT-vs-UT alignmentWhat this means:
This layer is interpretive rather than astronomical, but it remains explicitly bounded by unit coverage in the sovereign star suite.
Covered:
StellarQuality vessel semantics on sovereign FixedStar resultsStatus: Validated
What this does not mean:
Validated in tests/unit/test_variable_stars.py and
tests/integration/test_variable_stars_external_reference.py.
What is covered:
Status: Validated
External comparison numbers:
bet Per, AAVSO VSX):
HJD 2455565.332432455565.332430.0 d2.867323862 d2.867323862 d0.0 ddel Cep, GCVS):
JD 2436075.4452436075.4450.0 d5.366341 d5.366341 d0.0 deta Aql, GCVS):
JD 2436084.6562436084.6560.0 d7.176641 d7.176641 d0.0 dObserved agreement in the external suite:
Validated in tests/unit/test_multiple_stars.py and
tests/integration/test_multiple_stars_external_reference.py.
Covered:
components_at()Moira wrapper methodsmoira.multiple_stars and top-level moiraStatus: Validated
Truth basis:
Representative computed values from the current validated corpus:
visual):
JD 2451545.0: separation 4.6236436381"; position angle 149.7428251338°JD 2458849.5: separation 11.2280299559"; position angle 68.2561769339°-1.4601190421visual):
JD 2451545.0: separation 14.2571111404"; position angle 222.1788135176°JD 2464328.5: separation 6.4073379950"; position angle 34.4508871197°-0.2719470331wide):
3.9"; reference position angle 52.0°1.5759885857optical):
34.4"; reference position angle 54.0°2.9329843961spectroscopic):
0.0"; position angle 0.0°0.0798366601spectroscopic):
0.0"; position angle 0.0°0.8868955636Observed agreement in the validation suite:
2000-01-01 (JD 2451544.5):
published rho=4.460", theta=151.2°;
Moira rho=4.6231468665", theta=149.7581702725°;
residuals +0.1631468665", -1.4418297275°2020-01-01 (JD 2458849.5):
published rho=11.193", theta=68.1°;
Moira rho=11.2280299559", theta=68.2561769339°;
residuals +0.0350299559", +0.1561769339°2030-01-01 (JD 2462502.5):
published rho=10.392", theta=48.9°;
Moira rho=10.3807681631", theta=48.8288701968°;
residuals -0.0112318369", -0.0711298032°0.0" separation and are never resolvable1e-9This area is much stronger than the previous version of this document implied.
Validated areas include curated fixture-based coverage for:
These validations are grounded in the same Horizons / kernel-based astronomy work used elsewhere in the repo.
Status: Validated
Validated in tests/unit/test_experimental_validation.py and
tests/integration/test_galactic_oracle_reference.py.
Covered:
pnm06a, and Astropy’s Galactic frame as the final oracleStatus: Validated
Measured residuals:
equatorial_to_galactic() / galactic_to_equatorial() oracle checks
stay below 0.1" on the audited cases, with worst measured residual
0.0658" at the North Galactic Pole oracle checkecliptic_to_galactic() / galactic_to_ecliptic() audited through the
ERFA/Astropy bridge stay below 0.1" across the audited span from
500 BCE to 2100 CE; the broader sweep produced worst measured residuals
of 0.0318" for ecliptic -> galactic and 0.0319" for galactic -> eclipticImportant scope note:
jd_tt directly, so the residual envelope
does not presently indicate a Delta-T-model limitationValidated in tests/unit/test_experimental_validation.py.
Covered:
Status: Validated
This is still a model-defined subsystem. Differences from other Uranian packages are treated as model differences unless Moira violates its own stated formula basis.
astrocartography.py derives line geometry from already validated planet
positions, and now has its own dedicated validation surface in
tests/unit/test_astrocartography.py.
Covered:
acg_from_chart() wrapper plumbing for apparent sidereal time and RA/Dec
collectionStatus: Validated
Important scope note:
local_space.py derives azimuth/altitude outputs from validated topocentric
positions and now has its own dedicated validation surface in
tests/unit/test_local_space.py.
Covered:
LocalSpacePosition repr and above/below-horizon semanticslocal_space_from_chart() wrapper plumbing for sidereal time and RA/Dec
collectionStatus: Validated
Validated in tests/unit/test_experimental_validation.py.
Covered:
Status: Validated
Validated across tests/unit/test_experimental_validation.py and
tests/unit/test_timelords.py.
Covered:
Status: Validated
Validated in tests/unit/test_experimental_validation.py.
Covered:
Status: Validated
Validated in tests/unit/test_experimental_validation.py.
Covered:
Status: Validated
varga.py explicitly implements the standard geometric-division model, not the
full set of sign-specific Parasari special rules used by some Jyotish
software. The correct validation target is therefore the geometric doctrine
the module actually declares.
Validated in:
tests/unit/test_varga.pytests/unit/test_public_surface_gaps.pyCovered:
Status: Validated
Important scope note:
The previous status here was too weak.
tests/unit/test_synastry.py already validates:
Status: Validated
tests/unit/test_sothic.py provides a real validation surface for the Sothic
subsystem.
Covered:
Status: Validated
This remains a doctrine/model subsystem rather than a mainstream external software-comparison subsystem.
The main experimental items that still need more validation are:
Sovereign fixed-star positions The core oracle path now exists via SOFA/ERFA and offline Swiss fixtures. Remaining work is narrower: broaden the published-anchor corpus beyond the current star set if a richer external published reference set is desired.
Optional external spot checks Astrocartography and local space are now geometry-validated internally, but software-to-software spot checks would still be useful as supplemental corroboration if a clean declared reference is available.
These are the real remaining gaps. Everything else listed as validated above already has a concrete test surface in the repo.
Interpret the status labels strictly:
Validated There is a real enforcement surface in the repo appropriate to the subsystem.
Partial There is meaningful coverage, but an important dedicated validation layer is still missing.
Documented The subsystem is intentionally model-defined and transparent, but not externally validated in the usual sense.
Needs validation The implementation exists, but the repo still lacks an adequate validation suite for it.