Ревью кода, написанного ИИ: зачем проверять его в чистой копии
Код от агента может пройти все тесты на вашей машине и упасть везде, потому что тихо зависит от файлов, которые так и не закоммитили. Смотрите код дважды: прочитайте дифф, затем запустите тесты в свежей копии того, что собираетесь влить.
🎯 Для Разработчик или ревьюер, который принимает код, написанный ИИ-агентом (его часто называют vibe coding)
- Почему зелёные тесты у автора мало что доказывают
- Порядок ревью, где решает проверка в чистой копии
- Как безопасно откатить, если ошибка проскочила
🎲 Риск кода, который вы не печатали
Vibe coding — это принятие сгенерированного кода потому, что он вроде работает. Это быстро, и для одноразового скрипта нормально. Беда начинается, когда та же привычка доходит до общего кода. Агент работает в вашем рабочем дереве, где лежат файлы, которые вы изменили и не закоммитили, локальные настройки и кэш. Тесты, которые он запускает, видят всё это. Коллега, получивший коммит, ничего этого не видит.
🧾 Один случай в цифрах
14 октября 2026 агент перенёс в git модуль аналитики на 1 123 строки из снимка живого сервера. В рабочем дереве модуль проходил 56 тестов из 56. В чистой копии того же коммита падали 10 из 56: модуль зависел от неотслеженных правок соседнего файла. Коммит откатили в тот же день. Следом случилась вторая ошибка: у команды отката нет флага тихого режима, первая попытка не удалась, и затем --amend переписал чужой коммит.
В диффе ничего не выглядело неправильным. Беда была в том, чего в диффе нет.
🔍 Порядок ревью
Читать дифф необходимо, но недостаточно. У нас пять ворот.
- Объём. Дифф затрагивает только файлы, названные в задаче? Неожиданные пути, удалённые файлы и изменённые права — первое, на что смотрят.
- Чтение. Ревьюер может объяснить, что делает каждая новая функция и что она возвращает на плохом входе? Если нет — код ещё не принят.
- Чистая копия. Создайте свежее рабочее дерево от целевой ветки, примените только этот коммит и запустите там тесты. Прохождение в рабочем дереве не считается.
- Коды возврата. Запускайте команду тестов без конвейера.
pytest | tail -1 && git commitкоммитит на красном, потому что код возврата принадлежитtail. - Откат готов. Знайте команду, которая отменяет изменение, до слияния и проверьте её на временной ветке.
🛠️ Практика: настройте ворота чистой копии
- Выберите один репозиторий, куда пишут агенты.
- Напишите короткий скрипт: создаёт временное рабочее дерево от целевой ветки, применяет коммит-кандидат, запускает тесты и удаляет дерево.
- Пусть скрипт завершается с ненулевым кодом при любом упавшем тесте и при неожиданном файле в статусе.
- Прогоните его на последних пяти коммитах агента. Запишите, сколько упало.
- Сделайте скрипт обязательным шагом перед слиянием. Прохождение у автора — информация, а не одобрение.
- Добавьте в инструкции агента правило: «показывай результат в чистой копии, а не локальный».
✅ Проверьте себя
- Возьмите коммит, зависящий от неотслеженного файла. Скрипт падает и называет недостающий импорт или файл.
- Внесите падающий тест и прогоните ворота через конвейер. Ворота всё равно падают: вы читаете код возврата самой команды тестов.
- Новый человек запускает ворота по README меньше чем за пять минут.
- Вы можете сказать, какой из последних десяти коммитов агента затронул путь, которого не было в задаче.
🚧 Когда это не работает
- Тесты, не проверяющие поведение. Чистая копия со слабыми тестами даёт чистый «зелёный» для сломанного кода. Агенты к тому же пишут тесты, которые сами проходят.
- Зависимость от окружения. Тест, которому нужны база, ключ или хост, в свежем дереве не пройдёт. Пометьте его явно и запускайте там, где это есть, а не лечите подделкой данных.
- Большие диффы. Дальше нескольких сотен строк ревью превращается в беглый просмотр. Просите изменения поменьше.
- Сгенерированный код, к которому вы не вернётесь. Одноразовому скрипту ворота могут быть не нужны. Решите это сознательно.
- Ревью той же моделью. Модель, написавшая код, часто с ним соглашается. Сначала детерминированная проверка, потом другой ревьюер.
📊 Доказательства
| Что измерено | Тесты в рабочем дереве и в чистой копии для одного модуля, написанного агентом |
| Когда | Случай 14 октября 2026; записи проверены 3 ноября 2026, 22:06 UTC |
| Артефакт | Наша история git: коммит отката от 14 октября 2026, 14:14 UTC, удаливший 1 123 строки, и запись в файле правил для агентов |
| Ограничение | Один случай. Он показывает форму сбоя, а не его частоту |
➡️ Дальше
Записывайте приёмку до начала работы по Разработке по спецификации на готовых пакетах задач и поймите, почему заявление об успехе не доказательство, в AI judging.
Источники
- AI judging: почему «он говорит, что готово» — не приёмка: приёмка по проверкам.
- Разработка по спецификации на готовых пакетах задач: передача работы с критериями.
- Квитанции задач агента: что они доказывают: что квитанция показывает о запуске.
- Восстановление после сбойного, зависшего или неопределённого запуска: что делать, когда запуск пошёл не так.
🔗 Связи статьи
Открыть полный граф знаний ↗Связи опубликованных статей. Выберите узел, чтобы открыть статью у заголовка.
Связи статей · клавиатура / текст
Та же тема
- Векторная база — это карта, а не источник: чему нас научил поиск
- Когда неизвестно, сколько стоил вызов модели: заморозка, затем сверка
- Как разбить большую задачу для дешёвой модели: урок 24 000 байт
- Навыки, MCP-инструменты и правила: три способа дать агенту возможности
- Восемь ошибок наших агентов в shell и git и правило на каждую
- Несколько агентов, один репозиторий: правила владения из реальных инцидентов
Следующие шаги
Связанные материалы
Векторная база — это карта, а не источник: чему нас научил поиск
Векторная база находит фрагменты, близкие по смыслу к вашему вопросу. Она не знает, какие из них верны или актуальны. Считайте каждое попадание указателем: откройте названный файл, сверьте хэш, а числа берите из артефакта, а не из найденного абзаца.
ИИ-агенты и MCP простыми словамиКогда неизвестно, сколько стоил вызов модели: заморозка, затем сверка
Иногда вызов модели обрывается по таймауту, и вы не знаете, списал ли провайдер деньги. Никогда не записывайте это как ноль. Пометьте как неопределённое, остановите новые платные вызовы и пусть названный человек сверит это с выпиской провайдера. Отказы до генерации — исключение.
ИИ-агенты и MCP простыми словамиКак разбить большую задачу для дешёвой модели: урок 24 000 байт
Дешёвая модель хорошо справляется с одной небольшой чёткой задачей и плохо — с большой кучей. Мы ограничиваем задачу 24 000 байт и отклоняем большие до вызова любой модели. Режьте по единицам — один файл или одна страна на задачу — и проверяйте размер до запуска.
ИИ-агенты и MCP простыми словамиНавыки, MCP-инструменты и правила: три способа дать агенту возможности
Агенты получают способности по-разному. Правило ограничивает, что они делают, навык говорит, как делать работу, а MCP-инструмент позволяет вызывать функцию. У каждого свой риск, поэтому объявляйте все три в реестре и проверяйте тестом, что ничего не существует вне списка.
💬 Комментарии