- results page: when there are no tracks (quiz-only game), the recap was sitting
in the left column of a 2-col grid; now a single section is centered (2 columns
only when both tracks and recap exist)
- add a shadcn Tooltip component (@workspace/ui, via radix-ui) and replace native
browser title= tooltips: connection dot, back-office active toggle, and the
locked blindtest tiles (now aria-disabled so the tooltip still triggers)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- blindtest is only available with >=3 players AND >=2 humans (a bot can't be DJ):
lobby gate + tooltips updated, and server game:start rejects otherwise
- new botDifficulty setting (easy/normal/hard) drives how often bots answer
correctly (quiz + blindtest who-added / title-artist); host picks it in the
lobby when at least one bot is present
Verified e2e: blindtest start rejected with 1 human + 2 bots (NEED_THREE).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- server-side bot players (isBot): host adds/removes them in the lobby
(lobby:addBot / lobby:removeBot), capped at 8 players
- bots auto-vote each round: GameRound.botAnswer generates a plausible answer
(quiz ~50% right, blindtest guesses a random player / title); engine schedules
the votes within the answer window and triggers early end when all have voted
- bots are never DJ (pickDj excludes them) and are excluded from the blindtest
track-submission gate (they don't submit)
- snapshot players carry `bot`; lobby shows a 🤖 marker + add/remove controls
Verified e2e: 2 bots added, they vote, game ends with all 3 players scored
and rounds end early.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>