跳转至

选择

变更作用域检测、原生泳道选择,以及决定差异选择哪些泳道的按区域路由规则。属于 CI 作用域与路由 索引的一部分。

运行器放置与覆盖选择相互独立。在自动规范混合首次尝试中,当 完整托管基础最多有 40 行 时,预检可以卸载安全、最多三个选定的 Control UI 单元测试行,以及仅浏览器扩展 E2E 行,使可选添加项保持在总计 45 以内。基础计数超过 40 时,这些行会保留在 Blacksmith 上,并保留其原始测试和工作器;符合条件的基础超过 45 时,也会发出警告,同时保留完整基础清单。窄 PR 准入会预留完整的 lint/type 行模板以及一个托管 check-plan 作业。后续行缩减不会扩大该准入范围,因此即使最终选定清单能够容纳,可选卸载项也可能仍保留在 Blacksmith 上。

作用域与路由

主层 CI 默认 每小时运行。 以下主推送泳道选择描述的是选择加入的 OPENCLAW_CI_ON_PUSH=true 路径。每小时运行会选择完整的主层,包括 Android,且不进行变更路径过滤。完整手动和发布验证还会额外选择计划工作流指南中描述的仅发布证明。

作用域逻辑位于 scripts/ci-changed-scope.mjs,并由 src/scripts/ci-changed-scope.test.ts 中的单元测试覆盖。普通手动调度会跳过变更作用域检测,并使预检清单表现得好像每个作用域区域都发生了变化。精确头 release_gate 例外会评估已获取的拉取请求合并树,并保留其 macOS、iOS-build 和生成原生区域设置的决策,同时仍然验证原生源代码。

已发布驱动更新单元

scripts/lib/ci-published-driver-update-plan.mts 会为对 src/infra/update-*、 src/cli/update-cli/**、状态租约、状态数据库准入、SQLite 文件标识、原生插件分配、两个启动跟踪所有者以及更新器脚本的变更选择必需的 published-driver-update 作业。对选择器、单元测试框架或 CI 工作流的变更也会选择它。 无关的 PR 会省略该作业;不可用的差异会保留它。当前主层 和普通手动/发布 CI 会选择它,而早于该测试框架的冻结目标会省略它。执行还要求所选检出修订版本等于 调用方的 github.sha。精确头调度回退以及其他选择不同修订版本的目标引用 调度会跳过此单元,并在 CI 门控摘要中记录原因;它们不会为该目标提供已发布驱动证明。

可复用工作流只检出 github.sha,禁用凭据, 使用只读内容权限,不继承密钥,并关闭缓存。它不能 接受调用方在不同缓存作用域中选择的检出引用。所选的 build-artifacts 作业会使用规范完整性检查打包其现有构建,并发布一个候选 tarball。该单元会通过其不可变 ID 下载同一运行 的工件,验证其 SHA-256,并跳过主机依赖 安装和候选编译。当仅重跑失败的消费者作业时,可以 复用成功的生产者工件。 校验和门控会打印两个摘要,并在开始 更新前拒绝不匹配。下载操作的 digest-mismatch: error 输入配置其 归档验证策略;该输入行不是报告的不匹配。

该单元在其二十分钟预算内预留终止和诊断时间。 其命令截止时间会返回一个失败步骤,并记录活动阶段, 而不是通过作业级超时取消工作流。共享的裸 Docker 运行器会安装最新稳定版 npm 包作为驱动,并提供 一个一次性操作系统账户用于托管服务所有权。一个私有 Docker 卷 将一次性 npm 安装和保留的运行时保存在一个原生 文件系统上,避免 OverlayFS 强制的完整运行时复制。运行器会在 其容器稳定后删除该卷,包括失败的更新。它执行一次 托管更新,使用两个合成代理和隔离状态,要求 更新完成、候选版本正在运行、/readyz 返回 HTTP 200、没有 金丝雀/身份/租约警告,并且在记录的运行中没有候选启动或权限检查 失败。这可以捕获被测试隐藏的兼容性故障,这些测试对驱动和候选使用相同源代码。所选作业 由 openclaw/ci-gate 要求,在现有容量核算中预留一个 GitHub 托管运行器, 并具有二十分钟单元预算。

标签器会跳过没有标题或基础分支变更的 PR 编辑。这些被忽略的编辑使用隔离的按运行并发组,因此它们无法取消正在运行的标签处理或替换有用的待处理工作。打开、重新打开、同步以及标题/基础编辑事件保留共享的按 PR 组,并取代较旧的标签运行。问题标签和手动回填保留其现有的非取消引用组。

受影响的拉取请求、main 推送以及精确头 release_gate 回退会保留一个必需的 ios-build (smoke) 阶段及其 Xcode、Swift 和 Watch Rust 工具链。当前冒烟测试始终运行 Swift lint,并使用 build-for-testing 一次性编译应用和测试包。在普通 PR 中,scripts/lib/ci-ios-smoke-plan.mjs 会根据其源代码所有者选择现有的语音/媒体/排版和访问/聊天生命周期模拟器组。两个组都拥有应用的实际托管启动和链接运行时源代码;语音组还会审计 Watch 和 ActivityWidget 排版。它们所选的测试文件和测试夹具会选择各自的组。构建/测试配置和不可用的路径元数据会保留两个组。

当两个模拟器组都未被选择时,冒烟测试会使用通用模拟器构建目标,并跳过模拟器选择、启动和 SimSlim 准备。所选组会保留针对相同构建产物的独立 test-without-building 调用。预检和 iOS 作业摘要会记录每个组的选择和原因。仓库变量 OPENCLAW_CI_IOS_SIMULATOR_FULL=true(或 1)会为每个选定的 PR 作业恢复两个组;它不会选择原本不需要的 iOS 作业。主分支、计划、手动、发布门控和兼容性规划会保留完整组选择。现有历史执行契约保持不变。

Smoke 仍会省略 Rust 测试、更广泛的应用/通知生命周期测试套件以及 Watch 模拟器套件。失败、取消或意外跳过的 smoke 仍会使 openclaw/ci-gate 失败。

每小时主层级 CI 保留 ios-build (tests),包括 Rust、语音清理、原生 Access 以及每一个重点应用/通知生命周期测试,含其 Watch 消息传递和激活覆盖。托管附件 UI/导出证明、Watch 操作模拟器套件以及 Watch 投递 UI 证明属于完整层级的手动/发布验证;每小时运行也排除截图捕获。主层级和 smoke 构建使用所选模拟器的原生架构,不进行编译器索引;语音和生命周期测试保留日志和 xcresult 捆绑包,但不启用 Xcode 的详细诊断采集。只有在规范的 main 上被取消的定时 ios-build 才能以合并通知的方式通过聚合结果;这会将证明委托给后续任务,而非验证被取消的修订版本。其他失败、意外跳过和取消仍视为失败。参见定时 iOS 聚合。

拉取请求、已接收推送及其精确头 release_gate 回退上的截图输入变更通过 shouldRunIosScreenshots 同时选择设备分片和证据缩减器:iOS UI/资源/UI 测试以及 Fastlane 配置、关联的 Swift 源码和采集/构建工具。仅原生单元测试的 Swift 修改不会选择截图。

完整层级手动 CI(workflow_dispatch 且 validation_tier=full、release_gate=false、release_scope=full),包括完整范围的发布验证,保留独立的 Release 设备和 Debug/原生测试阶段,以及完整的 iPhone、iPad 和 Watch 截图矩阵。测试阶段保留通用模拟器构建、失败诊断、Rust、语音清理、原生 Access、生命周期、托管附件 UI/导出、Watch 操作和 Watch 投递 UI 测试。从每小时 CI 移出的每个用例和断言仍保留在此阶段。两个设备分片独立于 ios-build 构建各自的模拟器应用;每个设备内场景保持串行,Watch 证据位于 iPad 分片。托管缩减器在发布规范截图工件之前验证确切的证据并集和来源。来源证明将每个分片绑定到缩减器的运行、目标 SHA 和工作流 SHA,而非其尝试次数:重跑一个失败的分片会复用另一个分片在其较早成功尝试中的证据,而 GitHub 仅在每个分片的最新尝试成功后才会启动缩减器。最终门禁要求两个构建阶段、两个截图分片和缩减器全部通过。冻结的兼容目标保留其现有的仅 Debug 完整手动契约和截图排除;npm-beta 和 npm-stable 仍推迟原生资格认证。所有 iOS 构建阶段和截图分片在 GitHub 托管的 xcode-27(预览版 macOS 27 镜像)上使用 Xcode 27。纯 iOS 应用变更本身不会选择 macOS 任务。

iPad 分片在其全部四次 iPad 截图通过后,从自身全新的截图构建所编译的 Watch 应用中采集 Watch 截图。它不会重建 Watch 或在任务之间传输模拟器产品。独立的 watch_screenshot lane 仍准备并构建全新的 Watch 应用。缺失或无效的产品会在不进行重建回退的情况下导致采集失败;已完成的 iOS 截图和结果捆绑包仍保留在失败工件中。

独立的 iOS 和 macOS Periphery 工作流强制执行零发现死代码策略。每个工作流仅在非草稿拉取请求触及各自的原生扫描范围时运行,或手动触发时运行。

共享 PR 评论器读取每个生产者的固定运行标题,以区分报告接收、显式 converted_to_draft 清理、被动草稿事件和手动运行。报告要求存在同一仓库和头部的实时开放 PR,且草稿状态为关闭;草稿清理要求草稿状态为开启。被动运行不能发布或取代报告。较新的合格运行和尝试会取代较旧结果,包括在待处理期间。被报告接收的运行若成功检测到无扫描范围,可清除现有评论;草稿清理以草稿状态命名,而非声称范围丢失。评论器在写入前立即重新检查 PR 状态、仓库、头部和草稿状态,但单独的 REST 调用并非原子操作。

没有可识别接收元数据的运行被记录为无操作:它们既不发布也不取代。推出后,需要新的拉取请求源事件才能产生合格运行;重跑旧的未标记运行无法恢复其原始接收意图。

iOS、macOS 以及两个共享的 OpenClawKit Periphery 扫描在 GitHub 托管的 xcode-27 上使用 Xcode 27。工具链变更保留全部四个托管扫描任务、其范围、工作负载、超时、工件和重跑行为;不改变 Blacksmith 的放置或注册计数。Periphery 仍固定为 3.8.0,其工具链变更时要求全部四个消费者具备原生兼容性。

  • 最大行数基线维护 使用拉取请求上现有的必需 checks-fast-baseline-ratchets 守卫。当该守卫被选中时,仅更改 config/max-lines-baseline.txt 不会增加无关的工具测试;混合变更保留其所属测试和边界检查。该守卫仍验证确切的测试合并树与其准备好的基线,并拒绝基线扩展或过期条目。对棘轮实现、CI 路由或其他配置文件的更改保留其现有的测试选择。
  • CI 工作流编辑 验证 Node CI 图、工作流 lint 和 Windows lane(ci.yml 执行它),但本身不会强制 iOS、Android 或 macOS 原生构建;这些平台 lane 仍限定于平台源码变更。
  • Node 变更之外的原生输入 保留每个选定的 macOS、iOS 或 Android 检查,以及拥有、直接导入或显式监视这些输入的 Node 测试。仅原生输入不会请求完整的 Node 清单。静态编译器和边界检查独立于运行时选择保留保守覆盖。
  • 紧凑规划器策略变更 选择由这些文件拥有的规划器、清单、路由和策略测试,以及受影响的导入消费者、受保护回归和固定 smoke 集。它们不会选择完整的紧凑核心或每个扩展。每小时主层级和完整发布验证仍通过其现有所有者执行完整清单。
  • Control UI 源码选择 在其区域变更时保留完整的普通 UI 单元测试族。PR 上的 Control UI E2E 使用现有的 PR 豁免所有者策略:固定 smoke 队列加上源码所有者、导入依赖、harness 输入或测试文件发生变更的测试。未映射的测试在每小时主层级和发布验证中运行;PR 在其自身文件或导入依赖变更时仍会选择它们。只有核心 E2E harness、UI 捆绑配置、显式全局应用外壳所有者或不可用的变更路径信息才会选择完整的 Control UI E2E 清单。共享组件、样式和功能模块遵循显式路由/组件所有者和直接运行时导入;测试和 fixture 导入保留传递选择。共享外壳/存储循环不会使叶子变更选择每条路由。每小时和发布验证拥有完整的传递组合。所有者选择每 30 个文件共享一个浏览器行,受现有行数上限约束;完整验证和终止开关保留其现有行数。预检任务摘要列出每个选定文件及其原因。设置仓库变量 OPENCLAW_CI_UI_E2E_FULL 为 true 或 1 可恢复 PR 上已接收 Control UI E2E 任务的完整覆盖。每小时主层级和手动/发布验证选择完整的 Control UI E2E 清单,包括以前仅限于发布验证的映射组合。Real-Gateway 和浏览器扩展族保留其独立所有者,因此浏览器扩展变更无需选择 Control UI 任务。Node 排除委托给选定 UI 任务的文件。
  • 代码旁的文档 保留 docs/ 中的所有内容,包括导航 JSON、生成的元数据和资源,以及 README 文件、AGENTS.md 和技能 Markdown,均不会扩大代码的 Node 计划。打包的工作区模板和测试 fixture 保留其运行时所有者。仅文档路由仍不选择 Node 行;docs/ 之外无关的运行时 Markdown 保留其所有者。
  • PR 依赖和辅助选择 组合了有界所有者区域、通过工作区和公共 SDK 别名的传递测试导入/再导出可达性、显式策略监视和受保护回归。受保护测试也遵循跨所有者区域的运行时导入。仅一跳邻近性不足以捕获已观察到的漏网情况。无关的全局输入不会请求完整的运行时仓库;所有者与受保护测试策略提供保留覆盖。
  • PR 扩展 lint 报告完整受影响的插件目录,从变更文件和其传递导入消费者中选出。已安装的检查规划器在任务摘要中记录选定的扩展和原因;无受影响的扩展意味着无扩展 lint 工作。原生类型化 lint 程序仍解析共享依赖,核心、脚本、编译器、边界和策略检查保留其现有所有者。共享 lint/类型策略、环境或未解析输入保留完整扩展 lint。设置仓库变量 OPENCLAW_CI_EXTENSION_LINT_FULL 为 true 或 1 可恢复 PR 上的完整扩展 lint。每小时主层级、发布验证和历史目标保留完整覆盖。广泛 PR 检查族使用现有规划器进行扩展选择,同时保留其完整的非扩展检查。
  • 被擦除的 TypeScript 模块 保留其所有者测试、受影响的运行时测试消费者和声明的源码监视。仅类型变更仍通过独立的静态检查所有者选择每个消费编译器图。模糊的编译器所有权、环境/声明文件和缺失历史保留完整静态检查,而不会扩大运行时测试。
  • 文件系统源码扫描器 保留其声明的受监视输入以及普通导入者。策略监视补充每个变更源码的测试,且绝不替代缺失的普通所有者。
  • 全局和中心 Node 输入 选择其有界所有者测试、传递导入消费者和受保护回归,外加固定 PR smoke 集。共享测试引导/配置、根编译器解析、工作区/安装设置、补丁、依赖中心和打包策略不再请求完整运行时计划。所有权模糊时静态检查保留完整回退。缺失变更路径或不可用的有界选择器会令预检失败,而非接收每个运行时族。全局包、锁文件、编译器和共享 Vitest 输入不会仅因 Node 所有权广泛而选择每个平台/浏览器族;相关受保护测试仍保持选中。UI 和向导语言目录及翻译元数据保留其专用的本地化和编译器检查,无需 PR Node 或浏览器行;本地化生成器和运行时模块保留测试。
  • 生成的 Control UI 启动元数据 通过共享测试目标映射选择其分块和 Vite 测试。现有 UI 性能 lane 仍构建并检查生成的分块;元数据本身不需要无关的核心套件。
  • 预检诊断 记录 Node test plan changed-set,包含选定的行数和任何有界所有者选择原因。缺失或未绑定的 PR 计划会使预检失败;它们绝不会成为完整紧凑矩阵。记录的变更路径清单提供重放输入。每小时主层级和普通手动/发布验证通过其现有所有者保留完整清单。
  • PR 检查族 从其自身的变更路径所有者选择静态检查和守卫,与 Node 测试定位是否找到精确计划无关。Lint 和格式化复用本地变更检查所有者;lint 配置变更保留完整 lint。语义 lint 运行变更文件及其传递导入消费者,包括仅类型导入和工作区/路径别名,通过现有分片所有者执行。每行仅接收其分配的文件列表;worker 不会重新发现图。受影响的根测试保留其中心编译器配置接收。删除的、环境的、不支持的和过大的选择保留完整 lint。每小时主层级和完整发布验证继续运行完整仓库 lint。托管配置文件将选定文件保留在现有条带中,而脚本、根测试、格式化和本地化检查保留其中心所有者。预检保持无依赖并拥有接收、静态检查选择以及原始行/资源模板。对于已接收的窄 PR,托管的 check-plan 任务通过现有 Node 设置所有者安装,然后物化选定文件的 lint 和编译器事实。它验证编译器所有权并选择每个消费变更文件的图,包括擦除的类型导入到 UI、插件、脚本和测试。其消费者要求成功的计划;失败不能静默选择完整回退,且 openclaw/ci-gate 要求规划器本身。现有生产、测试和条带任务保留其运行器放置和编译器并发;仅运行具有选定图的行。GitHub 和混合模式将变更的核心测试消费者保留在其规范条带中;中心行拥有选定的扩展、脚本和根测试图。Markdown 和 UI 样式不会扩大混合 TypeScript 变更。删除的、环境的、配置的和未分类的输入保留所有编译器图。共享 fixture 和扫描器策略输入保留保守检查族。冲突标记和墙钟弃用守卫在必需规划器任务中的 Node 设置之后运行。其他守卫保留其生成的原生输入。SDK 子路径导出、扩展导入边界、声明编译/金丝雀证明、协议生成、schema 漂移和 Knip 仍为阻塞项。插件和通道运行时契约测试使用精确的变更所有者 Node 计划,包括其受监视的 SDK 文档和打包技能。窄代码变更在守卫任务中运行一次强制转换检查。主层级、普通手动 CI 和历史目标跳过此额外规划器并保留其完整检查族。静态完整回退绝不扩大运行时族。捆绑配置元数据遵循共享 schema 所有者映射。捆绑/协议行始终验证协议生成;其完整捆绑运行时套件仅在每小时主层级和普通手动/发布验证中运行。专用 Bun 启动器证明为其直接启动器和模块生成所有者选择加入。启动、插件和通道测试在变更所有者计划内保留其规范配置。

  • PR 上的浏览器集成 使用上述 Control UI 文件选择,同时在其现有所有者变更时保留完整的常规 real-Gateway 和浏览器扩展系列。不相关的系列仍被省略,除非受保护或受影响的测试选择了精确的子集。指定的仅发布 real-Gateway 组合保留其现有的选择加入策略。现有的行数上限、worker 限制、串行/并行所有权和 runner 路由保持不变;小型 Control UI 选择会省略空行。空的 real-Gateway 阶段组会被移除;仅桌面载体保留其必需的桌面证明,而不会调用没有文件的测试阶段。每小时 main 和 Full Release Validation 保留完整的 Control UI E2E 测试集;没有选择器的历史手动目标保留其现有的完整目标所有者路径。

  • 扩展包边界选择 使用 PR 自身的 merge-base 差异,与恢复的收据时长无关。该作业复用扩展 lint 规划器的有界 base-fetch 操作。深度为一的 PR 合并将与其经过验证的原始 first-parent 树进行比较,无需完整的祖先遍历。它检查直接修改的插件包。Core/SDK 声明以及共享编译器/依赖变更会添加一个固定的冒烟集合:Telegram、Codex 和 Slack,这些被选中的项目覆盖 119 个不同的、被直接消费的公共 SDK 条目。对公共 SDK 条目文件的变更还会选择直接导入该条目的包,包括仅类型导入。传递声明消费者和仅 main 的漂移被有意留给完整的每小时 main 和手动/发布检查。选中的包保留完整的编译器诊断和正常收据验证;负边界金丝雀测试始终运行。作业摘要列出选中和跳过的包及原因。未设置的仓库变量 OPENCLAW_CI_EXTENSION_BOUNDARY_FULL 启用这一激进策略;true、1 或 full 恢复完整的 PR 检查。无法获得的比较或导入清单也会保留完整范围。

  • 扩展选择 使用来自变更插件所有者的精确测试、传递测试导入者、受保护回归和显式策略监视。全局依赖、共享运行时、SDK 和规划器输入不会附加整个插件的回退。现有的 Plugin Prerelease workflow 每小时以及在 Full Release Validation 中拥有完整的扩展运行时清单;常规 CI 不会附加第二个部分清单。

  • PR 构建 为依赖 dist 的行、受影响的构建/包所有者测试或单独选中的构建过程证明选择 build-artifacts。流水线所有权来自现有的变更目标映射,用于构建、声明、包 tarball 和 dist 工件测试;通用运行时更改不会请求完整的工件作业。源码边界守卫和受影响渠道测试保留其 Node 所有者。工件构建也不会选择不相关的 dist 边界、渠道系列或每个进程验证器。

  • PR 包装器提取 在包装器、其库或 scripts/pr-lib/wrapper-components.txt 中的文件发生更改时选择 pr-worktree-provision.test.ts。这一从清单派生的策略监视补充了普通源码测试,因为文件系统复制对导入图不可见。仅清单的更改也会运行 provisioning,包括其重复清单和急切运行时导入闭包检查。

  • 选择器集成证明 在其规范配置中保留完整的真实检出(real-checkout)所有者场景。直接编辑通过相同的所有者机制选择它们。有界的合成案例保护选择和预算行为,而无需为每个断言扩展整个检出。

  • 工具测试更改 在 test/scripts/**/*.test.ts 下也会选择 test-projects.test.ts,其 workflow 路由期望依赖于测试清单。更改的测试保留其自身的覆盖率,新添加的 workflow 守卫在合并前检查路由期望。

  • 消息传递测试根目录更改 在 src/auto-reply/ 和 src/infra/outbound/ 下,加上核心测试 tsconfig 输入,会选择 tsgo-core-test-shards.test.ts。这一文件系统清单守卫验证恰好一次的所有权;针对建议的 720 根目录限制的分片大小仅作为警告报告,绝不会阻塞 CI。它补充了更改测试的普通所有者;其他测试根目录路径保留其现有选择。

  • Codex 应用服务器测试更改 在 extensions/codex/src/app-server/**/*.test.ts 下也会选择 test/vitest-projects-config.test.ts,该文件验证完整且唯一的全套件测试所有权。更改的测试保留其现有的扩展套件覆盖率。

  • Git 所有者更改 包括对其 action、base-commit 策略、投影生成器、生命周期测试和支持,或指定的采用所有者的 workflow(例如 Workflow Sanity、QA Profile Evidence、Mantis ref 验证/安装器/worktrees、Docs Sync Publish Repo、OpenClaw Performance、Linux/macOS/npm-placeholder 发布准入作业以及插件 ClawHub/npm 发布)的更改,会选择现有的 macos-node 和 Windows 通道。这些运行原生检出所有权证明,而不会选择 Swift、iOS 或 Android 作业;Mac 应用和共享原生更改保留其现有的 Mac 通道。

  • macOS Swift runner 预算 在 GitHub 托管的 xcode-27(Xcode 27)上为每个 worker 30 分钟,包括自动首次尝试。常规 PR/main CI 和 PR release_gate 分发运行 tests 以执行 Swift lint、schema 检查和应用覆盖率构建/测试,同时运行 packages 以执行 Talk 选择退出构建、共享包套件和当前目标的独立 Swabble 套件。普通的完整范围手动验证会添加独立的 release 应用构建,将 lint/schema 所有权移至该阶段,并在 tests 中保留健康渲染。每个选中的阶段都必须通过现有的 CI 门禁。最多两个 worker 并发运行;一个阶段失败不会取消其他阶段的诊断。预览版 macOS 27 镜像既不会改变覆盖率,也不会改变 Swift 6.3 源码语言最低版本;新工具链上需要完整的原生证明。

  • macOS fixture 支持 更改会选择现有的 Mac Node 门禁,以便共享的托管命令和并发所有者独立于 Swift/应用更改获得 Darwin 证明。

  • macOS Swift 构建缓存 在 apps/macos/.build 内保留其源码输入的原始纳秒时间戳和内容哈希。恢复辅助程序仅对当前输入清单中字节相同且权限匹配的常规文件重放时间戳;更改、缺失、链接或无效的条目保留其检出元数据,并通过 SwiftPM 正常失效。v6 归档键包括阶段、辅助程序、工具链、包图和源码标识,并支持同阶段、同图的前缀复用。每个阶段以冷种子(cold seed)开始,而不是恢复以前的组合构建归档,然后在其自身的可信保存之前立即记录元数据。两个阶段都可以恢复共享的 SwiftPM 依赖缓存;其唯一符合条件的写入者是常规 CI 中的 tests 或完整验证中的 release。候选缓存信任不变:关闭缓存的验证会冷编译每个选中的阶段。历史目标保留其目标拥有的构建命令。

  • Workflow Sanity 对所有 workflow YAML 文件、复合操作插值守卫和冲突标记守卫运行 actionlint 和 zizmor。Actionlint 配置保留在此所有者中,不会扩大 Node 测试选择。PR 范围的 security-fast 作业也会对更改的 workflow 文件运行 zizmor,以便 workflow 安全问题在 main CI 图中尽早失败。

  • 选择加入的 main 推送的文档 由独立的 Docs workflow 检查,使用与 CI 相同的 ClawHub 文档镜像,因此混合代码+文档推送不会额外排队 CI 的 check-docs 分片。PR 和手动 CI 在文档更改时仍然从 CI 运行 check-docs。

  • TUI PTY 在 main、普通手动/发布 CI 以及选择其现有测试所有者的 PR 上的 build-artifacts 中运行两个内置 CLI 工件金丝雀测试:本地模型往返和真实 Gateway 连接。完整套件定义在 test/vitest/vitest.tui-pty.config.ts 中。窄范围 PR 计划省略指定的 PTY 进程证明,并在相同配置下将仅源码的 harness 断言测试作为精确目标运行,无需 dist。手动/发布完整计划保留 core-runtime-tui-pty 描述符;PR 没有广泛的回退。CI 仅通过构建工件选择标志消费该描述符,因此完整套件没有执行的矩阵行;手动和发布 CI 也只运行金丝雀测试。规范 main 推送压缩会省略完整描述符,同时保留金丝雀测试。

  • SQLite 会话生命周期 在 PR、精确头部 PR 回退和 main 上为其现有的存储/会话所有者范围运行;普通手动/发布 CI 保留它。仅当差异触及直接存储/会话所有者或嵌入 runner 中可达的会话路径时,所有者选择才涵盖内置 CLI 迁移、重启、压缩、清理和会话 RPC 证明。build-artifacts 验证器波次会在该作业中已构建的运行时上运行它,在隔离的启动内存测量之后。它在 Blacksmith 上与独立读取器重叠,在托管 runner 上保持串行;普通手动和发布分发在目标包含该证明时始终选择它。

  • CI 路由和插件契约辅助程序编辑 使用与其他 PR 相同的变更所有者 Node 计划和静态正确性门禁。历史仅快速范围提示不能绕过该计划或选择整个契约系列。每小时 main 和普通手动/发布验证保留其完整的路由和契约清单。

  • 发布工具快速通道 在规范 PR 带有 release-fast-lane 标签且每个更改路径都是发布工具(.github/workflows/**、scripts/**、test/scripts/**、.agents/skills/release-*/**、docs/reference/RELEASING.md)或独立检查的文档时适用。清单保留 security-fast、check-shard、check-docs 和更改的 Node 行,将紧凑打包策略证明放宽到这些行,并跳过所有其他通道;预检步骤摘要会在 Release fast lane 下列出准入和跳过的通道。被拒绝的标签(范围外路径、全局 Node 输入、fork、push、dispatch、仅文档)会发出警告并保留普通选择。每小时完整 main CI 仍然覆盖合并结果。

  • PR 和 main 上的 QA Smoke 在差异触及 qa-lab 测试框架、qa/ 场景数据、冒烟配置所驱动的 matrix/telegram 渠道、Docker 打包脚本或门禁编排时运行。通用运行时、UI、工作区包和依赖更改本身不会选择冒烟测试。精确头部 PR 回退使用相同的所有者映射。普通手动 CI 和 Full Release Validation 保留完整的冒烟配置;更改路径缺失或使用没有选择器的旧规划器时,只要目标支持冒烟测试框架,仍会保留覆盖。

  • Docker seed 使用 resolveDockerSeedLanes 在每个准入的规范 main 运行中精确选择 published-upgrade-survivor,默认每小时一次且与更改路径无关。它针对精确发布的先前版本运行带 auto-auth 的 legacy-operator-state。在其惰性目录中声明该场景的冻结目标保留相同的组合;没有该声明的历史目标保留 base 回退,无效目录则失败。PR 和精确头部 release_gate 回退将完整的幸存者测试推迟到每小时 main 和 Full Release Validation。它们通过 resolveChangedDockerSeedLanes 及其所有者映射保留选中的 Node 和静态正确性门禁,以及其他 Docker 通道。没有幸存者案例或断言被移除。main 和选中的 PR Docker 通道使用 pnpm build:ci-artifacts 准备完整的运行时和公共 SDK 类型,然后使用带 --skip-build 的规范包辅助程序及其 tarball 完整性检查。完整的声明生成保留在每小时受保护缓存预热器和普通手动/发布包构建中。普通手动 CI,包括 Full Release Validation 的 normal_ci 子项及其 npm-beta/npm-stable 范围,保留完整的包生成和全部六个 Docker 通道。目标必须声明 Docker seed 能力;没有层级选择器的旧目标保留 main/release 幸存者回退。仅文档的 main 推送在 workflow 触发时仍然被排除。扩展的发布历史保留在 Package Acceptance 和每周 Update Migration workflow 中。

  • 控制 UI 性能 使用专用的 run_control_ui_performance 输出。生产 UI 文件、插件浏览器条目以及 UI 构建/性能策略会选择它。当来自 UI 源或性能脚本的运行时导入路径到达它们时,其他模块会选择它;工作区别名使用共享的导入图所有者。仅类型边仍由静态检查覆盖。无关输入保留每小时 main 和普通手动/发布验证。仅测试文件保留在其变更测试所有者处。历史目标保留其现有性能脚本可用性契约。

  • Windows Node 检查 使用现有的 Windows 敏感进程/路径/文件系统/服务以及测试/规划器所有者映射。被选中的 Windows 所有者保留完整的由包脚本拥有的 Windows 清单以及全部五个现有测量行,并保持其 runner 放置、打包和估算。狭窄的 Node 目标选择永远不会裁剪该平台族。仅固定的 smoke 集不会选择 Windows;无关 PR 会省略它。每小时 main 和普通手动/发布验证保留完整清单。

所有者选中的 main 证明门控可能使其选中路径之外的回归在手动或发布验证之前未被发现。PR 单元/边界检查不能替代其流程证明。Push 门控将触发事件的 before 提交与其 head 进行比较,覆盖该 push 中的每个提交。它们不会累积来自更早 push 的变更,这些 push 的待处理运行已被合并掉(取消)。如果某个被合并或以其他方式取消的 main 运行从未执行选中的所有者路径证明,则该证明可能保持未执行状态,直到后续运行选择它。每小时 main 层 CI 覆盖其保留的泳道;仅发布组合需要相应的手动或发布完整验证,除非直接编辑选择它们。published-upgrade survivor 在每个被接受的规范 main 运行中被选中,因此它不依赖于后续的所有者路径匹配。普通手动 CI 和 Full Release Validation 也会独立于变更路径选择它,具体取决于目标的 Docker seed 能力。

流程证明层级

拉取请求和精确 head 的 release_gate 回退通过其现有所有者映射和选中的测试目标,接纳剩余的 Docker seed 泳道、QA Smoke 和内置进程验证。完整的 published-upgrade survivor 每小时运行,并在完整发布验证中运行。无关 PR 延迟其他作业。Native-host、built Doctor、Discord attachment、Gateway watch、SQLite lifecycle 和 TUI canaries 各自拥有独立的选择标志;选择其中一个永远不会选择所有流程证明。选中的内置证明复用同一个 artifact 构建。Main 和普通手动 CI 保留其既定的完整证明行为;Full Release Validation 分发该普通手动子作业。

指定的 CI_PROOF_TEST_FILES 保持在普通 Node 行之外,以便其专用 artifact/workflow 所有者执行它们。预先存在的完整 FRV 和安装程序流程巡检仍仅限手动/发布;此变更不会将这些巡检移到 PR 上。它们更快的源/续行守卫保留变更所有者覆盖。

Install Smoke 早于此选择变更,作为夜间和手动/发布工作流存在。其现有的 03:17 调度和 Full Release Validation 子作业保持不变;不会添加新的 PR 触发器。安装程序拥有的 Node 测试仍通过变更源和直接测试所有者选择加入。这是每小时 main 覆盖范围的现有时间例外,而不是新的每小时安装证明。

test/scripts/ci-workflow-planning.test.ts 检查 PR、main-push、普通手动和 PR 回退事件的证明层级选择。test/scripts/ci-workflow-guards.test.ts 中的 Docker 调度器守卫断言选中的 docker_seed_lanes 清单通过 OPENCLAW_DOCKER_ALL_LANES 到达 pnpm test:docker:all,并且其 release-child 守卫验证 normal_ci 针对精确目标分发 ci.yml。test/scripts/ci-workflow-evidence.test.ts 拥有 QA 协议、证据读取器和成熟度交接检查。快速 CI 路由和缓存预热在其所有者选择时包含全部三个文件;YAML action-pinning 检查保留其原始守卫所有者。Node 规划器测试单独断言每小时 main 和 Full Release Validation 保留已移动的 PR 豁免文件,而现有的指定流程证明排除项仍位于普通 PR 执行之外。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw