🤖 Бот-платформа — анонимный Bot API (дизайн)
Статус: черновик дизайна · 2026-06-28. Развивает ADR-0009 (форма Lichess, админ-токены для 4–5 команд) в открытую самообслуживаемую платформу. Решение вынесено в ADR-0010. Опирается на честность кубиков ADR-0008 и серверный авторитет фазы 3.
Цель. Сторонние команды и одиночки пишут своих Dice-Chess-ботов и тестируют их на нашей платформе — от «попробовать за 2 минуты» до «мощная арена соревнований ботов с разными режимами подключения, вплоть до облачных функций». Bot-API в форме Lichess у нас уже построен (ndjson event/game-стримы, REST-команды, токены, reference-bot, keep-alive); этот документ — про то, как открыть его наружу для произвольных авторов.
1. Две парадигмы подключения
| Connect-in (Lichess) | Submit-and-run (CodinGame / Battlecode / Kaggle) | |
|---|---|---|
| Кто запускает бота | Разработчик (где угодно) | Платформа в песочнице |
| Что даёт платформа | API + токен | Sandbox + оркестратор матчей |
| Наша стоимость/риск | Низкие | Высокие (запуск чужого кода, изоляция, CPU) |
| Сильно для | Разработки, casual, постоянного бота | Честных турниров, лидербордов |
Решение: connect-in — фундамент (у нас уже есть), submit-and-run — финальная амбиция (отдельный милстоун с песочницей, лесенка п.9). Доводим connect-in до полноценной открытой платформы; submit-and-run — когда понадобится честный «чемпионат без доверия к чужому always-on».
2. Идентичность — три тира
Расширяем Principal.Bot из ADR-0009 до трёх уровней доступа (одна Principal-система, не три account-системы):
- Анонимный / эфемерный —
POST /bot/anon→ временный токен наbot:anon:<uuidv7>(опц. ник). Ноль регистрации. Всегда unranked. Для разработки и теста. В духе anonymous-first (гости же играют HvH без аккаунта, ADR-0003). - Зарегистрированный бот-аккаунт — durable
bot:team:<team>:<name>(как в ADR-0009), upgrade-to-bot. Нужен для рейтинга/лидерборда (иначе результаты бессмысленны). Завязан на систему аккаунтов (лесенка п.5). - Админ-токен (сейчас) —
PLAY_BOT_TOKENS, для наших house/официальных ботов (greedy и т.п.).
Чистая линия: тестировать — без регистрации (unranked песочница); соревноваться за рейтинг — с регистрацией. Это и открыто, и сохраняет смысл рейтинга.
3. Анонимный доступ — POST /bot/anon
- Минтит эфемерный Bearer-токен на
bot:anon:<uuidv7>; опц.{ "name": "..." }— display-лейбл, namespaced так, что аноним не может выдать себя за house/registered бота (anti-masquerade на уровне типа токена, как в ADR-0009). - Хранится в in-memory
BotAuth-реестре (БД нет до п.4 Persistence); TTL + idle-eviction, чтобы анон-токены не копились. - Принципал помечен unranked — не несёт рейтингового веса, когда появятся рейтинги.
- Сразу работает со всем существующим Bot-API:
/bot/stream/event, вызвать house-бота, принять вызов, играть. → issue #41.
Защита от абьюза (открытость по определению): per-IP лимит на минт токенов и одновременные коннекты, TTL, кап одновременных игр на принципала, аккуратные 429. Тюнинг: локальная итерация разработчика — не троттлится; скрипт-спамер — троттлится. → issue #42.
4. Тестовый цикл (что аноним может уже на п.1)
Чтобы тестировать, боту нужен оппонент — до открытого лобби (п.3) есть два пути, оба работают на текущем сервере:
- vs house-бот — прямой вызов
POST /bot/challenge/house/greedy(наш always-on reference-bot на rpi). Бот принимает/играет. - Self-play —
POST /gamesуже возвращает оба seat-токена; один процесс ведёт обе стороны (идеально для отладки своей стратегии). Документируем как «test mode».
Онбординг: reference-bot превращаем в forkable starter-kit — стратегия = одна явная замена (вызов движка), транспорт/стриминг не трогаешь; README-quickstart (anon-токен → PLAY_API_BASE_URL+BOT_TOKEN → запуск); пример self-play. → issue reference-bot#3.
5. Матчмейкинг (кратко; детали — в лобби-милстоуне)
- Сейчас: прямой вызов (договорный матч) + self-play.
- Лобби / open seeks (п.3):
create-seek → список лобби → join, единое для guest/user/bot — боты и люди сами организуют партии; зрительский просмотр. Твоя идея «создал игру → она в лобби → другой подключился». - Авто-пул / арены — спаривание сервером; турниры с зеркальными костями (ADR-0009), Glicko-2 ладдер.
6. Где крутятся боты
- Локально на машине разработчика — главный режим для теста. Указал токен + URL (
play-api.jc.id.lvили LAN), играешь. Ноль инфры у нас, любой язык. (Внутри LAN — напрямуюhttp://192.168.10.3:8040, в обход Cloudflare/AdGuard.) - Always-on (как наш reference-bot на rpi) — постоянный бот команды / house-боты / ладдер.
- Облачная функция (Azure/AWS/GCP) — это смена транспорта. Наша модель — долгоживущие стримы (event+game ndjson), а serverless request/response с лимитом времени → стрим отвалится. Чтобы зашли функции, нужен webhook/poll-режим рядом со стримингом → п.8 Multi-mode connectivity. Цена: SSRF/ретраи/доступность URL бота. Для большинства тестов локальный запуск проще serverless в любом случае.
7. Честность и воспроизводимость — наши козыри
- Provably-fair кости. Сервер коммитит хэш сид-сида в начале и раскрывает в конце (commit-reveal CSPRNG, ADR-0008) → сторонняя команда проверяет, что кости не подкручены против её бота. Для платформы чужих ботов это прямая фича доверия. Доведение (раскрытие сида + клиентская энтропия) — п.2, issue #13.
- Детерминированный реплей по сиду. Сид + ходы → точное воспроизведение → бесценно для отладки чужого бота. Тот же милстоун.
8. Лесенка милстоунов (бот-хребет)
Полная лесенка — в 01 Дорожная карта и в milestones репо dicechess-play-api (capability-названия, хребет только там, без дублей по репо):
- Bot API: anonymous self-service ← делаем сейчас (этот документ)
- Provably-fair dice & deterministic replay
- Lobby, open seeks & spectating
- Persistence (Postgres play schema) — гейт для 5–6
- Accounts & registered bots
- Ratings & bot leaderboard (Glicko-2)
- Tournaments & arenas
- Multi-mode connectivity (serverless / cloud bots)
- Submit-and-run sandbox arena
Параллельно (вне хребта): HvH UX, Scale & edge split.
9. Что отложено
- Durable идентичность/persistence (п.4) — пока всё in-memory; казуальная песочница (1–3) живёт без БД.
- Рейтинги/лидерборды (п.6) — требуют аккаунтов (п.5) и Postgres (п.4).
- Serverless/webhook (п.8) и submit-and-run (п.9) — после того, как connect-in-платформа обкатана.
- Серверный «человек-vs-бот» на сайте — нужен клиентский флоу «бросить вызов боту» (HvBot сейчас = клиентский
/play, фаза 1).