2.13.0
Released
Fixes
The dashboard scrolled sideways on a phone. The challenge rows clip their text with
truncate, which setswhite-space: nowrap, and the min-content width of a nowrap line is the whole untruncated string — so the Challenges card could not be laid out narrower than its longest prompt (~503px), and because a grid item may not shrink below that, it dragged the year-theme card and the entire page out to the same width. The card is now allowed to be narrower than its own rows, which is what lets the truncation inside it do its job. (#537)Tidied the rest of the dashboard at phone widths, checked at 320/375/414px: a challenge prompt wraps to two lines instead of being clipped to one, its action button stays on the row's right edge when it wraps onto its own line, the year theme's "View theme" link is button-sized rather than a full-width bar once the card stacks, and the four headline statistics sit two-up instead of filling the whole first screen before anything else appears. (#537)
Every OpenAI coaching turn had been failing with a 400 and quietly handing the interview to another paid model. The Responses API types content parts by role — a user turn is
input_text, an assistant turn isoutput_text— and the coach sentinput_textfor both. Because the client seeds its history with an opening assistant message, the very first request was already malformed, so an OpenAI persona could never answer. Assistant turns are now sent asoutput_text. (#536)A coaching turn can no longer be repriced upward by its own fallback. The substitutes are capped at the price of the model the user was offered and then tried cheapest-first, instead of following catalog order — which led with the recommended paid model, so picking GPT and having it fail cost Claude Sonnet's rate. A pick that is already the cheapest thing on the account has no substitutes at all: the turn fails and the charge is refunded rather than being served at a price nobody chose. The model a user is offered up front is unchanged. (#536)
Technical changes· 2 entries for database, tooling, CI, tests and docs
Tests
Pinned the layout classes the dashboard fixes depend on — the challenge strip's ability to shrink, its wrapping prompt, the two-up statistics row and the self-sized theme link. jsdom does no layout, so the classes themselves are what a regression would have to survive. (#537)
Pinned both halves of the above: the Responses API request shape for a mixed user/assistant history, and the fallback order for a catalog whose recommended model is not its cheapest one. (#536)