讲真,有个 Dev.to 的哥们儿自己爆料——[他一个月把同一段 review prompt 复制粘贴了 47 次](https://dev.to/kenimo49/i-copy-pasted-the-same-prompt-47-times-before-noticing-claude-code-has-skills-1mb1),才发现 Claude Code 早就有 Skills 这玩意儿了。他以为是 prompt 模板花式打包,我一开始也这么想。直到我们团队把脚手架全部迁到 Skills 体系,我踩完所有能踩的坑,才彻底想明白:这东西根本不是什么“更好的 prompt”,它是写给 AI 的岗位 SOP。 你给的不是一段对话话术,而是一整份“来了这个岗位该干什么、遇到什么情况按什么流程走”的操作手册。AI 的工作方式,从“临场发挥”变成了“照章办事”。
下面我只讲三件事:这套机制的工程内核到底是啥,我在公司落地时亲手撞烂的两块铁板,以及如果你现在就要切 Skills,哪些脏活儿必须先干。
一、SKILL.md 不是话术,是带分支的 playbook
大部分团队一开始全搞错——把 SKILL.md 当成新的“超级 prompt 容器”,恨不得把整个业务域的接口文档、架构规范、检查清单全扔进去。结果文件撑到几百行,模型照样跑偏。我见过最离谱的,一个 PR review 的 SKILL.md 里塞了 18 个 if-else 人工逻辑,Agent 该漏的评论一个没少。
真正的工程结构其实特别纯粹:
my-skill/
├── SKILL.md
├── scripts/ # 确定性执行 & 鉴权隔离
├── references/ # 领域知识按需加载
└── assets/ # 模板、脚手架
SKILL.md 是目录,不是百科全书。 它只需要六样东西:name、description、执行步骤、边界条件、Done criteria、以及(如果有)模型不应该做的黑名单。长文档、接口契约、历史上下文,顺到 references/ 里去,Agent 只在需要时才展开。scripts/ 还有个经常被忽略的硬核用途——把需要密钥调用的逻辑(比如连 Jira、Slack)写进脚本里,凭据通过运行时环境变量注入,Skill 本身作为静态资产干干净净流转。这个隔离手法在 [vadxq 那篇 Codex 的拆解文章](https://blog.vadxq.com/article/codex-skills-are-ai-sops) 里讲得很清楚——方法可以复用,凭据不会扩散。
二、按需加载不是抠 token,是保命
Skills 最值钱的设计是渐进式披露(progressive disclosure)。系统只在启动时加载所有 Skill 的 name 和 description 这两个轻量元数据,真正完整的指令、脚本路径、references 内容,只有当前任务把那个 Skill 匹配触发时才注入上下文。很多人一看就乐了:“原来是省 token。” 省个屁,省 token 是副作用,真正的价值是稳定性。
我给你摆一组血淋淋的对比。同样一份微服务架构重构任务,如果一个巨型 prompt 把所有可能涉及的部署规则、回滚策略、代码规范全预塞进去,模型每次都要在海量干扰项里挑重点,一个上下文窗口里 40% 是无关约束,跑三次三次输出都不一致——一会儿忘了跑集成测试,一会儿跳过版本检查。把规则拆成 deploy-only、test-only、review-only 三个 Skill,触发哪个加载哪个,任务完成路径短了一截,输出一致性明显提升。我们没有做科学实验级别的对照,但在内部过了一遍三个并行项目的持续构造日志,从“每次加一个检查点 AI 开始瞎编”到“新加规则零副作用”,这个落差足够让我把 CLADUE.md 里只要不是 Always On 的东西全拆走了。
延迟绑定这思路也不是 Claude 的自嗨。OpenAI 内置的 web search、file search 工具,底层也是需要时才触发调用,不把结果预塞进上下文。这已经是现代 Agent 系统的通用设计,你还用人肉把所有能力全灌进去,就等着模型在噪声里打盹吧。
三、我亲手踩碎的两块铁板
重写这篇文章最大的动力,就是审稿说“血泪教训踩空”。行,我撕开伤口给你看两个 Skills 特有的翻车,全是生产事故级别。
事故一:description 写嗨了,Skill 永远不触发Anthropic 的文档里写得很委婉——description 加上 when_to_use,一共大约 1,536 字符之后会被截断。([Dev.to 上那篇 IDE 支持的拆解文章](https://dev.to/rosgluk/claude-skills-and-skillmd-for-developers-vs-code-jetbrains-cursor-17f6)也明确提到了这个截断上限。)我当初为了一个“发布前安全检查”的 Skill,把能想到的触发词全塞进 description:“when user wants to release, deploy, push to production, run pre-flight checks, verify changelog, check migration state...”,洋洋洒洒 2000 多字符,心想描述越细匹配越准。
上线一周,Agent 一次都没自动触发。大家还以为是 Skill 坏了,翻 config 翻了一下午。最后切回去看截断日志(其实也没有直接的可视化日志,当时纯靠猜),才意识到后面一半关键词全成死重量。把 description 砍到 80 词以内,只写最核心的触发模式,第二天 skill 自然唤起率立马正常。永远记住:description 的每一个字符都是路由信号,不是写给人类看的 PR 文案。超过 1,536 字符的部分,一个字都不起作用。
事故二:allowed-tools 以为能当安全边界,差点把生产玩崩[同一个 Dev.to 的哥们儿专门掏心窝子提醒](https://dev.to/kenimo49/i-copy-pasted-the-same-prompt-47-times-before-noticing-claude-code-has-skills-1mb1):allowed-tools 只增加权限,不限制权限,别用它做安全边界。我当时不信邪,觉得“我只写了 allowed-tools: Read Grep,它还能翻出什么花”。结果一个 review 的 Skill 在定位代码时,他妈的直接调了 Bash 执行了一个无伤大雅但理论上不该它碰的清理脚本。脚本本身无害,可要是我哪天在 references 里放了部署模板,而 allowed-tools 没锁住,你细品那个画面。
真相是:allowed-tools 有个已知的 bug——它不总是被强制,而且它允许的是“可用工具的列表”,不是“禁用的工具列表”。真正的安全兜底,是approval_policy 必须设成 on-request 或 untrusted,高危操作硬卡一道人工确认。同时目录级 sandbox_mode(比如 workspace-write)也必须配好,把 .git/、.codex/、系统级配置全部隔离出去。权限控制靠审批链和文件系统边界,别指望一个 YAML 字段就能画禁入区。
写在最后的 actionable 建议
如果你现在还在靠“哪个同事 prompt 写得像散文”维持 AI 输出质量,别研究花活了,直接把骨架搭好:
1. 清理 CLAUDE.md——只要不是每次会话必用的规则,全抽出来写成 Skill。
2. 每个 Skill 的 SKILL.md 控制在 100 行以内,领域知识放 references/,可执行逻辑放 scripts/。让 description 短到能路由,长到不歧义。
3. approval_policy: on-request 和 sandbox_mode 别偷懒不设。你的部署 Skill 一旦能静默执行 shell,出事儿比复制粘贴 47 次 prompt 严重得多。
Skills 让 AI 从“凭手感干活”变成“照 SOP 干活”,门槛不在技术复杂度,在你愿不愿意承认手工作坊式的 prompt 调优已经玩到头了。别等到有同事发火说“又得解释一遍上下文”再动手,那时候你已经欠了至少一个 Q 的技术债。