Fundamentals
QA genel bakışı
Özel QA yığını, OpenClaw'ı tek birim testinin yapabileceğinden daha gerçekçi, kanal biçimli bir şekilde çalıştırmak için tasarlanmıştır.
Geçerli parçalar:
extensions/qa-channel: DM, kanal, iş parçacığı, tepki, düzenleme ve silme yüzeylerine sahip sentetik mesaj kanalı.extensions/qa-lab: transkripti gözlemlemek, gelen mesajlar enjekte etmek ve Markdown raporu dışa aktarmak için hata ayıklayıcı UI ve QA veri yolu.extensions/qa-matrix, gelecekteki çalıştırıcı Plugin'leri: alt QA gateway içinde gerçek bir kanalı süren canlı aktarım bağdaştırıcıları.qa/: başlangıç görevi ve temel QA senaryoları için repo destekli seed varlıkları.- Mantis: gerçek aktarımlar, tarayıcı ekran görüntüleri, VM durumu ve PR kanıtı gerektiren hatalar için önce ve sonra canlı doğrulama.
Komut yüzeyi
Her QA akışı pnpm openclaw qa <subcommand> altında çalışır. Çoğunun pnpm qa:*
betik takma adları vardır; her iki biçim de desteklenir.
| Komut | Amaç |
|---|---|
qa run |
Paketlenmiş QA kendi kendine denetimi; Markdown raporu yazar. |
qa suite |
Repo destekli senaryoları QA gateway hattına karşı çalıştırır. Takma adlar: tek kullanımlık Linux VM için pnpm openclaw qa suite --runner multipass. |
qa coverage |
Markdown senaryo kapsam envanterini yazdırır (makine çıktısı için --json). |
qa parity-report |
İki qa-suite-summary.json dosyasını karşılaştırır ve agentic parite raporunu yazar. |
qa character-eval |
Karakter QA senaryosunu, değerlendirilen bir raporla birden çok canlı modelde çalıştırır. Bkz. Raporlama. |
qa manual |
Seçilen sağlayıcı/model hattına karşı tek seferlik bir prompt çalıştırır. |
qa ui |
QA hata ayıklayıcı UI ve yerel QA veri yolunu başlatır (takma ad: pnpm qa:lab:ui). |
qa docker-build-image |
Önceden hazırlanmış QA Docker imajını oluşturur. |
qa docker-scaffold |
QA panosu + gateway hattı için docker-compose iskeleti yazar. |
qa up |
QA sitesini oluşturur, Docker destekli yığını başlatır, URL'yi yazdırır (takma ad: pnpm qa:lab:up; :fast varyantı --use-prebuilt-image --bind-ui-dist --skip-ui-build ekler). |
qa aimock |
Yalnızca AIMock sağlayıcı sunucusunu başlatır. |
qa mock-openai |
Yalnızca senaryo farkındalıklı mock-openai sağlayıcı sunucusunu başlatır. |
qa credentials doctor / add / list / remove |
Paylaşılan Convex kimlik bilgisi havuzunu yönetir. |
qa matrix |
Tek kullanımlık Tuwunel homeserver'a karşı canlı aktarım hattı. Bkz. Matrix QA. |
qa telegram |
Gerçek özel Telegram grubuna karşı canlı aktarım hattı. |
qa discord |
Gerçek özel Discord guild kanalına karşı canlı aktarım hattı. |
qa slack |
Gerçek özel Slack kanalına karşı canlı aktarım hattı. |
qa mantis |
Canlı aktarım hataları için, Discord durum tepkileri kanıtı, Crabbox masaüstü/tarayıcı smoke testi ve Slack-in-VNC smoke testiyle önce ve sonra doğrulama çalıştırıcısı. Bkz. Mantis ve Mantis Slack Masaüstü Çalıştırma Kılavuzu. |
Operatör akışı
Geçerli QA operatör akışı iki panelli bir QA sitesidir:
- Sol: agent ile Gateway panosu (Control UI).
- Sağ: Slack benzeri transkripti ve senaryo planını gösteren QA Lab.
Şununla çalıştırın:
pnpm qa:lab:up
Bu, QA sitesini oluşturur, Docker destekli gateway hattını başlatır ve bir operatörün ya da otomasyon döngüsünün agent'a bir QA görevi verebileceği, gerçek kanal davranışını gözlemleyebileceği ve neyin çalıştığını, başarısız olduğunu veya engelli kaldığını kaydedebileceği QA Lab sayfasını kullanıma açar.
Her seferinde Docker imajını yeniden oluşturmadan daha hızlı QA Lab UI yinelemesi için, yığını bind-mounted QA Lab paketiyle başlatın:
pnpm openclaw qa docker-build-image
pnpm qa:lab:build
pnpm qa:lab:up:fast
pnpm qa:lab:watch
qa:lab:up:fast, Docker servislerini önceden oluşturulmuş bir imajda tutar ve
extensions/qa-lab/web/dist dizinini qa-lab container'ına bind-mount eder. qa:lab:watch
değişiklik olduğunda bu paketi yeniden oluşturur ve QA Lab varlık hash'i
değiştiğinde tarayıcı otomatik olarak yeniden yüklenir.
Yerel OpenTelemetry izleme smoke testi için şunu çalıştırın:
pnpm qa:otel:smoke
Bu betik yerel bir OTLP/HTTP izleme alıcısı başlatır,
diagnostics-otel Plugin'i etkinleştirilmiş şekilde otel-trace-smoke QA senaryosunu çalıştırır, ardından
dışa aktarılan protobuf span'lerini çözer ve sürüm açısından kritik şekli doğrular:
openclaw.run, openclaw.harness.run, openclaw.model.call,
openclaw.context.assembled ve openclaw.message.delivery mevcut olmalıdır;
model çağrıları başarılı turlarda StreamAbandoned dışa aktarmamalıdır; ham tanılama ID'leri ve
openclaw.content.* öznitelikleri izlemenin dışında kalmalıdır. QA suite yapıtlarının yanına
otel-smoke-summary.json yazar.
Gözlemlenebilirlik QA yalnızca kaynak checkout'ında kalır. npm tarball, QA Lab'i bilinçli olarak
dışarıda bırakır; bu nedenle paket Docker sürüm hatları qa komutlarını çalıştırmaz. Tanılama
enstrümantasyonunu değiştirirken oluşturulmuş bir kaynak checkout'ından
pnpm qa:otel:smoke kullanın.
Aktarımı gerçek Matrix smoke hattı için şunu çalıştırın:
pnpm openclaw qa matrix --profile fast --fail-fast
Bu hat için tam CLI referansı, profil/senaryo kataloğu, env vars ve yapıt düzeni Matrix QA içinde bulunur. Kısaca: Docker'da tek kullanımlık bir Tuwunel homeserver sağlar, geçici sürücü/SUT/gözlemci kullanıcıları kaydeder, gerçek Matrix Plugin'ini bu aktarıma kapsamlanmış bir alt QA gateway içinde çalıştırır (qa-channel yok), ardından .artifacts/qa-e2e/matrix-<timestamp>/ altında Markdown raporu, JSON özeti, gözlemlenen olaylar yapıtı ve birleşik çıktı günlüğü yazar.
Senaryolar, birim testlerinin uçtan uca kanıtlayamayacağı aktarım davranışını kapsar: mention gating, allow-bot ilkeleri, allowlist'ler, üst düzey ve iş parçacıklı yanıtlar, DM yönlendirme, tepki işleme, gelen düzenleme bastırma, yeniden başlatma replay tekilleştirme, homeserver kesintisi kurtarma, onay metadata teslimi, medya işleme ve Matrix E2EE bootstrap/kurtarma/doğrulama akışları. E2EE CLI profili ayrıca gateway yanıtlarını denetlemeden önce aynı tek kullanımlık homeserver üzerinden openclaw matrix encryption setup ve doğrulama komutlarını çalıştırır.
Discord'da hata yeniden üretimi için yalnızca Mantis'e özel isteğe bağlı senaryolar da vardır. Açık durum tepkisi
zaman çizelgesi için --scenario discord-status-reactions-tool-only kullanın veya gerçek bir
Discord iş parçacığı oluşturup message.thread-reply işleminin bir filePath
ekini koruduğunu doğrulamak için --scenario discord-thread-reply-filepath-attachment kullanın.
Bu senaryolar, geniş smoke kapsamı yerine önce/sonra yeniden üretim probları oldukları için
varsayılan canlı Discord hattının dışında kalır.
İş parçacığı eki Mantis iş akışı, QA ortamında
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR veya
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64 yapılandırılmışsa oturum açılmış bir Discord Web
tanık videosu da ekleyebilir. Bu görüntüleyici profili yalnızca görsel yakalama içindir; geçme/kalma
kararı yine de Discord REST oracle'dan gelir.
CI, .github/workflows/qa-live-transports-convex.yml içinde aynı komut yüzeyini kullanır. Zamanlanmış ve varsayılan manuel çalıştırmalar canlı frontier kimlik bilgileri, --fast ve OPENCLAW_QA_MATRIX_NO_REPLY_WINDOW_MS=3000 ile hızlı Matrix profilini yürütür. Manuel matrix_profile=all, kapsamlı kataloğun paralel çalışabilmesi ve her shard için bir yapıt dizini tutulabilmesi için beş profil shard'ına yayılır.
Aktarımı gerçek Telegram, Discord ve Slack smoke hatları için:
pnpm openclaw qa telegram
pnpm openclaw qa discord
pnpm openclaw qa slack
Bunlar iki botlu (sürücü + SUT) önceden var olan gerçek bir kanalı hedefler. Gerekli env vars, senaryo listeleri, çıktı yapıtları ve Convex kimlik bilgisi havuzu aşağıdaki Telegram, Discord ve Slack QA başvurusu bölümünde belgelenmiştir.
Tam Slack masaüstü VM çalıştırmasını VNC kurtarma ile yapmak için şunu çalıştırın:
pnpm openclaw qa mantis slack-desktop-smoke \
--gateway-setup \
--scenario slack-canary \
--keep-lease
Bu komut bir Crabbox masaüstü/tarayıcı makinesi kiralar, Slack canlı hattını
VM içinde çalıştırır, VNC tarayıcısında Slack Web'i açar, masaüstünü yakalar ve
video yakalama kullanılabildiğinde slack-qa/, slack-desktop-smoke.png ve
slack-desktop-smoke.mp4 dosyalarını Mantis yapı dizinine geri kopyalar.
Crabbox masaüstü/tarayıcı kiralamaları yakalama araçlarını ve tarayıcı/yerel
derleme yardımcı paketlerini baştan sağlar; bu yüzden senaryo yalnızca eski
kiralamalarda yedekleri kurmalıdır. Mantis toplam ve aşama başına süreleri
mantis-slack-desktop-smoke-report.md içinde raporlar; böylece yavaş
çalıştırmalarda sürenin kiralama ısınmasına, kimlik bilgisi edinimine, uzak
kuruluma ya da yapı kopyalamaya gidip gitmediği görülebilir. Slack Web'e VNC
üzerinden elle giriş yaptıktan sonra --lease-id <cbx_...> ile yeniden
kullanın; yeniden kullanılan kiralamalar Crabbox'ın pnpm depo önbelleğini de
sıcak tutar. Varsayılan --hydrate-mode source, bir kaynak checkout'undan
doğrular ve VM içinde install/build çalıştırır. --hydrate-mode prehydrated
modunu yalnızca yeniden kullanılan uzak çalışma alanında zaten node_modules ve
derlenmiş bir dist/ varsa kullanın; bu mod pahalı install/build adımını atlar
ve çalışma alanı hazır olmadığında kapalı şekilde başarısız olur.
--gateway-setup ile Mantis, VM içinde 38973 portunda kalıcı bir OpenClaw
Slack gateway'i çalışır durumda bırakır; onsuz komut normal botlar arası Slack
QA hattını çalıştırır ve yapı yakalamadan sonra çıkar.
Operatör kontrol listesi, GitHub iş akışı dispatch komutu, kanıt yorum sözleşmesi, hydrate-mode karar tablosu, zamanlama yorumu ve hata işleme adımları Mantis Slack Masaüstü Runbook içinde yer alır.
Bir ajan/CV tarzı masaüstü görevi için şunu çalıştırın:
pnpm openclaw qa mantis visual-task \
--browser-url https://example.net \
--expect-text "Example Domain" \
--vision-model openai/gpt-5.4
visual-task bir Crabbox masaüstü/tarayıcı makinesi kiralar ya da yeniden
kullanır, crabbox record --while başlatır, görünür tarayıcıyı iç içe bir
visual-driver üzerinden sürer, visual-task.png yakalar, --vision-mode image-describe seçildiğinde ekran görüntüsüne karşı openclaw infer image describe çalıştırır ve visual-task.mp4, mantis-visual-task-summary.json,
mantis-visual-task-driver-result.json ve mantis-visual-task-report.md
yazar. --expect-text ayarlandığında, görsel prompt yapılandırılmış bir JSON
kararı ister ve yalnızca model pozitif görünür kanıt bildirdiğinde geçer; hedef
metni yalnızca alıntılayan negatif bir yanıt assertion'ı başarısız kılar.
Masaüstü, tarayıcı, ekran görüntüsü ve video tesisatını bir görüntü anlama
sağlayıcısını çağırmadan kanıtlayan modelsiz bir smoke için --vision-mode metadata kullanın. Kayıt, visual-task için zorunlu bir yapıdır; Crabbox boş
olmayan bir visual-task.mp4 kaydetmezse, görsel sürücü geçmiş olsa bile görev
başarısız olur. Hata durumunda, görev zaten geçmiş ve --keep-lease
ayarlanmamış değilse Mantis kiralamayı VNC için tutar.
Havuzdaki canlı kimlik bilgilerini kullanmadan önce şunu çalıştırın:
pnpm openclaw qa credentials doctor
doctor, Convex broker ortamını denetler, endpoint ayarlarını doğrular ve maintainer gizlisi mevcut olduğunda admin/list erişilebilirliğini doğrular. Gizliler için yalnızca ayarlı/eksik durumunu raporlar.
Canlı taşıma kapsamı
Canlı taşıma hatları, her birinin kendi senaryo listesi şeklini icat etmesi
yerine tek bir sözleşme paylaşır. qa-channel, geniş sentetik ürün davranışı
paketidir ve canlı taşıma kapsamı matrisinin parçası değildir.
| Hat | Kanarya | Bahsetme geçidi | Botlar arası | İzin listesi engeli | Üst düzey yanıt | Yeniden başlatma sonrası sürdürme | İleti dizisi takibi | İleti dizisi yalıtımı | Tepki gözlemi | Yardım komutu | Yerel komut kaydı |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
Bu, Matrix, Telegram ve gelecekteki canlı taşımalar tek bir açık taşıma
sözleşmesi kontrol listesini paylaşırken qa-channel öğesini geniş ürün
davranışı paketi olarak tutar.
Docker'ı QA yoluna dahil etmeden tek kullanımlık bir Linux VM hattı için şunu çalıştırın:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
Bu, yeni bir Multipass guest başlatır, bağımlılıkları kurar, OpenClaw'ı guest
içinde derler, qa suite çalıştırır, ardından normal QA raporunu ve özetini
host üzerindeki .artifacts/qa-e2e/... içine geri kopyalar.
Host üzerindeki qa suite ile aynı senaryo seçme davranışını yeniden kullanır.
Host ve Multipass paket çalıştırmaları, seçilen birden çok senaryoyu varsayılan
olarak yalıtılmış gateway worker'larıyla paralel yürütür. qa-channel
varsayılan olarak concurrency 4 kullanır ve seçilen senaryo sayısıyla
sınırlandırılır. Worker sayısını ayarlamak için --concurrency <count> ya da
seri yürütme için --concurrency 1 kullanın.
Herhangi bir senaryo başarısız olduğunda komut sıfır olmayan değerle çıkar.
Başarısız çıkış kodu olmadan yapıları istediğinizde --allow-failures kullanın.
Canlı çalıştırmalar, guest için pratik olan desteklenen QA auth girdilerini
iletir: env tabanlı sağlayıcı anahtarları, QA canlı sağlayıcı config yolu ve
mevcut olduğunda CODEX_HOME. Guest'in bağlı çalışma alanı üzerinden geri
yazabilmesi için --output-dir değerini repo kökü altında tutun.
Telegram, Discord ve Slack QA başvurusu
Matrix, senaryo sayısı ve Docker destekli homeserver sağlama nedeniyle ayrı bir sayfaya sahiptir. Telegram, Discord ve Slack daha küçüktür - her biri birkaç senaryo, profil sistemi yok, önceden mevcut gerçek kanallara karşı - bu nedenle başvuruları burada yer alır.
Paylaşılan CLI bayrakları
Bu hatlar extensions/qa-lab/src/live-transports/shared/live-transport-cli.ts
üzerinden kaydolur ve aynı bayrakları kabul eder:
| Bayrak | Varsayılan | Açıklama |
|---|---|---|
--scenario <id> |
- | Yalnızca bu senaryoyu çalıştırır. Tekrarlanabilir. |
--output-dir <path> |
<repo>/.artifacts/qa-e2e/{telegram,discord,slack}-<timestamp> |
Raporların/özetin/gözlenen mesajların ve çıktı günlüğünün yazıldığı yer. Göreli yollar --repo-root temel alınarak çözülür. |
--repo-root <path> |
process.cwd() |
Nötr bir cwd içinden çağırırken depo kökü. |
--sut-account <id> |
sut |
QA gateway config içindeki geçici hesap id'si. |
--provider-mode <mode> |
live-frontier |
mock-openai veya live-frontier (eski live-openai hâlâ çalışır). |
--model <ref> / --alt-model <ref> |
sağlayıcı varsayılanı | Birincil/alternatif model ref'leri. |
--fast |
kapalı | Desteklendiğinde sağlayıcı hızlı modu. |
--credential-source <env|convex> |
env |
Bkz. Convex kimlik bilgisi havuzu. |
--credential-role <maintainer|ci> |
CI'da ci, aksi halde maintainer |
--credential-source convex olduğunda kullanılan rol. |
Her hat, başarısız olan herhangi bir senaryoda sıfır olmayan değerle çıkar.
--allow-failures, başarısız çıkış kodu ayarlamadan yapıları yazar.
Telegram QA
pnpm openclaw qa telegram
İki farklı botu (driver + SUT) olan tek bir gerçek özel Telegram grubunu hedefler.
SUT botunun bir Telegram kullanıcı adı olmalıdır; botlar arası gözlem en iyi,
iki botta da @BotFather içinde Bot-to-Bot Communication Mode
etkinleştirildiğinde çalışır.
--credential-source env olduğunda gerekli env:
OPENCLAW_QA_TELEGRAM_GROUP_ID- sayısal chat id (string).OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN
İsteğe bağlı:
OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1, mesaj gövdelerini gözlenen mesaj yapılarında tutar (varsayılan olarak redakte edilir).
Senaryolar (extensions/qa-lab/src/live-transports/telegram/telegram-live.runtime.ts:44):
telegram-canarytelegram-mention-gatingtelegram-mentioned-message-replytelegram-help-commandtelegram-commands-commandtelegram-tools-compact-commandtelegram-whoami-commandtelegram-context-commandtelegram-long-final-reuses-previewtelegram-long-final-three-chunks
Çıktı yapıları:
telegram-qa-report.mdtelegram-qa-summary.json- kanaryadan başlayarak yanıt başına RTT içerir (driver gönderimi → gözlenen SUT yanıtı).telegram-qa-observed-messages.json-OPENCLAW_QA_TELEGRAM_CAPTURE_CONTENT=1olmadıkça gövdeler redakte edilir.
Discord QA
pnpm openclaw qa discord
İki botlu tek bir gerçek özel Discord guild kanalını hedefler: harness
tarafından kontrol edilen bir driver botu ve child OpenClaw gateway tarafından
paketlenmiş Discord Plugin üzerinden başlatılan bir SUT botu. Kanal bahsetme
işlemesini, SUT botunun Discord ile yerel /help komutunu kaydettiğini ve
isteğe bağlı Mantis kanıt senaryolarını doğrular.
--credential-source env olduğunda gerekli 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- Discord tarafından döndürülen SUT bot kullanıcı id'siyle eşleşmelidir (aksi halde hat hızlı başarısız olur).
İsteğe bağlı:
OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1, mesaj gövdelerini gözlenen mesaj yapılarında tutar.OPENCLAW_QA_DISCORD_VOICE_CHANNEL_ID,discord-voice-autojoiniçin ses/sahne kanalını seçer; onsuz senaryo, SUT botu için görünen ilk ses/sahne kanalını seçer.
Senaryolar (extensions/qa-lab/src/live-transports/discord/discord-live.runtime.ts:36):
discord-canarydiscord-mention-gatingdiscord-native-help-command-registrationdiscord-voice-autojoin- isteğe bağlı ses senaryosu. Kendi başına çalışır,channels.discord.voice.autoJoinayarını etkinleştirir ve SUT botunun mevcut Discord ses durumunun hedef ses/sahne kanalı olduğunu doğrular. Convex Discord kimlik bilgileri isteğe bağlıvoiceChannelIdiçerebilir; aksi halde çalıştırıcı, sunucudaki ilk görünür ses/sahne kanalını keşfeder.discord-status-reactions-tool-only- isteğe bağlı Mantis senaryosu. SUT'yimessages.statusReactions.enabled=trueile her zaman açık, yalnızca araç kullanılan sunucu yanıtlarına geçirdiği için kendi başına çalışır; ardından bir REST tepki zaman çizelgesi ile HTML/PNG görsel yapıtlarını yakalar. Mantis öncesi/sonrası raporları, senaryonun sağladığı MP4 yapıtlarınıbaseline.mp4vecandidate.mp4olarak da korur.
Discord ses otomatik katılma senaryosunu açıkça çalıştırın:
pnpm openclaw qa discord \
--scenario discord-voice-autojoin \
--provider-mode mock-openai
Mantis durum tepkisi senaryosunu açıkça çalıştırın:
pnpm openclaw qa discord \
--scenario discord-status-reactions-tool-only \
--provider-mode live-frontier \
--model openai/gpt-5.4 \
--alt-model openai/gpt-5.4 \
--fast
Çıktı yapıtları:
discord-qa-report.mddiscord-qa-summary.jsondiscord-qa-observed-messages.json-OPENCLAW_QA_DISCORD_CAPTURE_CONTENT=1olmadıkça gövdeler sansürlenir.- Durum tepkisi senaryosu çalıştığında
discord-qa-reaction-timelines.jsonvediscord-status-reactions-tool-only-timeline.png.
Slack QA
pnpm openclaw qa slack
İki farklı botu olan gerçek bir özel Slack kanalını hedefler: test donanımı tarafından denetlenen bir sürücü bot ve paketle gelen Slack Plugin'i üzerinden alt OpenClaw Gateway tarafından başlatılan bir SUT botu.
--credential-source env kullanıldığında gerekli ortam değişkenleri:
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKEN
İsteğe bağlı:
OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1, gözlenen ileti yapıtlarında ileti gövdelerini tutar.
Senaryolar (extensions/qa-lab/src/live-transports/slack/slack-live.runtime.ts:39):
slack-canaryslack-mention-gatingslack-allowlist-blockslack-top-level-reply-shapeslack-restart-resumeslack-thread-follow-upslack-thread-isolation
Çıktı yapıtları:
slack-qa-report.mdslack-qa-summary.jsonslack-qa-observed-messages.json-OPENCLAW_QA_SLACK_CAPTURE_CONTENT=1olmadıkça gövdeler sansürlenir.
Slack çalışma alanını ayarlama
Kulvar, tek bir çalışma alanında iki ayrı Slack uygulamasına ve her iki botun da üyesi olduğu bir kanala ihtiyaç duyar:
channelId- her iki botun davet edildiği bir kanalınCxxxxxxxxxxkimliği. Özel ayrılmış bir kanal kullanın; kulvar her çalıştırmada gönderi yapar.driverBotToken- Driver uygulamasının bot belirteci (xoxb-...).sutBotToken- SUT uygulamasının bot belirteci (xoxb-...); bot kullanıcı kimliğinin farklı olması için sürücüden ayrı bir Slack uygulaması olmalıdır.sutAppToken- SUT uygulamasınınconnections:writekapsamına sahip uygulama düzeyi belirteci (xapp-...); Socket Mode tarafından, SUT uygulamasının olay alabilmesi için kullanılır.
Üretim çalışma alanını yeniden kullanmak yerine QA için ayrılmış bir Slack çalışma alanını tercih edin.
Aşağıdaki SUT manifestosu, paketle gelen Slack Plugin'inin üretim kurulumunu (extensions/slack/src/setup-shared.ts:10) canlı Slack QA paketinin kapsadığı izinler ve olaylarla bilinçli olarak sınırlar. Kullanıcıların gördüğü üretim kanalı kurulumu için bkz. Slack kanalı hızlı kurulum; QA Driver/SUT çifti bilinçli olarak ayrıdır çünkü kulvarın tek bir çalışma alanında iki ayrı bot kullanıcı kimliğine ihtiyacı vardır.
1. Driver uygulamasını oluşturun
api.slack.com/apps adresine gidin → Create New App → From a manifest → QA çalışma alanını seçin, aşağıdaki manifestoyu yapıştırın, ardından Install to Workspace seçeneğini kullanın:
{
"display_information": {
"name": "OpenClaw QA Driver",
"description": "Test driver bot for OpenClaw QA Slack live lane"
},
"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
}
}
Bot User OAuth Token (xoxb-...) değerini kopyalayın; bu driverBotToken olur. Sürücünün yalnızca ileti göndermesi ve kendini tanımlaması gerekir; olay gerekmez, Socket Mode gerekmez.
2. SUT uygulamasını oluşturun
Aynı çalışma alanında Create New App → From a manifest adımlarını tekrarlayın. Bu QA uygulaması, paketle gelen Slack Plugin'inin üretim manifestosunun (extensions/slack/src/setup-shared.ts:10) daha dar bir sürümünü bilinçli olarak kullanır: canlı Slack QA paketi henüz tepki işlemeyi kapsamadığı için tepki kapsamları ve olayları çıkarılmıştır.
{
"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"
]
}
}
}
Slack uygulamayı oluşturduktan sonra ayarlar sayfasında iki şey yapın:
- Install to Workspace → Bot User OAuth Token değerini kopyalayın → bu
sutBotTokenolur. - Basic Information → App-Level Tokens → Generate Token and Scopes →
connections:writekapsamını ekleyin → kaydedin →xapp-...değerini kopyalayın → busutAppTokenolur.
Her belirteçte auth.test çağırarak iki botun farklı kullanıcı kimliklerine sahip olduğunu doğrulayın. Çalışma zamanı sürücü ile SUT'yi kullanıcı kimliğine göre ayırt eder; ikisi için tek bir uygulamayı yeniden kullanmak mention-gating'i hemen başarısız yapar.
3. Kanalı oluşturun
QA çalışma alanında bir kanal oluşturun (ör. #openclaw-qa) ve kanalın içinden her iki botu davet edin:
/invite @OpenClaw QA Driver
/invite @OpenClaw QA SUT
Cxxxxxxxxxx kimliğini channel info → About → Channel ID bölümünden kopyalayın; bu channelId olur. Herkese açık bir kanal çalışır; özel kanal kullanırsanız her iki uygulamada zaten groups:history bulunduğu için test donanımının geçmiş okumaları yine başarılı olur.
4. Kimlik bilgilerini kaydedin
İki seçenek vardır. Tek makineli hata ayıklama için ortam değişkenlerini kullanın (dört OPENCLAW_QA_SLACK_* değişkenini ayarlayın ve --credential-source env geçin) ya da CI ve diğer bakımcıların kiralayabilmesi için paylaşılan Convex havuzunu seed edin.
Convex havuzu için dört alanı bir JSON dosyasına yazın:
{
"channelId": "Cxxxxxxxxxx",
"driverBotToken": "xoxb-...",
"sutBotToken": "xoxb-...",
"sutAppToken": "xapp-..."
}
Kabuğunuzda OPENCLAW_QA_CONVEX_SITE_URL ve OPENCLAW_QA_CONVEX_SECRET_MAINTAINER dışa aktarılmışken kaydedin ve doğrulayın:
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 --json
count: 1, status: "active" ve lease alanının olmamasını bekleyin.
5. Uçtan uca doğrulayın
Her iki botun aracı üzerinden birbiriyle konuşabildiğini doğrulamak için kulvarı yerel olarak çalıştırın:
pnpm openclaw qa slack \
--credential-source convex \
--credential-role maintainer \
--output-dir .artifacts/qa-e2e/slack-local
Yeşil bir çalıştırma 30 saniyenin oldukça altında tamamlanır ve slack-qa-report.md, hem slack-canary hem de slack-mention-gating için pass durumunu gösterir. Kulvar yaklaşık 90 saniye takılı kalıp Convex credential pool exhausted for kind "slack" ile çıkarsa havuz ya boştur ya da her satır kiralanmıştır; qa credentials list --kind slack --status all --json hangisi olduğunu söyler.
Convex kimlik bilgisi havuzu
Telegram, Discord ve Slack kulvarları, yukarıdaki ortam değişkenlerini okumak yerine paylaşılan bir Convex havuzundan kimlik bilgisi kiralayabilir. --credential-source convex geçin (veya OPENCLAW_QA_CREDENTIAL_SOURCE=convex ayarlayın); QA Lab özel bir lease alır, çalışma süresince Heartbeat gönderir ve kapanışta serbest bırakır. Havuz türleri "telegram", "discord" ve "slack" değerleridir.
Aracının admin/add üzerinde doğruladığı payload şekilleri:
- Telegram (
kind: "telegram"):{ groupId: string, driverToken: string, sutToken: string }-groupIdsayısal bir sohbet kimliği dizesi olmalıdır. - Discord (
kind: "discord"):{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string }. - Slack (
kind: "slack"):{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }-channelId,^[A-Z][A-Z0-9]+$ile eşleşmelidir (Cxxxxxxxxxxgibi bir Slack kimliği). Uygulama ve kapsam hazırlığı için bkz. Slack çalışma alanını ayarlama.
Operasyonel ortam değişkenleri ve Convex aracı uç noktası sözleşmesi Testing → Convex üzerinden paylaşılan Telegram kimlik bilgileri içinde yer alır (bölüm adı Discord desteğinden öncedir; aracı semantiği her iki tür için de aynıdır).
Repo destekli seed'ler
Seed varlıkları qa/ içinde bulunur:
qa/scenarios/index.mdqa/scenarios/<theme>/*.md
Bunlar bilinçli olarak git içindedir; böylece QA planı hem insanlar hem de ajan tarafından görülebilir.
qa-lab genel bir markdown çalıştırıcı olarak kalmalıdır. Her senaryo markdown dosyası, tek bir test çalıştırması için doğruluk kaynağıdır ve şunları tanımlamalıdır:
- senaryo meta verileri
- isteğe bağlı kategori, yetenek, kulvar ve risk meta verileri
- doküman ve kod referansları
- isteğe bağlı Plugin gereksinimleri
- isteğe bağlı Gateway yapılandırma yaması
- çalıştırılabilir
qa-flow
qa-flow'u destekleyen yeniden kullanılabilir çalışma zamanı yüzeyinin genel ve kesişen kalmasına izin verilir. Örneğin, markdown senaryoları, özel durum çalıştırıcısı eklemeden gömülü Control UI'ı Gateway browser.request birleşimi üzerinden süren tarayıcı tarafı yardımcılarla taşıma tarafı yardımcılarını birleştirebilir.
Senaryo dosyaları, kaynak ağacı klasörü yerine ürün yeteneğine göre gruplanmalıdır. Dosyalar taşındığında senaryo kimliklerini kararlı tutun; uygulama izlenebilirliği için docsRefs ve codeRefs kullanın.
Temel liste şunları kapsayacak kadar geniş kalmalıdır:
- DM ve kanal sohbeti
- thread davranışı
- ileti eylemi yaşam döngüsü
- cron geri çağrıları
- bellek hatırlama
- model değiştirme
- alt ajan devri
- repo okuma ve doküman okuma
- Lobster Invaders gibi küçük bir derleme görevi
Sağlayıcı mock kulvarları
qa suite iki yerel sağlayıcı mock kulvarına sahiptir:
mock-openai, senaryo farkındalığı olan OpenClaw mock'udur. Repo destekli QA ve parite kapıları için varsayılan deterministik mock kulvarı olarak kalır.aimock, deneysel protokol, fixture, kayıt/yeniden oynatma ve kaos kapsamı için AIMock destekli bir sağlayıcı sunucusu başlatır. Eklemelidir vemock-openaisenaryo dağıtıcısının yerini almaz.
Sağlayıcı kulvarı uygulaması extensions/qa-lab/src/providers/ altında bulunur. Her sağlayıcı kendi varsayılanlarına, yerel sunucu başlangıcına, Gateway model yapılandırmasına, auth-profile hazırlama ihtiyaçlarına ve canlı/mock yetenek bayraklarına sahiptir. Paylaşılan paket ve Gateway kodu, sağlayıcı adlarına göre dallanmak yerine sağlayıcı kayıt defteri üzerinden yönlendirme yapmalıdır.
Taşıma bağdaştırıcıları
qa-lab, Markdown QA senaryoları için genel bir taşıma katmanına sahiptir. qa-channel, bu katmandaki ilk adaptördür, ancak tasarım hedefi daha geniştir: gelecekteki gerçek veya sentetik kanallar, taşımaya özgü bir QA çalıştırıcısı eklemek yerine aynı paket çalıştırıcısına bağlanmalıdır.
Mimari düzeyde ayrım şöyledir:
qa-lab, genel senaryo yürütmeyi, worker eşzamanlılığını, artefakt yazımını ve raporlamayı sahiplenir.- Taşıma adaptörü Gateway yapılandırmasını, hazır olma durumunu, gelen ve giden gözlemi, taşıma eylemlerini ve normalleştirilmiş taşıma durumunu sahiplenir.
qa/scenarios/altındaki Markdown senaryo dosyaları test çalışmasını tanımlar;qa-labbunları yürüten yeniden kullanılabilir çalışma zamanı yüzeyini sağlar.
Kanal ekleme
Markdown QA sistemine kanal eklemek tam olarak iki şey gerektirir:
- Kanal için bir taşıma adaptörü.
- Kanal sözleşmesini çalıştıran bir senaryo paketi.
Paylaşılan qa-lab ana makinesi akışı sahiplenebiliyorken yeni bir üst düzey QA komut kökü eklemeyin.
qa-lab paylaşılan ana makine mekaniklerini sahiplenir:
openclaw qakomut kökü- paket başlatma ve kapatma
- worker eşzamanlılığı
- artefakt yazımı
- rapor oluşturma
- senaryo yürütme
- eski
qa-channelsenaryoları için uyumluluk takma adları
Çalıştırıcı Plugin’leri taşıma sözleşmesini sahiplenir:
openclaw qa <runner>öğesinin paylaşılanqakökü altına nasıl bağlandığı- Gateway’in bu taşıma için nasıl yapılandırıldığı
- hazır olma durumunun nasıl denetlendiği
- gelen olayların nasıl enjekte edildiği
- giden iletilerin nasıl gözlemlendiği
- transkriptlerin ve normalleştirilmiş taşıma durumunun nasıl sunulduğu
- taşıma destekli eylemlerin nasıl yürütüldüğü
- taşımaya özgü sıfırlama veya temizliğin nasıl ele alındığı
Yeni bir kanal için asgari benimseme eşiği:
- Paylaşılan
qakökünün sahibi olarakqa-labkalsın. - Taşıma çalıştırıcısını paylaşılan
qa-labana makine katmanında uygulayın. - Taşımaya özgü mekanikleri çalıştırıcı Plugin’i veya kanal donanımı içinde tutun.
- Çalıştırıcıyı rakip bir kök komut kaydetmek yerine
openclaw qa <runner>olarak bağlayın. Çalıştırıcı Plugin’leriopenclaw.plugin.jsoniçindeqaRunnerstanımlamalı veruntime-api.tsdosyasından eşleşen birqaRunnerCliRegistrationsdizisi dışa aktarmalıdır.runtime-api.tshafif kalmalıdır; lazy CLI ve çalıştırıcı yürütmesi ayrı giriş noktalarının arkasında kalmalıdır. - Temalı
qa/scenarios/dizinleri altında Markdown senaryoları yazın veya uyarlayın. - Yeni senaryolar için genel senaryo yardımcılarını kullanın.
- Depo bilinçli bir geçiş yapmadığı sürece mevcut uyumluluk takma adlarını çalışır durumda tutun.
Karar kuralı katıdır:
- Davranış bir kez
qa-labiçinde ifade edilebiliyorsa, onuqa-labiçine koyun. - Davranış tek bir kanal taşımasına bağlıysa, onu ilgili çalıştırıcı Plugin’inde veya Plugin donanımında tutun.
- Bir senaryo birden fazla kanalın kullanabileceği yeni bir yetenek gerektiriyorsa,
suite.tsiçinde kanala özgü bir dal eklemek yerine genel bir yardımcı ekleyin. - Bir davranış yalnızca tek bir taşıma için anlamlıysa, senaryoyu taşımaya özgü tutun ve bunu senaryo sözleşmesinde açıkça belirtin.
Senaryo yardımcısı adları
Yeni senaryolar için tercih edilen genel yardımcılar:
waitForTransportReadywaitForChannelReadyinjectInboundMessageinjectOutboundMessagewaitForTransportOutboundMessagewaitForChannelOutboundMessagewaitForNoTransportOutboundgetTransportSnapshotreadTransportMessagereadTransportTranscriptformatTransportTranscriptresetTransport
Uyumluluk takma adları mevcut senaryolar için kullanılabilir kalır: waitForQaChannelReady, waitForOutboundMessage, waitForNoOutbound, formatConversationTranscript, resetBus; ancak yeni senaryo yazımı genel adları kullanmalıdır. Takma adlar, tek seferlik büyük bir geçişi önlemek için vardır; ileriye dönük model olarak değildir.
Raporlama
qa-lab, gözlemlenen bus zaman çizelgesinden bir Markdown protokol raporu dışa aktarır.
Rapor şunları yanıtlamalıdır:
- Ne çalıştı
- Ne başarısız oldu
- Ne engelli kaldı
- Hangi takip senaryoları eklemeye değer
Mevcut senaryoların envanteri için, takip işini boyutlandırırken veya yeni bir taşıma bağlarken faydalı olur, pnpm openclaw qa coverage komutunu çalıştırın (makine tarafından okunabilir çıktı için --json ekleyin).
Karakter ve stil denetimleri için aynı senaryoyu birden fazla canlı model ref üzerinde çalıştırın ve değerlendirilmiş bir Markdown raporu yazın:
pnpm openclaw qa character-eval \
--model openai/gpt-5.5,thinking=medium,fast \
--model openai/gpt-5.2,thinking=xhigh \
--model openai/gpt-5,thinking=xhigh \
--model anthropic/claude-opus-4-6,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.5,thinking=xhigh,fast \
--judge-model anthropic/claude-opus-4-6,thinking=high \
--blind-judge-models \
--concurrency 16 \
--judge-concurrency 16
Komut, Docker değil yerel QA Gateway alt süreçlerini çalıştırır. Karakter değerlendirme
senaryoları kişiliği SOUL.md üzerinden ayarlamalı, ardından sohbet, çalışma alanı yardımı ve küçük dosya görevleri gibi sıradan kullanıcı turlarını çalıştırmalıdır. Aday modele
değerlendirildiği söylenmemelidir. Komut her tam transkripti korur,
temel çalıştırma istatistiklerini kaydeder, ardından desteklendiği yerlerde xhigh
akıl yürütmeyle hızlı modda jüri modellerinden çalışmaları doğallık, his ve mizah açısından sıralamasını ister.
Sağlayıcıları karşılaştırırken --blind-judge-models kullanın: jüri istemi yine
her transkripti ve çalıştırma durumunu alır, ancak aday ref’leri candidate-01 gibi
nötr etiketlerle değiştirilir; rapor, ayrıştırmadan sonra sıralamaları gerçek ref’lerle eşleştirir.
Aday çalıştırmaları varsayılan olarak high düşünme kullanır; GPT-5.5 için medium, bunu destekleyen eski OpenAI değerlendirme ref’leri için xhigh
kullanılır. Belirli bir adayı satır içinde
--model provider/model,thinking=<level> ile geçersiz kılın. --thinking <level> hâlâ
genel bir geri dönüş ayarlar ve eski --model-thinking <provider/model=level> biçimi
uyumluluk için korunur.
OpenAI aday ref’leri varsayılan olarak hızlı mod kullanır; böylece sağlayıcının desteklediği yerlerde
öncelikli işleme kullanılır. Tek bir aday veya jürinin geçersiz kılmaya ihtiyacı olduğunda satır içinde
,fast, ,no-fast veya ,fast=false ekleyin. Hızlı modu her aday model için
zorlamak istediğinizde yalnızca --fast geçirin. Aday ve jüri süreleri
karşılaştırma analizi için rapora kaydedilir, ancak jüri istemleri açıkça
hıza göre sıralama yapmamasını söyler.
Aday ve jüri model çalıştırmalarının ikisi de varsayılan olarak 16 eşzamanlılık kullanır. Sağlayıcı sınırları veya yerel Gateway
baskısı bir çalışmayı fazla gürültülü yaptığında
--concurrency veya --judge-concurrency değerini düşürün.
Aday --model geçirilmediğinde, karakter değerlendirmesi varsayılan olarak
openai/gpt-5.5, openai/gpt-5.2, openai/gpt-5, anthropic/claude-opus-4-6,
anthropic/claude-sonnet-4-6, zai/glm-5.1,
moonshot/kimi-k2.5 ve
google/gemini-3.1-pro-preview kullanır.
--judge-model geçirilmediğinde, jüriler varsayılan olarak
openai/gpt-5.5,thinking=xhigh,fast ve
anthropic/claude-opus-4-6,thinking=high olur.