Start Debugging

Claude Code 2.1.261 добавляет /skill-doctor: находим skills, которые только тратят контекст

Тело skill загружается по требованию, а её имя и описание лежат в списке, который всегда находится в промпте и ограничен 1% окна контекста. Claude Code 2.1.261 добавляет /skill-doctor: отчёт показывает, какие загруженные skills не используются и во что обходится каждая, чтобы убрать их прежде, чем бюджет начнёт вытеснять те, которыми вы действительно пользуетесь.

Claude Code 2.1.261 вышел 4 сентября с небольшой командой, отвечающей на вопрос, на который владельцы забитого каталога ~/.claude/skills до сих пор ответить не могли: /skill-doctor показывает, какие загруженные skills остаются без применения и во что они обходятся по контексту, чтобы их можно было убрать. В справочнике команд команды пока нет, но механизм, о котором она отчитывается, задокументирован, и его стоит понять до чтения вывода.

Skill, которую вы никогда не вызываете, не бесплатна

Привычная модель такая: skills дешёвые, потому что загружаются лениво. Это верно лишь наполовину. Тело SKILL.md попадает в диалог только при вызове skill. Имя и описание — нет: Claude Code загружает в контекст список имён и описаний всех skills, чтобы модель знала, что доступно.

У этого списка фиксированный бюджет. Согласно документации по skills, он “scales at 1% of the model’s context window”, а суммарный текст каждой записи в любом случае ограничен 1536 символами. Когда список перестаёт помещаться в бюджет, Claude Code начинает отбрасывать описания, начиная с тех skills, которые вы вызываете реже всего.

Поэтому неиспользуемая skill стоит дороже собственных токенов. Она конкурирует за общий бюджет со skills, на которые вы полагаетесь, а урезанное описание теряет как раз те ключевые слова, по которым модель сопоставляет ваш запрос. В итоге skill молча перестаёт срабатывать, и никакой ошибки, объясняющей причину, нет. /doctor уже давал оценку общей стоимости списка и его главных статей расхода; в 2.1.261 разрез по каждой skill, использованные против неиспользуемых, вынесен в отдельный отчёт.

Как превратить отчёт в настройки

Когда понятно, какие записи лишние, skillOverrides в .claude/settings.json меняет видимость, не трогая SKILL.md в общем репозитории:

{
  "skillOverrides": {
    "legacy-context": "name-only",
    "deploy": "user-invocable-only",
    "old-migration-helper": "off"
  }
}

"name-only" оставляет skill в списке, но убирает её описание, освобождая бюджет. "user-invocable-only" скрывает её от модели, оставляя /deploy доступным для ручного ввода. "off" скрывает от обоих. Для своей собственной skill эквивалент во frontmatter — это disable-model-invocation: true, который полностью убирает описание из контекста. Учтите, что skills из плагинов игнорируют skillOverrides; ими управляют через /plugin.

Если отчёт говорит, что каждая skill своё место оправдывает, поднимайте потолок вместо сокращения: skillListingBudgetFraction принимает долю (0.02 для 2%), SLASH_COMMAND_TOOL_CHAR_BUDGET — фиксированное число символов, а skillListingMaxDescChars сдвигает ограничение в 1536 символов на запись. Затем проверьте по строке Skills в /context, которая начиная с v2.1.196 показывает размер списка уже после применения бюджета, а не полный текст.

В том же релизе есть ещё две ручки для контекста: bashOutputMaxChars и taskOutputMaxChars повышают объём вывода команд и фоновых задач, который Claude получает прямо в диалоге, прежде чем он сохраняется в файл, вплоть до 128K символов, а --append-subagent-system-prompt-file читает системный промпт субагента из файла, когда он слишком велик для командной строки. Если вы отстали от потока релизов, в 2.1.259 появился managedMcpServers двумя днями ранее.

Подробности в changelog Claude Code.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Назад