diff --git a/src/components/legal/BenchmarkRunsHistory.tsx b/src/components/legal/BenchmarkRunsHistory.tsx index b254c6ef3d..5da3a67676 100644 --- a/src/components/legal/BenchmarkRunsHistory.tsx +++ b/src/components/legal/BenchmarkRunsHistory.tsx @@ -313,7 +313,14 @@ export function BenchmarkRunsHistory({ () => runs.filter( (r) => - r.runType !== "manual" && + // Allow-list, not deny-list: only "recursion"-tagged rows (the + // LEGAL_BENCHMARK_EVAL / LEGAL_BENCHMARK_RECURSION loop) surface + // here. "manual" rows have their own path via manualRuns/manualRows, + // and "consolidated" rows (LEGAL_BENCHMARK_CONSOLIDATED) are + // excluded from both — they never render as their own row in this + // table, even though they still flow through the hook's merged + // `runs` list for the Recursion tab's Pusher-driven status tracking. + r.runType === "recursion" && (!selectedTask || r.taskSlug === selectedTask.slug), ), [runs, selectedTask], diff --git a/src/components/legal/RecursionBox.tsx b/src/components/legal/RecursionBox.tsx index 04d92fdf90..d012c2b163 100644 --- a/src/components/legal/RecursionBox.tsx +++ b/src/components/legal/RecursionBox.tsx @@ -393,13 +393,18 @@ function RecursionCard({ entry, refetch, allRuns }: RecursionCardProps) { // `allRuns` is lifted from RecursionTab (via RecursionList) so the whole tab // shares one fetch-and-poll loop instead of one per card. - // Find the most recent CONSOLIDATED run for this taskSlug. + // Find the most recent CONSOLIDATED run for this taskSlug. Consolidated + // rows are tagged "consolidated" (distinct from the "recursion" loop tag) + // by useLegalBenchmarkRunList specifically so they stay invisible in the + // Runs tab table — but this card still needs to find them here, in the + // same merged `allRuns` list, to seed in-flight/completed status after a + // page refresh. const existingConsolidated = useMemo(() => { return (allRuns ?? []) .filter( (r) => r.taskSlug === entry.id && - r.runType === "recursion" && + r.runType === "consolidated" && (r.status === WorkflowStatus.PENDING || r.status === WorkflowStatus.IN_PROGRESS) && !r.hasReport, diff --git a/src/hooks/useLegalBenchmarkRunList.ts b/src/hooks/useLegalBenchmarkRunList.ts index 5cbee35a0d..6147e373d3 100644 --- a/src/hooks/useLegalBenchmarkRunList.ts +++ b/src/hooks/useLegalBenchmarkRunList.ts @@ -8,16 +8,23 @@ import { getWorkspaceChannelName, PUSHER_EVENTS } from "@/lib/pusher"; /** * Display name per StakworkRun pipeline: - * - "manual" — LEGAL_BENCHMARK_RUNNER: a human clicked Run; scored - * - "recursion" — the automated loop, covering BOTH cron pipelines: - * LEGAL_BENCHMARK_EVAL (failure analysis; writes cause - * annotations onto the source run) and - * LEGAL_BENCHMARK_RECURSION (the fix-proposal step). - * Analysis is an internal stage of the loop, not a category - * an operator distinguishes — neither pipeline ever scores; - * re-scored attempts land graph-side (Recursion tab). + * - "manual" — LEGAL_BENCHMARK_RUNNER: a human clicked Run; scored + * - "recursion" — the automated loop, covering BOTH cron pipelines: + * LEGAL_BENCHMARK_EVAL (failure analysis; writes cause + * annotations onto the source run) and + * LEGAL_BENCHMARK_RECURSION (the fix-proposal step). + * Analysis is an internal stage of the loop, not a category + * an operator distinguishes — neither pipeline ever scores; + * re-scored attempts land graph-side (Recursion tab). + * - "consolidated" — LEGAL_BENCHMARK_CONSOLIDATED: the cross-run "Consolidated + * Report" comparison. Tagged distinctly from "recursion" so + * BenchmarkRunsHistory's allow-list filter excludes it from + * the Runs tab table entirely, while still flowing through + * this hook's merged `runs` list/Pusher subscription so the + * Recursion tab's RecursionCard can seed in-flight/completed + * consolidated-report status after a page refresh. */ -export type BenchmarkRunType = "manual" | "recursion"; +export type BenchmarkRunType = "manual" | "recursion" | "consolidated"; export interface BenchmarkRunListRow { id: string; @@ -227,9 +234,12 @@ export function useLegalBenchmarkRunList( // CONSOLIDATED rows are merged so Pusher updates for them flow through // the existing channel subscription without new polling logic, enabling // RecursionCard to surface in-flight / completed consolidated report - // status after a page refresh. They are not surfaced in the Runs tab - // table — the runType tag keeps them invisible there. - ...rawConsolidatedRows.map((r) => mapSecondary(r, "recursion")), + // status after a page refresh. They are tagged "consolidated" — a tag + // distinct from "recursion" — specifically so BenchmarkRunsHistory's + // allow-list filter excludes them from ever rendering as their own row + // in the Runs tab table, while remaining in this merged list (and thus + // reachable by RecursionCard/allRuns) for the Recursion tab's seeding. + ...rawConsolidatedRows.map((r) => mapSecondary(r, "consolidated")), ].sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()); runsRef.current = merged;