How it works
NovaRunners rates high-school cross country races run by Virginia runners, so that runs at different meets can be compared fairly. Method has the detail, and the vs. TullyRunners page shows how our numbers line up with a long-running rating system.
The short version
A time on its own says little. A 17:10 on a fast, flat course is a different run from a 17:10 on a hilly course on a hot day. So for every race we:
1 Take each runner’s finish time
What happens
The time as the results print it. On its own it says little: courses, hills, mud and weather differ from race to race.
In the example
100th place in the 2025 Oatlands Invitational varsity boys race, at Oatlands Plantation on September 27, 2025.
Finish time: 17:10.5 (1,030.5 s).
2 Work out how fast or slow the race ran
What happens
From its anchor runners: runners in the race who ran at least two of the varsity races we cover that season. Their other races show roughly how fast each of them usually is, so comparing their times here with that usual speed shows how the race ran. The most unusual tenth at each end is set aside.
In the example
517 of the 607 finishers were anchors.
Judged by their other races, they ran 2.7% slower here than in a typical 2025 boys race, so the race ran 2.7% slow.
3 Take that out: the adjusted time
What happens
First the race’s slowness (or speed) comes out, which puts every race on one yardstick.
Then a small on-the-day step allows for the date: runners get fitter through the season, so each run moves by half of a typical runner’s fitness gain or shortfall for its date, counted from late September (a late-September run barely moves).
In the example
Race adjustment: running 2.7% slow cost this runner 26.9 s. 17:10.5 − 26.9 s = 16:43.6.
On-the-day step for September 27, 2025: 1.6 s faster. 16:43.6 − 1.6 s = 16:42.0, the adjusted time (1,002.0 s).
4 Turn it into points: the Statistical Rating
What happens
Statistical Rating = K − adjusted seconds ÷ 3. Higher is faster, and one point is 3 seconds.
K is a scale number for each season and sex, set so that our ratings sit on the same scale as TullyRunners’ ratings at meets both sites rated. It moves everyone by the same amount.
In the example
1,002.0 s ÷ 3 = 334.0.
K for 2025 boys = 489.57.
489.57 − 334.0 = 155.6, to the nearest tenth: a Statistical Rating of 155.6.
5 Keep each runner’s best rating of the season
What happens
A runner’s season best is their highest rating from any shown, rated varsity race that season. JV races never count. Each race is graded A to E by how sure we are of its adjustment, and a season best from a D or E race is flagged.
In the example
155.6 is this one race’s rating. It is the runner’s 2025 season best only if no other rated 2025 varsity race of theirs rated higher.
6 Rank those season bests on a leaderboard
What happens
Each board ranks one season and sex by season best and shows the top 20. To be listed, a runner needs a verified Virginia profile, a high-school grade and at least two races graded A to C that season (in 2026, one is enough for now).
In the example
2025 boys: 490 runners qualified, and the board shows the top 20.
What does a rating mean?
Statistical Rating = K − adjusted time in seconds ÷ 3
Higher is faster, and one point is 3 seconds. K is a scale number for each season and sex, set so that our ratings sit on the same scale as TullyRunners’ at meets both systems rated. It moves everyone by the same amount, so it never changes anyone’s order. For 2025 boys, K is 489.57:
| Adjusted time | Statistical Rating |
|---|---|
| 15:30 | 179.6 |
| 16:00 | 169.6 |
| 17:00 | 149.6 |
| 18:00 | 129.6 |
| 20:00 | 89.6 |
Girls have their own scale, so compare boys with boys and girls with girls.
Why not just compare times?
Courses differ. Some are fast and flat; others have long hills, mud or tight turns. Many are not exactly 5,000 metres, and the weather changes from week to week. A time only means something once you know what the race was like.
The idea is not new. Bill Meylan has rated cross country races since 1999 and publishes the ratings on TullyRunners.com, judging each race by how runners of known ability finished. We follow the same idea with one fixed formula, applied the same way to every race. No race’s adjustment is set by hand.
How do you know how fast a race ran?
From its anchor runners: runners in the race who ran at least two of the varsity races we cover that season. Their other races tell us roughly how fast they are. If a race’s anchors, as a group, ran slower than usual, the race ran slow. If they ran faster, it ran fast.
The race adjustment is how much slower or faster a race ran than a typical race that season, as a percentage of time. A slow course slows everyone by the same percentage: “2% slow” adds about 24 seconds to a 20:00 run and about 19 seconds to a 16:00 run. Meet pages label it “Race effect”, in seconds for a 20:00 run.
Three rules keep one odd result from skewing it:
- Unusual runs are set aside. When the anchors are averaged, the tenth who ran furthest above their usual speed and the tenth furthest below are left out.
- At least 8 anchors. A race with fewer gets no ratings. With so few links, a weak field would look like a slow course.
- Everything is solved at once. All of a season’s races are calculated together, until each runner’s usual speed and each race’s adjustment agree.
Each meet page shows every rated varsity race’s adjustment and its number of anchors, and lists up to 50 of its anchor runners by name; every anchor is marked AN in the results. A JV race uses its meet’s varsity adjustment plus a JV adjustment.
Why does the date matter?
Runners get fitter through the season: a typical runner by about 1% a week until mid-October. The calculation gives each runner one usual speed for the whole season. On its own, that treats an early-season run as if the runner were already at their average fitness for the season, which flatters early times.
So we add an on-the-day step. It moves each run by half of a typical runner’s fitness gain or shortfall for its date, counted from late September. An early-September run counts about 4 to 5 points slower, a run from mid-October on about 5 to 6 points faster, and a late-September run barely moves. Everyone in a race moves by the same share, so the order within a race never changes.
A worked example
The race. The 2025 Oatlands Invitational varsity boys race, at Oatlands Plantation in Leesburg on September 27, 2025, had 607 finishers, 517 of them anchors. Compared with their other races, the race ran about 2.7% slower than a typical 2025 boys race. The meet page shows a race effect of +32.2 seconds at 20:00.
One runner. A runner finished 100th in 17:10.5.
| Step | What happens | Result |
|---|---|---|
| 1 | Finish time | 17:10.5 |
| 2 | Take out the race adjustment: running 2.7% slow cost this runner 26.9 seconds | 16:43.6 |
| 3 | On-the-day step: a late-September run moves 1.6 seconds faster | 16:42.0 adjusted |
| 4 | Into points: 1,002.0 seconds ÷ 3 = 334.0, and 489.57 − 334.0 | 155.6 Statistical Rating |
The race’s adjustment is known to about ± 1.5 seconds for a 20:00 run, so the race gets the top grade, A. For this runner the ± is 1.3 seconds, under half a point. If this is the runner’s best rating of the season, it becomes their season best, the number a leaderboard ranks.
How sure are the numbers?
Every race adjustment comes with an uncertainty, written “±” seconds for a 20:00 run. We measure it by recalculating the whole season 200 times, each time with a different random mix of schools, and seeing how much the race’s adjustment moves. A typical race’s adjustment is known to about ± 5.6 seconds, about ± 2 points.
Each race gets a grade from A (most certain) to E, and A to C count as reliable. The ± is about the race, not about how much a runner’s next race can vary, which is usually much more. Method has the grade bands.
Who is on the leaderboards?
A runner’s leaderboard number is their season best: their highest rating from any rated varsity race that season. A season best from a low-confidence race is flagged. To be listed, a runner needs:
- a verified Virginia profile on va.milesplit.com;
- at least two races graded A to C that season. In 2026, one is enough for now, and those runners are marked;
- a high-school grade. Runners in grades 6 to 8 keep their ratings on meet pages but are not ranked.
Each board shows the top 20 per sex and season. It ranks verified runners from the meets we rate, not every runner in the state. The Teams page ranks teams by a virtual cross country meet: the top 30 teams by average place their top seven runners on their season bests, and the lowest points win.
About these numbers
We publish meet results, leaderboards, team rankings and meet projections (with no odds). We don’t publish athlete pages or athlete search: MileStat has them, and pages built around one young runner raise privacy concerns.
We don’t publish win probabilities, or any general claim of how accurate the ratings are, until the 2026 season has been scored as a fresh test. Each meet projection is checked against the real result afterwards, and that check is shown.
- 2026 is in progress. Its rankings update as new meets are rated, and its scale can still move. The 2022 to 2025 ratings are final.
- Coverage is partial. We rate only the meets we cover.
- No system is the truth. TullyRunners is a comparison for us, not an answer key.
Method lists the other limits. Results come from MileSplit.