feat: add cycling-training Claude skill (MCP companion)

Modular cycling-training skill: periodization logic, workout design, and
research-backed protocols that companion an Intervals.icu MCP server (the
server owns all data + computed metrics; the skill owns knowledge + reasoning).

Structure:
- SKILL.md router + README (companion-to-MCP architecture, install steps)
- references/: durability, mtb-xco-demands, strength-for-cyclists,
  vo2max-intervals, periodization, data-confounds, citations
- assets/: base + build plan templates, durability field-test protocol

Every quantitative claim carries an inline citation; citations.md is the
single source of truth with PMID/DOI, each verified against PubMed on
2026-07-20. Notable honesty flags baked in:
- VO2 rep-length: running (Fleckenstein 2025) vs cycling (Ronnestad) conflict
  documented rather than asserted; cycling evidence favors short intervals.
- 'Yu et al. 2025' (frequency > distribution) could not be found; not cited.
- Under-researched doses (durability, taper TSB, CTL ramp) flagged 'track response'.
- HR-confound doc forbids naive decoupling<5% / RHR+5 rules.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TqrhBhC3GEcKyaw8RTk8G6
This commit is contained in:
2026-07-20 18:59:37 -04:00
parent 53a460e50d
commit f6dd9dfc27
13 changed files with 988 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
# Durability field test — fatigued-state power on a fixed hill
A repeatable field test for **fatigue resistance**: how much of your fresh power survives after
substantial work. Fatigued-state power discriminates real-world cycling performance better than
fresh power (see `references/durability.md` and `references/citations.md`).
> ⚠️ **Under-researched dose.** The *concept* is well supported; the *optimal* kJ pre-load and
> effort length are not standardized. Treat the numbers below as a sensible, repeatable default —
> hold them **constant** across tests so the comparison is valid, and track your own response.
## The protocol
**Fresh baseline (do once, on a rested day):**
- Warm up, then a maximal **1-minute effort** on your chosen fixed hill.
- Record: average power, the segment, gearing, and conditions. This is your *fresh* anchor.
**Fatigued test (the actual durability measure):**
1. Ride until you have accumulated **~1,500 kJ of work** (typically ~2.5 h; read the kJ total from
the MCP `get_activity_*` data / head unit — do **not** estimate it by feel). Keep this ride
mostly endurance so the fatigue is from *duration*, not a second hard effort.
2. Immediately do the **same 1-minute maximal effort on the same hill**, same gearing.
3. Record average power.
**The number that matters:**
```
Durability % = fatigued 1-min power ÷ fresh 1-min power × 100
```
Higher = more durable. Track the *trend* across a season, not a single value.
## Keep it a valid comparison (hold these constant)
| Variable | Why it must be fixed |
|---|---|
| The hill / segment & gearing | Grade and cadence change the powerspeed relationship |
| The **1,500 kJ** pre-load | The whole point is matched accumulated work |
| Nutrition during the pre-load | Glycogen status drives fatigued power; fuel it consistently |
| Time of day, rough temperature | Heat and circadian effects move power (`references/data-confounds.md`) |
## Reading it
- **Prescribe and judge from power, not HR.** HR after 1,500 kJ is confounded by cardiac drift,
heat, and fueling — use it only as a secondary decoupling signal (`references/data-confounds.md`).
- A rising durability % across a block, with fresh power flat or up, is the signal you want.
- A durability % that only holds when overall training load is high is *expected* — durability
depends on sustained load, unlike fresh power (see Spragg et al. in `references/citations.md`).
## Logging it back to Intervals.icu
Record the fresh and fatigued efforts as tagged activities/intervals, or note the durability % in
the activity message / wellness comment, so the MCP server can retrieve the series later. This
skill does not store data — Intervals.icu does.
+62
View File
@@ -0,0 +1,62 @@
# Plan template — base mesocycle (backward-mapped from an A-race)
A fill-in skeleton for a **base** block. This is a *knowledge template*, not a calculator — pull
every number (current CTL/ATL/TSB, FTP, MAP, TSS) from the Intervals.icu MCP server and reason with
the logic in `references/periodization.md`.
## Step 0 — anchor to the A-race (backward mapping)
```
A-race date: __________
Weeks until A-race: __________
Race demands: (road/TT? MTB/XCO? marathon? — see references/mtb-xco-demands.md)
Target race-week TSB: +5 to +15 (see periodization.md → taper)
Current CTL / ATL / TSB: ____ / ____ / ____ (from MCP get_athlete_summary)
```
Work **backwards**: peak → build → base. Base's job is to raise sustainable CTL and aerobic
durability so the build block has something to sharpen.
## Step 1 — mesocycle rhythm
| Athlete profile | Loading rhythm |
|---|---|
| Younger / high recoverability | **3:1** (3 build weeks : 1 recovery week) |
| **Masters / higher life stress** | **2:1** (2 build : 1 recovery) — favors recovery |
Pick one and hold it. Recovery weeks are ~4060% of the preceding load week's TSS.
## Step 2 — weekly shape (base phase)
Base is **mostly low intensity with a small hard dose kept alive.** Distribution is a principle,
not a recipe (Seiler — see `references/periodization.md`): let volume, training age, and life
stress set the exact split.
```
Weekly TSS target: ____ (ramp CTL ~37 pts/week; see periodization.md → CTL ramp)
Long endurance ride: 1 × ____ h (durability driver — see references/durability.md)
Endurance / Z2 rides: __ × ____ h
Aerobic-support intensity: 1 × threshold OR sub-threshold session (keep top-end from decaying)
Strength: 2 × /week heavy (see strength-for-cyclists.md; from-zero ramp if new)
Recovery / off: as needed
```
## Step 3 — build in durability early
- Progressively lengthen the long ride; late in base, place **fatigued-state efforts late** in the
long ride (hard work after accumulated kJ) — see `references/durability.md`.
- Fuel these to spare glycogen; the point is durability, not depletion.
- Schedule the durability field test (`field-test-durability.md`) at the **start and end** of base
to measure the block.
## Step 4 — strength through base
- Base is the ideal time to build heavy-strength capacity: 2×/week, heavy compound lifts, 36 reps.
- Sequence strength-first or on separate days to mute interference (`references/strength-for-cyclists.md`).
- Plan to **preserve** (not abandon) strength into build/in-season — 1×/week maintenance.
## Checkpoints (pull from MCP, judge with the skill)
- [ ] CTL ramp within target (not runaway) — `get_athlete_summary`
- [ ] Recovery weeks actually recovered — wellness trend, `references/data-confounds.md`
- [ ] Durability % improving across the block — `field-test-durability.md`
- [ ] Strength load progressing — logged sessions
+64
View File
@@ -0,0 +1,64 @@
# Plan template — build block (VO2 + durability + strength)
A fill-in skeleton for a **build** mesocycle that sharpens the aerobic engine while preserving the
base's durability and strength gains. A *knowledge template*, not a calculator — pull all metrics
(CTL/ATL/TSB, FTP, MAP, TSS) from the Intervals.icu MCP server; reason with the referenced docs.
## Position in the season
Build sits between base and peak (backward-mapped from the A-race — see
`assets/plan-template-base.md` and `references/periodization.md`). Its job: raise sustained power at
and above threshold, add race-specific top-end, and keep durability from base intact.
```
Weeks of build: __________
Weeks until A-race: __________
Current CTL / ATL / TSB: ____ / ____ / ____ (MCP get_athlete_summary)
Primary limiter this block: (VO2max? threshold? repeatability? — pick ONE emphasis)
Race demands: (road/TT steady? MTB/XCO intermittent? — mtb-xco-demands.md)
```
## Mesocycle rhythm
Same as base: **3:1** (higher recoverability) or **2:1** (masters / high life stress). Build weeks
carry more *intensity*, so recovery weeks matter more, not less.
## Weekly shape (build phase)
Fewer but sharper hard sessions. **Frequency of hard sessions matters more than the exact
polarized-vs-pyramidal label** (Yu et al. — see `references/periodization.md`). A common shape:
```
VO2max session: 12 × /week (see references/vo2max-intervals.md for rep length / work:rest)
Threshold / race-specific: 1 × /week (or fold into the durability ride for MTB)
Long durability ride: 1 × ____ h with hard efforts placed LATE (references/durability.md)
Endurance / Z2: fill remaining volume — protect the low end
Strength (maintenance): 1 × /week heavy, low volume (references/strength-for-cyclists.md)
Recovery / off: as needed
```
### VO2max prescription (from `references/vo2max-intervals.md`)
- Goal is **maximizing time ≥90% VO2max**, not just "going hard."
- Bias toward **longer reps (~35 min, ≈140 s optimum region)** at ~0.85 work:rest for rebuilding
sustained aerobic power; they accumulate more time >90% VO2max than 30/30s at matched intensity.
- Prescribe from **power**; for MTB, HR will lag and mislead (`references/data-confounds.md`).
## Keep durability alive
- Maintain at least one long ride; add fatigued-state efforts late (hard work after accumulated
kJ). Durability decays if overall load drops (Spragg et al. — `references/citations.md`).
- Re-run the durability field test (`assets/field-test-durability.md`) at block end to confirm it
held while you added intensity.
## Preserve strength (don't drop it)
- **1×/week heavy maintenance** retains in-season strength gains; interference is muted with
strength-first/separate-day sequencing and at older age (`references/strength-for-cyclists.md`).
## Checkpoints (pull from MCP, judge with the skill)
- [ ] VO2 sessions actually spending time ≥90% VO2max (power sustained across reps) — streams/intervals
- [ ] TSB not chronically buried — `get_athlete_summary`; screen wellness (`data-confounds.md`)
- [ ] Durability % holding or rising — `field-test-durability.md`
- [ ] Race-specific demand rehearsed (steady TT vs intermittent MTB) — `mtb-xco-demands.md`
- [ ] Strength maintained — logged sessions