Internal module guide. This module is now part of
@astrology/western; use the public package README for application setup.
composite module
Implements composite@1/midpoint, the composite chart built from the midpoints of two charts: shorter-arc body/ASC (Ascendant, the rising degree)/MC (Midheaven, the culminating degree) midpoints, with exact oppositions resolved forward from chart A. Reversing an opposition intentionally selects the other midpoint. Both source charts remain unchanged.
validateCompositeRules requires { method: 'midpoint', tieBreak: 'forward-from-a', angles: 'midpoint', houses: 'midpoint-cusps' | 'none' }. constructComposite({ a, b }, rules, { geometry?, aspectPolicy?, bodies? }) constructs a derived chart without acquiring astronomy. The optional body selection follows profile order; otherwise A’s requested order applies.
Both source zodiac/ayanamsa (the tropical–sidereal offset) and position origin must agree. Different birth instants and observers are legitimate. Missing bodies are omitted with explicit gaps. ASC/MC require both angle sets. Requested cusp midpoints require matching non-null house systems and twelve source cusps; the derived ring is never sorted or presented as a Binder house result. ARMC and other equatorial angles are excluded.
Composite derivatives are unknown. Optional contacts are evaluated within the derived chart under motion: 'unknown'; they are not A-to-B synastry. Missing geometry is a factor gap. Shared geometry may still label geometrically exact contacts exact.
createCompositeFeature(admitted) binds the exact method/resource hash. Use engine.operation({ profile, technique: 'composite', request: { a, b } }). Provenance includes both source hashes and every derived point; optional-factor gaps affect envelope completeness. Davison/time-place and recomputed houses remain unsupported.