Уже решено: черновик в БД с TTL 24ч, линейный wizard, пул = один batch_id. Выбираем, как организовать код.
GameCreationWizard — один сервис, держит в БД таблицу wizard_drafts (chat_id, step, payload jsonb, updated_at). Маршрутизация в UpdateRouter проверяет наличие активного черновика при любом апдейте и делегирует ему.
Плюсы: вся логика wizard-а в одном месте, легко тестировать, единая точка для TTL и таймаутов.
Минусы: UpdateRouter разрастается, нужен чёткий контракт «черновик активен → текст идёт в wizard» vs. свободный режим.
В каждой feature (CreateSession, ShowCase, и т.д.) — свой маленький handler для wizard-а, использующий ConversationStateService (state machine + storage). UpdateRouter делегирует в активный диалог через IDialogDispatcher.
Плюсы: масштабируется на будущие wizard-ы (для других фич), UpdateRouter остаётся тонким, модульные тесты на диалог.
Минусы: больше абстракций, нужно продумать контракт IDialog и dispatcher; для одной фичи это может быть overkill.
Кликните, чтобы выбрать. По умолчанию рекомендую A — мы делаем только один wizard, лишний слой абстракции не оправдан.