You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(evalboard): make analytics surfaces harness-aware and stream tables (#45)
* feat(evalboard): scope task trends to one harness
Trends aggregated the last N pipeline runs regardless of harness, but the
nightly now rotates claude-code / codex / antigravity as separate runs — so a
single per-task pass rate, status strip, and averages were blended across
harnesses with incomparable pass rates and cost profiles, making
reliably-passing tasks read as broken.
Scope the page to one harness (default claude-code, the daily primary) with a
switcher, and fold the tag-rail counts into the cached aggregate so the window
loads once instead of twice per view.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* feat(evalboard): make all pages harness-aware and stream tables
Extend harness scoping beyond trends to the whole board and make the harness
set data-driven so a new harness (e.g. delegate) appears on its own:
- lib/harness.ts: shared leaf module (constants + normalize + a whitelist-free
param parser) so client and server can import without bundle contamination.
- listRecentHarnesses(): cached discovery of which harnesses have recent runs;
the switcher lists exactly those (plus the active one), no hardcoded set.
- Watchlist and path-to-ga: scoped to one harness (default claude-code) with a
selector, like trends — their blended pass rates / streaks / charts were
mixing incomparable harnesses.
- Front page: analytics (success chart + tag rail) scoped to a harness; the run
LIST stays all-harness (its job is to show every recent run, and the Harness
column already disambiguates each row).
- Tag rail preserves the active harness across chip clicks (fixes a reset on
trends too).
Also stream the trends and watchlist tables behind a Suspense boundary so the
header + selector paint immediately instead of blocking on the cold data load.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix(evalboard): match watchlist skeleton header to avoid layout shift
The Suspense fallback rendered only the harness selector, while the loaded
view adds a "last N … runs" pill in the same right-aligned group, so the
selector jumped left when the pill appeared. Mirror the pill (pulsing count)
in the skeleton so the header geometry is stable through streaming.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor(evalboard): address review nits on harness plumbing
- Use the DEFAULT_HARNESS constant for the default-harness value in
trends.ts and overview.ts's never-empty fallback instead of re-hardcoding
the "claude-code" literal, removing a silent drift trap.
- Render harnessShortLabel in the trends provenance + empty-state prose so
the view no longer shows both "Claude Code" and "claude-code".
- Drop a no-op readonly cast in the harness selector.
- Add parseHarnessParam tests (array/absent/whitespace/valid/reject/length).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0 commit comments