From a6878c85a8152932560a6d35dff686f943d0323f Mon Sep 17 00:00:00 2001 From: larssand Date: Thu, 19 Mar 2026 20:51:29 +0100 Subject: [PATCH] Clamp stale next-lap prediction --- src/app.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/app.js b/src/app.js index 796daa7..9b0d7d7 100644 --- a/src/app.js +++ b/src/app.js @@ -7088,6 +7088,7 @@ function buildLeaderboard(session) { const isFreePractice = sessionType === "free_practice"; const isOpenPractice = sessionType === "open_practice"; const isRollingPractice = isFreePractice || isOpenPractice; + const { maxLapMs } = getSessionLapWindow(session); const nowTs = Date.now(); const rows = Object.values(result.competitors).map((row) => { const allPassings = getCompetitorPassings(session, row, { includeInvalid: true }); @@ -7115,10 +7116,18 @@ function buildLeaderboard(session) { ? bestLapMs : null; const currentLapElapsedMs = lastPassingTs ? Math.max(0, nowTs - lastPassingTs) : 0; - const predictedRemainingMs = predictionBaseMs ? predictionBaseMs - currentLapElapsedMs : null; - const predictedProgress = predictionBaseMs ? currentLapElapsedMs / predictionBaseMs : 0; + const predictionStaleMs = predictionBaseMs + ? Math.max( + predictionBaseMs * 2, + Number.isFinite(maxLapMs) && maxLapMs > 0 ? maxLapMs : 0, + 15000 + ) + : 0; + const predictionActive = Boolean(predictionBaseMs && lastPassingTs && currentLapElapsedMs <= predictionStaleMs); + const predictedRemainingMs = predictionActive ? predictionBaseMs - currentLapElapsedMs : null; + const predictedProgress = predictionActive ? currentLapElapsedMs / predictionBaseMs : 0; const predictionTone = - !predictionBaseMs || predictedProgress <= 0.85 + !predictionActive || predictedProgress <= 0.85 ? "good" : predictedProgress <= 1 ? "warn"