技能库审计与精简
对本地技能库做体检与精简。核心不是"删没用的",而是找出互相争抢触发权的方法论重复体。
何时用 / 不用
用:用户抱怨技能多、乱、重叠,Agent 路由摇摆;要求整理 / 精简 / 清理技能库;新装一批技能后评估该不该留。
不用:安装新技能(走技能商店 / 安装器);安装前的安全审查(走专门的安全审查流程);单个技能的编写与修改。
两条核心判据
判据一:这个技能有没有确定性的执行路径?
audit.py 自动把每个技能分成三级:
| 级别 | 判定依据 | 归档含义 |
|---|---|---|
| strong | 目录内含脚本文件;或调用 MCP / 外部数据服务(yuandian、pkulaw、chineselaw、tavily、openapi);或会发起网络请求(curl) |
提供模型自身做不到的能力,不可随意归档 |
| medium | 仅依赖特定库或系统工具(fitz/PyMuPDF、openpyxl、python-docx、dotnet、osascript、pandoc、playwright…) | 弱依赖;归档前须确认本机存在替代路线 |
| none | 通篇只有方法论、清单、话术、框架 | 纯提示词,价值取决于「它注入的方法论是否为模型内生能力所不具备」 |
> 注意:文档里的普通 https:// 链接不算依赖,只有具体服务标识与网络请求命令才算——否则人人都被判成有依赖。
判定红线:通用逻辑方法(演绎/归纳/类比/溯因/反事实/论证强度)与通用写作框架,模型内生能力已覆盖,属低边际价值;特定领域的规则、口径、行业处理流程才是高价值。
判据二:触发边界是否重叠?
- 重叠的典型症状:触发条件写成"凡涉及 XX 均适用我";技能 A、B 互相引用且互为上下级;同一动作有 2 套以上实现(如"文档修订"有 osascript 路线与 OOXML 路线两套)。
- 重叠的直接代价:Agent 在选择技能时摇摆,同一请求命中不同技能,输出不稳定。
- 注意区分"功能重复"与"分工不同":名字相近但一个偏生成、一个偏校验,不构成重复。
其它归档理由(合法但次要):已在本机失效(依赖未安装的软件 / 无法执行)、内容名不副实(description 与正文严重不符)、体积与内容量级严重不匹配、原技能包缺件导致残缺。
五步流程
第 1 步:只读诊断
python3 scripts/audit.py # 自动探测常见 Agent 技能根目录
python3 scripts/audit.py --root ~/.claude/skills # 指定根目录(可重复指定)
python3 scripts/audit.py --skills-only # 只看技能清单
python3 scripts/audit.py --json /tmp/aud.json # 同时落盘结构化结果
python3 scripts/audit.py --loose # 中文技能名也参与引用检测(噪音较多,默认关闭)
自动探测的技能根目录:~/.workbuddy/skills、~/.claude/skills、~/.codex/skills、~/.cursor/skills、~/.codeium/windsurf/skills、~/.gemini/skills、~/.qoderwork/skills,以及当前目录下的 skills/、.workbuddy/skills/、.claude/skills/。
输出:执行路径三级分布、悬空引用、技能间引用密度、归档安全性检查(hooks / 命令 / 定时任务 / 项目级技能是否引用)、设置中已关闭但仍存在的技能。
> 检测采用词边界匹配,不会把 foo-bar 误判成 foo-bar-baz 的引用;审计工具自身被豁免,避免自指污染。
第 2 步:分组与定目标
按功能簇分组,逐簇判定。常见簇:检索类、文档 / 格式转换类、分析方法论类、风险 / 合规类、业务专精类、通用工具类。
同时确认数量目标(由用户给出,或按"执行路径技能数量 × 2~3"估算下限)。
第 3 步:安全核验(不可跳过)
归档前必须确认没有任何下游依赖:
- Agent 辅助目录(
hooks/、commands/、automations/)是否引用技能名 - 工作区
.workbuddy/skills/、.claude/skills/是否存在同名技能 - 是否有其它技能的正文以可路由的硬引用方式指向它(表格型"关联能力"描述与普通词组不算)
第 4 步:归档执行(先预演)
写 plan 文件,理由逐条填:
[
{"name": "deductive-reasoning", "group": "D 推理链", "reason": "通用逻辑方法,模型内生能力覆盖"},
{"name": "legacy-doc-patch", "group": "B 不可用", "reason": "依赖未安装的外部软件,路线不可执行"}
]
python3 scripts/archive.py --plan plan.json # 预演,不改任何文件
python3 scripts/archive.py --plan plan.json --execute # 确认后执行
脚本行为:shutil.move 移动(从不删除)、目标已存在则跳过不覆盖、自动生成 manifest.json(逐项理由 + 原始路径)与可执行 RESTORE.sh。
第 5 步:修正副作用并交付
归档后检查保留技能中指向"已消失技能"的指引句,逐条修正(改指向替代技能,或改为明确表述)。修正前先把原文备份到归档批次的 _modified_originals/。
交付物:精简报告(md)+ 清单(xlsx,含归档 / 保留 / 统计三表)。报告中必须列出:归档分组与逐项理由、保留清单、副作用修正记录、回滚方法、以及需要用户复核的判断点(处于主观判断区间的项目)。
安全设计
本技能涉及移动用户文件,故内置以下约束,不依赖调用方自觉:
- 诊断脚本只读——
audit.py不写、不改、不移动任何文件。 - 归档默认预演——
archive.py必须显式加--execute才动作。 - 只移动,不删除——全程
shutil.move,代码中不存在rm/rmtree/unlink。 - 不覆盖——目标已存在时跳过并记录,不静默覆盖。
- 全程可逆——自动生成 manifest 与
RESTORE.sh,一条命令回滚。 - 归档目录在技能库之外——放在技能库同级目录,避免被再次当作技能加载。
铁律
- 只移动,不删除。 绝不使用
rm/shutil.rmtree。 - 先预演后执行。 任何归档前必须先跑一遍 dry-run。
- 文档先备份。 修改任何技能正文前,把原文复制到归档批次的
_modified_originals/。 - 不覆盖。 目标已存在时跳过,不静默覆盖。
- 逐项留理由。 manifest 中每一条都要有可追溯的归档理由。
- 主动标注不确定项。 判断主观的项目单列出来请用户复核,不混在批量结论里。
- 归档目录固定:技能根目录同级的
skills-archive/YYYY-MM-DD/,不得放进技能库内部。 - 不动设置文件中的技能开关。 未装载的技能名留在开关配置里不生效,改动无收益且有风险。
回滚
bash <归档批次目录>/RESTORE.sh # 全部还原
bash <归档批次目录>/RESTORE.sh <技能名> # 单条还原
参考:一个真实案例的量化基线
某技能库共 60 个技能,其中仅 8 个具备确定性执行路径、52 个为纯提示词;技能间互相引用 66 处,其中最大的重叠簇由 13 个同源拆分的"推理方法论"技能构成。归档 29 个后降至 31 个,全过程零删除、可一键回滚。
结论模式:技能库的健康度不看总数,看执行路径技能占比与触发边界重叠密度。