Born to Skill: как перестать материться на агента бессонными ночами [updated]

 Публичный пост
14 мая 2026  7564

Картинка для привлечения внимания

Признавайтесь, вайбкодеры, кто бывал в такой ситуации?
Признавайтесь, вайбкодеры, кто бывал в такой ситуации?

Для тех, кому невтерпёж

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


«Ха! Мы шарим за AGENTS.md, Трин, мы же вайбкодеры!»

И я согласен, если речь про пет-проект или пару сервисов. А как быть, когда у тебя зоопарк из 40+ сервисов на четырёх разных языках?

Можно попробовать уместить все правила в один AGENTS.md. Можно завести свой AGENTS.md в каждом сервисе и бесконечно дублировать одни и те же инструкции. Оба варианта работают примерно до того момента, пока ты не начинаешь бояться собственного файла с правилами.

С приходом LLM в дивный мир разработки, программисты каждый день пытаются упростить себе жизнь: MCP-серверы, отдельные агенты для отдельных задач, скиллы и куча Memory-проектов/паттернов.

Сегодня поговорим про скиллы. Лично я начал серьёзно погружаться в них пару месяцев назад и пока нахожусь на стадии: «О боже, это панацея! Скиллы всем и всюду, почему моя микроволновка до сих пор не понимает скиллы?»


Небольшое уточнение: дальше под «скиллами» я имею в виду не только Claude Skills, а Agent Skills в более общем смысле.

Claude громче всех это популяризовал, но сам паттерн уже живёт шире: Codex, Cursor, OpenCode, OpenClaw и другие агенты постепенно начинают понимать скиллы. Правда, как обычно в нашем прекрасном мире, понимают они их чуть по-разному.


Душная краткая история

Промпты

Всё началось с контекста. Ещё во времена ChatGPT-3 нас начали «учить», что модели нужно знать подробности. И чем больше она их знает, тем лучше обработает твой запрос.

Пока Google учил нас получать информацию, кодируя запрос ключевыми словами, ChatGPT, наоборот, просил детально и подробно описать проблему, задачу или вопрос.

Я помню свои первые попытки писать код с ChatGPT, когда просто копируешь ему метод и говоришь: «Ебашь пиздато». Ну и получалось как в той прекрасной «Энциклопедии профессора Фортрана».

30+ лет книге...
30+ лет книге...

За три года мы уже привыкли, что вполне можно задавать вопросы в формате:

«Я хочу подарить знакомой подарок на день рождения, но так, чтобы явно обратить на себя внимание. Она увлекается космосом, я видел у неё приложение с картой звёздного неба, а ещё она любит походы. Работает в издательстве дизайнером и обожает кофе».

А не как раньше в Google:

«сиськи порно видео без регистрации и смс».

Однако когда задача чуть больше, чем на один тик, уместить в промпте все аспекты бывает сложно.

AGENTS.md, Cursor Rules и прочие локальные инструкции

С появлением агентов моделям стало не нужно кормить свой код огромными ложками: они научились читать файлы с твоего диска. Однако проблема инструкций никуда не делась.

AGENTS.md сейчас позиционируется как «README для агентов»: предсказуемое место, где кодинг-агент может найти команды сборки, правила проекта и ожидания по работе с репозиторием. У OpenAI Codex есть отдельная документация по AGENTS.md, а сам формат описан на agents.md. Cursor, в свою очередь, развивал Project Rules и .cursor/rules, где правила можно подключать по релевантности, вручную или по паттернам файлов. Anthropic позже оформила скиллы как папки с инструкциями, скриптами и ресурсами, которые Claude подгружает динамически под конкретную задачу.

Осенью 2025 года Anthropic громко выкатила Agent Skills и сформулировала идею так: вместо того чтобы плодить отдельных агентов под каждый сценарий, можно давать агенту переиспользуемые навыки.

Skills or die!

Сперва я вообще не понял, зачем мне скиллы, когда у меня есть богоподобные .cursor/rules/*.mdc.

И несмотря на то, что я уже давно не сидел на Cursor, предпочитая 5.3 Codex на OpenCode, постепенно я начал смотреть в сторону Claude Code и скиллов. С появлением Opus 4.6 я решил попробовать посидеть на нём плотнее и поизучать скиллы подробнее.

Я понимал скиллы как те же Cursor Rules, только с какими-то непонятными скриптами, строгой документацией на MD-файлы и прочим церемониалом. Однако довольно быстро скиллы захватили все мои мысли.

И я бы не сказал, что «познал дзен». Мне кажется, я до сих пор каждый день переоткрываю для себя скиллы. Но уже тогда я думал: «Вау, а что ещё надо-то?» После этого «а что ещё надо?» экосистема вокруг скиллов начала быстро обрастать новыми практиками: eval’ами, оптимизацией description, запуском в отдельных контекстах и прочими радостями человека, который хотел просто не забывать тесты перед деплоем.

Что такое Skill

Если совсем просто, skill — это инструкция.

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

Вы пишете скилл: «Каждый раз перед деплоем мы запускаем тесты». И каждый раз, когда агент думает, что пора деплоить, он запускает тесты.

Модель, пока «думает» (thinking), что всё доделала и надо задеплоить, «вспоминает», что у неё есть навык «запускать тесты перед деплоем». По контексту это очень похоже на то, что надо сделать перед деплоем, который она собралась запускать. Поэтому она открывает скилл и читает инструкции: что именно надо запустить, какой результат ожидать и что делать дальше при успехе или неудаче.

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

skill run-test, description: «запускать тесты перед деплоем».

И всё.

SKILL.md

Минимальный скилл — это директория с файлом SKILL.md.

my-skill/  
├── SKILL.md  
├── scripts/  
├── references/  
└── assets/

Внутри SKILL.md лежит YAML-frontmatter с обязательными name и description, а ниже — обычные markdown-инструкции.

---
name: run-tests-before-deploy
description: Use when preparing a deployment and validating changes before release.
---

## Что делать

1. Определить, какие тесты относятся к изменению.
2. Дописать тесты для нового функционала.
3. Запустить нужные тесты через `go test ./...`.
4. Если тесты упали — не деплоить.
5. Если тесты прошли — продолжить деплой.

Рядом могут лежать scripts/, references/, templates/ и любые другие файлы, которые агент подтянет по необходимости. В этом и смысл: агент не обязан держать весь скилл в контексте всегда, он может сначала увидеть только описание, а потом открыть нужные инструкции и файлы.

Скиллы размещаются в "родительской директории" для скиллов (.claude/skills, .codex/skills, .cursor/skills, .agents/skills и так далее). Ну и, логично, агенты читают эти директории перед каждой новой сессией, добавляя себе в контекст name+description ваших скиллов.

description как крючок для агента

Как я уже говорил выше, во frontmatter самое главное — это description.

Фактически это короткие инструкции-триггеры: когда агенту следует читать скилл целиком и начинать выполнять его инструкции.

Тут важно держать баланс. Короткий description будет «ускальзывать» от агента, слишком длинный — жрать контекст и ловить ложные срабатывания. Зафиксируем, что именно description один из самых важных аспектов скиллов, т.к. именно на него «клюёт» агент.

Скрипты, шаблоны, reference-файлы

Но не инструкциями едиными славятся скиллы.

Постепенно используя скиллы всё чаще и чаще, я сталкивался с тем, что формат выдачи результата разный, а если надо выполнить какие-то скрипты, то скрипты модель тоже пишет каждый раз по-разному.

Тут-то до меня и дошло, что я могу прописать в скиллах шаблоны ответов и разместить рядом готовые скрипты. Зачем модели лишняя работа в виде генерации шаблона или скрипта, если она может сделать это один раз, а дальше просто запускать то же самое?

Очередной раз прозрел. Холодный пот выступил на моём лбу от осознания, как сильно я сейчас всё заоптимизирую. Настолько сильно, что никто потом не разоптимизирует обратно.

Почему Skill — это не просто Markdown

В тот момент у меня был в работе скилл e2e-тестирования вебхуков.

Вебхуки на моём проекте проходят довольно долгий путь: событие, которое попадает в очередь, оттуда в воркер, оттуда в retry-джобу и так далее. Всё как у взрослых.

Тестировать всю эту схему обычными тестами через моки/fake и подобные техники не круто. А тут как будто сам Дарио Амодеи вложил мне в руки скиллы и сказал: «Трин, иди и пиши крутые тесты».

Скилл по простому промпту «тестируем хуки на деве» задавал пару вопросов по инструкции и приступал к работе:

  1. Проверял по шаблонам, что там в dev-базе.
  2. Смотрел, есть ли подписки на события у конкретных пользователей.
  3. Поднимал в dev-кубе pod с Python-вебсервером по шаблону.
  4. Поднятый вебсервер часть запросов принимал 200-м ответом, часть — 500-м или таймаутил.
  5. Параллельно запускал API-запросы, генерировал события и ждал, пока они пройдут очереди и попадут в воркеры и джобы.
  6. Собирал статистику с вебсервера.
  7. Готовил summary: «так и так, всё пашет» или «так и так, не пашет, и вот почему».

При этом сам скилл был довольно короткий, потому что:

  • шаблоны summary лежали в отдельных файлах;
  • Python-вебсервер — отдельно;
  • Kubernetes-темплейты — отдельно;
  • возможные проблемы и «в чём может быть дело» — отдельно.

Например, если проблем не было, скилл не подключал troubleshooting.md, экономя контекст. А если проблемы были, он не подключал файл шаблона финального summary.

Ниже я показываю нейтральную структуру скилла, а не конкретный путь установки. В реальности путь зависит от агента: у Claude это один каталог, у Codex другой, у Cursor третий, а OpenCode вообще умеет читать несколько совместимых вариантов.

skills/webhook-test
├── references
│   ├── k8s-test-server.yaml
│   ├── server.py
│   ├── tinker
│   │   ├── bootstrap.php
│   │   ├── check-readiness.php
│   │   ├── cleanup.php
│   │   ├── create-models.php
│   │   ├── create-subscriptions.php
│   │   ├── dispatch-events.php
│   │   ├── reload.php
│   │   ├── show-samples.php
│   │   ├── switch-to-retry.php
│   │   └── verify-results.php
│   └── troubleshooting.md
└── SKILL.md


В данном примере server.py лежит в references, а не в scripts, где его в целом ожидаемо увидеть. Но тут прикол в том, что это именно шаблон скрипта, а не скрипт для запуска агентом.

Почему скиллы доминируют

Конечно, всё зависит от задач. На самом деле скиллы не всегда «доминируют». Ну не вот прям «доминируют». Однако в большинстве прикладных задач они наиболее понятны пользователям и просты в освоении.

Против памяти

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

Но я успел потрогать несколько подходов: от простых WikiMemory-паттернов до отдельных memory-слоёв вроде Mem0, MemPalace и AgentMemory. Все они по-своему решают важную задачу: дают агенту долговременную память, помогают помнить предпочтения пользователя, факты из прошлых диалогов, историю решений и контекст между сессиями.

Но это не совсем то, что я жду от процедурной работы агента.

Память хороша для фактов:

  • «пользователь пишет на Laravel»;
  • «в этом проекте используется Pest»;
  • «мы уже выбирали такой-то Go-пакет для Redis»;
  • «пользователь не любит длинные отчёты».

Скилл хорош для процесса:

  • как именно писать тест;
  • какие команды запускать;
  • в каком порядке проверять результат;
  • что делать при ошибке;
  • какой шаблон ответа вернуть пользователю.

Память — это «я где-то слышал». Скилл — это «у меня есть инструкция, чеклист и готовые инструменты».

Против MCP

С MCP всё интереснее, потому что MCP — не враг скиллов. Это вообще другой слой.

MCP даёт агенту доступ к внешнему миру: GitHub, файловой системе, браузеру, базам, CRM, внутренним API и прочим штукам, до которых модель сама не дотянется. Anthropic описывает MCP как открытый протокол для подключения моделей к внешним источникам данных и инструментам; позже MCP передали в Agentic AI Foundation под Linux Foundation.

Но MCP сам по себе не объясняет агенту, как именно работать.

Он может дать инструмент github.search_issues, но не скажет:

  • когда его вызывать;
  • какие issue считать релевантными;
  • как отличать баг от фичи;
  • как оформить итоговый отчёт;
  • что делать, если найдено три похожих issue;
  • когда надо остановиться и спросить пользователя.

Вот здесь и появляется скилл.

MCP даёт агенту руки. Скилл объясняет, что этими руками делать, чтобы не получилось «я подключил 18 инструментов и теперь уверенно ковыряю прод отвёрткой».

Против огромных rules-файлов

Огромные AGENTS.md, как и MCP, — это пожиратели контекста, которые ещё и модифицировать тяжело.

Сначала там лежит:

Перед PR запускай тесты.

Потом:

Перед PR запускай тесты, но не все, а только unit.

Через неделю:

Перед PR запускай тесты, кроме фронта, если менялся только бэк,  
но если менялся contracts/, то запусти ещё генерацию типов.

Через месяц им можно вызвать демона:

Перед PR запускай тесты, кроме фронта, если менялся только бэк,  
но если менялся contracts/, то запусти ещё генерацию типов.
ВАЖНО: пункт выше не применять к legacy-api, кроме случаев,  
когда пользователь явно попросил проверить webhooks-v2.
ВАЖНО: тесты запускаем через docker compose команду.
ОЧЕНЬ ВАЖНО: ЕСЛИ ПОЛЬЗОВАТЕЛЬ ПОПРОСИЛ НЕ ЗАПУСКАТЬ ТЕСТЫ -- НЕ ЗАПУСКАЕМ ТЕСТЫ

Проблема не в том, что rules плохие. Проблема в том, что общий файл слишком легко превращается в свалку процедур, исключений и исторических травм.

Не вместо всего, а поверх всего

Самая прелесть скиллов, конечно, в том, что у тебя может быть много MCP-серверов и огромные MD-файлы, но использовать их ты можешь с помощью скиллов только в нужный момент.

То есть тот же скилл может выполнять инструкции:

  • «подключись к MCP»;
  • «прочитай этот огромный старый вонючий MD-файл».

И да, в такие моменты вашему контексту конец. Но только в эти моменты. Во все остальные скиллы позволяют дёшево держать их смысл в памяти и вызывать их только по необходимости.

Всё это лирика. Давайте уже переходить к примерам.

Пример №1: маленькие скиллы, которые агент сам цепляет по смыслу

В качестве первого примера я хочу показать немного магии, которая лично меня заставляет шевелить волосами в носу.

Фактически это первое, что пришло в голову. Простая задача.

Вводные: PHP, Laravel. Пишу два скилла.

skills/model/SKILL.md:

---
name: model
description: |
  Создание Eloquent-моделей для Laravel.
---

## Что спросить у пользователя (если не указано)

1. **Имя модели** (PascalCase, единственное число): `User`, `Order`, `Post`.
2. **`$fillable`** — список атрибутов для массового присваивания.
3. **`$casts`** — опционально, мапа `атрибут => тип` (`int`, `bool`,
   `array`, `datetime`, `decimal:2`, enum-класс и т.п.).
4. **SoftDeletes** — по умолчанию **ВКЛЮЧЁН**. Выключать только при явной
   инструкции пользователя.

Если атрибуты уже даны в сообщении — не переспрашивать, генерировать сразу.

## Скелет модели (по умолчанию, с SoftDeletes)

...

## Без SoftDeletes (если пользователь явно отказался)

Убрать `use SoftDeletes;` и `use Illuminate\Database\Eloquent\SoftDeletes;`.

skills/migration/SKILL.md:

---
name: migration
description: |
  Создание Laravel-миграций по существующей Eloquent-модели.
  Всегда создавать миграцию для новых моделей, если её нет.
---

## Алгоритм

1. **Найти модель** (обычно `app/Models/{Name}.php`). Если путь не дан —
   спросить или поискать по имени класса.
2. **Прочитать**:
   - `$fillable` — список колонок.
   - `$casts` — мапа `колонка => тип` для вывода типов.
   - наличие `use SoftDeletes;` — нужен `deleted_at`.
   - наличие `public $timestamps = false;` — отключить `timestamps()`.
   - кастомные `$table`, `$primaryKey` — учесть.
3. **Сгенерировать миграцию** в `database/migrations/` с именем вида
   `YYYY_MM_DD_HHMMSS_create_{table}_table.php` (текущая дата/время).

...

## Правила

- Колонки в миграции — строго в порядке из `$fillable`.
- `id()` первым, `timestamps()` в конце, `softDeletes()` после `timestamps()`.
- Если в модели `$timestamps = false` — не добавлять `timestamps()`.
- `nullable()` ставить только если пользователь явно сказал или каст предполагает (`?type` в PHP 8). По умолчанию NOT NULL.
- Для FK-колонок (`*_id`) — `foreignId('user_id')->constrained()`, если понятно, на какую таблицу ссылается, иначе `unsignedBigInteger('user_id')`.
- Индексы (`unique`, `index`) — не добавлять без явной просьбы.
- Имя файла: `date('Y_m_d_His')` + `_create_{table}_table.php`.

Важный момент: эти два скилла не обязаны знать друг о друге напрямую. model отвечает за модель, migration — за миграцию. Связка появляется на уровне задачи: агент создал новую модель, увидел правило про миграции и подтянул второй skill уже в процессе работы.

Далее простой промпт:

Создай мне модель User с полями name, surname, berhday_at и sex

И результат:

Skill(model)
  ⎿  Successfully loaded skill
  ⎿  Allowed by auto mode classifier

  Listed 2 directories (ctrl+o to expand)

⏺ Пустой каталог. Создам app/Models/User.php + миграцию (правило skill'а: новая модель → миграция).

⏺ Write(app/Models/User.php)
  ⎿  Wrote 22 lines to app/Models/User.php

⏺ Skill(migration)
  ⎿  Successfully loaded skill
  ⎿  Allowed by auto mode classifier

⏺ Bash(date +%Y_%m_%d_%H%M%S)
  ⎿  2026_05_14_042553

⏺ Write(database/migrations/2026_05_14_042553_create_users_table.php)
  ⎿  Wrote 26 lines to database/migrations/2026_05_14_042553_create_users_table.php

⏺ Готово.

  - app/Models/User.php — User с SoftDeletes, $fillable = name/surname/birthday_at/sex, $casts['birthday_at'] = 'date'.
  - database/migrations/2026_05_14_042553_create_users_table.php — таблица users, поля в порядке $fillable, timestamps() + softDeletes().

  Заметка: berhday_at трактовал как опечатку → birthday_at. sex оставил string (cast не указан). Если нужен enum / nullable / unique — скажи.

✻ Crunched for 42s

! tree ./
  ⎿  ./
     ├── app
     │   └── Models
     │       └── User.php
     └── database
         └── migrations
             └── 2026_05_14_042553_create_users_table.php

     5 directories, 2 files

Раньше я пытался предусмотреть все эти «а ещё создай миграцию», «а ещё напиши тесты» и прочее в одном скилле. Теперь же стараюсь разделять скиллы на небольшие атомарные скиллы, которые могут быть независимыми. Гораздо удобнее дорабатывать скиллы, когда они умеют делать что-то одно, но делают это хорошо.

В данных примерах я специально сильно упростил сами скиллы. Фактически они умеют только «создавать». Боевые же скиллы умеют модифицировать те же модели, держать их актуальными, делать update-миграции и так далее.

Я специально привёл лог работы агента, где видно, что он вызывает скилл миграций уже после создания модели.

В этом и кроется магия скиллов: агент умеет подтягивать их в процессе своих рассуждений. Аналогично на промпты вроде «надо исправить функционал этого экшена/сервиса/контроллера» агент подтягивает анализ изменений, ревьюит решение, «помнит», что новый функционал надо покрыть тестами, не сломать старое и не нарушить обратную совместимость.

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

С одной лишь разницей: у агента меньше шансов ошибиться или чего-то забыть. Как и в данном примере berhday_at сразу же исправлен на birthday_at.

Ну и надо ли говорить, что эти скиллы я не писал руками. Я просто сказал: «Создай такой-то скилл». Единственное, что я исправил, — нарочно упростил description и убрал примеры и лишнюю логику из скиллов.

Для наглядности положил проект на GitHub.

Пример №2: news-skill для OpenClaw

Окей, что насчёт более реального примера?

Тут не столько магия, сколько силушка скильная.

У меня крутится OpenClaw на локальном сервере, где запущено несколько агентов: мой личный и парочка для родственников/друзей.

Во-первых, общаться с современными моделями удобно через Telegram, тем более что ChatGPT позволяет это делать через подписку, а не через API. Во-вторых, OpenClaw пока «побеждает» по простоте и доступности у других, в том числе проприетарных решений. Тут мы получаем уже не просто чатик с моделью, но и долговременную память, локальные знания, шедулер и так далее.

Для себя я набросал скилл, который собирает мне новости.

Идея была простая: я тону в новостях про нейросети. Они развиваются слишком быстро, хочется быть в курсе событий, но понятие «новостей» размывается.

Ты либо следишь только за официальными блогами фронтиров, либо каждый день получаешь одни и те же новости типа «Вышел ChatGPT 5.5!» из разных источников.

И ты либо сам разгребаешь все эти тонны новостей, фильтруя то, что неинтересно или что уже читал, но от другого автора. Либо доверяешь это LLM, которая легко улавливает смысл новостей и может ранжировать их под тебя по заданным параметрам, плюс исключать то, что уже тебе показывалось именно по смыслу.

Ну разве не лапочка?

Однако я быстро пришёл к тому, что данный скилл нужен не только мне, но и друзьям. Они видят, как это работает у меня, и просят: «Вау, а сделай нам так же, но другие источники и темы».

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

У себя скилл хранит только шаблоны настроек, шаблоны отображения новостей и так далее.

Получилось вот что:

skills/news-digest
├── SKILL.md                   # основной файл скилла
├── templates/
│   ├── item.md                # шаблон одного элемента новости
│   ├── digest.md              # шаблон обёртки дайджеста
│   ├── empty.md               # используется, когда ничего не подошло
│   ├── scheduling-prompt.md   # шаблон промпта для внешних планировщиков
├── defaults/
│   ├── settings.yaml          # дефолтные настройки для свежей установки
└── README.md                  # этот файл

Скилл имеет инструкции в SKILL.md, а также templates и дефолтный конфиг. При первом запуске у пользователя, происходит onboarding, скилл опрашивает пользователя, что он хочет читать, из каких источников и так далее. Наверно, стоит вынести onboarding в отдельный reference, чтобы не держать его в теле скилла, но мне лень.

Сам скилл ничего не знает о выбранных темах/источниках и всё хранит в пользовательском workspace конкретного пользователя OpenClaw:

.openclaw/workspace-trin/news-digest-data/
├── 2026-04-26
│   └── evening.md
├── 2026-04-27
│   ├── evening.md
│   ├── manual-063455.md
│   ├── morning.md
│   └── raw
├── ...
├── feedback.jsonl
├── README.md
├── seen.jsonl
├── settings.yaml
├── source-notes.md
├── source-stats.jsonl
└── templates
    ├── digest.md
    ├── empty.md
    ├── item.md
    └── scheduling-prompt.md

26 directories, 55 files

И по шедулеру отдаёт новости типа:

Новостной дайджест — 2026-05-13 · morning

Слот: morning · Таймзона: Europe/Moscow · Собрано: 2026-05-13 10:00 MSK

Утром без повторов: главный новый сигнал — Google обновил линейку Gemini,
а Claude Code после большого agent-view релиза закрыл несколько практических регрессий.

## Frontier LLMs

### Claude Code v2.1.140

🛠️ 2026-05-12 · Anthropic / Claude Code changelog · important

Коротко: релиз в основном эксплуатационный — фиксы `/goal`, background-сервиса,
hot-reload настроек и нескольких проблем вокруг managed settings.

Почему важно: это стабилизация именно агентных workflow. Меньше зависаний,
меньше ложных хуков, понятнее поведение в managed/enterprise-настройках.

## Не вошло

- OpenClaw: свежий релиз повторял кластер изменений, уже разобранный вчера.
- GitHub / agent devtools: несколько материалов всплывали снова, но уже были в seen.
- Laravel, Expo/React Native и Yandex Cloud: новых релизов выше порога important не нашлось.

Главное здесь не в том, что скилл умеет читать RSS. RSS умеет читать любой скрипт на коленке за вечер.

Главное в другом: скилл объединяет процедуру, настройки, локальное состояние и семантическую фильтрацию.

Обычный скрипт помнит ссылки.
Агент со скиллом помнит смысл.


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

Как обуздать скиллы и с чего начать

1. Ставьте глобально только базу

Для начала стоит понять, что скиллы могут быть как глобальными в системе и распространяться на всех агентов, так и локальными в конкретном проекте.

В глобальные скиллы я настоятельно рекомендую сразу установить официальные скиллы от Anthropic. Пусть вас не смущает, что это именно Anthropic скиллы, они прекрасно работают и с другими агентами.

Это условно «базовые» скиллы: как работать с PDF, XLSX, DOCX, презентациями и так далее. Помимо этих базовых скиллов там есть великолепный скилл skill-creator, который будет создавать скиллы за вас в правильном формате — и не только.

Также для себя я глобально установил скилл agent-browser и его дочерний скилл dogfood для тестирования веб-проектов.

По структуре и best practices можно смотреть AgentSkills.io, официальный репозиторий anthropics/skills и документацию Claude по frontmatter для Skills.

У разных агентов могут быть свои дополнительные поля frontmatter: модель, permissions, режим запуска, совместимость, ограничения инструментов и так далее. Но переносимым минимумом остаются name, description и инструкции.

2. Проектные скиллы держите рядом с проектом

В конкретных проектах стоит держать скиллы, специфичные для проекта: как делать ревью, как устроена архитектура, как создавать классы, где что хранить и прочие паттерны. Примеры с model/migration, пусть и очень простые, я уже описывал выше.

3. Пишите маленькие атомарные скиллы

Главная ошибка — пытаться сразу написать mega-laravel-skill, который умеет всё: модели, миграции, тесты, контроллеры, OpenAPI, деплой, кофе и массаж.

Такой скилл быстро превращается в тот же AGENTS.md, только в новой директории.

Лучше дробить:

  • model — создаёт и обновляет модели;
  • migration — создаёт и проверяет миграции;
  • pest-tests — пишет и обновляет тесты;
  • api-resource — следит за форматом API-ответов;
  • changelog — оформляет изменения.

Маленький скилл проще отладить, проще переиспользовать и проще улучшать. А главное — агент может собрать нужную цепочку сам, как в примере с моделью и миграцией.

4. Используйте skill-creator, но не верьте ему вслепую

Великолепие skill-creator не просто позволит создать скилл по всем стандартам, но также позволит оптимизировать скилл: убрать лишнее или, наоборот, добавить новых инструкций.

То есть буквально промпт:

«С помощью skill-creator проверь мой такой-то скилл. Мне кажется, он плохо работает в таких и таких случаях».

У skill-creator есть отдельная ценность: он не только создаёт скилл по формату, но и помогает его отладить. В моём случае он мог прогонять набор тестовых промптов, сравнивать, когда скилл срабатывает и когда молчит, а потом предлагать более точный description.

То есть это не просто генератор директории с SKILL.md, а маленький редактор процедур: убирает лишнее, уточняет триггеры, предлагает вынести тяжёлые куски в references/ или scripts/.

Это всё тоже может работать «как магия», если докинуть немного контекста вроде:

«С помощью skill-creator оптимизируй мой скилл model. Он должен не только создавать модели, но и уметь модифицировать их».

5. Оформляйте документацию как скилл

Отдельное открытие: документацию по проектным паттернам тоже можно оформлять как скилл.

Сначала я просто переносил туда куски из AGENTS.md: почему мы используем outbox pattern, как он устроен, где лежат обработчики, какие ошибки уже были и чего делать нельзя.

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

То есть скилл становится не справкой «для человека», а справкой «для мышления агента».

Это просто вау.

6. Давайте скиллам эволюционировать

Раньше я добавлял в каждый скилл отдельный раздел «Эволюция» и писал туда инструкции вроде:

«Если пользователь делает заметки по работе скилла, предложи обновить его. Веди CHANGELOG.md: что поменяли, зачем и почему».

Потом упростил до одного правила:

«Если пользователь недоволен результатом или явно уточняет процесс, предложи обновить скилл».

Этого оказалось достаточно. Если структура нормальная, агент сам понимает, куда внести изменение: в description, основной алгоритм, references/, шаблон ответа или troubleshooting.

Хороший пример тут — глобальный скилл go-packages.

Помимо инструкций о том, как и что мы устанавливаем, он имеет:

references/recommended.md
references/banned.md

Там список пакетов, которые я предпочитаю другим. При установке того или иного пакета скилл подтягивается и по инструкциям предлагает мне выбор между альтернативами: приводит ссылки на них, количество звёзд, последнее обновление с GitHub и так далее. Также он «запоминает» мой выбор.

Используя один стек, мы всегда подтягиваем ровно те пакеты, которые уже проверены в других проектах. Скилл отлично сам себя дописывает, и мне даже не нужно его «дёргать». Я просто промпчу:

«Делаем такой-то Go-сервис, он будет общаться с ClickHouse и Redis».

А агент сам подтягивает скилл, и тот сам говорит, какие пакеты мы для этого используем, либо предлагает выбор, показывая альтернативы.

Так и просится цитата Джони Айва: «Итс ЭМЭЙЗИНГ»

7. Не качайте всё подряд из awesome-репозиториев

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

Смотреть чужие решения — отлично. Брать идеи, структуру, хорошие description, шаблоны, troubleshooting — тоже. Но ставить всё подряд глобально я бы не советовал.

Во-первых, чужой скилл почти всегда написан под чужой workflow.

Во-вторых, если внутри есть скрипты, это уже весьма неприятная дыра безопасности, пусть и небольшая. Как и сам факт, что вы вообще чужому тексту даёте доступ к своему агенту.
В-третьих, чем больше глобальных скиллов, тем больше шума при выборе релевантного.

Глобально я готов ставить только базу: официальные скиллы Anthropic, agent-browser, может пару реально ежедневных инструментов. Всё остальное лучше писать под себя и под конкретный проект.

8. Хороший скилл должен работать даже на слабой модели

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

Если же для работы нужен только Opus на максимальном thinking, значит я, скорее всего, не написал скилл. Я просто спрятал промпт в файл и надеюсь, что дорогая модель вывезет мою лень.

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

Свои тяжёлые скиллы, в основном долгие e2e-тесты, я стремлюсь оптимизировать именно под работу слабых моделей.

Во-первых, токены не бесконечны. Если верить tokscale, я «сжёг» уже 11 миллиардов токенов за последние три месяца, и даже Max-подписка в Claude порой упирается в лимиты.


Во-вторых, они тупо выполняются быстрее.

Что по агентам? Claude, Codex, OpenCode, Cursor, OpenClaw и другие.

В этой статье я специально говорю про скиллы как про общий паттерн: папка, SKILL.md, description, инструкции, скрипты, reference-файлы итп. Однако стоит помнить, что это лишь «спецификация» и каждый агент «понимает» скиллы по-своему.

Да, базово все агенты понимают SKILL.md, читают его frontmatter и не грузят целиком, пока description не покажется агенту слишком подходящим для текущей задачи, однако есть и много отличий. Стоит помнить, что одинаковый скилл может совершенно по-разному отработать в разных агентах. Опять же, хорошо написанный скилл будет работать хорошо и одинаково в любом агенте, но всё же разница вполне может быть. Это как с вёрсткой сайтов в нулевых и десятых. Свидетели IE6 поймут о чём я ;)

Домашние директории

Основным отличием среди агентов, конечно, является «домашняя директория» для скиллов. Выше я уже указывал.

  • .claude/skills -> Claude code
  • .codex/skills -> Codex
  • .cursor/skills -> Cursor IDE
  • .agents/skills -> OpenClaw и другие агенты

особняком тут идёт OpenCode, из официальной документации следует, что OpenCode умеет читать скиллы сразу из нескольких директорий, что, конечно, удобно:

  • .opencode/skills -> свои «родные» скиллы
  • .claude/skills -> скиллы Claude code
  • .agents/skills -> скиллы для прочих агентов

Однако, не забывайте про силу AGENTS.md. Никто не запрещает вам промптить в нём:

Читай скиллы из следующих директорий:

- ~/.claude/skills
- ~/.codex/skills
- ~/.cursor/skills
- ~/.agents/skills
- ~/.ultra-new-agent/skills
- ~/.kill-all-humans/skills

Расширенный frontmatter

Все агенты читают name и description, о чём я говорил уже много раз. Помимо этого разные агенты читают дополнительные метаданные. Официальная спецификация говорит и о других полях:

  • license лицензия на скилл
  • compatibility указатель на необходимые системные пакеты и их версии
  • metadata key-value хранилище «прочих» настроек
  • allowed-tools разрешённые тулзы

Claude code позволяет явно задавать конкретную модель, что будет выполнять скилл, «умность» модели, режим запуска скилла как subagent и другое.

А тот же OpenCode прямо говорит, что все неизвестные поля заголовка будут игнорироваться.

Ну и как нам быть?

Во-первых, ничего не бояться. Все эти мелочи страшные только на бумаге. В 99% случаев скиллы буквально состоят из description + instruction.

Во-вторых, я для себя избрал простой путь: симлинки.
У меня есть одна «родительская» директория .agents/skills и в неё ссылаются .claude/skills и .codex/skills, мне хватает. Соответственно, если же вы используете какие-то другие кастомные агенты, вы так же можете иметь одну директорию со скиллами и просто симлинки на неё из других специфических мест.

Аналогично, кстати, я поступаю и с AGENTS.md. У меня есть AGENTS.md и симлинк на него из CLAUDE.md. Просто, доступно, универсально.

Няня, я у них поел!

Если вы всё ещё читаете и до сих пор не поняли, что вам сейчас делать, — просто начните с малого.

Возьмите свой AGENTS.md, CLAUDE.md или папку с заметками по проекту и попросите skill-creator разложить это на несколько маленьких скиллов. Не «один скилл на всё», а отдельные навыки под конкретные действия: ревью, тесты, миграции, деплой, работу с API, оформление changelog.

Потом попробуйте автоматизировать одну рутину, которая бесит вас чаще всего. Не самую сложную. Самую повторяющуюся.

Потому что в этом, кажется, и есть главный смысл:

AGENTS.md говорит агенту, где он.
MCP даёт ему руки.
Память даёт прошлое.
А скиллы дают профессию. Профессию джуна, который будет работать вместо меня, ахахаха (или как говоря в Бразилии: kkkkk).

Ну а если вы уже в теме — продолжайте обмазываться скиллами, и ваши волосы будут мягкими и шелковистыми.

Буду благодарен за любые ваши открытия про скиллы в комментариях. Особенно за практику, критику и мемы.

Полезные ссылки

📚 Стандарт и базовые объяснения

📜 Контекст, rules и AGENTS.md

🗂️ Коллекции skills и примеры

Повторю, что подобные ресурсы правильно использовать больше для обучения и подглядывания, а не для «я установил 100 лучших скиллов и теперь нихуя не понимаю»

🧑‍🔬 Мои примеры из статьи

🛡️ Безопасность

От промпт-инжектов никто не застрахован, вскользь я говорил об этом. На самом деле эти ссылки я посмотрел по диагонали, их нашёл chatgpt по просьбе  «ну и найди пару ссылок популярных работ на тему безопасности скиллов» ;) может тут не прям топовые статьи по безопасности, но они отлично дают понять всю опасность бездумно устанавливать чужие скиллы своим агентам.

80 комментариев 👇

Из своего опыта. Claude Code упорно нарушал несколько соглашений в коде (типа локальных импортов). Я писал в CLAUDE.md, в спеках, в скиллах, в памяти проекта, в глобальной памяти. Ничего не помогало. Сработали только хуки, которые на Stop запускают линтеры и падают, если нашли ошибки.

  Развернуть 1 комментарий

Материал интересный, но после нескольких недель вайб-кодинга по ночам, а потом пары внезапных ночей сна по 8-10 часов, пришёл инсайт, что ночами спать всё же лучше. :)

  Развернуть 1 комментарий

Респект за проделанный труд! Очень хороший и подробный материал получился, репостнул у себя на канале https://t.me/the_ai_architect/309

  Развернуть 1 комментарий

Интересно, появились ли уже какие-то фундаментальные труды по построению скиллов и архитектурным паттернам агентских фреймворков в целом, вроде GoF для ООП?

  Развернуть 1 комментарий

@greemster, нет конечно. "скиллы" — это Маркдаун файлы, которые недетерминированные черные коробки провайдеров могут включить в контекст, а могут и не включить, согут забыть, а могут не забыть и т.п.

Для фундаментальных работ нужен фундамент.

  Развернуть 1 комментарий
Nicky Rush Software engineer, product manager 14 мая в 06:02

Спасибо за труд! Каждое чтиво от Тринчика — праздник!

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

@n1ckyrush, Ахуеть, прочитал что можно подключить кодекс через подписку прямо в агента

  Развернуть 1 комментарий

@mrx,

  Развернуть 1 комментарий
Сергей Лазарев Руководитель отдела маркетинга (CMO) 14 мая в 20:19

Только вкатываюсь в эти дела и пока сижу на курсоре. Разработкой не занимаюсь. Основная цель: упрощать себе жизнь. Делаю агента по личным финансам, аналитика по работе с Bigquery и всякое такое.

После прочтения остался вопрос: есть ли разница в скилах при работе с клодом и при работе с курсором?

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

@Ceryozha,

На моем опыте:

  • Клод плевать хотел на скиллы с высокой колокольни, и более-менее нормально работает только с явно указанными скиллами. Он так же плевать зотел на глобальные скиллы, глобальную «память», периодически плюет на CLAUDE.md

  • Codex пока что достаточно стабильно подключает все необходимые скиллы в зависимости от задачи.


Так как вайб-кодеры и там и там, все может измениться уже завтра

  Развернуть 1 комментарий

Добавлю только одно: Клоду абсолютно наплевать на любые скиллы. Он из будет рандомно использовать, или не использовать, или использовать наполовину. Помогает (не на 100%) явно вызывать соответсвующие скиллы.

Кодекс почти в 100% автоматом подгружает релевантные скиллы в зависимости от задачи.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

@trin4ik подскажи, может ли агент в процессе исполнения скилла вызывать другой скилл, если тот понадобился?

  Развернуть 1 комментарий

@glader,

Да (проверено на claude и codex с https://github.com/obra/superpowers)

Запускаешь brainstorming, он потом вызывает writing-plans для написания планов, а потом executing-plans или subagent-driven-development для реализации.

Может срабатывать не всегда

  Развернуть 1 комментарий

@dmitriid, смотри, здесь явно прописано в скилле, что делать дальше. Я скорее про то, что скилл исполняется, и в процессе может понадобиться другой, более специфичный, но он не упомянут в исходном скилле. Так сработает?

  Развернуть 1 комментарий

@glader, ааа. это я честно не обращал внимания.

Чисто теоретически может, если что-то агкнта тригернет, и он "вспомнит", что есть соответсвующий скилл

  Развернуть 1 комментарий

@glader, кажетсья, в процессе thinking агент может генерировать ответ, который будет по контекту подходить под description секцию другого скила, что станет тригером для его вызова.
На редите пишут что перекрестных ссылок между скилами нет, как с файлом "@your-skill-name" работать не будет.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

https://github.com/obra/superpowers

Удивлён что нет этого плагина в подборке. По сути маст хэв штука которая должна устанавливаться в агента первым делом.

Плагин - это на набор скиллов, основной скилл там это брейншторминг, с ним можно брейнштормить любые задачи, не только кодерские (но кодерские он решает прям на ура). В том числе - его можно и нужно использовать для написания своих скиллов.

Особенно если у вас не так уж много опыта и понимания - лучше доверится машине, разложить всё на этапе брейшторминга по целям и задачам, собрать план реализации, реализовать и протестировать. Весь этот флоу уже вшит в этот плагин.

  Развернуть 1 комментарий

@voodooism, brainstorming is love.

Еще у меня работает такой подход (хотя по ощущуениям клод стал хуже этой весной):

  • brainstorm
  • "создай high-level plan с описанием что, как и почему plans/"
  • "для каждого из пунктов в плане запусти подагента, который создаст детальный технический план, включая все как, зачем, почему в plans/implementation. Каждый агент должен перечитать оригинальный план"

Создает очень неплохую пошаговую реализацию проекта.

  Развернуть 1 комментарий

@voodooism, я пробовал, но неосилил. Для начала, там очень много магии промптов, а меня очень нервируют инструменты, которые я не понимаю. Возможно, надо привыкать. Пробовал на несложных задачах, он нагенерил описаний и спек в три раза больше, чем ожидаемый код, долго думал, сожрал лимит и умер.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

Спасибо, очень хорошо пишешь!

  Развернуть 1 комментарий

Спасибо, очень познавательно. Я пока только осваиваюсь с агентами и прочитав этот пост и потренировавшись на реальном проекте, могу констатировать: создание как глобального, так и проектных AGENTS.md для Codex реально качественно улучшило дело.

  Развернуть 1 комментарий
Владислав Умнов Основатель стартапов 15 мая в 18:16

Вчера ночью прочитал, сегодня утром применил. Охуительно работает. Я пользовался скиллами и ранее, но как то до твоих юзкейсов не додумался. Сейчас все летит прям. Спасибо.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

Спасибо!

У меня ток один вопрос, все агенты по умолчанию смотрят во все скиллы? А agents надо промптить на всякий случай? Или надо помнить про свои скиллы и указывать каждый раз, какой лучше применить?

Ну то есть три вопроса, но как бы один!

  Развернуть 1 комментарий

@mrt, агентам видны поля скилла: name, description.

Запустит ли агент скилл, если скилл явно не был упомянут - вопрос, не всегда это работает.
Так что в идеале либо явно указывать скилл либо хотя бы проговаривать ключевые слова из name / description чтобы агент сразу понял

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

@timurkhakhalev @trin4ik спасибо, вы лучшие

  Развернуть 1 комментарий
Nikolay Sheyko AI Integrator | bottleneck seeker 19 мая в 06:45

Отличный гайд! Добавлю от себя, что промптить агента читать скиллы из других директорий – не самый оптимальный подход.

Потому что это ломает стандартный подход к skill disclosure, когда в контексте автоматически подсовываются descriptions скиллов. Вместо этого агент может пойти и смотреть только на названия скиллов, или наоборот полезть читать весь контент.

У меня лучше всего работает подход, когда есть просто ~/.agents/skills, а потом я симлинкаю нужные скиллы или даже всю папку в ~/.<agent_name>/skills

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

Топ-контент, спасибо!

У кого-нибудь есть опыт использования каких-нибудь фреймворков промптов, памяти для агентской разработки на больших и серьезных кодовых базах greenfield/brownfield? Вроде SDD или чего-то похожего? Было бы интересно обсудить.

  Развернуть 1 комментарий
Vadim Chepegin решаю бизнес задачи с помощью IT 19 мая в 14:34

Статья как раз в тему: я собираюсь начать добавлять скилы к своей упаковке https://github.com/vadimche/ai-agent-rails-pack

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

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

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб