Skills как замена подтверждениям
Много раз убеждался, что некоторые вещи, которые кому-то кажутся очевидными, другим людям в голову не приходят. Так что очередное небольшое наблюдение из работы с Claude Code запишу сюда.
У большинства пользователей skills (скиллы или навыки) воспринимаются как специализированные инструкции для агента, которые описывают, как ему работать с какой-то частью задачи, API или типом данных. Как-то гораздо реже встречается другая сторона использования скиллов — возможность найти золотую середину в использовании агентов внешних инструментов без создания проблем в безопасности, и добавить этому использованию детерминированности.
Предположим, вы с агентом выполняете какую-то задачу, предусматривающую запуск команды в терминале или обращения к внешним ресурсам, через API, например. Если у вас разумно настроена безопасность, то агент на каждый такой запрос просит разрешения — потому что он либо запускает curl, либо пишет небольшой код на python, и хорошо бы убедиться, что он не дергает ничего потенциально опасного, а за запрос разрешений отвечают простые маски и там не пропишешь сложную логику. В итоге вы либо тупо соглашаетесь с каждым предложением, что небезопасно, либо разрешаете ему запускать curl в любом виде, что вообще опасно. Кроме того, всякий раз конструируя команду, агент регулярно ошибается — если бы это был человек, то это был бы аналог того, что каждую новую команду он набирает по символу. А это время и токены, между прочим.
Первый подход к скиллам обычно выглядит как “Давайте ему запишем все возможные команды в SKILL.md и он не будет ничего придумывать”. Но всё, что вы даёте агенту в формате .md — это инструкции и их выполнение недетерминированно — иначе говоря, агент может модифицировать команду, особенно, когда она будет шаблонной.
Поэтому более системный подход будет таким — “Напишем скрипт с обертками всех необходимых для этой задачи команд и разрешим агенту запускать только его”. Агенту не надо ничего придумывать — у него есть собственный tool со всеми необходимыми функциями, разрешение его использовать всегда и этот скрипт будет работать совершенно определенным образом, без фантазий LLM. Мне встречалось, правда, желание агента переписать этот скрипт, но это уже другая операция и её можно перехватить.
Еще более правильный подход — если задача объемная и довольно инструментальная, то создать соответствующего агента, который будет запускаться основным процессом, работать со своим контекстом, возможно, использовать более слабую модель (какой-нибудь поиск по тексту или проверка отчетов через API) и использовать только этот скрипт. В принципе, можно и скилл запускать с параметром context:fork, что даст похожий эффект, но использование отдельного агента позволит вам точнее его инструктировать — с context:fork Claude запустит general-purpose агента, инструкции которого довольно общие.
Так вот, если из всего потока операций при выполнении задачи выделить команды, требующие подтверждения, обернуть их скриптом (конечно же, пусть его сам Claude Code и напишет), где эти команды будут запускаться с ограниченным набором параметров, и разрешить только этот скрипт выполнять без подтверждений — ваша клавиша Enter будет вам благодарна, а вы сами сможете отойти от компьютера без ущерба для работы.