extensions/qa-channel: kanal pesan sintetis dengan permukaan DM, kanal, thread, reaksi, edit, dan hapus.extensions/qa-lab: UI debugger dan bus QA untuk mengamati transkrip, menyuntikkan pesan masuk, dan mengekspor laporan Markdown.extensions/qa-matrix, plugin runner mendatang: adaptor transport langsung yang menggerakkan kanal nyata di dalam gateway QA turunan.qa/: aset seed berbasis repo untuk tugas kickoff dan skenario QA baseline.- Mantis: verifikasi langsung sebelum dan sesudah untuk bug yang membutuhkan transport nyata, tangkapan layar browser, status VM, dan bukti PR.
Permukaan perintah
Setiap alur QA berjalan di bawahpnpm openclaw qa <subcommand>. Banyak yang memiliki alias skrip pnpm qa:*;
kedua bentuk didukung.
| Perintah | Tujuan |
|---|---|
qa run | Pemeriksaan mandiri QA bawaan tanpa --qa-profile; runner profil kematangan berbasis taksonomi dengan --qa-profile smoke-ci, --qa-profile release, atau --qa-profile all. |
qa suite | Jalankan skenario berbasis repo terhadap jalur gateway QA. Alias: pnpm openclaw qa suite --runner multipass untuk VM Linux sekali pakai. |
qa coverage | Cetak inventaris cakupan skenario YAML (--json untuk keluaran mesin). |
qa parity-report | Bandingkan dua berkas qa-suite-summary.json dan tulis laporan paritas agentik, atau gunakan --runtime-axis --token-efficiency untuk menulis laporan paritas runtime Codex-vs-OpenClaw dan efisiensi token dari satu ringkasan pasangan runtime. |
qa character-eval | Jalankan skenario QA karakter di beberapa model langsung dengan laporan yang dinilai. Lihat Pelaporan. |
qa manual | Jalankan prompt sekali jalan terhadap jalur penyedia/model yang dipilih. |
qa ui | Mulai UI debugger QA dan bus QA lokal (alias: pnpm qa:lab:ui). |
qa docker-build-image | Bangun image Docker QA yang sudah dipra-panggang. |
qa docker-scaffold | Tulis scaffold docker-compose untuk dasbor QA + jalur gateway. |
qa up | Bangun situs QA, mulai tumpukan berbasis Docker, cetak URL (alias: pnpm qa:lab:up; varian :fast menambahkan --use-prebuilt-image --bind-ui-dist --skip-ui-build). |
qa aimock | Mulai hanya server penyedia AIMock. |
qa mock-openai | Mulai hanya server penyedia mock-openai yang sadar skenario. |
qa credentials doctor / add / list / remove | Kelola pool kredensial Convex bersama. |
qa matrix | Jalur transport langsung terhadap homeserver Tuwunel sekali pakai. Lihat QA Matrix. |
qa telegram | Jalur transport langsung terhadap grup Telegram privat nyata. |
qa discord | Jalur transport langsung terhadap kanal guild Discord privat nyata. |
qa slack | Jalur transport langsung terhadap kanal Slack privat nyata. |
qa whatsapp | Jalur transport langsung terhadap akun WhatsApp Web nyata. |
qa mantis | Runner verifikasi sebelum dan sesudah untuk bug transport langsung, dengan bukti reaksi-status Discord, smoke desktop/browser Crabbox, dan smoke Slack-dalam-VNC. Lihat Mantis dan Runbook Desktop Slack Mantis. |
qa run berbasis profil membaca keanggotaan dari taxonomy.yaml, lalu mendispatch
skenario yang diselesaikan melalui qa suite. --surface dan
--category memfilter profil yang dipilih alih-alih mendefinisikan jalur terpisah.
qa-evidence.json yang dihasilkan mencakup ringkasan scorecard profil dengan
jumlah kategori yang dipilih dan ID cakupan yang hilang; entri bukti individual
tetap menjadi sumber kebenaran untuk pengujian, peran cakupan, dan hasil.
ID cakupan fitur taksonomi adalah target bukti yang tepat, bukan alias. Cakupan
skenario primer memenuhi ID yang cocok; cakupan sekunder tetap bersifat saran.
ID cakupan menggunakan bentuk bertitik namespace.behavior dengan segmen
alfanumerik/tanda hubung huruf kecil; ID profil, permukaan, dan kategori masih dapat menggunakan
ID taksonomi bertanda hubung atau bertitik yang sudah ada.
Bukti ramping menghilangkan execution per entri dan menetapkan evidenceMode: "slim";
smoke-ci default ke ramping, dan --evidence-mode full memulihkan entri lengkap:
smoke-ci untuk bukti profil deterministik dengan penyedia model mock dan
server penyedia lokal Crabline. Gunakan release untuk bukti Stable/LTS terhadap kanal langsung.
Gunakan all hanya untuk eksekusi bukti taksonomi penuh yang eksplisit; ini memilih
setiap kategori kematangan aktif dan dapat didispatch melalui workflow QA Profile Evidence dengan qa_profile=all. Ketika sebuah perintah juga memerlukan profil root OpenClaw,
letakkan profil root sebelum perintah QA:
Alur operator
Alur operator QA saat ini adalah situs QA dua panel:- Kiri: dasbor Gateway (Control UI) dengan agen.
- Kanan: QA Lab, menampilkan transkrip bergaya Slack dan rencana skenario.
qa:lab:up:fast menjaga layanan Docker pada image yang sudah dibangun dan melakukan bind mount
extensions/qa-lab/web/dist ke dalam kontainer qa-lab. qa:lab:watch
membangun ulang bundel tersebut saat ada perubahan, dan browser memuat ulang otomatis ketika hash aset QA Lab berubah.
Untuk smoke sinyal OpenTelemetry lokal, jalankan:
otel-trace-smoke
dengan plugin diagnostics-otel diaktifkan, lalu menegaskan bahwa trace,
metrik, dan log diekspor. Skrip ini mendekode span trace protobuf yang diekspor
dan memeriksa bentuk kritis rilis:
openclaw.run, openclaw.harness.run, span pemanggilan model konvensi semantik GenAI terbaru,
openclaw.context.assembled, dan openclaw.message.delivery
harus ada. Smoke memaksa
OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental, sehingga span pemanggilan model
harus menggunakan nama {gen_ai.operation.name} {gen_ai.request.model};
pemanggilan model tidak boleh mengekspor StreamAbandoned pada giliran yang berhasil; ID diagnostik mentah dan
atribut openclaw.content.* harus tetap di luar trace. Payload OTLP mentah
tidak boleh berisi sentinel prompt, sentinel respons, atau kunci sesi QA.
Skrip ini menulis otel-smoke-summary.json di sebelah artefak suite QA.
Untuk smoke OpenTelemetry yang didukung kolektor, jalankan:
docker-prometheus-smoke dengan
diagnostics-prometheus diaktifkan, memverifikasi scrape tanpa autentikasi ditolak,
lalu memeriksa bahwa scrape terautentikasi menyertakan keluarga metrik yang kritis
untuk rilis tanpa konten prompt, konten respons, pengidentifikasi diagnostik mentah,
token auth, atau path lokal.
Untuk menjalankan kedua observability smoke secara berurutan, gunakan:
qa. Gunakan
pnpm qa:otel:smoke, pnpm qa:prometheus:smoke, atau
pnpm qa:observability:smoke dari checkout sumber yang sudah dibangun saat mengubah
instrumentasi diagnostik.
Untuk jalur smoke Matrix dengan transport nyata yang tidak memerlukan kredensial
penyedia model, jalankan profil cepat dengan penyedia OpenAI mock deterministik:
qa-channel), lalu menulis laporan Markdown, ringkasan JSON, artefak observed-events, dan log output gabungan di bawah .artifacts/qa-e2e/matrix-<timestamp>/.
Skenario mencakup perilaku transport yang tidak dapat dibuktikan unit test secara end to end: penyaringan mention, kebijakan allow-bot, allowlist, balasan tingkat atas dan berutas, perutean DM, penanganan reaksi, penekanan edit masuk, dedupe replay setelah restart, pemulihan gangguan homeserver, pengiriman metadata persetujuan, penanganan media, serta alur bootstrap/pemulihan/verifikasi E2EE Matrix. Profil CLI E2EE juga menjalankan openclaw matrix encryption setup dan perintah verifikasi melalui homeserver sekali pakai yang sama sebelum memeriksa balasan Gateway.
Discord juga memiliki skenario opt-in khusus Mantis untuk reproduksi bug. Gunakan
--scenario discord-status-reactions-tool-only untuk timeline reaksi status eksplisit,
atau --scenario discord-thread-reply-filepath-attachment untuk membuat utas Discord
nyata dan memverifikasi bahwa message.thread-reply mempertahankan lampiran
filePath. Skenario ini tidak masuk ke jalur live Discord default karena merupakan
probe reproduksi sebelum/sesudah, bukan cakupan smoke yang luas.
Workflow Mantis thread-attachment juga dapat menambahkan video saksi Discord Web yang
sudah login saat MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR atau
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64 dikonfigurasi di lingkungan QA.
Profil viewer tersebut hanya untuk tangkapan visual; keputusan lulus/gagal tetap
berasal dari oracle REST Discord.
CI menggunakan permukaan perintah yang sama di .github/workflows/qa-live-transports-convex.yml.
Jalankan terjadwal dan manual default mengeksekusi profil Matrix cepat dengan
kredensial live-frontier yang disediakan QA, --fast, dan
OPENCLAW_QA_MATRIX_NO_REPLY_WINDOW_MS=3000. Manual matrix_profile=all melakukan fan-out
ke lima shard profil.
Untuk jalur smoke Telegram, Discord, Slack, dan WhatsApp dengan transport nyata:
slack-qa/, slack-desktop-smoke.png, dan slack-desktop-smoke.mp4 saat
tangkapan video tersedia kembali ke direktori artefak Mantis. Sewa desktop/browser
Crabbox menyediakan alat tangkap dan paket pembantu browser/native-build sejak awal,
sehingga skenario hanya perlu menginstal fallback pada sewa yang lebih lama. Mantis
melaporkan waktu total dan per fase di mantis-slack-desktop-smoke-report.md sehingga
run yang lambat menunjukkan apakah waktu digunakan untuk pemanasan sewa, akuisisi
kredensial, setup jarak jauh, atau penyalinan artefak. Gunakan kembali
--lease-id <cbx_...> setelah login ke Slack Web secara manual melalui VNC;
sewa yang digunakan kembali juga menjaga cache pnpm store Crabbox tetap hangat. Default
--hydrate-mode source memverifikasi dari checkout sumber dan menjalankan install/build
di dalam VM. Gunakan --hydrate-mode prehydrated hanya saat workspace jarak jauh yang
digunakan kembali sudah memiliki node_modules dan dist/ yang sudah dibangun; mode
tersebut melewati langkah install/build yang mahal dan gagal tertutup saat workspace
belum siap. Dengan --gateway-setup, Mantis membiarkan Gateway Slack OpenClaw persisten
berjalan di dalam VM pada port 38973; tanpanya, perintah menjalankan jalur QA Slack
bot-ke-bot normal dan keluar setelah tangkapan artefak.
Untuk membuktikan UI persetujuan native Slack dengan bukti desktop, jalankan mode
checkpoint persetujuan Mantis:
--gateway-setup. Mode ini menjalankan skenario
persetujuan Slack, menolak id skenario non-persetujuan, menunggu pada setiap status
persetujuan tertunda dan terselesaikan, merender pesan Slack API yang diamati ke
approval-checkpoints/<scenario>-pending.png dan
approval-checkpoints/<scenario>-resolved.png, lalu gagal jika ada checkpoint,
bukti pesan, acknowledgment, atau screenshot hasil render yang hilang atau kosong.
Sewa CI dingin masih dapat menampilkan sign-in Slack di slack-desktop-smoke.png;
gambar checkpoint persetujuan adalah bukti visual untuk jalur ini.
Checklist operator, perintah dispatch workflow GitHub, kontrak komentar bukti,
tabel keputusan hydrate-mode, interpretasi waktu, dan langkah penanganan kegagalan
tersedia di Runbook Desktop Slack Mantis.
Untuk tugas desktop gaya agent/CV, jalankan:
visual-task menyewa atau menggunakan kembali mesin desktop/browser Crabbox, memulai
crabbox record --while, mengendalikan browser yang terlihat melalui
visual-driver bersarang, menangkap visual-task.png, menjalankan
openclaw infer image describe terhadap screenshot saat --vision-mode image-describe
dipilih, dan menulis visual-task.mp4, mantis-visual-task-summary.json,
mantis-visual-task-driver-result.json, serta mantis-visual-task-report.md.
Saat --expect-text diatur, prompt vision meminta verdict JSON terstruktur dan hanya
lulus saat model melaporkan bukti terlihat yang positif; respons negatif yang hanya
mengutip teks target menggagalkan assertion. Gunakan --vision-mode metadata untuk
smoke tanpa model yang membuktikan plumbing desktop, browser, screenshot, dan video
tanpa memanggil penyedia pemahaman gambar. Rekaman adalah artefak wajib untuk
visual-task; jika Crabbox tidak merekam visual-task.mp4 yang tidak kosong, tugas
gagal meskipun visual driver lulus. Saat gagal, Mantis mempertahankan sewa untuk VNC
kecuali tugas sudah lulus dan --keep-lease tidak diatur.
Sebelum menggunakan kredensial live yang dipool, jalankan:
Cakupan transport live
Jalur transport live berbagi satu kontrak alih-alih masing-masing membuat bentuk daftar skenarionya sendiri.qa-channel adalah suite perilaku produk sintetis yang luas dan bukan bagian dari matriks cakupan transport live.
Runner transport live harus mengimpor id skenario bersama, helper cakupan
baseline, dan helper pemilihan skenario dari
openclaw/plugin-sdk/qa-live-transport-scenarios.
| Jalur | Canary | Penyaringan mention | Bot-ke-bot | Blok allowlist | Balasan tingkat atas | Balasan kutipan | Lanjutkan setelah restart | Tindak lanjut utas | Isolasi utas | Observasi reaksi | Perintah bantuan | Pendaftaran perintah native |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Matrix | x | x | x | x | x | x | x | x | x | |||
| Telegram | x | x | x | x | ||||||||
| Discord | x | x | x | x | ||||||||
| Slack | x | x | x | x | x | x | x | x | ||||
| x | x | x | x | x | x | x | x |
qa-channel sebagai suite perilaku produk yang luas sementara Matrix,
Telegram, dan transport live lainnya berbagi satu checklist kontrak transport yang eksplisit.
Untuk jalur VM Linux sekali pakai tanpa membawa Docker ke path QA, jalankan:
qa suite, lalu menyalin laporan QA normal dan
ringkasan kembali ke .artifacts/qa-e2e/... pada host.
Ini menggunakan kembali perilaku pemilihan skenario yang sama seperti qa suite pada host.
Run suite host dan Multipass mengeksekusi beberapa skenario terpilih secara paralel
dengan worker Gateway terisolasi secara default. qa-channel default ke concurrency
4, dibatasi oleh jumlah skenario yang dipilih. Gunakan --concurrency <count> untuk
menyetel jumlah worker, atau --concurrency 1 untuk eksekusi serial.
Gunakan --pack personal-agent untuk menjalankan pack benchmark asisten pribadi. Selector
pack bersifat aditif dengan flag --scenario berulang: skenario eksplisit berjalan
terlebih dahulu, lalu skenario pack berjalan sesuai urutan pack dengan duplikat dihapus.
Gunakan --pack observability saat runner QA kustom sudah menyediakan setup collector
OpenTelemetry dan ingin skenario smoke diagnostik OpenTelemetry serta Prometheus dipilih
bersama.
Perintah keluar non-zero saat ada skenario yang gagal. Gunakan --allow-failures saat
Anda menginginkan artefak tanpa kode keluar gagal.
Run live meneruskan input auth QA yang didukung dan praktis untuk guest: key penyedia
berbasis env, path konfigurasi penyedia live QA, dan CODEX_HOME saat ada. Pertahankan
--output-dir di bawah root repo agar guest dapat menulis balik melalui workspace yang
di-mount.
Referensi QA Telegram, Discord, Slack, dan WhatsApp
Matrix memiliki halaman khusus karena jumlah skenarionya dan penyediaan homeserver berbasis Docker. Telegram, Discord, Slack, dan WhatsApp berjalan terhadap transport nyata yang sudah ada, sehingga referensinya berada di sini.Flag CLI bersama
Lane ini mendaftar melaluiextensions/qa-lab/src/live-transports/shared/live-transport-cli.ts dan menerima flag yang sama:
| Flag | Default | Deskripsi |
|---|---|---|
--scenario <id> | - | Jalankan hanya skenario ini. Dapat diulang. |
--output-dir <path> | <repo>/.artifacts/qa-e2e/<transport>-<timestamp> | Tempat laporan, ringkasan, bukti, artefak khusus transport, dan log keluaran ditulis. Path relatif di-resolve terhadap --repo-root. |
--repo-root <path> | process.cwd() | Root repositori saat memanggil dari cwd netral. |
--sut-account <id> | sut | ID akun sementara di dalam konfigurasi Gateway QA. |
--provider-mode <mode> | live-frontier | mock-openai atau live-frontier (live-openai lama masih berfungsi). |
--model <ref> / --alt-model <ref> | default provider | Ref model utama/alternatif. |
--fast | nonaktif | Mode cepat provider jika didukung. |
--credential-source <env|convex> | env | Lihat pool kredensial Convex. |
--credential-role <maintainer|ci> | ci di CI, selain itu maintainer | Peran yang digunakan saat --credential-source convex. |
--allow-failures menulis artefak tanpa menetapkan kode keluar gagal.
QA Telegram
@BotFather.
Env wajib saat --credential-source env:
OPENCLAW_QA_TELEGRAM_GROUP_ID- id obrolan numerik (string).OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN
extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts):
telegram-canarytelegram-mention-gatingtelegram-mentioned-message-replytelegram-help-commandtelegram-commands-commandtelegram-tools-compact-commandtelegram-whoami-commandtelegram-status-commandtelegram-repeated-command-authorizationtelegram-other-bot-command-gatingtelegram-context-commandtelegram-current-session-status-tooltelegram-reply-chain-exact-markertelegram-stream-final-single-messagetelegram-long-final-reuses-previewtelegram-long-final-three-chunks
mock-openai juga mencakup pemeriksaan deterministik rantai balasan dan streaming pesan final. telegram-current-session-status-tool tetap opt-in karena hanya stabil saat di-thread langsung setelah canary, bukan setelah balasan perintah native sembarang. Gunakan pnpm openclaw qa telegram --list-scenarios --provider-mode mock-openai untuk mencetak pemisahan default/opsional saat ini dengan ref regresi.
Artefak keluaran:
telegram-qa-report.mdqa-evidence.json- entri bukti untuk pemeriksaan transport live, termasuk field profil, cakupan, provider, channel, artefak, hasil, dan RTT.
qa-evidence.json di bawah result.timing untuk pemeriksaan RTT yang dipilih.
OPENCLAW_QA_CREDENTIAL_SOURCE=convex ditetapkan, wrapper live paket menyewa kredensial kind: "telegram", mengekspor env grup/driver/bot SUT yang disewa ke dalam run paket terinstal, mengirim Heartbeat untuk sewa, dan melepasnya saat shutdown. Wrapper paket secara default melakukan 20 pemeriksaan RTT dari telegram-mentioned-message-reply, timeout RTT 30 detik, dan peran Convex maintainer di luar CI saat Convex dipilih. Override OPENCLAW_NPM_TELEGRAM_RTT_SAMPLES, OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MS, atau OPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURES untuk menyetel pengukuran RTT tanpa membuat perintah RTT terpisah atau format ringkasan khusus Telegram.
QA Discord
/help dengan Discord, dan skenario bukti Mantis opt-in.
Env wajib saat --credential-source env:
OPENCLAW_QA_DISCORD_GUILD_IDOPENCLAW_QA_DISCORD_CHANNEL_IDOPENCLAW_QA_DISCORD_DRIVER_BOT_TOKENOPENCLAW_QA_DISCORD_SUT_BOT_TOKENOPENCLAW_QA_DISCORD_SUT_APPLICATION_ID- harus cocok dengan id pengguna bot SUT yang dikembalikan oleh Discord (jika tidak, lane gagal cepat).
OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1mempertahankan isi pesan di artefak pesan-teramati.OPENCLAW_QA_DISCORD_VOICE_CHANNEL_IDmemilih channel suara/stage untukdiscord-voice-autojoin; tanpa ini, skenario memilih channel suara/stage pertama yang terlihat oleh bot SUT.
extensions/qa-lab/src/live-transports/discord/discord-live.runtime.ts:36):
discord-canarydiscord-mention-gatingdiscord-native-help-command-registrationdiscord-voice-autojoin- skenario suara opt-in. Berjalan sendiri, mengaktifkanchannels.discord.voice.autoJoin, dan memverifikasi status suara Discord bot SUT saat ini adalah channel suara/stage target. Kredensial Discord Convex dapat menyertakanvoiceChannelIdopsional; jika tidak, runner menemukan channel suara/stage pertama yang terlihat di guild.discord-status-reactions-tool-only- skenario Mantis opt-in. Berjalan sendiri karena mengalihkan SUT ke balasan guild selalu aktif, khusus tool denganmessages.statusReactions.enabled=true, lalu menangkap timeline reaksi REST plus artefak visual HTML/PNG. Laporan sebelum/sesudah Mantis juga mempertahankan artefak MP4 yang disediakan skenario sebagaibaseline.mp4dancandidate.mp4.
discord-qa-report.mdqa-evidence.json- entri bukti untuk pemeriksaan transport live.discord-qa-observed-messages.json- isi disunting kecualiOPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1.discord-qa-reaction-timelines.jsondandiscord-status-reactions-tool-only-timeline.pngsaat skenario reaksi status berjalan.
QA Slack
--credential-source env:
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKEN
OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1mempertahankan isi pesan di artefak pesan-teramati.OPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_DIRmengaktifkan checkpoint persetujuan visual untuk Mantis. Runner menulis<scenario>.pending.jsondan<scenario>.resolved.json, lalu menunggu file.ack.jsonyang cocok.OPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_TIMEOUT_MSmenimpa timeout acknowledgement checkpoint. Default-nya adalah120000.
extensions/qa-lab/src/live-transports/slack/slack-live.runtime.ts):
slack-canaryslack-mention-gatingslack-allowlist-blockslack-top-level-reply-shapeslack-restart-resumeslack-thread-follow-upslack-thread-isolationslack-approval-exec-native- skenario persetujuan exec Slack native opt-in. Meminta persetujuan exec melalui Gateway, memverifikasi pesan Slack memiliki tombol persetujuan native, menyelesaikannya, dan memverifikasi pembaruan Slack yang sudah diselesaikan.slack-approval-plugin-native- skenario persetujuan Plugin Slack native opt-in. Mengaktifkan penerusan persetujuan exec dan Plugin bersama-sama agar event Plugin tidak disupresi oleh routing persetujuan exec, lalu memverifikasi jalur UI Slack native pending/resolved yang sama.
slack-qa-report.mdqa-evidence.json- entri bukti untuk pemeriksaan transport live.slack-qa-observed-messages.json- isi disunting kecualiOPENCLAW_QA_SLACK_CAPTURE_CONTENT=1.approval-checkpoints/- hanya saat Mantis menetapkanOPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_DIR; berisi JSON checkpoint, JSON acknowledgement, dan screenshot pending/resolved.
Menyiapkan workspace Slack
Lane membutuhkan dua aplikasi Slack berbeda dalam satu workspace, plus sebuah channel tempat kedua bot menjadi anggota:channelId- idCxxxxxxxxxxdari channel yang telah mengundang kedua bot. Gunakan channel khusus; lane memposting pada setiap run.driverBotToken- token bot (xoxb-...) dari aplikasi Driver.sutBotToken- token bot (xoxb-...) dari aplikasi SUT, yang harus merupakan aplikasi Slack terpisah dari driver agar id pengguna botnya berbeda.sutAppToken- token tingkat aplikasi (xapp-...) dari aplikasi SUT denganconnections:write, digunakan oleh Socket Mode agar aplikasi SUT dapat menerima event.
extensions/slack/src/setup-shared.ts:10) ke izin dan event yang dicakup oleh suite QA Slack live. Untuk penyiapan channel produksi sebagaimana dilihat pengguna, lihat penyiapan cepat channel Slack; pasangan Driver/SUT QA sengaja dipisahkan karena lane membutuhkan dua id pengguna bot berbeda dalam satu workspace.
1. Buat aplikasi Driver
Buka api.slack.com/apps → Create New App → From a manifest → pilih workspace QA, tempel manifest berikut, lalu Install to Workspace:
xoxb-...) - itu menjadi driverBotToken. Driver hanya perlu memposting pesan dan mengidentifikasi dirinya sendiri; tidak ada event, tidak ada Socket Mode.
2. Buat aplikasi SUT
Ulangi Create New App → From a manifest di workspace yang sama. Aplikasi QA ini sengaja memakai versi yang lebih sempit dari manifest produksi Plugin Slack bawaan (extensions/slack/src/setup-shared.ts:10): scope dan event reaksi dihilangkan karena suite QA Slack live belum mencakup penanganan reaksi.
- Install to Workspace → salin Bot User OAuth Token → itu menjadi
sutBotToken. - Basic Information → App-Level Tokens → Generate Token and Scopes → tambahkan scope
connections:write→ simpan → salin nilaixapp-...→ itu menjadisutAppToken.
auth.test pada setiap token. Runtime membedakan driver dan SUT berdasarkan user id; menggunakan ulang satu aplikasi untuk keduanya akan langsung menggagalkan gating mention.
3. Buat channel
Di workspace QA, buat channel (misalnya #openclaw-qa) dan undang kedua bot dari dalam channel:
Cxxxxxxxxxx dari channel info → About → Channel ID - itu menjadi channelId. Channel publik bisa digunakan; jika Anda memakai channel privat, kedua aplikasi sudah memiliki groups:history sehingga pembacaan riwayat oleh harness tetap berhasil.
4. Daftarkan kredensial
Ada dua opsi. Gunakan env var untuk debugging di satu mesin (atur empat variabel OPENCLAW_QA_SLACK_* dan teruskan --credential-source env), atau seed pool Convex bersama agar CI dan maintainer lain dapat menyewanya.
Untuk pool Convex, tulis keempat field ke file JSON:
OPENCLAW_QA_CONVEX_SITE_URL dan OPENCLAW_QA_CONVEX_SECRET_MAINTAINER diekspor di shell Anda, daftarkan dan verifikasi:
count: 1, status: "active", tanpa field lease.
5. Verifikasi end to end
Jalankan lane secara lokal untuk memastikan kedua bot dapat saling berbicara melalui broker:
slack-qa-report.md menampilkan slack-canary dan slack-mention-gating dengan status pass. Jika lane menggantung selama ~90 detik dan keluar dengan Convex credential pool exhausted for kind "slack", berarti pool kosong atau setiap baris sedang disewa - qa credentials list --kind slack --status all --json akan memberi tahu yang mana.
QA WhatsApp
--credential-source env:
OPENCLAW_QA_WHATSAPP_DRIVER_PHONE_E164OPENCLAW_QA_WHATSAPP_SUT_PHONE_E164OPENCLAW_QA_WHATSAPP_DRIVER_AUTH_ARCHIVE_BASE64OPENCLAW_QA_WHATSAPP_SUT_AUTH_ARCHIVE_BASE64
OPENCLAW_QA_WHATSAPP_GROUP_JIDmengaktifkan skenario grup sepertiwhatsapp-mention-gating,whatsapp-group-pending-history-context,whatsapp-broadcast-group-fanout,whatsapp-group-activation-always,whatsapp-group-reply-to-bot-triggers, skenario aksi/media/poll grup, danwhatsapp-group-allowlist-block.OPENCLAW_QA_WHATSAPP_CAPTURE_CONTENT=1mempertahankan isi pesan dalam artefak observed-message.
extensions/qa-lab/src/live-transports/whatsapp/whatsapp-live.runtime.ts):
- Baseline dan gating grup:
whatsapp-canary,whatsapp-pairing-block,whatsapp-mention-gating,whatsapp-group-pending-history-context,whatsapp-group-activation-always,whatsapp-group-reply-to-bot-triggers,whatsapp-top-level-reply-shape,whatsapp-restart-resume,whatsapp-group-allowlist-block. - Perintah native:
whatsapp-help-command,whatsapp-status-command,whatsapp-commands-command,whatsapp-tools-compact-command,whatsapp-whoami-command,whatsapp-context-command,whatsapp-native-new-command. - Perilaku balasan dan output akhir:
whatsapp-tool-only-usage-footer,whatsapp-reply-to-message,whatsapp-group-reply-to-message,whatsapp-reply-to-mode-batched,whatsapp-reply-context-isolation,whatsapp-reply-delivery-shape,whatsapp-stream-final-message-accounting. - Aksi pesan jalur pengguna:
whatsapp-agent-message-action-reactdimulai dari DM driver nyata, membiarkan model memanggil toolmessage, dan mengamati reaksi WhatsApp native.whatsapp-agent-message-action-upload-filememakai postur yang sama untukmessage(action=upload-file)dan mengamati media WhatsApp native.whatsapp-group-agent-message-action-reactdanwhatsapp-group-agent-message-action-upload-filemembuktikan aksi yang terlihat pengguna yang sama di grup WhatsApp nyata. - Fanout grup:
whatsapp-broadcast-group-fanoutdimulai dari satu pesan grup WhatsApp yang menyebutkan bot dan memverifikasi balasan terlihat yang berbeda darimaindanqa-second. - Aktivasi grup:
whatsapp-group-activation-alwaysmengubah sesi grup nyata ke/activation always, membuktikan pesan grup tanpa mention membangunkan agent, lalu memulihkan/activation mention.whatsapp-group-reply-to-bot-triggersmenanam balasan bot, mengirim balasan kutipan native kepadanya tanpa mention eksplisit, dan memverifikasi agent bangun dari konteks balasan tersebut. - Media masuk dan pesan terstruktur:
whatsapp-inbound-image-caption,whatsapp-audio-preflight,whatsapp-inbound-structured-messages,whatsapp-group-audio-gating,whatsapp-inbound-reaction-no-trigger. Ini mengirim event gambar, audio, dokumen, lokasi, kontak, stiker, dan reaksi WhatsApp nyata melalui driver. - Probe kontrak Gateway langsung:
whatsapp-outbound-media-matrix,whatsapp-outbound-document-preserves-filename,whatsapp-outbound-poll,whatsapp-group-outbound-media,whatsapp-group-outbound-poll,whatsapp-message-actions,whatsapp-reply-context-isolation,whatsapp-reply-delivery-shape. Ini sengaja melewati prompting model dan membuktikan kontrak deterministiksend,poll, danmessage.actionGateway/channel. - Cakupan kontrol akses:
whatsapp-access-control-dm-open,whatsapp-access-control-dm-disabled,whatsapp-access-control-group-open,whatsapp-access-control-group-disabled,whatsapp-group-allowlist-block. - Persetujuan native:
whatsapp-approval-exec-deny-native,whatsapp-approval-exec-native,whatsapp-approval-exec-reaction-native,whatsapp-approval-exec-group-reaction-native,whatsapp-approval-plugin-native. - Reaksi status:
whatsapp-status-reactions,whatsapp-status-reaction-lifecycle.
live-frontier
dibuat kecil dengan 10 skenario untuk cakupan smoke yang cepat. Lane default
mock-openai menjalankan 44 skenario deterministik melalui transport WhatsApp nyata sambil
hanya memock output model. Skenario persetujuan dan beberapa pemeriksaan yang
lebih berat/memblokir tetap eksplisit berdasarkan id skenario.
Driver QA WhatsApp mengamati event live terstruktur (text, media,
location, reaction, dan poll) serta dapat secara aktif mengirim media, poll,
kontak, lokasi, dan stiker. QA Lab mengimpor driver tersebut melalui surface paket
@openclaw/whatsapp/api.js, bukan menjangkau file runtime WhatsApp privat.
Untuk observasi grup, fromJid adalah JID grup sementara
participantJid dan fromPhoneE164 mengidentifikasi pengirim peserta. Konten
pesan disunting secara default. Probe Gateway langsung
poll, upload-file, media, poll grup, media grup, dan reply-shape adalah pemeriksaan kontrak transport/API;
semuanya tidak diperlakukan sebagai bukti bahwa prompt pengguna membuat agent memilih
aksi yang sama. Bukti aksi jalur pengguna berasal dari skenario seperti
whatsapp-agent-message-action-react dan
whatsapp-group-agent-message-action-react, tempat driver mengirim pesan
WhatsApp normal dan QA Lab mengamati artefak WhatsApp native yang dihasilkan.
Laporan WhatsApp menyertakan postur setiap skenario (user-path, direct-gateway,
atau native-approval) sehingga bukti tidak dapat disalahartikan sebagai kontrak
yang lebih kuat daripada yang benar-benar dibuktikannya.
Artefak output:
whatsapp-qa-report.mdqa-evidence.json- entri bukti untuk pemeriksaan transport live.whatsapp-qa-observed-messages.json- isi disunting kecualiOPENCLAW_QA_WHATSAPP_CAPTURE_CONTENT=1.
Pool kredensial Convex
Lane Telegram, Discord, Slack, dan WhatsApp dapat menyewa kredensial dari pool Convex bersama alih-alih membaca env var di atas. Teruskan--credential-source convex (atau atur OPENCLAW_QA_CREDENTIAL_SOURCE=convex); QA Lab memperoleh lease eksklusif, mengirim Heartbeat selama run berlangsung, dan melepaskannya saat shutdown. Jenis pool adalah "telegram", "discord", "slack", dan "whatsapp".
Bentuk payload yang divalidasi broker pada admin/add:
- Telegram (
kind: "telegram"):{ groupId: string, driverToken: string, sutToken: string }-groupIdharus berupa string chat-id numerik. - Pengguna nyata Telegram (
kind: "telegram-user"):{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }- hanya untuk bukti Mantis Telegram Desktop. Lane QA Lab generik tidak boleh memperoleh jenis ini. - Discord (
kind: "discord"):{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string }. - WhatsApp (
kind: "whatsapp"):{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }- nomor telepon harus berupa string E.164 yang berbeda.
telegram-user eksklusif untuk driver CLI TDLib dan saksi Telegram Desktop,
lalu melepasnya setelah menerbitkan bukti.
Ketika sebuah PR membutuhkan diff visual deterministik, Mantis dapat menggunakan balasan
model tiruan yang sama di main dan di head PR sementara pemformat Telegram atau lapisan
pengiriman berubah. Default tangkapan disetel untuk komentar PR: kelas Crabbox
standar, rekaman desktop 24fps, GIF gerak 24fps, dan lebar pratinjau 1920px.
Komentar sebelum/sesudah harus menerbitkan bundel bersih yang hanya berisi GIF
yang dimaksud.
Lane Slack juga dapat menggunakan pool. Pemeriksaan bentuk payload Slack saat ini berada di runner QA Slack, bukan di broker; gunakan { channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }, dengan id kanal Slack seperti Cxxxxxxxxxx. Lihat Menyiapkan ruang kerja Slack untuk penyediaan aplikasi dan scope.
Env var operasional dan kontrak endpoint broker Convex berada di Pengujian → Kredensial Telegram bersama melalui Convex (nama bagian tersebut lebih lama daripada pool multi-kanal; semantik lease dibagikan di seluruh jenis).
Seed berbasis repo
Aset seed berada diqa/:
qa/scenarios/index.yamlqa/scenarios/<theme>/*.yaml
qa-lab harus tetap menjadi runner skenario YAML generik. Setiap berkas YAML skenario adalah
sumber kebenaran untuk satu eksekusi pengujian dan harus mendefinisikan:
titletingkat atas- metadata
scenario - metadata kategori, capability, lane, dan risiko opsional di
scenario - referensi docs dan kode di
scenario - persyaratan plugin opsional di
scenario - patch konfigurasi Gateway opsional di
scenario flowtingkat atas yang dapat dieksekusi untuk skenario flow, atauscenario.execution.kind/scenario.execution.pathuntuk skenario Vitest dan Playwright
flow boleh tetap generik
dan lintas area. Misalnya, skenario YAML dapat menggabungkan helper sisi transport
dengan helper sisi browser yang menggerakkan Control UI tertanam melalui
seam Gateway browser.request tanpa menambahkan runner kasus khusus.
Berkas skenario harus dikelompokkan berdasarkan capability produk, bukan folder
pohon sumber. Pertahankan ID skenario tetap stabil saat berkas dipindahkan; gunakan docsRefs dan codeRefs
untuk keterlacakan implementasi.
Daftar baseline harus tetap cukup luas untuk mencakup:
- chat DM dan kanal
- perilaku thread
- lifecycle tindakan pesan
- callback cron
- recall memori
- pergantian model
- handoff subagent
- pembacaan repo dan pembacaan docs
- satu tugas build kecil seperti Lobster Invaders
Lane mock penyedia
qa suite memiliki dua lane mock penyedia lokal:
mock-openaiadalah mock OpenClaw yang sadar skenario. Ini tetap menjadi lane mock deterministik default untuk QA berbasis repo dan gerbang paritas.aimockmemulai server penyedia berbasis AIMock untuk cakupan protokol, fixture, rekam/putar ulang, dan chaos eksperimental. Ini bersifat tambahan dan tidak menggantikan dispatcher skenariomock-openai.
extensions/qa-lab/src/providers/.
Setiap penyedia memiliki default, startup server lokal, konfigurasi model gateway,
kebutuhan staging profil auth, dan flag capability live/mock miliknya sendiri. Kode suite dan
gateway bersama harus merutekan melalui registry penyedia, bukan bercabang berdasarkan
nama penyedia.
Adapter transport
qa-lab memiliki seam transport generik untuk skenario QA YAML. qa-channel adalah
default sintetis. crabline memulai server lokal berbentuk penyedia dan menjalankan
plugin kanal normal OpenClaw terhadapnya. live dicadangkan untuk kredensial
penyedia nyata dan kanal eksternal.
Pada tingkat arsitektur, pemisahannya adalah:
qa-labmemiliki eksekusi skenario generik, concurrency worker, penulisan artefak, dan pelaporan.- Adapter transport memiliki konfigurasi gateway, kesiapan, observasi inbound dan outbound, tindakan transport, dan status transport ternormalisasi.
- Berkas skenario YAML di bawah
qa/scenarios/mendefinisikan eksekusi pengujian;qa-labmenyediakan permukaan runtime pakai ulang yang mengeksekusinya.
Menambahkan kanal
Menambahkan kanal ke sistem QA YAML membutuhkan implementasi kanal plus paket skenario yang menguji kontrak kanal tersebut. Untuk cakupan CI smoke, tambahkan server penyedia lokal Crabline yang sesuai dan ekspos melalui drivercrabline.
Jangan tambahkan root perintah QA tingkat atas baru ketika host bersama qa-lab dapat memiliki flow tersebut.
qa-lab memiliki mekanik host bersama:
- root perintah
openclaw qa - startup dan teardown suite
- concurrency worker
- penulisan artefak
- pembuatan laporan
- eksekusi skenario
- alias kompatibilitas untuk skenario
qa-channelyang lebih lama
- cara
openclaw qa <runner>dipasang di bawah rootqabersama - cara gateway dikonfigurasi untuk transport tersebut
- cara kesiapan diperiksa
- cara event inbound diinjeksi
- cara pesan outbound diobservasi
- cara transkrip dan status transport ternormalisasi diekspos
- cara tindakan berbasis transport dieksekusi
- cara reset atau pembersihan khusus transport ditangani
- Pertahankan
qa-labsebagai pemilik rootqabersama. - Implementasikan runner transport pada seam host
qa-labbersama. - Pertahankan mekanik khusus transport di dalam plugin runner atau harness kanal.
- Pasang runner sebagai
openclaw qa <runner>alih-alih mendaftarkan perintah root pesaing. Plugin runner harus mendeklarasikanqaRunnersdiopenclaw.plugin.jsondan mengekspor arrayqaRunnerCliRegistrationsyang sesuai dariruntime-api.ts. Jagaruntime-api.tstetap ringan; CLI lazy dan eksekusi runner harus tetap berada di balik entrypoint terpisah. - Tulis atau adaptasi skenario YAML di bawah direktori bertema
qa/scenarios/. - Gunakan helper skenario generik untuk skenario baru.
- Jaga alias kompatibilitas yang ada tetap berfungsi kecuali repo sedang melakukan migrasi yang disengaja.
- Jika perilaku dapat diekspresikan sekali di
qa-lab, tempatkan diqa-lab. - Jika perilaku bergantung pada satu transport kanal, pertahankan di plugin runner atau harness plugin tersebut.
- Jika sebuah skenario membutuhkan capability baru yang dapat digunakan oleh lebih dari satu kanal, tambahkan helper generik alih-alih cabang khusus kanal di
suite.ts. - Jika suatu perilaku hanya bermakna untuk satu transport, pertahankan skenario tetap khusus transport dan buat hal itu eksplisit dalam kontrak skenario.
Nama helper skenario
Helper generik yang disarankan untuk skenario baru:waitForTransportReadywaitForChannelReadyinjectInboundMessageinjectOutboundMessagewaitForTransportOutboundMessagewaitForChannelOutboundMessagewaitForNoTransportOutboundgetTransportSnapshotreadTransportMessagereadTransportTranscriptformatTransportTranscriptresetTransport
waitForQaChannelReady, waitForOutboundMessage, waitForNoOutbound, formatConversationTranscript, resetBus - tetapi penulisan skenario baru harus menggunakan nama generik. Alias tersebut ada untuk menghindari migrasi serentak, bukan sebagai model ke depan.
Pelaporan
qa-lab mengekspor laporan protokol Markdown dari timeline bus yang diamati.
Laporan harus menjawab:
- Apa yang berhasil
- Apa yang gagal
- Apa yang tetap terblokir
- Skenario tindak lanjut apa yang layak ditambahkan
pnpm openclaw qa coverage (tambahkan --json untuk output yang dapat dibaca mesin).
Saat memilih bukti terfokus untuk perilaku atau path berkas yang disentuh, jalankan pnpm openclaw qa coverage --match <query>.
Laporan kecocokan mencari metadata skenario, referensi docs, referensi kode, ID cakupan, plugin, dan persyaratan penyedia, lalu mencetak target qa suite --scenario ... yang cocok.
Setiap eksekusi qa suite menulis artefak tingkat atas qa-evidence.json,
qa-suite-summary.json, dan qa-suite-report.md untuk kumpulan
skenario yang dipilih. Skenario yang mendeklarasikan execution.kind: vitest atau
execution.kind: playwright menjalankan path pengujian yang sesuai dan juga menulis
log per skenario. Skenario yang mendeklarasikan execution.kind: script menjalankan
produser bukti di execution.path melalui node --import tsx (dengan
${outputDir} dan ${scenarioId} diekspansi di execution.args); produser
menulis qa-evidence.json miliknya sendiri, yang entrinya diimpor ke output
suite dan path artefaknya diselesaikan relatif terhadap
qa-evidence.json produser tersebut. Ketika qa suite dicapai melalui
qa run --qa-profile, qa-evidence.json yang sama juga menyertakan ringkasan
scorecard profil untuk kategori taksonomi yang dipilih.
Perlakukan ini sebagai bantuan penemuan, bukan pengganti gerbang; skenario yang dipilih tetap membutuhkan mode penyedia, transport live, Multipass, Testbox, atau lane rilis yang tepat untuk perilaku yang diuji.
Untuk konteks scorecard, lihat Scorecard kematangan.
Untuk pemeriksaan karakter dan gaya, jalankan skenario yang sama di beberapa ref model live
dan tulis laporan Markdown yang dinilai:
SOUL.md, lalu menjalankan giliran pengguna biasa seperti chat, bantuan workspace, dan tugas file kecil. Model kandidat tidak boleh diberi tahu bahwa model tersebut sedang dievaluasi. Perintah ini mempertahankan setiap transkrip lengkap, mencatat statistik dasar eksekusi, lalu meminta model penilai dalam mode cepat dengan penalaran xhigh jika didukung untuk memeringkat eksekusi berdasarkan kewajaran, vibe, dan humor.
Gunakan --blind-judge-models saat membandingkan penyedia: prompt penilai tetap mendapatkan setiap transkrip dan status eksekusi, tetapi referensi kandidat diganti dengan label netral seperti candidate-01; laporan memetakan peringkat kembali ke referensi asli setelah penguraian.
Eksekusi kandidat secara default menggunakan pemikiran high, dengan medium untuk GPT-5.5 dan xhigh untuk referensi evaluasi OpenAI lama yang mendukungnya. Timpa kandidat tertentu secara inline dengan
--model provider/model,thinking=<level>. --thinking <level> tetap mengatur fallback global, dan bentuk lama --model-thinking <provider/model=level> dipertahankan untuk kompatibilitas.
Referensi kandidat OpenAI secara default menggunakan mode cepat sehingga pemrosesan prioritas digunakan jika penyedia mendukungnya. Tambahkan ,fast, ,no-fast, atau ,fast=false secara inline saat satu kandidat atau penilai memerlukan penimpaan. Berikan --fast hanya saat Anda ingin memaksa mode cepat aktif untuk setiap model kandidat. Durasi kandidat dan penilai dicatat dalam laporan untuk analisis benchmark, tetapi prompt penilai secara eksplisit mengatakan untuk tidak memeringkat berdasarkan kecepatan.
Eksekusi model kandidat dan penilai keduanya secara default menggunakan concurrency 16. Turunkan
--concurrency atau --judge-concurrency saat batas penyedia atau tekanan Gateway lokal membuat eksekusi terlalu berisik.
Saat tidak ada kandidat --model yang diberikan, evaluasi karakter secara default menggunakan
openai/gpt-5.5, openai/gpt-5.2, openai/gpt-5, anthropic/claude-opus-4-8,
anthropic/claude-sonnet-4-6, zai/glm-5.1,
moonshot/kimi-k2.5, dan
google/gemini-3.1-pro-preview saat tidak ada --model yang diberikan.
Saat tidak ada --judge-model yang diberikan, penilai secara default menggunakan
openai/gpt-5.5,thinking=xhigh,fast dan
anthropic/claude-opus-4-8,thinking=high.