Метод, или как мы ставим оценки текстам, которые притворяются программами
Скилл для ИИ-агента выглядит невинно: папка, внутри файл SKILL.md с описанием и инструкцией, иногда пара скриптов. Никакого компилятора, который ругнётся на ошибку, никакого красного статуса в CI. Правишь одно слово в описании, и агент перестаёт узнавать свою задачу; кладёшь в папку файл с ключом, и он уезжает в каталог вместе с остальным. За 48 057 скиллов, которые мы прочитали при калибровке, мы видели и то, и другое, и кое-что похуже: торгового агента с инструкцией скрывать отказ шлюза от пользователя, скилл для заказа еды, который импортирует cookies из Chrome, целые рабочие пространства с файлами памяти, опубликованные как «скилл». Метод ниже: как из этого получается одна буква от A до F.
Три вопроса вместо одного
Мы не пытаемся ответить «хороший ли это скилл». Мы отвечаем на три вопроса, которые можно проверить: безопасно ли его читать агенту, написан ли он так, чтобы сработать, и работает ли он на самом деле. Первые два решаются без единого вызова модели, за секунды, для каждого скилла в каталоге. Третий стоит денег и времени, поэтому он бонус, а не обязательство.
1. Безопасность: 60 процентов оценки
Guard читает каждый текстовый файл скилла и ищет 53 приметы. Половина правил написана на двух языках, потому что фраза «игнорируй предыдущие инструкции» встречается в каталогах не реже английской, а англоязычные сканеры её не видят: они ищут границы слов ASCII, и кириллица для них шум. Отдельные проверки ловят то, чего не видно глазами: символы нулевой ширины, теги Unicode, переопределение направления текста, слова из смеси латиницы и кириллицы. Файловые проверки смотрят на папку целиком: файлы .env и ключей, дампы памяти агента, бинарники, запрос секретных переменных у рантайма Hermes.
Самое трудное в сканере не найти подозрительное, а не кричать зря. В документации по безопасности «rm -rf /» встречается в каждом втором абзаце, и это не команда, а предостережение. Поэтому у каждой находки есть контекст, который может понизить её серьёзность: отрицание перед фразой, значение-заглушка вместо ключа, определение детектора, строка таблицы, демонстрация атаки, комментарий в коде. Понижения видны на странице скилла серыми чипами, чтобы вы могли с нами поспорить.
Арифметика простая: критическая находка стоит 45 баллов из 100, высокая 18, средняя 5, низкая 1. Одна критическая находка блокирует скилл: оценка F, прогон на моделях не запускается, а на странице появляется блок «Чем это грозит»: что рискует потерять тот, кто установит, и что должен сделать автор. Калибровка на живых каталогах свела ложные блокировки к нулю; настоящие утечки ключей GitHub, Telegram, OpenAI и Slack по-прежнему ловятся.
2. Качество: 40 процентов
Здесь два слоя. Первый: lint по спецификации Agent Skills (agentskills.io) и диалекту Hermes: есть ли description и говорит ли он, когда применять скилл; длина description (до 1024 символов, у Hermes до 60 плюс раздел «When to Use»); размер тела; ссылки на файлы, которых нет; формат имени. Каждое замечание вычитает от 1 до 45 баллов.
Второй слой появился после того, как мы посмотрели на первую версию рейтинга и увидели 92 процента оценок A: без lint-замечаний оказалось большинство, а различать их было нечем. Теперь база качества равна 70, и до 100 скилл добирается сигналами ремесла, каждый из которых можно проверить глазами: примеры фраз-триггеров в кавычках прямо в description (их имеют 6 процентов скиллов), явное «когда НЕ применять» (4 процента), структура из заголовков, пошаговые инструкции, описанный формат ответа, примеры входа и выхода, справочные файлы, на которые SKILL.md действительно ссылается, документированные скрипты, лицензия, двуязычность. Штрафы за обратное: почти пустое тело, TODO в тексте, абсолютные пути вроде C:\Users, ссылки на localhost, безымянные имена вроде «skill-1». Полный список с баллами показан на странице каждого скилла.
3. Тесты: бонус и потолок
Наличие evals.json прибавляет 4 балла, spec.yaml ещё 2. Если скилл прошёл прогон на моделях, статус ACTIVE даёт плюс 8, DEGRADED плюс 2, OBSOLETE минус 5. И потолок: скилл, который на моделях не дотянул до порогов, не может носить оценку A, как бы хорошо ни был написан. DEGRADED ограничивает оценку буквой B, OBSOLETE буквой C. Шкала «Тесты» отдельно показывает, насколько поведение вообще проверено: от нуля до ста.
Поверх оценки у каждого скилла есть вердикт, ответ на простой вопрос «ставить или нет». «Заблокирован»: guard нашёл признаки вредоносного поведения. «Не рекомендуется»: критические или высокие находки, оценка D или F либо живой прогон, который показал, что скилл не улучшает ответы моделей. Всё остальное: «Можно использовать». Вердикт виден в таблице рейтинга, на карточке скилла и в JSON.
Итог
overall = 0.6 × safety + 0.4 × quality + bonus, округлённый и ограниченный от 0 до 100. A от 90, B от 75, C от 60, D от 40, ниже F. В рейтинге при равной оценке выше тот, кого больше скачивают: логарифм скачиваний, установок и звёзд, чтобы один гигант не заслонял остальных.
Прогон на моделях и при чём здесь CMRG
Полная проверка делает то, что делал бы придирчивый коллега, если бы у него был вечер. Если у скилла нет своих тестов, модель пишет черновик: четыре-шесть реалистичных запросов на русском и английском, фразы, по которым скилл должен срабатывать, и утверждения о формате ответа. Дальше каждый запрос выполняется дважды: со скиллом в системном промпте и без него. Разница между этими двумя числами и есть ответ на вопрос «зачем этот скилл нужен»: если модель справляется и так, скилл получает статус OBSOLETE, каким бы красивым он ни был.
Ответы проверяют два судьи разной природы. Детерминированные утверждения: язык, JSON, обязательные и запрещённые строки, канарейка в файле с внедрённой инструкцией. И судья-модель, которая сверяет ответ с рубрикой. Судья-модель ошибается, и мы это знаем; поэтому его вердикт сравнивается с настраиваемым порогом, а спорные кейсы видны в отчёте вместе с его объяснением. Следующий шаг здесь описан протоколом CMRG (crossmodelrg.org): не один судья, а три независимых, и единогласие как сигнал надёжности. В экспериментах CMRG именно единогласная тройка предсказывала, каким утверждениям можно верить, а расхождение судей честно помечало «здесь нужен человек». Мы встраиваем эту логику узко: панель из трёх судей на спорных кейсах, статус «нужен человек» при расколе, без попытки вывести из панели общую оценку качества, которую CMRG как раз считает ненадёжной.
Триггеры проверяются отдельно: скилл кладётся в каталог рядом с восемью приманками (перевод, календарь, SQL, PDF и так далее), и модель должна выбрать его на нужные фразы и не выбрать на чужие. Статусы: ACTIVE (pass rate от 80 процентов и заметный прирост к базе), DEGRADED (ниже порога или триггеры не срабатывают), OBSOLETE (модель справляется без скилла), ERROR (прогон не завершился: кредит возвращается).
Модели сейчас: openrouter:openai/gpt-5-mini; судья: openrouter:anthropic/claude-haiku-4.5. Один прогон стоит несколько центов; дневной лимит расходов защищает от неожиданных счетов.
Для каких агентов это работает
Формат SKILL.md стал открытым стандартом, и один и тот же скилл читают Claude / Claude Code, ChatGPT / Codex, Gemini CLI, Cursor, GitHub Copilot / VS Code, Qwen Code, Kimi Code CLI, Z.ai (GLM), DeepSeek (Deep Code), Mistral Vibe, LangChain (deepagents), OpenClaw, Goose, OpenCode. Поэтому у каждого скилла в рейтинге есть чипы «Запускается в»: семейство формата плюс платформа, для которой скилл сделан по данным каталога. Диалект Hermes читает Hermes Agent. Две оговорки, о которых нас спрашивают чаще всего: CrewAI: инструменты на Python, SKILL.md не читает; инструкции скилла можно вставить в backstory агента. AutoGen / Microsoft Agent Framework: функции-инструменты, SKILL.md не читает. Genspark публикует скиллы для своего рабочего пространства в том же формате, их мы тоже читаем.
Почему оформление — это не косметика
Скилл читает не человек, а программа. Поэтому вещи, которые в обычном тексте выглядят мелочью, решают судьбу скилла целиком. Ниже — дефекты, которые мы нашли в собственном каталоге, с числами по нему же; каждый из них мы сначала приняли за ошибку своего анализатора и только потом убедились, что это свойство самих скиллов.
Двоеточие в описании убивает скилл. Строка description: Работа с Discord: отправка сообщений — это невалидный YAML, потому что двоеточие с пробелом внутри незакавыченного значения начинает новую пару «ключ — значение». Строгий разбор выбрасывает весь блок, и скилл остаётся без имени и без описания: агент его просто не найдёт. В каталоге таких 9 469. Лечится кавычками вокруг значения.
Нет frontmatter — нет скилла. Файл, который начинается сразу с заголовка, для агента невидим, каким бы хорошим ни был текст внутри. У нас таких 6 591: обычно это README, случайно названный SKILL.md.
Ссылка на файл, которого нет в архиве. Инструкция говорит «следуй правилам из references/rules.md», а файла в комплекте нет. Процесс встаёт на середине, и это единственная причина, по которой мы ставим жёсткую метку «не запустится». Таких 10 412.
Сплошной текст вместо шагов. Нумерованный или маркированный список — это не украшение: по нему агент понимает, что действия идут в порядке и что их ровно столько. Из абзаца каждый исполнитель вычитает свою последовательность, и результат перестаёт быть воспроизводимым.
Заголовки стоит называть привычно. Разделы «Что нужно на входе», «Если что-то пошло не так», «Результат» — это не наш вкус, а сигналы, по которым и мы, и сам агент понимают, есть ли у процесса входы, обработка сбоев и критерий готовности. Раздел, названный оригинально, для программы не существует.
Кириллица ломает чужие инструменты чаще, чем кажется. В JavaScript граница слова определена только для латиницы, поэтому шаблон вида закупк не совпадает никогда. Мы сами наступили на это дважды и чинили 153 места: до починки весь русскоязычный анализ был слеп. Если ваш скилл написан по-русски, будьте готовы, что сторонние проверяльщики недооценят его по той же причине, и тем важнее оформление, которое видно без регулярных выражений: frontmatter, списки, привычные заголовки.
Вывод простой. Оценка качества у нас складывается не из красоты, а из признаков, по которым программа может убедиться, что скилл исполним. Аккуратное оформление — самый дешёвый способ поднять оценку, потому что оно ничего не меняет по существу и при этом делает скилл видимым.
Чего мы не делаем, и это важно
- Мы не исполняем скрипты и не устанавливаем скиллы. Анализ статический. Он не доказывает безопасность, он делает очевидные атаки дорогими и заметными.
- Мы не проверяем найденные ключи «на живость» и не публикуем их: улики на страницах замаскированы. Автору мы советуем отозвать ключ, а не проверяем, работает ли он.
- Кейсы одноходовые: инструменты агента не вызываются. Скилл, который живёт вызовами CLI, на моделях покажет меньше, чем умеет. Мы пишем об этом рядом с результатом, а не прячем в сноске.
- Судья языковая модель. На спорных кейсах он бывает строг или снисходителен. Порог и рубрики настраиваются в spec.yaml, а панель CMRG в дорожной карте.
Откуда данные и как часто они обновляются
Рейтинг питается 32 каталогами: ClawHub через публичный API, репозитории GitHub архивом ветки (без git), зеркала skills.sh, LobeHub и browse.sh, каталоги для Copilot, Gemini, Qwen, Kimi, Z.ai, DeepSeek, Mistral Vibe, LangChain и Genspark, плюс ссылки, которые предлагают пользователи. Каждый источник перечитывается раз в 3 часов; скилл анализируется заново, когда меняется содержимое или версия правил (сейчас 13). Точное время последнего обхода показано на главной в блоке «Обновление данных», а история оценок каждого скилла хранится и видна.
Всё то же самое можно запустить у себя, без сайта: npx skilleval audit ./skills для каталога и npx skilleval run ./my-skill для одного скилла. Движок один и тот же.