浏览文档
文档/使用 ThreadCells

工作流和持久结果

工作流表示必须跨越多个模型回合、终端或委派代理保持一致的工作。它防止将提供商的最终消息误认为更大任务已经完成。

顶层和委派工作

顶层工作流属于为所有者任务启动的代理或主管。委派工作流属于被分配一项有边界任务的子项。

text
Top-level: "Prepare the release candidate"
  ├── Delegated: "Fix the statistics parser"
  ├── Delegated: "Review operator authorization"
  └── Owner gate: "Approve public publication"

每个工作流都有自己的当前逻辑输入和完成状态。工作者可以完成其委派工作流,而顶层工作流仍保持打开。

Assign 和 handoff

Assign 启动独立的有边界工作,让父项继续执行。子项的结果会在之后送达。这适用于并行调查、实现或审查。

Handoff 转交一项有边界任务,并在父项继续前等待其经验证的结果。当父项下一步直接依赖该答案时,它很有用。

两种形式都会保留父/子身份和持久结果。两者都不会向子项授予超出父项明确委派范围的所有者权限。

瞬时的启动前准入拒绝(例如工作上下文容量耗尽)会被记录为未准入,而不是已执行的分配。待容量可用后,可以重试同一逻辑效果;一旦子项启动已准入或其结果变得不确定,通常的重复保护仍然有效。

结果生命周期

text
Task admitted
   ↓
Child works
   ↓
Structured result recorded
   ↓
Result delivered to parent
   ↓
Parent reads and incorporates it
   ↓
Parent acknowledges incorporation
   ↓
Eligible child resources can retire

结果通常包括简要摘要、已更改文件、所执行的检查、剩余风险和阻塞因素。这是运行证据,并不能替代检查 diff 或测试输出。

投递至少一次。若父项在确认已送达的结果前重启,ThreadCells 可以再次投递它。父项应使用不可变结果标识来避免两次纳入同一工作。

收件箱投递在终端内遵循 FIFO,并绑定创建它的精确工作流和逻辑回合。待传输仅是投递状态,不是将负载或结果移动到另一个工作流的权限。如果其绑定的工作流不再打开,ThreadCells 会终结该过期传输,让较新的打开所有者工作继续进行,而不会重新绑定负载、工作流、投递、收据或效果身份。重启后也会运行同一协调过程,且该过程具有幂等性。

提供商完成与工作流完成

每当模型归还控制权时,提供商回合便结束。任务可能仍有符合条件的工作:另一项测试、待处理的子项、一次修正,或部署步骤。

因此,ThreadCells 会保持顶层工作流打开,直到发生以下某项明确结果:

  • 经所有者授权的任务完成;
  • 确实需要所有者关卡;
  • 所有者取消它;
  • 真正不可恢复的失败耗尽其有边界的恢复路径。

重复的普通提供商最终消息采用可持久化的逐回合延续和有上限的退避。只要工作流保持打开,ThreadCells 就会继续准入下一个逻辑回合。若提供商直接进入 Ready 而非公开可重复的 completed 帧,ThreadCells 会跨重启持久地去抖该状态并推进同一个打开的工作流;后续 Processing 观察会取消瞬时 Ready 候选。直接所有者输入和持久子项结果会重置无进展计数器。作为付费循环保障,连续 65 个未产生持久进展的最终消息会使工作流进入显式、对所有者可见的关卡。提供商完成绝不等于任务完成,正常的自主延续也不需要唤醒所有者。

所有者关卡

当下一步需要任务未授予的权限时,请使用所有者关卡。典型示例包括发布到公开远程仓库、暴露新的网络服务、为资源付费,或在实质不同的产品语义之间作出选择。

不要因为工作缓慢、测试失败或某个提供商回合结束就使用所有者关卡。请先继续所有独立且符合条件的工作。

Workflow Composer 中的新消息就是恢复符合条件的驻留工作流的所有者决定。ThreadCells 会持久记录其来自所有者关卡,并且只准入一次这个精确的持久回合。如果请求在其前序回合耗尽传输重试时已进入队列,系统会原子提升该所有者回合,而不会将其隐藏在另一个所有者关卡之下。暂时的容量或资源策略拒绝会留下明确的持久等待原因,并且不会消耗传输失败重试预算。

恢复

重启时,ThreadCells 从持久状态重建工作流所有权。已送达但未确认的结果仍可用。等待中的 handoff 可针对同一子项恢复,而不是启动重复项。一旦为打开的工作流准入较新的逻辑回合,较旧的待延续会被持久地取代,之后不能在压缩或中断后作为独立工作重放。

如果托管子项已经权威地退出但未提交结果,即使提供商最后显示的状态已经过期,ThreadCells 也会推进同一个有界恢复预算。预算耗尽后,系统会记录一个 incomplete 生命周期结果,只将它排队一次供仍打开的父项读取并确认,同时拒绝迟到的提交;绝不会捏造成功结果。

如果最新所有者关卡工作流中已取消的传输队首已有较晚的明确 Composer 后继回合,重启协调也会重新打开该工作流。它会提升这个现有后继回合而不创建替代回合,并且绝不会借此恢复 Inbox 回调或 Exited 终端。

如果提供商或模型执行在逻辑输入已准入、但所需工作尚未完成时中断,ThreadCells 会通过新的持久延续回合恢复,而不会重放原始收据。已完成的效果仍受围栏保护,提供商执行所有权随恢复后的回合转移,同一不可变子项结果和完成屏障仍可用于纳入,并且只确认一次。

直接完成、失败、取消、所有者关卡、子项终结以及中央受保护工作流取消会在同一数据库事务中围栏待处理的收件箱传输。这防止终端状态转换留下会抑制后续所有者回合的普通投递状态。

同一构建的服务重启会保持与提供商侧控制连接的兼容性。提升后的构建变更特权编排代码后,旧连接会在它能创建效果前被围栏。若活动身份在重启期间暂时不可用,操作会在未产生效果的情况下被拒绝,并在服务返回后重试。对于 Codex,ThreadCells 会在启动就绪时将精确的提供商会话绑定到托管终端和运行时世代,然后将该身份作为重连权限持久化。其他打开的 rollout 文件不能让该托管终端变得不明确。缺失、过期、错误或无法证明的身份会在提供商调度前按 fail-closed 原则拒绝。持久恢复身份使服务重启即使发生在退出与重新启动之间也保持安全。输入传输、重连和退役共享一项持久的每终端变更声明,因此文本不能被粘贴到重连 shell 的空档中,且在退役胜出后过期重连无法重新启动。已持久化的逻辑回合会被重试,而不是被替换。

若终端消失,请在重试前检查工作流和结果记录。新终端绝不能悄然重复旧终端已完成的变更。

具体示例

  1. 所有者启动主管以添加一项功能并验证它。
  2. 主管将实现分配给开发者,并继续检查测试。
  3. 开发者提交变更并记录结果。
  4. ThreadCells 投递结果;主管读取 diff 并确认已纳入。
  5. 主管分配一名独立审查者。
  6. 审查者发现阻塞性的浏览器回归并记录证据。
  7. 主管继续同一打开的顶层工作流,请求修正并重新运行验收。
  8. 只有在构建获接受且部署已获授权后,主管才明确完成工作流。

在第 3、4 和 6 步中,单个模型回合已经结束。任务尚未结束。

常见错误

  • 将终端最终消息视为顶层完成。
  • 在读取或使用结果前确认结果。
  • 未检查是否有持久的先前结果就启动替代子项。
  • 让两个子项修改同一工作树。
  • 将所有者关卡用作通用暂停按钮。

请参阅项目和托管工作树了解写入隔离,并参阅容量和资源模型了解准入限制。

由 Subaev Ruslan 创建并维护,ThreadCells 社区共同贡献。 查看仓库