You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Geodetic Analysis Expansion: added explicit immutable body snapshots,
full house figures, static overlays, segmented inverse angle loci, supplied-
place comparisons, and fixed-reference transit timing in their owning
Python modules. Canonical/qualified minor-body and comet identities retain
aliases, frames and known epochs; no catalog sweep, REST route, download
behavior, facade export, or package version change is introduced.
Nonlinear Geodetic Uncertainty Diagnostics: analytic whole-box branch
checks precede bounded deterministic sampling, circular sample arcs and
linearization residuals. These sampled diagnostics are not error bounds.
Coverage-Aware Fixed Geodetic Timing: explicit frozen tropical anchors,
directed aspect branches, stationary touches, connected orb windows with
repeated passes, disjoint SPK coverage and reduction padding, finite budgets,
and visible partial/incomplete states. Times are JD UT1, not civil UTC.
Typed Geodetic Location Metadata: added immutable GeodeticLocation
input and geodetic_chart_at_location. Latitude kind, datum/reference
frame, decimal-year coordinate epoch, ellipsoidal height, and source are
retained as metadata; supported latitude kinds remain numerically
pass-through. Geocentric latitude is refused until an explicit conversion is
selected.
Detailed Geodetic Equivalents Receipt: added an immutable chart-backed
result that records each body's source tropical longitude, selected-zodiac
longitude, geographic equivalent, chart UT/TT, and ayanamsa provenance. The
existing dictionary-returning wrapper remains compatible.
Caller-Controlled Geodetic Sensitivity: added analytic local MC/ASC
derivatives and first-order L1 response estimates from caller-supplied input
uncertainties. Results are explicitly not guaranteed error bounds, and
uncertainty ranges crossing calculation-domain boundaries are refused.
Physical-Horizon Research Specification: separated a possible
frame-aware geometric/apparent horizon capability into wiki/05_research/geodetic/GEODETIC_PHYSICAL_HORIZON_SPEC.md; no physical
horizon calculation or transport route is introduced.
Breaking Changes
Direct Sidereal Geodetic Charts Require An Explicit Offset: geodetic_chart(..., zodiac="sidereal") no longer silently assumes a zero
ayanamsa when ayanamsa_deg is omitted. Pass the selected offset explicitly; 0.0 remains valid when the caller intends coincident lanes.
Geodetic Tropical Lane Refuses An Ayanamsa: moira.geodetic entry points
and all four /v1/geodetic/* routes now reject a tropical request that
carries an ayanamsa, instead of resolving the same contradiction two ways —
the direct route previously honoured a nonzero ayanamsa_deg, while the
chart-backed route silently discarded ayanamsa_system. Transport reads
presence as the declaration, so zodiac: "tropical" with ayanamsa_deg: 0.0 is now HTTP 422. No shipped client sends either field
on a tropical request.
Geodetic Poles Are Refused, Not Extrapolated: geodetic_asc, geodetic_chart and REST admission reject latitudes within _POLAR_REFUSAL_MARGIN_DEG (1e-6) of |90|. At a geographic pole the two
tangent roots of the Ascendant are exactly equidistant, so the horizon no
longer singles out a rising ecliptic degree; the module previously answered
with a mathematical extrapolation.
Fixed
Geodetic Undefined Geometry And Angle Ranges: refuse coincident planes
and zero-rising-rate branch ties, including non-quadrant meridional ties;
sensitivity checks the entire uncertainty region before linearizing.
Normalize half-open angle results even at floating-point wrap/overflow edges.
Fixed-Target Transit Orb Windows: search connected boundaries over the
bounded study span rather than assuming two days is sufficient. Bulk fixed-
target scans share canonical samples and preserve the existing public/REST
mover admission; exact roots at study boundaries and stationary touches are
explicit numerical corrections.
Vertex / Anti-Vertex Branch Selection (#23): Python and native house
helpers now select the western prime-vertical/ecliptic intersection by its
actual local hour angle. Comparing ecliptic longitude with ARMC - 90°
could swap the two points at low southern latitudes, including the reported
Lima chart. Meridional ties retain the principal root; the existing
near-equator sentinel and conventional geographic-pole frame remain explicit.
Native Ascendant Branch Parity: native asc_from_armc now follows the
Python rising-intersection doctrine, including bounded sine/cosine evaluation,
exact-pole and floating-point ties, and half-open longitude normalization.
This also corrects native local-angle reductions that could choose the
setting intersection at polar latitudes.
One Ascendant Branch Doctrine: moira.houses and moira.geodetic
carried two divergent copies of _asc_from_armc. Both now delegate to moira._angles, which now selects the rising ecliptic/horizon intersection
by the sign of its local-hour-angle vertical rate. This replaces a
coordinate-frame mismatch that compared ecliptic longitude with ARMC + 90° (a right ascension) and could select the setting root at high
latitudes. Exact-pole ties remain deterministic for low-level house callers;
public geodetic calculations refuse the undefined polar margin. The shared
result is normalized to [0°, 360°).
Sidereal Geodetic Ascendant Frame: geodetic ARMC was derived from the
sidereal MC and then treated as a tropical equatorial frame. The engine now
derives ARMC from the zodiac-independent tropical meridian and expresses the
sidereal Ascendant as (tropical ASC - ayanamsa) mod 360.
Geodetic Ayanamsa Epoch: geodetic_chart_from_chart and geodetic_equivalents_from_chart passed the vessel's TT into moira.sidereal.ayanamsa, which is contracted for UT and performs its own
UT→TT step, so the epoch shifted twice. Measured error is 2.98e-08° at
J2000 and 3.90e-06° at 100 CE — 3.9× the 1e-6° longitude covenant.
Obliquity correctly remains a TT computation. moira.vedic already used the
UT scale; geodetic was the only outlier.
Geodetic Equivalents Double Ayanamsa: geodetic_equivalents_from_chart
fed the vessel's tropical positions into an inversion helper that reads a
nonzero ayanamsa as "these inputs are sidereal", so its sidereal lane
returned a meridian displaced by the full ayanamsa — 23.853° at J2000.
Both lanes now return the one zodiac-independent geographic anchor, matching
the REST service path, which converted positions first and was never wrong.
Changed
wiki/02_standards/GEODETIC_BACKEND_STANDARD.md is amended to 0.5: lane
exclusivity, rising-branch policy, the UT/TT epoch split, polar refusal,
caller-supplied latitude semantics, obliquity limits, and result provenance.
Explicit Geodetic Input and Result Contracts: geodetic latitude is
documented as caller-supplied and passed through without conversion or an
inferred datum; Earth obliquity is guarded to [22°, 25°]; direct GeodeticChart construction now enforces the result invariants. Chart-backed
chart results retain Julian Days, obliquity model identities, and the
sidereal ayanamsa system/time-scale provenance.
Geodetic and Astrocartography Latitude Boundary: documented that moira.geodetic records but does not convert caller latitude, while moira.astrocartography explicitly owns its WGS-84 geodetic/geocentric
conversion for horizon sampling and fixed-star zenith geometry.
Stable Shared Ascendant Evaluation: _asc_from_armc now evaluates the
equivalent horizon equation with sine and cosine terms instead of explicitly
evaluating tan(latitude), while preserving the rising-root selection and
deterministic exact-pole tie.
Validation
Added tests/unit/test_house_angle_branches.py: the Lima public-API
regression, independent Cartesian prime-vertical/west and horizon/east
assertions, near-coincident planes, Python/native grids across both
hemispheres and three obliquities, meridional/polar ties, near-equator
compatibility, and native-reduction/Python-fallback branch consistency.
Added tests/unit/test_angles_branch_doctrine.py (shared doctrine identity,
horizon and eastern-intersection witnesses, half-open normalization, polar
tie) and extended tests/unit/test_geodetic.py plus tests/server/test_server_geodetic_routes.py with lane-policy, polar, epoch
and lane-parity covenants, including service-layer refusals that hold when
transport validation is bypassed.
Added a separate altitude-equation root-search oracle across hemispheres,
date-line wrapping, and near-polar inputs, plus direct-vessel and
chart-provenance validation tests.
Expanded the independent root oracle across the admitted obliquity range,
seven longitudes, and both hemispheres; added longitude-turn metamorphic
checks, typed-location/provenance tests, detailed-equivalents lane receipts,
and finite-difference verification of analytic sensitivity derivatives.