ИИ-агент пишет код быстрее меня. Это правда, и спорить с ней бессмысленно. Но у агента есть особенность: он уверен в себе всегда. Даже когда переименовал поле в одном месте из трёх. Даже когда «починил» тест, удалив проверку. Поэтому вопрос не в том, пользоваться ли ИИ, а в том, что его останавливает.
В платформе, которую я строю (B2C-сервис бытовых услуг, название под NDA), ответ такой: тесты, хуки и ревью. Ниже — как это устроено.
Тест к каждому изменению
Правило простое: изменение без теста не попадает в main. Не «желательно», а обязательно. Сейчас в проекте больше 1 800 тестов на node:test — от функций расчёта цены до прав доступа.
Звучит как бюрократия, но работает наоборот. Когда агент предлагает правку, я не читаю каждую строку с подозрением — я смотрю, какой тест он добавил и падал ли этот тест до правки. Если тест зелёный с первого раза, он ничего не доказал, и это повод разобраться.
Хуки-ограничители
Агенту можно объяснить правила словами. Он их даже запомнит — до следующего длинного контекста. Поэтому самые важные правила у меня не в тексте, а в хуках, которые физически не дают сделать опасное:
- нельзя править уже применённую миграцию базы — только писать новую;
- нельзя печатать секреты в вывод;
- нельзя делать
git add -Aиcommit -a— в коммит попадает только то, что действительно менялось.
Хук не устаёт и не соглашается «ну один раз можно». Для меня это главный инструмент доверия к агенту.
Агенты-ревьюеры
Код от агента проходит то же ревью, что и мой. Плюс отдельные агенты-ревьюеры с узкими задачами: безопасность, UX, SEO. Каждый смотрит на изменение только со своей стороны и не отвлекается на остальное.
Важная деталь: ревьюер советует, а решение принимаю я. Агент-ревьюер может найти проблему, которой нет, — так же уверенно, как агент-автор пишет код с проблемой. Два уверенных агента не дают одного правильного ответа, поэтому последнее слово за человеком и тестами.
e2e по ролям
Юнит-тесты проверяют кусочки. Но пользователь не пользуется кусочками — он проходит путь. В проекте 46 e2e-сценариев на Playwright, разложенных по ролям: клиент, исполнитель, оператор. Каждый проходит свой путь в настоящем браузере.
Это ловит то, что не видно по отдельности: кнопка есть, API работает, но оператор с одной ролью видит то, что должен видеть только оператор с другой.
CI на своём сервере
Всё это гоняется в GitHub Actions на собственном runner на VPS. Ветки, PR, в main — только зелёное. Свой runner — это не про экономию, а про контроль: окружение такое же, как в проде, и я знаю, что в нём стоит.
Что в итоге
ИИ дал мне скорость, которую раньше давала только команда. Но скорость без тормозов — это не скорость, а авария с задержкой. Тесты, хуки и ревью — те самые тормоза.
Формула, к которой я пришёл: агент пишет быстро, тесты проверяют честно, отвечаю я. Если какая-то из трёх частей выпадает, лучше остановиться. Нейросеть не придёт на разбор инцидента — приду я.