# 5. Skill
# 5.1 原理
Skill 是可发现、可版本化、可按需注入的能力包。它通常包含:
- 元数据:名称、描述、触发条件、权限/工具需求;
- 指令:完成一类任务的操作协议;
- 资源:参考文档、模板、样例;
- 脚本/工具:确定性执行逻辑;
- 验证:检查输出是否符合契约。
Skill 的价值是渐进式披露。会话开始只注入简短目录,命中时才读取完整正文,引用的深层资源再按需加载。否则大量 Skill 会占满上下文并破坏 Prompt Cache。
安全上不能把 Skill 当成可信代码:要校验路径、来源和声明权限;脚本仍然经过普通工具权限与沙箱;Skill 指令不能绕过系统/开发者策略。
# 5.2 Claude Code 源码
SkillTool 读取 Skill 文件、解析 frontmatter,将 Skill 根目录和正文组成模型可见内容,并保留来源路径以解析相对资源:SkillTool.ts:1069。压缩后不会盲目重注入所有 Skill,而是按 Token 预算恢复已调用 Skill 的必要内容:compact.ts:1492。MCP 资源还可以提供 skill:// Skill:client.ts:2349。
# 5.3 Codex 源码
Codex 的独立 skills crate 负责 SKILL.md frontmatter 解析、接口元数据、资源路径约束和启停策略:parser.rs:43、interface.rs:31、policy.rs:9。系统 Skill 被安装到受管理缓存,并以 fingerprint 判断版本:lib.rs:39。Turn 启动阶段根据用户提及和插件选择构建 Skill/Plugin 注入项:turn.rs:221。
# 5.4 伪代码
function activateSkill(userInput, catalog): // 根据当前用户意图按需激活 Skill
candidates = semanticAndRuleMatch(userInput, catalog.metadataOnly) // 仅用轻量元数据做语义和显式触发规则匹配
selected = policyFilter(candidates) // 根据来源、启停策略和权限过滤候选 Skill
for skill in selected: // 逐个处理最终允许激活的 Skill
manifest = parseFrontmatter(read(skill.SKILL_MD)) // 完整读取并解析 Skill 的声明、指令和依赖
assert pathWithinApprovedRoot(skill.path) // 防止相对路径逃逸到 Skill 根目录之外
assert requiredToolsSubsetOfSessionTools(manifest) // 确保 Skill 所需工具没有突破 Session 工具上限
context.inject(skill.instructions, bounded = true) // 在 Token 上限内把 Skill 指令注入当前上下文
# 5.5 面试题
问:Skill 和 Tool 有什么区别?
Tool 是可执行接口,契约是 schema → side effect/result;Skill 是解决某类问题的知识与流程包,可以调用多个 Tool。Skill 负责“怎么做”,Tool 负责“执行一个动作”。
# 5.6 原理深化:Skill 是按需展开的能力生命周期
从两套源码可以把 Skill 还原成六个阶段,而不只是“读取一个 Markdown”:发现阶段扫描受信目录并只暴露名称、描述等轻量索引;选择阶段结合用户显式提及、隐式触发策略和产品限制筛选;解析阶段校验 frontmatter、路径和资源接口;注入阶段把正文作为有来源、有 Token 上限的上下文项加入当前 Turn;执行阶段仍通过普通 Tool、权限与沙箱;恢复阶段在压缩或恢复 Session 后,只重建本任务仍需要的 Skill 状态。
Codex 的 Turn 先从用户消息收集显式 Skill/Plugin 提及,再构建 Skill injection,并去除宿主已经注入的重复路径,说明“激活结果”属于当前 Turn 的确定输入,而不是模型采样中途任意改变的全局变量:turn.rs:694、turn.rs:789、turn.rs:850。SkillPolicy 又把“允许隐式调用”和产品限制建模成元数据,但源码中的 TODO 也提醒:只解析策略不等于所有选择路径都已经强制执行,面试时必须区分数据模型与实际 enforcement:model.rs:14、model.rs:65。
由此得到三个原理。第一,Skill 的权限是需求声明而不是授权,最终有效能力必须与 Session Tool 集合和权限上限取交集。第二,Skill 正文进入模型后只是建议,确定性校验应放在脚本、Tool Schema 或验证器中。第三,渐进披露同时服务于安全和上下文效率:未命中的 Skill 不读取深层资源,命中后也只加载完成当前步骤需要的部分;否则既破坏 Prompt Cache,又扩大 Prompt Injection 面。
← 4. Agent Loop 6. MCP →