c514626a62
test: coverage round 3 (83.96% → 84.39%) + 10 new property tests
...
64 unit tests + 10 property tests across three parallel agents.
- ContactLive.Show round 3 (72% → ~80%): enrichment failure
surfaces (terrain/iemre/weather :failed, hrrr :unavailable NARR
fallback), radar-only mechanism, load_solar + enqueue_missing_solar
paths, blocked_message nil obs_dist, band_summary for 144M/1296M/
2304M/47G/75G, admin edit no-op, mode changes, fetch_queue_counts
with seeded Oban jobs. Properties: propagation_mechanism summary is
always a binary, obs_sort_key totality over arbitrary field keys.
- Weather clients: iem_client transport timeouts + CSV edge cases,
rtma_client idx url property, swpc_client HTTP 503/404 + empty-
array parses + JSON/CSV totality properties, ncei_metar_client
parse edge cases, snmp_client OID-roundtrip property + parse
edge cases.
- Mid-coverage LiveViews: UserProfileLive avatar/render branches,
EmeLive invalid-grid/unknown-callsign + form-validation property,
PathLive zero-distance + 3000km + height/power round-trip property,
BeaconLive numeric bearing + non-admin approve denied, MapLive
select_band/toggle_radar/toggle_grid events + band-URL property.
Fix: propagation_mechanism property test uses System.unique_integer
for lat + valid_time nonces instead of StreamData-shrinkable jitter;
the shrink toward 0 was tripping the hrrr_profiles unique index.
205 → 215 properties, 2743 → 2812 tests, 0 failures.
2026-04-24 10:15:37 -05:00
56e6a3513c
test: cover METAR field extractors and Scorer.path_integrated_conditions
...
- NceiMetarClient: wind-group parsing (VVVKKKT), missing-wind-group
fallback to nil, multi-layer sky condition concat, missing-sky token
returns nil, missing altimeter returns nil, T-group-less fallback to
the coarse "TT/DD" field.
- Scorer.path_integrated_conditions/2: averages surface temp/dew,
takes MIN of pressure + refractivity gradient, takes AVG of HPBL +
PWAT, threads contact time+longitude, and propagates -97.0 longitude
when pos1 lacks a lon key. Returns nil when every profile is missing
surface temp OR dewpoint; returns nil on empty-list input;
tolerates nil pressure / gradient / HPBL / PWAT when temp + dew
are present.
Suite: 2,409 tests + 159 properties (was 2,397 + 159); credo strict
clean.
2026-04-23 14:13:42 -05:00
e7a7ae073d
Phase 9.3, 9.4, and Phase 3 NEXRAD pipeline
...
Task 9.3 - Weight recalibration via gradient descent:
- Recalibrator module fits logistic regression weights using Nx
- Trains on QSO positives vs random baseline negatives
- Cross-validates by month, normalizes weights to sum to 1.0
- Mix task: mix recalibrate_scorer --sample 5000 --epochs 2000
Task 9.4 - Side-by-side scorer comparison:
- ScorerDiff.compare/3 re-scores grid with old vs new weights
- Reports mean diff, regressions, improvements, per-band breakdown
- Mix task: mix scorer_diff --new-weights '{...}'
Phase 3 - NEXRAD ingestion pipeline:
- NexradClient fetches IEM n0q composite PNGs, extracts per-point
box statistics (mean/max dBZ, texture variance)
- NexradObservation schema with unique (lat, lon, observed_at)
- NexradWorker on :nexrad queue for background processing
- nexrad_texture backtest feature in Features module
- mix nexrad_backfill --limit 200
All tasks added to AdminTaskWorker and Release for production use.
1116 tests, 0 failures.
2026-04-10 12:48:36 -05:00