Mantis 是 OpenClaw 的端到端验证系统,用于处理那些需要真实 运行时、真实传输和可见证据的缺陷。它会针对已知的坏 ref 运行一个场景, 捕获证据,再在候选 ref 上运行同一场景,并将比较结果发布为工件, 维护者可以从 PR 或本地命令中进行检查。 Mantis 从 Discord 开始,因为 Discord 为我们提供了一个高价值的首个通道: 真实的 bot 认证、真实的 guild 频道、reaction、thread、原生命令,以及一个 人类可以直观确认传输结果的浏览器 UI。Documentation Index
Fetch the complete documentation index at: https://openclaw.zhcndoc.com/llms.txt
Use this file to discover all available pages before exploring further.
目标
- 使用用户看到的相同传输形态,从 GitHub issue 或 PR 中复现缺陷。
- 在应用修复之前,针对基线 ref 捕获 before 工件。
- 在应用修复之后,针对候选 ref 捕获 after 工件。
- 尽可能使用确定性 oracle,例如 Discord REST reaction 读取或频道转录检查。
- 当缺陷具有可见 UI 表现时捕获截图。
- 既可从 agent 控制的 CLI 在本地运行,也可从 GitHub 远程运行。
- 在登录、浏览器自动化或 provider 认证卡住时,保留足够的机器状态以便通过 VNC 救援。
- 当运行被阻塞、需要人工 VNC 帮助或完成时,向运营者 Discord 频道发布简洁状态。
非目标
- Mantis 不是单元测试的替代品。Mantis 运行在理解修复之后,通常应转化为更小的回归测试。
- Mantis 不是常规的快速 CI 门禁。它更慢,使用真实凭据,仅用于直播环境很重要的缺陷。
- Mantis 不应在正常操作中依赖人工。手动 VNC 是救援路径,而不是正常路径。
- Mantis 不会在工件、日志、截图、Markdown 报告或 PR 评论中存储原始密钥。
所有权
Mantis 位于 OpenClaw QA 栈中。- OpenClaw 负责场景运行时、传输适配器、证据 schema,以及
pnpm openclaw qa mantis下的本地 CLI。 - QA Lab 负责实时传输 harness 组件、浏览器捕获辅助工具和工件写入器。
- Crabbox 在需要远程 VM 时负责预热 Linux 机器。
- GitHub Actions 负责远程工作流入口和工件保留。
- ClawSweeper 负责 GitHub 评论路由:解析维护者命令、调度工作流,并发布最终 PR 评论。
- 当场景需要 agentic 设置、调试或卡住状态报告时,OpenClaw agents 通过 Codex 驱动 Mantis。
命令形态
第一个本地命令会验证 Discord bot、guild、频道、消息发送、reaction 发送以及工件路径:--allow-failures 运行场景,然后写入 baseline/、candidate/、comparison.json 和 mantis-report.md。
对于第一个 Discord 场景,成功验证意味着 baseline 状态为 fail 且 candidate 状态为 pass。
GitHub smoke workflow 是 Mantis Discord Smoke。第一个真实场景的 before and after GitHub
workflow 是 Mantis Discord Status Reactions。它接受:
baseline_ref:预期复现仅队列行为的 ref。candidate_ref:预期展示queued -> thinking -> done的 ref。
discord-status-reactions-tool-only,并将 baseline/、candidate/、comparison.json 和 mantis-report.md
作为 Actions 工件上传。
你也可以直接从 PR 评论触发 status-reactions 运行:
运行生命周期
- 获取凭据。
- 分配或复用一台 VM。
- 为 baseline ref 准备一个干净的 checkout。
- 安装依赖,并且只构建场景需要的内容。
- 启动一个带隔离状态目录的子 OpenClaw Gateway。
- 配置实时传输、provider、模型和浏览器配置文件。
- 运行场景并捕获 baseline 证据。
- 停止 gateway 并保留日志。
- 在同一台 VM 上准备 candidate ref。
- 运行同一场景并捕获 candidate 证据。
- 比较 oracle 结果和视觉证据。
- 写入 Markdown、JSON、日志、截图以及可选的 trace 工件。
- 上传 GitHub Actions 工件。
- 发布简洁的 PR 或 Discord 状态消息。
- 复现了缺陷:baseline 以预期方式失败。
- harness 失败:环境设置、凭据、Discord API、浏览器或 provider 在 bug oracle 有意义之前失败。
Discord MVP
第一个场景应该针对 guild 频道中的 Discord status reactions,其中源回复投递模式为message_tool_only。
为什么它是一个很好的 Mantis 起点:
- 它在 Discord 中以触发消息上的 reaction 形式可见。
- 它通过 Discord 消息 reaction 状态具有很强的 REST oracle。
- 它会涉及真实的 OpenClaw Gateway、Discord bot 认证、消息分发、源回复投递模式、status reaction 状态以及模型轮次生命周期。
- 它足够聚焦,能够确保第一个实现足够严谨。
messages.statusReactions.enabled 明确为 true 时,生命周期 status reactions 正在运行。
可执行的第一步切片是 opt-in 的 Discord live QA 场景:
visibleReplies: "message_tool"、ackReaction: "👀",以及显式 status reactions。oracle 会轮询真实的 Discord 触发消息,并期望观察到序列
👀 -> 🤔 -> 👍。工件包括 discord-qa-reaction-timelines.json、
discord-status-reactions-tool-only-timeline.html 和
discord-status-reactions-tool-only-timeline.png。
现有 QA 组件
Mantis 应当建立在现有的私有 QA 栈之上,而不是从零开始:pnpm openclaw qa discord已经运行了一个带 driver 和 SUT bots 的 live Discord 通道。- live transport runner 已经在
.artifacts/qa-e2e/下写入报告和 observed-message 工件。 - Convex credential lease 已经为共享的 live transport 凭据提供了独占访问。
- 浏览器控制服务已经支持截图、snapshot、headless managed profiles 和远程 CDP profiles。
- QA Lab 已经拥有用于 transport 形态测试的 debugger UI 和 bus。
证据模型
每次运行都会写入一个稳定的工件目录:mantis-summary.json 应该是机器可读的真实来源。Markdown 报告用于 PR 评论和人工审查。
摘要必须包括:
- 已测试的 refs 和 SHAs
- 传输和场景 id
- 机器 provider 和机器 id 或 lease id
- 不包含密钥值的凭据来源
- baseline 结果
- candidate 结果
- 缺陷是否在 baseline 上复现
- candidate 是否修复了它
- 工件路径
- 已净化的设置或清理问题
浏览器与 VNC
浏览器通道有两种模式:- 无头自动化:CI 的默认模式。Chrome 启用 CDP 运行,并且 Playwright 或 OpenClaw 浏览器控制会捕获截图。
- VNC 救援:当登录、MFA、Discord 反自动化, 或可视化调试需要人工介入时,在同一台 VM 上启用。
- 运行 id
- 场景 id
- 机器提供商
- 产物目录
- 如可用,VNC 或 noVNC 连接说明
- 简短的阻塞文本
机器
Mantis 应优先通过 Crabbox 使用 AWS 作为首个远程实现。 Crabbox 为我们提供预热机器、租赁跟踪、hydration、日志、结果和 清理。如果 AWS 容量太慢或不可用,则在相同的机器接口后面添加 Hetzner 提供商。 最低 VM 要求:- Linux,安装带桌面能力的 Chrome 或 Chromium
- 用于浏览器自动化的 CDP 访问
- 用于救援的 VNC 或 noVNC
- Node 22 和 pnpm
- OpenClaw 检出和依赖缓存
- 使用 Playwright 时的 Playwright Chromium 浏览器缓存
- 足够的 CPU 和内存,用于一个 OpenClaw Gateway、一个浏览器和一次模型运行
- 可出站访问 Discord、GitHub、模型提供商以及凭据代理
密钥
远程运行时,密钥存放在 GitHub 组织或仓库 secrets 中;本地运行时,密钥存放在由本地运维人员控制的密钥文件中。 推荐的密钥名称:OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKENOPENCLAW_QA_DISCORD_DRIVER_BOT_TOKENOPENCLAW_QA_DISCORD_SUT_BOT_TOKENOPENCLAW_QA_DISCORD_GUILD_IDOPENCLAW_QA_DISCORD_CHANNEL_IDOPENCLAW_QA_DISCORD_NOTIFY_CHANNEL_IDOPENCLAW_QA_REDACT_PUBLIC_METADATA=1用于公开的 GitHub 产物上传OPENCLAW_QA_CONVEX_SITE_URLOPENCLAW_QA_CONVEX_SECRET_CI
- Discord bot token
- 提供商 API key
- 浏览器 cookie
- 认证配置文件内容
- VNC 密码
- 原始凭据载荷
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1。
如果 token 不小心被粘贴到 issue、PR、聊天或日志中,应在新密钥存储完成后立即轮换。
GitHub 产物与 PR 评论
Mantis 工作流应将完整证据包作为短期有效的 Actions artifact 上传。 当工作流是针对 bug 报告或修复 PR 运行时,它还应将脱敏后的 PNG 截图发布到qa-artifacts 分支,并在该 bug 或修复 PR 上 upsert 一条带有前后对比截图的评论。不要只把主要证据发布到一个通用的 QA 自动化 PR 上。原始日志、观察到的消息以及其他体积较大的证据保留在 Actions artifact 中。
生产工作流应使用 Mantis GitHub App 发布这些评论,而不是使用 github-actions[bot]。将 app id 和私钥分别存为 MANTIS_GITHUB_APP_ID 和 MANTIS_GITHUB_APP_PRIVATE_KEY GitHub Actions secrets。工作流使用隐藏标记作为 upsert key,当 token 可以编辑该评论时更新它;当更旧的 bot-owned 标记无法被编辑时,则创建一条新的、归 Mantis 所有的评论。
PR 评论应简短且以视觉呈现为主:
私有部署说明
私有部署可能已经有一个 Mantis Discord 应用。若该应用拥有正确的 bot 权限并且可以安全轮换,则重用该应用,而不是再创建一个。 通过 secrets 或部署配置设置初始运维通知频道。它可以先指向现有的维护者或运维频道,然后在专门的 Mantis 频道建立后再迁移过去。 不要在本文档中放置 guild id、channel id、bot token、浏览器 cookie 或 VNC 密码。请将它们存放在 GitHub secrets、凭据代理或运维人员的本地密钥存储中。添加场景
一个 Mantis 场景应声明:- id 和标题
- 传输方式
- 所需凭据
- 基线 ref 策略
- 候选 ref 策略
- OpenClaw 配置补丁
- 设置步骤
- 刺激
- 期望的基线 oracle
- 期望的候选 oracle
- 视觉捕获目标
- 超时预算
- 清理步骤
- 对于 reaction 类 bug,使用 Discord reaction 状态
- 对于 threading 类 bug,使用 Discord 消息引用
- 对于 Slack bug,使用 Slack thread ts 和 reaction API 状态
- 对于 email bug,使用 email message id 和 headers
- 当 UI 是唯一可靠可观测项时,使用浏览器截图
提供商扩展
在 Discord 之后,同一个运行器还可以新增:- Slack:reactions、threads、应用提及、modal、文件上传。
- Email:使用
gog进行 Gmail 认证和消息线程化,当 connector 不够用时。 - WhatsApp:QR 登录、重新识别、消息投递、媒体、reactions。
- Telegram:群组提及门控、命令、reactions(如可用)。
- Matrix:加密房间、线程或回复关系、重启恢复。
未决问题
- 当现有的 Mantis bot 被重用时,哪个 Discord bot 应该作为 driver,哪个应该作为 SUT?
- 首个阶段里,observer 浏览器登录应使用真人 Discord 账号、测试账号,还是仅使用 bot 可读的 REST 证据?
- GitHub 应该将 Mantis 用于 PR 的 artifacts 保留多久?
- ClawSweeper 应该何时自动推荐 Mantis,而不是等待维护者命令?
- 对于公开 PR,上传前是否应先对截图进行脱敏或裁剪?