import { VersionInfo } from '@start9labs/start-sdk' export const v_0_2_66 = VersionInfo.of({ version: '0.2.66:0', releaseNotes: { en_US: 'Dashboard polish pass driven by operator feedback. (1) Settings tab now has the "Recap Relay — Operator Dashboard" headline so all three tabs match. The explanatory subheading on the Jobs tab ("Per-video / per-podcast processing history. Sortable + filterable; pages of 100.") was removed — operators know what the tab is. (2) The Overview\'s red "24-hour success rate" alert banner was removed. It duplicated the "Success rate" tile already in the metric grid below it; visual noise without new information. (3) The BTCPay-connected status (previously a full-width green row at the top of Overview) moved to the Settings tab. Operators care about BTCPay config when they\'re configuring; Overview is for at-a-glance metrics. (4) Transcription speed table: units changed from "ms/min" to "s/min" (still computed as sum_duration_ms / total_audio_minutes, divided by 1000 for display). The underlying value was already total compute time / audio duration — matching what the operator wanted — just displayed in milliseconds. (5) Analysis speed table: same unit change AND switched the rate basis from "per 1k input tokens" to "per audio minute" so it matches the transcribe table. Audit data records audio_seconds for analyze rows (= window body duration), so summing across all analyze calls gives total analyzed audio minutes — sum_duration_ms / that gives the same compute-per-audio-minute metric. (6) Overview tab now auto-refreshes every 10 seconds while the operator is viewing it. Calls /admin/dashboard silently in the background, preserves scroll position across the re-render (no view-yank back to top mid-scroll), and falls back to the previous data on a transient fetch failure. Scroll preservation uses requestAnimationFrame to wait one paint tick before restoring the previous scrollY value. Poll auto-stops on tab leave. (7) "Top failure modes by model" and "Recent errors" tables previously filtered strictly on status === "error", which excluded the vast majority of operator-facing failures — transcribe-truncated runs are recorded as status="partial" with the missing-speech message in the `error` field, but they wouldn\'t surface. The filters now match on any row with a truthy `error` message (covers error, partial, refused). Also exposed a new `failures` count (errors + partials) and a breakdown ("N err, M partial") in the by-model table so operators can distinguish kinds.', }, migrations: { up: async ({ effects }) => {}, down: async ({ effects }) => {}, }, })