深入解析 teach 技能:在 skills 仓库中用状态化教学工作区长期学习任何主题
【免费下载链接】skillsSkills for Real Engineers. Straight from my .agents directory.项目地址: https://gitcode.com/GitHub_Trending/skills13/skills
导读
teach是本仓库skills/productivity/分类下的一个用户主动调用型(User-invoked)技能,其核心思想是:把你运行它的那个目录,变成一个可以跨多次会话持续积累的"教学工作站"。它不依赖模型已有的参数化知识(parametric knowledge),而是先去寻找高信任度的外部资源、记录在RESOURCES.md中并在每节课里逐条引用;同时它是**有状态(stateful)**的,使命、资源、课程和已学记录全部以文件形式留在目录里,下一次会话从这些文件继续,而不是从上次对话残留的上下文继续。读完本文,你将掌握teach的工作原理、工作区目录结构、四种配套文件格式(MISSION / RESOURCES / LEARNING-RECORD / GLOSSARY)、它的适用边界,以及它与handoff、research、ask-matt等技能的配合方式。
一、teach 是什么:把目录变成跨会话的教学工作站
根据 docs/productivity/teach.md 的定义,teach会把你运行它的目录变成一个常驻的教学工作区(teaching workspace),并围绕一个主题,在多次会话中产出短小、自包含的 HTML 课程。它的两个结构性事实是:
- 不信任参数化知识:它不会直接从模型"已经知道"的内容里教学。每次开课之前,它先外出查找高信任度资源,记录到
RESOURCES.md,并在每一节课内引用这些来源。 - 有状态(stateful):使命(mission)、资源(resources)、课程(lessons)和你的学习记录(learning records)全部以文件形式保存在目录中。下一次会话从这些文件续接,而不是依赖上一次对话在模型上下文里的残留。
这种设计的直接后果是:课程的连续性由文件夹承载,而不是由对话承载。你在任意一个空目录里输入/teach,它做的第一件事不是开课,而是先访谈你为什么要学这个主题,并把原因写进MISSION.md。
从源码看:SKILL.md 中如何定义教学工作站
在 skills/productivity/teach/SKILL.md 的 frontmatter 中可以看到:
--- name: teach description: Teach the user a new skill or concept, within this workspace. disable-model-invocation: true argument-hint: "What would you like to learn about?" ---disable-model-invocation: true表明这是一个只能由用户输入/teach触发的技能,模型不会自行调用。这与 skills/productivity/teach/agents/openai.yaml 中的配置一一对应:
interface: display_name: "Teach" short_description: "Learn a concept in a guided workspace" policy: allow_implicit_invocation: false也就是说,在 Claude Code 一侧通过disable-model-invocation禁用模型自动调用,在 OpenAI/Codex 一侧通过policy.allow_implicit_invocation: false禁用隐式调用,两条配置共同保证:只有你主动输入/teach时它才会启动。这与本仓库 skills/productivity/README.md 中对"用户主动调用"类技能的定义完全一致。
SKILL.md的主体则要求 agent 把当前目录当作教学工作站,并在目录中维护如下状态文件:
MISSION.md:记录用户对主题感兴趣的原因,所有教学都以此为基础,格式遵循 MISSION-FORMAT.md;./reference/*.html:参考文档目录,是课程压缩后的"原料单元",包括速查表、算法、语法、瑜伽体式、术语表等;RESOURCES.md:一份可探索的资源清单,用于把教学扎根于上下文知识,格式遵循 RESOURCES-FORMAT.md;./learning-records/*.md:学习记录目录,相当于软件开发中的架构决策记录(ADR),捕捉非显而易见的知识与关键洞见,用于计算"最近发展区",编号格式为0001-<dash-case-name>.md;./lessons/*.html:课程目录,一节课是一个自包含的 HTML 输出,是本工作区教学的主要单元;./assets/*:跨课程复用的组件(见下文);NOTES.md:记录用户教学偏好或工作笔记的便签。
二、何时该用 teach:长期学习 vs 一次性解答
根据 docs/productivity/teach.md,teach的适用场景是"学习本身就是项目"的情况:一门语言、一个框架、一个你刚加入的代码库、瑜伽、着色器、某类认证考试。它不是用来"顺带解释一个问题"的工具。文档用一张对照表给出了明确的取舍建议:
| 你想要什么 | 应该用什么 |
|---|---|
| 在数周内学习一个主题,并且会话之间要持续累积 | teach |
| 在当前会话里解释一个想法 | 直接在会话里问 |
| agent 上一条消息没讲明白,需要重新解释 | wait-what(见 docs/productivity/wait-what.md) |
| 打磨你已有的思考,而非获取新内容 | grill-me(见 skills/productivity/grill-me/SKILL.md) |
| 让一个后台 agent 阅读一手资料并给你一份带引用的文档 | research(见 skills/engineering/research/SKILL.md) |
| 在 grilling 过程中遇到不懂的东西,又不想打断 grilling | 先用handoff切到一个教学工作区,再在那里用teach |
这里的关键区分是:teach是"以周为尺度、以会话为单位累积"的学习工具。如果你只是想在一段对话里搞懂某个概念,直接提问即可,没必要为它建立一个教学工作站。
三、前置条件与工作区布局:一个工作区只服务一个使命
teach建立的是一个目录而不是一个文件,且技能假设一个工作区只对应一个使命(mission)。因此官方文档的建议是:把它运行在某个你愿意整个交给单一主题的目录里,并且不要放在你正在工作的项目里。推荐的做法是建一个独立仓库来承载学习,而不是使用全局的~/.learnings/目录,也不是放在你正在开发的项目中。独立的仓库还有一个额外的好处:课程可以提交到 Git 里,这正是团队之间分享课程的方式。
在这样一个目录中,随着学习推进会累积如下文件:
| 路径 | 存放内容 |
|---|---|
MISSION.md | 你为什么学这个。其他一切都挂在这份文件上;如果它缺失,teach做的第一件事就是访谈你,直到把它写出来 |
RESOURCES.md | 经过筛选的教学资料来源,分为 Knowledge(知识)与 Wisdom(社区/智慧)两类 |
lessons/*.html | 带编号的课程:教学的主要单元 |
reference/*.html | 压缩过的速查表、算法、术语表:那些你真正会回头查阅的文档 |
learning-records/*.md | ADR 风格的学习记录,记录你已经实际学会的东西,用于决定接下来教什么 |
assets/* | 可复用组件,起点是一个共享样式表,让所有课程看起来像同一门课 |
NOTES.md | 你明确表达的教学偏好 |
文档还诚实地指出了这张表的两处"注释":
- 术语表(glossary)对大多数主题都很有用,但技能虽然随附了 GLOSSARY-FORMAT.md,
SKILL.md当前却不再链接到它,所以只有你明确要求时才会生成术语表(对应上游仓库 issue #559)。 - 工作区不一定创建在你预期的地方(这是后面要详细讲的 issue #377),所以在它之上搭建长期课程之前,先确认第一节课落在哪里。
安装入口
如果你想在本地尝试该技能,README.md 提供了两种安装路径:Claude Code 用户可运行claude plugins install mattpocock-skills(或在会话内执行/plugin install mattpocock-skills),它会以托管、只读、随发布自动更新的方式安装整套技能;希望自由修改技能文件的人可运行npx skills@latest add mattpocock/skills,将技能以可编辑的普通文件写入自己的仓库。注意两种方式任选其一,同时安装会让每个技能出现两份。
四、存储强度而非流畅度:让学习"留得住"
teach背后的核心学习科学词汇是存储强度(storage strength)——长期保留的知识——与之相对的是流畅度(fluency):当下那一刻的回忆能力,它在你阅读时感觉像掌握了,一周后却消失殆尽。teach的目标是构建前者,手段是合意困难(desirable difficulty),具体包括三种练习策略:
- 提取练习(retrieval practice):从记忆中回忆,而不是反复阅读;
- 间隔(spacing):把练习分散到时间轴上;
- 交错(interleaving):在练习中混合不同但相关的主题(仅限技能训练,SKILL.md 明确注明这一点)。
这一点在 skills/productivity/teach/SKILL.md 的 Philosophy 一节中有更完整的表述。它把深度学习拆成三个层次:
- 知识(Knowledge):从高质量、高信任度的资源中获取。在
RESOURCES.md填充好之前,agent 的首要任务是去寻找好资源——永远不要信任自己的参数化知识。有些主题偏知识型(理论物理),有些偏技能型(瑜伽)。 - 技能(Skills):通过高度相关的交互式课程习得。知识先行,然后通过紧反馈环来打磨技能。对于技能获取,"困难是工具":费力的提取才构建存储强度。
- 智慧(Wisdom):来自与其他学习者和实践者的真实互动。
SKILL.md对知识获取和技能训练给出了相反的态度:"对知识获取而言,困难是敌人",因为它会吞噬你理解所需的短期工作记忆;"对技能获取而言,困难是工具"。课程应该围绕一个"要学习的技能"来设计,课内的知识只保留习得该技能所需的最小部分:先教知识,再用交互式反馈环让用户练技能。反馈环要尽可能紧,最好即时、最好自动。
有两件事决定你会被教什么:
- 使命:一个具体、真实的现实原因,让每节课都有落点。没有使命,课程会漂移到抽象,也没有任何东西能裁决"接下来该学什么"。
- 最近发展区(zone of proximal development):从使命和学习记录出发,
teach挑选下一节课的内容——挑战得刚好够费劲,又不至于远到无法学会。
这也是为什么技能会"顶回来"而不是一味顺从。一个需要智慧(现实世界判断力)的问题,它会给出尝试性回答,然后指引你去一个可以验证它的社区;一次测验是一道关卡而不是走过场——文档记录了一位用户说了句"非常感谢",结果被告知训练仍在进行中。
五、课程、参考文档与组件:三者分工
课程(Lessons)
一节课(lesson)是一个自包含的 HTML 文件,保存在./lessons/,编号格式为0001-<dash-case-name>.html,数字递增。根据 skills/productivity/teach/SKILL.md 的要求,一节课应当:
- 美观:干净、可读的排版与布局,因为用户之后还会回来复习——文档用 Tufte 的设计美学作类比;
- 短小:能很快完成。学习者的工作记忆非常小,必须留在工作记忆的承受范围内;
- 给出一个具体的、可累积的胜利(tangible win):直接绑定使命,并且位于用户的最近发展区内;
- 如果可能,用 CLI 命令为用户打开课程文件;
- 通过 HTML 锚点链接到其他课程和参考文档;
- 推荐一个一手资料源(primary source)让用户自己去读或看,这是你找到的最高质量、最高信任度的资源;
- 包含一条提醒用户向 agent 提问的提示——agent 就是他们的老师,可以解答任何不清楚的地方。
参考文档(Reference Documents)
值得记住的分工是:课程很少被回头翻阅,参考文档才是。所以一节课的"压缩精华"(语法表、算法、体式序列、术语表)应该放进reference/,而不是埋在引入它的那节课里。有些主题天然适合做成参考文档:
- 编程的语法与代码片段;
- 流程的算法与流程图;
- 瑜伽的体式与序列;
- 健身的训练动作与计划;
- 任何自带术语体系的主题的术语表。
其中术语表尤其重要:一旦建立,之后的每节课都必须遵守它的用词。从 GLOSSARY-FORMAT.md 可以看到术语表的几条规则:只有当用户真正理解某个术语时才收录它(术语表是压缩知识的记录,不是给用户读的词典);要有主见地选词并把同义词列为 "Avoid" 列表;定义保持一两句话;定义内部也要优先使用术语表已有的词;随着理解加深要就地修订陈旧条目。
组件(Assets)
课程由assets/里的可复用组件搭建:样式表、测验小部件、模拟器、图表辅助工具,以及任何"第二节课还能复用"的东西。复用是默认行为而不是例外:编写课程之前先读./assets/,从已有的组件出发;当一节课需要新的可复用物时,把它写成assets/里的组件再链接它,绝不内联一段未来课程会重复的代码。
每个工作区挣到的第一个组件就是共享样式表:每节课都链接它,于是所有课程看起来像同一门连贯的课,而不是一堆一次性产物。随着工作区成长,组件库也应一起长大。
测验的防剧透设计
关于交互式测验,SKILL.md有一条具体约束:每个答案的单词数必须完全相同(如果可能,字符数也相同)。这是为了不给用户留下任何通过格式判断答案的线索——历史上正确的答案往往是唯一"推理完整"的那个,从而成为一个明显的提示。
六、工作区的四种文件格式(源码级详解)
teach的工程化程度体现在它的配套格式文档上,以下模板来自本仓库 skills/productivity/teach/ 下的格式文件。
MISSION.md:一切教学决策的罗盘
MISSION-FORMAT.md 定义了MISSION.md的模板:
# Mission: {Topic} ## Why {1-3 句话。用户追逐的具体现实目标。掌握这个技能后,他们的生活或工作会有什么变化? 避免"理解 X"这类抽象表述,要追问到底层的产出。} ## Success looks like - {一个具体的、可观察的、用户将能做到的事情} - {另一个具体的事情} - {…} ## Constraints - {时间、预算、既有承诺、学习偏好,任何限制方法边界的东西} ## Out of scope - {用户明确表示现在不想追逐的相邻主题,保护最近发展区}其规则包括:一个工作区只有一个使命(想学两件不相关的事,就是两个工作区);具体优于抽象("十月份跑完半马"胜过"变得更健康","给我的团队交付一个 Rust CLI"胜过"学习 Rust");对含糊表达要顶回去(用户说不清"为什么"就先访谈,一个糟糕的使命比没有使命更糟);现实变化时及时修订;保持简短(如果MISSION.md超过一屏,它就不再是罗盘而是计划书了)。
RESOURCES.md:高信任度资源的策展清单
RESOURCES-FORMAT.md 定义了RESOURCES.md的结构:
# {Topic} Resources ## Knowledge - [Book: _The Science and Practice of Strength Training_ by Zatsiorsky & Kraemer](https://example.com) Foundational text on programming and adaptation. Use for: anything to do with periodisation, recovery, intensity zones. - [Article: "How Much Should I Train?" by Greg Nuckols (Stronger By Science)](https://example.com) Evidence-based review of volume landmarks. Use for: weekly set targets per muscle group. ## Wisdom (Communities) - [r/weightroom](https://reddit.com/r/weightroom) High-signal subreddit, moderated against bro-science. Use for: programme critique, plateau troubleshooting. - Local: Tuesday strength class at {gym name} Use for: real-time coaching feedback on lifts.其规则要点:只要高信任度资源(优先一手来源、公认专家、同行评审内容、强管理的社区,营销包装成教育的资源不要);每条都要注释(三个月后裸链接毫无用处,补一行"它覆盖什么、什么时候该去用它");按 Knowledge / Wisdom 分组;显式暴露缺口(如果使命需要但找不到好资源,写一个## Gaps章节,这驱动后续搜索);无情地修剪(被证明错误、浅薄或偏离使命的资源应删除,五条锋利的好资源胜过三十条平庸的);记录社区偏好(用户退出社区的决定要记下来,后续会话不要再反复提议)。
learning-records:ADR 式的学习记录
LEARNING-RECORD-FORMAT.md 定义学习记录是"教学的 ADR":捕捉非显而易见的经验、关键洞见和已声明的先验知识,用于计算最近发展区。模板极简:
# {本次学到或确立内容的简短标题} {1-3 句话:学到了什么(或确立了哪些先验知识),以及它为什么对后续会话重要。}记录的核心价值在于记下"这件事现在已经知道了"和"它为什么改变接下来该教什么",而不是填满章节。可选章节只有三个(状态 frontmatter、证据、影响),且大多数记录用不上。编号规则是扫描./learning-records/中最大的编号加一。
什么时候该写一条学习记录:用户展示了对某件不平凡事情的真正理解(不只是接触过,而是有证据证明能正确使用);用户披露了先验知识("我已经知道 X",并记录声称的深度);一个错误概念被纠正(这类记录价值最高,能预测相关主题未来的绊脚石);使命因学习而发生偏移(交叉链接到MISSION.md并更新它)。
什么不算学习记录:只是被覆盖过的材料(覆盖不是学习,要等证据);已在术语表中压缩记录过的词条;逐会话的活动日志(学习记录不是日记,是决策级的洞见)。当一条后续记录与旧记录矛盾时,把旧记录标记为Status: superseded by LR-NNNN而不是删除——理解演化的历史本身是有用的信号。
NOTES.md:教学偏好的便签
最后,NOTES.md是 agent 的便签本:用户有时会表达"希望被怎么教"的偏好,或需要记住的事情,都应记录在这里,设计课程时回头查阅。
七、常见问题(来自文档的实战经验)
1. 文件被放到了哪里?我的课程落在了~/.claude/skills
这是一个真实存在的公开 bug(上游 issue #377)。根因是SKILL.md同时用./指代两个不同的根:./MISSION-FORMAT.md及其同级文件确实与已安装技能中的SKILL.md相邻,而./lessons/、./reference/、./learning-records/、./assets/本应落在你的工作目录里。如果一个 agent 把第一种./解析到了技能的安装目录,就会把第二种./也解析到那里,从而把你的课程写进技能文件夹。对策是:在开课之前先检查第一节课落在了哪里,并在开始时显式命名目标目录,而不是依赖"当前目录"被正确理解。
2. 我该留在同一个会话里,还是每节课开一个新会话?
三种方式都可行:留在同一会话;在新会话里重新输入/teach;在同一文件夹里开新会话。每一节课都是独立的一次调用。连续性由文件夹承载,而不是由对话承载。常见的实践是在工作区里开一个新会话,然后说"/teach继续讲 <主题> 的下一课"。
3. 我怎么知道它不是编造了教学内容?
你不能只凭技能的一句话就信任它——你要去读一手资料。teach还不足以被不加核验地信任,任何构建在 LLM 之上的技能都一样。它的接地机制(RESOURCES.md、每节课内的引用、每节课推荐一个一手资料源)是为了让核验变得廉价,而不是消除核验的必要。文档明确记录了一个真实失败案例:一位用户学习 2×2 魔方时,被给出了无法还原魔方的虚构转动序列。遇到此类情况的诊断清单是:模型(model)、执行环境(harness)、努力程度(effort)、以及资料来源是什么。风险在"有精确记号的程序性领域"最高,在"输出立即可验证"(比如可以运行的代码)的领域最低。
4. 正确的测验答案总是第一个选项
这一点已被多人在 Sonnet、Opus 和 GLM 上确认,且至今未修复。SKILL.md现在要求每个答案单词数相同,这消除了一种提示(正确选项曾经是唯一推理完整的那个),但对位置没有任何约束。有贡献者测试过一个针对位置的指令级修复,结果在九个课程的 33 次测验中,正确答案仍然 33 次落在 A 槽(issue #335),这指向真正修法是在assets/里做一个渲染时打乱选项的测验组件,而不是改进措辞。在该组件发布之前,请把答案位置视为无意义信息。另外,assets/目录属于你,让 agent 写一个渲染时打乱的组件,是完全合法的本地修复。
5. 它假设我已经知道一些东西,还使用了从未定义过的术语
这是最常见的实质性抱怨。teach没有评估步骤:它从使命和学习记录推断你的水平,而第一节课时还没有任何学习记录。有位用户在 wayfinder 流程里运行它时说得很直白:"它从来不做 grilling 来确认我的起点,所以它对我已知的东西做了大量假设。"另一位用户报告课程依赖未定义的术语行话,还有一节课根据用户的硬件定制,讲了硬件能做什么,却从不说它不能做什么。两个补救办法:在第一条消息里就陈述你的先验知识和缺口;当一节课偏离你的水平时当场纠正——因为这条纠正会变成一条学习记录,引导下一节课。一个显式的"知识评估步骤"是长期存在的功能请求(issue #725),尚未作为已发布行为存在。
6. 它做间隔重复吗?它知道什么时候停止教学吗?
第一个问题的答案是"不做",第二个是"不可靠"。间隔与交错是课程设计所依据的原则,但没有任何东西调度复习,也没有 Anki 或日历集成——这两者都是反复出现的请求。与之相关的缺口是退出标准:正如一位用户所说,teach"很擅长做下一节课,但不那么擅长知道什么时候该停止、切换到复习或真实练习"。如果你想要复习或训练而不是新材料,请主动提出,技能不会自己建议切换。
7. 它只对编程有用吗?
不是,而且文档记录显示非编程用途占了更大的部分:韩语、日语正式语体、钢琴、吉他、桌游设计、OpenSCAD、电影情节、Azure 和 CCNA 认证、大学考试,还有给八岁和十岁孩子做的关于密室逃脱和火蝾螈的可打印书。技能中没有任何编程专属的东西:使命、资源、最近发展区和训练在任何领域都以同样的方式工作。在编程范围内,报告中最强的用途不是从零学一门语言,而是在一个陌生的代码库或新团队的栈里快速定位。
8. 该用哪个模型运行它?
没有标准答案,而且报告中的差异很大。更高的推理努力(reasoning effort)被报告能产生明显优于中等设置的课程。有用户把同一个技能经由 Copilot CLI 配 Codex 运行,只得到一个 30 行的 HTML 卡片,而 Claude Code 产出了完整的一节课。它在 Claude Cowork 中无需修改即可运行,前提是你的组织允许在那里添加技能。如果课程产出偏薄,先换模型、执行环境或努力程度,再考虑改写提示词。
八、判定标准:它是否在正常工作
skills/productivity/teach/SKILL.md 与文档共同给出了一套可验证的"正常运转"清单:
- 在空目录里它做的第一件事是访谈你为什么想学这个,而不是直接产出课程;
RESOURCES.md在课程之前被填满,并且每节课都点名一个值得你自己去读的一手来源;- 课内的论断带着外部链接——一节没有任何引用的课,说明技能在凭记忆教学;
- 一节课只占一次坐着学习的时间,结束时你能做一件之前做不到的事;
- 在文件夹里开新会话说"下一课",续接课程而不是重启课程;
learning-records/在增长,课程不再重复教你已经展示过的东西;- 所有课程看起来像一门课:它们链接
assets/里的共享样式表,而不是各自携带一份; - 需要判断力的问题会被指向论坛、subreddit 或课堂,而不是只给一个答案。
九、它在技能体系中的位置
teach是一个随时可取的独立技能(reach-for-it-anytime standalone)。它不是构建链中的一个步骤,也不与工程流程共享任何产物;它拥有自己的目录,并在这个目录里一直待到主题结束。
它唯一的真正邻居是handoff,两者的组合正是 Matt 对"被 grilling 问到我不懂的东西怎么办"的答案:不要停下来学习。用/handoff切到一个教学工作区,在那里用/teach学会它,然后回去接上原来的进度。这一组合的完整描述见 docs/productivity/handoff.md 与 skills/productivity/handoff/SKILL.md。
邻近的替代方案是research(skills/engineering/research/SKILL.md):当你想要的是一份带引用的文档,而不是课程和长期记忆时,用它。当你不确定哪个技能或流程合适时,ask-matt(skills/engineering/ask-matt/SKILL.md)会在这整套技能上为你路由。
从仓库整体看,teach属于 skills/productivity/README.md 中的"用户主动调用"分组,与grill-me、handoff、to-questionnaire、wait-what并列。根据 CLAUDE.md 的说明,productivity桶承载"日常非代码工作流工具",每个该桶下的技能都要求一份人类可读的文档页(即本文所依据的 docs/productivity/teach.md),并在顶层 README.md 中有对应条目。这套"文档页 + SKILL.md + 配套格式文件"的结构,正是teach能够作为独立技能被安装、共享、并在任意模型上运行的原因。
结语
teach的可贵之处在于它把"长期学习"做成了工程:一个使命文件决定方向,一份资源清单约束知识来源,一系列 ADR 式的学习记录驱动最近发展区,assets/组件库保证课程是一套连贯的课程而不是一堆一次性产物。它不是万能的——没有内置的间隔重复调度、没有显式的水平评估步骤、测验答案位置 bug 尚未修复——但它的设计意图非常清晰:只从可信来源教学、让每次会话从文件而非对话上下文续接、用合意困难构建存储强度。配合handoff的"暂停 grilling 去学习"组合,它把"学习"本身变成了一种可以放进任何工作流、并在数周内持续累积的工程实践。
【免费下载链接】skillsSkills for Real Engineers. Straight from my .agents directory.项目地址: https://gitcode.com/GitHub_Trending/skills13/skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考