prop/test/microwaveprop/propagation
Graham McIntire a14f14485e
perf(weather): serve /weather from chunked scalar artifacts
Move the /weather render path off raw HRRR profile decoding + per-cell
SoundingParams + WeatherLayers derivation. The dominant cost was
re-deriving the same scalar fields on every viewport pan and timeline
scrub.

Server side:

- New Microwaveprop.Weather.ScalarFile persists pre-derived scalar
  rows on NFS, bucketed into 5°×5° chunk files under
  <base>/weather_scalars/<iso>/<lat_band>_<lon_band>.etf.gz. Viewport
  reads only decode the chunks that overlap the requested bounds;
  point-detail clicks read exactly one chunk.
- weather_grid_at/2 and weather_point_detail/3 prefer ScalarFile;
  ProfilesFile is now the cold-start fallback only.
- warm_grid_cache_and_broadcast/1 and warm_grid_cache_from_latest_profile/0
  also persist the scalar artifact, and the cold-derive path kicks
  off a per-valid_time-locked async materialization so the next
  reader gets the cheap path.
- NotifyListener.handle_propagation_ready/1 fires
  Weather.materialize_scalar_file/1 in a detached Task on the Rust
  pipeline's NOTIFY propagation_ready, so steady-state forecast hours
  arrive with their scalar artifact already on disk.
- available_weather_valid_times/0 unions ScalarFile + ProfilesFile so
  the timeline survives an aggressive retention sweep on either side.

Browser side (finding #8):

- Mount the legend Leaflet control once and patch its inner content
  on layer changes instead of remove + re-add on every renderLayer.
- renderTimeline now keys off the rendered button set: selection-only
  updates take an applyTimelineSelection patch path that restyles
  existing buttons in place. Full innerHTML rebuild only fires when
  timelineData itself changes.

Also fixes a credo nesting-depth flag in tile_renderer.ex by extracting
interpolate_pair/2 from the inner anonymous function.
2026-04-28 17:15:36 -05:00
..
band_config_property_test.exs test(property): add property tests for propagation scoring + CIDR matcher 2026-04-21 13:57:12 -05:00
band_config_test.exs chore(scorer): apply recalibrated factor weights from gradient descent fit 2026-04-28 14:41:50 -05:00
calibration_test.exs feat(ml): add prop.compare task for algorithm-vs-ML-vs-reality calibration 2026-04-28 14:38:02 -05:00
common_volume_test.exs feat(rainscatter): classify QSO propagation mechanism from common-volume radar 2026-04-17 15:57:59 -05:00
duct_property_test.exs test: coverage round 2 (82.05% → 83.96%) + 23 new property tests 2026-04-24 10:15:37 -05:00
duct_test.exs test: coverage round 2 (82.05% → 83.96%) + 23 new property tests 2026-04-24 10:15:37 -05:00
eme_test.exs feat(eme): add /eme Earth-Moon-Earth calculator 2026-04-23 16:18:20 -05:00
freshness_monitor_test.exs fix(propagation): dedup PropagationGridWorker enqueues 2026-04-16 14:58:55 -05:00
grid_task_enqueuer_test.exs fix(grid-tasks): reclaim orphan running rows on hourly seed 2026-04-23 12:57:39 -05:00
grid_test.exs fix(enrichment): mark OCONUS contacts hrrr_status :unavailable 2026-04-23 14:19:23 -05:00
hf_muf_test.exs HfMuf physics: distance-adjusted MUF from GIRO MUFD(3000) 2026-04-15 14:59:39 -05:00
inversion_test.exs Phase 2 tasks 2.1-2.4: BL turbulence feature computations 2026-04-10 08:21:23 -05:00
mechanism_classifier_test.exs feat(propagation): per-contact mechanism classification 2026-04-18 10:42:08 -05:00
mode_thresholds_test.exs feat(rover): add ModeThresholds for SSB/CW/Q65 SNR table 2026-04-25 15:59:52 -05:00
model_test.exs feat(ml): retrain propagation model and add per-prediction explainability 2026-04-28 14:14:22 -05:00
notify_listener_test.exs perf(weather): serve /weather from chunked scalar artifacts 2026-04-28 17:15:36 -05:00
pipeline_status_test.exs feat(map): shareable URL params for view/band/time 2026-04-19 08:53:07 -05:00
profiles_file_test.exs test: expand coverage and refactor to idiomatic style 2026-04-23 13:28:42 -05:00
rain_scatter_classifier_test.exs feat(rainscatter): classify QSO propagation mechanism from common-volume radar 2026-04-17 15:57:59 -05:00
rain_scatter_test.exs test: cover propagation/rain_scatter 2026-04-16 14:09:44 -05:00
recalibrator_test.exs feat(propagation): per-band weight calibration from full-corpus correlation 2026-04-18 10:19:26 -05:00
region_test.exs fix: April 2026 codebase review — address 13 bugs across propagation chain 2026-04-25 10:52:51 -05:00
score_cache_test.exs perf(prop): cap ScoreCache LRU + drop eager warmers to fix hot-pod OOMs 2026-04-24 18:49:36 -05:00
scorer_property_test.exs test: add /qsos→/contacts redirect + scorer conversion properties 2026-04-23 14:03:02 -05:00
scorer_test.exs feat(scorer): retire HPBL multiplier and native-duct 1.15× boost 2026-04-25 12:42:56 -05:00
scores_file_property_test.exs test(property): add property tests for propagation scoring + CIDR matcher 2026-04-21 13:57:12 -05:00
scores_file_test.exs fix(map): dedupe duplicated forecast-timeline chips + extract Mechanism helpers 2026-04-21 17:21:11 -05:00
sporadic_e_test.exs Add 50/144/222 MHz bands, rename 440→432 2026-04-16 12:36:10 -05:00