MGFI is a per-muscle composite computed from soreness rating, objective session performance, set volume completion, and workload rating. It produces two orthogonal scores (readiness and accumulation) that gate volume adjustments, recovery triggers, and deload decisions independently.
Last calibrated: 2026-05-08
The Muscle Group Fatigue Index (MGFI) quantifies cumulative fatigue for a single muscle group after a training session. Unlike a single scalar, MGFI decomposes into two independent indices:
Both indices are bounded [0, 1]. Higher readiness index means more recovered; higher accumulation index means more accumulated fatigue. Each muscle group in a session receives an independent MGFI computation; there is no cross-muscle averaging.
Six inputs feed the two MGFI indices. Pump rating is collected but carries zero causal weight; it is displayed as a session annotation only.
| INPUT | SOURCE | SCALE | WEIGHT IN FORMULA |
|---|---|---|---|
| Performance severity (P) | Objective: Δe1RM or Δtotal reps vs prior session | none / mild / moderate / severe | 0 / 0.3 / 0.6 / 1.0 (mapped via PERF_SCORE) |
| Baseline coverage (C) | Fraction of planned exercises with prior session data | 0-1 | Multiplies P: effectivePerfScore = P × C |
| Soreness readiness (SR) | User self-report at session start (0-3) | 0→1.0, 1→0.85, 2→0.60, 3→0.35 | 40% of readinessIndex via (1 − SR) |
| Soreness carryover (SC) | Same soreness rating, accumulation path | 0→0.0, 1→0.15, 2→0.50, 3→0.85 | 30% of accumulationIndex |
| Objective set fraction (OSF) | Weighted actual sets ÷ planned sets | 0-1 (clamped) | 50% of accumulationIndex |
| Workload modifier (W) | User workload rating at session end (0-3) | 0→0.10, 1→0.40, 2→0.75, 3→1.0 | 20% of accumulationIndex |
| Pump rating | User self-report after session (0-2) | 0=poor, 1=moderate, 2=good | Display annotation only, zero causal weight |
Derived inputs
effectivePerfScore = PERF_SCORE[perfSeverity] × baselineCoverage where PERF_SCORE: none→0, mild→0.3, moderate→0.6, severe→1.0 sorenessReadiness = SORENESS_READINESS[soreness] where SORENESS_READINESS: 0→1.00, 1→0.85, 2→0.60, 3→0.35 sorenessCarryover = SORENESS_CARRYOVER[soreness] where SORENESS_CARRYOVER: 0→0.00, 1→0.15, 2→0.50, 3→0.85 objectiveSetFraction = clamp(0, 1, weightedActualSets / expectedWeightedSets) where FATIGUE_WEIGHT: low→0.5, medium→1.0, high→1.5 workloadModifier = VOLUME_STRESS[workloadRaw] where VOLUME_STRESS: 0→0.10, 1→0.40, 2→0.75, 3→1.00
Readiness index
readinessIndex = clamp(0, 1, 1.0 − (effectivePerfScore × 0.60 + (1 − sorenessReadiness) × 0.40) )
Accumulation index
accumulationIndex = clamp(0, 1, objectiveSetFraction × 0.50 + sorenessCarryover × 0.30 + workloadModifier × 0.20 )
Weight rationale: objective set completion (0.50) dominates accumulation because it is the only fully quantitative signal: sets either occurred or did not, regardless of user perception. Soreness carryover (0.30) captures inter-session residual stress that persists even when in-session performance is normal. Workload modifier (0.20) provides a subjective ceiling that prevents the accumulation index from remaining low when the user reports an unusually demanding session.
For readiness, objective performance severity dominates (0.60) because it reflects whether the muscle produced force at the expected level, the most direct fatigue signal available within a session. Soreness readiness (0.40) captures the prior-day residual that the objective measure cannot detect before training begins.
Session: Chest, Week 4, Day 1
Soreness at session start: 2 / 3
Pump at session end: 2 / 2 (good, annotation only)
Workload at session end: 2 / 3
Performance severity: mild (−3 total reps vs prior session)
Baseline coverage: 1.0 (3/3 exercises have prior data)
Sets completed / planned: 9 / 10 (fatigueClass=medium → weights=1.0)
objectiveSetFraction = 9/10 = 0.90Computation
effectivePerfScore = PERF_SCORE[mild] × 1.0
= 0.3 × 1.0 = 0.30
sorenessReadiness = SORENESS_READINESS[2] = 0.60
sorenessCarryover = SORENESS_CARRYOVER[2] = 0.50
workloadModifier = VOLUME_STRESS[2] = 0.75
objectiveSetFraction = clamp(0, 1, 9/10) = 0.90
readinessIndex = clamp(0, 1,
1.0 − (0.30 × 0.60 + (1 − 0.60) × 0.40))
= 1.0 − (0.18 + 0.16)
= 1.0 − 0.34
= 0.66
accumulationIndex = clamp(0, 1,
0.90 × 0.50 + 0.50 × 0.30 + 0.75 × 0.20)
= 0.45 + 0.15 + 0.15
= 0.75Accumulation index: volume and recovery routing
| ACCUMULATION INDEX RANGE | STATUS | DOWNSTREAM DECISION |
|---|---|---|
| < 0.30 | Fresh | No volume adjustment. Progression allowed. |
| 0.30 - 0.49 | Moderate | Volume held. Load progression suppressed. |
| 0.50 - 0.64 | Elevated | Volume reduction candidate. Recovery check triggered. |
| ≥ 0.65 | High | Reactive deload eligible. Recovery protocol surfaced to user. |
Readiness index: load and volume prescription
| READINESS INDEX RANGE | INTERPRETATION |
|---|---|
| ≥ 0.80 | Muscle group ready for full planned volume and load. |
| 0.60 - 0.79 | Moderate readiness. Autoregulation may reduce load prescription. |
| 0.40 - 0.59 | Impaired readiness. Volume reduction applied by autoregulation engine. |
| < 0.40 | Low readiness. Recovery session prescription triggered. |
What MGFI does not measure:
Schoenfeld, B.J. (2017). Science and Development of Muscle Hypertrophy. doi:10.1519/JSC.0000000000001817
Helms, E.R., Aragon, A.A., and Fitschen, P.J. (2014). Evidence-based recommendations for natural bodybuilding contest preparation: nutrition and supplementation. doi:10.1080/02640414.2013.862363