Кальтер / Блог

Как проверять код, написанный нейросетью, до запуска

Проверочный маршрут для AI-кода: требования, diff, тесты, зависимости, права и откат — до выполнения на реальных данных.

Материал подготовлен с помощью ИИ; источники и расчёты проверены редакцией ZASLON.

Три шага проверки сгенерированного кода: изменения, осмысленные тесты и контролируемый запуск.
Редакционная схема ZASLON. Условная иллюстрация процесса, не скриншот сервиса.

Код, предложенный нейросетью, проверяй как код от неизвестного автора: сначала пойми, что изменится, затем запусти проверки в изолированной среде. Факт, что проект собрался или один happy path сработал, не доказывает корректность, безопасность или сохранение прежнего поведения.

GitHub описывает Copilot code review как помощника, который анализирует pull request и предлагает исправления; документация также выделяет применение предложенных правок человеком (GitHub Copilot code review). В отдельной карточке Copilot Agents GitHub описывает возможности, ограничения и меры ответственного использования агентных функций. Это пример конкретного продукта, не замена ревью и не подтверждение качества любого сгенерированного кода.

Проверка в шесть шагов

1. Сверь изменение с требованием

Запиши ожидаемое поведение словами и условиями: какие входы поддерживаются, что должно происходить и чего не должно происходить. Попроси модель кратко перечислить файлы и поведение, которые она изменила. Сравни с реальным diff.

2. Прочитай diff целиком

Ищи неожиданные удаления, изменение конфигурации сборки, новые зависимости, изменение auth, сетевых адресов, платежей и миграций. Не принимай массовый форматирующий diff вместе с логикой: раздели изменения, чтобы видеть смысл.

3. Проверь границы доступа

Посмотри, кто может вызывать новый endpoint, читать данные и выполнять действие. Проверь, что секрет не встроен в клиент, ошибки не возвращают токены, а пользователь не может обратиться к чужому объекту изменив ID.

4. Проверь зависимости

Сверь имя, версию, источник и лицензию новых пакетов. Убедись, что код не исполняет установочный скрипт или shell-команду только потому, что модель это предложила. Lockfile и список зависимостей должны соответствовать ожидаемому изменению.

5. Добавь проверки по поведению

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

6. Проверь отказ и откат

Что происходит при пустом вводе, повторном запросе, сетевом сбое и ошибке провайдера? Можно ли безопасно откатить изменение? Для миграции данных нужен проверенный backup и план восстановления до запуска.

Практическая таблица

Область Вопрос перед запуском
Функция Выполняет ли код исходное требование без лишних действий?
Ввод Что будет с пустым, длинным или неверным значением?
Авторизация Проверяется ли право на каждый объект на сервере?
Секреты Нет ли ключей в frontend, логах, diff или примерах?
Данные Может ли операция повториться без дубликата или потери?
Зависимости Понятно ли, зачем добавлен каждый пакет?
Откат Как вернуть прежнее состояние?

Запускай новый код в тестовом окружении с фиктивными данными. Не используй продакшен-ключи и клиентские данные для первой проверки. Если в diff затронуты платежи, авторизация или удаление данных, отдай изменение второму человеку с предметным контекстом.

Что может сделать ИИ-ревьюер

Попроси указать только конкретные дефекты с файлом, условием воспроизведения и последствием. Затем сам проверь каждое замечание. Отсутствие комментариев агента не означает, что код безопасен: модель может пропустить дефект, не понять архитектуру или неверно оценить риск.

Регрессия часто появляется в соседнем сценарии. Если поменялся парсер даты, проверь пустое значение, timezone, дату на границе месяца и старые данные. Если поменялась авторизация, проверь и разрешённый запрос, и запрет на чужой объект. Если добавлен retry, проверь, что side effect не дублируется. Хороший тест исходит из контракта поведения, а не из того, какую функцию придумала модель.

Запускай форматтер, линтер, типы и тесты проекта, если они уже настроены, но воспринимай зелёный результат как покрытие этих проверок, а не сертификат безопасности. Посмотри на новые warnings и не подавляй их автоматически. Для зависимости проверь advisory и минимально нужную версию по официальному источнику пакета.

Перед merge попроси автора изменения объяснить риск и откат. Если сам не можешь объяснить весь diff, уменьши объём задачи и попроси модель разделить изменение на маленькие части.

Пример: меняется форма, но меняется ли правило?

Предположим, модель добавила поле isAdmin в API-ответ. Сначала сверь diff с требованием: зачем это поле нужно и кто его задаёт? Затем проследи источник роли на сервере и проверь, что endpoint запрещает обычному пользователю изменить чужую запись, даже если кнопка скрыта. После исправления запусти тесты трёх случаев: обычный пользователь, администратор и запрос с чужим ID. Сверь фактическое состояние данных, затем повторно просмотри diff, чтобы убедиться, что fix не добавил лишние права.

Если ИИ предложил новую библиотеку для одной строки логики, сравни её с уже имеющимися возможностями проекта и стоимостью обновления. Маленький diff не означает маленький риск: один middleware может менять все маршруты. Если код запускает миграцию, прочитай SQL отдельно и проверь сценарий rollback на копии базы.

Перед публикацией собери список действий, которые код теперь может выполнять, и сравни его с требованием. Для дополнительной проверки секретов смотри как держать API-ключи вне браузерного bundle.

Сохрани воспроизводимый review

Перед изменением зафиксируй branch/commit. После проверки сохрани вывод тестов и точные команды, но удали из логов переменные с секретами и приватные данные. Если модель выполнила команду, разберись, какие файлы она читала или меняла. Не запускай полученный из недоверенного источника скрипт от имени администратора.

Для маленькой правки достаточно короткого diff и теста по требованию; для миграции, авторизации или данных нужен владелец системы и план отката. Риск определяется тем, что код может сделать, а не тем, сколько строк он занимает.

Проектная разработка и AI-workflow — на странице MK Ultra.