<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Skills | 有志者事竟成</title><link>https://www.liwenshen.com/tags/skills/</link><atom:link href="https://www.liwenshen.com/tags/skills/index.xml" rel="self" type="application/rss+xml"/><description>Skills</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>zh</language><lastBuildDate>Sat, 04 Jul 2026 15:00:00 +0800</lastBuildDate><image><url>https://www.liwenshen.com/media/icon_hu_dd5d76fef920c49e.png</url><title>Skills</title><link>https://www.liwenshen.com/tags/skills/</link></image><item><title>技能系统：Agent 如何把经验变成可复用的程序化记忆</title><link>https://www.liwenshen.com/note/hermes-agent-engineering/11-skills-system/</link><pubDate>Sat, 04 Jul 2026 15:00:00 +0800</pubDate><guid>https://www.liwenshen.com/note/hermes-agent-engineering/11-skills-system/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;系列：通过 Hermes 探秘 Agent 工程 · 补遗篇&lt;/strong&gt;
关联篇：&lt;a href="https://www.liwenshen.com/note/hermes-agent-engineering/05-memory-system/"&gt;记忆系统：跨会话持久化的工程实现&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="问题记住了是什么但忘了怎么做"&gt;问题：记住了&amp;quot;是什么&amp;quot;，但忘了&amp;quot;怎么做&amp;quot;&lt;/h2&gt;
&lt;p&gt;第 5 篇聊过 Hermes 的记忆系统——&lt;code&gt;MEMORY.md&lt;/code&gt; 记事实，&lt;code&gt;USER.md&lt;/code&gt; 记偏好。它们是&lt;strong&gt;陈述性记忆&lt;/strong&gt;——你知道什么。&lt;/p&gt;
&lt;p&gt;但 Agent 完成一个复杂任务后，最有价值的不是&amp;quot;我知道什么&amp;quot;，而是&amp;quot;我怎么做成的&amp;quot;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次用 Docker 部署应用时踩过的坑和最终成功的命令序列&lt;/li&gt;
&lt;li&gt;为项目编写特定格式的 API 文档时的最佳实践&lt;/li&gt;
&lt;li&gt;在 CI 流程里正确配置测试覆盖率的步骤&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这是&lt;strong&gt;程序化记忆&lt;/strong&gt;——关于&amp;quot;怎么做&amp;quot;的知识。&lt;/p&gt;
&lt;p&gt;Hermes 的技能系统就是为此设计的：把成功的做法编码成可复用的程序化记忆，以后遇到类似任务时自动加载、自动执行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="技能是什么"&gt;技能是什么&lt;/h2&gt;
&lt;p&gt;一个技能就是一个目录，核心是一个 &lt;code&gt;SKILL.md&lt;/code&gt; 文件：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;~/.hermes/skills/
├── docker-deploy/
│ ├── SKILL.md # 主指令（必须）
│ ├── references/
│ │ └── troubleshooting.md # 参考文档
│ └── templates/
│ └── Dockerfile.tpl # 模板文件
├── api-docs/
│ └── SKILL.md
└── code-review/
├── SKILL.md
└── references/
└── checklists.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;SKILL.md 使用 YAML frontmatter + Markdown 主体：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;name: docker-deploy
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;description: 用 Docker 部署 Python web 应用的最佳实践，包含常见坑点排查
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;version: 1.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Docker 部署 Python Web 应用
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## 触发条件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;当用户要求：
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; &amp;#34;用 Docker 部署这个应用&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; &amp;#34;帮我写 Dockerfile&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; &amp;#34;把这个服务容器化&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;frontmatter 有严格的长度限制：&lt;code&gt;description&lt;/code&gt; ≤ 1024 字符，&lt;code&gt;name&lt;/code&gt; ≤ 64 字符——这些不是随意定的，它们对应 LLM 上下文窗口里&lt;strong&gt;每个技能的 token 预算&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="三个工具skills_listskill_viewskill_manage"&gt;三个工具：skills_list、skill_view、skill_manage&lt;/h2&gt;
&lt;p&gt;技能系统的三个工具共用 &lt;code&gt;registry.register(self, name, toolset, schema, handler, check_fn)&lt;/code&gt; 注册到 &lt;code&gt;skills&lt;/code&gt; toolset。&lt;/p&gt;
&lt;h3 id="skills_list--列出所有可用技能"&gt;skills_list — 列出所有可用技能&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;schema:
description: &amp;#34;List available skills (name + description). Use skill_view(name) to load full content.&amp;#34;
parameters:
category (string, optional): 按分类过滤
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;返回 JSON：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;success&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;count&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;categories&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;devops&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;coding&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;writing&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;skills&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;docker-deploy&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;用 Docker 部署 Python web 应用...&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;category&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;devops&amp;#34;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;api-docs&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;编写 REST API 文档的最佳实践...&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;#34;category&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;writing&amp;#34;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;hint&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Use skill_view(name) to see full content, tags, and linked files&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;只返回 name + description 的元数据——&lt;strong&gt;几十个技能加起来可能只有 1000 字符&lt;/strong&gt;，消耗极少的 token。&lt;/p&gt;
&lt;h3 id="skill_view--加载完整的技能内容"&gt;skill_view — 加载完整的技能内容&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;schema:
description: &amp;#34;Skills allow for loading information about specific tasks and workflows,
as well as scripts and templates. Load a skill&amp;#39;s full content or access
its linked files (references, templates, scripts)...&amp;#34;
parameters:
name (string, required):
description: &amp;#34;技能名称。对于插件提供的技能，使用 &amp;#39;plugin:skill&amp;#39; 格式
（如 &amp;#39;superpowers:writing-plans&amp;#39;）&amp;#34;
file_path (string, optional):
description: &amp;#34;技能目录内的文件路径（如 &amp;#39;references/api.md&amp;#39;、
&amp;#39;templates/config.yaml&amp;#39;、&amp;#39;scripts/validate.py&amp;#39;）。
省略则返回主 SKILL.md 内容。&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;调用链：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;路径安全检查&lt;/strong&gt; — 拒绝 &lt;code&gt;..&lt;/code&gt; 遍历、绝对路径、Windows drive path&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;插件分发&lt;/strong&gt; — 如果 name 包含 &lt;code&gt;:&lt;/code&gt;（如 &lt;code&gt;plugin:skill&lt;/code&gt;），查插件注册表&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;三策略查找&lt;/strong&gt; — ① 直接路径匹配 → ② 递归目录名匹配 → ③ frontmatter &lt;code&gt;name&lt;/code&gt; 字段匹配&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;碰撞检测&lt;/strong&gt; — 多个目录匹配同一个 name → 拒绝并提示歧义&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平台过滤&lt;/strong&gt; — &lt;code&gt;frontmatter.platforms&lt;/code&gt; 不匹配当前 OS → 跳过&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境过滤&lt;/strong&gt; — &lt;code&gt;frontmatter.requires&lt;/code&gt; 不满足 → 跳过&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;返回 JSON：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;success&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;docker-deploy&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;content&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;...完整的 SKILL.md 内容...&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;linked_files&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;references&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;troubleshooting.md&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;security-checklist.md&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;templates&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;Dockerfile.tpl&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;docker-compose.yml.tpl&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;scripts&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;validate.sh&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;tags&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;docker&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;deployment&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;devops&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;related_skills&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;ci-cd&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;kubernetes&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;每次成功的 &lt;code&gt;skill_view&lt;/code&gt; 还会触发&lt;strong&gt;遥测&lt;/strong&gt;：更新 &lt;code&gt;view_count&lt;/code&gt; 和 &lt;code&gt;use_count&lt;/code&gt;——这是 Curator 判断&amp;quot;哪些技能在活跃使用&amp;quot;的依据。&lt;/p&gt;
&lt;h3 id="skill_manage--创建更新删除技能"&gt;skill_manage — 创建、更新、删除技能&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;schema:
description: &amp;#34;Manage skills (create, update, delete). Skills are your procedural
memory — reusable approaches for recurring task types...&amp;#34;
parameters:
action (string, enum): create | patch | edit | delete | write_file | remove_file
name (string): 技能名（≤64 字符，小写+连字符）
content (string): create/edit 时的完整 SKILL.md 内容
old_string / new_string (string): patch 时的查找替换
replace_all (boolean): patch 是否替换全部匹配
category (string): create 时的分类目录
file_path (string): 辅助文件的路径
file_content (string): write_file 时的文件内容
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;create&lt;/strong&gt; 的动作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建 &lt;code&gt;~/.hermes/skills/&amp;lt;category&amp;gt;/&amp;lt;name&amp;gt;/&lt;/code&gt; 目录结构&lt;/li&gt;
&lt;li&gt;写入 SKILL.md（自动添加 frontmatter）&lt;/li&gt;
&lt;li&gt;可选写入 references/、templates/、scripts/、assets/ 辅助文件&lt;/li&gt;
&lt;li&gt;如果开启了 &lt;code&gt;skills.guard_agent_created&lt;/code&gt;（默认关闭），运行安全扫描&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;patch&lt;/strong&gt; 的动作：
在 SKILL.md 或指定文件里做查找替换——使用模糊匹配（9 种策略容忍空白差异），是增量更新的首选方式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;delete&lt;/strong&gt; 的动作有三层路径验证：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;拒绝符号链接/junction 重定向&lt;/li&gt;
&lt;li&gt;拒绝解析后不在任何 skills_root 目录下的路径&lt;/li&gt;
&lt;li&gt;拒绝删除 skills_root 本身（防止递归删除整个 skills/ 树）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="渐进式披露token-预算的艺术"&gt;渐进式披露：token 预算的艺术&lt;/h2&gt;
&lt;p&gt;第 1 篇提到过，system prompt 是&amp;quot;有价商品&amp;quot;——每添加一个字就消耗一个 token 预算。技能系统的渐进式披露在两个层面解决这个问题：&lt;/p&gt;
&lt;h3 id="层面一system-prompt-里的-skill-index"&gt;层面一：System Prompt 里的 Skill Index&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;build_skills_system_prompt()&lt;/code&gt; 在 system prompt 里注入一份&lt;strong&gt;紧凑的技能索引&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;## Skills (mandatory)
Before replying, scan the skills below. If a skill matches or is even partially relevant
to your task, you MUST load it with skill_view(name) and follow its instructions.
Err on the side of loading — it is always better to have context you don&amp;#39;t need
than to miss critical steps, pitfalls, or established workflows.
&amp;lt;available_skills&amp;gt;
devops: DevOps and infrastructure skills
- docker-deploy: 用 Docker 部署 Python web 应用的最佳实践...
- kubernetes: 在 Kubernetes 上部署和管理容器化应用...
writing: Documentation and writing skills
- api-docs: 编写 REST API 文档的最佳实践...
&amp;lt;/available_skills&amp;gt;
Only proceed without loading a skill if genuinely none are relevant to the task.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这份索引只包含 &lt;code&gt;name&lt;/code&gt;（≤64 字符）+ &lt;code&gt;description&lt;/code&gt;（≤1024 字符）。10 个技能可能 ~2000 字符，50 个字符可能 ~8000 字符。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键设计决策&lt;/strong&gt;：system prompt 里的索引&lt;strong&gt;不是过滤&lt;/strong&gt;，而只是&lt;strong&gt;提示&lt;/strong&gt;。LLM 看到索引后，自己判断该调不调 &lt;code&gt;skill_view&lt;/code&gt;。没有任何代码逻辑会说&amp;quot;这个技能不在 system prompt 索引里所以禁止加载&amp;quot;——&lt;code&gt;skill_view&lt;/code&gt; 和 &lt;code&gt;skills_list&lt;/code&gt; 都可以按名字或路径找到任何技能，包括在索引之外的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;编码模式&lt;/strong&gt;下还有个优化：与 coding 无关的分类会被&lt;strong&gt;降级为 names-only&lt;/strong&gt;——只显示技能的 name 列表，不显示 description。这可以减少非 coding 上下文下的 token 消耗：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; social-media [names only]: twitter-linkedin, wechat-article, xiaohongshu
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注：names-only 的分类仍然&lt;strong&gt;可以被加载&lt;/strong&gt;——只是系统 prompt 里节省了描述文本。&lt;/p&gt;
&lt;h3 id="层面二两层缓存避免重复计算"&gt;层面二：两层缓存避免重复计算&lt;/h3&gt;
&lt;p&gt;系统 prompt 里的技能索引构建有一套&lt;strong&gt;两层缓存&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L1 — 进程内 LRU cache&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cache_key = (
skills_dir path,
external_dirs list,
available_tools (permutation invariance),
available_toolsets (permutation invariance),
platform hint,
disabled_skill_names,
compact_categories,
)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;CWD 变了、工具集变了、平台变了 → cache 失效。Gateway 有多个 agent session 共用同一个进程，所以这个 cache 必须记录 platform 维度——保证 Telegram session 和 Discord session 的技能索引是独立的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L2 — 磁盘快照&lt;/strong&gt;：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;~/.hermes/skills/.skills_prompt_snapshot.json
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;包含所有技能的元数据（name, description, platforms, conditions）和目录结构。冷启动时先尝试加载磁盘 snapshot；如果 mtime/size manifest 不匹配（技能文件被修改过），再走全文件扫描。&lt;/p&gt;
&lt;p&gt;磁盘 snapshot 让 Gateway 冷启动时不需要遍历所有 SKILL.md 文件——直接读 JSON 解析即可。&lt;/p&gt;
&lt;h3 id="层面三按需展开"&gt;层面三：按需展开&lt;/h3&gt;
&lt;p&gt;三层渐进式的 token 消耗：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;层级&lt;/th&gt;
&lt;th&gt;调用&lt;/th&gt;
&lt;th&gt;返回内容&lt;/th&gt;
&lt;th&gt;典型 token 消耗&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;L1&lt;/td&gt;
&lt;td&gt;System prompt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;name + description&lt;/code&gt; 索引&lt;/td&gt;
&lt;td&gt;~100/token × SKILL.md&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;skill_view(name)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;完整 SKILL.md + linked_files 目录&lt;/td&gt;
&lt;td&gt;~2K-10K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L3&lt;/td&gt;
&lt;td&gt;&lt;code&gt;skill_view(name, file_path)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;单个文件的内容&lt;/td&gt;
&lt;td&gt;~500-5K&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;L1 层和 L2 层之间的关键差异是 &lt;strong&gt;linked_files 目录&lt;/strong&gt;——&lt;code&gt;skill_view&lt;/code&gt; 返回的 JSON 里包含一个 &lt;code&gt;linked_files&lt;/code&gt; 字段，告诉 Agent 这个技能还附带哪些 references/templates/scripts。Agent 可以自己判断是否需要进一步加载。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="工程启示"&gt;工程启示&lt;/h2&gt;
&lt;h3 id="1-程序化记忆-vs-陈述性记忆"&gt;1. 程序化记忆 vs 陈述性记忆&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;MEMORY.md&lt;/code&gt; 记事实，&lt;code&gt;SKILL.md&lt;/code&gt; 记流程。这是一个清晰的认知科学映射——人类大脑的陈述性记忆（海马体）和程序性记忆（基底节）是分离的。Agent 工程里，把&amp;quot;世界知识&amp;quot;和&amp;quot;操作知识&amp;quot;分开存储，能显著提升检索效率。&lt;/p&gt;
&lt;h3 id="2-渐进式披露是-agent-的标准技能"&gt;2. 渐进式披露是 Agent 的标准技能&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;skills_list&lt;/code&gt; → &lt;code&gt;skill_view&lt;/code&gt; → &lt;code&gt;skill_view(file_path=...)&lt;/code&gt;，三层对应 token 消耗的阶梯。系统 prompt 里的索引相当于&amp;quot;书架上的书脊&amp;quot;——提供选择信号但不消耗内容预算。所有需要把&amp;quot;大量信息&amp;quot;暴露给 LLM 的场景（工具定义、文档检索、推荐系统），都应该采用这种书脊 → 目录 → 正文的渐进模式。&lt;/p&gt;
&lt;h3 id="3-声明式技能比代码插件更安全"&gt;3. 声明式技能比代码插件更安全&lt;/h3&gt;
&lt;p&gt;SKILL.md 是 Markdown 文档，不是 Python 代码。它只能&amp;quot;告诉&amp;quot; LLM 怎么做，不能自己执行。这让技能的安全风险从&amp;quot;任意代码执行&amp;quot;降级为&amp;quot;prompt injection&amp;quot;——后者已经有系统的防御机制（安全扫描、隔离安装、信任分级）。&lt;/p&gt;
&lt;h3 id="4-agent-的自我进化"&gt;4. Agent 的自我进化&lt;/h3&gt;
&lt;p&gt;技能创建 = Agent 把成功的做法固化成可执行记忆。这是 Agent 自主进化的最小可行形式——不需要 fine-tuning，不需要复杂的训练管线，只需要 Agent 在完成任务后多走一步：把成功做法写成 SKILL.md。&lt;/p&gt;
&lt;h3 id="5-缓存维度设计"&gt;5. 缓存维度设计&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;build_skills_system_prompt&lt;/code&gt; 的 cache key 包含了 &lt;code&gt;platform hint&lt;/code&gt; + &lt;code&gt;compact_categories&lt;/code&gt; + &lt;code&gt;available_toolsets&lt;/code&gt;——这三个维度是 Gateway 多 session、多平台、多变 posture 场景下真正的&amp;quot;变化维度&amp;quot;。这个 cache key 设计值得参考：不只是&amp;quot;内容变了才 cache 失效&amp;quot;，而是&amp;quot;消费上下文变了才 cache 失效&amp;quot;。&lt;/p&gt;</description></item></channel></rss>