prop/test/microwaveprop
Graham McIntire 48000b0dca
feat(pskr): weekly recalibration analysis on the calibration corpus
`Pskr.Recalibrator.run/0` reads `pskr_calibration_samples`, bins
each sample per (band × feature), and writes spot-density stats to
`pskr_feature_bins` so an operator can read whether a feature
actually discriminates propagation at the threshold granularity
the scorer uses.

Bins, not regression: `BandConfig` already encodes scoring as
discrete thresholds, so the bin output matches that shape and an
operator can copy adjusted thresholds directly without translating
from regression coefficients.

Self-healing: corpus too thin ⇒ run row written with status
`skipped_insufficient_data` and the analysis is a no-op until next
fire. `min_total_samples = 1000` (≈ 4-5 days of CONUS PSKR
activity); per-band threshold is 100. Both surface in the run row's
`notes`.

Auto-applies nothing. Weight changes still go through human review
of `BandConfig.@band_configs` and a code commit. The recalibrator
is a read-only analyst that stays out of the production scoring
path.

Features binned (matching the scorer's discriminating fields):
  * pwat_mm — humidity U-shape candidate
  * hpbl_m — boundary layer (mechanism vs scoring re-eval)
  * min_refractivity_gradient — refractivity threshold validation
  * surface_pressure_mb — pressure-front proxy
  * kp_index — aurora boost magnitude tuning

Schema: two tables.
  * `pskr_recalibration_runs` — one row per fire with corpus
    stats, status, notes
  * `pskr_feature_bins` — one row per (run, band, feature, bin)
    with sample_count, spot_count_total/avg/p50/p90

Cron: `0 4 * * 0` (Sundays 04:00 UTC, off-peak, post-climatology).
Manual reruns enqueue with no args.

Tests cover the empty-corpus skip path, sub-threshold totals,
per-band threshold gating, the actual bin emission, nil-feature
handling, spot-count averaging, and the always-records-a-run
audit invariant. 8 new tests, 3282 total passing.

Backfill pipeline untouched.
2026-05-04 16:18:17 -05:00
..
accounts feat(accounts): derive 10-char home_grid from explicit lat/lon 2026-04-25 17:04:45 -05:00
aprs fix(aprs): tighten PathParser self-loop check and Q-construct regex 2026-05-01 12:40:17 -05:00
backtest test: expand coverage and refactor to idiomatic style 2026-04-23 13:28:42 -05:00
beacons test: cover beacons/beacon schema 2026-04-16 14:09:45 -05:00
buildings feat(buildings): integrate MS footprints into path clearance + map render 2026-04-26 10:44:46 -05:00
commercial test: coverage round 4 (84.39% → 84.44%) + 6 new property tests 2026-04-24 10:32:05 -05:00
ionosphere fix(ionosphere): disable TLS verify for GIRO to unbreak ionosonde fetch 2026-04-22 09:49:03 -05:00
propagation feat(scoring): aurora boost on VHF/low-UHF during geomagnetic storms 2026-05-04 16:02:49 -05:00
pskr feat(pskr): weekly recalibration analysis on the calibration corpus 2026-05-04 16:18:17 -05:00
qrz test: cover qrz/client 2026-04-16 14:10:50 -05:00
radio feat(import): strip non-printables from CSV/ADIF uploads 2026-04-26 15:34:46 -05:00
rover refactor(rover-locations): rename status atoms ideal→good, off_limits→bad 2026-05-03 11:13:18 -05:00
space_weather chore: delete dead RTMA + METAR5 code paths 2026-05-04 15:09:19 -05:00
terrain test: coverage round 4 (84.39% → 84.44%) + 6 new property tests 2026-04-24 10:32:05 -05:00
weather chore: delete dead RTMA + METAR5 code paths 2026-05-04 15:09:19 -05:00
workers feat(pskr): weekly recalibration analysis on the calibration corpus 2026-05-04 16:18:17 -05:00
accounts_test.exs feat(auth): self-service password reset 2026-04-18 08:42:35 -05:00
application_test.exs perf(concurrency): partition Task.Supervisor to remove bottleneck on heavy async_stream paths 2026-04-21 14:20:29 -05:00
aprs_test.exs feat(aprs): add Aprs context for read-only queries against aprs.me 2026-05-01 12:47:35 -05:00
backtest_test.exs Phase 9.1: Consolidated backtest report and contest log import 2026-04-10 11:57:15 -05:00
beacon_monitors_test.exs hardening: Rust worker circuit-breaker + delete wall-clock sleep from beacon test 2026-04-21 18:02:46 -05:00
beacons_test.exs User profiles at /u/:callsign, flexible band input, assorted UX cleanup 2026-04-12 16:13:08 -05:00
cache_test.exs fix(cache): add periodic TTL sweeper to bound ETS growth 2026-04-21 13:19:53 -05:00
callsign_location_test.exs Drop gridmap.org dependency, resolve callsigns locally 2026-04-12 17:43:29 -05:00
canopy_test.exs feat(canopy): add tree-canopy height layer for path obstruction analysis 2026-04-26 12:51:48 -05:00
commercial_test.exs Wire NEXRAD, native ducts, and commercial links into scoring 2026-04-13 12:08:15 -05:00
format_property_test.exs test: cover Format.number/bytes, Instrument.span, SolarClient edges 2026-04-23 14:09:13 -05:00
format_test.exs feat(format): miles-primary distance formatting sitewide 2026-04-18 15:53:40 -05:00
geo_property_test.exs test(property): add property tests for terrain + atmospheric math 2026-04-21 13:56:39 -05:00
geo_test.exs test: cover geo, qrz record, callsign client 2026-04-16 14:09:44 -05:00
geocoder_test.exs Drop gridmap.org dependency, resolve callsigns locally 2026-04-12 17:43:29 -05:00
instrument_test.exs test: cover Format.number/bytes, Instrument.span, SolarClient edges 2026-04-23 14:09:13 -05:00
logger_format_test.exs test: silence expected warnings/errors during test runs 2026-04-24 09:27:17 -05:00
markdown_test.exs Add Tier 1 test coverage: EnrichmentStatus, Markdown, health, RemoteIp, Maidenhead 2026-04-06 10:15:38 -05:00
moon_test.exs feat(eme): add /eme Earth-Moon-Earth calculator 2026-04-23 16:18:20 -05:00
oban_error_reporter_test.exs feat(observability): attach Oban exception telemetry tap 2026-04-21 14:13:53 -05:00
propagation_test.exs feat(scoring): aurora boost on VHF/low-UHF during geomagnetic storms 2026-05-04 16:02:49 -05:00
pskr_test.exs feat(pskr): preserve full locator precision from MQTT spots 2026-05-04 12:42:46 -05:00
qrz_test.exs Drop gridmap.org dependency, resolve callsigns locally 2026-04-12 17:43:29 -05:00
radio_refinement_test.exs CSV/ADIF import: upsert existing contacts on grid/mode refinement 2026-04-16 10:57:37 -05:00
radio_test.exs fix: April 2026 codebase review — address 13 bugs across propagation chain 2026-04-25 10:52:51 -05:00
release_test.exs test: push line coverage from 71.7% → 78.67% 2026-04-23 18:43:18 -05:00
repo_listener_test.exs test: cover repo_listener 2026-04-16 14:58:55 -05:00
rover_planning_test.exs feat(rover-planning): multi-band missions + smart reconcile 2026-05-03 14:08:49 -05:00
rover_test.exs feat(rover): user-scoped FixedStation context with ownership guard 2026-04-25 16:26:33 -05:00
terrain_test.exs Rename qsos table to contacts, qso_id to contact_id 2026-04-02 15:52:19 -05:00
weather_extra_test.exs chore: delete dead RTMA + METAR5 code paths 2026-05-04 15:09:19 -05:00
weather_grid_test.exs perf(weather): cache forecast-hour grids in GridCache to skip ScalarFile decode 2026-04-29 13:10:12 -05:00
weather_test.exs fix: April 2026 codebase review — address 13 bugs across propagation chain 2026-04-25 10:52:51 -05:00