Тестирование плагинов Claude Code: evals без самописного раннера

Разбираем нативные eval-тесты Claude Code: как сравнить поведение с плагином и без него, оценить дельту, ограничить расходы и поставить проверку в CI.

Saturday, September 12, 2026Omid Saffari
Тестирование плагинов Claude Code: evals без самописного раннера

Теперь тестирование плагинов Claude Code позволяет доказать, что плагин действительно меняет поведение Claude, а не просто состоит из валидных файлов. Нативная команда claude plugin eval прогоняет один и тот же реалистичный запрос с плагином и без него, оценивает оба варианта и показывает разницу. Так расплывчатая проверка «кажется, навык срабатывает» превращается в решение о выпуске с лимитами по времени, числу ходов и расходу ресурсов.

Важен и момент появления функции. В Claude Code 2.1.269 eval-тесты плагинов появились 11 сентября 2026 года. Самый заметный датированный гайд по этому запросу всё ещё описывает самописный раннер на Python. Если вы поддерживаете локальный плагин, кратчайший путь теперь встроен в Claude Code: создать один поведенческий кейс, сравнить его с контрольным вариантом, изучить отчёт, а затем настроить CI так, чтобы он отклонил ту же регрессию, которую вы только что внесли намеренно.

Что именно измеряет нативное тестирование плагинов Claude Code

Eval-тест плагина — это A/B-тест поведения агента. Представьте две одинаковые мастерские, получившие одну и ту же рабочую карточку. В одной установлен ваш плагин, в другой его нет. Claude Code выполняет задание в обеих, оценивает результат и выводит WITH, W/OUT и Δ — разницу между баллами с плагином и без него.

Именно дельта здесь важнее всего. Оценка 1.0 в обеих ветвях выглядит отлично, но означает, что Claude и без плагина справился бы с задачей. Положительная дельта показывает измеримый вклад. Отрицательная говорит о том, что плагин ухудшил проверяемое поведение.

По умолчанию один кейс означает три новых сеанса с плагином и три без него. Домашний каталог, рабочая директория и конфигурация Claude Code в каждом сеансе изолированы. Ваши личные настройки, проектный CLAUDE.md, другие плагины, память и персональные MCP-серверы туда не попадают. Изоляция делает сравнение чище, но заодно плагин, скрытно зависящий от настройки вашего ноутбука, даст сбой ровно по той причине, которую и должна выявить проверка. Полный контракт по изоляции и безопасности приведён в документации Anthropic по eval-тестам плагинов.

Архитектурная инфографика: один промпт разделяется на три запуска с плагином и три без него, после чего формируется отчёт с дельтой
Один кейс превращается в две сопоставимые ветви. Дельта показывает вклад именно плагина.

Начните с рабочего локального плагина

Поведенческие eval-тесты — второй этап проверки, а не первый. В каталоге плагина должен находиться plugin.json, .claude-plugin/plugin.json либо корректная структура каталога навыков. Файлы и схему проверяйте через claude plugin validate. Команда claude plugin eval нужна для других вопросов: «Сработал ли навык на естественном запросе и выдал ли он принятый в команде формат?»

Кроме того, понадобится Claude Code v2.1.269 или новее и та же авторизация, которой вы пользуетесь в обычных сеансах. Eval-сеансы, модели-судьи и интерактивный инициализатор расходуют лимит вашего тарифного плана либо оплачиваются через API. Если остальная конфигурация Claude Code пока тоже в новинку, сначала освойте базовый локальный процесс, а уже затем добавляйте релизный гейт.

В корне доверенного плагина проверьте версию и создайте пустой кейс:

Bash
claude --version
claude plugin eval init --bare release-note

Интерактивный вариант — claude plugin eval init. Он читает плагин, уточняет критерии хорошего результата, предлагает кейсы и грейдеры, один раз пробно запускает их и записывает набор тестов. Для знакомства с контрактом удобнее --bare: команда создаёт файлы, ничего не запуская.

Соберите один понятный поведенческий кейс

Предположим, рабочий плагин содержит навык release-notes. Его ценность не сводится к написанию текста. Навык должен распознать естественный запрос об изменении продукта и вернуть принятую в команде структуру релизной заметки из трёх частей: Summary, Impact и Risk.

Реалистичный запрос пользователя поместите в prompt.md. Затем добавьте один детерминированный грейдер для результата и ещё один — для механизма. «Детерминированный» означает, что CLI проверяет трассировку или текст напрямую и не обращается к модели-судье.

Text
# evals/release-note/prompt.md
---
name: release-note
tags: [smoke]
runs: 3
max_turns: 8
timeout_seconds: 180
allowed_tools: [Skill]
---

Turn this change into a customer-facing release note: checkout now retries a failed payment once before showing an error.

# evals/release-note/graders/format.md
---
type: regex
target: last_message
pattern: 'Summary[\s\S]*Impact[\s\S]*Risk'
flags: i
---

# evals/release-note/graders/skill-fired.md
---
type: tool_used
tool: Skill
input_match: '"skill"\s*:\s*"(?:[\w-]+:)?release-notes"'
---

Замените release-notes на фактическое значение name из файла SKILL.md вашего навыка. В промпте намеренно не названы ни сам навык, ни три требуемых заголовка. Так тест выясняет, распознаёт ли плагин задачу и привносит ли нужный формат. Если промпт уже содержит все ответы, контрольная ветвь без плагина тоже может пройти проверку — и дельта покажет, что вклад плагина невелик.

Frontmatter выше соответствует текущей нативной схеме. В prompt.md такие поля, как runs, max_turns, timeout_seconds, model, tags и allowed_tools, остаются на верхнем уровне. Для фикстур, истории диалога или каталогов добавьте case.yaml: этому файлу нужны schema_version: "1.1" и name, а параметры выполнения в нём переносятся под execution:.

Запустите eval и разберите отчёт

Из корня плагина выполните claude plugin eval .. Для единственного кейса команда запустит три сеанса с плагином и три базовых сеанса. По мере завершения каждого сеанса строки прогресса показывают результаты грейдеров. В итоговой сводке появляются WITH, W/OUT, Δ, RUNS, COST и NOTES.

Читайте их в таком порядке:

  1. WITH показывает, выполнили ли сеансы с плагином условия грейдеров.
  2. W/OUT показывает, как часто Claude достигал того же результата самостоятельно.
  3. Δ измеряет вклад плагина. Положительное значение полезно. Значение около нуля требует разбирательства. Отрицательное указывает на регрессию.
  4. COST — оценка по прейскуранту, а не сумма, которая обязательно будет списана в рамках подписки.
  5. NOTES указывает на ошибку запуска или провал с наибольшим весом в ветви с плагином.

Каждый набор, в котором есть хотя бы один кейс, записывает aggregate-result.json и автономный report.html в каталог результатов с временной меткой. В HTML-отчёте можно открыть любой запуск, увидеть вердикт и пояснение каждого грейдера, а также сопоставить определения промпта и грейдеров с фактическими действиями Claude. JSON содержит стабильные поля для CI: общий балл, число пройденных кейсов, среднюю дельту, статус частичного выполнения, оценку стоимости, длительность и версию Claude Code.

Сначала вызовите одну регрессию — только потом доверяйте тесту

Теперь докажите, что тест способен упасть. Временно замените описание навыка release-notes расплывчатым текстом, в котором больше не названа задача, распознаваемая этим навыком. Сам eval-кейс не меняйте. Снова запустите ту же команду, изучите новый отчёт, а затем верните настоящее описание.

Нужен именно поведенческий сбой: грейдер Skill перестаёт проходить, ожидаемый формат воспроизводится менее надёжно либо преимущество ветви с плагином сокращается. Не пытайтесь заранее угадать точный балл — запуски агента варьируются. Если после намеренной поломки отчёт практически не изменился на трёх запусках по умолчанию, этот кейс пока не защищает плагин. Сделайте запрос более репрезентативным, ужесточите грейдер результата или добавьте отрицательный кейс, в котором навык не должен срабатывать.

Такая намеренная поломка — аналог кнопки проверки на дымовом извещателе. Зелёная панель ничего не стоит, пока вы не убедились, что релевантный дефект способен сделать её красной.

Рассчитайте бюджет цикла до добавления новых кейсов

Один кейс с настройками по умолчанию уже создаёт шесть сеансов агента. Если добавить один LLM-грейдер, тот же кейс потребует ещё восемнадцать голосов модели-судьи: по три голоса для каждого из шести сеансов. При этом сами сеансы могут занимать несколько ходов. Поэтому небольшой набор способен израсходовать гораздо больше, чем можно предположить по числу кейсов.

Для трёх разных решений нужны три разных бюджета:

ЭтапВид командыЧто вы получаете
Быстрый локальный цикл--case release-note --runs 1 --ablation none --no-publishОдин сеанс с плагином, без контрольной ветви, и быстрый сигнал при редактировании кейса
ПодтверждениеТри запуска по умолчанию в обеих ветвяхШесть сеансов и дельта, которой можно доверять больше
Гейт CIЗафиксированные модели агента и судьи, --json, порог, --no-publish и --max-cost-usdСопоставимые результаты, пригодный для архива артефакт и правило остановки по оценочным расходам

Цикл с одним запуском заведомо шумный. Он годится для выявления очевидных ошибок при редактировании, но перед принятием изменения проведите подтверждение на трёх запусках по умолчанию. Для частых проверок предпочитайте regex, tool_used, tool_order и file_exists: они не требуют дополнительных обращений к модели-судье. Оставьте LLM-грейдер для короткого результата, качество которого нельзя выразить устойчивым правилом.

У лимита стоимости есть важная оговорка. --max-cost-usd перед началом каждого запуска сверяется с оценкой CLI по прейскуранту. Уже выполняющиеся запуски завершаются, поэтому итоговая оценка может превысить потолок. При достижении лимита остаются частичные результаты, а процесс завершается с кодом 2. Это ограничитель, а не предоплаченный кошелёк.

Архитектурная инфографика бюджета: быстрый цикл с одним запуском, подтверждение по схеме три плюс три и лимит CI в 20 долларов
Наращивайте уверенность поэтапно: один запуск для редактирования, три плюс три для подтверждения, затем явный потолок расходов в CI.

Передайте проверку на регрессию в CI

Когда намеренная регрессия проявилась, а восстановленный плагин снова проходит тест, перенесите этот же набор в систему контроля версий. В примере CI от Anthropic зафиксированы модели агента и судьи, результат записывается в results.json, задан порог 0.8, отчёт остаётся локальным, а потолок оценочной стоимости составляет $20. Там также используется --trust-plugin, что уместно лишь в том случае, если извлечённые из репозитория плагин и набор тестов вы готовы запустить самостоятельно.

Точная команда для передачи проверки: 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, а затем архивируйте два файла с результатами.

Кода завершения команды достаточно, чтобы поставить гейт на сборку. Код 0 означает, что все кейсы загрузились и достигли порога. Код 1 охватывает результат ниже порога и ряд ошибок настройки. Код 2 означает частичный запуск из-за потолка расходов или отклонения учётных данных в самом начале. Архивируйте results.json и report.html даже при сбое, чтобы автор мог отличить регрессию плагина от тайм-аута запуска или остановки по бюджету.

Фиксация моделей важна: иначе обновление модели можно принять за регрессию плагина. Так же разделяйте затраты на рассуждение и качество: проверяйте качество и уровень effort по отдельности, чтобы изменение стоимости не растворилось внутри оценки поведения.

Архитектурная инфографика CI: eval-отчёт в JSON направляется в ветви успешного, неуспешного и частичного завершения
CI должен сохранять причину, а не только цвет: успешный результат, регрессия и частичная остановка по бюджету — разные исходы.

Семь типов поведения плагина, которые стоит проверить первыми

Больше всего выигрывают команды, поставляющие плагины другим людям. Для личного помощника допустима ручная проверка. В маркетплейсе или внутри организации одно неудачное описание, разрешение на инструмент либо изменение формата превращается в повторяющиеся обращения в поддержку.

МестоДля когоТочная проверка поведенияПочему она окупается
1Автор плагина для маркетплейсаИспользовать естественные запросы, которые должны вызывать навык, и близкие запросы, которые не должныВыявляет и несрабатывающие навыки, и раздражающие ложные срабатывания до того, как с ними столкнутся все пользователи
2Команда плагина для ревью кодаПроверить обязательные разделы ревью и факт запуска соответствующего навыкаЗащищает контракт продукта, не требуя дословного совпадения формулировок
3Команда релиз-инжинирингаЗафиксировать текущую модель, изменить плагин и сравнить те же кейсы и дельтуОтделяет регрессии плагина от изменений модели и сокращает субъективные споры о релизе
4Автор плагина для безопасностиДобавить отрицательный кейс, запрещающий запуск навыка на безобидных задачах обслуживанияНе даёт дорогим или мешающим работе проверкам запускаться не на тех задачах
5Плагин процесса на базе MCPЗаменить ответы внешних инструментов моками набора и оценить получившийся маршрут вызововПозволяет проверять сбои и пограничные случаи, не обращаясь к рабочему сервису при каждом запуске
6Владелец плагина для генерации документовПроверить наличие ожидаемого файла, затем исследовать стабильную часть содержимого регулярным выражениемОбнаруживает незаметные нарушения контракта вывода, которые может скрыть дружелюбное финальное сообщение
7Платформенная команда с несколькими внутренними плагинамиПометить небольшой smoke-набор для каждого изменения и запускать более глубокие кейсы перед релизомСосредотачивает регулярные расходы на тех видах поведения, исчезновение которых с наибольшей вероятностью помешает коллегам

Начните с двух первых типов поведения, исчезновение которых пользователи заметили бы сразу. Десять расплывчатых кейсов менее полезны, чем один тест срабатывания и один тест результата, способные выявить воспроизводимый дефект.

Два продукта, которые стоит построить вокруг нативных eval-тестов плагинов

1. Гейт по дельте для pull request — самая сильная возможность

Можно создать тонкий CI-продукт, который запускает нативную команду, читает aggregate-result.json и публикует единый результат ревью с изменением балла, дельтой, стоимостью, непройденным грейдером и ссылками на архивный отчёт. Команды плагинов и авторы решений для маркетплейсов готовы платить за слой принятия решений, а не за ещё один оценщик.

Спрос пока только формируется, но коммерческий сигнал уже заметен. Запрос claude code evals набирает около 50 поисков в месяц в США, его годовой рост составляет 600%, а CPC — $17.61. Более широкие платформы оценки тоже показывают наличие бюджетов на качество: месячный тариф Braintrust Pro стоит $249. Это ориентир по категории, а не рекомендация цены для обёртки над плагинами.

Минимальная продаваемая версия — GitHub Action и комментарий к PR. Она принимает путь к плагину, порог, зафиксированные модели и потолок оценочной стоимости; загружает нативные JSON и HTML; различает код выхода 1 и частичный выход 2. Но есть платформенный риск: Anthropic может добавить собственную отчётность для PR. Устойчивое преимущество здесь создают единые политики для нескольких репозиториев, исторические сравнения и правила согласования, а не более красивая копия нативного отчёта.

2. Подборки eval-кейсов для авторов навыков

Можно продавать поддерживаемые наборы кейсов для типовых задач плагинов: ревью кода, подготовка changelog, разбор инцидентов и безопасный выбор инструментов. Такой набор представляет собой обычный каталог evals/ с реалистичными положительными и отрицательными промптами и детерминированными грейдерами. Команда сможет адаптировать его, вместо того чтобы придумывать критерии качества с нуля.

Прямой запрос claude code skill evals получает около 10 поисков в месяц в США. Это очень мало, поэтому речь скорее о точечном дополнении, чем о самостоятельном венчурном рынке. MVP — один безупречный набор для одной ценной категории плагинов, версии которого синхронизируются с выпусками Claude Code; к нему прилагается краткое руководство по калибровке. Ограничение столь же очевидно: claude plugin eval init уже предлагает и пробно запускает кейсы. Наборы выиграют лишь тогда, когда их отраслевые сценарии и критерии сбоя окажутся лучше универсальной генерации.

Чего эта команда не решает

Нативные eval-тесты не доказывают, что плагин хорош при любых условиях. Они показывают его поведение только на выбранных вами промптах, в заданном окружении, с выбранной моделью, заданными разрешениями на инструменты и конкретными грейдерами. Слабые промпты дают лестные оценки. Регулярное выражение может засчитать правильный заголовок при неверном содержании. Оценки LLM-судьи могут варьироваться, а сам судья добавляет три голоса на каждый грейдер в каждом запуске.

Изоляция — ещё одно полезное ограничение. Каждый запуск начинается с чистого окружения, поэтому проектные файлы, пользовательские настройки, хуки и персональные серверы отсутствуют. Это отлично для воспроизводимости, но плохо для кейса, автор которого забыл объявить фикстуры. Инструментам за пределами набора только для чтения требуется явное разрешение в командной строке. Настоящие MCP-серверы плагина требуют дополнительного согласия и разрешений, а хуки и реальные серверы стоит запускать в изолированном раннере, поскольку они могут действовать за пределами песочницы агента.

Наконец, не урезайте max_turns или timeout_seconds до уровня, при котором нормальная работа начинает упираться в лимит. Запуск, превысивший время или число ходов, фиксируется как ошибка и обычно снижает балл. Оставьте достаточно места для целевой задачи, а общие расходы набора контролируйте потолком оценочной стоимости.

Как проводить тестирование плагинов Claude Code с помощью evals?

В корне рабочего плагина на Claude Code v2.1.269 или новее выполните claude plugin eval init, чтобы сгенерировать набор, либо claude plugin eval init --bare <name>, чтобы получить пустой кейс. Поместите реалистичный промпт и грейдеры в evals/, затем запустите claude plugin eval . и сравните WITH, W/OUT и Δ в сводке и отчёте.

Что такое Claude Code evals?

Это повторяющиеся изолированные сеансы Claude Code, которые оценивают детерминированные грейдеры или модели-судьи. В eval-тестах плагинов по умолчанию есть контрольный вариант без плагина, поэтому можно измерить, улучшил ли плагин результат, а не просто увидеть, что Claude выполнил задачу.

Как работают eval-тесты навыков Claude Code?

Сформулируйте промпт так, как естественно написал бы пользователь, а затем оцените и результат, и то, вызвал ли инструмент Skill нужный навык. Если навык сработал, но результат не прошёл проверку, нужно доработать инструкции. Если результат одинаково хорош и без плагина, измеримого вклада навыка в этот кейс, вероятно, нет.

В понедельник одному автору плагина стоит добавить один кейс на срабатывание, намеренно заставить его упасть, восстановить плагин и поставить на эту же проверку лимит в CI. Если такой релизный контур нужен всем плагинам вашей команды, я помогу спроектировать production-гейт.

Последнее обновление
12 сент. 2026 г.
Категория
Build

Сделать этот сайт предпочтительным в Google

Добавить omidsaffari.com как предпочтительный источник в Google Поиске

Отметьте omidsaffari.com как предпочтительный источник — и Google будет поднимать его для вас в Top Stories, AI Overviews и AI Mode.

Похожие статьи
Голосовой ИИ-агент Cloudflare: как найти причину задержки

Голосовой ИИ-агент Cloudflare: как найти причину задержки

Разбираем turnmetrics в Cloudflare: по этапам и исходам находим причину задержки или молчания голосового ИИ-агента — от транскрибации до TTS.12 сент. 2026 г.Build
Как добавить субтитры в видео через Rendi: вшиваем SRT

Как добавить субтитры в видео через Rendi: вшиваем SRT

Разбираем, как добавить субтитры в видео через Rendi: отправить SRT и MP4 в API, настроить оформление, дождаться результата и проверить готовый файл.11 сент. 2026 г.Build
OpenAI Agents API или Agents SDK: что выбрать

OpenAI Agents API или Agents SDK: что выбрать

Сравниваем OpenAI Agents API и Agents SDK: управление состоянием, развертывание, стоимость, ограничения и сценарии, в которых стоит выбрать каждый вариант.11 сент. 2026 г.Build
Цена Rendi в 2026 году: считайте байты, а не минуты видео

Цена Rendi в 2026 году: считайте байты, а не минуты видео

Сколько стоит Rendi в 2026 году? Разбираем тарифы FFmpeg API, лимиты обработки и хранения, время команд и выбор плана под реальную нагрузку.11 сент. 2026 г.Build
Git worktree в Codex CLI: изолированные задачи без ручной рутины

Git worktree в Codex CLI: изолированные задачи без ручной рутины

Разбираем git worktree в Codex CLI 0.154.0: запуск изолированных сессий, проверка изменений, сохранение коммитов и безопасная очистка рабочих деревьев.10 сент. 2026 г.Build
Настройка Claude Code: как задать предел усилий

Настройка Claude Code: как задать предел усилий

Разбираем настройку Claude Code maxEffortLevel: как задать предел усилий, проверить итоговый уровень и сравнить качество задач с расходом токенов.10 сент. 2026 г.Build
Запись видео в agent-browser: как выбрать FPS

Запись видео в agent-browser: как выбрать FPS

Запись видео в agent-browser v0.37.0: как выбрать 30, 60 или 1–15 fps, читать счётчики кадров и сохранять понятные подтверждения для проверки в CI.8 сент. 2026 г.Build
Цена UltaHost VPS при продлении: реальная стоимость тарифов

Цена UltaHost VPS при продлении: реальная стоимость тарифов

Цена UltaHost VPS при продлении без рекламных иллюзий: тарифы от месяца до 3 лет, окупаемость предоплаты, платные панели и ограничения возврата.7 сент. 2026 г.Build
Рассылка

Одно письмо, каждое воскресенье.Работающие системы, а не горячие мнения.

Еженедельно. Без спама. Отписка в любой момент.