## Moira Experimental Validation Version: 2.2 Date: 2026-07-25 Runtime target: Python 3.14 > Recent release evidence for the bounded Gauquelin, eclipse cartography, > house-boundary geometry, node-frame, asteroid-family, and small-body > readiness products is indexed in the > [5.1-5.2 release validation ledger](RELEASE_VALIDATION_5_1_TO_5_2.md). 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: - inherited astronomical validation from lower layers - doctrine and mathematical invariants - curated external references where a real oracle exists - explicit disclosure when a subsystem is still only partially validated The goal is truthfulness, not false symmetry with the core astronomy and astrology validation docs. ## 0.1 Current Rerun Receipt On 2026-05-21, the live experimental corpus named in this document was re-run from the project `.venv`. Current corpus result: - `717 collected` - `716 passed` - `1 failed` Current live failure: - `tests/unit/test_moira_synastry.py::test_davison_chart_matches_midpoint_time_and_location_chart_cast` - Davison chart longitude output does not currently match the midpoint-time chart cast assumed by that validation test This means most experimental surfaces remain healthy, but the paper cannot truthfully claim a clean all-green validation state for synastry composites at `main` until that failure is resolved or the test doctrine is corrected. --- ## 1. Status Table | 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 typed cosmic reference points | invariant tests in `tests/unit/test_experimental_validation.py` and `tests/unit/test_cosmic_references.py` plus Astropy/ERFA oracle audit in `tests/integration/test_galactic_oracle_reference.py` | Validated | | Uranian bodies / Transpluto | source-family and Kepler invariants in `tests/unit/test_uranian.py`; five-epoch, all-nine-body Astrodienst cross-engine matrix in `tests/oracle/test_uranian_oracle.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`, `tests/unit/test_timelords.py`, and `tests/unit/test_timelords_public_api.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` | Validated | | Synastry composites | midpoint, overlay, composite, Davison, and public-surface coverage in `tests/unit/test_moira_synastry.py` and `tests/unit/test_synastry_public_api.py` | Partial (live Davison failure) | | Sothic cycle | doctrine, policy, profile structure, and public-surface checks in `tests/unit/test_sothic.py` and `tests/unit/test_sothic_public_api.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 | --- ## 2. Validation Philosophy Experimental subsystems do not all admit the same kind of truth claim. - Some are physically anchored and can inherit real astronomy validation. - Some are computationally novel and are best validated by doctrine, invariants, and explicit policy surfaces. - Some are modern interpretive layers with no meaningful external oracle. - A few are still under-validated and are marked that way directly. Moira should not claim stronger validation than the subsystem actually has. --- ## 3. Sovereign Star and Stellar Extensions ### 3.1 Sovereign fixed-star positions Current state: - the named-star engine is now fully sovereign and is sourced from `moira/data/star_registry.csv`, `moira/data/star_lore.json`, and `moira/data/star_provenance.json` - executable dependence on Gaia loaders and Swiss star files has been removed - catalog loading, name/nomenclature routing, search ordering, magnitude filtering, and exact-case Bayer collision handling are explicitly covered in `tests/unit/test_stars_sovereign_catalog.py` and `tests/integration/test_stars_sovereign_identity.py` - the full catalog now validates cleanly after resolving the 19 Bayer case-collision rows that had previously poisoned the stored J2000 ecliptic reference columns External 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 rotation - `tests/integration/test_stars_external_reference.py` audits the same anchor stars against an offline Swiss `swetest` fixture generated by `scripts/build_stars_swetest_fixture.py` - the internal sovereign catalog sweep checks all 1809 stars at J2000 against the stored registry reference columns Status: Validated Measured residuals: - internal sovereign J2000 sweep against registry reference columns: worst residual `0.003971602 deg` (`14.30"`) in longitude for `ome Dra`; latitude residuals are materially smaller - ERFA anchor oracle across `Sirius`, `Algol`, `Spica`, and `Aldebaran` from `J1000` to `J3000`: worst residual `0.000000133772 deg` (`0.00048"`) in longitude for `Sirius`; worst latitude residual `0.000000006849 deg` (`0.000025"`) - ERFA full-catalog J2000 sweep: no large outliers remain after the case-routing repair; the remaining differences are at numerical-noise scale - Swiss audit across the same anchor matrix: worst residual `0.007512431 deg` (`27.04"`) in longitude for `Sirius` at `J1900`; this residual is not materially driven by TT-vs-UT alignment What this means: - against ERFA, the sovereign star engine is now effectively at numerical-noise scale on the audited anchor set - against Swiss, the remaining difference is on the order of a few hundredths of a degree at worst and reflects model/convention differences rather than a Delta T defect - the catalog is now internally coherent end to end under both sovereign and ERFA sweeps ### 3.2 Stellar quality mapping This layer is interpretive rather than astronomical, but it remains explicitly bounded by unit coverage in the sovereign star suite. Covered: - NaN handling - boundary transitions between declared BP-RP ranges - resulting `StellarQuality` vessel semantics on sovereign `FixedStar` results Status: Validated What this does not mean: - there is still no external oracle for the interpretive mapping itself - the validation claim is that Moira's declared mapping is implemented correctly and consistently ### 3.3 Variable stars Validated in `tests/unit/test_variable_stars.py` and `tests/integration/test_variable_stars_external_reference.py`. What is covered: - catalog integrity - phase arithmetic - light-curve shape expectations by variable-star type - next-minimum / next-maximum helpers - type filters and convenience APIs - external ephemeris spot checks for: - Algol against AAVSO VSX epoch-of-minimum and period - Delta Cephei against published GCVS epoch-of-maximum and period - Eta Aquilae against published GCVS epoch-of-maximum and period - forward minima prediction against the external linear ephemeris for Algol Status: Validated External comparison numbers: - Algol (`bet Per`, AAVSO VSX): - external epoch of minimum: `HJD 2455565.33243` - Moira epoch of minimum: `2455565.33243` - epoch delta: `0.0 d` - external period: `2.867323862 d` - Moira period: `2.867323862 d` - period delta: `0.0 d` - Delta Cephei (`del Cep`, GCVS): - external epoch of maximum: `JD 2436075.445` - Moira epoch of maximum: `2436075.445` - epoch delta: `0.0 d` - external period: `5.366341 d` - Moira period: `5.366341 d` - period delta: `0.0 d` - Eta Aquilae (`eta Aql`, GCVS): - external epoch of maximum: `JD 2436084.656` - Moira epoch of maximum: `2436084.656` - epoch delta: `0.0 d` - external period: `7.176641 d` - Moira period: `7.176641 d` - period delta: `0.0 d` Observed agreement in the external suite: - catalog ephemeris agreement for all three spot-check stars: exact match to the cited published values - Algol forward linear-minimum prediction: exact to floating-point precision in the offline test corpus ### 3.4 Multiple star systems Validated in `tests/unit/test_multiple_stars.py` and `tests/integration/test_multiple_stars_external_reference.py`. Covered: - catalog lookup by name, designation, and alias - type-specific behavior for visual, wide, spectroscopic, and optical systems - time-varying visual-binary separation for Sirius and Alpha Centauri - fixed reference behavior for wide and optical systems - Dawes-limit resolvability logic, including the inclusive boundary - dominant-component selection - combined-magnitude flux-sum doctrine - full snapshot structure from `components_at()` - named convenience functions and `Moira` wrapper methods - public surface exposure from both `moira.multiple_stars` and top-level `moira` Status: Validated Truth basis: - this subsystem is currently validated by published catalog/orbital doctrine plus explicit invariant tests - Sirius AB now also has a dedicated external spot check against a published yearly orbit ephemeris Representative computed values from the current validated corpus: - Sirius (`visual`): - `JD 2451545.0`: separation `4.6236436381"`; position angle `149.7428251338 deg` - `JD 2458849.5`: separation `11.2280299559"`; position angle `68.2561769339 deg` - combined magnitude: `-1.4601190421` - Alpha Centauri (`visual`): - `JD 2451545.0`: separation `14.2571111404"`; position angle `222.1788135176 deg` - `JD 2464328.5`: separation `6.4073379950"`; position angle `34.4508871197 deg` - combined magnitude: `-0.2719470331` - Castor (`wide`): - reference separation `3.9"`; reference position angle `52.0 deg` - combined magnitude: `1.5759885857` - Albireo (`optical`): - reference separation `34.4"`; reference position angle `54.0 deg` - combined magnitude: `2.9329843961` - Capella (`spectroscopic`): - separation `0.0"`; position angle `0.0 deg` - combined magnitude: `0.0798366601` - Spica (`spectroscopic`): - separation `0.0"`; position angle `0.0 deg` - combined magnitude: `0.8868955636` Observed agreement in the validation suite: - Sirius AB published orbit ephemeris comparison: - `2000-01-01` (`JD 2451544.5`): published `rho=4.460"`, `theta=151.2 deg`; Moira `rho=4.6231468665"`, `theta=149.7581702725 deg`; residuals `+0.1631468665"`, `-1.4418297275 deg` - `2020-01-01` (`JD 2458849.5`): published `rho=11.193"`, `theta=68.1 deg`; Moira `rho=11.2280299559"`, `theta=68.2561769339 deg`; residuals `+0.0350299559"`, `+0.1561769339 deg` - `2030-01-01` (`JD 2462502.5`): published `rho=10.392"`, `theta=48.9 deg`; Moira `rho=10.3807681631"`, `theta=48.8288701968 deg`; residuals `-0.0112318369"`, `-0.0711298032 deg` - Sirius and Alpha Centauri separations are strictly positive and vary across multi-decade epochs, confirming live Kepler/Thiele-Innes behavior - Castor and Albireo separation / position-angle outputs are time-invariant at their declared reference values - Capella and Spica remain fixed at `0.0"` separation and are never resolvable - combined magnitudes match the declared flux-sum formula to within `1e-9` --- ## 4. Extended Physical Bodies This area is much stronger than the previous version of this document implied. Validated areas include curated fixture-based coverage for: - TNOs - centaurs - classical asteroids - broader main-belt bodies - selected small-body kernels such as Pandora, Amor, Apollo, Icarus, Karma, and Persephone These validations are grounded in the same Horizons / kernel-based astronomy work used elsewhere in the repo. Status: Validated --- ## 5. Galactic and Uranian Layers ### 5.1 Galactic transforms Validated in `tests/unit/test_experimental_validation.py` and `tests/integration/test_galactic_oracle_reference.py`. Covered: - rotation behavior - round-trip consistency - canonical galactic center and north galactic pole reference behavior - direct ICRS <-> Galactic comparison against Astropy's external frame transform - true-of-date ecliptic bridge audit using explicit ecliptic geometry, ERFA `pnm06a`, and Astropy's Galactic frame as the final oracle - exact typed-registry class counts and non-null semantic/source receipts - separation of the galactic frame origin from Sagittarius A*, and of the formal supergalactic origin from M87 and the astrological M87 proxy - formal supergalactic longitude origin and north/south pole directions checked against Astropy's `Supergalactic` frame - coordinate-landmark antipodes, proxy anchor declarations, deterministic ordering, and invalid-input rejection Status: Validated Measured residuals: - direct `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 check - `ecliptic_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 -> ecliptic - the three formal supergalactic coordinate landmarks remain below `0.1"` against Astropy, with worst measured residual `0.0305"` at the longitude origin Important scope note: - this galactic audit is indexed by `jd_tt` directly, so the residual envelope does not presently indicate a Delta-T-model limitation - the time-dependent term here is the of-date/J2000 frame bridge - Great Attractor, Shapley, and Virgo/M87 entries are source-declared proxies; this validation verifies their catalog anchors and semantics, not a unique dynamical center for any extended structure ### 5.2 Uranian bodies and Transpluto Validated in `tests/unit/test_uranian.py` and `tests/oracle/test_uranian_oracle.py`. Covered: - separate Neely Hamburg and Sevin/Strubell Transpluto source families - century-scale Keplerian orbit periods and Kepler-equation residuals - apparent geocentric longitude, latitude, distance, and signed speed - direct and retrograde states - all nine bodies at five frozen dates from 1900 through 2026 Status: Validated The frozen Astrodienst `swetest` matrix is secondary cross-engine corroboration, not a runtime dependency or physical-body authority. The hypothetical orbits remain model-defined; DE441 supplies only Earth/Sun observer geometry. --- ## 6. Derived Geometric Techniques ### 6.1 Astrocartography `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: - MC / IC antipodal meridian logic - ASC / DSC symmetry about the MC meridian - zero-declination special case, where rising and setting reduce to fixed meridians - high-declination circumpolar omission behavior - line-vessel structure and repr shape - `acg_from_chart()` wrapper plumbing for apparent sidereal time and RA/Dec collection Status: Validated Important scope note: - this validates the geographic line engine - Moira does not implement a separate rendered world-map projection layer here, so a map-image oracle is not the relevant validation target for this module ### 6.2 Local space `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: - equatorial cardinal cases for zenith, nadir, east, and west horizon points - north/south meridian cases at nonzero latitude - azimuth sorting - 8-point compass labeling - `LocalSpacePosition` repr and above/below-horizon semantics - `local_space_from_chart()` wrapper plumbing for sidereal time and RA/Dec collection Status: Validated --- ## 7. Traditional-Experimental Boundary Techniques ### 7.1 Longevity Validated in `tests/unit/test_experimental_validation.py`. Covered: - Ptolemaic years - face rulers - Egyptian bounds - triplicity support - dignity scoring - hyleg selection priority - longevity band selection Status: Validated ### 7.2 Timelords Validated across `tests/unit/test_experimental_validation.py` and `tests/unit/test_timelords.py`. Covered: - Firdaria sequence structure - sub-period grouping - Zodiacal Releasing minor-year table behavior - active-period and profile helpers Status: Validated ### 7.3 Gauquelin sectors Validated in `tests/unit/test_experimental_validation.py`. Covered: - normal-geometry sector range and half-open boundaries - primary plus-zone classification after rise and upper culmination - explicit undefined-sector semantics for non-rising geometry - field integrity, polar singularities, and horizon-altitude bounds Status: Validated ### 7.4 Arabic lunar mansions Validated in `tests/unit/test_experimental_validation.py`. Covered: - mansion span arithmetic - boundary advancement - wraparound - all 28 mansions reachable Status: Validated ### 7.5 Varga divisions `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.py` Covered: - D1 identity behavior - segment-to-sign advancement at exact division boundaries - degree reset at segment boundaries - 360-degree periodicity - scaled remainder mapping for degree-within-varga-sign - convenience-function naming and divisor preservation - output range invariants across multiple divisors - declared geometric return-vessel behavior Status: Validated Important scope note: - this validates Moira's declared geometric varga engine - it does not claim full equivalence to sign-offset doctrines used by JHora or other specialized Jyotish software ### 7.6 Synastry composites The previous status here was too strong in one respect and too weak in another. Live validation surfaces now reside in: - `tests/unit/test_moira_synastry.py` - `tests/unit/test_synastry_public_api.py` Covered: - midpoint composite construction - shortest-arc midpoint behavior across seams - directional and mutual house overlays - synastry aspect/contact truth and condition-profile layers - Davison chart doctrine variants and public-surface exposure - policy handling and input guards Current rerun truth: - one live failure remains in `test_davison_chart_matches_midpoint_time_and_location_chart_cast` - therefore the subsystem cannot currently be described as cleanly validated at `main`, even though most of the synastry surface is covered Status: Partial --- ## 8. Sothic Cycle `tests/unit/test_sothic.py` provides a real validation surface for the Sothic subsystem. Covered: - Egyptian civil-date logic - annual Sothic rising result structure - epoch filtering behavior - drift-rate and prediction helpers - policy validation - condition-profile and network-profile structure Status: Validated This remains a doctrine/model subsystem rather than a mainstream external software-comparison subsystem. --- ## 9. Remaining Work The main experimental items that still need attention are: 1. Synastry composites The live rerun found one failing Davison test in `tests/unit/test_moira_synastry.py`. That must be resolved or doctrinally reclassified before the subsystem can be restored to a clean validated state. 2. Sovereign fixed-star breadth The core oracle path already 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. 3. Optional external spot checks Astrocartography and local space are 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. --- ## 10. Practical Reading 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.