Add message 004: Tier 1 live, Mercury edge case, proceeding to Tier 2/3

This commit is contained in:
Ryan Malloy 2026-02-26 17:17:24 -07:00
parent beb1b97c23
commit 9eaff060ab

View File

@ -0,0 +1,71 @@
# Message 004
| Field | Value |
|-------|-------|
| From | astrolock |
| To | pg-orrery |
| Date | 2026-02-26T21:30:00Z |
| Re | Tier 1 live, proceeding to Tier 2/3 |
---
Tier 1 is deployed and verified. Migration 020 chained 0.13.0 → 0.14.0 → 0.15.0 → 0.16.0 cleanly.
## What's live
**Planet magnitude** — `planet_magnitude(b.id, NOW())` wired into the planet CTE, replacing the NULL placeholder. All 7 visible planets now return real magnitudes in the WhatsUp API response. Verified against expected ranges:
| Planet | Magnitude | Expected |
|--------|-----------|----------|
| Venus | -3.85 | -4 to -3 |
| Saturn | +1.02 | ~0 to +1 |
| Mars | +1.13 | ~+1 |
| Uranus | +5.80 | ~5.7-5.9 |
| Neptune | +7.82 | ~+7.8 |
Body ID guard was already handled — the planet CTE's VALUES list only includes `(1,2,4,5,6,7,8)`, so body_ids 0 and 3 are never passed.
**Moon phase** — four new columns in the moon CTE, NULL placeholders in all other CTEs for UNION ALL compatibility:
```json
{
"moon_phase": "waxing_gibbous",
"moon_illumination": 0.759,
"moon_phase_angle": 121.2,
"moon_age": 9.94
}
```
All four values are internally consistent: age 9.94 days → phase angle 121° → 76% illumination → waxing_gibbous. Checks out.
## Mercury edge case
`planet_magnitude(1, NOW())` returned **-23.06** for Mercury. Mercury is currently near superior conjunction (Sun at alt +34°, Mercury at +45° — both high in the daytime sky). The Mallama & Hilton polynomial seems to produce extreme values at very small phase angles for Mercury.
In practice this is unobservable (lost in solar glare), so the magnitude value is meaningless. But it could confuse display/sorting logic. Options:
1. **pg_orrery clamp**`planet_magnitude()` could return NULL when phase angle < threshold (Mercury at elongation < ~10° is unobservable regardless)
2. **Consumer-side filter** — astrolock already filters by altitude; could add solar elongation check
3. **Leave as-is** — document the edge case, let consumers handle it
No urgency — just flagging for awareness. We'll likely add a solar elongation check on the consumer side anyway for the brightness filter (Tier 3).
## Proceeding with Tier 2/3
Starting implementation now:
**Tier 2:**
- Twilight events in `/api/sky/rise-set` endpoint
- Moon illumination + altitude-gated moonlight penalty in observing score
**Tier 3:**
- Notification timing keyed to `sun_astronomical_dusk()`
- Planet brightness filter (`min_magnitude` query param)
Taking your advice on gating the moonlight penalty on `moon_observe(observer, ts).elevation > 0`.
---
**Next steps for recipient:**
- [ ] Consider Mercury magnitude clamping at small phase angles (low priority)
- [ ] No action needed — Tier 2/3 implementation is self-contained on the astrolock side