moira

Moira Engine — Feature Roadmap & Mathematical Accuracy Register

Engine version: post-Phase α (sub-arcsecond accuracy certified) Last updated: 2026-04-04 (harmograms H1-H5 completed; bridge layer expanded; selective root exports added) Purpose: Canonical record of implementation status, missing features, and mathematical improvement opportunities.


Part 0 — Implementation Status

Features implemented since initial roadmap (2026-03-16)

The following items from the original roadmap have been fully implemented and are exposed in the moira package namespace:

# Feature Status Location
1 Vertex / Anti-Vertex Done houses.pycalculate_houses() now populates HouseCusps.vertex via _asc_from_armc(armc+90, obliquity, -lat)
2 Antiscia & Contra-Antiscia Done antiscia.pyantiscia(), find_antiscia(), AntisciaAspect
3 Parallel & Contra-Parallel aspects Done aspects.pyfind_declination_aspects(), DeclinationAspect
4 Parans Done parans.pyfind_parans(), natal_parans(), Paran, full paran-field analysis suite
5 Generic planet return Done transits.pyplanet_return()
7 Annual Profections Done profections.pyannual_profection(), monthly_profection(), profection_schedule(), ProfectionResult
8 Firdaria Done timelords.pyfirdaria(), current_firdaria(), FirdarPeriod
9 Vimshottari Dasha Done dasha.pyvimshottari(), current_dasha(), dasha_balance(), DashaPeriod
10 Nakshatra Positions Done sidereal.pynakshatra_of(), all_nakshatras_at(), NakshatraPosition
11 Zodiacal Releasing Done timelords.pyzodiacal_releasing(), current_releasing(), ReleasingPeriod
12 Hyleg / Alcocoden Done longevity.pyfind_hyleg(), calculate_longevity(), HylegResult
14 Astrocartography / ACG Done astrocartography.pyacg_lines(), acg_from_chart(), ACGLine
15 Local Space Chart Done local_space.pylocal_space_positions()
16 90° Dial / Midpoints Done midpoints.pycalculate_midpoints(), midpoints_to_point(), Midpoint

Additional capabilities present but not in original roadmap

Feature Location
Galactic coordinates galactic.pygalactic_position_of(), all_galactic_positions()
Uranian / TNP bodies uranian.pyUranianBody, uranian_at(), all_uranian_at()
Harmonic charts harmonics.pycalculate_harmonic(), aspect_harmonic_profile(), HARMONIC_PRESETS
Gauquelin sectors gauquelin.pygauquelin_sector(), all_gauquelin_sectors(), GauquelinPosition
Occultations occultations.pyclose_approaches(), lunar_occultation(), CloseApproach
Planetary hours planetary_hours.pyplanetary_hours(), PlanetaryHour, PlanetaryHoursDay
Primary directions primary_directions.pyfind_primary_arcs(), PrimaryArc
Planetary stations stations.pyfind_stations(), next_station(), StationEvent
Arabic lunar mansions manazil.pymansion_of(), all_mansions_at(), MansionInfo
Sothic cycle sothic.pysothic_rising(), sothic_epochs(), SothicEntry
Jones chart shapes chart_shape.pyclassify_chart_shape(), ChartShape, ChartShapeType
Varga / divisional charts varga.pynavamsa(), calculate_varga(), dashamansa(), etc. — wired (moira.__all__, 46 tests)
Heliacal rising / setting fixed_stars.pyheliacal_rising(), heliacal_setting()wired (moira.__all__, 46 tests)
Hayz / in sect dignities.pyis_in_hayz(), is_in_sect(), SectStateKind, SectTruth, SectClassificationwired (moira.__all__, 46 tests)
Harmograms research engine harmograms/ — spectral vectors, zero-Aries parts, intensity spectra, projections, traces, comparison helpers
Harmogram bridge layer bridges/harmograms.py — native chart/progression adapters, body filters, and datetime-range sample builders

Deferred doctrine candidate — Astrodynes / Cosmodynes

Status: primary-source unblocked; implementation still pending

Reason:

Constraint:

Unblocker:


Part I — Remaining Open Features

All three original public-surface wiring gaps are now closed. No open Part I items remain from the original roadmap.

6. Heliacal Rising & Setting — public surface gap Done

heliacal_rising() and heliacal_setting() are exported from moira.__all__ and tested in tests/unit/test_public_surface_gaps.py.


13. Hayz / In Sect — public surface gap Done

is_in_hayz(), is_in_sect(), SectStateKind, SectTruth, and SectClassification are exported from moira.__all__ and tested in tests/unit/test_public_surface_gaps.py.


Varga / divisional charts — public surface gap Done

varga.py (navamsa, calculate_varga, dashamansa, dwadashamsa, saptamsa, trimshamsa, VargaPoint) wired into moira.__init__ and moira.__all__; tested in tests/unit/test_public_surface_gaps.py.


Part II — Mathematical Accuracy Improvements

Status reflects work done since the original roadmap entry.

A. Ayanamsa: Star-anchored TRUE_* systems HIGH IMPACTDone

ayanamsa() now routes mode="true" calls for systems in _STAR_ANCHORED through _star_anchored_ayanamsa(), which calls fixed_star_at() for the anchor star at the requested JD and computes star_tropical_lon − target_sidereal.

Affected systems: TRUE_CHITRAPAKSHA (Spica = 180°), TRUE_REVATI (Revati = 0°), ALDEBARAN_15_TAU (Aldebaran = 45°), TRUE_PUSHYA (Asellus Australis = 106.667°).

Ayanamsa.LAHIRI remains epoch-anchored (23°15′00.658″ at 21 Mar 1956), matching SE_SIDM_LAHIRI in SwissEph — Lahiri is not star-anchored by doctrine.

Polynomial mode="mean" path unchanged for all systems (fallback and research).

Verified: Spica sidereal longitude = 180.000° ± 0.001° at J1956, J2000, J2020. Tests: tests/unit/test_sidereal.py (50 tests).


B. Vertex Calculation HIGH IMPACTDone

Vertex is now populated in calculate_houses():

vertex = _asc_from_armc((armc + 90.0) % 360.0, obliquity, -latitude)

C. Topocentric Correction: WGS-84 Elevation Term MEDIUM IMPACTDone

corrections.py::topocentric_correction() already uses the full WGS-84 geodetic model:

The roadmap entry was written before this work was completed.


D. Apparent Sidereal Time: IAU 2006 GAST MEDIUM IMPACTDone

Already fully implemented in julian.py:

The roadmap entry was written before this work was completed. Agreement with SOFA iauGmst06 is better than 0.0001″ for 1800–2200.


E. Delta-T: IERS Bulletin data MEDIUM IMPACTDone

_DELTA_T_ANNUAL in julian.py updated with 12-month arithmetic means from USNO deltat.data (source: maia.usno.navy.mil/ser7/deltat.data, fetched 2026-03-22). 2015–2025 are fully observed; 2026 uses the Jan 2026 IERS Bulletin A value (~69.1 s).

Key corrections vs. prior table (observed overestimates):

The 1955–2015 blend point was also fixed to reference _DELTA_T_ANNUAL[0] directly rather than a hardcoded literal, so future table updates auto-propagate.


F. Topocentric tag on Chart positions MEDIUM IMPACTDone

PlanetData (in planets.py) already carries is_topocentric: bool = False and planets.py::planet_at() populates it from the _topocentric local at line 589. FixedStar and GaiaStarPosition carry the same field. All three result vessels surface the geocentric/topocentric distinction explicitly.


G. Fixed Star Proper Motion: Epoch and Reference Frame LOW IMPACTDone

fixed_stars.py already handles per-entry epoch correctly:

The roadmap entry was written before this work was completed.


H. Obliquity: Unify P03 Throughout LOW IMPACTDone

obliquity.py::mean_obliquity() already delegates directly to precession.mean_obliquity_p03 (imported as _mean_obliquity_p03). There is no divergent polynomial — the module docstring explicitly states “IAU 2006 P03 / Capitaine, Wallace & Chapront 2003”. The roadmap entry was written before this unification was confirmed.


I. Equation of the Equinoxes: Full Periodic Terms LOW IMPACTDone

julian.py::_gast_complementary_terms() already implements all 9 periodic terms from IERS 2010 Conventions Table 5.2c (reference: SOFA iauEect00). The dominant term (Moon’s node Ω) reaches ±0.00264″; the full series sums to ≤0.04″. apparent_sidereal_time() adds these CT terms on top of Δψ·cos(ε). The roadmap entry predated this implementation.


J. Aspects: Stationary Planet State LOW IMPACTDone

aspects.py already defines MotionState with values APPLYING, SEPARATING, STATIONARY, INDETERMINATE, and NONE, plus the aspect_motion_state() function that derives the correct state from any aspect vessel. The bool | None ambiguity is fully resolved.


Part III — Summary Priority Table

Status — all original items closed

All Part I features and Part II math improvements are now done. The table below shows the full historical record; nothing is currently open.

# Feature / Improvement Type Priority Location
6 Heliacal rising/setting Feature Done fixed_stars.py
13 Hayz / in sect Feature Done dignities.py
Varga divisional charts Feature Done varga.py
A Ayanamsa: star-anchored TRUE_* systems Math Done sidereal.py
C Topocentric: WGS-84 elevation Math Done corrections.py
D Apparent sidereal time: IAU 2006 GAST Math Done julian.py
E Delta-T: IERS Bulletin data Math Done julian.py
F Topocentric tag on Chart positions Math Done planets.py
G Fixed star proper motion: epoch + parallax Math Done fixed_stars.py
H Obliquity: unify P03 throughout Math Done obliquity.py
I Equation of the equinoxes: full periodic Math Done julian.py
J Stationary aspect state Math Done aspects.py

Part III-B — New Capabilities Added Post-Audit

Feature Location Notes
Multiple star systems multiple_stars.py 8 systems; Kepler orbital mechanics for VISUAL binaries
Harmograms subsystem harmograms/ H1-H5 complete: spectral foundations, intensity doctrine, projection, trace layer, research tooling
Harmogram bridge layer bridges/harmograms.py Engine-facing adapters for chart/progression sources, body filtering, and range sampling
Harmograms root exports moira.__init__ Selected stable harmograms types and computation surfaces exported from package root

Multiple Star Systems — multiple_stars.py Done (2026-03-22)

Catalog of 8 astrologically significant multiple star systems with full orbital mechanics for visually resolvable pairs.

Types implemented:

Catalog: | System | Type | Highlight | |——–|——|———–| | Sirius | VISUAL | Sirius B (white dwarf) orbital mechanics; Dogon/esoteric significance | | Castor | WIDE | Sextuple system — three nested binaries; Gemini’s duality made literal | | Alpha Centauri | VISUAL | Solar twin + K-dwarf; nearest stars; approaching 2035 periastron | | Mizar | WIDE | First telescopic binary (1650); first spectroscopic binary (1889) | | Albireo | OPTICAL | Gold + sapphire colour contrast; confirmed optical by Gaia DR3 | | Capella | SPECTROSCOPIC | Two G-giant twins, invisible duality; 6th brightest star | | Acrux | WIDE | Southern Cross alpha; two blue B-type giants; navigational anchor | | Spica | SPECTROSCOPIC | Behenian star; tidally distorted ellipsoidal binary in 4-day orbit |

Public API: MultiType, StarComponent, OrbitalElements, MultipleStarSystem, angular_separation_at(), position_angle_at(), is_resolvable(), dominant_component(), combined_magnitude(), components_at(), multiple_star(), list_multiple_stars(), multiple_stars_by_type(), sirius_ab_separation_at(), sirius_b_resolvable(), castor_separation_at(), alpha_cen_separation_at()

Chart methods: Moira.multiple_star_separation(), Moira.multiple_star_components()

Future candidates: Antares B (occulted by Moon, Mars-companion hidden star), Theta Orionis (the Trapezium, heart of M42), Epsilon Aurigae (27-yr eclipse binary — already in variable_stars.py, worth cross-linking), Gamma Velorum (WC8+O Wolf-Rayet).


Harmograms Subsystem — harmograms/ Done (2026-04-04)

Mathematically explicit harmograms engine built in visible strata rather than as one opaque score.

Implemented strata:

Admitted intensity families:

Admitted trace families:

Public engine shape:

Bridge layer present:

This keeps the engine boundary clean:


Part IV — What Moira Already Has That Swiss Ephemeris Lacks

For reference, capabilities where Moira exceeds the standard Swiss Ephemeris distribution: