Implementation Notes
L2 design doc. Every Bakken-stated parameter is named with units and source citation. Comparison to what tren does today. Open questions for the engine-implementation plan to pick up. No code references — those belong in plans/.
Section 0Executive Summary — What Would Change
Tren’s planner today uses Jack Daniels VDOT-derived pace zones and a 5-phase race-block periodization model (speed → extend → race_specific → long_runs → simulation) computed by tren_plan_engine_v2/src/periodization.py. Bakken’s model differs in three fundamental ways:
| Dimension | Tren today | Bakken model | Delta |
|---|---|---|---|
| Intensity prescription | Pace-based (Daniels VDOT paces) | Lactate-based (mmol/L targets per session) | Gap — no mmol/L layer in engine |
| Threshold target | ~4.0 mmol/L implied (LT2 pace) | 2.0–3.0 mmol/L (lower, higher volume) | Gap — tren LT2 pace is Bakken Z3/Z4 boundary |
| Session structure | Single sessions; no AM/PM splits | Double-threshold days (AM + PM), 2×/wk | Gap — no double-session concept in data model |
| Year structure | Race-block phases backward from A-race | Flat weekly template + altitude-anchored variation | Partial — seasonal context missing; race block present |
| Race build phases | 5 phases: speed, extend, race_specific, long_runs, simulation | 4 phases: Intro, Development, Core, Taper | Partial — tren has a race block but phase content differs |
| Microcycle blocks | Weekly J-H-R-Ret volume cycle | 10–14 day intensive blocks + 7-day lighter | Gap — tren cycles are weekly, not 10-14 day |
| Career maturity | Aerobic maturity score scales Q_pct 0.15→0.55 | Maturity determines whether volume or quality is primary driver | Partially implemented — aerobic_maturity_design.md |
Bu’s athletes (active pro racers) run 4+ threshold sessions/wk and 20+ h/wk Z1–Z2, resulting in the same emergent 80/20 ratio but through higher absolute volume. Ingebrigtsen uses the same double-threshold structure as Bakken but at 160–200 km/wk with altitude camps as the primary periodization tool. Both are consistent with Bakken’s core framework; they differ only in total training load and competitive-season demands.
Section 1Lactate Zones — Bakken vs. Daniels (tren today)
| Zone | Bakken lactate (mmol/L) | Bakken %VO₂max | Bakken intent | Daniels equiv. (tren today) | Source |
|---|---|---|---|---|---|
| Z1 Easy | < 1.5 mmol/L | 59–74% | Recovery; capillary + mitochondrial density over years | Easy (E) pace: 59–74% VO₂max | mariusbakken.com — Kenyan Training; bakken-research.md |
| Z2 Aerobic | 1.5–2.0 mmol/L | 75–82% | Aerobic endurance; used as float recovery between threshold reps | Moderate / sub-threshold (“M” pace) | mariusbakken.com — Kenyan Training |
| Z3 Threshold (LT) | 2.0–3.0 mmol/L | 83–88% | Primary training zone. All double-threshold sessions target here. Steady-state below 3.0. | Threshold (T) pace: 83–88% VO₂max / ~4 mmol/L implied | mariusbakken.com — Norwegian Model; Running Writings 2024 |
| Z4 Track | 3.0–8.0 mmol/L | 95–100% | Race-specific intervals; VO₂max work; “X element” (1×/wk max) | Interval (I) pace: 95–100% VO₂max | mariusbakken.com — Kenyan Training; Norwegian Model |
| Z5 Lactic | > 8.0 mmol/L | > 100% | Very occasional; pure lactic; race-specific only | Repetition (R) pace: 105–120% VO₂max | mariusbakken.com — Kenyan Training |
Preben VDOT 59 → Daniels T pace ≈ 4:07/km (tren’s current LT2 target). In Bakken’s model, this pace corresponds to approximately 3.5–4.5 mmol/L — above Z3 into Z4. Preben’s Bakken Z3 threshold would be closer to 4:20–4:30/km (2.0–2.5 mmol/L). The Bakken prescription is slower but allows 2× the volume at that intensity. His current 42% threshold ratio at ~40 km/wk is consistent with an established-maturity athlete applying Bakken’s philosophy.
Critical implementation note: tren currently has no field for lactate-mmol/L targets. Pace zones are derived from VDOT. Implementing Bakken’s Z3 prescription requires either (a) a lactate-to-pace conversion that accounts for individual threshold lactate level (VDOT + lab test result), or (b) accepting that tren’s T pace ≈ Bakken Z3/Z4 boundary and communicating this to users. Option (b) is a safer first step; option (a) is the physiologically correct implementation.
Section 2Year (A) — Seasonal Periodization, Formalized
Bakken’s year is not a sequential 4-phase mesocycle. It is a flat weekly template where the intensity mix and volume shift by season, anchored by altitude blocks. The following table formalizes the primary-source parameters.
| Season | Duration | Weekly km | Threshold sessions/wk | Intensity character | Transition trigger |
|---|---|---|---|---|---|
| Winter / Base | ~26 wk (Nov–Apr) | 160–230 (optimal ~180) | 4 (2× double-threshold) + 1× X element | Maximize threshold volume; all Z3 with one Z4 session/wk | Date-driven (spring race season starts). No physiological threshold. |
| Spring / Build | ~13 wk (Apr–Jun) | ~160–180 | 3–4 (mix of double and single) | Introduce 300–400m track at Z4 (6–8 mmol/L); maintain Z3 base | First competition period beginning; track season approach. |
| Summer / Competition | ~10 wk (Jul–Sep) | ~160 (reduced) | 1–2 single threshold sessions | “Much more pure sessions, either a pure session in relation to 5000 or 3000 pace” (Running Writings, 2024) | Major race schedule dictates. Reduce doubles; preserve speed. |
| Taper | ~2 wk | −50% vs competition | 1–2 (shortened) | Intensity preserved; volume halved. Standardized threshold 2d pre-race. | A-race date − 14 days. |
Preben (10K focus, ~40 km/wk) maps to established tier. In a Bakken-informed year, his Winter/Base would maintain 2 threshold sessions/wk (not full double-threshold — established tier, not pro). Spring/Build adds one 5K/10K pace session. Summer/Competition reduces to 1 threshold + 1 race-specific session per week. Taper: 1 short threshold (3×6min) 2 days before race. Altitude is optional — the flat weekly template at his volume level doesn’t require it.
Tren’s current periodization maps phases backward from the A-race, producingspeed → extend → race_specific → long_runs → simulation. This is closer to Lydiard/Pfitzinger periodization than Bakken. Adding a “seasonal context” layer above the race-block phases (so Winter/Base influences Q_pct, and Summer/Competition signals fewer doubles and more race-specific work) would be the minimal-diff Bakken integration.
Section 3Race Build (B) — 100-Day Marathon Plan, Formalized
Four explicit phases (the plan preamble says “5 distinct phases” but enumerates 4; we adopt 4 as canonical). Total duration: 15 weeks / ~105 days. Plan is flexible 60–150 days without losing structural integrity. Source: 100daymarathon.com.
| Phase | Weeks | Volume vs peak | Dominant sessions | Marker workouts | Exit criteria |
|---|---|---|---|---|---|
| 1. Introduction | 1–2 | ~60% | 45/15 intervals (neuromuscular priming) | 8–10 × 45s hard, 15s easy. Z4 single reps (1 min hard, 30s). | Time-based (2 weeks) |
| 2. Development | 3–6 | ~75–85% | VO₂max work (5K/10K pace) progressng to threshold (HM pace) | 5×1000m @ 5K pace (Z4); 4×8 min @ HM effort (Z3); progressive runs. | Time-based (4 weeks) |
| 3. Specifics — The Core | 7–13 | ~90–100% | Long runs with marathon-pace segments + extended threshold sessions | 16–20 km long run with 8–10 km @ marathon pace (2.0–2.5 mmol/L); 5×5 min threshold with 2-min float. | Time-based (7 weeks) |
| 4. Taper & Race | 14–15 | ~50% | Reduced volume; intensity unchanged | Day −4: 4×1000m diagnostic @ race pace (reads readiness). Day −2: standardized 2×8 min threshold. | Race day |
Preben targeting a 10K in 15 weeks (from today, 2026-05-15, A-race ~2026-08-30): Phase 1 through May 29; Phase 2 through June 26; Phase 3 through August 14; Phase 4 through race day. His marker workouts: Phase 3 long run with marathon-pace segments replaced by 10K-pace segments (he is not a marathoner) — e.g. 10 km easy + 3 km @ 3:55/km (his 10K race pace at VDOT 59). Phase 4 diagnostic: 4×1000m targeting 3:55/km — if lactate stays below 3.5 mmol, race-day pacing plan is on track.
Tren’s current 5-phase race block maps closest to Bakken Phase 2 (speed ≈ Development) and Phase 3 (race_specific + long_runs ≈ Core). The Bakken “Introduction” phase (neuromuscular priming) has no equivalent in tren today. The Bakken Taper (with the 1000m diagnostic) is more prescriptive than tren’s current simulation phase.
Section 4Microcycle Blocks (D) — Block Math
Bakken structures intensive training into blocks. There are two documented models:
| Model | Block length | Recovery period | Session map | When to apply |
|---|---|---|---|---|
| Altitude (short) | 7–14 days at altitude | ~7 days easy on return | Threshold on days 1, 3, 5, 7 (of altitude trip). Rest/easy other days. | Athletes with altitude access. Bakken’s preferred model: “I wasn’t after hemoglobin — it was the training effect.” |
| Non-altitude block | 10–14 days intensive | 7 days lighter | 2× double-threshold days per week within the block. Standard flat-week template. | Athletes without altitude access. Bakken suggests this as the “10–14 days on and 7 days off” substitute. |
Post-altitude peaking windows (Bakken’s personal response curve, consistent race-after-race per Running Writings 2024 interview):
| Days post-altitude | Expected performance |
|---|---|
| 1 | Poor |
| 5–7 | Low point (notable dip) |
| 10–11, 14 | Peak window — race here |
| 17–20 | Secondary peak |
Race week template (within peak window): Day −6/−7 threshold session; day −4 diagnostic 1000m repeats at race pace (readiness predictor); day −2 standardized short threshold; race day.
Preben does not use altitude. For him, the non-altitude block model applies: 10–14 days of full training (2 threshold sessions/wk at his established-tier volume), then a 7-day lighter week. This maps to tren’s current J-H-R-Ret 4-week cycle (Jump → Hold × 1 → Reduce → Return) — the reduction week approximates the 7-day lighter period, and the jump week approximates the transition into the next block. The main difference is duration: Bakken’s block is 10–14 days, tren’s is 28 days (4-week). This is an open design question.
Section 5Career Maturity (C) — What's Already in Tren vs Bakken's Prescription
Tren already implements aerobic maturity via aerobic_maturity_design.md and the aerobic_maturity field in plan_states.state. The maturity score scales Q_pct (quality proportion ceiling) from 0.15 to 0.55. Bakken’s model adds specificity to what that maturity means at session level.
| Maturity tier | Bakken prescription | Tren today | Gap |
|---|---|---|---|
| New runner | Easy volume primary. Single threshold sessions only. Z1/Z2 builds structural base (bone, tendon). | Q_pct ceiling 0.15. Low threshold volume. | Aligned |
| Developing | 2 threshold sessions/wk introduced. No double-threshold days yet. | Q_pct ceiling ~0.25. | Partial — no rule preventing double-threshold for developing tier |
| Established | Double-threshold days appropriate. Easy volume can be selectively reduced. Quality proportion 25–40%. | Q_pct ceiling ~0.40. | Partial — Q_pct right; double-threshold structure not yet in data model |
| Mature / Quality-dominant | 3 quality sessions/wk. Easy volume near-zero (for deeply established athletes). Threshold is full driver. | Q_pct ceiling 0.55. aerobic_maturity ≥ 0.60. | Mostly aligned — threshold-as-driver logic in aerobic_maturity_design.md |
Preben: established tier, aerobic_maturity ≈ 0.55–0.65 (7.5 years running, thousands of cumulative km). Q_pct ceiling 0.40–0.45. His current 42% threshold at ~40 km/wk is consistent with mature-established behavior — not a distribution problem, per Bakken’s philosophy. Double-threshold days are appropriate for him at his volume level; the engine does not currently prescribe them (they would be 2 sessions in one day, ~8–10 km total, twice a week at his volume). This is the largest structural gap for Preben.
Section 6Tren Today vs Bakken — Full Mapping Table
| Concept | Tren today | Bakken model | Delta |
|---|---|---|---|
| Intensity model | Daniels VDOT pace zones (E, M, T, I, R) | Lactate mmol/L zones (Z1–Z5, 1.5 / 2.0 / 3.0 / 8.0 thresholds) | Gap — no mmol/L layer |
| Threshold target lactate | ~4.0 mmol/L implied (Daniels T) | 2.0–3.0 mmol/L | Gap — Bakken threshold is lower and wider |
| Session structure | Single sessions; AM/PM splits undefined | Double-threshold days (AM long intervals + PM short intervals) | Gap — data model has no AM/PM split concept |
| Year periodization | Race-block phases backward from A-race only | Flat weekly template + seasonal intensity-mix shifts | Gap — no seasonal layer above race block |
| Race build phases | speed → extend → race_specific → long_runs → simulation | Introduction → Development → Core → Taper | Partial — structure present; Bakken phase content differs |
| Volume cycle (microcycle) | 4-week J-H-R-Ret (Jump +5–10% → Hold → Reduce −25% → Return 90%) | 10–14 day intensive + 7-day lighter (non-altitude); 7-14d altitude trip + 7d recovery | Partial — reduction logic present; block length and altitude-peaking absent |
| Taper protocol | Phase: simulation (Mujika-inspired −50% volume, intensity maintained) | 2 weeks: standardized threshold D−2; 1000m diagnostic D−4; volume −50% | Mostly aligned — diagnostic session not present |
| X element / VO₂max session | Prescribed per aerobic_maturity and VO₂max tier (Z4 format) | 1×/wk; hill sprints or 10×200m in Winter; race-specific Z4 in Summer | Mostly aligned |
| Career maturity | aerobic_maturity score → Q_pct 0.15–0.55 | Maturity = permission to reduce easy volume + raise quality proportion | Mostly aligned — aerobic_maturity_design.md |
| Long run philosophy | long_runs phase prescribes long runs as a training stimulus | Long run is a race rehearsal, not a training stimulus (fueling, pacing, time on feet). Cap at 16–18 km for 5K/10K athletes. | Partial — marathon athletes get long runs; 5K/10K athletes could benefit from Bakken’s cap |
Section 7Open Design Questions
These are the unresolved tradeoffs the engine-implementation plan will need to decide:
| # | Question | Options | Bakken’s answer |
|---|---|---|---|
| OQ1 | How do we prescribe Bakken Z3 (2.0–3.0 mmol/L) when we don’t have lactate data for most users? | (a) Use VDOT-derived sub-threshold pace as proxy (~Z3 lower bound). (b) Collect lactate via lab test (onboarding step physiology). (c) Use HR: target 80–87% HRmax. | Lactate testing is the ground truth. HR is a reasonable proxy if "the heart rate at lactate threshold rises with fitness" (Running Writings 2024). |
| OQ2 | Should the engine prescribe double-threshold days (AM + PM sessions on same day)? | (a) Yes, for established/mature athletes with ≥35 km/wk. (b) No — current tren data model only supports 1 session per day. Implement single extended threshold sessions instead. | Double-threshold requires ≥35 km/wk and established+ tier. Below that, single sessions are the right prescription. |
| OQ3 | Should the volume cycle shift from 4-week J-H-R-Ret to Bakken’s 10–14 day blocks? | (a) Keep 4-week cycle (matches tren’s current MSK/bone remodeling rationale). (b) Move to 10–14 day. (c) Make configurable per tier. | 10–14 day block with 7-day lighter. But his rationale is altitude-anchored; without altitude, the 4-week cycle may be physiologically justified (MSK remodeling takes 3–4 weeks). |
| OQ4 | Should tren add a seasonal periodization layer above the race-block phases? | (a) Yes — add Winter/Spring/Summer/Taper layer; let it influence Q_pct and session composition. (b) No — race-block phases are sufficient; seasonal color is educational only. | Bakken’s year is fundamentally flat; the seasonal shifts are modest. The race-block model may be a better practical fit for tren’s goal-based architecture. |
| OQ5 | Should tren add the 1000m diagnostic session to the taper phase? | (a) Yes — prescribe a race-specific diagnostic 4 days before A-race. (b) No — readiness is covered by ACWR and the planner; adding a diagnostic prescription is over-engineering for recreational athletes. | Bakken considers this non-negotiable for knowing readiness. But he was a pro with a lab; recreational athletes may find it confusing. |
| OQ6 | How should the Intro phase (neuromuscular priming) be added to tren’s race build? | (a) Prepend a 1–2 week “activation” block before the current speed phase. (b) Merge neuromuscular work into the speed phase (already has strides/X-element). (c) Make it conditional on maturity tier (only new/developing athletes need it). | Short fast work (45/15s, strides) as phase entry is appropriate at all levels but especially for athletes coming off easy base training. |
research/aerobic_maturity_design.md, research/bu-research.md, tren_plan_engine_v2/src/periodization.py, tren_domain/src/tren_domain/planner/volume_cycle.py.