diff --git a/ios/App/CoachWatch/LocationTracker.swift b/ios/App/CoachWatch/LocationTracker.swift index a5d255e..3c1af90 100644 --- a/ios/App/CoachWatch/LocationTracker.swift +++ b/ios/App/CoachWatch/LocationTracker.swift @@ -142,9 +142,21 @@ final class LocationTracker: NSObject, ObservableObject { guard isTracking else { return } isPaused = paused if paused { - // Le point qui suivra la reprise serait à des centaines de mètres : - // on repart d'une origine neuve pour ne pas tracer la pause. - pendingRoute.removeAll() + // ⚠️ Ici se jouait une perte silencieuse. `pendingRoute` ne contient + // que des points DÉJÀ acceptés par le filtre et DÉJÀ comptés dans + // `distanceMeters` — ils attendent seulement leur écriture, qui ne + // part qu'au seuil de `routeFlushThreshold` (25). À 1 Hz, c'est une + // douzaine de points en moyenne, jusqu'à 24. Les jeter creusait un + // écart visible entre la distance affichée et la trace enregistrée : + // six arrêts sur une sortie, et jusqu'à 144 points manquaient à la + // HKWorkoutRoute, avec un D+ recalculé qui divergeait d'autant. + // + // On les écrit donc au lieu de les perdre. Le raisonnement du + // commentaire d'origine visait le point qui SUIT la reprise, à des + // centaines de mètres de là — mais celui-là n'est pas encore dans + // le tampon, et c'est `implausibleSpeed` qui l'écarte. Nettoyer la + // pause est l'affaire du filtre, pas du tampon d'écriture. + Task { await flushPendingRoute() } } }