02edb0b0f9
Previous thresholds (10 m GPS, 5 m barometric, 30 s MA) were calibrated for raw noisy GPS. Strava-exported FIT files carry elevation already pre-processed by Strava (smooth 1 m quantisation, no steps > 5 m), so the aggressive filtering suppressed real climbing — avg −17 % error across 37 reference activities. New strategy, keyed on source + altitude_source: strava_export → MA 5 s, threshold 1.0 m fit_file / barometric → no MA, threshold 1.5 m fit_file / gps → MA 5 s, threshold 2.0 m unknown non-strava → MA 5 s, threshold 1.5 m Result on 37 cross-referenced activities: avg −2.8 %, std 4.6 %, 37/37 within ±15 % (was 0/37). Both paths — initial import (metrics._elevation) and bulk recalculate (dem.recalculate_elevation_hysteresis) — now use the same elevation_params() function from metrics.py.