Одна карточка на всех без сервера: детерминированная генерация, RLS и флаг retired в шахматном бинго
whoapelsa 52 минуты назад Одна карточка на всех без сервера: детерминированная генерация, RLS и флаг retired в шахматном бинго 4 мин 1.7K ReactJS * Логические игры PostgreSQL * Кейс Из песочницы Разбираю несколько...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: whoapelsa 52 минуты назад Одна карточка на всех без сервера: детерминированная генерация, RLS и флаг retired в шахматном бинго 4 мин 1. 7K ReactJS * Логические игры PostgreSQL * Кейс Из песочницы Разбираю несколько инженерных решений из небольшого браузерного проекта: бинго на шахматных задачах Lichess. Механика такая: карточка 4×4 с тактическими мотивами (вилка, связка, мат в два), игроку по очереди показывают позиции, он решает задачу и закрывает подходящую клетку.
Ограничения, с которыми я сел за проект: своего сервера нет, только Supabase; играть можно без регистрации; у всех игроков в один день одна и та же карточка. Карточка дня без сервераЧтобы у всех была одна карточка, не нужен эндпоинт «выдай карточку дня»: достаточно детерминированного генератора. Сид строится из даты и уровня сложности (dailySeed(date, level)), из сида создаётся генератор псевдослучайных чисел (rngFrom(seed)), и generateCard(pool, categories, options, rng) собирает клетки и колоду.
Технические детали
Один и тот же сид и один и тот же пул дают одну и ту же карточку на любом устройстве. Слабое место такой схемы — пул данных. Стоит убрать из него одну запись или пересобрать данные, и тот же сид даст другую карточку: у уже сыгранных партий и у дуэлей, которые друг другу отправили по ссылке, «поплывёт» содержимое.
Поэтому в решении три правила. Первое: сыгранная партия хранит собственный состав. В таблицу games пишутся seed, расставленные клетки (placed, jsonb) и ошибки (misses, jsonb), и при просмотре старой партии карточка восстанавливается из сохранённого состава, а не пересчитывается заново.
Второе: записи из пула не удаляются. Неудачный шахматист или партия получают флаг retired: в новые карточки они не попадают, но по выданному id их по‑прежнему находят старые карточки и дуэли. Третье: выданные id при пересборке данных не меняются.
Отраслевые последствия
Всё это проверяет тест: он собирает 30 карточек с разными сидами и убеждается, что в колоду и в ответы не попал ни один retired‑элемент, а сохранённая карточка остаётся прежней. Одна партия в день — на уровне базыПравило «карточку дня и дуэль играют один раз» нельзя оставлять на клиенте: его обойдёт любой, кто откроет консоль. Оно записано в схему частичными уникальными индексами: create unique index games_one_daily on public.
games (user_id, level, card_date) where kind = 'daily'; и create unique index games_one_per_duel on public. games (user_id, duel_id) where kind = 'duel'. Ограничение check ((kind = 'daily = (card_date is not null)) не даёт записать дневную партию без даты или обычную — с датой.
Вторая партия за день просто не вставится. Отдельная тонкость — какая «сегодня» дата.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.






