Отчёт, который врал пять дней и ни разу не выдал ошибку

Каждое утро ассистент, которого я сам собрал, присылает мне короткую сводку: что сегодня в планах, на что обратить внимание, кому нужно ответить. Пять утр подряд она начиналась примерно так: «на сегодня ничего не запланировано, свободный день дома». А я всё это время был в разъездах, с плотным графиком. Сводка была бодрой, уверенной и абсолютно неверной, и нигде в системе не сработала ни одна тревога.
Если коротко
- Автоматический ежедневный отчёт пять дней «успешно» отрабатывал, тихо выдавая мусор: источник данных возвращал «успех, результатов нет» вместо ошибки, поэтому ничего не выглядело сломанным.
- «Отработало без ошибок» - это не то же самое, что «сработало». Закладывайте проверку не только на падение, но и на пустой ответ.
- Дайте ИИ окружающий контекст и позвольте интерпретировать, вместо того чтобы жёстко зашивать одно негибкое правило.
Отчёт, который выглядел нормально
Сводка - штука скучная и полезная. Она читает несколько источников, один из них мой календарь, и приходит каждое утро без всякого участия с моей стороны. Месяцами она была права. Это первая тихая ловушка автоматизации: то, что долго работало надёжно, становится невидимым, и ты перестаёшь проверять единственный результат, которому решил доверять.
Поэтому, когда сводка начала говорить, что дни у меня пустые, я пожимал плечами и решал, что просто забыл занести дела в календарь. Честная версия выглядит менее лестно: я доверял собственному коду, потому что он не жаловался. Никаких красных логов, никакого падения, никакого оповещения. Задача завершалась чисто каждое утро, так что для всех моих дашбордов всё было в порядке.
Что на самом деле сломалось
Несколькими днями раньше постороннее изменение в нижнем слое системы вырубило кусок, который читает мой календарь. Он не упал. Он вернул «успех, ноль событий». Пустой ответ с галочкой «всё хорошо». Для остальной программы это неотличимо от честно пустого календаря: событий сегодня нет, отлично, свободный день, так и записываем.
Инструмент, который возвращает «успех, данных нет», опаснее того, который падает. Падение замечают. Пустому успеху верят.
Это проблема тихого сбоя, и она живёт везде, где есть автоматизация. Громкие сбои видят и чинят. Дорого обходятся тихие, когда компонент отдаёт нечто технически корректное и совершенно неверное, а каждый слой выше кивает и передаёт это дальше как факт.
Почему никто этого не поймал
Две причины, и обе кусают и реальные команды.
Во-первых, я ни разу не проверял пустой случай. Мой код спрашивал «не упало ли чтение календаря?», и ответ всегда был «нет», потому что пустой успех - это не сбой. Спрашивать надо было другое: «а имеет ли этот результат вообще смысл?» Ноль событий пять рабочих дней подряд - это не нормальное показание, это признак сломанного датчика. Я написал логику, которая ловит падение, и ничего, что ловило бы бессмыслицу.
Во-вторых, отчёт был слишком прямолинейным, чтобы что-то заподозрить. Он определял «свободный день» по одному полю: есть ли событие на сегодняшнюю дату, да или нет. Это одно узкое правило никак не могло заметить, что вся неделя вокруг забита поездками. Оно не считывало ситуацию. Оно считывало одну клетку, и клетка случайно оказалась пустой.
Починка в двух частях
Часть первая - сделать тишину громкой. Пустой результат от того чтения календаря теперь по умолчанию считается подозрительным. Когда данные выглядят неправдоподобно, полная рабочая неделя без единого дела, отчёт прямо говорит об этом, а не сглаживает в аккуратную фразу. Цель никогда не была в том, чтобы построить то, что не может сломаться, а в том, чтобы ломаться заметно для меня.
Часть вторая - перестать кодировать суждение в виде правила. Вместо одного поля «да или нет» я теперь передаю ассистенту окно из соседних дней и даю ему прочитать неделю так, как прочитал бы человек. «Вчера в отъезде, сегодня пусто, завтра в отъезде» читается как «всё ещё в дороге», а не «свободный день дома». Чем упорнее ты пытаешься жёстко прописать каждый крайний случай в негибкой логике, тем хрупче становится вся конструкция. Дай модели настоящий контекст и ясный вопрос - и получишь суждение, а не справочный запрос.
Что я сделал бы иначе
Я написал бы проверку на подозрительную пустоту в первый же день. Она стоит минут десять и это самая полезная привычка, какую я знаю в любой автоматизации. Реши заранее, как выглядит невозможный-но-валидный результат, и заставь систему кричать, как только она такой увидит. Не «упало или нет», а «правдоподобен ли вообще этот ответ». Неверные ответы с приколотым значком успеха будут сидеть и выглядеть здоровыми ровно столько, сколько ты им позволишь.
Менеджерская версия этого урока не имеет отношения к календарям. Любой автоматический отчёт, дашборд или ИИ-сводка, на которые опирается твоя команда, способны сделать ровно то же, что и мои: продолжать работать, выглядеть здоровыми и тихо подсовывать тебе цифры, которые после какого-то изменения наверху уехали в бессмыслицу, а связь с тем изменением никто не провёл. «Пайплайн отработал» - это не «пайплайн был прав». Спрашивать у того, кто отвечает за регулярный автоматический результат, нужно не «оно работает?». А «как мы поймём, если оно начнёт нам врать?».
Так что вот мысль, которую стоит обдумать: какой автоматический отчёт твоя команда читает каждую неделю, но больше никто не перепроверяет? Именно он сейчас с наибольшей вероятностью тихо врёт.
Нужно что-то похожее для вашего бизнеса? Посмотрите, как я могу помочь →
Заберите чек-лист «AI Audit Kickoff»
Пятнадцать вопросов, которые стоит задать про свои процессы, прежде чем тратить деньги на ИИ. Тот самый первый час, с которого я начинаю настоящий аудит, одностраничным PDF. Оставьте почту и получите его сразу, плюс изредка письмо, когда напишу что-то стоящее. Без спама, отписка в один клик.