Skip to content

FEATURE_AUDIT_2026

TheDaniel166 edited this page May 18, 2026 · 1 revision

Moira Feature Audit 2026

Audit date: 2026-05-15
Moira commit: 8fc17b8efb1fa38723458d4f851520183d93ecf9
Auditor: TheDaniel166
Method: 12-domain coverage matrix. Moira assessed from code inspection; competitors from public documentation (manuals, feature pages, tutorials).

Post-audit implementation update (2026-05-15): Relocated chart generation has since been implemented in the live codebase via moira.chart.relocated_chart() and Moira.relocated_chart(). Converse transit search has also since been implemented across the live transit surfaces: find_transits() / next_transit() in transits.py, find_aspect_transits() in transits_aspects.py, find_declination_transits() in transits_equatorial.py, and find_house_ingresses() in transits_houses.py, all via an explicit reverse-time search mode. The traditional solar-sign frame has likewise been implemented in the live house engine as an explicit HouseSystem.SOLAR_SIGN, distinct from Sunshine. East Point / Equatorial Ascendant has now also been implemented in the live house engine as HouseCusps.east_point, computed from the Morinus-style equatorial projection of ARMC + 90°. A thin solar_return_chart() wrapper has now also been added on top of the existing return-time and chart-assembly substrate. Decennials has now also been fully implemented and constitutionalized in the live timelords subsystem, including the shared L1/L2 core, Valens deep doctrine through L4, and Hephaistio through L3. The audit sections below are updated to reflect those closures.

Cell scoring: ✓ full | ~ partial | ✗ absent | ? unclear
Gap types: A = missing feature | B = depth gap
Priority: D + C + T score → P1 (7–9) | P2 (5–6) | P3 (3–4)


0. Executive Summary

Overall assessment: Moira is already one of the most computationally comprehensive astrology engines in the comparison set. Its strongest domains are body coverage, aspects, dignities, lots, and progressions/directions; its remaining thinnest areas are auxiliary predictive tooling, specialty doctrine layers such as KP, Tajika, and chart-yoga libraries, and the still-incomplete upper tier of spatial workflows beyond basic relocation.

Domain Coverage Scores

Domain ~ Score
1. Body Coverage 16 0 0 100.0%
2. House Systems & Chart Frames 20 0 0 100.0%
3. Aspects, Midpoints & Antiscia 12 0 0 100.0%
4. Dignities, Strength & Rulership 15 0 0 100.0%
5. Lots, Parts & Special Points 12 0 0 100.0%
6. Predictive — Transits & Returns 13 0 0 100.0%
7. Predictive — Progressions & Directions 22 0 0 100.0%
8. Predictive — Time Lord Systems 11 0 3 78.6%
9. Synastry & Relationship Charts 6 0 3 66.7%
10. Astronomical Phenomena & Events 11 2 0 91.7%
11. Astrocartography & Spatial Techniques 6 0 2 75.0%
12. Vedic / Jyotish Suite 10 0 4 71.4%

Top 10 Gaps by Priority

Post-audit update: Relocated chart generation and East Point / Equatorial Ascendant, both previously ranked gaps in this list, have now been implemented and verified in the live codebase. Standalone cazimi / combust / under-beams query surface (previously #7) has likewise been implemented via solar_condition_at() in moira.phenomena and Moira.solar_condition_at() on the facade. Derived houses (previously #18, score 5) has been implemented via derived_houses(house_cusps, from_house) in moira.houses — pure arithmetic rotation with no astronomical computation. Eclipse hit list against natal positions (previously #1 in this list) has been implemented via EclipseCalculator.eclipse_hits_in_range() and EclipseHit in moira.eclipse. The list below has been renumbered to show the current top 10 remaining gaps.

  1. Hellenistic aphesis / distributions - P2, score 6 - notably absent beside Zodiacal Releasing.
  2. Jaimini Chara Dasha - P2, score 6 - predictive Jaimini timing remains absent.
  3. Progressed synastry - P2, score 6 - synastry is present, but not against progressed charts.
  4. Transits to composite / Davison - P2, score 6 - relationship charts cannot yet act as transit targets.
  5. Eclipse canon as historical lookup catalog - P2, score 6 - canon validation exists, but not a historical query surface.
  6. Planetary visibility windows - P2, score 6 - heliacal events exist, but not continuous visibility intervals.
  7. ACG Zenith / Nadir lines - P2, score 6 - the cartography layer stops at MC/IC/ASC/DSC.
  8. ACG for asteroids / fixed stars - P2, score 6 - acg_lines() is generic, but public RA/Dec supply paths stop at classical planets.
  9. Yoga catalog - P2, score 6 - Panchanga yogas exist; natal chart-yoga detection does not.
  10. Triacontaeteris - P2, score 5 - niche but tractable Hellenistic period system.

Quick Wins

  • Eclipse hit list: eclipse search already exists, so the missing layer is natal-target matching rather than new eclipse astronomy. (resolved 2026-05-16 — EclipseCalculator.eclipse_hits_in_range() + EclipseHit in moira.eclipse)
  • Derived houses: turned-house rotation is conceptually simple and isolated from substrate astronomy. (resolved 2026-05-16 — derived_houses() in moira.houses)

1. Body Coverage

Moira's body coverage spans the full solar system: all classical and modern planets (Sun through Pluto), mean and true nodes (lunar + planetary), Black Moon Lilith (mean and true osculating), a fixed-star catalog of 1,809 stars (star_registry.csv), 15 Behenian and 4 Royal stars, variable stars, 369-entry asteroid catalog (ASTEROID_NAIF), classical asteroids (Ceres, Pallas, Juno, Vesta), 6 centaurs (Chiron, Pholus, Nessus, Asbolus, Chariklo, Hylonome), TNOs (Eris, Sedna, Quaoar, Makemake, Haumea, Ixion, Varuna, Orcus, Gonggong, and others in ASTEROID_NAIF), 5 periodic comets (Halley, Encke, Tempel 1, Churyumov-Gerasimenko, Swift-Tuttle), multiple star systems with orbital mechanics, and 9 Uranian/Hamburg hypothetical bodies (Cupido, Hades, Zeus, Kronos, Apollon, Admetos, Vulkanus, Poseidon, Transpluto).

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
Classical planets (Sun–Saturn)
Modern outer planets (Uranus–Pluto)
True & mean lunar nodes
Black Moon Lilith (mean & true) ~ ~
Planetary nodes ~ ~
Fixed stars (large catalog) ~
Variable stars ~
Classical asteroids (Ceres, Pallas, Juno, Vesta)
Chiron & centaurs
Extended centaurs (Pholus, Nessus, Chariklo) ~ ~ ~
TNOs (Eris, Sedna, Quaoar, Makemake, Haumea) ~ ~ ~
Main belt / extended asteroid catalog ~ ~
Comets ~
Uranian / Hamburg hypotheticals ~ ~
Multiple star systems
Solar System Barycenter

Gap notes:

Moira's body coverage is exceptional — it exceeds all 8 competitors in catalog breadth. No Type A gaps identified. Possible Type B: Moira's extended asteroid catalog stands at 369 named bodies (ASTEROID_NAIF); Sirius claims the largest commercial catalog and may exceed this count — verify. Fixed star catalog at 1,809 entries (star_registry.csv) is competitive with commercial leaders. Variable stars, comets (5 periodic), multiple star systems with orbital mechanics, and SSB access are unique to Moira among this competitor set. Uranian suite covers all 8 Hamburg bodies plus Transpluto (9 total).

2. House Systems & Chart Frames

Moira implements house cusps via houses.py using ARMC, obliquity, and geographic coordinates. The engine supports fallback from polar-incompatible systems (Placidus, Koch) to Porphyry above the critical latitude (~66.56°). Huber houses are in a separate module. Galactic, geodetic, local space, and Gauquelin sectors are also separate specialized modules.

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
Placidus
Koch
Regiomontanus
Campanus
Equal (ASC-based)
Whole Sign
Porphyry
Morinus
Alcabitius
Meridian / Axial Rotation
Azimuthal / Horizontal
Vehlow Equal
Krusinski / Poli-Goeldi ~ ~
Huber / age progressions ~
Gauquelin sectors ~
Galactic houses
Geodetic houses
Local space frame
Solar sign frame (Sun on cusp 1)
Derived houses (from any cusp)

Gap notes:
Moira's house system breadth is strong — the live HouseSystem surface now includes the traditional solar-sign frame alongside Sunshine. The two solar doctrines are kept explicitly distinct: Sunshine (code N) remains the Makransky variant with the Sun at cusp 12, while HouseSystem.SOLAR_SIGN is the traditional sign-anchored frame where house 1 begins at the start of the Sun's sign.

Post-audit update — Solar sign frame implemented. The traditional solar sign/solar house frame is now present in the live codebase as an explicit HouseSystem.SOLAR_SIGN, distinct from Sunshine. This gap is therefore closed in the current implementation truth.

One remaining gap is identified against the competitor matrix:

Derived houses (from any cusp) — resolved (2026-05-16). derived_houses(house_cusps, from_house) is now present in moira.houses and exported from the top-level moira package. It accepts any HouseCusps and an integer 1–12, and returns a DerivedHouseCusps — a frozen dataclass with the rotated 12-cusp tuple, the pivot house number, and a back-reference to the source wheel. No astronomical computation is performed; the function is pure arithmetic rotation of the existing cusp longitudes. Covered by 21 unit tests in tests/unit/test_derived_houses.py.

3. Aspects, Midpoints & Antiscia

aspects.py handles longitudinal aspect detection. midpoints.py covers midpoint trees and cosmobiology. antiscia.py covers solstice points and contra-antiscia. patterns.py identifies aspect patterns (Grand Trine, T-Square, Grand Cross, Yod, Mystic Rectangle, Kite, etc.). transits_equatorial.py covers declination-based aspects (parallel, contra-parallel).

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
Ptolemaic aspects (conjunction–opposition)
Modern aspects (quintile, septile, novile, etc.) ~
Parallel (declination)
Contra-parallel
Out-of-bounds planet flagging ~
Antiscia (solstice points) ~
Contra-antiscia
Midpoints (full 45° sort) ~
Cosmobiology (midpoint trees, pictures) ~
Aspect patterns (Grand Trine, T-Square, etc.) ~
Yod / Finger of God
Declination aspect search (transit parallels) ~ ~

Gap notes:
No gaps identified in this domain. Parallel and contra-parallel detection are fully implemented in both aspects.py (find_declination_aspects) for natal/synastry use and transits_equatorial.py (find_declination_transits) for predictive transit scanning, including a hybrid native-batch path for performance. Out-of-bounds flagging is implemented in aspects.py via find_out_of_bounds and the OutOfBoundsBody dataclass, comparing each body's declination against the true obliquity (moira.obliquity.true_obliquity) with excess computed as abs(declination) − obliquity. All Moira cells remain ✓ as templated.

4. Dignities, Strength & Rulership

dignities.py covers essential dignities (domicile, exaltation, detriment, fall). triplicity.py covers triplicity lords across multiple systems (Ptolemaic, Dorothean, Lilly). egyptian_bounds.py covers Egyptian and Ptolemaic bounds. decanates.py and hermetic_decans.py cover decans/faces. The dispositorship module covers rulership chains. wiki/02_standards/DIGNITIES_BACKEND_STANDARD.md is authoritative.

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
Domicile / rulership
Exaltation / fall
Detriment
Triplicity lords (Ptolemaic) ~
Triplicity lords (Dorothean / Lilly) ~
Egyptian / Ptolemaic bounds
Decanates / faces
Hermetic decanates ~ ~ ~
Almuten calculation
Peregrine status
Mutual reception ~ ~
Dispositor chain / final dispositor
Accidental dignities (angularity, direct motion) ~ ~ ~ ~
Cazimi / combust / under beams ~
Sect (diurnal/nocturnal)

Gap notes:
No gaps identified in this domain. All features are fully implemented in dignities.py and supporting modules.

  • Almuten Figuris (almuten_figuris() function, line 2233): scores essential dignities across key chart points to identify the planet with highest aggregate dignity.
  • Peregrine (SCORE_PEREGRINE, EssentialDignityKind.PEREGRINE, line 1058): returned when a planet holds no essential dignity in its sign — a full member of EssentialDignityTruth.
  • Mutual reception (mutual_receptions(), _find_mutual_receptions(), line 2276): supports both domicile and exaltation bases, configurable via MutualReceptionPolicy.
  • Dispositor chains (_build_dispositorship_chain(), line 1970): genuine multi-step chain tracing via a while True walk through sign rulers, detecting final dispositors (planet in own sign), terminal cycles, and unresolved chains when out-of-scope planets appear. DispositorshipTerminationKind enumerates all outcomes.
  • Accidental dignities — angularity and motion (_get_accidental_dignities(), line 1066): angular/succedent/cadent house placement scored at +4/+2/−2; direct/ retrograde motion tracked and scored via include_motion policy flag.
  • Cazimi / combust / under beams (lines 1113–1118): all three solar proximity thresholds implemented — cazimi (17′ = 0.283°), combust (8°), under sunbeams (17°) — with individual scores (SCORE_CAZIMI = +5, SCORE_COMBUST = −5, SCORE_SUNBEAMS).
  • Sect (SECT table, is_in_sect(), sect_light(), is_in_hayz(), lines 227–299): diurnal/nocturnal sect membership fully implemented for all Classic 7, including Mercury's conditional sect rule (diurnal when rising before the Sun). Hayz and halb detection are also present.

5. Lots, Parts & Special Points

lots.py implements 512 named Arabic/Hellenistic lots (docstring says ~430 — outdated) using ASC + Add − Subtract (mod 360°) with automatic day/night reversal (reverse_at_night field per PartDefinition) and full support for derived lot references (26+ lots reference other lots such as Fortune, Spirit, and Syzygy as formula operands). nine_parts.py covers Abu Ma'shar's nine hermetic lots (novenaria). manazil.py covers the 28 Arabic lunar mansions across five attribution traditions (al-Biruni default, Abenragel, Ibn al-Arabi, Agrippa, Picatrix). transits.py computes the prenatal syzygy — it returns (jd_syzygy, phase), a Julian date and phase label; the syzygy ecliptic longitude must be computed from the returned JD via a separate ephemeris call (lots engine accepts it as syzygy: float). Vertex is fully computed in houses.py (via _asc_from_armc applied to ARMC + 90? with negated latitude) and exposed as HouseCusps.vertex / anti_vertex. East Point / Equatorial ASC is now computed as HouseCusps.east_point, using the Morinus-style equatorial projection of ARMC + 90?. Galactic Center and Super-Galactic Center are both present in galactic.py as ecliptic-longitude sensitive points.

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
Lot of Fortune full full full full full full full absent full
Lot of Spirit full full full full full full full absent absent
Full Arabic lots catalog (100+) full (~512) partial (~50) full (~97) partial (~40) partial full absent absent absent
Day/night sect reversal for lots full full full full full full partial absent absent
Derived lot references full partial full absent absent partial absent absent absent
Nine Parts / Novenaria full absent full full absent full absent absent absent
Lunar Mansions (Manazil) full partial full partial absent full absent absent absent
Vertex full full full full full full full absent full
East Point / Equatorial ASC full full full full absent full full absent absent
Prenatal syzygy degree full full full full full full full absent absent
Galactic Center as sensitive point full partial full absent absent partial absent absent absent
Super-Galactic Center full absent partial absent absent absent absent absent absent

Gap notes:
Post-audit update - East Point implemented. In the live codebase, East Point / Equatorial Ascendant is now exposed as HouseCusps.east_point, computed from the Morinus-style equatorial projection of ARMC + 90 deg.

Moira's lots coverage is the deepest in the comparison set at 512 entries. The docstring claiming ~430 is stale and should be updated.

The prenatal syzygy is a minor depth gap: prenatal_syzygy() returns a Julian date rather than an ecliptic longitude directly. The longitude must be derived via a separate ephemeris call at that JD before passing it into the lots engine as syzygy: float. The feature is fully functional but requires two steps; Type B, low severity.

6. Predictive ??? Transits & Returns

transits.py owns longitude-crossing detection, sign ingress search, solar/lunar/ planetary return computation, and prenatal syzygy. transits_aspects.py handles transit-to-natal aspect events. transits_equatorial.py handles equatorial transits including declination parallels. transits_houses.py handles transit-through-house events.

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
Transits to natal (ecliptic)
Transits through houses ~
Transit aspects (aspect search)
Equatorial / declination transits ~ ~
Converse transits
Sign ingresses
Annual ingresses (Aries ingress, etc.)
Solar return
Lunar return
Planetary returns (all bodies) ~ ~ ~
Diurnal chart (daily solar return) ~
Eclipse hit list (upcoming eclipses to natal)
Prenatal syzygy

Gap notes:
Post-audit update — Converse transits implemented. The live codebase now exposes explicit reverse-time search across the transit surfaces: find_transits() / next_transit() in transits.py, find_aspect_transits() in transits_aspects.py, find_declination_transits() in transits_equatorial.py, and find_house_ingresses() in transits_houses.py all admit backward search. This gap is therefore closed in the current implementation truth.
Post-audit update — Solar return chart wrapper implemented. The live codebase now exposes solar_return_chart() in transits.py plus Moira.solar_return_chart(), composing the pre-existing solar_return() search with create_chart() rather than adding new return mathematics. This closes the daily solar return chart gap in current implementation truth.
Post-audit update — Eclipse hit list implemented. EclipseCalculator.eclipse_hits_in_range() now accepts a JD range and a dict[str, float] of natal positions, returning EclipseHit records sorted by Julian Day then target name. Solar eclipses match on the Sun/Moon conjunction degree; lunar eclipses match on both the Moon degree and the opposition Sun axis. EclipseHit is exported from moira.eclipse and moira.facade; Moira.eclipse_hits_in_range() is on the facade class.

7. Predictive — Progressions & Directions

progressions.py implements the full progression engine. Primary directions are governed by their own backend standard and wiki doctrine. Both forward and converse forms are available for all progression families.

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
Secondary progressions
Converse secondary progressions
Tertiary progressions ~
Minor progressions
Solar arc directions
Naibod arc
Mean solar arc ~
One-degree arc
Ascendant arc
Vertex arc ~ ~
Declination progressions (Jayne) ~
Progressed house frames (daily houses) ~
Primary directions — Placidus semi-arc
Primary directions — Regiomontanus
Primary directions — Campanus ~ ~
Primary directions — Topocentric ~ ~
Primary directions — Morinus ~
Primary directions — Zodiacal
Primary directions — Mundane ~
Primary directions — Parallels ~
Primary directions — Fixed stars as promissors ~
Converse primary directions

Gap notes:
Moira's progression and primary directions coverage is exceptional — matches or exceeds all competitors. The primary directions standard admits PLACIDUS_MUNDANE, PTOLEMY_SEMI_ARC, PLACIDIAN_CLASSIC_SEMI_ARC, MERIDIAN, MORINUS, REGIOMONTANUS, CAMPANUS, and TOPOCENTRIC as runtime-admitted methods; FIELD_PLANE and NEO_CONVERSE remain outside the current freeze and are Type B frontier items, not user-visible gaps. Morinus is admitted with an explicit doctrinal limit on its conjunction-style branch (shared with the equatorial family on current evidence), which is an internal precision note rather than a missing feature. No Type A gaps identified. No Type B gaps in primary directions for the current frozen surface.

8. Predictive — Time Lord Systems

timelords.py implements Firdaria (three sequence variants: diurnal, nocturnal, Bonatti), Decennials, and Zodiacal Releasing (with angularity classification). profections.py governs annual and monthly profections. lord_of_the_orb.py implements Abu Ma'shar's Lord of the Orb using planetary hour determination and Chaldean sequence arithmetic. lord_of_the_turn.py implements the annual Lord of the Turn via Al-Qabisi's succession-hierarchy method and the Egyptian/Al-Sijzi testimony method. dasha.py governs Vimshottari Dasha. dasha_systems.py governs Ashtottari and Yogini Dasha. Jaimini Chara Dasha is absent — jaimini.py covers only Chara Karakas. Of the three classical Hellenistic time-lord systems highlighted in the original audit, Decennials is now implemented, while Triacontaeteris and Aphesis/Distributions remain absent.

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
Annual profections ~
Monthly profections
Firdaria (diurnal) ~
Firdaria (nocturnal) ~
Firdaria (Bonatti variant) ~ ~ ~
Zodiacal Releasing ~
Lord of the Orb ~
Lord of the Turn ~
Decennials ~
Triacontaeteris (30-yr periods) ~
Hellenistic aphesis / distributions ~
Vimshottari dasha
Multiple Vedic dasha systems ~ ~ ~
Jaimini Chara Dasha ~

Gap notes:

Monthly profections are present (monthly_profection in profections.py); no gap.

Post-audit update — Decennials implemented and constitutionalized. The live timelords subsystem now includes a full Decennials engine with constitutional coverage through Phase 12. The admitted implementation boundary is:

  • shared Decennials core: L1 + L2
  • Valens: L3 + L4
  • Hephaistio: L3

Hephaistio L4 remains explicitly deferred, but the Decennials feature itself is now present and this audit gap is closed.

Triacontaeteris absent — Type A, D=1, C=1, T=3 → score 5 → P2. The 30-year Hellenistic period system is absent. Only Sirius fully supports it; Janus offers partial coverage. Lower competitor penetration justifies P2.

Hellenistic aphesis / distributions absent — Type A, D=2, C=2, T=2 → score 6 → P2. The Hellenistic planetary distributions (aphesis) system is not implemented. Sirius and Janus both support it; Astro-Seek offers partial coverage. This technique is closely related to Zodiacal Releasing (which is present) and shares the same doctrinal corpus, making its absence a meaningful gap relative to the Hellenistic feature set Moira otherwise covers well.

Jaimini Chara Dasha absent — Type A, D=2, C=1, T=3 → score 6 → P2. jaimini.py implements Chara Karakas only; no Chara Dasha time lord system exists. dasha_systems.py covers Ashtottari and Yogini but not Chara Dasha. Sirius fully supports it. This is the primary Jaimini predictive technique and a meaningful gap in the Vedic suite.

9. Synastry & Relationship Charts

synastry.py implements cross-chart aspects, house overlays (both directions), midpoint composite, reference-place composite, Davison chart (midpoint time + corrected MC-preserving search). Governed by wiki/02_standards/SYNASTRY_BACKEND_STANDARD.md.

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
Cross-chart aspects (synastry grid)
House overlays (A→B and B→A) ~
Midpoint composite chart
Reference-place composite
Davison chart (midpoint time)
Davison chart (MC-corrected) ~ ~
Progressed synastry (prog. chart vs. natal) ~
Transits to composite / Davison
Synastry aspect patterns ~

Gap notes:

Progressed synastry absent — Type B, D=2, C=2, T=2 → score 6 → P2. No function in synastry.py accepts a progressed chart as input for cross-chart comparison. No progressed_ parameter prefix or jd_progressed parameter exists in any synastry entrypoint. Solar Fire, Sirius, and Janus all support progressed-chart-vs-natal synastry; TimePassages offers partial coverage (4 of 8 competitors). This is a depth gap over the existing synastry engine (core cross-chart aspects are present) — Type B.

Transits to composite / Davison absent — Type B, D=2, C=2, T=2 → score 6 → P2. No function in synastry.py, transits.py, transits_aspects.py, or transits_houses.py accepts a CompositeChart or DavisonInfo as a transit target. The transit engine operates exclusively against natal charts. Solar Fire, Sirius, and Janus support transiting a third (composite or Davison) chart (3 of 8 competitors). This is a depth gap over the existing composite and Davison infrastructure — Type B.

Synastry aspect patterns absent — Type B, D=1, C=2, T=2 → score 5 → P2. No cross-chart pattern detection exists in synastry.py — no Grand Trine, T-square, Yod, or other multi-body configurations involving planets from both charts are detected. The single-chart pattern engine (patterns.py) is not extended to the inter-chart domain. Solar Fire, Sirius, and Janus support synastry aspect patterns; Astro-Seek offers partial coverage (4 of 8 competitors). This is a depth gap over the existing cross-chart aspect grid — Type B.

10. Astronomical Phenomena & Events

Eclipse suite: eclipse.py (contacts), eclipse_geometry.py (geometry), eclipse_search.py (event search), eclipse_canon.py (historical catalog). Heliacal rises/sets: heliacal.py (C++ native LOLA backend). Occultations: occultations.py. Station detection: stations.py. Void of course: void_of_course.py. Planetary hours: planetary_hours.py. Phase angles: phase.py. General phenomena: phenomena.py.

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
Solar eclipses (search + contacts + geometry) ~
Lunar eclipses ~
Eclipse canon (historical catalog) ~ ~ ~ ~
Heliacal rises and sets
Occultations ~ ~
Retrograde stations (Rx / Direct)
Void of course Moon ~
Planetary hours ~
Cazimi / combust / under beams ~
Phase angles (elongation, illumination %) ~ ~ ~
Lunar phase (new, crescent, quarter, etc.)
Planetary visibility windows ~ ~
Rise / set / culmination times

Gap notes:
Eclipse canon (~ for Moira): eclipse_canon.py implements NASA-canon algorithmic geometry in TT (gamma, contact solving, method comparison against the Espenak & Meeus Five Millennium Canon). This is a NASA-compatibility layer for validation, not a pre-computed historical catalog of past eclipses. Moira has no embedded lookup table of eclipse dates for arbitrary historical queries. Type B gap. D=2, C=2, T=2 → score 6 → P2.

Cazimi / combust / under beams — resolved (2026-05-16). A standalone solar_condition_at(planet, jd_ut) function is now present in phenomena.py and exposed as Moira.solar_condition_at() on the facade. It returns a SolarConditionTruth directly from a planet name and Julian Day without requiring a DignitiesService call. Thresholds: cazimi ≤ 17′ (17/60°), combust ≤ 8°, under sunbeams ≤ 17°. Luminaries (Sun, Moon) return present=False. The function is covered by 10 unit tests in tests/unit/test_solar_condition_at.py.

Planetary visibility windows (~ for Moira): heliacal.py returns event-point dates — planet_heliacal_rising(), planet_heliacal_setting(), planet_acronychal_rising(), planet_acronychal_setting() — each returning a single jd_ut crossing. No function returns a date range (start–end window) of continuous planetary visibility in the evening or morning sky. Type B gap. D=2, C=2, T=2 → score 6 → P2.

11. Astrocartography & Spatial Techniques

astrocartography.py computes MC/IC/ASC/DSC lines with topocentric WGS-84 support; Zenith/Nadir lines are not produced by the module. parans.py covers latitude-based paran crossings (13-phase engine with field analysis and contour extraction). geodetic.py provides geodetic MC/ASC equivalents (tropical and sidereal). local_space.py provides azimuth/altitude-based local space charts. The C++ native backend (cartography.hpp) provides low-level eclipse cartography grid sweeps, not the ACG line engine.

acg_lines() accepts any dict[str, (RA, Dec)], so it is body-agnostic in principle. However acg_from_chart() defaults to chart.planets.keys() (the 10 classical planets only), and sky_position_at() routes bodies via NAIF_ROUTES which contains only those 10 bodies. asteroids.py returns AsteroidData (ecliptic only — no RA/Dec); fixed stars have no sky_position_at path. ACG lines for asteroids and fixed stars are therefore absent from the current public surface.

No function in the codebase (in astrocartography.py, synastry.py, chart.py, houses.py, or _facade_spatial.py) accepts a natal Julian Day plus a new geographic location and returns a full recalculated chart (house cusps + planet positions). The phrase "from a relocated chart" appears only in a houses.py docstring comment (line 3343) describing a general ARMC-based overload — no relocated_chart() entrypoint exists.

Post-audit implementation update: The relocated-chart absence claim in this section has been superseded. Moira now exposes moira.chart.relocated_chart() and Moira.relocated_chart() as explicit relocated-chart entrypoints. The implementation preserves the original chart moment and celestial snapshot, recomputes only the local house frame for the new site, and was verified with targeted wrapper, policy-propagation, facade-wiring, and live relocation tests.

In-mundo direction space (IN_MUNDO / PrimaryDirectionSpace.IN_MUNDO) is fully implemented in moira/primary_directions/spaces.py and __init__.py for primary direction computation, including mundane position perfection and preserved-latitude mode. This is the canonical definition of in-mundo aspects (angular relationships in the sphere of the houses, used in primary directions). It is present.

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
ACG lines (MC / IC / ASC / DSC)
ACG Zenith / Nadir lines ~ ~
ACG for asteroids / fixed stars ~ ~ ~
Parans
Local space charts
Geodetic equivalents
In-mundo aspects
Relocated chart generation

Gap notes:

ACG Zenith / Nadir lines absent — Type A, D=2, C=2, T=2 → score 6 → P2. astrocartography.py produces only MC, IC, ASC, and DSC lines; no Zenith or Nadir line is computed. Solar Fire, Sirius, and Janus offer full Zenith/Nadir support; Astro.com and Astro-Seek offer partial coverage (5 of 8 competitors). Zenith lines (where a planet passes directly overhead) are a standard ACG map layer used alongside the MC line.

Relocated chart generation resolved (post-audit implementation update, 2026-05-15). Moira now provides this workflow explicitly through moira.chart.relocated_chart() and Moira.relocated_chart(). The implementation uses the existing chart and house-policy architecture rather than a parallel path: it preserves the original chart moment and celestial snapshot while recalculating the local house frame for the new site. Targeted tests were added to verify wrapper behavior, policy propagation, facade wiring, and the expected invariant that planetary positions remain fixed while local angles change.

ACG for asteroids / fixed stars absent — Type A, D=2, C=2, T=2 → score 6 → P2. sky_position_at() accepts only the 10 bodies in NAIF_ROUTES; AsteroidData carries no RA/Dec; no path exists to compute ACG lines for the 369-entry asteroid catalog or the 1,809 fixed stars. Sirius supports ACG for fixed stars; Solar Fire, Janus, and Astro-Seek offer partial coverage. The acg_lines() core is body-agnostic, so adding an RA/Dec source for asteroids and stars would be the primary implementation requirement.

12. Vedic / Jyotish Suite

vedic.py provides the consolidated Vedic surface. varga.py implements all 16 Shodashvarga wrappers from D2 through D60; panchanga.py computes all five almanac elements; dasha.py and dasha_systems.py cover Vimshottari, Ashtottari, and Yogini; jaimini.py covers Chara Karakas only; ashtakavarga.py and shadbala.py are both fully present. The remaining gaps are not in the astronomical substrate but in specialized Jyotish doctrine layers beyond the current implemented surface.

Feature Moira Solar Fire Sirius Janus Astro.com Astro-Seek Morinus Co-Star TimePassages
Vedic natal chart (sidereal)
Vargas / divisional charts (D-1 to D-12) ~ ~
Extended vargas (D-16 to D-60) ~ ~ ~
Vimshottari dasha
Multiple dasha systems ~ ~ ~
Jaimini Chara Dasha ~
Jaimini other techniques
Shadbala (six-fold strength) ~ ~
Ashtakavarga
Panchanga (all 5 elements) ~ ~ ~
Yoga catalog ~ ~ ~
Vedic dignities (uccha, neecha, etc.)
KP System (Krishnamurti Paddhati) ~ ~
Tajika (Vedic annual return) ~ ~

Gap notes:
Moira's Vedic suite is substantial: all 16 Shodashvarga wrappers are present in varga.py; all five Panchanga elements are present in panchanga.py; Vimshottari, Ashtottari, and Yogini are present across dasha.py and dasha_systems.py; and both ashtakavarga.py and shadbala.py are fully implemented. The missing items are specialized doctrinal layers, not core Jyotish infrastructure.

Jaimini Chara Dasha absent — see domain 8. jaimini.py stops at Chara Karakas and does not implement the Jaimini time-lord system itself. This is the same underlying gap already counted under Predictive — Time Lord Systems and should not be double-counted in the master list.

Yoga catalog absent — Type A, D=2, C=2, T=2 → score 6 → P2. Moira does not expose a chart-yoga engine for named natal combinations (Raja Yogas, Dhana Yogas, Nabhasa Yogas, and similar rule families). The only yoga surface in the codebase is the Panchanga YOGA_NAMES table for the 27 calendrical Nitya Yogas, which is a different object from a natal yoga catalog. Sirius is strong here; Solar Fire, Janus, and Astro-Seek offer partial coverage.

KP System absent — Type A, D=2, C=1, T=1 → score 4 → P3. Moira supports the Krishnamurti ayanamsa constant in sidereal.py, but no KP-specific computational layer exists: no KP cusp workflow, no star-lord / sub-lord tables, no ruling planets, and no significator logic. This is a real subsystem gap, not a parameter addition.

Tajika absent — Type A, D=1, C=2, T=2 → score 5 → P2. No Varshaphala / Tajika layer exists: no Muntha, no Sahams, and no Tajika aspect or annual-return doctrine module. Moira already has annual-return infrastructure in the Western predictive layer, so the tractability is moderate rather than foundational, but it is still a new doctrinal surface.

Source notes for competitor rows:

  • Solar Fire: Solar Fire's official help and manual publicly document sidereal/Vedic chart support and various Vedic divisional charts, which supports for sidereal natal and divisional-chart rows; they do not, in the public help surfaced here, provide equally explicit coverage for KP/Tajika, so those rows remain conservative at ~ rather than . Sources: Casting a Vedic Chart, Solar Fire Deluxe Manual PDF.
  • Sirius: Sirius has the clearest official public Vedic feature list in the competitor set: its Vedic pages explicitly advertise Vargas, Dasas & Bhuktis, Panchanga, Muhurta, Ashtakavarga, Shad Bala, Chara Karaka, KP presentation, and Sahams. That is the main basis for the strong pattern across the Sirius column, including KP and broader annual-return doctrine support. Sources: Vedic System in Sirius, Vedic Astrology in Sirius, Vedic Chakras.
  • Janus: Janus's official overview confirms a dedicated Vedic module and public release notes confirm divisional-chart presets and Dasa reporting. That is sufficient for on sidereal natal, base divisional charts, and Vimshottari, but because the public overview is thinner than Sirius on advanced doctrine, rows such as KP, Tajika, Shadbala, and Panchanga remain conservatively marked ~ unless the public Janus materials are more explicit. Sources: Janus Overview, Janus Reviews / Vedic module description.
  • Astro-Seek: Astro-Seek publicly exposes a Shodasha Varga calculator with D1–D60 coverage, which strongly supports for divisional charts and a broader sidereal/Vedic tool surface. Rows like Yoga catalog, KP, and Tajika stay partial or absent because the public pages surfaced in this pass are not explicit enough to justify stronger markings. Source: Astro-Seek Shodasha Varga Calculator.
  • Astro.com: Astrodienst's official public material clearly supports sidereal charts and multiple ayanamsha variants, but the public pages surfaced in this pass do not provide an equally explicit Vedic feature matrix for divisional charts, Panchanga, or Shadbala. For that reason, Astro.com remains conservative in this section: for sidereal natal and Vimshottari usage, ~ where sidereal/Vedic support is public but feature depth is less directly documented, and where no clear public evidence was found. Sources: Sidereal Zodiac, Ayanamshas in Sidereal Astrology, Indian Astrology.
  • TimePassages: TimePassages's official desktop manual/support documents sidereal charts and multiple ayanamshas, including Lahiri and Krishnamurti, but also makes clear that sidereal support differs by product tier. That supports a cautious for sidereal natal and conservative judgments elsewhere; the current Vedic row values should be read as desktop-oriented and low-confidence outside sidereal basics. Sources: Desktop Manual TimePassages, Do we offer Sidereal charts in the TimePassages Web App?.

Confidence note: The desktop suites, especially Sirius, have much better public Vedic feature disclosures than Astro.com, Astro-Seek, and TimePassages. In this domain I therefore treated sparse public documentation as a reason to stay conservative, not to infer hidden support.


13. Master Gap List

Post-audit update: The original audit ranked relocated chart generation as gap #1. That item is now closed by the addition of moira.chart.relocated_chart() and Moira.relocated_chart(), with targeted verification added alongside the implementation. East Point / Equatorial Ascendant, originally listed as gap #6, is likewise now closed via HouseCusps.east_point in the live house engine. The resolved rows have been removed from the live gap table below; the remaining numbering still reflects the original audit artifact.

# Gap Type Domain(s) D C T Score Priority Note
7 Eclipse hit list against natal positions Resolved 2026-05-16 EclipseCalculator.eclipse_hits_in_range() + EclipseHit in moira.eclipse; Moira.eclipse_hits_in_range() on the facade.
8 Hellenistic aphesis / distributions A 8 2 2 2 6 P2 Conspicuous omission beside Zodiacal Releasing.
9 Jaimini Chara Dasha A 8, 12 2 1 3 6 P2 Predictive Jaimini layer absent; already reflected in both the time-lord and Vedic domains.
10 Progressed synastry B 9 2 2 2 6 P2 Existing synastry engine does not accept progressed-chart inputs.
11 Transits to composite / Davison B 9 2 2 2 6 P2 Composite and Davison charts cannot act as transit targets.
12 Eclipse canon as historical lookup catalog B 10 2 2 2 6 P2 Algorithmic canon validation exists, but not embedded historical-query tables.
13 Standalone cazimi / combust / under-beams query surface Resolved 2026-05-16 solar_condition_at() in phenomena.py; Moira.solar_condition_at() on the facade.
14 Planetary visibility windows B 10 2 2 2 6 P2 Heliacal events are point-instants, not continuous visibility intervals.
15 ACG Zenith / Nadir lines A 11 2 2 2 6 P2 Cartography layer stops at MC/IC/ASC/DSC.
16 ACG for asteroids / fixed stars A 11 2 2 2 6 P2 acg_lines() is generic, but public RA/Dec supply paths stop at classical planets.
17 Yoga catalog A 12 2 2 2 6 P2 Panchanga yogas exist; natal chart-yoga detection does not.
18 Derived houses (from any cusp) Resolved 2026-05-16 derived_houses() + DerivedHouseCusps in moira.houses; pure rotation, no astronomy.
19 Triacontaeteris A 8 1 1 3 5 P2 Niche but tractable Hellenistic period system.
20 Synastry aspect patterns B 9 1 2 2 5 P2 Pattern engine is single-chart only.
21 Tajika / Varshaphala layer A 12 1 2 2 5 P2 Annual-return substrate exists, but Tajika doctrine does not.
22 KP System A 12 2 1 1 4 P3 Requires a dedicated KP subsystem, not a small extension.

14. Depth & Accuracy Gap Supplement

These are features Moira implements, or nearly implements, but not yet at the depth or surface completeness shown by the strongest competitors.

B1 — Prenatal syzygy degree

Current state: prenatal_syzygy() returns the syzygy Julian date and phase.
Competitor standard: Leading suites expose the syzygy as a directly usable degree or chart point.
Gap: Moira requires a second ephemeris call to convert the returned JD into the longitude expected by lots.py.

B2 — Progressed synastry

Current state: synastry.py covers natal-to-natal aspects, overlays, composites, and Davison charts.
Competitor standard: Solar Fire, Sirius, and Janus allow one or both charts in a relationship comparison to be progressed.
Gap: No synastry entrypoint accepts progressed longitudes or a progression date.

B3 — Transits to composite / Davison

Current state: Moira can build midpoint composites and Davison charts, and it can compute transits to natal charts.
Competitor standard: Professional suites also let the transit engine target the relationship chart itself.
Gap: Transit target types stop at natal charts; composites and Davisons are not accepted as transit targets.

B4 — Synastry aspect patterns

Current state: patterns.py detects complex single-chart patterns such as T-squares, Yods, and Grand Trines.
Competitor standard: Some desktop suites extend those pattern searches across two charts in synastry.
Gap: Moira does not detect inter-chart multi-body configurations.

B5 — Eclipse canon as lookup catalog

Current state: eclipse_canon.py reproduces canon-style geometry for validation and comparison work.
Competitor standard: Historical eclipse catalogs can be queried as data products in their own right.
Gap: Moira lacks an embedded historical lookup surface for arbitrary past-eclipse retrieval.

B6 — Standalone cazimi / combust / under-beams surface (resolved 2026-05-16)

Current state: solar_condition_at(planet, jd_ut) is now present in phenomena.py and exposed as Moira.solar_condition_at(). Returns a SolarConditionTruth directly without going through DignitiesService.
Resolution: Gap closed. The dedicated phenomena query path now exists alongside the existing time-range event search (solar_condition_events_in_range).

B7 — Planetary visibility windows

Current state: heliacal.py returns heliacal and acronychal event instants.
Competitor standard: Visibility tools often return the full morning/evening visibility interval, not just the threshold crossing.
Gap: Moira has the event points but not the continuous window abstraction.


15. Executive Summary

See section 0 for the full executive summary. The closing assessment is simple: Moira is already stronger than most competitors in astronomical substrate, classical/traditional coverage, lots, and direction/progression machinery, but it still lacks several user-facing surfaces that professional astrologers expect, especially specialty doctrinal layers such as KP, Tajika, and chart-yoga catalogs.


Appendix A: Competitor Profiles

Solar Fire

Tier: Professional desktop
Strengths: Broad mainstream professional coverage, strong return/transit tooling, extensive house and direction support, solid Vedic basics.
Notable gaps vs. Moira: Narrower body catalog, weaker exotic-object breadth, no Moira-equivalent multiple-star or SSB emphasis.

Sirius

Tier: Professional desktop
Strengths: The broadest direct feature rival in the set, especially across Hellenistic, Vedic, cosmobiology, and spatial work.
Notable gaps vs. Moira: Moira still leads in some substrate-explicit and catalog-provenance areas, especially unusual body classes and inspectable computational policy.

Janus

Tier: Professional desktop
Strengths: Strong traditional/Hellenistic emphasis, good predictive tooling, meaningful Vedic support, broad professional charting surface.
Notable gaps vs. Moira: Less breadth in unusual catalogs and specialized astronomical object classes; weaker frontier depth than Sirius.

Astro.com

Tier: Web platform
Strengths: Mainstream reference standard for online chart calculation, strong core natal/predictive/chart-frame coverage, trusted public baseline.
Notable gaps vs. Moira: Shallower in specialized traditional, spatial, and exotic-body domains.

Astro-Seek

Tier: Web platform
Strengths: Exceptional free-tool breadth, especially for traditional techniques, divisional charts, and exploratory feature coverage.
Notable gaps vs. Moira: Less consistent depth, fewer high-rigor specialty subsystems, and more partial coverage rows than the top desktop suites.

Morinus

Tier: Open-source specialist desktop
Strengths: Strong house-system and primary-directions orientation, serious traditional-method support, useful benchmark for classical features.
Notable gaps vs. Moira: Very limited Vedic surface, narrower body coverage, and little support for modern spatial or catalog-rich work.

Co-Star

Tier: Consumer mobile
Strengths: Clean mainstream natal/transit consumer surface with broad public familiarity.
Notable gaps vs. Moira: Sparse specialty coverage almost across the board: traditional methods, Vedic systems, spatial work, and advanced predictive tooling.

TimePassages

Tier: Consumer/pro bridge
Strengths: Strong core natal/transit/progression coverage in an accessible package; deeper than pure consumer apps.
Notable gaps vs. Moira: Still much thinner in specialized traditional, Vedic, spatial, and catalog-heavy domains.

Appendix B: Scoring Rationale

Post-audit note: The East Point / Equatorial Ascendant rationale row below is now historical. The gap was closed in the live codebase on 2026-05-16 via HouseCusps.east_point.

Gap D rationale C rationale T rationale
Relocated chart generation Resolved post-audit on 2026-05-15 via explicit relocated_chart() public workflows Historical competitor rationale unchanged: all 8 competitors expose it Historical tractability rationale confirmed: existing chart + house infrastructure was sufficient
Converse transits Resolved post-audit on 2026-05-15 via explicit backward-search support in transits.py, transits_aspects.py, transits_equatorial.py, and transits_houses.py Historical competitor rationale unchanged: present in 5 of 8 competitors Historical tractability rationale confirmed: existing transit surfaces were extended without a parallel engine
Solar sign frame Resolved post-audit on 2026-05-15 via explicit HouseSystem.SOLAR_SIGN in the live house engine Historical competitor rationale unchanged: present in 7 of 8 competitors Historical tractability rationale confirmed: the frame fit the existing house-system architecture as a distinct solar doctrine
Decennials Resolved post-audit on 2026-05-15 via a full constitutional Decennials subsystem in moira/timelords.py Historical competitor rationale unchanged: supported fully or partially by 3 competitors Historical tractability rationale confirmed: the existing time-lord architecture was sufficient
East Point / Equatorial Ascendant Resolved post-audit on 2026-05-16 via explicit HouseCusps.east_point in the live house engine Historical competitor rationale unchanged: present in 5 of 8 competitors Historical tractability rationale confirmed: the geometry fit the existing Morinus-adjacent house math cleanly
Eclipse hit list Resolved 2026-05-16 via EclipseCalculator.eclipse_hits_in_range() + EclipseHit in moira.eclipse Historical: C=2, present in 4 of 8 competitors Historical: T=2, eclipse and natal-aspect infrastructure were connected without new astronomy
Hellenistic aphesis / distributions D=2: important within Hellenistic practice C=2: present fully or partially in 3 competitors T=2: doctrinally new but adjacent to current time-lord work
Jaimini Chara Dasha D=2: central Jaimini predictive method C=1: only Sirius fully and Janus partially show support T=3: time-lord infrastructure is mature already
Progressed synastry D=2: meaningful relationship-analysis extension C=2: present fully or partially in 4 competitors T=2: reuse of progression and synastry infrastructure
Transits to composite / Davison D=2: meaningful but specialist relationship workflow C=2: present in 3 competitors T=2: target-model extension rather than new astronomy
Eclipse canon as lookup catalog D=2: useful research and historical-query feature C=2: present fully or partially in 5 competitors T=2: algorithmic layer exists, but data-product surface does not
Standalone cazimi / combust / under-beams surface Resolved 2026-05-16 via solar_condition_at() in phenomena.py Historical: C=3, most competitors expose the conditions directly Historical: T=2, existing truth objects needed a dedicated public query path
Planetary visibility windows D=2: important in observational/traditional work C=2: present fully or partially in 4 competitors T=2: built on top of heliacal event infrastructure
ACG Zenith / Nadir lines D=2: standard professional cartography layer C=2: present fully or partially in 5 competitors T=2: extension of current line-generation logic
ACG for asteroids / fixed stars D=2: specialist but real demand in advanced cartography C=2: present fully or partially in 4 competitors T=2: acg_lines() is generic, but public RA/Dec supply paths are missing
Derived houses Resolved 2026-05-16 via derived_houses() + DerivedHouseCusps in moira.houses Historical: C=2, present in 4 competitors Historical: T=2, confirmed as pure rotation with no new astronomy
Triacontaeteris D=1: niche Hellenistic method C=1: only Sirius full and Janus partial T=3: fits existing time-lord patterns cleanly
Synastry aspect patterns D=1: specialist relationship-analysis extension C=2: present fully or partially in 4 competitors T=2: extend existing pattern logic to inter-chart graphs
Tajika / Varshaphala layer D=1: specialist Vedic annual-return doctrine C=2: partial/full support in 3 competitors T=2: annual-return substrate exists but doctrine layer is absent
KP System D=2: important to KP practitioners but not general Western demand C=1: only Sirius full and Solar Fire/Janus partial at most T=1: requires a dedicated KP subsystem rather than an incremental extension

Clone this wiki locally