Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@ charts

# ignore latest in app for testing
/app/latest/

# local agent config (kept untracked, same as vlt.io/vltpkg)
.claude
15 changes: 4 additions & 11 deletions app/src/lib/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,8 @@ export const calculateLeaderboard = (
?.variations.filter((v) => v !== "average") || [];
}

// Calculate performance
// Calculate performance — DNF runs are imputed as the slowest successful
// time for that fixture, matching the "Performance Over Time" chart data
variationsToUse.forEach((variation) => {
const dataSource = usePerPackageData
? chartData.perPackageCountChartData.data
Expand Down Expand Up @@ -384,19 +385,11 @@ export const calculateLeaderboard = (
};
});

// Determine if we're showing the average/default leaderboard
const isAverageView = !specificVariation || specificVariation === "average";

// Filter out PMs with no data, then sort:
// - Average view: sort by wins first (most wins = #1), then average time as tiebreaker
// - Specific variant views: sort by average time (lower is better), then wins as tiebreaker
// Filter out PMs with no data, then sort by average time (lower is
// better) so card order matches the displayed values, wins as tiebreaker
return leaderboard
.filter((item) => item.totalTests > 0)
.sort((a, b) => {
if (isAverageView) {
if (a.wins !== b.wins) return b.wins - a.wins;
return a.averageTime - b.averageTime;
}
if (a.averageTime !== b.averageTime) return a.averageTime - b.averageTime;
return b.wins - a.wins;
});
Expand Down