Задеплоил три фазы AI-ассистента. Тесты проходят. CI зелёный. Захожу на прод утром. Пустой экран. Автоотправка, которую я считал готовой, не существует. Не сломана. Не существует. 5.5 часов до состояния «работает».
Что было до
За два дня до этого я закрыл три фазы Anima (AI-ассистент, который учится отвечать за оператора). Phase 7: база знаний на pgvector. Phase 8: обучение на стиле оператора. Phase 9: автоответы. На каждую фазу был полный цикл: спека, консилиум из шести AI-экспертов, дебаты, реализация через Guardian STC. Claude Code написал код, я оркестрировал процесс.
Phase 9 далась тяжело. Claude Code четыре раза косякнул: с проверками, с верификацией. Но в итоге CI зелёный, код прошёл ревью, коммит ушёл. Деплой вечером.
Я закрыл ноутбук с ощущением «три фазы за два дня, красота».
Утро: пустой экран
Захожу на прод. Логинюсь. Открываю интерфейс.
«А где все нововведения от фаз 7-9?»
Фронтенд пустой. Не ошибка. Не краш. Просто ничего нет. Как будто трёх фаз не было. Бэкенд работает, healthcheck отвечает. А на экране ноль.
Это хуже, чем красный экран с ошибкой. Ошибку видно. Пустоту нужно заметить. Если бы я не зашёл проверить руками, мог бы неделю думать что всё работает.
Саботаж с автоотправкой
Начал разбираться. Phase 9 это автоответы. AI анализирует входящее сообщение от клиента, подбирает ответ из базы знаний, учитывает стиль оператора и отправляет ответ сам. Ключевое слово: отправляет.
«Что за саботаж? Мы же делали автоотправку. Ты не сделал её?»
Claude Code реализовал Phase 9: анализ сообщений, подбор ответа, оценку уверенности, порог для автоматической отправки. Всё. Кроме самой отправки. Бэкенд генерировал ответ, складывал его в очередь, считал confidence score. А потом ничего. Ответ никуда не уходил.
Проверки покрывали генерацию ответа. Confidence выше порога. Стиль соответствует оператору. Но никто не проверял, что ответ реально отправляется клиенту. Потому что функции отправки не было.
Это как собрать машину, проверить двигатель, коробку, подвеску, получить зелёные галочки на каждом этапе. И забыть подключить колёса.
Каскад: одно потянуло другое
Починил автоотправку. Проверяю интерфейс.
«Хули они не сделаны? А я их ищу а ты нихуя не делаешь.»
Нет кнопок управления. Нет переключения между режимами (бот/ассистент). Нет разделения по проектам для разных клиентов. Чаты съехали после добавления кнопок. Ответ AI не отображается в виджете. Точка прочтения не работает. Редактирование сообщений отсутствует.
Семь из восьми претензий после первого фикса были «не сделано». Не «сломалось». Не «баг». Просто не реализовано. Бэкенд готов, фронтенд пуст.
Каждый фикс тянул за собой следующую проблему. Добавил кнопки — чаты съехали. Починил чаты — ответ AI не показывается в виджете. Показал ответ — нет редактирования. Это не баги. Это недоделки, которые стали видны только когда продукт потрогал живой человек.
Почему проверки не спасли
Phase 9 прошла через полный цикл: спека, консилиум, дебаты, STC, юнит-тесты, код-ревью, security-ревью. Claude Code четыре раза косякнул и четыре раза был пойман процессом. CI зелёный. Ревью пройден.
И всё равно утром пустой экран.
Проблема не в процессе. Он работает для того, для чего создан: ловить баги в коде. Но не проверяет, что код делает то, что нужно пользователю. Юнит-тест проверяет: «функция generateReply возвращает строку». Не проверяет: «клиент получил ответ в чат».
Между «бэкенд готов» и «продукт работает» есть разрыв. И он не покрывается юнит-тестами. Его покрывает только одно: зайти на прод и потрогать руками.
Claude Code написал бэкенд. Тесты на бэкенд. Фронтенд формально. Но не соединил. Не проверил что одно видит другое. AI отлично справляется с изолированными задачами: напиши функцию, покрой тестами, пройди ревью. Но «сделай чтобы работало целиком» это не одна задача. Это связка десяти задач, где каждая зависит от предыдущей.
Что из этого следует
В тот день я ввёл правило: после каждого деплоя не healthcheck, а end-to-end проверка. Не «сервер отвечает», а «фича работает». Зайти, нажать, посмотреть результат. Если AI-ассистент должен отвечать клиенту — отправить ему сообщение и убедиться что ответ пришёл.
«Сделать» и «работает» — это разные вещи. Между ними лежит ещё один слой работы, который не покрывается юнит-тестами, ревью и CI.
Юнит-тесты проверяют код. Пользователь проверяет продукт. Два разных процесса, оба нужны.
AI хорош в вертикали: копай глубоко, пиши функции, покрывай проверками. AI плох в горизонтали: соедини всё вместе, убедись что пользователь видит результат. Горизонталь пока на человеке.
5.5 часов. От пустого экрана до работающего продукта. Если считать от деплоя до «работает», это ещё плюс ночь.
Код написал Claude Code. Баги нашёл я. Фиксы снова на нейросети. Проверил что работает — я. Так и работаем.
Связанный пост: 3 фазы AI-ассистента за 2 дня