Get started
Mantis
Mantis publikuje wizualne dowody CI oraz komentarz do PR dotyczący działania OpenClaw. Scenariusze transportu na żywo porównują znany wadliwy punkt odniesienia z refem kandydującym; ukierunkowane ścieżki przeglądarkowe mogą zamiast tego weryfikować jednego kandydata względem deterministycznego, symulowanego transportu. Discord został wdrożony jako pierwszy z rzeczywistym uwierzytelnianiem bota, kanałami serwera, reakcjami, wątkami i obserwatorem przeglądarkowym. Istnieją również ścieżki dla Slack, Telegram oraz ukierunkowane ścieżki czatu interfejsu Control UI; WhatsApp i Matrix nie są zaimplementowane.
Odpowiedzialność
- OpenClaw (
extensions/qa-lab/src/mantis/*): środowisko uruchomieniowe scenariuszy,pnpm openclaw qa mantis <command>CLI, schemat dowodów. - Laboratorium QA (
extensions/qa-lab/src/live-transports/*): infrastruktura testowa transportu na żywo, boty sterownika/SUT, generatory raportów/dowodów. - Crabbox (
openclaw/crabbox): przygotowane maszyny z systemem Linux, dzierżawy, VNC,crabbox media preview. - GitHub Actions (
.github/workflows/mantis-*.yml): zdalne punkty wejścia, przechowywanie artefaktów. - ClawSweeper: analizuje polecenia opiekuna w PR, uruchamia przepływy pracy, publikuje końcowy komentarz do PR.
Polecenia CLI
Wszystkie polecenia są pnpm openclaw qa mantis <command>, zdefiniowane w
extensions/qa-lab/src/mantis/cli.ts. Wymagają OPENCLAW_ENABLE_PRIVATE_QA_CLI=1
podczas kompilacji/uruchamiania (dołączone przepływy pracy ustawiają OPENCLAW_BUILD_PRIVATE_QA=1 i
OPENCLAW_ENABLE_PRIVATE_QA_CLI=1 przed kompilacją).
| Polecenie | Przeznaczenie |
|---|---|
discord-smoke |
Sprawdza, czy bot Mantis na Discordzie widzi serwer/kanał oraz może publikować wiadomości i reakcje. |
run |
Uruchamia scenariusz „przed/po” względem refów punktu odniesienia i kandydata (tylko Discord). |
desktop-browser-smoke |
Dzierżawi/ponownie wykorzystuje pulpit Crabbox, otwiera widoczną przeglądarkę, rejestruje zrzut ekranu i film. |
slack-desktop-smoke |
Dzierżawi/ponownie wykorzystuje pulpit Crabbox, uruchamia w nim QA Slack, otwiera Slack Web i rejestruje dowody. |
telegram-desktop-builder |
Dzierżawi/ponownie wykorzystuje pulpit Crabbox, instaluje Telegram Desktop i opcjonalnie konfiguruje Gateway OpenClaw. |
visual-task / visual-driver |
Ogólne przechwytywanie pulpitu Crabbox z opcjonalnymi asercjami rozumienia obrazu; visual-driver to część sterownika uruchamiana w ramach crabbox record --while. |
Każde polecenie przyjmuje --repo-root <path> i --output-dir <path>; polecenia
Crabbox przyjmują również --crabbox-bin, --provider, --machine-class/--class,
--lease-id, --idle-timeout, --ttl i --keep-lease. Lokalne wartości domyślne CLI
dla dostawcy/klasy to hetzner/beast, o ile nie zaznaczono inaczej; przepływy pracy CI
zwykle zastępują obie wartości.
discord-smoke
pnpm openclaw qa mantis discord-smoke \ --output-dir .artifacts/qa-e2e/mantis/discord-smokeWywołuje interfejs REST API Discorda (https://discord.com/api/v10), aby pobrać użytkownika
bota, serwer, kanały serwera i kanał docelowy, sprawdza, czy
kanał należy do serwera, a następnie (o ile nie ustawiono --skip-post) publikuje wiadomość i
dodaje reakcję 👀. Zapisuje mantis-discord-smoke-summary.json i
mantis-discord-smoke-report.md.
Kolejność rozpoznawania tokenu: wartość --token-file, następnie OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN
(zastępowana przez --token-env), a potem plik wskazany przez OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN_FILE
(zastępowany przez --token-file-env). Identyfikatory serwera/kanału pochodzą z
OPENCLAW_QA_DISCORD_GUILD_ID / OPENCLAW_QA_DISCORD_CHANNEL_ID (zastępowanych przez
--guild-id / --channel-id) i muszą być 17–20-cyfrowymi identyfikatorami snowflake Discorda. Ustaw
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1, aby zastąpić identyfikatory i nazwy bota, serwera, kanału oraz wiadomości
wartością <redacted> w opublikowanym podsumowaniu i raporcie.
run
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-reactions--transport obecnie przyjmuje wyłącznie discord. --scenario jest jednym z dwóch
wbudowanych identyfikatorów, z których każdy ma własny domyślny ref punktu odniesienia i oczekiwane etykiety
„przed/po” (extensions/qa-lab/src/mantis/run.runtime.ts):
| Scenariusz | Domyślny punkt odniesienia | Oczekiwania dla punktu odniesienia | Oczekiwania dla kandydata |
|---|---|---|---|
discord-status-reactions-tool-only |
0bf06e953fdda290799fc9fb9244a8f67fdae593 |
queued-only |
queued -> thinking -> done |
discord-thread-reply-filepath-attachment |
81349cdc2a9d5143fd0991ed858b739e7d96e05c |
odpowiedź w wątku pomija załącznik filePath |
odpowiedź w wątku go zawiera |
Domyślna wartość --candidate to HEAD. Pozostałe flagi: --credential-source
(domyślnie convex), --credential-role (domyślnie ci), --provider-mode
(domyślnie live-frontier), --fast (domyślnie włączona), --skip-install, --skip-build.
Program uruchamiający tworzy odłączone kopie robocze git worktree dla punktu odniesienia i
kandydata w katalogu <output-dir>/worktrees/, uruchamia pnpm install/pnpm build w
każdej z nich (o ile nie pominięto), a następnie uruchamia
pnpm openclaw qa discord --scenario <id> --model openai/gpt-5.4 --alt-model openai/gpt-5.4 --allow-failures
względem każdej kopii roboczej. Każda ścieżka zapisuje discord-qa-reaction-timelines.json
oraz parę <scenario-id>-timeline.html/.png; program uruchamiający kopiuje te
dowody z powrotem do baseline//candidate/, zapisuje comparison.json,
mantis-report.md i mantis-evidence.json w katalogu wyjściowym oraz
kończy działanie z kodem różnym od zera, jeśli porównanie nie zakończyło się powodzeniem (punkt odniesienia fail i kandydat
pass).
Drugi scenariusz Discorda (discord-thread-reply-filepath-attachment) publikuje
wiadomość nadrzędną za pomocą bota sterownika, tworzy rzeczywisty wątek, wywołuje akcję SUT
message.thread-reply z lokalnym dla repozytorium plikiem filePath, a następnie odpytuje
wątek w poszukiwaniu odpowiedzi i nazwy pliku załącznika. Oczekuje załącznika
o nazwie mantis-thread-report.md.
desktop-browser-smoke
pnpm openclaw qa mantis desktop-browser-smoke \ --output-dir .artifacts/qa-e2e/mantis/desktop-browserDzierżawi lub ponownie wykorzystuje pulpit Crabbox, uruchamia przeglądarkę w sesji VNC
skierowaną na --browser-url (domyślnie https://openclaw.ai) albo wyrenderowany
--html-file, czeka, wykonuje zrzut ekranu za pomocą scrot, opcjonalnie nagrywa plik MP4 za pomocą
ffmpeg, a następnie synchronizuje przez rsync desktop-browser-smoke.png / .mp4 / remote-metadata.json
z powrotem do --output-dir.
Flagi:
--lease-id <cbx_...>ponownie wykorzystuje przygotowany pulpit zamiast tworzyć nowy.--browser-profile-dir <remote-path>ponownie wykorzystuje zdalny katalog danych użytkownika Chrome, dzięki czemu trwały pulpit zachowuje zalogowanie między uruchomieniami (używane dla długotrwałego profilu obserwatora Discord Web).--browser-profile-archive-env <name>przed uruchomieniem odtwarza z tej zmiennej środowiskowej zakodowane w base64 archiwum profilu Chrome.tgz(domyślnieOPENCLAW_MANTIS_BROWSER_PROFILE_TGZ_B64); używane dla zalogowanych obserwatorów, takich jak Discord Web.--video-duration <seconds>określa długość przechwytywania MP4 (domyślnie 10 s).--keep-lease(lubOPENCLAW_MANTIS_KEEP_VM=1) pozostawia dzierżawę utworzoną w tym uruchomieniu otwartą do inspekcji przez VNC; nieudane uruchomienia, które utworzyły dzierżawę, również domyślnie ją zachowują.
Do rejestrowania dowodów z Discord Web Mantis używa dedykowanego konta obserwatora, a nie tokenu
bota. Źródło prawdy REST Discorda (za pośrednictwem qa discord) pozostaje nadrzędne; gdy
ustawiono OPENCLAW_QA_DISCORD_CAPTURE_UI_METADATA=1, scenariusz zapisuje również
artefakt adresu URL Discord Web, a OPENCLAW_QA_DISCORD_KEEP_THREADS=1 pozostawia
wątek otwarty wystarczająco długo, aby przeglądarka mogła go otworzyć.
Przepływ pracy GitHub preferuje trwały profil obserwatora za pośrednictwem
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR (pełne archiwa profili mogą przekroczyć
limit rozmiaru sekretów GitHub); w przypadku małych/profilów inicjalizacyjnych może zamiast tego odtworzyć
zakodowany w base64 profil .tgz z MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64. Jeśli
nie skonfigurowano żadnego ze źródeł, przepływ pracy nadal publikuje deterministyczne
zrzuty ekranu i dzienniki punktu odniesienia/kandydata, informując, że zalogowany obserwator został
pominięty.
slack-desktop-smoke
pnpm openclaw qa mantis slack-desktop-smoke \ --output-dir .artifacts/qa-e2e/mantis/slack-desktop \ --gateway-setup \ --scenario slack-canary \ --keep-leaseDzierżawi lub ponownie wykorzystuje pulpit Crabbox, synchronizuje kopię roboczą z maszyną wirtualną, uruchamia
w niej pnpm openclaw qa slack, otwiera Slack Web w przeglądarce VNC,
przechwytuje pulpit i kopiuje lokalnie zarówno artefakty QA Slack (slack-qa/), jak i
zrzut ekranu/film VNC. Jest to jedyny wariant Mantis, w którym
Gateway SUT i przeglądarka działają wewnątrz tej samej maszyny wirtualnej.
Z --gateway-setup polecenie tworzy trwały, jednorazowy katalog domowy OpenClaw
w $HOME/.openclaw-mantis/slack-openclaw na maszynie wirtualnej, modyfikuje konfigurację Slack
Socket Mode dla kanału docelowego, uruchamia
openclaw gateway run --dev --allow-unconfigured --port 38973 i pozostawia
Chrome uruchomionego w sesji VNC; pominięcie --gateway-setup powoduje zamiast tego uruchomienie zwykłej
ścieżki QA Slack między botami.
Wymagane zmienne środowiskowe dla --credential-source env (lokalna wartość domyślna to env; domyślna
rola to maintainer):
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKENOPENCLAW_LIVE_OPENAI_KEYdla zdalnej ścieżki modelu (jeśli lokalnie ustawiono tylkoOPENAI_API_KEY, Mantis kopiuje ją doOPENCLAW_LIVE_OPENAI_KEYprzed wywołaniem Crabbox)
Z --credential-source convex Mantis dzierżawi dane uwierzytelniające SUT Slack ze
wspólnej puli przed utworzeniem maszyny wirtualnej i przekazuje identyfikator kanału, token aplikacji oraz
token bota do maszyny wirtualnej jako zmienne środowiskowe OPENCLAW_MANTIS_SLACK_*, dzięki czemu przepływy pracy
GitHub wymagają wyłącznie sekretu brokera Convex, a nie nieprzetworzonych tokenów Slack.
Pozostałe flagi: --slack-url <url> otwiera określony adres URL (w przeciwnym razie Mantis wyprowadza
https://app.slack.com/client/<team>/<channel> z auth.test);
--slack-channel-id <id> ustawia kanał na liście dozwolonych Gateway;
OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIR określa trwały profil Chrome
wewnątrz maszyny wirtualnej (domyślnie $HOME/.config/openclaw-mantis/slack-chrome-profile);
--approval-checkpoints uruchamia natywne scenariusze zatwierdzania Slack
(slack-approval-exec-native, slack-approval-plugin-native) i renderuje
zrzuty ekranu punktów kontrolnych oczekujących/rozstrzygniętych zamiast konfiguracji Gateway (wzajemnie
wyklucza się z --gateway-setup); --hydrate-mode source|prehydrated,
--provider-mode, --model, --alt-model i --fast są przekazywane do
ścieżki Slack na żywo.
Zrzuty ekranu punktów kontrolnych zatwierdzania są renderowane z wiadomości API Slack zaobserwowanej przez
scenariusz, a nie z działającego interfejsu Slack; slack-desktop-smoke.png stanowi wyłącznie
dowód działania Slack Web, jeśli profil przeglądarki dzierżawy był już zalogowany.
telegram-desktop-builder
pnpm openclaw qa mantis telegram-desktop-builder \ --credential-source convex \ --credential-role maintainer \ --keep-leaseDzierżawi lub ponownie wykorzystuje pulpit Crabbox, instaluje natywną aplikację Telegram Desktop dla systemu Linux,
opcjonalnie odtwarza archiwum sesji użytkownika, konfiguruje OpenClaw przy użyciu
dzierżawionego tokenu bota SUT Telegram, uruchamia
openclaw gateway run --dev --allow-unconfigured --port 38974, publikuje
wiadomość gotowości bota sterownika w dzierżawionej grupie prywatnej, a następnie wykonuje
zrzut ekranu i nagranie MP4. Token bota jedynie konfiguruje OpenClaw; nigdy nie loguje
do Telegram Desktop. Obserwator na pulpicie jest oddzielną sesją użytkownika Telegram,
odtwarzaną z --telegram-profile-archive-env <name> lub logowaną ręcznie
przez VNC i utrzymywaną aktywną za pomocą --keep-lease.
Flagi: --lease-id <cbx_...> ponownie uruchamia scenariusz na maszynie wirtualnej już zalogowanej do
Telegram Desktop; --telegram-profile-archive-env <name> przed uruchomieniem odtwarza zakodowane w base64
archiwum profilu .tgz; --telegram-profile-dir <remote-path>
ustawia zdalny katalog profilu (domyślnie $HOME/.local/share/TelegramDesktop);
--no-gateway-setup jedynie instaluje i otwiera Telegram Desktop;
domyślne wartości --credential-source/--credential-role to convex/maintainer.
Manifest dowodów
Każdy scenariusz publikujący w PR zapisuje mantis-evidence.json obok
swojego raportu:
{ "schemaVersion": 1, "id": "discord-status-reactions", "title": "Kontrola jakości reakcji statusu Discord w Mantis", "summary": "Czytelne dla człowieka podsumowanie główne do komentarza w PR.", "scenario": "discord-status-reactions-tool-only", "comparison": { "baseline": { "sha": "...", "status": "fail", "expected": "tylko w kolejce" }, "candidate": { "sha": "...", "status": "pass", "expected": "w kolejce -> myślenie -> gotowe" }, "pass": true }, "artifacts": [ { "kind": "timeline", "lane": "baseline", "label": "Wartość bazowa tylko w kolejce", "path": "baseline/timeline.png", "targetPath": "baseline.png", "alt": "Bazowa oś czasu Discord", "width": 420 } ]}Artefakt path jest względny względem katalogu manifestu; targetPath jest
względny względem skonfigurowanego prefiksu artefaktów R2/S3. scripts/mantis/publish-pr-evidence.mjs
odrzuca przechodzenie między katalogami i pomija wpisy z "required": false, gdy
brakuje pliku.
Rodzaje artefaktów: timeline (deterministyczny zrzut ekranu przed/po),
desktopScreenshot (zrzut ekranu VNC/przeglądarki), motionPreview (osadzony animowany
GIF z nagrania), motionClip (MP4 przycięty do ruchu), fullVideo (pełne
nagranie), metadata (plik towarzyszący JSON/dziennika), report (raport Markdown).
Układ artefaktów przebiegu na dysku:
.artifacts/qa-e2e/mantis/<run-id>/ mantis-report.md mantis-evidence.json baseline/ candidate/ comparison.jsonZrzuty ekranu są materiałem dowodowym, a nie sekretami, ale nadal wymagają
dyscypliny anonimizacji: mogą pojawić się nazwy prywatnych kanałów, nazwy
użytkowników lub treść wiadomości. Ustaw OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 dla publicznego
przesyłania artefaktów; jest to domyślnie włączone w przepływach pracy GitHub
dla Discord/Slack/Telegram.
Automatyzacja GitHub
scripts/mantis/publish-pr-evidence.mjs jest wydawcą wielokrotnego użytku. Przepływy pracy
wywołują go z manifestem, docelowym PR, głównym katalogiem docelowym artefaktów,
znacznikiem komentarza, adresem URL artefaktów, adresem URL przebiegu i źródłem żądania. Przesyła
zadeklarowane artefakty do zasobnika R2 Mantis, tworzy komentarz w PR zaczynający się od
podsumowania, z osadzonymi obrazami/podglądami i filmami dostępnymi przez odnośniki, a następnie aktualizuje istniejący komentarz ze znacznikiem lub
tworzy nowy. Wymagane zmienne środowiskowe:
MANTIS_ARTIFACT_R2_ACCESS_KEY_IDMANTIS_ARTIFACT_R2_SECRET_ACCESS_KEYMANTIS_ARTIFACT_R2_BUCKET(przepływy pracy ustawiająopenclaw-crabbox-artifacts)MANTIS_ARTIFACT_R2_ENDPOINTMANTIS_ARTIFACT_R2_REGION(przepływy pracy ustawiająauto)MANTIS_ARTIFACT_R2_PUBLIC_BASE_URL(przepływy pracy ustawiająhttps://artifacts.openclaw.ai)
Komentarze są publikowane za pośrednictwem aplikacji GitHub Mantis (MANTIS_GITHUB_APP_ID /
MANTIS_GITHUB_APP_PRIVATE_KEY), a nie github-actions[bot], przy użyciu ukrytego
znacznika komentarza jako klucza operacji upsert.
| Przepływ pracy | Wyzwalacz | Działanie |
|---|---|---|
Mantis Discord Smoke |
ręczne uruchomienie | Uruchamia discord-smoke względem wybranego odwołania. |
Mantis Discord Status Reactions |
komentarz w PR lub ręczne uruchomienie | Tworzy osobne drzewa robocze wartości bazowej/kandydata, uruchamia discord-status-reactions-tool-only w każdym z nich, renderuje oś czasu każdej ścieżki w przeglądarce pulpitu Crabbox, generuje podglądy GIF/MP4 przycięte do ruchu za pomocą crabbox media preview, przesyła artefakty i publikuje osadzony materiał dowodowy w PR. |
Mantis Scenario |
ręczne uruchomienie | Ogólny dyspozytor: przyjmuje scenario_id (discord-status-reactions-tool-only, discord-thread-reply-filepath-attachment, slack-desktop-smoke, telegram-live, telegram-desktop-proof, web-ui-chat-proof), baseline_ref, candidate_ref, pr_number i przekazuje je do odpowiedniego przepływu pracy scenariusza. |
Mantis Slack Desktop Smoke |
ręczne uruchomienie | Dzierżawi pulpit Linux Crabbox (domyślnie aws, z możliwością wyboru hetzner), uruchamia slack-desktop-smoke --gateway-setup względem kandydata, nagrywa pulpit, generuje podgląd ruchu, przesyła artefakty i publikuje materiał dowodowy w PR, gdy podano numer PR. |
Mantis Telegram Live |
komentarz w PR lub ręczne uruchomienie | Uruchamia aktywną ścieżkę kontroli jakości Telegram przez API bota (openclaw qa telegram), zapisuje mantis-evidence.json z podsumowania kontroli jakości, renderuje zanonimizowany kod HTML materiału dowodowego w przeglądarce pulpitu Crabbox, generuje GIF z ruchem i publikuje materiał dowodowy w PR. Ta ścieżka nie wymaga logowania w Telegram Web. |
Mantis Telegram Desktop Proof |
etykieta PR opiekuna (mantis: telegram-visible-proof) oraz komentarz w PR lub ręczne uruchomienie |
Agentowy, natywny materiał dowodowy przed/po z Telegram Desktop. Przekazuje PR, odwołania wartości bazowej/kandydata i instrukcje opiekuna do Codex, który uruchamia ścieżkę rzeczywistego użytkownika Crabbox Telegram Desktop dla obu odwołań i publikuje dwukolumnową tabelę materiału dowodowego w PR. |
Mantis Web UI Chat Proof |
komentarz w PR lub ręczne uruchomienie | Uruchamia ukierunkowany test Playwright czatu w interfejsie Control UI OpenClaw względem kandydata, sprawdza, czy przeglądarka wysyła dane przez atrapę Gateway, przechwytuje artefakty zrzutów ekranu/filmów i publikuje materiał dowodowy w PR. Ta ścieżka stanowi wyłącznie materiał dowodowy czatu internetowego, a nie WinUI/aplikacji natywnej ani dowolny wizualny materiał dowodowy. |
Zarówno Mantis Discord Status Reactions, jak i Mantis Telegram Live akceptują
baseline_ref/candidate_ref (lub baseline=/candidate= w komentarzu do PR)
i sprawdzają przed uruchomieniem z poświadczeniami zawierającymi sekrety, czy rozwiązany SHA jest przodkiem origin/main, znacznikiem
wydania (v*) lub nagłówkiem otwartego PR.
Wyzwalacze w komentarzach z PR z uprawnieniami write/maintain/admin:
@openclaw-mantis discord status reactions@openclaw-mantis discord status reactions baseline=origin/main candidate=HEAD@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,channel-canary@openclaw-mantis web ui chat@openclaw-mantis web-ui-chat candidate=HEADWyzwalacze Telegram w komentarzach domyślnie używają SHA nagłówka PR jako kandydata oraz
telegram-status-command jako scenariusza; akceptują provider=aws|hetzner i
lease=<cbx_...>, aby wskazać konkretnego dostawcę Crabbox lub wstępnie rozgrzany
pulpit. Mantis Telegram Desktop Proof odpowiada na komentarz w PR tylko wtedy, gdy
PR ma już etykietę mantis: telegram-visible-proof.
Wyzwalacze czatu Web UI w komentarzach domyślnie używają SHA nagłówka PR jako kandydata. Uruchamiają test czatu Control UI z atrapą Gateway i publikują artefakty przeglądarki; dla innych stron internetowych i powierzchni aplikacji natywnych należy używać zwykłych testów Playwright/przeglądarkowych, zrzutów ekranu opiekuna, Crabbox lub lokalnych artefaktów.
ClawSweeper może również uruchomić scenariusz bezpośrednio:
@clawsweeper mantis discord discord-status-reactions-tool-onlyMaszyny i sekrety
Domyślne ustawienia lokalnego CLI Crabbox to --provider hetzner --class beast; można je zastąpić
za pomocą --provider, --class/--machine-class lub
OPENCLAW_MANTIS_CRABBOX_PROVIDER / OPENCLAW_MANTIS_CRABBOX_CLASS. Przepływy pracy GitHub
często zastępują oba ustawienia (na przykład --class standard oraz dane wejściowe wyboru dostawcy
aws/hetzner w przepływie pracy Slack). Jeśli dostawca jest zbyt
wolny lub niedostępny, należy dodać go za tym samym interfejsem Crabbox zamiast
kodować na stałe mechanizm awaryjny.
Konfiguracja bazowa maszyny wirtualnej: Linux z Chrome/Chromium obsługującym pulpit, dostępem CDP, VNC/ noVNC, Node 22.22.3+, 24.15+ lub 25.9+ i pnpm, kopią roboczą OpenClaw oraz dostępem wychodzącym do docelowego transportu, GitHub, dostawców modeli i brokera poświadczeń.
Nazwy poświadczeń i zmiennych środowiskowych używane w poleceniach i przepływach pracy Mantis:
OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKENOPENCLAW_QA_DISCORD_GUILD_IDOPENCLAW_QA_DISCORD_CHANNEL_ID- Lokalne
qa mantis run --credential-source envwymaga równieżOPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN,OPENCLAW_QA_DISCORD_SUT_BOT_TOKENorazOPENCLAW_QA_DISCORD_SUT_APPLICATION_ID. Przepływy pracy GitHub zwykle używają--credential-source convexoraz poniższych poświadczeń brokera zamiast nieprzetworzonych tokenów bota Discord. OPENCLAW_QA_REDACT_PUBLIC_METADATA=1do publicznego przesyłania artefaktówOPENCLAW_QA_CONVEX_SITE_URL,OPENCLAW_QA_CONVEX_SECRET_CIOPENAI_API_KEY(lub właściwego dla testu Telegram DesktopOPENCLAW_MANTIS_AGENT_OPENAI_API_KEY)CRABBOX_COORDINATOR/CRABBOX_COORDINATOR_TOKEN(przepływy pracy akceptują równieżOPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR/_TOKENjako mechanizm awaryjny i mapują je na zwykłe nazwy przed wywołaniem Crabbox)CRABBOX_ACCESS_CLIENT_ID,CRABBOX_ACCESS_CLIENT_SECRETMANTIS_GITHUB_APP_ID,MANTIS_GITHUB_APP_PRIVATE_KEY
Program uruchamiający Mantis nigdy nie może wyświetlać tokenów botów Discord/Slack/Telegram, kluczy API dostawców, plików cookie przeglądarki, zawartości profili uwierzytelniania, haseł VNC ani nieprzetworzonych ładunków poświadczeń. Jeśli token wycieknie do zgłoszenia, PR, czatu lub dziennika, należy go obrócić po zapisaniu zastępczego sekretu.
Wyniki przebiegu
Scenariusze transportu przed/po rozróżniają poniższe wyniki, aby niestabilne środowisko nie wyglądało jak regresja produktu:
- Błąd odtworzony: wartość bazowa nie powiodła się w sposób oczekiwany przez scenariusz.
- Awaria środowiska testowego: konfiguracja środowiska, poświadczenia, API transportu, przeglądarka lub dostawca zawiodły, zanim wynik mechanizmu weryfikacji stał się miarodajny.
Test przeglądarkowy tylko dla kandydata informuje, czy kandydat przeszedł asercje atrapy Gateway i widocznego interfejsu użytkownika; nie twierdzi, że odtworzono zachowanie bazowe.
Dodawanie scenariusza
Aktywne scenariusze transportu są definiowane w TypeScript osobno dla każdego transportu (zobacz
MANTIS_SCENARIO_CONFIGS w extensions/qa-lab/src/mantis/run.runtime.ts, aby poznać
strukturę przed/po dla Discord), a nie w samodzielnym deklaratywnym formacie pliku.
Każdy scenariusz wymaga: identyfikatora i tytułu, transportu, wymaganych poświadczeń, zasad
odwołania bazowego, zasad odwołania kandydata, poprawki konfiguracji OpenClaw, kroków
konfiguracji/bodźca, oczekiwanego mechanizmu weryfikacji wartości bazowej i kandydata, celów przechwytywania
wizualnego, budżetu limitu czasu oraz kroków czyszczenia.
Ukierunkowany test przeglądarkowy tylko dla kandydata może korzystać z dedykowanego deterministycznego testu E2E i przepływu pracy. Należy jasno określić jego zakres, sprawdzić odwołanie kandydata przed wykonaniem, odizolować publikowanie wspierane sekretami i wygenerować manifest materiału dowodowego zgodny z tym samym kontraktem.
Preferowane są małe, typowane mechanizmy weryfikacji zamiast kontroli wizyjnych: stan reakcji Discord lub
odwołania do wiadomości, stan API ts/reakcji w wątku Slack, identyfikatory
i nagłówki wiadomości e-mail. Zrzutów ekranu przeglądarki należy używać, gdy interfejs użytkownika jest jedyną wiarygodną obserwacją,
a kontrole wizyjne powinny być dodatkiem do mechanizmu weryfikacji opartego na API platformy, jeśli taki istnieje.
Po Discord, Slack i Telegram ten sam model programu uruchamiającego można rozszerzyć na WhatsApp (logowanie kodem QR, ponowna identyfikacja, dostarczanie, multimedia, reakcje) oraz Matrix (szyfrowane pokoje, relacje wątków/odpowiedzi, wznowienie po restarcie); żaden z nich nie jest jeszcze zaimplementowany.
Otwarte pytania
- Który bot Discord powinien pełnić rolę sterownika, a który SUT, gdy istniejący bot Mantis jest używany ponownie?
- Jak długo GitHub powinien przechowywać artefakty Mantis dla PR-ów?
- Kiedy ClawSweeper powinien automatycznie zalecać scenariusz Mantis zamiast czekać na polecenie opiekuna?
- Czy przed przesłaniem do publicznych PR-ów zrzuty ekranu powinny zostać zanonimizowane lub przycięte?