Anthropic опубликовала рабочий процесс plugin evals для Claude Code. Команда claude plugin eval прогоняет плагин на реалистичных запросах, оценивает результат и сравнивает его с запуском, где плагин не загружен. Так разработчик плагина получает ответ на три вопроса, которые раньше не мог измерить: срабатывает ли навык, выживает ли он после правки или смены модели и обходит ли он голую модель.
Инструмент работает на Claude Code v2.1.269 или новее и с любым каталогом, где есть манифест plugin.json или .claude-plugin/plugin.json, либо плагином в виде каталога навыков. Каждый прогон и каждый судейский грейдер — это реальный вызов модели, который оплачивается по вашему тарифу или API-аккаунту.
Как устроен кейс и грейдеры
Набор для оценки живёт в каталоге evals/ внутри плагина. Каждый кейс — подкаталог с файлом prompt.md и папкой graders/. Тело запроса уходит в Claude ровно так, как написано, а упоминания @path не разворачиваются. Во frontmatter файла prompt.md можно задать max_turns (по умолчанию 10), timeout_seconds (по умолчанию 300), model, tags и allowed_tools.
Грейдеры — это markdown-файлы, во frontmatter которых задаются type, необязательный weight и необязательный arm. Всего типов шесть. Четыре из них ничего не стоят, потому что считаются по транскрипту и файлам на диске: regex, tool_used, tool_order и file_exists. Два обращаются к судейской модели и добавляют к счёту: llm оценивает ответ по написанным вами прозаическим критериям, а baseline сравнивает его с эталонным ответом.
Команда claude plugin eval init читает плагин, спрашивает, как выглядит хороший результат, предлагает кейсы и грейдеры, пробует их и записывает файлы. В CI вместо этого можно передать --bare <name>, чтобы получить пустой шаблон.
Δ — единственное число, которое доказывает пользу
По умолчанию каждый кейс выполняется дважды: в with-arm с загруженным плагином и в without-arm без него. Их разница, Δ, и есть вклад плагина. Если кейс набирает 1.0 в обоих плечах, плагин не при чём — он не причина успеха. В примере из документации один кейс показан как WITH 1.00, W/OUT 0.33, Δ +0.67 за 6 прогонов; это стоило примерно $0.41 и заняло 74 секунды. Грейдер с пометкой with-only, обычно tool_used: Skill, показывается как индикатор и исключается из оценки, поскольку в without-arm навыку нечему срабатывать.
Anthropic называет самую частую первую находку: Δ около нуля при падающем грейдере tool_used: Skill. Это значит, что Claude не выбирает навык при естественной формулировке. Такой дефект не видит claude plugin validate, потому что она проверяет синтаксис и схему манифеста, а не поведение.
Результаты складываются в evals/results/<timestamp>/report.html с вердиктами по каждому грейдеру и голосами судьи. Если аккаунт это поддерживает, отчёт также публикуется на claude.ai — если не задан --no-publish.
Стоимость и CI-порог
Набор делает примерно cases × runs × arms запусков агента, плюс 3 коротких судейских вызова на каждый грейдер llm или baseline за прогон, и результаты отличаются от запуска к запуску. Документированный вызов в CI выглядит так:
claude plugin eval . \
--trust-plugin \
--json results.json \
--threshold 0.8 \
--model claude-sonnet-5 \
--judge-model claude-haiku-4-5 \
--no-publish \
--max-cost-usd 20
Раннеру нужна установка Claude Code и учётные данные, например ANTHROPIC_API_KEY. Без --trust-plugin недоверенная копия репозитория получает отказ с кодом выхода 1, когда терминала нет. Проблемы в отчёте никогда не меняют код выхода, а --json подавляет вывод о ходе работы.
Порог --threshold, лимит --max-cost-usd и флаг --trust-plugin превращают проверку в CI-гейт. Стоит помнить, что ошибки лимитов использования могут выглядеть как регрессия.
Что это значит для команд, которые пишут плагины
Раньше проверка плагина сводилась к валидации манифеста и ручному запуску: сработал навык или нет, разработчик судил на глаз. Теперь есть измеримая величина — Δ, и она отделяет настоящий вклад плагина от совпадения. Для команды это меняет порядок работы: сначала пишется кейс с естественной формулировкой запроса, затем грейдеры, и только потом код плагина подгоняется под Δ, а не под ожидания автора.
Если ваш плагин добавляет навык, который Claude должен выбирать сам, грейдер tool_used: Skill в with-only режиме покажет, срабатывает ли он вообще. Нулевая Δ при таком падении — сигнал переписать описание навыка или формулировку триггера, а не добавлять новые возможности.
Подход перекликается с тем, как Anthropic строит оценку качества моделей: например, Claude Fable 5.1 набирает 52,6% на Terminal-Bench-Science, а в Claude Security сканер уязвимостей работает на Mythos 5. Тот же принцип — измеримая метрика вместо субъективного «работает» — лежит и в основе plugin evals. Если вы уже автоматизируете тесты агентов, пригодится и открытый code-testing-generator от Microsoft, который пишет юнит-тесты и сам их проверяет.
Частые вопросы
Какая версия Claude Code нужна для plugin evals?
Claude Code v2.1.269 или новее. Команда работает с каталогом, где есть plugin.json или .claude-plugin/plugin.json, либо с плагином в виде каталога навыков.
Сколько стоит один прогон набора?
Точно посчитать заранее нельзя: каждый прогон и каждый судейский грейдер — это реальный вызов модели, оплачиваемый по вашему тарифу или API-аккаунту. В документации пример одного кейса за 6 прогонов оценён примерно в $0.41. Ограничить расходы помогает флаг --max-cost-usd.
Какие грейдеры бесплатные?
Четыре типа считаются по транскрипту и файлам на диске и не обращаются к модели: regex, tool_used, tool_order и file_exists. Платные — llm и baseline, они вызывают судейскую модель.
Что означает Δ около нуля?
Это значит, что плагин не дал вклада: кейс одинаково проходит и с ним, и без него. Если при этом падает грейдер tool_used: Skill, навык не выбирается на естественную формулировку запроса.
Почему claude plugin validate не находит эту проблему?
Потому что она проверяет синтаксис и схему манифеста, а не поведение. Ошибка в том, что Claude не выбирает навык, видна только на прогоне с реальными запросами.
Можно ли запускать plugin evals в CI?
Да. Для этого есть флаги --threshold, --max-cost-usd и --trust-plugin, а также вывод --json results.json. Раннеру нужна установка Claude Code и учётные данные, например ANTHROPIC_API_KEY.
Что будет без флага --trust-plugin?
Недоверенная копия репозитория будет отклонена с кодом выхода 1, если терминала нет. Это защита от запуска незнакомого кода в автоматическом окружении.
Меняет ли отчёт код выхода?
Нет. Проблемы, найденные в отчёте, никогда не меняют код выхода — за это отвечает порог --threshold. При этом ошибки лимитов использования могут сымитировать регрессию.
Куда сохраняются результаты?
В evals/results/<timestamp>/report.html с вердиктами по каждому грейдеру и голосами судьи. Если аккаунт поддерживает публикацию и не задан --no-publish, отчёт также публикуется на claude.ai.
Как создать первый набор кейсов?
Команда claude plugin eval init читает плагин, спрашивает, как выглядит хороший результат, предлагает кейсы и грейдеры, пробует их и записывает файлы. В CI вместо интерактивного режима используется --bare <name> для пустого шаблона.
Источник: marktechpost.com