Get started
Gottesanbeterin
Mantis ist das End-to-End-Verifizierungssystem von OpenClaw für Bugs, die eine echte Laufzeitumgebung, einen echten Transport und sichtbare Nachweise benötigen. Es führt ein Szenario gegen eine bekannte fehlerhafte Ref aus, erfasst Nachweise, führt dasselbe Szenario gegen eine Kandidaten-Ref aus und veröffentlicht den Vergleich als Artefakte, die Maintainer aus einem PR oder über einen lokalen Befehl prüfen können.
Mantis beginnt mit Discord, weil Discord uns eine besonders wertvolle erste Lane bietet: echte Bot-Authentifizierung, echte Guild-Kanäle, Reaktionen, Threads, native Befehle und eine Browser-UI, in der Menschen visuell bestätigen können, was der Transport gezeigt hat.
Ziele
- Einen Bug aus einem GitHub-Issue oder PR mit derselben Transportform reproduzieren, die Benutzer sehen.
- Ein Vorher-Artefakt auf der Baseline-Ref erfassen, bevor der Fix angewendet wird.
- Ein Nachher-Artefakt auf der Kandidaten-Ref erfassen, nachdem der Fix angewendet wurde.
- Wann immer möglich ein deterministisches Oracle verwenden, etwa einen Discord-REST-Reaktionslesevorgang oder eine Kanaltranskriptprüfung.
- Screenshots erfassen, wenn der Bug eine sichtbare UI-Oberfläche hat.
- Lokal über eine agentengesteuerte CLI und remote über GitHub ausführen.
- Genug Maschinenzustand für eine VNC-Rettung beibehalten, wenn Anmeldung, Browser-Automatisierung oder Provider-Authentifizierung hängen bleiben.
- Knappen Status in einem Betreiber-Discord-Kanal posten, wenn der Lauf blockiert ist, manuelle VNC-Hilfe benötigt oder abgeschlossen ist.
Nichtziele
- Mantis ist kein Ersatz für Unit-Tests. Ein Mantis-Lauf sollte nach verstandenem Fix normalerweise zu einem kleineren Regressionstest werden.
- Mantis ist nicht das normale schnelle CI-Gate. Es ist langsamer, verwendet Live-Anmeldedaten und ist Bugs vorbehalten, bei denen die Live-Umgebung relevant ist.
- Mantis sollte für den Normalbetrieb keinen Menschen benötigen. Manuelles VNC ist ein Rettungspfad, nicht der Happy Path.
- Mantis speichert keine Roh-Secrets in Artefakten, Logs, Screenshots, Markdown- Berichten oder PR-Kommentaren.
Zuständigkeit
Mantis befindet sich im OpenClaw-QA-Stack.
- OpenClaw besitzt die Szenario-Laufzeitumgebung, Transportadapter, das Nachweisschema und
die lokale CLI unter
pnpm openclaw qa mantis. - QA Lab besitzt die Live-Transport-Harness-Teile, Browser-Erfassungshelfer und Artefakt-Writer.
- Crabbox besitzt vorgewärmte Linux-Maschinen, wenn eine Remote-VM benötigt wird.
- GitHub Actions besitzt den Remote-Workflow-Einstiegspunkt und die Artefaktaufbewahrung.
- ClawSweeper besitzt das GitHub-Kommentar-Routing: Maintainer-Befehle parsen, den Workflow auslösen und den finalen PR-Kommentar posten.
- OpenClaw-Agenten steuern Mantis über Codex, wenn ein Szenario agentisches Setup, Debugging oder Berichte zu hängenden Zuständen benötigt.
Diese Grenze hält Transportwissen in OpenClaw, Maschinenplanung in Crabbox und Maintainer-Workflow-Klebstoff in ClawSweeper.
Befehlsform
Der erste lokale Befehl verifiziert den Discord-Bot, die Guild, den Kanal, Nachrichtenversand, Reaktionsversand und den Artefaktpfad:
pnpm openclaw qa mantis discord-smoke \
--output-dir .artifacts/qa-e2e/mantis/discord-smoke
Der lokale Vorher-/Nachher-Runner akzeptiert diese Form:
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
Der Runner erstellt getrennte Baseline- und Kandidaten-Worktrees unter dem Ausgabe-
verzeichnis, installiert Abhängigkeiten, baut jede Ref, führt das Szenario mit
--allow-failures aus und schreibt dann baseline/, candidate/, comparison.json
und mantis-report.md. Für das erste Discord-Szenario bedeutet eine erfolgreiche Verifizierung,
dass der Baseline-Status fail und der Kandidaten-Status pass ist.
Der zweite Discord-Vorher-/Nachher-Probe zielt auf Thread-Anhänge:
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-attachment
Dieses Szenario postet eine übergeordnete Nachricht mit dem Treiber-Bot, erstellt einen echten Discord-
Thread, ruft OpenClaws Aktion message.thread-reply mit einem repo-lokalen
filePath auf und pollt dann den Thread auf die SUT-Antwort und den Anhangsdateinamen. Der
Baseline-Screenshot zeigt die Antwort ohne Anhang; der Kandidaten-Screenshot
zeigt den erwarteten Anhang mantis-thread-report.md.
Das erste VM-/Browser-Primitiv ist der Desktop-Smoke:
pnpm openclaw qa mantis desktop-browser-smoke \
--output-dir .artifacts/qa-e2e/mantis/desktop-browser
Es least oder verwendet eine Crabbox-Desktop-Maschine erneut, startet einen sichtbaren Browser innerhalb der
VNC-Sitzung, erfasst den Desktop, zieht Artefakte zurück in das lokale Ausgabe-
verzeichnis und schreibt den Wiederverbindungsbefehl in den Bericht. Der Befehl verwendet standardmäßig
den Hetzner-Provider, weil er der erste Provider mit funktionierender Desktop-/VNC-
Abdeckung in der Mantis-Lane ist. Überschreiben Sie ihn mit --provider, --crabbox-bin oder
OPENCLAW_MANTIS_CRABBOX_PROVIDER, wenn Sie gegen eine andere Crabbox-Flotte ausführen.
Nützliche Desktop-Smoke-Flags:
--lease-id <cbx_...>oderOPENCLAW_MANTIS_CRABBOX_LEASE_IDverwendet einen vorgewärmten Desktop erneut.--browser-url <url>ändert die Seite, die im sichtbaren Browser geöffnet wird.--html-file <path>rendert ein repo-lokales HTML-Artefakt im sichtbaren Browser. Mantis verwendet dies, um die generierte Discord-Statusreaktions-Zeitleiste über einen echten Crabbox-Desktop zu erfassen.--browser-profile-dir <remote-path>verwendet ein entferntes Chrome-user-data-dir erneut, damit ein persistenter Mantis-Desktop zwischen Läufen angemeldet bleiben kann. Verwenden Sie dies für das langlebige Discord Web-Betrachterprofil.--browser-profile-archive-env <name>stellt ein base64-.tgz-Chrome-user-data-dir-Archiv aus der benannten Umgebungsvariable wieder her, bevor der Browser gestartet wird. Verwenden Sie dies für angemeldete Zeugen wie Discord Web. Die Standard-Umgebungsvariable istOPENCLAW_MANTIS_BROWSER_PROFILE_TGZ_B64.--video-duration <seconds>steuert die Länge der MP4-Erfassung. Verwenden Sie eine längere Dauer für langsame angemeldete Web-Apps, die Zeit zum Stabilisieren benötigen.--keep-leaseoderOPENCLAW_MANTIS_KEEP_VM=1hält eine neu erstellte erfolgreiche Lease für die VNC-Inspektion offen. Fehlgeschlagene Läufe behalten die Lease standardmäßig bei, wenn eine erstellt wurde, damit ein Betreiber sich erneut verbinden kann.--class,--idle-timeoutund--ttlstimmen Maschinengröße und Lease-Lebensdauer ab.
Für Discord Web-Nachweise verwendet Mantis ein dediziertes Betrachterkonto anstelle eines
Bot-Tokens. Das Live-Discord-API-Szenario bleibt das Oracle: Es erstellt den echten
Thread, sendet das SUT-thread-reply und prüft den Anhang über Discord
REST. Wenn OPENCLAW_QA_DISCORD_CAPTURE_UI_METADATA=1 gesetzt ist, schreibt das Szenario außerdem
ein Discord Web-URL-Artefakt. Wenn OPENCLAW_QA_DISCORD_KEEP_THREADS=1 gesetzt ist,
lässt es diesen Thread lange genug verfügbar, damit ein angemeldeter Browser ihn öffnen
und aufzeichnen kann.
Der GitHub-Workflow öffnet die Kandidaten-Thread-URL in Discord Web, erfasst einen
Screenshot, zeichnet eine MP4 auf und generiert eine zugeschnittene GIF-Vorschau, wenn Crabbox-
Medienwerkzeuge verfügbar sind. Bevorzugen Sie einen persistenten Betrachterprofilpfad, der
über MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR konfiguriert ist, weil vollständige Chrome-Profilarchive
GitHubs Secret-Größenlimit überschreiten können. Für kleine/Bootstrap-Profile
kann der Workflow auch ein base64-.tgz-Archiv aus
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64 wiederherstellen. Wenn keine der beiden Profilquellen
konfiguriert ist, veröffentlicht der Workflow trotzdem die deterministischen Baseline-/Kandidaten-
Anhang-Screenshots und protokolliert einen Hinweis, dass der angemeldete Discord Web-Zeuge
übersprungen wurde.
Das erste vollständige Desktop-Transport-Primitiv ist der Slack-Desktop-Smoke:
pnpm openclaw qa mantis slack-desktop-smoke \
--output-dir .artifacts/qa-e2e/mantis/slack-desktop \
--gateway-setup \
--scenario slack-canary \
--keep-lease
Es least oder verwendet eine Crabbox-Desktop-Maschine erneut, synchronisiert den aktuellen Checkout in
die VM, führt pnpm openclaw qa slack innerhalb dieser VM aus, öffnet Slack Web im VNC-
Browser, erfasst den sichtbaren Desktop und kopiert sowohl die Slack-QA-Artefakte als auch
den VNC-Screenshot zurück in das lokale Ausgabeverzeichnis. Dies ist die erste Mantis-
Form, bei der das SUT-OpenClaw-Gateway und der Browser beide in derselben
Linux-Desktop-VM leben.
Mit --gateway-setup bereitet der Befehl ein persistentes wegwerfbares OpenClaw-
Home unter $HOME/.openclaw-mantis/slack-openclaw vor, patcht die Slack-Socket-Mode-
Konfiguration für den ausgewählten Kanal, startet openclaw gateway run auf Port
38973 und lässt Chrome in der VNC-Sitzung laufen. Dies ist der Modus „lassen Sie mir einen
Linux-Desktop mit Slack und einer laufenden Claw“; die Bot-zu-Bot-Slack-QA-Lane
bleibt der Standard, wenn --gateway-setup weggelassen wird.
Erforderliche Eingaben für --credential-source env:
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, bildet Mantis ihn aufOPENCLAW_LIVE_OPENAI_KEYab, bevor Crabbox aufgerufen wird, damit CrabboxsOPENCLAW_*-Env-Weiterleitung ihn in die VM übertragen kann.
Mit --gateway-setup --credential-source convex least Mantis die Slack-SUT-
Anmeldedaten aus dem gemeinsamen Pool, bevor die VM erstellt wird, und leitet die geleaste
Kanal-ID, das Socket-Mode-App-Token und das Bot-Token als OPENCLAW_MANTIS_SLACK_*-
Laufzeitumgebung innerhalb des Desktops weiter. Das hält GitHub-Workflows schlank: Sie benötigen nur
das Convex-Broker-Secret, keine rohen Slack-Bot- oder App-Token.
Nützliche Slack-Desktop-Flags:
--lease-id <cbx_...>führt erneut gegen eine Maschine aus, auf der ein Betreiber bereits über VNC bei Slack Web angemeldet ist.--gateway-setupstartet ein persistentes OpenClaw-Slack-Gateway in der VM, statt nur die Bot-zu-Bot-QA-Lane auszuführen.--keep-leasehält die Gateway-VM nach Erfolg für die VNC-Inspektion offen;--no-keep-leasestoppt sie nach dem Sammeln der Artefakte.--slack-url <url>öffnet eine bestimmte Slack Web-URL. Ohne dieses Flag leitet Mantishttps://app.slack.com/client/<team>/<channel>aus Slackauth.testab, wenn das SUT-Bot-Token verfügbar ist.--slack-channel-id <id>steuert die Slack-Kanal-Allowlist, die vom Gateway-Setup verwendet wird.OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIRsteuert das persistente Chrome-Profil innerhalb der VM. Der Standard ist$HOME/.config/openclaw-mantis/slack-chrome-profile, sodass eine manuelle Slack Web-Anmeldung erneute Läufe auf derselben Lease überlebt.--credential-source convex --credential-role civerwendet den gemeinsamen Anmeldedatenpool statt direkter Slack-Env-Token.--provider-mode,--model,--alt-modelund--fastwerden an die Slack-Live-Lane durchgereicht.
Der GitHub-Smoke-Workflow ist Mantis Discord Smoke. Der Vorher- und Nachher-GitHub-
Workflow für das erste echte Szenario ist Mantis Discord Status Reactions. Er
akzeptiert:
baseline_ref: die Ref, von der erwartet wird, dass sie nur-warteschlangenbasiertes Verhalten reproduziert.candidate_ref: die Ref, von der erwartet wird, dass siequeued -> thinking -> donezeigt.
Er checkt die Workflow-Harness-Ref aus, baut separate Baseline- und Kandidaten-
Worktrees, führt discord-status-reactions-tool-only gegen jeden Worktree aus und
lädt baseline/, candidate/, comparison.json und mantis-report.md als
Actions-Artefakte hoch. Außerdem rendert er die Zeitleisten-HTML jeder Lane in einem Crabbox-
Desktop-Browser und veröffentlicht diese VNC-Screenshots neben den deterministischen
Zeitleisten-PNGs im PR-Kommentar. Derselbe PR-Kommentar bettet leichte
bewegungszugeschnittene GIF-Vorschauen ein, die von crabbox media preview generiert wurden, verlinkt auf die
passenden bewegungszugeschnittenen MP4-Clips und behält die vollständigen Desktop-MP4-Dateien für eine tiefere
Inspektion. Screenshots bleiben inline für eine schnelle Prüfung. Der Workflow baut die
Crabbox-CLI aus
openclaw/crabbox main, damit er die aktuellen Desktop-/Browser-Lease-Flags verwenden kann,
bevor das nächste Crabbox-Binary-Release erstellt wird.
Mantis Scenario ist der generische manuelle Einstiegspunkt. Es nimmt eine scenario_id,
candidate_ref, optionale baseline_ref und optionale pr_number entgegen und
löst dann den szenarioeigenen Workflow aus. Der Wrapper ist absichtlich dünn:
Szenario-Workflows besitzen weiterhin ihr Transport-Setup, ihre Anmeldedaten, VM-Klasse,
das erwartete Oracle und das Artefaktmanifest.
Mantis Slack Desktop Smoke ist der erste Slack-VM-Workflow. Er checkt die
vertrauenswürdige Kandidaten-Ref in einem separaten Worktree aus, least einen
Crabbox-Linux-Desktop, führt pnpm openclaw qa mantis slack-desktop-smoke --gateway-setup gegen diesen
Kandidaten aus, öffnet Slack Web im VNC-Browser, zeichnet den Desktop auf, erzeugt mit
crabbox media preview eine bewegungsgekürzte Vorschau, lädt das vollständige
Artefaktverzeichnis hoch und veröffentlicht optional den Inline-Nachweiskommentar im Ziel-PR.
Standardmäßig verwendet er AWS für die Desktop-Lease und stellt eine manuelle Provider-Eingabe bereit, damit
Operatoren zu Hetzner wechseln können, wenn AWS-Kapazität langsam oder nicht verfügbar ist. Verwenden
Sie diese Lane, wenn Sie „einen Linux-Desktop mit Slack und einer laufenden Claw“ möchten, statt
nur ein Bot-zu-Bot-Slack-Transkript.
Jedes PR-veröffentlichende Szenario schreibt mantis-evidence.json neben seinen Bericht.
Dieses Schema ist die Übergabe zwischen Szenariocode und GitHub-Kommentaren:
{
"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
}
]
}
Artefakt-path-Werte sind relativ zum Manifestverzeichnis. targetPath-Werte
sind relative Pfade unter dem Veröffentlichungsverzeichnis des qa-artifacts-Branch.
Der Publisher weist Path-Traversal zurück und überspringt Einträge, die mit
"required": false markiert sind, wenn optionale Vorschauen oder Videos nicht verfügbar sind.
Unterstützte Artefaktarten:
timeline: deterministischer Szenario-Screenshot, üblicherweise Vorher/Nachher.desktopScreenshot: VNC-/Browser-Desktop-Screenshot.motionPreview: inline animiertes GIF, das aus der Desktop-Aufzeichnung erzeugt wird.motionClip: bewegungsgekürztes MP4, das statischen Vorlauf und Nachlauf entfernt.fullVideo: vollständige MP4-Aufzeichnung für detaillierte Prüfung.metadata: JSON-/Log-Sidecar.report: Markdown-Bericht.
Der wiederverwendbare Publisher ist scripts/mantis/publish-pr-evidence.mjs. Workflows
rufen ihn mit dem Manifest, dem Ziel-PR, dem qa-artifacts-Zielstamm, Kommentarmarker,
Actions-Artefakt-URL, Run-URL und Anfragequelle auf. Er kopiert die deklarierten Artefakte
in den qa-artifacts-Branch, erstellt einen zusammenfassungsorientierten PR-Kommentar mit Inline-
Bildern/Vorschauen und verlinkten Videos und aktualisiert dann den vorhandenen Markerkommentar oder
erstellt einen neuen.
Sie können den Status-Reactions-Lauf auch direkt aus einem PR-Kommentar auslösen:
@Mantis discord status reactions
Der Kommentarauslöser ist absichtlich eng gefasst. Er läuft nur bei Pull-Request- Kommentaren von Benutzern mit Schreib-, Maintain- oder Admin-Zugriff und erkennt nur Discord-Status-Reaction-Anfragen. Standardmäßig verwendet er die bekannte fehlerhafte Baseline-Ref und den aktuellen PR-Head-SHA als Kandidaten. Maintainer können beide Refs überschreiben:
@Mantis discord status reactions baseline=origin/main candidate=HEAD
ClawSweeper-Befehlsbeispiele:
@clawsweeper mantis discord discord-status-reactions-tool-only
@clawsweeper verify e2e discord
Der erste Befehl ist explizit und szenariofokussiert. Der zweite kann später einen PR oder ein Issue anhand von Labels, geänderten Dateien und ClawSweeper-Review-Ergebnissen empfohlenen Mantis-Szenarien zuordnen.
Lauflebenszyklus
- Anmeldedaten abrufen.
- Eine VM zuweisen oder wiederverwenden.
- Das Desktop-/Browserprofil vorbereiten, wenn das Szenario UI-Nachweise benötigt.
- Einen sauberen Checkout für die Baseline-Ref vorbereiten.
- Abhängigkeiten installieren und nur bauen, was das Szenario benötigt.
- Eine untergeordnete OpenClaw-Gateway mit isoliertem Statusverzeichnis starten.
- Live-Transport, Provider, Modell und Browserprofil konfigurieren.
- Das Szenario ausführen und Baseline-Nachweise erfassen.
- Die Gateway stoppen und Logs aufbewahren.
- Die Kandidaten-Ref in derselben VM vorbereiten.
- Dasselbe Szenario ausführen und Kandidatennachweise erfassen.
- Die Oracle-Ergebnisse und visuellen Nachweise vergleichen.
- Markdown, JSON, Logs, Screenshots und optionale Trace-Artefakte schreiben.
- GitHub-Actions-Artefakte hochladen.
- Eine knappe PR- oder Discord-Statusnachricht veröffentlichen.
Das Szenario sollte auf zwei verschiedene Arten fehlschlagen können:
- Fehler reproduziert: Die Baseline ist auf die erwartete Weise fehlgeschlagen.
- Harness-Fehler: Umgebungssetup, Anmeldedaten, Discord-API, Browser oder Provider sind fehlgeschlagen, bevor das Fehler-Oracle aussagekräftig war.
Der Abschlussbericht muss diese Fälle trennen, damit Maintainer eine instabile Umgebung nicht mit Produktverhalten verwechseln.
Discord-MVP
Das erste Szenario sollte Discord-Status-Reactions in Guild-Kanälen anvisieren, bei denen
der Zustellmodus der Quellantwort message_tool_only ist.
Warum es ein guter Mantis-Startpunkt ist:
- Es ist in Discord als Reactions auf der auslösenden Nachricht sichtbar.
- Es hat ein starkes REST-Oracle über den Discord-Message-Reaction-Status.
- Es übt eine echte OpenClaw-Gateway, Discord-Bot-Authentifizierung, Nachrichtenversand, den Zustellmodus der Quellantwort, Status-Reaction-Zustand und Modell-Turn-Lebenszyklus aus.
- Es ist eng genug, um die erste Implementierung präzise zu halten.
Erwartete Szenarioform:
id: discord-status-reactions-tool-only
transport: discord
baseline:
expect:
reproduced: true
candidate:
expect:
fixed: true
config:
messages:
ackReaction: "👀"
ackReactionScope: "group-mentions"
groupChat:
visibleReplies: "message_tool"
statusReactions:
enabled: true
timing:
debounceMs: 0
discord:
requireMention: true
notifyChannel: operator-notify
evidence:
rest:
messageReactions: true
browser:
screenshotMessageRow: true
Baseline-Nachweise sollten die Queued-Acknowledgement-Reaction zeigen, aber keine
Lebenszyklus-Transition im Tool-only-Modus. Kandidatennachweise sollten zeigen, dass Lebenszyklus-
Status-Reactions laufen, wenn messages.statusReactions.enabled explizit
true ist.
Der ausführbare erste Teil ist das Opt-in-Discord-Live-QA-Szenario:
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-candidate
Es konfiguriert das SUT mit stets aktivierter Guild-Verarbeitung, visibleReplies: "message_tool", ackReaction: "👀" und expliziten Status-Reactions. Das Oracle
pollt die echte auslösende Discord-Nachricht und erwartet die beobachtete Sequenz
👀 -> 🤔 -> 👍. Artefakte enthalten discord-qa-reaction-timelines.json,
discord-status-reactions-tool-only-timeline.html und
discord-status-reactions-tool-only-timeline.png.
Vorhandene QA-Bausteine
Mantis sollte auf dem vorhandenen privaten QA-Stack aufbauen, statt bei null zu beginnen:
pnpm openclaw qa discordführt bereits eine Live-Discord-Lane mit Driver- und SUT-Bots aus.- Der Live-Transport-Runner schreibt bereits Berichte und Observed-Message-
Artefakte unter
.artifacts/qa-e2e/. - Convex-Credential-Leases stellen bereits exklusiven Zugriff auf gemeinsam genutzte Live- Transport-Anmeldedaten bereit.
- Der Browser-Control-Service unterstützt bereits Screenshots, Snapshots, headless verwaltete Profile und Remote-CDP-Profile.
- QA Lab hat bereits eine Debugger-UI und einen Bus für transportförmiges Testing.
Die erste Mantis-Implementierung kann ein dünner Vorher/Nachher-Runner über diesen Bausteinen sein, ergänzt um eine visuelle Nachweisschicht.
Nachweismodell
Jeder Lauf schreibt ein stabiles Artefaktverzeichnis:
.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.log
mantis-summary.json sollte die maschinenlesbare Source of Truth sein. Der
Markdown-Bericht ist für PR-Kommentare und menschliche Review vorgesehen.
Die Zusammenfassung muss enthalten:
- getestete Refs und SHAs
- Transport und Szenario-ID
- Maschinen-Provider und Maschinen-ID oder Lease-ID
- Anmeldedatenquelle ohne geheime Werte
- Baseline-Ergebnis
- Kandidatenergebnis
- ob der Fehler auf der Baseline reproduziert wurde
- ob der Kandidat ihn behoben hat
- Artefaktpfade
- bereinigte Setup- oder Cleanup-Probleme
Screenshots sind Nachweise, keine Secrets. Sie benötigen trotzdem Redaktionsdisziplin: private Kanalnamen, Benutzernamen oder Nachrichteninhalte können erscheinen. Für öffentliche PRs sollten Sie GitHub-Actions-Artefaktlinks gegenüber Inline-Bildern bevorzugen, bis die Redaktionsstrategie stärker ist.
Browser und VNC
Die Browser-Lane hat zwei Modi:
- Headless-Automatisierung: Standard für CI. Chrome läuft mit aktiviertem CDP, und Playwright oder OpenClaw-Browsersteuerung erfasst Screenshots.
- VNC-Rettung: auf derselben VM aktiviert, wenn Anmeldung, MFA, Discord-Anti-Automation oder visuelles Debugging einen Menschen erfordern.
Das Discord-Observer-Browserprofil sollte persistent genug sein, um nicht bei jedem Lauf eine Anmeldung zu erfordern, aber von persönlichem Browserzustand isoliert sein. Ein Profil gehört zum Mantis-Maschinenpool, nicht zu einem Entwickler-Laptop.
Wenn Mantis hängen bleibt, veröffentlicht es eine Discord-Statusnachricht mit:
- Lauf-ID
- Szenario-ID
- Maschinen-Provider
- Artefaktverzeichnis
- VNC- oder noVNC-Verbindungsanweisungen, falls verfügbar
- kurzem Blockertext
Die erste private Bereitstellung kann diese Nachrichten im vorhandenen Operator- Kanal veröffentlichen und später in einen dedizierten Mantis-Kanal wechseln.
Maschinen
Mantis sollte für die erste Remote-Implementierung AWS über Crabbox bevorzugen. Crabbox gibt uns vorgewärmte Maschinen, Lease-Tracking, Hydration, Logs, Ergebnisse und Cleanup. Wenn AWS-Kapazität zu langsam oder nicht verfügbar ist, fügen Sie einen Hetzner-Provider hinter derselben Maschinenschnittstelle hinzu.
Mindestanforderungen an die VM:
- Linux mit desktopfähiger Chrome- oder Chromium-Installation
- CDP-Zugriff für Browserautomatisierung
- VNC oder noVNC für Rettung
- Node 22 und pnpm
- OpenClaw-Checkout und Abhängigkeitscache
- Playwright-Chromium-Browsercache, wenn Playwright verwendet wird
- ausreichend CPU und Arbeitsspeicher für eine OpenClaw-Gateway, einen Browser und einen Modelllauf
- ausgehender Zugriff auf Discord, GitHub, Modell-Provider und den Credential-Broker
Die VM sollte keine langlebigen Roh-Secrets außerhalb der erwarteten Credential- oder Browserprofil-Speicher behalten.
Secrets
Secrets liegen für Remote-Läufe in GitHub-Organisations- oder Repository-Secrets und in einer lokalen, operatorgesteuerten Secret-Datei für lokale Läufe.
Empfohlene Secret-Namen:
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_IDOPENCLAW_QA_REDACT_PUBLIC_METADATA=1für öffentliche GitHub-Artefakt-UploadsOPENCLAW_QA_CONVEX_SITE_URLOPENCLAW_QA_CONVEX_SECRET_CIOPENCLAW_QA_MANTIS_CRABBOX_COORDINATOROPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR_TOKEN
Langfristig sollte der Convex-Credential-Pool die normale Quelle für Live-
Transport-Anmeldedaten bleiben. GitHub-Secrets bootstrappen den Broker und Fallback-Lanes.
Der Discord-Status-Reactions-Workflow bildet die Mantis-Crabbox-Secrets zurück auf
die Umgebungsvariablen CRABBOX_COORDINATOR und CRABBOX_COORDINATOR_TOKEN,
die die Crabbox-CLI erwartet. Die einfachen CRABBOX_*-GitHub-Secret-Namen bleiben
als Kompatibilitäts-Fallback akzeptiert.
Der Mantis-Runner darf niemals ausgeben:
- Discord-Bot-Tokens
- Provider-API-Schlüssel
- Browser-Cookies
- Inhalte von Auth-Profilen
- VNC-Passwörter
- rohe Credential-Payloads
Öffentliche Artefakt-Uploads sollten außerdem Discord-Zielmetadaten wie Bot-,
Guild-, Kanal- und Nachrichten-IDs redigieren. Der GitHub-Smoke-Workflow aktiviert
aus diesem Grund OPENCLAW_QA_REDACT_PUBLIC_METADATA=1.
Wenn ein Token versehentlich in ein Issue, einen PR, einen Chat oder ein Log eingefügt wird, rotieren Sie es, nachdem das neue Secret gespeichert wurde.
GitHub-Artefakte und PR-Kommentare
Mantis-Workflows sollten das vollständige Evidenzpaket als kurzlebiges Actions-Artefakt hochladen. Wenn der Workflow für einen Fehlerbericht oder eine Korrektur-PR ausgeführt wird, sollte er außerdem die redigierten PNG-Screenshots im Branch qa-artifacts veröffentlichen und einen Kommentar zu diesem Fehler oder dieser Korrektur-PR mit Inline-Vorher-/Nachher-Screenshots upserten. Veröffentlichen Sie den primären Nachweis nicht nur in einer generischen QA-Automatisierungs-PR. Rohprotokolle, beobachtete Nachrichten und andere umfangreiche Evidenz bleiben im Actions-Artefakt.
Produktions-Workflows sollten diese Kommentare mit der Mantis GitHub App posten, nicht mit github-actions[bot]. Speichern Sie die App-ID und den privaten Schlüssel als GitHub-Actions-Secrets MANTIS_GITHUB_APP_ID und MANTIS_GITHUB_APP_PRIVATE_KEY. Der Workflow verwendet eine versteckte Markierung als Upsert-Schlüssel, aktualisiert diesen Kommentar, wenn das Token ihn bearbeiten kann, und erstellt einen neuen Mantis-eigenen Kommentar, wenn eine ältere Bot-eigene Markierung nicht bearbeitet werden kann.
Der PR-Kommentar sollte kurz und visuell sein:
Mantis Discord Status Reactions QA
Summary: Mantis reran the reported Discord status-reaction bug against the known
bad baseline and the candidate fix. The baseline reproduced the bug, while the
candidate 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> |
Wenn der Lauf fehlschlägt, weil das Harness fehlgeschlagen ist, muss der Kommentar das sagen, statt nahezulegen, dass der Kandidat fehlgeschlagen ist.
Hinweise zur privaten Bereitstellung
Eine private Bereitstellung kann bereits eine Mantis Discord-Anwendung haben. Verwenden Sie diese Anwendung wieder, statt eine weitere App zu erstellen, wenn sie die richtigen Bot-Berechtigungen hat und sicher rotiert werden kann.
Legen Sie den anfänglichen Operator-Benachrichtigungskanal über Secrets oder die Bereitstellungskonfiguration fest. Er kann zunächst auf einen bestehenden Maintainer- oder Betriebskanal verweisen und später in einen dedizierten Mantis-Kanal verschoben werden, sobald einer existiert.
Nehmen Sie keine Guild-IDs, Kanal-IDs, Bot-Token, Browser-Cookies oder VNC-Passwörter in dieses Dokument auf. Speichern Sie sie in GitHub-Secrets, im Credential Broker oder im lokalen Secret Store des Operators.
Ein Szenario hinzufügen
Ein Mantis-Szenario sollte Folgendes deklarieren:
- id und Titel
- Transport
- erforderliche Anmeldedaten
- Baseline-Ref-Richtlinie
- Kandidaten-Ref-Richtlinie
- OpenClaw-Konfigurationspatch
- Einrichtungsschritte
- Stimulus
- erwartetes Baseline-Orakel
- erwartetes Kandidatenorakel
- Ziele für visuelle Erfassung
- Timeout-Budget
- Bereinigungsschritte
Szenarien sollten kleine, typisierte Orakel bevorzugen:
- Discord-Reaktionsstatus für Reaktionsfehler
- Discord-Nachrichtenreferenzen für Threading-Fehler
- Slack-Thread-TS und Reaktions-API-Status für Slack-Fehler
- E-Mail-Nachrichten-IDs und Header für E-Mail-Fehler
- Browser-Screenshots, wenn die UI der einzige zuverlässige beobachtbare Zustand ist
Vision-Prüfungen sollten additiv sein. Wenn eine Plattform-API den Fehler nachweisen kann, verwenden Sie die API als Bestehen-/Fehlschlagen-Orakel und behalten Sie Screenshots für menschliches Vertrauen bei.
Provider-Erweiterung
Nach Discord kann derselbe Runner Folgendes hinzufügen:
- Slack: Reaktionen, Threads, App-Erwähnungen, Modals, Datei-Uploads.
- E-Mail: Gmail-Authentifizierung und Nachrichten-Threading mit
gog, wenn Connectors nicht ausreichen. - WhatsApp: QR-Anmeldung, erneute Identifizierung, Nachrichtenzustellung, Medien, Reaktionen.
- Telegram: Gruppen-Erwähnungs-Gating, Befehle, Reaktionen, sofern verfügbar.
- Matrix: verschlüsselte Räume, Thread- oder Antwortbeziehungen, Wiederaufnahme nach Neustart.
Jeder Transport sollte ein günstiges Smoke-Szenario und ein oder mehrere Fehlerklassen-Szenarien haben. Aufwendige visuelle Szenarien sollten Opt-in bleiben.
Offene Fragen
- Welcher Discord-Bot sollte der Treiber sein und welcher das SUT, wenn der bestehende Mantis-Bot wiederverwendet wird?
- Sollte die Anmeldung des Beobachter-Browsers in der ersten Phase ein menschliches Discord-Konto, ein Testkonto oder nur Bot-lesbare REST-Evidenz verwenden?
- Wie lange sollte GitHub Mantis-Artefakte für PRs aufbewahren?
- Wann sollte ClawSweeper automatisch Mantis empfehlen, statt auf einen Maintainer-Befehl zu warten?
- Sollten Screenshots vor dem Hochladen für öffentliche PRs redigiert oder zugeschnitten werden?