Перейти к основному содержанию

Прогревы (Мастер Шторм)

Около 6 мин

Прогревы: письма Мастера Шторма

Прогревы — это персональные письма, которые Stormbpmn сам пишет сотрудникам, когда у них есть понятный повод вернуться к работе: висит согласование, схему давно не трогали, коллеги оставили замечания, человек вернулся после отпуска. Письма подписаны «Мастер Шторм», пишет их ваша языковая модель по фактам из системы, а кнопка в письме ведёт сразу к делу — в схему, к согласованию или в AI-чат, где ассистент уже продолжает разговор.

Доступно в сборках после 7 октября 2026. По умолчанию всё выключено.

Зачем это нужно

Моделирование процессов — работа с длинными паузами: схему начали и отложили, отправили на согласование и забыли, пригласили коллегу, а он так и не зашёл. Прогревы закрывают именно эти паузы:

  • согласования не зависают — согласующему напоминают про ждущее решение, автору — про отклонённую схему;
  • начатые схемы доводятся — автору застоявшейся схемы предлагают позвать коллег на согласование;
  • новички втягиваются — тому, кому дали доступ или адресовали согласование, объясняют, что от него ждут;
  • возвращаться проще — после отпуска человек получает короткую сводку, что изменилось.

Письмо всегда про конкретный факт («согласование „Закупки“ ждёт вашего решения 9 дней»), а не рассылка «заходите к нам». Если сказать по делу нечего, письма не будет.

Как это работает

00:30 МСК, по будням           ночной прогон: кому и о чём писать
   │  отбор сотрудников → поиск повода → факты из базы → текст пишет языковая модель → проверки
   ▼
sm_retention_nudge             черновики писем со временем отправки
   │
каждую минуту                  отправка созревших черновиков (если включена)
   ▼
почта (SMTP или ListMonk)  →   сотрудник → кнопка → схема / согласование / AI-чат
  1. Ночной прогон. По будням в 00:30 по Москве движок отбирает сотрудников и для каждого ищет самый важный повод. Прогон работает только ночью (с 23:00 до 07:00 по Москве) — если не уложился, хвост догонит следующей ночью. Одновременно идёт только один прогон, даже при нескольких экземплярах backend.
  2. Текст. По фактам повода языковая модель пишет тему, текст письма и первое сообщение в AI-чат. Код проверяет ответ: все числа должны быть из данных, обязательные факты — упомянуты, тон — на «вы», без упрёков. Не прошедший проверку текст не отправляется, движок пробует запасной повод.
  3. Черновик. Готовое письмо ложится черновиком на утро ближайшего рабочего дня: по умолчанию в 11:00 по часовому поясу компании сотрудника (если он неизвестен — по Москве), со случайным разбросом до часа, чтобы письма не уходили все разом. Черновик живёт 3 дня — не ушёл, значит неактуален.
  4. Отправка. Раз в минуту созревшие черновики отправляются через ваш почтовый провайдер.
  5. Продолжение в чате. Если включён 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Разрешает отправку писем. Пока выключен, движок только готовит черновики

Рекомендуемый порядок запуска

  1. Включите retentionEngineEnabled и retentionScheduleEnabled, отправку не включайте.
  2. Запустите прогон кнопкой на вкладке «Ретеншн» (или дождитесь ночи).
  3. Просмотрите черновики в таблице sm_retention_nudge (колонки email_subject, email_body) — устраивают ли вас тон и содержание.
  4. Включите retentionSendEnabled — с ближайшего утра письма пойдут.

5. Закрытый контур

Если у сервера нет выхода в интернет, выключите определение компании сотрудника по домену почты (внешний сервис DaData): retentionCompanyLookupMax = 0. Иначе каждый прогон будет тратить на эту попытку до 30 секунд. Часовой пояс отправки тогда — московский.

6. Витрина симуляции — только с DES

Повод «Витрина симуляции» сам прогоняет схемы сотрудников через модуль симуляции, поэтому требует развёрнутого DES. По умолчанию выключен (retentionDesShowcaseEnabled = false) — включайте, только если симуляция у вас работает. Через ListMonk этому поводу нужен собственный шаблон (retentionEmailTemplateId.DES_SHOWCASE): базовый шаблон кнопки его не покрывает.

Тариф

При активной enterprise-лицензии все сотрудники считаются на максимальном тарифе: прогревы не ограничивают поводы и формулировки так, как для бесплатных пользователей облака.

Что можно настроить

Все настройки — на вкладке «Ретеншн» админ-панели. Изменения применяются со следующего прогона.

Расписание и частота

НастройкаПо умолчаниюЧто задаёт
retentionSendHour11Час отправки по часовому поясу компании сотрудника (письма идут в будни, с разбросом до часа)
retentionNudgeTtlDays3Сколько дней черновик ждёт отправки, прежде чем устареть
retentionMinDaysBetweenNudges7Минимум дней между письмами одному человеку
retentionEntityCooldownDays28Минимум дней между письмами об одной и той же схеме или согласовании
retentionPessimizationMinDays3Через сколько дней проигнорированный повод считается исчерпанным
retentionRunCap6000Сколько сотрудников максимум обрабатывается за прогон (0 — без ограничения)
retentionNightOnly, retentionNightStartHour, retentionNightEndHourtrue, 23, 7Ночное окно работы прогона (время московское)
retentionHoldoutPercent10Доля сотрудников (в %) в контрольной группе: им тексты готовятся, но не отправляются — чтобы сравнивать с получившими. Если оценка эффекта не нужна, поставьте 0

Пороги поводов

НастройкаПо умолчаниюПовод
retentionStuckApprovalDays, retentionStuckApprovalDaysMax5, 45Согласование ждёт
retentionDeclinedMinDays3Схему отклонили
retentionStaleDiagramDaysMin, retentionStaleDiagramDaysMax7, 45Застоявшаяся схема
retentionStaleDiagramMinElements10Сколько элементов должно быть в схеме, чтобы считать её начатой всерьёз
retentionStreakMinDays8Оборвалась серия
retentionReturnGapDays, retentionReturnRecentDays90, 7С возвращением
retentionEditBurstMinVersions3Коллеги правят вашу схему
retentionDiagramAudienceMinDays, retentionDiagramAudienceMaxDays3, 30У схемы появились читатели
retentionDormantDaysMin, retentionDormantDaysMax14, 90Что накопилось; …DaysMax — заодно верхняя граница «живого» сотрудника
retentionNewbieDaysMax30До скольки дней с регистрации сотрудник считается новичком
retentionRecapMinActions5Итоги недели
retentionDigestMinAwayDays3Что вас ждёт

Тексты писем

НастройкаЧто задаёт
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 дней назад