00摘要:九条论断
下面每一条都可以被证伪,也可以被一条命令复核。如果只读这一页,你应该记住第 1 条和第 2 条—— 它们解释了为什么大多数技能库建完之后毫无动静。
真正跨生态的硬契约只有一层:SKILL.md 的 name 与 description。清单和索引都是包装层。
技能库的主要失败模式不是「写得太少」,而是「写了不触发」。description 是唯一常驻上下文的字段。
技能数量不线性带来帮助,但线性带来上下文税。每个技能约 100 tokens 常驻,无论是否触发。
存量技能的问题高度集中:描述缺触发信号、许可证缺失。这两类占了实测问题的七成。
命名与目录约定不是审美问题,是可移植性问题。违反即任何生态都不认。
索引必须是构建产物,不能是手写文件。手写索引的必然结局是漂移。
技能库能扩展的唯一原因是分层披露。所以 500 行是硬预算,不是建议。
护城河是评测集,不是技能数量。没有对照实验,无法判断技能是改进还是干扰。
公开分发前必须过脱敏闸门。个人技能天然含绝对路径、内部主机名、合规红线词。
01判定:什么才该做成技能
技能库最常见的浪费不是写错了,是写了一批本来不该写成技能的东西。 一个技能封装的是「这件事该怎么做才对」的判断;如果它是固定操作、是一次性任务、 或者需要实时数据,做成技能只是让简单的事情多绕一圈。
四类产物的分野
「让模型做某事」有四种载体,它们的适用边界比多数人以为的窄。选错载体的代价不是效率降低, 而是后续维护成本被永久抬高——因为技能会进入每一次会话的上下文,脚本不会。
| 载体 | 适合封装什么 | 失效场景 | 上下文成本 | 典型误用 |
|---|---|---|---|---|
| 技能 SKILL.md |
需要判断的做法:选型、审查、成稿规范、领域惯例 | 结论依赖实时数据;做法每次都要改 | 常驻约 100 tokens | 把一段命令行操作写成技能 |
| 脚本 scripts/ |
确定性步骤:转换、提取、批量重命名、格式校验 | 需要理解意图才能决定分支 | 零(执行时不进上下文) | 把脚本逻辑写进正文让模型照着做 |
| MCP / CLI 外部服务 |
实时数据、需要鉴权的系统、有状态的远端操作 | 数据是静态的、可以随仓库附带 | 工具定义常驻 | 把查询接口写成技能,指望它能取数 |
| 什么都不做 — |
模型已经会的东西,或只做一次的事 | 确实存在反复出现的偏差 | — | 把产品手册复述一遍当作技能 |
判别式
如果一个技能文档删掉之后,模型的表现完全不变,那它从写下第一天起就是负资产——它占用上下文,却没改变任何输出。
02三层契约:哪一层才是承重墙
五个官方仓库看起来完全不同:目录层级不同、清单格式不同、索引结构不同。 但把它们拆成「技能 / 分发包 / 展示索引」三层之后,会发现只有一个层被全部五家共享, 而另外两层各自只在自家生态内有效。
为什么 L1 是承重墙
因为 name 和 description 同时承担两个职责:发现(机器解析出这是什么)
和 触发(模型判断此刻该不该用)。这两个职责被压进同一段文本,
于是格式约束与写作质量必须同时满足——这是技能格式最不寻常的地方。
对比之下,一张 REST API 的 servers 字段只影响路由,不影响语义。
技能没有这种奢侈:它的元数据既是索引键,又是提示词。
| 字段 | 谁在读 | 什么时候读 | 写错的后果 |
|---|---|---|---|
name | 发现器、安装器、调用方 | 每次启动,全量技能 | 装不上、扫不到、与目录不匹配直接判废 |
description | 模型本身 | 每次启动,全量技能 | 永不触发——技能存在但等于不存在 |
license | 使用者、合规审查 | 安装前、分发时 | 公开后无人可合法复用 |
metadata.internal | 发现器 | 扫描时 | 半成品被搜到、被装走 |
推论
不要让 L2 或 L3 的要求反向污染 L1。技能是可移植的,打包是不可移植的——把这两件事混在一份文件里,是这个生态里最常见的架构错误。
03五仓库对照:差异都发生在包装层
把五家官方仓库摊开对比,会发现它们真正的分歧只有一个:用什么维度把技能分组。
主题、品类、信任等级、品牌、展示标签——五种不同的分组哲学,但每个 SKILL.md
的内部结构一模一样。
| 仓库 | 技能落位 | 清单 / 索引 | 多端适配 | 核心取舍 |
|---|---|---|---|---|
| anthropics Claude |
skills/<name>/ |
marketplace.json | Claude 系 | 用主题包聚合:一个 document-skills 打包 docx + pdf + pptx + xlsx 四个技能 |
| google Gemini |
skills/<品类>/<name>/ |
marketplace.json + index.json |
.agents/ | 用产品品类分层:cloud/ 下就有 60 多个技能,索引交给脚本生成 |
| openai Codex |
skills/.curated/.system/ .experimental/ |
无清单 靠 installer |
.codex | 用目录名表达信任等级:.system 随客户端自动安装,.experimental 需显式指定路径 |
| MiniMax 多端 |
skills/<name>/ |
单个 plugin 全量打包 |
三端各一份 INSTALL.md |
用品牌整体分发:一个 plugin 装全部,多端适配写成文档而不是结构 |
| vercel-labs 75+ 智能体 |
skills/<name>/ |
skills.sh.json | 交给 CLI | 清单只管展示分组(groupings 数组),安装路径完全交给 CLI 自己探测 |
五种分组哲学没有优劣,因为它们的约束不同:Anthropic 要解决「一次装一组相关能力」, Google 要解决「几百个技能怎么浏览」,OpenAI 要解决「哪些能自动装、哪些必须用户确认」。 你的约束决定你的分组维度,而分组维度只影响 L2。
发现机制有两条路
vercel 的文档把发现规则写得很直白,值得抄:CLI 会在约 60 个「容器目录」
(skills/、.claude/skills/、.codebuddy/skills/ 等)里找 SKILL.md,
往下最多走三层;更浅的位置会遮蔽更深的位置。
但还有第二条路:如果根目录存在 .claude-plugin/marketplace.json,
清单里声明的技能路径会被直接采用,不受三层限制。
两条路殊途同归——所以清单里写的必须是真实路径,否则等于给所有人埋了一个安装失败。
04六步法:从意图到可安装
这套流程不是五个仓库里任何一家的原文,而是从它们的共同约束反推出来的最小完备集。 每一步都有可检验的完成判据——没有判据的步骤,等于没有这一步。
| 步骤 | 动作 | 产出物 | 完成判据 |
|---|---|---|---|
| S1 | 判定该不该做成技能 | 一个决定,可能是否定 | 能说出「删掉它,模型会丢掉哪一条判断」 |
| S2 | 先写 description,再写正文 | frontmatter | 含触发词、含反例、长度落在 150–600 字符 |
| S3 | 分层:正文 / 引用 / 脚本 / 素材 | 目录结构 | 正文 ≤500 行,且每段都是「怎么做」而非「是什么」 |
| S4 | 双跑验证:带技能 vs 不带 | evals/evals.json | 带技能的输出明显更好;相同则说明是装饰 |
| S5 | 按主题分组打包 | marketplace.json | 5–8 个 plugin,每个含 2 个以上技能 |
| S6 | 版本、许可、废弃、脱敏 | metadata + LICENSE | 能说出每一个技能的存活理由 |
S3 分层披露:技能库能扩展的唯一原因
规范把加载拆成三级:元数据(约 100 tokens,全量技能常驻)、 正文(建议 <5000 tokens,触发时才载入)、资源(按需读取,可无限)。 这不是性能优化,而是技能库规模的物理上限——如果所有内容都必须常驻, 你的库就不可能超过十几个技能。
因此「500 行」不是风格建议,是预算。正文里最该被移出去的是这三类:
- 参考数据——字段表、枚举值、术语表。它们不是每次都需要,但每次都在占位置。
- 分支说明——同一技能支持多个变体(如三家云厂商),按变体拆成独立引用文件,模型只读需要的那一个。
- 可执行的东西——任何你会在每次任务里重新写一遍的小脚本。它在
scripts/里执行时不进上下文,写进正文则每次都要读。
引用必须带「何时读」
一个只写「详见 references/spec.md」的指针,等于没有指针——模型不知道该不该打开它,
于是要么全读要么不读。正确写法是把触发条件写在前头:
- [字段规范](references/spec.md) — 需要核对长度、字符集、
保留词时读;正常写作流程不需要
S4 评测:没有对照,就无法判断技能是帮忙还是添乱
官方 skill-creator 的核心循环只有一句话:在测试提示上跑「带技能」和「不带技能」两个版本,
然后对比。这不是学术洁癖——技能最典型的失败不是「不生效」,而是生效了但把结果带偏,
而后者只有在对照下才看得见。
测试集要写成真实用户会说的话,不是需求文档的措辞。这是我自己那份的写法:
{
"skill_name": "skill-authoring",
"evals": [
{
"id": 1,
"prompt": "我写了个技能,但装了之后基本不触发,怎么改?",
"expected_output": "先诊断 description:长度是否在 150-600、
是否有 Use when 子句、是否只讲了 what 没讲 when。
给出改写版本。不要一上来就改正文。"
},
{
"id": 3,
"prompt": "这个 SKILL.md 有 900 行,要不要拆",
"expected_output": "建议拆分:正文超 500 行会与任务争抢上下文。
提出 references/ 分解方案,每个文件带「何时读」,
命令式步骤留在正文。"
}
]
}
expected_output 写的是「应该发生什么」,不是「应该输出什么文本」——
前者能容纳不同的合理表达,后者会把评测变成字符串比对。
必须测的技能
输出可客观判定:文件转换、数据提取、代码生成、固定流程。这类技能如果没有提升,就是纯负债。
可以跳过评测的技能
输出主观:写作口吻、视觉风格、艺术生成。此时「更好」本身没有共识,评测容易变成自我确认。
一个高信号
如果每次运行都独立写出了同一个辅助脚本,那个脚本就该进 scripts/。评测的副产品往往比结论本身更值钱。
05描述工程:唯一常驻的那个字段
如果只能改一个地方来提高技能库的命中率,改 description。
它既是索引键又是提示词,在每次会话开始时就进入上下文——技能是否被想起,全看这几十个字。
为什么「做什么」不够
模型在选择技能时做的不是「能力匹配」,而是「场景匹配」。 一个写着「简历评估与岗位匹配技能」的描述,只回答了「这个工具能干什么」, 却没有回答「我现在这个处境该不该用它」。前者是产品说明书,后者才是触发器。
Anthropic 在官方的技能创作指南里直接承认了这件事:模型存在触发不足的倾向,
所以描述应当写得比你觉得自然的样子更主动一点。Google 则用另一种方式解决同一个问题——
在描述末尾固定加一句 Don't use for …,用排除法划定边界。
三段式
① 做什么
一句动宾短语,说清产物。
「从 PDF 提取文本与表格,填写表单,合并多个 PDF。」
② 何时用
列出用户真的会说出口的词。
「用户提到 PDF、表单、文档提取时使用。」
③ 何时不用
与兄弟技能划界,防止错配。
「不用于编辑 PDF 版式,那属于排版任务。」
长度区间与后果
| 长度 | 实际内容 | 后果 |
|---|---|---|
| < 45 字符 | 一个名词短语,等于标签 | 几乎无法触发;只能靠用户恰好说出那一个词 |
| 45–150 字符 | 讲清了做什么,没讲何时用 | 最常见的失败区间——技能写得不错,但从不被想起 |
| 150–600 字符 | 三要素齐全,含同义词与反例 | 推荐区间,触发与边界都清楚 |
| 600–1024 字符 | 接近上限,信息密度下降 | 可用,但开始出现冗余从句 |
| > 1024 字符 | 超限 | 直接失效——上传校验器会拒绝,不是警告 |
四个真实改法
下面四组都来自实测审计,左列是原文,右列是同一技能的改写。 注意改写没有增加任何新能力,只是把「何时用」补回去。
| 原文(弱) | 改写(强) |
|---|---|
| 45 字符 「生成 PPTX 文件。」 |
「用 python-pptx 从大纲、数据表或参考文档生成可编辑的 PPTX。用户提到做 PPT、生成演示文稿、把报告转成幻灯片,或给出大纲要求成稿时使用。不用于单页图像海报。」 |
| 57 字符 「把 PPT 做出来。」 |
「基于 Markdown 大纲生成结构化演示文稿,支持主题、图表与备注。用户说做汇报、做路演材料、把文档改成 PPT 时使用;也用于改写已有 PPT 的版式。」 |
| 61 字符 「高考志愿推荐。」 |
「按省份与位次为考生推荐院校专业,输出冲稳保三档清单与录取概率估计。用户提到高考志愿、报考、位次、分数线、平行志愿时使用。不用于留学申请。」 |
| 1596 字符 (超限,被校验器拒绝) |
压到 400 字符以内:只保留核心动作 + 触发词 + 一句反例,把设计原则移到正文与引用文件。描述不是设计文档。 |
中文作者特有的坑
官方示例清一色英文,直接照抄会漏掉一件事:触发是按字面匹配的。
如果描述只有英文 Use when the user mentions dashboards,
而用户用中文说「做个看板」,这个技能就不会被想起。
解法是把中英两套说法都塞进描述,且中文要写用户真的会打的字,不是术语: 「看板 / 仪表盘 / 数据大屏」三个词都要出现,因为用户会用其中任意一个。 这一条无法从任何官方文档里学到——它只在中文语境下暴露。
自检一句话
把你的 description 单独拿出来给一个不了解你的人看,他能不能说出「我在什么情况下会用它」?说不出,就还没写完。
06上下文税:技能库真正的成本
每个技能的元数据都会进入每一次会话,无论它是否被触发。这是一笔固定支出, 而多数人建库时只算「我多了什么能力」,不算「我每天为此付出什么」。
三层预算,三种付费方
| 层 | 预算 | 谁在付费 | 超支的表现 |
|---|---|---|---|
| 元数据 | 约 100 tokens / 技能 | 每一次会话,无条件 | 技能越多,留给任务的空间越少;描述越长,模型越难比较 |
| 正文 | 建议 <5000 tokens | 仅在该技能触发时 | 一次触发吃掉大半窗口,模型开始跳读、漏步骤 |
| 资源 | 无上限 | 仅在模型主动读取时 | 写得太碎会读不完;写得太粗会读不到 |
这个结构的副产品是一个反直觉的结论:技能库的质量由「删掉了多少」决定,而不是「收进了多少」。 一个有 20 个精准触发技能的库,比一个有 200 个模糊技能的库更能帮上忙—— 不仅因为噪声少,还因为前者给任务留了 94% 的上下文。
修剪判据
每隔一段时间对着技能库问三个问题,答案是否定就删:
- 过去一个月,它被调用过吗?(没有 → 它不是技能,是一个愿望)
- 它解决的问题,模型自己已经会了吗?(会 → 它只是复述)
- 它的输出,和不用它时真的有区别吗?(没区别 → 参见论断 08)
反 Goodhart
不要用「技能数量」当进度指标。一旦数量成为目标,它就不再是能力的度量——你会开始写那些删掉也不影响任何输出的技能。
07审计实测:四十五个技能的真实病灶
方法论讲完之后,需要一次真实的体检。下面是拿一套 18 条规则的检查器, 对一个真实技能库(45 个技能)跑出的结果——每条结论都可以用一条命令复现。
三个读得出来的结论
一、公开分发的门槛被低估了
37 个技能没有 license 字段。这是最容易补、也最容易被忽略的一项:
缺了它,别人即使拿到代码也无法合法复用。对个人库无所谓,对公开仓库是硬伤——
而且它是一次性决定,补一次永久有效,性价比在所有规则里最高。
二、真正影响生效的是描述,不是正文
14 个描述完全不含触发信号,13 个短于 150 字符,合计 27 次命中——覆盖了近六成技能。 这些技能的正文可能写得很好,但它们从不在正确的时刻被想起。 这也解释了为什么「加了很多技能但感觉没变化」:不是技能没用,是它们没被调用。
三、手工清点必然漏
最初我用一级目录遍历数出 44 个技能。换成递归扫描后发现是 45 个——
多出来的三个藏在三层嵌套里(playwright-cli 及其两个兄弟技能)。
它们不报错、不显眼、也从未被算进任何统计。
这就是为什么审计必须是工具而不是人工:漏掉的从来不是最显眼的那个。
复跑方式
python3 tools/lint.py --path ~/.workbuddy/skills --json
08工具链:把规范变成闸门
规范写在网页上,就只是建议;写进检查器,才成为约束。这一章给出四个零依赖工具的设计与规则集, 它们的作用不是替代判断,而是让「低级的、机械的、必然反复犯的」错误不再需要判断。
lint.py 合规校验
18 条规则,分阻断与警告两级。支持 --path 指向任意技能库,因此既能校验待发布的仓库,也能体检本地存量。
build_index.py 索引生成
从 skills/ 树生成 index.json。--check 模式下索引过期即返回非零退出码,可直接当 CI 闸门。
为什么坚持零依赖
三个理由,按重要性排:CI 上能跑(GitHub runner 只有裸 python3,装 PyYAML 要多一步且可能失败); 别人的机器上能跑(你的技能库要被别人 clone,不该先要求他配环境); 十年后还能跑(依赖会腐烂,标准库不会)。
代价是要自己写一个 YAML frontmatter 解析器。好在技能格式的 frontmatter 只用到极小的 YAML 子集:
顶层标量、块标量(| 与 >)、一层嵌套(metadata)。
约 60 行代码就够,而且永远不会因为上游库改 API 而失效。
规则集
| 编号 | 检查内容 | 级别 | 依据 |
|---|---|---|---|
E001 | SKILL.md 是否存在 | 阻断 | 规范:目录的最小要求 |
E002 | 文件是否有可解析的 frontmatter | 阻断 | 规范:必须 YAML 头 + Markdown 体 |
E003 | name 缺失 | 阻断 | 规范:必填 |
E004 | name 格式:1–64 字符、仅 [a-z0-9-]、无首尾连字符、无连续连字符 | 阻断 | 规范硬约束 |
E005 | name 与目录名不一致 | 阻断 | 规范:必须等于父目录名 |
E006 | name 含保留词 claude / anthropic | 阻断 | Anthropic 曾因保留词重命名技能 |
E007 | description 缺失 | 阻断 | 规范:必填 |
E008 | description 超过 1024 字符 | 阻断 | 规范:上传校验会拒绝 |
E009 | license 缺失 | 阻断 | 公开分发前提,可用开关关闭 |
E010 | 正文引用的 references/ scripts/ 文件不存在 | 阻断 | 死链会让模型空读一次 |
E011 | 技能目录嵌套超过三层 | 阻断 | vercel:发现深度上限 |
E012 | 描述不含任何触发信号(Use when / 用于 / 当…时 / 触发) | 阻断 | 论断 02 的直接落地 |
E013 | 硬编码 /Users/… 或 /home/… 绝对路径 | 阻断 | 可移植性;公开前须脱敏 |
E014 | 疑似密钥(API key、GitHub token、AWS key、私网 IP) | 阻断 | 分发前的脱敏闸门 |
W020 | description 短于 150 字符 | 警告 | 实测最常见的失败区间 |
W021 | 正文超过 500 行 | 警告 | 规范:建议值,非硬限 |
W022 | 正文超过 800 行 | 警告 | 已明显超出预算 |
W023 | metadata.version 缺失 | 警告 | 治理需要,不影响运行 |
刻意区分「阻断」与「警告」是这套规则集的关键设计。如果 18 条全部阻断,人们会开始加
--no-verify;如果全部警告,等于什么都没说。
CI 闸门
两道就够了,都很便宜:契约仍然成立,索引没有过期。
name: skills
on: [push, pull_request]
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: python3 tools/lint.py --quiet
- run: python3 tools/build_index.py --check
一个真实收益
这套检查器第一次运行就抓出了自身的问题:新写的 SKILL.md 引用了不存在的 evals/evals.json。规则的价值不在于它多聪明,而在于它不会疲劳。
09反模式清单
按「内容 / 结构 / 治理」三层归拢十四条。每条都给出症状、成因和修正动作—— 症状是你能观察到的现象,成因才是需要改的地方。
内容层:技能本身写得不对
| 症状 | 成因 | 修正 |
|---|---|---|
| 装了但从没被调用 | 描述只讲「能做什么」,没讲「何时用」 | 补三段式:做什么 / 何时用(含同义词)/ 何时不用 |
| 什么任务都被它抢走 | 描述过宽,与兄弟技能无边界 | 加 Don't use for …,点名不该用的场景 |
| 触发了但不按要求做 | 正文前半段是背景与原理,指令埋在后面 | 命令式步骤前置,原理移到引用文件 |
| 每次运行都重写同一个助手脚本 | 可执行逻辑写成了散文 | 抽到 scripts/,正文只说「运行它」 |
| 模型只读了技能的一半 | 正文超过上下文预算 | 拆到 references/,每个文件标注何时读 |
| 你的机器能跑,别人装了报错 | 硬编码绝对路径、依赖本机环境 | 一律相对技能根目录;环境要求写进 compatibility |
结构层:库的形状不对
| 症状 | 成因 | 修正 |
|---|---|---|
| 市场里每个条目都只有一个技能 | 把「一个技能」当成了「一个包」 | 按主题收敛到 5–8 个 plugin,每个含 2 个以上技能 |
| 索引和实际技能对不上 | 把索引当配置文件手写 | 改为脚本生成,CI 里加 --check |
| 深处有几个技能从来没被扫到 | 目录层级超过三层的发现上限 | 压平到 skills/<name>/ 或 skills/<品类>/<name>/ |
| 上传被拒,提示名称非法 | 用了 claude / anthropic 等保留词,或大写、下划线 | 改为小写连字符,且与目录名完全一致 |
治理层:库的生命周期没人管
| 症状 | 成因 | 修正 |
|---|---|---|
| 库越建越大,但感觉没变强 | 把技能数量当进度指标 | 按论断 03 的「修剪三问」定期删;宁少勿滥 |
| 半成品被别人装走了 | 未标记内部状态 | metadata.internal: true,从发现中隐藏 |
| 公开了但没人能合法复用 | 缺 license | 补字段;一次性决定,永久有效 |
| 不知道改完之后是变好还是变坏 | 没有评测集,改动全凭感觉 | 写 2–3 条真实话术,做带 / 不带双跑 |
最贵的一条
「库越建越大但没变强」是最贵的一条反模式——它不会报错,不会有人抱怨,只会在某一天让你发现:过去半年的投入,全部变成了上下文里的噪声。
10路线图:先修哪一处
存量改造不应该按「文件顺序」推进,而应该按「收益 / 成本比」排。 下面五步的顺序是刻意打乱的——不是从易到难,而是从最能改变生效率的开始。
每步的验收标准
| 步骤 | 做什么 | 做完能观察到什么 |
|---|---|---|
| ① | 补 name / description,把超 1024 的描述压到限内 | lint.py 不再有 E003 / E007 / E008 类阻断 |
| ② | 逐个重写描述:三段式 + 触发词(中英双语)+ 反例 | 随手说一句真实需求,原先不响应的技能开始被调用 |
| ③ | 给每个技能补 license,删掉不该公开的内部信息 | 可以放心执行 gh repo create --public |
| ④ | 把超 500 行的正文按主题拆进 references/ | 所有正文回到 500 行内,且引用都有「何时读」 |
| ⑤ | 写 marketplace.json,按主题聚成 5–8 个 plugin | npx skills add <owner>/<repo> 可以正常安装 |
不建议一次性打包全库。迁移的价值在于逐步暴露问题——把 45 个技能一次全搬进新仓库, 等于把 45 个未知状态一次性冻结,之后每一次改动都要先搞清楚「这个是当初为什么这么写的」。 搬一个,验一个。
11结论
以下是我的判断,不是共识。它们建立在前面可复跑的证据上,但推论本身包含取舍。
技能库不是知识库
知识库的直觉是「越多越好,反正能搜到」。技能库相反:每一条都常驻上下文, 所以它的经济学是「每多一条,所有其他条的可读性都下降一点」。 用知识库的直觉建技能库,必然走向臃肿。
先有评测,再谈规模
没有评测集的技能库,规模扩张等于盲飞。你会同时收获「有用的」和「有害的」, 而无法区分。20 个经过验证的技能,胜过 200 个没有验证的。
格式会收敛,判断不会
五家仓库现在就已经在 SKILL.md 上达成一致,未来只会更一致。 所以值得投入的是「这个判断值不值得沉淀」,而不是「清单字段该怎么写」—— 后者随时会被生态替你决定。
写给人看的文档会过时,写给模型的不会
产品文档描述「系统能做什么」,系统变了文档就错了。 技能描述的是「这类任务该怎么做才对」,这个判断变化得慢得多—— 这正是技能比文档更耐久的根本原因。
如果只做一件事
把现有技能的 description 全部重写一遍。它不需要新建任何基础设施,不需要改任何代码,但它决定了你已有的全部投入是否真的在工作。
12参考来源
按证据类型分组。所有一手来源均在 2026 年 11 月实际抓取核对。
规范与一手文档
- Agent Skills Specification —
agentskills.io/specification:字段定义、长度限制、渐进披露、命名规则 - anthropics/skills — 仓库结构、
.claude-plugin/marketplace.json实例、skill-creator的方法论原文 - google/skills —
index.json生成式索引、skills/<品类>/<name>两级布局、描述中的排除式子句 - openai/skills —
.curated/.system/.experimental信任分层;该仓库已标注 deprecated,官方指向 openai/plugins - MiniMax-AI/skills — 单 plugin 全量打包、三端 INSTALL.md 适配
- vercel-labs/agent-skills — 发现规则(容器目录、三层上限、浅覆盖深)、
skills.sh.json展示分组
一手实测(可复跑)
- 45 个技能的全量审计:
python3 tools/lint.py --path <技能库> --json,得 64 错误 / 48 警告 - 目录深度差异:一级遍历得 44 个,递归扫描得 45 个,差额来自三层嵌套
- 检查器自检:首次运行抓出自身引用缺失
推导与建模(非实测,需谨慎引用)
- 图 4 的上下文占用率为建模估算:以规范建议的单技能约 100 tokens 乘技能数,除以 32k 窗口。实际值随描述长度与分词器浮动,不同模型窗口也不同。
- 「500 行」来自规范的建议值(<5000 tokens),折算关系随语言与排版变化,中文正文的 token 密度通常高于英文。
- 图 5 的「影响 27 个技能」为去重后的粗略口径,一个技能可同时命中多条规则。
本文档自身
- 单文件 HTML,零外部依赖,不引任何 CDN
- 全部图表为手写 SVG,无图表库
- 配色遵循三级文字色阶(对比度均 ≥3.0)与语义色分层(色块用原色、文字用深色版)