Ghost of the Gravel cramping: analysis and recommendations

Sidney McGill, 27, elite cyclist (top-20 CX World Cup; Hashimoto's thyroiditis since 2015; gluten- and dairy-free). At Ghost of the Gravel on June 27, 2026 (118 km, Cochrane AB, 12-18°C and raining), she developed severe hamstring cramps around the two-hour mark, finished the race, and limped home. She reports taking 90 g of carbohydrate per hour. This assessment combines the workspace record with the race file, pulled from TrainingPeaks on July 5 (workout 3813656593). Her debrief is still missing.

What the record shows

The June 13 simulation was clean. She rode 4:58, 135 km, 1579 m of climbing, on target for duration and load, with steady pacing throughout. Coach Luca's review flagged one concern: power easing in the final hour while heart rate kept climbing. That flag was wrong. The heart rate monitor stopped recording about halfway through the ride, and the apparent late-ride HR climb was a sensor dropout, not physiology. HR and power sensor problems on the Wahoo ELEMNT BOLT have been documented since the March device switch (see data-access.md). So there is no confirmed evidence of late-ride fade in the simulation, and nothing in it predicted the cramping.

What the sim did not test matters more. It was ridden at controlled sub-threshold pacing. The race target of about 4:35 sat 23-27 minutes ahead of her own course history (4:58 in 2023, 5:02 in 2024), against a strong pro field. Her first two hours on race day were almost certainly harder than anything her hamstrings had done at that duration.

The base under that effort was thin. She was off the bike entirely from February 1 to March 21, so the whole endurance rebuild fit into about 14 weeks. The build contained one ride over four hours: the June 13 sim. The rest of the long-ride ladder was 3:42 (June 4), 3:15 (June 11), and 3:15-3:30 (June 19). One exposure to race duration confirms capability. It does not make late-race muscle resilience durable.

Strength work was near zero through the block. Gym time was deliberately cut to protect the simulation and taper, the larger core and strength block was deferred to July 1, and no hamstring-specific loading appears anywhere in the plan. Cramp-prone muscles are usually the under-conditioned ones, and for cyclists pushed into long seated gravel efforts that is typically the hamstrings.

Her own history points the same direction. In training she can feel a cramp coming and prevent it by scaling the interval back. Cramping that responds to intensity, with a precursor she can sense, is the pattern of exercise-associated muscle cramping driven by neuromuscular fatigue rather than by fluid or electrolyte loss.

Carbohydrate was not the failure. 90 g/hr was on plan (90-100 target) and at the top of anything practiced: the June 13 target was 85-90 g/hr and June 19 was 80-90 g/hr. One caveat: race day may have been the first time she actually held 90+, since Luca asked for her actual sim intake and never got it.

Sodium and fluid actuals are unknown. The plan called for 700-1000 mg sodium and 600-800 mL fluid per hour; nothing in the record confirms delivery. The cool, wet day makes heavy sweat loss unlikely, but if her bottles and gels were carb-dense and sodium-light, chronic under-delivery could have contributed at the margin.

Hashimoto's is unlikely to be the primary cause but is cheap to rule out. Under-replacement causes muscle cramps on its own, and a hard training block plus travel across time zones can shift both thyroid status and levothyroxine timing. No recent TSH or T4 result appears in the record. The record also shows a stretch of chronic low energy and fat intake earlier this season (six-plus consecutive days under fat target in late April), and low energy availability degrades muscle function and recovery, more so with Hashimoto's.

The athlete's side of the record is still missing. No debrief, and the Recovery and Nutrition log sections have been empty since June 26. Every daily plan since the race notes "readiness unconfirmed."

What the race file shows

The race file was pulled from TrainingPeaks on July 5. Totals: 5:11:41, 118.1 km, 2044 m climbing, average power 195 W, normalized power 210 W, IF 0.81, TSS 339, average HR 166, max HR 199. The HR trace is complete for the full ride, unlike the June 13 sim. Her working FTP is about 260 W (the corrected zone table in power-zones.md and TP's own IF calculation agree).

Thirty-minute bins:

Time Avg power NP Avg HR Cadence Speed Stopped
0:00-0:30 211 238 164 85 24.9 km/h 10 s
0:30-1:00 203 227 170 86 22.1 1 s
1:00-1:30 225 247 180 87 21.2 0 s
1:30-2:00 199 223 175 83 27.2 0 s
2:00-2:30 205 228 180 83 25.6 0 s
2:30-3:00 151 185 165 64 19.7 104 s
3:00-3:30 152 — 160 65 13.8 138 s
3:30-4:00 125 — 149 65 17.5 352 s
4:00-4:30 169 — 156 80 23.6 32 s
4:30-5:00 171 — 158 84 30.5 0 s
5:00-5:12 186 — 162 78 20.8 1 s

Three findings.

First, she overpaced badly, exactly as suspected. The first 2.5 hours ran at NP 223-247, an IF around 0.90, against a June 13 sim ridden at NP 195 and IF 0.75. She raced roughly 20% above the only intensity she had rehearsed at duration. The anaerobic load was worse than the averages suggest: 31 minutes above FTP in the first two hours alone (the whole ride contains 45), 23 of those minutes above 276 W, and 69 seconds' worth of samples over 400 W, most in hour two. The 1:00-1:30 bin averaged HR 180 and touched 199, which is at or near her maximum. She rode the second hour of a five-hour race like a cyclocross race.

Second, the collapse timing matches her report and pins the trigger. Her last hard effort was a ~10-minute block at 241-247 W with HR 186-190 ending around 2:15. Power never recovered. From 2:20 onward it fell through the 170s into the low 100s, cadence dropped from the high 80s to 50-65, and the first full stop came at 2:53 (93 seconds). Six more stops followed, the worst a 200-second stop at 3:40 and a 131-second stop at 3:58 — about 10.5 minutes stationary in total, concentrated in the 2:30-4:00 window where speed also says she was climbing.

Third, the heart rate data argues for muscle, not systems. HR fell in proportion with power through the collapse (180 down to 149-160) and never dissociated. There is no cardiac drift signature, no thermal stress pattern, and nothing that looks like a systemic or cardiovascular limit. And from 4:00 to the finish she rode 80 minutes at 169-186 W with normal cadence and no stops — Z2/low-Z3 endurance was fully available the whole time. The failure was specific to high force output, which is the fatigue-cramp pattern.

The terrain also deserves a line: 2044 m of climbing over 118 km is 17.3 m/km, half again steeper than the sim's 11.7 m/km (1579 m over 135 km). The rehearsal underestimated the course's climbing density, and the cramps landed in the steepest stretch.

Working conclusion

The race file converts what was inference into evidence. Cause: fatigue-mediated hamstring cramping from riding the first 2.25 hours at IF ~0.90 with 31 minutes above FTP — roughly 20% above the only intensity rehearsed at duration — on a thin post-layoff base (one ride over four hours since the February-March layoff) with no hamstring strength work in the block. The trigger was a final 10-minute effort at 241-247 W with HR near max, ending at 2:15; the cramps followed within minutes, exactly matching her report. The HR trace shows proportional decline with power and a fully available Z2 engine to the finish, which localizes the failure to high-force muscle work. Possible secondary contributors, still unconfirmed: sodium under-delivery, first-time fueling at 90+ g/hr, bike-position load on the hamstrings, and thyroid or energy-availability drift. The cool wet day and the clean HR pattern together argue against dehydration or electrolyte loss as the driver.

Differential: iliac artery endofibrosis

Iliac artery endofibrosis (IAE), a flow limitation of the external or occasionally common iliac artery from intimal thickening and kinking in the flexed-hip cycling position, is underdiagnosed in elite cyclists and routinely mistaken for cramping. Sidney has the exposure profile: racing since 2013, high volumes, aggressive positions. Assessment: possible, not the leading candidate. Screen to rule out.

Against it: IAE typically presents as a one-sided dead leg, powerless or numb or burning, rather than a true cramp with palpable muscle contraction. It clears almost completely within 1-5 minutes of easing off, and it appears at a reproducible power threshold regardless of ride duration or fueling. Sidney's precursor-then-back-off pattern, and cramping that arrived at two hours and persisted to the finish, fit fatigue cramping better. The race file weakens the case further: after the collapse she rode 80 unbroken minutes at 169-186 W with normal cadence, and her stops cluster in the 2:30-4:00 window rather than recurring every time she applied moderate pressure. IAE bad enough to force seven stops would not usually leave steady 180 W riding untouched. For keeping it in view: her symptoms are intensity-dependent, she rides a sustained closed-hip gravel position, and the discriminating questions below have never been asked.

Field screening follows. None of it is diagnostic; it raises or lowers suspicion.

  1. One leg or both? This is the single most useful question. About 85% of IAE is one-sided. Bilateral hamstring cramping favors fatigue and conditioning. Strictly one-sided symptoms escalate the IAE concern.
  2. Symptom character. A true cramp has visible or palpable contraction, knots, residual soreness, and responds to stretching the muscle. IAE claudication is a powerless, numb, or burning thigh (sometimes hamstring or calf) that does not respond to stretch and has no palpable spasm.
  3. Resolution timing. Ischemic symptoms clear almost fully within 1-5 minutes of stopping. Cramp soreness lingers and re-triggers on stretch or renewed pressure. She can time this at the next occurrence.
  4. Position provocation. On a trainer, ride matched hard efforts (2 x 5 min near threshold) in a low, closed-hip position and again fully upright at the same power. Symptoms clearly worse in the low position suggest IAE. Fatigue cramps are largely position-indifferent.
  5. Reproducible power threshold. Log whether symptoms appear at a consistent intensity regardless of hours ridden and fueling (vascular pattern), or only deep into long, hard sessions (fatigue pattern).
  6. Post-effort pulse and skin check, with a partner or physio. Immediately after a maximal effort, compare feet and lower legs for one-sided pallor or coldness and palpate the posterior tibial and dorsalis pedis pulses. A diminished pulse on the symptomatic side is a red flag.

If any screen is suggestive, the next step is a sports-vascular clinic: post-exercise ankle-brachial index testing (maximal provocation on a bike, ABI measured within a minute of stopping) plus duplex ultrasound with the hip flexed. That decision belongs to her physician, not the coaching side.

Recommendations

This week:

  1. Get the debrief. The race file is now pulled and analyzed (done July 5); what remains is her side: one leg or both, what she took per hour, sleep, and whether levothyroxine timing held through travel. Ask her specifically about the effort ending at 2:15 — whether she felt the precursor and whether race position stopped her from backing off the way she does in training.
  2. Bloodwork: TSH and free T4, plus ferritin, vitamin D, and electrolytes while drawing. Her physician owns this; the coaching side only flags it.
  3. Start logging every near-cramp in training: session time, intensity, hours in, fueling, sleep, one leg or both. She already senses precursors. Turn that into data.

Training block, July onward. This is the primary fix:

  1. Hamstring strength twice a week. The future gym blocks should name posterior-chain resilience as a goal: Romanian deadlifts, eccentric hamstring work (Nordics), single-leg hip bridges, progressing to heavy-slow. Strength training is the best-evidenced long-term fix for recurrent exercise-associated cramping. Existing back and SI guardrails still apply; stop at any radiating symptom.
  2. Train pressure when tired. The gap is race-intensity work deep into long rides, so build a ladder of 3.5-5 hour rides finishing with 15-30 minute blocks at gravel race pressure (82-90% FTP) in hours three to five. Two to four exposures before the next long target race. One is not enough. Match rehearsal terrain to the course: Ghost carries 17.3 m of climbing per km and the sim route carried 11.7.
  3. Use her early-warning skill as the training stimulus: ride to the first precursor sensation in late-ride intervals, back off, recover, repeat. That is how the cramp threshold moves.
  4. Practice the actual race fueling rate. If race targets stay at 90-100 g/hr, long rides must hit 90-100 g/hr, confirmed in writing after each ride.

Race execution:

  1. Pace the first two hours to demonstrated numbers. She opened at NP 223-247 against a sim ridden at 195. Cap early-race NP near what the most recent long rehearsal proved sustainable (about 195-210 until she has rehearsed higher), and budget the over-FTP work: 31 minutes above threshold in the first two hours is a cyclocross ration, not a gravel one. A 4:35 target is an outcome, not a pacing input — and the 10.5 minutes she spent stopped with cramps cost more than conservative pacing would have.
  2. Write an in-race cramp protocol and practice it: at the first precursor, shift two gears easier and spin, slide forward on the saddle to bias the quads, 60-90 seconds off pressure, immediate sodium and carbs, a brief out-of-saddle stretch on a descent. Practiced, it costs seconds instead of the race.
  3. Make sodium delivery concrete: per-bottle milligram amounts written on the bottles, 700-1000 mg/hr verified, sodium preload the evening before and morning of. A sweat sodium test would individualize the target.
  4. Check the gravel bike fit. Excessive saddle height or rearward setback shifts load to the hamstrings over long seated efforts. Verify the position against her CX and road fit, especially if anything changed during race week.

Process:

  1. Close the logging gap. Recovery and Nutrition sections have been empty since June 26 and every plan since race day says "readiness unconfirmed." Post-race debriefs and long-ride fueling confirmations should block sign-off on the next block.
  2. Fix the sensors. The Wahoo HR dropouts produced a false final-hour-drift read on June 13 that made it into coach notes. Resolve the pairing (battery, strap, pairing), and treat any HR-based conclusion as suspect until the trace is verified continuous in TrainingPeaks.

Open questions

  • Actual in-race sodium and fluid per hour.
  • Date and result of the last TSH and free T4; levothyroxine timing through Mountain-time travel.
  • One leg or both. Bilateral points to fatigue; one-sided raises bike-fit and IAE suspicion.
  • Symptom character and resolution timing at the next occurrence: true contraction vs a powerless leg; lingering soreness vs full clearance within minutes.
  • Gravel bike fit provenance vs her primary bike.