# Scrabble Game — Functional spec Per-domain user stories: what each user-visible operation does. This is the starting point for any change request that touches behaviour. The English version is authoritative; [`FUNCTIONAL_ru.md`](FUNCTIONAL_ru.md) is a mirror for the project owner — mirror every point edit in the same patch (translate only the changed paragraphs). Sections deepen as stages land; *(Stage N)* marks where the detail is authored. ## Domains ### Identity & sessions *(Stage 1 / 6)* A player arrives from a platform (Telegram first), via email login, or as an ephemeral guest. The gateway validates the credential once and mints a thin session token; the backend resolves it to an internal `user_id`. Guests are session-only with restricted features (auto-match only; no friends, stats or history). ### Accounts, linking & merge *(Stage 1 / 10)* First platform contact auto-provisions a durable account. From the profile a player links additional platform identities or an email via a confirm flow; linking an identity that already has history merges it into the current account (stats summed, games/friends transferred). ### Lobby & matchmaking *(Stage 4)* Bottom tab menu: **my games**, **profile**. Auto-match (always 2 players) joins a per-variant pool and is paired with the next waiting human; after 10 s with no human the robot substitutes (the robot arrives in Stage 5). Friend games (2–4) are formed by inviting players from the friend list or by internal ID (deep-link invites arrive with the platform integration): the inviter chooses the settings and the game starts once every invitee has accepted — any decline cancels it, and an unanswered invitation expires after seven days. ### Playing a game *(Stage 3)* Place tiles, pass, exchange, or resign. A play is validated against the game's dictionary at submit time and scored; an unlimited preview reports what a tentative move would score and whether it is legal. The dictionary check tool is unlimited and offers a complaint on any result. Hints are governed per game — whether they are allowed and how many each player starts with — and draw on a personal hint wallet once the per-game allowance is spent. The game ends when the bag empties and a player clears their rack, after 6 consecutive scoreless turns, by resignation, or by the per-game move timeout (5 minutes to 24 hours, default 24 hours): a missed turn auto-resigns, except while the player is inside their daily away window. In a two-player game a resignation or timeout gives the win to the other player and the leaver keeps their score. In a game with three or four players the leaver's seat is dropped and the others play on, the game ending when a single active player remains; the disposition of the leaver's tiles (returned to the bag or removed from play) is chosen when the game is created, and the leaver's rack is never shown to the others. ### Robot opponent *(Stage 5)* Indistinguishable-from-human substitute in auto-match. Decides once whether to play to win (~40%), targets a small score margin, plays with human-like timing and a night sleep window, and nudges/answers nudges like a person. ### Social: friends, block, chat, nudge *(Stage 4)* Send a friend request and have it accepted (decline or cancel withdraws it, unfriending removes the friendship). Block globally — switch off incoming chat and/or friend requests — and block individual players (a per-user block hides that person's chat and stops requests and game invitations both ways; it also ends any existing friendship). Per-game chat is for quick reactions: messages are short (up to 60 characters) and may not contain links, email addresses or phone numbers, even disguised. Nudge the player whose turn is awaited at most once per hour (the nudge is part of the game chat); the out-of-app push is delivered via the platform. ### Profile & settings *(Stage 4)* Edit language (en/ru), display name, timezone, the daily away window and the block toggles, and bind an email by confirm-code: the backend emails a short code that, once entered, attaches the email to the account (an email already confirmed by another account cannot be taken — that is a merge, a later stage). Linked platform accounts and merge arrive in Stage 10. ### History & statistics *(Stage 3)* Finished games are archived in a dictionary-independent form and exportable to GCG. Statistics (durable accounts only): wins, losses, draws, max points in a game, and max points for a single move (the best play, which already includes every word it formed plus the all-tiles bonus). ### Administration *(Stage 9)* Admin (Basic Auth at the gateway) reviews word complaints, manages dictionary versions, and inspects users/games.