An audit release. Most of it is invisible if you use a mouse and a screen — and the whole point if you do not.
One h1 per page, and a name for every control
A screen reader moves through a page by its headings and announces controls by their names. Both were partly missing: pages carried two h1 elements or none, and switches, table filters and page-size selects had no accessible name at all. Every learner page now has exactly one h1, breadcrumb segments are named from the route rather than guessed, and every control announces itself.
The player stops overstating progress
The lesson player had a close button that did not close, stage counts that did not match the lesson, and more than one h1 per lesson. All three are fixed, so what the player says about where you are is what is actually true.
Nothing fictional is reachable
Thirty-nine routes were backed by fixtures rather than data — useful for demos, misleading if you found one by typing a URL. They now sit behind demo-navigation flags, and the thirteen orphaned modules behind them are gone.
Also in this release
Fixed
- Every learner page now has exactly one h1, and breadcrumb segments are named from the route instead of guessed.
- Switches, table filters and page-size controls announce their own names; breadcrumb hit areas are large enough to press.
- The onboarding eyebrow and the 404 hint clear the AA contrast floor.
- The lesson player has one h1 per lesson, a close button that actually closes, and stage counts that match the lesson.
- The trophy case counts the locked trophies the hero already showed, and entries with the same name are distinguishable.
- Discover stops ranking difficulty tags as skills, and seeds card art the same way in both locales.
- A long breadcrumb crumb no longer overflows the mobile shell header, and the micro-lesson card arrow mirrors in Arabic.
Changed
- The duplicate /app/learner dashboard collapsed into /app/overview — one dashboard, one URL.
- The frontend build is gated on every pull request, tests run before a deploy, and lint reports without blocking.
- The 39 fixture-backed demo routes now sit behind demo-navigation flags, so nothing fictional is reachable by accident.
Removed
- Thirteen orphaned fixture-backed learner modules, a retired AI-tutor flag, and eleven dead message keys.
- Root verification artifacts that had been committed — including a live session cookie.
One email when we publish. Research, product decisions, and what teams report back.