Pick a famous training plan from the dropdown. The chart overlays the plan's published week-by-week km against what our continuous model and J-H-R cycle would produce starting from the plan's week 1. Use this to test our hypotheses against real coaching data. Companion to published-plan-benchmarks.md.
For each plan, our continuous model (K from Option B schedule) and J-H-R cycle starting at plan W1, simulated for the plan's duration. Compare peaks to see where our models land relative to coaching consensus.
| Plan | Start km | Wks | Plan peak | Cont. peak (K=4) | Cycle peak | Plan max WoW% |
|---|
Each dot is a single cutback week in a published plan. x = preceding 3-week peak volume. y = the % drop in that cutback week. Taper weeks (final 3 weeks pre-race) are excluded so we're looking at periodic recovery cutbacks, not race tapers.
new_runner and developing are
too deep across the board — even Higdon's hardest plans only use 30 % at 85+ km/wk peaks.| Plan | Peak (excl. taper) | Cutback range | Median | Cadence |
|---|
| Tier (current code) | Current cut % | Coaching consensus | Proposed |
|---|---|---|---|
| new_runner | 30 % | ~10 % | 10 % |
| developing | 28 % | ~15 % | 15 % |
| established sub-80 | 15 % | ~20 % | 20 % |
| established ≥ 80 | 25 % | ~25-30 % | 25 % (keep) |
| advanced/elite | — | ~30 % | 30 % |
Two minimal code changes (full diffs in published-plan-benchmarks.md § 4.5): (a) calibrate cycle cutbacks to coaching consensus (drop new_runner 30 %→10 %, developing 28 %→15 %, established 25 %→20 %, etc.); (b) add an additive floor (+0.6 to +0.8 km/wk) below 25 km/wk chronic, where percentage growth underflows.
Each plan gets two pairs of bars: current vs proposed cycle (red), current vs proposed continuous (green). 0 % = matches the plan exactly; negative = under-shoots.
Cumulatively, this benchmark suite says: our continuous model is a base-building tool, not a plan-execution tool. If we want to replicate Pfitzinger or Higdon Intermediate trajectories, the architectural answer is "plan mode" — let the user subscribe to a published plan template, and our model runs underneath as the safety layer (Frandsen cap + monotony guard + ACWR overrides). That's orthogonal to the continuous-vs-cycle debate.
// tren_web/src/domain/volume-cycle.ts export const CYCLE_PARAMS: Record<string, CycleParams> = { - new_runner: { holdWeeks: 3, reduceCut: 0.30 }, // 5-week J-H-H-H-R - developing: { holdWeeks: 2, reduceCut: 0.28 }, // 4-week J-H-H-R - established: { holdWeeks: 2, reduceCut: 0.25 }, // 4-week J-H-H-R - cross_sport: { holdWeeks: 3, reduceCut: 0.30 }, // 5-week J-H-H-H-R - strength_athlete: { holdWeeks: 2, reduceCut: 0.28 }, // 4-week J-H-H-R + new_runner: { holdWeeks: 2, reduceCut: 0.10 }, // was 5-wk, 30% + developing: { holdWeeks: 2, reduceCut: 0.15 }, // was 28% + established: { holdWeeks: 2, reduceCut: 0.20 }, // was 25% + cross_sport: { holdWeeks: 2, reduceCut: 0.15 }, // was 5-wk, 30% + strength_athlete: { holdWeeks: 2, reduceCut: 0.15 }, // was 28% }; -const LOW_VOL_CYCLE: CycleParams = { holdWeeks: 1, reduceCut: 0.15 }; +const LOW_VOL_CYCLE: CycleParams = { holdWeeks: 1, reduceCut: 0.18 }; // matches Higdon Intermediate ~18% cut median // tren_web/src/domain/continuous-progression.ts — inside computeContinuousVolumeCap const growthRate = (headroom / kStructEff) * mskCoefValue; - const vTarget = vChronic * (1 + growthRate); + const vTargetPct = vChronic * (1 + growthRate); + // Additive floor at very low volumes — Higdon Novice 5K/10K progresses ~+0.8 km/wk linearly + const minStepKm = vChronic < 15 ? 0.8 : vChronic < 25 ? 0.6 : 0; + const vTarget = Math.max(vTargetPct, vChronic + minStepKm);