Files
6krrt/admin/frontend/models.html
adlee-was-taken fd038125f7 feat(admin): the dashboard becomes a landing page, with Board and Live views
The dashboard was eight cards restating what the other seven pages own, so
it was the page you passed through rather than the one you started from. It
is now the landing page: no nav entry of its own, reached by the logo, with
two views over the one /api/snapshot payload so switching costs no request.

Board is one tile per destination, identical anatomy every time: what it is,
one number, one qualifier, a link. Under them, a full-width Activity band
plots routed decisions against billed requests on one axis, so the gap
between them -- local dispatch, cache hits, requests that never reached a
provider -- is readable, which it is in neither series alone. Its range
(24h/7d/30d) is separate from the tile sparklines, because it is the chart
you come to the page to read. Beside it, the eight busiest models ranked by
CALLS, not cost: cost coverage is partial, and an OpenRouter row with two
priced calls out of hundreds otherwise outranks the model doing the work.

Live loads the row itself -- category, model, provider, required context,
tier, classify time, exploratory flag, cost -- so the usual question does
not need the Decisions page, and groups rows by minute so a burst reads as
one. The dot is the classification source: green for a real classification,
amber for a degraded one, which still routes but never moves proficiency,
and until now was visible only in a /metrics warning. The rail beside it
answers what Board cannot: throughput against the last hour, classifier p50
and p95 (the latency floor every routed request pays before an upstream
token), degraded share, and the top five models by share of the live window
keyed on model AND provider, since the same model on two providers is two
different routing outcomes. Spend is not restated here; it belongs to Quota.

Warnings move behind a navbar bell. They are recomputed from live state on
every poll, so the only honest dismissal is "hide until the condition
changes": a dismissal is keyed on the warning's TEXT, so when the numbers
move the key stops matching and the warning returns on its own. Nothing has
to expire it. Per browser, in localStorage, wrapped in try/catch -- a
reading state, not a fact about the router.

Two tests changed shape rather than being deleted. The verdict-bar tests
pinned a card this page no longer has, but the lesson they recorded is the
expensive part and is preserved verbatim in the replacement's docstring:
`unverifiable` is not a finding, it is the default for prose and for any
turn ending in a tool call, and any bar scaled against it renders every
meaningful verdict at the 2px minimum. Exclude it from the scale, never from
the denominator. The Live rail states the same fact as one ratio, which
needs no scale. The nav test's rule is inverted for index.html rather than
skipped: the landing page must have no nav entry AND must claim no active
one, so neither can drift back in.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VRQXz5SYZYVWscxS1QqF6U
2026-09-12 00:43:55 -04:00

44 KiB