Engine baseline: 6.2.0
Last reviewed: 2026-08-13
Status: Living engineering roadmap. Individual validation claims are
controlled by wiki/03_validation/ and release notes, not by roadmap status.
Purpose: Record implemented areas, remaining gaps, and mathematical
improvement opportunities without treating planned or historical entries as
admitted public API.
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.py — calculate_houses() now populates HouseCusps.vertex via _asc_from_armc(armc+90, obliquity, -lat) |
| 2 | Antiscia & Contra-Antiscia | Done | antiscia.py — antiscia(), find_antiscia(), AntisciaAspect |
| 3 | Parallel & Contra-Parallel aspects | Done | declination_aspects.py — detection, first-class policy/vessels, and signed applying/separating motion witness; compatibility exports remain in aspects.py |
| 4 | Parans | Done | parans.py — find_parans(), natal_parans(), Paran, full paran-field analysis suite |
| 5 | Generic planet return | Done | transits.py — planet_return() |
| 7 | Annual Profections | Done | profections.py — annual_profection(), monthly_profection(), profection_schedule(), ProfectionResult |
| 8 | Firdaria | Done | timelords.py — firdaria(), current_firdaria(), FirdarPeriod |
| 9 | Vimshottari Dasha | Done | dasha.py — vimshottari(), current_dasha(), dasha_balance(), DashaPeriod |
| 10 | Nakshatra Positions | Done | sidereal.py — nakshatra_of(), all_nakshatras_at(), NakshatraPosition |
| 11 | Zodiacal Releasing | Done | timelords.py — zodiacal_releasing(), current_releasing(), ReleasingPeriod |
| 12 | Hyleg / Alcocoden | Done | longevity.py — find_hyleg(), calculate_longevity(), HylegResult |
| 14 | Astrocartography / ACG | Done | astrocartography.py — acg_lines(), acg_from_chart(), ACGLine |
| 15 | Local Space Chart | Done | local_space.py — local_space_positions() |
| 16 | 90° Dial / Midpoints | Done | midpoints.py — calculate_midpoints(), midpoints_to_point(), Midpoint |
| Feature | Location |
|---|---|
| Galactic coordinates | galactic.py — galactic_position_of(), all_galactic_positions() |
| Uranian / TNP bodies | uranian.py — UranianBody, uranian_at(), all_uranian_at() |
| Harmonic charts | harmonics.py — calculate_harmonic(), aspect_harmonic_profile(), HARMONIC_PRESETS |
| Gauquelin sectors | gauquelin.py — gauquelin_sector(), all_gauquelin_sectors(), GauquelinPosition |
| Occultations | occultations.py — close_approaches(), lunar_occultation(), CloseApproach |
| Planetary hours | planetary_hours.py — planetary_hours(), PlanetaryHour, PlanetaryHoursDay |
| Primary directions | primary_directions.py — find_primary_arcs(), PrimaryArc |
| Planetary stations | stations.py — find_stations(), next_station(), StationEvent |
| Arabic lunar mansions | manazil.py — mansion_of(), all_mansions_at(), MansionInfo |
| Sothic cycle | sothic.py — sothic_rising(), sothic_epochs(), SothicEntry |
| Jones chart shapes | chart_shape.py — classify_chart_shape(), ChartShape, ChartShapeType |
| Varga / divisional charts | varga.py — navamsa(), calculate_varga(), dashamansa(), etc. — wired (moira.__all__, 46 tests) |
| Heliacal rising / setting | fixed_stars.py — heliacal_rising(), heliacal_setting() — wired (moira.__all__, 46 tests) |
| Hayz / in sect | dignities.py — is_in_hayz(), is_in_sect(), SectStateKind, SectTruth, SectClassification — wired (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 |
Status: bounded natal subsystem and Church of Light progressed subsystem constitutional through their admitted public phases
Reason:
Astrodyne-Manual.pdf is now in hand and materially unblocks the doctrine.moira.astrodynes now preserves the raw source tables and derivation truth
for house-position power, zodiacal aspects, magnitude parallels, essential
dignity, and aspect harmony/discord.Constraint:
Completed constitutional surface:
/v1/astrodynes/doctrine, /geometry, and /chart REST routes with
explicit geometry/frame provenance and house-fallback truth/v1/astrodynes/progressed/* routesRemaining product work is outside the admitted natal and progressed constitutions: autonomous place/time reconstruction for incomplete or contradictory source labels, unbounded prediction/advice products, and any doctrine alternative not established by the sources.
wiki/02_standards/ASTRODYNES_BACKEND_STANDARD.md; the admitted parity claim
is recorded in
wiki/05_research/astrodynes/astrodynes_three_chart_parity_validation_2026-07-12.md.All three original public-surface wiring gaps are now closed. No open Part I items remain from the original roadmap.
Doneheliacal_rising() and heliacal_setting() are exported from moira.__all__
and tested in tests/unit/test_public_surface_gaps.py.
Doneis_in_hayz(), is_in_sect(), SectStateKind, SectTruth, and
SectClassification are exported from moira.__all__ and tested in
tests/unit/test_public_surface_gaps.py.
Donevarga.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.
PHASE 1 COMPLETEThe original heliacal public-surface gap above is closed. A separate additive project is introducing a versioned, opt-in clear-sky naked-eye point-source assessment and physical visibility-event model without changing existing defaults or legacy outputs.
The governing checklist, source boundaries, compatibility rules, phase gates, quarantines, and completion-receipt format are recorded in PHYSICAL_HELIACAL_VISIBILITY_IMPLEMENTATION_PLAN.md.
Phase 0 closed on 2026-07-29 with the four-phase event doctrine, physical validity and input boundaries, immutable external data-pack decision, exact source identities, licensing dispositions, additive contract sketch, and typed failure law.
Phase 1 checkpoints 1-6 provide the offline, checksum-bound libRadtran
laboratory, complete artifact validators, repeated MYSTIC convergence and
geometry evidence, deterministic pseudo-spherical direct-transmission
evidence, package-boundary audit, and a source-equivalent elevated-site
construction at 0-5,000 m with named-profile-derived pressure. The
elevated-site oracle closed an O4 interpolation/recomputation mismatch without
relaxing its tolerance. Checkpoint 3 source-traces the selected surface
midpoint-Chapman direct-beam law and independently bounds controlled geometry
from 0.25-45 degrees; the 290-level candidate reaches about 0.035% maximum
relative error versus about 10.14% on the coarse source-grid control.
Checkpoint 4 binds the official external REPTRAN module, validates all six
AFGL clear molecular profiles, bounds the 290-level candidate against 579-
and 1,157-level controls, and admits REPTRAN fine as the 380-780 nm research
reference. The exact 54-run artifact passes independent validation on WSL and
Windows. Checkpoint 5 adds a separately validated 73-run environmental
contract: all eight named Shettle haze/season profiles, AOD550 and Angstrom
binding, ozone and gray-albedo roles, profile-relative measured-pressure
policy, profile-derived temperature/humidity, and a delta-M-safe aerosol
direct-extinction oracle. Its near-horizon evidence rejects simple unit-AOD
linear scaling over the full range. Checkpoint 6 executes the altitude and
pressure-ratio holdouts across all six profiles: 12,636 withheld spectral
values pass with 0.0124664 mag maximum extinction error, 0.00404537 mag
95th-percentile error, and 0.0114163 maximum relative transmission error.
The admitted interpolation uses complete cells, does not extrapolate, and
fails closed when a pressure-domain corner is invalid.
The final v9 radiance artifact closes the remaining reference-table gates. It
uses a training-only six-wavelength diagnostic to select a balanced 531 nm
importance reference, then admits REPTRAN-fine 380-780 nm photopic/scotopic
products over a 4-by-4-by-4 solar/target/azimuth grid. Nine untouched response
holdouts pass the unchanged 0.5-mag maximum and 0.3-mag p95 ceilings.
The 57-node direct surface passes 22,400 untouched spectral holdout bins with
0.0212954 mag maximum and 0.00279149 mag p95 error. Solver,
interpolation, and binary32 storage errors are separately receipted; modeled
twilight below -9 degrees is typed not_evaluable.
Phase 1 closes with the separate CC BY-SA 4.0
moira-physical-heliacal-visibility data pack version 1.0.0. Its
root-manifest SHA-256 is
49ac2b68ea105a8e055b27e8d4d70f6cbfe9533f971ef5e6000f0bdd95d6771b,
and the same immutable pack passes independent Linux and Windows validation.
It contains generated numerical products, checksums, provenance, and notices,
but no CIE source table, libRadtran/REPTRAN file, engine code, or automatic
download path.
The first pack is deliberately a fixed U.S. Standard, rural-summer, sea-level baseline. Earlier environmental and altitude/pressure evidence does not silently add absent pack axes; Phase 2 must fail closed outside the exact manifest domain. No engine loader or public API was implemented in Phase 1. Phase 2, Python spectral single-epoch truth, is now the next authorized work.
Status reflects work done since the original roadmap entry.
HIGH IMPACT — Doneayanamsa() 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).
HIGH IMPACT — DoneVertex is now populated in calculate_houses():
vertex = _asc_from_armc((armc + 90.0) % 360.0, obliquity, -latitude)
MEDIUM IMPACT — Donecorrections.py::topocentric_correction() already uses the full WGS-84
geodetic model:
f = 1.0 / 298.257223563 (WGS-84 flattening)a = EARTH_RADIUS_KM = 6378.137 (equatorial radius, km)The roadmap entry was written before this work was completed.
MEDIUM IMPACT — DoneAlready fully implemented in julian.py:
greenwich_mean_sidereal_time() uses θ_ERA (IAU 2000) as foundation plus the
Capitaine et al. (2003) 5th-order polynomial correction (SOFA iauGmst06)._gast_complementary_terms() implements all 9 periodic terms from IERS 2010
Table 5.2c (dominant term 0.00264″ from Moon’s node Ω; total ≤ 0.04″).apparent_sidereal_time() computes GAST = GMST + Δψ·cos(ε) + CT.The roadmap entry was written before this work was completed. Agreement with
SOFA iauGmst06 is better than 0.0001″ for 1800–2200.
MEDIUM IMPACT — Done_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.
MEDIUM IMPACT — DonePlanetData (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.
LOW IMPACT — Donefixed_stars.py already handles per-entry epoch correctly:
_J1991_25 = 2448349.0625 as
the propagation start epoch.pm_ra is stored and applied as μ_α* (i.e. μ_α · cos δ, the reduced
form), which is documented in _apply_proper_motion().The roadmap entry was written before this work was completed.
LOW IMPACT — Doneobliquity.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.
LOW IMPACT — Donejulian.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.
LOW IMPACT — Doneaspects.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.
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 |
|---|---|---|---|---|
| Feature | Done | fixed_stars.py |
||
| Feature | Done | dignities.py |
||
| Feature | Done | varga.py |
||
| Math | Done | sidereal.py |
||
| Math | Done | corrections.py |
||
| Math | Done | julian.py |
||
| Math | Done | julian.py |
||
| Math | Done | planets.py |
||
| Math | Done | fixed_stars.py |
||
| Math | Done | obliquity.py |
||
| Math | Done | julian.py |
||
| Math | Done | aspects.py |
| 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_stars.py Done (2026-03-22)Catalog of 8 astrologically significant multiple star systems with full orbital mechanics for visually resolvable pairs.
Types implemented:
VISUAL — Kepler + Thiele-Innes projection: Sirius (50.09-yr), α Centauri (79.91-yr)WIDE — reference separation/PA, period too long for reliable computation: Castor, Mizar, AcruxSPECTROSCOPIC — sub-milliarcsecond separation, unresolvable: Capella (104-day), Spica (4-day)OPTICAL — chance alignment confirmed by Gaia DR3 parallax: AlbireoCatalog: | 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/ 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:
moira.__init__Bridge layer present:
bridges/harmograms.pyChart / ProgressedChart / mapping adaptersThis keeps the engine boundary clean:
moira.harmogramsmoira.bridgesmoira.facadeFor reference, capabilities where Moira exceeds the standard Swiss Ephemeris distribution:
swe_dirhut() C function