Modality
Also known as: Session Modality, Session Type Bucket
The 3-bucket coarse classification we apply to every session: Strength, Endurance, or Mixed. Modality is what makes weekly AU a richer story than a single number — it tells you whether your week leaned barbell-heavy, aerobic, or hybrid.
Formula
Path A (primary): the LLM populates session.modality at plan generation.
Path B (fallback): a deterministic classifier infers modality from session.focus, sessionType, and exercise composition when Path A is missing or malformed.Example
A 5x5 squat-press-pull session = strength. A long Z2 ride = endurance. A circuit of kettlebell swings + box jumps + rowing = mixed. A hypertrophy push session = strength. A skill / drill / mobility flow = mixed.
How Afitpilot Uses This
Modality drives the weekly AU split shown on the coach drawer and the athlete Insights view. The plan generator prompts (week-plan and master-plan) now require session.modality on every output session. Historical sessions are classified with the Path B fallback during the load_summary backfill and tagged modalitySource: 'classified' so the UI can hint at inferred data.
Why a 3-bucket coarse split
| Who / Context | Value | Note |
|---|---|---|
| Strength research | Tonnage works | Mechanical-tension load is well captured by sets x reps x weight |
| Endurance research | TSS / TRIMP works | Power or HR-zone metrics, but require power meters or HR thresholds we don't have |
| Skill / mixed sessions | No good external metric | sRPE x duration is the only universal currency that works here |
| Practical reality | Most athletes blend | Even pure lifters do conditioning, warm-ups, mobility — modality split makes the blend visible without overengineering |
Known Limitations
- •Three buckets is intentionally coarse. "Mixed" is the catch-all for skill, mobility, hybrid, conditioning, and "didn't fit elsewhere" sessions, which can hide real differences (a power session versus a yoga flow both land in Mixed).
- •Path A and Path B can disagree on the same session — particularly for hybrid sessions where the LLM and the classifier weight differently. Validation target is >=95% agreement.
- •Classifier rules are keyword-based on session.focus and sessionType — niche labels can fall through to the Mixed default. Edge cases (e.g. a powerlifting opener simulator session) may be miscategorised.
- •Modality is per-session, not per-block. A session with a strength main + a conditioning finisher is bucketed as one or the other, not both.
What We're Improving
Science Context
The 3-bucket split mirrors how Impellizzeri (2020) frames internal versus external load: internal load (sRPE, AU) generalises across modalities, but external load (tonnage, TSS, distance) is modality-specific. By bucketing internal load by modality we get the best of both — a comparable AU number with enough context to interpret what produced it. We resisted finer splits (per-sport or per-energy-system) because the marginal information gain is small relative to classification reliability cost.