Get started
Modliszka
Mantis publikuje wizualne dowody z CI oraz komentarz w PR dotyczący zachowania OpenClaw. Scenariusze transportu na żywo porównują znany błędny stan bazowy z kandydującą referencją; ukierunkowane ścieżki przeglądarkowe mogą zamiast tego weryfikować jednego kandydata względem deterministycznego, pozorowanego transportu. Discord został wdrożony jako pierwszy z rzeczywistym uwierzytelnianiem bota, kanałami serwera, reakcjami, wątkami i obserwatorem w przeglądarce. Istnieją również ścieżki Slack, Telegram oraz ukierunkowane ścieżki czatu Control UI; WhatsApp i Matrix nie są zaimplementowane.
Odpowiedzialność
- OpenClaw (
extensions/qa-lab/src/mantis/*): środowisko uruchomieniowe scenariuszy, CLIpnpm openclaw qa mantis <command>, schemat dowodów. - QA Lab (
extensions/qa-lab/src/live-transports/*): mechanizm transportu na żywo, boty sterujące/SUT, generatory raportów i 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 opiekunów w PR, uruchamia przepływy pracy i publikuje końcowy komentarz w PR.
Polecenia CLI
Wszystkie polecenia mają postać pnpm openclaw qa mantis <command> i są 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 oraz OPENCLAW_ENABLE_PRIVATE_QA_CLI=1 przed kompilacją).
| Polecenie | Przeznaczenie |
|---|---|
discord-smoke |
Sprawdza, czy bot Mantis dla Discorda widzi serwer/kanał, może opublikować wiadomość i dodać reakcję. |
run |
Uruchamia scenariusz przed/po względem referencji bazowej i kandydującej (tylko Discord). |
desktop-browser-smoke |
Dzierżawi/ponownie wykorzystuje pulpit Crabbox, otwiera widoczną przeglądarkę oraz rejestruje zrzut ekranu i nagranie. |
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 rozpoznawania obrazu; visual-driver to część sterująca uruchamiana przez 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 oraz --keep-lease. Domyślne lokalne wartości 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 oraz kanał docelowy, sprawdza, czy kanał należy do serwera,
a następnie (o ile nie podano --skip-post) publikuje wiadomość i dodaje reakcję 👀.
Zapisuje pliki mantis-discord-smoke-summary.json oraz
mantis-discord-smoke-report.md.
Kolejność rozwiązywania tokenu: wartość --token-file, następnie OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN
(można zastąpić przez --token-env), a następnie plik wskazany przez
OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN_FILE (można zastąpić przez --token-file-env).
Identyfikatory serwera/kanału pochodzą z OPENCLAW_QA_DISCORD_GUILD_ID /
OPENCLAW_QA_DISCORD_CHANNEL_ID (można zastąpić 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/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łasną domyślną referencję bazową oraz
oczekiwane etykiety przed/po (extensions/qa-lab/src/mantis/run.runtime.ts):
| Scenariusz | Domyślny stan bazowy | Oczekiwanie dla stanu bazowego | Oczekiwanie 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ślną wartością --candidate jest HEAD. Pozostałe flagi: --credential-source
(domyślnie convex), --credential-role (domyślnie ci), --provider-mode
(domyślnie live-frontier), --fast (domyślnie włączone), --skip-install, --skip-build.
Program uruchamiający tworzy odłączone katalogi robocze git worktree dla stanu bazowego
i kandydata w <output-dir>/worktrees/, uruchamia w każdym z nich
pnpm install/pnpm build (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żdego katalogu roboczego. 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 oraz mantis-evidence.json w katalogu wyjściowym
i kończy działanie z kodem różnym od zera, jeśli porównanie nie zakończyło się powodzeniem
(stan bazowy fail, a kandydat pass).
Drugi scenariusz Discorda (discord-thread-reply-filepath-attachment) publikuje
wiadomość nadrzędną przy użyciu bota sterującego, tworzy rzeczywisty wątek, wywołuje akcję
message.thread-reply systemu SUT z lokalną dla repozytorium ścieżką filePath,
a następnie cyklicznie sprawdza 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 pliki
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 pozostaje zalogowany między uruchomieniami (używane dla długotrwałego profilu obserwatora Discord Web).--browser-profile-archive-env <name>przed uruchomieniem odtwarza archiwum profilu Chrome.tgzzakodowane w base64 ze wskazanej zmiennej środowiskowej (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 otwartą dzierżawę utworzoną podczas tego uruchomienia, aby umożliwić inspekcję 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. Wyrocznia REST Discorda (przez qa discord) pozostaje źródłem
rozstrzygającym; gdy ustawiono OPENCLAW_QA_DISCORD_CAPTURE_UI_METADATA=1, scenariusz
zapisuje również artefakt z adresem 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 określony przez
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR (pełne archiwa profili mogą przekraczać
limit rozmiaru sekretów GitHub); w przypadku małych/początkowych profili może zamiast tego
odtworzyć archiwum .tgz zakodowane w base64 z
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64. Jeśli nie skonfigurowano żadnego
z tych źródeł, przepływ pracy nadal publikuje deterministyczne zrzuty ekranu stanu
bazowego i kandydata oraz odnotowuje w dzienniku, że pominięto zalogowanego obserwatora.
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 oraz kopiuje lokalnie zarówno artefakty QA Slack (slack-qa/),
jak i zrzut ekranu/nagranie VNC. Jest to jedyny wariant Mantis, w którym Gateway SUT
i przeglądarka działają wewnątrz tej samej maszyny wirtualnej.
Z opcją --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
uruchomiony w sesji VNC; pominięcie --gateway-setup uruchamia zamiast tego standardową
ścieżkę 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 wyłącznieOPENAI_API_KEY, Mantis kopiuje ją doOPENCLAW_LIVE_OPENAI_KEYprzed wywołaniem Crabbox)
Z opcją --credential-source convex Mantis dzierżawi dane uwierzytelniające SUT Slack
ze współdzielonej 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 potrzebują wyłącznie
sekretu brokera Convex, a nie nieprzetworzonych tokenów Slack.
Pozostałe flagi: --slack-url <url> otwiera konkretny adres URL (w przeciwnym razie
Mantis wyznacza https://app.slack.com/client/<team>/<channel> na podstawie auth.test);
--slack-channel-id <id> ustawia kanał listy dozwolonych Gateway;
OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIR steruje trwałym profilem 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
oczekujących/rozstrzygniętych punktów kontrolnych zamiast konfiguracji Gateway
(wzajemnie wyklucza się z --gateway-setup); --hydrate-mode source|prehydrated,
--provider-mode, --model, --alt-model oraz --fast są przekazywane do ścieżki
Slack na żywo.
Zrzuty ekranu punktów kontrolnych zatwierdzania są renderowane na podstawie wiadomości
z API Slack zaobserwowanej przez scenariusz, a nie z interfejsu Slack na żywo;
slack-desktop-smoke.png jest dowodem działania samego Slack Web tylko wtedy,
gdy 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 przywraca archiwum sesji użytkownika, konfiguruje OpenClaw przy użyciu
tokena bota SUT Telegram z dzierżawy, uruchamia
openclaw gateway run --dev --allow-unconfigured --port 38974, publikuje
wiadomość o gotowości bota sterującego w prywatnej grupie z dzierżawy, a następnie wykonuje
zrzut ekranu i nagranie MP4. Token bota służy wyłącznie do konfiguracji OpenClaw; nigdy nie
loguje aplikacji Telegram Desktop. Przeglądarka pulpitu korzysta z oddzielnej sesji użytkownika Telegram,
przywróconej za pomocą --telegram-profile-archive-env <name> lub zalogowanej ręcznie
przez VNC i utrzymywanej przy życiu za pomocą --keep-lease.
Flagi: --lease-id <cbx_...> ponownie uruchamia scenariusz na maszynie wirtualnej, na której użytkownik jest już zalogowany do
Telegram Desktop; --telegram-profile-archive-env <name> przywraca zakodowane w base64
archiwum profilu .tgz przed uruchomieniem; --telegram-profile-dir <remote-path>
ustawia zdalny katalog profilu (domyślnie $HOME/.local/share/TelegramDesktop);
--no-gateway-setup tylko instaluje i otwiera Telegram Desktop;
domyślne wartości --credential-source/--credential-role to convex/maintainer.
Manifest materiałów dowodowych
Każdy scenariusz publikujący wyniki w PR zapisuje plik mantis-evidence.json obok
swojego raportu:
{ "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 } ]}Pole path artefaktu jest ścieżką względną wobec katalogu manifestu; targetPath jest
ścieżką względną wobec skonfigurowanego prefiksu artefaktów R2/S3. Skrypt scripts/mantis/publish-pr-evidence.mjs
odrzuca próby przechodzenia poza katalog i pomija wpisy z "required": false, gdy
brakuje pliku.
Rodzaje artefaktów: timeline (deterministyczny zrzut ekranu przed zmianą i po niej),
desktopScreenshot (zrzut ekranu VNC/przeglądarki), motionPreview (osadzony animowany
GIF z nagrania), motionClip (przycięte do ruchu nagranie MP4), fullVideo (pełne
nagranie), metadata (towarzyszący plik 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łami dowodowymi, a nie sekretami, ale nadal wymagają starannej redakcji:
mogą zawierać 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; ta opcja jest
domyślnie włączona w przepływach pracy GitHub dla Discord/Slack/Telegram.
Automatyzacja GitHub
scripts/mantis/publish-pr-evidence.mjs jest współdzielonym narzędziem publikującym. Przepływy pracy
wywołują go z manifestem, docelowym PR, katalogiem głównym docelowych artefaktów, znacznikiem komentarza,
adresem URL artefaktów, adresem URL przebiegu i źródłem żądania. Przesyła zadeklarowane artefakty do
zasobnika Mantis R2, tworzy komentarz PR rozpoczynający się od podsumowania, z osadzonymi
obrazami/podglądami i odnośnikami do nagrań, 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 przez aplikację Mantis GitHub (MANTIS_GITHUB_APP_ID /
MANTIS_GITHUB_APP_PRIVATE_KEY), a nie przez github-actions[bot]; ukryty
komentarz ze znacznikiem służy jako klucz operacji aktualizacji lub wstawienia.
| Przepływ pracy | Wyzwalacz | Działanie |
|---|---|---|
Mantis Discord Smoke |
ręczne uruchomienie | Uruchamia discord-smoke dla wybranego odwołania. |
Mantis Discord Status Reactions |
komentarz w PR lub ręczne uruchomienie | Tworzy oddzielne drzewa robocze wersji bazowej i kandydującej, uruchamia discord-status-reactions-tool-only dla każdej z nich, renderuje oś czasu każdej ścieżki w przeglądarce pulpitu Crabbox, generuje przycięte do ruchu podglądy GIF/MP4 za pomocą crabbox media preview, przesyła artefakty i publikuje osadzone materiały dowodowe 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 przepływu pracy odpowiedniego scenariusza. |
Mantis Slack Desktop Smoke |
ręczne uruchomienie | Dzierżawi pulpit Crabbox z systemem Linux (domyślnie aws, opcjonalnie hetzner), uruchamia slack-desktop-smoke --gateway-setup dla kandydata, nagrywa pulpit, generuje podgląd ruchu, przesyła artefakty i publikuje materiały dowodowe w PR, jeśli podano numer PR. |
Mantis Telegram Live |
komentarz w PR lub ręczne uruchomienie | Uruchamia ścieżkę kontroli jakości Telegram na żywo korzystającą z API bota (openclaw qa telegram), zapisuje mantis-evidence.json na podstawie podsumowania kontroli jakości, renderuje zredagowany kod HTML materiałów dowodowych w przeglądarce pulpitu Crabbox, generuje animację GIF i publikuje materiały dowodowe w PR. Ta ścieżka nie wymaga logowania w Telegram Web. |
Mantis Telegram Desktop Proof |
etykieta PR opiekuna (mantis: telegram-visible-proof) wraz z komentarzem w PR albo ręczne uruchomienie |
Agentowy dowód działania natywnej aplikacji Telegram Desktop przed zmianą i po niej. Przekazuje PR, odwołania wersji bazowej i kandydującej oraz instrukcje opiekuna do Codex, który uruchamia dla obu odwołań rzeczywistą ścieżkę dowodową Telegram Desktop użytkownika w Crabbox i publikuje dwukolumnową tabelę materiałów dowodowych w PR. |
Mantis Web UI Chat Proof |
komentarz w PR lub ręczne uruchomienie | Uruchamia ukierunkowany dowód czatu OpenClaw Control UI w Playwright dla kandydata, sprawdza, czy przeglądarka wysyła dane przez pozorowany Gateway, przechwytuje artefakty w postaci zrzutów ekranu i nagrań oraz publikuje materiały dowodowe w PR. Ta ścieżka stanowi wyłącznie dowód działania czatu internetowego, a nie WinUI/aplikacji natywnej ani dowolnego interfejsu wizualnego. |
Zarówno Mantis Discord Status Reactions, jak i Mantis Telegram Live akceptują
baseline_ref/candidate_ref (lub baseline=/candidate= w komentarzu PR)
i przed uruchomieniem z poświadczeniami zawierającymi sekrety sprawdzają, czy rozwiązany SHA jest przodkiem origin/main,
tagiem wydania (v*) lub stanowi wierzchołek otwartego PR.
Wyzwalacze w komentarzach z PR, których autor ma uprawnienia do zapisu/utrzymania/administrowania:
@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,telegram-mentioned-message-reply@openclaw-mantis web ui chat@openclaw-mantis web-ui-chat candidate=HEADWyzwalacze Telegram w komentarzach domyślnie używają SHA wierzchołka PR jako kandydata i
telegram-status-command jako scenariusza; akceptują provider=aws|hetzner oraz
lease=<cbx_...>, aby wskazać konkretnego dostawcę Crabbox lub wstępnie rozgrzany
pulpit. Mantis Telegram Desktop Proof reaguje na komentarz w PR wyłącznie wtedy, gdy
PR ma już etykietę mantis: telegram-visible-proof.
Wyzwalacze czatu Web UI w komentarzach domyślnie używają SHA wierzchołka PR jako kandydata. Uruchamiają dowód czatu Control UI z pozorowanym Gateway i publikują artefakty przeglądarki; w przypadku innych stron internetowych i interfejsów aplikacji natywnych użyj standardowego dowodu Playwright/przeglądarki, zrzutów ekranu opiekuna, Crabbox lub artefaktów lokalnych.
ClawSweeper może również uruchomić scenariusz bezpośrednio:
@clawsweeper mantis discord discord-status-reactions-tool-onlyMaszyny i sekrety
Domyślne wartości lokalnego CLI Crabbox to --provider hetzner --class beast; można je zastąpić
za pomocą --provider, --class/--machine-class albo
OPENCLAW_MANTIS_CRABBOX_PROVIDER / OPENCLAW_MANTIS_CRABBOX_CLASS. Przepływy pracy GitHub
często zastępują obie wartości (na przykład --class standard oraz pole wyboru dostawcy
aws/hetzner w przepływie pracy Slack). Jeśli dostawca jest zbyt wolny
lub niedostępny, dodaj go za tym samym interfejsem Crabbox zamiast
kodować na stałe rozwiązanie zapasowe.
Konfiguracja bazowa maszyny wirtualnej: Linux z obsługującą pulpit przeglądarką Chrome/Chromium, dostępem CDP, VNC/ noVNC, Node 22+ i pnpm, kopią roboczą OpenClaw oraz dostępem wychodzącym do docelowego transportu, GitHub, dostawców modeli i brokera poświadczeń.
Nazwy sekretów używane w przepływach pracy Mantis:
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_REDACT_PUBLIC_METADATA=1dla publicznego przesyłania artefaktówOPENCLAW_QA_CONVEX_SITE_URL,OPENCLAW_QA_CONVEX_SECRET_CICRABBOX_COORDINATOR/CRABBOX_COORDINATOR_TOKEN(przepływy pracy akceptują równieżOPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR/_TOKENjako wartości zapasowe i mapują je na nazwy bez prefiksu przed wywołaniem Crabbox)MANTIS_GITHUB_APP_ID,MANTIS_GITHUB_APP_PRIVATE_KEY
Program uruchamiający Mantis nigdy nie może wypisywać 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 unieważnić po zapisaniu sekretu zastępczego.
Wyniki uruchomienia
Scenariusze transportowe przed zmianą i po niej rozróżniają następujące wyniki, aby niestabilne środowisko nie zostało zinterpretowane jako regresja produktu:
- Błąd odtworzony: wersja bazowa nie przeszła testu w sposób oczekiwany przez scenariusz.
- Awaria infrastruktury testowej: konfiguracja środowiska, poświadczenia, API transportu, przeglądarka lub dostawca zawiodły, zanim mechanizm oceny mógł dostarczyć miarodajny wynik.
Dowód przeglądarkowy tylko dla kandydata informuje, czy kandydat przeszedł asercje pozorowanego Gateway i widocznego interfejsu użytkownika; nie stwierdza odtworzenia problemu w wersji bazowej.
Dodawanie scenariusza
Scenariusze transportu na żywo 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ę Discord przed zmianą i po niej), a nie w niezależnym deklaratywnym formacie pliku.
Każdy scenariusz wymaga: identyfikatora i tytułu, transportu, wymaganych poświadczeń, zasad
odwołania wersji bazowej, zasad odwołania wersji kandydującej, poprawki konfiguracji OpenClaw, kroków konfiguracji/bodźca,
oczekiwanego mechanizmu oceny wersji bazowej i kandydującej, celów przechwytywania wizualnego, limitu czasu
oraz kroków czyszczenia.
Skoncentrowany dowód przeglądarkowy obejmujący wyłącznie kandydata może wykorzystywać dedykowany, deterministyczny test E2E i przepływ pracy. Należy wyraźnie określić jego zakres, zweryfikować referencję kandydata przed wykonaniem, odizolować publikowanie oparte na sekretach i wygenerować ten sam kontrakt manifestu dowodów.
Preferuj małe, typowane kryteria weryfikacji zamiast kontroli wizyjnych: stan reakcji w Discordzie lub
odwołania do wiadomości, ts wątku w Slacku/stan reakcji w API, identyfikatory
i nagłówki wiadomości e-mail. Używaj zrzutów ekranu z przeglądarki, gdy interfejs użytkownika jest jedynym wiarygodnym źródłem obserwacji,
a kontrole wizyjne traktuj jako uzupełnienie kryterium weryfikacji opartego na API platformy, jeśli takie istnieje.
Po Discordzie, Slacku i Telegramie ten sam schemat modułu uruchamiającego można rozszerzyć na WhatsApp (logowanie za pomocą kodu QR, ponowna identyfikacja, dostarczanie, multimedia, reakcje) oraz Matrix (szyfrowane pokoje, relacje wątków/odpowiedzi, wznawianie po ponownym uruchomieniu); żadne z nich nie jest jeszcze zaimplementowane.
Otwarte pytania
- Który bot Discorda powinien pełnić rolę sterownika, a który testowanego systemu, gdy istniejący bot Mantis jest używany ponownie?
- Jak długo GitHub powinien przechowywać artefakty Mantis dotyczące PR-ów?
- Kiedy ClawSweeper powinien automatycznie zalecać scenariusz Mantis zamiast czekać na polecenie opiekuna?
- Czy przed przesłaniem zrzutów ekranu do publicznych PR-ów należy zamazywać lub przycinać ich zawartość?