Let users configure their training zones — HR, power, and pace. Manual entry, auto-calculate from physiological anchors, or sync from providers.
Updated for SYNTHESIS schema (expanded scope)
This is now broader than just HR zones. The SYNTHESIS training_zones table supports:
Zone types
- Heart rate zones: percentage of max HR or lactate threshold HR
- Power zones: percentage of FTP or absolute watt ranges (Coggan levels)
- Pace zones: percentage of threshold pace or absolute s/km ranges
Zone versioning (GoldenCheetah pattern)
effective_from date on each zone set — insert new rows, don't overwrite
- Historical activities resolve to the zones that were active at the time
- Example: max HR test on March 15 shows 185 → new zone set from that date, old zones preserved
Both absolute and percentage-based
- Absolute: coach sets specific values, or synced from Garmin/TrainingPeaks
- Percentage: standard zone systems (Coggan, Karvonen, Friel) — resolves to absolute using nearest
athlete_metrics anchor value (FTP, max HR, etc.)
Per-sport overrides
sport_type = NULL = default zones for all sports
sport_type = 'cycling' = cycling-specific power zones
- Running gets HR + pace zones, cycling gets power + HR zones
Zone priority per sport (sport_zone_priorities)
- Which metric drives time-in-zone display: power > HR > pace for cycling, HR > pace for running
- Which metric drives training load calculation
- Default equipment auto-assignment per sport
TRIMP weighting
- Each HR zone carries a weighting factor for HR-based training load calculation
- e.g., Z1 = 1.0, Z2 = 1.1, ..., Z5 = 4.0
Depends on
- #31 Implement SYNTHESIS Schema
- #35 Training Zones & Zone Analysis Schema
Blocks
#21, #24, #25
Reference
See docs/api-research/SYNTHESIS.md §7 (training_zones table, sport_zone_priorities table).