nuit
← 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.

#ÉtapeModule(s)EntréeSortieRéf.
1Ingestion wellness/activitéswellness.py, activity_fetcher.pyAPI intervals.icurecords 60j, CTL/ATL/TSB, découplage§4
2Readiness quotidien Couzenscouzens.pyHRV, RHR, sommeil, TSB, ressentiscore 0-100, GO/ADJUST/REST§4.2
3Tendance readiness multi-jourstraining_plan.pypentes 7j des 5 signauxmultiplicateur 0.70-1.15, ABSORB/MAINTAIN/PUSH§4.3
4Budget TSS 10jtraining_plan.pyCTL, ramp rate, multiplicateurTSS maintien/max/reco§3
5Gap analysis (advisory)gap_analysis.pyétat actuel vs cibles course7 dimensions, recommandations§11
6Forge des séancesworkout_forge.pysport, type, shape, readiness, multiplicateurworkout intervals.icu + prescription CHO intra§15, §10.4
7Dégradation par readinessplan_adjustment.py + forgeshape × (ADJUST/REST/multiplicateur)shape dégradé (none/soft/hard)§15
8Grille calendrier 10j + solveurmemory.py::grid_slotsséances forgées + trajectoire glycogèneSQLite grid_slots + warnings§10.6
9Modèle énergétique / glycogèneenergy.py, glycogen.py, app.jsdépense watts − CHO intra absorbéstock glycogène, cibles macro§10
10Sync intervals.icuintervals_sync.pygridPOST /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.

PhaseZ1/Z2Z3 (Tempo)Z4 (Seuil)Z5 (VO2)Modèle
TRANSITION100%0%0%0%Récupération pure
BASE80%15%5%0%Pyramidal classique
BUILD 175%20%5%0%Pyramidal intensifié
BUILD 275%15%5%5%Spécificité Ironman + rappel VO2
PEAK80%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ètreValeurSignification
CTL τ42 joursConstante de fitness (moyenne exponentielle, Banister)
ATL τ7 joursConstante de fatigue (moyenne exponentielle)
TSBCTL - ATLBalance de forme (négatif = fatigué)
Ramp rate <12 sem.4.0 TSS/jourProgression agressive en phase BUILD
Ramp rate ≥12 sem.2.5 TSS/jourProgression 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.

GrandeurFormuleSeuil alerteRéférence
HRV baselinemoyenne arithmétique 60jAltini (HRV4Training)
HRV SD 60jécart-type des 60jBuchheit 2014
SWC (Smallest Worthwhile Change)0.5 × SD 60jdelta HRV < −SWC = signal orangeBuchheit 2014, Plews 2013
1 × SD (seuil rouge)1.0 × SD 60jdelta HRV < −1 SD = sortie de bande normalePlews 2013
CV% HRVSD / moyenne × 100> 10% = fatigue chronique / surchargePlews 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 :

SignalPoids maxSeuil rougeSeuil orange
HRV (comparaison au 7j avec SWC)±25 ptsdelta < −1 SD 60jdelta < −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) :

SignalPoidsRéférence
Pente HRV 7j + momentum 3j/7j30%Plews 2013, Kiviniemi 2007
Pente FC repos 7j20%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) :

SignalScoreSeuilAction
Découplage >8%3>8%REDUIRE_INTENSITE
HRV ↓ + FC repos ↑ (sympathique)3HRV <−8%, RHR >+3%REDUIRE_INTENSITE
HRV ↓ + FC repos ↓ (parasympathique)4HRV <−8%, RHR <−3%ANNULER (veto)
DI chronique >10%2Moyenne 28j >10%REDUIRE_INTENSITE
RPE ≥8/102Perception effortADJUST
TSS réel >120% planifié2Dépassement chargeADJUST
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 :

ZoneSeuil découplageFenêtreMéthode
Z2 (régression gate)≤5.0%3 dernières mesuresMédiane
Z3≤8.0%3 dernières mesuresMédiane
Z4≤8.0%3 dernières mesuresMé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ètreValeur
Durée14 jours
Réduction volumeLinéaire : 100% → 30%
IntensitéMaintenue (Z3: 10%, Z4: 5%, Z5: 5%)
CTL cible au départ90
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

PhaseNatationVéloCourse
TRANSITION20%40%40%
BASE15%50%35%
BUILD 115%50%35%
BUILD 215%55%30%
PEAK20%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ètreVéloCourseNatation
Cap sortie longue330 min (5h30)135 min (2h15)80 min
Ratio longue / budget45%35%40%
Min séance filler45 min30 min30 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 :

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 :

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 CHOExemple
< 60 min (toute intensité)0 g/hRé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 endurance45 g/h~113 g / 2h30 Z2
120-180 min intense60 g/h~150 g / 2h30 tempo
≥ 180 min endurance60 g/h~180 g / 3h Z2
≥ 180 min intense / race sim75 g/h~300 g / 4h race pace (mix obligatoire)

Limites physiologiques d'absorption

TransporteursDébit maxSource CHO
SGLT1 seul~60 g/hGlucose pur, maltodextrine
SGLT1 + GLUT5 (mix 2:1)~90 g/hGlucose + fructose
Entraînement GI spécifique90-120 g/hRace 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 actifkcalCHOCatégorie
02300220 gOFF
1-492600290 gLÉGER
50-993000370 gMODÉRÉ
100-1793400470 gCHARGÉ
≥ 1803900 + 8×(tss-180)550 + 1.3×(tss-180) gTRÈ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 :

  1. Forge : chaque pill longue embarque sa prescription CHO intra (§10.4), stockée en base (grid_slots.intra_cho_g, intra_cho_rate)
  2. 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é.
  3. 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"
  4. 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.

DimensionGrandeurGain max / semaineRéférence
CTL / FitnessCTL vs cible 905-7 TSS/sem (ramp)Banister 1991, Coggan 2019
FTP Véloicu_ftp vs cible 255W1.5 W/semAllen & Coggan 2019
EF Vélo (efficiency)NP/FC en Z2+0.012 EF/semFriel 2009
EF RunNGP/FC (Stryd)+0.012 EF/semDaniels 2005
Swim paceCSS en s/100m−1 s/100m/semMaglischo 2003
WeightPoids cible 67kg−0.5 kg/sem maxMountjoy 2014 (RED-S)
DurabilitéDI + Z2 découplage + longest rideVan 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égorie5s (neuro)1min (anaéro)5min (VO2max)20min (seuil)
World>22>10.5>7.0>6.0
Excellent19-229-10.56-75.2-6.0
Très bon16-197.5-95-64.4-5.2
Bon13-166-7.54-53.7-4.4
Moyen11-135-63.5-43.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 :

  1. Durabilité (capacité à soutenir ~72% FTP sur 5-6h)
  2. FTP (niveau de seuil individuel, cible ≥3.8 W/kg)
  3. Économie (efficience énergétique, EF stable)
  4. 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

ZoneVéloCourseNatation
Z1/Z2 (Endurance)0.680.780.72
Z3 (Tempo)0.820.870.82
Z4 (Seuil)0.950.950.90
Z5 (VO2max)1.051.050.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éanceWarm-upCool-down
Endurance12% de la durée (min 10 min)7% (min 5 min)
Qualité isométrique18% (min 10 min), ramp Z1→cible−10%10% (min 5 min)
Over-Under20% (min 12 min)12% (min 8 min)
FTP Test (calibration)15 min + 3×30s activation10 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égienIsometricSupprimer les variations d'intensité qui augmentent le stress neuromusculaire
Broken threshold, GimenezTempoAbaisser la zone cible d'un cran (Z4→Z3)
Hard start, Step up, Surcomp négativeProgressiveRemplacer 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éneauVéloRun / Swim
Semaine midi12:00
Semaine soir17:3017:30 (Run)
Week-end08:0008: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.