Михаил Фёдоров, автор серии статей об архитектуре QA Assist — системы из 11 ИИ-агентов для автоматизации тестирования, — столкнулся с типичной проблемой при разработке ИИ-инструментов: невозможностью объективно оценить, улучшилась ли система после очередного изменения. Переписанный системный промт, новый шаг в пайплайне, смена провайдера моделей — каждое из этих изменений требует проверки, но на живых проектах накопить чистую статистику за разумное время не получается.
Решением стал отдельный бенчмарк-проект — небольшое Flask-приложение «заявка на обратный звонок» под названием CallMeBack. Лендинг с формой (имя, телефон, удобное время, комментарий), страница /success и админка с Basic Auth. В код намеренно заложены 25 багов десяти категорий: уязвимости безопасности (XSS, SQL-инъекции, утечка stack trace), ошибки валидации, функциональные сбои, нарушения API-контракта, проблемы UI/UX, доступности (a11y), производительности, целостности данных, локализации и забытые артефакты вроде console.log в продакшене. Репозиторий разбит на две ветки: в main лежит то, что видит агент — код и требования, в ветке benchmark — эталонный список багов и методика оценки, которые агент видеть не должен.
| Категория | Код | Пример бага |
|---|---|---|
| Безопасность | security | XSS, SQL-инъекция, утечка stack trace |
| Валидация | validation | Не проверяется длина поля, не обрезаются пробелы |
| Функциональность | functional | Кнопка не реагирует, фильтр возвращает не то |
| Соответствие API-контракту | api_contract | Неверный HTTP-код, неверный формат поля |
| UI/UX | ui_ux | Опечатки, неадаптивная вёрстка |
| Доступность | a11y | Нет лейблов у полей, отключён focus-outline |
| Производительность | performance | Долгий ответ ручки, выборка без пагинации |
| Целостность данных | data_integrity | Данные пишутся в БД в разных форматах |
| Локализация | i18n | Даты в неверной таймзоне |
| Забытые артефакты | stray | console.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 без пайплайна.



