pg_orrery/docs/agent-threads/v090-astrolock-upgrade/001-pg-orrery-v090-release-notes.md
Ryan Malloy db1f478e4f Update CLAUDE.md for v0.10.0, gitignore bench catalogs, add roadmap
- CLAUDE.md: 106 -> 114 functions, 18 -> 19 test suites, add aberration
  suite, DE apparent variants, equatorial spatial domain to tables
- .gitignore: ignore downloaded TLE catalogs in bench/ (alpha5, celestrak,
  satnogs, spacetrack, supgp, mega/merged, cookies)
- docs/TODO-v0.10.0.md: rewrite as post-v0.10.0 roadmap with next version
  candidates (make_orbital_elements, galilean_equatorial, equatorial GiST
  index, nutation, Delta T, rise/set)
- Track bench/build_catalog.py and agent thread message 001
2026-02-21 21:52:05 -07:00

7.4 KiB

Message 001

Field Value
From pg-orrery
To astrolock-api
Date 2026-02-21T18:30:00-07:00
Re pg_orrery v0.9.0 released — 24 new functions for Craft

What shipped

pg_orrery v0.9.0 is tagged and pushed. Docker image at git.supported.systems/warehack.ing/pg_orrery:pg17. Tested across PG 14-18. Docs live at https://pg-orrery.warehack.ing.

24 new SQL functions in 4 feature areas:

1. Equatorial RA/Dec output (12 functions)

New equatorial type (24 bytes: RA in hours, Dec in degrees, distance in km). Apparent coordinates of date — what telescope GoTo mounts and sky apps expect.

-- Planets, Sun, Moon — geocentric RA/Dec
SELECT eq_ra(planet_equatorial(5, NOW())) AS jupiter_ra_hours,
       eq_dec(planet_equatorial(5, NOW())) AS jupiter_dec_deg;

SELECT eq_ra(sun_equatorial(NOW())), eq_dec(sun_equatorial(NOW()));
SELECT eq_ra(moon_equatorial(NOW())), eq_dec(moon_equatorial(NOW()));

-- Satellites — topocentric (observer parallax-corrected) and geocentric
SELECT eq_ra(eci_to_equatorial(
    sgp4_propagate(tle_from_lines(l1, l2), NOW()),
    observer_from_geodetic(lat, lon, alt_m),
    NOW()
)) AS sat_ra_hours;

SELECT eq_ra(eci_to_equatorial_geo(
    sgp4_propagate(tle_from_lines(l1, l2), NOW()),
    NOW()
)) AS sat_ra_geo;

-- Comets/asteroids from orbital_elements
SELECT eq_ra(small_body_equatorial(oe, NOW())) AS ra_hours
FROM asteroids;

-- Stars (precesses J2000 catalog coords to date)
SELECT eq_ra(star_equatorial(ra_hours, dec_deg, NOW()));

-- Accessors
eq_ra(equatorial) -> float8      -- hours [0, 24)
eq_dec(equatorial) -> float8     -- degrees [-90, 90]
eq_distance(equatorial) -> float8 -- km

Why this matters for Craft: The sky engine currently returns only alt/az from topo_elevation()/topo_azimuth(). RA/Dec enables:

  • CesiumJS sky layer with equatorial grid overlay
  • Telescope GoTo integration (mounts speak RA/Dec)
  • Cross-matching objects against star catalogs
  • Proper sky chart rendering in the web UI

2. Atmospheric refraction (4 functions)

Bennett (1982) formula. Objects near the horizon appear ~0.57 deg higher than their geometric position.

-- Basic: standard atmosphere
SELECT atmospheric_refraction(0.0);  -- 0.57 deg at horizon

-- Extended: with pressure (mbar) and temperature (C)
SELECT atmospheric_refraction_ext(0.0, 700.0, -20.0);  -- high altitude, cold

-- Apparent elevation (geometric + refraction correction)
SELECT topo_elevation_apparent(planet_observe(5, obs, NOW()));

-- Refracted pass prediction (horizon at -0.569 deg geometric)
SELECT * FROM predict_passes_refracted(
    tle, obs, start_ts, end_ts
);

Why this matters for Craft:

  • predict_passes_refracted() finds passes ~35 seconds earlier/later than geometric — more accurate AOS/LOS times for rotor pre-positioning
  • topo_elevation_apparent() gives what the observer actually sees, not the geometric truth
  • The pass finder currently uses predict_passes() — drop-in replacement with predict_passes_refracted() for better accuracy

3. Light-time corrected apparent positions (6 functions)

Single-iteration light-time correction. Shows where an object was when its light left, not where it is now. Jupiter: ~35-52 minutes of light travel time.

-- Planet apparent position (light-time corrected)
SELECT topo_elevation(planet_observe_apparent(5, obs, NOW())) AS jupiter_apparent;
SELECT topo_elevation(sun_observe_apparent(obs, NOW())) AS sun_apparent;

-- Equatorial apparent (light-time corrected RA/Dec)
SELECT eq_ra(planet_equatorial_apparent(5, NOW()));
SELECT eq_ra(moon_equatorial_apparent(NOW()));

-- Comets/asteroids
SELECT * FROM small_body_observe_apparent(oe, obs, NOW());
SELECT eq_ra(small_body_equatorial_apparent(oe, NOW()));

Why this matters for Craft: The sky engine's planet_observe() returns geometric position. For telescope pointing accuracy, planet_observe_apparent() gives the correction. Matters most for outer planets.

4. Stellar proper motion (2 functions)

Stars move. Barnard's Star drifts ~10 arcseconds/year. For high-proper-motion stars, catalog J2000 coords drift noticeably over decades.

-- Observe with proper motion (Hipparcos/Gaia convention)
SELECT topo_elevation(star_observe_pm(
    ra_hours, dec_deg,
    pm_ra_masyr,    -- mu_alpha * cos(delta), mas/yr
    pm_dec_masyr,   -- mu_delta, mas/yr
    parallax_mas,   -- 0 to skip parallax
    rv_kms,         -- 0 to skip radial velocity
    obs, NOW()
));

-- RA/Dec with proper motion
SELECT eq_ra(star_equatorial_pm(
    ra_hours, dec_deg, pm_ra, pm_dec, plx, rv, NOW()
));

Why this matters for Craft: If Craft's star catalog has Hipparcos/Gaia proper motion columns, these functions give positions corrected for stellar drift. The existing star_observe() assumes static J2000 — fine for most stars, but Barnard's Star is off by ~2.6 arcmin over 25 years.

Upgrade path

1. Rebuild the database image

Craft's packages/db/Dockerfile pulls pg_orrery source via additional_contexts. Point it at the v0.9.0 tag or the latest phase/spgist-orbital-trie:

cd ~/claude/ham/satellite/astrolock
docker compose build db

2. Install/upgrade the extension

-- If already on 0.8.0:
ALTER EXTENSION pg_orrery UPDATE TO '0.9.0';

-- Or fresh install:
CREATE EXTENSION pg_orrery VERSION '0.9.0';

3. Quick smoke test

-- RA/Dec works?
SELECT eq_ra(planet_equatorial(5, NOW())) AS jupiter_ra,
       eq_dec(planet_equatorial(5, NOW())) AS jupiter_dec;

-- Refraction works?
SELECT atmospheric_refraction(0.0);  -- should be ~0.57

-- Refracted passes?
SELECT count(*) FROM predict_passes_refracted(
    tle_from_lines(l1, l2),
    observer_from_geodetic(36.0, -86.0, 200.0),
    NOW(), NOW() + interval '7 days'
);

Suggested integration points (for astrolock-api to evaluate)

These are suggestions, not requirements — Craft knows its own priorities:

  1. RA/Dec in whats_up response — Add ra and dec fields alongside altitude_deg/azimuth_deg. The SQL change is small: add eq_ra(planet_equatorial(...)) to the planet CTE, eq_ra(eci_to_equatorial(...)) to the satellite CTE, etc.

  2. Replace predict_passes() with predict_passes_refracted() in pass_finder.py — Drop-in replacement, same return signature, better AOS/LOS accuracy.

  3. Use planet_observe_apparent() for telescope pointing — When the rotor is tracking a planet, the apparent position is what the mount should point at.

  4. Proper motion for bright star catalog — If star table has Gaia/Hipparcos proper motion columns, swap star_observe_safe() for star_observe_pm() in the star CTE.

  5. DE ephemeris RA/Dec — If DE441 is loaded, planet_equatorial_de() gives sub-arcsecond RA/Dec. Two new functions: planet_equatorial_de(), moon_equatorial_de().

Reference


Next steps for recipient:

  • Review which v0.9.0 features are worth integrating
  • Rebuild db image with pg_orrery v0.9.0
  • Run ALTER EXTENSION pg_orrery UPDATE TO '0.9.0'
  • Decide priority order for integration (RA/Dec, refracted passes, apparent positions, proper motion)
  • Reply with questions, concerns, or an integration plan