Перевірка коду, написаного AI: чому ми тестуємо його в чистому клоні
Код, який написав агент, може пройти всі тести на вашій машині й зламатися будь-де інде, бо він тихо залежить від файлів, які ніколи не комітили. Перевіряйте його двічі: спершу прочитайте діф, потім запустіть тести в свіжому клоні того, що збираєтеся змерджити.
🎯 Для Розробник або рев’юер, який приймає код, написаний AI-агентом, — так званий vibe coding
- Чому зелені тести на машині автора майже нічого не доводять
- Процедура рев’ю, де тест у чистому клоні слугує брамою
- Як безпечно відкотити зміни, якщо щось таки проскочило
🎲 Ризик у коді, якого ви не писали
Vibe coding означає приймати згенерований код, бо він начебто працює. Це швидко, і для одноразового скрипта цілком годиться. Проблеми починаються, коли та сама звичка переходить у спільний код. Агент працює у вашому робочому дереві, де лежать змінені й незакомічені файли, локальні налаштування та закешовані результати. Тести, які він запускає, усе це бачать. Колега, який зробить checkout цього коміту, не побачить нічого з цього.
🧾 Один інцидент у числах
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.
Джерела
- Суддівство AI: чому «воно каже, що готово» — це не приймання: приймання за перевірками.
- Розробка за специфікацією з наявними пакетами завдань: передача роботи разом із критеріями.
- Квитанції завдань агента: що вони доводять: що квитанція показує про запуск.
- Відновлення після невдалого, завислого чи невизначеного запуску: що робити, коли запуск пішов не так.
🔗 Зв'язки статті
Відкрити повний граф знань ↗Зв’язки опублікованих статей. Виберіть вузол, щоб відкрити статтю біля заголовка.
Зв’язки статей · клавіатура / текст
Та сама тема
- Векторна база — це мапа, а не джерело: що ми з'ясували про пошук
- Коли невідомо, скільки коштував виклик моделі: заморожування, потім звіряння
- Розбиття великого завдання для дешевої моделі: урок про 24 000 байтів
- Навички, інструменти MCP і правила: три способи дати агенту можливості
- Вісім помилок з shell і git, яких припускалися наші агенти, і правило для кожної
- Кілька агентів, один репозиторій: правила володіння з реальних інцидентів
Наступні кроки
Пов'язані матеріали
Векторна база — це мапа, а не джерело: що ми з'ясували про пошук
Векторна база знаходить уривки, близькі за змістом до вашого запиту. Вона не знає, які з них правдиві чи актуальні. Сприймайте кожен результат як вказівник: відкрийте названий файл, перевірте хеш і беріть числа з артефакту, а не зі знайденого абзацу.
AI agents and MCP explainedКоли невідомо, скільки коштував виклик моделі: заморожування, потім звіряння
Іноді виклик моделі перевищує час очікування, і ви не знаєте, чи провайдер списав кошти. Ніколи не записуйте це як нуль. Позначте витрату як непевну, зупиніть нові платні виклики й доручте названій людині звірити її з випискою провайдера. Виняток — відмови, що сталися до генерації.
AI agents and MCP explainedРозбиття великого завдання для дешевої моделі: урок про 24 000 байтів
Дешева модель добре дає раду з однією невеликою чітко окресленою роботою, але погано з великим нагромадженням. Ми обмежуємо завдання 24 000 байтами і відмовляємо більшим ще до виклику моделі. Діліть на одиниці — один файл або одна країна на завдання — і перевіряйте розмір до початку.
AI agents and MCP explainedНавички, інструменти MCP і правила: три способи дати агенту можливості
Агенти отримують можливості по-різному. Правило обмежує те, що вони роблять, навичка підказує, як виконати роботу, а інструмент MCP дозволяє викликати функцію. Кожен із трьох має власний ризик, тож фіксуйте всі три в реєстрі й перевіряйте тестом, що нічого не існує поза ним.
💬 Коментарі