Clipping 微信公众号

你装的 skill,Claude Code 可能就看不到

by 问答 原文 ↗
Created: 2026-05-15

公众号名称:AI 方寸山

作者名称:问答

发布时间:2026-05-15 09:07

昨晚打开 Claude Code,准备继续写公众号文章采集的 Skill。

看到了下边的一行提示:「74 skill descriptions dropped · /doctor for details」

我装的 skill 总共 90 几个,74 个用不上?

这行字我看见快一周了,因为是闪现,每次也不在意,但是一些自己快遗忘的 Skill 感觉像消失了一样,是这个的影响?

所以,就一探究竟了下,结果收获不小。

这是 Claude Code 一个挺隐蔽的机制:它会悄悄关掉一部分 skill 的「自动触发」。skill 文件还在磁盘上,目录结构和配置一个字都没动,但 Claude 已经不知道它们存在。

更让我好奇的是,跑完 /context 看了一眼,上下文还剩 72% 没用

Claude 装得下。只是默认预算只给了 1%。

/doctor 现场:1% 的预算

/doctor 是 Claude Code 自带的诊断命令。一跑就把刚才那行省略号补全了:

Skill listing will be truncated
74 descriptions dropped (full descriptions kept for most-used skills) (2.8%/1% of context):
dbs-agent-migration, agent-browser, lark-event, +71 more

两个数字最扎眼:2.8% 是我实际占用,1% 是 Claude Code 给的预算上限。超出了将近三倍。

被砍掉的 skill 明明白白列出来一部分:dbs-agent-migrationagent-browserlark-event 是我能看见的,后面还有 71 个。这些 skill 全都在 .claude/skills/ 目录里好端端待着,目录名、SKILL.md、description 一个字都没动。但在这一次会话里,Claude 就是当它们不存在。

提示下面还有一行小字:「Opting in would cost ~6k tokens for skills every session and uses rate limits faster」。意思是说,我要是想把它们都装回来,得为每次会话多付 6k tokens,还会让我 Claude Pro 的额度用得更快。

这行小字暂时记着,后面回来算这笔账。

关键反差:Context 还剩 72%

按理说,2.8% 这个数字本身不算多,上下文都还有大半空着,多塞一点描述也无妨。

于是我跑了一下 /context 看总占用:

整个会话用了 22.3k / 200k tokens,Free space 还剩 144.7k,占 72.3%。Skills 这一项自己才占 5.6k。

我对着这个数字盯了几秒。

Claude 装得下。被锁住的是 description 预算,默认 1%。

也就是 skill 的预加载的 description 有个总空间大小的限制,超过了就会被截断省略,从而无法自动被模型识别。因为触发词没加载。

skill description 是一个节省上下文的策略。199K 的剩余上下文跟它没关系,它能用的就那 2000 tokens。

机制:skill listing budget 是什么

要理解这个 1% 是怎么用的,得先看 Claude Code 怎么”看见”你的 skill。

每次会话启动时,Claude Code 会扫描你所有装好的 skill,把每个 skill 的 description 字段(是什么,何时用)拼成一个大列表,塞进 Claude 的系统提示里。这份列表干一件事:让 Claude 知道你装了哪些工具、什么场景该用哪个。

你问它一句话的时候,Claude 不是凭空找工具。它在这份系统提示里翻一遍,看你的请求匹配上哪个 skill 的 description,然后决定要不要自动调。

skill 的「自动触发」能力,完全建立在 description 被 Claude 看见的前提上。

但这份列表的总长度有上限:skillListingBudgetFraction,默认 0.01,也就是上下文窗口的 1%。

折算到不同模型:

  • 200K 上下文的 Sonnet / Opus:1% ≈ 2000 tokens。装到大概 15-25 个 skill 就开始触顶

  • 1M 上下文的 Opus / Sonnet:1% ≈ 10000 tokens。要装到 75-125 个才触顶

我用的是 Sonnet 4.6 + 200K 上下文,装了 90 多个 skill,按这个公式,超额是必然的。

超额之后 Claude Code 不会报错。它的处理挺简单粗暴:给所有 skill 按使用频率(大致是这个,官方没有公布细节)排个序,从最少用的开始砍 description。砍的时候只砍描述这一段,skill 的名字还留着,你想手动 /name 调出来还是能调。

这个设计不奇怪,就是为用户兜底,避免大家装了一堆 Skill,忘记了,还天天无效加载到上下文。

后果实证:dropped 后到底失去了什么

搞清楚机制之后,我直接问了 Claude 一个问题:「skill description 被丢弃之后,到底意味着什么?」

它的解释(我 cross-check 了官方文档,对得上):

情况Claude 看到的影响
描述被保留skill 名字 + 描述能根据上下文自动识别该用哪个 skill
描述被丢弃只看到 skill 名字看不到触发词,无法自动匹配。用户显式 /skill-name 仍然有效

翻译成直白话:我装了 90 多个 skill,Claude 每次会话只「能看见」其中 20 个左右。剩下 70 个等于躺在仓库里,得我自己开口叫名字才能用。

这就解释了我之前一直困惑的事。

我装的 sub-agent-driven 今年用过几次,效果不错。但它属于「偶尔用一次」的类别。大部分时间我在写文章,用不上它。结果就是:它早就被排到 dropped 队列里。

前两周月做项目结构调整的时候,按 description 设计这种场景应该会触发 sub-agent-driven 给我建议。但 Claude 从来没主动叫过它。

我以为是 description 没写好。后来才知道,是 Claude 压根没看见。

排查神器:/context 看 skill 明细

搞清楚机制,下一个问题是:到底哪 74 个 skill 被砍了?

/doctor 给的列表是省略的:「dbs-agent-migration, agent-browser, lark-event, +71 more」。前三个是字母序,剩下 71 个被一笔带过。光看 /doctor 没办法知道哪些是半死不活、哪些已经被砍干净。

后来发现 /context 有个更精细的视图,可以看到每个 skill 各占多少 token:

Skills · /skills
Project
  web-reader: ~110 tokens
  translator: ~100 tokens
  markdown-to-wechat-html: ~100 tokens
  ...
  insight-synthesizer: ~40 tokens
  ...

看这个数字基本就能判断 skill 的健康状态:

  • 70-110 tokens:description 完整加载,自动触发正常

  • ~40 tokens 左右:description 被截短,触发词可能不全

  • < 20 tokens:几乎只剩名字,自动触发基本失效

实操就一招:跑 /context,把 skill 按 token 从小到大排,< 40 的那一批就是「装了等于半装」。

我自己扫了一遍,发现一些常用工具其实也快被砍。比如几个 lark-* 系列的飞书工具,平时确实会用,结果掉到 30 多 tokens 那一档,触发已经不稳了。

6 种解决方案,按推荐度排序

找到问题之后,是清单。我整理了 6 种解决方案:

推荐度方法成本适用
⭐⭐⭐/skills手动禁用低频 skill零 token通用首选
⭐⭐⭐压缩 description 到 100-150 字符零 token自己维护的 skill
⭐⭐skillOverrides改可见性零 token不想改第三方源码
⭐⭐提高 skillListingBudgetFraction每会话 +3k-6k tokens50+ skill 重度用户
SLASH_COMMAND_TOOL_CHAR_BUDGET环境变量同上一次性脚本
调大 skillListingMaxDescChars同上description 真需要长

前两种零成本,最值得说。

第一种:跑 /skills 把不常用的禁用掉。 交互式选择器,光标移到对应行按空格切换状态(on / name-only / user-invocable-only / off),回车保存。把日常基本不用的整批切到 off,预算立刻松出来。

这招最有用的地方在于它逼你回答一个问题:这个 skill 我上次用是什么时候?装的时候每个都觉得”将来肯定用得着”,过半年回头看,七八成根本没碰过。

第二种:压缩 description 字段。 Anthropic 文档的建议是把 description 总长压到 100-150 词,关键词前置。380 字的营销腔写法会把关键词埋在末尾,截断时直接砍掉。110 字的密集型写法动词前置,关键词全在前 50 字。同样的预算能装更多 skill,token 效率上去后命中率也跟着涨。

第 3-4 种(skillOverrides 和调高 budget)后面单独说。第 5-6 种平时用不上,跑批脚本或者非得写长 description 才碰。

克制原则:调 budget 不免费

回到那行小字:「Opting in would cost ~6k tokens for skills every session and uses rate limits faster」。

要是你装了 50+ skill 还是不想清理,直接调高 budget 是最快的解法。改一下 ~/.claude/settings.json

{
  "skillListingBudgetFraction":0.02
}

注意小数格式,0.02 表示 2%,不是数字 2。改完重启 Claude Code 才生效。

但这一招的代价 /doctor 已经写在脸上了:每次会话多花 6k tokens。在 200K 上下文模型里相当于多吃了 3% 的空间,更现实的影响是 Claude Pro 的额度用得更快。

我跑了一下,调到 0.02 之后 dropped 数量明显下降,具体降了多少没仔细数,但感受上就是少了一截。

跑了几个会话之后我换回去了。这一招不免费。本来是每次会话浪费点描述空间,现在变成每月 Claude Pro 额度被多吃。两害相权,前者还好挽回,清理一遍 skill 就行。后者每个月都要付一次。

档位推荐:

  • 0.01(默认):< 20 个常用 skill 够用

  • 0.02:20-50 个 skill 且半数常用

  • 0.03:50+ skill 且确实需要广覆盖

  • 大于 0.05:不推荐,这时候该回去清理 skill 了,不是堆预算

一个判断信号:调到 0.03 还在 dropped,说明 skill 装臃肿了,不是预算问题。回头看看你那 50 个 skill 里,过去半年真正用过的有几个。

我自己的方案

我没去调 budget。

先做的是清点。/context 列出来的 skill 按 token 从小到大一拉,那批 < 40 tokens 的就是「半装」状态。我装的 skill 里掉到这一档的有四五十个。

然后跑 /skills 进交互界面,把半装区里过去半年没动过的整批切到 off。能这么砍掉的有 30 多个,大部分是当初看到别人 GitHub 上有就 clone 下来、想着”以后可能用”的实验性工具。半年回头一看,确实一次没碰。

剩下的 skill 里又翻出几个 description 写得太啰嗦的。打开它们的 SKILL.md,把 description 压到 100 字符以内,关键词全往前挪。

还有一类比较尴尬:飞书的 lark-* 系列。日常用得少,但偶尔要发个会议总结、查个考勤。这种直接 off 太狠,要用还得手动开。我后来用 skillOverrides 把它们设成 name-only

{
  "skillOverrides":{
    "lark-attendance":"name-only",
    "lark-okr":"name-only"
  }
}

Claude 看到名字但不加载描述。这样 token 零开销,要用的时候手动 /lark-attendance 也能调出来。

调完跑了一遍 /doctor。Skills 类目从 5.6k 掉回 3k 不到,预算占用 2.8% 回到 1.4%。还是超 1%,但常用工具的描述至少不再被砍了。

最后

装一年多 Claude Code,今天才知道还有这么个机制。

写 skill 的时候每个都想着”以后可能用得着”。但 description 是要占预算的,装得越多,常用那批反而越容易被挤掉。

如果你装了很多 skill,但 Claude Code 总是不主动调用,先别急着骂 description 写得烂。它可能根本没读到。

打开你自己的 Claude Code 跑一下 /doctor 和 /context 看看。说不定能每天加个鸡腿呢。

感谢您阅读到这里。


cover_image

Original 问答 AI 方寸山


内容效果不满意?点此反馈

输入关键词开始搜索