Skip to content

AstroCartography Correction

Choose a tag to compare

@TheDaniel166 TheDaniel166 released this 27 Oct 13:20
· 116 commits to main since this release

Added

  • 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.