Функциональные требования
Приоритеты: Must / Should / Could (MoSCoW).
Сессии и участники
| ID |
Требование |
Приоритет |
| FR-001 |
Система shall создавать сессию с уникальным кодом 6–8 символов |
Must |
| FR-002 |
Участник shall подключаться по коду с веба и из TG без пересоздания комнаты |
Must |
| FR-003 |
Один Participant shall иметь одновременный presence на веб и TG |
Must |
| FR-004 |
Host shall выбирать игру из каталога внутри сессии |
Must |
| FR-005 |
Host shall менять игру без создания новой сессии |
Must |
| FR-006 |
Система shall отображать поле картинкой в TG и интерактивно на вебе |
Must |
| FR-007 |
Пользователь should регистрироваться по email с профилем и историей |
Should |
| FR-008 |
Пользователь should привязывать Telegram к аккаунту |
Should |
| FR-009 |
Гость shall входить без аккаунта по guest token |
Must |
| FR-010 |
Host shall стартовать/менять игру и исключать участников |
Must |
| FR-018 |
Система shall закрывать сессию по команде host |
Must |
| FR-019 |
Система shall хранить список участников с ролью host/player/spectator |
Must |
| FR-020 |
Код сессии shall быть уникальным среди активных сессий |
Must |
Авторизация
| ID |
Требование |
Приоритет |
| FR-021 |
Система shall выдавать JWT access + refresh зарегистрированным |
Should |
| FR-022 |
Система shall выдавать guest token с TTL 24 ч |
Must |
| FR-023 |
Telegram Login Widget shall аутентифицировать на вебе |
Should |
| FR-024 |
Бот shall аутентифицировать по telegram_id |
Must |
Real-time и синхронизация
| ID |
Требование |
Приоритет |
| FR-025 |
Веб shall получать обновления состояния по WebSocket |
Must |
| FR-026 |
Бот shall получать события и обновлять сообщения с полем |
Must |
| FR-027 |
Действия shall быть идемпотентны по action_id |
Must |
| FR-028 |
При reconnect веб shall восстанавливать state из API |
Must |
| FR-029 |
Активный канал управления shall быть последним использованным |
Must |
Game runtime
| ID |
Требование |
Приоритет |
| FR-030 |
Система shall загружать игры как плагины по plugin_id |
Must |
| FR-031 |
Система shall валидировать ходы только на сервере |
Must |
| FR-032 |
Система shall логировать все действия в audit log |
Must |
| FR-033 |
В сессии shall быть не более одного активного GameInstance |
Must |
| FR-034 |
Завершённая игра shall сохраняться в истории сессии |
Should |
dice_board
| ID |
Требование |
Приоритет |
| FR-011 |
Активный игрок shall бросать 2 кубика (1–6) |
Must |
| FR-012 |
Игрок shall выбирать одну из клеток (d1,d2) или (d2,d1) |
Must |
| FR-013 |
На свободную клетку shall ставиться фишка игрока |
Must |
| FR-014 |
На клетку соперника shall сниматься чужая фишка и ставиться своя |
Must |
| FR-015 |
При дубле на кубиках (d1 = d2) после хода shall выполняться повторный бросок в том же ходу |
Must |
| FR-016 |
Нельзя выбирать клетку со своей фишкой, если есть свободная кандидат-клетка |
Must |
| FR-017 |
Победа shall определяться как 3 фишки в ряд (гор./верт./диаг.) |
Must |
| FR-035 |
Бросок кубиков shall генерироваться сервером (CSPRNG) |
Must |
| FR-036 |
Центр: клетки (3,3), (3,4), (4,3), (4,4) |
Must |
| FR-037 |
При 3 в ряд игра shall завершаться с объявлением победителя |
Must |
Медиа
| ID |
Требование |
Приоритет |
| FR-038 |
media-service shall рендерить PNG/WebP поля для TG |
Must |
| FR-039 |
URL медиа shall быть доступен вебу и боту |
Must |
Каталог игр
| ID |
Требование |
Приоритет |
| FR-040 |
Каталог shall содержать dice_board в v1 |
Must |
| FR-041 |
Недоступные игры shall отображаться как «скоро» |
Could |
| FR-051 |
Каталог shall возвращать все реализованные plugin_id с min/max players |
Must |
| FR-052 |
Недоступные игры should отображаться в лобби как «скоро» с badge сезона |
Could |
| FR-053 |
Плагин should объявлять implementation_tier в metadata каталога |
Should |
| FR-054 |
Tier-3 игры should поддерживать upload медиа ≤ 2 MB |
Should |
| FR-055 |
Tier-2 игры should поддерживать роль Judge |
Should |
| FR-056 |
Coop-плагины should ограничивать подсказки только game actions |
Should |
Администрирование
| ID |
Требование |
Приоритет |
| FR-042 |
Rate limit shall применяться к join по IP/telegram_id |
Must |
| FR-043 |
Система should поддерживать health endpoints на сервисах |
Should |
| FR-057 |
Оператор shall просматривать логи всех игр через админ-панель |
Must |
| FR-058 |
Вход в админ-панель shall требовать OTP из Telegram-бота (/admin login) |
Must |
Telegram-бот
| ID |
Требование |
Приоритет |
| FR-044 |
Бот shall обрабатывать /start, /join, /leave |
Must |
| FR-045 |
Бот shall показывать inline-кнопки для ходов dice_board |
Must |
| FR-046 |
Бот shall использовать FSM для состояний лобби/игры |
Must |
Веб
| ID |
Требование |
Приоритет |
| FR-047 |
Веб shall предоставлять экраны Landing, Join, Lobby, Game |
Must |
| FR-048 |
Поле 6×6 shall быть кликабельным для выбора клетки |
Must |
| FR-049 |
Веб should показывать историю для registered |
Should |
| FR-050 |
UI shall быть адаптивным (mobile-first) |
Must |