---
summary: "更改范围检测和选择 CI 通道的每区域规则"
read_when:
- "您需要知道为什么选择或不选择一条车道进行差异"
- "您正在更改更改范围检测"
title: "范围选择"
sidebarTitle: "选择"
---
范围变化检测、本机通道选择以及决定 diff 选择哪些通道的按区域路由规则。 [CI 范围和路由](/ci/scope-and-routing) 索引的一部分。
跑步者的放置与覆盖范围的选择是分开的。在自动上游混合首次尝试中,预检可能会卸载安全性,最多三个选定的 Control UI 单元行,并且当 [complete 托管基础最多有 40 行 ](/ci/capacity#bounded-hybrid-hosted-offload) 时,仅卸载浏览器扩展 E2E 行,将可选添加总数保持在 45 以内。基数超过 40 时,将这些行保留在 Blacksmith 上,并保留其原始测试和工人; 45 以上的合格基地也会发出警告,同时保留完整的基地清单。窄 PR 准入保留完整的 lint/type 行模板以及一项托管的 `check-plan` 作业。稍后的行减少不会扩大该准入范围,因此即使最终选定的库存适合,可选卸载也可以保留在 Blacksmith 上。
## 范围与路由
主层 CI 默认为 [ 每小时 ](/ci/scheduled-workflows#hourly-main-ci)。下面的主推通道选择描述了选择加入的 `OPENCLAW_CI_ON_PUSH=true` 路径。每小时运行选择完整的主层,包括 Android,没有更改路径过滤。完整的手动和发布验证还选择预定工作流程指南中描述的仅发布证明。
范围逻辑位于 `scripts/ci-changed-scope.mjs` 中,并由 `src/scripts/ci-changed-scope.test.ts` 中的单元测试覆盖。普通的手动调度会跳过范围变化检测,并使预检清单的行为就好像每个范围区域都发生了变化。精确头 `release_gate` 异常评估获取的拉取请求合并树并保留其 macOS、iOS-build 和生成的本机语言环境决策,同时仍然验证本机源。
### PR 对比每小时对比发布
普通的 `pull_request` 运行(包括来自分叉的贡献)使用以下验证层。对于推迟的作业,预检清单会发出错误的选择标志并省略校验矩阵行,因此 `openclaw/ci-gate` 接受它们的预期缺席。导入循环和 Kysely 护栏检查仍然阻塞在所需的防护行中。
| 证明 | 普通PR | 每小时主要层 | 完整发布验证 |
| ----------------------------------- | ------------------------------------- | ---------------------------- | ----------------------------- |
| 真实网关 Control UI E2E | 延期 | 现有库存 | 现有库存 |
| Windows Node 测试 | 延期 | 现有五排库存 | 现有库存 |
| macOS Node 和 Swift 作业 | 延期 | 现有tests/packages | 现有的原生阶段 |
| iOS build/simulator 烟雾 | 延期 | 现有测试阶段 | 现有 Release/tests 阶段 |
| 已发布的驱动程序更新 | 推迟,包括更新所有者 | 现有托管更新单元 | 现有托管更新单元 |
| Dependency/dead-export 扫描(Knip) | 延期 | 现有支票 | 现有支票 |
| 导入周期(运行时和类型) | TypeScript 更改的并行保护 | 现有支票 | 现有支票 |
| 凯瑟利护栏 | 源并行防护 TypeScript | 现有支票 | 现有支票 |
| 其他运行时 topology/architecture | 延期 | 现有支票 | 现有支票 |
| Android 截图 | 延期 | 已排除 | 现有捕获证据 |
导入周期检查阻碍了正确性防护。架构延迟后,四个周期到达主线程([#165174](https://github.com/openclaw/openclaw/pull/165174)、[#165274](https://github.com/openclaw/openclaw/pull/165274)、[#165304](https://github.com/openclaw/openclaw/pull/165304) 和[#165346](https://github.com/openclaw/openclaw/pull/165346))。 [每小时作业 111622440413](https://github.com/openclaw/openclaw/actions/runs/37265802634/job/111622440413) 在运行周期上花费了大约 14 秒,在 Madge 上花费了 57 秒。运行时检查器已经在 PR 防护中运行;恢复 Madge 还可以恢复类型循环覆盖范围,而无需更大的架构包。在选择 Madge 或 Kysely 的普通 PR 上,`check-guards-architecture` 在 `check-guards` 旁边运行选定的源检查。两行都在预检后开始,使用相同的跑步路线,并且必须通过。这会添加一个 checkout/setup,同时消除两组之间的串行依赖性。非 TypeScript 防护和 hourly/manual/release 命令保留其现有的执行所有者。
当 `src/`、`extensions/` 或 `packages/` 下的 TypeScript 更改时,Kysely 护栏在并行源检查行中运行。延迟后,两个原始 SQL 边界违规到达 main:`495c243be11a`([#165546](https://github.com/openclaw/openclaw/pull/165546),由 [#165637](https://github.com/openclaw/openclaw/pull/165637) 修复)和`fe43e10f4952` ([#165678](https://github.com/openclaw/openclaw/pull/165678))。 [小时作业111895593533](https://github.com/openclaw/openclaw/actions/runs/37349110851/job/111895593533)在护栏上花了大约35秒。这仅恢复 `lint:kysely`;生成的数据库类型验证 (`db:kysely:check`)、已弃用的 API、包装器阴影、JSDoc 和数据库优先检查保留在其现有的 hourly/manual/release 架构行中。
这些工作很频繁PR尽管有重叠的源测试和静态检查,但仍存在关键路径。移动他们的准入会在保留的层中保留相同的案例、断言、命令、工人限制和跑步者选择。现在可以在合并后发现仅由延迟作业捕获的缺陷。Android屏幕截图仍仅供发布,因为每小时主要已排除屏幕截图捕获;此更改不会扩大每小时库存。
普通手动调度和精确头 `release_gate` 后备保留其先前的选择。层决策使用实际的工作流事件,而不是调度回退使用的 PR 计划模式。 Mocked/bundled `checks-ui-e2e`、UI 单元测试、浏览器扩展证明、Android unit/lint 工作以及独立的 protocol/localization 检查保留其现有的 PR 所有者。 SwiftLint 和 SwiftFormat 在移动的 Apple 作业内运行并随其移动;没有引入新的就业岗位。独立本机 Periphery 工作流程和 iOS 屏幕截图作业保留其现有选择。
### 已发布驱动程序更新单元
`scripts/lib/ci-published-driver-update-plan.mts` 排除普通 PR,即使更新所有者或单元本身发生更改也是如此。当前主层和普通manual/release CI独立于改变的路径选择单元;早于harness的冻结目标会忽略它。精确头 `release_gate` 规划保留其现有的更新程序、激活、切换、金丝雀和启动跟踪所有者映射,并使用不可用的差异保留单元。执行还要求所选的签出版本等于调用者的 `github.sha`。 Exact-head 调度回退和选择不同版本的其他 target-ref 调度会跳过此单元格,并将原因记录在 CI 门摘要中;他们不提供该目标的已发布驱动程序证明。
可重用工作流仅检查 `github.sha`,禁用凭据、只读内容权限、无继承机密并关闭依赖项缓存。它不能接受不同缓存范围内的调用者选择的结帐引用。选定的 `build-artifacts` 作业将其现有构建与标准完整性检查打包在一起,并发布一个候选 tarball。该单元通过其不可变的 ID 下载相同运行的工件,验证其 SHA-256,并跳过主机依赖项安装和候选编译。当仅重新运行失败的消费者作业时,可以重用成功的生产者工件。校验和门在开始更新之前打印摘要并拒绝不匹配。下载操作的 `digest-mismatch: error` 输入配置其存档验证策略;该输入行不是报告的不匹配。
发布的驱动版本从npm开始解析一次。其安装的前缀被缓存为由该版本、运行器平台和固定的 Docker 配方键入的存档。 PR 仅恢复该确切密钥并将种子挂载为只读;该更新针对私有提取运行。在任何候选执行之前,只有上游主推送、计划运行和手动运行才能准备和保存丢失的种子。丢失的种子保留普通发布的 npm 安装路径。
保留的主单元和释放单元通过其初始 Doctor 修复通道初始化合成状态。就绪状态保持 100 毫秒的间隔、30 秒的总体限制和每个请求一秒的限制。托管更新、记录运行、重新启动、运行构建和就绪断言未更改。
单元在二十分钟的预算内保留终止和诊断时间。其命令截止时间返回一个失败的步骤并记录活动阶段,而不是通过作业级超时取消工作流程。共享裸 Docker 运行程序安装最新的稳定 npm 程序包作为驱动程序,并提供一次性 OS 帐户用于托管服务所有权。私有 Docker 卷在一个本机文件系统上保存一次性 npm 安装并保留运行时,避免了 OverlayFS 的强制完整运行时副本。运行程序在其容器稳定后删除该卷,包括失败的更新。它使用两个合成代理和隔离状态执行一次托管更新,需要完成更新、正在运行的候选版本、来自 `/readyz` 的 HTTP 200、没有 canary/identity/lease 警告,并且在记录的运行中没有候选启动或权限检查失败。这可以捕获对驱动程序和候选程序使用相同源的测试隐藏的兼容性故障。所选作业为`openclaw/ci-gate`所需,在现有容量核算中预留1个GitHub-hosted runner,并有20分钟的cell预算。
该装置使用具有显式所有权的 `agents.entries`,因此发布的驱动程序在更新之前接受两个代理。退役的 OAuth sidecar 在基线设置后被播种,保留候选人的字节保留检查,而无需要求发布的 Doctor 承认退役的凭证格式。 `OPENCLAW_PUBLISHED_DRIVER_LEGACY_SQLITE=1` 还使用已发布的 2026.10.1 模式在共享状态数据库中播种保留的节点主机启动日志,而无需稍后的延迟启动身份表。更新必须保留该启动以及现有会话、记录、搜索和 SQLite 回收断言。这是持久状态升级证明;它不使用正在运行的远程节点。
贴标机会跳过 PR 编辑,而不会更改标题或基本分支。这些被忽略的编辑使用隔离的每次运行并发组,因此它们无法取消正在运行的标签或替换有用的待处理工作。打开、重新打开、同步和 title/base-edit 事件保留每个 PR 组的共享并取代旧的标签运行。问题标签和手动回填保留其现有的非取消参考组。
受影响的 `main` 推送和精确头部 `release_gate` 回退保留一个必需的 `ios-build (smoke)` 阶段及其 Xcode、Swift 和 Watch Rust 工具。当前的 Smoke 始终运行 Swift lint,并使用 `build-for-testing` 编译应用程序和测试包一次。保留的 `scripts/lib/ci-ios-smoke-plan.mjs` 所有者描述来自其源所有者的现有 voice/media/typography 和 Access/chat 生命周期模拟器组。两个组织都拥有应用程序的真实托管启动和链接的运行时源;语音组还审核 Watch 和 ActivityWidget 排版。他们选择的测试文件和装置选择各自的组。 Build/test 配置和不可用路径元数据保留这两个组。
当两个模拟器组均未选择时,smoke 将使用通用模拟器构建目标并跳过模拟器选择、启动和 SimSlim 准备。选定的组针对相同的构建产品保留单独的 `test-without-building` 调用。预检和 iOS 工作总结记录了每个小组的选择和理由。存储库变量 `OPENCLAW_CI_IOS_SIMULATOR_FULL=true`(或 `1`)保留所选历史 PR 作业的两个组;它无法在普通 PR 上重新启用 iOS。主要、计划、手动、发布门和兼容性规划保留完整的组选择。现有历史执行合约保持不变。
Smoke 仍然省略了 Rust 测试和更广泛的 app/notification 生命周期和 Watch 模拟器套件。失败、取消或意外跳过的烟雾仍然失败 `openclaw/ci-gate`。
每小时主层 CI 保留了 `ios-build (tests)`,包括 Rust、语音清理、本机 Access 以及每个重点的 app/notification 生命周期测试,包括其 Watch 消息传递和激活覆盖范围。托管附件UI/export证明、手表操作模拟器套件和手表交付UI证明属于全层manual/release验证;每小时运行也不包括屏幕截图捕获。主层和烟雾构建使用所选模拟器的本机架构,无需编译器索引;语音和生命周期测试保留日志和 xcresult 包,而无需 Xcode 的详细诊断收集。只有上游 `main` 上取消的选定调度 `ios-build` 才能通过带有合并通知的聚合;这将证明委托给以后的工作,而不是验证取消的修订。其他失败、意外跳过和取消仍然是失败。请参阅 [ 计划的 iOS 聚合 ](/ci/scheduled-workflows#hourly-main-ci)。
拉取请求、已承认的推送及其精确头部 `release_gate` 后备的屏幕截图输入更改通过 `shouldRunIosScreenshots` 选择设备分片和证据缩减器:iOS、UI/resources/UI 测试和 Fastlane 配置、链接的 Swift 源和 capture/build 工具。仅本机单元测试 Swift 编辑不选择屏幕截图。
全层手册 CI(`workflow_dispatch` 与 `validation_tier=full`、`release_gate=false` 和 `release_scope=full`),包括全范围发布验证,保留单独的发布设备和 Debug/native-test 阶段以及完整的 iPhone、iPad 和 Watch 屏幕截图矩阵。测试阶段保留通用模拟器构建、故障诊断、Rust、语音清理、本机访问、生命周期、托管附件 UI/export、手表操作和手表交付 UI 测试。从每小时 CI 移出的每个案例和断言仍处于此阶段。两个设备分片独立于 `ios-build` 构建自己的模拟器应用程序;场景在每个设备内保持串行,并在 iPad 分片中提供 Watch 证据。在发布发布屏幕截图工件之前,托管的减速器会验证确切的证据联合和出处。 Provenance 将每个分片绑定到减速器的运行、目标 SHA 和工作流 SHA,而不是其尝试:重新运行一个失败的分片会重用另一个分片先前成功尝试的证据,而 GitHub 仅在每个分片的最新尝试成功后才启动减速器。最终的门需要两个构建阶段、两个屏幕截图碎片和减速器。冻结的兼容性目标保留其现有的仅调试完整手动合同和屏幕截图排除; `npm-beta` 和 `npm-stable` 仍推迟本地资格。所有 iOS 构建阶段和屏幕截图碎片都在 GitHub- 托管的 `xcode-27`(预览 macOS 27 图像)上使用 Xcode 27。纯 iOS 应用程序更改本身不会选择 macOS 作业。
在所有四个 iPad 捕获通过后,iPad 分片从由其自己的新屏幕截图构建编译的 Watch 应用程序捕获 Watch。它不会重建 Watch 或在作业之间传输模拟器产品。独立的 `watch_screenshot` 通道仍在准备和构建新的 Watch 应用程序。丢失或无效的产品无法捕获且没有重建回退;已完成的 iOS 屏幕截图和结果包在故障工件中仍然可用。
单独的 iOS 和 macOS Periphery 工作流会强制执行零发现死代码策略。每个工作流仅在非草稿拉取请求触及其原生扫描范围时运行,或在手动派发时运行。
共享的 PR 评论者读取每个制作人的固定运行标题,以区分报告接纳、显式 `converted_to_draft` 清理、被动草稿事件和手动运行。报告需要在同一存储库和头中实时打开 PR,且草稿状态处于关闭状态;草稿清理需要打开草稿状态。被动运行无法发布或取代报告。较新的合格运行和尝试将取代较旧的结果,包括在待处理期间。成功检测到无扫描范围的报告承认运行可以清除现有注释;草稿清理命名草稿状态而不是声明范围损失。评论者在编写之前立即重新检查 PR 状态、存储库、头和草稿状态,但单独的 REST 调用不是原子的。
没有识别的准入元数据的运行将被记录为无操作:它们既不发布也不取代。推出后,需要一个新的拉取请求源事件来产生合格的运行;重新运行旧的未标记的运行不会恢复其原始的准入意图。
iOS、macOS 和两个共享 OpenClawKit 外围设备扫描在 GitHub- 托管的 `xcode-27` 上使用 Xcode 27。工具链更改保留了所有四个托管扫描作业及其范围、工作负载、超时、工件和重新运行行为;它不会改变铁匠的安置或注册计数。外围设备仍然固定在 3.8.0,当其工具链发生变化时,所有四个消费者都需要本机兼容性。
- **Max-lines 基线维护** 在拉取请求上使用现有所需的 `checks-fast-baseline-ratchets` 防护。选择该防护后,仅更改 `config/max-lines-baseline.txt` 不会添加不相关的工具测试;混合更改保留其自己的测试和边界检查。守卫仍然根据其准备好的基础验证经过精确测试的合并树,并拒绝基线扩展或过时的条目。对棘轮实施、CI 路由或其他配置文件的更改保留其现有的测试选择。
- **SQLite 工作棘轮** 计算完整的当前和历史呼叫库存。凭证编写者的权限根据当前来源进行验证,包括分阶段检查;历史比较提供计数,而无需计算丢弃的凭证诊断。精确的文字命令值来自 AST,而别名和表达式保留语义解析。每个分析都重用不可变的编译器别名,在绑定准备后通过受保护的声明标识选择命名空间候选者,并避免空编译器查询。接收器位置使用每个源编译器批次。 PR、每小时、发布覆盖范围和跑步路线保持不变。
- **CI 工作流程编辑** 验证 PR 上的 Node CI 图形和工作流程 linting。 Windows 证明与上面列出的其他平台作业一起推迟。工作流程编辑不会强制 Android 自行构建;这些内容仍受平台源代码更改的影响。
- **除了 Node 更改之外的本机输入** 保留其事件层承认的平台检查以及拥有、直接导入或显式监视这些输入的 Node 测试。仅本机输入不需要完整的 Node 库存。独立静态编译器和边界检查保留其现有选择。
- **紧凑规划器策略更改** 选择这些文件拥有的规划器、库存、路由和策略测试,以及受影响的导入消费者、受保护的回归和固定烟雾集。他们不会选择完整的紧凑核心或每个扩展。每小时主要和完整发布验证仍然通过其现有所有者行使完整库存。
- **Control UI 源选择** 在面积变化时保留完整的普通 UI 单元族。该区域包括`scripts/lib/ci-test-runtime.mts`,其拥有Bun UI环境和UI运行时选择:主要在Node上运行UI,因此其PR选择现有的3个UI单元分片在Bun上作为唯一的自动Bun UI证明。 PR 上的 Control UI E2E 使用现有的 PR-exempt 所有者策略:固定的烟雾队列加上源所有者、导入的依赖项、harness输入或测试文件发生更改的测试。未映射的测试每小时运行一次,并在发布验证中运行;当 PR 自己的文件或导入的依赖项发生更改时,PR 仍然会选择它们。只有核心 E2E harness、UI 捆绑包配置、显式全局应用程序 shell 所有者或不可用的更改路径信息才会选择完整的 Control UI E2E 库存。共享组件、样式和功能模块遵循明确的 route/component 所有者并直接运行时导入;测试和夹具导入保留传递选择。共享 shell/store 循环不会使叶子更改选择每条路由。每小时和发布验证拥有完整的传递组合。所有者选择每 30 个文件共享一个浏览器行,受现有行上限限制;完整验证和终止开关保留其现有的行计数。预检作业摘要列出了每个选定的文件及其原因。将存储库变量 `OPENCLAW_CI_UI_E2E_FULL` 设置为 `true` 或 `1` 以恢复 PR 上已接纳的 Control UI E2E 作业的完全覆盖。每小时主要和 manual/release 验证选择完整的 Control UI E2E 库存,包括以前仅限于发布验证的映射成分。普通 PR 上的真实网关证明会被推迟。浏览器扩展系列保留其独立所有者,因此浏览器扩展更改不需要选择 Control UI 作业。 Node 排除委派给选定 UI 作业的文件。
- **代码旁边的文档** 保留所有 `docs/` 内容,包括导航 JSON、生成的元数据和资产,以及来自扩展的 README 文件、`AGENTS.md` 和技能 Markdown代码的 Node 计划。打包的工作区模板和测试装置保留其运行时所有者。仅文档路由仍然不选择 Node 行; `docs/` 之外的不相关运行时 Markdown 保留其所有者。
- **PR 依赖项和帮助程序选择** 结合了有界所有者区域、通过工作区和公共 SDK 别名传递测试 import/re-export 可访问性、显式策略监视和受保护的回归。受保护的测试还遵循跨所有者区域的运行时导入。运行时工作线程描述符(`currentModuleUrl: import.meta.url`,文字为 `sourceWorkerName`)也是运行时边缘:内联描述符将其声明模块连接到生成的固定装置,而导出描述符仅连接读取该描述符的测试代码(整个组读取连接整个组)。编译描述符而不执行它们的构建清单不会获得固定边缘。仅一跳接近就会错过观察到的捕获物。不相关的全局输入不会请求完整的运行时存储库;所有者和受保护测试策略提供保留的覆盖范围。
- **PR 扩展 lint** 报告直接更改的插件目录、用于共享源更改的 Telegram/Codex/Slack 烟雾队列以及更改的公共 SDK 条目(包括测试导入)的直接使用者。它与边界检查器共享包选择策略;传递和环境类型扇出每小时运行一次主验证和发布验证。规划者在摘要中记录所选的延期和原因;没有选择扩展意味着没有扩展 lint 工作。选定的条带保留现有的完整声明准备、本机类型化 lint 程序和诊断。 Lint/type 政策变化,直接改变松散延伸来源,不可用的公开目录保留全覆盖。现有`OPENCLAW_CI_EXTENSION_LINT_FULL=true|1`交换机恢复PR全覆盖; unset 保留激进的默认值。历史目标保留其完整覆盖范围,非扩展检查保留其现有所有者。
- **Changed 运行时导出** 还选择模拟已更改模块的测试,包括共享模拟工厂的使用者。现有的无依赖性源扫描器使用 Node 的本机语法剥离来将更改的模块的运行时导出名称与预检的获取的基础树进行比较,并通过导入图所有者解析相对、TypeScript-path 和工作区包说明符。这些模拟消费者绕过了普通进口商的深度和枢纽限制。从已模拟的模块中新导入的名称还保留使用更改的调用者并安装该模拟的测试,涵盖开始使用现有导出的调用者。仅实现的编辑保持正常选择;缺少历史记录或不熟悉的导出语法会保守地保留模拟消费者。每小时库存和释放库存没有变化。当前源读取错误未通过预检。没有模块模拟边缘的手写对象赝品仍然依赖于其普通的 owner/import 覆盖范围。
- **E删除的TypeScript模块**保留其所有者测试、受影响的运行时测试使用者和声明的源监视。仅类型更改仍然通过单独的静态检查所有者选择每个使用编译器图。不明确的编译器所有权、ambient/declaration 文件和缺失的历史记录保留了完整的静态检查,而无需扩大运行时测试。
- **文件系统源扫描器** 与普通进口商一起保留其声明的监视输入。策略监视补充了每个更改源的测试,并且永远不会提供丢失的普通所有者。
- **Global 和中心 Node 输入** 选择其有界所有者测试、传递导入消费者和受保护的回归以及固定的 PR 烟雾集。共享测试 bootstrap/configuration、根编译器分辨率、workspace/install 设置、补丁、依赖项中心和打包策略不再请求完整的运行时计划。当所有权不明确时,静态检查保留完全后备。缺少更改的路径或不可用的有界选择器会导致预检失败,而不是接受每个运行时系列。全局包、锁定文件、编译器和共享 Vitest 输入不会仅仅因为 Node 所有权范围广泛而选择每个 platform/browser 系列;相关的受保护测试仍处于选中状态。 UI 和向导语言环境目录和翻译元数据保留其专用本地化和编译器检查,无需 PR Node 或浏览器行;本地化生成器和运行时模块保留测试。
- **生成的Control UI启动元数据**通过共享测试目标映射选择其分块和Vite测试。现有的 UI 性能通道仍然构建并检查生成的块;仅元数据不需要不相关的核心套件。
- **预检诊断** 记录 `Node test plan changed-set` 以及选定的行数和任何有限的所有者选择原因。缺失或无界的 PR 计划无法通过预检;它们永远不会成为完整的紧凑矩阵。记录的更改路径清单提供重播输入。每小时主要和普通 manual/release 验证通过其现有所有者保留完整的库存。
- **PR 检查族** 从其自己的更改路径所有者中选择静态检查和防护,与 Node 测试目标是否找到精确计划无关。 Lint 和格式化重用本地更改检查所有者; lint 配置更改保留完整的 lint。语义 lint 通过现有分片所有者运行已更改的文件及其传递导入使用者,包括仅类型导入和 workspace/path 别名。每行仅接收其分配的文件列表;工作人员不会重新发现该图。受影响的根测试保留其中央编译器配置许可。删除的、环境的、不受支持的和超大的选择保留完整的 lint。每小时主要和完整版本验证继续运行完整存储库 lint。托管配置文件将选定的文件保留在其现有条带中,而脚本、根测试、格式和本地化检查则保留其中央所有者。 Preflight 保持无依赖性,并拥有准入、静态检查选择和原始 row/resource 模板。对于承认的狭义 PR,托管的 `check-plan` 作业通过现有的 Node 安装所有者进行安装,然后具体化选定文件 lint 和编译器事实。它验证编译器所有权并选择使用更改文件的每个图形,包括删除类型导入到 UI、插件、脚本和测试。它的消费者需要一个成功的计划;失败不能默默地选择完全后备,并且 `openclaw/ci-gate` 需要规划器本身。现有的生产、测试和条带作业保留其运行器放置和编译器并发性;仅运行具有选定图形的行。 GitHub 和混合动力将变化的核心测试消费者保留在指定的条带中;中心行拥有选定的扩展、脚本和根测试图。 Markdown 和 UI 款式不加宽混合 TypeScript 变化。已删除、环境、配置和未分类输入保留所有编译器图。共享装置和扫描仪策略输入保留了保守的检查系列。冲突标记和挂钟弃用防护在所需规划器作业中设置 Node 之后运行。其他守卫保留其生成的本机输入。 SDK 子路径导出、扩展导入边界、声明 compile/canary 证明、协议生成和模式漂移仍然处于阻塞状态。当 TypeScript 文件发生更改(包括类型声明、TSX、MTS 和 CTS)时,所需的 `check-guards-architecture` 行将与剩余的 `check-guards` 检查一起运行 `check:import-cycles` 和 `check:madge-import-cycles`。检查族所有者从飞行前更改的路径中选择 Madge; ambiguous/full范围和老业主保守地保留它。相同存储库和分支 PR 都使用两个并行保护行,运行程序类未更改且没有编译器计划等待。范围内的非 TypeScript 更改保留原始保护行,而不添加 Madge 或第二次结帐。同一支票族所有者在 `src/`、`extensions/` 或 `packages/` 下选择 `lint:kysely` 作为 TypeScript,并采用保守的 full/unknown-scope 回退; UI-仅更改不添加它。 Knip 和其余的运行时拓扑检查(已弃用的 API、包装器阴影、JSDoc、生成的 Kysely 类型和数据库优先防护)保留每小时的主要和完整发布验证,而不是普通的 PR。插件和通道运行时合约测试使用确切的变更所有者 Node 计划,包括他们观看的 SDK 文档和打包的技能。狭窄的代码更改在防护作业中运行一次强制检查。主、普通手册 CI 和历史目标会跳过此附加计划程序并保留其完整检查系列。静态完全回退永远不会扩大运行时系列。捆绑的配置元数据遵循共享架构所有者映射。 bundled/protocol 行始终验证协议生成;其完整的捆绑运行时套件仅在每小时的主验证和普通 manual/release 验证上运行。专门的 Bun 启动器证明选择其直接启动器和模块生成所有者。启动、插件和通道测试在变更所有者计划中保留其分配的配置。
- PRs**上的** 浏览器集成使用上面模拟的 Control UI 文件选择,并在现有所有者更改时保留浏览器扩展系列。即使直接更改或选择作为导入使用者,Real-Gateway 文件也会被排除;他们无法通过changed-Node后备返回。除非受保护或受影响的测试选择精确的子集,否则不相关的族将被忽略。指定的仅发布真实网关组合保留其现有的选择加入策略。现有的排数上限、工人限制、serial/parallel 所有权和跑步者路线保持不变;小 Control UI 选择忽略空行。删除空的真实网关阶段组;仅限桌面的运营商保留其所需的桌面证明,而无需调用没有文件的测试阶段。每小时主验证和完整发布验证保留完整的 Control UI E2E 集;没有选择器的历史手动目标保留其现有的完整目标拥有的路径。
- **扩展包边界选择**使用PR自己的合并基础差异,与恢复的收据年龄无关。该作业重用了扩展 lint 规划器的有界基本获取操作。将深度一 PR 合并与其经过验证的原始第一父树进行比较,无需完整的祖先遍历。它检查直接触及的插件包。 Core/SDK 声明和共享 compiler/dependency 更改添加了固定烟雾集:Telegram、Codex 和 Slack,选择覆盖 119 个不同的直接消耗的公共 SDK 条目。对公共 SDK 条目文件的更改还会选择直接导入该条目的包,包括仅类型导入。传递声明消费者和仅主要漂移有意留给完整的每小时主要和 manual/release 检查。选定的软件包保留完整的编译器诊断和正常的收据验证。声明准备遵循本机编译器的打包入口点,仅发出消耗的 SDK 根和所需的插件声明生成器,包括传递输入和环境声明。每小时和 manual/release 检查仍准备完整的声明集。负边界金丝雀始终运行。作业摘要列出了选定和跳过的包及其原因。取消设置存储库变量 `OPENCLAW_CI_EXTENSION_BOUNDARY_FULL` 可以启用这种激进的策略; `true`、`1` 或 `full` 恢复完整的 PR 检查。不可用的比较或导入清单也保留完整范围。
- **共享 SDK 声明** 将现有边界检查作为独立生产者保留在支持的混合 PR 上,该 PR 面向已选择边界行和检查规划器的上游存储库。作业计数和检查名称保持不变。该生产者验证完整的原生 SDK 并发布其声明树和检查收据;扩展 lint 等待该工件并通过通常的准备所有者对其进行验证。其他附加检查和测试类型作业保留其现有的依赖关系。内容键控主缓存向其他消费者提供相同的 SDK,并在每次恢复时进行收据验证。编译器目录查找使用排序的文件和目录成员身份,因此当文件系统枚举顺序更改时,重定位可以保留有效的收据。计划的、手动的、发布的、冻结的和不受支持的目标保留其完整的现有检查。
- **扩展选择** 使用来自更改的插件所有者、传递测试导入器、受保护的回归和显式策略监视的精确测试。全局依赖、共享运行时、SDK 和规划器输入不会附加整个插件后备。现有的插件预发布工作流程每小时拥有完整的扩展运行时清单,并且处于完整发布验证中;正常 CI 不会附加第二部分库存。
- **PR builds** 为依赖于 dist 的行、受影响的 build/package 所有者测试或单独选择的构建过程证明选择 `build-artifacts`。管道所有权来自用于构建、声明、package-tarball 和 dist-artifact 测试的现有更改目标映射;通用运行时更改不会请求完整的工件作业。源边界守卫和受影响的通道测试保留其 Node 所有者。工件构建不会同时选择不相关的 dist 边界、通道族或每个进程验证器。
- 当包装器、其库或 `scripts/pr-lib/wrapper-components.txt` 中的文件发生更改时,**PR 包装器提取** 选择 `pr-worktree-provision.test.ts`。这个清单派生的策略监视补充了普通的源测试,因为文件系统复制对于导入图是不可见的。仅清单更改也会运行配置,包括其重复清单和急切的运行时导入关闭检查。
- **选择器集成证明**在其分配的配置中保留完整的真实结账所有者场景。直接编辑通过相同的所有者机制选择它们。有界合成案例可以保护选择和预算行为,而无需扩展每个断言的整体检查。
- **工具测试更改`test/scripts/**/*.test.ts`下的**也选择`test-projects.test.ts`,其工作流程路由期望取决于测试库存。更改后的测试保留了自己的覆盖范围,新添加的工作流防护在合并之前检查路由期望。
- **消息测试根更改`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 所有者将** 更改为其操作、基本提交策略、投影生成器、生命周期测试和支持,或指定所有者采用工作流程,例如 Workflow Sanity、QA Profile Evidence、Mantis ref validation/installers/worktrees、Docs Sync Publish Repo、 OpenClaw 性能、Linux/macOS/npm-placeholder 发布准入作业和插件 ClawHub/npm 发布选择现有的 `macos-node` 和 Windows 通道。这些运行本机结账所有权证明,无需选择 Swift、iOS 或 Android 作业; Mac 应用程序和共享本机更改保留其现有的 Mac 通道。
- **macOS Swift 运行程序预算** 是 GitHub- 上使用 Xcode 27 托管的 `xcode-27` 上每个工作人员 30 分钟,包括自动首次尝试。常规 PR/main CI 和 PR `release_gate` 调度运行 `tests` 用于 Swift lint、模式检查和应用程序覆盖 build/tests,以及 `packages` 用于 Talk 选择退出构建、共享包套件和当前的独立 Swabble 套件目标。普通的全范围手动验证添加了独立的 `release` 应用程序构建,将 lint/schema 所有权移至该阶段,并保留 `tests` 中的运行状况渲染。每个选定的阶段都必须通过现有的 CI 门。最多两个worker同时运行;失败的阶段不会取消其他阶段的诊断。预览 macOS 27 图像既不改变覆盖范围,也不改变 Swift 6.3 源语言最小值;新工具链需要完整的本机证明。
- **macOS 夹具支持** 更改选择现有的 Mac Node 门,以便共享托管命令和并发所有者独立于 Swift/app 更改接收达尔文证明。
- **macOS Swift 构建缓存** 保留 `apps/macos/.build` 内源输入的原始纳秒时间戳和内容哈希。恢复助手仅重放当前输入清单中具有匹配权限的字节相同的常规文件的时间戳;更改、丢失、链接或无效条目会保留其结帐元数据,并通常通过 SwiftPM 使其失效。 v6 存档密钥包括阶段、帮助程序、工具链、包图和源标识,并具有同阶段、同图前缀重用。每个阶段都从冷种子开始,而不是恢复以前的组合构建存档,然后在其自己的可信保存之前立即记录元数据。两个阶段都可能恢复共享的SwiftPM依赖缓存;其唯一符合资格的编写器是常规 CI 中的 `tests` 或完全验证中的 `release`。候选缓存信任不变:缓存关闭验证对每个选定的阶段进行冷编译。历史目标保留其目标拥有的构建命令。
- **Workflow Sanity** 在所有工作流 YAML 文件、复合动作插值防护和冲突标记防护上运行 `actionlint`、`zizmor`。 Actionlint 配置保留于此所有者,不会扩大 Node 测试选择。 PR-scoped `security-fast` 作业还在已更改的工作流文件上运行 `zizmor`,因此工作流安全结果会在主 CI 图中尽早失败。
- **关于选择加入的文档`main`推动**由独立检查`Docs`工作流程相同ClawHub使用的文档镜像CI,因此混合代码+文档推送也不会排队CI `check-docs`碎片。拉取请求和手册CI仍在运行`check-docs`从CI当文档更改时。
- **TUI PTY** 在主普通 manual/release CI 上的 `build-artifacts` 中运行两个内置 CLI 工件金丝雀,并且 PR 选择其现有测试所有者:本地模型往返和真实网关连接。完整的套件在 `test/vitest/vitest.tui-pty.config.ts` 中定义。窄拉请求计划省略了指定的 PTY 流程证明,并在同一配置下将纯源harness断言测试作为精确目标运行,而不需要 dist。 Manual/release完整计划保留`core-runtime-tui-pty`描述符; PR 没有广泛的后备方案。 CI 仅通过内置工件选择标志消耗该描述符,因此全套套件没有执行矩阵行;手册和版本 CI 也仅运行金丝雀。上游 `main` 推送压缩忽略完整描述符,同时保留金丝雀。
- **SQLite 会话生命周期** 在 PR、精确头 PR 后备和 main 上为其现有 storage/session 所有者范围运行;普通manual/release CI 保留它。仅当差异触及其直接 storage/session 所有者或嵌入式运行器中的可访问会话路径时,所有者选择才涵盖内置 CLI 迁移、重新启动、压缩、清理和会话 RPC 证明。在隔离启动内存测量之后,`build-artifacts` 验证器 Wave 针对该作业中已内置的运行时运行它。它与 Blacksmith 上的独立读者重叠,并在托管跑步者上保持连续性;当目标包含证据时,普通手册和发布调度总是选择它。
- **CI 路由和插件合约助手编辑** 使用与其他 PR 相同的变更所有者 Node 计划和静态正确性门。历史仅限快速范围提示无法绕过该计划或选择整个合约系列。每小时主要和普通 manual/release 验证保留其完整的路由和合约库存。
- **发布工具快车道**当上游拉取请求携带`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输入、分叉、推送、调度、仅限文档)警告并保留普通选择。每小时全主CI仍然覆盖合并结果。
- **QA 烟雾在 PR 和 `main`** 上运行,当差异接触 qa-lab harness时,`qa/` 场景数据,matrix/telegram 通道烟雾剖面驱动器,Docker 包装脚本,或者门的编排。通用运行时、UI、工作区包和依赖项更改本身不会选择烟雾。精确头部 PR 后备使用相同的所有者地图。普通手册CI和Full Release Validation保留完整的烟雾剖面;当目标支持烟雾harness时,缺少更改的路径或没有选择器的旧规划器保留覆盖范围。
- **Docker seed** 使用 `resolveDockerSeedLanes` 在每个承认的上游主运行上精确选择 `published-upgrade-survivor`,默认情况下每小时一次,并且与更改的路径无关。它针对确切发布的前身运行 `legacy-operator-state` 和 `auto-auth`。冻结目标声明其惰性目录中的场景保留相同的组成;没有该声明的历史目标会保留 `base` 后备,并且无效目录会失败。拉取请求和精确头部 `release_gate` 后备将完整幸存者推迟到每小时主要和完整发布验证。他们保留选定的 Node 和静态正确性门,以及通过 `resolveChangedDockerSeedLanes` 及其所有者地图的其他 Docker 通道。没有幸存者案例或断言被删除。主要和选定的 PR Docker 通道使用 `pnpm build:ci-artifacts` 准备完整的运行时和公共 SDK 类型,然后使用 `--skip-build` 的共享包帮助程序及其 tarball 完整性检查。完整的声明生成仍然保留在每小时受保护的缓存预热器和普通 manual/release 包构建中。普通手册 CI,包括完整发布验证的 `normal_ci` 子项及其 `npm-beta`/`npm-stable` 范围,保留完整包生成和所有六个 Docker 通道。目标必须声明 Docker 种子能力;没有层选择器的旧目标保留 main/release 幸存者后备。仅文档主推送仍被排除在工作流触发器之外。扩展的发布历史记录保留在包接受和每周更新迁移工作流程中。
- **Control UI性能**使用专用`run_control_ui_performance`输出。生产 UI 文件、插件浏览器条目和 UI build/performance 策略选择它。当来自 UI 源或性能脚本的运行时导入路径到达其他模块时,其他模块会选择它;工作区别名使用共享导入图所有者。仅类型边缘仍被静态检查覆盖。不相关的输入保留每小时主要和普通 manual/release 验证。仅测试文件仍由其更改的测试所有者保留。历史目标保留其现有的性能脚本可用性合同。
- **Windows Node 检查** 使用现有的Windows- 敏感的process/path/filesystem/service 和test/planner 所有者地图。选定的 Windows 所有者保留完整的包脚本拥有的 Windows 库存和所有五个现有测量行,保留其跑步者放置、包装和估计。狭窄的 Node 目标选择永远不会限制该平台系列。即使 Windows 所有者发生变化,普通 PR 也会忽略 Windows 证明;精确头部调度后备保留所有者地图。每小时主要和普通manual/release验证保留完整的库存。
所有者选择的主证明门可以使所选路径之外的回归不被检测到,直到进行手动或发布验证。 PR unit/boundary 检查不能替代其过程证明。推送门将触发事件的 `before` 提交与其头部进行比较,涵盖该推送中的每个提交。它们不会累积早期推送的更改,这些推送的待处理运行已合并(取消)。如果合并或以其他方式取消的主运行从未执行选定的所有者路径证明,则该证明可以保持不执行,直到稍后的运行选择它。每小时主线 CI 覆盖其保留车道;仅发布组合需要适用的完整手动或发布验证,除非直接编辑选择它们。已发布的升级幸存者是在每个承认的上游主运行中选择的,因此它不依赖于后来的所有者路径匹配。普通手册 CI 和完整版本验证也独立于更改的路径来选择它,具体取决于目标的 Docker 种子功能。
## 过程验证层
拉取请求和精确头部 `release_gate` 后备承认剩余的 Docker 种子通道、QA 烟雾,以及通过其现有所有者地图和选定的测试目标进行内置流程验证。完整的已发布升级幸存者每小时运行一次并进行完整的发布验证。不相关的 PR 会推迟其他工作。 Native-host、built Doctor、Discord Attachment、Gateway watch、SQLite Lifecycle、TUI Canaries各有一个独立的选择标志;选择一个永远不会选择每一个过程证明。选定的构建证明重用单个工件构建。主、普通手册CI保留其既定的全防行为;完整发布验证会调度该普通手动子项。
命名的 `CI_PROOF_TEST_FILES` 位于普通 Node 行之外,因此它们的专用 artifact/workflow 所有者执行它们。先前存在的完整 FRV 和安装程序流程之旅仍为 manual/release-only;此更改不会将这些旅行移至 PR。他们更快的 source/continuation 防护装置保留了易主保护。
安装 Smoke 早于此选择更改,作为每晚和 manual/release 工作流程。其现有的 03:17 计划和完整发布验证子项保持不变;未添加新的 PR 触发器。安装者拥有的 Node 测试仍然通过更改源和直接测试所有者选择加入。这是每小时主要覆盖范围的现有计时例外,而不是新的每小时安装证明。
`test/scripts/ci-workflow-planning.test.ts` 检查 PR、主推、普通手动和 PR- 后备事件的证明层选择。 `test/scripts/ci-workflow-guards.test.ts` 中的 Docker 调度程序防护断言选定的 `docker_seed_lanes` 库存通过 `OPENCLAW_DOCKER_ALL_LANES` 到达 `pnpm test:docker:all`,并且其释放子防护验证 `normal_ci` 针对确切目标调度 `ci.yml`。 `test/scripts/ci-workflow-evidence.test.ts` 拥有 QA 协议、证据读取器和成熟度切换检查。快速 CI- 路由和缓存预热包括所有三个文件(当其所有者选择它们时); YAML 动作固定支票保留其原始防护所有者。 Node 规划器测试分别断言每小时主要和完整版本验证保留移动的 PR-exempt 文件,而现有的命名进程证明排除仍然在普通 PR 执行之外。