chore(i18n): refresh zh-CN translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-08 04:39:38 +00:00
parent b082e97f33
commit d5417a569c
2 changed files with 183 additions and 177 deletions

View File

@ -1,43 +1,43 @@
---
read_when:
- 扩展 qa-lab 或 qa-channel 时
- 扩展 `qa-lab``qa-channel`
- 添加仓库支持的 QA 场景时
- 围绕 Gateway 网关仪表板构建更高真实的 QA 自动化时
summary: 用于 qa-lab、qa-channel、种子场景和协议报告的私有 QA 自动化形态
- 围绕 Gateway 网关仪表板构建更高真实的 QA 自动化时
summary: 面向 `qa-lab`、`qa-channel`、种子场景和协议报告的私有 QA 自动化形态
title: QA 端到端自动化
x-i18n:
generated_at: "2026-04-07T22:41:21Z"
generated_at: "2026-04-08T04:39:08Z"
model: gpt-5.4
provider: openai
source_hash: 3b4aa5acc8e77303f4045d4f04372494cae21b89d2fdaba856dbb4855ced9d27
source_hash: 57da147dc06abf9620290104e01a83b42182db1806514114fd9e8467492cda99
source_path: concepts/qa-e2e-automation.md
workflow: 15
---
# QA 端到端自动化
私有 QA 技术栈旨在以比单个单元测试更贴近真实渠道形态的方式来验证 OpenClaw。
私有 QA 栈旨在以比单个单元测试更贴近真实渠道形态的方式来验证 OpenClaw。
当前组成部分:
- `extensions/qa-channel`:合成消息渠道,包含私信、频道、线程、反应、编辑和删除等交互面。
- `extensions/qa-lab`:调试器 UI 和 QA 总线,用于观察对话记录、注入入站消息,以及导出 Markdown 报告。
- `qa/`用于启动任务和基线 QA 场景的仓库支持种子资源。
- `extensions/qa-channel`:合成消息渠道,支持私信、频道、线程、反应、编辑和删除等交互面。
- `extensions/qa-lab`:调试器 UI 和 QA 总线,用于观察转录内容、注入入站消息,以及导出 Markdown 报告。
- `qa/`为启动任务和基础 QA 场景提供的仓库支持种子资源。
当前的 QA 操作流程是一个双窗格 QA 站点:
当前的 QA 操作流程是一个双 QA 站点:
- 左侧:带有智能体的 Gateway 网关仪表板Control UI
- 右侧QA Lab显示类 Slack 风格的对话记录和场景计划。
- 右侧QA Lab显示类似 Slack 的转录内容和场景计划。
使用以下命令运行:
运行方式
```bash
pnpm qa:lab:up
```
这会构建 QA 站点,启动基于 Docker 的 Gateway 网关通道,并暴露 QA Lab 页面,供操作员或自动化循环为智能体分配 QA 任务、观察真实渠道行为,并记录哪些有效、哪些失败,或哪些仍被阻塞
这会构建 QA 站点,启动由 Docker 支持的 Gateway 网关通道,并暴露 QA Lab 页面。操作员或自动化循环可以在该页面中为智能体分配 QA 任务、观察真实渠道行为,并记录哪些内容已生效、失败了,或仍然受阻
如果你想更快地迭代 QA Lab UI而不必每次都重建 Docker 镜像,可以使用绑定挂载的 QA Lab bundle 启动该技术栈:
如果你想更快地迭代 QA Lab UI而不必每次都重建 Docker 镜像,可以使用绑定挂载的 QA Lab bundle 启动整个栈:
```bash
pnpm openclaw qa docker-build-image
@ -46,15 +46,16 @@ pnpm qa:lab:up:fast
pnpm qa:lab:watch
```
`qa:lab:up:fast` 会让 Docker 服务继续使用预构建镜像,并将 `extensions/qa-lab/web/dist` 绑定挂载到 `qa-lab` 容器中。`qa:lab:watch` 会在变更时重建该 bundle并且当 QA Lab 资源哈希发生变化时,浏览器会自动重新加载。
`qa:lab:up:fast` 会让 Docker 服务继续使用预构建镜像,并将 `extensions/qa-lab/web/dist` 绑定挂载到 `qa-lab` 容器中。`qa:lab:watch` 会在变更时重建该 bundle当 QA Lab 资源哈希发生变化时,浏览器会自动重新加载。
## 仓库支持的种子资源
## 仓库支持的种子
种子资源位于 `qa/` 中:
- `qa/scenarios.md`
- `qa/scenarios/index.md`
- `qa/scenarios/*.md`
这些内容有意保存在 git 中,以便人类和智能体都能看到 QA 计划。基线列表应保持足够广泛,以覆盖:
这些内容有意保存在 git 中,这样人类和智能体都能看到 QA 计划。基础列表应保持足够广泛,以覆盖:
- 私信和频道聊天
- 线程行为
@ -62,22 +63,22 @@ pnpm qa:lab:watch
- cron 回调
- 记忆召回
- 模型切换
- 子智能体切换交接
- 子智能体移交
- 读取仓库和读取文档
- 一个小型构建任务,例如 Lobster Invaders
## 报告
`qa-lab` 会根据观察到的总线时间线导出一份 Markdown 协议报告。
报告应回答:
报告应回答:
- 哪些
- 哪些失败
- 哪些仍被阻塞
- 哪些内容已生
- 哪些内容失败
- 哪些内容仍然受阻
- 值得添加哪些后续场景
## 相关文档
- [测试](/zh-CN/help/testing)
- [QA 渠道](/zh-CN/channels/qa-channel)
- [QA Channel](/zh-CN/channels/qa-channel)
- [仪表板](/web/dashboard)

View File

@ -1,63 +1,67 @@
---
x-i18n:
generated_at: "2026-04-08T02:01:57Z"
generated_at: "2026-04-08T04:39:37Z"
model: gpt-5.4
provider: openai
source_hash: 0e156cc8e2fe946a0423862f937754a7caa1fe7e6863b50a80bff49a1c86e1e8
source_hash: 4a9066b2a939c5a9ba69141d75405f0e8097997b523164340e2f0e9a0d5060dd
source_path: refactor/qa.md
workflow: 15
---
# QA 重构
状态:基础迁移已落地
状态:基础迁移已完成
## 目标
将 OpenClaw QA 从“定义分散”的模型迁移为单一事实来源:
将 OpenClaw QA 从拆分定义模型迁移到单一事实来源:
- 场景元数据
- 发送给模型的提示词
- 设置与清理
- harness 逻辑
- 断言与成功标准
- 产物与报告提示
- 工件与报告提示
理想的最终状态是:一个通用 QA harness 加载功能强大的场景定义文件,而不是将大多数行为硬编码在 TypeScript 中。
期望的最终状态是一个通用 QA harness它加载功能强大的场景定义文件而不是将大部分行为硬编码在 TypeScript 中。
## 当前状态
当前的主要事实来源位于 `qa/scenarios.md`
当前的主要事实来源现在位于 `qa/scenarios/index.md`,并且每个
场景在 `qa/scenarios/*.md` 下各有一个文件。
已实现:
- `qa/scenarios.md`
- 规范 QA 包
- `qa/scenarios/index.md`
- 规范 QA 包元数据
- 操作员身份
- 启动任务
- `qa/scenarios/*.md`
- 每个场景对应一个 markdown 文件
- 场景元数据
- handler 绑定
- 处理器绑定
- 场景专用执行配置
- `extensions/qa-lab/src/scenario-catalog.ts`
- markdown 包解析器 + zod
- markdown 包解析器 + zod 验
- `extensions/qa-lab/src/qa-agent-bootstrap.ts`
- markdown 包渲染计划
- 根据 markdown 包渲染计划
- `extensions/qa-lab/src/qa-agent-workspace.ts`
- 生成兼容性文件种子以及 `QA_SCENARIOS.md`
- 生成兼容性文件以及 `QA_SCENARIOS.md`
- `extensions/qa-lab/src/suite.ts`
- 通过 markdown 定义的 handler 绑定选择可执行场景
- QA bus 协议 + UI
- 用于渲染图 / 视频 / 音频 / 文件的通用内联附件
- 通过 markdown 定义的处理器绑定选择可执行场景
- QA 总线协议 + UI
- 用于渲染图 / 视频 / 音频 / 文件的通用内联附件
仍然分散的部分
仍然拆分的表面
- `extensions/qa-lab/src/suite.ts`
- 仍然承载大部分可执行的自定义 handler 逻辑
- 仍然拥有大部分可执行的自定义处理器逻辑
- `extensions/qa-lab/src/report.ts`
- 仍然从运行时输出推导报告结构
所以,事实来源的分散问题已经修复,但执行层仍然主要依赖 handler 支撑,而不是完全声明式。
因此,事实来源拆分问题已经修复,但执行仍然主要依赖处理器支持,而不是完全声明式。
## 真实的场景层长什么样
## 真实的场景表面是什么样的
阅读当前 suite 可以看出几类不同的场景。
@ -68,69 +72,69 @@ x-i18n:
- 线程后续跟进
- 模型切换
- 审批后续执行
- reaction / edit / delete
- 反应 / 编辑 / 删除
### 配置与运行时变更
- config patch skill disable
- config apply restart wake-up
- config restart capability flip
- runtime inventory drift check
- config patch 技能禁用
- config apply 重启唤醒
- config 重启能力切换
- 运行时清单漂移检查
### 文件系统与仓库断言
- source/docs discovery report
- build Lobster Invaders
- generated image artifact lookup
- source / docs 发现报告
- 构建 Lobster Invaders
- 生成图像工件查找
### 内存编排
### 记忆编排
- memory recall
- 渠道上下文中的 memory tools
- memory failure fallback
- session memory ranking
- 线程 memory 隔离
- memory dreaming sweep
- 记忆召回
- 渠道上下文中的记忆工具
- 记忆失败回退
- 会话记忆排序
- 线程记忆隔离
- 记忆 dreaming sweep
### 工具与插件集成
- MCP plugin-tools call
- skill visibility
- skill hot install
- native image generation
- image roundtrip
- 从附件进行图片理解
- MCP plugin-tools 调用
- skill 可见性
- skill 热安装
- 原生图像生成
- 图像往返
- 来自附件的图像理解
### 多轮与多参与者
- subagent handoff
- subagent fanout synthesis
- restart recovery style flows
- subagent 交接
- subagent 扇出汇总
- 重启恢复类流程
这些分类很重要,因为它们会驱动 DSL 的需求。仅有“提示词 + 期望文本”的平面列表是不够的。
这些类别很重要,因为它们决定 DSL 需求。仅有提示词 + 期望文本的平面列表是不够的。
## 方向
### 单一事实来源
使用 `qa/scenarios.md` 作为编写时的单一事实来源。
使用 `qa/scenarios/index.md` 加 `qa/scenarios/*.md` 作为编写时的事实来源。
这个包应保持:
包应保持:
- 便于在评审中阅读
- 可机器解析
- 足够丰富,能够驱动:
- 在代码审查中便于人类阅读
- 可机器解析
- 足够丰富,驱动:
- suite 执行
- QA 工作区 bootstrap
- QA 工作区引导
- QA Lab UI 元数据
- docs / discovery 提示词
- 报告生成
### 首选编写格式
使用 markdown 作为顶层格式,并在其中嵌入结构化 YAML。
使用 markdown 作为顶层格式,内部嵌入结构化 YAML。
推荐结构
推荐形状
- YAML frontmatter
- id
@ -142,24 +146,24 @@ x-i18n:
- model / provider overrides
- prerequisites
- prose sections
- objective
- notes
- debugging hints
- 目标
- 注释
- 调试提示
- fenced YAML blocks
- setup
- steps
- assertions
- cleanup
这样可以带来
这样可以得到
- 比庞大的 JSON 更适合 PR 阅读
- 比纯 YAML 提供更丰富的上下文
- 严格解析和 zod 校验
- 比庞大的 JSON 更好的 PR 可读性
- 比纯 YAML 更丰富的上下文
- 严格解析与 zod 验证
原始 JSON 仅可作为中间生成格式接受。
原始 JSON 仅在作为中间生成形式时可接受。
## 提议的场景文件结构
## 拟议的场景文件形状
示例:
@ -232,9 +236,9 @@ Verify generated media is reattached on the follow-up turn.
```
````
## DSL 必须覆盖的 runner 能力
## 该 DSL 必须覆盖的运行器能力
基于当前 suite通用 runner 需要的不仅仅是提示词执行。
根据当前 suite通用运行器需要的不只是提示词执行。
### 环境与设置操作
@ -261,7 +265,7 @@ Verify generated media is reattached on the follow-up turn.
- `tools.effective`
- `skills.status`
### 文件与产物操作
### 文件与工件操作
- `file.write`
- `file.read`
@ -270,7 +274,7 @@ Verify generated media is reattached on the follow-up turn.
- `artifact.captureGeneratedImage`
- `artifact.capturePath`
### memory 与 cron 操作
### 记忆与 cron 操作
- `memory.indexForce`
- `memory.searchCli`
@ -300,48 +304,48 @@ Verify generated media is reattached on the follow-up turn.
- `cron.managedPresent`
- `artifact.exists`
## 变量与产物引用
## 变量与工件引用
DSL 必须支持保存输出并在后续引用。
该 DSL 必须支持已保存输出及其后续引用。
当前 suite 中的示例:
- 创建一个 thread,然后复用 `threadId`
- 创建一个 session,然后复用 `sessionKey`
- 生成一张图片,然后在下一轮将该文件作为附件附上
- 生成一个 wake marker 字符串,然后断言它稍后会出现
- 创建一个线程,然后复用 `threadId`
- 创建一个会话,然后复用 `sessionKey`
- 生成一张图像,然后在下一轮附加该文件
- 生成一个唤醒标记字符串,然后断言它稍后会出现
所需能力:
- `saveAs`
- `${vars.name}`
- `${artifacts.name}`
- 针对路径、session key、thread id、marker、tool 输出的强类型引用
- 路径、会话键、线程 id、标记、工具输出的类型化引用
如果没有变量支持harness 就会继续把场景逻辑泄漏回 TypeScript 中
如果没有变量支持harness 将继续把场景逻辑泄漏回 TypeScript
## 哪些应保留为逃生口
## 哪些内容应保留为逃生口
在第一阶段,实现一个完全纯粹的声明式 runner 并不现实。
在第 1 阶段,实现一个完全纯声明式的运行器并不现实。
有些场景天然就是高度编排型的:
有些场景本质上就是高度依赖编排的:
- memory dreaming sweep
- config apply restart wake-up
- config restart capability flip
- 按时间戳 / 路径解析 generated image artifact
- discovery-report evaluation
- 记忆 dreaming sweep
- config apply 重启唤醒
- config 重启能力切换
- 依据时间戳 / 路径解析生成图像工件
- discovery-report 评估
这些场景目前应继续使用显式的自定义 handler
这些场景目前应继续使用显式自定义处理器
推荐规则:
- 8590% 声明式
- 剩余困难部分使用显式 `customHandler` 步骤
- 仅允许具名且有文档说明的自定义 handler
- 85 - 90% 声明式
- 对于剩余困难部分使用显式 `customHandler` 步骤
- 仅允许具名且有文档说明的自定义处理器
- 场景文件中不允许匿名内联代码
这样可以保持通用引擎整洁,同时仍能持续推进
这样可以保持通用引擎整洁,同时仍然允许推进工作
## 架构变更
@ -350,30 +354,31 @@ DSL 必须支持保存输出并在后续引用。
场景 markdown 已经是以下内容的事实来源:
- suite 执行
- 工作区 bootstrap 文件
- 工作区引导文件
- QA Lab UI 场景目录
- 报告元数据
- discovery 提示词
生成的兼容内容:
生成的兼容内容:
- 种子工作区仍包含 `QA_KICKOFF_TASK.md`
- 种子工作区仍包含 `QA_SCENARIO_PLAN.md`
- 种子工作区仍包含 `QA_KICKOFF_TASK.md`
- 种子工作区仍包含 `QA_SCENARIO_PLAN.md`
- 种子工作区现在还包含 `QA_SCENARIOS.md`
## 重构计划
### Phase 1loader 与 schema
### 第 1 阶段:加载器与 schema
已完成。
- 添加了 `qa/scenarios.md`
- 添加了针对具名 markdown YAML 包内容的解析器
- 使用 zod 进行了校验
- 将各个消费者切换为使用已解析的包
- 移除了仓库级 `qa/seed-scenarios.json``qa/QA_KICKOFF_TASK.md`
- 添加了 `qa/scenarios/index.md`
- 将场景拆分到 `qa/scenarios/*.md`
- 为具名 markdown YAML 包内容添加了解析器
- 使用 zod 进行验证
- 将消费者切换为使用已解析的包
- 删除了仓库级别的 `qa/seed-scenarios.json``qa/QA_KICKOFF_TASK.md`
### Phase 2:通用引擎
### 第 2 阶段:通用引擎
- 将 `extensions/qa-lab/src/suite.ts` 拆分为:
- loader
@ -383,53 +388,53 @@ DSL 必须支持保存输出并在后续引用。
- custom handlers
- 保留现有辅助函数作为引擎操作
交付
交付成果
- 引擎执行简单的声明式场景
- 引擎执行简单的声明式场景
先从主要是“提示词 + 等待 + 断言”的场景开始:
先从主要是 prompt + wait + assert 的场景开始:
- 线程后续跟进
- 从附件进行图片理解
- 来自附件的图像理解
- skill 可见性与调用
- 渠道基线
交付
交付成果
- 第一批真正由 markdown 定义的场景通过通用引擎发布
### Phase 4:迁移中等复杂度场景
### 第 4 阶段:迁移中等复杂度场景
- image generation roundtrip
- 渠道上下文中的 memory tools
- session memory ranking
- subagent handoff
- subagent fanout synthesis
- 图像生成往返
- 渠道上下文中的记忆工具
- 会话记忆排序
- subagent 交接
- subagent 扇出汇总
交付
交付成果
- 变量、产物、工具断言、request-log 断言得到验证
- 变量、工件、工具断言、请求日志断言得到验证
### Phase 5困难场景继续使用自定义 handler
### 第 5 阶段:将复杂场景保留在自定义处理器上
- memory dreaming sweep
- config apply restart wake-up
- config restart capability flip
- runtime inventory drift
- 记忆 dreaming sweep
- config apply 重启唤醒
- config 重启能力切换
- 运行时清单漂移
交付
交付成果
- 保持相同的编写格式,但在需要时使用显式 custom-step block
- 保持相同的编写格式,但在需要时使用显式自定义步骤块
### Phase 6删除硬编码的场景映射
### 第 6 阶段:删除硬编码场景映射
当包覆盖率足够好之后
一旦包覆盖率足够高
- 移除 `extensions/qa-lab/src/suite.ts` 中大部分按场景分支的 TypeScript 逻辑
- 移除 `extensions/qa-lab/src/suite.ts` 中大部分按场景区分的 TypeScript 分支
## Fake Slack / 富媒体支持
当前 QA bus 以文本为主
当前 QA 总线以文本优先
相关文件:
@ -439,17 +444,17 @@ DSL 必须支持保存输出并在后续引用。
- `extensions/qa-lab/src/bus-server.ts`
- `extensions/qa-lab/web/src/ui-render.ts`
当前 QA bus 支持:
如今 QA 总线支持:
- 文本
- reactions
- threads
- 反应
- 线程
还不能对内联媒体附件建模。
尚未对内联媒体附件建模。
### 所需传输契约
### 所需传输契约
添加一个通用 QA bus 附件模型:
添加一个通用 QA 总线附件模型:
```ts
type QaBusAttachment = {
@ -468,7 +473,7 @@ type QaBusAttachment = {
};
```
然后以下类型添加 `attachments?: QaBusAttachment[]`
然后以下类型添加 `attachments?: QaBusAttachment[]`
- `QaBusMessage`
- `QaBusInboundMessageInput`
@ -476,59 +481,59 @@ type QaBusAttachment = {
### 为什么要先做通用模型
不要构建一个仅限 Slack 的媒体模型。
不要构建仅适用于 Slack 的媒体模型。
而应用:
而应使用:
- 一个通用 QA 传输模型
- 在其上构建多个渲染器
- 当前 QA Lab chat
- 在其上构建多个渲染器
- 当前 QA Lab 聊天
- 未来的 fake Slack web
- 任何其他 fake transport 视图
这样可以避免重复逻辑,并让媒体场景保持与传输层无关。
### 所需 UI 工作
### 所需 UI 工作
更新 QA UI,使其能够渲染:
更新 QA UI渲染:
- 内联图预览
- 内联图预览
- 内联音频播放器
- 内联视频播放器
- 文件附件 chip
当前 UI 已经可以渲染 threads 和 reactions因此附件渲染应能叠加到同一套消息卡片模型上。
当前 UI 已经可以渲染线程和反应,因此附件渲染应能叠加到同一消息卡片模型上。
### 媒体传输启用的场景工作
### 媒体传输启用的场景工作
一旦附件可以通过 QA bus 流转,我们就可以添加更丰富的 fake-chat 场景:
一旦附件能通过 QA 总线流转,我们就可以添加更丰富的 fake-chat 场景:
- fake Slack 中的内联图回复
- fake Slack 中的内联图回复
- 音频附件理解
- 视频附件理解
- 混合附件顺序
- 保留媒体的 thread reply
- 保留媒体的线程回复
## 建议
下一块实现工作应当是:
下一个实现阶段应是:
1. 添加 markdown 场景 loader + zod schema
1. 添加 markdown 场景加载器 + zod schema
2. 从 markdown 生成当前目录
3. 先迁移少量简单场景
4. 添加通用 QA bus 附件支持
5. 在 QA UI 中渲染内联图
3. 先迁移几个简单场景
4. 添加通用 QA 总线附件支持
5. 在 QA UI 中渲染内联图
6. 然后扩展到音频和视频
这是同时验证两个目标的最小路径:
这是能够同时验证两个目标的最小路径:
- 通用的 markdown 定义 QA
- 更丰富的 fake messaging surfaces
- 更丰富的 fake messaging 表面
## 开放问题
## 未决问题
- 场景文件是否应允许嵌入带变量插值的 markdown 提示词模板
- setup / cleanup 应该是具名 section还是仅仅使用有序 action 列表
- artifact 引用应在 schema 中强类型化,还是基于字符串
- custom handlers 应放在一个 registry 中,还是按 surface 分 registry
- 迁移期间生成的 JSON 兼容文件是否应继续保留并纳入版本控制
- setup / cleanup 应该是具名章节,还是仅作为有序操作列表
- 工件引用在 schema 中应为强类型,还是基于字符串
- 自定义处理器应放在一个 registry 中,还是按 surface 分 registry
- 迁移期间生成的 JSON 兼容文件是否应继续纳入版本控制