Files
cycling-training/README.md
T
Chris Farhood cced0ea6b8 feat: add road-racing and TT demand docs (balance the MTB doc)
The skill had mtb-xco-demands.md but road/TT demands were only diffused
through the general docs — an asymmetry given the balanced MTB+road scope.
Add two dedicated, self-contained demand profiles (kept separate because
mass-start racing and TT differ as much as XCO differs from marathon MTB):

- references/road-racing-demands.md: stochastic power profile (Vogt 2007,
  Ebert 2005/2006, Sanders/van Erp 2021), drafting economics (Blocken 2018),
  fatigued finishing sprint (Menaspà 2013/2015, Etxebarria 2019), durability
  as a success determinant (van Erp/Sanders/Lamberts 2021); power governs, HR
  unreliable (intermittent) — mirrors the MTB doc.
- references/tt-demands.md: aero drag dominance + CdA as the top lever
  (Crouch 2017, Martin 1998, García-López 2008), critical power as predictor
  (Smith 1999), even-vs-variable pacing (Swain 1997, Atkinson 2007), long-TT
  durability (Maunder 2021); HR more usable than MTB but still secondary.

All new quantitative claims carry verified PMIDs/DOIs (verified via PubMed/
CrossRef); citations.md gains Road-racing and Time-trial sections. Honesty
flags: Blocken 2018 and Martin 1998 have no PMID (DOI only); the '~90% aero'
soundbite (Kyle & Burke 1984) is unverifiable and marked approximate;
criterium-specific literature flagged as a gap; no unverified HR-reliability
citation added (TT HR defers to data-confounds.md).

Router (SKILL.md) and README layout updated with both docs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TqrhBhC3GEcKyaw8RTk8G6
2026-07-20 21:05:15 -04:00

119 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# cycling-training
A modular **Claude skill** that provides periodization logic, workout design, research-backed
protocols, and interpretation guidance for endurance and off-road cycling training — designed to
**companion an Intervals.icu MCP server**, not replace it.
## The companion-to-MCP architecture
This skill deliberately holds **no data and no calculators**. It is the *reasoning* half of a
two-part system:
| Layer | Owns | Examples |
|-------|------|----------|
| **Intervals.icu MCP server** (data + computed metrics) | Fetching and computing everything numeric | activities, wellness, power curves, CTL / ATL / TSB, training-load ramp, zones, TSS, best efforts, streams |
| **`cycling-training` skill** (knowledge + reasoning) | Deciding what the numbers *mean* and what to do next | periodization logic, workout design, research-backed protocols, interpretation of trends, confound-aware caveats |
**The split is a hard rule.** If a script would only reproduce math the MCP API already returns
(zones, TSS, load metrics, CTL/ATL/TSB), it is intentionally absent. Ask the MCP server for the
number; ask this skill what to do about it.
### How they work together (typical flow)
1. **MCP** returns the data — e.g. `get_athlete_summary` (CTL/ATL/TSB), `get_wellness_data`
(HRV, RHR, sleep), `get_athlete_power_curves`, `get_activities`.
2. **Skill** supplies the reasoning — e.g. "TSB is 25 eight days out from an A-race; the taper
doc targets +5 to +15 by race day, so shed fatigue," or "this VO2 session banked little time
≥90% VO2max; the interval doc says check whether rep length / work:rest kept power in the band."
3. **You (Claude)** combine them into a recommendation, always citing which layer supplied what.
## Repository layout
```
cycling-training/
├── SKILL.md # Router — loads the right reference doc by need
├── README.md # This file
├── references/
│ ├── durability.md # Fatigue resistance as a trainable quality + field test
│ ├── mtb-xco-demands.md # MTB/XCO demand profile; power governs, HR caveat
│ ├── road-racing-demands.md # Mass-start road/crit: stochastic power, drafting, sprint
│ ├── tt-demands.md # Time trial: aerodynamics/CdA, critical power, pacing
│ ├── strength-for-cyclists.md # Heavy strength; masters rationale; from-zero ramp
│ ├── vo2max-intervals.md # Maximizing time ≥90% VO2max; work:rest; rep length
│ ├── periodization.md # Distribution philosophy; base/build/peak; CTL ramp; taper
│ ├── data-confounds.md # HR reliability; power-governs; decoupling/RHR caveats
│ └── citations.md # Master citation list with PMID/DOI — single source of truth
└── assets/
├── plan-template-base.md # Backward-mapped base mesocycle skeleton (3:1 / 2:1)
├── plan-template-build.md # Build block: VO2 + durability + strength integration
└── field-test-durability.md # The ~1,500 kJ → 1-min hill durability field test
```
## Installing as a Claude skill
A Claude skill is a directory containing a `SKILL.md` with YAML frontmatter (`name` +
`description`). To install:
**Claude Code (project or personal):**
```bash
# Personal (available in every project):
git clone <this-repo> ~/.claude/skills/cycling-training
# Or project-scoped (checked in with a repo):
git clone <this-repo> .claude/skills/cycling-training
```
Claude auto-discovers any `SKILL.md` under a `skills/` directory. The `description` field in the
frontmatter is what Claude matches against to decide when to load the skill, so keep it intact.
**Claude Desktop / claude.ai (import a zip):** the skill ships as a packaged `.zip` whose single
top-level `cycling-training/` folder holds `SKILL.md` and the docs — the layout Claude expects. Get
the zip one of two ways, then import it in **Settings → Skills**:
- **From a release:** download `cycling-training-<version>.zip` from the repo's Releases (produced
automatically — see *Packaging & releases* below).
- **From the packages registry:** the same zip is published to the Gitea generic packages registry:
```
https://git.farh.net/api/packages/farhoodlabs/generic/cycling-training-skill/<version>/cycling-training-<version>.zip
```
- **Build it yourself:**
```bash
scripts/build-skill-zip.sh v1.0.0 # -> dist/cycling-training-v1.0.0.zip
```
Once installed, this skill loads automatically when you ask cycling-training questions, and it
pairs with your connected Intervals.icu MCP server for the live data.
## Packaging & releases
`scripts/build-skill-zip.sh [version]` stages the installable files and produces
`dist/cycling-training-<version>.zip` (validating that `SKILL.md` carries `name`/`description`
frontmatter). A Gitea Actions workflow, `.gitea/workflows/release-skill.yml`, runs it:
- **Push a tag `v*`** (e.g. `git tag v1.0.0 && git push origin v1.0.0`) → builds the zip,
**attaches it to a Gitea release** for that tag, and **publishes it to the packages registry**.
- **Run the workflow manually** (workflow_dispatch) → builds the zip and uploads it as a run
artifact you can download.
The workflow uses two Actions secrets: `RELEASE_TOKEN` (repo write — creates the release and
uploads the asset) and `REGISTRY_TOKEN` (package write — publishes to the generic packages
registry). A registered Actions runner and Actions-enabled repo are also required.
## How to read the docs
- **`SKILL.md` is a router, not a manual.** It points to the one reference doc that answers the
question at hand. Load docs on demand; don't read them all up front.
- **Every quantitative claim carries a citation** (author/year, with PMID/DOI in `citations.md`).
This is deliberate: it lets future-you *verify* rather than trust.
- **Where the mechanism is established but the optimal dose is not, the docs say so** — marked
`⚠️ under-researched — track individual response`. Treat those as hypotheses to test on
yourself, not settled protocol.
## Scope & honesty notes
- Content is written for **balanced road/TT and MTB** use; discipline-specific numbers are
labelled and not over-transferred (small-n elite XCO data ≠ masters marathon reality).
- This skill gives **general training-science reasoning, not individualized medical advice.**
Nothing here overrides a physician, and readiness/overtraining calls should use the
confound-aware logic in `references/data-confounds.md`, never naive single-number rules.