diff --git a/COWORK.md b/COWORK.md index e1f58d9..6a537a5 100644 --- a/COWORK.md +++ b/COWORK.md @@ -154,11 +154,19 @@ pour décoder du JSON venant du serveur. ### Les trois couches, dans l'ordre -1. **Serveur (Python, testable sans Mac)** — une route rendant la séance du - jour au format `CoachSessionPlan`, en réutilisant `_blocks_from_session` et - `app.current_zones()` (règle 9 du CLAUDE.md : jamais un % de FCmax - générique). ✅ Commencer par là : le JSON se juge dans un navigateur avant - qu'une ligne de Swift n'en dépende. +1. ✅ **Serveur — FAIT le 2026-08-21** (`coach_sportif` `c8d1541`, déployé et + vérifié en prod). **`GET /api/plan/session[?date=YYYY-MM-DD][&type=...]`** + rend la séance dépliée au format `CoachSessionPlan` : clés snake_case, + `hr_zone` en entier, durées en secondes. Mesuré en prod le 21/08 sur la + séance du jour (CDC J13, 15×(1'/1')) : **32 étapes, 40 min**, alternance + `work`/`recovery` correcte, bornes Z1 100-109 / Z2 109-118. + - Les bornes BPM viennent des **zones datées** (`current_zones`), jamais des + `hr_min`/`hr_max` du plan (hérités d'avant l'unification du 12/08). + - Les `repeat` sont **dépliés** — le moteur ne sait pas répéter. + - `404` = pas de séance ce jour · `422` = séance non chronométrée (repos, + durée ouverte) : rien à dérouler, à distinguer côté montre. + - ⚠️ Route volontairement **hors `/api/v1/*`** (JWT que la WebView n'a pas). + Un test le verrouille : ne pas la « ranger » dans l'API native. 2. **iPhone** — pousser ce plan vers la montre par `WCSession`, à côté de ce qui part déjà. 3. **Montre** — `ConnectivityManager` publie un `sessionPlan` ; une vue appelle