Claude Code: plugin eval измеряет пользу плагина через Δ

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