COWORK : les fichiers sont dans la cible, la manip Xcode n'a plus lieu d'être

La note de ce matin demandait un « Add Files » pour IntervalEngine. Les trois
fichiers du chantier sont désormais déclarés dans la cible CoachWatch
directement dans le pbxproj : suivre l'ancienne consigne créerait un doublon.

Ajout de l'ordre de vérification au premier build — la trace dans Santé et la
non-régression de la FC sur /live sont les deux points qui décident si le
chantier tient.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sylvain Bettinelli
2026-08-20 16:36:57 +00:00
parent acbb2c6896
commit eb523ff205

View File

@@ -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`.