← AI-native IDEs: Cursor, Copilot, and the new editor workflow
05 / 07 · 40 min

Reviewing inline edits without rubber-stamping

The discipline of reviewing AI diffs: why Accept All is a trap, red flags in generated edits, small batches, checkpoints, and questions to the agent as a verification tool.

Lesson content is currently available in Russian.

What you will learn

  • →Читать AI-диффы в правильном порядке и находить типовые красные флаги.
  • →Держать размер партий изменений обозримым для честного ревью.
  • →Использовать вопросы к агенту и тесты как инструменты проверки, а не верить «готово».

Почему Accept All — ловушка

Кнопка Accept All — самая опасная кнопка AI-редактора не потому, что агент плохо пишет код, а потому, что она эксплуатирует слабость человека: склонность доверять автоматике (automation bias). Когда дифф выглядит аккуратно, компилируется и сопровождается уверенным объяснением, мозг охотно ставит галочку «выглядит нормально» — это и есть rubber-stamping, ревью-штамповка без чтения.

Проблема усугубляется асимметрией скоростей: агент генерирует код в десятки раз быстрее, чем вы его понимаете. Если принимать всё подряд, в кодовой базе накапливается долг понимания — код, который работает, но который никто в команде не сможет объяснить, поправить или отладить в три часа ночи при инциденте. Известный эффект обычного код-ревью здесь работает против вас вдвойне: чем длиннее дифф, тем поверхностнее его читают. На дифф в 10 строк ревьюер найдёт три замечания, дифф в 500 строк получит «LGTM».

И главное про ответственность: авторство не делегируется. В git blame будет ваше имя, на постмортеме «это написал AI» — не аргумент. Отсюда базовое правило курса: не принимайте дифф, который не готовы объяснить коллеге строка за строкой. Если объяснить не можете — вы ещё не закончили ревью, каким бы зелёным ни был прогон тестов.

Дисциплина чтения диффа

Читайте AI-дифф в фиксированном порядке — это быстрее и надёжнее хаотичного скролла. Шаг один: список затронутых файлов. Ещё до чтения строк спросите: ожидал ли я каждый из этих файлов? Файл вне области задачи — первый и самый дешёвый красный флаг. Шаг два: тесты. Изменённые assertions, удалённые кейсы, ослабленные проверки — агент мог «починить» тест подгонкой под неверное поведение. Шаг три: реализация, файл за файлом, hunk за hunk-ом.

Типовые красные флаги, которые надо распознавать на автомате: пустой catch или .catch(() => {}) — проглоченная ошибка; выдуманные API и импорты из несуществующих модулей — компилятор поймает, но в динамических языках дойдёт до рантайма; заглушки вместо реализации — TODO, захардкоженный ответ, mock, оставшийся в проде; новые зависимости в package.json, которых никто не просил; «попутные» рефакторинги — переименования и переформатирования, раздувающие дифф вокруг настоящего изменения; и удаление кода, смысла которого агент не понял, — особенно обработчиков граничных случаев.

Каждый флаг — не приговор, а вопрос: либо к агенту («зачем изменён этот файл?»), либо действие — отклонить конкретный hunk, оставив остальное. Инструменты это позволяют: и Cursor, и VS Code дают принимать дифф пофайлово, а git add -p — выборочно стейджить куски.

Маленькие партии, чистое дерево, checkpoints

Лучший способ упростить ревью — уменьшить то, что надо ревьюить. Размер партии — ваш главный рычаг: задача «добавь фильтр по дате в список заказов» породит обозримый дифф, задача «сделай фильтры, сортировку и пагинацию, заодно почисти стили» — простыню, которую вы физически не сможете честно прочитать. Правило: одна задача агенту — один логический шаг — один коммит после ревью.

Второе условие честного ревью — чистое git-дерево перед запуском агента. Если в рабочем каталоге уже лежат ваши незакоммиченные правки, после прогона агента вы не отличите своё от его. git status до запуска, git diff после — граница авторства всегда видна. Никогда не позволяйте агенту коммитить вперемешку с вашим WIP, и не используйте git add . после агентного прогона — стейджьте файлы поимённо.

Третий слой страховки — контрольные точки инструмента: checkpoints в Cursor с кнопкой Restore, Undo правок в VS Code. Они спасают внутри сессии, но не заменяют git: коммит после каждого принятого шага — это точка, к которой можно вернуться завтра, с другой машины, после краха редактора. Экспериментальные прогоны агента удобно делать в отдельной ветке: не понравился результат — ветка удаляется, история осталась чистой. Дёшево создать, дёшево выбросить — именно так и выглядит безопасная работа с агентом.

Вопросы к агенту как инструмент ревью

Агент — не только автор правок, но и бесплатный собеседник по их поводу. Используйте это. Первый приём — объяснение диффа: «пройди по диффу и обоснуй каждое изменение; отдельно объясни, зачем тронут файл X». Несостыковки в объяснении находят баги быстрее, чем чтение кода в тишине. Второй — самокритика: «найди три слабых места в своём диффе: граничные случаи, гонки, ошибки типов». Модель, переключённая из режима автора в режим критика, регулярно находит собственные огрехи. Третий — вопрос «что может сломаться в проде после этого изменения?» — дешёвый способ получить список рисков для проверки.

Сильнейший из приёмов — тест до фикса. Попросите агента сначала написать тест, воспроизводящий баг, убедитесь, что тест падает, и только потом разрешите чинить. Красный тест, ставший зелёным, — доказательство, что исправлено именно то, что было сломано, а не подогнан симптом.

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

Practice

Ревью-протокол на реальном диффе

Дайте агенту среднюю задачу в своём репозитории (10–30 строк изменений в 2–4 файлах). Проведите ревью по протоколу урока: список файлов → тесты → реализация; зафиксируйте каждый найденный красный флаг; задайте агенту минимум два проверяющих вопроса; завершите собственным прогоном тестов.

Deliverable

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

Checkpoint

Покажите свой протокол ревью и объясните: какие красные флаги вы искали, что нашли, как использовали вопросы к агенту и чем доказано рабочее состояние после принятия диффа?

  • ✓ Ревью проведено в порядке: файлы → тесты → реализация, а не хаотичным скроллом.
  • ✓ Назван хотя бы один конкретный красный флаг из списка урока и действие по нему.
  • ✓ Финальное состояние доказано выводом команд, а не словами агента.

Check yourself

Что такое rubber-stamping в контексте AI-правок?

01Что такое rubber-stamping в контексте AI-правок?

С чего начинается дисциплинированное чтение AI-диффа?

02С чего начинается дисциплинированное чтение AI-диффа?

Какой из фрагментов — классический красный флаг проглоченной ошибки?

03Какой из фрагментов — классический красный флаг проглоченной ошибки?

Зачем нужно чистое git-дерево перед запуском агента?

04Зачем нужно чистое git-дерево перед запуском агента?

Что доказывает, что баг исправлен именно там, где был?

05Что доказывает, что баг исправлен именно там, где был?

Sources

Reviewing inline edits without rubber-stamping · AI-native IDEs: Cursor, Copilot, and the new editor workflow · VORCL