Zuständigkeit
- OpenClaw (
extensions/qa-lab/src/mantis/*): Szenario-Runtime,pnpm openclaw qa mantis <command>CLI, Nachweisschema. - QA Lab (
extensions/qa-lab/src/live-transports/*): Live-Transport-Harness, Treiber-/SUT-Bots, Bericht-/Nachweis-Writer. - Crabbox (
openclaw/crabbox): vorgewärmte Linux-Maschinen, Leases, VNC,crabbox media preview. - GitHub Actions (
.github/workflows/mantis-*.yml): Remote-Einstiegspunkte, Artefaktaufbewahrung. - ClawSweeper: analysiert Maintainer-PR-Befehle, startet Workflows und veröffentlicht den abschließenden PR-Kommentar.
CLI-Befehle
Alle Befehle sindpnpm openclaw qa mantis <command>, definiert in
extensions/qa-lab/src/mantis/cli.ts. Erfordert OPENCLAW_ENABLE_PRIVATE_QA_CLI=1
zur Build-/Laufzeit (gebündelte Workflows setzen vor dem Build OPENCLAW_BUILD_PRIVATE_QA=1 und
OPENCLAW_ENABLE_PRIVATE_QA_CLI=1).
Jeder Befehl akzeptiert
--repo-root <path> und --output-dir <path>; Crabbox-
Befehle akzeptieren außerdem --crabbox-bin, --provider, --machine-class/--class,
--lease-id, --idle-timeout, --ttl und --keep-lease. Die lokalen CLI-Standardwerte
für Provider/Klasse sind hetzner/beast, sofern nicht anders angegeben; CI-Workflows
überschreiben normalerweise beide.
discord-smoke
https://discord.com/api/v10) auf, um den Bot-
Benutzer, die Guild, die Kanäle der Guild und den Zielkanal abzurufen, prüft,
ob der Kanal zur Guild gehört, veröffentlicht dann (sofern nicht --skip-post) eine Nachricht und
fügt eine 👀-Reaktion hinzu. Schreibt mantis-discord-smoke-summary.json und
mantis-discord-smoke-report.md.
Reihenfolge der Token-Auflösung: Wert von --token-file, dann OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN
(überschreibbar mit --token-env), dann eine durch OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKEN_FILE benannte Datei
(überschreibbar mit --token-file-env). Guild-/Kanal-IDs stammen aus
OPENCLAW_QA_DISCORD_GUILD_ID / OPENCLAW_QA_DISCORD_CHANNEL_ID (überschreibbar mit
--guild-id / --channel-id) und müssen 17- bis 20-stellige Discord-Snowflakes sein. Setzen Sie
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1, um Bot-/Guild-/Kanal-/Nachrichten-IDs
und Namen in der veröffentlichten Zusammenfassung und im Bericht durch <redacted> zu ersetzen.
run
--transport akzeptiert derzeit nur discord. --scenario ist eine von zwei
integrierten IDs, jeweils mit eigenem Standard-Baseline-Ref und erwarteten Vorher-/Nachher-
Labels (extensions/qa-lab/src/mantis/run.runtime.ts):
--candidate verwendet standardmäßig HEAD. Weitere Flags: --credential-source
(Standardwert convex), --credential-role (Standardwert ci), --provider-mode
(Standardwert live-frontier), --fast (standardmäßig aktiviert), --skip-install, --skip-build.
Der Runner erstellt getrennte git worktree-Checkouts für Baseline und
Kandidat unter <output-dir>/worktrees/, führt in jedem pnpm install/pnpm build aus
(sofern nicht übersprungen) und führt anschließend
pnpm openclaw qa discord --scenario <id> --model openai/gpt-5.4 --alt-model openai/gpt-5.4 --allow-failures
gegen jeden Worktree aus. Jede Lane schreibt discord-qa-reaction-timelines.json
sowie ein <scenario-id>-timeline.html/.png-Paar; der Runner kopiert diese
Nachweise zurück unter baseline//candidate/, schreibt comparison.json,
mantis-report.md und mantis-evidence.json in das Ausgabeverzeichnis und
wird mit einem Exit-Code ungleich null beendet, wenn der Vergleich nicht bestanden wurde (Baseline
fail und Kandidat pass).
Das zweite Discord-Szenario (discord-thread-reply-filepath-attachment) veröffentlicht
mit dem Treiber-Bot eine übergeordnete Nachricht, erstellt einen echten Thread, ruft die
message.thread-reply-Aktion des SUT mit einer Repository-lokalen filePath auf und fragt anschließend den
Thread nach der Antwort und dem Dateinamen des Anhangs ab. Es erwartet einen Anhang
mit dem Namen mantis-thread-report.md.
desktop-browser-smoke
--browser-url (Standardwert https://openclaw.ai) oder eine gerenderte
--html-file verweist, wartet, erstellt mit scrot einen Screenshot, zeichnet optional mit
ffmpeg eine MP4-Datei auf und synchronisiert desktop-browser-smoke.png / .mp4 / remote-metadata.json
per rsync zurück nach --output-dir.
Flags:
--lease-id <cbx_...>verwendet einen vorgewärmten Desktop erneut, statt einen neuen zu erstellen.--browser-profile-dir <remote-path>verwendet ein Remote-Chrome-Benutzerdatenverzeichnis erneut, damit ein persistenter Desktop zwischen Ausführungen angemeldet bleibt (wird für ein langlebiges Discord-Web-Betrachterprofil verwendet).--browser-profile-archive-env <name>stellt vor dem Start aus dieser Umgebungsvariablen ein Base64-.tgz-Chrome-Profilarchiv wieder her (StandardwertOPENCLAW_MANTIS_BROWSER_PROFILE_TGZ_B64); wird für angemeldete Zeugen wie Discord Web verwendet.--video-duration <seconds>steuert die Länge der MP4-Aufzeichnung (Standardwert 10s).--keep-lease(oderOPENCLAW_MANTIS_KEEP_VM=1) hält eine in dieser Ausführung erstellte Lease zur VNC-Überprüfung offen; fehlgeschlagene Ausführungen, die eine Lease erstellt haben, behalten sie standardmäßig ebenfalls bei.
qa discord) bleibt maßgeblich; wenn
OPENCLAW_QA_DISCORD_CAPTURE_UI_METADATA=1 gesetzt ist, schreibt das Szenario außerdem ein
Discord-Web-URL-Artefakt, und OPENCLAW_QA_DISCORD_KEEP_THREADS=1 hält den
Thread lange genug offen, damit der Browser ihn öffnen kann.
Der GitHub-Workflow bevorzugt ein persistentes Betrachterprofil über
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR (vollständige Profilarchive können das Größenlimit
für GitHub-Secrets überschreiten); für kleine/Bootstrap-Profile kann er stattdessen ein
Base64-.tgz aus MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64 wiederherstellen. Wenn
keine der beiden Quellen konfiguriert ist, veröffentlicht der Workflow weiterhin die deterministischen
Baseline-/Kandidaten-Screenshots und protokolliert, dass der angemeldete Zeuge
übersprungen wurde.
slack-desktop-smoke
pnpm openclaw qa slack aus, öffnet Slack Web im VNC-Browser,
erfasst den Desktop und kopiert sowohl die Slack-QA-Artefakte (slack-qa/) als auch
den VNC-Screenshot/das VNC-Video lokal zurück. Dies ist die einzige Mantis-Variante, bei der das
SUT-Gateway und der Browser beide innerhalb derselben VM ausgeführt werden.
Mit --gateway-setup erstellt der Befehl ein persistentes, temporäres OpenClaw-
Home unter $HOME/.openclaw-mantis/slack-openclaw in der VM, passt die Slack-
Socket-Mode-Konfiguration für den Zielkanal an, startet
openclaw gateway run --dev --allow-unconfigured --port 38973 und lässt
Chrome in der VNC-Sitzung laufen; ohne --gateway-setup wird stattdessen die normale
Bot-zu-Bot-Slack-QA-Lane ausgeführt.
Erforderliche Umgebungsvariablen für --credential-source env (lokaler Standardwert ist env; Rollen-
Standardwert ist maintainer):
OPENCLAW_QA_SLACK_CHANNEL_IDOPENCLAW_QA_SLACK_DRIVER_BOT_TOKENOPENCLAW_QA_SLACK_SUT_BOT_TOKENOPENCLAW_QA_SLACK_SUT_APP_TOKENOPENCLAW_LIVE_OPENAI_KEYfür die Remote-Modell-Lane (wenn lokal nurOPENAI_API_KEYgesetzt ist, kopiert Mantis sie nachOPENCLAW_LIVE_OPENAI_KEY, bevor Crabbox aufgerufen wird)
--credential-source convex least Mantis die Slack-SUT-Zugangsdaten aus
dem gemeinsamen Pool, bevor die VM erstellt wird, und leitet Kanal-ID, App-Token und
Bot-Token als OPENCLAW_MANTIS_SLACK_*-Umgebungsvariablen in die VM weiter, sodass GitHub-
Workflows nur das Convex-Broker-Secret und keine unverarbeiteten Slack-Token benötigen.
Weitere Flags: --slack-url <url> öffnet eine bestimmte URL (andernfalls leitet Mantis
https://app.slack.com/client/<team>/<channel> aus auth.test ab);
--slack-channel-id <id> legt den Kanal der Gateway-Zulassungsliste fest;
OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIR steuert das persistente Chrome-
Profil innerhalb der VM (Standardwert $HOME/.config/openclaw-mantis/slack-chrome-profile);
--approval-checkpoints führt die nativen Slack-Genehmigungsszenarien
(slack-approval-exec-native, slack-approval-plugin-native) aus und rendert
Screenshots der ausstehenden/abgeschlossenen Checkpoints anstelle der Gateway-Einrichtung (schließt
sich gegenseitig mit --gateway-setup aus); --hydrate-mode source|prehydrated,
--provider-mode, --model, --alt-model und --fast werden an die
Slack-Live-Lane weitergereicht.
Screenshots von Genehmigungs-Checkpoints werden aus der vom Szenario beobachteten Slack-API-Nachricht
gerendert, nicht aus der Live-Slack-Benutzeroberfläche; slack-desktop-smoke.png ist nur
ein Nachweis für Slack Web selbst, wenn das Browserprofil der Lease bereits angemeldet
war.
telegram-desktop-builder
openclaw gateway run --dev --allow-unconfigured --port 38974, veröffentlicht eine
Bereitschaftsnachricht des Treiber-Bots in der geleasten privaten Gruppe und erfasst anschließend einen
Screenshot und eine MP4-Datei. Ein Bot-Token konfiguriert nur OpenClaw; er meldet
Telegram Desktop niemals an. Der Desktop-Betrachter ist eine separate Telegram-Benutzersitzung,
die aus --telegram-profile-archive-env <name> wiederhergestellt oder manuell
über VNC angemeldet und mit --keep-lease aktiv gehalten wird.
Flags: --lease-id <cbx_...> führt den Vorgang erneut auf einer VM aus, die bereits bei
Telegram Desktop angemeldet ist; --telegram-profile-archive-env <name> stellt vor dem Start ein
Base64-.tgz-Profilarchiv wieder her; --telegram-profile-dir <remote-path>
legt das Remote-Profilverzeichnis fest (Standardwert $HOME/.local/share/TelegramDesktop);
--no-gateway-setup installiert und öffnet nur Telegram Desktop;
--credential-source/--credential-role verwenden standardmäßig convex/maintainer.
Nachweismanifest
Jedes Szenario, das in einem PR veröffentlicht wird, schreibtmantis-evidence.json neben
seinen Bericht:
path ist relativ zum Verzeichnis des Manifests; targetPath ist
relativ zum konfigurierten R2/S3-Artefaktpräfix. scripts/mantis/publish-pr-evidence.mjs
weist Pfadtraversierung zurück und überspringt Einträge mit "required": false, wenn die
Datei fehlt.
Artefaktarten: timeline (deterministischer Vorher-/Nachher-Screenshot),
desktopScreenshot (VNC-/Browser-Screenshot), motionPreview (inline eingebettetes animiertes
GIF aus der Aufzeichnung), motionClip (bewegungsbereinigtes MP4), fullVideo (vollständige
Aufzeichnung), metadata (JSON-/Protokoll-Sidecar), report (Markdown-Bericht).
Artefaktstruktur eines Laufs auf dem Datenträger:
OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 für öffentliche Artefakt-Uploads; dies ist
in den GitHub-Workflows für Discord/Slack/Telegram standardmäßig aktiviert.
GitHub-Automatisierung
scripts/mantis/publish-pr-evidence.mjs ist der wiederverwendbare Publisher. Workflows
rufen ihn mit Manifest, Ziel-PR, Zielstammverzeichnis für Artefakte, Kommentarmarkierung,
Artefakt-URL, Lauf-URL und Anfragequelle auf. Er lädt deklarierte Artefakte in
den Mantis-R2-Bucket hoch, erstellt einen PR-Kommentar mit vorangestellter Zusammenfassung,
inline eingebetteten Bildern/Vorschauen und verlinkten Videos und aktualisiert anschließend
den vorhandenen markierten Kommentar oder erstellt einen neuen. Erforderliche Umgebungsvariablen:
MANTIS_ARTIFACT_R2_ACCESS_KEY_IDMANTIS_ARTIFACT_R2_SECRET_ACCESS_KEYMANTIS_ARTIFACT_R2_BUCKET(Workflows setzenopenclaw-crabbox-artifacts)MANTIS_ARTIFACT_R2_ENDPOINTMANTIS_ARTIFACT_R2_REGION(Workflows setzenauto)MANTIS_ARTIFACT_R2_PUBLIC_BASE_URL(Workflows setzenhttps://artifacts.openclaw.ai)
MANTIS_GITHUB_APP_ID /
MANTIS_GITHUB_APP_PRIVATE_KEY) und nicht über github-actions[bot] veröffentlicht, wobei ein verborgener
Markierungskommentar als Upsert-Schlüssel dient.
Mantis Discord Status Reactions und Mantis Telegram Live akzeptieren beide
baseline_ref/candidate_ref (oder baseline=/candidate= in einem PR-Kommentar)
und validieren vor der Ausführung mit geheimnistragenden Anmeldedaten, dass der aufgelöste SHA entweder
ein Vorfahr von origin/main, ein Release-Tag (v*) oder der Head eines offenen PR ist.
Kommentarauslöser aus einem PR mit Schreib-, Maintain- oder Adminzugriff:
telegram-status-command als Szenario; sie akzeptieren provider=aws|hetzner und
lease=<cbx_...>, um einen bestimmten Crabbox-Provider oder einen vorgewärmten
Desktop anzugeben. Mantis Telegram Desktop Proof reagiert nur dann auf einen PR-Kommentar, wenn
der PR bereits das Label mantis: telegram-visible-proof trägt.
Kommentarauslöser für den Web-UI-Chat verwenden standardmäßig den Head-SHA des PR als Kandidaten. Sie führen
den Chat-Nachweis der Control UI mit simuliertem Gateway aus und veröffentlichen Browserartefakte; verwenden Sie
für andere Webseiten und Oberflächen nativer Apps normale Playwright-/Browser-Nachweise,
Maintainer-Screenshots, Crabbox oder lokale Artefakte.
ClawSweeper kann ein Szenario auch direkt ausführen:
Maschinen und Geheimnisse
Lokale CLI-Standardeinstellungen für Crabbox sind--provider hetzner --class beast; überschreiben Sie sie
mit --provider, --class/--machine-class oder
OPENCLAW_MANTIS_CRABBOX_PROVIDER / OPENCLAW_MANTIS_CRABBOX_CLASS. GitHub-
Workflows überschreiben häufig beide (zum Beispiel --class standard und die
Provider-Auswahleingabe aws/hetzner des Slack-Workflows). Wenn ein Provider zu
langsam oder nicht verfügbar ist, fügen Sie ihn hinter derselben Crabbox-Schnittstelle hinzu,
statt einen Fallback fest zu codieren.
VM-Baseline: Linux mit desktopfähigem Chrome/Chromium, CDP-Zugriff, VNC/
noVNC, Node 22.22.3+, 24.15+ oder 25.9+ und pnpm, einem OpenClaw-Checkout sowie
ausgehendem Zugriff auf den Zieltransport, GitHub, Modell-Provider und den
Anmeldedaten-Broker.
In Mantis-Befehlen und -Workflows verwendete Namen für Anmeldedaten und Umgebungsvariablen:
OPENCLAW_QA_DISCORD_MANTIS_BOT_TOKENOPENCLAW_QA_DISCORD_GUILD_IDOPENCLAW_QA_DISCORD_CHANNEL_ID- Lokales
qa mantis run --credential-source enverfordert außerdemOPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN,OPENCLAW_QA_DISCORD_SUT_BOT_TOKENundOPENCLAW_QA_DISCORD_SUT_APPLICATION_ID. GitHub-Workflows verwenden normalerweise--credential-source convexund die nachfolgenden Broker-Anmeldedaten anstelle roher Discord-Bot-Tokens. OPENCLAW_QA_REDACT_PUBLIC_METADATA=1für öffentliche Artefakt-UploadsOPENCLAW_QA_CONVEX_SITE_URL,OPENCLAW_QA_CONVEX_SECRET_CIOPENAI_API_KEY(oder das für den Telegram-Desktop-Nachweis spezifischeOPENCLAW_MANTIS_AGENT_OPENAI_API_KEY)CRABBOX_COORDINATOR/CRABBOX_COORDINATOR_TOKEN(Workflows akzeptieren außerdemOPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR/_TOKENals Fallback und ordnen sie vor dem Aufruf von Crabbox den einfachen Namen zu)CRABBOX_ACCESS_CLIENT_ID,CRABBOX_ACCESS_CLIENT_SECRETMANTIS_GITHUB_APP_ID,MANTIS_GITHUB_APP_PRIVATE_KEY
Laufergebnisse
Vorher-/Nachher-Transportszenarien unterscheiden diese Ergebnisse, damit eine instabile Umgebung nicht als Produktregression erscheint:- Fehler reproduziert: Die Baseline ist auf die vom Szenario erwartete Weise fehlgeschlagen.
- Harness-Fehler: Umgebungseinrichtung, Anmeldedaten, Transport-API, Browser oder Provider schlugen fehl, bevor das Orakel aussagekräftig war.
Szenario hinzufügen
Live-Transportszenarien werden pro Transport in TypeScript definiert (sieheMANTIS_SCENARIO_CONFIGS in extensions/qa-lab/src/mantis/run.runtime.ts für
die Discord-Vorher-/Nachher-Struktur), nicht in einem eigenständigen deklarativen Dateiformat.
Jedes Szenario benötigt: ID und Titel, Transport, erforderliche Anmeldedaten, Baseline-
Referenzrichtlinie, Kandidatenreferenzrichtlinie, OpenClaw-Konfigurationspatch, Einrichtungs-/Stimulus-Schritte,
erwartetes Baseline- und Kandidatenorakel, Ziele für visuelle Erfassungen, Zeitüberschreitungsbudget
und Bereinigungsschritte.
Fokussierte, nur für Kandidaten ausgeführte Browser-Nachweise können einen dedizierten deterministischen E2E-Test
und Workflow verwenden. Halten Sie den Umfang explizit, validieren Sie die Kandidatenreferenz vor
der Ausführung, isolieren Sie geheimnisgestützte Veröffentlichungen und geben Sie denselben Vertrag
für das Nachweismanifest aus.
Bevorzugen Sie kleine, typisierte Orakel gegenüber visuellen Prüfungen: Discord-Reaktionsstatus oder
Nachrichtenreferenzen, Slack-Thread-ts-/Reaktions-API-Status, E-Mail-Nachrichten-IDs
und -Header. Verwenden Sie Browser-Screenshots, wenn die UI das einzige zuverlässige Beobachtungsobjekt ist,
und verwenden Sie visuelle Prüfungen ergänzend zu einem Plattform-API-Orakel, sofern eines vorhanden ist.
Nach Discord, Slack und Telegram lässt sich dieselbe Runner-Struktur auf WhatsApp
(QR-Anmeldung, erneute Identifikation, Zustellung, Medien, Reaktionen) und Matrix
(verschlüsselte Räume, Thread-/Antwortbeziehungen, Wiederaufnahme nach Neustart) erweitern; beide sind
noch nicht implementiert.
Offene Fragen
- Welcher Discord-Bot sollte der Treiber und welcher das SUT sein, wenn der vorhandene Mantis- Bot wiederverwendet wird?
- Wie lange sollte GitHub Mantis-Artefakte für PRs aufbewahren?
- Wann sollte ClawSweeper automatisch ein Mantis-Szenario empfehlen, anstatt auf einen Maintainer-Befehl zu warten?
- Sollten Screenshots vor dem Hochladen für öffentliche PRs geschwärzt oder zugeschnitten werden?