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

Как было устроено. Коллекторы по расписанию → очередь кандидатов → агент-редактор собирает выпуск → публикация по слотам. Классический конвейер, работал месяцами.

Что пошло не так. Конвейер не упал — он деградировал тихо. Очередь кандидатов опустела, и запасная ветка начала подмешивать контент другого типа; часть ссылок в выпусках вела на 404; один и тот же сигнал выходил дважды под разными датами. Каждый выпуск при этом выглядел валидным: файл есть, структура есть, посты выходят. Предупреждения писались в логи, которые никто не читал.

Диагноз. Три системные ошибки. Мягкие проверки: пайплайн предупреждал вместо того, чтобы падать. Запасной контент того же формата, но другого типа — подмену не видно снаружи. И ни одного датчика, который смотрел бы на выпуск глазами читателя.

Что сделали.

  • Жёсткие полы вместо предупреждений: меньше трёх сигналов в выпуске — конвейер падает с ошибкой, а не публикует пустышку.
  • Проверка ссылок перед публикацией: каждый источник дёргается, 404 отсекается до выхода.
  • Дедупликация по содержанию, а не по дате: один сигнал — один выход.
  • Языковые и тематические гейты на входе в очередь.
  • Тесты на каждый инцидент: 30+ регрессионных тестов, каждый из которых — бывший реальный сбой.

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

Что здесь переносимо на любую компанию. Если у вас есть автоматический процесс, который «работает сам», спросите: что случится, если на выходе появится мусор? Если ответ «предупреждение в логах» — у вас уже, возможно, мусор на выходе.