Skip to content

Mark the serving-sensitivity re-runs on the Claude rows instead of a banner - #167

Merged
MaxGhenis merged 7 commits into
mainfrom
sensitivity-row-chips
Sep 6, 2026
Merged

Mark the serving-sensitivity re-runs on the Claude rows instead of a banner#167
MaxGhenis merged 7 commits into
mainfrom
sensitivity-row-chips

Conversation

@MaxGhenis

Copy link
Copy Markdown
Contributor

Summary

The leaderboard's serving-sensitivity paragraph carried four re-run scores and a mechanism explanation above the table, where scanning readers skip it and where it is far from the rows it qualifies. The scores now sit on the rows they describe.

  • Each of the four Claude rows gets a chip (auto 87.5 · #3) beside its name, on both the desktop and mobile layouts. Clicking it (or activating it from the keyboard) opens a short note in place: how the row was served, what the re-run changed, the re-run's score with its delta and would-rank, and links to the sensitivity note, the Fable 5.1 note, and v2 board condition: move every model to tool_choice auto #139. Escape or an outside click closes it. A native <details> keeps it readable without JavaScript.
  • The banner shrinks to one line: the markers exist, the board is unchanged, and the next board version moves every model to auto.
  • The four model pages carry the same sentence under their score pills.
  • The scores and treatments move from an inline constant in the leaderboard to app/src/lib/servingSensitivity.ts; would-ranks are still derived from the live board rows at render time.

Verified on a dev server: four chips render with auto 88.2 · #2, auto 87.5 · #3, auto 86.2 · #5, auto 80.8 · #13; the popover text and links are correct; the model page line renders for Claude Fable 5.1.

Tests

app/tests/servingSensitivity.test.ts: the data covers exactly the four Claude rows; the chip renders the auto score, the board-derived would-rank, the delta and the links; Fable 5.1 links its dated note; the leaderboard no longer carries the inline constant and marks the rows. bun run lint && bun run test && bun run build: 124 tests pass, build clean.

🤖 Generated with Claude Code

…banner

The leaderboard's serving-sensitivity paragraph carried four re-run scores
and a mechanism explanation above the table, where scanning readers skip it.
The scores now sit on the rows they describe: each of the four Claude rows
gets a chip ("auto 87.5 · #3") that opens, on click or keyboard, a short
explanation of how the row was served, what the re-run changed, the re-run's
score and would-rank, and links to the note. The banner shrinks to one line
that says the markers exist and that the next board version moves every
model to auto. The scores and treatments live in one module
(app/src/lib/servingSensitivity.ts); would-ranks are still derived from the
live board rows at render time. The four model pages carry the same line.

A native <details> keeps the marker readable without JavaScript and
operable from the keyboard; Escape and outside clicks close it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@vercel

vercel Bot commented Sep 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
policybench-site Ready Ready Preview Sep 6, 2026 1:15pm UTC

Request Review

… use pinned measurements

Peer review round 1:

- The open panel renders through a portal with fixed, viewport-clamped
  coordinates (panelPosition, unit-tested), so it escapes the row's
  animation transform that trapped it beneath later rows, and stays
  inside narrow viewports. Escape, outside click, scroll or resize
  closes it; the closed/server render keeps the panel inline.
- The chip compares the re-run against the row's exact-match score on
  the unfiltered board (the universe the re-runs were scored on), not
  the score under the reader's metric or filters, and says so.
- The banner says three rows ran without extended thinking; Fable 5.1
  reasons in both runs, so its marker compares transports.
- Scores are the pinned three-decimal measurements (asserted equal to
  sensitivity/data/*.json); deltas subtract unrounded inputs and round
  only for display (Fable 5.1: +1.2, not +1.3). The model page shows the
  same delta.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Peer review round 2:

- panelPosition takes the viewport height and the panel's rendered
  height: below the chip when there is room, above it otherwise, and a
  height cap with overflow scrolling when neither side fits. Scrolling
  and resizing re-place the panel instead of closing it.
- Opening moves focus into the panel once the portaled copy is committed;
  Tab past its last link or Shift+Tab before its first returns to the
  chip; Escape closes and restores focus; an outside click closes.

Unit tests cover the placement cases; the keyboard sequence and the
above-the-chip placement were exercised on a dev server.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… stays in view

Peer review round 3: place() used the panel's rendered height, which an
earlier placement may have capped, and the post-commit check skipped
re-placement when the rendered height equalled the cap, so scrolling a
constrained panel could push it below the viewport. Placement now uses
the panel's content height (scrollHeight), records it, and re-places on
the next frame whenever the content height differs from the one the
current placement assumed. The pending-focus flag is a ref so the focus
effect sets no state. A bounds test sweeps chip positions, viewport
heights and content heights and asserts the visible box always stays
inside the viewport, including the reviewed 568x320 case.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…he placement inside the top margin

Peer review round 4: a chip scrolled past the viewport edge still had an
open panel, clipped or entirely off-screen. place() now closes the panel
when the chip's box no longer intersects the viewport; a chip that is
only partly visible keeps its panel, whose top is clamped to the margin.
The scroll/resize coalescing and the post-commit re-placement use
zero-delay timeouts rather than animation frames, which browsers pause
in hidden tabs. Tests: the two reviewed off-screen cases, partly visible
edges, and a sweep over every anchor the component places.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…the right chip

Peer review round 5: with two chips opened by keyboard, every open chip's
document-level Escape handler ran, so Escape inside one panel closed both
and left focus on the other chip. A small registry
(app/src/lib/disclosureRegistry.ts) makes opening a chip close any other
without moving focus, and routes Escape to the active chip only, which
restores focus to its own trigger. Tests cover the reviewed sequence
(later chip open, earlier chip opened, Escape) and release semantics.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The one-line banner said the board forces the answer tool call without
saying for which rows; the disclosure test requires the contract
qualification (rows whose model card selects the tool contract; Fable 5.1
selects JSON), which the previous paragraph carried.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis merged commit 80113a3 into main Sep 6, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant