Problem
CI only returns scalar regressed counts and the run page only compares against the immediate predecessor. Bisecting "which change broke case X" across 10 runs is manual.
Pattern
Follow app/runs/[id]/page.tsx (prev-run pass-map fetch + per-case table) and test/runs-route.test.mjs (boots next dev, asserts on JSON). Add GET /api/runs/compare?a=<id>&b=<id> returning per-case {before, after, verdict: held|regressed|fixed|added|removed} plus a compare UI section. Pure function over two result sets, Supabase reads only.
Acceptance
Route GET /api/runs/compare + test asserting a flipped case yields verdict: "regressed" and an added case yields "added".
Problem
CI only returns scalar
regressedcounts and the run page only compares against the immediate predecessor. Bisecting "which change broke case X" across 10 runs is manual.Pattern
Follow
app/runs/[id]/page.tsx(prev-run pass-map fetch + per-case table) andtest/runs-route.test.mjs(bootsnext dev, asserts on JSON). AddGET /api/runs/compare?a=<id>&b=<id>returning per-case{before, after, verdict: held|regressed|fixed|added|removed}plus a compare UI section. Pure function over two result sets, Supabase reads only.Acceptance
Route
GET /api/runs/compare+ test asserting a flipped case yieldsverdict: "regressed"and an added case yields"added".