diff --git a/COWORK.md b/COWORK.md index a425151..df70c25 100644 --- a/COWORK.md +++ b/COWORK.md @@ -76,10 +76,11 @@ ouvrait Safari**, où le cookie d'auth injecté dans la WKWebView n'existe pas : `CoachLiveView` s'ouvre d'elle-même (le JS de `/live` appelle `openNativeLive`). C'est le point d'entrée qui manquait. -## 🆕 Moteur d'intervalles (2026-08-20, dev — non câblé, non compilé) +## 🆕 Chantier montre outdoor (2026-08-20, dev — non compilé) -Branche **`feat/watch-outdoor`** (poussée sur Gitea le 2026-08-20), commit -`f2fa3cc`. `IntervalEngine` guide les intervalles d'une séance au poignet. +Branche **`feat/watch-outdoor`**, commits `f2fa3cc` (moteur d'intervalles) et +`a04dfc4` (trace GPS). `IntervalEngine` guide les intervalles d'une séance au +poignet ; `RouteFilter` + `LocationTracker` enregistrent le parcours. **Pourquoi ce code existe** : WorkoutKit ne sait pas exécuter une séance structurée dans une app tierce — son seul point d'exécution public est @@ -91,22 +92,42 @@ horloge interne. Il répond à « où en sommes-nous ? » à partir du temps et distance qu'on lui pousse. Le temps de référence est `elapsedTime` du builder, qui exclut déjà les pauses. -✅ **42 tests Swift verts sur Linux** (`./tests-linux/run.sh`, toolchain -`~/workspace/toolchains/bin`), dont les 17 d'`IntervalEngine`. La logique est -donc validée — ce qui reste est l'intégration, que Linux ne peut pas compiler. +✅ **57 tests Swift verts sur Linux** (`./tests-linux/run.sh`, toolchain +`~/workspace/toolchains/bin`) : 17 pour `IntervalEngine`, 15 pour `RouteFilter`. +Les deux ont été **vérifiés rouges** en neutralisant leur correction (5 échecs +sans les frontières théoriques du moteur, 4 sans le lissage du dénivelé). La +logique est donc validée — reste l'intégration, que Linux ne peut pas compiler. -⚠️ **ÉTAPE MAC OBLIGATOIRE — le fichier n'est PAS dans le projet Xcode.** -Vérifié le 2026-08-20 : `grep -c "IntervalEngine" ios/App/App.xcodeproj/project.pbxproj` -rend **0**. Xcode l'ignore donc totalement, et **ça compile très bien sans lui** — -même piège que `VmaTestView.swift`. À faire : +✅ **Plus d'« Add Files » à faire** — correction du 2026-08-20 après-midi. Une +note antérieure de ce fichier annonçait `IntervalEngine` absent du projet : ce +n'est plus vrai. Les **trois** fichiers sont déclarés dans la cible `CoachWatch` +directement dans le `pbxproj` (sauvegarde `project.pbxproj.bak-outdoor`). -1. `cp ios/App/App.xcodeproj/project.pbxproj ios/App/App.xcodeproj/project.pbxproj.bak-interval` -2. Clic droit sur le dossier **CoachWatch** → *Add Files to "App"…* → - `ios/App/CoachWatch/IntervalEngine.swift` - — **décocher** « Copy items if needed », **cocher la cible `CoachWatch`**. -3. Contrôle : `grep -c "IntervalEngine.swift in Sources" ios/App/App.xcodeproj/project.pbxproj` - doit rendre **1**. -4. Commit + push du `pbxproj` immédiatement (règle 3 de ce fichier). +Contrôle avant de builder — chacun doit rendre **2** (déclaration + phase de +compilation, soit 1 cible) : +```bash +for f in IntervalEngine RouteFilter LocationTracker; do + echo "$f: $(grep -c "$f.swift in Sources" ios/App/App.xcodeproj/project.pbxproj)" +done +``` + +⚠️ **À vérifier au premier build, dans cet ordre** : +1. **Une séance extérieure demande la localisation** (feuille « lorsque l'app + est active »). Si rien n'apparaît, la trace ne partira pas. +2. **La sortie a bien un parcours dans Santé** à la fin. C'est le test qui + compte : `finishRoute` doit être appelé APRÈS `finishWorkout`, sinon la + trace existe sans être associée à la séance. +3. **La FC remonte toujours sur `/live`** — `WorkoutManager` a été modifié, + c'est le test de non-régression prioritaire. +4. Écran éteint, poignet baissé : les positions continuent d'arriver. Si elles + s'arrêtent, chercher du côté du CPU (une boucle d'affichage trop rapide fait + suspendre l'app), pas du côté des autorisations. + +⚠️ `Info.plist` de `CoachWatch` gagne `UIBackgroundModes = [location]` et +`NSLocationWhenInUseUsageDescription`. **La clé de background est vitale** : +armer `allowsBackgroundLocationUpdates` sans elle termine l'app. Un garde-fou +la vérifie au démarrage, mais si elle disparaissait du build, le suivi +retomberait silencieusement au premier plan seul. ## 👉 À reprendre - ✅ **Phase 4 login — FAIT & DÉPLOYÉ** (révocation Apple à la suppression de compte) : code complet côté backend `coach_sportif` (commit `5ae6e2d`) + clé `.p8` déployée sur le VPS prod (vérifié 2026-06-26). Rien à coder. Détails : `coach_sportif/COWORK.md`.