在 Skills 独立总图 中,本节对应 D 正文交付 / F 按需资源。只追踪内容何时进入模型上下文,暂不展开执行会话内部。

本节的按需读取的参考文件、文件位置与实验步骤见 S07.10 完整示例附录。

如果要先学习参考文件怎样组织、相对链接怎样写,以及如何明确读取条件,可先读 7.7 References。本页继续解释这些内容何时对模型可见。

我想弄清楚的问题

“按需加载”到底是在说晚一点读磁盘,还是晚一点把内容发给模型?我理解 Skills 时,最容易混淆的就是这两件事。

渐进式披露的重点是模型的上下文可见性。Agent Skills 规范把它分成元信息、技能指令和配套资源三个层次。

用 review-diff 跟踪三层内容

D / F · 渐进披露的是模型可见内容内容可以早已存在于磁盘或应用缓存;模型只看到实际交给它的部分。D / F · 渐进披露的是模型可见内容内容可以早已存在于磁盘或应用缓存;模型只看到实际交给它的部分。内容存放处SKILL.mdreferences / scripts应用可能已读取不等于已发给模型1 名称与描述发现可用方法知道何时适用完整正文尚未进入2 Skill 正文调用后装载工作步骤与资源入口不是自动逐标题加载3 所需资源执行中按需取用参考正文或脚本输出其余资料无需全量加入调用后需要时review-diff:先见用途 → 读到审查步骤 → 涉及输入边界时才读对应参考文件。这张图说明上下文可见性,不假定 Claude Code 内部的磁盘读取或缓存时序。已加载内容的保留、再次调用和压缩,是后续生命周期问题。
颜色与线型
  • 蓝色:已有且保留(本图未用)
  • 橙色:修改/职责迁移(本图未用)
  • 紫色:本节核心机制
  • 红色虚线:真实移除(本图未用)
  • 灰色实线框:存储/辅助节点
  • 灰色虚线框:细节合并,功能保留(本图未用)
  • 灰字:来源/补充说明
  • 灰色虚线:关联,不是执行回环(本图未用)
  • 实线箭头:流程/数据方向
这里按模型可见内容分层:目录帮助选择,调用后获得正文,执行中再取所需资源。图中的三个层次不等于三次固定的磁盘读取。左右滑动查看全图。
阶段模型得到什么还没有默认得到什么
可用目录名称和用途描述完整审查步骤
调用 SkillSKILL.md 中的主流程所有配套参考文件
任务需要更多细节实际读取的参考内容,或脚本输出没有取用的其他资料

SKILL.md 本身被调用时会完整装载。它不会因为包含多个标题就自动只加载其中一段;要让大块细节晚一点进入上下文,需要把它们放到单独文件,并在正文里说明什么时候取用。

配套资料怎样继续披露

扩展我们的目录:

review-diff/
├── SKILL.md
├── references/
│   ├── input-boundaries.md
│   └── concurrency.md
└── scripts/
    └── inspect-diff.sh

在主文件中写清楚路由:

## 需要时读取的资料

- 改动涉及空输入、缺失字段、默认值或类型边界时,
  阅读[输入边界审查](references/input-boundaries.md)。
- 改动涉及共享状态、异步任务或并发时,
  阅读[共享状态审查](references/concurrency.md)。

这里采用官方示例中的 Markdown 相对链接,路径以 SKILL.md 所在目录为基准。纯文本路径并未被规范禁止;使用链接是为了清楚表达文件关系。references/ 是可选的组织目录,参考文件也可以直接放在主文件旁边。参见 Agent Skills 文件引用规范与 Claude Code 配套文件示例。

两份资料不需要随每次调用全部进入上下文。Claude 要进一步了解输入边界时,再用文件工具读取第一份。脚本可以直接运行,模型通常看到的是执行结果;运行程序不会自动把全部源码当作参考文本注入。

第一份参考文件可以写得很具体:

## 输入边界检查

- 空列表、空字符串、缺失字段分别会走哪条分支?
- 调用方约定的是返回默认值,还是明确报错?
- 如果默认值改变,哪些调用方会受到影响?

报告问题时,给出具体输入和导致错误的表达式。
先核对项目已有约定,不把偏好的编码风格当成行为缺陷。

这份文件扩展的是审查方法。主流程已经指定了取用条件,模型碰到相关改动时才需要它;目录名称本身不会自动触发读取。

我的设计重点是:目录描述负责发现,主文件负责主要步骤与资源入口,参考文件承载当前任务才需要的细节。

程序已经读过文件,不代表模型已看到

当前本地教学版的 SkillLoader.scan() 会把完整文件内容读入 self.skills。下面按源码保留关键字段:

self.skills[name] = {
    "name": name,
    "description": description,
    "content": content,
}

但 catalog() 只取名称和描述;load_skill 才把完整文件作为工具结果回传到 messages。所以这份代码的“延迟”发生在模型上下文层,而非第一次读磁盘的时刻。它缓存并返回的是完整 SKILL.md 文件,包含 frontmatter;现代产品的正文处理另按官方说明理解。

对现代 Claude Code,我按官网确认的是“描述先可见、正文调用时装载”,不据此猜测内部每一次磁盘读取或缓存的时机。

加载之后会不会立刻消失

官网内容生命周期说明,装载后的正文作为消息保留在对话中,后续轮次继续参考。再次调用相同渲染内容会避免重复注入;参数或动态输出改变,则可能产生新内容。

自动压缩会按预算保留已调用技能,不能把它理解为所有正文永远完整保留。持续保留内容也有上下文成本,所以主文件仍应集中表达必要步骤。

正文留在上下文中,与调用时的临时工具授权是两种生命周期。下一节讨论内容如何渲染,第六节再区分这些权限。

我的理解

渐进式披露控制的是“模型现在需要看到多少”。Skill 被发现、程序缓存了正文、模型读到了正文,是三个不同状态;只有分清它们,才能解释为什么这种组织能节省上下文。

上一节 · 下一节:参数与动态信息