Stage 4. spacecraft.js: Voyager 1/2, New Horizons, JWST, Parker, Juno, Lucy,
Psyche. Fetches VECTORS (heliocentric ecliptic AU) over a multi-year span through
serve.py's cache, Catmull-Rom interpolated per frame; glowing diamond marker +
fading trail + label with live distance from Sun and one-way light-time from
Earth. Fail-soft per craft. Robustness: sequential fetch (Horizons throttles
bursts), serve.py skips caching non-$$SOE (error) responses, and span
auto-recovery clamps START/STOP to a craft's SPK coverage from Horizons' own
"prior to / after" hints (Psyche pre-launch, Juno past coverage) → 8/8 tracked.
Gate: Voyager 1 @2026-07-15 = (-32.07,-136.21,98.55) Δ0.002 AU; JWST Δ0.011 AU
from Earth. verify.html gates 10-11 green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Stage 0. Zero-dependency serve.py (static + allowlisted horizons/sbdb/cad proxy,
sha256 disk cache with past-span immutability). Three.js via pinned importmap,
logarithmic depth, procedural starfield sky (+ Milky Way panorama swap-in), Sun
with additive glow, OrbitControls, brass-and-void HUD, scrubbable time bar,
central bodyWorld position pass, focus/camera system, hash state. Boots clean,
no console errors.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>