SKILL 06 / META · DEEP DIVE

官方 Authoring 最佳实践精读

一页文档里的六个硬数字,和它们各自的物理原因

2026-09-07 · BigCat

64 / 1024 / 1536 / 500 / 100 / 3——这六个数字里,只有两个是真会拦住你的硬限。分不清哪两个,你会在错的地方省字。

前置 → Skill 05 元技能榜单(这一页是那份榜单里的 ⑦,本期把它拆开)

// WHY THIS MATTERS

SKILL.md 该写多长、拆几个文件、description 怎么写才触发得准——这些问题,Anthropic 在 Skill authoring best practices 那一页上全给了答案,而且给的是数字。麻烦在于那页有六千多字,读完只记住「要简洁」等于没读。本期把它压成一张速查表,再逐条问「凭什么是这个数」——因为知道机制,你才知道哪条能破、哪条破了就出事。文中点名的每个 skill 与文档都能点开,第 03 节全部用官方仓库里真实跑着的 skill 当范本,第 04 节讲这页文档自己也会坑你的地方。

// 01

它替你干掉什么:把「凭感觉」换成六个数字

论断:这页文档不是 skill、装不了,但它配套的东西全都能装。真正的用法是:拷一份最小骨架、按速查表填、再用两条自带命令验一遍——十分钟走完,比读六千字管用。
硬约束速查(出处:platform.claude.com · Skill authoring best practices) ────────────────────────────────────────────────────────────────────── name ≤ 64 字符 · 只许小写字母/数字/连字符 · 不能含 XML 标签 不能含保留词 anthropic / claude · 建议用动名词 processing-pdfs description 非空 · ≤ 1024 字符 · 不能含 XML 标签 · 必须第三人称 要同时写「做什么」和「什么时候用」 正文 建议 < 500 行 —— 这是软建议,超了不报错,只是该拆了 引用 只许一层深 · 所有 reference 从 SKILL.md 直连 reference 超过 100 行的,开头加一个目录 评估 至少 3 条 · Haiku / Sonnet / Opus 各测一遍 ────────────────────────────────────────────────────────────────────── Claude Code 侧另有一条硬截断(出处:code.claude.com · Skills) description + when_to_use 在 skill 列表里按 1536 字符截断 —— 超的部分 不是被读到,是被砍掉。列表总预算约为模型上下文窗口的 1%。 ────────────────────────────────────────────────────────────────────── 三层加载与代价(出处:platform.claude.com · Agent Skills 概览) Level 1 metadata(name+description) 启动时常驻 约 100 tokens / 每个 skill Level 2 SKILL.md 正文 触发才读 5k tokens 以内 Level 3 附带文件与脚本 用到才读 不读=0;脚本只有输出计费

第一条立刻能跑的用法

# ① 拷官方最小骨架(anthropics/skills 的 template/ 下只有这一个文件)
mkdir -p .claude/skills/analyzing-invoices
curl -o .claude/skills/analyzing-invoices/SKILL.md \
  https://raw.githubusercontent.com/anthropics/skills/main/template/SKILL.md

# ② 按上面的速查表填 name / description,然后查 YAML 语法(v2.1.233+)
/plugin validate

# ③ 看这条 skill 在列表里占了多少 —— 这就是你付的常驻税
/context

# ④ 想要评估那套机器,装官方的 skill-creator
/plugin install skill-creator@claude-plugins-official

# ⑤ 两周后回头查账:谁从没被触发过(v2.1.252+,需交互式会话)
/skill-doctor
失败模式:把 500 行当硬限、把 1536 当建议——正好反了。500 行超了什么都不会发生,只是 Claude 每次触发都要吞下这一整坨;1536 是真砍,你在 description 末尾写的那句最关键的触发词,可能根本没进过模型的视野。
// 02

机制:每个数字背后都有一件具体的事会坏掉

论断:这些约束不是风格洁癖。第三人称、一层深、脚本优先——三条各自对应一个可以复现的故障,知道故障是什么,你就不会去破它。

为什么 description 必须第三人称

因为它被注入 system prompt。官方原话是:人称不一致会导致「发现问题」(discovery problems)。「Processes Excel files and generates reports」是对的,「I can help you...」「You can use this to...」都不对——system prompt 里突然冒出一个第一人称的自述,模型分不清那是它自己的身份还是一条待选工具。而 description 是唯一的检索键:官方明说 Claude 要靠它「从可能 100+ 个 skill 里选对那一个」。正文写得再好,也进不了这一轮筛选。

为什么引用只许一层深

官方给了一个非常具体的行为观察:遇到嵌套引用(SKILL.md → advanced.md → details.md)时,Claude 常常不是完整读文件,而是用 head -100 之类的命令先扫个开头,结果拿到的是残缺信息。所以规矩不是「别写太多层」,是「所有 reference 都要从 SKILL.md 直连」。同一个机制还解释了另一条:超过 100 行的 reference 要在开头放目录——因为模型很可能只看得到前 100 行,目录能让它至少知道后面还有什么。

为什么确定性操作要写成脚本

看那张三层表的最后一行:脚本通过 bash 执行,代码本身永远不进上下文,只有输出计费。所以「预置一个 validate.py」和「让模型每次现编一段校验代码」的差别不是风格,是三件事同时改善:更可靠(不会每次编得不一样)、更省 token(代码不进 context)、更快(不用生成)。官方还要求你在指令里写明是执行还是当参考读——「Run analyze_form.py to extract fields」和「See analyze_form.py for the algorithm」是两件事,前者省 token,后者花 token。

自由度阶梯:窄桥还是旷野

官方的比喻是把 Claude 当成一个在路上走的机器人。两侧是悬崖的窄桥——只有一条安全路径,就给死命令加护栏(低自由度),文档给的例子是数据库迁移:「Run exactly this script: python scripts/migrate.py --verify --backup」,后面直接跟一句「不要改这条命令、不要加参数」。空旷无障碍的原野——很多条路都通,就只给方向(高自由度),例子是代码审查:分析结构 → 找 bug 与边界情况 → 提可读性建议 → 核对项目约定,四句话,没有一条具体命令。中间档是「带参数的伪代码或脚本」,用在「有个首选做法、但允许变化」的场景。判据只有一条:任务有多脆弱。

失败模式:给高自由度任务写死流程。代码审查如果被钉成五个固定步骤,模型就不会再去看这个仓库特有的坑;反过来给数据库迁移写「按你的判断执行」,迟早出事。写之前先问:这件事做错了,是能重来,还是不能。
// 03

真实用法:三种披露模式,各有一个跑着的官方范本

论断:文档给的三种 progressive disclosure 模式听着抽象,但 anthropics/skills 里每一种都有实物。照实物抄,比照文档抄准——因为文档里的示例路径,跟真实 skill 并不一致。

模式 1:高层指南 + 平铺引用

SKILL.md 只留 quick start,其余全部甩给同级文件:FORMS.md / REFERENCE.md / EXAMPLES.md,Claude 用到哪份读哪份。适合「一件事,但有几个深水区」的 skill。

模式 2:按域拆——范本是官方 claude-api

文档给的示范是一个 BigQuery skill:reference/finance.md / sales.md / product.md / marketing.md,SKILL.md 只当导航。理由很实在:用户问销售指标时,模型不该被迫读进财务和市场的 schema。官方 claude-api skill 就是这个结构的成品(它随 Claude Code 一起分发),按语言 + 按主题拆成十几份文档。官方甚至建议在 SKILL.md 里直接写好 grep 命令(grep -i "revenue" reference/finance.md),让模型自己去捞。什么时候别用:只有一个域的 skill 硬拆成多文件,只会多一轮读盘。

模式 3:条件式细节 + 反馈闭环——范本是官方 docx

基础内容摆在正文,高级分支挂链接:「简单编辑直接改 XML;要改追踪修订 → 看 REDLINING.md;要 OOXML 细节 → 看 OOXML.md」。而 docx skill 真身里最值得抄的是那个校验闭环——解包、用 scripts/merge_runs.py 合并碎片化的 run、原地改 word/document.xml(并明写「不要重排、不要美化格式」)、重新打包,然后:

python scripts/office/validate.py out.docx --original doc.docx
# XSD 校验;--auto-repair 修常见问题;改了追踪修订还要加 --author

注意一个真实的不一致:最佳实践页里那条示例命令写的是 python ooxml/scripts/validate.py unpacked_dir/,而仓库里 skills/docx/SKILL.md 实际用的是 scripts/office/validate.py out.docx --original doc.docx。文档里的路径是教学示意,不是能跑的命令。要抄命令,去抄 skill 本身。

两个跟结构无关、但决定成败的模式

边界:description 里可以写「什么时候别用我」

官方文档只说 description 要写「做什么 + 什么时候用」,但看真身——docx 的 description 结尾是:「Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.」负向触发词是文档没讲、实物在用的一招。当你的 skill 库里有好几个功能相邻的 skill(docx / pdf / pptx / xlsx 就是典型),写清楚「不管什么」比再堆一个正向触发词有效得多。

失败模式:在 SKILL.md 里写时效性信息。官方明确点名这种写法——「2025 年 8 月前用旧 API,之后用新的」——因为它必然过期。正确做法是只写当前方法,把旧的塞进一个折叠的「Old patterns」小节。同类反模式还有:Windows 反斜杠路径(一律用正斜杠)、一口气给出四个库让模型自己选(给一个默认值,再留一个逃生口)、术语混用(endpoint / URL / route 挑一个用到底)。
进阶资源 · skills/docx/SKILL.md(校验闭环与负向触发词的原文) · Claude API skill(按域拆的成品)
// 04

代价与替代品:读完这页,最该做的事是不写 skill

论断:这页文档最贵的一条建议被绝大多数人跳过了——先建评估,再写文档。跳过它,你写的是想象出来的需求;而它要花的时间,比写 SKILL.md 本身多得多。

被跳过的那五步

官方把「先建评估」加粗写在评估章节开头,五步是:① 不带 skill 跑真实任务,记下具体失败 → ② 就这些缺口造三个场景 → ③ 量出基线 → ④ 只写刚好够补缺口的字 → ⑤ 跑评估、对照基线、迭代。理由是一句话:这样你解决的才是真问题。

但这里有个坑:官方给了评估的 JSON 结构(skills / query / files / expected_behavior),紧跟着一条 Note 却说——目前没有内置的方式来跑这些评估,要用户自己搭。所以真想按五步走,你要么自己写 runner,要么装 skill-creator(它有自己一套 evals/evals.json → grading.json → benchmark.json 的流程,跑「带 skill / 不带 skill」两组对照)。两条线不通用,别以为写一份到处能跑。

另一件被跳过的事:Claude A / Claude B

官方推荐的迭代法是开两个实例:Claude A 帮你写和改这个 skill,Claude B 装着它去干真活。你观察 B 哪里翻车,把观察带回给 A。文档给的例子很具体——「我让 B 出区域销售报表,它写了查询但忘了过滤测试账号,skill 里明明提了这条规则,是不是不够显眼?」A 可能的回应是把措辞从 always 改成 MUST,或者调整章节顺序。这套办法的价值在于:它逼你拿真实行为当证据,而不是拿「感觉更好了」当证据。

诚实的代价

失败模式:写完就不管。/skill-doctor 会列出每个 skill 的 token 开销、调用频次,并标出从没被触发过的——那些通常不是没用,是 description 写得没进筛选。删掉或重写 description,别留着占位。

// 一页选购卡

先做这三件:① 把 template/SKILL.md 拷进 .claude/skills/ 当起手式(纯文本、零成本、永不过期);② 装 skill-creator(/plugin install skill-creator@claude-plugins-official),冲的是它那套带基线对照的评估机器,不是起草;③ 把 /context 与 /skill-doctor 变成两周一次的习惯。

照着抄结构时:一件事多个深水区 → 抄模式 1(平铺 FORMS.md / REFERENCE.md);多个域 → 抄官方 claude-api;要保证不出错 → 抄官方 docx 的解包-改-scripts/office/validate.py-重打包闭环。命令去 skill 真身抄,别抄文档里的示意路径。

硬数字备查:name ≤ 64 · description ≤ 1024 且第三人称 · Claude Code 列表按 1536 截断(硬砍)· 正文 < 500 行(软建议)· 引用一层深 · reference > 100 行加目录 · 至少 3 条评估 · Haiku/Sonnet/Opus 各测一遍 · metadata 常驻约 100 tokens/skill · 正文 5k tokens 以内。

动手顺序:不带 skill 跑一遍真活 → 记下具体失败 → 造三个场景 → 量基线 → 只写刚好够的字 → 对照基线迭代。别反过来先写文档。

// 术语表

progressive disclosure(渐进式披露)
分层加载:启动时只常驻 name+description,触发后才读 SKILL.md 正文,附带文件用到才读,脚本只执行、代码不进上下文。
frontmatter
SKILL.md 开头的 YAML 头。规范必填只有 name 与 description,各家 harness 可能另加字段。
degrees of freedom(自由度)
指令给死到什么程度。任务越脆弱越该给死命令(窄桥),越开放越该只给方向(旷野)。
feedback loop(反馈闭环)
跑校验 → 报错 → 修 → 再跑,直到通过才继续。校验器可以是脚本,也可以是一份 STYLE_GUIDE.md。
plan-validate-execute
先让模型产出一份可机器校验的中间计划文件,校验通过再执行。用于批量、破坏性、高风险操作。
voodoo constant
没有理由的魔法数字(TIMEOUT = 47)。官方要求每个配置值都写清楚依据——你都不知道该取多少,模型更不知道。

// 延伸阅读