Кейс · пилот в теневом режиме
12 реальных багов, 3 исполнителя, 36 квитанций.
Мы провели полный пилот на багах, которые реально исправили мейнтейнеры трёх open-source библиотек на Python. Два ИИ-агента получили только баг-репорт. ResultBond оценил каждый фикс скрытыми тестами, а нас самих оценила независимая проверка — полный набор тестов мейнтейнеров.
Как шёл пилот
- 1
12 задач из реальной истории
Каждая задача — коммит, в котором мейнтейнеры toolz, boltons или more-itertools исправили баг. Репозиторий зафиксирован на состоянии прямо перед фиксом.
- 2
Скрытые тесты, сначала доказанные
Тесты «чёрного ящика», переписанные из тестов мейнтейнеров. Инструмент пилота не запускался, пока каждый скрытый тест не падал на коде с багом, — он отклонил три наших первых черновика.
- 3
Три исполнителя на баг
Настоящий фикс мейнтейнеров и два ИИ-агента разной силы, которые видели только баг-репорт в один абзац. Всего 36 фиксов.
- 4
Независимый оценщик
Каждый фикс также прогнали через полный модуль тестов мейнтейнеров из коммита с фиксом — сотни тестов, которые ResultBond для решения не использовал. С этим «ревьюером» мы и сравниваем наши вердикты.
Все фиксы
Вердикты финального раунда. Приняты 11 из 12 фиксов агента A и 10 из 12 фиксов агента B; все фиксы мейнтейнеров прошли.
| Задача | Фикс мейнтейнеров | Агент A | Агент B |
|---|---|---|---|
| boltons-guiderator-size Неверные ограничения размера в GUIDerator | PASS | PASS | PASS |
| boltons-histogram-iqr Гистограммы падают при нулевом межквартильном размахе | PASS | PASS | PASS |
| boltons-pearson-zero Stats.pearson_type падает при нулевом знаменателе | PASS | PASS | PASS |
| boltons-relative-time-tz relative_time() ломается на датах с часовым поясом | PASS | PASS | PASS |
| mi-bucket-miss bucket выдумывает ключи при поиске | PASS | FAILсломаны существующие тесты | FAILсломаны существующие тесты |
| mi-ichunked-zero ichunked() ведёт себя неправильно при n=0 | PASS | PASSнезависимая проверка: FAIL | FAILсломаны существующие тесты |
| mi-one-falsy-exception one() и only() игнорируют «ложные» пользовательские исключения | PASS | PASS | PASS |
| mi-running-window размер окна в running_* не проверяется | PASS | PASS | PASS |
| toolz-interpose-empty interpose() падает на пустой последовательности | PASS | PASS | PASS |
| toolz-reduceby-init reduceby() должна принимать вызываемый init | PASS | PASS | PASS |
| toolz-topk-stable topk() нестабильна при равных ключах | PASS | PASS | PASS |
| toolz-topk-tuple topk() должна возвращать кортеж собственной реализацией | PASS | PASS | PASS |
Чему нас научил пилот
- Раунд 1 пропустил два сломанных фикса. Оба агента исправили баг в
bucket, но незаметно сломали другое поведение: ключ исчезал после чтения. Наш рукописный регрессионный тест этого не покрывал, и мы сказали PASS. Раунд 1 закончился согласием 88,9% и 4 ложными PASS: эти два и ещё два, о которых в третьем пункте. Независимая проверка их поймала. - Мы исправили инструмент, а не цифры. Теперь пилоты прогоняют собственные тесты клиента как регрессионную проверку внутри изолированной среды (
--repo-tests). Раунд 2, те же фиксы: оба сломанных фикса получают FAIL «сломаны существующие тесты», и нашлась ещё одна регрессия — в фиксеichunkedагента B. - Одно расхождение осталось, и оно честное. В
ichunkedмейнтейнеры заодно поменяли текст ошибки, о котором в баг-репорте не было ни слова. Агент A исправил то, что просили; их тесты всё равно ждали новый текст. В настоящем пилоте это требование, которое нужно записать до начала работы, а не ошибка фикса. - Ни один хороший фикс не был забракован. За оба раунда верный фикс ни разу не получил FAIL.
Ограничения
- Небольшие, хорошо покрытые тестами библиотеки на чистом Python. Крупные кодовые базы с сервисами и базами данных — следующий шаг.
- Агентами были ИИ-модели, которые мы запускали сами, а не коммерческие продукты; баг-репорты мы написали по сообщениям коммитов мейнтейнеров.
- Квитанции подписаны демо-ключами: это был теневой режим, деньги не двигались.
Финальный раунд глазами клиента: отчёт пилота, каждую квитанцию можно проверить в один клик (отчёт на английском). Задачи, патчи и сырые данные обоих раундов — партнёрам пилота по запросу.
Запустите это на своих багах.
Четыре недели, 30–50 реальных багов, любой агент. Бесплатно в теневом режиме.