WorkoutKit ne sait pas exécuter une séance structurée dans une app tierce : son seul point d'exécution public est `WorkoutPlan.openInWorkoutApp()`, qui ouvre l'app Exercice d'Apple. Guider les intervalles du plan coach au poignet impose donc d'écrire la machine à états nous-mêmes. `IntervalEngine` est volontairement pur — aucun HealthKit, aucun timer, aucune horloge interne. Il répond à « où en sommes-nous ? » à partir du temps et de la distance qu'on lui pousse. Le temps de référence est `elapsedTime` du builder, qui exclut déjà les pauses : le moteur n'a rien à savoir de la pause ni de l'auto-pause. Et comme il est une fonction de la suite des ticks, rejouer celle-ci redonne le même déroulé — ce qui rend la reprise après crash triviale. Le point délicat est la dérive. Quand un tick arrive en retard (app suspendue poignet baissé, collecte irrégulière), l'étape suivante démarre à la frontière THÉORIQUE de la précédente, jamais à l'instant du tick. Sinon chaque répétition offre quelques secondes de rab et l'erreur s'accumule : sur un 9×(1'/1'), le décalage final se compte en dizaines de secondes. Pour la même raison `update` boucle au lieu de tester une fois — un tick manqué peut franchir plusieurs étapes courtes d'un coup. 17 tests, dont 5 vérifiés rouges en neutralisant les frontières théoriques. Rien n'est encore câblé : le fichier n'est pas membre de la cible CoachWatch. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
12 KiB
12 KiB