ИИ переписал 99% системы — и всё равно провалил миграцию — 26 августа 2026 г. в 12:35:29.948
ИИ переписал 99% системы — и всё равно провалил миграцию У бенчмарков для агентов в разработке обнаружилась слепая зона. Представим, что ИИ поручили переписать библиотеку с C на Rust. Обычные тесты проверяют поведение программы. Но исходная версия уже работает — значит, агент может вообще ничего не переписывать и всё равно получить 100%. Тесты видят, что программа работает, но не видят, была ли выполнена миграция. Чтобы решить эту проблему, исследователи собрали SWE Refactor Bench: 20 полных миграций реальных репозиториев общим объёмом 867 тысяч строк. Среди них: ▪️cmark с C на Rust; ▪️zlib с C на Java; ▪️go-yaml с Go на Zig; ▪️Conduit с Vue на React; ▪️GraphHopper с Dropwizard на Spring Boot; ▪️SQLite с POSIX на WebAssembly/WASI; ▪️libsodium с Autotools на CMake; ▪️Gson с Maven на Gradle. На одну попытку агентам давали от 6 до 30 часов. Затем результат проходил три этапа проверки: 1. Старый стек действительно удалён. 2. Пройдены все 130 118 фиксированных проверок. 3. Шесть независимых агентов не нашли новых расхождений с оригиналом. Из 520 запусков восьми фронтирных моделей все этапы прошли только 28 — 5,4%. Для 13 из 20 задач не нашлось ни одного принятого решения. Авторы проверили Claude Opus 5 и Sonnet 5, GPT‑5.6 Sol и Luna, Kimi K3, Qwen 3.8 Max, DeepSeek V4 Flash и GLM‑5.2. Почему ломался последний процент? Потому что миграция должна воспроизвести не только основную логику, но и тысячи мелких особенностей старой системы. При переносе Conduit с Vue на React четыре модели прошли 21 768 проверок из 21 769. Все пропустили одну деталь адресов: старая версия автоматически добавляла к ним символ #, а новая — нет. В результате сохранённые закладки и опубликованные ссылки могли перестать открываться. При переводе сборки PyCryptodome с setuptools на Meson пять моделей получили 380 из 381. Сам пакет работал, но в него не попало текстовое описание проекта. После публикации его страница на PyPI оказалась бы пустой. А дополнительные агенты находили случаи, о которых авторы тестов не подумали заранее. Например, SQLite при работе с базой создаёт рядом два служебных файла. После завершения операции оригинальная версия удаляла оба, а перенесённая на WebAssembly — только один. Основные запросы к базе работали, но после определённой последовательности действий на диске оставался лишний файл. Один из агентов сам придумал эту последовательность, запустил её на обеих версиях и показал разницу. Была и противоположная проблема: иногда агент сохранял поведение, но выполнял миграцию лишь формально. В одной попытке переноса cmark с C на Rust прошли все 4 184 проверки. Однако внутри Rust-кода агент почти буквально воспроизвёл устройство старой C-версии — те же структуры и ручную работу с памятью через небезопасный режим Rust. По правилам бенчмарка это была не полноценная новая реализация, а старый код, переложенный на синтаксис другого языка. Даже идеального результата оказалось недостаточно: из 88 вариантов, прошедших все фиксированные тесты, дополнительные агенты сломали 60. Медианное время до воспроизводимого контрпримера составило 17 минут. @anti_agi

