Engine baseline: 6.1.0
Last reviewed: 2026-07-30
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:
- Moira can support this structurally as a derived doctrine/scoring subsystem.
Astrodyne-Manual.pdfis now in hand and materially unblocks the doctrine.- The manual provides the governing scoring rules, worked examples, house-power table, zodiacal and parallel aspect procedures, and harmony/discord rollups.
- The Church of Light dignity table has been directly confirmed and the earlier Mercury/Virgo transcription error corrected.
moira.astrodynesnow preserves the raw source tables and derivation truth for house-position power, zodiacal aspects, magnitude parallels, essential dignity, and aspect harmony/discord.
Constraint:
- Do not implement an approximate or blended "power score" and label it astrodynes/cosmodynes.
- Keep parity claims bounded to their named evidence. The admitted natal claim is full displayed-output parity for the three captured Church of Light reports under explicit-geometry semantics and the documented tolerances; it is not progressed parity or autonomous reconstruction from printed labels.
Completed constitutional surface:
- typed classification and inspectability
- fixed source doctrine and policy
- aspect, parallel, and mutual-reception relations
- integrated planet/angle condition profiles
- source-supported sign and house aggregates
- source-supported society, trinity, element, and quality summaries
- three-chart Church of Light displayed-output parity corpus
- relation network, full-subsystem hardening, backend standard, validation codex, and curated public engine/facade surface
- typed
/v1/astrodynes/doctrine,/geometry, and/chartREST routes with explicit geometry/frame provenance and house-fallback truth - source-derived progressed doctrine, full explicit-geometry practical
distribution, publication-discrepancy ledger, package/facade exposure, and
ten strict
/v1/astrodynes/progressed/*routes - separate kernel-backed progressed chart adapter deriving Limiting Date, major/minor/transit geometry, progressed angles, terminals, relations, reenforcements, and practical totals from natal and target datetimes
- bounded progressed-contact search and explicit variable-rate influence quadrature with visible solver and integration policy
Remaining 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.
- Current doctrine and remaining scope are governed by
wiki/02_standards/ASTRODYNES_BACKEND_STANDARD.md; the admitted parity claim is recorded inwiki/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.
heliacal_rising() and heliacal_setting() are exported from moira.__all__
and tested in tests/unit/test_public_surface_gaps.py.
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.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.
The 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.
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).
Vertex is now populated in calculate_houses():
vertex = _asc_from_armc((armc + 90.0) % 360.0, obliquity, -latitude)corrections.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)- elevation converted to km and applied via the standard C/S auxiliary values
The roadmap entry was written before this work was completed.
Already 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 (SOFAiauGmst06)._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.
_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):
- 2022: 69.6 → 69.25 (−0.35 s)
- 2023: 69.5 → 69.20 (−0.30 s)
- 2024: 69.4 → 69.17 (−0.23 s)
- 2025: 69.3 → 69.13 (−0.17 s)
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.
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.
fixed_stars.py already handles per-entry epoch correctly:
- ICRS-tagged entries (Hipparcos-sourced) use
_J1991_25 = 2448349.0625as the propagation start epoch. - J2000 and B1950 entries use their stated epochs.
pm_rais 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.
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.
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.
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.
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 |
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: Albireo
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).
Mathematically explicit harmograms engine built in visible strata rather than as one opaque score.
Implemented strata:
- H1 spectral foundations:
- point-set harmonic vectors
- zero-Aries parts construction
- zero-Aries parts harmonic vectors
- H2 intensity doctrine:
- named intensity families
- conjunction inclusion policy
- explicit normalization and harmonic-domain policy
- H3 projection layer:
- explicit spectral projection vessels
- truncated-realization classification carried visibly
- H4 trace layer:
- named trace families
- time-domain harmogram traces over supplied snapshots
- H5 research tooling:
- contributor ranking
- spectrum comparison
- trace-series comparison
Admitted intensity families:
- cosine bell
- top hat
- triangular
- gaussian
Admitted trace families:
- dynamic zero-Aries parts
- transit-to-natal zero-Aries parts
- directed-to-natal zero-Aries parts
- progressed-to-natal zero-Aries parts
Public engine shape:
- selected stable types and computation surfaces exported from
moira.__init__ - no facade-first harmogram workflow has been frozen
- service/workflow orchestration remains intentionally outside the engine core
Bridge layer present:
bridges/harmograms.py- native
Chart/ProgressedChart/ mapping adapters - explicit body-selection filters
- progression-family sample builders
- datetime-range chart sampling builders
This keeps the engine boundary clean:
- mathematics in
moira.harmograms - expressive adaptation in
moira.bridges - no service-layer canonization in
moira.facade
For reference, capabilities where Moira exceeds the standard Swiss Ephemeris distribution:
- IAU 2000A full nutation (1,358 luni-solar + 1,056 planetary terms) — SwissEph uses a truncated version in its default mode
- Classical decanates with admitted Chaldean face, triplicity-decan, and Vedic drekkana computations; the source-reconstructed Gundel/Harley Hermetic name-and-face catalog remains research-only
- Centaur SPK kernels (Pholus, Chariklo, Asbolus, Hylonome) — SwissEph has fewer
- TNO kernel support (Quaoar, Varuna, Ixion, Orcus) via SPK Type 13
- 512 Arabic part / Lot definitions — SwissEph ships far fewer
- Primary directions (Placidus semi-arc, mundane) — SwissEph requires the
swe_dirhut()C function - Planetary hours with day/night sunrise and sunset computation
- Tertiary progressions alongside secondary and solar arc
- Relativistic aberration and deflection applied uniformly to all bodies
- Constellations directory (34 constellation star groups)
- Planetary hours with a full admitted day/night cycle
- Royal stars, Behenian stars, Pleiades / Hyades as named groups
- Multiple star systems — Kepler orbital mechanics for visual binaries (Sirius B, α Centauri AB); VISUAL / WIDE / SPECTROSCOPIC / OPTICAL types; 8-system catalog
- Eclipse Saros classification with heptagonal vertex labelling
- Jones whole-chart shape classification (all 7 temperament types)
- Gauquelin sector analysis
- Vimshottari Dasha with nakshatra balance
- Zodiacal releasing (Vettius Valens method)
- Firdaria (Persian/Arabic time-lord system)
- Astrocartography / ACG lines (MC, IC, ASC, DSC per planet)
- Local space chart positions
- Paran field analysis with contour extraction and stability metrics
- Galactic coordinate system transformations
- Uranian / transneptunian bodies (Hamburg School TNPs)
- Harmonic charts with full aspect-harmonic profile
- Harmograms subsystem with explicit spectral vectors, zero-Aries parts, intensity spectra, projections, and named trace families
- Varga / divisional charts (navamsa, dashamansa, etc.)
- Sothic cycle reconstruction (Egyptian calendar anchor)
- Arabic lunar mansions (manazil, all 28)
- Hyleg / Alcocoden longevity calculation