ZHANG.LOG

2026-02-0511 分钟 阅读

装技能之前先问三个问题:Agent 的工具治理

给 agent 装一个技能,等于给它多一双手。问题在于,这双手不一定长在你的胳膊上。

技能市场的好处是生态,坏处也是生态:任何一个陌生人写的一段脚本,都能变成你的 agent 在你机器上的一个动作。我那套配置里收了 22 个技能包,分给四个 agent 之后,每个角色手里只有 8 到 18 个——不是装不起,是不敢装。

先看清单:谁装了哪些

技能不是平均分的,配置里写得很清楚(节选):

JSON
{
  "agents": {
    "list": [
      { "id": "main", "skills": [
          "feishu-doc", "feishu-drive", "feishu-perm",
          "feishu-wiki", "clawhub", "github",
          "skill-creator", "weather", "brainstorming",
          "canvas-design", "writing-plans",
          "systematic-debugging",
          "using-superpowers", "webapp-testing",
          "docx", "pdf", "pptx", "xlsx"
      ]},
      { "id": "coder", "skills": [
          "feishu-doc", "feishu-drive", "feishu-perm",
          "feishu-wiki", "clawhub", "github",
          "skill-creator", "weather"
      ]}
    ]
  }
}

主管多出来的是设计与协调类:brainstorming 负责在动手前把目标收敛成可确认的设计,writing-plans 负责拆步骤,systematic-debugging 负责按流程排查。三个下属共享的是执行类底座:飞书四件套、github、clawhub、skill-creator、weather。

这里有个文档写了但很容易看漏的语义:agents.entries.*.skills 是逐 agent 的替换,不是合并。给某个 agent 写 8 条,不是在基线上再加 8 条,而是"只剩这 8 条"。表现不是报错,而是它某天突然不会用某个工具了。

三个问题

装之前我会问三个问题,任何一个答不上来就先不装。

它要什么? 网络出口、凭据、能写哪些目录。一个"只是查天气"的技能要求读你的主目录,这件事本身就是答案。

谁能唤起它? 只在我明确要求时可用,还是聊天里任何一句话都可能触发?后者意味着别人发给 agent 的一段文本,也可能变成一次工具调用。

出事了怎么退? 能不能一条命令卸干净,会不会留下后台进程、新配置文件、新凭据。

装之前:读代码,不读简介

名字和 star 数不构成任何保证。我按这个顺序看:

  1. SKILL.md 里声明的能力和权限
  2. 真正的脚本,尤其是它拼出来的命令
  3. 来源与维护状态,以及有没有第三方审计结论

第三方技能市场自己也会提醒:仓库里的东西没经过审计,用之前自己看源码和权限。这句话不该只当免责声明读。

还有一类风险容易被忽略:提示注入。agent 会照它读到的内容行动,而它读到的内容可能来自一封邮件、一个网页、一份别人给的文档。技能只是把这条攻击面又扩大了一圈——它让 agent 更有能力"照做"。

装之后:必须配,必须验

我的 MEMORY.md 里存着两条硬规则,是长期记忆里最先写下来的那种:

markdown
#### Pre-installation
- Must perform risk assessments and scan skill files.
  Installation is only permitted if the risk is low
  and no malicious scripts are present.

#### Post-installation
- Skills must be configured and tested.
  They are only retained if testing passes;
  otherwise, they must be removed.

USER.md 里还有一条对应偏好:装完新技能,必须检查它需要什么配置(API Key、环境依赖)。

这条不是洁癖,是有具体形态的:飞书那套技能要 App ID、App Secret,还要在开发者后台把对应的权限勾上;少一样,调用回来的是权限或凭证错误,不是"我不会"。你看到的是 agent 说"操作失败了",很容易怪模型笨,其实是工具没通。

所以验收方式必须是跑一次真实任务,不是"装上就算成功"。跑不通就删,不留"以后再说"——留着的技能会在某天静默失败,而你那时已经忘了它存在。

一次技能上线的固定动作

把三个问题落成可重复的流程,最后是这样五步:

  1. 扫。 先看 SKILL.md 和脚本,确认它要什么、有没有可疑的命令拼接。这一步不过,后面不用看。
  2. 装。 openclaw skills 完成安装(也可以从市场用 npx clawhub install 拉)。装完先别急着给它派活。
  3. 配。 该给的 API Key、环境依赖、权限范围补齐。这一步最容易被跳过,也最容易在两周后变成"它怎么又不行了"。
  4. 跑。 用一次真实任务验证,不是"echo 一下通了"。
  5. 留或删。 跑通就写一条使用规则进 TOOLS.md,跑不通就卸干净,并在 ERRORS.md 里留一句为什么。

第 3 步和第 4 步合起来才叫"装好了"。只做第 2 步,等于给自己加了一个只会在关键时刻失效的开关。

技能越多,能力不一定越强

清单里 22 个包,按角色分下去之后,真正每天被调用的通常只有三五个。剩下的躺在列表里,只在特定任务时才被想起。

代价有两份。一份是上下文:每个技能的名字和描述都要进 prompt,18 条描述的固定开销,是每次对话都在付的。另一份是冲突:两个功能重叠的技能同时存在,agent 可能选错那个,而它自己不会告诉你"我选错了工具"。

所以我现在的判断标准变成了:这个技能解决的事,我一个月会碰几次? 少于一次的,需要时再装。

装在哪,比装几个更要紧

同一款技能,装给谁不一样。我现在按三条分:

  • 能写文件的,不给只该看的角色。 测试 agent 的活是验证,它的价值在于"不会顺手修好",所以它的技能表里没有那些直接改产出物的工具。
  • 能对外说话的,只装给主管。 发消息、发邮件、公开发布这类能力,四个 agent 各有一份,就等于四个出口,你根本记不住谁在什么场合说过什么。
  • 能花钱的,装在能被看见的地方。 调用付费 API 的技能放在主管那边,是因为主管的会话里有完整的任务上下文,它知道这次调用值不值。

clawhub、skill-creator、github、weather 加上飞书四件套,这八个是四个 agent 的公共底座——它们要么是协作必需,要么是低风险。

权限边界:allowlist 与沙箱

技能加载分三层:agent 自己的工作区、共享根 ~/.openclaw/skills、以及从 ClawHub 这类市场装的。加载完还要过一遍 allowlist 才算真的可用。命令行用 openclaw skills 管:搜索、安装、更新、校验。

但 allowlist 管的是"能不能用",不是"能用它做什么"。真隔离要单独开沙箱,一般定三件事:访问模式(能读、能写、还是碰不得)、网络策略、用哪个镜像。

被拦住的时候也别急着怀疑模型,先分三层看:是沙箱不让、是工具策略不让、还是提权没开。很多"它为什么用不了某个工具"的问题,答案都在这一层。

红线看着像礼貌,其实是降误伤

  • 删除用可恢复的方式,别直接抹掉
  • 对外发送(邮件、公开发布)先问
  • 群里该沉默就沉默,一条消息最多一个反应,不连发

成本是偶尔多问一句"我可以做吗",收益是不会出现"它怎么把这个发到群里了"这种事故。这笔账我认为很划算。

定时任务也是治理的一部分

  • 心跳适合"可以批量、时间可以漂"的检查:收件箱、日历、有没有新消息
  • 定时任务适合"必须准点、要独立会话、只执行一次"的事

别用一堆心跳去做本该精确定时的事,反过来也别为了一次检查专门建一个 job。

这块还在演进:官方已经把旧的 heartbeat 监视器迁到了普通的 automation jobs 上。照抄半年前的教程,很容易踩空。

收尾

能力是借来的,责任是自己的。

装了十个技能不代表它变强了,可能只是你多了十个不知道什么时候会响的开关。

Agent技能安全