Rolling training load calculation from accumulated stress scores — acute (7-day) vs chronic (28-day) load, training load balance, freshness/fatigue tracking. Helps users understand if they're overtraining or undertraining.
Updated for SYNTHESIS schema
Per-activity load → activity_statistics
- Each activity gets a training load value stored as
activity_statistics rows
- Computation hierarchy:
- Power-based TSS when power data available (cycling, rowing):
TSS = (duration × NP × IF) / (FTP × 3600) × 100
- HR-based TRIMP for HR-only activities: sum of (time_in_zone × zone_weight) using
training_zones.trimp_weight
- sRPE (RPE × duration) as universal fallback: RPE from
activity_statistics where stat_type = 'rpe'
- Stat types:
training_load, tss, intensity_factor, normalized_power
- Trainstack-computed variants use
ts_ prefix: ts_training_load, ts_tss
Rolling load → athlete_metrics
- CTL (Chronic Training Load): 42-day exponentially weighted moving average
- ATL (Acute Training Load): 7-day exponentially weighted moving average
- TSB (Training Stress Balance): CTL - ATL (positive = fresh, negative = fatigued)
- ACWR (Acute:Chronic Workload Ratio): ATL / CTL — safe range 0.8-1.3, flag injury risk >1.5
- Stored in
athlete_metrics with metric_type = 'ctl', 'atl', 'tsb', 'acwr'
Computation
- Background job, not real-time
- Triggered when new activities sync or when RPE is entered
- Per-sport CTL/ATL (running load separate from cycling load)
- Invalidation: recalculate when activity is edited/deleted
Coaching integration
- Combine with HRV trend status from
athlete_metrics (stable/coping/maladaptation/fatigue)
- ACWR >1.5 + HRV downtrend = high injury risk warning
- Display alongside planned workouts on calendar
Depends on
- #31 Implement SYNTHESIS Schema
- #35 Training Zones & Zone Analysis Schema (for TRIMP zone weights)
- #34 Health & Sleep Data Schema (for athlete_metrics table)
- #24 Training Stress Score (per-activity TSS must exist first)
Reference
See docs/api-research/SYNTHESIS.md §5 (Data Provenance), §7 (athlete_metrics, activity_statistics)._