diff --git a/web/src/routes/admin/diagnostics/+page.svelte b/web/src/routes/admin/diagnostics/+page.svelte
index 3a3319db..afad091a 100644
--- a/web/src/routes/admin/diagnostics/+page.svelte
+++ b/web/src/routes/admin/diagnostics/+page.svelte
@@ -1,5 +1,7 @@
-
- The defaults-discovery lab. Changes apply live — radio on the next request, daily mixes on - the next rebuild — and every change is recorded so the metrics page can tie outcome shifts - to knob turns. Found-good values get baked into shipped defaults; a dot marks knobs that - currently deviate from them. -
-+ Scoring knobs that apply live, each change recorded against the trends below. A dot marks one + changed from the shipped default. +
{#if loadFailed} -Couldn't load tuning settings.
++ Couldn't load the tuning settings. + +
{:else if !snapshot}Loading…
{:else} -{p.blurb}
-- How plays become the learned taste profile: the influence half-life and the - completion→engagement curve (must stay ordered: hard-skip < neutral < full). -
-- How the Discover suggestion deck ranks out-of-library artists. Tag coverage for - artists you don't own is partial by nature, so an untagged candidate keeps its - similarity score rather than being pushed down. -
-- Skip rate per surface over the last {trends?.weeks ?? 12} weeks (lower is better; all - users aggregated, rates only). Dashed ticks mark tuning changes. Taste hit is the share - of plays whose artist fits the current taste profile. - The skip and completion columns show the most recent week - alone, not the whole window — the figure after the skip rate is that week's - play count, so a rate drawn from a handful of listens reads as what it is. -
-Couldn't load trends.
- {:else if !trends} -Loading…
- {:else if trends.series.length === 0} -- No plays recorded yet — trends appear once listening accumulates. -
- {:else} -| Surface | -Skip rate by week | -Plays (window) | -Skip (last wk) | -Completion (last wk) | -Taste hit (window) | -||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {s.label} | -- - | -{s.plays} | -- {pct(latest(s).skip)} - /{latest(s).plays} - | -{pct(latest(s).completion)} | -{pct(windowTasteHitRate(s))} | + +
| Surface | +Skip rate, last {t.weeks} weeks | +Plays (window) | +Skip (last wk) | +Completion (last wk) | +Taste hit (window) |
|---|
- Manage user accounts and invites for this Minstrel instance. + {#if usersQuery.data} + {@const admins = users.filter((u) => u.is_admin).length} +
+ {users.length === 1 ? '1 account' : `${users.length} accounts`}, {admins === 1 ? '1 admin' : `${admins} admins`}{invitesQuery.data + ? ` · ${invites.length === 1 ? '1 invite open' : `${invites.length} invites open`}` + : ''}.
-