Fitness, fatigue & form (CTL / ATL / TSB)
Your fitness (CTL) is a slow-moving average of how much training stress you’ve absorbed; your fatigue (ATL) is a fast-moving average of the same; your form (TSB) is the gap between the two. A positive TSB means you’re fresher than your recent training load; a negative one means fatigue is stacking up.
- A pro cyclist starts a 3-week Grand Tour around CTL ≈ 150 — fitness built over months of training.
- Racing roughly 150–250 TSS a day for 21 days, the 42-day EWMA (ctl = ctl + (tss − ctl) / 42, applied once per day) keeps pulling CTL upward faster than it decays.
- By the final stage, Friel’s own published power-file breakdowns show CTL has climbed to roughly 200.
This is why a 3-week stage race is a fitness-BUILDING event even though it’s brutally hard — daily load outweighs the 42-day decay.
Source: Joe Friel’s published Tour de France power-file analysis
Formula, provenance & citation
- Formula
- tsb = ctl − atl (before today’s update); ctl = ctl + (tss − ctl) / 42; atl = atl + (tss − atl) / 7
- Inputs
- Daily total TSS (real, or the hrTSS fallback when no power/pace TSS exists), one point per calendar day, gaps counted as TSS = 0.
- Provenance
- computed
- Unit
- TSS (dimensionless, TSS-per-day average)
- Method
- Banister impulse-response model, EWMA convention (Coggan/Allen)
- Citation
- Banister E.W. (1991), Physiological Testing of Elite Athletes; Allen H., Coggan A., McGregor S. — Training and Racing with a Power Meter, 2nd ed. (2010), ch. 6.
- Licensing note
- "CTL"/"ATL"/"TSB"/"TSS" are the vocabulary TrainingPeaks (Peaksware) uses for this same Coggan/Allen model — the formula itself is public domain, only the abbreviations trace to a commercial product.
- Implementation pointer
api/backend/backend/pipeline/metrics/fitness.py:174 (fitness_series), fitness.py:579 (_fitness_snapshot). Tests: api/backend/tests/pipeline/test_metrics.py.