SKILL 34 / PKM · DEEP DIVE

个人 Skill 库的卫生

命名一致 · 去重 · 废弃 · 按使用度淘汰——以及什么时候该把 skill 合并回 prompt

2026-10-05 · BigCat

上一期教你从重复劳动里长 skill。这一期是它的另一半:长出来的 skill 不会自己死,没人用的那些每一轮都在扣你的上下文。下面点名 9 个真实可装 / 可用的条目——6 个官方命令与设置、3 个社区工具——先讲怎么体检,再讲怎么剪。

同系列 → Skill 33 从重复劳动里长出 Skill · Skill 6 官方 authoring 精读 · Skill 30 装别人的 Skill 有多危险

// WHY THIS MATTERS

Claude Code 官方文档在「Find unused skills」一节写得很直白:Every skill in the skill listing adds to your context on every turn, whether or not Claude ever uses it.——清单里的每个 skill,不管用没用过,每一轮都占上下文。代码库有 lint 和死代码检测,skill 库直到最近才有对应的工具。好消息是现在有了;坏消息是它只告诉你「谁没被用」,剪不剪、怎么剪,还得你自己定。

// 01

它替你干掉什么 · 装法 · 第一条能跑的用法

论断:体检只要两条内置命令——先 /skill-doctor 看谁白占地方,再 /skills 按空格把它调暗。

它替你干掉的是「凭印象清理」:你记得哪些 skill 常用,但记不住每个占多少 token、上次什么时候被调用。

# ① 官方体检(Claude Code v2.1.252+,终端里跑)
/skill-doctor
# 交互会话里报告开在 /plugin 管理器的 Stats 页;-p 非交互模式直接打印文本

# ② 官方开关:高亮某个 skill,按 Space 循环状态,Esc 保存
/skills
# 写进 .claude/settings.local.json,效果等价于:
{ "skillOverrides": { "legacy-context": "name-only", "deploy": "off" } }

# ③ 插件的 skill 不归 skillOverrides 管,单独看
claude plugin details <name>   # Always-on 行 = 每个会话固定多出的 token

/skill-doctor 的报告按 skill 列出上下文成本和调用次数,标出从未被调用过的并告诉你去哪关;官方建议从成本最高的那批开始。它还会列出最近没用过的插件——/plugin 的 Installed 页也有一个 Not used recently 分组和每个插件的 Last used 行。

别指望它的时候:内置 skill 和企业下发的 skill 不在报告范围内;用 Remote Control 从手机或浏览器跑会直接回一句「Skill usage reports are not available on this connection」——得在跑会话的那台机器的终端里执行。
// 02

机制:skill 多了,到底坏在哪

论断:坏的不是「多」,是三件事——清单预算挤掉描述、同名静默遮蔽、加载后的正文赖着不走。

① 清单预算:最少用的先「哑」

官方文档:清单的字符预算按模型上下文窗口的 1% 计;溢出时从你调用最少的 skill 开始丢描述。名字还在,但关键词没了,Claude 就很难自动匹配到它。/context 的 Skills 行显示的是预算裁剪后的大小,/doctor 会估算清单成本和最大贡献者。想放宽可设 skillListingBudgetFraction(如 0.02)——但这是把问题往后推,不是解决。

② 同名遮蔽:没有报错

同名 skill 的优先级是企业 > 个人 > 项目:~/.claude/skills/deploy 和仓库里的 .claude/skills/deploy 同时存在时,/deploy 跑的是你个人那份——队友改了项目版,你却一直用旧的,而且不会有任何提示。插件 skill 带命名空间 /插件名:skill名,所以不撞,但会出现两个功能相近的条目抢同一类请求。

③ 正文常驻:调过一次就一直在

skill 被调用后,正文作为一条消息留在对话里,后续轮次不重读文件。自动压缩时,每个 skill 只保留前 5,000 token,所有 skill 合计 25,000 token,按最近调用顺序填——一次会话里调了太多 skill,早的那些压缩后会整份丢掉。

// 03

真实用法与边界:命名、去重、废弃、合并回 prompt

论断:四个动作各有一个现成工具;判据放最后,用来决定一个 skill 走哪条路。

命名一致:先让机器挑错

Agent Skills 规范规定 name 只许小写字母、数字和连字符,最长 64 字符,必须与父目录同名;用 skills-ref 的 skills-ref validate ./my-skill 校验。官方《Skill authoring best practices》建议用动名词(processing-pdfs)并点名要避免的:helper、utils、tools 这类含糊名,以及同一个库里风格不一致。

去重:两层检测

废弃:用状态阶梯,不要直接删

skillOverrides 的四个状态天然就是废弃流程:on → name-only(只留名字,腾出描述预算)→ user-invocable-only(Claude 看不见,你还能 /name)→ off(全隐藏)→ 观察一阵没人想起它,再删目录。插件走 /plugin disable / /plugin uninstall。skill 内部过时的段落,官方建议挪进一个折叠的 「Old patterns」节,而不是混在正文里。

跨工具的库:一份源

同时用几个 agent 的人,最容易出现「三份副本、改了一份」。Vercel 的 skills CLI(据 GitHub 仓库页,2026-10 读取约 3.3 万星)默认用符号链接把各 agent 目录指向同一份拷贝:npx skills list 看装了什么、npx skills update 升级、npx skills remove <name> 卸载。别用的时候:只用 Claude Code 一个工具——内置的 /skills 和 /plugin 已经够了。

判据:一个 skill 该留、该降级、还是合并回 prompt

// 04

代价与替代品

论断:清理本身也有成本;最便宜的卫生是少装。

① 「从未调用」不等于「没用」

有些 skill 一季度只用一次,但那一次很关键(比如发版检查清单)。/skill-doctor 只看调用次数,不看价值。这类 skill 降到 user-invocable-only 比直接删稳妥。

② 降级会改变行为

降到 name-only 后描述没了,原本靠关键词自动触发的场景会失效。改完要验:官方给的办法是挑几个真实提示,在新会话里分别开、关这个 skill 各跑一遍对比;插件 skill 用 claude plugin eval,它会自动带一个「不装插件」的基线。

③ 工具链本身也要卫生

社区去重工具、跨 agent 管理器都是新依赖:会注册 hook、会建自己的目录、会更新。为了清理 10 个 skill 再装 2 个工具,先算一下账。

替代品,按成本从低到高:什么都不装,每月跑一次 /skill-doctor → 用 /skills 手动调状态 → 名字统一后 skills-ref validate 一遍 → 有重叠时上 skill-creator 的触发评测 → 多 agent 共用才上 npx skills → 库大到人眼看不过来才装社区冲突扫描器。
来源:Claude Code · Extend Claude with skills(1% 预算、同名优先级、skillOverrides 四态、/skill-doctor、压缩时 5,000 / 25,000 token) · Discover plugins(Not used recently、claude plugin details)(均据各页 2026-10 读取)

// 一页选购卡

先用这三个:① /skill-doctor——每月一次,按成本从高到低看「从未调用」名单。② /skills——按 Space 把可疑项先降到 name-only 或 user-only,观察两周再 off。③ claude plugin details <name> + /plugin 的 Not used recently——插件里的 skill 不受 skillOverrides 管,得在这里剪。

按需再加:skills-ref validate(统一命名后批量校验) · skill-creator 的 Description Optimization(合并两个重叠 skill 后重调描述) · npx skills(多个 agent 共用一个库) · MindiveLabs/skill-doctor(库大到需要语义冲突扫描,且你读过它的 hook)。

明确别做:靠调大 skillListingBudgetFraction 掩盖臃肿 · 在个人和项目目录各放一份同名 skill · 降级后不验就走 · 把一两句规则硬撑成一个 skill。

// 术语表

skill listing(清单)
所有 skill 的名字与描述,每轮常驻上下文,预算约为上下文窗口的 1%。
skillOverrides
settings 里的开关,按名字把 skill 设为 on / name-only / user-invocable-only / off 四态,无需改 SKILL.md。
同名遮蔽(name shadow)
两个同名 skill 只有优先级高的那个会跑,另一个静默失效,没有报错。
近邻请求(near-miss)
和 skill 共享关键词、但其实不该触发它的请求,是触发评测里最有价值的反例。
符号链接(symlink)
文件系统里指向另一个文件的「快捷方式」,让多个 agent 目录共用同一份 skill。

// 三个想不通的地方

官方的 /skill-doctor 和社区的 skill-doctor 同名,装了社区那个会怎样?
看你怎么装。走插件装,它的 skill 带插件命名空间,和官方命令并存。走 README 里的 git clone 方式,它落在 ~/.claude/skills/skill-doctor,就是一个名叫 skill-doctor 的个人 skill——按官方规则,个人 skill 会在终端会话里顶替同名的内置命令,你再敲 /skill-doctor 就看不到官方的用量报告了,而且不会有提示。这个小插曲本身就是本期的题眼:命名冲突连做冲突检测的工具都会踩。
多少个 skill 算「太多」?
官方没给个数,只给了预算:清单占上下文窗口的 1%,超了就丢描述。所以真正的上限取决于你们的描述有多长、模型窗口有多大。与其数个数,不如看 /context 的 Skills 行和 --debug 日志里有没有超预算警告——有警告就是太多了。
该不该把常用 skill 都合并成一个「大 skill」省清单?
不该。合并省的是清单里几行描述,代价是每次调用都把整份正文搬进上下文,而且触发变模糊。官方 authoring 指南建议正文控制在 500 行内、用分文件的渐进式披露。合并的判据是触发重叠,不是数量。

// 延伸阅读