插件发布验收
一方插件要通过发布验收,需要满足两点:运维人员能在已发布的 zeroclaw 二进制文件上按名称安装该插件,且机器上无需 Rust 工具链;并且能够证明实际完成工作的是该插件,而不是内置功能。本页是这一验证的操作手册,也是证据模板。文中以 Discord 渠道插件为示例。若换成其他包,请替换其名称、别名、必需的密钥和目标地址。
一次运行只能证明某个软件包版本在已发布的宿主程序某个构建版本上的表现。它不能说明其他目标、其他宿主版本,或负载下的行为。
运行时机
Release 发布且包版本进入 registry 之后运行,针对该 release 声明支持的每个包版本各运行一次。当任一侧发生变化时再次运行:出现新的包版本,或宿主 release 改变了插件接口。
开始之前
- 产物。 一个已发布的
zeroclawCLI 压缩包,面向 64 位目标平台,其插件宿主会编译.wasm组件。请先参考 Release artifact verification 进行检查。在全新容器中使用 x86_64 Linux 压缩包,是展示未涉及任何工具链的最简单方式。 - 干净的机器。 没有 Rust 工具链,也没有早前运行遗留的任何配置。
- 平台测试账号。 对于 Discord,需要一个专用的机器人应用,部署在小型测试服务器中,绝不能使用生产环境机器人;开启 Message Content Intent,并将机器人邀请进服务器(参见 Discord 快速入门),另外还需要一个供测试人员使用的第二个 Discord 账号。测试结束后,计划重置机器人令牌。
- 模型提供方。 任何已配置的提供方均可使用。使用脚本化的本地提供方可以让智能体的回复可重复。
- 一份证据文件。 复制证据模板,并在推进过程中逐步填写。
在被遮蔽的 zeroclaw config set 提示符处输入机器人令牌。切勿将其写入文件、放在命令行中、保存到 shell 历史记录里、出现在截图中,或记入证据材料。
1. 记录环境
command -v cargo rustc || echo "no Rust toolchain"
sha256sum zeroclaw-<target>.tar.gz
zeroclaw --version
zeroclaw plugin search discord
记录安装所解析的归档文件名与摘要、版本字符串,以及注册中心条目的名称、版本、归档 URL 和 sha256。
2. 按名称安装并绑定实例
zeroclaw plugin install discord --channel-alias acceptance --egress declared
zeroclaw config set plugins.entries.zpi1_WyJkaXNjb3JkIiwiY2hhbm5lbCIsImFjY2VwdGFuY2UiXQ.config.bot_token
zeroclaw config set plugins.enabled true
zeroclaw plugin info discord
安装时会打印绑定信息以及已授予的主机。plugin info 必须报告该软件包可以在此主机上加载,并且上方的实例密钥存在。然后手动执行:
- 将
plugin.acceptance添加到一个已启用智能体的channels中; - 添加一个对等组,其
channel = "plugin.acceptance",并且其external_peers包含测试人员的数字 Discord 用户 ID。
Discord 页面对这两种方式都有说明。请勿在任何位置配置 [channels.discord.<alias>] 表,然后启动守护进程。保留一份 config.toml 副本作为证据;其中的机密信息保持加密状态。
3. 实际测试插件
按顺序完成模板中的各项,并记录你观察到的情况,包括任何意外情况。下文提到的日志记录位于守护进程的结构化日志中,仪表盘的“日志”页面和 GET /api/logs 读取的就是该日志(参见可观测性)。全程使用合成的消息文本。
证据模板
| Claim | 操作 | Evidence | 结果 |
|---|---|---|---|
| 按名称安装,无需工具链 | 步骤 1 和 2 | command -v 输出、安装输出、注册表条目、归档摘要 | |
| 加载于此主机 | zeroclaw plugin info discord | 负载判定 | |
| Inbound 请求经由插件处理 | 测试人员发送一条消息 | channel inbound message 记录,其中 zeroclaw.channel = plugin.acceptance | |
| 出站流量经由插件转发。 | Agent 回复 | 一条针对 plugin.acceptance 的 reply delivered 记录;一张已脱敏的回复截图 | |
| 内置通道未处理任何内容 | 读取启动输出和 /health | 频道列表显示 plugin.acceptance,但没有 discord.*;/health 列出 channel:plugin.acceptance,但没有 channel:discord.*;配置副本中没有 [channels.discord] 表。 | |
| 负对照 | 将 channels.plugin.acceptance.enabled 设置为 false,重启,然后发送一条消息 | 没有入站记录,也没有回复;将其重新设置为 true,并在处理下一行之前再次重启。 | |
| 重新连接 | 断开该机器的网络至少两分钟,然后恢复网络连接 | 下一条消息已回答;请注意该插件是恢复了其会话,还是启动了新会话。 | |
| 关闭 | 停止守护进程 | 进程能够正常退出;请注意机器人需要多长时间才会显示为离线。 | |
| Denied destination | 从实例的 egress_hosts 中移除 *.discord.gg,然后重启 | 网关无法连接,机器人保持离线,也没有任何入站消息送达。若主机记录了被拒绝的 WebSocket 连接,它还会写入一条 plugin_egress_denied 记录,其中包含 transport = websocket、被拒绝的主机以及一条 remedy 命令;v0.8.6 不会写入任何此类记录。 | |
| Grant restored | 把 *.discord.gg 放回去,然后在同一台机器上通过 POST /admin/reload 将其应用到正在运行的守护进程(参见 远程守护进程重载),无需完全重启。仅通过 zeroclaw config set 或编辑 config.toml 保存更改,不会自动生效到正在运行的守护进程。 | 机器人会重新连接;请注意其耗时。 | |
| 拒绝的发送方 | 发送自不在对等组中的账户 | 一条 plugin_channel_sender_denied 记录,且没有回复 | |
| 缺少平台权限 | 在一个频道中移除机器人的发送消息权限,并在该频道中向机器人发送消息 | 发送失败已记录到日志中,守护进程仍在运行,且没有重连循环。 | |
| Invalid token | 通过带掩码的 config set 提示设置一个语法有效但已失效或已吊销的令牌,然后重启 | 插件会报告 Discord 的身份验证拒绝并进行退避;五分钟内日志中没有重连循环。由 configure() 在本地拒绝的格式错误令牌,并不会触发平台身份验证或退避机制。 | |
| 信任策略保持不变 | 将 plugins.security.signature_mode 设置为 strict,且不信任该软件包发布者的密钥,然后重启 | 守护进程会跳过该软件包并记录签名拒绝信息,plugin.acceptance 不会启动。CLI 会将被拒绝的软件包报告为 Plugin discord not found 或 No plugins installed,因此请读取守护进程日志以了解原因。恢复之前的模式 |
发布前请先脱敏
channel inbound message 和 reply delivered 记录包含消息文本和发送者的用户 ID。在发布任何内容之前:
- 将用户、服务器和频道 ID 替换为占位符;
- 仅保留合成消息文本;
- 将配置副本中的每个
enc2:值替换为<encrypted>; - 裁剪截图,仅保留待测试的消息。
令牌从未出现在证据中,无论是否已脱敏。
发布证据
在本次发布的跟踪问题中发布以下内容:产物名称和摘要、zeroclaw --version 输出、注册表条目和软件包版本、步骤 1 和 2 中使用的确切命令、填写完成的表格,以及自上次通过验收的运行以来修改了该软件包或宿主的拉取请求链接。
清理
- 停止守护进程并运行
zeroclaw plugin remove discord。删除操作会保留实例的[[plugins.entries]]条目及其[channels.plugin.acceptance]绑定,并会输出这两项;请手动删除它们。 - 在 Discord 开发者门户中重置机器人令牌,使本次运行中使用的令牌失效。