Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

SOP Fan-In: Git

Git forge 事件可以触发 SOP 运行。当某个事件类型在频道的事件表中路由到 sop 时,Git 频道会将规范化后的 forge 事件提升为一个 SOP 事件(主题是 git.<alias>:<event_type>,结构化 JSON 负载包含 repo/issue/PR 字段),并将其分发给引擎。只有 mention gate 会对路由到 sop 的生命周期事件放宽:路由到 triage SOP 的 pull_request.opened,无论作者是否提及了应用都会触发。author checks 仍然适用于 每次投递,无论是 SOP 还是对话式:来自应用自身账号或其他 bot 的事件都会被丢弃(除非设置了 listen_to_bots),并且会在 actor 的登录名上强制执行 peer-group allowlist。换句话说,sop 路由会绕过 mention_only,但不会绕过自我/bot 过滤或 author allowlist。

传输端(provider、forge auth、polling、repository scoping、event routes)在 Git channel 上配置。本页介绍触发器。哪些事件类型会到达 SOP ingress 由 channel 的按事件 events 路由表决定。

触发器

配置的通道上的入站消息或 forge/platform 事件(telegram、discord、slack、Git 等)。实时:当启用该通道的 SOP dispatch 时,由通道协调器投递。Git forge 生产者会设置形如 <channel>.<alias>:<event_type> 的事件主题,并将 event_type 放入载荷中,因此编写的 condition 可以按类型过滤 forge 事件,而无需第二种触发器形状。

字段类型默认含义
alias字符串?null可选的已配置实例别名;未设置时匹配每个实例。
channel*字符串—ChannelKind 用 snake_case 命名的通道类型值。
condition字符串?null针对消息负载求值的可选表达式。

加载并验证 SOP:

定义

按照 Syntax 中所述编写 SOP,并使用 channel 触发器。上面的触发器字段是受支持的键;该页面会逐一讲解整个文件。

验证

zeroclaw sop validate

检查

zeroclaw sop list
zeroclaw sop show <name>

匹配

channel 触发器会匹配 channel(频道类型,即 git)以及可选的 alias(已配置的实例,例如 default);触发器自身没有 topic 字段。哪些事件类型能够到达 SOP 入口,完全由频道按事件配置的 events 路由表决定,因此触发器选择来源,而路由表选择事件。日志中看到的 git.<alias>:<event_type> 字符串是由频道生成的事件主题;若要将触发器限制为单个事件类型,可使用 condition 通过类似 $.event_type == "pull_request.opened" 的条件测试载荷。事件的结构化 JSON 载荷会被转发到 SOP 事件中,并可供可选的触发器 condition 使用;步骤上下文接收的是经过限制、清理和成帧处理的形式。类似 $.repo == "octo/repo" 的 JSON 路径 condition 可将 SOP 限定为单个仓库。已知事件类型包括 issue_comment.created、issues.opened、pull_request.opened、pull_request.closed、pull_request.merged、pull_request_review_comment.created、workflow_run.completed、workflow_run.failed 和 release.published。

启动它

将事件类型路由到通道上的某个 SOP(一个包含 sop = "<name>" 的 events 条目),加载一个其 channel 触发器指定该通道的 SOP(channel = "git",可选的 alias),然后触发代码托管平台事件:创建 issue/PR 或发表评论、发布版本,或让工作流运行完成。通道会规范化事件、对有效负载进行安全筛查,并将事件分发给每个已加载的 SOP,前提是其 channel 触发器匹配且其 condition(如果有)成立。路由事件类型还会使通道订阅相应的代码托管平台端点,因此只会轮询已路由的事件类型。

如果没有任何内容启动,请确认事件类型已路由到 sop(而不是保留为会话默认值)、SOP 的 channel 触发器名称为 channel = "git"(以及正确的 alias),并且 condition 针对有效负载的判断成立。请参阅扇入概述故障排除表。

对账扫描,避免重复运行

A周期性对账扫描可以保留为兜底机制,用于处理在轮询通道离线期间到达的代码托管平台事件。当扫描通过网关或 sops/run RPC 启动同一 SOP 时,请将 Git 事件的稳定工作项 ID 作为 dedup_key 发送。对于拉取请求,Git 通道键为 ghpr_<owner>/<repo>#<number>:

{
  payload: "{\"pr\":42}",
  dedup_key: ghpr_octocat/example#42
}

该键的作用范围限定在 SOP 名称内。渠道事件与新的 sweep 提交若使用相同的键,在运行处于活动状态期间会合并到同一次运行中;运行进入终止状态后,同一键可以启动一次重试。省略 dedup_key 时保持常规的手动运行行为。超过 512 字节的键会被拒绝。

批准并观察

命中检查点的运行会暂停为 WaitingApproval。可使用 CLI(zeroclaw sop list、zeroclaw sop approve)或通过 gateway API 审批端点(GET /admin/sop/pending、POST /admin/sop/approve、POST /admin/sop/deny)清除或查看它们。

另见