🗺️ Дорожная карта

Полноценный сайт уровня 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.

🔗 Связанное