moira

Physical Heliacal Visibility Phase 3 Closure

Date: 2026-07-30

Status: Complete at the additive Python direct-module engine boundary

Baseline commit: 2141a33bebe9898e1164824c06aba28a8408adeb

Governing roadmap: PHYSICAL_HELIACAL_VISIBILITY_IMPLEMENTATION_PLAN.md

Outcome

Phase 3 is closed. Moira now has an opt-in, typed physical event solver whose reported time is either a certified visibility-margin crossing or an inspectable domain boundary. It proves first-day or last-day ownership with an evaluable adjacent guard day and fails closed when dependency, domain, or crossing-completeness evidence is missing.

This closure does not change a legacy default, legacy heliacal result, facade, serializer, REST route, OpenAPI schema, or native dispatch path. Those remain separate later phases.

Exact Admission

The event admission is:

Target Single epoch Four physical event phases Disposition
Mercury Yes No body_phase_not_admitted; source-owned phase domain does not cover every required guard
Venus Yes No body_phase_not_admitted; source-owned phase domain does not cover every required guard
Mars Yes Yes admitted
Jupiter Yes Yes admitted
Saturn Yes Yes admitted
Sirius Yes Yes admitted through exact BSC5/CALSPEC/CIE profile
Other fixed stars No No target_not_admitted
Other bodies No No separate source-and-admission project required

The four admitted phases remain:

The lunar crescent stays on its Yallop-specific path. Legacy fixed-star event search remains unchanged. Sirius physical assessment and event search never call the legacy native arcus accelerator.

Engine Boundary

moira/_visibility_event_solver.py owns:

moira/heliacal.py owns:

The pack’s 0.25-degree true-altitude floor can narrow an observation window. The result reports target_data_pack_altitude_floor; it does not call that numerical domain edge a visual or measured horizon.

Exact Data Pack

Event search accepts only:

pack_id: moira-physical-heliacal-visibility
version: 1.2.0
manifest_sha256:
  cf93433a9f66a5ea92832271ce3c4b023fcc8693164803539a9f1be85b17468c
generation_fingerprint:
  d2907be5084fdb9569457af3b0ac995e8888b2ba3d9317948ba7f1e89a477c0e
stellar_target_profile_sha256:
  de202599761a1a5b49d656fab1c3640d0cc73ca1319c9e5a7c6f44c0c13de22b
payload_file_count: 13
root_file_count_including_manifest: 14

Version 1.2 copies all eight inherited Phase 2 payload roles byte-for-byte:

It adds one generated Sirius profile. The runtime pack contains no CALSPEC FITS file, BSC5 table, Hipparcos table, CIE source table, libRadtran source, or network client.

Two separate offline builds produced 14 files each with zero byte differences. The independent validator rederived Sirius and accepted both builds without importing the builder or Moira.

Sirius Source Chain

The first stellar admission binds:

The checksum-locked inputs are:

Source SHA-256
STScI CALSPEC sirius_stis_005.fits 1349da7b8b59ad035aefea8d7948f552b41b3897d07e5ad82ca162a53af97271
VizieR BSC5 HR 2491 query 09556d03431f70c65b75a4a555742812dd542d2e0a4ee40df4c11a876b5fcc3d
BSC5 ReadMe 44fd9c73e2eecad0beb47bdfa3f01c60fd43f93d6964198e31fcd48732de5b33
CIE photopic response ee5d5d17922ae645d4af52cacf6a50bdb9385749f9d2181ca312eb2b08febac2
CIE scotopic response 6a75d3fdbcbf5e9e9a07478511933eefeda953f3e2cc14b74459e5a099ec3759

The derivation linearly samples positive CALSPEC data-quality rows at the integer 380-779 nm bin starts, weights them independently by the two exact CIE responses, normalizes each response integrand, and derives the base S/P ratio. The generic sovereign-star color_index field is never consumed. Identity or visual-magnitude drift fails closed.

Source authorities:

Crossing-Completeness Certificate

The source-controlled certificate is:

certificate_id:
  physical-heliacal-event-lipschitz-v1
certificate_sha256:
  eacf8c373606c1628cebdd4caa611ece533d368c32c7f86674a13e04a4c13d3e
exact_pack_manifest_sha256:
  cf93433a9f66a5ea92832271ce3c4b023fcc8693164803539a9f1be85b17468c

The independent validator caught and repaired an earlier under-bound before closure. Direct extinction is interpolated in log10(target_altitude + 0.25), so the relevant maximum derivative is 12.59259154196714 magnitude per physical altitude degree, not the 11.239822387695312 endpoint secant.

The independently recomputed limits are:

Quantity Derived or exact-pack maximum Admitted ceiling
Solar true-altitude rate 363 deg/day 384 deg/day
Target true-altitude rate 377 deg/day 512 deg/day
Relative solar-azimuth rate 900.6833536757019 deg/day 1,024 deg/day
Refracted apparent-horizon signal 754 deg/day 1,024 deg/day
Direct-extinction interpolant contribution 6,447.406869487176 mag/day included below
Twilight coordinate contribution 792.2886606140862 mag/day included below
Full derived margin rate 8,799.984190715348 mag/day 16,384 mag/day

The pack’s 45-degree target-altitude ceiling excludes the horizontal coordinate singularity at zenith. Dense sampling is not a certificate. For each interval, the solver either:

  1. excludes zero from an endpoint and the rate bound;
  2. recursively encloses a witnessed crossing, tangent, or boundary contact to the declared tolerance; or
  3. returns crossing_completeness_not_certified.

Adversarial tests include two crossings hidden between same-sign coarse endpoints and a possible-zero interval with no witness. The first is found; the second fails closed.

Independent Event Goldens

The source-owned golden is:

tests/golden/physical_visibility_phase3_events.json
sha256:
  8111d662df77b1a8b3f53258fef02a1fcf5f3c21a980e3a48df9a7c5d5838518

The independent validator imports neither Moira nor the event solver. It implements the published pack interpolation, CIE MES2, Crumey threshold, and target conditioning separately.

Jupiter

Jupiter and solar airless topocentric geometry, Jupiter apparent magnitude, and phase angle come from checksum-locked one-minute JPL Horizons observer tables.

site: 35 N, 35 E, sea level
phase: morning_first_rising
independent event_jd_ut: 2460070.591389478
engine event_jd_ut:      2460070.591375516
absolute difference:    1.206350326538086 seconds
guard maximum margin:  -0.09540016026992415 magnitude
oracle tolerance:       60 seconds

Sirius

Sirius airless topocentric geometry uses checksum-locked Hipparcos I/239 astrometry transformed by offline Astropy 7.2.0, PyERFA 2.0.1.5, and pinned IERS data. Solar geometry comes from Horizons. BSC5/CALSPEC still own the physical profile and V magnitude; the Hipparcos V field is not substituted.

site: 30 N, 90 W, sea level
phase: morning_first_rising
independent event_jd_ut: 2461255.9502878026
engine event_jd_ut:      2461255.950317484
absolute difference:    2.564460039138794 seconds
guard maximum margin:  -0.3868969046825135 magnitude
oracle tolerance:       60 seconds

Both engine results report:

These one-minute external oracles validate numerical event timing. They do not convert observer, weather, or atmospheric-model uncertainty into probabilistic confidence.

Verification Gates

The Phase 3 focused gate covers:

Offline validators:

scripts/validate_visibility_phase3_data_pack.py
scripts/validate_visibility_phase3_event_certificate.py
scripts/validate_visibility_phase3_event_goldens.py

All accept explicit local paths, import no network client, and perform no download.

The final repository replay on 2026-07-31 under the current validation harness accepted:

51 focused Phase 3 unit and governance tests
2 exact-pack engine replays: Jupiter and Sirius
3 independent offline validators: pack, certificate, and event goldens
672-case physical-visibility compatibility gate:
  671 passed, 1 pre-existing empty-enumeration skip, 0 failed

The exact resting state, external artifact paths, dirty-tree ownership boundary, and restart commands are preserved in PHYSICAL_HELIACAL_VISIBILITY_PHASE3_RESTART_CHECKPOINT_2026-07-30.md.

Closed Limits

The following are explicit limits, not unfinished Phase 3 work:

Reopening any limit requires a named source, explicit domain, additive contract proposal, independent validation, and a new admission receipt.

Next Boundary

Phase 4 remains inactive until explicitly started. It owns moonlight, airglow, directional/local horizon realism, and related environmental components. It must not reinterpret this Phase 3 clear-sky, no-moonlight event contract.