Прогревы (Мастер Шторм)
Прогревы: письма Мастера Шторма
Прогревы — это персональные письма, которые Stormbpmn сам пишет сотрудникам, когда у них есть понятный повод вернуться к работе: висит согласование, схему давно не трогали, коллеги оставили замечания, человек вернулся после отпуска. Письма подписаны «Мастер Шторм», пишет их ваша языковая модель по фактам из системы, а кнопка в письме ведёт сразу к делу — в схему, к согласованию или в AI-чат, где ассистент уже продолжает разговор.
Доступно в сборках после 7 октября 2026. По умолчанию всё выключено.
Зачем это нужно
Моделирование процессов — работа с длинными паузами: схему начали и отложили, отправили на согласование и забыли, пригласили коллегу, а он так и не зашёл. Прогревы закрывают именно эти паузы:
- согласования не зависают — согласующему напоминают про ждущее решение, автору — про отклонённую схему;
- начатые схемы доводятся — автору застоявшейся схемы предлагают позвать коллег на согласование;
- новички втягиваются — тому, кому дали доступ или адресовали согласование, объясняют, что от него ждут;
- возвращаться проще — после отпуска человек получает короткую сводку, что изменилось.
Письмо всегда про конкретный факт («согласование „Закупки“ ждёт вашего решения 9 дней»), а не рассылка «заходите к нам». Если сказать по делу нечего, письма не будет.
Как это работает
00:30 МСК, по будням ночной прогон: кому и о чём писать
│ отбор сотрудников → поиск повода → факты из базы → текст пишет языковая модель → проверки
▼
sm_retention_nudge черновики писем со временем отправки
│
каждую минуту отправка созревших черновиков (если включена)
▼
почта (SMTP или ListMonk) → сотрудник → кнопка → схема / согласование / AI-чат
- Ночной прогон. По будням в 00:30 по Москве движок отбирает сотрудников и для каждого ищет самый важный повод. Прогон работает только ночью (с 23:00 до 07:00 по Москве) — если не уложился, хвост догонит следующей ночью. Одновременно идёт только один прогон, даже при нескольких экземплярах backend.
- Текст. По фактам повода языковая модель пишет тему, текст письма и первое сообщение в AI-чат. Код проверяет ответ: все числа должны быть из данных, обязательные факты — упомянуты, тон — на «вы», без упрёков. Не прошедший проверку текст не отправляется, движок пробует запасной повод.
- Черновик. Готовое письмо ложится черновиком на утро ближайшего рабочего дня: по умолчанию в 11:00 по часовому поясу компании сотрудника (если он неизвестен — по Москве), со случайным разбросом до часа, чтобы письма не уходили все разом. Черновик живёт 3 дня — не ушёл, значит неактуален.
- Отправка. Раз в минуту созревшие черновики отправляются через ваш почтовый провайдер.
- Продолжение в чате. Если включён AI-ассистент, к письму создаётся разговор: кнопка открывает чат, где Мастер Шторм уже написал первое сообщение и показал, что видит в схеме. Без AI-чата кнопка ведёт в схему или в приложение.
Кому и как часто
- Письма получают только редакторы (не читатели), у которых включены email-уведомления и которые не отписались от прогревов.
- Сотрудник должен быть «живым»: заходил в последние 90 дней или зарегистрирован не более 30 дней назад.
- Не чаще одного письма в 7 дней одному человеку.
- Об одной и той же схеме или согласовании — не чаще раза в 28 дней, из любого повода.
- Если человек проигнорировал письмо по поводу (не зашёл, ничего не сделал за 3 дня), этот повод для него считается исчерпанным.
Отписка
В каждом письме есть ссылка «Отписаться от советов Мастера Шторма». Она открывает страницу подтверждения в вашем Stormbpmn (почтовые шлюзы, которые заранее открывают ссылки, никого случайно не отпишут). Отписка выключает все письма прогревов этому сотруднику; там же можно подписаться обратно. Обычные уведомления (комментарии, согласования) отписка не затрагивает.
Поводы писем
Если у сотрудника несколько поводов, побеждает более важный (сверху вниз).
| Повод | Когда срабатывает | Куда ведёт кнопка |
|---|---|---|
Витрина симуляции (DES_SHOWCASE) | Сотрудник недавно правил схему, система сама прогнала её через модуль симуляции и показывает цифры. Только при развёрнутом DES | Результаты симуляции |
Согласование ждёт (STUCK_APPROVAL) | Входящее согласование висит без решения от 5 до 45 дней | AI-чат / схема |
Схему отклонили (DECLINED_AND_DROPPED) | Согласование автора отклонили, новой попытки нет уже 3+ дня | AI-чат / схема |
Первое согласование (NEWCOMER_APPROVAL) | Новичку адресовали согласование | AI-чат / схема |
С возвращением (RETURN_BRIEFING) | Сотрудник вернулся после перерыва от 90 дней — что изменилось | AI-чат |
Оборвалась серия (STREAK_BREAK) | Человек работал 8+ дней подряд и пропал | AI-чат / схема |
Застоявшаяся схема (STALE_DIAGRAM) | Своя схема не правилась от 7 до 45 дней — предлагаем позвать коллег на согласование | Схема, окно согласования |
Вам открыли схему (INVITED_DIAGRAM) | Новичку дали доступ к чужой схеме | AI-чат / схема |
Коллеги правят вашу схему (COLLABORATOR_EDIT_BURST) | Коллеги сохранили 3+ версии схемы автора за неделю | AI-чат / схема |
У схемы появились читатели (DIAGRAM_AUDIENCE) | Пока автора не было 3–30 дней, к его схемам выдали доступы или оставили замечания | AI-чат / схема |
Что накопилось (DORMANT_RECAP) | Сотрудник не заходил 14–90 дней, а у него накопились согласования, замечания, незаконченные схемы | AI-чат |
Итоги недели (WEEKLY_RECAP) | Активному сотруднику — сводка по неделе (от 5 сохранений) | AI-чат |
Что вас ждёт (DIGEST) | Запасной повод: короткий дайджест, если острого повода нет | AI-чат |
Пороги в днях — настройки, см. «Что можно настроить».
Включение
1. Переменная окружения
В окружении контейнера backend:
STORM_RETENTION_ENABLED=true
После перезапуска появляются ночной прогон и кнопка ручного запуска. Без этой переменной прогревы не работают, даже если всё остальное настроено.
2. Языковая модель
Тексты пишет языковая модель, без неё прогон не запускается. Для прогревов нужна отдельная настройка модели — bpmnAiRetentionModel (в админ-панели: Админ-панель → вкладка «Ретеншн», поле «Ретеншн LLM: модель»). Адрес API, токен и формат по умолчанию берутся из настроек AI-ассистента; при необходимости их можно переопределить отдельными настройками bpmnAiRetention*.
Модель чата не подставляется автоматически намеренно: в промпт уходят имена сотрудников и названия схем (см. «Какие данные получает модель»), и это должно быть осознанное решение. Подойдёт модель уровня той, что используется для AI-чата, в том числе собственная.
Системный промпт (retentionCopySystemPrompt) уже заполнен при установке — менять его не обязательно.
3. Почта
- Простой SMTP — ничего дополнительно не нужно: письма прогревов свёрстаны в приложении.
- ListMonk — нажмите «Настроить базовые шаблоны в Listmonk» на вкладке «📧 Электронная почта» настроек приложения: она заведёт шаблон и для писем прогревов (
retentionEmailTemplateId). Подробнее — «Настройка почтовых уведомлений».
Если почта не настроена совсем, прогревы её дождутся: черновики не будут помечены отправленными.
4. Тумблеры
На вкладке «Ретеншн» админ-панели три тумблера:
| Тумблер | Что делает |
|---|---|
retentionEngineEnabled | Разрешает работу движка: генерацию текстов |
retentionScheduleEnabled | Включает ночной прогон по расписанию |
retentionSendEnabled | Разрешает отправку писем. Пока выключен, движок только готовит черновики |
Рекомендуемый порядок запуска
- Включите
retentionEngineEnabledиretentionScheduleEnabled, отправку не включайте. - Запустите прогон кнопкой на вкладке «Ретеншн» (или дождитесь ночи).
- Просмотрите черновики в таблице
sm_retention_nudge(колонкиemail_subject,email_body) — устраивают ли вас тон и содержание. - Включите
retentionSendEnabled— с ближайшего утра письма пойдут.
5. Закрытый контур
Если у сервера нет выхода в интернет, выключите определение компании сотрудника по домену почты (внешний сервис DaData): retentionCompanyLookupMax = 0. Иначе каждый прогон будет тратить на эту попытку до 30 секунд. Часовой пояс отправки тогда — московский.
6. Витрина симуляции — только с DES
Повод «Витрина симуляции» сам прогоняет схемы сотрудников через модуль симуляции, поэтому требует развёрнутого DES. По умолчанию выключен (retentionDesShowcaseEnabled = false) — включайте, только если симуляция у вас работает. Через ListMonk этому поводу нужен собственный шаблон (retentionEmailTemplateId.DES_SHOWCASE): базовый шаблон кнопки его не покрывает.
Тариф
При активной enterprise-лицензии все сотрудники считаются на максимальном тарифе: прогревы не ограничивают поводы и формулировки так, как для бесплатных пользователей облака.
Что можно настроить
Все настройки — на вкладке «Ретеншн» админ-панели. Изменения применяются со следующего прогона.
Расписание и частота
| Настройка | По умолчанию | Что задаёт |
|---|---|---|
retentionSendHour | 11 | Час отправки по часовому поясу компании сотрудника (письма идут в будни, с разбросом до часа) |
retentionNudgeTtlDays | 3 | Сколько дней черновик ждёт отправки, прежде чем устареть |
retentionMinDaysBetweenNudges | 7 | Минимум дней между письмами одному человеку |
retentionEntityCooldownDays | 28 | Минимум дней между письмами об одной и той же схеме или согласовании |
retentionPessimizationMinDays | 3 | Через сколько дней проигнорированный повод считается исчерпанным |
retentionRunCap | 6000 | Сколько сотрудников максимум обрабатывается за прогон (0 — без ограничения) |
retentionNightOnly, retentionNightStartHour, retentionNightEndHour | true, 23, 7 | Ночное окно работы прогона (время московское) |
retentionHoldoutPercent | 10 | Доля сотрудников (в %) в контрольной группе: им тексты готовятся, но не отправляются — чтобы сравнивать с получившими. Если оценка эффекта не нужна, поставьте 0 |
Пороги поводов
| Настройка | По умолчанию | Повод |
|---|---|---|
retentionStuckApprovalDays, retentionStuckApprovalDaysMax | 5, 45 | Согласование ждёт |
retentionDeclinedMinDays | 3 | Схему отклонили |
retentionStaleDiagramDaysMin, retentionStaleDiagramDaysMax | 7, 45 | Застоявшаяся схема |
retentionStaleDiagramMinElements | 10 | Сколько элементов должно быть в схеме, чтобы считать её начатой всерьёз |
retentionStreakMinDays | 8 | Оборвалась серия |
retentionReturnGapDays, retentionReturnRecentDays | 90, 7 | С возвращением |
retentionEditBurstMinVersions | 3 | Коллеги правят вашу схему |
retentionDiagramAudienceMinDays, retentionDiagramAudienceMaxDays | 3, 30 | У схемы появились читатели |
retentionDormantDaysMin, retentionDormantDaysMax | 14, 90 | Что накопилось; …DaysMax — заодно верхняя граница «живого» сотрудника |
retentionNewbieDaysMax | 30 | До скольки дней с регистрации сотрудник считается новичком |
retentionRecapMinActions | 5 | Итоги недели |
retentionDigestMinAwayDays | 3 | Что вас ждёт |
Тексты писем
| Настройка | Что задаёт |
|---|---|
retentionCopySystemPrompt | Общий системный промпт: тон, правила, что ассистент умеет. Заполнен при установке |
retentionPromptGuidance.<повод> | Дополнение к промпту для конкретного повода, например retentionPromptGuidance.stuck-approval. Пусто — используется встроенное |
retentionEmailCallToAction.<ПОВОД> | Подпись кнопки письма для повода, например retentionEmailCallToAction.STALE_DIAGRAM = «Отправить на согласование →». Общая подпись — retentionEmailCallToAction. Пустое значение убирает призыв |
retentionSubjectMaxLength | Максимальная длина темы письма (по умолчанию 70 символов) |
Вёрстка писем
- SMTP: вёрстка встроена (логотип, карточка «Мастер Шторм · написал вам», кнопка, ссылка отписки).
- ListMonk: правьте шаблон из
retentionEmailTemplateIdв ListMonk. Тема приходит в{{ .Tx.Data.subject }}, тело — готовым HTML в{{ .Tx.Data.body }}(выводите через{{ with .Tx.Data.body }}{{ Safe . }}{{ end }}). Для отдельного повода можно завести свой шаблон и указать его ID вretentionEmailTemplateId.<ПОВОД>.
Какие данные получает модель
В промпт для написания письма передаются:
- имя сотрудника (только если оно похоже на имя), его роль и задачи из анкеты при регистрации;
- название, отрасль и размер компании;
- сколько дней сотрудник не заходил;
- название схемы или согласования, о котором письмо, и факты повода — например названия схем, имена коллег, текст причины отказа в согласовании.
Адрес электронной почты в промпт не передаётся. Промпты и ответы модели хранятся в базе 30 дней (retentionTraceTtlDays) для разбора спорных писем, затем удаляются.
Если модель внешняя, учитывайте это при выборе: для чувствительных данных используйте собственную модель.
Диагностика
Ручной запуск
На вкладке «Ретеншн» есть кнопка запуска прогона. Можно ограничить его одним поводом, одним сотрудником (по ID) и снять ограничение частоты — удобно, чтобы посмотреть, что получит конкретный человек. Прогон идёт в фоне, результат — в таблице sm_retention_nudge и логах backend.
Таблица sm_retention_nudge
Каждое письмо — строка с полями trigger_type (повод), email_subject, email_body, scheduled_send_at, sent_on и статусом:
| Статус | Значение |
|---|---|
DRAFT | Текст готов, ждёт времени отправки |
HOLDOUT | Контрольная группа — не отправляется |
SENDING | Передаётся почтовому провайдеру |
SENT | Передано почтовому провайдеру (доставку подтверждает уже он) |
EXPIRED | Не ушло вовремя — устарело |
SKIPPED_NO_FACT | Повод был, но фактов мало или текст не прошёл проверки |
FAILED | Ошибка генерации (например, модель недоступна) |
Логи
Сообщения движка в логах backend начинаются с ретеншн: (старт и итоги прогона, отправка, ошибки), витрины симуляции — с витрина DES:.
Частые вопросы
| Ситуация | Что проверить |
|---|---|
| Прогон не запускается | STORM_RETENTION_ENABLED=true и перезапуск; retentionEngineEnabled; задана bpmnAiRetentionModel; не пуст retentionCopySystemPrompt |
| Черновики есть, писем нет | Включён ли retentionSendEnabled; настроена ли почта; не наступило ли ещё утро (scheduled_send_at) |
Много SKIPPED_NO_FACT | Нормально в первые ночи: у части сотрудников нет повода. Если почти всё — проверьте модель и промпт |
Много FAILED | Модель недоступна или отвечает ошибкой — проверьте адрес и токен |
| Сотрудник не получает писем | Он читатель, отключил email-уведомления, отписался, попал в контрольную группу (HOLDOUT) или письмо было меньше 7 дней назад |