Архитектурные решения
Здесь разделены старый событийный контур и серверные игровые механики. Полное обоснование находится в docs/plan/2026-08-16/ARCHITECTURE.md.
Что уже реализовано
| Решение | Фактическое состояние |
|---|---|
| Единый FraudGate | Проверяет события, игровые команды/результаты и spins |
| Rust-адаптеры и SpecEngine | Старый событийный путь; полноценные игры используют GameMechanic |
| Postgres и Dragonfly | Событийный progress — hot/cold; GameRun/уровни — только Postgres |
widget/templates/*/bundle.js | Это действующий старый клиентский путь, но сами игры в основном являются заглушками |
| Награды и подписанные webhooks | Инфраструктура существует; браузер не должен принимать решение о награде |
Исторические решения D1–D9 и их подробные проекты сохранены в docs/archive/plan/2026-06-24/.
Основание серверной Match3
| № | Решение |
|---|---|
| 1 | Первая полноценная игра — портретная Match-3 из выбранного визуального концепта |
| 2 | Клиент игры: TypeScript + Phaser + Vite, без React внутри игры |
| 3 | Браузер отправляет одну смысловую команду на перестановку; сервер рассчитывает всё поле и каскады |
| 4 | Унифицируется оболочка команды, безопасность, сохранение и подтверждённые факты; правила остаются в адаптере конкретной игры |
| 5 | Отдельное прохождение GameRun и команды хранятся в Postgres |
| 6 | FraudGate выполняет входные проверки и проверяет рассчитанный сервером результат |
| 7 | Добавляются только game_runs и game_run_commands; преждевременные сущности публикации не создаются |
| 8 | Исходники игры, базовые ассеты, собранные файлы и фон клиента хранятся раздельно |
| 9 | В первой версии клиент может заменить только фон; механика остаётся готовой и неизменяемой |
| 10 | Вычисления на клиенте, аномалии, Telegram, S3 и следующие игры возвращаются в план только после рабочего контура |
Решения игрового направления (2026-10-01)
Полное обоснование — docs/plan/2026-10-01/PLATFORM-GAMES.md и README пакета §8 (решения РП-n).
| № | Решение | Основание |
|---|---|---|
| 11 | Реестр механик. Два вида: run (GameMechanic, модели доверия Step и Replay) и outcome (колесо reward_wheel_v1, исход выбирает сервис с БД). Описание механики — GameDescriptor: вид, модель доверия, ключ входа сборки, лимиты. MechanicRegistry по game_id + game_version и отдельный OutcomeRegistry. «Играть» запускает projects.play_mechanic; active_template_id остаётся для старого пути и пишется вместе с ней. Механика доступна, только если она есть в реестре и в выпуске клиента, а её версия поддержана; аварийное выключение — game_templates.selectable (с задержкой кэша шаблона до 30 с) | PLATFORM §4, §5; РП-17, РП-18, РП-26 |
| 12 | start_id. Уникальность (project_id, external_user_id, start_id) глобальная. Повтор разбирается до FraudGate по отпечатку тела (intent, level_number) и механике: найденная партия возвращается без расхода лимита; другое тело или чужая механика — 409 idempotency_conflict; гонка — INSERT … ON CONFLICT DO NOTHING и повторный разбор, без ответа 500. Старт, вернувший активную партию (resumed), свой start_id не хранит. Отклонено: уникальность по game_id — один start_id мог бы дать две партии при смене механики | PLATFORM §7.3; РП-20; О-26 |
| 13 | Авторизация разделена. Сессия (authorize_session) — для чтений, команд, лобби и статуса награды; выбор механики проекта (resolve_play_mechanic) — только на старте. Механика и template_id фактов берутся из строки партии | PLATFORM §5.3, §7.4; РП-22 |
| 14 | «Пол» сильных сигналов. Сигнал механики имеет силу Weak или Strong; Strong даёт минимум Review при любом fraud_mode, включая observe. Порядок шлюза ценности: потолки → blocked → trusted → пол → оценка риска. promo_rewards для новых механик включается только после пола и калибровки в observe не меньше двух недель | PLATFORM §11.1, §11.3; О-20; РП-39, РП-40 |
| 15 | Уровни. Истина «уровень пройден» — player_level_results; сводка player_level_progress пересчитывается из неё. Уровень выбирает сервер по дорожке механики; дорожка только дописывается. Прогресс хранится по механике и не сбрасывается при её смене | PLATFORM §8; РП-28, РП-29, РП-30 |
| 16 | Статус награды для игрока — 6 значений без причин и срока удержания. Подписанный webhook несёт необязательные run_id, mechanic, level_number и payload_version | PLATFORM §10; О-12, О-13; РП-43, РП-44 |
Решение 7 расширено решением 15: добавлены таблицы уровней игрока (миграция 051).
Статус
Статусы реализации ведутся только в docs/plan/2026-09-25/PLAN.md (игровое направление — блок Г). Эта страница описывает решения, а не ход работ.
При изменении решения одновременно обновляются текущая спецификация, соответствующая внутренняя страница и единый PLAN.md. Архивные документы не переписываются.