Sahiplik
- OpenClaw (
extensions/qa-lab/src/mantis/*): senaryo çalışma zamanı,pnpm openclaw qa mantis <command>CLI, kanıt şeması. - QA Lab (
extensions/qa-lab/src/live-transports/*): canlı aktarım test düzeneği, sürücü/SUT botları, rapor/kanıt yazıcıları. - Crabbox (
openclaw/crabbox): hazırlanmış Linux makineleri, kiralamalar, VNC,crabbox media preview. - GitHub Actions (
.github/workflows/mantis-*.yml): uzak giriş noktaları, yapıt saklama. - ClawSweeper: bakımcı PR komutlarını ayrıştırır, iş akışlarını başlatır, son PR yorumunu gönderir.
CLI komutları
Tüm komutlarpnpm openclaw qa mantis <command> olup
extensions/qa-lab/src/mantis/cli.ts içinde tanımlanmıştır. Derleme/çalıştırma sırasında OPENCLAW_ENABLE_PRIVATE_QA_CLI=1
gerektirir (paketlenmiş iş akışları derlemeden önce OPENCLAW_BUILD_PRIVATE_QA=1 ve
OPENCLAW_ENABLE_PRIVATE_QA_CLI=1 ayarlar).
Her komut
--repo-root <path> ve --output-dir <path> kabul eder; Crabbox
komutları ayrıca --crabbox-bin, --provider, --machine-class/--class,
--lease-id, --idle-timeout, --ttl ve --keep-lease kabul eder. Sağlayıcı/sınıf için yerel CLI varsayılanları,
aksi belirtilmedikçe hetzner/beast şeklindedir; CI iş akışları
genellikle ikisini de geçersiz kılar.
discord-smoke
https://discord.com/api/v10) çağırır, kanalın sunucuya ait olduğunu
doğrular, ardından (--skip-post olmadığı sürece) bir mesaj gönderir ve
bir 👀 tepkisi ekler. mantis-discord-smoke-summary.json ve
mantis-discord-smoke-report.md yazar.
Token çözümleme sırası: --token-file değeri, ardından OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN
(--token-env ile geçersiz kılın), ardından OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN_FILE tarafından adlandırılan bir dosya
(--token-file-env ile geçersiz kılın). Sunucu/kanal kimlikleri
OPENCLAW_QA_DISCORD_GUILD_ID / OPENCLAW_QA_DISCORD_CHANNEL_ID üzerinden gelir (--guild-id /
--channel-id ile geçersiz kılın) ve 17-20 basamaklı Discord snowflake’leri olmalıdır. Yayımlanan özet ve raporda
bot/sunucu/kanal/mesaj kimliklerini ve adlarını <redacted> ile değiştirmek için
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 ayarlayın.
run
--transport şu anda yalnızca discord kabul eder. --scenario, her biri
kendi varsayılan temel çizgi ref’ine ve beklenen önce/sonra
etiketlerine (extensions/qa-lab/src/mantis/run.runtime.ts) sahip iki yerleşik kimlikten biridir:
--candidate varsayılan olarak HEAD değerini kullanır. Diğer bayraklar: --credential-source
(varsayılan convex), --credential-role (varsayılan ci), --provider-mode
(varsayılan live-frontier), --fast (varsayılan olarak açık), --skip-install, --skip-build.
Çalıştırıcı, <output-dir>/worktrees/ altında temel çizgi ve
aday için ayrılmış git worktree çalışma kopyaları oluşturur, her birinde
(atlanmadığı sürece) pnpm install/pnpm build çalıştırır, ardından her çalışma ağacına karşı
pnpm openclaw qa discord --scenario <id> --model openai/gpt-5.4 --alt-model openai/gpt-5.4 --allow-failures
çalıştırır. Her hat, discord-qa-reaction-timelines.json ile birlikte bir
<scenario-id>-timeline.html/.png çifti yazar; çalıştırıcı bu
kanıtı baseline//candidate/ altına geri kopyalar, çıktı dizinine comparison.json,
mantis-report.md ve mantis-evidence.json yazar ve
karşılaştırma başarılı olmadıysa (temel çizgi fail ve aday
pass) sıfırdan farklı bir kodla çıkar.
İkinci Discord senaryosu (discord-thread-reply-filepath-attachment), sürücü botuyla
bir üst mesaj gönderir, gerçek bir ileti dizisi oluşturur, depo içindeki bir filePath ile
SUT’nin message.thread-reply eylemini çağırır, ardından yanıtı ve ek dosya adını bulmak için
ileti dizisini yoklar. mantis-thread-report.md adlı bir ek bekler.
desktop-browser-smoke
--browser-url (varsayılan https://openclaw.ai) adresine ya da işlenmiş bir
--html-file öğesine yönlendirilmiş bir tarayıcı başlatır, bekler, scrot ile ekran görüntüsü alır, isteğe bağlı olarak
ffmpeg ile bir MP4 kaydeder ve desktop-browser-smoke.png / .mp4 / remote-metadata.json
öğelerini rsync ile --output-dir konumuna geri aktarır.
Bayraklar:
--lease-id <cbx_...>, yeni bir masaüstü oluşturmak yerine hazırlanmış bir masaüstünü yeniden kullanır.--browser-profile-dir <remote-path>, kalıcı bir masaüstünün çalıştırmalar arasında oturumunu açık tutması için uzaktaki bir Chrome kullanıcı veri dizinini yeniden kullanır (uzun ömürlü bir Discord Web görüntüleyici profili için kullanılır).--browser-profile-archive-env <name>, başlatmadan önce bu ortam değişkeninden base64 biçiminde bir.tgzChrome profil arşivini geri yükler (varsayılanOPENCLAW_MANTIS_BROWSER_PROFILE_TGZ_B64); Discord Web gibi oturum açmış tanıklar için kullanılır.--video-duration <seconds>, MP4 yakalama süresini denetler (varsayılan 10s).--keep-lease(veyaOPENCLAW_MANTIS_KEEP_VM=1), bu çalıştırmanın oluşturduğu kiralamayı VNC incelemesi için açık tutar; kiralama oluşturan başarısız çalıştırmalar da varsayılan olarak kiralamayı açık tutar.
qa discord aracılığıyla) yetkili kaynak olmaya devam eder;
OPENCLAW_QA_DISCORD_CAPTURE_UI_METADATA=1 ayarlandığında senaryo ayrıca bir
Discord Web URL yapıtı yazar ve OPENCLAW_QA_DISCORD_KEEP_THREADS=1,
tarayıcının açmasına yetecek kadar uzun süre ileti dizisini açık tutar.
GitHub iş akışı, MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR aracılığıyla kalıcı bir görüntüleyici profilini tercih eder
(tam profil arşivleri GitHub’ın gizli değer boyutu sınırını aşabilir);
küçük/önyükleme profilleri için bunun yerine MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64 üzerinden base64 biçiminde bir
.tgz geri yükleyebilir. Hiçbir kaynak yapılandırılmadığında
iş akışı yine deterministik temel çizgi/aday ekran görüntülerini yayımlar ve
oturum açmış tanığın atlandığını günlüğe kaydeder.
slack-desktop-smoke
pnpm openclaw qa slack çalıştırır, VNC tarayıcısında Slack Web’i açar,
masaüstünü yakalar ve hem Slack QA yapıtlarını (slack-qa/) hem de
VNC ekran görüntüsünü/videosunu yerel ortama geri kopyalar. Bu, SUT gateway’inin
ve tarayıcının aynı VM içinde çalıştığı tek Mantis biçimidir.
--gateway-setup ile komut, VM içinde $HOME/.openclaw-mantis/slack-openclaw konumunda kalıcı ve
tek kullanımlık bir OpenClaw ana dizini oluşturur, hedef kanal için Slack
Socket Mode yapılandırmasını yamalar,
openclaw gateway run --dev --allow-unconfigured --port 38973 başlatır ve
Chrome’u VNC oturumunda çalışır durumda bırakır; --gateway-setup belirtilmezse bunun yerine normal
bottan bota Slack QA hattı çalıştırılır.
--credential-source env için gerekli ortam değişkenleri (yerel varsayılan env; rol
varsayılanı maintainer):
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKEN- Uzak model hattı için
OPENCLAW_LIVE_OPENAI_KEY(yerel olarak yalnızcaOPENAI_API_KEYayarlanmışsa Mantis, Crabbox’ı çağırmadan önce bunuOPENCLAW_LIVE_OPENAI_KEYkonumuna kopyalar)
--credential-source convex ile Mantis, VM’yi oluşturmadan önce
paylaşılan havuzdan Slack SUT kimlik bilgisini kiralar ve kanal kimliğini, uygulama token’ını ve
bot token’ını OPENCLAW_MANTIS_SLACK_* ortam değişkenleri olarak VM’ye iletir; böylece GitHub
iş akışları ham Slack token’larına değil, yalnızca Convex aracı gizli değerine ihtiyaç duyar.
Diğer bayraklar: --slack-url <url> belirli bir URL’yi açar (aksi takdirde Mantis,
auth.test üzerinden https://app.slack.com/client/<team>/<channel> türetir);
--slack-channel-id <id> gateway izin listesi kanalını ayarlar;
OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIR, VM içindeki kalıcı Chrome
profilini denetler (varsayılan $HOME/.config/openclaw-mantis/slack-chrome-profile);
--approval-checkpoints, yerel Slack onay senaryolarını
(slack-approval-exec-native, slack-approval-plugin-native) çalıştırır ve gateway kurulumu yerine
bekleyen/çözümlenmiş denetim noktası ekran görüntülerini işler
(--gateway-setup ile birbirini dışlar); --hydrate-mode source|prehydrated,
--provider-mode, --model, --alt-model ve --fast, Slack canlı hattına doğrudan aktarılır.
Onay denetim noktası ekran görüntüleri, canlı Slack kullanıcı arayüzünden değil,
senaryonun gözlemlediği Slack API mesajından işlenir; slack-desktop-smoke.png, yalnızca
kiralamanın tarayıcı profilinde önceden oturum açılmışsa Slack Web’in kendisinin
kanıtıdır.
telegram-desktop-builder
openclaw gateway run --dev --allow-unconfigured --port 38974 başlatır, kiralanan özel gruba
sürücü botuyla bir hazır olma mesajı gönderir, ardından bir
ekran görüntüsü ve MP4 yakalar. Bot token’ı yalnızca OpenClaw’ı yapılandırır; Telegram Desktop’ta
asla oturum açmaz. Masaüstü görüntüleyicisi, --telegram-profile-archive-env <name> üzerinden geri yüklenen veya
VNC aracılığıyla elle oturum açılan ve --keep-lease ile canlı tutulan
ayrı bir Telegram kullanıcı oturumudur.
Bayraklar: --lease-id <cbx_...>, Telegram Desktop’ta oturumun zaten açık olduğu bir VM’ye karşı yeniden çalıştırır;
--telegram-profile-archive-env <name>, başlatmadan önce base64 biçiminde bir
.tgz profil arşivini geri yükler; --telegram-profile-dir <remote-path>,
uzak profil dizinini ayarlar (varsayılan $HOME/.local/share/TelegramDesktop);
--no-gateway-setup, yalnızca Telegram Desktop’ı yükleyip açar;
--credential-source/--credential-role varsayılan olarak convex/maintainer değerlerini kullanır.
Kanıt manifesti
Bir PR’a yayın yapan her senaryo, raporunun yanınamantis-evidence.json yazar:
path, manifest dizinine göredir; targetPath ise
yapılandırılmış R2/S3 yapıt önekine göredir. scripts/mantis/publish-pr-evidence.mjs,
dizin geçişini reddeder ve dosya eksik olduğunda "required": false içeren
girdileri atlar.
Yapıt türleri: timeline (belirlenimci önce/sonra ekran görüntüsü),
desktopScreenshot (VNC/tarayıcı ekran görüntüsü), motionPreview (kayıttan satır içi animasyonlu
GIF), motionClip (harekete göre kırpılmış MP4), fullVideo (tam
kayıt), metadata (JSON/günlük yardımcı dosyası), report (Markdown raporu).
Bir çalıştırmanın diskteki yapıt düzeni:
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 ayarlayın; bu,
Discord/Slack/Telegram GitHub iş akışlarında varsayılan olarak etkindir.
GitHub otomasyonu
scripts/mantis/publish-pr-evidence.mjs, yeniden kullanılabilir yayıncıdır. İş akışları
onu manifest, hedef PR, yapıt hedef kökü, yorum işaretçisi,
yapıt URL’si, çalıştırma URL’si ve istek kaynağıyla çağırır. Bildirilen yapıtları
Mantis R2 kovasına yükler, satır içi görüntüler/önizlemeler ve bağlantılı videolarla
önce özet sunan bir PR yorumu oluşturur, ardından mevcut işaretçi yorumunu günceller veya
yeni bir yorum oluşturur. Gerekli ortam değişkenleri:
MANTIS_ARTIFACT_R2_ACCESS_KEY_IDMANTIS_ARTIFACT_R2_SECRET_ACCESS_KEYMANTIS_ARTIFACT_R2_BUCKET(iş akışlarıopenclaw-crabbox-artifactsdeğerini ayarlar)MANTIS_ARTIFACT_R2_ENDPOINTMANTIS_ARTIFACT_R2_REGION(iş akışlarıautodeğerini ayarlar)MANTIS_ARTIFACT_R2_PUBLIC_BASE_URL(iş akışlarıhttps://artifacts.openclaw.aideğerini ayarlar)
github-actions[bot] üzerinden değil, gizli bir
işaretçi yorumu upsert anahtarı olarak kullanılarak Mantis GitHub App (MANTIS_GITHUB_APP_ID /
MANTIS_GITHUB_APP_PRIVATE_KEY) üzerinden gönderilir.
Mantis Discord Status Reactions ve Mantis Telegram Live öğelerinin ikisi de
baseline_ref/candidate_ref (veya bir PR yorumunda baseline=/candidate=) kabul eder
ve gizli bilgi taşıyan kimlik bilgileriyle çalıştırmadan önce çözümlenen SHA’nın
origin/main öğesinin bir atası, bir sürüm etiketi (v*) veya açık bir PR’ın
başı olduğunu doğrular.
Yazma/bakım/yönetici erişimi olan bir PR’dan yorum tetikleyicileri:
telegram-status-command öğesini ise senaryo olarak kullanır; belirli bir Crabbox sağlayıcısını veya önceden ısıtılmış
bir masaüstünü hedeflemek için provider=aws|hetzner ve
lease=<cbx_...> kabul eder. Mantis Telegram Desktop Proof, yalnızca PR
zaten mantis: telegram-visible-proof etiketini taşıyorsa bir PR yorumuna yanıt verir.
Web UI sohbet yorumu tetikleyicileri varsayılan olarak PR baş SHA’sını aday olarak kullanır. Bunlar
Control UI taklit Gateway sohbet kanıtını çalıştırıp tarayıcı yapıtlarını yayınlar; diğer
web sayfaları ve yerel uygulama yüzeyleri için normal Playwright/tarayıcı kanıtı, bakımcı
ekran görüntüleri, Crabbox veya yerel yapıtlar kullanın.
ClawSweeper ayrıca bir senaryoyu doğrudan tetikleyebilir:
Makineler ve gizli bilgiler
Yerel CLI Crabbox varsayılanları--provider hetzner --class beast şeklindedir; bunları
--provider, --class/--machine-class veya
OPENCLAW_MANTIS_CRABBOX_PROVIDER / OPENCLAW_MANTIS_CRABBOX_CLASS ile geçersiz kılın. GitHub
iş akışları genellikle her ikisini de geçersiz kılar (örneğin --class standard ve
Slack iş akışının aws/hetzner sağlayıcı seçimi girdisi). Bir sağlayıcı çok
yavaşsa veya kullanılamıyorsa bir geri dönüşü sabit kodlamak yerine onu aynı Crabbox
arayüzünün arkasına ekleyin.
VM temel çizgisi: masaüstünü destekleyen Chrome/Chromium, CDP erişimi, VNC/
noVNC, Node 22.22.3+, 24.15+ veya 25.9+ ve pnpm, bir OpenClaw çalışma kopyası ve
hedef aktarıma, GitHub’a, model sağlayıcılarına ve
kimlik bilgisi aracısına giden erişime sahip Linux.
Mantis komutları ve iş akışlarında kullanılan kimlik bilgisi ve ortam adları:
OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKENOPENCLAW_QA_DISCORD_GUILD_IDOPENCLAW_QA_DISCORD_CHANNEL_ID- Yerel
qa mantis run --credential-source envayrıcaOPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN,OPENCLAW_QA_DISCORD_SUT_BOT_TOKENveOPENCLAW_QA_DISCORD_SUT_APPLICATION_IDgerektirir. GitHub iş akışları normalde ham Discord bot belirteçleri yerine--credential-source convexve aşağıdaki aracı kimlik bilgilerini kullanır. - Herkese açık yapıt yüklemeleri için
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 OPENCLAW_QA_CONVEX_SITE_URL,OPENCLAW_QA_CONVEX_SECRET_CIOPENAI_API_KEY(veya Telegram Desktop kanıtına özgüOPENCLAW_MANTIS_AGENT_OPENAI_API_KEY)CRABBOX_COORDINATOR/CRABBOX_COORDINATOR_TOKEN(iş akışları ayrıcaOPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR/_TOKENdeğerlerini geri dönüş olarak kabul eder ve Crabbox’ı çağırmadan önce bunları düz adlara eşler)CRABBOX_ACCESS_CLIENT_ID,CRABBOX_ACCESS_CLIENT_SECRETMANTIS_GITHUB_APP_ID,MANTIS_GITHUB_APP_PRIVATE_KEY
Çalıştırma sonuçları
Önce/sonra aktarım senaryoları, kararsız bir ortamın ürün gerilemesi olarak okunmaması için şu sonuçları ayırt eder:- Hata yeniden üretildi: temel çizgi, senaryonun beklediği şekilde başarısız oldu.
- Düzenek hatası: ortam kurulumu, kimlik bilgileri, aktarım API’si, tarayıcı veya sağlayıcı, karar ölçütü anlamlı hâle gelmeden önce başarısız oldu.
Senaryo ekleme
Canlı aktarım senaryoları, bağımsız bir bildirimsel dosya biçimi olarak değil, aktarım başına TypeScript ile tanımlanır (Discord önce/sonra biçimi içinextensions/qa-lab/src/mantis/run.runtime.ts içindeki MANTIS_SCENARIO_CONFIGS öğesine bakın).
Her senaryo şunları gerektirir: kimlik ve başlık, aktarım, gerekli kimlik bilgileri, temel çizgi
ref ilkesi, aday ref ilkesi, OpenClaw yapılandırma yaması, kurulum/uyaran adımları,
beklenen temel çizgi ve aday karar ölçütü, görsel yakalama hedefleri, zaman aşımı
bütçesi ve temizleme adımları.
Odaklanmış, yalnızca adaya yönelik tarayıcı kanıtı, özel bir belirlenimci E2E testi
ve iş akışı kullanabilir. Kapsamını açık tutun, yürütmeden önce aday ref’ini doğrulayın,
gizli bilgi destekli yayınlamayı yalıtın ve aynı kanıt manifesti sözleşmesini oluşturun.
Görüntü kontrolleri yerine küçük, tür belirtilmiş karar ölçütlerini tercih edin: Discord tepki durumu veya
ileti referansları, Slack iş parçacığı ts/tepki API’si durumu, e-posta ileti kimlikleri
ve üstbilgileri. UI güvenilir biçimde gözlemlenebilen tek unsur olduğunda tarayıcı ekran görüntüleri kullanın
ve mevcut olduğunda görüntü kontrollerini platform API’si karar ölçütüne ek olarak tutun.
Discord, Slack ve Telegram’dan sonra aynı çalıştırıcı biçimi WhatsApp
(QR oturumu açma, yeniden tanımlama, teslimat, medya, tepkiler) ve Matrix’e
(şifreli odalar, iş parçacığı/yanıt ilişkileri, yeniden başlatmada sürdürme) genişletilebilir; henüz
hiçbiri uygulanmamıştır.
Açık sorular
- Mevcut Mantis botu yeniden kullanıldığında hangi Discord botu sürücü, hangisi SUT olmalıdır?
- GitHub, PR’lere ait Mantis yapıtlarını ne kadar süreyle saklamalıdır?
- ClawSweeper, bir bakımcı komutunu beklemek yerine ne zaman otomatik olarak bir Mantis senaryosu önermelidir?
- Herkese açık PR’lere yüklenmeden önce ekran görüntülerindeki hassas bilgiler gizlenmeli veya görüntüler kırpılmalı mıdır?