跳转至

Node 测试泳道

最慢的 Node 测试族如何拆分、均衡、打包与缓存。属于 CI 作用域与路由 索引的一部分。

最慢的 Node 测试族会被拆分或均衡,使每个作业保持小巧,同时不过度预留运行器:

  • 每小时 main 与普通手动/发布验证保留完整的插件与渠道合约作业,沿用现有的加权进程选择与运行器回退。PR 通过变更所有者的 Node 计划选择精确的合约测试;冻结的历史手动目标保留其独立作业。
  • 附加检查: 当前目标将导出冲突、会话访问器/转录读取器、SQLite 事务与 SQLite schema 检查合并到一行串行源合约中,保留每条命令并收集所有失败。完整计划在 main 上有五行,在当前目标分派上有六行;PR 选择适用的静态行;SDK API 报告仅分配给分派。冻结目标保留其原始八行与历史命令回退。
  • 核心单元快速/支持通道单独运行;unit-src、Control UI 与 gateway-core 各自使用三条确定性文件加权分片,而安全与媒体/UI 伴随配置保留其作用域内的整配置支持组;核心运行时基础设施拆分为进程、共享、钩子、密钥与三个 cron 域分片。
  • 自动回复作为均衡工作进程运行,回复子树拆分为 agent-runner、commands、dispatch、session 与 state-routing 分片;dispatch 进一步隔离 core、delivery 与 lifecycle 入口点。
  • Agentic 网关/服务器(控制平面)配置拆分到 chat、auth、model、HTTP/plugin、runtime 与 startup 通道,而不是等待构建产物。
  • 普通 CI 仅将隔离的 infra include-pattern 分片打包为最多 64 个测试文件的确定性捆绑,减少 Node 矩阵,同时不合并非隔离的 command/cron、有状态 agents-core 或 gateway/server 套件。重型固定套件保留在 8 vCPU 上,而大多数捆绑与较低权重通道使用 4 vCPU。先前提升的紧凑工作负载在打包前通过其语义所有者与所选文件保留 8-vCPU 容量。计时或构建所有权变更不能将该容量转移到无关行。托管分片继承其父所有者的容量;整个命名的手动与发布计划保留其现有路由。完整命名捆绑在存在时包含其运行时构建模式,因此 checks-node-bundle-infra-small-runtime-1 与 checks-node-bundle-infra-small-1 标识不同的前置条件组。它们的测试清单与运行器限制不变;唯一名称让发布收集器能够同时保留两个作业,而不会产生模糊的尝试证据。
  • GitHub 托管运行器上的每小时 main 将 agent-chat 组限制为 30 个文件,Gateway-methods 组限制为 96 个。超过 32 个文件的 Chat 组与 Gateway-methods 组在独立行中运行;较小的 Gateway 尾部保持普通打包。被测量的 updater 测试单独运行,而不是扩展 storage 行。Storage 保留其 64 文件上限。这些仅限 main 的拆分保留每个所选测试、配置、工作进程限制、构建前置条件与计时生成;PR、完整发布与付费运行器计划保留其现有打包。完整的每小时 main 矩阵保持在 77 行预算内。
  • 规范拉取请求从有界的变更所有者、传递导入消费者、工作区/公共 SDK 别名、受保护回归与显式策略监视中解析其运行时测试。Node 构造器消费该所选集合。Windows 与 UI 作业在其平台/领域所有者变更时保留完整的普通清单;无关的 UI 族仍可接纳精确的受保护或受影响文件。全局输入绝不请求完整的紧凑运行时仓库。缺少选择器能力会导致预检失败。Main 保留其完整的自动层级,普通手动/发布验证添加现有的仅发布清单。
  • 静态正确性与运行时目标选择无关。生产与测试类型、语义 lint、格式化、SDK 边界、schema 漂移与 Knip 保留其必要检查;模糊的静态所有权保持完整的编译器/lint 覆盖。运行时目标选择不需要完整套件回退来保留这些防护。参见作用域规则。
  • 变更的工具测试或所有者选择其精确的所属测试、受影响的传递测试导入者、受保护回归与显式监视,但受下文命名的进程证明排除项约束。工具配置保留其文件并行度、工作进程限制、运行时前置条件、后端路由与容量提升。它们绝不请求全族 PR 回退。
  • 精确解析的带元数据文件保留其规范配置、运行器、工作进程/准入策略与准备要求。规范分配使用现有文件权重为已知子集定价,保留以完整组价格为上限的冷进程余量,并单独收取准备费用;不透明清单保留其全价。兼容的整体执行信封可共享现有行,无需合并子进程或增加其工作进程;串行兄弟可共享该行,而并行兄弟保留其分片族分离。PR 准入阶段将所选文件划分为行,目标为最多 150 估计测试秒,使用现有文件/组计时证据,并对缺失观测采用保守估计。它保留完整文件与每条断言;不可分割的文件或规范组可超过该目标。这些是准入估计,而非测量到的作业墙钟时间:设置、构建、排队与运行器争用仍然是单独成本。缩减组使用不同的计时身份,因此部分观测不能覆盖完整父级计时。
  • Control UI 变更通过其独立的现有所有者门保留完整的普通单元、模拟 E2E、真实 Gateway 与 bootstrap 族。受保护与受影响文件精确地选择加入其他族。命名的仅发布 UI 文件保留现有的直接/所有者选择加入机制。空的真实 Gateway 阶段被省略,而仅桌面载体保留其所需的桌面证明。配置、项目隔离、工作进程策略与运行时前置条件保持不变。
  • 直接变更的插件测试及其所选所有者测试在规范配置中使用精确文件选择。Unit-fast、contract、bundled 与 E2E 文件保留其自身套件边界。没有整插件 PR 回退;每小时 Plugin Prerelease 与 Full Release Validation 保留完整扩展清单。
  • 规划器的 RELEASE_ONLY_TOOLING_SHARDS 集合与混合快速配置中的匹配维护者叶子,在无关 PR 上推迟完整的维护者工具族。工具 Vitest 配置拥有普通清单与隔离/Docker 目录。快速配置选择的维护者叶子保留其普通、隔离或 fake-timer 所有者与进程固定;过滤混合组保留产品邻居,并赋予子集独立的计时身份。专用产品 E2E 与实时测试,包括五个 test/scripts/*.e2e.test.ts 门,保持在该层级之外。触及工具测试或所有者的 PR 选择其所有者文件、传递导入消费者与受保护回归,但受以下显式发布证明排除项约束:scripts/**、src/scripts/**、test/**、.github/**、config/**、根 package/pnpm 输入、工具配置,以及由 scripts/test-projects.test-support.mts 中的共享变更路径所有者归类为工具的其他输入。该所有者还涵盖 Docker、agent/Crabbox 工具、应用脚本/Fastlane 与扩展脚本/package 输入。直接变更的工具测试在其自身 PR 上保留覆盖,但显式进程证明除外。每小时 main 与普通 CI workflow_dispatch 包含该族,包括 Full Release Validation 针对冻结候选的 normal_ci 子作业。其 Run Node test shard 步骤在常规发布准入前运行这些未变更测试;不需要独立的重复发布测试。现有的已批准仅预检 beta 发布例外保持不变。Plugin Prerelease 单独拥有 agentic-plugins;CI 的插件排除不控制工具层级。Fork 仓库保留完整工具,因为它们不使用规范 PR 目标选择。产品测试保留其现有层级,但下文显式运行时证明清单除外。
  • 显式 CI_PROOF_TEST_FILES 清单将 test/scripts/frv.release.test.ts 与 test/scripts/install-ps1.release.test.ts 排除在 PR 计划之外,包括直接编辑的测试。每小时 main、手动 CI 与 Full Release Validation 在规范工具配置中保留两个完整进程巡回。FRV 在 frv.test.ts 中保留其进程内延续合约;安装程序在 install-ps1.test.ts 中保留其源码防护。不会移除任何用例或断言。
  • 显式 RELEASE_ONLY_RUNTIME_TEST_FILES 清单将测量的运行时集成巡回从规范的自动 PR 与推送计划中推迟,而更快的所有者测试保留其首要合约。它涵盖 Doctor 配置与迁移组合、CLI 启动、Gateway model/plugin/session 与工作进程环境巡回,以及 updater、打包与存储恢复证明。现有发布清单保持不变:src/flows/doctor-health.test.ts、src/infra/update-managed-service-handoff-foreground.test.ts、src/node-host/node-worker-supervisor.recovery.test.ts、src/state/openclaw-database-preflight.lifecycle.test.ts 与全部八个 src/config/state-startup-corpus*.test.ts 包装器。它还保留 src/gateway/server.sessions.archive-worktree-lifecycle.test.ts 与 src/gateway/server.sessions.delete-worktree-lifecycle.test.ts 中的真实 Git 归档/删除矩阵,以及 src/process/supervisor/adapters/child.service-lifecycle.test.ts 中的原生/代理子进程退役矩阵。更快的会话生命周期、身份、worktree 所有者、中继状态与就绪测试保留在自动 CI 中。startup-corpus 路径所有者以其现有分区顺序提供完整族。这些文件保留其规范配置、进程隔离、运行时前置条件、工作进程限制、用例与断言。整配置 CLI 过滤共享规范的包含与排除所有者,不引入文件分片,也不改变其工作进程与串行作业策略。并行组在应用工作进程策略时保留缩减覆盖的计时身份,因此自动 CI 采样不能覆盖完整发布估计。所选所有者测试与直接测试编辑在规范 PR 与精确头发布门替代中运行;无关路径不接纳其余发布矩阵。手动 CI、Full Release Validation 的 normal_ci 子作业、本地完整计划与非规范仓库保留完整清单。发布层级还保留独立的 published-upgrade-survivor Docker 单元,包含已发布基线、legacy-operator-state 场景与 auto-auth 重启模式;合成的前台交接用例不能替代该已发布驱动 × 候选证明。
  • 键控发布规模基准(src/gateway/session-row-projection.keyed-marks.benchmark.test.ts)也使用运行时发布清单。完整手动 CI 与 Full Release Validation 保留其 4,428 行 SQLite 夹具与 70,000 次发布;普通 PR 与每小时 main 计划推迟它。直接编辑仍在其 PR 上选择它。较小的 session-row 投影测试在常规 CI 中保留精确键失效、跨代理隔离、行查找与刷新行为。基准保留在规范 Gateway core 配置中,每条断言完好无损。
  • 十个原生维护者工具与发布矩阵使用 RELEASE_ONLY_RUNTIME_TEST_FILES:test/scripts/ci-linux-git.test.ts、test/scripts/pr-worktree-provision.test.ts、test/scripts/pr-worktree-interruption.test.ts、test/scripts/pr-merge-outcome.test.ts、test/scripts/pr-merge-admission.test.ts、test/scripts/pr-merge-rest.test.ts、test/scripts/pr-merge-receipt.test.ts、test/scripts/pr-merge-recovery.test.ts、test/scripts/full-release-validation-at-sha.test.ts 与 test/scripts/package-acceptance-workflow.test.ts。工具所有者 PR 推迟这些矩阵,除非其测试文件直接变更;普通 main 与仅产品 PR 已省略工具族。更快的 Git 所有者、导入闭包、托管合并、完成、状态隔离与发布合约兄弟测试保留在常规工具覆盖中。

  • 相同的显式运行时清单还将原生运行器状态清理、空发现、入口点矩阵、修正合并集成,以及捆绑浏览器 MCP 包管理器矩阵从工具所有者 PR 中延后。速度更快的状态生命周期、主目录隔离、运行器准入、原生参数解析、修正准备和捆绑 MCP 工件测试保留其原有契约。完整组合在规范配置中保留每一个用例和断言。直接编辑测试仍会选择它们;完整手动 CI(包括每小时 main 运行和完整发布验证)仍保留它们。

  • 媒体持久化大语料验证和 SQLite 可靠性进程遍历使用相同的发布清单来覆盖堆、稀疏会话、大负载以及组合式崩溃/恢复边界。普通媒体迁移、本地快照仓库、SQLite 快照和 Doctor 压缩套件在常规覆盖中保留其主要契约;完整的资源规模与进程组合保留在手动和发布验证中。
  • 发布清单还保留完整的 CLI 帮助、Gateway 后端退出、Web 输出背压、插件编写和打包技能遍历,真实 npm 依赖修复和已安装提供程序身份验证组合,以及 256 MiB Git 备份堆验证。速度更快的输出终结、Gateway RPC、命令策略、技能就绪、插件修复/发现和备份往返测试保留在 PR 和每小时 main 覆盖中。移动的文件保留其规范配置和所有断言,直接编辑时会运行,并继续被完整层级 CI 和完整发布验证选中。
  • MCP 发布验证(src/agents/agent-bundle-mcp-retention.test.ts 和 src/agents/mcp-stdio-client.cleanup.real.test.ts)保留嵌套共享工作进程的文件顺序检查,以及全部六个真实 POSIX 中继/锚点关闭用例,包括其生产取消截止时间。普通 CI 保留私有转写和请求者生命周期测试、MCP 清理错误传播,以及使用注入时钟的监督者取消/退出测试。组合式进程验证在手动和发布验证期间通过相同的 agents-core 配置运行。
  • 启动语料测试在 PR 上使用变更所有者选择;下面的六文件固定冒烟集是无条件运行时下限。规范 main 保留其常规启动语料,完整手动/发布验证保留完整测试族。完整的精确树 Node 覆盖回执会移除原本为空的快速启动语料行。历史手动目标保留其受支持的分文件或旧式分片语料回退。当前 PR 不会添加单独的全量语料作业。
  • 规范 main 推送使用 Blacksmith 集成 compact,包含 nondist Node 作业以及 dist 边界描述符。以前的多配置大块(CLI 加 CLI-process、isolated 加 fake-timers unit fast,以及 logging/process/runtime-config 三件套)被拆分为按配置分片,因此任何单个组都不会成为一条通道的下限。真实 Node+TSX 命令测试属于隔离 CLI-process 目录,因此普通 CLI 测试不会准备运行时。进程目录按完整文件成本拆分,拆分大小受其完整文件成本和运行时前置条件的下限约束,因此较早的聚合计时无法隐藏新归属的工作。文件打包也包含该前置条件;当完整合并估算符合现有 150 秒预算时,消耗运行时的 CLI 子项可在同一串行作业中共享一次准备。每个子项保留其选定文件、隔离进程和双工作进程限制;刻意分离的固定条带族保持分离。gateway 进程文件单独保留,因为其冷验证已需 200 秒。CLI 子项保留 150 秒规模目标和双工作进程限制。仅包含非构建 CLI 子项的普通混合分箱最多可合并 250 预测秒,每个原始子项仍单独准入且低于 150 秒;托管运行时前置条件本身有 160 秒下限。这些分箱省略每次推送信号较低的工具类和 TUI PTY 组,同时保留显式发布层级之外的产品运行时组,包括 unit-src、Control UI 和 gateway-core 各三条按文件加权的条带。Blacksmith 串行准入保持大型类 200 秒、小型类 276 秒。可共享两个进程槽位的普通组准入 360 预测聚合秒;已高于其串行上限的组单独保留。手动调度和完整发布验证保留完整的命名分片矩阵。每小时 main 运行完整的 main 层级清单;已有的仅发布组合保留在普通手动和完整发布验证计划中。
  • 每小时 main 在 77 行 Node 上限内,通过现有 compact 规划器包含完整工具清单。显式仅发布运行时组合保留在普通手动/发布验证中,除非某个 PR 选择其测试。成功的 PR merge-ref 结果证明的是其被测树,而非后来的 main 修订;现有门禁仅聚合每个修订实际选择的作业。
  • Doctor 会话和 cron 测试将两个最长的 SQLite 文件保留在单独分片中,其余文件放在一起。每个分片在 commands 配置的现有执行策略下运行完整文件。三个所有者不能共享 compact 作业;Blacksmith 为它们提供 8-vCPU 放置和 200 秒准入目标。在规范计时重拟合获得两个成功的 main 运行样本之前,两个新所有者计入观察到的文件主体和完整组开销。夹具大小、断言和进程隔离不变。
  • 生成的托管条带与原生组一样,直接测量值即其打包权重。GitHub 运行使用托管测量值,混合首次尝试运行使用 Blacksmith 测量值;只有未测量的子项才分摊父估算。这可以防止一个昂贵且已测量的子项在人为偏小的估算下与额外工作打包在一起,同时保留其测试分区、工作进程固定和每子项文件执行策略。
  • 变更插件作业串行运行其独立配置包,包括内部进程块也顺序运行的配置。现有工作进程策略随后可使用检测到的 CPU 预算,而无需为重叠计划预留容量;多目标作业保留其单独的并发策略。
  • 十六条工具条带使用按文件测量的权重,将 Git 所有者、托管进程、工作进程工件和转换缓存验证保留在单独作业中。Go 设置优先遵循显式选定的文件。对于整配置工具计划,只有普通工具配置负责 docs i18n Go 测试;isolated 和 Docker 目录不负责。未知历史配置保留其原始 Go 设置。包含统一声明编译器夹具的分片保留现有较大的运行器;托管拆分在打包前通过每个子项的选定文件传递该放置信息。其合成编译器图使用现有的 1,024 MB 堆覆盖,而生产完整构建保留其资源保护。Git 所有者用例各自拥有独立的检出和进程树,因此其真实超时和清理检查在每个运行器上最多重叠两个用例。工作进程转换验证使用独立套件及其自己的夹具生命周期;较晚的子项清理不能移除另一套件的输入。这些更改保留测试用例、截止时间和进程隔离;测量准入在现有混合行上限内决定作业数量。
  • Blacksmith 编号工具分箱在打包后请求 32-vCPU 类别,同时保留其逻辑运行器类别、名称、文件清单、串行项目执行和双工作进程固定。工具文件使用共享工作进程调度器;Docker 辅助夹具保留其单独的串行配置。在运行 33689551111 中,三个最慢的工具分箱获得两个 CPU 和 8 GB 内存;其 314–342 秒的主体设定了八分钟的非 Windows 墙钟上限。更大的请求解决了该主机容量不匹配问题,而无需增加分片。托管和混合工具放置不变;该请求需要原生计时证明后才能宣称八分钟目标。
  • 对于普通 UI 作业,RELEASE_ONLY_UI_TEST_FILES 将九个详尽的 Control UI 矩阵和遍历从普通规范 PR 和 main 计划中延后:app-sidebar.stress.browser.test.ts、board-fixture.e2e.test.ts、chat-attachment-menu.e2e.test.ts、chat-mobile-bubble-margin.e2e.test.ts、chat-session-entry.e2e.test.ts、github-link-hovercard.e2e.test.ts、native-embed-settings.e2e.test.ts、settings-layout.e2e.test.ts 和 theme-muted-contrast.e2e.test.ts。直接更改的文件在其自身 PR 或推送中保持选中;源所有者和目录更改不会扩大此层级。完整手动 CI 和完整发布验证保留完整的规范 UI 配置。fork、未知更改路径清单和历史兼容目标也保留完整覆盖。聚焦的 board、composer、media-spacing、hovercard、settings 和 contrast 同类测试保留在普通 CI 中。规划器在进入现有的三个 UI 分片和八个加权 Control UI E2E 分片之前先收窄发现范围。普通 E2E 行使用三个并行工作进程,而私有服务器和运行时预算项目保留一个;完整手动清单保留十二行和两个并行工作进程。单独的 real-Gateway 和浏览器扩展作业保留其自身覆盖和调度。
  • 相同的 RELEASE_ONLY_UI_TEST_FILES 选择也用于单独的 real-Gateway 作业:cron-duration-save、desktop-resize、control-ui-automation-management(QA Lab)、quota-reset-status、session-pr-reader-lifetime、chat-collaborator-scroll、mcp-app-conformance、usage-sessions-owner-attribution,以及 QA Lab 的 control-ui-openclaw-delegation、control-ui-media-transcript 和 session-host-command-state 在完整手动 CI 和完整发布验证的 normal_ci 子项中运行。它们完整的 browser/Gateway 组合保留在规范预构建配置中,断言和每项目工作进程策略不变;更快的模拟和所有者边界同类测试保留在普通 CI 中。共享路径清单保留所有其他 real-Gateway 和 QA Lab 文件。桌面传输引导保留其单独验证;没有预构建配置的历史目标保留其原始显式文件列表。验证作业准入不变:普通 PR 已省略 real-Gateway 作业,main 形态计划保留直接编辑的测试文件。浏览器扩展路由不变。Real-Gateway 准备使用现有的仅运行时完整构建(OPENCLAW_BUILD_PRIVATE_QA=1 OPENCLAW_RUN_NODE_SKIP_DTS_BUILD=1 pnpm build);build-artifacts 保留 SDK 声明生成和验证。保持准备独立可避免等待该作业后续的工件检查。当前规划器从同一选定清单生成两行 real-Gateway:现有串行夹具加上选定的独立伴生测试,以及其余经审计的并行夹具。伴生测试在串行执行后共享现有双工作进程阶段,无需另一个捆绑预览。预构建调用预览和平台族夹具复用已验证的规范 Control UI 字节。默认的模拟 Gateway hello 消息接收该工件标识,保留显式覆盖和构建偏差验证;普通本地预览仍构建私有资产。真实 node/SSH 桌面调整大小引导仅限发布,并遵循同一选定清单;完整手动/发布运行和直接 desktop-spec 编辑会各执行一次两个载体,而频繁调整大小和安全所有者测试保留在普通 CI。规划器负责放置,并使用与 Vitest 调度相同的并行资格允许列表。冻结目标和旧规划器保留一个完整行;普通 UI 分片数量和运行器标签保持不变。
  • Control UI 浏览器项目先使用已提交的每文件计时,然后使用冷启动 basename 提示,再使用源码字节大小,对发现的测试文件进行贪心打包。打包文件默认最多两个工作进程,受共享工作进程限制和本地节流约束;显式 Vitest CLI 工作进程覆盖仍可用。私有源服务器、真实 Gateway 和运行时预算测试保留在单工作进程项目中;本地完整套件运行在启动该项目前先完成打包工作。每文件开销根据串行调用重新拟合;并行调用仍更新其文件权重。计时键仅提供权重:发现过程仍决定完整测试清单,包括新文件和没有测量的文件。

  • 广泛的浏览器、QA、媒体及其他各类插件测试使用它们专用的 Vitest 配置,而非共享的插件全捕获配置。包含模式的分片使用 CI 分片名称记录计时条目,因此 .artifacts/vitest-shard-timings.json 可以区分整个配置与经过过滤的分片。

  • 浏览器扩展的 Chromium 引导命令准备 qaRuntime。它构建 native-host 和中继的 JavaScript 以及运行时资源;独立的工件作业负责 Control UI 和插件 SDK 声明校验。真实的 Chromium 流程及其断言保持不变。
  • Node E2E 分片通过 OPENCLAW_E2E_USE_PREBUILT_DIST 复用 qaRuntime。当选中打包的 @openclaw/ai 消费者测试时,CI 分片所有者会在接纳工作进程之前检查其包清单中的每个声明条目,并且仅当条目缺失时才运行 typed AI 构建。通用 Vitest 准入绝不会重复此修复:本地预构建 E2E 运行要求调用方准备工件,而常规 E2E 设置已经会构建 typed AI 包。无关的测试和完整的 typed 包不会触发构建;OPENCLAW_E2E_SKIP_BUILD 仍然将准备工作留给调用方。
  • 浏览器 native-host 启动测试是独立的 POSIX E2E 用例。Linux build-artifacts 在构建或恢复 dist 之后显式运行它,使用 OPENCLAW_E2E_USE_PREBUILT_DIST=1,以便测试不会启动另一轮构建。其 JSON 报告必须精确包含预期文件中指定名称的通过断言,且只有一个通过的测试,零失败、零挂起测试和零待办;缺少工件、跳过的测试和缺失的结果都会导致失败。工作流步骤仅在冻结的历史检出缺少测试文件时跳过:那是无法获取的历史证据,而非覆盖面。当前检出缺少文件仍然会失败。对该用例、其安装夹具或其 relay-key 夹具的更改,即使是纯测试差异,也会选中工件作业;无关的浏览器单元测试保持无构建。手动 CI 使用相同的工件步骤,独立于仅限发布的插件扫描。
  • Linux Node 分片作业通过上游 Actions 缓存 API 持久化 Vitest 的文件系统模块缓存。在 Blacksmith 运行器上,官方缓存操作使用 Blacksmith 的同地部署缓存后端 而非 GitHub 的后端,因此即使键匹配,缓存条目也是后端本地的。Blacksmith CI 分片仅恢复,并将受保护的 Blacksmith 种子解包到隔离的、运行器本地的根目录中。当 GitHub 托管的故障后备后端生效时,每个 checks-node-* 测试分片、checks-ui、常规分片 checks-ui-e2e 作业、两个快速契约矩阵,以及运行 Vitest 的 checks-fast-core 任务都会从 GitHub 后端恢复单独发布的不可变转换种子。复合操作的单个默认关闭的 restore-test-caches 输入使得无需更改缓存键或写入策略即可轻松禁用该扩展;混合 fast-core 行只对调用 Vitest 的任务启用它。真实 Gateway UI 作业不恢复这些测试缓存;native 和 Control UI i18n 通道不调用 Vitest。混合规划器配置在两个后端本地归档中使用匹配的键契约:attempt-1 Blacksmith 行读取 Blacksmith 种子,而托管重试只能读取单独发布的 GitHub 种子。普通 CI 作业保持仅恢复;独立的受信任预热器负责受保护的后端本地缓存发布。非取消型预热器跟随 main 分支,跳过仅文档推送,每日运行,并接受 main 上的手动或仓库分发。依赖发布和代码预热按后端、平台和引用分别串行化,因此新的依赖种子可以在先前构建仍在运行时发布。编译后的 Vitest 工作进程保留在完整的 Linux 代码作业中,在原生 SDK 编译改变解析拓扑之前准备好并保存;依赖作业不执行编译工作。普通 Linux 代码行遵循 OPENCLAW_CI_RUNNER_BACKEND。混合模式还使用跨真实 CI 路由、插件/通道契约和 UI 包配置的十七个文件发布有界的托管种子。它与托管消费者使用相同的直接 pnpm 入口点和项目并发;Node UI 保留分片运行器。两个 Linux 代码行都安装校验和固定的 Bun 复刻,并通过正常的 Vitest 启动器在 Bun 上收集相同的七个 UI 种子文件。共享的分片环境所有者将 Bun 转换放入其单独的运行时缓存叶子节点中。Node 和 Bun UI 收集使用普通的 UI 堆环境,而较重的 Node 组保留 8 GiB 上限。项目、分片、扩展批处理和直接测试包装器将共享缓存根解析到同一配置所属的叶子节点,与配置顺序或单配置与混合配置调用无关。同一配置的并发运行借用单独的写槽位,直到它们的进程组合并。显式缓存路径仍然是调用方拥有的叶子节点。分片运行器保持 Node 和 Bun 根目录分离,并在并发计划开始之前克隆两个恢复的种子。它省略完整构建和广泛的 agent/运行时收集;仅由其他文件或测试主体触达的导入可以保持冷状态。成功的 Blacksmith 发布不会填充 GitHub 的缓存后端。Linux 行通过正常运行器以新子进程、并发数为一且使用 --testNamePattern=(?!) 启动每个选中的分片/配置包装。非 UI 收集保留完整的 Node 种子,并通过与普通 CI 相同的运行时分区所有者收集现有的 Bun 兼容清单。托管预热只添加其有界工具种子中已经存在的兼容文件。非 UI 运行时选择器接受精确的收集过滤器;其他测试名称过滤器和不受支持的标志保留保守的 Node 路由。收集在复用稳定的配置所属缓存叶子节点的同时,保留包含模式、环境、编译导入和逐文件清理。测试主体在普通 CI 中运行;仅在那些主体内触达的导入可以保持冷状态,直到那次运行。预热器完成每个选中的包装,并在收集失败时仍然保存内容键控的转换和编译缓存,然后在缓存保存后报告失败;普通 CI 分片执行保持快速失败。这可以防止配置全局状态泄漏,避免将过滤的分片扩展为整个配置,并保留先前子进程产生的转换。设置仅在启用转换缓存时计算一次转换输入指纹,并将其传递给恢复和生成验证;禁用的缓存不会扫描检出。指纹会清除不兼容的 lockfile、包、tsconfig 和 Vitest 配置代次。在两个运行时生产者合并后,最终的 Node UI 收集负责唯一的修剪遍历。在发布之前,受信任的预热器在组合转换缓存超过 2 GiB 后扫描并将其修剪至 75%,在 Node 编译缓存超过 1 GiB 后将其修剪至 75%。消费者作业绝不会修剪恢复的种子。Vitest 对模块 id、源码内容、环境和解析后的转换配置进行哈希,因此普通的局部源码更改会保持未更改条目处于热状态,而更改的模块安全地未命中。粗粒度恢复前缀桥接工作流运行;正常的 Actions 缓存 LRU 和非活动驱逐会限制旧的不可变归档。
  • Node 分片作业在执行前和工作进程清理后记录资源快照:CPU 型号、主机负载、空闲内存、Node 的可用/受限内存估算,以及可用的 Linux CPU/内存/I/O 压力。当约束未知或不存在时,Node 报告受限内存值为零;这并不意味着零 RAM。主机级压力可以解释 CI 与重放之间的容量差异,但无法确定单个测试失败的原因。
  • 受信任的 Blacksmith Linux Node 作业从单个不可变的上游 Actions 缓存恢复根 node_modules、工作区导入器树(包括插件本地的版本和链接)以及工作区本地的 pnpm store;Blacksmith 透明地从其同地部署后端提供该缓存。pnpm 在文件系统允许的地方使用硬链接导入,而将完整的已安装树和 store 保留在一个归档中则保留了这些链接。pnpm 的元数据缓存位于该已归档 store 根目录之下,因此恢复后的安装可以验证供应链策略,而无需依赖生产者的主目录。源码 postinstall 和构建准备不会改动 pnpm 所有的依赖树。键包含显式的归档格式、运行器操作系统和架构、精确的 Node 补丁版本以及语义化安装输入指纹;不存在过时前缀回退。冻结安装从依赖 lockfile 的导入器和本地链接图中选择受跟踪的清单,因此无关的发布工具和测试夹具不会使归档失效。可变安装、自定义 pnpm 钩子、本地文件依赖和不支持的 lockfile 形态保留保守的受跟踪清单集合;冻结 pnpm 对账仍会验证每次恢复。清单在哈希之前进行规范化。仓库所有的 openclaw 元数据块和非安装脚本被排除,因为 pnpm 和经审计的直接根钩子不读取它们,因此运行时 schema、发布元数据、格式化和普通的测试/构建脚本编辑会保持依赖树处于热状态;未经审计的生命周期钩子漂移会失败关闭,直到其来源输入加入指纹契约。依赖、包管理器、钩子来源和 lockfile 的更改始终会选择新的不可变归档。每次精确恢复都会运行冻结的离线 pnpm 对账,因此未更改的归档无需访问注册表或重新链接导入器即可验证。如果对账失败,设置首先清除每个导入器树并从恢复的 store 离线重建,然后清除模块和 store 两者并从网络重试,而不是提供部分树。设置随后禁用 pnpm 冗余的运行前依赖检查,使安装和冻结对账成为唯一的依赖写入者;分片命令不得启动并发的隐式安装。独立的受信任预热器在设置成功之后立即发布工具链和精确依赖归档,然后再进行构建和转换预热;预检和下游 CI 作业仅恢复。正式仓库推送和同仓库拉取请求仅在真实的自托管运行器上选择加入精确恢复,包括混合模式 attempt 1。精确未命中会自动回退到更粗粒度的 pnpm store 缓存。手动 CI 分发、fork 拉取请求、托管通道和托管重试仅使用该 store 缓存。缓存恢复/保存失败是优化未命中而非正确性失败,正常的分支范围界定、LRU 和非活动驱逐会限制过时的归档。先前可变的依赖 StickyDisk 路径在重复的成功写入者确认提交、但后续运行仍恢复为空文件系统之后已被淘汰。
  • Node 分片和构建工件作业还通过不可变的 Actions 缓存恢复 Node 的可移植磁盘编译缓存。在 GitHub 托管的故障模式中,上述托管 Vitest 通道集在其转换种子之外还恢复单独发布的 GitHub 测试范围归档。构建、QA 和测试编排共享受信任预热器通过完整构建和测试收集填充的受保护种子。现有的 test 缓存命名空间保留给已发布的归档;没有单独的仅构建发布器。普通的 build-artifacts、QA 和测试作业仅恢复缓存。PR 和普通测试作业只读取受保护快照,因此功能分支字节码永远不会进入共享种子,PR 流量也不会创建缓存归档。当运行时身份和相对于缓存的模块路径匹配时,这将为 Node 加载的编排、构建工具和外部依赖复用 V8 字节码,包括当只有部分源码图发生变化时。可移植模式不保证跨任意检出布局的复用;Node 会在内部验证精确的运行时分区和源码字节。最大 2 GiB 的转换归档在约 125 MB/s 的速度下恢复大约需要 15–20 秒;实测快速契约转换在约 8 秒恢复的基础上约为 21 秒,而更广泛的冷导入达到约 100–143 秒。如果实测节省低于恢复成本,应回退该优化。普通 Vitest 运行保留配置的 Node 编译缓存。Vitest 对 V8 和自定义覆盖率提供方的工作进程及其子进程禁用字节码缓存;显式的 NODE_DISABLE_COMPILE_CACHE=1 会禁用整个调用的缓存。

  • 两个 Linux 代码预热行都在测试收集之前将原生 SDK 声明归档发布到各自的后端;完整 Linux 行还会在其构建之前发布它。托管 lint 条纹和专用包边界泳道从各自 runner 的后端恢复匹配的归档,并在复用前验证原生编译器输入和完整输出。混合模式维护该托管种子,而不重复完整的 Blacksmith 构建。保存后,预热器移除其原生 SDK 输出,以便后续打包声明缓存描述与普通构建消费者相同的树。包存储内容和 pnpm 存储位置簿记不是编译器输入;已安装依赖字节、解析拓扑、显式输入和编译器标识仍会使过期声明失效。全 Blacksmith 配置保留其只读粘滞磁盘路径。Control UI 和 UI E2E 作业共享一个 Linux Playwright Chromium 归档,其键为精确固定的 Playwright 版本。独立依赖发布器还运行一个标准托管 macos-15 行,安装依赖,并在精确未命中后仅发布 pnpm 存储。它使用现有的操作系统、架构、Node 版本、包和锁文件键;macOS CI 保持仅恢复。该行禁用精确依赖、构建、转换和编译缓存,且不运行任何构建或测试预热。Pnpm 负责修剪,而前后磁盘使用量和已保存归档大小暴露保留内容;修剪不施加内容存储大小上限。

  • 构建产物和 Docker 种子作业通过共享 Node 设置操作恢复受保护的完整构建缓存。完整、包和 ciArtifacts 构建共享 scripts/write-plugin-sdk-entry-dts.ts:它暂存规范的公共/私有 tsdown SDK 声明组,并独立缓存每个组。命中会恢复到新的暂存区;冷和缓存代都必须包含每个选定的 SDK 条目以及完整的相对声明闭包,然后才能发布到 dist/。SDK 缓存从不采用来自实时 dist/ 的声明。本地插件 lint 和包边界编译使用独立的原生声明树,而不是打包声明;参见声明所有权。已构建的 Doctor 插件索引证明复用该精确 dist/ 输出,而不是第二次调用 E2E 测试框架的回退 TypeScript 构建。
  • 完整和包构建分别缓存 AI、工作区包和剩余统一声明。统一运行时总是在共享声明所有者暂存一个基础组和五个插件组之前重新构建 JavaScript;稍后的 SDK 阶段使用同一所有者用于其两个组。两个阶段都将未更改的组恢复到私有暂存区,并仅编译未命中项。当 CPU 和可用内存覆盖两个最大编译器堆加上每个子进程的余量时,最多两个非空、独立的编译器阶段可以一起运行;其他计划保持串行。它们共享一个前后输入快照,并在发布前验证每个选定条目、成功的编译器回执、相对声明边和共享块所有者,包括在包准备清除 dist 之后。冲突的共享字节或已更改的已消费输入会在写入实时声明之前失败;缓存记录仅在成功发布后刷新。规范 DTS 配置启用 TypeScript 稳定类型排序,因此无关的字面量分配不会在重建组中重新排序未更改的导出类型。完整发布会修剪过时的声明,同时保留签名应用包和 Control UI 资产;SDK 发布仅拥有其扁平条目,并保留其他组的共享块。AI 和工作区包步骤在缓存命中时也会重新构建 JavaScript。隐式和显式启用声明的构建共享这些种子;仅运行时配置使用未缓存的图,并且无法发布声明代。每个声明组对其成功编译器 Program 中的普通源字节进行哈希,因此对现有未消费测试、UI 源和工作流的编辑会保留其缓存命中。精确的检出本地 .cache/vitest 临时根目录从解析发现中排除;显式消费的输入、已安装别名以及相邻或嵌套路径仍会正常使缓存失效。它仍验证继承的配置、生成器和包/插件元数据、编译器标识以及解析拓扑;已消费的声明依赖项和新解析候选项会使该代失效。工作区包更改会保守地使 AI 和包声明缓存失效。受保护的预热器在成功完整构建后立即发布构建归档,早于无关的测试预热和 pnpm 维护。每次预热器尝试都会获得一个新的不可变归档键;粗粒度恢复前缀提供先前组,而每步签名仍是唯一的内容有效性所有者。重建的组替换其完整的拥有缓存树,包括先前记录缺失或无效的过时字节。GitHub 的缓存配额和不活动驱逐限制旧代;相同的预热器尝试可以发布单独的归档。每周 Node 26 最低泳道改为在 main 运行成功后发布 14 天工件,并仅恢复其不可变生产者标识解析到 main 上该工作流的工件,从而避免配额波动,同时不允许 PR 代码写入共享缓存。私有 QA 声明从不持久化到 Actions 缓存中,因为缓存命名空间不是保密边界。
  • check-additional-boundaries 使用四个并发子进程和每项检查计时运行完整的补充守卫列表(scripts/run-additional-boundary-checks.mts)。其 20 项检查保留单独的失败、截止时间和进程清理。共享的四规则聚焦扫描在所有源根上运行一次;更窄的公共 lint 命令仍可用。Prompt 快照在其独立泳道中运行。包边界编译/金丝雀工作保持在一起,运行时拓扑架构独立于嵌入在 build-artifacts 中的 gateway watch 覆盖运行。
  • 在 32-vCPU 自托管构建 runner 上,Gateway watch、通道测试和核心支持边界分片在 dist/ 和 dist-runtime/ 已经构建后,在 build-artifacts 内一起启动。GitHub 托管的回退运行保持 Gateway watch 串行,以便低核心争用无法消耗其就绪截止时间。完整 Node 构建随后通过串行公共 Gateway 消息操作验证 Discord 组件附件文件名,检查已构建修订并保留命名测试 JSON 结果;早于该用例的冻结目标明确报告不可用证明。两条路径随后单独运行两个已构建的 TUI PTY 工件金丝雀。

Discord 证明上传器仅在其 producer 步骤以成功或失败状态完成后运行。它保留真实证明失败的诊断信息,并且仍然要求声明的文件。当更早的失败或取消跳过 producer,或在完成前取消它时,上传器保持跳过;该覆盖保持未运行。

PR 所有者计划首先使用现有的紧凑行,然后拆分工作以接近 150 秒的测试预算。如果这些拆分超过最终的 Node 矩阵上限,规划器将保留紧凑的选定所有者行,包括插件工作。这会保持选定的文件、配置、worker 限制和进程所有者不变;广泛的 PR 可能具有更长的行,而不是仅因拆分而在预检中失败。Dist 描述符不消耗 Node 行预算。 如果保留的计划仍超过上限,则仅按构建和并发要求对变更目标块进行分区,然后按预测秒数平衡到剩余行中,同时保留每个选定目标。无法适配这些独立策略的计划,或其他所有者已填满上限的计划,仍会在预检中失败。

明确选定的插件测试保留其规范配置、native-loader 隔离、worker 策略和分组计时。仅发布开关控制完整插件扫描,而不是其所有者元数据的可用性;无关 PR 仍不会获得该扫描。

固定的 PR 冒烟清单位于 PR_SMOKE_TEST_FILES 中的 scripts/lib/ci-changed-node-test-plan.mts。它选择六个完整的现有文件:

  • test/gateway-rpc-exporters.test.ts: Gateway 启动、就绪以及经过身份验证的 WebSocket/RPC/HTTP 服务。
  • src/config/io.load-async.test.ts: 冷配置加载和元数据准入。
  • src/config/io.compat.test.ts: 兼容配置读取和迁移指导。
  • src/config/utility-model-separation-migration.io.test.ts: 通过 I/O 进行配置迁移。
  • src/plugins/loader.runtime-registry.test.ts: 插件加载和注册表生命周期。
  • test/qa-channel-message-tool-delivery.test.ts: 向频道对话投递 message-tool。

冒烟文件保留其规范配置和断言。它们补充变更所有者测试,并且不会将无关的 Windows 或浏览器作业纳入 PR。 Linux Testbox 检查在这六个文件中通过了全部 92 个用例,累计 wrapper 时间为 161.01 秒。 这是针对三分钟预算的聚焦冒烟证据,而不是实测的 GitHub 作业墙钟时间;CI 设置、排队和 runner 争用仍是单独的成本。

scripts/lib/ci-proof-test-inventory.mts 中的 PR_EXEMPT_RUNTIME_TEST_FILES 清单将实测的慢速集成测试排除在无关的规范 PR 和精确 head PR 回退调度之外。每小时 main 和 Full Release Validation 通过其规范所有者选择这些完整文件:常规 CI 拥有核心、UI 和工具测试;Plugin Prerelease 在其每小时计划和发布活动中拥有完整的扩展运行时清单。独立手动 CI 保留其核心清单;运行 Plugin Prerelease 以获得扩展覆盖。每小时 main 包含完整工具清单,因此在 PR 选择收窄后,延迟测试和受保护回归都保留其 规范所有者。 直接测试编辑和选定主题所有者通过现有的变更目标所有者和传递导入图,将文件重新纳入有界的 PR 计划。仅缺失/已删除的测试和广泛的未解决输入不会启用该清单。缩减组保留不同的计时标识以及原始配置、先决条件、进程 隔离、worker 限制、用例和断言。该层级与旧的仅发布运行时清单分开;工具家族现在也每小时运行。 清单所有者仅枚举在选定 checkout 中为文件的已审计路径。已删除路径无需可运行所有者;每个存活条目仍要求 恰好一个每小时和发布所有者。新路径和重命名路径立即参与变更所有者选择; 单独的审计决定其是否纳入此显式延迟清单。 从实测 PR 运行中选择完整的集成、进程、语料库或迁移套件,同时在 PR 上保留其聚焦的所有者测试。在添加豁免之前,检查最近的产品 修复,包括因测试拆分而移动的回归。 每小时 GitHub 托管计划复用现有的完整紧凑清单和串行工具打包器。完整文件估算使用托管成本比例;Blacksmith 进程观察保留在 Blacksmith。打包保留每个子组、其两个 worker 限制及其超时,同时使完整 Node 矩阵保持在 77 行主层级上限内。在同一托管 runner 上执行的工具组可以共享一行,同时保留最强的原始容量所有者。 显式源监视位于 scripts/lib/ci-policy-test-watch.mts,包括动态启动的 worker 以及导入图无法发现的脚本。

显式策略监视即使在更广泛的工具或运行时套件被延迟时,也保留其匹配测试在 PR CI 中。这包括 wrapper 依赖检查、 Gateway 客户端调用点扫描和升级幸存者包检查。无关的延迟测试保持排除。

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