ADR-0003 · Идентичность playsite

Статус: принято · 2026-06-22

Контекст. Playsite — пятый писатель в общую аналитику. Нужно выбрать source, форму external_id для анонимного человека и для бота, и схему id партии так, чтобы не загрязнить 140k существующих партий и пройти дедупликацию (см. 08 Идентичность, источники и дедупликация).

Решение.

  • source='playsite' (новое значение VARCHAR(20), без enum → backend не меняется).
  • Гость: external_id='guest:<uuidv7>', player_type='guest', per-browserlocalStorage, не per-game) — повышено сразу с фазы 1.
  • Бот: external_id='bot:<algorithm>', player_type='bot'делим namespace с extension (это наши же алгоритмы).
  • id партии: UUIDv5('playsite/game/<uuid>') — детерминированно, идемпотентно.

Последствия.

  • guest:-префикс не пересекается с целыми id dicechess, hex-ObjectId beturanga и bot: → коллизий нет.
  • Происхождение партии всегда отделимо полем games.source; агрегаты по боту фильтровать по source — потерь данных нет.
  • player_type липкий → маппер хардкодит guest/bot при первой записи.
  • Per-browser даёт осмысленную статистику игрока с самого начала (требует restore-code UX).

Альтернативы. Per-game guest-id — проще, но шумные одноразовые строки игроков. Отдельный namespace playsite-bot:<algorithm> — чистое разделение от extension, но дробит статистику силы алгоритма без выгоды (source уже различает).

🔗 03 Фаза 1 — аноним vs бот + ингест · 08 Идентичность, источники и дедупликация