The tournament join was sending a bot bearer token with an empty body,
but the backend join endpoint expects a JSON body {botId, botName}, so it
returned 400. Restore body-based join and source the join dialog from
official (engine-backed) bots via /api/account/official-bots, since only
official bots have a server-side engine that plays their moves; normal
account bots have no engine and never move.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>