乐于分享
好东西不私藏

[龙虾进化论] Day3:OpenClaw SKILL.md 完全解析:从「你问它答」到「AI 自己跑起来」

[龙虾进化论] Day3:OpenClaw SKILL.md 完全解析:从「你问它答」到「AI 自己跑起来」

AGENT-007 · Day 3 主文


前两天讲了工作空间怎么搭、记忆系统怎么修。今天讲让整件事真正值回票价的那个部分。

OpenClaw 的日常用法,是你发消息、它回答。这是被动响应模式,本质上和用 ChatGPT 没什么区别,只是多了一些记忆和配置。

SKILL.md 解决的是一个不同的问题:怎么让 Agent 在你不问它的时候,主动把事情做完。

每周一早上,本周日历分析已经在桌面上;每天八点,邮件摘要已经推过来;每月一号,订阅账单报告已经生成好。你没有发任何消息,它就做了。

这不是魔法,是 SKILL.md 在工作。


提示词和 SKILL.md 的本质区别

你在对话框里发的提示词,解决的问题是:这次,我要它做什么。

SKILL.md 解决的问题是:以后,在什么情况下,它应该自动做什么。

这个区别比看起来要深。

提示词是一次性的指令,生命周期就是这一轮对话。SKILL.md 是持久的行为定义,被注册进 OpenClaw 之后,每次符合触发条件就激活,和你有没有在线无关。

从结构上说,一个提示词只回答「怎么做」,SKILL.md 要回答三个问题:什么时候触发、执行什么流程、什么情况下不执行。 第三个问题是大多数人写 SKILL.md 时跳过的,也是工作流出问题的主要来源。


三种触发机制,各有代价

SKILL.md 支持三种触发方式,每种有不同的可靠性和适用场景,选错了比不用还糟。

定时触发(schedule 字段)

最可靠的触发方式。在 frontmatter 里写 schedule: "monday 8am",每周一早上八点准时执行,不需要你做任何事。

适合有固定节奏的任务:周报、日历预警、订阅审计。

一个容易忽略的细节:定时触发的时间以你配置文件里的时区为准,不是服务器时区。如果你在上海但 OpenClaw 服务器在美国,没有正确配置时区,「每周一早上」会在周日深夜执行。

关键词触发(description 语义匹配)

你在对话里说「帮我查一下本周日历」,OpenClaw 匹配所有已注册的 SKILL.md,找到 description 最相关的那个,自动激活。

description 的写法直接决定触发准确率——这一点很多人不知道。

写太宽泛,比如「处理所有工作相关的任务」,会误触发。你说「帮我写封邮件」,它也可能激活这个工作流,然后做了一堆你没想要的事。

写太窄,比如「当用户说'帮我生成本周日历摘要'时触发」,会漏触发。你说「看看我这周有什么会」,匹配不上,工作流没激活,直接用默认方式回答。

正确的写法:覆盖用户可能用的多种表达,同时限定核心意图:

description:查询和分析用户的日历安排。当用户询问日程、会议、这周有什么、明天安排如何时触发。仅处理日历查询,不处理日历修改或创建。

HEARTBEAT 触发

HEARTBEAT 是 OpenClaw 的定期探活机制——系统每隔一段时间发一个 ping,Agent 醒来检查有没有需要处理的事情。

适合需要实时监测的场景:收到带特定关键词的邮件就通知我、价格低于某个阈值就提醒我。

代价是持续的资源消耗。HEARTBEAT 触发的工作流在每次 ping 时执行一次检查,检查逻辑越复杂,积累的 token 消耗越可观。只把真正需要实时监测的任务放在 HEARTBEAT 里。


SKILL.md 的三段式结构

一个能稳定运行的 SKILL.md,正文需要覆盖三个部分:When to trigger、Process、Rules。

When to trigger

比 frontmatter 里的 schedule 和 description 更细——在什么时候执行,什么情况下跳过:

## When to trigger定时:每周五 17:00关键词:用户要求生成周报、复盘、工作总结跳过:如果今天是节假日,延到下个工作日跳过:如果本周日历数据不可用,输出错误提示

Process

步骤要具体,顺序要合理。写 Process 的核心原则:先读后写,先验证后执行。

## Process1. 读取本周日历(周一到周五所有事件)2. 读取本周已完成的任务列表3. 验证:如果两项数据都为空,停止执行,告知用户4. 生成复盘文档:本周完成的事、遇到的问题、下周优先级5. 展示草稿,等待用户确认6. 用户确认后保存到 memory/YYYY-MM-DD-review.md

注意第 3 步:验证。很多工作流在数据缺失时会继续执行,生成一份空白或错误的输出。加验证步骤,是让工作流「优雅失败」而不是「静默出错」的关键。

Rules

这是最常被跳过但最重要的部分。Rules 定义工作流的边界——什么绝对不做,遇到什么情况怎么处理:

## Rules不修改、不删除任何日历事件不自动发送任何邮件或消息如果某个任务的状态不确定,标注「需确认」而不是猜测生成的文档保存前先展示给用户预览运行时间超过 3 分钟,输出当前进度并等待用户指令

没有 Rules 的工作流,是一个没有边界的 Agent——它会在你没预料到的情况下做出你没预料到的决定。


skills/ 文件夹的二级目录

大多数人把 SKILL.md 直接平铺在 skills/ 下面,这能用,但有一个浪费:工作流用到的参考资料(示例输出、格式模板)要么塞进 SKILL.md 本身,要么放进 AGENTS.md,两者都在污染常驻上下文。

正确的结构是给每个技能建子目录:

skills/├── weekly-review/│   ├── SKILL.md│   └── references/│       ├── example-output.md│       └── template.md└── email-digest/    ├── SKILL.md    └── references/        └── sender-rules.md

references/ 里的文件只在这个技能被激活时加载进上下文,平时不存在。一个复杂工作流的参考资料可能有几千字,这种方式让它只在用到的时候才占空间。


从需求到 SKILL.md:完整案例

需求:每周五下午五点,自动生成本周工作复盘,保存到记忆文件夹。

设计步骤:确定触发方式(固定时间 + 偶尔手动)→ 梳理流程(先读后写)→ 写 Rules(想清楚边界)。

---name:weekly-reviewdescription:生成每周工作复盘报告。当用户说「生成周报」「本周复盘」「周五复盘」时触发,或按定时计划自动运行。schedule:"friday 17:00"---# 每周工作复盘## When to trigger-定时:每周五17:00自动运行-关键词:用户主动要求生成周报或复盘-跳过:节假日不自动运行,等用户手动触发## Process1.读取本周(周一到今天)的日历事件2.读取本周标记为完成的任务3.验证:日历和任务均为空则停止,提示用户4.生成复盘报告:-本周主要工作(按重要性,不超过5条)-未完成事项和原因-下周优先级(最多3项)5.展示草稿给用户,等待确认6.确认后保存到memory/YYYY-MM-DD-weekly-review.md## Rules-不自动保存,必须用户确认后才写入-不修改任何日历或任务-不确定的内容标注「待确认」,不猜测-整份报告不超过500

这是 SKILL.md 的完整逻辑链。任何工作流需求都可以套进这个框架。

副文 A 讲 gws 工具链——真正让工作流有数据可用的那把钥匙。副文 B 逐一拆解五个高价值工作流的设计决策,看懂了能举一反三。


互动:你最想自动化的一个重复工作是什么?留言,我来帮你写 SKILL.md。


提示词模板

帮我把以下工作需求转化成一个 SKILL.md:需求描述:[你想自动化的任务]触发方式偏好:[定时 / 关键词 / 两者都有]可用工具:[Gmail / Calendar / 飞书 / 其他]最重要的限制:[不能做什么]输出要求:给出完整的 SKILL.md,包括 frontmatter 和正文,并在每个关键决策点加注释说明你为什么这样写。