Fundamentals
Ikhtisar QA
Stack QA privat menguji OpenClaw secara realistis dengan bentuk yang menyerupai channel, yang tidak dapat dilakukan oleh pengujian unit.
Komponen:
extensions/qa-channel: channel pesan sintetis dengan permukaan DM, channel, utas, reaksi, pengeditan, dan penghapusan.extensions/qa-lab: UI debugger, bus QA, profil skenario, dan adaptor transport langsung untuk mengamati transkrip, menyuntikkan pesan masuk, dan mengekspor laporan Markdown.qa/: aset seed berbasis repo untuk tugas awal dan skenario QA dasar.- Mantis: verifikasi langsung sebelum/sesudah untuk bug yang memerlukan transport nyata, tangkapan layar browser, status VM, dan bukti PR.
Permukaan perintah
Setiap alur QA berjalan di bawah pnpm openclaw qa <subcommand>. Banyak yang memiliki alias skrip
pnpm qa:*; kedua bentuk berfungsi.
| Perintah | Tujuan |
|---|---|
qa run |
Pemeriksaan mandiri QA terbundel tanpa --qa-profile; runner profil kematangan berbasis taksonomi dengan --qa-profile smoke-ci, --qa-profile release, atau --qa-profile all. |
qa suite |
Menjalankan skenario berbasis repo terhadap jalur gateway QA. --runner multipass menggunakan VM Linux sekali pakai, bukan host. |
qa coverage |
Mencetak inventaris cakupan skenario YAML (--json untuk keluaran mesin; --match <query> untuk menemukan skenario bagi perilaku yang disentuh; --tools untuk cakupan fixture alat runtime). |
qa parity-report |
Membandingkan dua file qa-suite-summary.json untuk gerbang paritas sumbu model, atau menggunakan --runtime-axis --token-efficiency untuk menulis laporan paritas runtime Codex-vs-OpenClaw dan efisiensi token. |
qa confidence-report |
Mengklasifikasikan artefak bukti QA berdasarkan manifes menjadi laporan keyakinan tanpa hal yang tidak diketahui. |
qa confidence-self-test |
Menulis canary kontrol negatif ber-seed yang membuktikan gerbang keyakinan mendeteksi penyimpangan. |
qa jsonl-replay |
Memutar ulang transkrip JSONL terkurasi melalui harness pemutaran ulang paritas runtime. |
qa character-eval |
Menjalankan skenario QA karakter pada beberapa model langsung dengan laporan yang dinilai. Lihat Pelaporan. |
qa manual |
Menjalankan prompt satu kali terhadap jalur penyedia/model yang dipilih. |
qa ui |
Memulai UI debugger QA dan bus QA lokal (alias: pnpm qa:lab:ui). |
qa docker-build-image |
Membangun image Docker QA yang telah disiapkan sebelumnya. |
qa docker-scaffold |
Menulis scaffold docker-compose untuk dasbor QA + jalur gateway. |
qa up |
Membangun situs QA, memulai stack berbasis Docker, mencetak URL (alias: pnpm qa:lab:up; varian :fast menambahkan --use-prebuilt-image --bind-ui-dist --skip-ui-build). |
qa aimock |
Memulai hanya server penyedia AIMock. |
qa mock-openai |
Memulai hanya server penyedia mock-openai yang sadar skenario. |
qa credentials doctor / add / list / remove |
Mengelola kumpulan kredensial Convex bersama. |
qa discord |
Jalur transport langsung terhadap channel guild Discord privat yang nyata. |
qa matrix |
Profil Matrix QA Lab terhadap homeserver Tuwunel sekali pakai. Lihat Jalur smoke Matrix. |
qa slack |
Jalur transport langsung terhadap channel Slack privat yang nyata. |
qa telegram |
Jalur transport langsung terhadap grup Telegram privat yang nyata. |
qa whatsapp |
Jalur transport langsung terhadap akun WhatsApp Web nyata. |
qa mantis |
Runner verifikasi sebelum/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
qa run berbasis profil membaca keanggotaan dari taxonomy.yaml, lalu mengirimkan
skenario yang telah diresolusi melalui qa suite. --surface dan --category memfilter
profil yang dipilih alih-alih mendefinisikan jalur terpisah. qa-evidence.json
yang dihasilkan menyertakan ringkasan kartu skor profil dengan jumlah kategori
terpilih 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 utama
memenuhi ID yang cocok, sedangkan cakupan sekunder tetap bersifat anjuran. ID cakupan menggunakan
bentuk namespace.behavior bertitik dengan segmen alfanumerik/hubung huruf kecil;
ID profil, permukaan, dan kategori masih dapat menggunakan ID taksonomi bertanda
hubung atau bertitik yang ada.
Bukti ringkas menghilangkan execution per entri dan menetapkan evidenceMode: "slim";
smoke-ci secara default menggunakan bentuk ringkas, dan --evidence-mode full memulihkan entri lengkap:
pnpm openclaw qa run \ --qa-profile smoke-ci \ --category channel-framework.conversation-routing-and-delivery \ --provider-mode mock-openai \ --output-dir .artifacts/qa-e2e/smoke-ci-profile-dispatchGunakan smoke-ci untuk bukti profil deterministik dengan penyedia model tiruan dan
server penyedia lokal Crabline. Gunakan release untuk bukti Stable/LTS terhadap
channel langsung. Gunakan all hanya untuk proses bukti taksonomi lengkap yang eksplisit; ini
memilih setiap kategori kematangan aktif dan dapat dikirim melalui alur kerja GitHub Actions QA Profile Evidence dengan qa_profile=all. Ketika suatu
perintah juga memerlukan profil root OpenClaw, letakkan profil root sebelum
perintah QA:
pnpm openclaw --profile work qa run --qa-profile smoke-ciAlur operator
Alur operator QA saat ini adalah situs QA dua panel:
- Kiri: Dasbor Gateway (UI Kontrol) dengan agen.
- Kanan: QA Lab, yang menampilkan transkrip bergaya Slack dan rencana skenario.
Jalankan dengan:
pnpm qa:lab:upPerintah tersebut membangun situs QA, memulai jalur gateway berbasis Docker, dan mengekspos halaman QA Lab tempat operator atau loop otomatisasi dapat memberikan misi QA kepada agen, mengamati perilaku channel nyata, serta mencatat apa yang berhasil, gagal, atau tetap terblokir.
Untuk iterasi UI QA Lab yang lebih cepat tanpa membangun ulang image Docker setiap kali, mulai stack dengan bundel QA Lab yang dipasang melalui bind mount:
pnpm openclaw qa docker-build-imagepnpm qa:lab:buildpnpm qa:lab:up:fastpnpm qa:lab:watchqa:lab:up:fast mempertahankan layanan Docker pada image yang telah dibuat sebelumnya dan
memasang extensions/qa-lab/web/dist melalui bind mount ke dalam kontainer qa-lab.
qa:lab:watch membangun ulang bundel tersebut saat ada perubahan, dan browser memuat ulang
secara otomatis ketika hash aset QA Lab berubah.
Smoke observabilitas
| Alias | Yang dijalankan |
|---|---|
pnpm qa:otel:smoke |
Penerima OpenTelemetry lokal beserta skenario otel-trace-smoke dengan diagnostics-otel diaktifkan. |
pnpm qa:otel:collector-smoke |
Jalur yang sama di belakang kontainer Docker OpenTelemetry Collector nyata. Gunakan saat mengubah pengawatan endpoint atau kompatibilitas collector/OTLP. |
pnpm qa:prometheus:smoke |
Skenario docker-prometheus-smoke dengan diagnostics-prometheus diaktifkan. |
pnpm qa:observability:smoke |
qa:otel:smoke diikuti oleh qa:prometheus:smoke. |
pnpm qa:observability:collector-smoke |
qa:otel:collector-smoke diikuti oleh qa:prometheus:smoke. |
qa:otel:smoke memulai penerima OTLP/HTTP lokal, menjalankan giliran agen
kanal QA minimal, lalu memastikan trace, metrik, dan log diekspor. Proses ini
mendekode span trace protobuf yang diekspor dan memeriksa struktur yang sangat
penting bagi rilis: openclaw.run, openclaw.harness.run, span pemanggilan
model konvensi semantik GenAI terbaru, openclaw.context.assembled, dan
openclaw.message.delivery semuanya harus ada. Smoke memaksakan
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 berada di luar trace. Prompt skenario
meminta model membalas dengan penanda tetap dan menahan string rahasia
tetap; payload OTLP mentah tidak boleh memuat salah satunya, maupun kunci
sesi QA yang diturunkan dari ID skenario. Proses ini menulis otel-smoke-summary.json
di samping artefak rangkaian QA.
qa:prometheus:smoke memverifikasi bahwa scrape tanpa autentikasi ditolak, lalu
memeriksa bahwa scrape terautentikasi menyertakan kelompok metrik yang sangat
penting bagi rilis tanpa konten prompt, konten respons, pengidentifikasi diagnostik mentah, token
autentikasi, atau jalur lokal.
Jalur smoke Matrix
Untuk jalur smoke Matrix dengan transportasi nyata yang tidak memerlukan kredensial penyedia model, jalankan profil rilis dengan penyedia OpenAI tiruan deterministik:
pnpm openclaw qa matrix --provider-mode mock-openai --profile releaseUntuk jalur penyedia frontier langsung, berikan kredensial yang kompatibel dengan OpenAI secara eksplisit:
OPENCLAW_LIVE_OPENAI_KEY="${OPENAI_API_KEY}" \ pnpm openclaw qa matrix --provider-mode live-frontier --profile releasepnpm openclaw qa matrix biasa menjalankan profil all lengkap dan tetap
berlanjut setelah kegagalan skenario. Gunakan --fail-fast untuk siklus umpan balik
yang lebih singkat atau ulangi --scenario <id> untuk memilih skenario individual; ID skenario
eksplisit lebih diprioritaskan daripada --profile.
| Profil | Skenario | Tujuan |
|---|---|---|
all |
93 | Katalog lengkap (default). |
release |
2 | Baseline kanal yang sangat penting bagi rilis dan pemuatan ulang daftar izin langsung. |
fast |
12 | Cakupan terfokus untuk utas, reaksi, persetujuan, kebijakan, pembatasan bot, dan balasan terenkripsi. |
transport |
50 | Utas, perutean DM/ruang, bergabung otomatis, persetujuan, reaksi, mulai ulang, kebijakan penyebutan/daftar izin, pengeditan, dan pengurutan multiaktor. |
media |
7 | Cakupan gambar, gambar yang dihasilkan, suara, lampiran, media yang tidak didukung, dan media terenkripsi. |
e2ee-smoke |
8 | Cakupan minimum untuk balasan terenkripsi, utas, bootstrap, pemulihan, mulai ulang, redaksi, dan kegagalan. |
e2ee-deep |
18 | Kehilangan status, pencadangan, pemulihan kunci, kebersihan perangkat, dan verifikasi SAS/QR/DM. |
e2ee-cli |
9 | openclaw matrix encryption setup, kunci pemulihan, multiakun, perjalanan pulang-pergi Gateway, dan perintah verifikasi mandiri melalui harness. |
Keanggotaan profil dan persyaratan kanal berada bersama skenario Matrix
deklaratif di bawah qa/scenarios/channels/. Proses menjalankan memilih driver kanal.
Implementasi langsungnya berada di bawah
extensions/qa-lab/src/live-transports/matrix/scenarios/.
Adaptor menyediakan homeserver Tuwunel sekali pakai di Docker (image default
ghcr.io/matrix-construct/tuwunel:v1.5.1, nama server matrix-qa.test,
port 28008), mendaftarkan pengguna driver, SUT, dan pengamat sementara, menyiapkan
ruang yang diperlukan, serta merekam batas permintaan/respons yang telah disunting. Adaptor kemudian
menjalankan Plugin Matrix nyata di dalam Gateway QA anak yang dibatasi pada transportasi tersebut
(tanpa qa-channel) dan membongkar lingkungan.
Opsi umum:
| Flag | Default | Tujuan |
|---|---|---|
--profile <profile> |
all |
Pilih salah satu profil di atas. |
--scenario <id> |
- | Pilih satu skenario; dapat diulang. |
--fail-fast |
nonaktif | Berhenti setelah pemeriksaan atau skenario pertama yang gagal. |
--allow-failures |
nonaktif | Tulis artefak tanpa mengembalikan kode keluar gagal untuk kegagalan skenario. |
--provider-mode <mode> |
live-frontier |
Gunakan mock-openai untuk pengiriman deterministik atau live-frontier untuk penyedia langsung. |
--model <ref> |
default penyedia | Tetapkan referensi provider/model utama. |
--alt-model <ref> |
default penyedia | Tetapkan model alternatif yang digunakan oleh skenario yang beralih model. |
--fast |
nonaktif | Aktifkan mode cepat penyedia jika didukung. |
--output-dir <path> |
dihasilkan | Pilih direktori laporan; jalur relatif diselesaikan terhadap --repo-root. |
--repo-root <path> |
direktori saat ini | Jalankan dari direktori kerja netral. |
--sut-account <id> |
sut |
Pilih ID akun Matrix dalam konfigurasi Gateway anak. |
QA Matrix tidak menyewa kredensial Matrix bersama: adaptor membuat
pengguna sekali pakai secara lokal, sehingga tidak menerima --credential-source atau
--credential-role. Ganti image homeserver dengan
OPENCLAW_QA_MATRIX_TUWUNEL_IMAGE; sesuaikan pernyataan negatif tanpa balasan dengan
OPENCLAW_QA_MATRIX_NO_REPLY_WINDOW_MS (default 8000, dibatasi hingga batas waktu
skenario aktif). Perintah sekali jalan biasanya memaksakan keluar bersih setelah
artefak selesai ditulis karena handle native kripto Matrix dapat bertahan setelah pembersihan; tetapkan
OPENCLAW_QA_MATRIX_DISABLE_FORCE_EXIT=1 hanya untuk harness pengujian langsung yang
memerlukan perintah untuk kembali.
Setiap proses menjalankan menulis artefak QA Lab normal di bawah direktori keluaran
yang dipilih: qa-suite-report.md, qa-suite-summary.json, qa-evidence.json,
dan manifes matrix-harness-*/matrix-qa-harness.json yang telah disunting. Jika pembersihan
gagal, jalankan perintah pemulihan docker compose ... down --remove-orphans
yang dicetak. Pada runner lambat, tingkatkan jendela tanpa balasan; pada CI cepat, jendela
yang lebih kecil dapat mempersingkat pernyataan negatif.
Skenario tersebut mencakup perilaku transportasi yang tidak dapat dibuktikan oleh pengujian unit secara
menyeluruh: pembatasan penyebutan, kebijakan mengizinkan bot, daftar izin, balasan tingkat atas
dan berutas, perutean DM, penanganan reaksi, penekanan pengeditan masuk, deduplikasi
pemutaran ulang saat mulai ulang, pemulihan dari 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.
matrix-room-block-streaming dan subagent-thread-spawn tetap tersedia melalui
pemilihan --scenario secara eksplisit, tetapi tetap berada di luar profil default all.
CI menggunakan permukaan perintah yang sama di
.github/workflows/qa-live-transports-convex.yml. Proses terjadwal dan rilis
menjalankan skenario rilis. Pengiriman matrix_profile=all manual menyebarkan
profil transport, media, e2ee-smoke, e2ee-deep, dan e2ee-cli;
pengiriman terfokus memilih fast, release, atau transport dalam satu tugas.
Skenario Discord Mantis
Discord juga memiliki skenario khusus Mantis yang ikut serta secara opsional untuk reproduksi bug. Gunakan
--scenario discord-status-reactions-tool-only untuk linimasa 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 tetap berada di luar jalur
Discord langsung default karena merupakan probe reproduksi sebelum/sesudah, bukan
cakupan smoke yang luas. Alur kerja Mantis untuk lampiran utas juga dapat menambahkan
video saksi Discord Web yang telah masuk jika
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR atau
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64 dikonfigurasi dalam lingkungan
QA. Profil penampil tersebut hanya untuk pengambilan visual; keputusan lulus/gagal
tetap berasal dari oracle REST Discord.
Untuk jalur smoke lain dengan transportasi nyata:
pnpm openclaw qa discordpnpm openclaw qa slackpnpm openclaw qa telegrampnpm openclaw qa whatsappJalur tersebut menargetkan kanal nyata yang sudah ada dengan dua bot atau akun (driver + SUT). Variabel lingkungan yang diperlukan, daftar skenario, artefak keluaran, dan kumpulan kredensial Convex untuk keempat transportasi tersebut didokumentasikan dalam Referensi QA Discord, Slack, Telegram, dan WhatsApp di bawah.
Runner tugas desktop dan visual Mantis Slack
Untuk proses VM desktop Slack lengkap dengan penyelamatan VNC, jalankan:
pnpm openclaw qa mantis slack-desktop-smoke \ --gateway-setup \ --scenario slack-canary \ --keep-leasePerintah tersebut menyewa mesin desktop/peramban Crabbox, menjalankan lane langsung Slack
di dalam VM, membuka Slack Web di peramban VNC, merekam desktop,
dan menyalin slack-qa/, slack-desktop-smoke.png, serta
slack-desktop-smoke.mp4 (ketika perekaman video tersedia) kembali ke
direktori artefak Mantis. Sewa desktop/peramban Crabbox menyediakan alat
perekaman dan paket pembantu peramban/build native sejak awal, sehingga skenario
hanya perlu menginstal fallback pada sewa lama. Mantis melaporkan waktu total dan
per fase dalam mantis-slack-desktop-smoke-report.md agar proses yang lambat menunjukkan
apakah waktu digunakan untuk pemanasan sewa, perolehan kredensial, penyiapan jarak jauh, atau
penyalinan artefak. Gunakan kembali --lease-id <cbx_...> setelah masuk ke Slack Web
secara manual melalui VNC; sewa yang digunakan kembali juga menjaga cache penyimpanan pnpm Crabbox
tetap siap. --hydrate-mode source default melakukan verifikasi dari checkout sumber dan
menjalankan instalasi/build di dalam VM. Gunakan --hydrate-mode prehydrated hanya ketika
ruang kerja jarak jauh yang digunakan kembali sudah memiliki node_modules dan dist/ yang telah di-build;
mode tersebut melewati langkah instalasi/build yang mahal dan gagal secara tertutup ketika
ruang kerja belum siap. Dengan --gateway-setup, Mantis membiarkan
Gateway Slack OpenClaw persisten tetap berjalan di dalam VM pada port 38973; tanpa opsi tersebut,
perintah menjalankan lane QA Slack bot-ke-bot normal dan keluar setelah perekaman
artefak.
Untuk membuktikan UI persetujuan Slack native dengan bukti desktop, jalankan mode checkpoint persetujuan Mantis:
pnpm openclaw qa mantis slack-desktop-smoke \ --approval-checkpoints \ --credential-source convex \ --credential-role maintainerMode ini saling eksklusif dengan --gateway-setup. Mode ini menjalankan skenario
persetujuan Slack, menolak ID skenario non-persetujuan, menunggu pada setiap status
persetujuan tertunda dan terselesaikan, merender pesan API Slack yang diamati ke
approval-checkpoints/<scenario>-pending.png dan
approval-checkpoints/<scenario>-resolved.png, lalu gagal jika ada checkpoint,
bukti pesan, tanda terima, atau tangkapan layar yang dirender yang tidak ada atau
kosong. Sewa CI baru mungkin masih menampilkan proses masuk Slack dalam
slack-desktop-smoke.png; gambar checkpoint persetujuan merupakan bukti visual
untuk lane ini.
Proses checkpoint default mempertahankan dua skenario persetujuan Slack standar.
Untuk merekam salah satu rute persetujuan Codex yang bersifat opsional, pilih secara eksplisit dengan
--scenario slack-codex-approval-exec-native atau
--scenario slack-codex-approval-plugin-native; Mantis menerima keduanya dan menghasilkan
pasangan tangkapan layar tertunda/terselesaikan yang sama. Runner memperpanjang tenggat waktu checkpoint
dan perintah jarak jauhnya untuk setiap rute Codex yang dipilih agar seluruh
urutan persetujuan, penyelesaian agen, dan pembaruan terselesaikan dapat selesai.
Daftar periksa operator, perintah dispatch alur kerja GitHub, kontrak komentar bukti, tabel keputusan mode hidrasi, interpretasi waktu, dan langkah penanganan kegagalan tersedia di Runbook Desktop Slack Mantis.
Untuk tugas desktop bergaya agen/CV, jalankan:
pnpm openclaw qa mantis visual-task \ --browser-url https://example.net \ --expect-text "Example Domain" \ --vision-model openai/gpt-5.6-lunavisual-task menyewa atau menggunakan kembali mesin desktop/peramban Crabbox, memulai
crabbox record --while, mengendalikan peramban yang terlihat melalui
visual-driver bertingkat, mengambil visual-task.png, menjalankan openclaw infer image describe terhadap tangkapan layar ketika --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. Ketika --expect-text ditetapkan, prompt visi
meminta putusan JSON terstruktur (visible, evidence, reason)
dan hanya lolos ketika model melaporkan visible: true dengan bukti yang
mengutip teks yang diharapkan; respons visible: false yang hanya mengutip
teks target tetap gagal dalam pemeriksaan. Gunakan --vision-mode metadata untuk
smoke tanpa model yang membuktikan rangkaian desktop, peramban, tangkapan layar, dan video
tanpa memanggil penyedia pemahaman gambar. Rekaman merupakan
artefak wajib untuk visual-task; jika Crabbox tidak merekam
visual-task.mp4 yang tidak kosong, tugas gagal meskipun pengendali visual lolos. Saat
gagal, Mantis mempertahankan sewa untuk VNC kecuali tugas sudah lolos
dan --keep-lease tidak ditetapkan.
Pemeriksaan kesehatan kumpulan kredensial
Sebelum menggunakan kredensial langsung yang dikumpulkan, jalankan:
pnpm openclaw qa credentials doctorDoctor memeriksa env broker Convex (OPENCLAW_QA_CONVEX_SITE_URL,
OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX), memvalidasi pengaturan endpoint, hanya melaporkan
status ditetapkan/tidak ada untuk OPENCLAW_QA_CONVEX_SECRET_CI dan
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER, serta memverifikasi keterjangkauan admin/daftar
ketika rahasia pengelola tersedia.
Cakupan skenario kanonis
taxonomy.yaml root mendefinisikan ID cakupan semantik. File YAML skenario
di bawah qa/scenarios/ memetakan setiap skenario ke ID tersebut dan memiliki metadata
eksekusi: channel adalah satu-satunya persyaratan kanal, dan profiles mendeklarasikan
keanggotaan proses bernama. Pengendali kanal merupakan pilihan implementasi tingkat proses
yang dapat dipertukarkan. Runner TypeScript
mengueri katalog tersebut; runner tidak memelihara inventaris skenario atau cakupan
paralel.
Output statis qa coverage melaporkan pemetaan taksonomi-ke-skenario. Bukti
sebenarnya berasal dari qa-evidence.json, yang mencatat skenario yang dijalankan,
ID cakupan, kanal, pengendali yang benar-benar digunakan, dan hasilnya. Kanal dan pengendali adalah
dimensi laporan, bukan kosakata ID cakupan tambahan atau sumbu kelayakan
skenario.
Untuk lane VM Linux sekali pakai tanpa memasukkan Docker ke jalur QA, jalankan:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baselinePerintah ini memulai guest Multipass baru, menginstal dependensi, mem-build OpenClaw
di dalam guest, menjalankan qa suite, lalu menyalin laporan dan
ringkasan QA normal kembali ke .artifacts/qa-e2e/... pada host. Perintah ini menggunakan kembali
perilaku pemilihan skenario yang sama seperti qa suite pada host.
Proses suite host dan Multipass menjalankan beberapa skenario terpilih secara
paralel dengan worker Gateway terisolasi secara default. qa-channel menggunakan
konkurensi default 4, yang dibatasi oleh jumlah skenario terpilih. Gunakan --concurrency <count> untuk menyesuaikan jumlah worker, atau --concurrency 1 untuk eksekusi serial.
Gunakan --pack personal-agent untuk menjalankan paket benchmark asisten pribadi (10
skenario). Pemilih paket bersifat aditif dengan flag --scenario berulang:
skenario eksplisit dijalankan terlebih dahulu, lalu skenario paket dijalankan sesuai urutan paket dengan
duplikat dihapus. Gunakan --pack observability untuk memilih skenario
otel-trace-smoke dan docker-prometheus-smoke secara bersamaan ketika
runner QA khusus sudah menyediakan penyiapan kolektor OpenTelemetry.
Perintah keluar dengan kode bukan nol ketika ada skenario yang gagal. Gunakan --allow-failures
ketika Anda menginginkan artefak tanpa kode keluar kegagalan.
Proses langsung meneruskan input autentikasi QA yang didukung dan praktis untuk
guest: kunci penyedia berbasis env, jalur konfigurasi penyedia langsung QA, serta
CODEX_HOME jika tersedia. Simpan --output-dir di bawah root repo agar
guest dapat menulis kembali melalui ruang kerja yang dipasang.
Referensi QA Discord, Slack, Telegram, dan WhatsApp
Adaptor Matrix menggunakan lane sekali pakai yang didukung Docker dan didokumentasikan di atas. Discord, Slack, Telegram, dan WhatsApp berjalan terhadap transport nyata yang sudah ada, sehingga referensinya tersedia di sini.
Flag CLI bersama
Lane ini didaftarkan melalui
extensions/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> |
Lokasi penulisan laporan, ringkasan, bukti, artefak khusus transport, dan log output. Jalur relatif diresolusikan terhadap --repo-root. |
--repo-root <path> |
process.cwd() |
Root repositori saat dipanggil dari cwd netral. |
--sut-account <id> |
sut |
ID akun sementara di dalam konfigurasi Gateway QA. |
--provider-mode <mode> |
live-frontier |
mock-openai, aimock, atau live-frontier. |
--model <ref> / --alt-model <ref> |
default penyedia | Referensi model utama/alternatif. |
--fast |
nonaktif | Mode cepat penyedia jika didukung. |
--credential-source <env|convex> |
env |
Lihat Kumpulan kredensial Convex. |
--credential-role <maintainer|ci> |
ci dalam CI, selain itu maintainer |
Peran yang digunakan ketika --credential-source convex. |
--allow-failures |
nonaktif | Tulis artefak tanpa mengembalikan kode keluar kegagalan ketika skenario gagal. |
Setiap lane keluar dengan kode bukan nol jika ada skenario yang gagal. --allow-failures menulis
artefak tanpa menetapkan kode keluar kegagalan. Telegram juga menerima
--list-scenarios untuk mencetak ID skenario yang tersedia dan keluar; lane lainnya
tidak menyediakan flag tersebut.
QA Telegram
pnpm openclaw qa telegramMenargetkan satu grup privat Telegram nyata dengan dua bot berbeda (pengendali +
SUT). Bot SUT harus memiliki nama pengguna Telegram; pengamatan bot-ke-bot berfungsi
paling baik ketika kedua bot mengaktifkan Bot-to-Bot Communication Mode di
@BotFather.
Env wajib ketika --credential-source env:
OPENCLAW_QA_TELEGRAM_GROUP_ID- ID obrolan numerik (string).OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN
Profil release memilih skenario YAML Telegram yang dipelihara; all
menambahkan pemeriksaan stres sesi, penggunaan, rantai balasan, dan streaming yang bersifat opsional. Nilai
--scenario eksplisit menggantikan profil.
channel-canarychannel-mention-gatingtelegram-help-commandtelegram-commands-commandtelegram-tools-compact-commandtelegram-whoami-commandtelegram-status-commandtelegram-repeated-command-authorizationtelegram-other-bot-command-gatingtelegram-context-commandtelegram-current-session-status-tooltelegram-tool-only-usage-footertelegram-reply-chain-exact-markertelegram-stream-final-single-messagetelegram-long-final-reuses-previewtelegram-long-final-three-chunks
Profil release selalu mencakup canary, pembatasan mention, balasan
perintah native, pengalamatan perintah, dan balasan grup antarbot. mock-openai
juga mencakup pemeriksaan pratinjau akhir panjang yang deterministik.
telegram-current-session-status-tool dan
telegram-tool-only-usage-footer tetap bersifat opsional: yang pertama hanya stabil
ketika dijalankan langsung setelah canary, dan yang kedua merupakan pembuktian dengan Telegram nyata
atas footer /usage pada balasan yang hanya berisi tool. Gunakan pnpm openclaw qa telegram --list-scenarios --provider-mode mock-openai untuk menampilkan pembagian
default/opsional saat ini beserta referensi regresi. Gunakan --profile all untuk setiap
skenario adaptor live Telegram.
Artefak keluaran:
qa-suite-report.mdqa-suite-summary.jsonqa-evidence.json- entri bukti untuk pemeriksaan transportasi live, termasuk bidang profil, cakupan, penyedia, kanal, artefak, hasil, dan RTT.
Proses Telegram paket menggunakan kontrak kredensial Telegram yang sama. Pengukuran RTT
berulang merupakan bagian dari lane live Telegram paket normal; distribusi RTT
dimasukkan ke dalam qa-evidence.json di bawah result.timing untuk
pemeriksaan RTT yang dipilih.
OPENCLAW_QA_CREDENTIAL_SOURCE=convex \pnpm test:docker:npm-telegram-liveKetika OPENCLAW_QA_CREDENTIAL_SOURCE=convex ditetapkan, wrapper live paket
menyewa kredensial kind: "telegram", mengekspor env bot grup/driver/SUT yang disewa
ke dalam proses paket yang diinstal, mengirim Heartbeat untuk sewa tersebut, dan melepaskannya
saat penghentian. Wrapper paket secara default menjalankan 20 pemeriksaan RTT
channel-canary, dengan batas waktu RTT 30s, dan peran Convex
maintainer di luar CI ketika Convex dipilih. Timpa
OPENCLAW_NPM_TELEGRAM_RTT_SAMPLES, OPENCLAW_NPM_TELEGRAM_RTT_TIMEOUT_MS,
atau OPENCLAW_NPM_TELEGRAM_RTT_MAX_FAILURES untuk menyesuaikan pengukuran RTT tanpa
membuat perintah RTT terpisah atau format ringkasan khusus Telegram.
QA Discord
pnpm openclaw qa discordMenargetkan satu kanal guild Discord privat nyata dengan dua bot: bot driver
yang dikendalikan oleh harness dan bot SUT yang dimulai oleh Gateway OpenClaw turunan
melalui Plugin Discord bawaan. Memverifikasi penanganan mention kanal, bahwa
bot SUT telah mendaftarkan perintah native /help pada Discord, serta
skenario bukti Mantis yang bersifat opsional.
Env wajib ketika --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 langsung gagal).
Opsional:
OPENCLAW_QA_DISCORD_VOICE_CHANNEL_IDmemilih kanal suara/stage untukdiscord-voice-autojoin; tanpanya, skenario memilih kanal suara/stage pertama yang terlihat oleh bot SUT.
Skenario modul YAML Discord (qa/scenarios/channels/discord-*.yaml):
discord-canarydiscord-mention-gatingdiscord-native-help-command-registrationdiscord-voice-autojoin- skenario suara opsional. Berjalan sendiri, mengaktifkanchannels.discord.voice.autoJoin, dan memverifikasi bahwa status suara Discord bot SUT saat ini adalah kanal suara/stage target. Kredensial Discord Convex dapat menyertakanvoiceChannelIdopsional; jika tidak, adaptor runner menemukan kanal suara/stage pertama yang terlihat di guild.discord-status-reactions-tool-only- skenario Mantis opsional. Berjalan sendiri karena skenario ini mengalihkan SUT ke balasan guild yang selalu aktif dan hanya berisi tool denganmessages.statusReactions.enabled=true, lalu merekam linimasa reaksi REST beserta artefak visual HTML/PNG. Laporan sebelum/sesudah Mantis juga mempertahankan artefak MP4 yang disediakan skenario sebagaibaseline.mp4dancandidate.mp4.discord-thread-reply-filepath-attachment- skenario Mantis opsional; lihat Skenario Mantis Discord.
Jalankan skenario gabung otomatis suara Discord secara eksplisit:
pnpm openclaw qa discord \ --scenario discord-voice-autojoin \ --provider-mode mock-openaiJalankan skenario reaksi status Mantis secara eksplisit:
pnpm openclaw qa discord \ --scenario discord-status-reactions-tool-only \ --provider-mode live-frontier \ --model openai/gpt-5.6-luna \ --alt-model openai/gpt-5.6-luna \ --fastArtefak keluaran:
qa-suite-report.mdqa-suite-summary.jsonqa-evidence.json- entri bukti untuk pemeriksaan transportasi live.discord-qa-reaction-timelines.jsondandiscord-status-reactions-tool-only-timeline.pngketika skenario reaksi status berjalan.
QA Slack
pnpm openclaw qa slackMenargetkan satu kanal Slack privat nyata dengan dua bot berbeda: bot driver yang dikendalikan oleh harness dan bot SUT yang dimulai oleh Gateway OpenClaw turunan melalui Plugin Slack bawaan.
Env wajib ketika --credential-source env:
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKEN
Opsional:
OPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_DIRmengaktifkan titik pemeriksaan persetujuan visual untuk Mantis. Adaptor menulis<scenario>.pending.jsondan<scenario>.resolved.json, lalu menunggu file.ack.jsonyang cocok.OPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_TIMEOUT_MSmenimpa batas waktu pengakuan titik pemeriksaan. Default-nya adalah120000.
Skenario YAML kanonis yang diekspos melalui adaptor live Slack:
thread-follow-upthread-isolation
Skenario modul YAML Slack (qa/scenarios/channels/slack-*.yaml):
slack-canaryslack-mention-gatingslack-allowlist-blockslack-channel-disabled-warning- probe Slack nyata opsional yang memastikan bahwa kanal nonaktif yang dikonfigurasi mengeluarkan peringatan terstruktur tanpa membalas.slack-top-level-reply-shapeslack-restart-resumeslack-progress-commentary-true,slack-progress-commentary-false,slack-progress-commentary-omitted, danslack-progress-commentary-verbose-dedupe- probe Slack nyata opsional untuk kontrol komentar/progres tool yang independen, default lama saat kunci dihilangkan, dan perilaku pengiriman tunggal ketika progres verbose persisten aktif.slack-reaction-glyph-native- skenario reaksi tool pesan live opsional. Menginstruksikan agen untuk meneruskan glif✅secara persis dan memastikan Slack menyimpanwhite_check_markuntuk bot SUT pada pesan target.slack-chart-presentation-native- skenario bagan portabel opsional yang memverifikasi blok nativedata_visualizationdan teks aksesibel secara persis.slack-table-presentation-native- skenario tabel portabel opsional yang memverifikasi blok nativedata_table, baris secara persis, dan teks aksesibel.slack-table-invalid-blocks-fallback- skenario transportasi langsung opsional yang mengirim tabel mentah melebihi batas namun dapat dibaca secara struktural dengan 101 baris data beserta header-nya melalui jalur pengiriman Slack produksi, membuktikan bahwa Slack sendiri mengembalikaninvalid_blocks, dan memverifikasi bahwa fallback tersimpan dengan pemformatan dinonaktifkan lengkap dan tidak memiliki blok data native. Detail skenario hanya menyimpan bukti kode galat, jumlah, dan boolean yang aman.slack-approval-exec-native- skenario persetujuan exec native Slack opsional. Meminta persetujuan exec melalui Gateway, memverifikasi bahwa pesan Slack memiliki tombol persetujuan native, menyelesaikannya, dan memverifikasi pembaruan Slack yang telah diselesaikan.slack-approval-plugin-native- skenario persetujuan Plugin native Slack opsional. Mengaktifkan penerusan persetujuan exec dan Plugin secara bersamaan agar peristiwa Plugin tidak ditekan oleh perutean persetujuan exec, lalu memverifikasi jalur UI native Slack tertunda/terselesaikan yang sama.slack-codex-approval-exec-native- skenario persetujuan perintah Codex Guardian opsional. Mengaktifkan Plugin Codex dalam mode Guardian, merutekan giliran agen Gateway yang berasal dari Slack melalui harness app-server Codex, menunggu permintaan persetujuan Plugin native Slack untukopenclaw-codex-app-server, menyelesaikannya, dan memverifikasi bahwa giliran Codex selesai dengan penanda keluaran perintah dan asisten yang diharapkan.slack-codex-approval-plugin-native- skenario persetujuan file Codex Guardian opsional. Menggunakan instruksiapply_patchdi luar ruang kerja agar Codex mengeluarkan rute persetujuan perubahan file app-server, lalu memverifikasi jalur persetujuan tertunda/terselesaikan native Slack yang sama, penanda asisten akhir, dan isi file secara persis sebelum pembersihan.
Skenario persetujuan Codex memerlukan openai/* atau codex/* --model, kredensial
model live normal, serta autentikasi Codex atau autentikasi kunci API yang diterima oleh Plugin Codex.
Detail skenario mencakup metode app-server Codex, kunci model Codex
yang dipilih, status akhir giliran Codex, dan verifikasi penanda operasi beserta
metadata persetujuan Slack yang telah disunting.
Artefak keluaran:
qa-suite-report.mdqa-suite-summary.jsonqa-evidence.json- entri bukti untuk pemeriksaan transportasi live.approval-checkpoints/- hanya ketika Mantis menetapkanOPENCLAW_QA_SLACK_APPROVAL_CHECKPOINT_DIR; berisi JSON titik pemeriksaan, JSON pengakuan, dan tangkapan layar tertunda/terselesaikan.
Menyiapkan ruang kerja Slack
Lane memerlukan dua aplikasi Slack yang berbeda dalam satu ruang kerja, serta sebuah kanal yang diikuti oleh kedua bot:
channelId- idCxxxxxxxxxxdari kanal yang telah menerima undangan untuk kedua bot. Gunakan kanal khusus; lane mengirim postingan pada setiap proses.driverBotToken- token bot (xoxb-...) dari aplikasi Driver.sutBotToken- token bot (xoxb-...) dari aplikasi SUT, yang harus berupa aplikasi Slack terpisah dari driver agar id pengguna bot-nya berbeda.sutAppToken- token tingkat aplikasi (xapp-...) dari aplikasi SUT denganconnections:write, digunakan oleh Socket Mode agar aplikasi SUT dapat menerima peristiwa.
Utamakan ruang kerja Slack yang didedikasikan untuk QA daripada menggunakan kembali ruang kerja produksi.
Manifes SUT di bawah sengaja mempersempit instalasi produksi Plugin Slack
bawaan (extensions/slack/src/setup-shared.ts:12) hanya pada
izin dan peristiwa yang dicakup oleh rangkaian QA Slack live. Untuk
penyiapan kanal produksi sebagaimana dilihat pengguna, lihat
Penyiapan cepat kanal Slack; pasangan Driver/SUT QA
sengaja dipisahkan karena lane memerlukan dua id pengguna bot yang berbeda
dalam satu ruang kerja.
1. Buat aplikasi Driver
Buka api.slack.com/apps → Create New App → From a manifest → pilih ruang kerja QA, tempel manifes berikut, lalu Install to Workspace:
{ "display_information": { "name": "OpenClaw QA Driver", "description": "Bot driver pengujian untuk lane live Slack QA OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw QA Driver", "always_online": true } }, "oauth_config": { "scopes": { "bot": ["chat:write", "channels:history", "groups:history", "users:read"] } }, "settings": { "socket_mode_enabled": false }}Salin Bot User OAuth Token (xoxb-...) - token tersebut menjadi
driverBotToken. Driver hanya perlu mengirim pesan dan mengidentifikasi
dirinya; tanpa peristiwa dan tanpa Socket Mode.
2. Buat aplikasi SUT
Ulangi Create New App → From a manifest di ruang kerja yang sama. Aplikasi QA ini
sengaja menggunakan versi yang lebih sempit dari manifes produksi Plugin Slack
bawaan (extensions/slack/src/setup-shared.ts:12): cakupan dan
peristiwa reaksi dihilangkan karena rangkaian QA Slack live belum mencakup
penanganan reaksi.
{ "display_information": { "name": "OpenClaw QA SUT", "description": "OpenClaw QA SUT connector for OpenClaw" }, "features": { "bot_user": { "display_name": "OpenClaw QA SUT", "always_online": true }, "app_home": { "home_tab_enabled": true, "messages_tab_enabled": true, "messages_tab_read_only_enabled": false } }, "oauth_config": { "scopes": { "bot": [ "app_mentions:read", "assistant:write", "channels:history", "channels:read", "chat:write", "commands", "emoji:read", "files:read", "files:write", "groups:history", "groups:read", "im:history", "im:read", "im:write", "mpim:history", "mpim:read", "mpim:write", "pins:read", "pins:write", "usergroups:read", "users:read" ] } }, "settings": { "socket_mode_enabled": true, "event_subscriptions": { "bot_events": [ "app_home_opened", "app_mention", "channel_rename", "member_joined_channel", "member_left_channel", "message.channels", "message.groups", "message.im", "message.mpim", "pin_added", "pin_removed" ] } }}Setelah Slack membuat aplikasi, lakukan dua hal di halaman pengaturannya:
- Install to Workspace → salin Bot User OAuth Token → token tersebut menjadi
sutBotToken. - Basic Information → App-Level Tokens → Generate Token and Scopes → tambahkan
cakupan
connections:write→ simpan → salin nilaixapp-...→ nilai tersebut menjadisutAppToken.
Pastikan kedua bot memiliki ID pengguna yang berbeda dengan memanggil auth.test pada setiap
token. Runtime membedakan driver dan SUT berdasarkan ID pengguna; menggunakan kembali satu aplikasi
untuk keduanya akan langsung menyebabkan pemeriksaan penyebutan gagal.
3. Buat saluran
Di ruang kerja QA, buat saluran (misalnya #openclaw-qa) dan undang kedua
bot dari dalam saluran:
/invite @OpenClaw QA Driver/invite @OpenClaw QA SUTSalin ID Cxxxxxxxxxx dari channel info → About → Channel ID—ID tersebut
menjadi channelId. Saluran publik dapat digunakan; jika Anda menggunakan saluran privat,
kedua aplikasi sudah memiliki groups:history sehingga pembacaan riwayat oleh harness
tetap berhasil.
4. Daftarkan kredensial
Tersedia dua opsi. Gunakan variabel lingkungan untuk debugging pada satu mesin (atur empat
variabel OPENCLAW_QA_SLACK_* dan teruskan --credential-source env), atau isi
pool Convex bersama agar CI dan pengelola lain dapat menyewanya.
Untuk pool Convex, tulis keempat bidang ke file JSON:
{ "channelId": "Cxxxxxxxxxx", "driverBotToken": "xoxb-...", "sutBotToken": "xoxb-...", "sutAppToken": "xapp-..."}Dengan OPENCLAW_QA_CONVEX_SITE_URL dan OPENCLAW_QA_CONVEX_SECRET_MAINTAINER
diekspor di shell Anda, daftarkan dan verifikasi:
pnpm openclaw qa credentials add \ --kind slack \ --payload-file slack-creds.json \ --note "QA Slack pool seed" pnpm openclaw qa credentials list --kind slack --status all --jsonHasil yang diharapkan adalah count: 1, status: "active", tanpa bidang lease.
5. Verifikasi secara menyeluruh
Jalankan lane secara lokal untuk memastikan kedua bot dapat berkomunikasi satu sama lain melalui broker:
pnpm openclaw qa slack \ --credential-source convex \ --credential-role maintainer \ --output-dir .artifacts/qa-e2e/slack-localProses yang berhasil selesai dalam waktu jauh di bawah 30 detik dan qa-suite-report.md
menampilkan slack-canary serta slack-mention-gating dengan status pass. Jika
lane terhenti selama ~90 detik dan keluar dengan Convex credential pool exhausted for kind "slack", pool kosong atau setiap baris sedang disewa—qa credentials list --kind slack --status all --json akan menunjukkan penyebabnya.
QA WhatsApp
pnpm openclaw qa whatsappMenargetkan dua akun WhatsApp Web khusus: akun driver yang dikendalikan oleh harness dan akun SUT yang dimulai oleh Gateway OpenClaw turunan melalui Plugin WhatsApp bawaan.
Variabel lingkungan yang diperlukan saat --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
Opsional:
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 tindakan/media/jajak pendapat grup, danwhatsapp-group-allowlist-block.
Skenario YAML WhatsApp (qa/scenarios/channels/whatsapp-*.yaml):
- Dasar dan pemeriksaan 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 keluaran 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. - Tindakan pesan melalui jalur pengguna:
whatsapp-agent-message-action-reactdimulai dari DM driver nyata, memungkinkan model memanggil alatmessage, dan mengamati reaksi native WhatsApp.whatsapp-agent-message-action-upload-filemenggunakan pendekatan yang sama untukmessage(action=upload-file)dan mengamati media native WhatsApp.whatsapp-group-agent-message-action-reactdanwhatsapp-group-agent-message-action-upload-filemembuktikan tindakan yang terlihat oleh pengguna tersebut dalam grup WhatsApp nyata. - Fan-out grup:
whatsapp-broadcast-group-fanoutdimulai dari satu pesan grup WhatsApp yang menyebut bot dan memverifikasi balasan berbeda yang terlihat darimaindanqa-second. - Aktivasi grup:
whatsapp-group-activation-alwaysmengubah sesi grup nyata menjadi/activation always, membuktikan bahwa pesan grup tanpa penyebutan membangunkan agen, lalu memulihkan/activation mention.whatsapp-group-reply-to-bot-triggersmenyiapkan balasan bot, mengirim balasan kutipan native terhadapnya tanpa penyebutan eksplisit, dan memverifikasi bahwa agen terbangun 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. Skenario ini mengirim peristiwa 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-outbound-send-serialization,whatsapp-group-outbound-media,whatsapp-group-outbound-poll,whatsapp-message-actions,whatsapp-reply-context-isolation,whatsapp-reply-delivery-shape. Skenario ini sengaja melewati pemberian prompt kepada model dan membuktikan kontraksend,poll, sertamessage.actionGateway/saluran yang deterministik. - 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.
Katalog saat ini berisi 52 skenario. Lane default live-frontier
dipertahankan berukuran kecil dengan 8 skenario untuk cakupan smoke yang cepat. Lane default mock-openai
menjalankan 39 skenario secara deterministik melalui transport WhatsApp nyata
dengan hanya memalsukan keluaran model; skenario persetujuan dan beberapa pemeriksaan
yang lebih berat/memblokir tetap harus ditentukan secara eksplisit berdasarkan ID skenario.
Driver QA WhatsApp mengamati peristiwa langsung terstruktur (text, media,
location, reaction, dan poll) serta dapat secara aktif mengirim media, jajak pendapat,
kontak, lokasi, dan stiker. QA Lab mengimpor driver tersebut melalui
permukaan paket @openclaw/whatsapp/api.js, bukan dengan mengakses file
runtime WhatsApp privat. Untuk pengamatan grup, fromJid adalah JID grup,
sedangkan participantJid dan fromPhoneE164 mengidentifikasi peserta pengirim.
Konten pesan disamarkan secara default. Probe Gateway langsung untuk jajak pendapat, unggah file,
media, jajak pendapat grup, media grup, dan bentuk balasan merupakan pemeriksaan kontrak
transport/API; probe tersebut tidak dianggap sebagai bukti bahwa prompt pengguna membuat
agen memilih tindakan yang sama. Bukti tindakan melalui jalur pengguna berasal dari skenario
seperti whatsapp-agent-message-action-react dan
whatsapp-group-agent-message-action-react, tempat driver mengirim pesan
WhatsApp biasa dan QA Lab mengamati artefak native WhatsApp yang dihasilkan.
Detail skenario WhatsApp mencakup pendekatan setiap skenario (user-path,
direct-gateway, atau native-approval) agar bukti tidak disalahartikan sebagai
kontrak yang lebih kuat daripada yang benar-benar dibuktikannya.
Artefak keluaran:
qa-suite-report.mdqa-suite-summary.jsonqa-evidence.json—entri bukti untuk pemeriksaan transport langsung.
Pool kredensial Convex
Lane Discord, Slack, Telegram, dan WhatsApp dapat menyewa kredensial dari
pool Convex bersama, alih-alih membaca variabel lingkungan di atas. Teruskan
--credential-source convex (atau atur OPENCLAW_QA_CREDENTIAL_SOURCE=convex);
QA Lab memperoleh sewa eksklusif, mengirim Heartbeat selama
proses berjalan, dan melepaskannya saat penghentian. Jenis pool adalah "discord", "slack",
"telegram", dan "whatsapp".
Bentuk payload yang divalidasi broker pada admin/add:
- Discord (
kind: "discord"):{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string }. - Telegram (
kind: "telegram"):{ groupId: string, driverToken: string, sutToken: string }—groupIdharus berupa string ID obrolan 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 Telegram Desktop Mantis. Lane QA Lab generik tidak boleh memperoleh jenis ini. - WhatsApp (
kind: "whatsapp"):{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }—nomor telepon harus berupa string E.164 yang berbeda.
Alur kerja bukti Telegram Desktop Mantis mempertahankan satu sewa Convex
telegram-user eksklusif untuk driver CLI TDLib dan saksi Telegram Desktop,
lalu melepaskannya setelah menerbitkan bukti.
Saat PR memerlukan diff visual deterministik, Mantis dapat menggunakan balasan model
tiruan yang sama pada main dan pada head PR sementara pemformat atau
lapisan pengiriman Telegram berubah. Default pengambilan disesuaikan untuk komentar PR: kelas
Crabbox standar, rekaman desktop 24fps, GIF gerakan 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 saluran Slack seperti Cxxxxxxxxxx. Lihat
Menyiapkan ruang kerja Slack untuk penyediaan
aplikasi dan cakupan.
Variabel lingkungan operasional dan kontrak endpoint broker Convex tersedia di Pengujian → Kredensial Telegram bersama melalui Convex (nama bagian tersebut dibuat sebelum pool multisaluran; semantik sewa digunakan bersama oleh semua jenis).
Seed berbasis repositori
Aset seed tersedia di qa/:
qa/scenarios/index.yamlqa/scenarios/<theme>/*.yaml
Aset tersebut sengaja disimpan di git agar rencana QA terlihat oleh manusia dan agen.
qa-lab tetap menjadi runner skenario YAML generik. Setiap file YAML skenario merupakan
sumber kebenaran untuk satu proses pengujian dan harus menentukan:
titletingkat teratas- metadata
scenario - metadata kategori, kapabilitas, lane, dan risiko opsional dalam
scenario - referensi dokumentasi dan kode dalam
scenario - persyaratan Plugin opsional dalam
scenario - patch konfigurasi Gateway opsional dalam
scenario flowtingkat teratas yang dapat dieksekusi untuk skenario alur, atauscenario.execution.kind/scenario.execution.pathuntuk skenario Vitest dan Playwright
Permukaan runtime yang dapat digunakan kembali dan mendukung flow tetap generik dan
lintas aspek. Misalnya, skenario YAML dapat menggabungkan helper sisi transportasi
dengan helper sisi browser yang mengendalikan Control UI tersemat melalui
seam Gateway browser.request tanpa menambahkan runner kasus khusus.
File skenario harus dikelompokkan berdasarkan kapabilitas produk, bukan folder
pohon sumber. Pertahankan ID skenario agar tetap stabil saat file dipindahkan; gunakan docsRefs dan
codeRefs untuk keterlacakan implementasi.
Daftar dasar harus tetap cukup luas untuk mencakup:
- DM dan percakapan kanal
- perilaku utas
- siklus hidup tindakan pesan
- callback cron
- pemanggilan kembali memori
- pergantian model
- serah terima subagen
- pembacaan repo dan pembacaan dokumentasi
- satu tugas build kecil seperti Lobster Invaders
Jalur mock penyedia
qa suite memiliki dua jalur mock penyedia lokal:
mock-openaiadalah mock OpenClaw yang memahami skenario. Ini tetap menjadi jalur mock deterministik default untuk QA berbasis repo dan gerbang paritas.aimockmemulai server penyedia berbasis AIMock untuk cakupan protokol eksperimental, fixture, rekam/putar ulang, dan chaos. Jalur ini bersifat tambahan dan tidak menggantikan dispatcher skenariomock-openai.
Implementasi jalur penyedia berada di bawah extensions/qa-lab/src/providers/.
Setiap penyedia memiliki nilai default, startup server lokal, konfigurasi model gateway,
kebutuhan penyiapan profil autentikasi, dan flag kapabilitas live/mock masing-masing. Kode suite dan
gateway bersama dirutekan melalui registri penyedia alih-alih membuat percabangan berdasarkan
nama penyedia.
Adaptor transportasi
qa-lab menyediakan seam transportasi generik untuk skenario QA YAML. qa-channel adalah
default sintetis. crabline memulai server lokal yang menyerupai penyedia dan
menjalankan plugin kanal normal OpenClaw terhadap server tersebut. live dicadangkan untuk
kredensial penyedia nyata dan kanal eksternal.
Pada tingkat arsitektur, pembagiannya adalah:
qa-labmenangani eksekusi skenario generik, konkurensi worker, penulisan artefak, dan pelaporan.- Adaptor transportasi menangani konfigurasi gateway, kesiapan, pengamatan masuk dan keluar, tindakan transportasi, serta status transportasi yang dinormalisasi.
- File skenario YAML di bawah
qa/scenarios/menentukan proses pengujian;qa-labmenyediakan permukaan runtime yang dapat digunakan kembali untuk menjalankannya.
Menambahkan kanal
Menambahkan kanal ke sistem QA YAML memerlukan implementasi kanal
beserta paket skenario yang menguji kontrak kanal tersebut. Untuk cakupan CI
smoke, tambahkan server penyedia lokal Crabline yang sesuai dan ekspos server tersebut
melalui driver crabline.
Jangan menambahkan akar perintah QA tingkat atas baru jika host bersama qa-lab dapat
menangani alur tersebut.
qa-lab menangani mekanisme host bersama:
- akar perintah
openclaw qa - startup dan teardown suite
- konkurensi worker
- penulisan artefak
- pembuatan laporan
- eksekusi skenario
- alias kompatibilitas untuk skenario
qa-channelyang lebih lama
Plugin runner menangani kontrak transportasi:
- cara
openclaw qa <runner>dipasang di bawah akar bersamaqa - cara gateway dikonfigurasi untuk transportasi tersebut
- cara kesiapan diperiksa
- cara peristiwa masuk diinjeksi
- cara pesan keluar diamati
- cara transkrip dan status transportasi yang dinormalisasi diekspos
- cara tindakan yang didukung transportasi dijalankan
- cara reset atau pembersihan khusus transportasi ditangani
Batas adopsi minimum untuk kanal baru:
- Pertahankan
qa-labsebagai pemilik akar bersamaqa. - Implementasikan runner transportasi pada seam host bersama
qa-lab. - Pertahankan mekanisme khusus transportasi di dalam plugin runner atau harness kanal.
- Pasang runner sebagai
openclaw qa <runner>, bukan mendaftarkan perintah akar pesaing. Plugin runner harus mendeklarasikanqaRunnersdiopenclaw.plugin.jsondan mengekspor arrayqaRunnerCliRegistrationsyang sesuai dariruntime-api.ts. Jaga agarruntime-api.tstetap ringan; eksekusi CLI lazy dan runner harus tetap berada di balik entrypoint terpisah.adapterFactoryopsional mengekspos transportasi ke skenario bersama tanpa mengubah katalog skenario perintah yang sudah ada. - Buat atau adaptasikan skenario YAML di bawah direktori
qa/scenarios/bertema. - Gunakan helper skenario generik untuk skenario baru.
- Pertahankan alias kompatibilitas yang sudah ada agar tetap berfungsi, kecuali repo sedang melakukan migrasi yang disengaja.
Aturan keputusannya ketat:
- Jika perilaku dapat dinyatakan sekali di
qa-lab, letakkan diqa-lab. - Jika perilaku bergantung pada satu transportasi kanal, pertahankan di plugin runner atau harness plugin tersebut.
- Jika suatu skenario memerlukan kapabilitas 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 bagi satu transportasi, pertahankan skenario agar khusus transportasi dan nyatakan hal tersebut secara eksplisit dalam kontrak skenario.
Nama helper skenario
Helper generik yang dianjurkan untuk skenario baru:
waitForTransportReadywaitForChannelReadyinjectInboundMessageinjectOutboundMessagewaitForTransportOutboundMessagewaitForChannelOutboundMessagewaitForNoTransportOutboundgetTransportSnapshotreadTransportMessagereadTransportTranscriptformatTransportTranscriptresetTransport
Alias kompatibilitas tetap tersedia untuk skenario yang sudah ada -
waitForQaChannelReady, waitForOutboundMessage, waitForNoOutbound,
formatConversationTranscript, resetBus - tetapi penulisan skenario baru
harus menggunakan nama generik. Alias tersebut ada untuk menghindari
migrasi sekaligus, bukan sebagai model untuk ke depannya.
Pelaporan
qa-lab mengekspor laporan protokol Markdown dari lini masa bus yang diamati.
Laporan harus menjawab:
- Apa yang berhasil
- Apa yang gagal
- Apa yang tetap terblokir
- Skenario tindak lanjut apa yang layak ditambahkan
Untuk inventaris skenario yang tersedia - berguna saat memperkirakan pekerjaan tindak lanjut
atau menghubungkan transportasi baru - jalankan pnpm openclaw qa coverage (tambahkan --json
untuk keluaran yang dapat dibaca mesin). Saat memilih bukti terfokus untuk
perilaku atau jalur file yang disentuh, jalankan pnpm openclaw qa coverage --match <query>. Laporan
kecocokan mencari metadata skenario, referensi dokumentasi, referensi kode, ID cakupan,
plugin, dan persyaratan penyedia, lalu mencetak target qa suite --scenario ... yang cocok.
Setiap proses 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 jalur pengujian yang sesuai dan juga menulis
log per skenario. Skenario yang mendeklarasikan execution.kind: script menjalankan
produsen bukti di execution.path melalui node --import tsx (dengan
${outputDir} dan ${scenarioId} diperluas di execution.args); produsen tersebut
menulis qa-evidence.json miliknya sendiri, yang entrinya diimpor ke
keluaran suite dan jalur artefaknya diresolusikan relatif terhadap
qa-evidence.json produsen tersebut. Saat qa suite dicapai melalui qa run --qa-profile, qa-evidence.json yang sama juga menyertakan ringkasan
kartu skor profil untuk kategori taksonomi yang dipilih.
Perlakukan keluaran cakupan sebagai alat bantu penemuan, bukan pengganti gerbang; skenario yang dipilih masih memerlukan mode penyedia, transportasi live, Multipass, Testbox, atau jalur rilis yang tepat untuk perilaku yang diuji. Untuk konteks kartu skor, lihat Kartu skor kematangan.
Untuk pemeriksaan karakter dan gaya, jalankan skenario yang sama pada beberapa referensi model live dan tulis laporan Markdown yang dinilai:
pnpm openclaw qa character-eval \ --model openai/gpt-5.6-luna,thinking=medium,fast \ --model openai/gpt-5.2,thinking=xhigh \ --model openai/gpt-5,thinking=xhigh \ --model anthropic/claude-opus-4-8,thinking=high \ --model anthropic/claude-sonnet-4-6,thinking=high \ --model zai/glm-5.1,thinking=high \ --model moonshot/kimi-k2.5,thinking=high \ --model google/gemini-3.1-pro-preview,thinking=high \ --judge-model openai/gpt-5.6-sol,thinking=xhigh,fast \ --judge-model anthropic/claude-opus-4-8,thinking=high \ --blind-judge-models \ --concurrency 16 \ --judge-concurrency 16Perintah tersebut menjalankan proses anak gateway QA lokal, bukan Docker. Skenario
evaluasi karakter harus menetapkan persona melalui SOUL.md, lalu menjalankan giliran
pengguna biasa seperti percakapan, bantuan ruang kerja, dan tugas file kecil. Model kandidat
tidak boleh diberi tahu bahwa model tersebut sedang dievaluasi. Perintah tersebut mempertahankan
setiap transkrip lengkap, merekam statistik dasar proses, lalu meminta model penilai dalam
mode cepat dengan penalaran xhigh jika didukung untuk memberi peringkat proses berdasarkan
kealamian, nuansa, dan humor. Gunakan --blind-judge-models saat membandingkan
penyedia: prompt penilai tetap menerima setiap transkrip dan status proses, tetapi
referensi kandidat diganti dengan label netral seperti candidate-01; laporan
memetakan kembali peringkat ke referensi sebenarnya setelah penguraian.
Proses kandidat secara default menggunakan pemikiran high, dengan medium untuk GPT-5.6 Luna dan
xhigh untuk referensi evaluasi OpenAI lama yang mendukungnya. Timpa kandidat tertentu
secara inline dengan --model provider/model,thinking=<level>; opsi
inline juga mendukung fast, no-fast, dan fast=<bool>. --thinking <level> tetap menetapkan fallback global, dan bentuk --model-thinking <provider/model=level> yang lebih lama dipertahankan untuk kompatibilitas. Referensi kandidat OpenAI
secara default menggunakan mode cepat agar pemrosesan prioritas digunakan jika didukung oleh penyedia.
Teruskan --fast hanya jika Anda ingin memaksa mode cepat aktif untuk
setiap model kandidat. Durasi kandidat dan penilai direkam dalam
laporan untuk analisis benchmark, tetapi prompt penilai secara eksplisit menyatakan agar tidak memberi peringkat
berdasarkan kecepatan. Proses model kandidat dan penilai sama-sama secara default menggunakan konkurensi 16.
Turunkan --concurrency atau --judge-concurrency saat batas penyedia atau tekanan
gateway lokal membuat proses terlalu bising.
Jika tidak ada --model kandidat yang diteruskan, evaluasi karakter secara default menggunakan
openai/gpt-5.6-luna, 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. Jika tidak ada
--judge-model yang diteruskan, penilai secara default menggunakan
openai/gpt-5.6-sol,thinking=xhigh,fast dan
anthropic/claude-opus-4-8,thinking=high.