毕业一个 Labs 功能
毕业会移除功能的 Labs 开关,使其成为普通功能。在编写任何代码之前,由功能负责人做出两个独立决定:
- 退出 Labs: 功能获得永久归属(自己的设置或插件页面),并去除 Labs 相关措辞。
- 默认: 默认开启,或默认保持关闭。
两者相互独立。#197029 最初尝试了同时执行两项,但最终只发布了第一项:Advisor 退出了 Labs 但仍保持关闭。请询问具体需要哪一项;不要假设“毕业”就意味着“默认开启”。
先例:Swarm 默认开启 (#136514),Tool Search 默认开启 (#154068),原生插件 UI 无需 Labs 选择即可使用 (de50262a1f96),Labs 功能移入设置页面 (#145460),Advisor 退出 Labs 且保持关闭 (#197029)。
PR 之前
- 在实际路由上衡量成本或风险,如果该功能需要花费资金或令牌,或者会改变从未选择加入的用户的行为。来自模拟或单元测试的当前数据不能作为证据。#197074 根据模拟数据合并了一项缓存成本声明,但实际供应商反驳了该声明,并在 #197175 中被还原。请使用该功能自身 PR 中已有的实际测量值,并将数据写入 PR 描述中。
- 先解决已知缺陷。 Advisor 的毕业等待了其分支缓存修复 (#197203, #197223, #197224, #197226),因为如果默认开启,每个用户都将被收取未缓存成本。
- 找到保留的启用路径。 在 Labs 行移除后,用户仍需能够从 UI 开启该功能。捆绑插件使用 设置 → 插件 → <名称> → 启用;核心功能需要其设置页面。仅在不存在开关时才添加。
修改内容
- 默认值。 仅在负责人选择默认开启时修改:捆绑插件的
openclaw.plugin.json中的enabledByDefault,或核心配置默认值。现有的显式false(或功能的退出值)必须继续有效,现有的true必须保持开启。切勿添加会重写已保存配置以更改用户选择的迁移。 - Labs。 从
ui/src/pages/labs/labs-registry.ts中移除条目,并移除仅由其使用的所有内容:labs-page.tsx行或插槽、labs-feature-state.ts条目、字符串和测试。 - 文档。 将该功能的章节从
docs/concepts/experimental-features.md移至其自己的参考页面。在该页面中留下一个包含旧锚点的段落,说明该功能已毕业、其默认值以及在哪里可以开启它。更新“Labs 包含 ...”列表和“当前已记录的标志”表格。 - 措辞。 从清单描述、包描述、README、插件摘要以及任何面向用户或模型的文本(如提示前缀)中移除“实验性”和“OpenClaw Labs”。
- 生成的文件。 请重新生成,切勿手动合并:
pnpm config:docs:gen、pnpm plugins:inventory:gen。根据ui/AGENTS.md,Control UI 区域设置产物(*.meta.json、*.tm.jsonl、catalog-fallbacks.json)应保留在 PR 之外;区域设置刷新工作流会更新它们。pnpm ui:i18n:verify必须通过。 - 升级验证。 仅针对默认值更改:通过实际升级证明,没有保存的条目获得新的默认值,显式关闭保持关闭,显式开启保持开启。默认值保持不变的情况无需升级案例;#197029 放弃了为默认开启而构建的案例。
PR 中的证据
- Control UI 截图,上传前检查是否包含私有数据:Labs 前后的截图,以及在真实网关上正常工作的启用路径截图。使用
gh pr comment <n> --attach '<文件>#<替代文本>'附加它们。 - 启用路径经过端到端测试:开关保存预期的配置,并且无需重新启动即可生效。
- 该功能的测试和 Labs 页面测试通过;测试行数限制不会增加。
- 文档声明与代码匹配。ClawSweeper 发现了 Advisor 的“每个
everyMinutes最多一个审查”,但在everyToolCalls开启的情况下是不正确的。
合并之后
新位置仅出现在包含该合并的构建中。告知用户确切路径,以及旧版本仍会显示 Labs 开关。