Get started
Peygamberdevesi
Mantis, gerçek bir çalışma zamanı, gerçek bir taşıma ve görünür kanıt gerektiren hatalar için OpenClaw uçtan uca doğrulama sistemidir. Bilinen hatalı bir ref üzerinde bir senaryo çalıştırır, kanıt toplar, aynı senaryoyu aday ref üzerinde çalıştırır ve karşılaştırmayı bir bakımcının bir PR'dan veya yerel bir komuttan inceleyebileceği artifact'lar olarak yayımlar.
Mantis, Discord ile başlar çünkü Discord bize yüksek değerli ilk kulvarı sağlar: gerçek bot kimlik doğrulaması, gerçek guild kanalları, reactions, threads, yerel komutlar ve insanların taşımanın ne gösterdiğini görsel olarak doğrulayabileceği bir tarayıcı UI'sı.
Hedefler
- Bir GitHub issue'sundan veya PR'dan gelen hatayı, kullanıcıların gördüğü aynı taşıma biçimiyle yeniden üretmek.
- Düzeltmeyi uygulamadan önce baseline ref üzerinde bir öncesi artifact'ı yakalamak.
- Düzeltmeyi uyguladıktan sonra aday ref üzerinde bir sonrası artifact'ı yakalamak.
- Mümkün olduğunda Discord REST reaction okuması veya kanal transcript kontrolü gibi deterministik bir doğrulama ölçütü kullanmak.
- Hatanın görünür bir UI yüzeyi olduğunda ekran görüntüleri yakalamak.
- Yerel olarak agent kontrollü bir CLI'dan ve uzaktan GitHub'dan çalıştırmak.
- Oturum açma, tarayıcı otomasyonu veya provider kimlik doğrulaması takıldığında VNC kurtarması için yeterli makine durumunu korumak.
- Çalıştırma engellendiğinde, manuel VNC yardımı gerektiğinde veya tamamlandığında bir operatör Discord kanalına kısa durum göndermek.
Hedef olmayanlar
- Mantis, birim testlerinin yerine geçmez. Bir Mantis çalıştırması, düzeltme anlaşıldıktan sonra genellikle daha küçük bir regresyon testine dönüştürülmelidir.
- Mantis normal hızlı CI geçidi değildir. Daha yavaştır, canlı kimlik bilgileri kullanır ve canlı ortamın önemli olduğu hatalar için ayrılır.
- Mantis normal çalışmada bir insana ihtiyaç duymamalıdır. Manuel VNC, mutlu yol değil, bir kurtarma yoludur.
- Mantis artifact'larda, günlüklerde, ekran görüntülerinde, Markdown raporlarında veya PR yorumlarında ham secrets saklamaz.
Sahiplik
Mantis, OpenClaw QA yığınında yaşar.
- OpenClaw,
pnpm openclaw qa mantisaltındaki senaryo çalışma zamanının, taşıma adaptörlerinin, kanıt şemasının ve yerel CLI'ın sahibidir. - QA Lab, canlı taşıma harness parçalarının, tarayıcı yakalama yardımcılarının ve artifact yazıcılarının sahibidir.
- Crabbox, uzak bir VM gerektiğinde ısındırılmış Linux makinelerinin sahibidir.
- GitHub Actions, uzak workflow giriş noktasının ve artifact saklama politikasının sahibidir.
- ClawSweeper, GitHub yorum yönlendirmesinin sahibidir: bakımcı komutlarını ayrıştırma, workflow'u dispatch etme ve son PR yorumunu gönderme.
- Bir senaryo agentic kurulum, hata ayıklama veya takılı durum raporlaması gerektirdiğinde OpenClaw agents, Mantis'i Codex üzerinden yönlendirir.
Bu sınır, taşıma bilgisini OpenClaw'da, makine zamanlamasını Crabbox'ta ve bakımcı workflow bağlantısını ClawSweeper'da tutar.
Komut şekli
İlk yerel komut Discord botunu, guild'i, kanalı, mesaj göndermeyi, reaction göndermeyi ve artifact yolunu doğrular:
pnpm openclaw qa mantis discord-smoke \ --output-dir .artifacts/qa-e2e/mantis/discord-smokeYerel öncesi ve sonrası runner şu şekli kabul eder:
pnpm openclaw qa mantis run \ --transport discord \ --scenario discord-status-reactions-tool-only \ --baseline origin/main \ --candidate HEAD \ --output-dir .artifacts/qa-e2e/mantis/local-discord-status-reactionsRunner, output dizini altında ayrık baseline ve candidate worktree'leri oluşturur, bağımlılıkları kurar, her ref'i build eder, senaryoyu --allow-failures ile çalıştırır, ardından baseline/, candidate/, comparison.json ve mantis-report.md yazar. İlk Discord senaryosu için başarılı bir doğrulama, baseline durumunun fail ve candidate durumunun pass olması anlamına gelir.
İkinci Discord öncesi/sonrası probu thread attachment'larını hedefler:
pnpm openclaw qa mantis run \ --transport discord \ --scenario discord-thread-reply-filepath-attachment \ --baseline <bug-ref> \ --candidate <fix-ref> \ --output-dir .artifacts/qa-e2e/mantis/local-discord-thread-attachmentBu senaryo, driver bot ile bir üst mesaj gönderir, gerçek bir Discord thread'i oluşturur, repo-yerel bir filePath ile OpenClaw'ın message.thread-reply action'ını çağırır, ardından SUT yanıtı ve attachment dosya adı için thread'i yoklar. Baseline ekran görüntüsü, attachment olmayan yanıtı gösterir; candidate ekran görüntüsü beklenen mantis-thread-report.md attachment'ını gösterir.
İlk VM/tarayıcı primitive'i desktop smoke'tur:
pnpm openclaw qa mantis desktop-browser-smoke \ --output-dir .artifacts/qa-e2e/mantis/desktop-browserBir Crabbox desktop makinesini lease eder veya yeniden kullanır, VNC oturumu içinde görünür bir tarayıcı başlatır, desktop'ı yakalar, artifact'ları yerel output dizinine geri çeker ve yeniden bağlanma komutunu rapora yazar. Komut varsayılan olarak Hetzner provider'ını kullanır çünkü Mantis kulvarında çalışan desktop/VNC kapsamına sahip ilk provider odur. Başka bir Crabbox fleet'e karşı çalıştırırken bunu --provider, --crabbox-bin veya OPENCLAW_MANTIS_CRABBOX_PROVIDER ile override edin.
Yararlı desktop smoke flag'leri:
--lease-id <cbx_...>veyaOPENCLAW_MANTIS_CRABBOX_LEASE_IDısındırılmış bir desktop'ı yeniden kullanır.--browser-url <url>görünür tarayıcıda açılan sayfayı değiştirir.--html-file <path>repo-yerel bir HTML artifact'ını görünür tarayıcıda render eder. Mantis bunu, oluşturulan Discord status-reaction timeline'ını gerçek bir Crabbox desktop üzerinden yakalamak için kullanır.--browser-profile-dir <remote-path>uzak bir Chrome user-data-dir'ini yeniden kullanır, böylece kalıcı bir Mantis desktop çalıştırmalar arasında oturum açık kalabilir. Bunu uzun ömürlü Discord Web viewer profili için kullanın.--browser-profile-archive-env <name>tarayıcıyı başlatmadan önce adlandırılmış environment variable'dan base64.tgzChrome user-data-dir arşivini geri yükler. Bunu Discord Web gibi oturum açmış tanıklar için kullanın. Varsayılan env varOPENCLAW_MANTIS_BROWSER_PROFILE_TGZ_B64'dir.--video-duration <seconds>MP4 yakalama uzunluğunu kontrol eder. Yerleşmesi için zamana ihtiyaç duyan yavaş oturum açılmış web app'ler için daha uzun bir süre kullanın.--keep-leaseveyaOPENCLAW_MANTIS_KEEP_VM=1, yeni oluşturulmuş başarılı bir lease'i VNC incelemesi için açık tutar. Başarısız çalıştırmalar, bir lease oluşturulduysa operatör yeniden bağlanabilsin diye varsayılan olarak lease'i tutar.--class,--idle-timeoutve--ttlmakine boyutunu ve lease ömrünü ayarlar.
Discord Web kanıtı için Mantis, bot token yerine ayrılmış bir viewer hesabı kullanır. Canlı Discord API senaryosu doğrulama ölçütü olarak kalır: gerçek thread'i oluşturur, SUT thread-reply gönderir ve attachment'ı Discord REST üzerinden kontrol eder. OPENCLAW_QA_DISCORD_CAPTURE_UI_METADATA=1 ayarlandığında, senaryo ayrıca bir Discord Web URL artifact'ı yazar. OPENCLAW_QA_DISCORD_KEEP_THREADS=1 ayarlandığında, oturum açmış bir tarayıcının açıp kaydedebilmesi için o thread'i yeterince uzun süre erişilebilir bırakır.
GitHub workflow, candidate thread URL'sini Discord Web'de açar, ekran görüntüsü yakalar, MP4 kaydeder ve Crabbox medya tooling'i mevcut olduğunda kırpılmış bir GIF önizlemesi üretir. MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR üzerinden yapılandırılmış kalıcı bir viewer profil yolunu tercih edin çünkü tam Chrome profil arşivleri GitHub'ın secret boyutu sınırını aşabilir. Küçük/bootstrap profiller için workflow ayrıca MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64 üzerinden base64 .tgz arşivini geri yükleyebilir. Hiçbir profil kaynağı yapılandırılmamışsa workflow yine deterministik baseline/candidate attachment ekran görüntülerini yayımlar ve oturum açmış Discord Web tanığının atlandığına dair bir notice günlüğe yazar.
İlk tam desktop taşıma primitive'i Slack desktop smoke'tur:
pnpm openclaw qa mantis slack-desktop-smoke \ --output-dir .artifacts/qa-e2e/mantis/slack-desktop \ --gateway-setup \ --scenario slack-canary \ --keep-leaseBir Crabbox desktop makinesini lease eder veya yeniden kullanır, mevcut checkout'ı VM içine senkronize eder, o VM içinde pnpm openclaw qa slack çalıştırır, VNC tarayıcısında Slack Web'i açar, görünür desktop'ı yakalar ve hem Slack QA artifact'larını hem de VNC ekran görüntüsünü yerel output dizinine kopyalar. Bu, SUT OpenClaw gateway'in ve tarayıcının aynı Linux desktop VM içinde yaşadığı ilk Mantis şeklidir.
--gateway-setup ile komut, $HOME/.openclaw-mantis/slack-openclaw konumunda kalıcı ve atılabilir bir OpenClaw home hazırlar, seçilen kanal için Slack Socket Mode yapılandırmasını patch'ler, 38973 portunda openclaw gateway run başlatır ve Chrome'u VNC oturumunda çalışır durumda tutar. Bu, "bana Slack ve çalışan bir claw ile bir Linux desktop bırak" modudur; --gateway-setup atlandığında bot-to-bot Slack QA kulvarı varsayılan olarak kalır.
--credential-source env için gerekli girdiler:
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKEN- Uzak model kulvarı için
OPENCLAW_LIVE_OPENAI_KEY. Yerelde yalnızcaOPENAI_API_KEYayarlıysa Mantis, Crabbox'ı çağırmadan önce bunuOPENCLAW_LIVE_OPENAI_KEYolarak eşler; böylece Crabbox'ınOPENCLAW_*env forwarding'i onu VM içine taşıyabilir.
--gateway-setup --credential-source convex ile Mantis, VM'i oluşturmadan önce paylaşılan havuzdan Slack SUT credential'ını lease eder ve lease edilen kanal id'sini, Socket Mode app token'ını ve bot token'ı desktop içinde OPENCLAW_MANTIS_SLACK_* runtime env olarak forward eder. Bu, GitHub workflow'larını ince tutar: ham Slack bot veya app token'larına değil, yalnızca Convex broker secret'ına ihtiyaç duyarlar.
Yararlı Slack desktop flag'leri:
--lease-id <cbx_...>bir operatörün VNC üzerinden Slack Web'e zaten oturum açtığı bir makineye karşı yeniden çalıştırır.--gateway-setupyalnızca bot-to-bot QA kulvarını çalıştırmak yerine VM'de kalıcı bir OpenClaw Slack gateway başlatır.--keep-leasebaşarıdan sonra gateway VM'ini VNC incelemesi için açık tutar;--no-keep-leaseartifact'ları topladıktan sonra durdurur.--slack-url <url>belirli bir Slack Web URL'si açar. Bu olmadan Mantis, SUT bot token mevcut olduğunda Slackauth.testüzerindenhttps://app.slack.com/client/<team>/<channel>türetir.--slack-channel-id <id>gateway kurulumu tarafından kullanılan Slack kanal allowlist'ini kontrol eder.OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIRVM içindeki kalıcı Chrome profilini kontrol eder. Varsayılan$HOME/.config/openclaw-mantis/slack-chrome-profile'dır, böylece manuel Slack Web oturumu aynı lease üzerindeki yeniden çalıştırmalarda korunur.--credential-source convex --credential-role cidoğrudan Slack env token'ları yerine paylaşılan credential havuzunu kullanır.--provider-mode,--model,--alt-modelve--fastSlack canlı kulvarına aktarılır.
GitHub smoke workflow'u Mantis Discord Smoke'tur. İlk gerçek senaryo için öncesi ve sonrası GitHub workflow'u Mantis Discord Status Reactions'tır. Şunları kabul eder:
baseline_ref: queued-only davranışını yeniden üretmesi beklenen ref.candidate_ref:queued -> thinking -> donegöstermesi beklenen ref.
Workflow harness ref'ini checkout eder, ayrı baseline ve candidate worktree'leri build eder, her worktree'ye karşı discord-status-reactions-tool-only çalıştırır ve baseline/, candidate/, comparison.json ile mantis-report.md dosyalarını Actions artifact'ları olarak upload eder. Ayrıca her kulvarın timeline HTML'ini bir Crabbox desktop tarayıcısında render eder ve bu VNC ekran görüntülerini PR yorumunda deterministik timeline PNG'lerinin yanında yayımlar. Aynı PR yorumu, crabbox media preview tarafından üretilen hafif hareket kırpılmış GIF önizlemelerini embed eder, eşleşen hareket kırpılmış MP4 kliplerine link verir ve derin inceleme için tam desktop MP4 dosyalarını saklar. Ekran görüntüleri hızlı inceleme için inline kalır. Workflow, bir sonraki Crabbox binary release'i kesilmeden önce güncel desktop/browser lease flag'lerini kullanabilsin diye Crabbox CLI'ı openclaw/crabbox main'den build eder.
Mantis Scenario genel manuel giriş noktasıdır. Bir scenario_id, candidate_ref, isteğe bağlı baseline_ref ve isteğe bağlı pr_number alır, ardından senaryo sahibi workflow'u dispatch eder. Wrapper kasıtlı olarak incedir: senaryo workflow'ları hâlâ kendi taşıma kurulumlarının, credentials'ın, VM class'ının, beklenen doğrulama ölçütünün ve artifact manifest'inin sahibidir.
Mantis Slack Desktop Smoke ilk Slack VM iş akışıdır. Güvenilen aday ref'ini
ayrı bir worktree içinde checkout eder, bir Crabbox Linux masaüstü lease eder,
bu aday üzerinde pnpm openclaw qa mantis slack-desktop-smoke --gateway-setup
çalıştırır, VNC tarayıcısında Slack Web'i açar, masaüstünü kaydeder,
crabbox media preview ile hareket kırpılmış bir önizleme oluşturur, tam
artifact dizinini yükler ve isteğe bağlı olarak hedef PR'a satır içi kanıt
yorumunu gönderir. Masaüstü lease'i için varsayılan olarak AWS kullanır ve
operatörlerin AWS kapasitesi yavaş ya da kullanılamaz olduğunda Hetzner'e
geçebilmesi için manuel bir sağlayıcı girdisi sunar. Yalnızca bot-bota Slack
dökümü yerine "Slack ve çalışan bir claw içeren bir Linux masaüstü" istediğinizde
bu hattı kullanın.
Mantis Telegram Live mevcut Telegram canlı QA hattını aynı PR kanıt
pipeline'ı içinde sarmalar. Güvenilen aday ref'ini ayrı bir worktree içinde
checkout eder, pnpm openclaw qa telegram --credential-source convex --credential-role ci çalıştırır, Telegram QA özetinden ve gözlenen ileti
artifact'inden bir mantis-evidence.json manifesti yazar, redakte edilmiş döküm
HTML'sini bir Crabbox masaüstü tarayıcısı üzerinden işler, crabbox media preview ile hareket kırpılmış bir GIF oluşturur ve PR numarası mevcut olduğunda
satır içi PR kanıt yorumunu gönderir. Bu hat, oturum açılmış Telegram Web kanıtı
değil, döküm görselidir: Telegram Bot API kararlı canlı ileti kanıtı sağlar,
ancak normal Mantis otomasyonu için Telegram Web oturum durumu gerekli değildir.
Mantis Telegram Desktop Proof aracı tabanlı yerel Telegram Desktop
önce/sonra sarmalayıcısıdır. Bir maintainer bunu bir PR yorumundan
@Mantis telegram desktop proof ile, Actions UI üzerinden serbest biçimli
talimatlarla veya genel Mantis Scenario dağıtıcısı aracılığıyla tetikleyebilir.
İş akışı PR'ı, baseline ref'ini, aday ref'ini ve maintainer talimatlarını
Codex'e verir. Aracı PR'ı okur, değişikliği kanıtlayan Telegram'da görünür
davranışın ne olduğuna karar verir, baseline ve aday için gerçek kullanıcı
Crabbox Telegram Desktop kanıt hattını çalıştırır, yerel GIF'ler kullanışlı
olana kadar yineler, eşleştirilmiş motionPreview artifact'lerini
mantis-evidence.json içine yazar, paketi yükler ve PR numarası mevcut olduğunda
2 sütunlu bir PR kanıt tablosu gönderir.
İnsanın döngüde olduğu Telegram masaüstü kurulumu için scenario builder'ı kullanın:
pnpm openclaw qa mantis telegram-desktop-builder \ --credential-source convex \ --credential-role maintainer \ --keep-leaseBuilder bir Crabbox masaüstü lease eder veya yeniden kullanır, yerel Linux
Telegram Desktop ikilisini yükler, isteğe bağlı olarak bir kullanıcı oturumu
arşivini geri yükler, OpenClaw'ı lease edilen Telegram SUT bot token'ıyla
yapılandırır, 38974 portunda openclaw gateway run başlatır, lease edilen özel
gruba bir driver-bot hazırlık iletisi gönderir, ardından görünür VNC
masaüstünden bir ekran görüntüsü ve MP4 yakalar. Bir bot token'ı Telegram
Desktop'ta asla oturum açmaz; yalnızca OpenClaw'ı yapılandırır. Masaüstü
görüntüleyicisi, --telegram-profile-archive-env <name> üzerinden geri
yüklenen veya VNC üzerinden manuel oluşturulup --keep-lease ile canlı tutulan
ayrı bir Telegram kullanıcı oturumudur.
Kullanışlı Telegram desktop builder bayrakları:
--lease-id <cbx_...>bir operatörün Telegram Desktop'ta zaten oturum açtığı VM üzerinde yeniden çalıştırır.--telegram-profile-archive-env <name>bu env var'dan base64.tgzTelegram Desktop profil arşivini okur ve başlatmadan önce geri yükler.--telegram-profile-dir <remote-path>uzak Telegram Desktop profil dizinini kontrol eder. Varsayılan$HOME/.local/share/TelegramDesktopdeğeridir.--no-gateway-setupOpenClaw'ı yapılandırmadan Telegram Desktop'ı yükler ve açar.--credential-source convex --credential-role cidoğrudan Telegram env token'ları yerine paylaşılan kimlik bilgisi aracısını kullanır.
PR yayımlayan her senaryo raporunun yanına mantis-evidence.json yazar.
Bu şema, senaryo kodu ile GitHub yorumları arasındaki handoff'tur:
{ "schemaVersion": 1, "id": "discord-status-reactions", "title": "Mantis Discord Status Reactions QA", "summary": "Human-readable top summary for the PR comment.", "scenario": "discord-status-reactions-tool-only", "comparison": { "baseline": { "sha": "...", "status": "fail", "expected": "queued-only" }, "candidate": { "sha": "...", "status": "pass", "expected": "queued -> thinking -> done" }, "pass": true }, "artifacts": [ { "kind": "timeline", "lane": "baseline", "label": "Baseline queued-only", "path": "baseline/timeline.png", "targetPath": "baseline.png", "alt": "Baseline Discord timeline", "width": 420 } ]}Artifact path değerleri manifest dizinine görelidir. targetPath değerleri
qa-artifacts branch yayımlama dizini altındaki göreli yollardır. Yayımcı path
traversal'ı reddeder ve isteğe bağlı önizlemeler veya videolar kullanılamadığında
"required": false olarak işaretlenmiş girdileri atlar.
Desteklenen artifact türleri:
timeline: genellikle önce/sonra olan deterministik senaryo ekran görüntüsü.desktopScreenshot: VNC/tarayıcı masaüstü ekran görüntüsü.motionPreview: masaüstü kaydından oluşturulan satır içi animasyonlu GIF.motionClip: statik başlangıç ve bitişi kaldıran hareket kırpılmış MP4.fullVideo: derin inceleme için tam MP4 kaydı.metadata: JSON/log sidecar.report: Markdown raporu.
Yeniden kullanılabilir yayımcı scripts/mantis/publish-pr-evidence.mjs'dir. İş
akışları bunu manifest, hedef PR, qa-artifacts hedef kökü, yorum işaretleyicisi,
Actions artifact URL'si, run URL'si ve istek kaynağıyla çağırır. Bildirilen
artifact'leri qa-artifacts branch'ine kopyalar, satır içi görseller/önizlemeler
ve bağlantılı videolarla özet odaklı bir PR yorumu oluşturur, ardından mevcut
işaretleyici yorumunu günceller veya yenisini oluşturur.
Status-reactions çalıştırmasını doğrudan bir PR yorumundan da tetikleyebilirsiniz:
@Mantis discord status reactionsYorum tetikleyicisi bilinçli olarak dardır. Yalnızca write, maintain veya admin erişimi olan kullanıcıların pull request yorumlarında çalışır ve yalnızca Discord status-reaction isteklerini tanır. Varsayılan olarak bilinen kötü baseline ref'ini ve aday olarak mevcut PR head SHA'sını kullanır. Maintainer'lar her iki ref'i de geçersiz kılabilir:
@Mantis discord status reactions baseline=origin/main candidate=HEADTelegram canlı QA da bir PR yorumundan tetiklenebilir:
@Mantis telegram@Mantis telegram scenario=telegram-status-command@Mantis telegram scenarios=telegram-status-command,telegram-mentioned-message-replyVarsayılan olarak aday olarak mevcut PR head SHA'sını kullanır ve
telegram-status-command çalıştırır. Maintainer'lar belirli bir ref'e veya
önceden ısıtılmış bir Crabbox masaüstüne ihtiyaç duyduklarında candidate=...,
provider=aws|hetzner ve lease=<cbx_...> değerlerini geçersiz kılabilir.
ClawSweeper komut örnekleri:
@clawsweeper mantis discord discord-status-reactions-tool-only@clawsweeper verify e2e discordİlk komut açık ve senaryo odaklıdır. İkincisi daha sonra bir PR'ı veya issue'yu etiketlerden, değişen dosyalardan ve ClawSweeper inceleme bulgularından önerilen Mantis senaryolarına eşleyebilir.
Çalıştırma yaşam döngüsü
- Kimlik bilgilerini al.
- Bir VM ayır veya yeniden kullan.
- Senaryonun UI kanıtına ihtiyaç duyduğu durumlarda masaüstü/tarayıcı profilini hazırla.
- Baseline ref'i için temiz bir checkout hazırla.
- Bağımlılıkları yükle ve yalnızca senaryonun ihtiyaç duyduğu şeyleri build et.
- İzole bir durum diziniyle bir alt OpenClaw Gateway başlat.
- Canlı transport'u, sağlayıcıyı, modeli ve tarayıcı profilini yapılandır.
- Senaryoyu çalıştır ve baseline kanıtını yakala.
- Gateway'i durdur ve log'ları koru.
- Aynı VM içinde aday ref'ini hazırla.
- Aynı senaryoyu çalıştır ve aday kanıtını yakala.
- Oracle sonuçlarını ve görsel kanıtı karşılaştır.
- Markdown, JSON, log'lar, ekran görüntüleri ve isteğe bağlı trace artifact'leri yaz.
- GitHub Actions artifact'lerini yükle.
- Kısa bir PR veya Discord durum iletisi gönder.
Senaryo iki farklı şekilde başarısız olabilmelidir:
- Hata yeniden üretildi: baseline beklenen şekilde başarısız oldu.
- Harness hatası: ortam kurulumu, kimlik bilgileri, Discord API, tarayıcı veya sağlayıcı, hata oracle'ı anlamlı hale gelmeden önce başarısız oldu.
Son rapor bu durumları ayırmalıdır ki maintainer'lar kararsız bir ortamı ürün davranışıyla karıştırmasın.
Discord MVP
İlk senaryo, kaynak yanıt teslim modunun message_tool_only olduğu guild
kanallarındaki Discord durum tepkilerini hedeflemelidir.
Neden iyi bir Mantis tohumu olduğu:
- Tetikleyen ileti üzerindeki tepkiler olarak Discord'da görünür.
- Discord ileti tepki durumu üzerinden güçlü bir REST oracle'ına sahiptir.
- Gerçek bir OpenClaw Gateway'i, Discord bot auth'u, ileti dispatch'ini, kaynak yanıt teslim modunu, durum tepki durumunu ve model turn yaşam döngüsünü çalıştırır.
- İlk uygulamayı dürüst tutacak kadar dardır.
Beklenen senaryo biçimi:
id: discord-status-reactions-tool-onlytransport: discordbaseline: expect: reproduced: truecandidate: expect: fixed: trueconfig: messages: ackReaction: "👀" ackReactionScope: "group-mentions" groupChat: visibleReplies: "message_tool" statusReactions: enabled: true timing: debounceMs: 0discord: requireMention: true notifyChannel: operator-notifyevidence: rest: messageReactions: true browser: screenshotMessageRow: trueBaseline kanıtı queued acknowledgement tepkisini göstermeli, ancak tool-only
modunda lifecycle geçişi göstermemelidir. Aday kanıtı
messages.statusReactions.enabled açıkça true olduğunda lifecycle durum
tepkilerinin çalıştığını göstermelidir.
Çalıştırılabilir ilk dilim, opt-in Discord canlı QA senaryosudur:
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 \ --output-dir .artifacts/qa-e2e/mantis/discord-status-reactions-candidateSUT'u her zaman açık guild işleme, visibleReplies: "message_tool",
ackReaction: "👀" ve açık durum tepkileriyle yapılandırır. Oracle gerçek
Discord tetikleyici iletisini yoklar ve gözlenen 👀 -> 🤔 -> 👍 dizisini bekler.
Artifact'ler discord-qa-reaction-timelines.json,
discord-status-reactions-tool-only-timeline.html ve
discord-status-reactions-tool-only-timeline.png içerir.
Mevcut QA parçaları
Mantis, sıfırdan başlamak yerine mevcut özel QA stack'i üzerine kurulmalıdır:
pnpm openclaw qa discordzaten driver ve SUT botlarıyla canlı bir Discord hattı çalıştırır.- Canlı transport runner zaten
.artifacts/qa-e2e/altında raporlar ve gözlenen ileti artifact'leri yazar. - Convex kimlik bilgisi lease'leri zaten paylaşılan canlı transport kimlik bilgilerine özel erişim sağlar.
- Tarayıcı kontrol servisi zaten ekran görüntülerini, snapshot'ları, headless yönetilen profilleri ve uzak CDP profillerini destekler.
- QA Lab zaten transport biçimli testler için bir debugger UI'sine ve bus'a sahiptir.
İlk Mantis uygulaması, bu parçalar üzerinde ince bir önce/sonra runner'ı ve buna eklenen bir görsel kanıt katmanı olabilir.
Kanıt modeli
Her çalıştırma kararlı bir artifact dizini yazar:
.artifacts/qa-e2e/mantis/<run-id>/ mantis-report.md mantis-summary.json baseline/ summary.json discord-message.json screenshot-message-row.png gateway-debug/ candidate/ summary.json discord-message.json screenshot-message-row.png gateway-debug/ comparison.json run.logmantis-summary.json makine tarafından okunabilir doğruluk kaynağı olmalıdır.
Markdown raporu PR yorumları ve insan incelemesi içindir.
Özet şunları içermelidir:
- test edilen ref'ler ve SHA'lar
- transport ve senaryo id'si
- makine sağlayıcısı ve makine id'si veya lease id'si
- secret değerler olmadan kimlik bilgisi kaynağı
- baseline sonucu
- aday sonucu
- hatanın baseline üzerinde yeniden üretilip üretilmediği
- adayın bunu düzeltip düzeltmediği
- artifact yolları
- sanitize edilmiş kurulum veya temizleme sorunları
Ekran görüntüleri kanıttır, sır değildir. Yine de redaksiyon disiplini gerekir: özel kanal adları, kullanıcı adları veya mesaj içerikleri görünebilir. Herkese açık PR'lar için, redaksiyon hikayesi güçlenene kadar satır içi görseller yerine GitHub Actions yapıt bağlantılarını tercih edin.
Tarayıcı ve VNC
Tarayıcı hattının iki modu vardır:
- Headless otomasyon: CI için varsayılan. Chrome, CDP etkin olarak çalışır ve Playwright veya OpenClaw tarayıcı denetimi ekran görüntülerini yakalar.
- VNC kurtarma: oturum açma, MFA, Discord otomasyon karşıtı önlemleri veya görsel hata ayıklama bir insan gerektirdiğinde aynı VM üzerinde etkinleştirilir.
Discord gözlemci tarayıcı profili, her çalıştırmada oturum açmayı önleyecek kadar kalıcı olmalı, ancak kişisel tarayıcı durumundan yalıtılmalıdır. Bir profil, geliştirici dizüstü bilgisayarına değil Mantis makine havuzuna aittir.
Mantis takıldığında, şu bilgileri içeren bir Discord durum mesajı gönderir:
- çalıştırma kimliği
- senaryo kimliği
- makine sağlayıcısı
- yapıt dizini
- varsa VNC veya noVNC bağlantı yönergeleri
- kısa engelleyici metni
İlk özel dağıtım bu mesajları mevcut operatör kanalına gönderebilir ve daha sonra özel bir Mantis kanalına geçebilir.
Makineler
Mantis, ilk uzak uygulama için Crabbox üzerinden AWS'yi tercih etmelidir. Crabbox bize ısıtılmış makineler, kiralama takibi, hazırlama, günlükler, sonuçlar ve temizlik sağlar. AWS kapasitesi çok yavaşsa veya kullanılamıyorsa, aynı makine arayüzünün arkasına bir Hetzner sağlayıcısı ekleyin.
Minimum VM gereksinimleri:
- Masaüstü destekli Chrome veya Chromium kurulumu olan Linux
- Tarayıcı otomasyonu için CDP erişimi
- Kurtarma için VNC veya noVNC
- Node 22 ve pnpm
- OpenClaw checkout'u ve bağımlılık önbelleği
- Playwright kullanıldığında Playwright Chromium tarayıcı önbelleği
- bir OpenClaw Gateway, bir tarayıcı ve bir model çalıştırması için yeterli CPU ve bellek
- Discord, GitHub, model sağlayıcıları ve kimlik bilgisi aracısına giden erişim
VM, beklenen kimlik bilgisi veya tarayıcı profili depoları dışında uzun ömürlü ham sırlar tutmamalıdır.
Sırlar
Sırlar, uzak çalıştırmalar için GitHub kuruluş veya depo sırlarında, yerel çalıştırmalar içinse yerel, operatör denetimli bir sır dosyasında bulunur.
Önerilen sır adları:
OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKENOPENCLAW_QA_DISCORD_DRIVER_BOT_TOKENOPENCLAW_QA_DISCORD_SUT_BOT_TOKENOPENCLAW_QA_DISCORD_GUILD_IDOPENCLAW_QA_DISCORD_CHANNEL_IDOPENCLAW_QA_DISCORD_NOTIFY_CHANNEL_ID- herkese açık GitHub yapıt yüklemeleri için
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 OPENCLAW_QA_CONVEX_SITE_URLOPENCLAW_QA_CONVEX_SECRET_CIOPENCLAW_QA_MANTIS_CRABBOX_COORDINATOROPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR_TOKEN
Uzun vadede Convex kimlik bilgisi havuzu, canlı aktarım kimlik bilgileri için normal kaynak
olarak kalmalıdır. GitHub sırları aracı ve yedek hatları bootstrap eder.
Discord durum tepkileri iş akışı, Mantis Crabbox sırlarını Crabbox CLI'ın beklediği
CRABBOX_COORDINATOR ve CRABBOX_COORDINATOR_TOKEN ortam değişkenlerine geri eşler.
Düz CRABBOX_* GitHub sır adları uyumluluk yedeği olarak kabul edilmeye devam eder.
Mantis çalıştırıcısı asla şunları yazdırmamalıdır:
- Discord bot token'ları
- sağlayıcı API anahtarları
- tarayıcı çerezleri
- kimlik doğrulama profili içerikleri
- VNC parolaları
- ham kimlik bilgisi yükleri
Herkese açık yapıt yüklemeleri ayrıca bot, guild, kanal ve mesaj kimlikleri gibi Discord hedef
meta verilerini de redakte etmelidir. GitHub smoke iş akışı bu nedenle
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 değerini etkinleştirir.
Bir token yanlışlıkla bir issue'ya, PR'a, sohbete veya günlüğe yapıştırılırsa, yeni sır saklandıktan sonra onu döndürün.
GitHub yapıtları ve PR yorumları
Mantis iş akışları, tam kanıt paketini kısa ömürlü bir Actions yapıtı olarak yüklemelidir.
İş akışı bir hata raporu veya düzeltme PR'ı için çalıştırıldığında, redakte edilmiş PNG ekran görüntülerini
qa-artifacts dalına da yayımlamalı ve ilgili hata veya düzeltme PR'ında satır içi önce/sonra ekran görüntüleriyle
bir yorumu upsert etmelidir. Birincil kanıtı yalnızca genel bir QA otomasyonu PR'ında paylaşmayın.
Ham günlükler, gözlemlenen mesajlar ve diğer hacimli kanıtlar Actions yapıtında kalır.
Üretim iş akışları bu yorumları github-actions[bot] ile değil, Mantis GitHub App ile göndermelidir.
Uygulama kimliğini ve özel anahtarı MANTIS_GITHUB_APP_ID ve MANTIS_GITHUB_APP_PRIVATE_KEY GitHub Actions
sırları olarak saklayın. İş akışı upsert anahtarı olarak gizli bir işaret kullanır, token düzenleyebildiğinde
o yorumu günceller ve daha eski, bot'a ait bir işaret düzenlenemediğinde Mantis'e ait yeni bir yorum oluşturur.
PR yorumu kısa ve görsel olmalıdır:
Mantis Discord Status Reactions QA Summary: Mantis reran the reported Discord status-reaction bug against the knownbad baseline and the candidate fix. The baseline reproduced the bug, while thecandidate showed the expected queued -> thinking -> done sequence. - Scenario: `discord-status-reactions-tool-only`- Run: <workflow run link>- Artifact: <artifact link>- Baseline: `<status>` at `<sha>`- Candidate: `<status>` at `<sha>` | Baseline | Candidate || ------------------- | ------------------- || <inline screenshot> | <inline screenshot> |Çalıştırma harness başarısız olduğu için başarısız olursa, yorum adayın başarısız olduğunu ima etmek yerine bunu söylemelidir.
Özel dağıtım notları
Özel bir dağıtımda zaten bir Mantis Discord uygulaması olabilir. Doğru bot izinlerine sahipse ve güvenli şekilde döndürülebiliyorsa başka bir uygulama oluşturmak yerine bu uygulamayı yeniden kullanın.
İlk operatör bildirim kanalını sırlar veya dağıtım yapılandırması üzerinden ayarlayın. Önce mevcut bir maintainer veya operasyon kanalını gösterebilir, ardından bir tane oluşturulduğunda özel bir Mantis kanalına taşınabilir.
Guild kimliklerini, kanal kimliklerini, bot token'larını, tarayıcı çerezlerini veya VNC parolalarını bu belgeye koymayın. Bunları GitHub sırlarında, kimlik bilgisi aracısında veya operatörün yerel sır deposunda saklayın.
Senaryo ekleme
Bir Mantis senaryosu şunları bildirmelidir:
- kimlik ve başlık
- aktarım
- gerekli kimlik bilgileri
- baseline ref ilkesi
- candidate ref ilkesi
- OpenClaw yapılandırma yaması
- kurulum adımları
- uyarıcı
- beklenen baseline oracle
- beklenen candidate oracle
- görsel yakalama hedefleri
- zaman aşımı bütçesi
- temizlik adımları
Senaryolar küçük, tiplendirilmiş oracle'ları tercih etmelidir:
- tepki hataları için Discord tepki durumu
- iş parçacığı hataları için Discord mesaj başvuruları
- Slack hataları için Slack thread ts ve tepki API durumu
- e-posta hataları için e-posta mesaj kimlikleri ve başlıkları
- UI tek güvenilir gözlemlenebilir olduğunda tarayıcı ekran görüntüleri
Görsel kontroller eklemeli olmalıdır. Bir platform API'si hatayı kanıtlayabiliyorsa, geçti/kaldı oracle'ı olarak API'yi kullanın ve ekran görüntülerini insan güveni için saklayın.
Sağlayıcı genişletme
Discord'dan sonra aynı çalıştırıcı şunları ekleyebilir:
- Slack: tepkiler, iş parçacıkları, uygulama bahsetmeleri, modallar, dosya yüklemeleri.
- E-posta: bağlayıcıların yeterli olmadığı yerlerde
gogkullanarak Gmail kimlik doğrulaması ve mesaj iş parçacığı. - WhatsApp: QR oturumu açma, yeniden tanımlama, mesaj teslimi, medya, tepkiler.
- Telegram: grup bahsetme kapısı, komutlar, varsa tepkiler.
- Matrix: şifreli odalar, iş parçacığı veya yanıt ilişkileri, yeniden başlatmada devam etme.
Her aktarımda bir ucuz smoke senaryosu ve bir veya daha fazla hata sınıfı senaryosu olmalıdır. Pahalı görsel senaryolar opt-in kalmalıdır.
Açık sorular
- Mevcut Mantis bot yeniden kullanıldığında hangi Discord bot driver, hangisi SUT olmalıdır?
- Gözlemci tarayıcı oturumu ilk aşama için bir insan Discord hesabı mı, bir test hesabı mı yoksa yalnızca bot tarafından okunabilir REST kanıtı mı kullanmalıdır?
- GitHub, PR'lar için Mantis yapıtlarını ne kadar süre saklamalıdır?
- ClawSweeper, bir maintainer komutunu beklemek yerine Mantis'i ne zaman otomatik olarak önermelidir?
- Herkese açık PR'lar için ekran görüntüleri yüklemeden önce redakte edilmeli veya kırpılmalı mıdır?