Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

工作示例:StageX 自动更新机器人

stagehand 是一个生产环境的 ZeroClaw 机器人。它会监听上游发布源,更新 StageX 软件包,进行构建,通过摘要验证其可复现性,推送变更,创建一个草稿拉取请求,并公布结果。在 PR 创建之前,全程无需人工干预。

这是参考的 SOP 部署方式:流水线是一个确定性的 SOP,发布源通过 AMQP 通道到达,代理使用 sop_execute 工具触发 SOP。AMQP 也可以直接驱动 SOP 引擎,作为实时的 fan-in;此示例有意采用代理触发模式,其中通道将每个发布项提升到代理循环中,由代理启动运行。正是这种分离使该模式具有可复用性。

以下每个命令、配置键、工具名称、状态值和审计键都对应代码库中的一个具体定义。

1. 构建

stagehand 需要编译进 AMQP 和 Matrix 通道。两者均通过 feature 进行门控,且默认关闭。

sh

cargo build --release --features channel-amqp,channel-matrix

该结果是一个 zeroclaw 二进制文件,它会加载 amqpmatrix 通道类型。未启用 channel-amqp 构建的二进制文件会在启动时拒绝 amqp 通道块,并记录一条警告而不是加载它。

2. 制品

ZeroClaw 安装根目录下有三项内容:

工件位置角色
ZeroClaw 配置~/.zeroclaw/代理、AMQP + Matrix 通道以及 sop 设置。
sops/stagex-update/<install>/shared/sops/stagex-update/流水线:SOP.toml(元数据)+ SOP.md(八个步骤)。
skills/stagex-update/<install>/shared/skills/stagex-update/将 SOP 绑定到发布事件触发的纽带。

该配置将代理连接到两个通道(amqp.anityamatrix.announce),以完全自主模式运行,使其在无需关卡的情况下提交、推送并发起 PR,并在 deterministic 执行模式下将 [sop] 指向 shared/sops。代理从不执行合并;由维护者接管该分支并通过签名提交完成合并。

AMQP 通道

amqp.anitya 通道消费 Fedora Messaging 的公共订阅源。它在 amq.topic 交换机上绑定 Anitya 版本更新路由键,并通过 amqps:// 使用客户端双向 TLS 进行连接;Fedora 的代理要求提供客户端证书,因此该通道会出示所配置的 client_certclient_key。该通道在加载时会校验其配置:amqp_url 必须使用 amqp://amqps://amqps:// URL 需要 ca_certclient_certclient_key 必须同时提供,交换机不能为空,且至少要绑定一个路由键。

每次投递的 JSON 主体都会通过 content_template 映射为 agent 的入站消息,其中的 {dotted.path} 占位符会根据主体内容进行解析,从而将一次发布投递转换为 “New release: bzip2 1.0.9 (was 1.0.8). Bump the StageX package for bzip2.”thread_id_field 点分路径将回复关联回原始事件。默认情况下投递为至少一次(durable_ack = true):通道只有在发布被持久化交付给 agent 循环之后才会进行确认,因此在运行开始前发生崩溃会重新投递该事件,而不会悄无声息地丢弃它。对于一个无人值守且具有副作用的流水线来说,这一点至关重要;丢失一次发布会导致某个软件包被悄然遗漏。凭据和证书在部署时提供,且绝不提交到代码库:Codeberg 推送令牌是 agent 的 shell 读取的环境变量,Matrix 访问令牌设置在运行实例上,而 Fedora CA 和客户端证书则放置在主机上。

3. 验证

zeroclaw sop 接口包含三个子命令。没有 run 子命令;运行通过触发器或 sop_execute 工具启动。

sh

zeroclaw sop list
zeroclaw sop validate stagex-update
zeroclaw sop show stagex-update

验证会针对以下情况显示警告:名称或描述为空、没有触发器、没有步骤(缺少或为空的 SOP.md),以及步骤编号存在缺口。缺少步骤的警告意味着运行将在执行时失败。在迭代时,可通过 zerocode 终端界面执行相同的检查;CLI 是可复现的部署时检查。

4. 部署

该机器人作为长期运行的守护进程运行,因此它会保持与 broker 和 Matrix 房间的连接。

sh

zeroclaw daemon

在常驻主机上,它作为受管服务运行,会随机器一起重启(参见 Service & daemon):

sh

zeroclaw service install
zeroclaw service start

AMQP 通道连接到 broker,绑定其路由键并消费投递的消息。在上游发布新版本之前,该 bot 会保持空闲状态。

5. 发布流程贯穿其中

Anitya 发布一条版本更新推送。AMQP 通道接收该推送,应用 content_template,并将一条入站消息交给代理,消息中标明软件包、新版本和旧版本。代理随即触发流水线:

// 工具:sop_execute
// 参数:{ "name": "stagex-update", "payload": "{\"project\":{\"name\":\"bzip2\"},\"version\":\"1.0.9\",\"old_version\":\"1.0.8\"}" }

sop_execute 使用手动触发器启动一个 SopRun,并将 payload 转发到运行上下文中。从此处开始的生命周期与其他任何运行完全相同;唯一不同的是触发器来源。

6. 运行

由于 [sop]deterministic 模式运行,各步骤依次执行,彼此之间没有 LLM 往返调用。每一步的输出会管道传递给下一步,只有补丁获取步骤会调用模型,而该模型在本地运行,因此软件包源代码绝不会离开主机。检查点步骤会暂停以等待人工批准;本流水线则会一路执行直至生成 PR 草稿。

running → completed

从 SOP 的 ## Steps 部分解析出的八个步骤:

#步骤它的作用工具
1解析将上游项目映射到真实的 StageX 包;读取当前版本;如果不是严格更新的版本则停止。shellfile_read
2版本升级 + 哈希设置新版本,运行 make fetch,写入正确的源哈希值,重新获取直到无误。shellfile_write
3构建仅构建此软件包;哈希校验失败时重试一次。shell
4修补损坏内容构建中断时,使用本地模型刷新或修复补丁;标记真正的 API 中断。shellfile_readfile_writehttp_request
5摘要复现make digests,再次构建,确认摘要未发生变化。shell
6提交 + 推送在按包、按版本的分支上提交;推送到该 fork。shellgit_operations
7打开草稿 PR填写 PR 模板,附上摘要信息,仅在干净且可复现的构建通过后才标记为就绪。http_request
8发布将结果发布到 Matrix 房间:软件包、版本差异、复现状态、摘要、PR URL。shell

智能体在每个步骤结束时通过 sop_advance 调用报告结果:

// 工具: sop_advance
// 参数: { "run_id": "<run-id>", "status": "completed", "output": "Bumped bzip2 1.0.8 → 1.0.9; source hash re-derived and verified." }

statuscompletedfailedskipped 之一。当最后一个步骤完成时,运行将转换为 completed 状态,并设置其 completed_at 时间戳。

进度在 agent 回合的任意时刻都可见:

// tool: sop_status
// args: { "sop_name": "stagex-update", "include_metrics": true }

无头安全

当交付到达时,如果没有活动的智能体循环来驱动这些步骤,运行时会记录该运行并记录每个待处理的操作,而不是默默丢弃工作。该运行会等待智能体回合来推动其继续执行。

7. 审计跟踪

SopAuditLogger 会将每次转换都持久化到配置的 Memory 后端中 sop 类别下。一次更新运行会留下这些键:

目录
sop_run_<run-id>完整运行快照,在开始时写入并在完成时更新。
sop_step_<run-id>_1_8单个步骤的执行结果:状态、输出、时间戳。
sop_approval_<run-id>_<step>操作员审批记录,当检查点步骤需要审批时使用。
sop_timeout_approve_<run-id>_<step>检查点审批超时时的超时自动批准记录。

sop_status 上设置 include_metrics: true 会添加 SOP 专属的聚合数据;include_gate_status: true 会添加信任阶段和门控评估器状态。这些数据通过 sop_status 提供,而非 Prometheus。当可观测性后端为 prometheus 时,/metrics 端点仅暴露通用的 zeroclaw_* 系列指标。

8. 保证

每项保证都可追溯至该流水线:

  • 源代码绝不离开主机。 补丁获取步骤针对本地模型运行,因此软件包源代码永远不会到达远程提供方。
  • 构建过程会自我验证。 第 5 步会构建两次并比较摘要;只有当两者匹配时,PR 才会被标记为就绪。
  • 由人来完成合并。 机器人在“草稿 PR 已打开”这一步停止;由维护者接手该分支,并通过签名提交进行合并。它绝不会自动合并。
  • 此运行可重建。 运行快照和每个步骤结果都以运行 ID 为键,持久化存储在 sop 类别下。

9. 模式

入站通道接收一个事件,代理通过 sop_execute 触发 SOP,确定性流水线完成实际工作。将 AMQP 馈送替换为任意通道,将步骤替换为任意流程,其生命周期、审批关卡和审计键都保持一致。当某个步骤需要人工判断时,将其标记为检查点,运行会暂停以等待审批后再继续;与无人值守路径的唯一区别在于由谁来推进这次运行。