← Все работы
АИ2 · собственная разработка · CRM и агент

Задача заводится одним сообщением

Обычная CRM просит заполнить шесть полей раньше, чем человек додумал мысль, — поэтому её и не заполняют. Здесь задачи, сроки и утренние сводки живут в переписке с агентом: он сам находит проект, проверяет, нет ли такой же задачи, и пишет первым. Экран остался, но он больше не входная дверь.

0полей заполнить, чтобы поставить задачу
39команд агент выполняет сам
6поводов написать первым, без запроса
≈8 чрутины в неделю — наша оценка
01 — Задача

Между мыслью и записью — шесть полей

Задача редко рождается за столом. Она приходит в дороге, в чужой переписке, голосом на ходу. Чтобы она попала в систему, человек должен открыть её, нажать «создать» и принять шесть решений подряд.

Каждое из них по отдельности пустяковое. Вместе они дают простой итог: дешевле запомнить, чем записать. Через день задача уже стирается из памяти, а через неделю её приходится восстанавливать на планёрке.

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

Названиесформулировать до конца прямо сейчас
Проектвыбрать из десяти активных
Приоритетlow · medium · high · critical
Статусtodo · in_progress · review · done
Срокпоставить дату и время, которых ещё нет в голове
Описаниедописать то, что и так помнится
6решений до того, как задача записана. И ни одно из них не про саму работу.

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

02 — Переворот

Основной пользователь системы — не человек

Это записано в самом начале архитектурного документа, ещё до выбора технологий: основной пользователь CRM — агент, он работает через программный интерфейс. Человеку остаётся экран, чтобы посмотреть и поправить.

На практике это значит: чтобы поставить задачу, вы пишете сообщение в Telegram — обычное, пересланное или голосовое. Агент сам ищет подходящий проект, проверяет, нет ли уже такой же задачи, ставит срок и отвечает, что сделал. Структуру, которую форма требует на входе, он достраивает сам и переспрашивает, если не хватает данных.

что на сегодня?задачи на сегоднядедлайны на сегодня, кроме закрытых
на чём сфокусироваться?расставить приоритетыразбирает список и возвращает задачи с обоснованием, почему они наверху
удали задачу про логистикунайти → удалитьсначала найти и показать, что нашлось, и только потом удалять
не ту удалилвернуть из корзинызадача и все её подзадачи возвращаются из корзины
больше не повторяйснять повторповтор снимается, текущая задача остаётся на месте
пересланное сообщениезадача из пересланногозадача с текстом, автором и каналом-источником
голосовоерасшифровать голос → дальше как текстрасшифровка, затем обычный разбор фразы

Фразы слева не придуманы для кейса: это дословные примеры из описаний операций, по которым агент и решает, что вызвать. Справа — сама операция и что она делает.

03 — Как выглядит день

Шесть поводов написать первым

Переписка работает в обе стороны: половина смысла системы в том, что агент пишет сам, без запроса.

Расписание жёсткое и считается обычным кодом, без языковой модели: даже если провайдер недоступен, дедлайны всё равно приходят вовремя. С 22:00 до 09:00 проверки выключены, а вечер пятницы и выходные агент считает нерабочим временем.

09:00Утренняя сводкастатистика по задачам, просроченное, события дня, дедлайны и то, что в работе.
10:00 · 14:00 · 18:00Горящиедедлайн наступит в ближайшие двое суток, а к задаче ещё не приступали.
12:00 · 18:00Застоявшиесязадача в работе больше трёх дней без единого обновления.
каждые 30 минутДедлайн на подходедва предупреждения: за сутки и за час. Повторно за день не пишет.
20:00Итоги днясколько закрыто, сколько заведено, сколько осталось в работе.
понедельник, 10:00Неделяотчёт по проектам со сравнением: «↑ +4 к прошлой неделе».

Заштрихованное на шкале — тихие часы. Ночью система молчит совсем: напоминание про завтра подождёт до утра.

утренняя сводка · 09:00
Статистика
93 задачи79 выполнено6 просрочено10 активных проектов
Просрочено
События
Дедлайны сегодня

Так устроена сводка: сначала цифры, потом три коротких списка. Ничего не надо открывать — всё уже в сообщении.

Цифры настоящие — сняты с базы 25 августа 2026. Названия задач мы закрыли полосами: система личная, и внутри неё есть проекты под соглашением о неразглашении.

В тот же день отметка о последней доставке стояла на 09:00. Это отметка именно о доставке: почему это отличается от простого срабатывания расписания — в разделе про надёжность.

04 — Что агент делает сам

Тридцать девять команд вместо разделов меню

Агент не «имеет доступ к базе» — у него набор именованных операций, каждая делает одну вещь и возвращает понятный ответ. Это и есть его руки.

Названия важнее, чем кажется: по описанию операции модель решает, что вызвать. Поэтому в описаниях прямо записано, чем «удали» отличается от «сделал» и что удаление повторяющейся задачи — это не то же самое, что её закрытие.

13Задачи
создатьизменитьзакрытьудалитьвернутьснять повторнайтиподзадачана сегодняна неделюповторяющаясяиз пересланногонайти похожие
7Проекты
списоккарточкасоздатьизменитьудалитьподпроектсписок подпроектов
4Календарь
создать событиеизменитьудалитьчто сегодня
4Контакты
найтисоздатьизменитьудалить
5Разбор и план
что важноплан на завтраитоги днязагрузка по проектамсводка
3Деньги
записать долг себесписокпогашение
3Общее
комментарийсквозной поискрасшифровка голоса
39Всего
по каждой — своё описание, когда её вызывать

Экран остался — он просто перестал быть входной дверью

Мы не убирали интерфейс. Есть вещи, которые в переписке неудобны: посмотреть месяц целиком, перетащить задачу между колонками, поправить десять карточек подряд. Для этого восемь разделов в вебе — и они никуда не делись.

Разница в том, что ни один из них больше не обязателен. Форма осталась там, где без неё хуже, и ушла оттуда, где она мешала.

сводказадачипроектыкалендарьконтактызаметкифинансынастройки
05 — Что было сломано

Четыре бага, и ни один не про интеллект модели

Летом мы сели разбираться, почему агент «то работает, то нет»: пишет «готово, удалил», а задача на месте; не находит очевидную задачу; заводит дубликаты. Первое подозрение всегда одно — модель слабая, надо взять помощнее.

Разбор занял два полных аудита по живому коду и серверу. Ни одна из причин не оказалась в модели. Все четыре — в обвязке вокруг неё.

баг 01

«Готово, удалил» — а задача на месте

симптомАгент бодро отчитывался об удалении. Задача оставалась в списке.
настоящая причинаЗапрос на удаление всегда отвечал успешно — даже когда не удалил ничего. Сколько строк он на самом деле тронул, код просто выбрасывал. Врала агенту сама среда — он лишь повторял то, что ему ответили.
что сделалиОтвет теперь отдельно говорит, удалилось или нет, а в правилах агента появилась строка: писать «готово» только если инструмент вернул успех. Заодно удаление стало мягким — задачу и её подзадачи можно вернуть одной фразой.
баг 02

Агент «не находит» очевидную задачу

симптомЦепочка «найди задачу → удали её» рвалась на первом шаге. Агент отвечал, что ничего не нашёл.
настоящая причинаПоиск шёл прямым сравнением строк: к кириллице он чувствителен к регистру и не знает падежей. «Логистике» против сохранённого «логистикой» — ноль совпадений. Заглавные буквы — тоже ноль.
что сделалиЕсли точного совпадения нет, включается нестрогий поиск: слова обрезаются до основы, считается доля общих, порог — четверть. Агент получает список кандидатов с оценкой похожести и спрашивает, какую из них, вместо того чтобы сдаться.
баг 03

Правила до модели вообще не доходили

симптомАгент путал «удали» и «сделал», плодил копии повторяющихся задач — как будто инструкций не читал.
настоящая причинаОн их и не читал. Собранная инструкция была длиной 90 символов: «ты ассистент Егора, отвечай кратко». Все правила лежали в отдельном файле, до которого движок не дотягивался.
что сделалиПереписали правила прямо в инструкцию — стало 2 416 символов. И назначили проверку приёмки: в записи новой сессии инструкция обязана содержать строку «Удалить ≠ Выполнить». Пока её там нет — баг не считается закрытым.
баг 04

Страховка от дублей не сработала ни разу

симптомПроверка «нет ли уже такой задачи» была написана и подключена. Дубли всё равно появлялись.
настоящая причинаОна запрашивала 200 задач, а больше 100 отдавать нельзя. Приходила ошибка, но обёртка не проверяла код ответа — и ошибка выглядела как обычный пустой список. Функция всегда отвечала «дублей нет».
что сделалиПоправили запрос и, что важнее, научили обёртку падать на любом неуспешном ответе. Молчаливая ошибка — худший вид ошибки: она неотличима от нормальной работы.

Общий вывод мы записали в аудит одной строкой: надёжность агента — это примерно на 80 % обвязка вокруг модели (инструкция, инструменты, обработка ошибок, наблюдаемость) и лишь на 20 % её собственный интеллект. Ни один из четырёх багов не починился бы переходом на модель помощнее.

06 — Надёжность

Опасно то, что падает молча

Система, которой доверили напоминать, обязана шуметь, когда ломается. Иначе выходит худший из возможных вариантов: человек перестал держать задачи в голове, а система перестала о них писать — и никто об этом не знает.

Такое уже случалось. На соседнем сервисе того же сервера утренняя рассылка несколько дней подряд падала на ошибке доступа. В логах при этом бодро стояло «отправлено»: код не читал, что ответил мессенджер.

отметка о доставке Сводка отчитывается, только если дошла

Планировщик читает ответ мессенджера и ставит отметку времени, только когда доставка подтверждена. Мы отмечаем именно «сообщение получено».

Было: отправка логировалась всегда, включая отказ по токену.
сторож Проверяет отметку снаружи

Отдельный скрипт смотрит на возраст отметки. Старше 25 часов — приходит предупреждение с подсказкой, что проверять. Он живёт вне процесса, за которым следит: иначе умрёт вместе с ним и промолчит.

Умеет писать напрямую, минуя тот же маршрут, который мог и сломаться.
бэкап Снимок базы каждую ночь

База не копировалась вообще. Хуже: основной файл был от 6 апреля, а весь свежий материал лежал в журнале на 2,8 МБ — обычное копирование файла потеряло бы месяцы работы.

Стало: штатный снимок в 03:30 со сведением журнала, хранение 14 дней. На 25 августа в папке 16 копий.
повторные попытки Повтор — там, где он безопасен

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

Было: одна неудачная попытка — и инструмент возвращал ошибку человеку.
Ядро CRM: было 178 перезапусков по нехватке памяти, стало 0 за 26 дней

Каждый перезапуск открывал окно в несколько секунд, когда агент стучался в мёртвый порт и получал отказ. Лечение оказалось скучным: поднять лимит памяти процесса с 250 до 350 МБ. Замер сделан 25 августа. Это ровно то, что имелось в виду под «надёжность — в обвязке».

07 — Границы

Что эта система не делает

Кейс написан по своей же системе, поэтому границы видны изнутри. Часть из них — сознательный выбор, часть — наш незакрытый долг.

граница 01Один пользователь, не командаВход по одному ключу, ролей и разграничения прав нет — так решили на старте, чтобы не строить лишнего. Командная версия потребует отдельной разработки.
граница 02Агент не помнит вчерашний разговорПравила у него в инструкции, а памяти между сессиями нет: контекст приходится повторять. Знаем, где это чинится, и знаем, сколько стоит.
граница 03Тесты требуют живого сервераДевяносто четыре проверки написаны, но ходят в работающую систему и трогают настоящие данные. Автоматически перед выкаткой не гоняются. Это долг.
граница 04Шлюз агента падаетПереписка иногда обрывается, менеджер процессов поднимает шлюз сам. Данные при этом целы: задачи хранятся в отдельной базе данных. Поэтому падение стоит одну минуту.
граница 05Сторож у нас самих снят с расписанияСкрипт на месте, но строки в расписании сейчас нет: последний раз он отработал 30 июня. Бэкап и сводка идут, сторож ждёт своей очереди. Пишем как есть.
граница 06Инфраструктура меняется под ногамиОдин и тот же маршрут до мессенджера мы за месяц переключали дважды в разные стороны: сначала увели с нестабильного прокси, потом вернули, когда прямой путь закрыли снаружи. В тот день сводка не ушла.

Последний пункт — главный аргумент в пользу сторожа и отметки о доставке. Идеальной настройки не бывает: важно узнавать о поломке в тот же день.

08 — Что переносится дальше

Механизм не про задачи и не про нас

Под кейсом лежит связка из трёх частей: канал, в котором человек уже сидит; набор именованных операций над своей базой; детерминированный планировщик, который пишет первым и работает без языковой модели.

Предметная область меняется — связка остаётся той же. Ниже те задачи, где вход выглядит один в один: человек что-то сказал или переслал, а на выходе должна появиться структурная запись.

Заявки и обращения
входсообщение или пересланное письмо от клиентавыходкарточка с ответственным, сроком и историей
Поручения после встречи
входголосовое на минуту сразу после разговоравыходзадачи со сроками, привязанные к проекту
Регламенты и дежурства
входправило «каждый вторник» вместо чьей-то памятивыходнапоминание в срок и отметка о выполнении
Отчётность руководителю
входто, что уже лежит в базевыходутренняя и недельная сводка со сравнением недель

Что стоит зафиксировать до старта: в каком канале живёт команда, какие операции агент имеет право делать без подтверждения, а какие — только с ним, и по каким признакам мы поймём, что система сломалась молча.