From 2f2d7696fa8c523ee3633bf0b08c70d4f2bf4411 Mon Sep 17 00:00:00 2001 From: Sylvain Bettinelli Date: Fri, 21 Aug 2026 09:11:31 +0000 Subject: [PATCH] =?UTF-8?q?COWORK=20:=20la=20couche=20serveur=20du=20plan?= =?UTF-8?q?=20de=20s=C3=A9ance=20est=20livr=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- COWORK.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) 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