Lazy materialize-on-first-read analysis for recorded routes:
New recorded-route-analysis companion collection (AnalysisJson + AnalysisVersion, RouteId unique, owner field); recompute on read when version stale; DELETE removes it.
Pure static RouteAnalyzer: outlier rejection (acc>50m, 42 m/s cap, 3×-median spike) → smoothed position-derived speeds → rest detection (<0.5 m/s ≥20s + "paused" rests at segment gaps ≥5s) → walk/run/rest classification (2.3/1.9 m/s hysteresis, 10s debounce) → per-km splits → elevation gain/loss (median smoothing + 2m hysteresis) → fastest/slowest 500m sections → downsampled ghost track (≤1000 samples of cumulativeDistance/movingTime/elapsed parallel arrays for client-side ghost racing).
GET /api/recorded-routes/{id}/analysis → RouteAnalysisDto (canonical for iOS/web; index ranges = inclusive indices into upload-order points array).
Additive Segment int on RecordedGpsPointDto (default 0) + validator rules, so iOS stops flattening pause segments off the wire. RouteStatsCalculator formulas untouched (fixture parity).
Never log coordinates (existing domain privacy rule).
Part of epic #983.
Lazy materialize-on-first-read analysis for recorded routes:
- New `recorded-route-analysis` companion collection (AnalysisJson + AnalysisVersion, RouteId unique, owner field); recompute on read when version stale; DELETE removes it.
- Pure static `RouteAnalyzer`: outlier rejection (acc>50m, 42 m/s cap, 3×-median spike) → smoothed position-derived speeds → rest detection (<0.5 m/s ≥20s + "paused" rests at segment gaps ≥5s) → walk/run/rest classification (2.3/1.9 m/s hysteresis, 10s debounce) → per-km splits → elevation gain/loss (median smoothing + 2m hysteresis) → fastest/slowest 500m sections → downsampled ghost track (≤1000 samples of cumulativeDistance/movingTime/elapsed parallel arrays for client-side ghost racing).
- `GET /api/recorded-routes/{id}/analysis` → `RouteAnalysisDto` (canonical for iOS/web; index ranges = inclusive indices into upload-order points array).
- Additive `Segment` int on `RecordedGpsPointDto` (default 0) + validator rules, so iOS stops flattening pause segments off the wire. `RouteStatsCalculator` formulas untouched (fixture parity).
- Never log coordinates (existing domain privacy rule).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Part of epic #983.
Lazy materialize-on-first-read analysis for recorded routes:
recorded-route-analysiscompanion collection (AnalysisJson + AnalysisVersion, RouteId unique, owner field); recompute on read when version stale; DELETE removes it.RouteAnalyzer: outlier rejection (acc>50m, 42 m/s cap, 3×-median spike) → smoothed position-derived speeds → rest detection (<0.5 m/s ≥20s + "paused" rests at segment gaps ≥5s) → walk/run/rest classification (2.3/1.9 m/s hysteresis, 10s debounce) → per-km splits → elevation gain/loss (median smoothing + 2m hysteresis) → fastest/slowest 500m sections → downsampled ghost track (≤1000 samples of cumulativeDistance/movingTime/elapsed parallel arrays for client-side ghost racing).GET /api/recorded-routes/{id}/analysis→RouteAnalysisDto(canonical for iOS/web; index ranges = inclusive indices into upload-order points array).Segmentint onRecordedGpsPointDto(default 0) + validator rules, so iOS stops flattening pause segments off the wire.RouteStatsCalculatorformulas untouched (fixture parity).Resolved in spikersoft-backend PR #526 (merged to
master). RouteAnalyzer + lazily-materializedGET /api/recorded-routes/{id}/analysis(versionedrecorded-route-analysiscollection), additivesegmentwire field + validator rules, delete-handler cleanup. Full solution build clean; Business/API/Data suites green (10,987 tests incl. the 13-scenario analyzer matrix). Closing.