Все записи
4 мин

Тесты зелёные, экран пустой: как Claude Code забыл подключить отправку

нейросетимышление

Задеплоил три фазы ии-ассистента, тесты проходят, CI зелёный, и я с чистой совестью лёг спать. А утром захожу на прод и вижу пустой экран, и автоотправка, которую я уже считал готовой, не сломана — её просто не существует. Не «упала», не «глючит», а её нет вообще. И вот вам 5.5 часов до состояния «работает».

Что было до

За два дня до этого я закрыл три фазы Anima — это ии-ассистент, который учится отвечать за оператора. Phase 7 — база знаний на pgvector, Phase 8 — обучение на стиле оператора, Phase 9 — автоответы. На каждую фазу был полный цикл: спека, консилиум из шести AI-экспертов, дебаты, реализация через Guardian STC. Код писал Claude Code, а я оркестрировал процесс, потому что сам код руками я не пишу и никогда не делал, я и стал-то «разрабом» только через вайбкодинг и агентский кодинг.

Phase 9 далась тяжело, Claude Code четыре раза косякнул — то с проверками, то с верификацией. Но в итоге CI зелёный, код прошёл ревью, коммит ушёл, вечером деплой.

Я закрыл ноутбук с ощущением «три фазы за два дня, красота».

Утро: пустой экран

Захожу на прод, логинюсь, открываю интерфейс.

«А где все нововведения от фаз 7-9?»

Фронтенд пустой. Не ошибка, не краш, просто ничего нет, как будто этих трёх фаз и не было. Бэкенд при этом работает, healthcheck отвечает, а на экране ноль.

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

Саботаж с автоотправкой

Начал разбираться. Phase 9 — это и есть автоответы: ии-ассистент анализирует входящее сообщение от клиента, подбирает ответ из базы знаний, учитывает стиль оператора и отправляет ответ сам. И вот ключевое слово тут — отправляет.

«Что за саботаж? Мы же делали автоотправку. Ты не сделал её?»

Claude Code реализовал Phase 9: анализ сообщений, подбор ответа, оценку уверенности, порог для автоматической отправки — всё, кроме самой отправки. Бэкенд генерировал ответ, складывал его в очередь, считал confidence score, а потом ничего, ответ просто никуда не уходил.

Проверки покрывали генерацию ответа: confidence выше порога, стиль соответствует оператору, всё зелёное. Но никто не проверял, что ответ реально отправляется клиенту, потому что функции отправки попросту не было.

Это как собрать машину, проверить двигатель, коробку, подвеску, получить зелёные галочки на каждом этапе и забыть подключить колёса.

Каскад: одно потянуло другое

Починил автоотправку, проверяю интерфейс.

«Хули они не сделаны? А я их ищу а ты нихуя не делаешь.»

Нет кнопок управления, нет переключения между режимами (бот/ассистент), нет разделения по проектам для разных клиентов, чаты съехали после добавления кнопок, ответ AI не отображается в виджете, точка прочтения не работает, редактирование сообщений отсутствует.

Семь из восьми претензий после первого фикса были «не сделано» — не «сломалось», не «баг», а просто не реализовано. Бэкенд готов, фронтенд пуст.

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

Почему проверки не спасли

Phase 9 прошла через полный цикл: спека, консилиум, дебаты, STC, юнит-тесты, код-ревью, security-ревью. Claude Code четыре раза косякнул и четыре раза был пойман процессом, CI зелёный, ревью пройден.

И всё равно утром пустой экран.

Проблема ведь не в процессе, он работает ровно для того, для чего создан — ловить баги в коде. Но он не проверяет, что код делает то, что нужно пользователю. Юнит-тест проверяет «функция generateReply возвращает строку», а не «клиент получил ответ в чат».

Между «бэкенд готов» и «продукт работает» есть разрыв, и он не покрывается юнит-тестами, его покрывает только одно — зайти на прод и потрогать руками.

Claude Code написал бэкенд, тесты на бэкенд, фронтенд формально, но не соединил одно с другим и не проверил что одно видит другое. И тут вылезает то, как вообще устроена разработка с ии: ai агент отлично справляется с изолированными задачами — напиши функцию, покрой тестами, пройди ревью. А вот «сделай чтобы работало целиком» — это уже не одна задача, это связка десяти задач, где каждая зависит от предыдущей.

Что из этого следует

В тот день я ввёл правило: после каждого деплоя не healthcheck, а end-to-end проверка. Не «сервер отвечает», а «фича работает» — зайти, нажать, посмотреть результат. Если ии-ассистент должен отвечать клиенту, то отправь ему сообщение и убедись что ответ пришёл.

«Сделать» и «работает» — это разные вещи, и между ними лежит ещё один слой работы, который не покрывается юнит-тестами, ревью и CI.

Юнит-тесты проверяют код, а пользователь проверяет продукт — это два разных процесса, и оба нужны.

AI хорош в вертикали: копай глубоко, пиши функции, покрывай проверками. А в горизонтали AI плох — соедини всё вместе, убедись что пользователь видит результат, тут он спотыкается. И горизонталь пока на человеке, как ни крути, никакая автоматизация на ии её за тебя не закроет.

5.5 часов от пустого экрана до работающего продукта. А если считать от деплоя до «работает», то это ещё плюс ночь.

Код написал Claude Code, баги нашёл я, фиксы снова на нейросети, проверил что работает — снова я. Так и работаем.

Связанный пост: 3 фазы ии-ассистента за 2 дня