- `HeartRateZones` porte `clinicalTargetBpm` et `isUseful(bpm:)`. Sous bêtabloquant, le repère utile n'est PAS le bas de Z4 mais HRKarv0,60 (Díaz-Buschmann 2014, ESC : la Karvonen standard sous-évalue le seuil chez le patient traité). Un sceau vert l'indique sous la plage, et VoiceOver le dit — une icône seule ne suffit pas. - Z1 passe de `.blue` à `.cyan` : `CoachLiveView` (iPhone) utilise déjà cyan. Le même effort doit avoir la même teinte sur les deux écrans de la même app ; j'avais introduit la divergence en écrivant le modèle sans regarder l'existant. - Deux `#Preview` avec les zones RÉELLES de production (Z1 100-109 … Z5 134-143) : les cinq états d'un coup, plus le cas « zones inconnues ». 109 bpm y figure exprès — c'est le plancher de Z2, il vérifie la règle du chevauchement d'un battement. ⚠️ `CoachLiveView.CardiacZones` reste une SECONDE implémentation de la même règle, avec sa propre table de zones. Non fusionnée ici pour ne pas mélanger deux chantiers ; c'est le même motif que les deux traductions WorkoutKit divergentes corrigées ce matin. ⚠️ NON COMPILÉ — build Xcode requis.
11 KiB
11 KiB