Skip to content

Архитектурные решения ​

Здесь разделены старый событийный контур и серверные игровые механики. Полное обоснование находится в 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
6FraudGate выполняет входные проверки и проверяет рассчитанный сервером результат
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
12start_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_versionPLATFORM §10; О-12, О-13; РП-43, РП-44

Решение 7 расширено решением 15: добавлены таблицы уровней игрока (миграция 051).

Статус ​

Статусы реализации ведутся только в docs/plan/2026-09-25/PLAN.md (игровое направление — блок Г). Эта страница описывает решения, а не ход работ.

При изменении решения одновременно обновляются текущая спецификация, соответствующая внутренняя страница и единый PLAN.md. Архивные документы не переписываются.

Internal & integration documentation