← RETOUR DASHBOARD
__ _____ ___ _ ___ _ ___ ___ ___ ___
\ \ / / _ \| _ \| |/ / || |/ _ \| _ \/ __|| __|
\ \/\/ /| (_) | /| ' <| __ | (_) | /\__ \| _|
\_/\_/ \___/|_|_\|_|\_\_||_|\___/|_|_\|___/|___|
> METHODOLOGY — CHOIX PHYSIOLOGIQUES
Ce document recense les choix physiologiques et d'entraînement du système, avec leurs fondements scientifiques et leurs limites.
Chaque bloc CHOIX explique la décision retenue.
Chaque bloc LIMITE expose les réserves et les cas où le modèle peut diverger de la réalité.
1. Pipeline complet — Vue d'ensemble (10 étapes)
Le système fonctionne en 10 étapes enchaînées, du signal physiologique brut jusqu'à la séance synchronisée dans intervals.icu. Chaque étape produit des sorties consommées par l'étape suivante.
| # | Étape | Module(s) | Entrée | Sortie | Réf. |
| 1 | Ingestion wellness/activités | wellness.py, activity_fetcher.py | API intervals.icu | records 60j, CTL/ATL/TSB, découplage | §4 |
| 2 | Readiness quotidien Couzens | couzens.py | HRV, RHR, sommeil, TSB, ressenti | score 0-100, GO/ADJUST/REST | §4.2 |
| 3 | Tendance readiness multi-jours | training_plan.py | pentes 7j des 5 signaux | multiplicateur 0.70-1.15, ABSORB/MAINTAIN/PUSH | §4.3 |
| 4 | Budget TSS 10j | training_plan.py | CTL, ramp rate, multiplicateur | TSS maintien/max/reco | §3 |
| 5 | Gap analysis (advisory) | gap_analysis.py | état actuel vs cibles course | 7 dimensions, recommandations | §11 |
| 6 | Forge des séances | workout_forge.py | sport, type, shape, readiness, multiplicateur | workout intervals.icu + prescription CHO intra | §15, §10.4 |
| 7 | Dégradation par readiness | plan_adjustment.py + forge | shape × (ADJUST/REST/multiplicateur) | shape dégradé (none/soft/hard) | §15 |
| 8 | Grille calendrier 10j + solveur | memory.py::grid_slots | séances forgées + trajectoire glycogène | SQLite grid_slots + warnings | §10.6 |
| 9 | Modèle énergétique / glycogène | energy.py, glycogen.py, app.js | dépense watts − CHO intra absorbé | stock glycogène, cibles macro | §10 |
| 10 | Sync intervals.icu | intervals_sync.py | grid | POST /athlete/events | §16 |
CHOIX : Pipeline séquentiel et déterministe. Aucune étape de décision n'appelle Claude — l'IA n'intervient qu'en journal et en post-session advisory, jamais dans la boucle de planification elle-même. Justification : reproductibilité, auditabilité, coût/latence négligeables pour les décisions répétitives.
LIMITE : Le pipeline est strictement descendant. Les étapes 6-10 ne rebouclent pas vers l'ingestion — si une séance est manuellement modifiée dans intervals.icu, le système le voit uniquement au prochain cycle d'ingestion (J+1). Pas de sync bidirectionnelle temps réel.
2. Distribution d'intensité — Temps en zone
Le système répartit le temps d'entraînement hebdomadaire entre les zones d'intensité selon un modèle pyramidal : beaucoup de Z1/Z2, moins de Z3, peu de Z4, très peu de Z5. La base de calcul est le temps passé dans chaque zone, pas le TSS ni le nombre de séances.
| Phase | Z1/Z2 | Z3 (Tempo) | Z4 (Seuil) | Z5 (VO2) | Modèle |
| TRANSITION | 100% | 0% | 0% | 0% | Récupération pure |
| BASE | 80% | 15% | 5% | 0% | Pyramidal classique |
| BUILD 1 | 75% | 20% | 5% | 0% | Pyramidal intensifié |
| BUILD 2 | 75% | 15% | 5% | 5% | Spécificité Ironman + rappel VO2 |
| PEAK | 80% | 10% | 5% | 5% | Taper — volume réduit, intensité maintenue |
Seiler K.S. (2010). Int J Sports Physiol Perform, 5(3), 276-291.
Stöggl T. & Sperlich B. (2014). Front Physiol, 5:33.
Esteve-Lanao J. et al. (2005). J Strength Cond Res, 19(4), 799-806.
CHOIX : Pyramidal plutôt que polarisé pur (80/0/20). Pour le triathlon longue distance, la zone Z3 (tempo/allure Ironman) a une valeur fonctionnelle directe — c'est l'allure de course.
LIMITE : Les études Stöggl/Seiler portent sur des sports cycliques purs et des durées courtes. Le transfert à l'Ironman (9-14h de course) est une extrapolation.
3. Modèle de charge — Banister Impulse-Response
Le système utilise le modèle classique CTL/ATL/TSB (Fitness/Fatigue/Form) avec les constantes de temps standard. Les valeurs de CTL/ATL proviennent directement d'intervals.icu (source de vérité) et ne sont pas recalculées localement.
| Paramètre | Valeur | Signification |
| CTL τ | 42 jours | Constante de fitness (moyenne exponentielle, Banister) |
| ATL τ | 7 jours | Constante de fatigue (moyenne exponentielle) |
| TSB | CTL - ATL | Balance de forme (négatif = fatigué) |
| Ramp rate <12 sem. | 4.0 TSS/jour | Progression agressive en phase BUILD |
| Ramp rate ≥12 sem. | 2.5 TSS/jour | Progression conservatrice en phase BASE |
Note importante sur les fenêtres temporelles :
Ne pas confondre CTL τ = 42j (constante Banister, inchangée) avec la fenêtre de baseline HRV/RHR = 60 jours (§4.1, Altini HRV4Training). Ces deux paramètres portaient historiquement la même valeur (42j) mais ont divergé à l'occasion de l'adoption de la méthode Altini pour l'HRV (voir §4.1).
Banister E.W. (1991). Physiological Testing of Elite Athletes, Human Kinetics.
Busso T. (2003). Med Sci Sports Exerc, 35(7), 1188-1195.
Formule du budget TSS 10 jours
Le budget maximum de progression est calculé comme suit :
budget_maintien = CTL × 10
budget_max = CTL × 10 + ramp_rate × 10 × 5
recommended_tss = budget_maintien × multiplicateur_readiness
CHOIX : Le facteur ×5 dans budget_max est un paramètre empirique, pas dérivé de Banister. Interprétation : 5 = 10j horizon × 0.5 marge de sécurité, qui borne la progression à ~50% d'un ramp qui saturerait simultanément ATL(7j) et CTL(42j). Ça évite les fenêtres absurdes de progression.
LIMITE : Le TSS est un proxy imparfait de la charge interne. Il ne capture ni la charge musculaire excentrique (course en descente), ni le stress thermique, ni la dette de sommeil. Un même TSS de 100 ne produit pas le même stress en natation qu'en course à pied. Le modèle reste utile comme tendance directionnelle, pas comme vérité physiologique. Par ailleurs, le ×5 dans la formule du budget max reste empirique — pas de dérivation théorique rigoureuse.
4. Readiness — Modèle multi-signaux
4.1 Baselines et fenêtre 60 jours (NOUVELLE approche SWC)
Le système calcule des baselines individualisées sur une fenêtre de 60 jours glissants pour l'HRV et la FC repos. Cette fenêtre était historiquement de 42 jours, elle a été étendue à 60 jours pour suivre la méthode HRV4Training (Altini) : 60 jours couvrent ~2 mésocycles complets (build + récup), ce qui évite de biaiser la baseline par un seul bloc de surcharge récent.
| Grandeur | Formule | Seuil alerte | Référence |
| HRV baseline | moyenne arithmétique 60j | — | Altini (HRV4Training) |
| HRV SD 60j | écart-type des 60j | — | Buchheit 2014 |
| SWC (Smallest Worthwhile Change) | 0.5 × SD 60j | delta HRV < −SWC = signal orange | Buchheit 2014, Plews 2013 |
| 1 × SD (seuil rouge) | 1.0 × SD 60j | delta HRV < −1 SD = sortie de bande normale | Plews 2013 |
| CV% HRV | SD / moyenne × 100 | > 10% = fatigue chronique / surcharge | Plews 2012 |
CHOIX : Seuils individualisés par SWC plutôt que seuils fixes ±5%/±10%. Un athlète avec un CV de 3% et un autre à 12% n'ont pas la même définition de "baisse significative". Le SWC capture cette variabilité individuelle. Fallback sur ±5%/±10% uniquement si < 7 jours de données disponibles.
Plews D.J. et al. (2012). Heart rate variability in elite triathletes. Eur J Appl Physiol.
Buchheit M. (2014). Monitoring training status with HR measures. Front Physiol, 5:73.
Altini M. — HRV4Training methodology, 60-day normal band.
LIMITE — outliers non filtrés : Le SWC est maintenant individualisé (0.5 × SD 60j) mais suppose que la distribution HRV est approximativement gaussienne, ce qui n'est pas toujours vrai en présence d'outliers (maladie, alcool, stress aigu). Le modèle ne filtre pas ces outliers avant de calculer le SD — un seul jour atypique inflation le SD et détend le seuil d'alerte pendant ~60 jours.
4.2 Score Couzens (décision quotidienne)
Un score composite 0-100 intègre 5 signaux pour décider GO / ADJUST / REST :
| Signal | Poids max | Seuil rouge | Seuil orange |
| HRV (comparaison au 7j avec SWC) | ±25 pts | delta < −1 SD 60j | delta < −0.5 SD (SWC) |
| FC repos (vs baseline 60j) | ±15 pts | ≥+5 bpm | ≥+3 bpm |
| Sommeil (durée + qualité) | ±20 pts | <6h ou qualité <50% | <7h ou qualité <70% |
| TSB (balance de forme) | ±15 pts | <-30 | -20 à -30 |
| Fatigue subjective (1-10) | ±30 pts | ≤3/10 | ≤5/10 |
Décision : REST si score <30 ou ≥2 rouges. ADJUST si score <40 ou ≥2 oranges ou 1 rouge. GO sinon.
Couzens P. (2020). The Sustainable Triathlete, Ch. 14.
Saw A.E. et al. (2016). Br J Sports Med, 50(5), 281-291.
CHOIX : Le poids le plus élevé (30 pts) est donné au ressenti subjectif, pas à l'HRV. C'est contre-intuitif dans un système "data-driven" mais cohérent avec Saw et al. (2016) qui montrent que les mesures subjectives sont de meilleurs prédicteurs de la performance que les marqueurs physiologiques isolés.
LIMITE : Le HRV du matin est sensible à l'alcool, la caféine, la position de sommeil et le timing de la mesure — des facteurs non capturés. L'adoption du SWC individualisé (§4.1) améliore la pertinence des seuils mais ne résout pas la sensibilité aux artefacts de mesure.
4.3 Budget de charge dynamique (multiplicateur 0.70-1.15)
Le budget TSS 10 jours est modulé par un multiplicateur calculé à partir de 5 signaux pondérés (tendances multi-jours, pas valeurs ponctuelles) :
| Signal | Poids | Référence |
| Pente HRV 7j + momentum 3j/7j | 30% | Plews 2013, Kiviniemi 2007 |
| Pente FC repos 7j | 20% | Urhausen 2002 |
| Tendance sommeil (3j vs 7j) | 15% | Halson 2014 |
| Historique readiness (pente 7j) | 20% | Couzens 2020 |
| Pattern décisionnel (jours consécutifs) | 15% | Zatsiorsky 2006 |
Asymétrie volontaire : le multiplicateur peut descendre de 30% (0.70) mais ne monter que de 15% (1.15). Principe de précaution — il est plus risqué de surentraîner que de sous-entraîner.
Labels : ABSORB si mult < 0.85, MAINTAIN si 0.85 ≤ mult ≤ 1.02, PUSH si mult > 1.02.
CHOIX (branchement structure) : Depuis 2026-04, le multiplicateur influence
à la fois la charge totale (via
recommended_tss = maintien × multiplier)
et la structure des séances via un mapping
degradation_level :
none : mult ≥ 0.95 → aucune dégradation de shape
soft : 0.85 ≤ mult < 0.95 → downgrade shapes exigeants (même logique que ADJUST Couzens)
hard : mult < 0.85 → force progressive (endurance Z1/Z2 seule)
Le véto binaire Couzens GO/ADJUST/REST s'applique en plus, comme cap absolu : le plus restrictif des deux gagne.
LIMITE — HRV dual-algorithme : Le score Couzens quotidien (§4.2) compare la HRV du jour à la moyenne 7j, via un seuil SWC statique. Le budget modifier (§4.3) évalue la pente HRV 7j et le momentum 3j/7j. Les deux vues peuvent diverger : un jour bas ponctuel peut déclencher un ADJUST Couzens sans affecter la pente 7j (multiplicateur reste à 1.0), ou inversement une pente qui dérive depuis 10 jours peut réduire le budget sans faire basculer le score du jour. Ce découplage est intentionnel — la décision du jour vs la planification 10j répondent à des horizons différents. Mais cela signifie qu'il peut exister des situations où le dashboard affiche simultanément GO (Couzens OK) et ABSORB (budget réduit à cause d'une pente négative) — ce n'est pas une incohérence, c'est un trade-off entre réactivité quotidienne et tendance hebdomadaire.
LIMITE — normalisation sleep vs HRV : Le signal HRV est normalisé en %/jour (pente / baseline × 100) alors que le signal sommeil utilise le delta absolu s3 - s7 divisé par 15 (échelle 0-100). Les magnitudes ne sont pas directement comparables — un delta de 15 pts de qualité sommeil = score ±1.0, alors qu'une pente HRV de 1.5%/jour = score ±1.0. Ce choix calibratoire est empirique et pourrait être revisité avec plus de données.
5. Fast-Track — Ajustements post-séance
Des signaux post-séance déclenchent des ajustements automatiques sans intervention de l'IA. Le système utilise un score à points (≥3 pts = déclenchement) :
| Signal | Score | Seuil | Action |
| Découplage >8% | 3 | >8% | REDUIRE_INTENSITE |
| HRV ↓ + FC repos ↑ (sympathique) | 3 | HRV <−8%, RHR >+3% | REDUIRE_INTENSITE |
| HRV ↓ + FC repos ↓ (parasympathique) | 4 | HRV <−8%, RHR <−3% | ANNULER (veto) |
| DI chronique >10% | 2 | Moyenne 28j >10% | REDUIRE_INTENSITE |
| RPE ≥8/10 | 2 | Perception effort | ADJUST |
| TSS réel >120% planifié | 2 | Dépassement charge | ADJUST |
Javaloyes A. et al. — Matrice ANS (état sympathique/parasympathique).
CHOIX : Le pattern "HRV basse + FC repos basse" (parasympathique) reçoit le score le plus élevé (4, veto ANNULER). C'est le signal le plus dangereux selon la matrice ANS de Javaloyes : il indique un état de fatigue parasympathique profonde, souvent précurseur de surentraînement de type II.
6. Découplage aérobie — Gates de progression
La progression d'un step au suivant dans la matrice de surcharge est conditionnée par la stabilité du découplage cardiaque dans la zone cible :
| Zone | Seuil découplage | Fenêtre | Méthode |
| Z2 (régression gate) | ≤5.0% | 3 dernières mesures | Médiane |
| Z3 | ≤8.0% | 3 dernières mesures | Médiane |
| Z4 | ≤8.0% | 3 dernières mesures | Médiane |
Régression gate Z2 : si le découplage en Z2 remonte au-dessus de 5%, l'athlète est ramené au step 1 (base aérobie) quelle que soit sa progression en Z3/Z4. Phase PEAK : les gates sont désactivées.
Friel J. (2009). The Triathlete's Training Bible, 3rd ed. VeloPress.
LIMITE : Le découplage est sensible à la chaleur, l'hydratation, et la dérive cardiaque normale sur les longues sorties. Le système ne corrige pas pour la température ou la durée de l'effort.
7. Taper — Modèle d'affûtage
| Paramètre | Valeur |
| Durée | 14 jours |
| Réduction volume | Linéaire : 100% → 30% |
| Intensité | Maintenue (Z3: 10%, Z4: 5%, Z5: 5%) |
| CTL cible au départ | 90 |
Mujika I. (2009). Tapering and Peaking. Human Kinetics.
Bosquet L. et al. (2007). Med Sci Sports Exerc, 39(8), 1358-1365.
CHOIX : Bosquet (2007) montre un gain de performance optimal avec 2 semaines de taper et 41-60% de réduction de volume. Notre modèle (70% de réduction) est dans la fourchette haute mais justifié pour Ironman où la fatigue périphérique nécessite plus de récupération.
8. Répartition par sport
| Phase | Natation | Vélo | Course |
| TRANSITION | 20% | 40% | 40% |
| BASE | 15% | 50% | 35% |
| BUILD 1 | 15% | 50% | 35% |
| BUILD 2 | 15% | 55% | 30% |
| PEAK | 20% | 45% | 35% |
CHOIX : Le vélo représente ~50% de la durée de course en Ironman et offre le meilleur ratio temps-investi/gain-performance. La natation est plafonnée à 15-20% car au-delà de 3-4 séances/sem, les gains marginaux sont faibles pour un age-grouper.
9. Caps de volume et durées de séances
| Paramètre | Vélo | Course | Natation |
| Cap sortie longue | 330 min (5h30) | 135 min (2h15) | 80 min |
| Ratio longue / budget | 45% | 35% | 40% |
| Min séance filler | 45 min | 30 min | 30 min |
| Min séance qualité | 45 min (plancher) |
CHOIX : Le cap vélo à 5h30 est un compromis entre la spécificité Ironman (5-7h de vélo en course) et la réalité pratique d'un age-grouper. Le cap course à 2h15 est une protection contre la blessure.
10. Modèle énergétique, glycogène & boucle de prescription
10.1 Dépense calorique
Le système utilise les données de puissance quand disponibles :
- Power-based (Assioma Duo vélo, Stryd course) :
kcal ≈ watts × time / 1000
- Fallback TSS (natation) :
kcal = TSS × 8
- Crossover CHO/fat : partitionnement par intensité (NP/FTP), 15% CHO en Z1 montant linéairement jusqu'à 100% à ratio ≥1.0
Brooks G.A. & Mercier J. (1994). J Appl Physiol, 76(6), 2253-2261.
10.2 Modèle glycogène séquentiel (server)
Implémentation : modules/energy.py::glycogen_chain. Modèle simple, linéaire, sans cinétique :
MAX = poids_cible × 8 g/kg (~536g à 67kg)
morning = prev_evening − 50g (déplétion hépatique nuit)
post_ex = morning − CHO_burned_pendant_séance
evening = min(MAX, post_ex + CHO_ingérés_utiles)
Hultman E. (1967). Studies on muscle metabolism.
Areta J.L. & Hopkins W.G. (2014). Sports Med, 48:19-27.
Ivy J.L. (1988). Sports Med, 6(1), 11-19.
10.3 Modèle client-side (J+1 anticipation + resynthèse retardée)
Implémentation : static/app.js::_computeGlyco. Version étendue du modèle server avec trois raffinements :
BASAL_CHO = 100 g/jour (consommation cérébrale/organes diurne) soustraite des apports avant resynthèse musculaire
MAX_DAILY_RESYNTH = 98 g/jour (~7 g/h × 14h éveillées, Ivy 1988)
- Délai d'absorption : split 65% immédiat / 35% reporté sur la nuit (dîner → matin suivant)
- J+1 anticipation : si la grosse séance de demain demande un stock matinal ≥ 350g, les apports CHO d'aujourd'hui sont préchargés (affichés augmentés dans la cible du jour courant)
LIMITE — Modèle glycogène dédoublé. Deux implémentations coexistent : energy.py::glycogen_chain (server, simple) et app.js::_computeGlyco (client, avec BASAL_CHO + MAX_DAILY_RESYNTH + J+1 + split 65/35). Depuis 2026-04, un troisième module modules/glycogen.py porte la projection server-side utilisée pour émettre les warnings sur pills. La consolidation complète (un seul modèle) reste une dette — un message Discord peut afficher un stock glycogène légèrement différent du dashboard pour le même jour.
10.4 NOUVEAU — Prescription CHO intra-séance (boucle fermée)
Chaque pill longue (durée ≥ 60 min, sport ∈ {bike, run}) embarque une prescription CHO intra-séance calculée par modules/energy.py::compute_intra_workout_cho — qui délègue lui-même au helper privé _intra_cho_rate_g_per_h(), source unique de vérité partagée avec nutrition_advice(). Ainsi le banner 🍌 du dashboard, le modèle glycogène client, la projection server, et le texte 🍽 synced vers intervals.icu affichent tous exactement la même valeur.
Barème entraînement (pas race simulation)
| Durée / Intensité | Débit CHO | Exemple |
| < 60 min (toute intensité) | 0 g/h | Réserves endogènes suffisantes |
| 60-120 min endurance (Z1-Z2) | 30 g/h | ~40 g / 1h20 Z2 |
| 60-120 min intense (Z3+Z5 ≥ 50%) | 45 g/h | ~68 g / 1h30 seuil |
| 120-180 min endurance | 45 g/h | ~113 g / 2h30 Z2 |
| 120-180 min intense | 60 g/h | ~150 g / 2h30 tempo |
| ≥ 180 min endurance | 60 g/h | ~180 g / 3h Z2 |
| ≥ 180 min intense / race sim | 75 g/h | ~300 g / 4h race pace (mix obligatoire) |
Limites physiologiques d'absorption
| Transporteurs | Débit max | Source CHO |
| SGLT1 seul | ~60 g/h | Glucose pur, maltodextrine |
| SGLT1 + GLUT5 (mix 2:1) | ~90 g/h | Glucose + fructose |
| Entraînement GI spécifique | 90-120 g/h | Race simulation uniquement |
Cap de sécurité : ne pas dépasser 1.1× le CHO réellement brûlé pendant la séance (évite sur-consommation et risque GI).
Absorption effective utilisée dans le modèle glycogène : 85% (Jentjens & Jeukendrup 2006) — c'est la fraction qui impacte effectivement le net_carb_burn.
CHOIX — Barème conservateur (entraînement, pas race) : Les prescriptions restent dans les brackets Jeukendrup 2004 pour l'entraînement quotidien, pas les 90-120 g/h de la littérature race simulation. Justification : (a) ces débits très élevés demandent un "gut training" spécifique, (b) ils ne sont pas nécessaires pour les séances quotidiennes où l'objectif est la préservation du glycogène, pas la performance maximale sur 10h d'effort, (c) le plafond 75 g/h est atteignable sans entraînement GI spécifique chez la plupart des athlètes.
CHOIX — Compensation glycogène bas gérée en amont (pas via bump intra) : Quand le stock glycogène matinal est projeté bas (<50%), la compensation se fait via la pré-charge (alerte "collation 30-40g CHO 1h avant" dans nutrition_advice) et via la précharge J+1 du modèle glycogène client (§10.3). Le débit intra-séance reste constant (dicté par la physiologie de l'absorption, pas par l'état initial du stock). Avantages : (a) cohérence totale entre banner dashboard, advice intervals.icu, et modèle glycogène — jamais de nombres différents, (b) évite de surcharger le GI pendant l'effort pour compenser un déficit qui devrait être corrigé avant, (c) logique plus simple à auditer.
CHOIX — Pas de duplication dans intervals.icu : Le texte CHO intra est injecté au push uniquement via nutrition_advice (préfixe 🍽), PAS dans pill_content. La métadonnée intra_cho_g est stockée en DB (grid_slots.intra_cho_g) pour alimenter le banner dashboard 🍌 et le feedback glycogène, mais elle ne produit pas de texte dupliqué dans la description synced vers intervals.icu.
CHOIX — CONDITION CRITIQUE : Ces grammes de CHO doivent effectivement être ingérés pendant l'effort pour que le modèle glycogène reste à flot. C'est la condition centrale de la boucle fermée. Le modèle l'indique explicitement sur chaque pill longue avec le banner 🍌 "obligatoire pour préserver le glycogène", et sur la ligne GLYCOGÈNE du calendrier avec la mention 🍌 "Valable SI CHO intra pris".
Jeukendrup A.E. (2004). Carbohydrate intake during exercise and performance. Nutrition, 20(7-8), 669-677.
Jeukendrup A.E. (2014). A step towards personalized sports nutrition: carbohydrate intake during exercise. Sports Med, 44(Suppl 1), S25-S33.
Stellingwerff T. & Cox G.R. (2014). Systematic review: CHO intake in endurance.
Jentjens R. & Jeukendrup A.E. (2006). Multiple transportable carbohydrates enhance gastric emptying and fluid delivery.
10.5 Cibles nutritionnelles journalières
Table energy.py::tss_nutrition_target (paliers TSS → kcal/CHO) :
| TSS actif | kcal | CHO | Catégorie |
| 0 | 2300 | 220 g | OFF |
| 1-49 | 2600 | 290 g | LÉGER |
| 50-99 | 3000 | 370 g | MODÉRÉ |
| 100-179 | 3400 | 470 g | CHARGÉ |
| ≥ 180 | 3900 + 8×(tss-180) | 550 + 1.3×(tss-180) g | TRÈS CHARGÉ |
Ajustement restriction : si phase = restriction ET active_tss < 130 → déficit 450 kcal / 110 g CHO.
Stellingwerff T. (2013). Int J Sports Physiol Perform, 8(5).
Burke L.M. (2017). Exp Physiol, 102(12), 1577-1588.
LIMITE : Pas de modélisation hydrique ni électrolytique. Pas de prise en compte température/humidité/altitude. Pas de projection sodium. Pour un Ironman 226km où le crampe et la perte hydrique sont souvent les vrais facteurs limitants, c'est un angle mort documenté.
10.6 NOUVEAU — Boucle de rétroaction glycogène → prescription
La boucle fermée fonctionne en 4 étapes :
- Forge : chaque pill longue embarque sa prescription CHO intra (§10.4), stockée en base (
grid_slots.intra_cho_g, intra_cho_rate)
- Modèle glycogène client :
_computeGlyco lit data-intra-cho de chaque pill et calcule net_carb_burn = brut − intra_absorbé × 0.85. C'est l'équation clé.
- Projection server :
modules/glycogen.py::project_trajectory applique le même calcul côté serveur pour émettre des warnings si le glycogène matinal projeté passe sous les seuils :
- < 350g (~65% max) → warning orange "vérifier précharge + intra"
- < 200g (~37% max) → warning rouge critique "séance compromise"
- Affichage : les warnings apparaissent comme badges rouges directement sur les pills concernées + le bandeau glycogène du calendrier signale la condition (🍌 Valable SI CHO intra pris).
CHOIX — Pas d'auto-réarrangement agressif : Le solveur ne déplace pas automatiquement les séances pour optimiser la trajectoire glycogène. Il ajuste la prescription CHO intra + précharge et émet les warnings — l'utilisateur décide. Raison : auto-réarranger casserait les séances verrouillées et les contraintes de disponibilité. Un "glycogen-aware solver" actif est documenté comme travail futur.
LIMITE — compliance athlète. Si l'athlète ne suit pas la reco intra, la projection devient optimiste. Le modèle suppose que la prescription est respectée. Future amélioration : saisir le CHO intra réellement consommé en post-session pour corriger la trajectoire a posteriori.
11. Gap analysis — 7 dimensions vs course
Module advisory (modules/gap_analysis.py) qui lit l'état actuel et projette vers la date de course, calcule un score par dimension et génère des recommandations.
| Dimension | Grandeur | Gain max / semaine | Référence |
| CTL / Fitness | CTL vs cible 90 | 5-7 TSS/sem (ramp) | Banister 1991, Coggan 2019 |
| FTP Vélo | icu_ftp vs cible 255W | 1.5 W/sem | Allen & Coggan 2019 |
| EF Vélo (efficiency) | NP/FC en Z2 | +0.012 EF/sem | Friel 2009 |
| EF Run | NGP/FC (Stryd) | +0.012 EF/sem | Daniels 2005 |
| Swim pace | CSS en s/100m | −1 s/100m/sem | Maglischo 2003 |
| Weight | Poids cible 67kg | −0.5 kg/sem max | Mountjoy 2014 (RED-S) |
| Durabilité | DI + Z2 découplage + longest ride | — | Van Erp 2021, Maunder 2021 |
Scoring : ratio vs cible, seuils on_track ≥ 92%, behind 82-92%, critical < 82%. Le score global est une moyenne pondérée (CTL 20%, FTP 15%, EF bike 15%, EF run 15%, swim 10%, weight 10%, durabilité 15%).
CHOIX — module read-only advisory : Le gap analysis génère des recommandations mais ne modifie pas la grid automatiquement. Raison : éviter les boucles de rétroaction non auditables. L'utilisateur voit les recos et décide manuellement.
Van Erp T. et al. (2021). Int J Sports Physiol Perform, 16(7).
Maunder E. (2021). Durability in endurance athletes.
12. Courbe de puissance / Classification Coggan
Le système analyse la courbe MMP (Mean Maximal Power) de l'athlète et classifie le profil selon les seuils Coggan W/kg par durée clé :
| Catégorie | 5s (neuro) | 1min (anaéro) | 5min (VO2max) | 20min (seuil) |
| World | >22 | >10.5 | >7.0 | >6.0 |
| Excellent | 19-22 | 9-10.5 | 6-7 | 5.2-6.0 |
| Très bon | 16-19 | 7.5-9 | 5-6 | 4.4-5.2 |
| Bon | 13-16 | 6-7.5 | 4-5 | 3.7-4.4 |
| Moyen | 11-13 | 5-6 | 3.5-4 | 3.1-3.7 |
Profil dérivé (ratios 5s/1min/5min/20min) : Sprinter / Puncheur / Rouleur / Endurance / Grimpeur.
Analyse contextuelle Ironman — facteurs clés par ordre d'importance :
- Durabilité (capacité à soutenir ~72% FTP sur 5-6h)
- FTP (niveau de seuil individuel, cible ≥3.8 W/kg)
- Économie (efficience énergétique, EF stable)
- VO2max (facteur secondaire en IM long)
Race power IM : ~72% FTP comme NP cible sur 5-6h vélo (standard IM age-group).
e-FTP dynamique via Morton CP (depuis 2026-04)
La FTP utilisée dans tout le pipeline (forge, gap analysis, energy, post_session) est lue dynamiquement via modules/athlete_profile.py::get_current_ftp qui interroge l'API intervals.icu (icu_ftp / icu_run_ftp) avec cache 24h et fallback config.py. L'e-FTP intervals.icu est calculée par le modèle CP 3-param de Morton sur un effort max ≥ 600s.
Tests de calibration (macrocycle.json::calibration_tests) : shapes dédiés ftp_test (vélo, 20min max) et ftp_test_run (run, 15min max) à programmer tous les ~28 jours en phase BASE/BUILD pour rafraîchir l'estimation.
Allen H., Coggan A. & McGregor S. (2019). Training and Racing with a Power Meter, 3e ed.
Morton R.H. (1996). J Sports Sci, 14(4), 329-335 — 3-parameter CP model.
Jones A.M. (2010). Int J Sports Physiol Perform, 5(2), 128-136.
13. IF par zone et par sport
| Zone | Vélo | Course | Natation |
| Z1/Z2 (Endurance) | 0.68 | 0.78 | 0.72 |
| Z3 (Tempo) | 0.82 | 0.87 | 0.82 |
| Z4 (Seuil) | 0.95 | 0.95 | 0.90 |
| Z5 (VO2max) | 1.05 | 1.05 | 0.98 |
LIMITE : Ces valeurs sont des moyennes génériques. Le système devrait idéalement dériver les IF des zones individuelles configurées dans intervals.icu. Par ailleurs, workout_forge.py::forge_swim_smooth utilise des IF swim fixés par type de séance (Technique 0.65, CSS 0.85, Endurance 0.75, Vitesse 0.90) plutôt qu'une dérivation depuis les zones personnalisées — raccourci documenté.
14. Structure des séances — Warm-up / Cool-down
| Type séance | Warm-up | Cool-down |
| Endurance | 12% de la durée (min 10 min) | 7% (min 5 min) |
| Qualité isométrique | 18% (min 10 min), ramp Z1→cible−10% | 10% (min 5 min) |
| Over-Under | 20% (min 12 min) | 12% (min 8 min) |
| FTP Test (calibration) | 15 min + 3×30s activation | 10 min |
CHOIX : Les séances de qualité ont un warm-up proportionnellement plus long (18-20%) pour permettre une activation neuromusculaire progressive et réduire le risque de blessure.
15. Dégradation des shapes par readiness
Quand la readiness est ADJUST/REST OU le multiplicateur budget est dégradé, les shapes complexes sont automatiquement dégradées vers des formes plus conservatrices :
| Shape planifié | Shape dégradé | Logique |
| Over-under, Pyramid, Podium, 30/30, Tabata, Billat, Norvégien | Isometric | Supprimer les variations d'intensité qui augmentent le stress neuromusculaire |
| Broken threshold, Gimenez | Tempo | Abaisser la zone cible d'un cran (Z4→Z3) |
| Hard start, Step up, Surcomp négative | Progressive | Remplacer le départ rapide par une montée graduelle |
N'importe quoi (si degradation_level == 'hard' ou REST) | Progressive (Z1/Z2) | Plancher absolu : endurance stricte |
CHOIX — branchement multiplicateur → structure (depuis 2026-04) : Le multiplicateur budget influence désormais
à la fois la charge totale
et la structure des séances :
none (mult ≥ 0.95, MAINTAIN / PUSH) : shape demandé tel quel
soft (0.85 ≤ mult < 0.95, ABSORB léger) : downgrade via _SHAPE_DEGRADATION (même logique qu'ADJUST Couzens)
hard (mult < 0.85, ABSORB profond) : force progressive (endurance Z1/Z2 seule)
Le véto binaire Couzens GO/ADJUST/REST s'applique en plus, comme cap absolu. Avant 2026-04, le multiplicateur n'influençait que le volume — les shapes étaient dégradées uniquement par le label Couzens. Depuis, le gap est comblé.
16. Sync intervals.icu
Module modules/intervals_sync.py::envoyer_seance_intervals. Envoie chaque pill comme événement workout vers le calendrier intervals.icu.
Slots horaires par défaut
| Créneau | Vélo | Run / Swim |
| Semaine midi | — | 12:00 |
| Semaine soir | 17:30 | 17:30 (Run) |
| Week-end | 08:00 | 08:00 |
Format payload
{
"category": "WORKOUT",
"start_date_local": "YYYY-MM-DDTHH:MM:SS",
"type": "Ride" | "Run" | "Swim",
"name": "<pill title>",
"description": "Target: Power\n\n<pill content avec steps>"
}
Préfixe Target : "Target: Power" (bike/run) ou "Target: Pace" (swim) pour aider le parser natif d'intervals.icu à interpréter les pourcentages comme FTP ou allure.
Préfixes additionnels : 🍽 nutrition advice (cf. §10.5) et 🍌 CHO intra-séance (cf. §10.4) sont prepended au contenu, séparés par une ligne vide du premier header Warmup (syntaxe intervals.icu respectée).
Auto-sync
Debounce 2s, déclenché par drop/updatePill/reforgePillFromServer. État exposé via /api/sync/status et affiché dans <div id="syncStatus">.
LIMITE : Slots horaires hardcoded dans HEURE_PAR_SPORT, pas d'UI pour customiser.
17. Limites transversales du système
LIMITE 1 — Modèle 3-5 zones vs continuum physiologique. Les zones d'entraînement sont des simplifications didactiques. La physiologie réelle est un continuum : il n'y a pas de saut discret entre Z2 et Z3. Les seuils ventilatoires (VT1/VT2) varient avec l'état de fatigue, la chaleur, et l'hydratation.
LIMITE 2 — Spécificité vs généralité des études. La majorité des études citées portent sur des athlètes d'élite en sport cyclique pur. Le transfert au triathlon age-group est une extrapolation.
LIMITE 3 — Nutrition partiellement modélisée. Depuis 2026-04 le modèle glycogène avec boucle fermée (§10) couvre la macronutrition et la prescription CHO intra. Mais pas d'hydratation ni de thermorégulation ni de sodium — pour un Ironman où la gestion hydrique est souvent le facteur limitant, c'est un angle mort.
LIMITE 4 — TSS comme monnaie unique. Le TSS ne capture pas toutes les dimensions du stress d'entraînement : charge excentrique en course à pied, stress articulaire en natation, fatigue cognitive des séances techniques. Deux séances à TSS identique peuvent avoir des coûts de récupération très différents.
LIMITE 5 — Réponse individuelle. Le système applique des règles générales (seuils, ratios, caps) sans modéliser la réponse individuelle à l'entraînement. La variabilité inter-individuelle est considérable (Bouchard et al., 2011 : gains VO2max de 0% à 40% pour un même programme). Le seul mécanisme d'individualisation est la boucle de rétroaction readiness/découplage/glycogène.
LIMITE 6 — Compliance glycogène. La boucle fermée §10 fonctionne uniquement si l'athlète suit la prescription CHO intra affichée sur chaque pill. Sans compliance, la projection devient optimiste (net_carb_burn sous-évalué) et la trajectoire réelle diverge. Future amélioration : saisie post-session du CHO réellement consommé pour corriger a posteriori.
Bibliographie complète
Allen H., Coggan A. & McGregor S. (2019). Training and Racing with a Power Meter, 3e ed. VeloPress.
Altini M. — HRV4Training methodology, 60-day normal band.
Areta J.L. & Hopkins W.G. (2014). Skeletal Muscle Glycogen Content. Sports Med, 48:19-27.
Banister E.W. (1991). Modeling elite athletic performance. Physiological Testing of Elite Athletes, Human Kinetics.
Bosquet L. et al. (2007). Effects of tapering on performance: A meta-analysis. Med Sci Sports Exerc, 39(8), 1358-1365.
Bouchard C. et al. (2011). Genomics and genetics in the biology of adaptation to exercise. Compr Physiol, 1(3).
Brooks G.A. & Mercier J. (1994). Crossover concept — CHO/fat utilization. J Appl Physiol, 76(6), 2253-2261.
Buchheit M. (2014). Monitoring training status with HR measures. Front Physiol, 5:73.
Burke L.M. (2017). Nutritional approaches for high-level sports. Exp Physiol, 102(12), 1577-1588.
Busso T. (2003). Variable dose-response relationship. Med Sci Sports Exerc, 35(7).
Coggan A. (2019). Power Training Zones.
Couzens P. (2020). The Sustainable Triathlete, Ch. 14.
Daniels J. (2005). Daniels' Running Formula, 2nd ed. Human Kinetics.
Esteve-Lanao J. et al. (2005). How do endurance runners actually train? J Strength Cond Res, 19(4).
Friel J. (2009). The Triathlete's Training Bible, 3rd ed. VeloPress.
Halson S.L. (2014). Sleep in elite athletes. Sports Med, 44(Suppl 1), S13-S23.
Hultman E. (1967). Studies on muscle metabolism of glycogen.
Ivy J.L. (1988). Muscle glycogen synthesis before and after exercise. Sports Med, 6(1), 11-19.
Javaloyes A. et al. — Matrice ANS sympathique/parasympathique.
Jentjens R. & Jeukendrup A.E. (2006). Multiple transportable CHO absorption.
Jeukendrup A.E. (2014). Carbohydrate intake during exercise.
Jones A.M. (2010). Critical Power and FTP. Int J Sports Physiol Perform, 5(2), 128-136.
Kiviniemi A.M. et al. (2007). HRV-guided endurance training. Eur J Appl Physiol, 101(6), 743-751.
Maglischo E.W. (2003). Swimming Fastest. Human Kinetics.
Maunder E. (2021). Durability in endurance athletes.
Morton R.H. (1996). The critical power model for intermittent exercise. J Sports Sci, 14(4), 329-335.
Mountjoy M. et al. (2014). RED-S: Relative Energy Deficiency in Sport. Br J Sports Med, 48(7).
Mujika I. (2009). Tapering and Peaking for Optimal Performance. Human Kinetics.
Muñoz I. et al. (2014). Polarized training in recreational runners. Int J Sports Physiol Perform, 9(2).
Plews D.J. et al. (2012). HRV variation in variability in elite triathletes. Eur J Appl Physiol.
Plews D.J. et al. (2013). Training adaptation and HRV in elite endurance athletes. Int J Sports Physiol Perform, 8(6).
Saw A.E. et al. (2016). Monitoring the athlete training response. Br J Sports Med, 50(5), 281-291.
Seiler K.S. (2010). Best practice for training intensity and duration distribution. Int J Sports Physiol Perform, 5(3).
Stellingwerff T. & Cox G.R. (2014). Systematic review: CHO intake in endurance.
Stellingwerff T. (2013). Contemporary nutrition approaches for marathon performance. Int J Sports Physiol Perform, 8(5).
Stöggl T. & Sperlich B. (2014). Polarized training has greater impact on key endurance variables. Front Physiol, 5:33.
Urhausen A. et al. (2002). Blood hormones as markers of training stress and overtraining. Sports Med, 32(2).
Van Erp T., Sanders D. & de Koning J.J. (2021). Training characteristics of pro road cyclists. Int J Sports Physiol Perform, 16(7).
Zatsiorsky V.M. & Kraemer W.J. (2006). Science and Practice of Strength Training, 2nd ed. Human Kinetics.