ARTICLE · 1222948
AI 助手自学的手艺也能反悔:OpenClaw 2026.10.5 给技能加上版本与撤销
自学习技能 · 版本快照 · Undo · 后台学习开关 · openclaw/openclaw · v2026.10.5
这一版把「助手自己写技能」从一次落盘,改成有历史、能比对、可回滚的流程; 同时给后台学习配上了明确的开关和计费提示。 同版还重做了侧栏、让已发布的对话能用普通聊天链接只读访问, 而自学习这条线,是改动最深的一处。
常驻的个人助手
OpenClaw 是 MIT 许可的开源个人 AI 助手运行时,主体用 TypeScript 写成。
它不是一个聊天窗口,而是一套常驻网关:同一个进程接入 Discord、Slack、Telegram、
WhatsApp 等二十多个渠道,外面套着 Control UI 和 CLI。
模型与 agent harness 以插件方式替换,状态、记忆和凭证都留在自己的机器上。
架构上它把「可信网关」和「不可信执行」分开,策略由代码执行而不是靠提示词自觉。
截至 v2026.10.5,仓库接近 39 万 star、8 万 fork,
这个版本汇总了 2250 个 PR 与 2700 余次提交。
它和终端里的编码 agent 重心不同:那些工具围绕单个仓库的编辑循环,
OpenClaw 围绕长期在线、多入口、能持续积累的个人助理。
技能系统就是「积累」那一半——除了手写技能目录,助手还能在完成一段难任务后,
自己写一份 SKILL.md,下次遇到同类任务直接照着做。
手写技能、项目技能、插件技能各有来源,自学习产生的这一批叫 learned skills,
它们属于单个 agent,绕过技能白名单,只放在自己的工作目录里。
发布节奏按日期打版本,安装走 npm 包或安装脚本,升级时由 doctor 处理状态迁移。
这次更新动的正是这条自学链路。
审批疲劳与旧副本
旧版把自学习做成提案制:后台复习产出草稿,等人批准,未批准的草稿不加载。 听起来稳妥,实际用起来是两难。 一边是审批疲劳,列表里多出几条待办,点通过更像仪式,很少有人逐字读完整份技能; 另一边是能力断档,写着「已学会」的东西因为没被批准,从未真正生效。 真正麻烦的是事后无从追查:助手在某个长任务里改了技能里的一步, 后续同类任务开始出错,用户只看到结果不对,看不到是哪次改动引入的,也没有旧副本可退。 比改错更难发现的是学错。一次成功的临时操作会被固化成流程, 用户随口说的偏好会被写进技能,而不是记忆; 一个仓库的构建约定被存成通用技能,换一个项目就处处别扭。 具体到一次故障:夜间部署脚本第一次跑通后,回滚顺序被写成技能; 后来某次镜像拉取失败,助手临时加了一步跳过校验,那次部署顺利结束, 这一步却留在了技能里,之后每次部署都少一道检查。 后台复习还会把对话与工具输出发给配置的模型供应商,产生额外用量, 开关含糊时,用户并不清楚自己付的是什么钱。 技能本身也会越攒越多,一次性的旧流程长期留在列表里,和新技能抢注意力。 不可追溯、不可回退、成本不透明,这三件事在「助手替你积累经验」的模式里会被放大, 因为改动不是人做的,频率还高。
可撤销的自学习
2026.10.5 把学习结果直接落盘,并在每次改动前保存上一份,动作与入口都摆到了明面上:
• 撤掉一次复习:聊天里出现 Learned 行,点 Undo,或直接说「undo」,或发送 /learn undo <id>
• 按版本恢复:openclaw skills workshop restore <name> --version <version-id>
• 看差异再决定:Control UI 的历史页能比对旧版与当前版本,也能在 Active 与 Archived 之间切换
• 关掉后台学习:openclaw config set skills.workshop.autonomous.mode off,同时停用闲置技能清理
• 手动学习照旧:/learn、/learn <材料> 与「Learn from history」不受开关影响
技能该怎么写也有了明确边界:可复用的流程进技能,关于人的事实进记忆,
关于某个仓库的约定进项目文档或 AGENTS.md。
这条分工直接减少「把偏好写成流程」的脏数据,
也让备份、恢复、归档这些操作对应到更单一的对象。
几个边界值得记住。每个技能保留最近 10 个版本,变更记录保留 500 条;
30 天没有活动的技能会被归档,归档不等于删除,最新版本随时能恢复;
「活动」按最近一次读取 SKILL.md、最近一次前台 view、最近一次改动三者取最大值,
所以刚建的技能不会被立刻扫走。
Codex 运行时无法把 shell 里的技能读取归因到具体技能,清理对它关闭,避免误伤在用的技能。
升级路径也换了:旧的待审草稿由 openclaw doctor --fix 导出为不加载的文件,
旧的提案设置与每周 curator 备份不再被读取;
已经设为 Auto 或未设置的自动学习保持原样,遗留的提案模式统一落到 Off。
| 想要的结果 | 用哪个入口 |
|---|---|
| 撤回刚发生的一次复习 | 通知上的 Undo、聊天里说 undo |
| 退回某个具体版本 | skills workshop restore --version |
| 看清改了什么 | Control UI 的历史与差异视图 |
| 停止后台学习与计费 | skills.workshop.autonomous.mode = off |
通知默认只进 Control UI,Slack 永远收不到渠道消息;
想让触发复习的那个会话也收到,
把 skills.workshop.autonomous.channelNotices 打开即可,打开后长这样:
💾 Learned: updated `deploy-staging` (tightened the rollback step).
Say "undo" to revert this skill change.
一句摘要说明改了什么,一句提示告诉你可以怎么退。 没改动时不会出现任何提示,这一点比「每次复习都报一条」更适合长期挂着。
先快照再替换
撤销能成立,靠的是写入顺序而不是事后补救。
每次 create、patch、write_file、remove_file、archive、restore 之前,
当前技能目录会被完整复制到 .archive/<name>/<versionId>/。
复制先写进临时目录,完成后再重命名,中途失去权限或进程退出,都不会留下一个「看似可撤销」的空版本。
版本号本身是时间戳加动作后缀,按字符串排序就是时间顺序,
所以不带参数的 restore 取到的必然是最新一份。
写入完成后顺手裁剪,只保留 10 份,磁盘占用有上界。
归档则把技能从活动目录移走,恢复时再用最新一份版本重建,
所以归档不是「删掉再从备份里翻」,而是同一套版本链上的一个状态。
变更账本放在状态数据库里,记录动作、actor(agent、review、curator、user)、一句摘要和 runId。 一次后台复习的多条改动共享同一个 runId, 整批撤销时按技能取「这次复习第一次改动之前」的快照,复习里新建的技能则直接归档。 恢复动作本身也会先保存当前副本,于是撤销可以再被撤销; 已经撤销过的复习再点一次,只会返回「已撤销」,不会把新改动一起带走。 撤销还会往原会话补一条系统事件,告诉助手这次改动已被用户回退,避免它照着旧通知再撤一遍。 账本按 agent 维护自增游标,客户端可以增量拉取,不必每次重读整份历史。 改动 skill 名称、描述这类元数据也进对比视图,不会出现「内容没变所以看起来没改」的错觉。
加载语义同样配合这套机制:编辑只对新会话生效,运行中的会话保持启动时的技能快照,
长任务执行到一半,规则不会被后台复习换掉。
落盘前还有一道校验:frontmatter 的 name 必须与目录一致,description 限 1024 字节,
SKILL.md 受 maxSkillBytes 约束,支持文件只能落在 references、templates、scripts、assets 下且不超过 256 KiB;
绝对路径、目录穿越和符号链接一律拒绝,安全扫描命中字面密钥则整次写入不落盘。
这套校验加上「先快照、再替换、再裁剪」的顺序,
把「助手改自己」的爆炸半径,收在一个目录和十份版本历史之内。















































































