Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

SOP Fan-In:Cron

已接入。 Cron 触发器由周期性的 SOP 维护 tick 分发,因此这里采用轮询器,而不是为每个调度设置单独的定时器。触发需要该 tick;该 tick 由 zeroclaw daemon 或 zeroclaw channel start 的监督进程生成(构建时启用 agent-runtime 特性,将 sop.sops_dir 设置为非空值(默认未设置,因此 SOP 运行时保持关闭;文档中给出的值为 shared/sops),并将 sop.maintenance_interval_secs 设置为非零值,默认为 60)。单独运行的 zeroclaw gateway start 不会生成维护 tick,因此不会触发 cron 触发器;托管在守护进程内的网关则会,因为守护进程会生成该 tick。调度计划在启动时只解析一次,因此,在守护进程运行期间添加的 SOP 需要重新加载,其 cron 触发器才会生效。

cron 触发器在由 cron 表达式描述的时间窗口内触发。无效表达式会在解析和缓存构建期间以关闭失败的方式处理。

触发器

基于时间的触发。实时:由 SOP 维护定时器(daemon / channel-start 路径)分发。

字段类型默认含义
expression*字符串—在运行窗口内计算的 Cron 表达式。

加载并验证 SOP:

定义

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

验证

zeroclaw sop validate

检查

zeroclaw sop list
zeroclaw sop show <name>

执行

由 cron 启动的运行无需挂载 agent 循环即可执行到完成。维护 tick 会把每个已启动的 ExecuteStep 交给无头运行驱动器,驱动器将该步骤的主体作为一次 agent 回合执行,并推进运行进度。DeterministicStep 操作则改由引擎的确定性驱动器处理。运行若到达审批闸门或检查点,会像在实时 agent 下一样在该处挂起。

两个约束适用于 step 轮次,两者都采用失败即关闭(fail-closed)策略:

  • SOP 必须指定其所属的代理,且该代理必须处于启用状态。 在 SOP.toml 中设置 agent(或在单个步骤上设置 agent,此时会覆盖前者)为已配置的代理别名。Cron 运行时没有可从中继承身份的环境代理回合,因此未指定所属代理的流程在编写时即被拒绝;驱动程序也会拒绝执行该步骤,而不会以其他已配置的代理身份运行。别名未配置,或配置为 enabled = false,同样会被拒绝:禁用某个代理也会将其排除在无人值守的工作之外。该步骤将使用该代理的提供方、工作区、工具和风险配置运行。
  • 步骤的工具范围会被强制执行,包括在子运行中。 SOP 控制工具(sop_execute、sop_advance、sop_approve)在步骤轮次中始终会被移除,因此自动运行无法自我驱动。当设置了 sop.step_scope_enforce 时,步骤声明的 scope 会进一步收窄可用工具范围。步骤派生的子代理会继承相同的排除规则,因此派生子代理并不能绕过该步骤的边界。

在途的 cron 驱动程序归属于启动它们的守护进程代际。重新加载时,守护进程会停止维护定时器,让正在运行的驱动程序按其启动时的配置完成(最多 30 秒),然后中止仍未结束的驱动程序,并再等待最多 5 秒让它们停止,因此在常规情况下,没有任何步骤会跨越两套配置。

取消是协作式的:任务会在下一个 await 处停止,如果在宽限期内没有到达任何 await,它将继续运行。重载不会为此等待:下一代会与其并行启动,而驱动程序会继续使用旧配置和旧引擎,直到它让出执行权。此类驱动程序会被记录(still_running),并移交给下一代而非被分离,因此它仍会被跟踪,并在每次重载时重新检查,直到其结束。若反复出现 still_running 条目,则应将其视为某个步骤在阻塞而未让出执行权的信号。

另见