EVAN
(01)AI / AUTOMATION · 2026CASE STUDY · 01/03

LEAD RADAR

Сервис, который превращает поток Telegram-каналов в проверяемый конвейер лидов.

ROLE
PRODUCT · SETUP · REVIEW
STACK
Python · SQLite/WAL · Telegram · Groq · systemd · Ubuntu VDS
STATUS
IN PRODUCTION
SYSTEM MAP · 08 NODES
  1. 01SOURCES
    реестр источников
  2. 02INGEST
    нормализация, дедуп
  3. 03LEDGER
    SQLite/WAL, провенанс
  4. 04PRE-FILTER
    детерминированный отбор
  5. 05QUALIFY
    ответ модели, схема
  6. 06RANK
    ранжирование, дедуп показа
  7. 07DIGEST
    два окна в день, до 10 карточек
  8. 08OWNER
    решение владельца
01

CONTEXT

Руками просматривать много Telegram-каналов — шумно, однообразно и легко отстать. Интересное тонет в потоке, а через день его уже не найти.

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

02

PROBLEM

Поток сообщений нужно нормализовать и дедуплицировать, иначе одно и то же приходит по нескольку раз.

Модель нельзя пускать на весь объём: это дорого и медленно. До неё должен работать детерминированный отбор.

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

Доставка должна переживать перезапуск: если процесс упал в середине отправки, дайджест не должен потеряться или задвоиться.

03

APPROACH

Границы разведены: читатель Telegram и бот-доставка — разные боундари. Обработчики событий быстро сохраняют и никогда не ждут вызова модели.

Перед моделью стоит детерминированный пре-фильтр, настроенный на полноту: лучше пропустить лишнее дальше, чем потерять релевантное.

Квалификация — один структурированный запрос без инструментов, с последующей строгой валидацией и неизменяемым сохранением анализа.

Владелец принимает финальное решение сам. Система готовит и ранжирует, но не решает за человека.

04

SYSTEM / ARCHITECTURE

SOURCES
постоянный реестр источников с идемпотентной сверкой и изоляцией сбоев
INGEST
версионированная нормализация, точная дедупликация по источнику и id сообщения
LEDGER
долговечный журнал приёма: переживает удаление payload и сохраняет идентичность для восстановления
PRE-FILTER
детерминированный отбор до любого обращения к модели
QUALIFY
провайдеро-независимый интерфейс с адаптером Groq: строгая схема, пейсинг, Retry-After, глобальный кулдаун, лизы, состояние предохранителя
RANK
детерминированное ранжирование, дедупликация показа по содержимому, ограниченный перенос PRIORITY ровно в одно следующее окно
DIGEST
окна 10:00 и 16:00 в заданной таймзоне, максимум 10 карточек на окно; пустое окно закрывается как skipped
OWNER
действия только для владельца, атомарные решения и транзакционный outbox
05

REAL OUTPUT

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

  • 05.AQUALIFICATION05 QUALIFY
    Карточка лида целиком: тир «Приоритет», описание запроса, бюджет и разбор «Почему подходит»
    EXTRACTED SIGNAL
    ТИР
    ПРИОРИТЕТ
    НАПРАВЛЕНИЕ
    ПАРСИНГ
    БЮДЖЕТ
    1 000 – 3 000 ₽
    РАЗБОР
    ПОЧЕМУ ПОДХОДИТ

    ОКНО 01 ИЗ 02 · КАРТОЧКА ПРОДОЛЖАЕТСЯ

  • 05.BRISK & FIT05 QUALIFY
    Продолжение той же карточки: блок «Риски», оценка совпадения 92 из 100 и дата публикации
    EXTRACTED SIGNAL
    FIT / ЭТОТ ЛИД
    92 / 100
    ОГОВОРКИ
    2 РИСКА
    ОПУБЛИКОВАНО
    02.09.2026
    САНИТИЗАЦИЯ
    КАНАЛ СКРЫТ

    ОКНО 02 ИЗ 02 · НИЖНЯЯ ГРАНИЦА КАРТОЧКИ ЦЕЛАЯ

  • 07.AHUMAN DECISION07 DIGEST
    Строка действий под карточкой целиком: «Интересно», «Мимо», «Оригинал»
    OBSERVED OUTPUT
    ДЕЙСТВИЯ
    3 КНОПКИ
    РЕШАЕТ
    ВЛАДЕЛЕЦ
  • 06.ACOMPARISON06 RANK
    Вторая карточка целиком: тир «Подходит», разбор, риски и оценка совпадения 78 из 100
    EXTRACTED SIGNAL
    FIT / ЭТОТ ЛИД
    78 / 100
    ТИР
    ПОДХОДИТ
    ПОКАЗЫВАЕТ
    РАНЖИРОВАНИЕ
06

IMPLEMENTATION

  • Классификатор возвращает одну из меток PRIORITY, GOOD, BORDERLINE или REJECT вместе с валидированной уверенностью, оценкой соответствия, кратким описанием и явно извлечёнными коммерческими деталями.
  • Недоверенный текст из Telegram изолирован как данные: инструменты отключены, отсутствующие поля остаются null, детерминированные жёсткие отказы до провайдера не доходят.
  • SQLite/WAL хранит очередь, провенанс, курсоры, состояние дайджестов, ретраев, решений и outbox. Дедлайны ретраев и состояние предохранителя переживают перезапуск.
  • Догон ограничен постранично и глобально, поэтому старт не может незаметно вычерпать неограниченную историю.
  • Рантайм собран как один супервизируемый модульный монолит и кооперативно останавливается по SIGTERM.
  • Приватный деплой работает на Linux VPS под systemd, только исходящие соединения, без открытых входящих портов.
TECHNICAL EVIDENCE

Автоматический набор тестов не требует ключей и использует фейковые адаптеры провайдера и Telegram.

На момент подготовки публичного снапшота проходили 758 тестов на Python 3.12 — это покрытие кода, а не показатель работы сервиса.

07

RESULT

  • После запуска работает стабильно, без постоянных ручных перезапусков.
  • Регулярно приносит 6–10 релевантных возможностей для отклика.
  • По одному из найденных системой лидов уже закрыт реальный заказ.

Публичный снапшот санитизирован: продакшн-креды, сессии, база, payload'ы, каталог источников и история деплоя в него не входят.