---
date: '2026-05-29'
description: training data and tracking
dexa:
  - ag: 1.29
    arms:
      bmc: 1
      fat: 4.7
      lean: 17.2
    bmcLbs: 7.8
    bmd: 1.383
    bmdT: 1.8
    bodyFat: 27.4
    date: '2026-06-25'
    fatLbs: 54.2
    fatLossTo14PctLbs: 30.8
    ffmLbs: 143.5
    leanLbs: 135.7
    legs:
      bmc: 3
      fat: 17.7
      lean: 54.4
    rmr: 1695
    rsmi: 9.2
    targetBodyFat: 14
    targetFatLbs: 23.4
    targetTotalLbs: 166.9
    tissueFat: 28.5
    tissueLean: 68.7
    totalLbs: 197.6
    trunk:
      bmc: 2.3
      fat: 29.3
      lean: 55
    vatAreaIn2: 8.64
    vatLbs: 1.24
events:
  ironman-70.3--nyc--26:
    T1: null
    T2: null
    bike: null
    distance: null
    overall: null
    run: null
    swim: null
  supertri--tor--26:
    T1: '00:08:42'
    T2: '00:03:05'
    bike: '01:11:11'
    distance: olympic
    overall: '02:57:19'
    run: '00:53:15'
    swim: '00:41:08'
id: triathlon
layout: triathlon
maintenance:
  OSPW:
    - - type: Ultegra R8100 Pulley Wheel
      - distance: 1335
      - range:
          - end: '2026-08-10'
            start: '2026-05-16'
      - reason: upgrades to CeramicSpeed OSPW
    - - type: CeramicSpeed OSPW RS 5 Spoke
      - distance: null
      - range:
          - end: null
            start: '2026-08-10'
  bottom bracket:
    - - type: FSA, T47 BBright for 24mm spindle
      - distance: 1727.25
      - range:
          - end: '2026-08-21'
            start: '2026-05-16'
      - reason: upgrades to CeramicSpeed
    - - type: CeramicSpeed T47 BBright for Shimano
      - distance: null
      - range:
          - end: null
            start: '2026-08-21'
      - reason: null
  chain:
    '1':
      chainring: ultegra
      distance: 621
      lubricant: Muc-Off Dry Lube
      ospw: ultegra
      since: '2026-05-16'
      waxed: false
    '2':
      chainring: ultegra
      distance: 419.42
      lubricant: Muc-Off Dry Lube
      ospw: ultegra
      since: '2026-07-16'
      waxed: false
    '3':
      chainring: ultegra
      distance: 408.65
      lubricant: UFO Wax Drip-On
      ospw: ceramicspeed
      since: '2026-08-10'
      waxed: true
    '4':
      chainring: carbonti
      distance: null
      lubricant: UFO Wax Drip-On
      ospw: ceramicspeed
      since: '2026-08-22'
      waxed: true
  chainrings:
    - - type: Ultegra FC-R8100 52-36T
      - distance: 1727.25
      - range:
          - end: '2026-08-21'
            start: '2026-05-16'
      - reason: upgrades to CarbonTi
    - - type: CarbonTi 54-40T
      - distance: null
      - range:
          - end: null
            start: '2026-08-22'
      - reason: null
  service:
    soloist:
      - date: '2026-08-21'
        distance: 1727.25
        place: Racer Sportif
    speedmax: null
  tires:
    front:
      tires:
        - - type: Vittoria Corsa N.EXT TLR G2.0 700x29c
          - distance: 751.81
          - range:
              - end: '2026-07-16'
                start: '2026-05-16'
          - reason: training to race tires
        - - type: Pirelli P Zero Race TLR SL-R 700x28c
          - distance: 619.84
          - range:
              - end: '2026-08-10'
                start: '2026-07-16'
          - reason: punctures
        - - type: Pirelli P Zero Race SL-R 700x28c
          - distance: null
          - range:
              - end: null
                start: '2026-08-12'
          - reason: null
      tube:
        - - type: Pirelli P Zero TPU
          - distance: 619.84
          - range:
              - end: '2026-08-10'
                start: '2026-07-16'
          - reason: punctures
        - - type: Pirelli P Zero TPU
          - distance: null
          - range:
              - end: null
                start: '2026-08-12'
          - reason: null
    rear:
      tires:
        - - type: Vittoria Corsa N.EXT TLR G2.0 700x29c
          - distance: 751.81
          - start: '2026-05-16'
          - end: '2026-07-16'
          - reason: training to race tires
        - - type: Pirelli P Zero Race SL-R 700x28c
          - distance: null
          - range:
              - end: '2026-08-10'
                start: '2026-07-16'
              - end: null
                start: '2026-08-18'
          - reason: punctures and big ruptures, but fixed
        - - type: Pirelli P Zero Race SL-R 700x28c
          - distance: 258.65
          - range:
              - end: '2026-08-17'
                start: '2026-08-12'
          - reason: big punctures cut
      tube:
        - - type: Pirelli P Zero TPU
          - distance: 878.49
          - start: '2026-07-16'
          - end: '2026-08-17'
          - reason: big punctures
          - repaired: false
        - - type: Pirelli P Zero TPU
          - distance: null
          - start: '2026-08-17'
          - end: null
          - reason: null
          - repaired: null
modified: 2026-08-20 12:59:38 GMT-04:00
seealso:
  - '[[thoughts/pdfs/supertri.pdf|SuperTri fuel plan]]'
  - '[[thoughts/pdfs/703NYC.pdf|IRONMAN 70.3 NYC fuel plan]]'
strava: '2026-05-15'
tags:
  - life
  - self
  - evergreen
title: triathlon
triathlon: '70.3'
vo2max:
  - caloriesAtVt1: 850
    date: '2026-06-25'
    hrAtVo2max: 180
    hrMax: 182
    massKg: 88.9
    maxKmh: 15
    percentile: 70
    profile:
      cooldownStartSec: 735
      durationSec: 760
      samples:
        - - 0
          - 9.6
          - 73
          - 31.6
          - 16.9
          - 1.86
        - - 10
          - 9
          - 77
          - 34.9
          - 15.2
          - 2.37
        - - 20
          - 8.4
          - 79
          - 34.2
          - 14.9
          - 2.51
        - - 30
          - 7.9
          - 81
          - 33.7
          - 17.5
          - 2.21
        - - 40
          - 7.1
          - 87
          - 32.2
          - 16.7
          - 2.21
        - - 50
          - 7.6
          - 92
          - 31.7
          - 15.8
          - 2.2
        - - 60
          - 8
          - 99
          - 28.5
          - 14.2
          - 2.09
        - - 70
          - 8.3
          - 95
          - 20.8
          - 13.9
          - 1.59
        - - 80
          - 7
          - 94
          - 14.8
          - 18.9
          - 1.02
        - - 90
          - 9.4
          - 95
          - 19.3
          - 18.8
          - 1.34
        - - 100
          - 12.3
          - 95
          - 24.2
          - 19.6
          - 1.5
        - - 110
          - 15.4
          - 102
          - 31.6
          - 18.7
          - 1.89
        - - 120
          - 21.3
          - 112
          - 34.9
          - 19.1
          - 1.98
        - - 130
          - 17.6
          - 112
          - 30.9
          - 21.1
          - 1.53
        - - 140
          - 15.7
          - 110
          - 27.7
          - 20.4
          - 1.45
        - - 150
          - 13.4
          - 105
          - 26.4
          - 19.4
          - 1.49
        - - 160
          - 13.7
          - 106
          - 26.7
          - 22.6
          - 1.44
        - - 170
          - 15.6
          - 105
          - 30.4
          - 27.3
          - 1.37
        - - 180
          - 16.2
          - 109
          - 31.6
          - 31.9
          - 1.2
        - - 190
          - 17.4
          - 106
          - 32.9
          - 26.9
          - 1.42
        - - 200
          - 16
          - 101
          - 31.4
          - 24.4
          - 1.52
        - - 210
          - 14.5
          - 101
          - 31.4
          - 21.8
          - 1.52
        - - 220
          - 13.8
          - 103
          - 30.6
          - 22.2
          - 1.51
        - - 230
          - 14.3
          - 111
          - 33.1
          - 22.3
          - 1.67
        - - 240
          - 15.7
          - 121
          - 35.6
          - 21.2
          - 1.91
        - - 250
          - 16.7
          - 124
          - 37.8
          - 18.8
          - 2.18
        - - 260
          - 18.4
          - 127
          - 38.4
          - 18.3
          - 2.25
        - - 270
          - 20.3
          - 126
          - 40.8
          - 18.8
          - 2.33
        - - 280
          - 23
          - 127
          - 43.3
          - 18.6
          - 2.54
        - - 290
          - 25.8
          - 132
          - 46.8
          - 17
          - 2.83
        - - 300
          - 27.3
          - 139
          - 48.9
          - 17.4
          - 2.88
        - - 310
          - 27.4
          - 138
          - 49.7
          - 18.6
          - 2.78
        - - 320
          - 27.7
          - 133
          - 50.4
          - 21.2
          - 2.67
        - - 330
          - 26.5
          - 130
          - 51.2
          - 24.5
          - 2.33
        - - 340
          - 26.8
          - 135
          - 52.4
          - 26.3
          - 2.16
        - - 350
          - 28
          - 141
          - 54.9
          - 23.9
          - 2.38
        - - 360
          - 29
          - 145
          - 54.6
          - 22.8
          - 2.51
        - - 370
          - 29.8
          - 146
          - 54.6
          - 21.7
          - 2.65
        - - 380
          - 30.1
          - 145
          - 54.9
          - 21.4
          - 2.76
        - - 390
          - 30.3
          - 146
          - 56.7
          - 22.8
          - 2.58
        - - 400
          - 31.1
          - 145
          - 58.1
          - 21.6
          - 2.75
        - - 410
          - 31.9
          - 145
          - 59.3
          - 23
          - 2.59
        - - 420
          - 32
          - 148
          - 58.6
          - 22.1
          - 2.73
        - - 430
          - 36.2
          - 151
          - 66.5
          - 22.1
          - 3.02
        - - 440
          - 36.8
          - 154
          - 71.2
          - 23.5
          - 3.02
        - - 450
          - 36.2
          - 154
          - 72.2
          - 25.4
          - 2.9
        - - 460
          - 35
          - 152
          - 71.2
          - 29
          - 2.5
        - - 470
          - 36.9
          - 155
          - 74.7
          - 29.5
          - 2.58
        - - 480
          - 38.9
          - 158
          - 79.6
          - 27.5
          - 2.93
        - - 490
          - 38.4
          - 159
          - 81.1
          - 27.1
          - 3.01
        - - 500
          - 38.7
          - 161
          - 82.9
          - 27.3
          - 3.06
        - - 510
          - 40.5
          - 163
          - 86.1
          - 28
          - 3.11
        - - 520
          - 40.4
          - 164
          - 87.6
          - 31.3
          - 2.81
        - - 530
          - 39.9
          - 167
          - 85
          - 30.9
          - 2.76
        - - 540
          - 44.2
          - 168
          - 100.2
          - 34.2
          - 2.98
        - - 550
          - 43.1
          - 168
          - 110.3
          - 39.2
          - 2.82
        - - 560
          - 43.3
          - 169
          - 109.6
          - 39.3
          - 2.79
        - - 570
          - 43.1
          - 171
          - 106.8
          - 39.1
          - 2.72
        - - 580
          - 44.2
          - 173
          - 109.1
          - 39.4
          - 2.77
        - - 590
          - 43.7
          - 173
          - 107.6
          - 40.3
          - 2.68
        - - 600
          - 43.9
          - 176
          - 107.6
          - 41.7
          - 2.61
        - - 610
          - 46.1
          - 175
          - 111.6
          - 41
          - 2.74
        - - 620
          - 46.4
          - 176
          - 115.5
          - 41.4
          - 2.77
        - - 630
          - 47.5
          - 177
          - 115
          - 42.9
          - 2.67
        - - 640
          - 49.5
          - 177
          - 120.7
          - 42.8
          - 2.81
        - - 650
          - 46.5
          - 180
          - 116
          - 42.8
          - 2.7
        - - 660
          - 46.6
          - 179
          - 113.7
          - 43
          - 2.64
        - - 670
          - 47
          - 181
          - 111.5
          - 43.6
          - 2.57
        - - 680
          - 46
          - 181
          - 109.1
          - 42.6
          - 2.56
        - - 690
          - 47.2
          - 180
          - 108
          - 42.6
          - 2.54
        - - 700
          - 47.3
          - 181
          - 112
          - 45.8
          - 2.44
        - - 710
          - 48.5
          - 181
          - 121.4
          - 54.3
          - 2.27
        - - 720
          - 42.8
          - 180
          - 114.3
          - 45.5
          - 2.55
        - - 730
          - 42
          - 175
          - 112
          - 45.8
          - null
        - - 740
          - null
          - 166
          - null
          - null
          - null
        - - 750
          - null
          - 161
          - null
          - null
          - null
        - - 760
          - null
          - 158
          - null
          - null
          - null
      stats:
        hr:
          - 72
          - 182
          - 139
        rf:
          - 13
          - 56.4
          - 31.9
        tv:
          - 1
          - 3.2
          - 2.5
        ve:
          - 14.3
          - 123
          - 79.2
        vo2:
          - 6.7
          - 50.5
          - 35.9
      targetKmh:
        - - 0
          - 5
        - - 120
          - 7
        - - 240
          - 9
        - - 360
          - 11
        - - 480
          - 13
        - - 600
          - 15
        - - 710
          - 17
        - - 735
          - 5
      vo2maxSec: 670
      vt1Sec: 390
      warmupEndSec: 120
    value: 47.8
    ve: 117
    vt1Hr: 145
    vt1Kmh: 10.5
    vt2Hr: null
    vt2Kmh: null
    zonesHr:
      - 112
      - 121
      - 142
      - 171
    zonesKcal:
      - 480
      - 580
      - 820
      - 1170
    zonesKmh:
      - 7
      - 8
      - 10.5
      - 14
created: '2026-05-29'
published: '2026-05-29'
pageLayout: triathlon
slug: triathlon
permalink: https://aarnphm.xyz/triathlon.md
generator:
  quartz: v4.6.0
  hostedProvider: Cloudflare
  baseUrl: aarnphm.xyz
full: https://aarnphm.xyz/llms-full.txt
---
<!-- training plan start
meta: equation references
date: 2026-06-07
-->

## equation reference

This is the current calculation sheet for the triathlon activity cards and analytics. It describes what the site computes, rather than every value a provider may send. Unless a formula says otherwise, distance is in metres, time is in seconds, speed is in metres per second, heart rate is in beats per minute, and grade is a decimal rather than a percentage.

### source precedence

The activity-card values use these ordered sources:

1. Intensity factor uses Garmin’s native value when it exists.
2. Missing intensity factor is calculated from device power for a bike, pace for a run or swim, then heart rate as the remaining fallback.
3. Exercise load uses Garmin’s native value when it exists.
4. Missing exercise load is calculated from Garmin IF when Garmin supplied IF, otherwise from the locally calculated IF.
5. Garmin aerobic and anaerobic training effect scores, messages, and labels stay provider-native. There is no local EPOC or training-effect reconstruction.

The analytics load that drives CTL, ATL, TSB, ACWR, weekly load, and calibration is a separate, internally consistent pace-duration load. It uses grade-adjusted speed for every sport, including cycling. This keeps the longitudinal model on one scale, so it can differ from the exercise-load number shown on an activity card.

Training-effect scores are only clamped for display:

$$
\mathrm{TE}_{\mathrm{display}}
=
\operatorname{clamp}
\left(
\mathrm{TE}_{\mathrm{Garmin}},
0,
5
\right).
$$

When Garmin sends a score without a message, the local prose bins are

$$
\operatorname{label}(\mathrm{TE}) =
\begin{cases}
\text{no benefit}, & 0\le\mathrm{TE}<1,\\
\text{minor benefit}, & 1\le\mathrm{TE}<2,\\
\text{maintaining fitness}, & 2\le\mathrm{TE}<3,\\
\text{improving fitness}, & 3\le\mathrm{TE}<4,\\
\text{highly improving fitness}, & 4\le\mathrm{TE}<5,\\
\text{overreaching effect}, & \mathrm{TE}=5.
\end{cases}
$$

These labels interpret Garmin’s score. They do not calculate the underlying aerobic or anaerobic training effect.

### tire pressure

The gear panel starts with the latest valid Garmin morning body-mass sample. The rider-weight input accepts $25$–$200\ \mathrm{kg}$ and can display or accept either kilograms or pounds while retaining kilograms as the calculation value. A manual override is stored against the current Garmin measurement date, so a newer morning measurement becomes the next default. The Cervélo defaults to $22\ \mathrm{lb}=9.979\ \mathrm{kg}$ and the Speedmax defaults to $26\ \mathrm{lb}=11.793\ \mathrm{kg}$, using $1\ \mathrm{lb}=0.45359237\ \mathrm{kg}$. Each bike row exposes an editable pound value, persisted locally for that bike. A custom-bike row defaults to $20\ \mathrm{lb}$ and accepts the same $10$–$80\ \mathrm{lb}$ range. The command-palette flow accepts the rider unit, rider mass, and bike mass before calculating system mass:

$$
m_{\mathrm{system}}
=
m_{\mathrm{rider}}+m_{\mathrm{bike}}.
$$

The pressure calculation reproduces the public field model used by the [SILCA Professional Tire Pressure Calculator](https://silca.cc/en-ca/pages/pro-tire-pressure-calculator?_eab=1).[^silca-pressure] Let measured tire width be $w$ in millimetres, bead-seat diameter be $d$ in millimetres, average speed be $v$ in miles per hour, and $S$ be the surface coefficient:

| dry surface   |   $S$ |
| ------------- | ----: |
| new pavement  |   261 |
| worn pavement | 246.5 |
| poor pavement |   225 |
| cobblestone   |   199 |

The effective stiffness term and unloaded tire radius are

$$
k
=
0.5\left(m_{\mathrm{system}}-50\right)+S,
\qquad
r_0
=
w+\frac{d}{2}.
$$

The loaded radius, width polynomial, and centre pressure are

$$
r_{\mathrm{loaded}}
=
r_0-
\frac{4.905}{k\left(20/w\right)},
$$

$$
N(w)
=
-226.44
\left(
-0.00006w^3
+0.0079w^2
-0.4102w
+12.725
\right),
$$

$$
p_0
=
\frac{N(w)}{r_{\mathrm{loaded}}^2-r_0^2}.
$$

Speed contributes the linear coefficient

$$
c_v
=
0.97
+
(v-10)\frac{0.06}{23},
\qquad
10\le v\le33.
$$

Front/rear load balance is selected independently of the bike. If the chosen split is $b_f/b_r$ percent, its pressure coefficients are

$$
c_f=\frac{b_f}{50},
\qquad
c_r=\frac{b_r}{50}.
$$

The available splits are $50/50$, $48/52$, $45/55$, and $40/60$, with $48/52$ as the default. Both the P Zero Race SL-R with a P Zero TPU tube and the P Zero Race TLR SL-R tubeless setup use the high-performance casing coefficient $c_t=1.00$. The axle recommendations are rounded to the nearest $0.5\ \mathrm{PSI}$:

$$
p_f
=
\operatorname{round}_{0.5}
\left(p_0c_vc_fc_t\right),
\qquad
p_r
=
\operatorname{round}_{0.5}
\left(p_0c_vc_rc_t\right).
$$

All wheelset choices use a $622\ \mathrm{mm}$ bead-seat diameter. The HUNT 54\_58 Aerodynamicist UD Carbon Spoke wheelset uses a $54.5\ \mathrm{mm}$ front depth, $58\ \mathrm{mm}$ rear depth, and hooked $22\ \mathrm{mm}$ internal width on both rims; Reserve 42|49 TA uses $25.4\ \mathrm{mm}$ front and $24.8\ \mathrm{mm}$ rear.[^pressure-wheels] The custom wheelset accepts independent $13$–$35\ \mathrm{mm}$ front and rear internal widths. Once the actual mounted width $w=28\ \mathrm{mm}$ is supplied, internal rim width is compatibility metadata rather than a second SILCA pressure input, so choosing a custom internal width does not invent a casing-width adjustment. Reserve publishes $29\ \mathrm{mm}$ as the minimum recommended tire width, so the calculator shows a warning for the selected $28\ \mathrm{mm}$ setup.

The [Pirelli tire-pressure tool](https://www.pirelli.com/tires/en-us/bike/pressure-tool) remains the manufacturer check for the selected Pirelli casing, tube or tubeless construction, rim, and lower pressure limit.[^pirelli-pressure] Since both local casing coefficients are $1.00$, switching between TPU and tubeless changes the documented setup without changing PSI when measured width and every other input remain fixed.

The displayed front and rear values remain the dry SILCA baseline. Pirelli gives two road-condition offsets for fine tuning:

| riding condition | offset from dry pressure |
| ---------------- | -----------------------: |
| mixed            |       $-3\ \mathrm{PSI}$ |
| wet              |       $-8\ \mathrm{PSI}$ |

The daily gear panel also carries the nearest hourly [WeatherKit forecast](https://developer.apple.com/documentation/weatherkitrestapi/hourweatherconditions) at the centre of the most recently routed activity.[^weatherkit-pressure] It shows forecast temperature, condition, and precipitation chance beside these offsets. Forecast precipitation is context rather than a direct measurement of pavement wetness, so the panel does not silently subtract either offset from the dry result.

Pirelli states that pressure varies by approximately $3\ \mathrm{PSI}$ for each $10\ ^\circ\mathrm{C}$ difference between inflation and riding conditions, and approximately $1.5\ \mathrm{PSI}$ for each $1{,}000\ \mathrm{m}$ of altitude change. Written as magnitudes,

$$
\left|\Delta p_T\right|
\approx
3\ \mathrm{PSI}
\frac{\left|T_{\mathrm{ride}}-T_{\mathrm{inflation}}\right|}{10\ ^\circ\mathrm{C}},
$$

$$
\left|\Delta p_h\right|
\approx
1.5\ \mathrm{PSI}
\frac{\left|h_{\mathrm{ride}}-h_{\mathrm{inflation}}\right|}{1{,}000\ \mathrm{m}}.
$$

WeatherKit supplies the ride-temperature context. The current cache does not contain inflation temperature or altitude, so the panel presents these as explicit notes instead of manufacturing an adjusted number from missing inputs.

For example, the 2026-08-16 morning mass of $86.06\ \mathrm{kg}$, the $22\ \mathrm{lb}$ Cervélo, HUNT wheels, $28\ \mathrm{mm}$ measured tires, worn pavement, TPU tubes, and $19.5\ \mathrm{mph}$ produce $78.5\ \mathrm{PSI}$ front and $80.5\ \mathrm{PSI}$ rear.

[^silca-pressure]: [SILCA, “Professional Tire Pressure Calculator”](https://silca.cc/en-ca/pages/pro-tire-pressure-calculator?_eab=1). The local implementation copies the calculator’s public mass, surface, width, wheel-diameter, speed, and front/rear coefficients, then performs the same half-PSI rounding without making a runtime request.

[^pressure-wheels]: [HUNT, “54\_58 Aerodynamicist UD Carbon Spoke Disc Wheelset”](https://us.huntbikewheels.com/products/hunt-54_58-aerodynamicist-ud-carbon-spoke-disc-wheelset) and [Reserve, “42|49 TA”](https://reservewheels.com/products/reserve-42-49), official wheel dimensions and published tire-width compatibility.

[^pirelli-pressure]: [Pirelli, “Bike Tire Pressure Tool”](https://www.pirelli.com/tires/en-us/bike/pressure-tool), manufacturer guidance for matching tire construction, rim, system mass, use, and pressure limits.

[^weatherkit-pressure]: [Apple, “HourWeatherConditions”](https://developer.apple.com/documentation/weatherkitrestapi/hourweatherconditions), hourly temperature, condition code, precipitation type, and precipitation probability supplied through the WeatherKit REST API.

### speed, pace, and grade adjustment

Raw speed and the human pace displays are

$$
v = \frac{d}{t},
\qquad
p_{100} = \frac{100t}{d},
\qquad
p_{\mathrm{km}} = \frac{1000t}{d},
\qquad
v_{\mathrm{km/h}} = 3.6v.
$$

For a segment with elevation change $\Delta h$ and horizontal distance $\Delta d$,

$$
g = \operatorname{clamp}\left(\frac{\Delta h}{\Delta d}, -0.30, 0.30\right).
$$

The run grade-cost factor is

$$
F_{\mathrm{run}}(g) =
\begin{cases}
1 + 8.85g + 44g^2, & g \ge 0,\\
\max\left(0.83,\ 1 + 8g + 44g^2\right), & g < 0.
\end{cases}
$$

With segment lengths $\ell_i$, run grade-adjusted speed is

$$
v_{\mathrm{GAP,run}}
=
v \times
\frac{\sum_i F_{\mathrm{run}}(g_i)\ell_i}
{\sum_i \ell_i}.
$$

When segment altitude and distance are unavailable, the same factor is applied to the activity’s overall grade. Cycling uses total climbing over distance,

$$
g_{\mathrm{overall}} = \frac{h_{\mathrm{gain}}}{d},
$$

and

$$
v_{\mathrm{GAP,bike}}
=
v \times
\min\left(
1 + 3.5\max(g_{\mathrm{overall}},0),
1.25
\right).
$$

Swimming receives no grade correction:

$$
v_{\mathrm{GAP,swim}} = v.
$$

### modeled threshold speed

Each activity receives the duration weight

$$
w_i = \left\lfloor \frac{t_i}{600} \right\rfloor + 1.
$$

The current threshold estimate for a sport is

$$
v_{\mathrm{thr}} =
\begin{cases}
Q_{0.90}\!\left(v_{\mathrm{GAP},i};w_i\right), & n \ge 4,\\
0.97\max_i v_{\mathrm{GAP},i}, & 2 \le n < 4,\\
v_{\mathrm{prior}}, & n < 2,
\end{cases}
$$

where $Q_{0.90}$ is the duration-weighted 90th percentile. The priors are

$$
v_{\mathrm{prior}} =
\begin{cases}
1.3, & \text{swim},\\
6.9, & \text{bike},\\
3.3, & \text{run}.
\end{cases}
$$

A run threshold becomes stale after 45 days without a run. The model applies the current threshold retroactively to the activities in the analytics window.

### intensity factor

The three local IF equations are

$$
\mathrm{IF}_{\mathrm{power}}
=
\frac{\mathrm{NP}}{\mathrm{FTP}},
$$

$$
\mathrm{IF}_{\mathrm{pace}}
=
\frac{v_{\mathrm{GAP}}}{v_{\mathrm{thr}}},
$$

and

$$
\mathrm{IF}_{\mathrm{HR}}
=
\frac{\mathrm{HR}_{\mathrm{avg}}}{\mathrm{LTHR}}.
$$

The activity-card fallback selects them in this order:

$$
\mathrm{IF}_{\mathrm{local}} =
\begin{cases}
\mathrm{NP}/\mathrm{FTP},
& \text{bike with device power, valid NP, and FTP},\\
v_{\mathrm{GAP}}/v_{\mathrm{thr}},
& \text{run or swim with a modeled pace IF},\\
\mathrm{HR}_{\mathrm{avg}}/\mathrm{LTHR},
& \text{valid HR and declared LTHR},\\
\varnothing,
& \text{otherwise}.
\end{cases}
$$

Treatment activities receive no calculated IF. Local IF is rounded to three decimals and remains unclamped, so a hard short activity can exceed $1$.

### exercise load and TSS-like load

Define the capped intensity used for load:

$$
I = \min(\mathrm{IF},1.15).
$$

The missing-card exercise-load fallback is

$$
L_{\mathrm{card}}
=
\operatorname{round}_{0.1}
\left(
100
\frac{t}{3600}
I^2
\right).
$$

The effective IF for this formula is

$$
\mathrm{IF}_{\mathrm{effective}}
=
\begin{cases}
\mathrm{IF}_{\mathrm{Garmin}}, & \text{when Garmin IF exists},\\
\mathrm{IF}_{\mathrm{local}}, & \text{otherwise}.
\end{cases}
$$

This has the same algebraic form as power TSS when $\mathrm{IF}=\mathrm{NP}/\mathrm{FTP}$:

$$
\mathrm{TSS}
=
\frac{t \times \mathrm{NP} \times \mathrm{IF}}
{\mathrm{FTP}\times3600}
\times 100
=
100\frac{t}{3600}\mathrm{IF}^2.
$$

The site generalizes the final form to pace-derived and heart-rate-derived IF, then caps IF at $1.15$ to stop short anomalous efforts from dominating load.

The load used by the longitudinal analytics is always

$$
L_{\mathrm{PMC},i}
=
\operatorname{round}_{0.1}
\left[
100
\frac{t_i}{3600}
\min\left(
\frac{v_{\mathrm{GAP},i}}{v_{\mathrm{thr},s(i)}},
1.15
\right)^2
\right].
$$

Daily load is the sum of activity loads:

$$
L_d = \sum_{i\in d} L_{\mathrm{PMC},i}.
$$

Garmin exercise load is a provider fact. The local fallback is a TSS-like estimate and does not claim to reproduce Garmin’s EPOC model.

### performance management chart

For a time constant $\tau$ in days,

$$
K_{\tau} = 1 - e^{-1/\tau}.
$$

The site uses

$$
K_{42} = 1-e^{-1/42},
\qquad
K_7 = 1-e^{-1/7}.
$$

Chronic and acute load evolve as

$$
\mathrm{CTL}_{d+1}
=
\mathrm{CTL}_d
+
\left(L_d-\mathrm{CTL}_d\right)K_{42},
$$

$$
\mathrm{ATL}_{d+1}
=
\mathrm{ATL}_d
+
\left(L_d-\mathrm{ATL}_d\right)K_7,
$$

with form

$$
\mathrm{TSB}_d = \mathrm{CTL}_d-\mathrm{ATL}_d.
$$

The displayed value for day $d$ is the pre-update state, so load on day $d$ first appears in the state for day $d+1$. CTL and ATL start from the mean daily load over the first 14 active days:

$$
\mathrm{seed}
=
\frac{1}{n}
\sum_{d\in\text{first 14 active days}}L_d.
$$

Sport-specific CTL uses the same 42-day recurrence with sport load. Its initial seeds are

$$
\mathrm{CTL}_{0,\mathrm{swim}}=0.20\,\mathrm{seed},
\qquad
\mathrm{CTL}_{0,\mathrm{bike}}=0.50\,\mathrm{seed},
\qquad
\mathrm{CTL}_{0,\mathrm{run}}=0.30\,\mathrm{seed}.
$$

TSB zones are

$$
\operatorname{zone}(\mathrm{TSB}) =
\begin{cases}
\text{fresh}, & \mathrm{TSB}>5,\\
\text{neutral}, & -10<\mathrm{TSB}\le5,\\
\text{fatigued}, & -30<\mathrm{TSB}\le-10,\\
\text{deep}, & \mathrm{TSB}\le-30.
\end{cases}
$$

### weekly load and risk

Week-over-week ramp is

$$
r_w
=
\frac{L_w-L_{w-1}}{L_{w-1}}.
$$

For the loads of individual sessions in a week,

$$
\bar L_{\mathrm{session}}
=
\frac{1}{n}\sum_{i=1}^{n}L_i,
$$

$$
s_L
=
\sqrt{
\frac{\sum_{i=1}^{n}(L_i-\bar L_{\mathrm{session}})^2}
{n-1}
},
$$

$$
\mathrm{monotony}
=
\frac{\bar L_{\mathrm{session}}}{s_L},
\qquad
\mathrm{strain}
=
L_w\times\mathrm{monotony}.
$$

This implementation uses session loads for monotony, rather than seven daily totals.

Acute:chronic workload ratio is

$$
\mathrm{ACWR}
=
\frac{
\sum_{d=-6}^{0}L_d
}{
\frac{1}{4}\sum_{d=-27}^{0}L_d
}.
$$

It is withheld until there are at least 14 earlier active days and the 28-day load is at least $5$. The display states are

$$
\operatorname{state}(\mathrm{ACWR}) =
\begin{cases}
\text{low}, & \mathrm{ACWR}<0.8,\\
\text{ok}, & 0.8\le\mathrm{ACWR}\le1.3,\\
\text{caution}, & 1.3<\mathrm{ACWR}\le1.5,\\
\text{high}, & \mathrm{ACWR}>1.5.
\end{cases}
$$

Once three completed observed weeks exist, the weekly target baseline is

$$
B_w = \frac{L_{w-1}+L_{w-2}+L_{w-3}}{3},
$$

and the target range is

$$
L_w^{\mathrm{target}}\in[0.60B_w,\ 1.20B_w].
$$

During the first three weeks, the warmup baseline updates as

$$
B_{j+1}=B_j+0.5(L_j-B_j).
$$

### swimming

Active swim pace is

$$
p_{100}
=
100\frac{t_{\mathrm{active}}}{d}.
$$

The site accepts activity pace only in the range

$$
45 \le p_{100}\le360
\quad\text{seconds per 100 m}.
$$

Stroke rate is

$$
\mathrm{SR}
=
60\frac{N_{\mathrm{strokes}}}{t_{\mathrm{stroke}}},
$$

with a valid range of $5$ to $100$ strokes per minute. Distance per stroke is

$$
d_{\mathrm{stroke}}
=
\frac{d}{N_{\mathrm{strokes}}}.
$$

For a valid measured pool length $\ell$,

$$
\mathrm{strokes/length}_{\ell}
=
N_{\mathrm{strokes},\ell},
$$

$$
\mathrm{SWOLF}_{\ell}
=
\operatorname{round}
\left(
t_{\ell}+N_{\mathrm{strokes},\ell}
\right).
$$

Activity strokes per length and SWOLF are arithmetic means across valid measured lengths:

$$
\overline{\mathrm{strokes/length}}
=
\frac{1}{n}\sum_{\ell=1}^{n}
N_{\mathrm{strokes},\ell},
$$

$$
\overline{\mathrm{SWOLF}}
=
\frac{1}{n}\sum_{\ell=1}^{n}
\mathrm{SWOLF}_{\ell}.
$$

Kickboard lengths and lengths missing valid stroke data are excluded.

Critical swim speed from 400 m and 200 m tests is

$$
v_{\mathrm{CSS}}
=
\frac{400-200}{t_{400}-t_{200}}
=
\frac{200}{t_{400}-t_{200}},
$$

which is equivalent to the displayed pace per 100 m:

$$
p_{\mathrm{CSS},100}
=
\frac{t_{400}-t_{200}}{2}.
$$

The simple activity-card projections are

$$
t_{1.9\mathrm{k}}=19p_{100},
\qquad
t_{3.8\mathrm{k}}=38p_{100}.
$$

### cycling power and mechanics

For $M$ one-hertz power samples, the local 30-second normalized-power calculation is

$$
\bar P_{30,k}
=
\frac{1}{30}
\sum_{j=k-29}^{k}P_j,
\qquad
30\le k\le M,
$$

$$
\mathrm{NP}
=
\left(
\frac{1}{M-29}
\sum_{k=30}^{M}
\bar P_{30,k}^{\,4}
\right)^{1/4}.
$$

The local NP calculation is used inside bike decoupling. The activity card ordinarily receives weighted or normalized power from the activity providers.

When FTP is derived from a best 20-minute device-power effort,

$$
\mathrm{FTP}=0.95P_{20}.
$$

The corresponding maximal aerobic power estimate is

$$
\mathrm{MAP}=\frac{\mathrm{FTP}}{0.75},
$$

and power to weight is

$$
\mathrm{W/kg}=\frac{P}{m}.
$$

Vertical ascent rate is

$$
\mathrm{VAM}
=
3600\frac{h_{\mathrm{gain}}}{t}.
$$

The two-parameter critical-power model is

$$
P(t)=\mathrm{CP}+\frac{W'}{t}.
$$

The fit uses the best exact $180$, $420$, and $720$ second device-power windows. With

$$
x_i=\frac{1}{t_i},
\qquad
y_i=P_i,
$$

ordinary least squares gives

$$
W'
=
\frac{
\sum_i(x_i-\bar x)(y_i-\bar y)
}{
\sum_i(x_i-\bar x)^2
},
$$

$$
\mathrm{CP}
=
\bar y-W'\bar x.
$$

Fit error is

$$
\mathrm{RMSE}
=
\sqrt{
\frac{1}{n}
\sum_i
\left(
P_i-\mathrm{CP}-\frac{W'}{t_i}
\right)^2
},
$$

$$
\mathrm{nRMSE}
=
\frac{\mathrm{RMSE}}{\bar P}.
$$

The fit is rejected when $\mathrm{nRMSE}>0.05$, $\mathrm{CP}\le0$, $W'\le0$, or $\mathrm{CP}$ is not below every anchor power. Confidence is medium only when all three anchors are independent non-overlapping efforts; otherwise it is provisional.

Steady-state wheel power is modeled as

$$
P_{\mathrm{wheel}}
=
\frac{1}{2}\rho C_dA v^3
+
C_{rr}mgv.
$$

Solving for drag area with drivetrain efficiency $\eta$ gives

$$
C_dA
=
\frac{
2\left(P_{\mathrm{crank}}\eta-C_{rr}mgv\right)
}{
\rho v^3
}.
$$

Gear ratio is

$$
R=\frac{N_{\mathrm{chainring}}}{N_{\mathrm{cog}}}.
$$

The drivetrain visual models

$$
L_{\mathrm{total}}
=
L_{\mathrm{aligned}}(N_{\mathrm{chainring}},R)
+
L_{\mathrm{cross-chain}},
$$

$$
\eta_{\mathrm{drivetrain}}
=
100\times
\frac{250-L_{\mathrm{total}}}{250}.
$$

Aligned loss is linear in ratio, with its slope and intercept linearly interpolated between the CeramicSpeed 39-tooth and 53-tooth fits. Cross-chain loss is piecewise-linear in cog offset from the aligned cog.

### efficiency, decoupling, cadence, and stride

Bike efficiency factor is

$$
\mathrm{EF}_{\mathrm{bike}}
=
\frac{\mathrm{NP}}{\mathrm{HR}_{\mathrm{avg}}}
\quad
\left[
\frac{\mathrm{W}}{\mathrm{bpm}}
\right].
$$

Run and swim efficiency factor are

$$
\mathrm{EF}_{\mathrm{run/swim}}
=
\frac{60v_{\mathrm{GAP}}}{\mathrm{HR}_{\mathrm{avg}}}
\quad
\left[
\frac{\mathrm{m/min}}{\mathrm{bpm}}
\right].
$$

For activities of at least 20 minutes with approximately one-hertz streams, aerobic decoupling is

$$
\mathrm{decoupling}
=
100
\frac{\mathrm{EF}_{1}-\mathrm{EF}_{2}}
{\mathrm{EF}_{1}}.
$$

The halves split the sample stream at its midpoint. Bike half-efficiency uses locally calculated NP divided by mean HR. Run half-efficiency uses distance-derived speed divided by mean HR. Swimming has no decoupling value.

When native running stride is absent, estimated stride length is

$$
\ell_{\mathrm{stride}}
=
\frac{60v}{c},
$$

where $c$ is total steps per minute. Strava’s run cadence is doubled before use because its activity field reports cycles per minute.

### trend and calibration

The 28-day calibration average first computes duration-weighted grade-adjusted speed:

$$
\bar v_{\mathrm{GAP}}
=
\frac{
\sum_i v_{\mathrm{GAP},i}t_i
}{
\sum_i t_i
}.
$$

It then converts that speed to seconds per 100 m for swimming, seconds per kilometre for running, or kilometres per hour for cycling.

The signed faster percentage is

$$
\Delta_{\mathrm{bike}}
=
100\frac{x_{\mathrm{current}}-x_{\mathrm{previous}}}
{x_{\mathrm{previous}}},
$$

$$
\Delta_{\mathrm{run/swim}}
=
100\frac{x_{\mathrm{previous}}-x_{\mathrm{current}}}
{x_{\mathrm{previous}}}.
$$

For a dense sport history, the pace trend uses exponentially weighted OLS. With activity age $a_i$ in days,

$$
w_i=2^{-a_i/28},
$$

$$
\bar x_w
=
\frac{\sum_iw_ix_i}{\sum_iw_i},
\qquad
\bar y_w
=
\frac{\sum_iw_iy_i}{\sum_iw_i},
$$

$$
b
=
\frac{
\sum_iw_i(x_i-\bar x_w)(y_i-\bar y_w)
}{
\sum_iw_i(x_i-\bar x_w)^2
},
\qquad
a=\bar y_w-b\bar x_w.
$$

The 14-day forecast damps the daily slope by $\phi=0.94$:

$$
\hat y_d
=
\eta_{\mathrm{now}}
+
b\sum_{j=1}^{d}\phi^j,
\qquad
1\le d\le14.
$$

The weighted effective sample size and residual scale are

$$
n_{\mathrm{eff}}
=
\frac{\left(\sum_iw_i\right)^2}
{\sum_iw_i^2},
$$

$$
s_e
=
\sqrt{
\frac{\sum_iw_i(y_i-a-bx_i)^2}
{\sum_iw_i}
}
\sqrt{
\frac{n_{\mathrm{eff}}}
{\max(1,n_{\mathrm{eff}}-2)}
}.
$$

The forecast half-width is

$$
h_d
=
1.28s_e
\sqrt{
\frac{1}{n_{\mathrm{eff}}}
+
\frac{(x_{\mathrm{now}}+d-\bar x_w)^2}
{\sum_iw_i(x_i-\bar x_w)^2}
}.
$$

This OLS path requires at least six activities, a span of at least 21 days, and no gap over 14 days. Sparser non-stale histories use an exponentially weighted level:

$$
\ell_i
=
\ell_{i-1}
+
0.3(y_i-\ell_{i-1}).
$$

### activity and race projections

The activity-card running projection uses the Riegel equation

$$
T_2
=
T_1
\left(
\frac{D_2}{D_1}
\right)^{1.06}
$$

for the next standard distance above the completed activity.

The race model defines a one-hour threshold reference distance

$$
D_{\mathrm{ref}}
=
\frac{3600v_{\mathrm{thr}}}{1000}
\quad\text{kilometres}.
$$

For race-leg distance $D_s$,

$$
T_s
=
3600
\left(
\frac{D_s}{D_{\mathrm{ref},s}}
\right)^{k_s},
$$

with

$$
k_{\mathrm{swim}}=1.03,
\qquad
k_{\mathrm{bike}}=1.05,
\qquad
k_{\mathrm{run}}=1.06.
$$

The run split receives the brick multiplier

$$
f_{\mathrm{brick}}
=
\begin{cases}
1.02, & \text{sprint},\\
1.04, & \text{olympic},\\
1.07, & \text{70.3},\\
1.12, & \text{ironman}.
\end{cases}
$$

Total predicted time is

$$
T_{\mathrm{race}}
=
T_{\mathrm{swim}}
+
T_{\mathrm{bike}}
+
f_{\mathrm{brick}}T_{\mathrm{run}}
+
300
+
300.
$$

Trend-derived velocity ratios are clamped to $\pm8\%$ before they modify threshold speed. The uncertainty half-fraction is clamped to $12\%$.

For each sport,

$$
\mathrm{coverage}_s
=
\operatorname{clamp}
\left(
\frac{D_{\mathrm{longest},s}}{D_{\mathrm{race},s}},
0,
1
\right).
$$

The threshold-recency gate is

$$
g_s =
\begin{cases}
1.0, & \text{stale days}\le21,\\
0.6, & 21<\text{stale days}\le42,\\
0.3, & \text{stale days}>42.
\end{cases}
$$

Fitness readiness is

$$
F
=
\operatorname{clamp}
\left(
\frac{\mathrm{CTL}}{\mathrm{CTL}_{\mathrm{race}}},
0,
1
\right),
$$

with race references

$$
\mathrm{CTL}_{\mathrm{race}}
=
\begin{cases}
35, & \text{sprint},\\
50, & \text{olympic},\\
70, & \text{70.3},\\
90, & \text{ironman}.
\end{cases}
$$

The readiness score is

$$
\mathrm{readiness}
=
\operatorname{round}
\left[
100
\left(
0.45F
+
0.55
\frac{1}{3}
\sum_{s\in\{\mathrm{swim,bike,run}\}}
\mathrm{coverage}_s g_s
\right)
\right].
$$

The binding leg is the sport with the smallest $\mathrm{coverage}_s g_s$.

### heart rate and aerobic capacity

When declared or observed maximum heart rate is unavailable, Tanaka’s estimate is

$$
\mathrm{HR}_{\max}
=
208-0.7\,\mathrm{age}.
$$

Daniels’ oxygen-cost equation uses speed $v_{\min}$ in metres per minute:

$$
\mathrm{VO}_{2,\mathrm{Daniels}}
=
-4.6
+
0.182258v_{\min}
+
0.000104v_{\min}^2.
$$

The heart-rate-ratio estimate is

$$
\mathrm{VO}_{2\max}
=
15.3
\frac{\mathrm{HR}_{\max}}
{\mathrm{HR}_{\mathrm{rest}}}.
$$

The cycling estimate from MAP is

$$
\mathrm{VO}_{2\max}
=
10.8
\frac{\mathrm{MAP}}{m}
+
7.
$$

For the run-stream regression, the model fits

$$
\mathrm{HR}=a+bv,
$$

then estimates

$$
v_{\mathrm{VO2}}
=
\operatorname{clamp}
\left(
\frac{\mathrm{HR}_{\max}-a}{b},
v_{\max,\mathrm{observed}},
1.4v_{\max,\mathrm{observed}}
\right)
$$

before applying Daniels’ equation. When that regression is unavailable, each qualifying run uses heart-rate reserve fraction

$$
f_{\mathrm{HRR}}
=
\frac{
\mathrm{HR}_{\mathrm{avg}}-\mathrm{HR}_{\mathrm{rest}}
}{
\mathrm{HR}_{\max}-\mathrm{HR}_{\mathrm{rest}}
},
$$

and

$$
\mathrm{VO}_{2\max,i}
=
\frac{
\mathrm{VO}_{2,\mathrm{Daniels}}(v_{\mathrm{GAP},i})
}{
f_{\mathrm{HRR},i}
}.
$$

Only runs with $f_{\mathrm{HRR}}>0.4$ enter that fallback mean.

### FTP hypothesis from VO2max

Let source VO2max be $V$ in $\mathrm{mL\,kg^{-1}\,min^{-1}}$, body mass be $m$, cross-modal discount be $d$, threshold fraction be $q=0.85$, and gross metabolic efficiency be $\eta=0.21$. The efficiency term is a literature prior. Pedal smoothness and torque effectiveness describe force application, so they remain evidence beside the hypothesis rather than inputs to $\eta$.

An explicitly cycling-specific Garmin VO2max uses $d=0$. A treadmill value uses $d=0.08$. A Garmin generic value also retains $d=0.08$ because the cached field does not establish its source sport.

Absolute oxygen use is

$$
\dot V_{O_2}
=
\frac{Vm}{1000}
\quad
\left[
\mathrm{L/min}
\right].
$$

The cycling and threshold estimates are

$$
\dot V_{O_2,c}
=
\dot V_{O_2}(1-d),
$$

$$
\dot V_{O_2,\mathrm{thr}}
=
q\dot V_{O_2,c}.
$$

Using $20.9\ \mathrm{kJ}$ per litre of oxygen,

$$
P_{\mathrm{met}}
=
\dot V_{O_2,\mathrm{thr}}
\frac{20.9\times1000}{60},
$$

$$
\mathrm{FTP}_{\mathrm{eff}}
=
\eta P_{\mathrm{met}}.
$$

The independent ACSM path is

$$
\mathrm{MAP}_{\mathrm{ACSM}}
=
\frac{
\max\left(0,V(1-d)-7\right)m
}{
1.8\times6.12
},
$$

$$
\mathrm{FTP}_{\mathrm{ACSM}}
=
0.75\,\mathrm{MAP}_{\mathrm{ACSM}}.
$$

The hypothesis is the nearest 10 W to the mean of both paths:

$$
\mathrm{FTP}_{\mathrm{hyp}}
=
\operatorname{round}_{10}
\left(
\frac{
\mathrm{FTP}_{\mathrm{eff}}
+
\mathrm{FTP}_{\mathrm{ACSM}}
}{2}
\right).
$$

Its displayed low and high bounds are the unrounded mean minus and plus $25$ W, each rounded to the nearest $5$ W. The panel also reports six-week estimated critical power, modeled 60-minute power, declared FTP, independent-effort count, and activity-level median pedal dynamics. A ride enters the pedal summary only when each left and right pedal-smoothness and torque-effectiveness series has at least $80\%$ valid samples.

### body composition and energy

The standard BMI definition is

$$
\mathrm{BMI}
=
\frac{m}{h^2}.
$$

The displayed BMI comes from the Garmin scale rather than a local recomputation. Fat-free mass and FFMI are locally derived when scale weight and body-fat percentage are present:

$$
\mathrm{FFM}
=
m
\left(
1-\frac{\mathrm{body\ fat\ \%}}{100}
\right),
$$

$$
\mathrm{FFMI}
=
\frac{\mathrm{FFM}}{h^2}.
$$

Katch-McArdle BMR is

$$
\mathrm{BMR}_{\mathrm{KM}}
=
370+21.6\,\mathrm{FFM}_{\mathrm{kg}}.
$$

The male Mifflin-St Jeor goal-weight estimate is

$$
\mathrm{BMR}_{\mathrm{MSJ}}
=
10m_{\mathrm{kg}}
+
6.25h_{\mathrm{cm}}
-
5\,\mathrm{age}
+
5.
$$

Weight trend is the OLS slope of daily weight against day, multiplied by seven:

$$
\Delta m_{\mathrm{week}}
=
7
\frac{
\sum_i(t_i-\bar t)(m_i-\bar m)
}{
\sum_i(t_i-\bar t)^2
}.
$$

When trend is moving toward the target, goal ETA is

$$
\mathrm{weeks}_{\mathrm{goal}}
=
\min
\left(
104,
\left\lceil
\left|
\frac{m_{\mathrm{current}}-m_{\mathrm{goal}}}
{\Delta m_{\mathrm{week}}}
\right|
\right\rceil
\right).
$$

### recovery

For samples $x_1,\ldots,x_n$,

$$
\bar x=\frac{1}{n}\sum_{i=1}^{n}x_i,
\qquad
s_x
=
\sqrt{
\frac{
\sum_{i=1}^{n}(x_i-\bar x)^2
}{n-1}
}.
$$

HRV uses $y_i=\ln(\mathrm{HRV}_i)$. Its baseline is the latest 28-day window with at least 14 samples, and its acute window is seven days with at least three samples:

$$
z_{\mathrm{HRV}}
=
\frac{
\bar y_{7}-\bar y_{28}
}{
s_{y,28}
}.
$$

The displayed HRV baseline converts the log mean back:

$$
\mathrm{HRV}_{\mathrm{baseline}}
=
e^{\bar y_{28}}.
$$

RHR uses the same windows without the log transform:

$$
z_{\mathrm{RHR}}
=
\frac{
\overline{\mathrm{RHR}}_{7}
-
\overline{\mathrm{RHR}}_{28}
}{
s_{\mathrm{RHR},28}
}.
$$

Fourteen-night sleep debt uses a seven-hour target:

$$
\mathrm{debt}_{14}
=
\sum_{i=1}^{14}
\operatorname{clamp}
\left(
7\ \mathrm{h}-\mathrm{sleep}_i,
0,
7\ \mathrm{h}
\right).
$$

Readiness baseline is a 28-day arithmetic mean with at least seven samples. Sleep baseline is a 28-day median with at least seven samples.

### heat acclimatisation

For duration-weighted observations,

$$
\bar x
=
\frac{
\sum_i x_i\Delta t_i
}{
\sum_i\Delta t_i
}.
$$

CORE heat is counted when heat strain index is at least $3$. When CORE data is unavailable, ambient heat is counted when temperature exceeds $22^\circ\mathrm{C}$. Source order is CORE app, CORE FIT, WeatherKit, then Strava device temperature.

Daily heat dose is

$$
D_d
=
\operatorname{clamp}
\left(
\frac{\mathrm{hot\ minutes}_d}{60},
0,
1
\right).
$$

Heat credits evolve as

$$
C_{d+1}
=
\begin{cases}
\min(14,C_d+D_d), & D_d>0,\\
0.975C_d, & D_d=0\ \text{and more than 3 days since heat},\\
C_d, & \text{otherwise}.
\end{cases}
$$

Acclimatisation is

$$
\mathrm{heat\ acclimatisation\ \%}
=
100\frac{C_d}{14}.
$$

Forty-two-day observation coverage is

$$
\mathrm{coverage\ \%}
=
100
\operatorname{clamp}
\left(
\frac{
\mathrm{observed\ eligible\ seconds}
}{
\mathrm{all\ eligible\ seconds}
},
0,
1
\right).
$$

Only routed bike and run activities are eligible for this heat model.

<!-- training plan end -->

<!-- training plan start
meta: supertri toronto 2026
distance: olympic
date: 2026-07-26
target: sub-3
author: gpt-5.5-pro-xhigh,claude-fable-5[1m]
-->

The plan now uses five measured constraints:

- The VO2 test on 2026-06-25 put VO2max at 47.8 ml/kg/min at 88.9 kg, vVO2max at 15.0 km/h, HR at VO2max at 180 bpm, and peak observed HR at 182 bpm. VT1 was detected at 145 bpm and 10.5 km/h. VT2 was not detected, so do not invent precise threshold work above VT1.
- The useful fat-burning lane is boring: HR 121-142 bpm, roughly 8-10.5 km/h on the treadmill test. Most aerobic run minutes live there. Easy bike days use the same HR ceiling and power stays subordinate to HR drift.
- FTP is now a 230 W hypothesis with a 210-260 W realistic band, derived from running VO2max. The math crosses treadmill to bike and invents the missing VT2, so it sets power vocabulary, not training law.
- DEXA on 2026-06-25 measured 197.6 lb total mass, 54.2 lb fat, 135.7 lb lean, 7.8 lb bone mineral content, 27.4% total-mass fat, 28.5% tissue fat, 1.24 lb VAT, and 1695 kcal/day RMR.
- Holding fat-free mass at 143.5 lb, 14% body fat implies about 166.9 lb total mass and 23.4 lb fat. The chart weight target is 160.0 lb, which implies about 16.5 lb fat and 10.3% total-mass fat if fat-free mass stays flat. Race day is 31 days away, so the race block targets 4-6 lb loss, not the full cut.
- Current analytics have Olympic prediction at about 3:02 before transitions, binding leg run, CTL 69, ATL 93, and TSB -24 on 2026-06-25. The test day counts as hard. The next 48 hours buy freshness before adding more intensity.

TriDot has some pretty good drill for [swimming](https://support.tridot.com/hc/en-us/sections/201539593-Swim) here, and some form with drill which is recommended to follow to improve your stroke and general techniques.

For eating, make sure to eat:

- Fatty Fish (salmon)
- Dark leafy greens
- Fermented foods

## intensity anchors

Lab HR zones:

| lane     | HR          | speed        | use                                      |
| -------- | ----------- | ------------ | ---------------------------------------- |
| warm     | <121 bpm    | <8 km/h      | warmup, cooldown, recovery               |
| fat burn | 121-142 bpm | 8-10.5 km/h  | most easy run volume and aerobic doubles |
| VT1 cap  | 143-145 bpm | 10.5 km/h    | upper cap for ordinary endurance         |
| hard     | 146-170 bpm | 10.5-14 km/h | tempo, race-specific work                |
| VO2      | 171+ bpm    | 14-15 km/h   | short intervals only                     |

Swim:

- Easy: 2:30-2:45/100 m, nasal-calm between repeats, no thrashing.
- CSS work: 2:18-2:24/100 m. Current modeled swim threshold is about 2:21/100 m, so the job is durability near threshold, not fantasy-pacing 1.5 km at sprint effort.[^css]
- Fast: 1:55-2:08/100 m on 25-50 m repeats only.
- Race: 34:30-35:30 for 1.5 km. Faster is loot, but sub-3 mostly comes from bike-run execution now.

Bike, using FTP 230 W as a VO2-derived hypothesis until a bike test proves otherwise:

- Easy: 125-160 W, HR under 142 if the day is for fat loss, under 145 if the day is endurance.
- Tempo: 170-195 W, smooth cadence, no spikes.
- Race power: 185-205 W, with 80-90 rpm and no heroic surges over 270 W.
- VO2: 245-275 W for 3-5 minute repeats. One bike VO2 session per week is enough while Runna has hard running.
- Race: 40 km in 82-85 minutes, then run. A faster bike that detonates the first 3 km of the run is fake profit.

Run:

- Easy and fat-burning: HR 121-142 bpm, often 5:45-7:30/km. Stay there even when the watch begs for content.
- Aerobic ceiling: 145 bpm. If a normal run crosses this without intent, slow down.
- Runna intervals and tempo: the one hard run stimulus for the week. Bike that day is easy or absent.
- Long run: keep it aerobic. Fuel any run over 75 minutes with 30-60 g carbs/h.
- Race: open the 10 km off the bike at 5:05-5:10/km for 2 km, then settle toward 4:50-5:00/km if HR and legs agree. The old 45-minute run target is an A+ day, not the pacing plan.

Recovery gates:

- If readiness is under 70 for two straight days, HRV z is below -1, RHR is 5 bpm over baseline, or TSB is below -25, replace the next hard session with easy technique or 45-60 minutes Z2.
- The VO2 test is a hard session. On 06-25 and 06-26, stack recovery and easy aerobic work before chasing another interval badge.
- Fuel every ride over 75 minutes. Use 30-60 g carbs/h for 75-150 minutes and practice 60-90 g/h for race rehearsals.[^carb]

## weekly build

| week    |          dates |        load ceiling | Runna   | swim       | bike      | key proof                                          |
| ------- | -------------: | ------------------: | ------- | ---------- | --------- | -------------------------------------------------- |
| reset   | 06-25 to 06-28 |             420-500 | 15 mi   | 3.5-4.5 km | 2.5-3.5 h | absorb VO2 test, keep 400s controlled, long run ok |
| build 2 | 06-29 to 07-05 |             650-720 | 20.0 mi | 6.0-7.0 km | 6.0-7.5 h | tempo 2 miles, 7.5 mi long run, 40 km rehearsal    |
| peak    | 07-06 to 07-12 |             700-760 | 21.8 mi | 7.0-8.0 km | 7.0-8.0 h | 1 km repeats, 9 mi progressive long run, brick run |
| taper 1 | 07-13 to 07-19 |             480-540 | 17.6 mi | 5.0-5.5 km | 4.0-5.0 h | drop set, 6 mi long run, race-kit swim plus bike   |
| race    | 07-20 to 07-26 | 260-340 before race | 13.0 mi | 2.5-3.5 km | 2.0-3.0 h | race-pace half miles, 10 km race, arrive sharp     |

The load ceiling is total weekly load. The Runna mileage is the run lane, so extra jogs do not exist. If the app moves a run, keep the weekly mileage inside the same band and keep at least 24 hours between hard run work and bike race-power work. Most minutes stay easy, then taper volume drops while short intensity stays alive.[^seiler][^taper]

## calendar

| date  | Runna                                                  | swim                                                             | bike                                                        |
| ----- | ------------------------------------------------------ | ---------------------------------------------------------------- | ----------------------------------------------------------- |
| 06-25 | VO2 and DEXA day; Loading Up only if already scheduled | off                                                              | no bike quality; 20-30 min spin only if legs need movement  |
| 06-26 | 4.5 mi Easy Run, HR 121-142                            | S3, 1600-1800 m, no strain                                       | off                                                         |
| 06-27 | 400 m Repeats, 4 mi; Stretch & Stability 1, 25 min     | off                                                              | 45-60 min Z2 only if reps stay controlled                   |
| 06-28 | 6.5 mi Long Run, HR mostly under 145                   | 1500-1800 m continuous or open water                             | 30-45 min recovery spin                                     |
| 06-29 | 4 mi Easy Run                                          | S1, 2000 m                                                       | off                                                         |
| 06-30 | Strength Supersets, 55-65 min                          | off                                                              | B1, 70-75 min with 5x3 min at 245-265 W                     |
| 07-01 | Tempo 2 Miles, 4.5 mi                                  | S2, 2200-2400 m with 4-5x400 m                                   | 30-45 min easy                                              |
| 07-02 | Lower Body Strength Session, 55-65 min                 | off                                                              | B2, 80-90 min with 2x20 min at 180-195 W                    |
| 07-03 | 4 mi Easy Run, HR 121-142                              | S3, 1800-2000 m                                                  | off                                                         |
| 07-04 | Stretch & Stability 2, 25 min                          | off                                                              | B4, 40 km rehearsal at 185-200 W, full fueling              |
| 07-05 | 7.5 mi Long Run                                        | 1600-1800 m easy continuous                                      | 45 min recovery spin if HRV is normal                       |
| 07-06 | 3.25 mi Easy Run                                       | S1, 2200 m                                                       | off                                                         |
| 07-07 | Full Body Endurance Session, 55-65 min                 | off                                                              | B1, 75-80 min with 5x4 min at 245-265 W                     |
| 07-08 | 1 km Repeats, 4.5 mi                                   | S2, 2400-2600 m with 3x600 m                                     | 30-45 min easy                                              |
| 07-09 | Legs & Core Endurance, 55-65 min                       | off                                                              | B2, 90-100 min with 3x15 min at 185-200 W                   |
| 07-10 | 5 mi Brick Run                                         | S3, 1800-2000 m                                                  | 45-60 min race-power primer before brick if legs are normal |
| 07-11 | Stretch & Stability 3, 25 min                          | off or 1000 m easy                                               | B5, 75-90 min at race-power blocks, full fueling            |
| 07-12 | 9 mi Progressive Long Run                              | 1800-2000 m continuous, sighting every 6-8 strokes if open water | 45-60 min easy                                              |
| 07-13 | 3.25 mi Easy Run                                       | S1, 1800 m                                                       | off                                                         |
| 07-14 | Ticking Over, 55-65 min                                | off                                                              | B1, 55-60 min with 4x3 min at 245-260 W                     |
| 07-15 | Drop Set, 3.4 mi                                       | S2, 2000-2200 m with 3x400 m                                     | 30-40 min easy                                              |
| 07-16 | Light(er) Work, 55-65 min                              | off                                                              | B2, 65-75 min with 2x12 min at 185-200 W                    |
| 07-17 | 5 mi Easy Run                                          | S3, 1500-1600 m, stop while stroke still looks good              | off                                                         |
| 07-18 | Stretch & Stability 4, 25 min                          | 1200-1500 m race-kit swim, controlled                            | B4, 25-35 km at 185-200 W, full fueling                     |
| 07-19 | 6 mi Long Run                                          | off or 1000 m easy                                               | 30-45 min recovery spin                                     |
| 07-20 | off                                                    | S1, 1400-1600 m                                                  | off                                                         |
| 07-21 | Hard Work Is Done, 55-65 min                           | off                                                              | B1, 45-50 min with 3x3 min at 240-255 W                     |
| 07-22 | Race Pace Practice Half Miles, 3.5 mi                  | S3, 1200-1500 m with 8x50 m fast                                 | 30-40 min easy                                              |
| 07-23 | off                                                    | off                                                              | B2, 40-45 min with 3x5 min at 185-200 W                     |
| 07-24 | 3.25 mi Easy Run                                       | 1000-1200 m easy, 4x50 m fast                                    | off                                                         |
| 07-25 | Stretch & Stability 5, 25 min                          | 10-15 min water feel if available                                | 20 min spin, 3x30 s openers                                 |
| 07-26 | race: 10 km, first 2 km at 5:05-5:10/km                | race: 1.5 km, settle in the first 300 m                          | race: 40 km, cap first 10 min at 180 W, then 185-205 W      |

## session library

S1, technique plus CSS:

- 300 m easy.
- 8x50 m drill/swim by 25 m, 15-20 s rest.
- Main set starts at 6x100 m at 2:20-2:24/100 m and progresses to 10x100 m at 2:18-2:22/100 m.
- 4x50 m fast at 1:55-2:08/100m, full control.
- 200 m easy.

S2, endurance:

- 400 m easy.
- 3-5x400 m at 2:20-2:28/100 m, 45-60 s rest.
- Progress one rep each build week before adding speed.
- 200 m easy.

S3, speed and stroke:

- 300 m easy.
- 12-20x50 m alternating fast/easy. Fast is 1:55-2:08/100m; easy is 2:30/100m or slower.
- 4x100 m pull or strong-form swim.
- 200 m easy.

B1, VO2:

- 15 min warmup.
- 5-6x3-5 min at 245-275 W, equal easy recovery. HR can touch 171+ late, but the first reps should feel controlled.
- 10-15 min cooldown.
- End the session if power falls below target for two consecutive reps.

B2, tempo and race durability:

- 15 min warmup.
- Progress from 3x10 min at 170-185 W to 3x15 min at 185-200 W and then 3x12 min at 195-210 W.
- Keep cadence 80-90 rpm.
- Cool down until HR is boring again.

B3, long aerobic:

- 2:00-3:00 at 125-160 W.
- Add 20-30 min at 170-185 W only when readiness is normal and HR stays under 145.
- Eat 60-90 g carbs/h and drink to thirst plus sodium in heat.

B4, race rehearsal:

- 10 min easy.
- 40 km at 185-200 W, target 29-30 km/h, no power spikes over 270 W unless traffic forces it.
- Hold aero position whenever safe.
- Practice race bottle, carbs, and the first 10 minutes of restraint.
- If this takes more than 86 minutes in normal wind, the sub-3 budget moves to transitions plus run discipline.

B5, race-power durability:

- 15 min warmup.
- 3x15 min at 185-205 W, 5 min easy between.
- Finish with 10 min easy. If legs are sore at minute 45, choose 185 W before 215 W.

Runna R1, easy run:

- Hold conversation pace and keep cadence light.
- If HR drifts above easy, slow down before adding distance.

Runna R2, intervals or tempo:

- Warm up until stride mechanics feel normal.
- Hit the prescribed Runna work and end the session while form still exists.
- Bike quality moves at least 24 hours away unless the bike is explicitly easy.

Runna R3, long run:

- Start slower than ego wants.
- Fuel 30-60 g carbs/h once the run passes 75 minutes.
- Last 10 minutes can progress only if the next day is not a bike-quality day.

## body composition and food

The DEXA math:

- Current: 197.6 lb total, 54.2 lb fat, 135.7 lb lean, 7.8 lb bone, 143.5 lb fat-free mass.
- Current total-mass body fat: 27.4%. Reported tissue-fat view: 28.5%.
- Chart weight target: 160.0 lb.
- 14% body-fat checkpoint with fat-free mass preserved: about 166.9 lb total mass and 23.4 lb fat.
- 160 lb target math with fat-free mass preserved: about 16.5 lb fat, about 10.3% total-mass fat, and about 37.6 lb fat loss from DEXA.
- 160 lb goal-weight BMR: about 1780 kcal/day by Mifflin-St Jeor at 188 cm and age 25; lean-mass-preserved Katch-McArdle gives about 1775 kcal/day because fat-free mass stays 143.5 lb. Treat the DEXA RMR of 1695 kcal/day as the measured anchor until the next lab check.[^bmr]
- Race-block checkpoint: 191-193 lb by 07-26 if readiness, sleep, and workout quality stay green. Do not chase a lower number during taper.

The cut rate:

- Use 0.5-0.7% body mass per week, about 1.0-1.4 lb/week right now. That puts the 14% checkpoint about 22-31 weeks away and the 160 lb chart target about 27-38 weeks away.[^weightloss]
- Keep the deficit mostly on rest/easy days. Hard sessions, long runs, race rehearsals, and race week are maintenance or near-maintenance.
- If sleep score drops under 75 for two nights, RHR stays 5 bpm over baseline, or intervals flatten, remove the deficit before removing training quality.

Protein:

- Daily floor: 160 g.
- Normal target: 180 g.
- High-deficit or strength-heavy days: 190-200 g.
- Split into 4 feedings of 35-50 g. Put one feeding within 2 hours after hard sessions. Whey is allowed because logistics are real.[^protein]

Carbs:

- Easy/rest day: 180-250 g, mostly around training and dinner.
- Normal training day: 250-350 g.
- Hard, brick, long, or rehearsal day: 350-500 g. Fuel the work, then let the deficit come from the rest of the day.
- During training: 30-60 g/h for 75-150 minutes, 60-90 g/h for race rehearsals and race-day bike. Do not use chronic low-carb during this block; evidence for performance gain from aggressive CHO restriction is weak and it can compromise interval quality.[^cho-period]

Fat and calories:

- Keep fat around 60-80 g/day. Do not drop below 50 g/day repeatedly.
- Use measured total expenditure when available: intake equals total calories minus 300-500 kcal on easy/moderate days, and about total calories on hard/long days.
- Practical floor while training: about 2300 kcal/day. Lower than that is how the plan gets a stupid little stress fracture side quest.
- RMR is 1695 kcal/day, so the useful lever is weekly average intake, not starving a single day.

Race fueling:

- Breakfast 3-4 hours before: 1-2 g/kg carbs, low fiber, familiar sodium.
- Bike: 60-80 g carbs/h, 500-800 mg sodium/h if hot, fluid to thirst.
- Run: 30-45 g carbs/h if tolerated. The run is short enough that stomach calm beats maximal gel cosplay.

## race track

![[https://strava-embeds.com/route/3459615466775941042?style=standard&amp;fullWidth=true&amp;clubId=1459904&amp;fromEmbed=true#ns=94460b8c-1ff3-4475-b2f1-a5beeb3d47e5&amp;hostOrigin=https%3A%2F%2Fsupertri.com&amp;hostPath=%2Ftoronto-triathlon%2Folympic%2F&amp;hostTitle=Supertri+Toronto+Olympic+Triathlon]]

![[https://strava-embeds.com/route/3459617551271887794?style=standard&terrain=2d&fromEmbed=false&token=OwRoXABZDeHZP91TK9B4XxoSSByBkgNjmdYpHtlWpJ8#ns=13297610-0d59-4ddc-9ef8-f5ed70feaf4b&hostOrigin=https%3A%2F%2Fwww.strava.com&hostPath=%2Froutes%2F3459617551271887794&hostTitle=Supertri+Toronto+2026+-+Bike+Olympic+Distance+%7C+25.1+mi+Cycling+Route+on+Strava&mapHash=10.36/43.6761/-79.3919]]

![[https://strava-embeds.com/route/3459617422094043424?style=standard&fromEmbed=false&token=7oowr8Y5XzoFgrL8zbP1hHuoGOThXsJi576pA4e5-E4#ns=e51ce2df-4f5a-4afc-9fcc-f53f52c01bce&hostOrigin=https%3A%2F%2Fwww.strava.com&hostPath=%2Froutes%2F3459617422094043424&hostTitle=Supertri+Toronto+2026+-+Run+Olympic+Distance+%7C+6.3+mi+Running+Route+on+Strava]]

[^seiler]: Seiler, “What is best practice for training intensity and duration distribution in endurance athletes?”, 2010. <https://pubmed.ncbi.nlm.nih.gov/20861519/>

[^css]: Dekerle et al., “Validity and reliability of critical speed, critical stroke rate and anaerobic swimming capacity in relation to front crawl swimming performances”, 2002. <https://pubmed.ncbi.nlm.nih.gov/11842355/>

[^taper]: Bosquet et al., “Effects of tapering on performance: a meta-analysis”, 2007. <https://pubmed.ncbi.nlm.nih.gov/17762369/> See also Mujika and Padilla, “Scientific bases for precompetition tapering strategies”, 2003. <https://pubmed.ncbi.nlm.nih.gov/12840640/>

[^carb]: Burke et al., “Carbohydrates for training and competition”, 2011. <https://pubmed.ncbi.nlm.nih.gov/21660838/>

[^weightloss]: Manore, “Weight Management for Athletes and Active Individuals”, 2015. <https://pmc.ncbi.nlm.nih.gov/articles/PMC4672016/> See also Mountjoy et al., “2023 International Olympic Committee’s consensus statement on Relative Energy Deficiency in Sport”, 2023. <https://bjsm.bmj.com/content/57/17/1073>

[^protein]: Jager et al., “International Society of Sports Nutrition Position Stand: protein and exercise”, 2017. <https://pubmed.ncbi.nlm.nih.gov/28642676/> See also Helms et al., “A systematic review of dietary protein during caloric restriction in resistance trained lean athletes”, 2014. <https://pubmed.ncbi.nlm.nih.gov/24092765/>

[^cho-period]: Gejl and Nybo, “Performance effects of periodized carbohydrate restriction in endurance trained athletes: a systematic review and meta-analysis”, 2021. <https://link.springer.com/article/10.1186/s12970-021-00435-3>

[^bmr]: Mifflin et al., “A new predictive equation for resting energy expenditure in healthy individuals”, 1990. <https://pubmed.ncbi.nlm.nih.gov/2305711/> The Katch-McArdle style lean-mass estimate uses $BMR = 370 + 21.6 \times FFM_{kg}$.

<!-- training plan end -->

<!-- training plan start
meta: 45 minute climb
distance: cycling
date: 2026-07-27
endDate: 2026-08-24
target: climbing threshold durability
author: strava,cts
-->

The CTS Forty-five Minute Climb block is anchored here as a post-Supertri cycling plan. It starts Monday 2026-07-27, runs 28 days through the 2026-08-24 boundary, and uses the standard 5:2 workout/rest rhythm: rides Tuesday through Thursday plus longer Saturday/Sunday rides, with Monday and Friday off. Total visible riding is about 25 hours across four weeks, or 6.25 h/week.

Date gate: this anchor starts the day after Supertri race day, so no cycling workout lands inside the taper/race block. Keep Monday 2026-07-27 as rest, then start the first EM ride on Tuesday 2026-07-28 only if readiness, sleep, and legs are normal.

## schedule

| week | dates          | total | Mon  | Tue   | Wed   | Thu   | Fri  | Sat            | Sun               |
| ---- | -------------- | ----: | ---- | ----- | ----- | ----- | ---- | -------------- | ----------------- |
| 1    | 07-27 to 08-02 | 6h15m | rest | EM 1h | SS 1h | T 1h  | rest | EM + T 1h30    | EM 1h45           |
| 2    | 08-03 to 08-09 | 6h15m | rest | EM 1h | CR 1h | OU 1h | rest | EM + uphill TT | EM 1h45           |
| 3    | 08-10 to 08-16 | 6h30m | rest | EM 1h | SS 1h | T 1h  | rest | EM + SS 1h30   | EM 2h             |
| 4    | 08-17 to 08-23 | 6h00m | rest | EM 1h | SS 1h | EM 1h | rest | EM 1h          | segment challenge |

## visible workouts

- Week 1 SS: 4x8 min Steady State, 5 min recovery.
- Week 1 T: 3x12 min Tempo, 5 min recovery.
- Week 1 weekend T: 4x12 min Tempo inside a 1h30 ride, 5 min recovery.
- Week 2 CR: 5x6 min Climbing Repeats, 4 min recovery.
- Week 2 OU: 4x8 min Over Under as 3 min under / 1 min over / 3 min under / 1 min over, 5 min recovery.
- Week 2 uphill TT: 45 min uphill time trial, or 2x25 min uphill time trials.

## intensity translation

| code | Strava intent       | CTS intensity | power if 230 W FTP | use here                                     |
| ---- | ------------------- | ------------: | -----------------: | -------------------------------------------- |
| EM   | aerobic development |          5/10 |          104-168 W | easy endurance; HR still caps the day        |
| T    | aerobic endurance   |          6/10 |          186-196 W | race-power durability when legs are normal   |
| SS   | lactate threshold   |          7/10 |          198-207 W | threshold-adjacent, limit during Runna weeks |
| CR   | climbing threshold  |          8/10 |          219-230 W | after-race climb strength; skip during taper |
| OU   | threshold surges    |          9/10 |  198-207/219-230 W | after-race surge work; skip during taper     |

<!-- training plan end -->

<!-- training plan start
meta: ironman 70.3 new york
distance: 70.3
date: 2026-07-28
endDate: 2026-09-26
target: sub-5
author: claude-opus-5,strava
-->

Northwell IRONMAN 70.3 New York, Saturday 2026-09-26 at Jones Beach: 1.9 km in Zach’s Bay, 90 km on the closed Wantagh Parkway, 21.1 km out and back on the boardwalk. Flat, sea level, no shade, and exposed to whatever the Atlantic is doing that morning. Sixty days from 07-28.[^course]

SuperTri on 07-26 measured six things worth planning around.

- Swim 1500 m in 41:00 at 160 bpm average and 173 peak. That is 2:44/100 m at 88% of the 182 bpm max, sitting 15 bpm above VT1 for the whole leg. Pool sessions through June and July ran 2:33-2:58/100 m, so race day was not a bad day. It was the fitness.
- Swim volume was 0.5-3.8 km/week against a plan asking for 6-8 km. Sessions were 400-1050 m, mostly 100s with long rest. The engine reads swim threshold at 2:23/100 m because it is fit on those reps. Continuous open water came in 21 s/100 m slower.
- Bike 39.5 km in 70:02 at 210 W average, best hour 215 W, HR 164, cadence 81. That is 33.8 km/h off the back of a 41-minute swim and a 722 m T1 run. The bike does not need more watts.
- Run 9.51 km in 53:40 at 5:38/km, HR opening at 165 and drifting to 176. Best kilometre inside it was 5:08. VT1 speed is 10.5 km/h and race speed was 10.6 km/h, so the 10 km was run at aerobic-threshold pace while the heart rate sat 23 bpm above aerobic threshold. Raising VT1 speed is the whole run job.
- Four samples in the run stream fall to 1.2-1.8 m/s. Aid stations. About 2 minutes lost over 10 km, which scales to 8-10 minutes over a half if the habit survives.
- State on 07-28: CTL 94.3, ATL 109.8, TSB -15.5, 87.8 kg trending -0.67 kg/week. Longest ride 72.7 km, longest run 14.8 km. The model scores 70.3 readiness 91 with bike coverage 0.81 and run coverage 0.70, and predicts 6:28:27 against a fast case of 5:54:40.

## the trade

The last five complete weeks averaged 9.5 hours: 6.4 on the bike, 2.2 running, 0.9 swimming. Bike owns 67% of training time and is the leg already ahead of schedule. Swim owns 9% and costs the most minutes on race day.

Sub-5 in sixty days does buy hours, and it takes them from the bike. Peak weeks land near 14 h against the 11.5 h of the week of 07-13, split roughly 31% swim, 39% bike, 30% run. Pool time goes from 0.9 h/week to 4.3 and run time from 2.2 to 3.9, while bike hours fall from 8.5 at their peak to 5.5. The bike lane loses volume and gains shape, which is the trade the aero section prices out.

Two coverage gates decide the model score, and both are single sessions rather than seasons of work: one ride at or past 90 km, one run at or past 21 km. They sit on 09-05 and 09-06.

## split budget

Sub-5 on 09-26. Not a horizon, the number this block is built to hit.

Two corrections to the earlier arithmetic make it live. The CSS ladder was written as though the race happened in a pool, which double-counted the wetsuit: Zach’s Bay is salt water and almost certainly wetsuit legal, and the buoyancy gain runs largest for exactly the swimmer you are, one whose limiter is hip position rather than engine.[^wetsuit] Competitive swimmers get nothing measurable from neoprene; triathletes with poor buoyancy get up to 11%. At 2:44 the 6-10% band is 10-16 s/100 m, already paid for. Second, the aero deadline matters more than the aero purchase, because a shape bought in September is a shape you cannot hold for 90 km. Setup final by 08-22 leaves five weeks to make the position durable, and that date is the load-bearing one in this whole block.

Fitting $P = \frac{1}{2}\rho C_dA v^3 + C_{rr} m g v$ to 210 W at 9.394 m/s on 07-26 gives $C_dA \approx 0.32$ at $C_{rr} = 0.005$ and 88 kg all-in, with the out-and-back cancelling the 223 m of climbing. That is a road bike ridden on the hoods. Everything below runs off that fit.

| leg         |                      07-26 | plan                             |  target |
| ----------- | -------------------------: | -------------------------------- | ------: |
| swim 1.9 km |          2:44/100 m, 51:56 | 2:12-2:16/100 m in the wetsuit   |   42:00 |
| T1          |     8:42 on a 722 m run-up | practised strip, no sitting down |    3:00 |
| bike 90 km  | 210 W, CdA 0.32, 33.8 km/h | 205 W, CdA 0.22-0.23, 37.5 km/h  | 2:24:00 |
| T2          |                       3:05 | rack, shoes, go                  |    2:00 |
| run 21.1 km |           5:38/km at 10 km | 5:04-5:10/km, 8:09-8:19/mile     | 1:47:00 |
| total       |             6:28 predicted |                                  | 4:58:00 |

Two minutes of margin against a 6:28 prediction. Every one of the five conditions below has to land.

## the five conditions

| # | condition        | pass mark                                        |  date | if it misses          |
| - | ---------------- | ------------------------------------------------ | ----: | --------------------- |
| 1 | swim CSS         | 2:18/100 m in the pool                           | 09-09 | 2:26 costs 3:00       |
| 2 | wetsuit gain     | 8 s/100 m or better against pool pace, measured  | 08-21 | no wetsuit costs 6:00 |
| 3 | CdA              | 0.23 or better on the race setup                 | 09-12 | 0.26 costs 6:30       |
| 4 | bike durability  | 205 W for 90 km with the brick run still on pace | 09-05 | 195 W costs 4:00      |
| 5 | run off the bike | 30 min at 5:04-5:10/km off a 70 km ride          | 09-12 | 5:25/km costs 6:30    |

Each of the five is individually plausible and none of them is free. Jointly, allowing for the correlation that comes from simply doing the work, sub-5 is roughly a one-in-five day. The median outcome of this block is 5:10-5:20 and the floor is 5:30, which is still 58 to 78 minutes faster than what the model predicts today. Aim at the one-in-five, because the training that chases it is the training that guarantees the median.

Condition 5 is the one that binds, so the run lane takes the volume the bike gives up: 40-42 km at peak instead of 35, race-pace blocks inside the long run growing to 14 km, and two double days a week once the aerobic base holds.

### swim: 2:14 in the wetsuit, 2:18 CSS in the pool

Race pace over 1.9 km sits at CSS plus 6-12 s/100 m in a pool. Open water in salt and neoprene gives most of that back, and gives more of it back to a heavy swimmer with sinking hips than to a light one with good position.[^wetsuit] So the pool requirement is 2:18 CSS, not the 2:10-2:14 the earlier pass demanded. That is a different and much more reachable ask.

| swim pace | 1.9 km | source                            |
| --------- | -----: | --------------------------------- |
| 2:44      |  51:56 | measured on 07-26                 |
| 2:32      |  48:05 | volume alone, in the wetsuit      |
| 2:22      |  44:55 | CSS 2:26 plus wetsuit             |
| 2:14      |  42:25 | CSS 2:18 plus wetsuit, the target |

The rungs: CSS 2:35 on 07-29, 2:26 on 08-19, 2:18 on 09-09. Going from 2.5 km/week to 10 km/week is a fourfold increase in a lane you have never actually trained, and 15-20 s/100 m over eight weeks is the ordinary result of that, not the heroic one. Of the five conditions this is the most likely to land.

Three things make it happen. A filmed technique session on 08-03, because at 88 kg and 188 cm swimming 2:44 at 160 bpm is drag rather than engine. Pace-specific hundreds at 2:12-2:18 from week 3, since you cannot race a pace you have never held. And the wetsuit treated as equipment to be trained rather than a race-day bonus: every open-water session in it from 08-21, with the delta measured that day over a repeated 400 m.

Add drafting. Sitting on feet in a rolling start is worth 3-6% of energy cost at the same speed, which on this leg is free and which nobody practises.

### bike: buy the drag before you buy the watts

Hold 195 W and change nothing else about the engine:

|  CdA | setup                                 | km/h |   90 km |
| ---: | ------------------------------------- | ---: | ------: |
| 0.32 | today, hoods, road bike               | 32.9 | 2:43:55 |
| 0.28 | clip-ons, saddle forward and up       | 34.3 | 2:37:25 |
| 0.26 | plus aero helmet and skinsuit         | 35.1 | 2:33:40 |
| 0.24 | plus position held for the full 90 km | 36.0 | 2:30:10 |
| 0.22 | TT bike, dialled                      | 37.0 | 2:26:05 |

0.32 to 0.24 is **13:45 at identical power**. Going 195 W to 240 W at today’s shape buys 12:40 and costs an FTP of 300. The drag lane is larger, buyable, and does not compete with the run for recovery, which is why the bike work now sorts by shape first and watts second.

Watts still rank, they just rank second. Best hour on 07-26 was 215 W and best twenty minutes 220 W, so FTP is 235-245 now, and 2-4% a month puts it at 252-260 by 09-26. Thursday is threshold at 230-245 W to make that happen. Race power is 205 W, which is IF 0.80 against the September number. That is the top of the raceable band and it is conditional: if the brick run off 09-05 comes in slow, race power drops to 195 W and the day becomes a 5:02.

The automated power-duration fit on 08-13 gives **eCP 248.9 W and eW′ 10.3 kJ** from complete device-power windows at 3, 7, and 12 minutes. The 3-minute anchor comes from 08-09. The 7- and 12-minute anchors overlap inside one effort on 08-05, so this is provisional evidence from two independent efforts. The site fits $P(t)=CP+W′/t$ in power space, keeps recorded zeroes, rejects windows with missing seconds, and exposes each winning activity. A third independent maximal effort would turn the estimate into a usable field measurement. FTP continues to own the existing zones and workout prescriptions because CP and FTP are different thresholds.[^critical-power]

At 205 W the table shifts up by about six minutes per row, so CdA 0.23 gives 36.8 km/h and 2:26:45, and CdA 0.22 gives 37.7 km/h and 2:23:20. The budget takes the middle at 2:24.

The dates matter more than the parts. Decide and order by 08-08, fit and final by 08-22, then five weeks of holding it. A CdA of 0.22 measured in a 20-minute test and lost by kilometre 60 is worth nothing, so the pass mark is the position held for the whole of 09-05 with power inside 3% of hoods power.

### run: 7:30/mile is a rep pace, not a race pace

7:30/mile is 4:40/km, which is 12.9 km/h, which is 86% of the 15.0 km/h vVO2max measured on 06-25 and 23% above VT1 speed. Holding 86% of vVO2max for 98 minutes needs a VO2max in the high fifties. You are at 47.8, and this is after 90 km of cycling.

Where the number does belong is Wednesday. Best 400 m inside the SuperTri run was 118 s, which is 7:55/mile at 97% of max heart rate. Reps at 7:30/mile off full recovery are about 6% faster than that, which is the right stimulus and is reachable by September. So 7:30/mile becomes the rep target, building 400 m to 1 km, and race pace lands at 9:00-9:23/mile.

| run pace | 21.1 km | source                                |
| -------- | ------: | ------------------------------------- |
| 6:26/km  | 2:15:50 | model prediction on 07-28             |
| 5:50/km  | 2:03:10 | plan floor                            |
| 5:35/km  | 1:57:50 | plan target                           |
| 5:25/km  | 1:54:20 | the median outcome of this block      |
| 5:05/km  | 1:47:15 | the sub-5 row, needs VT1 at 11.8 km/h |
| 4:53/km  | 1:43:00 | the 4:40 run, needs VO2max near 60    |

The sub-5 row asks VT1 speed to go from 10.5 km/h to 11.8, which is +12% in eight weeks. About a quarter of that comes from mass, since 83 kg against 87.8 is -5.5% and buys 2-3% of speed at the same aerobic power. The rest has to come from run volume you have never run: 2.2 h/week across the last five weeks, going to 4.0. That is the ordinary response for someone whose aerobic base is the untrained thing, and it is still the least likely of the five conditions.

So the run lane takes the hours the bike gives up. Peak 42 km/week. Long runs to 21 km with race-pace blocks growing from 4 km to 14 km. Run days go from four to six from 08-24, with the two new ones being 30-35 minutes of genuinely easy work on Monday and Thursday, because at this stage frequency raises VT1 faster than length does.

Six run days at 42 km is where this plan can hurt you. The knees complained on 07-23 and the added days are the reason the easy pace is written at 6:15-6:45/km rather than left to feel. Two consecutive runs with the same ache means the Wednesday reps go, then a day off, then the easy days come back first. Losing the reps costs about 20 seconds on race day. Losing three weeks costs the race.

Adding it up: 42:00 swim, 3:00, 2:24 bike, 2:00, 1:47 run gives **4:58**.

## aero

The bike lane’s largest lever, ranked by what it returns rather than by what people buy first. Deltas are planning estimates until the field test replaces them with measurements.

| lever                                              |          cost |    $\Delta C_dA$ | 90 km at 195 W |
| -------------------------------------------------- | ------------: | ---------------: | -------------: |
| clip-on extensions, saddle forward and up          |     \$150-300 |   -0.03 to -0.06 |     6:00-11:00 |
| position work: flat back, narrow elbows, head down | free, 8 weeks |  -0.015 to -0.03 |      3:00-6:00 |
| aero helmet                                        |     \$200-400 | -0.005 to -0.015 |      1:00-3:00 |
| skinsuit instead of a loose tri kit                |     \$200-350 | -0.005 to -0.015 |      1:00-3:00 |
| deep front wheel                                   |     \$400-900 | -0.003 to -0.008 |      0:40-1:40 |
| TT frame over good clip-ons                        |  \$\$\$\$\$\$ |   -0.01 to -0.02 |      2:00-4:00 |

The first two rows are 60-70% of the total and cost about \$250 plus eight weeks of hip flexor tolerance. Buy in that order, decide by 08-08, and have the setup final by 08-22. After that date the block stops changing the bike and starts making the shape durable, because a CdA you measure in a twenty-minute test and lose by kilometre 60 is not a CdA you raced.

Field test, run three times. Flat closed loop of 3-5 km, out and back, wind under 10 km/h, same tyres and pressure, same bottles:

- Four laps at a fixed 190 W, coasting nothing, recording speed and elapsed.
- Solve the steady-state fit for $C_dA = \dfrac{2(P\eta - C_{rr} m g v)}{\rho v^3}$, or run the file through a virtual-elevation fit, which handles the wind better.
- Change exactly one thing between tests. Two changes at once and the number tells you nothing.

Dates: 08-01 baseline on the current setup, 08-22 after the position change, 09-12 on the full race setup inside rehearsal 2.

Position durability is the part that gets skipped. A shape you can hold for twenty minutes is worth nothing over 90 km, so every EM ride holds the position for a set fraction, from half the ride in August to all of the long rides by 09-05. The pass mark is power in position within 3% of power on the hoods, measured on the 08-27 and 09-03 threshold sessions.

## reconciliation with the CTS anchor

The Forty-five Minute Climb block above still owns 07-27 to 08-24. Three changes, and nothing else moves:

- 07-28 to 08-02 is easy aerobic only. No SS, no T. The race counts as the hard session for that week.
- CR and OU are dropped. Climbing threshold and surge work build the wrong thing for a flat 90 km at 0.78 IF.
- The 08-08 uphill TT becomes the FTP test, and the Sunday CTS ride merges into Saturday so Sunday can hold the long run.

EM, T, and SS stay as the bike vocabulary through 08-23. From 08-24 this block owns the bike lane outright.

## intensity anchors

The 06-25 lab HR zones remain the measured baseline. The declared lactate-threshold heart rate is 166 bpm; it is a planning anchor separate from the lab, whose VT2 field remains unresolved.

| lane     | HR          | run speed    | use                                    |
| -------- | ----------- | ------------ | -------------------------------------- |
| warm     | <121 bpm    | <8 km/h      | warmup, cooldown, recovery             |
| fat burn | 121-142 bpm | 8-10.5 km/h  | most easy volume, all long-run mileage |
| VT1 cap  | 143-145 bpm | 10.5 km/h    | ceiling for ordinary endurance         |
| race     | 146-160 bpm | 10.5-12 km/h | 70.3 run pace and tempo work           |
| hard     | 161-170 bpm | 12-14 km/h   | one run session per week, nothing more |
| VO2      | 171+ bpm    | 14-15 km/h   | not used in this block                 |

Swim, keyed to a measured CSS rather than the modelled 2:23. Test on 07-29 with a 400 m and a 200 m time trial off full rest, then

$$
\text{CSS pace}_{/100\,\text{m}} = \frac{t_{400} - t_{200}}{2}
$$

and rebuild the lanes from whatever number comes back.[^css] Expect 2:32-2:40. Retest 08-19 and 09-09. The 2:20 race goal needs CSS on this ladder: 2:35 on 07-29, 2:26 on 08-19, 2:14-2:18 on 09-09. Missing a rung is the signal to add a fifth swim rather than to swim the same sessions harder.

- Easy: CSS + 20 s/100 m, nasal-calm, stroke intact.
- CSS: the measured number, held for 200-400 m repeats on short rest.
- Goal pace: 2:15-2:20/100 m on 100s from week 3. You cannot race a pace you have never swum.
- Race: CSS + 6-10 s/100 m for 1.9 km. Faster in a wetsuit and salt water, which is loot rather than plan.
- Fast: 25-50 m only, and only when form holds.

Bike. The 215 W best hour was set inside a race, after a 41-minute swim at 160 bpm, so fresh FTP is 235-245 W rather than the old 230 W hypothesis. Test 08-08, retest 09-09, and rewrite these each time:

- Easy, EM: 120-165 W, HR under 142.
- Tempo, T: 180-200 W. Race-power durability.
- Sweet spot, SS: 195-210 W in blocks of 12-20 minutes.
- Threshold: 230-245 W in blocks of 8-12 minutes. This is the lane that moves FTP toward 240-250, and it lives on Thursday only.
- Race power: 190-200 W, 80-85 rpm, no surge past 250 W except to clear traffic.

Run. Race pace is 5:35-5:50/km at 148-158 bpm. Easy is 6:15-6:45/km at 121-142 bpm, which is 40-60 s/km slower than the easy runs actually logged in June and July. Reps are 7:30-7:50/mile off full recovery, one session a week. Strides of 6x20 s go on the Tuesday easy run and one other easy day, because 7:30/mile is a mechanics problem before it is a fitness problem.

## the three fixes

**Swim frequency plus a technique intervention.** Four sessions a week rising to five in the build, volume from 6 km to 8.5 km, and every week carries one continuous timed swim building from 1200 m to 2400 m. The 100s-with-rest diet is what produced a 2:23 threshold estimate that a 1.9 km continuous swim will not honour. Volume alone lands around 2:32 and saves 3:50 over the leg. Getting to 2:20 needs the drag fixed, so 08-03 is a filmed session with someone who can see the body position, and every session after it opens with the two cues that come out of it. Moving 2:44 to 2:20 saves 7:36 and drops arrival heart rate by 10-15 bpm before a three-hour ride, which is the larger of the two prizes.

**Easy runs have to actually be easy.** Logged easy runs sat at 5:30-5:53/km with relative effort in the 50-67 band for 40-50 minutes. That is tempo wearing an easy label, and it is why the long run has been stuck at 15 km and why the knees complained on 07-23. Run easy at 6:15-6:45/km and the weekly mileage can go 16 km to 35 km without a new injury. The 7:30/mile reps only work if everything around them is slow.[^seiler]

**Bike: threshold on Thursday, race power everywhere else.** June and July held threshold sets, 5x1 minute efforts, three max sprints, and climbing intervals, which is a criterium diet. The FTP goal needs one honest threshold session a week at 230-245 W, alternating with sweet spot so the run ramp survives it. The long ride carries 20-25 minute blocks at 190-200 W and nothing steeper, because race-power durability is what the flat parkway actually asks for. Cycling and running load the same aerobic system through different recruitment, so the transfer is real only when the bike work looks like the race.[^triphys]

## weekly build

| week    |          dates | load ceiling | swim        | bike  | run   | key proof                                                  |
| ------- | -------------: | -----------: | ----------- | ----- | ----- | ---------------------------------------------------------- |
| reset   | 07-28 to 08-02 |      500-570 | 6.0 km / 4  | 3.5 h | 20 km | absorb the race, CSS test, CdA baseline                    |
| base 1  | 08-03 to 08-09 |      700-780 | 7.5 km / 4  | 5.0 h | 27 km | filmed swim session, FTP test, aero parts ordered          |
| base 2  | 08-10 to 08-16 |      790-870 | 9.0 km / 5  | 5.5 h | 32 km | 2:30 ride, 17 km long run, 2000 m continuous               |
| down    | 08-17 to 08-23 |      580-650 | 7.5 km / 4  | 4.0 h | 24 km | CSS rung 2:26, wetsuit delta measured, setup final         |
| build 1 | 08-24 to 08-30 |      870-950 | 10.0 km / 5 | 5.0 h | 37 km | doubles start, 19 km long run, 100s at 2:14-2:18           |
| peak    | 08-31 to 09-06 |     980-1080 | 10.0 km / 5 | 5.5 h | 42 km | 90 km at 205 W, 21 km with 8 km at race pace               |
| sharpen | 09-07 to 09-13 |      870-950 | 8.5 km / 5  | 5.0 h | 38 km | CSS rung 2:18, condition-5 brick, 18 km with 12 km at 5:10 |
| taper 1 | 09-14 to 09-20 |      590-670 | 6.5 km / 4  | 3.5 h | 26 km | volume down 35%, intensity alive                           |
| race    | 09-21 to 09-26 |  350-430 pre | 3.0 km / 3  | 2.5 h | 14 km | openers, arrive at TSB +10 to +20                          |

Load ceiling is total weekly load in the same unit the engine emits. The engine publishes a `loadRange` of $[0.75, 1.5] \times \text{CTL} \times 7$ each week, so read the ceilings as fractions of that: 0.80 on reset and deload weeks, 1.10-1.25 through base, 1.30-1.40 at peak, 0.85 in taper. At CTL 94 that top band is 1015. CTL should reach 108-115 by 09-06 and then fall. Weekly ramp stays under +25% and monotony stays under 2.0, which the week of 06-29 failed at 2.55.[^taper]

Point Runna at a half marathon plan with a 09-26 date and let it own the Wednesday quality run and the Sunday long run. Keep the weekly mileage inside the band above. If it schedules a third hard run, delete it.

## calendar

| date  | run                                                  | swim                                                                  | bike                                                                     |
| ----- | ---------------------------------------------------- | --------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| 07-28 | off                                                  | 1600 m technique, no timing                                           | 30-40 min spin, HR under 130                                             |
| 07-29 | 40 min easy plus 6x20 s strides                      | CSS test: 400 m and 200 m TT inside 1800 m                            | off                                                                      |
| 07-30 | off                                                  | off                                                                   | EM 60-75 min, HR under 142                                               |
| 07-31 | 30 min easy or off                                   | 1800-2000 m, 1200 m of it continuous                                  | off                                                                      |
| 08-01 | 15 min brick off the bike, 6:15/km                   | off                                                                   | CdA baseline test inside EM 1h45-2h00, current setup                     |
| 08-02 | 14 km easy, HR under 145                             | 1000 m easy, drills only                                              | off                                                                      |
| 08-03 | off                                                  | filmed technique session, 1800 m, keep the two cues                   | off; strength 40 min                                                     |
| 08-04 | 40 min easy plus 6x20 s strides                      | off                                                                   | EM 60-75 min                                                             |
| 08-05 | quality: 6x400 m at 7:50/mile, 90 s jog              | S2, 2000 m endurance                                                  | off                                                                      |
| 08-06 | off                                                  | off                                                                   | threshold: 3x10 min at 225-240 W inside 75 min                           |
| 08-07 | off                                                  | 1800 m continuous, timed                                              | off                                                                      |
| 08-08 | 15 min brick                                         | 1000 m easy on the 08-03 cues                                         | FTP test inside 2h00: 45 min uphill TT or 2x20                           |
| 08-09 | 15 km easy                                           | off                                                                   | off                                                                      |
| 08-10 | off                                                  | S1, 2200 m with 8x100 m descending to 2:20                            | off; strength 40 min                                                     |
| 08-11 | 45 min easy plus 6x20 s strides                      | off                                                                   | EM 75 min                                                                |
| 08-12 | quality: 8x400 m at 7:40/mile, 90 s jog              | S2, 2400 m                                                            | off                                                                      |
| 08-13 | off                                                  | off                                                                   | SS, 85 min with 3x15 min at 195-210 W                                    |
| 08-14 | off                                                  | 2000 m continuous, timed                                              | off                                                                      |
| 08-15 | 20 min brick at 6:00/km                              | 1000 m easy                                                           | 2h30 with 2x25 min at 190-200 W, 60 g carbs/h                            |
| 08-16 | 17 km, last 4 km at 5:30/km                          | off                                                                   | off                                                                      |
| 08-17 | off                                                  | 2000 m technique                                                      | off; strength 40 min                                                     |
| 08-18 | 35 min easy plus strides                             | off                                                                   | EM 60 min                                                                |
| 08-19 | 40 min easy                                          | CSS retest inside 1800 m; the rung is 2:26                            | off                                                                      |
| 08-20 | off                                                  | off                                                                   | threshold: 3x10 min at 230-245 W inside 60 min                           |
| 08-21 | off                                                  | wetsuit delta test: 400 m with, 400 m without, then 1200 m open water | off                                                                      |
| 08-22 | 15 min brick                                         | off                                                                   | CdA retest inside EM 1h45, clip-ons and new saddle position              |
| 08-23 | 13 km easy                                           | 1000 m easy                                                           | off                                                                      |
| 08-24 | 35 min easy                                          | S1, 2400 m with 10x100 m at 2:18-2:22                                 | off; strength 40 min                                                     |
| 08-25 | 45 min easy plus 6x20 s strides                      | 1000 m easy, drills                                                   | EM 75 min                                                                |
| 08-26 | quality: 6x600 m at 7:35/mile, 2 min jog             | S2, 2600 m                                                            | off                                                                      |
| 08-27 | 35 min easy                                          | 1000 m easy                                                           | SS, 90 min with 4x15 min at 195-210 W                                    |
| 08-28 | off                                                  | 2200 m continuous, timed                                              | off                                                                      |
| 08-29 | 20 min brick at 5:30/km                              | off                                                                   | 3h00 / 75-80 km, 3x20 min at 190-200 W, 70 g/h                           |
| 08-30 | 19 km, last 6 km at 5:20/km, 40 g carbs/h            | off                                                                   | off                                                                      |
| 08-31 | 35 min easy                                          | S1, 2400 m with 6x200 m at 2:20-2:24                                  | off; strength 30 min                                                     |
| 09-01 | 45 min easy plus 6x20 s strides                      | 1000 m easy                                                           | EM 75 min                                                                |
| 09-02 | quality: 5x800 m at 7:30/mile, 2 min jog             | S2, 2800 m                                                            | off                                                                      |
| 09-03 | 35 min easy                                          | 1000 m easy                                                           | threshold: 4x10 min at 230-245 W inside 75 min                           |
| 09-04 | off                                                  | open water 2000-2400 m, sight every 6-8 strokes                       | off                                                                      |
| 09-05 | 25 min brick at 5:05-5:10/km                         | off                                                                   | rehearsal 1: 90 km at 205 W, 90 g/h, full race setup                     |
| 09-06 | 21 km with 8 km at 5:10/km, 60 g carbs/h, race shoes | off                                                                   | off                                                                      |
| 09-07 | 35 min easy                                          | 2000 m easy                                                           | off; mobility 30 min                                                     |
| 09-08 | 40 min easy plus strides                             | off                                                                   | EM 60 min                                                                |
| 09-09 | quality: 6x800 m at 7:30/mile, 2 min jog             | CSS retest inside 2600 m; the rung is 2:14-2:18                       | off                                                                      |
| 09-10 | 30 min easy                                          | off                                                                   | T, 75 min with 3x15 min at 195-205 W                                     |
| 09-11 | off                                                  | 2000 m race kit, 8x50 m fast                                          | off                                                                      |
| 09-12 | condition 5: 30 min at 5:04-5:10/km                  | off                                                                   | rehearsal 2: 65-70 km at 190-200 W, full fuel, CdA confirm on race setup |
| 09-13 | 18 km with 12 km at 5:10/km                          | 1000 m easy                                                           | off                                                                      |
| 09-14 | off                                                  | 1800 m technique                                                      | off; mobility 30 min                                                     |
| 09-15 | 35 min easy plus strides                             | off                                                                   | EM 50 min                                                                |
| 09-16 | quality: 4x1 km at 7:35/mile, 2 min jog              | 2000 m with 4x200 m at CSS                                            | off                                                                      |
| 09-17 | off                                                  | off                                                                   | 60 min with 3x8 min at 200-215 W                                         |
| 09-18 | off                                                  | 1500 m open water in the race wetsuit                                 | off                                                                      |
| 09-19 | 15 min brick at race pace                            | off                                                                   | 1h45 with 3x10 min at 190-200 W, then 6x T1 and T2 drills                |
| 09-20 | 12 km easy                                           | 1000 m easy                                                           | off                                                                      |
| 09-21 | off                                                  | 1500 m easy with 6x50 m fast                                          | off; mobility                                                            |
| 09-22 | 30 min with 4x1 min at race pace                     | off                                                                   | 50 min with 4x3 min at race power                                        |
| 09-23 | off                                                  | 1200 m easy                                                           | off; travel day                                                          |
| 09-24 | 20 min easy                                          | off                                                                   | 40 min easy with 3x2 min openers                                         |
| 09-25 | 10 min shakeout                                      | 10-15 min in Zach’s Bay if the practice swim is open                  | 20 min with 3x30 s openers, then rack                                    |
| 09-26 | race: 21.1 km, first 3 km at 5:50-6:00/km            | race: 1.9 km, settle by 300 m                                         | race: 90 km, cap the first 20 min at 175 W                               |

## session library

S1, technique and CSS:

- 300 m easy, then 8x50 m drill/swim by 25 m on 15-20 s rest, opening on the 08-03 cues.
- 8-12x100 m at measured CSS on 15 s rest, adding one rep per week before adding speed.
- From week 3 the last 4 of those hundreds descend to 2:15-2:20, which is the pace the race goal is written in.
- 4x50 m fast, full control.
- 200 m easy.

S2, endurance:

- 400 m easy.
- 4-6x300 m or 3-4x400 m at CSS + 4-6 s/100 m on 30-45 s rest.
- 200 m pull.
- 200 m easy.

S3, continuous:

- 200 m easy, then the whole prescribed distance unbroken and timed.
- Sight every 6-8 strokes for the last third even in the pool.
- This is the session the race actually resembles. Do not break it up because the clock is ugly.

S4, open water:

- Enter cold, exhale hard for the first 200 m until breathing settles.
- Two 400-600 m efforts at race effort with sighting, 2 min easy between.
- Practice the wetsuit strip on the beach afterwards. Twice.

B1, EM:

- 120-165 W, HR under 142, 80-90 rpm.
- Aero position for at least half the ride once the position is comfortable.

B2, tempo and sweet spot:

- 15 min warmup.
- Sweet spot weeks: progress 3x15 min at 195-210 W to 4x15 min, 5 min easy between.
- Threshold weeks: 3-4x10 min at 230-245 W, 5 min easy between. This is the FTP lever and it alternates with the sweet-spot version so the run ramp survives.
- Cadence 80-90 rpm, seated, no surges out of corners. End the session if power drops below target on two consecutive reps.

B3, long with race-power blocks:

- Ride the first 30 min at EM.
- Race-power blocks of 20-25 min at 190-200 W with 8-10 min easy between, building 2 blocks to 4.
- 60 g carbs/h from 08-15, 70 g/h from 08-29, 90 g/h from 09-05.

B4, race rehearsal:

- Race kit, race bottles, race breakfast, race start time if the weekend allows.
- 09-05 is the full one: 90 km at 190-200 W, 90 g carbs/h, then 20 minutes running at 5:40-5:50/km.
- If the ride takes more than 2h40 on the race setup in normal wind, the budget moves to the swim.

R1, easy:

- 6:15-6:45/km, HR 121-142, cadence light.
- If HR crosses 145 without intent, walk 30 s and restart slower. The pace is not the point.

R2, quality:

- One per week, Wednesday, and the bike that day is off.
- Reps at 7:30-7:50/mile off full recovery, building 400 m to 1 km across the block. Stop while form holds.
- Race-pace durability lives in the Sunday long run, not here. This session exists to make 7:30/mile feel like a pace rather than a sprint.

R3, long:

- Start 15 s/km slower than target and never negative-split by accident.
- Fuel 40-60 g carbs/h past 75 minutes.
- From 08-30, finish the last 3-4 km at 70.3 race pace so the legs learn what tired-but-controlled feels like.

R4, brick:

- Off the bike within 4 minutes, no sitting.
- First kilometre 20-30 s/km slower than target, then settle.
- Practise the cup pinch and running through an imaginary aid station every 3 km.

## fuelling and gut training

A 5:55 race at 88 kg needs roughly 350-400 g of carbohydrate on course. That is above the single-transporter ceiling, so the mix has to be glucose plus fructose at about 1:0.8 and the gut has to be trained to take it.[^multitransport][^gut]

- Bike: 70 g/h from 08-29, 90 g/h from 09-05, and 80-90 g/h on race day across 2h55. Sodium 600-900 mg/h.
- Run: 50-60 g/h. Late September at Jones Beach is usually 18-24 °C, so the fluid need is moderate and the sodium need is ordinary.
- Breakfast 3 hours before: 2 g/kg carbs, about 170 g, low fibre, nothing new.
- Every long ride from 08-15 rehearses the exact bottles, flasks, and gel count. Gut distress on race day is a training error with a date attached.
- Daily carbs: 250-350 g on normal days, 400-550 g on long or rehearsal days, 200-250 g on rest days.[^carb]
- Protein floor 165 g, target 185 g, split across four feedings.[^protein]

## body composition

87.8 kg on 07-28, trending -0.67 kg/week, which is at the top of the 0.5-0.7% band.

- Hold -0.6 kg/week through 09-12. That lands 83.0-83.5 kg, about 183-184 lb, two weeks out, and 83 kg is what the 5:05/km run row assumes.
- Flat from 09-14. No deficit inside the taper and none in race week.
- Four kilos off 87.8 kg is 4.6% of body mass, worth roughly 1.5-2.5 s/km on the run, so 2:00 to 3:30 over the half, plus about 4 W of rolling resistance on the bike. Real, and still smaller than what the swim and the aero are worth. Do not trade interval quality for it.[^weightloss]
- Deficit sits on rest and easy days. Rehearsal days on 08-29, 09-05, and 09-12 are maintenance.
- Kill the deficit if sleep score drops under 75 for two nights, RHR sits 5 bpm over baseline, or the Wednesday quality run flattens.

## recovery gates

- Readiness under 70 for two straight days, HRV z below -1, RHR 5 bpm over baseline, or TSB below -25: swap the next quality session for 45-60 min at EM or a technique swim.
- 09-05 and 09-06 are the largest 48 hours in the block. Run the gate on 09-04. If TSB is below -25, move the long run to 09-07 and shorten it to 16 km rather than shortening the ride, because the ride is the coverage gate.
- Knees complained on 07-23. The run ramp is the injury risk in this plan, not the volume total. If anything hurts on two consecutive runs, cut the quality session first and keep the easy mileage.
- Race week arrives at TSB +10 to +20. Anything above +25 means the taper went too deep and the openers on 09-22 and 09-24 matter more.

## race execution

Swim. Zach’s Bay is protected salt water and almost certainly wetsuit legal, so it swims faster than anything in Lake Ontario this summer. Confirm at check-in. Seed honestly in the rolling start, take the first 200 m at 2:45/100 m while breathing settles, then hold CSS + 8 s. Sight every 6-8 strokes and take the feet in front when they are going the right way.

Bike. The parkway is flat and fully exposed, which is the course that rewards shape over watts more than any other. Stay in the extensions. Every minute spent sitting up costs about 12 seconds over 90 km, so the aid stations and the turnarounds are where the split leaks. Cap the first 20 minutes at 185 W no matter how good the legs feel out of T1, then hold 205 W and let the wind decide the speed. Watch power, not the speed field. Every gel goes in on schedule rather than by feel. If 09-05 said 205 W leaves nothing for the run, this number is 195 W on race morning and the decision was made three weeks earlier, not at kilometre 40.

Run. First 3 km at 5:15-5:20/km even though it will feel absurd, then settle to 5:04-5:10. Heart rate over 162 inside the first 5 km means slow down; a sub-5 run held at 168 for 107 minutes does not exist. The boardwalk has no shade and no gradient, so the only variable is discipline. Run through every aid station with a pinched cup, which is worth 8-10 minutes against the SuperTri habit. Anything left after 16 km goes into the last 5.

Sub-5 lives or dies between kilometre 8 and kilometre 16 of the run. Everything upstream is arithmetic and equipment. That stretch is the only part of the day where the answer is not already known by 09-12.

If a condition misses, the plan does not change, the number does. Swim at 2:32 costs 3:00 and the day is 5:01. CdA at 0.26 costs 6:30 and the day is 5:05. Both, and it is 5:08. None of those are failures against a 6:28 prediction, and none of them are reasons to ride harder on the day to make up the difference. That is how a 5:05 becomes a 5:40.

## the ladder to sub-5 and 4:40

| horizon     |          swim |                         bike |     run | total | what has to be true                                                 |
| ----------- | ------------: | ---------------------------: | ------: | ----: | ------------------------------------------------------------------- |
| 09-26 2026  | 42:00 at 2:14 | 2:24 at 205 W, CdA 0.22-0.23 | 1:47:15 |  4:58 | the five conditions, all of them, about a one-in-five day           |
| spring 2027 | 41:00 at 2:10 |      2:22 at 210 W, CdA 0.22 | 1:47:00 |  4:57 | FTP 265-270, VO2max 53-55, 82 kg, a winter at 50 km/week running    |
| 2028        | 36:00 at 1:54 |      2:15 at 240 W, CdA 0.22 | 1:43:00 |  4:40 | FTP 300-310, VO2max 58-62, 79 kg, stroke rebuilt from the catch out |

The 2026 row is the one this block chases and it has no slack in it. The rows below exist because a 4:58 on 09-26 is a one-in-five day rather than a plan, and the version of this that ends well has both a September attempt and a spring one. VO2max going 47.8 to 54 and FTP going 240 to 270 are ordinary two-season adaptations at 25 off volume you already tolerate. They arrive on their own schedule whether or not Jones Beach cooperates.

The one thing worth saying about 4:40: at that level the swim is 1:54/100 m, which is 50 seconds per 100 faster than 07-26. Nothing else in the table is a delta that size. Whatever the year, the water is where your race is decided, and the eight weeks starting tomorrow are the first eight you will have ever spent training it properly.

## race track

![[https://strava-embeds.com/route/3324107673389453392?fullWidth=true&style=standard&fromEmbed=false&token=_ysuM2AX063todCjermYmjJxxB2o05KyoEMT8ssfkqs#ns=cea1e019-a86f-4bf5-bfb7-d774447445dc&hostOrigin=https%3A%2F%2Fwww.strava.com&hostPath=%2Froutes%2F3324107673389453392&hostTitle=Northwell+IRONMAN+70.3+New+York+-+ROKA+Swim+Course+%7C+1.2+mi+Swimming+Route+on+Strava&mapHash=14.76/40.60027/-73.49691]]

![[https://strava-embeds.com/route/3383142967244101934?fullWidth=true&style=standard&fromEmbed=false&token=jMWVjLJB_BJkPCRvgRcEgXJ9Yt_K-6RCtWJjBqM0JNE#ns=75651fc9-e9a8-4647-b6be-7b2f8c350636&hostOrigin=https%3A%2F%2Fwww.strava.com&hostPath=%2Froutes%2F3383142967244101934&hostTitle=Northwell+IRONMAN+70.3+New+York+-+ZOOT+Bike+Course+%7C+56.1+mi+Cycling+Route+on+Strava&mapHash=9.48/40.6845/-73.5328]]

![[https://strava-embeds.com/route/3383142695097847704?style=standard&fromEmbed=false&token=-QsWuWzWajzV7xLQy-4o85pCSQFh3qfFercdPyWyvUo#ns=a607c16e-561d-4082-ab58-bf79d1448e9d&hostOrigin=https%3A%2F%2Fwww.strava.com&hostPath=%2Froutes%2F3383142695097847704&hostTitle=Northwell+IRONMAN+70.3+New+York+-+HOKA+Run+Course+%7C+13.3+mi+Running+Route+on+Strava]]

[^course]: Race facts from the event listing and course description: swim in Zach’s Bay, bike on the closed Wantagh Parkway, run on the Jones Beach boardwalk. <https://www.ironman.com/races/im703-new-york> Verify distances, wetsuit call, and transition layout in the athlete guide when it publishes.

[^wetsuit]: Chatard et al., “Wet suit effect: a comparison between competitive swimmers and triathletes”, Medicine and Science in Sports and Exercise, 1995. <https://pubmed.ncbi.nlm.nih.gov/7791590/> Competitive swimmers showed no significant change over 400 m; triathletes went 19 s faster with lower energy cost, and the effect scaled with how inefficient and how poorly buoyant the swimmer was. See also the 2021 narrative review in IJSPP, which puts the ceiling near 11%. <https://journals.humankinetics.com/view/journals/ijspp/16/9/article-p1217.xml>

[^gut]: Jeukendrup, “Training the Gut for Athletes”, Sports Medicine, 2017. <https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5371619/>

[^multitransport]: Jeukendrup, “A step towards personalized sports nutrition: carbohydrate intake during exercise”, Sports Medicine, 2014. <https://pubmed.ncbi.nlm.nih.gov/24791919/>

[^triphys]: Millet, Vleck and Bentley, “Physiological differences between cycling and running: lessons from triathletes”, Sports Medicine, 2009. <https://pubmed.ncbi.nlm.nih.gov/19453206/>

[^critical-power]: Karsten et al., “Validity and reliability of critical power field testing”, European Journal of Applied Physiology, 2015. <https://doi.org/10.1007/s00421-014-3001-z> Maturana et al., “Critical power: How different protocols and models affect its determination”, Journal of Science and Medicine in Sport, 2018. <https://doi.org/10.1016/j.jsams.2017.11.015>

<!-- training plan end -->

