🗺️ Дорожная карта
Полноценный сайт уровня dicechess.com/beturanga.com — это очень большой объём, поэтому строим поэтапно. Главный водораздел всей карты — фаза 3: до неё игра клиентская (бесплатно, нечего читерить), с неё — серверный авторитет, без которого невозможны честные рейтинги, ставки и игра человек-vs-человек (см. 02 Архитектура — авторитет и стек).
flowchart TB subgraph client["Клиентский авторитет · Scala.js в браузере"] P1["Фаза 1 · Аноним vs бот<br/>+ запись в analytics"] --> P2["Фаза 2 · Постоянная identity<br/>+ история"] end subgraph server["Серверный авторитет · JVM + WebSocket"] P3["Фаза 3 · Серверное ядро<br/>+ аккаунты"] --> P4["Фаза 4 · Человек vs человек<br/>real-time + ставки"] P4 --> P5["Фаза 5 · Рейтинги<br/>+ матчмейкинг"] P5 --> P6["Фаза 6 · Турниры<br/>и матчи"] end P2 -->|архитектурный разворот| P3
Фазы
✅ Фаза 1 — Аноним играет с ботом + запись в аналитику (MVP) · LIVE с 2026-06-23
Незарегистрированный гость заходит на play.jc.id.lv, играет партию с одним из наших ботов целиком в браузере, готовая партия попадает в аналитику как source='playsite'. Игровая логика уже есть в lab — реальная работа в снятии auth-гейта, маппере «история → GameIngest», токен-шлюзе и пиннинге версии движка. Детали: 03 Фаза 1 — аноним vs бот + ингест.
Фаза 2 — Постоянная identity + история · ~2–3 нед
Гость получает стабильную личность без регистрации: guest:<uuidv7> в localStorage + restore-code (повышено сразу с фазы 1, см. ADR-0003 Идентичность playsite). Локальная история и статистика по ботам; read-only deep-link в аналитику для проверки round-trip идентичности. На шлюзе — rate-limit, лимит размера, консоль карантина.
Фаза 3 — Серверный авторитет + аккаунты (разворот) · ~5–9 нед, greenfield
Новый Scala 3 / http4s WebSocket-сервис на JVM-jar движка: истинное GameState, серверный RNG с аудируемым seed, валидация каждого микро-хода, порт BotMatchRunner как игровой цикл. Аккаунты на Google OAuth (переиспользуем из lab auth.py, без is_approved), external_id='user:<uuid>'. Ингест уезжает на сервер — токен больше не в браузере.
Фаза 4 — Человек против человека (real-time) · ~4–6 нед
Две человеческие стороны, серверные часы, игра по shareable-ссылке (без матчмейкинга), реконнект/abandon-политика. Полное покрытие терминаций (легальный префикс последнего хода только для timeout/draw_agreement/resign; для king_captured — полный ход — это точные 422-ловушки, см. 07 Контракт ingest и валидация движком). Тут же — x2/ставки, только для HvH.
Фаза 5 — Рейтинги + матчмейкинг · ~5–8 нед
Glicko-2, считается только для рейтинговых HvH-партий (аноним и боты исключены). Per-game снапшоты в games.white_rating/black_rating; аддитивная таблица рейтинга на уровне игрока в аналитике (новый концепт, которого схема пока не моделирует). Очередь матчмейкинга с фолбэком на бота.
Фаза 6 — Турниры и матчи · ~6–12 нед
Оркестрация (арена, затем швейцарка / best-of-N) поверх серверного ядра. Каждая партия — отдельный валидный ingest с группировкой по tournament_id. Burst-load тест шлюза (может потребовать запланированного переезда Postgres на mini-PC).
Принцип
Соревновательные фичи — только после серверного авторитета
Клиентские кубики (
Math.random()) и клиентская легальность тривиально подделываются. Это нормально для бесплатной анонимной игры с ботом (реплей-гейт аналитики всё равно гарантирует легальность), но рейтинги, ставки и турниры не могут появиться раньше фазы 3.
🔗 Связанное
- 02 Архитектура — авторитет и стек — обоснование разворота клиент→сервер.
- 03 Фаза 1 — аноним vs бот + ингест — что именно делаем первым.
- Журнал решений (ADR).