Back to Vekta Skills

Race Debrief

Race Debrief

Race

Built tool

Race Debrief
Race Debrief

Created by

Vekta

Last updated

Categories

Race

Built tool

Made for

Coaches

Athletes

Runs

On demand

Topics

Durability

Race pacing

Share

One race, read against the athlete’s own record: where it turned, what was left at each level of fatigue, and the week that led to it.

One race, read against the athlete’s own record: where it turned, what was left at each level of fatigue, and the week that led to it.

Run it the morning after a race, or for any race you name. It reads the race second by second, with power, heart rate, W′ balance, the climbs and the laps, and sets it against the athlete’s own record: the best efforts from every ride at every level of fatigue over the 8 weeks and the 6 months before, their earlier races, and the same course in an earlier year when there is one.

It works out what kind of race it was (a road race, a hill climb, a circuit race, a time trial, a running race or a triathlon) and builds the page around it. The headline is the biggest finding against the athlete’s normal: a new best, the fatigue level where the power fell away, efforts above CP, pacing, decoupling, or the week going in, with sleep, HRV and notes against their own baseline. Before it builds, it asks how the race went, so a crash or a stop is explained rather than misread.

It reads in the athlete’s voice or the coach’s, with a switch at the top. It shows what happened and why. What to change stays with the athlete and the coach.

How to run it

1

Paste the prompt

Open Claude Code, Codex or Gemini CLI and paste it. Fill in anything in square brackets.

2

Or install the file

Unzip it into ~/.claude/skills for Claude Code, or ~/.agents/skills for Codex and Gemini CLI. Then run it as a Skill by name each time.

3

Let it run

A scheduled skill runs on your own computer, so it has to be on. Everything it reads is your data, through your key.

What it touches

Reads from Vekta

Rides and their streams, best efforts at every level of fatigue, climbs and laps, critical power, W′, weight, sleep, HRV, resting heart rate, RPE and feel, notes, events

Writes to Vekta

Nothing. It only reads.

Works in

Claude Code, Codex, Gemini CLI

Free, one step

Unlock this skill

The prompt and the installable file, free. Your name and email once, then every skill in the library opens on this browser for a year.

By unlocking you join Vekta’s email list. Unsubscribe any time.

Free, one step

Unlock this skill

The prompt and the installable file, free. Your name and email once, then every skill in the library opens on this browser for a year.

By unlocking you join Vekta’s email list. Unsubscribe any time.

Free, one step

Unlock this skill

The prompt and the installable file, free. Your name and email once, then every skill in the library opens on this browser for a year.

By unlocking you join Vekta’s email list. Unsubscribe any time.

GET THIS SKILL

The prompt, and the file.

Unlocked on this browser for a year. Paste the prompt into Claude Code, Codex or Gemini CLI, or install the file and run it by name.

THE PROMPT AND FILE

Get the file (.zip)

Race Debrief Build a debrief of my race from Vekta: one HTML page that reads the race and my own record and shows what happened, where it turned and why. If I give a race and a date, use them. If I say "my last race", take the latest activity Vekta classified as a race and confirm it with me before building. If my key coaches athletes, ask which athlete first. Read from the Vekta API with my key: the environment variable VEKTA_API_KEY, sent as Authorization: Bearer <key>. If it is not set, ask for it. Never print it, log it or write it into the page. Base https://api.joinvekta.com. Dates are the athlete's local dates. Every number on the page comes from the athlete's data, and every comparison is against the athlete's own record: their training, their earlier races and their own baselines. No population norms, no invented thresholds. Before you build, ask me one question, once: - If I am the athlete: "Before I build it: how did it go? Tell me your result and anything the data can't show: a crash, a puncture, a stop, how the race was ridden, the weather. Or say skip." - If I am the coach: "Before I build it: how did it go for [first name]? The result, and anything the data can't show: a crash, a puncture, a stop, how the race was ridden, the weather. Or say skip." Use the answer as context, never as data. The result goes in the header. Anything that explains the numbers (a stop, a crash, a mechanical) labels them where they show, in my words. With no answer, say nothing about the result. 1. Data to pull - The race: GET /users/{id}/activities for the race day. Prefer the activity with trainingStimulus "race"; raceType alone is not reliable. Read its summary (distance, effectiveDuration, totalDuration, elevationGain, work, normalizedPower, averagePower, averageHeartRate, maxHeartRate, intensity, volume, rpe 1 to 10, feeling 1 very weak to 5 very strong), its climbs (each with workBefore), laps, providerLaps, comments and summary. - GET /activities/{id}/streams for the race: power, heartRate, cadence, torque, speed, altitude, distance, grade, positionLat and positionLong, temperature, wPrimeBalance, intensity, leftRightBalance, and core temperature and running dynamics when a sensor recorded them. GET /activities/{id}/best-efforts: power at every afterWorkPerKg level, heart rate, pace. - Multisport: the legs share a day (swim, transitions, bike, run). Match them by day and start time; groupId is not reliable. - The record: every activity in the 6 months (183 days) before the race, and GET /activities/{id}/best-efforts for every ride in it. Cache each response by activity id and fetch only what is missing on a rerun. - Earlier races: activities in the 3 years before with trainingStimulus "race", the same sport, outdoors, 20 minutes or longer, with their streams and best efforts. Leave out a bike leg from a triathlon day unless the race is one. - Long rides of 3 hours or more in the 8 weeks before, not races, with their streams: the athlete's usual decoupling. - GET /users/{id}/metrics over the 400 days before: critical power, w prime (J or kJ, per the row's unit), max power, max heart rate (per sport), weight. Use the latest row on or before race day. - GET /users/{id}/sleeps for the 36 days before (day is the wake-up date), GET /users/{id}/notes for the 8 days before, GET /users/{id}/events for the race day and the 3 years before (event names). - Pace requests: 300 a minute per key and 30 a minute per athlete; on a 429 wait for Retry-After and retry, up to four times. Pull with a script, compute everything, and bake the results into the page. The page never calls the API. 2. Methods and definitions - Adjusted power: the 30-second rolling average, fourth-power mean. It matches normalizedPower; show Vekta's figure and say so if yours differs. Efficiency: adjusted power divided by average heart rate. Decoupling: efficiency in the first half against the second half, halves by time, adjusted power taken from the whole-ride 30-second series, (first minus second) divided by first, sign kept. - Heart rate at the same power: 30-second power in Vekta's tempo domain (70 to 90% of CP), the first 10 minutes left out, the first third of the race against the last third. - Work above CP: the sum of power above CP, second by second, in kJ, with CP from the metrics on race day. Time above CP: the seconds above it. Idle: the share of samples at zero power. - W′ balance is Vekta's own stream. Report its lowest point as a share of W′, where it came, and its value at the finish. Below zero means the race went past Vekta's current model: say it that way. - kJ/kg: cumulative work divided by weight. Note where each 10 kJ/kg was reached (km and clock time) and the average power from the start to that point. - Efforts above CP: a stretch where the 30-second average, centred on each second, stays above CP for at least 20 seconds, with gaps under 10 seconds merged, its edges trimmed to the first and last second above CP, and its own average above CP. Count them, cost each in kJ above CP, and say where they stopped. - Vekta's interval domains, second by second as a share of CP: aerobic under 70%, tempo 70 to 90, threshold 90 to 105, VO2max 105 to 130, anaerobic 130 to 180, neuromuscular over 180. - The record surface: for every afterWorkPerKg level and duration, the best maxAveragePower across the window, with the date of the ride that set it. Two windows: the 8 weeks before (current form) and the 6 months before (the ceiling). Read a length between two durations by log interpolation, and a level between two levels linearly. Never extrapolate past the deepest level or the longest duration on record; flag a reading that sits beyond them. - Durability: the race's best power at each length and level against the record at the same length and level, as a percentage, and against the race's own fresh best (level 0). A race best is what the race asked for as well as what the athlete had: say so on the page. - Climbs: each against the fresh best for its length in the 8 weeks (the 6 months when 8 weeks has none). Flag "new best at this fatigue" when it beats the 8-week best at its own level (the 10 kJ/kg floor at its foot), and "beyond any ride in the 8 weeks" when its foot comes after more work than any ride reached. - Kilometre splits: time, gradient, average power, share of CP, heart rate, cadence, torque and W′ at the end of each kilometre. - Recording pauses: a gap of more than 3 seconds between samples, with speed 0 before it. Times on the page are clock times; show the pause where it falls. - The same course in an earlier year: a ride with a start within 1 km and a distance within 15%, confirmed only when at least 90% of the checkpoints on this year's track (every climb's foot and top, every 5 km, the finish) lie within 150 m of its track. Then compare clock times between checkpoints from the foot of the first climb. A ride that fails the check took a different route: leave it out and say so. - Load-8, Load-2 and Strain are computed the way the Vekta apps compute them: Load-8 is the 8-week exponentially weighted average of daily Vekta volume (alpha 2/57), Load-2 the 2-week one (alpha 2/15), and Strain the 2-week one of daily Vekta intensity (alpha 2/15), each started from zero 56 days before the window and counting only sessions from that day on. - Baselines: the athlete's own 28 nights from 35 to 8 days before the race, for HRV, resting heart rate and sleep: mean and standard deviation. A night outside one standard deviation, in the direction worth a look, gets a chip. It is the athlete's own range, not a threshold. - Taper: the 7 days before the race against the weekly average of the 3 weeks before that: hours, Vekta volume, kJ, and hard sessions (stimulus vo2max, threshold, anaerobic, neuromuscular, race or test). - Heart rate 0 means no heart rate: leave it out of every average. A missing channel means no sensor on that ride. A race with no power keeps its heart-rate, time and course sections, and the page says why the rest is missing. 3. Read the race: its kind decides the chapters - Hill climb: one Vekta climb covers at least 80% of the distance. Chapters: kilometre splits. Hero: power in each kilometre against CP, with W′ balance under it. The fatigue section becomes the race on the power curve: its best power at every length against the 8-week and 6-month bests. No kJ/kg table; the race is too short to reach the levels. - Circuit race (criterium, cyclocross, short track): the GPS passes the same point at least 4 times, with laps of similar length. Take laps from the device when they match the circuit, otherwise from the GPS passes. Chapters: laps (time, power, heart rate and efforts above CP, lap by lap), the first lap, the last lap and the finish. Durability: the first laps against the last laps, not a kJ/kg table. In cyclocross, dismounts and running show as zero power or recording pauses: they are part of the race, not stops. - Time trial: steady power (adjusted power within 5% of average power), under 90 minutes, and a time trial in the event name or raceType. Chapters: segments by gradient and the turns. Hero: pacing, the first 10 minutes against the whole, power against gradient. - Road, gravel or MTB race: climbs and the work before each. Chapters: the climbs. Durability: the kJ/kg table. - Running race: pace per km, gradient-adjusted pace (from the published energy cost of running on a gradient, labelled as modelled), heart rate, and running power and dynamics when recorded. Durability from running power if recorded, otherwise the fade per km against the athlete's long runs. - Triathlon or duathlon: one chapter per leg (swim pace per 100 m and stroke rate; the bike as above; the run as above), T1 and T2, and what the bike cost the run: kJ/kg at the start of the run against training runs off the bike after similar work. - If the race fits none of these, say which it is closest to and why. 4. Pick the story Work out every candidate finding, measure each against the athlete's own normal, and rank them by size: - a new best: the race against the 8-week and 6-month records at any length or fatigue level - the race against earlier races, for example the best 30 minutes of any race - the same course in an earlier year: the time gap and where it opened - the turn: the fatigue level where the race's best efforts fell most - W′: below zero, or a large share still there at the finish - efforts above CP: how many, where, and where they stopped - pacing: the first kilometre or lap against the rest, the first half against the second - heart rate: decoupling against the usual, and heart rate at the same power early and late - the week going in: the taper, the notes, and wellness against the baseline The biggest finding becomes the headline and the hero chart; the next five become the cards. Include at least one thing that went well when there is one. Leave out anything the data cannot support, such as a sprint record from a race with no sprint. 5. The page, top to bottom - Header: "Vekta Skills / Race Debrief" in text, no logo; the athlete's first name and surname initial, the race and the date; and a switch, Athlete or Coach. Both voices are written into the page and the switch shows one. The athlete's version speaks to "you". The coach's version speaks about the athlete by first name, repeating the name rather than using pronouns. Open in the voice of whoever asked. - Hero: an eyebrow (Race Debrief, the event, the day and date, the kind of race, the name), the headline (one sentence, under 20 words, with its number), a short paragraph with the three numbers behind it, the hero chart, and eight stat tiles: for example time, distance and climbing, work and kJ/kg, adjusted power with W/kg and IF, work above CP, heart rate, decoupling, RPE and feeling (VAM for a hill climb). - Numbered sections, in this order: 1 What the data says: six cards, each with a label, a big number and its unit, a mini chart, one line with the numbers, and a link to the detail. 2 The race: one chart of stacked panels on one distance scale (elevation, power, heart rate, W′ balance, and the gap to the earlier year when there is one), with numbered moments listed under it; then the climbs, the laps or the kilometre splits. 3 The kind of race's own section: the durability table, the power curve, or lap by lap. 4 Above CP: every effort as a bar along the course, the costliest efforts, and time in each domain. 5 Heart rate and heat: the halves, heart rate at the same power, against the usual, and temperature (core temperature when recorded). 6 The week going in: day by day, sessions, notes, Load-8, Load-2, Strain, and sleep, HRV and resting heart rate against the baseline; then the taper. 7 Other races: the same measures race by race, and the same course in earlier years. 8 Data notes: Vekta's figures and what the skill calculated, the weight and when it was logged, the record windows, and what was missing. - Copy: British English, short sentences, no em dashes. Every finding carries its number. Insight, not coaching: say what happened and what the record shows, not what to do next. Say which figures are Vekta's and which are calculated. Say what is missing; never fill it. 6. Design and delivery - One self-contained HTML file, pre-rendered: every chart is inline SVG written into the page, the voice switch and the durability comparison switch work in CSS alone, and JavaScript adds only the crosshair on the race chart. No external files except Google Fonts: Instrument Sans for headings and numbers (weight 600, letter-spacing −0.02em) and IBM Plex Sans for text and chart labels. - Dark always: page #0B0E13, panels #12161D with a 1 px #242B35 border and a 12 px radius, text #EDEBE6, secondary text #BAC2CC, muted #8A95A3. The accent #FBCE01 marks the kJ/kg points, the race in every table and chart, and the selected control. Colour follows the measure everywhere: power #3987e5, heart rate #d95926, W′ #199e70, earlier years and records grey #A7B0BB. A share of a record uses one blue ramp, darker for more gone: #cde2fb, #9ec5f4, #6da7ec, #3987e5, #256abf, #184f95. A new best gets a green chip, #0ca30c, reading "▲ New best". - Charts: one measure per panel and no second axis; every line and reference line labelled; units in the panel title; numbers beside a bar or point, never on another mark; chart text with a dark outline so gridlines never run through it. Units sit smaller beside every big number. Maximum width 1,240 px; on a phone, wide charts and tables scroll sideways instead of shrinking. - Before delivering, check every label in every chart for overlap and clipping at desktop and phone widths, and fix what you find. - Save it as race-debrief-[date]-[race].html and open it. It carries the athlete's physiology: keep it private. This reads the race from the athlete's own data. It shows what happened and what the record says; decisions about training stay with the athlete and the coach. Docs: api.joinvekta.com/openapi.json

Next step

Run Race Debrief on your Vekta data

The API is free with every subscription. Paste the prompt and it reads your own data.

Coaching instead? Switch to the coach view

Next step

Run Race Debrief on your Vekta data

The API is free with every subscription. Paste the prompt and it reads your own data.

Coaching instead? Switch to the coach view

Next step

Run Race Debrief on your Vekta data

The API is free with every subscription. Paste the prompt and it reads your own data.

Coaching instead? Switch to the coach view

Next step

Run Race Debrief across your roster

The API is free with every subscription. Paste the prompt and it reads your whole roster.

Switch to the athlete view

Next step

Run Race Debrief across your roster

The API is free with every subscription. Paste the prompt and it reads your whole roster.

Switch to the athlete view

Next step

Run Race Debrief across your roster

The API is free with every subscription. Paste the prompt and it reads your whole roster.

Switch to the athlete view

Dream Big

Dream Big

Dream Big

The API is free with every Vekta subscription. One prompt connects it.

The API is free with every Vekta subscription. One prompt connects it.