Quyền sở hữu
- OpenClaw (
extensions/qa-lab/src/mantis/*): môi trường chạy kịch bản,pnpm openclaw qa mantis <command>CLI, lược đồ bằng chứng. - Phòng kiểm thử QA (
extensions/qa-lab/src/live-transports/*): bộ kiểm thử truyền tải trực tiếp, bot trình điều khiển/SUT, trình ghi báo cáo/bằng chứng. - Crabbox (
openclaw/crabbox): máy Linux đã khởi động sẵn, phiên thuê, VNC,crabbox media preview. - GitHub Actions (
.github/workflows/mantis-*.yml): điểm vào từ xa, lưu giữ artifact. - ClawSweeper: phân tích lệnh PR của người bảo trì, kích hoạt quy trình làm việc, đăng bình luận PR cuối cùng.
Lệnh CLI
Tất cả lệnh đều làpnpm openclaw qa mantis <command>, được định nghĩa trong
extensions/qa-lab/src/mantis/cli.ts. Yêu cầu OPENCLAW_ENABLE_PRIVATE_QA_CLI=1
tại thời điểm xây dựng/chạy (các quy trình làm việc đi kèm đặt OPENCLAW_BUILD_PRIVATE_QA=1 và
OPENCLAW_ENABLE_PRIVATE_QA_CLI=1 trước khi xây dựng).
Mọi lệnh đều chấp nhận
--repo-root <path> và --output-dir <path>; các lệnh Crabbox
cũng chấp nhận --crabbox-bin, --provider, --machine-class/--class,
--lease-id, --idle-timeout, --ttl và --keep-lease. Giá trị mặc định của CLI cục bộ
cho nhà cung cấp/lớp là hetzner/beast trừ khi có ghi chú khác; các quy trình CI
thường ghi đè cả hai.
discord-smoke
https://discord.com/api/v10) để truy xuất người dùng
bot, máy chủ, các kênh của máy chủ và kênh đích, xác nhận rằng
kênh thuộc về máy chủ, rồi (trừ khi --skip-post) đăng một tin nhắn và
thêm phản ứng 👀. Ghi mantis-discord-smoke-summary.json và
mantis-discord-smoke-report.md.
Thứ tự phân giải token: giá trị --token-file, sau đó là OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN
(ghi đè bằng --token-env), rồi đến tệp được đặt tên bởi OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN_FILE
(ghi đè bằng --token-file-env). ID máy chủ/kênh lấy từ
OPENCLAW_QA_DISCORD_GUILD_ID / OPENCLAW_QA_DISCORD_CHANNEL_ID (ghi đè bằng
--guild-id / --channel-id) và phải là snowflake Discord gồm 17-20 chữ số. Đặt
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 để thay thế ID và tên bot/máy chủ/kênh/tin nhắn
bằng <redacted> trong bản tóm tắt và báo cáo được công bố.
run
--transport hiện chỉ chấp nhận discord. --scenario là một trong hai
ID tích hợp sẵn, mỗi ID có ref đường cơ sở mặc định và nhãn trước/sau dự kiến
riêng (extensions/qa-lab/src/mantis/run.runtime.ts):
--candidate mặc định là HEAD. Các cờ khác: --credential-source
(mặc định convex), --credential-role (mặc định ci), --provider-mode
(mặc định live-frontier), --fast (bật theo mặc định), --skip-install, --skip-build.
Trình chạy tạo các bản checkout git worktree tách rời cho đường cơ sở và
ứng viên trong <output-dir>/worktrees/, chạy pnpm install/pnpm build trong
từng bản (trừ khi bị bỏ qua), rồi chạy
pnpm openclaw qa discord --scenario <id> --model openai/gpt-5.4 --alt-model openai/gpt-5.4 --allow-failures
với từng cây làm việc. Mỗi luồng ghi discord-qa-reaction-timelines.json
cùng một cặp <scenario-id>-timeline.html/.png; trình chạy sao chép
bằng chứng này trở lại dưới baseline//candidate/, ghi comparison.json,
mantis-report.md và mantis-evidence.json vào thư mục đầu ra, đồng thời
thoát với mã khác 0 nếu phép so sánh không đạt (đường cơ sở fail và ứng viên
pass).
Kịch bản Discord thứ hai (discord-thread-reply-filepath-attachment) đăng
một tin nhắn mẹ bằng bot trình điều khiển, tạo một luồng thực, gọi hành động
message.thread-reply của SUT với một filePath cục bộ trong kho mã, rồi thăm dò
luồng để tìm câu trả lời và tên tệp đính kèm. Kịch bản mong đợi một tệp đính kèm
có tên mantis-thread-report.md.
desktop-browser-smoke
--browser-url (mặc định https://openclaw.ai) hoặc một
--html-file đã kết xuất, chờ, chụp ảnh màn hình bằng scrot, tùy chọn quay MP4 bằng
ffmpeg và đồng bộ rsync desktop-browser-smoke.png / .mp4 / remote-metadata.json
trở lại --output-dir.
Các cờ:
--lease-id <cbx_...>tái sử dụng một máy tính đã khởi động sẵn thay vì tạo máy mới.--browser-profile-dir <remote-path>tái sử dụng thư mục dữ liệu người dùng Chrome từ xa để một máy tính lâu dài duy trì trạng thái đăng nhập giữa các lần chạy (dùng cho hồ sơ người xem Discord Web lâu dài).--browser-profile-archive-env <name>khôi phục kho lưu trữ hồ sơ Chrome.tgzdạng base64 từ biến môi trường đó trước khi khởi chạy (mặc địnhOPENCLAW_MANTIS_BROWSER_PROFILE_TGZ_B64); dùng cho các nhân chứng đã đăng nhập như Discord Web.--video-duration <seconds>kiểm soát thời lượng quay MP4 (mặc định 10s).--keep-lease(hoặcOPENCLAW_MANTIS_KEEP_VM=1) giữ mở phiên thuê được tạo trong lần chạy này để kiểm tra qua VNC; theo mặc định, các lần chạy thất bại đã tạo phiên thuê cũng giữ phiên đó.
qa discord) vẫn là nguồn có thẩm quyền; khi
đặt OPENCLAW_QA_DISCORD_CAPTURE_UI_METADATA=1, kịch bản cũng ghi một
artifact URL Discord Web, và OPENCLAW_QA_DISCORD_KEEP_THREADS=1 giữ
luồng mở đủ lâu để trình duyệt mở luồng đó.
Quy trình làm việc GitHub ưu tiên hồ sơ người xem lâu dài qua
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR (kho lưu trữ hồ sơ đầy đủ có thể vượt quá
giới hạn kích thước secret của GitHub); đối với các hồ sơ nhỏ/khởi tạo, quy trình có thể khôi phục một
.tgz dạng base64 từ MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64 thay thế. Khi
không cấu hình nguồn nào, quy trình vẫn công bố ảnh chụp màn hình đường cơ sở/ứng viên
có tính xác định và ghi nhật ký rằng nhân chứng đã đăng nhập đã bị
bỏ qua.
slack-desktop-smoke
pnpm openclaw qa slack bên trong, mở Slack Web trong trình duyệt VNC,
chụp máy tính và sao chép cả artifact QA Slack (slack-qa/) lẫn
ảnh chụp màn hình/video VNC trở lại máy cục bộ. Đây là cấu hình Mantis duy nhất mà
cả Gateway SUT và trình duyệt đều chạy trong cùng một VM.
Với --gateway-setup, lệnh tạo một thư mục chính OpenClaw dùng một lần nhưng lâu dài
tại $HOME/.openclaw-mantis/slack-openclaw trong VM, vá cấu hình Slack
Socket Mode cho kênh đích, khởi động
openclaw gateway run --dev --allow-unconfigured --port 38973 và giữ
Chrome chạy trong phiên VNC; bỏ --gateway-setup sẽ chạy luồng QA Slack
bot-với-bot thông thường thay thế.
Biến môi trường bắt buộc cho --credential-source env (mặc định cục bộ là env; vai trò
mặc định là maintainer):
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKENOPENCLAW_LIVE_OPENAI_KEYcho luồng mô hình từ xa (nếu chỉ đặtOPENAI_API_KEYcục bộ, Mantis sao chép giá trị đó vàoOPENCLAW_LIVE_OPENAI_KEYtrước khi gọi Crabbox)
--credential-source convex, Mantis thuê thông tin xác thực SUT Slack từ
nhóm dùng chung trước khi tạo VM và chuyển tiếp ID kênh, token ứng dụng và
token bot vào VM dưới dạng các biến môi trường OPENCLAW_MANTIS_SLACK_*, nhờ đó các quy trình làm việc GitHub
chỉ cần secret của trình môi giới Convex, không cần token Slack thô.
Các cờ khác: --slack-url <url> mở một URL cụ thể (nếu không, Mantis suy ra
https://app.slack.com/client/<team>/<channel> từ auth.test);
--slack-channel-id <id> đặt kênh trong danh sách cho phép của Gateway;
OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIR kiểm soát hồ sơ Chrome lâu dài
trong VM (mặc định $HOME/.config/openclaw-mantis/slack-chrome-profile);
--approval-checkpoints chạy các kịch bản phê duyệt Slack gốc
(slack-approval-exec-native, slack-approval-plugin-native) và kết xuất
ảnh chụp màn hình điểm kiểm tra đang chờ/đã giải quyết thay vì thiết lập Gateway (loại trừ
lẫn nhau với --gateway-setup); --hydrate-mode source|prehydrated,
--provider-mode, --model, --alt-model và --fast được chuyển tiếp đến
luồng Slack trực tiếp.
Ảnh chụp màn hình điểm kiểm tra phê duyệt được kết xuất từ tin nhắn API Slack mà
kịch bản quan sát được, không phải giao diện Slack trực tiếp; slack-desktop-smoke.png chỉ là
bằng chứng của chính Slack Web khi hồ sơ trình duyệt của phiên thuê đã đăng
nhập.
telegram-desktop-builder
openclaw gateway run --dev --allow-unconfigured --port 38974, đăng một
tin nhắn sẵn sàng của bot trình điều khiển vào nhóm riêng đã thuê, rồi chụp
ảnh màn hình và MP4. Token bot chỉ cấu hình OpenClaw; nó không bao giờ đăng nhập
Telegram Desktop. Trình xem trên máy tính là một phiên người dùng Telegram riêng biệt
được khôi phục từ --telegram-profile-archive-env <name> hoặc đăng nhập thủ công
qua VNC và được duy trì bằng --keep-lease.
Các cờ: --lease-id <cbx_...> chạy lại trên một VM đã đăng nhập vào
Telegram Desktop; --telegram-profile-archive-env <name> khôi phục một kho lưu trữ hồ sơ
.tgz dạng base64 trước khi khởi chạy; --telegram-profile-dir <remote-path>
đặt thư mục hồ sơ từ xa (mặc định $HOME/.local/share/TelegramDesktop);
--no-gateway-setup chỉ cài đặt và mở Telegram Desktop;
--credential-source/--credential-role mặc định là convex/maintainer.
Manifest bằng chứng
Mọi kịch bản xuất bản lên PR đều ghimantis-evidence.json bên cạnh
báo cáo của kịch bản:
path của hiện vật là tương đối so với thư mục của tệp kê khai; targetPath là
tương đối so với tiền tố hiện vật R2/S3 đã cấu hình. scripts/mantis/publish-pr-evidence.mjs
từ chối việc duyệt xuyên đường dẫn và bỏ qua các mục có "required": false khi
tệp bị thiếu.
Các loại hiện vật: timeline (ảnh chụp màn hình trước/sau có tính xác định),
desktopScreenshot (ảnh chụp màn hình VNC/trình duyệt), motionPreview (GIF động nội tuyến
từ bản ghi), motionClip (MP4 được cắt theo chuyển động), fullVideo (toàn bộ
bản ghi), metadata (tệp phụ JSON/nhật ký), report (báo cáo Markdown).
Bố cục hiện vật trên đĩa của một lần chạy:
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 cho các lượt tải hiện vật công khai lên; tùy chọn này
được bật theo mặc định trong các quy trình GitHub Discord/Slack/Telegram.
Tự động hóa GitHub
scripts/mantis/publish-pr-evidence.mjs là trình xuất bản có thể tái sử dụng. Các quy trình
gọi trình này với tệp kê khai, PR đích, thư mục gốc đích của hiện vật, dấu mốc bình luận,
URL hiện vật, URL lần chạy và nguồn yêu cầu. Trình này tải các hiện vật đã khai báo lên
bucket Mantis R2, tạo một bình luận PR ưu tiên phần tóm tắt với hình ảnh/bản xem trước
nội tuyến và video được liên kết, sau đó cập nhật bình luận có dấu mốc hiện có hoặc
tạo bình luận mới. Các biến môi trường bắt buộc:
MANTIS_ARTIFACT_R2_ACCESS_KEY_IDMANTIS_ARTIFACT_R2_SECRET_ACCESS_KEYMANTIS_ARTIFACT_R2_BUCKET(các quy trình đặtopenclaw-crabbox-artifacts)MANTIS_ARTIFACT_R2_ENDPOINTMANTIS_ARTIFACT_R2_REGION(các quy trình đặtauto)MANTIS_ARTIFACT_R2_PUBLIC_BASE_URL(các quy trình đặthttps://artifacts.openclaw.ai)
MANTIS_GITHUB_APP_ID /
MANTIS_GITHUB_APP_PRIVATE_KEY), không phải github-actions[bot], sử dụng một
bình luận dấu mốc ẩn làm khóa upsert.
Cả
Mantis Discord Status Reactions và Mantis Telegram Live đều chấp nhận
baseline_ref/candidate_ref (hoặc baseline=/candidate= trong bình luận PR)
và xác thực rằng SHA đã phân giải là tổ tiên của origin/main, một
thẻ phát hành (v*) hoặc head của một PR đang mở trước khi chạy
với thông tin xác thực chứa bí mật.
Các lệnh kích hoạt bằng bình luận từ một PR có quyền write/maintain/admin:
telegram-status-command làm kịch bản; chúng chấp nhận provider=aws|hetzner và
lease=<cbx_...> để nhắm đến một nhà cung cấp Crabbox cụ thể hoặc một
máy tính đã được làm nóng trước. Mantis Telegram Desktop Proof chỉ phản hồi bình luận PR khi
PR đã có nhãn mantis: telegram-visible-proof.
Các lệnh kích hoạt cuộc trò chuyện Web UI bằng bình luận mặc định dùng SHA head của PR làm ứng viên. Chúng chạy
bằng chứng trò chuyện Control UI với Gateway mô phỏng và xuất bản hiện vật trình duyệt; hãy dùng
bằng chứng Playwright/trình duyệt thông thường, ảnh chụp màn hình của người bảo trì, Crabbox hoặc hiện vật
cục bộ cho các trang web và bề mặt ứng dụng gốc khác.
ClawSweeper cũng có thể điều phối trực tiếp một kịch bản:
Máy và bí mật
Các giá trị mặc định Crabbox của CLI cục bộ là--provider hetzner --class beast; ghi đè
bằng --provider, --class/--machine-class hoặc
OPENCLAW_MANTIS_CRABBOX_PROVIDER / OPENCLAW_MANTIS_CRABBOX_CLASS. Các quy trình GitHub
thường ghi đè cả hai (ví dụ --class standard và dữ liệu đầu vào lựa chọn nhà cung cấp
aws/hetzner của quy trình Slack). Nếu một nhà cung cấp quá
chậm hoặc không khả dụng, hãy thêm nhà cung cấp đó phía sau cùng giao diện Crabbox thay vì
mã hóa cứng phương án dự phòng.
Đường cơ sở máy ảo: Linux với Chrome/Chromium có khả năng chạy giao diện máy tính, quyền truy cập CDP, VNC/
noVNC, Node 22.22.3+, 24.15+ hoặc 25.9+ và pnpm, một checkout OpenClaw và
quyền truy cập ra ngoài đến phương tiện vận chuyển đích, GitHub, các nhà cung cấp mô hình và
trình môi giới thông tin xác thực.
Tên thông tin xác thực và biến môi trường được sử dụng trong các lệnh và quy trình Mantis:
OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKENOPENCLAW_QA_DISCORD_GUILD_IDOPENCLAW_QA_DISCORD_CHANNEL_IDqa mantis run --credential-source envcục bộ cũng yêu cầuOPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN,OPENCLAW_QA_DISCORD_SUT_BOT_TOKENvàOPENCLAW_QA_DISCORD_SUT_APPLICATION_ID. Các quy trình GitHub thường sử dụng--credential-source convexvà thông tin xác thực của trình môi giới bên dưới thay cho token bot Discord thô.OPENCLAW_QA_REDACT_PUBLIC_METADATA=1cho các lượt tải hiện vật công khai lênOPENCLAW_QA_CONVEX_SITE_URL,OPENCLAW_QA_CONVEX_SECRET_CIOPENAI_API_KEY(hoặc biến dành riêng cho bằng chứng Telegram DesktopOPENCLAW_MANTIS_AGENT_OPENAI_API_KEY)CRABBOX_COORDINATOR/CRABBOX_COORDINATOR_TOKEN(các quy trình cũng chấp nhậnOPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR/_TOKENlàm phương án dự phòng và ánh xạ chúng sang các tên thuần túy trước khi gọi Crabbox)CRABBOX_ACCESS_CLIENT_ID,CRABBOX_ACCESS_CLIENT_SECRETMANTIS_GITHUB_APP_ID,MANTIS_GITHUB_APP_PRIVATE_KEY
Kết quả chạy
Các kịch bản phương tiện vận chuyển trước/sau phân biệt những kết quả này để môi trường không ổn định không bị hiểu là hồi quy sản phẩm:- Đã tái hiện lỗi: đường cơ sở thất bại theo cách mà kịch bản dự kiến.
- Lỗi bộ thử nghiệm: thiết lập môi trường, thông tin xác thực, API phương tiện vận chuyển, trình duyệt hoặc nhà cung cấp thất bại trước khi bộ tiên tri có ý nghĩa.
Thêm một kịch bản
Các kịch bản phương tiện vận chuyển trực tiếp được định nghĩa bằng TypeScript cho từng phương tiện (xemMANTIS_SCENARIO_CONFIGS trong extensions/qa-lab/src/mantis/run.runtime.ts để biết
cấu trúc trước/sau của Discord), không phải một định dạng tệp khai báo độc lập.
Mỗi kịch bản cần có: id và tiêu đề, phương tiện vận chuyển, thông tin xác thực bắt buộc, chính sách
ref đường cơ sở, chính sách ref ứng viên, bản vá cấu hình OpenClaw, các bước thiết lập/kích thích,
bộ tiên tri dự kiến cho đường cơ sở và ứng viên, mục tiêu chụp hình ảnh, ngân sách
thời gian chờ và các bước dọn dẹp.
Bằng chứng trình duyệt tập trung chỉ dành cho ứng viên có thể sử dụng một bài kiểm thử E2E chuyên dụng
có tính xác định và quy trình riêng. Hãy nêu rõ phạm vi, xác thực ref ứng viên trước khi
thực thi, cô lập việc xuất bản dùng bí mật và phát ra cùng hợp đồng tệp kê khai
bằng chứng.
Ưu tiên các bộ tiên tri nhỏ, có kiểu thay vì kiểm tra bằng thị giác: trạng thái phản ứng Discord hoặc
tham chiếu tin nhắn, trạng thái API ts/phản ứng của luồng Slack, id
và tiêu đề thư email. Dùng ảnh chụp màn hình trình duyệt khi UI là đối tượng quan sát đáng tin cậy duy nhất
và giữ các kiểm tra bằng thị giác ở dạng bổ sung cho bộ tiên tri API nền tảng nếu có.
Sau Discord, Slack và Telegram, cùng cấu trúc trình chạy này có thể mở rộng sang WhatsApp
(đăng nhập bằng QR, nhận dạng lại, phân phối, phương tiện, phản ứng) và Matrix
(phòng được mã hóa, quan hệ luồng/trả lời, tiếp tục sau khi khởi động lại); cả hai
đều chưa được triển khai.
Câu hỏi chưa giải đáp
- Bot Discord nào nên đóng vai trò trình điều khiển và bot nào nên là SUT khi tái sử dụng bot Mantis hiện có?
- GitHub nên lưu giữ các artifact Mantis cho PR trong bao lâu?
- Khi nào ClawSweeper nên tự động đề xuất một kịch bản Mantis thay vì chờ lệnh của người bảo trì?
- Có nên che thông tin nhạy cảm hoặc cắt ảnh chụp màn hình trước khi tải lên các PR công khai không?