Files
Astronome/TODO.md
T
arnaudne 2bb80a8475 Add target comparison modal, integration goal progress, and session planning + full catalog expansion
Features added this session:
- Target comparison: side-by-side overlay (CompareModal) from Targets page via ⊕ button on each row; shows altitude curves, key times, filter recommendations and per-filter integration progress for two targets simultaneously
- Integration goal progress dashboard card: per-target keeper minutes vs goal hours (from CLAUDE.md §16.3) broken down by filter, with color-coded progress bars; powered by new stats.integration_goals backend query
- Session planning timeline: Gantt-style "Plan Tonight" section on Dashboard (PlanningTimeline component) — search targets, set durations, sequential scheduling from dusk, overrun warnings, clipboard export
- Slew-optimized run order toggle (nearest-neighbor sort by RA/Dec angular distance)
- Best Nights 14-day card + Monthly Highlights card on Dashboard

Catalog expansions:
- Sharpless (Sh2), VdB, LDN, Barnard dark nebulae, LBN, Melotte, Collinder, Gum, RCW, Abell PN, Abell GC, PGC bright subset
- Caldwell/Arp/Melotte/Collinder number columns + cross-reference maps
- Weather score multiplier applied to composite sort
- galaxy_cluster type (ACO badge) throughout TypeBadge, CSS, filter chips

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 07:20:10 +02:00

157 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Astronome — TODO
## Missing Spec Items
- [x] **Settings — catalog info** — shows last refreshed date + DB size in App Info table
- [x] **Detail Drawer Tab 3 — workflow card** — WorkflowCard renders steps + notes (was already built, now confirmed)
- [x] **Stats page — guiding charts** — Guiding RMS over time as a proper LineChart (Total/RA/Dec lines)
- [x] **Calendar day panel — weather** — clicking a day shows go/nogo, temp, cloud cover, seeing from 7timer
- [x] **New Moon timeline — best targets overlay** — top 3 emission nebulae shown per new moon window (from `/api/calendar/new-moon-windows`)
---
## New Features
### High Priority
- [x] **Integration progress tracker** — per-target progress bar (% of goal hours) with color coding; goal hours from CLAUDE.md §16.3 table; shown on TargetRow in a "Goal" column
- [x] **Nightly recompute trigger** — "Recompute Tonight" button in Settings → POST `/api/nightly/recompute`
- [x] **Export imaging log as CSV** — "↓ Export Log CSV" button on Stats page → GET `/api/log/export`
### Medium Priority
- [x] **Object planning notes** — per-target free-text field in Detail Drawer Tab 4; saved to `target_notes` table; auto-saves on blur
- [x] **Filter accumulation breakdown** — keepers-only integration per filter shown in Detail Drawer Tab 4 (above session list); from `/api/log/:id` `filter_breakdown` field
- [x] **Moon avoidance cone on altitude curve** — blue shading when moon is above horizon; amber shading when moon sep < 30°
### Nice to Have
- [x] **Seasonal visibility heatmap**`YearlyVisibility.tsx` replaced bar chart with a 12×31 SVG calendar heatmap. Each cell = one day, colored by `alt_at_midnight` (green/teal/amber/muted). Blue moon overlay (opacity ∝ illumination). Hover tooltip shows date, alt, usable hours, moon %. Today ring in amber.
---
## Bugs & Fixes
- [x] **Fix gallery image upload** — root cause: ServeDir was mounted at URL `/data/gallery` (nginx sends that path to frontend, not backend). Fixed by remounting ServeDir at `/api/gallery/files/`. Updated all gallery image URL formats in `gallery.rs`. Also fixed `api.gallery.upload` to throw on non-2xx responses so errors surface in the UI.
- [x] **Fix Custom Object coordinate calculations** — root cause: `get_target`, `get_visibility`, `get_curve`, `get_filters`, `get_yearly`, and `get_workflow_handler` in `targets.rs` all queried only the `catalog` table, returning 404 for custom objects. Fixed by adding a `lookup_coords` helper that falls back to `custom_targets` table; `get_target` now returns a full response shape with null catalog-specific fields for custom objects.
---
## Observing & Planning
- [x] **Improve "best tonight" algorithm with composite score** — composite score `(alt*0.4 + fill*0.3 + usable*0.2 + moon*0.1)` is the default sort in `list_targets`. "Best Score Tonight" and "Altitude tonight" both exposed as sort options in Targets page.
- [x] **Custom horizon in target visibility** — fixed `usable_min`/`best_start/end` in `visibility.rs` to use `max(30°, horizon_alt(az))` instead of flat 30°. Added `is_visible_tonight` column to `nightly_cache` (with runtime migration). Nightly precompute now stores the flag. `list_targets` tonight filter uses `is_visible_tonight = 1` with fallback to `max_alt_deg >= 15` for pre-migration rows.
- [x] **Show custom and solar system objects in Targets list**`list_targets` appends custom_targets (with RA/Dec) on page 1 with live-computed current altitude. Frontend: `is_custom` flag renders a teal "CUSTOM" pill in TargetRow; TypeBadge extended with USR/SAT/CMT labels; "Custom" toggle chip added to filter bar (teal, default on).
- [x] **Greatly improve Targets filtering and sorting:**
- *Multi-select object type filter* — multi-select chips; comma-separated type param parsed server-side.
- *Best tonight sort* — "Best Score Tonight" is default; "Altitude tonight" added as explicit sort option.
- *Persist filter state* — all filter/sort state saved to `localStorage` (`astronome_targets_filters_v2`).
- *Additional filter dimensions* — min altitude, min usable time already present.
- Remaining: multi-select catalogue filter, FOV/SB ranges, constellation multi-select, session window.
- [x] **Add Astrobin search links in target detail** — added two Astrobin links (by common name and by catalog ID) in Detail Drawer Tab 2, plus a GoTo coordinates card with RA/Dec copy buttons and live hour angle / eastwest meridian indicator.
- [x] **Moon path on altitude graph** — already implemented: `CurvePoint.moon_alt_deg` populated in backend, rendered as dim blue dashed `Line` in `AltitudeCurve.tsx`; moon-above-horizon windows shaded in subtle blue, close-approach (<30°) shaded in amber.
- [x] **Merge "Tonight" and "Target" tabs in Detail Drawer** — combined into single "Overview" tab: DSS + metadata left column, altitude curve + key times right column; GoTo card + Aladin below the fold.
- [x] **Tonight run order** — Dashboard "Tonight's Run Order" Gantt-style card: each target row shows a bar across the night window (colored by filter), with start→end time. Targets sorted by `best_start_utc`. Also added "Run order (imaging window)" sort option to Targets page.
- [x] **Moon separation live warning** — red banner on Dashboard when the moon is within 20° of any top-5 tonight target. Uses `moon_sep_deg` from nightly_cache already fetched for the target list.
- [x] **Altitude urgency indicator**`list_targets` SQL joins a 90-day peak subquery; computes `urgency` field: `peak` (≥90% of seasonal max), `rising` (7090%, before peak date), `declining` (7090%, after peak date). TargetRow renders ▲ peak / ↗ rising / ↘ declining in matching semantic colors below the common name.
- [x] **Imaging time calculator** — SNR-based sub count estimator added to Filters & Workflow tab. Interactive SNR slider (1050), computes subs needed, total time, sessions needed. Uses IMX571 sensor constants (read noise 3.5e-, dark 0.002e-/px/s), per-filter sky backgrounds, surface_brightness from catalog.
---
## Equipment & Sessions
- [x] **Integration gap detector** — Dashboard card showing targets with data in one narrowband filter but missing the companion (sv220↔c2, uvir↔sv260). Computed via new SQL query in `stats.rs`, surfaced as `integration_gaps` in the stats response, and displayed as a filter-gap card on the Dashboard.
- [x] **Dew heater alarm**`DewAlert.tsx` now triggers a browser `Notification` (requests permission on first alert) when level appears or escalates. Tag `dew-alert` prevents duplicate notifications.
- [x] **Session checklist**`SessionChecklist.tsx` collapsible card on Dashboard with 6 items (polar alignment, focus, guiding, dew heater, battery, cap). State in localStorage keyed by dusk date — auto-resets each evening. Progress bar + "Ready" indicator.
- [x] **Equipment profiles** — Settings page section. localStorage-based profiles showing plate scale, FOV. Current hardcoded AT71+ATR2600C shown as ACTIVE. Add/Edit/Delete UI with live preview of plate scale and FOV.
---
## Post-Processing
- [ ] **PixInsight WBPP project generator** — button on Detail Drawer Tab 3 that generates a `.bat`/`.sh` script or folder structure stub for WBPP. Out of scope for now (requires XISF format knowledge).
---
## Catalog & Discovery
- [x] **Sharpless catalog (Sh2)** — 299 entries from VizieR VII/20 with popular names (Cave, Lion, Dolphin, etc.)
- [x] **Check LdN and VdB implementations** — LDN now fetches 1724 entries from VizieR VII/7A; VdB fetches 158 entries from VizieR VII/21A; `popular_names.rs` verified; `Cl+N` type bug fixed (IC1396 Elephant Trunk now included)
### Additional Catalogue Ingestion
The pipeline already handles NGC, IC, Messier (as NGC cross-refs), Sh2, VdB, LDN. The following need dedicated fetch modules in `catalog/` following the same VizieR TSV pattern used by `sh2.rs` / `ldn.rs`. Each needs: fetch + parse + deduplicate against existing entries (match on RA/Dec within 2) + upsert into `catalog` table + popular names entries in `popular_names.rs`.
- [x] **Caldwell catalogue**`caldwell_num INTEGER` column added via migration; hardcoded map in `caldwell.rs` populates after each catalog upsert. `C20`, `Arp85` prefix search supported. C-number shown in TargetRow (blue, only when no Messier num). Also added `arp_num` column and Arp map.
- [x] **LBN (Lynds Bright Nebulae)**`lbn.rs` fetches VizieR VII/9. Positional dedup against NGC/IC/Sh2 (2' radius). Class field used for emission vs reflection typing. Fallback hardcoded set.
- [x] **GUM catalogue**`gum.rs` fetches VizieR XI/75, Dec filter ≥ -30°. Positional dedup against existing catalog. Hardcoded fallback for VizieR failures.
- [x] **RCW catalogue**`rcw.rs` fetches VizieR VIII/76, Dec filter ≥ -30°. Positional dedup.
- [x] **Barnard catalogue (B)**`barnard.rs` fetches VizieR VII/220A. Positional dedup against LDN. Hardcoded fallback includes B33 (Horsehead), B72 (Snake), B142/143, etc. Popular names wired in.
- [x] **Abell Galaxy Clusters**`abell_gc.rs` fetches VizieR VII/110A. New `galaxy_cluster` type added. TypeBadge shows "ACO", purple badge. Added to Targets filter chips and filter/sv260 suitability. Difficulty 4-5 based on m10 brightness.
- [x] **Abell Planetary Nebulae**`abell_pn.rs` fetches VizieR V/74. Positional dedup. All set difficulty=5, hubble_type="low-SB PN — narrowband only". Prominent fallback set includes Abell 21 (Medusa), Abell 74, etc.
- [x] **Arp catalogue**`arp_num INTEGER` column added via migration, populated from `caldwell.rs` arp_map(). "Arp85" prefix search already supported in `list_targets`. Notable entries include Arp 85=M51, Arp 244=Antennae Galaxies.
- [x] **Melotte catalogue**`melotte_num INTEGER` column added via migration. Hardcoded cross-reference map populates after upsert. Standalone entries added: Mel 20 (Alpha Per), Mel 25 (Hyades), Mel 111 (Coma Star Cluster).
- [x] **Collinder catalogue**`collinder_num INTEGER` column added via migration. Cross-reference map + Cr399 (Brocchi's Coathanger) standalone entry.
- [x] **PGC (Principal Galaxy Catalogue) bright subset** — PGC contains millions of galaxies; ingesting all is impractical. Add only the "bright" subset: PGC objects with `B_Mag < 14.0` not already in NGC/IC. Source: VizieR VII/237. Expect ~5000 new entries. Adds fainter NGC-complement galaxies for completeness. Object type: `galaxy`.
- [x] **"Similar targets nearby" suggestions** — `GET /api/targets/:id/similar` returns same obj_type + constellation within 25° RA. Shown in Overview tab as "Similar Targets Nearby" before Aladin embed.
- [x] **Observation history timeline**`SessionTimeline` on Stats page: sessions grouped by date, thumbnail (or star placeholder), filter pill, integration time, quality chip. Backend `history` field added to `/api/stats`.
---
## Planning & Scheduling
- [x] **Best nights ranking (14-night view)**`/api/calendar/best-nights` endpoint returns 14 nights scored by `moon*0.5 + dark*0.5`. Dashboard card shows date, score bar, moon %, sorted by date (best score highlighted). Top 3 targets per night from nightly_cache.
- [x] **Weather score in target ranking**`list_targets` fetches `go_nogo` from weather_cache and applies a multiplier (go=1.0, marginal=0.7, nogo=0.3) to the composite best-score sort. Defaults to 1.0 when forecast unavailable.
- [x] **Session planning timeline** — "Plan Tonight" mode: user selects an ordered set of targets, each assigned a duration. Renders a Gantt-style timeline (dusk→dawn, x-axis UTC) with color-coded blocks per target showing overlap with that object's visibility window. Warn when a target block extends past its set time. Exportable as a plain-text run order (e.g. "21:45 NGC7000 · 2h → 23:45 IC1805 · 1h30 → …").
- [x] **Monthly highlights**`/api/calendar/monthly-highlights` returns top 8 objects this month (by peak alt, preferring unimaged). Dashboard card shows name, type, peak alt, filter, imaged status.
- [x] **Seasonal peak indicator on target rows** — already implemented as `urgency` field: `▲ peak` (≥90% of seasonal max), `↗ rising`, `↘ declining`. Shown below common name in TargetRow.
---
## Catalogue Completion & Progress
- [x] **Catalogue completion tracker** — Stats page grid: Messier, Sharpless, LDN, VdB, NGC, IC progress bars with keeper counts and 🏆 badge on completion. Backend computes totals dynamically.
- [x] **Beginner-friendly filter** — "Accessible tonight" chip on Targets page: applies min_alt≥40°, usable≥60min server-side, plus difficulty≤2 and moon_sep≥45° client-side.
- [x] **Deep-linkable target URLs** — added `/targets/:targetId` React Router route. URL updates when a drawer is opened; navigating directly to `/targets/NGC7000` pre-opens that drawer and disables the tonight-only filter so the target is always found.
---
## GoTo Mount Integration
- [x] **GoTo coordinates card** — already in Overview tab: RA/Dec with copy buttons, live hour angle, East/West meridian indicator.
- [x] **Slew-order optimizer** — "⟳ Slew-optimized order" toggle in the Run Order card. Nearest-neighbor heuristic on RA/Dec angular distance reorders tonight's targets. Pure frontend, no backend needed.