06. Рекомендованный MVP и архитектура AI GameMaster
Продуктовая ставка#
Первый продукт — законченный голосовой one-shot на 3–5 игроков длительностью 60–120 минут, работающий в mobile и desktop браузере. Не бесконечная кампания, не тяжёлый VTT и не универсальный конструктор правил.
Причины:
- русскоязычное исследование указывает на длительность 4–8 часов и объём правил как барьеры, а короткий юмористический контент — как более доступный [S012];
- прямые конкуренты уже обещают AI-GM и долгую память [S018, S020, S023, S024];
- полноценная длинная кампания — самый дорогой и рискованный способ впервые проверить спрос;
- one-shot позволяет измерить завершение целой истории, а не engagement в бесконечной генерации.
Архитектуру при этом нужно строить на событиях и типизированном состоянии так, чтобы позже поддержать кампании.
Пользовательский цикл MVP#
- Хост выбирает готовое приключение или задаёт параметры собственного: тема, тон, длительность, границы, допустимая жестокость, сложность.
- Система генерирует черновой корень сценария в структурированном виде и показывает хосту краткое превью без спойлеров игрокам.
- Хост создаёт комнату и отправляет ссылку.
- Гости входят без оплаты, выбирают готового персонажа или проходят короткую сборку.
- Все проверяют микрофон, согласуют safety boundaries и начинают.
- Обычная беседа идёт свободно. Когда система ждёт каноническое действие, активному игроку доступна кнопка «Совершить действие».
- Игрок записывает короткую реплику. Система показывает transcript и либо:
- распознаёт однозначное намерение;
- задаёт конкретный уточняющий вопрос;
- сообщает, почему действие невозможно в текущем состоянии.
- Rules engine определяет нужный бросок; игрок нажимает кубик; сервер фиксирует результат.
- После подтверждённого изменения состояния narrator создаёт текст, TTS и при необходимости новую сцену.
- После финала группа получает recap, решения, броски и галерею сцен.
Важное разделение: разговор и действие#
Если блокировать микрофон всех, кроме активного игрока, исчезнет социальная химия — одна из ключевых ценностей ПЧК [S010, S012]. Поэтому:
- social audio открыт постоянно для шуток и обсуждения;
- canonical action clip записывается отдельно, имеет одного автора и проходит STT → validation → state transition;
- в бою и структурированной проверке кнопка строго привязана к initiative/turn;
- в исследовании мира AI или host передаёт «право действия», но разговор остаётся открытым.
Это снижает стоимость и privacy-риск: не нужно непрерывно распознавать и сохранять всю беседу.
Архитектурный принцип#
AI не является базой данных, кубиком или окончательным судьёй состояния. Он выполняет языковые задачи вокруг детерминированного ядра.
flowchart LR
A["Голосовой action clip"] --> B["STT + speaker identity"]
B --> C["Intent parser"]
C --> D{"Намерение однозначно и допустимо?"}
D -- "Нет" --> E["Точный уточняющий вопрос"]
E --> A
D -- "Да" --> F["Rules engine + server RNG"]
F --> G["Append-only event log"]
G --> H["Materialized game state"]
H --> I["Narrator context builder"]
I --> J["Текст + TTS"]
I --> K["Scene/image job при смене окружения"]
GameMaster — один интерфейс, несколько обязанностей#
Пользователь видит одного GameMaster, но внутри это не свободно общающийся «рой агентов»:
| Компонент | Отвечает за | Не имеет права |
|---|---|---|
| Scenario planner | Структура one-shot, узлы, NPC, цели, секреты | Менять живое состояние после старта напрямую |
| Intent parser | Превращает transcript в типизированное предложенное действие | Применять действие |
| Rules engine | Проверяет возможность, сложность, roll, damage/status | Сочинять факт мира |
| State service | HP, stats, inventory, location, initiative, quests, ownership | Генерировать художественный текст |
| Memory/context builder | Выбирает релевантные факты для текущей ветки | Читать приватные события другой ветки без разрешения |
| Narrator | Повествование, NPC-реплики, варианты уточнения | Самостоятельно менять канон |
| Safety service | Возраст, consent, report/block, policy boundaries | Скрыто переписывать допустимые игровые решения |
| Media workers | TTS и изображения | Блокировать commit игрового хода |
Такое разделение делает ошибку локализуемой и позволяет воспроизвести сессию.
Надёжная память без деградации#
Рынок уже использует summaries, постоянные инструкции, сущности и retrieval [S018]. Это оправдано: исследование Lost in the Middle показывает, что модель хуже использует факты, спрятанные в середине длинного контекста; большое context window не гарантирует надёжность [S028].
Канонические слои#
- Append-only event log — каждое принятое действие, бросок, результат, переход сцены и исправление.
- Materialized state — текущие HP, инвентарь, статусы, местоположение, initiative, отношения и открытые цели.
- Entity cards — устойчивые факты о NPC, местах, предметах и обещаниях.
- Scene/branch summary — редактируемое краткое содержание каждой активной ветки.
- Global chronology — упорядоченные общие события и время мира.
- Recent-turn window — последние реплики текущей сцены.
- Retrieved memories — только релевантные факты, разрешённые visibility scope.
Полный transcript не передаётся модели на каждом ходу.
Контекст каждого хода#
В фиксированном порядке:
- версия правил и safety contract;
- роль narrator и формат ответа;
- authoritative state активного игрока;
- текущая scene/branch;
- разрешённые entity cards;
- краткая глобальная chronology;
- релевантные воспоминания;
- последние ходы;
- подтверждённый результат rules engine.
Модель получает результат, а не просьбу придумать результат задним числом.
Исправления#
Нельзя тихо переписывать прошлое. Исправление — отдельное событие с автором, причиной и ссылкой на исправляемое событие. Materialized state пересобирается или обновляется из журнала.
Уточнение неоднозначных действий#
Не следует полагаться только на «confidence 0.7»: численная уверенность модели плохо калибрована и не является бизнес-правилом.
Уточнение обязательно, если выполнено хотя бы одно условие:
- отсутствует требуемая цель, предмет, направление или способ;
- есть две и более допустимые интерпретации с разными state transitions;
- действие зависит от неизвестного игроку выбора, который нельзя сделать от его имени;
- transcript противоречит текущему состоянию;
- действие затрагивает согласие другого персонажа/игрока;
- parser не может построить schema-valid command.
До ответа игрока не выполняются бросок и изменение состояния. Уточнение должно быть конкретным: «Ты пытаешься обезоружить стражника или ударить его мечом?», а не «Поясни действие».
Броски и правила#
- RNG генерируется сервером и записывается в событие вместе с формулой, modifiers и версией правил.
- UI показывает игрокам исходный бросок и итоговый расчёт.
- Rules engine использует оригинальную простую систему или юридически допустимый SRD; LLM не импровизирует механику.
- Возможен human override, но он также журналируется.
- Повторное подключение клиента не может повторно применить ход: command имеет idempotency key и expected state version.
Новый event commit проверяет версию состояния после любых медленных AI/STT операций. Иначе два почти одновременных действия могут примениться к устаревшему состоянию.
Разделение группы#
Это не только UI-функция, а модель доступа.
Каждое событие и память имеют:
campaign_id;branch_idилиlocation_id;visibility_scope— public, party, subgroup, player, GM;occurred_atиsequence_no;- список знающих персонажей, когда знание отличается от физического события.
При разделении:
- создаются отдельные branch state и scene summary;
- участник получает только разрешённый контекст своей ветки;
- каждая ветка имеет собственный image prompt/reference set и текущую иллюстрацию;
- global chronology синхронизирует время, но не раскрывает секреты;
- при встрече веток правила явно определяют, какие знания становятся общими.
Критический тест: закрытое событие ветки A ни напрямую, ни через summary, retrieval, TTS, image prompt или recap не попадает игрокам ветки B.
Иллюстрации#
Генерировать изображение после каждого хода дорого и замедляет темп. Trigger должен быть семантическим:
- значимая смена окружения;
- первое появление важного NPC/объекта;
- кульминационное событие;
- явный запрос хоста в пределах квоты.
Для визуальной устойчивости нужны style bible, character reference, scene ID, persistent descriptors и негативные ограничения. Генерация идёт асинхронно: сначала появляется narration и placeholder, затем новая сцена. Ошибка изображения не откатывает игровой ход.
Для партнёрского IP художники должны утверждать style bible и референсы. AI не должен копировать голоса, лица или работы конкретного художника без отдельного разрешения.
Text-to-speech#
- TTS озвучивает narration и отдельные NPC, но текст появляется сразу.
- Игрок может прервать озвучивание и всегда видит transcript.
- Разные голоса — настройка, не источник канона.
- Voice cloning участников/актёров не входит в MVP.
- Включаются captions, volume controls и режим без звука.
Клиентская стратегия#
MVP#
Responsive web/PWA с одной кодовой базой для телефона и desktop:
- на телефоне: активная сцена, персонаж, action button, dice, inventory, push-to-talk;
- на desktop: те же действия плюс расширенный лог и участники;
- WebRTC audio room;
- восстановление после background/screen lock;
- installable PWA, если платформа поддерживает.
После проверки#
Нативные оболочки добавляются после проверки store policy, платежей и retention. Для России Google Play billing остаётся ограниченным [S037], поэтому web checkout и RuStore важнее раннего native-IAP.
Что не входит в MVP#
- открытый marketplace пользовательских миров;
- публичный matchmaking;
- бесконечные кампании;
- tactical grid/map editor;
- видео всех участников;
- несколько игровых систем;
- unrestricted 18+;
- voice cloning;
- spectator production suite;
- автономное обучение модели на пользовательских сессиях.
Технические acceptance criteria пилота#
| Область | Проверяемое условие |
|---|---|
| Канон | 0 необъяснимых расхождений HP/inventory/location в replay suite |
| Privacy | 0 утечек между ветками в adversarial split-party тестах |
| Ambiguity | 100% schema-invalid или многозначных state-changing команд уточняются до commit |
| Dice | Каждый бросок имеет воспроизводимую формулу, modifiers и event reference |
| Recovery | Переподключение не дублирует действие и восстанавливает актуальную сцену |
| Session | 3–5 игроков могут закончить 60–120-минутный сценарий |
| Accessibility | Клавиатура, captions, labels, видимый focus, режим без TTS |
| Latency | p50/p95 измеряются отдельно для STT, adjudication, narration, TTS и image |
| Cost | Считается на завершённый participant-hour, а не на зарегистрированного пользователя |
Тест длинной памяти до обещания кампаний#
Синтетический replay на сотни/тысячи событий должен проверять:
- сохранность предметов, ранений, статусов и обещаний;
- корректную chronology после параллельных веток;
- отсутствие resurrection удалённых/погибших сущностей;
- ссылки на первичные события для каждого важного факта;
- качество retrieval фактов из начала, середины и конца истории;
- отсутствие leakage между private scopes;
- восстановление после смены модели и пересборки summary.
Только после этого «долгая кампания без деградации» может стать публичным обещанием.