Skip to main content
Mantis, OpenClaw davranışı için görsel CI kanıtı ve bir PR yorumu yayımlar. Canlı aktarım senaryoları, bilinen hatalı bir temel çizgiyi aday bir ref ile karşılaştırır; odaklanmış tarayıcı hatları bunun yerine tek bir adayı deterministik, taklit edilmiş bir aktarıma karşı kanıtlayabilir. Discord; gerçek bot kimlik doğrulaması, sunucu kanalları, tepkiler, ileti dizileri ve bir tarayıcı tanığıyla ilk kullanıma sunulan oldu. Slack, Telegram ve odaklanmış Control UI sohbet hatları da mevcuttur; WhatsApp ve Matrix uygulanmamıştır.

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 komutlar pnpm 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

Bot kullanıcısını, sunucuyu, sunucunun kanallarını ve hedef kanalı almak için Discord REST API’sini (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

Bir Crabbox masaüstünü kiralar veya yeniden kullanır, VNC oturumu içinde --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 .tgz Chrome profil arşivini geri yükler (varsayılan OPENCLAW_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 (veya OPENCLAW_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.
Discord Web kanıtı için Mantis, bot token’ı değil, özel bir görüntüleyici hesabı kullanır. Discord REST oracle’ı (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

Bir Crabbox masaüstünü kiralar veya yeniden kullanır, çalışma kopyasını VM içine eşitler, içinde 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_ID
  • OPENCLAW_QA_SLACK_DRIVER_BOT_TOKEN
  • OPENCLAW_QA_SLACK_SUT_BOT_TOKEN
  • OPENCLAW_QA_SLACK_SUT_APP_TOKEN
  • Uzak model hattı için OPENCLAW_LIVE_OPENAI_KEY (yerel olarak yalnızca OPENAI_API_KEY ayarlanmışsa Mantis, Crabbox’ı çağırmadan önce bunu OPENCLAW_LIVE_OPENAI_KEY konumuna 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

Bir Crabbox masaüstünü kiralar veya yeniden kullanır, yerel Linux Telegram Desktop’ı yükler, isteğe bağlı olarak bir kullanıcı oturumu arşivini geri yükler, OpenClaw’ı kiralanan Telegram SUT bot token’ıyla yapılandırır, 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ına mantis-evidence.json yazar:
Yapıt 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:
Ekran görüntüleri gizli bilgi değil, kanıttır; ancak yine de redaksiyon disiplini gerektirir: özel kanal adları, kullanıcı adları veya ileti içerikleri görünebilir. Herkese açık yapıt yüklemeleri için 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_ID
  • MANTIS_ARTIFACT_R2_SECRET_ACCESS_KEY
  • MANTIS_ARTIFACT_R2_BUCKET (iş akışları openclaw-crabbox-artifacts değerini ayarlar)
  • MANTIS_ARTIFACT_R2_ENDPOINT
  • MANTIS_ARTIFACT_R2_REGION (iş akışları auto değerini ayarlar)
  • MANTIS_ARTIFACT_R2_PUBLIC_BASE_URL (iş akışları https://artifacts.openclaw.ai değerini ayarlar)
Yorumlar, 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 yorum tetikleyicileri varsayılan olarak PR baş SHA’sını aday, 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_TOKEN
  • OPENCLAW_QA_DISCORD_GUILD_ID
  • OPENCLAW_QA_DISCORD_CHANNEL_ID
  • Yerel qa mantis run --credential-source env ayrıca OPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN, OPENCLAW_QA_DISCORD_SUT_BOT_TOKEN ve OPENCLAW_QA_DISCORD_SUT_APPLICATION_ID gerektirir. GitHub iş akışları normalde ham Discord bot belirteçleri yerine --credential-source convex ve 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_CI
  • OPENAI_API_KEY (veya Telegram Desktop kanıtına özgü OPENCLAW_MANTIS_AGENT_OPENAI_API_KEY)
  • CRABBOX_COORDINATOR / CRABBOX_COORDINATOR_TOKEN (iş akışları ayrıca OPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR / _TOKEN değ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_SECRET
  • MANTIS_GITHUB_APP_ID, MANTIS_GITHUB_APP_PRIVATE_KEY
Mantis çalıştırıcısı Discord/Slack/Telegram bot belirteçlerini, sağlayıcı API anahtarlarını, tarayıcı çerezlerini, kimlik doğrulama profili içeriklerini, VNC parolalarını veya ham kimlik bilgisi yüklerini asla yazdırmamalıdır. Bir belirteç bir soruna, PR’a, sohbete veya günlüğe sızarsa yedek gizli bilgi kaydedildikten sonra onu döndürün.

Ç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.
Yalnızca adaya yönelik tarayıcı kanıtı, adayın taklit Gateway ve görünür UI doğrulamalarını geçip geçmediğini bildirir; temel çizginin yeniden üretildiğini iddia etmez.

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çin extensions/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?