Михаил Фёдоров, автор серии статей об архитектуре QA Assist — системы из 11 ИИ-агентов для автоматизации тестирования, — столкнулся с типичной проблемой при разработке ИИ-инструментов: невозможностью объективно оценить, улучшилась ли система после очередного изменения. Переписанный системный промт, новый шаг в пайплайне, смена провайдера моделей — каждое из этих изменений требует проверки, но на живых проектах накопить чистую статистику за разумное время не получается.

Решением стал отдельный бенчмарк-проект — небольшое Flask-приложение «заявка на обратный звонок» под названием CallMeBack. Лендинг с формой (имя, телефон, удобное время, комментарий), страница /success и админка с Basic Auth. В код намеренно заложены 25 багов десяти категорий: уязвимости безопасности (XSS, SQL-инъекции, утечка stack trace), ошибки валидации, функциональные сбои, нарушения API-контракта, проблемы UI/UX, доступности (a11y), производительности, целостности данных, локализации и забытые артефакты вроде console.log в продакшене. Репозиторий разбит на две ветки: в main лежит то, что видит агент — код и требования, в ветке benchmark — эталонный список багов и методика оценки, которые агент видеть не должен.

КатегорияКодПример бага
БезопасностьsecurityXSS, SQL-инъекция, утечка stack trace
ВалидацияvalidationНе проверяется длина поля, не обрезаются пробелы
ФункциональностьfunctionalКнопка не реагирует, фильтр возвращает не то
Соответствие API-контрактуapi_contractНеверный HTTP-код, неверный формат поля
UI/UXui_uxОпечатки, неадаптивная вёрстка
Доступностьa11yНет лейблов у полей, отключён focus-outline
ПроизводительностьperformanceДолгий ответ ручки, выборка без пагинации
Целостность данныхdata_integrityДанные пишутся в БД в разных форматах
Локализацияi18nДаты в неверной таймзоне
Забытые артефактыstrayconsole.log в продакшене, мёртвый код

Ключевой принцип архитектуры бенчмарка — полная изолированность от основного репозитория агента. Агент работает с тестовым проектом так же, как с боевой задачей: получает User Story из Jira, строит Global Context, запускает пайплайн командой test-orchestrator pipeline. Второй принцип — компактность: маленький проект означает короткий контекст, дешёвую итерацию и возможность проверять гипотезы несколько раз в день.

Репозиторий разделён на две ветки: main с кодом и требованиями для агента, benchmark с эталонным списком багов и методикой оценки.

Для сравнения Фёдоров прогнал тот же проект через нативный Claude Code без какой-либо инфраструктуры — просто передал требования и попросил найти баги одним промтом. Разница в артефактах оказалась принципиальной. QA Assist за один прогон пайплайна самостоятельно декомпозирует требования, генерирует тест-сценарии, прогоняет их на реальном стенде, пишет и отлаживает автотесты, оформляет баг-репорты в Jira и формирует traceability matrix. Нативный Claude Code выдаёт список найденных багов — и на этом останавливается. Любые дополнительные артефакты потребуют отдельных промтов и ручной работы.

Подход с фиксированным бенчмарком решает конкретную инженерную задачу: он позволяет отвечать на вопросы, которые иначе остаются без ответа. Какие категории багов агент ловит стабильно, а какие систематически пропускает? Насколько воспроизводимы результаты между запусками? Даёт ли конкретное изменение промта реальный прирост или это статистический шум? Сколько токенов стоит каждый прогон? На живых проектах эти вопросы тонут в параллельных изменениях — новый разработчик в команде, смена фреймворка, другой техлид. В контролируемой среде дельта между версиями агента становится измеримой.

Бенчмарк и живой стенд опубликованы в открытом доступе. Репозиторий qa-benchmark-callmeback доступен на GitHub, стенд развёрнут по адресу http://45.151.31.218:5000/. Фёдоров позиционирует инструмент как универсальный: на нём можно сравнивать не только версии QA Assist, но и любые другие подходы к автоматическому поиску багов — включая прямые вызовы LLM без пайплайна.