Mantis 是 OpenClaw 端到端验证系统,用于需要真实运行时、真实传输协议和可见证据的 bug。它会针对已知有问题的 ref 运行场景,捕获证据,再针对候选 ref 运行相同场景,并将对比结果发布为工件,维护者可以从 PR 或本地命令中检查这些工件。 Mantis 从 Discord 开始,因为 Discord 为我们提供了一条高价值的首条通道:真实 bot 凭证、真实服务器渠道、reaction、thread、原生命令,以及可供人类直观看到传输协议显示内容的浏览器 UI。Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
目标
- 使用用户看到的相同传输协议形态,复现 GitHub issue 或 PR 中的 bug。
- 在应用修复之前,在基线 ref 上捕获 before 工件。
- 在应用修复之后,在候选 ref 上捕获 after 工件。
- 尽可能使用确定性的判定器,例如 Discord REST reaction 读取或渠道 transcript 检查。
- 当 bug 有可见 UI 表面时捕获截图。
- 从智能体控制的 CLI 本地运行,并从 GitHub 远程运行。
- 当登录、浏览器自动化或提供商凭证卡住时,保留足够的机器状态用于 VNC 救援。
- 当运行被阻塞、需要人工 VNC 帮助或完成时,向 operator Discord 渠道发布简洁 Status。
非目标
- Mantis 不是单元测试的替代品。理解修复后,Mantis 运行通常应该转化为一个更小的回归测试。
- Mantis 不是常规的快速 CI 门禁。它更慢,会使用实时凭证,并且只用于实时环境很重要的 bug。
- Mantis 的正常操作不应该需要人工介入。手动 VNC 是救援路径,而不是正常路径。
- Mantis 不会在工件、日志、截图、Markdown 报告或 PR 评论中存储原始密钥。
归属范围
Mantis 位于 OpenClaw QA 栈中。- OpenClaw 拥有场景运行时、传输协议适配器、证据 schema,以及
pnpm openclaw qa mantis下的本地 CLI。 - QA Lab 拥有实时传输协议 harness 组件、浏览器捕获助手和工件写入器。
- 当需要远程 VM 时,Crabbox 拥有预热的 Linux 机器。
- GitHub Actions 拥有远程 workflow 入口点和工件保留。
- ClawSweeper 拥有 GitHub 评论路由:解析维护者命令、分发 workflow,并发布最终 PR 评论。
- 当场景需要智能体式设置、调试或卡住状态报告时,OpenClaw 智能体通过 Codex 驱动 Mantis。
命令形态
第一个本地命令会验证 Discord bot、服务器、渠道、消息发送、reaction 发送和工件路径:--allow-failures 运行场景,然后写入 baseline/、candidate/、comparison.json 和 mantis-report.md。对于第一个 Discord 场景,成功验证意味着基线 Status 为 fail,候选 Status 为 pass。
第一个 VM/browser 原语是桌面 smoke:
--provider、--crabbox-bin 或 OPENCLAW_MANTIS_CRABBOX_PROVIDER 覆盖。
有用的桌面 smoke 标志:
--lease-id <cbx_...>或OPENCLAW_MANTIS_CRABBOX_LEASE_ID复用已预热的桌面。--browser-url <url>更改可见浏览器中打开的页面。--html-file <path>在可见浏览器中渲染仓库本地 HTML 工件。Mantis 使用它通过真实 Crabbox 桌面捕获生成的 Discord status-reaction 时间线。--keep-lease或OPENCLAW_MANTIS_KEEP_VM=1会让新创建且通过的 lease 保持打开,以便 VNC 检查。失败运行在创建了 lease 时默认保留它,以便 operator 重新连接。--class、--idle-timeout和--ttl调整机器规格和 lease 生命周期。
pnpm openclaw qa slack,在 VNC 浏览器中打开 Slack Web,捕获可见桌面,并将 Slack QA 工件和 VNC 截图都复制回本地输出目录。这是第一个 Mantis 形态,其中 SUT OpenClaw Gateway 网关和浏览器都位于同一个 Linux 桌面 VM 中。
使用 --gateway-setup 时,该命令会在 $HOME/.openclaw-mantis/slack-openclaw 准备一个持久的一次性 OpenClaw home,为选定渠道修补 Slack Socket Mode 配置,在端口 38973 上启动 openclaw gateway run,并让 Chrome 保持运行在 VNC 会话中。这是“给我留一个运行着 Slack 和 claw 的 Linux 桌面”模式;省略 --gateway-setup 时,bot-to-bot Slack QA 通道仍是默认模式。
--credential-source env 的必需输入:
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKEN- 远程模型通道需要
OPENCLAW_LIVE_OPENAI_KEY。如果本地只设置了OPENAI_API_KEY,Mantis 会在调用 Crabbox 前将它映射到OPENCLAW_LIVE_OPENAI_KEY,这样 Crabbox 的OPENCLAW_*环境变量转发就能把它带入 VM。
--lease-id <cbx_...>针对 operator 已经通过 VNC 登录 Slack Web 的机器重新运行。--gateway-setup在 VM 中启动持久 OpenClaw Slack Gateway 网关,而不是只运行 bot-to-bot QA 通道。--slack-url <url>打开指定 Slack Web URL。若未提供,当 SUT bot token 可用时,Mantis 会从 Slackauth.test派生https://app.slack.com/client/<team>/<channel>。--slack-channel-id <id>控制 Gateway 网关设置使用的 Slack 渠道 allowlist。OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIR控制 VM 内的持久 Chrome profile。默认值为$HOME/.config/openclaw-mantis/slack-chrome-profile,因此手动 Slack Web 登录会在同一 lease 的重新运行中保留。--credential-source convex --credential-role ci使用共享凭证池,而不是直接使用 Slack 环境变量 token。--provider-mode、--model、--alt-model和--fast会透传给 Slack 实时通道。
Mantis Discord Smoke。第一个真实场景的 before 和 after GitHub workflow 是 Mantis Discord Status Reactions。它接受:
baseline_ref:预期会复现 queued-only 行为的 ref。candidate_ref:预期会显示queued -> thinking -> done的 ref。
discord-status-reactions-tool-only,并将 baseline/、candidate/、comparison.json 和 mantis-report.md 作为 Actions 工件上传。它还会在 Crabbox 桌面浏览器中渲染每条通道的时间线 HTML,并在 PR 评论中将这些 VNC 截图与确定性的时间线 PNG 一起发布。该 workflow 会从 openclaw/crabbox main 构建 Crabbox CLI,以便在下一个 Crabbox 二进制 release 发布前使用当前桌面/browser lease 标志。
你也可以直接从 PR 评论触发 status-reactions 运行:
运行生命周期
- 获取凭证。
- 分配或复用 VM。
- 当场景需要 UI 证据时,准备桌面/browser profile。
- 为基线 ref 准备干净 checkout。
- 安装依赖,并只构建场景需要的内容。
- 使用隔离状态目录启动子 OpenClaw Gateway 网关。
- 配置实时传输协议、提供商、模型和 browser profile。
- 运行场景并捕获基线证据。
- 停止 Gateway 网关并保留日志。
- 在同一 VM 中准备候选 ref。
- 运行相同场景并捕获候选证据。
- 对比判定器结果和视觉证据。
- 写入 Markdown、JSON、日志、截图和可选 trace 工件。
- 上传 GitHub Actions 工件。
- 发布简洁 PR 或 Discord Status 消息。
- Bug 已复现:基线以预期方式失败。
- Harness 失败:环境设置、凭证、Discord API、浏览器或提供商在 bug 判定器有意义之前失败。
Discord MVP
第一个场景应以源回复投递模式为message_tool_only 的服务器渠道中的 Discord Status reaction 为目标。
它适合作为 Mantis 种子场景的原因:
- 它在 Discord 中以触发消息上的 reaction 可见。
- 它通过 Discord 消息 reaction 状态具备强 REST 判定器。
- 它会覆盖真实 OpenClaw Gateway 网关、Discord bot 凭证、消息分发、源回复投递模式、Status reaction 状态和模型 turn 生命周期。
- 它足够窄,可以让首个实现保持诚实。
messages.statusReactions.enabled 显式为 true 时,生命周期 Status reaction 会运行。
可执行的第一个切片是 opt-in Discord 实时 QA 场景:
visibleReplies: "message_tool"、ackReaction: "👀",以及显式状态 reaction。预言机会轮询真实的 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已经运行带有驱动和 SUT bot 的实时 Discord 通道。- 实时传输运行器已经会在
.artifacts/qa-e2e/下写入报告和观察到的消息工件。 - Convex 凭证租约已经提供对共享实时传输凭证的独占访问。
- 浏览器控制服务已经支持截图、快照、无头托管 profile 和远程 CDP profile。
- QA Lab 已经有用于传输形态测试的调试器 UI 和总线。
证据模型
每次运行都会写入一个稳定的工件目录:mantis-summary.json 应该是机器可读的事实来源。Markdown 报告用于 PR 评论和人工审查。
摘要必须包含:
- 已测试的 ref 和 SHA
- 传输和场景 id
- 机器提供商以及机器 id 或租约 id
- 不含 secret 值的凭证来源
- baseline 结果
- candidate 结果
- bug 是否在 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 checkout 和依赖缓存
- 使用 Playwright 时的 Playwright Chromium 浏览器缓存
- 足够运行一个 OpenClaw Gateway 网关、一个浏览器和一次模型运行的 CPU 和内存
- 能够出站访问 Discord、GitHub、模型提供商和凭证代理
Secret
远程运行的 secret 存在 GitHub 组织或仓库 secret 中,本地运行的 secret 存在由本地 operator 控制的 secret 文件中。 推荐的 secret 名称: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_CIOPENCLAW_QA_MANTIS_CRABBOX_COORDINATOROPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR_TOKEN
CRABBOX_COORDINATOR 和 CRABBOX_COORDINATOR_TOKEN 环境变量。普通的 CRABBOX_* GitHub secret 名称仍会作为兼容 fallback 被接受。
Mantis 运行器绝不能打印:
- Discord bot token
- 提供商 API key
- 浏览器 cookie
- auth profile 内容
- VNC 密码
- 原始凭证 payload
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1。
如果 token 被意外粘贴到 issue、PR、聊天或日志中,请在存储新的 secret 后轮换它。
GitHub 工件和 PR 评论
Mantis 工作流应将完整证据包作为短期 Actions 工件上传。当工作流针对 bug 报告或修复 PR 运行时,还应将脱敏后的 PNG 截图发布到qa-artifacts 分支,并在对应 bug 或修复 PR 上 upsert 一条包含内联 before/after 截图的评论。不要只把主要证明发布到通用 QA 自动化 PR。原始日志、观察到的消息和其他大型证据保留在 Actions 工件中。
生产工作流应使用 Mantis GitHub App 发布这些评论,而不是使用 github-actions[bot]。将 app id 和私钥作为 MANTIS_GITHUB_APP_ID 和 MANTIS_GITHUB_APP_PRIVATE_KEY GitHub Actions secret 存储。工作流使用隐藏标记作为 upsert key,当 token 可以编辑时更新该评论;当较旧的 bot 所有标记无法编辑时,创建一条新的 Mantis 所有评论。
PR 评论应简短且可视化:
私有部署说明
私有部署可能已经有一个 Mantis Discord application。如果该 application 拥有正确的 bot 权限并且可以安全轮换,请复用它,而不是创建另一个 app。 通过 secret 或部署配置设置初始 operator 通知 channel。它可以先指向现有 maintainer 或 operations channel,等专用 Mantis channel 存在后再迁移过去。 不要把 guild id、channel id、bot token、浏览器 cookie 或 VNC 密码放进本文档。将它们存储在 GitHub secret、凭证代理或 operator 的本地 secret 存储中。添加场景
Mantis 场景应声明:- id 和标题
- 传输
- 所需凭证
- baseline ref 策略
- candidate ref 策略
- OpenClaw 配置补丁
- 设置步骤
- 刺激
- 预期 baseline 预言机
- 预期 candidate 预言机
- 视觉捕获目标
- 超时预算
- 清理步骤
- reaction bug 使用 Discord reaction 状态
- threading bug 使用 Discord 消息引用
- Slack bug 使用 Slack thread ts 和 reaction API 状态
- email bug 使用 email message id 和 header
- 当 UI 是唯一可靠可观测对象时使用浏览器截图
提供商扩展
Discord 之后,同一个运行器可以添加:- Slack:reaction、thread、app mention、modal、文件上传。
- Email:在 connector 不足时,使用
gog进行 Gmail auth 和消息 threading。 - WhatsApp:二维码登录、重新识别、消息投递、媒体、reaction。
- Telegram:群组 mention gating、command、可用时的 reaction。
- Matrix:加密房间、thread 或 reply relation、重启恢复。
未决问题
- 复用现有 Mantis bot 时,哪个 Discord bot 应该作为 driver,哪个应该作为 SUT?
- 第一阶段,观察者浏览器登录应使用人类 Discord 账户、测试账户,还是只使用 bot 可读的 REST 证据?
- GitHub 应为 PR 保留 Mantis 工件多长时间?
- ClawSweeper 应在什么时候自动推荐 Mantis,而不是等待 maintainer 命令?
- 公开 PR 上传前,截图是否应该脱敏或裁剪?