Commit Graph

19 Commits

Author SHA1 Message Date
monsterrobotparty
bcb05f051e 🎨 closer: colourise the grayscale moons — directorial hue tint (opus)
USGS has no colour equirect for Europa/Callisto/Titan/Phobos/Charon, so those
mosaics shipped grayscale. Multiply each by its characteristic hue at render
(bodies.js `tint`; moons.js tint-preserving loader keeps the real surface detail,
adds the iconic colour — Titan orange, Europa/Charon tan, Callisto/Phobos warm).
Io/Ganymede/Triton stay true USGS colour (white multiplier). Flagged in CREDITS as
a directorial (non-data) choice per Part ω.2. User-directed ("colourise the moons").

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 13:24:38 +10:00
monsterrobotparty
bdba119484 🌘 closer: event band — the ±2 yr window gets its own full-width strip (opus)
SYZYGY's 104 diamonds clustered into ~1.6% of the 250-yr timeline (invisible in
deep time). Add a second strip under #timeline-outer that maps ONLY the computed
±2 yr window to full width — diamonds live there (same ev-* classes + click-jump),
and the main strip gets a brass bracket marking the window's true extent (1.6%
near, 0.5% in deep time). windowFraction exported + gated. Verified: 22/22
(+band gate); diamonds spread 0.4–98.7%; click-jump works in near AND deep mode;
zero console errors both epochs.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 13:17:37 +10:00
monsterrobotparty
b42473a055 🔭 review: post-merge integration — sbdb_lookup into CONFIG.proxy, era-aware BC dates in lib formatters (fable)
Merged suite: 21/21 gates in-browser incl. NEO real-orbit (err 1.16%),
Jupiter@1000BC Δ0.004 AU, 2b-proof. Deep-time readout now '1000 BC-01-15'.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 10:32:38 +10:00
monsterrobotparty
c1c1afb0db 🛳 vessel: vendor three@0.170.0 (offline) + deep-time epoch mode (opus)
V.1 — cut the CDN tether. Vendored the exact pinned files the importmap used
(three.module.js r170 + OrbitControls + CSS2DRenderer, ~1.29 MB) under
vendor/three/, mirroring the package layout so the addons' bare `import from
'three'` resolves. Import graph verified shallow (addons import only 'three';
the bundle is self-contained). Both importmaps (index.html, verify.html) now
point at ./vendor/three/… — zero jsdelivr/CDN URLs remain. MIT LICENSE +
PROVENANCE.txt retained.

V.2 — open deep time. EPOCH toggle (1800–2050 / 3000 BC–3000 AD) next to
MEGA/TRUE; deep mode is a hash-carried page mode (&e=1) read before ephem/clock
init → ephem.setExtendedRange(true) + CONFIG.time swaps to the deep bounds.
Timeline end labels + scrub tooltip now read from CONFIG (were hardcoded
1800/2050). Toggle serializes current view and reloads with the flipped e token
(orbit paths + element resolution are baked per-session). Appended 1 decade/s
and 1 century/s rates. Hash e token added to applyHash/serializeHash.

V.3 — appended verify gates (PERIHELION-V): Jupiter @1000 BC (extended 2a+2b)
vs live Horizons barycenter tol 0.15 AU (Δ 0.0041); Mercury @2500 tol 0.02 AU
(Δ 3e-5); Table 2b M-correction proven live (zeroing it worsens Jupiter@1000BC
by 0.0214 AU). Core 13 gates untouched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 10:28:23 +10:00
monsterrobotparty
c794ca1182 merge perihelion/e-syzygy → main: computed sky events, gate green (append-append verify.html resolved) (fable) 2026-07-16 10:26:28 +10:00
monsterrobotparty
8bfce067d5 merge perihelion/m-selene → main: moon maps + tidal lock, gate green (fable) 2026-07-16 10:24:47 +10:00
monsterrobotparty
be5f8ad544 🌖 selene: real NASA/USGS maps + tidal lock for the major moons (opus)
- source 8 public-domain equirectangular mosaics (io/europa/ganymede/callisto/
  titan/triton/charon/phobos) from usgs astrogeology, downscale to 1024x512 jpg
  (0.92 mb added total, each <=143 kb); credits.md lists source/mission/license
- bodies.js: texture field on the 8 sourced moon entries only
- moons.js: load textures via ctx.loadTextureInto (same path as planets.js, so
  the moon's own 2k map also renders now); flat-color 404 fallback preserved
- moons.js tick: tidal lock rotation.y = 2pi*(jd-J2000)/period + pi (signed
  period gives retrograde spin for free)
2026-07-16 09:55:07 +10:00
monsterrobotparty
9aeb2bbb5f 🌓 syzygy: computed sky events — oppositions, conjunctions & greatest elongations from ephem longitudes; timeline diamonds that jump the clock; almanac next-event prediction (opus) 2026-07-16 09:52:39 +10:00
monsterrobotparty
a57fa196ac 🌑 neargod: real orbits for close approaches — CAD des → SBDB sbdb.api full-prec elements → shared Kepler core (ephem.smallBodyEcl); true marker + 25%-opacity ellipse per NEO, per-object fail-soft to the wave-1 schematic ring, honest 'N real · M schematic · CAD+SBDB' status; +sbdb_lookup upstream; +verify gate (opus) 2026-07-16 09:46:45 +10:00
monsterrobotparty
6391273ac5 📡 review: NEO status line says 'schematic ring' — real data, honest placement, in the UI not just the README (fable)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 08:58:37 +10:00
monsterrobotparty
4360269ad3 🔧 review: fix 8 findings from adversarial self-review (opus)
Multi-agent adversarial review (verified findings) — the top finding (dead orbit
drag) fable had already fixed in 3e36a0c; these are the rest, composing on top of
fable's 228caf2/3e36a0c:

- scale.js viewFromEcl: allocation-free + alias-safe (read x/y/z into locals before
  writing out) — it ran per body per frame and allocated an object each call (§11).
- planets.js + comets.js: refill orbit paths on any P change, not just
  isTransitioning() — the MEGA↔TRUE tween's FINAL frame (P settled, tween nulled)
  was skipped, leaving body/orbit desync (§12).
- almanac.js: a moon's heliocentric position adds its true orbital offset, so the
  Moon's "From Earth" is its real ~384,400 km / 1.3 s light, not 0.
- asteroids.js: guard refresh() against null geometry when toggled on before the
  SBDB load completes (was a TypeError).
- serve.py: CAD close-approach responses are never cached immutable — the database
  keeps growing for past dates as new NEOs are discovered (only Horizons ephemeris
  is truly immutable).

Re-verified: 13/13 gates green; orbit zoom dollies 82→73 finite; Moon From Earth
0.003 AU; layer toggles throw nothing; no console errors.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 08:43:40 +10:00
monsterrobotparty
3e36a0c16a 🖱 fix: orbit drag was dead — OrbitControls bound to the pointer-events:none label overlay; rebind to the WebGL canvas (verified by dispatched pointer drag: heading 0→-0.93 rad) (fable)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 01:19:09 +10:00
monsterrobotparty
228caf2270 🔭 review: hash restores full camera pose; tick-loop hygiene (fable)
- pendingCam now restores heading+pitch (inverse of serializeHash spherical),
  not just distance — pasted URLs reproduce the exact view (Stage 2 gate)
- bodyWorld.sun allocated once, not per frame (§11 zero-alloc tick rule)
- spacecraft/comet label DOM writes throttled ≤5 Hz (§11); geometry still per-frame

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 01:16:24 +10:00
monsterrobotparty
1f9664a6f9 📖 almanac: knowing — info panel, live facts, grimoire art, real textures, README (opus)
Stage 6. almanac.js: on-focus grimoire card — physical fact sheet, hand-written
prose (grimoire voice), MODELBEAST portrait, and LIVE computed facts free from the
ephemeris: distance from Sun & Earth, sunlight age, vis-viva orbital speed, day &
year length. Earth easter egg → GODSIGH world view (:8137). Real Solar System Scope
2k textures (CC BY, 6.1 MB) now paint every world + the Milky Way skybox; ephem
gains semiMajor() for vis-viva. Generated grimoire portraits (FLUX via MODELBEAST,
10 bodies, seed logged in art/PROMPTS.md) are the AESTHETIC layer only — real
worlds get real maps (truth boundary). README with layer table + quickstart +
verify; docs/hero.jpg. Also lands the Stage-3 planets label fix (obj.visible).
Gate: every clickable body has a card; quickstart works from a fresh clone.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 00:56:41 +10:00
monsterrobotparty
b37eb88670 ☄ swarm: small bodies — main belt, comets, NEO close approaches (opus)
Stage 5. asteroids.js: 1500-strong main-belt sample from SBDB (sb-class=MBA),
propagated by the shared Kepler core, one Points cloud refreshed ≤10 Hz, off by
default. comets.js: 1P/2P/67P/96P from SBDB (elliptical only) with full drawn
orbits, marker + anti-sunward tail scaled 1/r², on by default. neos.js: CAD ±30d
close-approach radar around Earth, colored by miss distance, clickable, lunar-
distance labels, off by default. All fail-soft. verify.html gate: belt view-radii
12.1–13.9 ∈ (Mars 10.7, Jupiter 17.4); Halley aphelion 35.3 AU > Neptune. Also
serialized verify's live Horizons checks (burst-throttle fix) → 13/13 green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 00:41:23 +10:00
monsterrobotparty
6084acad0f 🛰 probes: the live layer — 8 spacecraft via Horizons, trails + light-time (opus)
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>
2026-07-16 00:32:44 +10:00
monsterrobotparty
f2477513c0 🌙 retinue: worlds become places — moons, rings, tilts, spin, sun-lit terminator (opus)
Stage 3. moons.js: 21 moons as lit spheres with local per-parent compression
(clear the exaggerated parent, ordering preserved), retrograde via negative
period. rings.js: Saturn textured annulus (true 74500–140220 km scaled with
parent) + Uranus thin schematic ring, tilted with axial tilt, DoubleSide. Moons
draw at the parent's exaggeration so Io/Jupiter ≈ 0.026 ratio holds. Label
visibility gated via CSS2DObject.visible (CSS2DRenderer clobbers div.style.display
every frame — fixed). Gate: Galilean laps 1.00:0.50:0.25 (1:2:4), Triton
retrograde (Δθ<0), moons ordered io<europa<ganymede<callisto.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 00:19:28 +10:00
monsterrobotparty
c4b572b8bb 🪐 kepler: planets on rails — Standish ephemeris engine, orbit paths, verify gates (opus)
Stage 1. ephem.js: JPL SSD approximate elements (Table 1 + 2a/2b plumbing),
Newton Kepler solver, reusable eclFromElements core (planets + small bodies),
orbitPath sampler. planets.js: 8 planets + Pluto as textured exaggerated spheres
on MEGA-compressed orbits with labels, rebuild-on-drift. verify.html: 9 gates all
green IN BROWSER incl. live Horizons via proxy — Mars @2026-07-15 Δ3.3e-4 AU,
Jupiter Δ2.9e-3, Earth Δ3.9e-5; Mars @J2000 vs live Δ4.8e-5; Jupiter @1900 Δ2.0e-3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 00:04:41 +10:00
monsterrobotparty
26a5751394 🌞 genesis: scaffold — serve.py proxy+cache, importmap renderer, sky, sun, HUD, time bar, floating-origin bootstrap (opus)
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>
2026-07-16 00:04:41 +10:00