COWORK : la couche serveur du plan de séance est livrée

GET /api/plan/session (coach_sportif c8d1541) rend la séance du jour au format
CoachSessionPlan, déployé et vérifié en prod le 21/08 : 32 étapes / 40 min sur
le 15×(1'/1') du jour, alternance work/recovery correcte, bornes issues des
zones datées.

Reste les couches 2 (pousser le plan par WCSession) et 3 (la vue qui appelle
engine.update et joue l'haptique sur les transitions).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Sylvain Bettinelli
2026-08-21 09:11:31 +00:00
parent 891a8bddce
commit 2f2d7696fa

View File

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