diff --git a/src/components/legal/BenchmarkRunsHistory.tsx b/src/components/legal/BenchmarkRunsHistory.tsx index 60e35d0b11..2e52b5e8ee 100644 --- a/src/components/legal/BenchmarkRunsHistory.tsx +++ b/src/components/legal/BenchmarkRunsHistory.tsx @@ -6,7 +6,6 @@ import { ExternalLink, Loader2, Repeat } from "lucide-react"; import Link from "next/link"; import { Badge } from "@/components/ui/badge"; import { - PASS_BADGE_CLASS, RUN_LIST_LIMIT, SUMMARY_WINDOW, WINDOW_OPTIONS, @@ -604,7 +603,8 @@ export function BenchmarkRunsHistory({ Started Runner Status - Score + Passed + Failed + Total Chat Report {isSuperAdmin && ( @@ -692,9 +693,12 @@ export function BenchmarkRunsHistory({ {/* Recursion re-runs now report post-fix scores back onto - their run row; ScoreCell renders its own dash when no + their run row; PassedCountCell renders its own dash when no score landed (older rows, fix-proposal stage). */} - + + + + @@ -702,6 +706,9 @@ export function BenchmarkRunsHistory({ + + + e.stopPropagation()}> {run.runType === "manual" ? ( @@ -867,41 +874,80 @@ function ChatCell({ run }: { run: BenchmarkRunListRow }) { return ; } -function ScoreCell({ run }: { run: AdjustedRun }) { +function hasScoreData(run: AdjustedRun): boolean { const isActive = run.status === WorkflowStatus.PENDING || run.status === WorkflowStatus.IN_PROGRESS; + return !isActive && typeof run.all_pass === "boolean"; +} - // Neutral placeholder for in-progress runs and terminal runs with no score data. - if (isActive || typeof run.all_pass !== "boolean") { - return ; +/** `n_passed` is undefined on rows with no score data. */ +function PassedCountCell({ run }: { run: AdjustedRun }) { + if (!hasScoreData(run)) { + return ; + } + if (run.n_passed === undefined) { + return ( + + n/a + + ); + } + if (run.n_passed === 0) { + return ( + + — + + ); } - return ( -
- {run.n_passed !== undefined && run.n_total !== undefined && ( - - {run.n_passed}/{run.n_total} - - )} - {run.all_pass && ( - - PASS - - )} -
+ {run.n_passed} + ); } -function hasScoreData(run: AdjustedRun): boolean { - const isActive = - run.status === WorkflowStatus.PENDING || run.status === WorkflowStatus.IN_PROGRESS; - return !isActive && typeof run.all_pass === "boolean"; +/** `n_failed` is null when the breakdown is not computable — unknown, not zero. */ +function FailedCountCell({ run }: { run: AdjustedRun }) { + if (!hasScoreData(run)) { + return ; + } + if (run.n_failed === null) { + return ( + + n/a + + ); + } + if (run.n_failed === 0) { + return ( + + — + + ); + } + return ( + + {run.n_failed} + + ); } /** `n_contested` is undefined on output-ref/bail-out rows — unknown, not zero. */ @@ -976,6 +1022,42 @@ function DisputedCountCell({ run }: { run: AdjustedRun }) { ); } +/** `n_total` falls back to `roster_total` when the row's own denominator is unset. */ +function TotalCountCell({ run }: { run: AdjustedRun }) { + if (!hasScoreData(run)) { + return ; + } + const total = run.n_total ?? run.roster_total; + if (total === undefined) { + return ( + + n/a + + ); + } + if (total === 0) { + return ( + + — + + ); + } + return ( + + {total} + + ); +} + /** * Small badge marking a run whose task's EvalSet has recursion enabled. * Links to the Recursion tab (same page, `?tab=recursion`) — clicks must not