What lope sees in a single run
Strava shows you a chart. lope reads the run. Here's the per-activity intelligence the coach gets — route shape, terrain-adjusted drift, fade detection, and the rest — so when the coach says something specific about a particular workout, the data backs it up.
The seven derived signals
Every time you sync a run, lope computes a set of derived metrics from the raw Strava streams (per-second HR, pace, distance, altitude, cadence). These go into the coach's context for every conversation:
Cardiac drift, raw and flat-only
Two numbers. The raw drift compares avg HR in the first half vs the second half. The flat-only version recomputes the same metric excluding climbing segments — so it isolates aerobic deficiency or dehydration from terrain-induced HR rise.
Pace coefficient of variation
How consistent your pace was relative to its mean. High CV on a long run means you went too hard early; on a tempo it means you broke up.
Split type
Negative, positive, or even split, computed by comparing first-half pace to second-half. Useful for race execution analysis and for spotting whether long runs are deliberately progressed or accidentally fading.
Fade detection
A specific test for whether effort fell apart late in the run — pace dropping while HR climbed, or HR dropping while pace dropped. The coach references this when reviewing long runs and races.
Effort consistency
The percentage of run time spent in Zones 1-2. For an easy run, this should be 90%+; for a tempo, it'll naturally be lower. The coach uses it to assess whether a workout hit its intended intensity.
Per-second zone distribution
When raw HR streams are available, zones are computed per-second across the entire run, not from per-lap averages. A run with a 142 bpm average can still spend 35% of its time above Zone 2 if the back half pushed harder — per-second exposes that.
Elevation by half
Total gain and loss for the first half vs second half of the run, in feet. Surfaces front-loaded vs back-loaded climbing — a 150ft / 320ft run is a different story than a 320ft / 150ft run, even if the totals match.
Why two cardiac drift numbers
Cardiac drift is one of the most useful signals in endurance training. As you get tired, dehydrated, or accumulate heat stress, your heart rate creeps up at the same pace. A drift of 5%+ over a 90-minute run is a meaningful signal of aerobic deficiency or under-fueling.
But terrain breaks the simple version of this metric. If the second half of your run is hillier than the first, your HR should rise — that's not aerobic deficiency, that's gravity. A naive drift number on a back-loaded climbing route would scream “under-fueled” when in fact you ran the route fine.
So lope computes both:
Raw cardiac drift
Avg HR (second half) vs avg HR (first half), as a percentage. Higher = HR drifted up.
Flat-only cardiac drift
Same calculation, but excluding samples taken on uphill segments (positive grade above a noise threshold). Isolates the “you got tired” component from the “you ran into the hills” component.
When raw drift is high but flat-only drift is low, the coach knows the hills did it — not your aerobic system. When both are high, that's a real signal, and the coach treats it as one.
Route shape from your polyline
Strava encodes every GPS-tracked run as a polyline. lope decodes it and classifies each route into one of three shapes by comparing start and end coordinates:
| Shape | Trigger |
|---|---|
| Loop | Start and end within ~200m of each other |
| Out-and-back | Anything in between |
| Point-to-point | End is more than 30% of total distance from start |
This sounds simple but it's genuinely useful context. The coach can recognize when you're running your usual Saturday loop vs trying a new point-to-point route, or notice when your start locations stop varying (a small early signal of training rut). It also disambiguates — an “easy 8 miles” that's a flat loop is a different stress than an “easy 8 miles” that's a one-way commute up a mountain.
Per-second vs per-lap zone distribution
Most apps compute zone distribution from per-lap averages. If your watch creates a lap every mile, each lap gets a single average HR, and that average gets bucketed into one zone. Run 8 miles, you get 8 zone classifications.
That's lossy. A lap with a 142 bpm average might have spent 3 minutes at 130 and 7 minutes at 150 — a real Zone 2/3 split — but the lap-average bucket calls it pure Zone 2. lope uses lap averages only as a fallback. When per-second HR data is available from Strava streams, zones get computed per sample — so a 71% Zone 2 figure means “71% of your seconds were in Zone 2,” not “71% of your laps had an average HR in Zone 2.”
The coach knows which method was used for any given run. Stream-based numbers carry more weight in analysis; lap-based numbers come with a soft caveat.
The athlete-supplied context the coach also gets
Beyond derived signals, the coach receives whatever you've added to the run yourself:
- Strava perceived exertion (RPE) if you logged it (1-10 scale)
- Felt-effort note — a freeform field for “legs felt heavy,” “HR strap was glitching the first 2 miles,” etc.
- Plan vs actual — if a workout was scheduled on your training calendar, the coach sees both the plan and what you actually did
- Coach's prior reaction — what the coach said about that run last time it came up in chat. So your fourth conversation about the same workout doesn't restart from zero.
- PR count from Strava if any segment PRs were set during the run
The athlete notes in particular matter for the coach's honesty. If you flagged a sensor malfunction, the coach won't treat the obviously-wrong HR data as evidence of aerobic deficiency.
What this looks like in practice
Here's what the coach actually sees for one run, in the format that gets injected into its context:
- Apr 12: Saturday Long Run (Run) [Long Run] - 16.2 mi in 2h 11m, pace 8:06,
avg HR 148, elev +850ft, loop course, cadence 174 spm
Planned: Long Run, 16.0mi — "Steady aerobic. Last 3 at MP feel."
Coach noted: "Solid. The MP segments were clean. Build by 1 mile next week."
Athlete felt: legs heavy from yesterday's strides, but settled in by mile 4
Zone distribution (stream): Z1 5% | Z2 78% | Z3 14% | Z4 3% | Z5 0%
Stream analysis: cardiac drift 4.2% raw, 2.1% on flats only,
pace CV 0.041, even pacing, 92% time in Z1-Z2
Elevation by half: 1H +320ft / -180ft, 2H +530ft / -210ftThat's for one run. The coach gets the last ten in this format, plus four-week aggregates, race goals, and your full athlete profile. When the coach says “that drift was the back-half hills, not your aerobic system,” it has the data to back the claim.
What lope doesn't (yet) read
Honesty section. There are signals lope could use but doesn't today:
- Temperature and weather. Strava's API exposes the temp at activity start; lope doesn't currently extract or use it. A hot run vs a cool run with identical splits is a different story for the coach. On the roadmap.
- Power data. Running power meters (Stryd, etc.) are an increasingly useful signal, especially for trail and ultra. Not yet integrated.
- Sleep and HRV. If you wear a watch that tracks sleep score or HRV trends, that data lives outside Strava and lope can't see it — but it's strongly relevant to coaching. We're thinking about how to bring it in.