Агент написал «Готово». Почему ИИ-агенты сдают сломанные системы и что их на самом деле останавливает
Автор: Anastasiia Butova, инженер по ComfyUI и диффузионным моделям, Белград · опубликовано 2026-10-28
Перевод английской версии: English
ИИ-агент очень хорошо работает с файлом, который у него перед глазами. Он читает функцию, меняет её, запускает тесты и пишет «Готово». Беда в том, чего файл не показывает: другая программа, которая читает то же значение; версия Python, на которой агент не запускал код; проверка, которая никогда не могла упасть. Почти всё сломанное, что сдавали наши агенты, было не плохим кодом. Это был правильный код в системе, на которую никто не посмотрел целиком. Ниже пять способов так ошибиться — все за один день релиза Crossweft — и проверка, которая поймала каждый.
1. Другая сторона шва
Значение, написанное руками в двух местах, — это шов: маршрут, который вызывает клиент и регистрирует сервер, строка версии, поля DTO, имя действия на кнопке и таблица, которая его разбирает. Поменяйте одну сторону, и все локальные проверки останутся зелёными. Компилятор видит один язык за раз, а тесты каждого компонента проверяют только этот компонент.
Агенту незачем открывать другую сторону: ничто не говорит ему, что она есть. На этой идее стоит Crossweft и наша первая статья о нём, Каждому рукописному шву нужен страж: записать швы картой, дать каждому стража, который читает обе стороны, и после каждой правки говорить агенту, какой файл на другой стороне перечитать. Самый новый страж ведёт каждую кнопку до обработчика и маршрута API; что он нашёл, мы описали в статье Кнопка, которая ничего не вызывает, всё равно собирается.
2. Проверка, которая не умеет краснеть
Зелёная проверка доказывает только те случаи, которые кто-то придумал. На ревью перед релизом независимый ревьюер дал новому стражу кнопок карту, которую мы не придумали: обработчик собирает адрес как "/v1/" + kind. Проверка её пропустила: путь, который кончается на /, читался как «любой маршрут под /v1/». Все тесты были зелёными, и собственные пробы автора тоже, потому что они проверяли те случаи, которые автор держал в голове.
Исправление было небольшим. Важнее правило за ним: у каждой проверки должен быть негативный контроль — вход, на котором она обязана упасть. Если проверку не удаётся сделать красной, вы не знаете, работает ли она. Теперь мы сначала пишем красный случай, видим, как он падает, и только потом чиним.
3. Среда, в которой агент не запускал код
Релиз прошёл все тесты на машине, где его собирали. Затем публичный CI упал на Python 3.9 на всех трёх операционных системах: 17 ошибок, одна причина. Тестовый помощник вызывал Path.write_text(newline=...), а этот аргумент есть только с Python 3.10. На машине агента стоят 3.12 и 3.14.
Эта ошибка доходила до нашего CI уже во второй раз, поэтому теперь она стала тестом: проверка исходников падает на любом вызове write_text( с newline=. Агент ничего не помнит между сессиями. Репозиторий помнить может, но только в той форме, которая запускается.
4. Оценивать собственную работу
Автор исправления — худший, кто может сказать, что исправление полное. Автор проверяет ту модель задачи, которую уже держит в голове, и так же устроена каждая его проба. В ревью выше проверки автора соглашались с автором. Ревьюер в свежем контексте, получивший только код и никаких объяснений, нашёл дыру.
Поэтому наше правило механическое, а не вежливое. Всё, что трудно откатить, перед выпуском проверяет отдельный агент: свежий контекст, без доступа к рассуждениям автора, вердикт PROCEED, HOLD или REJECT. Перед этим релизом это заняло четыре вердикта за два дня. Два из них были HOLD, и каждый сделал релиз лучше.
5. «Готово» как слово
Агент останавливается, когда решает, что закончил, и говорит «Готово». Просьба в промпте быть внимательнее помогает какое-то время, а потом тает, пока заполняется контекст. Проверка, которая запускается, когда агент пытается остановиться, не тает.
Стоп-хук Crossweft запускает проверку швов до того, как агенту можно закончить, и не даёт остановиться, пока шов расходится. Другие наши хуки делают то же для красных тестов и для хендофа, который прячет недоделанное. В конце того же дня, уже после релиза, они поймали ещё две дыры: старую версию инструмента, установленную не для того пользователя, и файл навыка, не пересобранный после обновления. Каждая заняла минуту, потому что хук назвал её прямо.
Что общего у всех пяти
Ни одну из этих ошибок не было видно из файла, который правил агент. И каждое исправление переносило знание из головы агента в то, что запускается: карту, негативный контроль, матрицу CI, свежего ревьюера, хук. Подробнее об этом переносе — в статье Три идеи из новостей об агентах, превращённые в проверки.
У этого есть цена. Карту надо поддерживать, круг ревью занимает время. Статические проверки доказывают связи, а не поведение. Но иначе вы узнаёте от пользователя, что кнопка ничего не делает.
Если вы работаете с ИИ-агентами над системой из нескольких языков или компонентов, в блоке рядом со статьёй четыре команды, чтобы начать: установить, инициализировать, найти уже существующие швы и дать агенту разметить остальное.