Слогер Создать блог
Разработка

Две ошибки в навыках Claude Code: перерасход токенов и сброс прав Bash

Короткий вопрос — и 30% контекста исчезло. Разрешения на git commit хватает на один ход. Разбираем, почему так происходит и как это исправить.

Вы задаете короткий вопрос о ценах API в Claude Code, запускаете /context — и обнаруживаете, что треть окна контекста на миллион токенов просто исчезла. На другом компьютере — сорок процентов. Вопрос один и тот же, ответ один и тот же, а расход различается почти на сто тысяч токенов.

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

Ловушка первая: имя модели — спусковой крючок для документации

Один инженер спросил «does fable use api billing?» и сразу запустил /context. Результат: 295 000 токенов улетело на один вопрос. На втором ноутбуке тот же вопрос съел 354 000 токенов. При этом контрольные вопросы без упоминания модели («какая последняя LTS-версия Node?», «чем MIT отличается от Apache 2.0?») обошлись в копейки: два вопроса на двоих — 7,5 тысячи токенов.

Разница в том, что в первом вопросе упоминается конкретная модель Claude. Это активирует встроенный навык claude-api, который подгружает полный пакет документации — сотни килобайт. Навык не отличает простой вопрос о цене от запроса на развертывание стримингового tool-use loop — и в обоих случаях грузит одно и то же.

При этом обычные механизмы экономии работают отлично. 59 MCP-инструментов занимают 0 токенов, потому что их схемы подгружаются лениво. Описания 16 навыков — всего 2,2 тысячи токенов. Весь перерасход сосредоточен в разделе Messages, куда документация claude-api попадает одним куском.

Ловушка вторая: allowed-tools живет один ход

Вы добавляете в навык allowed-tools: Bash(git add *) Bash(git commit *), запускаете /commit — и Claude коммитит без вопросов. Но следующая просьба снова вызывает запрос разрешения. Ничего не сломано: allowed-tools работает ровно так, как задумано, просто область действия уже, чем кажется.

Права действуют только в тот момент, когда навык вызывается. Как только вы отправляете следующее сообщение, разрешение очищается. При этом содержимое SKILL.md остается в контексте разговора навсегда — отсюда ощущение, что навык загружен, но права исчезли. Оба утверждения верны.

И еще один нюанс: allowed-tools — это не барьер безопасности. Он не запрещает остальные инструменты, а лишь заранее разрешает перечисленные. Если нужно действительно заблокировать что-то на время работы навыка, используйте disallowed-tools — он тоже действует один ход.

Как исправлять

Для токенов: если вопрос касается только цены или биллинга, переформулируйте его так, чтобы не упоминать имя модели. Вопрос без имени модели не активирует навык claude-api. И следите за /context после любых вопросов с упоминанием модели — так вы заметите раздувание на ранней стадии, пока оно не съело бюджет длинной сессии.

Для прав: если вам хочется, чтобы разрешение жило дольше одного хода, это верный признак: правилу место в настройках permission, а не во фронтматтере навыка. Разделение такое: allowed-tools и disallowed-tools внутри SKILL.md отвечают за один вызов; allow rules в настройках проекта или пользователя действуют всю сессию или проект; deny rules блокируют инструмент глобально.

Если у навыка есть собственный скрипт, ${CLAUDE_SKILL_DIR} подставляется и в markdown, и в bash-правила. Используйте эту переменную в обоих местах, чтобы правило точнее совпадало с реальной командой. Жестко прописанный путь сломается, когда навык установят в другое место. Для плагинных навыков переменная указывает на подпапку, а не на корень плагина, так что угадать путь вслепую рискованно.

Сводная таблица: где живут правила доступа

МеханизмГде прописанСфера действияТипичная задача
allowed-toolsfrontmatter навыкаОдин вызов навыкаРазрешить git commit без подтверждения
disallowed-toolsfrontmatter навыкаОдин вызов навыкаЗапретить опасный инструмент
allow rulessettings проекта или пользователяСессия или проектПостоянное разрешение на команду
deny rulessettings проекта или пользователяГлобальноЗаблокировать инструмент везде

Что делать команде

Если вы используете Claude Code для долгих автоматизаций — CI, фоновые агенты — проведите аудит всех навыков с allowed-tools. Пометьте, какие права должны сохраняться между ходами, и перенесите их в settings. Параллельно проверяйте /context после коротких вопросов: если после упоминания модели тратится больше, чем обычно, — это повод переписать формулировку.

Обе проблемы имеют простую механику и простое решение. Первая — вопрос про имя модели, вторая — непонимание области действия разрешений. Достаточно один раз увидеть цифры в /context, чтобы больше никогда не жечь токены по незнанию.

По материалам: dev. Текст переработан редакцией Слогера.

← На главную

Рекламное место — Конец поста
Реклама · Слогер

Комментарии (0)

Войдите, чтобы комментировать.

Пока нет комментариев. Будьте первым.