Repository navigation
ASPECT_CATALOG
Moira supports 74 registered longitude aspects: 46 standard and 28 optional, plus Parallel and Contra-Parallel in the separate declination domain. The longitude registry contains 97 declared aliases. This reference records the implemented geometry and defaults as of 2026-10-25.
- Fractions are exact fractions of a full 360° turn. The target angle is
360 * numerator / denominator; repeating decimals marked ≈ are rounded here to six decimal places. Engine angles are floating-point evaluations of those targets; the fraction column preserves their mathematical identities. - Default orbs are maximum deviations in degrees under fixed-orb mode with
orb_factor=1, before caller overrides. These are Moira policy values, rather than a claim that all astrological traditions use the same orbs. - Aliases are the registered input spellings, not additional aspect targets. Longitude name resolution ignores case and internal ASCII spaces, hyphens, and underscores; leading/trailing whitespace and unknown names are rejected. A fraction string is an alias only where the alias column lists it.
- Standard tiers are cumulative. Optional sets require an explicit
optional_setsselection even withtier=2; their default selection is empty.
| Catalog group | Members | Selection | Optional set? |
|---|---|---|---|
| Standard major | 5 | Included in tier=0, 1, and 2
|
No |
| Standard common minor | 6 | Added by tier=1; included in tier=2
|
No |
| Standard extended minor | 35 | Added by tier=2
|
No |
| H13 | 6 | optional_sets=("H13",) |
Yes |
| H32 | 8 | optional_sets=("H32",) |
Yes |
| H36 | 6 | optional_sets=("H36",) |
Yes |
| H40 | 8 | optional_sets=("H40",) |
Yes |
| Declination | 2 | Separate declination detector | Separate domain |
Standard membership does not mean every default call scans all 46 aspects:
find_aspects and aspects_from_longitudes default to the eleven major/common
minor targets, aspects_between defaults to the 46 standard targets, and
synastry defaults to the five major targets. Explicit selectors govern each call.
| Canonical name | Degrees | Exact turn fraction | Default orb | Registered aliases |
|---|---|---|---|---|
| Conjunction | 0° | 0/1 | 8° | — |
| Sextile | 60° | 1/6 | 5° | — |
| Square | 90° | 1/4 | 7° | — |
| Trine | 120° | 1/3 | 7° | — |
| Opposition | 180° | 1/2 | 8° | — |
| Canonical name | Degrees | Exact turn fraction | Default orb | Registered aliases |
|---|---|---|---|---|
| Semisextile | 30° | 1/12 | 2° | Duodecile |
| Semisquare | 45° | 1/8 | 2° | Octile |
| Sesquiquadrate | 135° | 3/8 | 2° |
Sesquisquare; Trioctile
|
| Quincunx | 150° | 5/12 | 3° | Inconjunct |
| Quintile | 72° | 1/5 | 2° | — |
| Biquintile | 144° | 2/5 | 2° | — |
| Canonical name | Degrees | Exact turn fraction | Default orb | Registered aliases |
|---|---|---|---|---|
| Untion | 15° | 1/24 | 1° |
Semiduodecile; Quartisextile; Quartosextile; Quattuorvigintile
|
| Vigintile | 18° | 1/20 | 1° | Semidecile |
| Seminovile | 20° | 1/18 | 1° | — |
| Hexadecile | 22.5° | 1/16 | 1° |
Semioctile; Sexdecile; Quartisquare
|
| Quindecile | 24° | 1/15 | 1° |
Trientquintile; Quindecile (24°)
|
| Semiseptile | ≈25.714286° | 1/14 | 1° | — |
| Undecile | ≈32.727273° | 1/11 | 1° | — |
| Decile | 36° | 1/10 | 1.5° | Semiquintile |
| Novile | 40° | 1/9 | 1.5° | Nonile |
| Biquindecile | 48° | 2/15 | 1° | — |
| Septile | ≈51.428571° | 1/7 | 1.5° | — |
| Trivigintile | 54° | 3/20 | 1° | — |
| Biundecile | ≈65.454545° | 2/11 | 1° | — |
| Sesquioctile | 67.5° | 3/16 | 1° | Triquartisquare |
| Squile | 75° | 5/24 | 1° | — |
| Trisemiseptile | ≈77.142857° | 3/14 | 1° |
Tresemiseptile; Sesquiseptile
|
| Binovile | 80° | 2/9 | 1.5° | Binonile |
| Quadraquindecile | 96° | 4/15 | 1° | Quadriquindecile |
| Triundecile | ≈98.181818° | 3/11 | 1° | — |
| Quinseminovile | 100° | 5/18 | 1° | Quintaseminovile |
| Biseptile | ≈102.857143° | 2/7 | 1.5° | — |
| Squine | 105° | 7/24 | 1° | — |
| Tredecile | 108° | 3/10 | 1.5° |
Tridecile; Sesquiquintile
|
| Quinsemioctile | 112.5° | 5/16 | 1° | Quintaquartisquare |
| Septvigintile | 126° | 7/20 | 1° | Septavigintile |
| Quinsemiseptile | ≈128.571429° | 5/14 | 1° | Quintasemiseptile |
| Quadriundecile | ≈130.909091° | 4/11 | 1° |
QuatroUndecile; Quadundecile; Quadraundecile
|
| Septseminovile | 140° | 7/18 | 1° | Septaseminovile |
| Triseptile | ≈154.285714° | 3/7 | 1.5° | — |
| Septsemioctile | 157.5° | 7/16 | 1° |
Septaquartisquare; Sepsemioctile
|
| Quadnovile | 160° | 4/9 | 1.5° |
Quadranovile; Quatronovile
|
| Nonavigintile | 162° | 9/20 | 1° | Novigintile |
| Quinqueundecile | ≈163.636364° | 5/11 | 1° |
QuintUndecile; Quinundecile; Quintaundecile
|
| Tao | 165° | 11/24 | 1° |
Quindecile (165°); Quindecile (Tyl); Contraquindecile; Undecaquartisextile
|
| Septaquindecile | 168° | 7/15 | 1° |
Sepquindecile; Septquindecile
|
| Canonical name | Degrees | Exact turn fraction | Default orb | Registered aliases |
|---|---|---|---|---|
| H13 1/13 | ≈27.692308° | 1/13 | 12/13° |
1/13; Tredecile (13th harmonic)
|
| H13 2/13 | ≈55.384615° | 2/13 | 12/13° |
2/13; Bitredecile (13th harmonic)
|
| H13 3/13 | ≈83.076923° | 3/13 | 12/13° |
3/13; Tritredecile (13th harmonic)
|
| H13 4/13 | ≈110.769231° | 4/13 | 12/13° |
4/13; Quadratredecile (13th harmonic)
|
| H13 5/13 | ≈138.461538° | 5/13 | 12/13° |
5/13; Quintatredecile (13th harmonic)
|
| H13 6/13 | ≈166.153846° | 6/13 | 12/13° |
6/13; Sextatredecile (13th harmonic)
|
| Canonical name | Degrees | Exact turn fraction | Default orb | Registered aliases |
|---|---|---|---|---|
| H32 1/32 | 11.25° | 1/32 | 3/8° |
1/32; Quartisemisquare
|
| H32 3/32 | 33.75° | 3/32 | 3/8° |
3/32; Triquartisemisquare
|
| H32 5/32 | 56.25° | 5/32 | 3/8° |
5/32; Quintaquartisemisquare
|
| H32 7/32 | 78.75° | 7/32 | 3/8° |
7/32; Septaquartisemisquare
|
| H32 9/32 | 101.25° | 9/32 | 3/8° |
9/32; Nonaquartisemisquare
|
| H32 11/32 | 123.75° | 11/32 | 3/8° |
11/32; Undecaquartisemisquare
|
| H32 13/32 | 146.25° | 13/32 | 3/8° |
13/32; Tredecaquartisemisquare
|
| H32 15/32 | 168.75° | 15/32 | 3/8° |
15/32; Quindecaquartisemisquare
|
| Canonical name | Degrees | Exact turn fraction | Default orb | Registered aliases |
|---|---|---|---|---|
| H36 1/36 | 10° | 1/36 | 1/3° |
1/36; Sextisextile; Trigintasextile
|
| H36 5/36 | 50° | 5/36 | 1/3° |
5/36; Quintasextisextile
|
| H36 7/36 | 70° | 7/36 | 1/3° |
7/36; Septasextisextile
|
| H36 11/36 | 110° | 11/36 | 1/3° |
11/36; Undecasextisextile
|
| H36 13/36 | 130° | 13/36 | 1/3° |
13/36; Tredecasextisextile
|
| H36 17/36 | 170° | 17/36 | 1/3° |
17/36; Septendecasextisextile
|
| Canonical name | Degrees | Exact turn fraction | Default orb | Registered aliases |
|---|---|---|---|---|
| H40 1/40 | 9° | 1/40 | 3/10° |
1/40; Semivigintile; Quadragintile
|
| H40 3/40 | 27° | 3/40 | 3/10° | 3/40 |
| H40 7/40 | 63° | 7/40 | 3/10° | 7/40 |
| H40 9/40 | 81° | 9/40 | 3/10° | 9/40 |
| H40 11/40 | 99° | 11/40 | 3/10° | 11/40 |
| H40 13/40 | 117° | 13/40 | 3/10° | 13/40 |
| H40 17/40 | 153° | 17/40 | 3/10° | 17/40 |
| H40 19/40 | 171° | 19/40 | 3/10° | 19/40 |
Declination relationships compare signed equatorial declinations, rather than separation around the ecliptic. A turn fraction or fixed ecliptic angle does not apply to either relationship.
| Canonical name | Exact relationship | Ecliptic degrees / turn fraction | Default orb | Registered aliases |
|---|---|---|---|---|
| Parallel | Equal declinations in the same nonzero hemisphere; two equatorial points also qualify | Not applicable | 1° declination | — |
| Contra-Parallel | Equal-magnitude declinations in opposite nonzero hemispheres | Not applicable | 1° declination | — |
Parallel admission uses abs(dec1 - dec2) <= orb; Contra-Parallel admission
uses abs(dec1 + dec2) <= orb, after the stated hemisphere qualification.
A single equatorial point paired with a non-equatorial point forms neither.
DeclinationAspectPolicy.orb configures their shared default tolerance.
To scan all 74 longitude definitions on caller-supplied geometry:
from moira.aspects import (
OPTIONAL_ASPECT_FRACTIONS,
aspects_from_longitudes,
resolve_aspect,
)
analysis = aspects_from_longitudes(
{"Sun": 0.0, "Moon": 360 / 13},
tier=2,
optional_sets=("H13", "H32", "H36", "H40"),
)
assert analysis.optional_sets == ("H13", "H32", "H36", "H40")
assert any(aspect.aspect == "H13 1/13" for aspect in analysis.aspects)
assert OPTIONAL_ASPECT_FRACTIONS["H13 1/13"] == (1, 13)
assert resolve_aspect("1/13").name == "H13 1/13"
assert resolve_aspect("Quindecile").angle == 24
assert resolve_aspect("Tao").angle == 165
assert resolve_aspect("Tredecile").angle == 108The H13 names are qualified: Tredecile (13th harmonic) resolves to H13 1/13,
while bare Tredecile remains 108°. Bare Quindecile remains 24°; the explicitly
qualified 165° aliases resolve to Tao.
Optional sets contain only primitive fractions below half a turn. Reducible
members already represented by lower-harmonic aspects are not duplicated.
Every optional member has a configurable default orb of 12/H degrees:
H13 = 12/13° ≈ 0.923077°, H32 = 3/8° = 0.375°,
H36 = 1/3° ≈ 0.333333°, and H40 = 3/10° = 0.3°.
orbs={angle: maximum_orb} and orb_factor retain their existing behavior.
Traditional orb_mode="moiety" uses body-based moieties and remains restricted
to the five major aspects, including when optional sets were requested.
The selector is available on the ordinary longitude detectors, their facade
methods, synastry aspect/contact calls, and relationship transit searches.
AspectPolicy(optional_sets=...) freezes the selected keys; an explicit
AspectPolicy takes precedence over legacy keyword arguments. Explicit
synastry selectors override the corresponding synastry policy selection.
Keys are case-insensitive, normalized in catalog order, and must be unique.
Unknown keys, untrimmed keys, and invalid container/value types fail closed.
Name resolution alone does not enable an optional detection set. Relationship
forecast filtering requires the corresponding set to be enabled. Asking for a
specific optional motion witness by canonical name or alias is itself an
explicit selection; that single-witness call has no optional_sets argument.
GET /v1/aspects/optional-sets returns all four optional sets with canonical
names, integer numerators/denominators, angles, default orbs, and aliases.
For position-only detection, send this body to
POST /v1/aspects/from-longitudes:
{
"longitudes": {"Sun": 0, "Moon": 9},
"tier": 2,
"optional_sets": ["H40"]
}The response includes the canonical H40 1/40 event and preserves ["H40"]
in its computation truth. The same selector is supported by synastry,
composite/Davison aspect analyses and relationship-transit requests,
chart-wheel configuration, and asteroid-family resonance requests.
Presets label harmonic chart projections. Listing or choosing a preset does
not automatically enable an optional longitude-aspect set. H1 is the identity
projection (Natal); the other rows show the primitive 360/H division.
Harmonic-chart conjunction orbs have their own projected/reference-orb policy;
the longitude defaults above do not replace that policy.
The ordinary harmonic-chart default reference is 12°; the separate sampled
mixed-origin harmonic-transit forecast retains its explicit 1° default.
Range products default to a maximum harmonic of 32, so request
max_harmonic=40 or higher to include H36 and H40 in those sweeps.
| Harmonic | Preset name | Primitive angle | Primitive turn fraction | Optional longitude set |
|---|---|---|---|---|
| H1 | Natal | Identity projection | — | — |
| H2 | Opposition | 180° | 1/2 | — |
| H3 | Trine | 120° | 1/3 | — |
| H4 | Square | 90° | 1/4 | — |
| H5 | Quintile | 72° | 1/5 | — |
| H6 | Sextile | 60° | 1/6 | — |
| H7 | Septile | ≈51.428571° | 1/7 | — |
| H8 | Octile | 45° | 1/8 | — |
| H9 | Novile | 40° | 1/9 | — |
| H10 | Decile | 36° | 1/10 | — |
| H11 | Undecile | ≈32.727273° | 1/11 | — |
| H12 | Semi-sextile | 30° | 1/12 | — |
| H13 | H13 1/13 | ≈27.692308° | 1/13 | H13 |
| H14 | Semiseptile | ≈25.714286° | 1/14 | — |
| H15 | Quindecile | 24° | 1/15 | — |
| H16 | Hexadecile | 22.5° | 1/16 | — |
| H18 | Seminovile | 20° | 1/18 | — |
| H20 | Vigintile | 18° | 1/20 | — |
| H24 | Untion | 15° | 1/24 | — |
| H32 | H32 1/32 | 11.25° | 1/32 | H32 |
| H36 | H36 1/36 | 10° | 1/36 | H36 |
| H40 | H40 1/40 | 9° | 1/40 | H40 |
The engine and REST consumer audit records the checked entry points, fixes, numeric-only adapters, and technique-specific aspect domains.
The tables follow the actual registry, rather than inferring aliases from names or importing rounded angles from external reference tables:
- Standard definitions and tier membership
- Optional members and exact fraction metadata
- Canonical longitude definitions and declared aliases
- Declination geometry and policy
- Harmonic preset catalog
- Aspect Backend Standard, including the naming/source collation
- Harmonics Backend Standard
- Python API Reference
Aspect.ALL contains the 46 standard longitude definitions.
ASPECT_DEFINITIONS contains all 74 registered longitude definitions.
CANONICAL_ASPECTS preserves the 48 standard names (46 longitude and two
declination); optional members are declared separately in
OPTIONAL_ASPECT_SETS and OPTIONAL_ASPECT_FRACTIONS.