diff --git a/.gitignore b/.gitignore index e768a75197..8aa57f60fc 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,6 @@ charts # ignore latest in app for testing /app/latest/ + +# local agent config (kept untracked, same as vlt.io/vltpkg) +.claude diff --git a/app/src/lib/utils.ts b/app/src/lib/utils.ts index 56623acc4b..abaa13b5d9 100644 --- a/app/src/lib/utils.ts +++ b/app/src/lib/utils.ts @@ -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 @@ -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; });