Get started
Mantis
Mantis is het end-to-end-verificatiesysteem van OpenClaw voor bugs die een echte runtime, een echt transport en zichtbaar bewijs nodig hebben. Het voert een scenario uit tegen een bekende slechte ref, legt bewijs vast, voert hetzelfde scenario uit tegen een kandidaat-ref en publiceert de vergelijking als artifacts die een maintainer vanuit een PR of via een lokale opdracht kan inspecteren.
Mantis begint met Discord omdat Discord ons een waardevolle eerste lane geeft: echte bot-auth, echte guild-kanalen, reacties, threads, native commands en een browser-UI waarin mensen visueel kunnen bevestigen wat het transport liet zien.
Doelen
- Reproduceer een bug uit een GitHub-issue of PR met dezelfde transportvorm die gebruikers zien.
- Leg een voor-artifact vast op de baseline-ref voordat de fix wordt toegepast.
- Leg een na-artifact vast op de kandidaat-ref nadat de fix is toegepast.
- Gebruik waar mogelijk een deterministische oracle, zoals een Discord REST-reactie- uitlezing of kanaaltranscriptcontrole.
- Leg screenshots vast wanneer de bug een zichtbaar UI-oppervlak heeft.
- Voer lokaal uit vanuit een door een agent bestuurde CLI en op afstand vanuit GitHub.
- Bewaar genoeg machinestatus voor VNC-redding wanneer login, browserautomatisering of provider-auth vastloopt.
- Plaats beknopte status in een operator-Discord-kanaal wanneer de run is geblokkeerd, handmatige VNC-hulp nodig heeft of klaar is.
Niet-doelen
- Mantis is geen vervanging voor unit tests. Een Mantis-run moet meestal een kleinere regressietest worden zodra de fix is begrepen.
- Mantis is niet de normale snelle CI-gate. Het is trager, gebruikt live-referenties en is gereserveerd voor bugs waarbij de live-omgeving ertoe doet.
- Mantis mag geen mens vereisen voor normaal gebruik. Handmatige VNC is een reddingspad, niet het standaardpad.
- Mantis slaat geen ruwe geheimen op in artifacts, logs, screenshots, Markdown- rapporten of PR-comments.
Eigenaarschap
Mantis leeft in de OpenClaw-QA-stack.
- OpenClaw is eigenaar van de scenarioruntime, transportadapters, bewijsschema en
lokale CLI onder
pnpm openclaw qa mantis. - QA Lab is eigenaar van de live-transportharnasonderdelen, browsercapturehelpers en artifact-writers.
- Crabbox is eigenaar van opgewarmde Linux-machines wanneer een externe VM nodig is.
- GitHub Actions is eigenaar van het externe workflow-entrypoint en artifactretentie.
- ClawSweeper is eigenaar van GitHub-commentrouting: maintainer-commands parsen, de workflow dispatchen en de uiteindelijke PR-comment plaatsen.
- OpenClaw-agents sturen Mantis via Codex wanneer een scenario agentic setup, debugging of stuck-state-rapportage nodig heeft.
Deze grens houdt transportkennis in OpenClaw, machineplanning in Crabbox en maintainer-workflowlijm in ClawSweeper.
Commandovorm
De eerste lokale opdracht verifieert de Discord-bot, guild, kanaal, berichtverzending, reactieverzending en artifactpad:
pnpm openclaw qa mantis discord-smoke \ --output-dir .artifacts/qa-e2e/mantis/discord-smokeDe lokale voor- en na-runner accepteert deze vorm:
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-reactionsDe runner maakt detached baseline- en kandidaat-worktrees onder de output-
directory, installeert dependencies, bouwt elke ref, voert het scenario uit met
--allow-failures en schrijft daarna baseline/, candidate/, comparison.json
en mantis-report.md. Voor het eerste Discord-scenario betekent een geslaagde
verificatie dat de baseline-status fail is en de kandidaat-status pass.
De tweede Discord-voor/na-probe richt zich op thread-bijlagen:
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-attachmentDat scenario plaatst een bovenliggend bericht met de driver-bot, maakt een echte Discord-
thread, roept OpenClaw's message.thread-reply-actie aan met een repo-lokale
filePath en pollt daarna de thread op het SUT-antwoord en de bijlagebestandsnaam. Het
baseline-screenshot toont het antwoord zonder bijlage; het kandidaat-screenshot
toont de verwachte mantis-thread-report.md-bijlage.
De eerste VM/browser-primitive is de desktop-smoke:
pnpm openclaw qa mantis desktop-browser-smoke \ --output-dir .artifacts/qa-e2e/mantis/desktop-browserDeze least of hergebruikt een Crabbox-desktopmachine, start een zichtbare browser binnen de
VNC-sessie, legt de desktop vast, haalt artifacts terug naar de lokale output-
directory en schrijft de reconnect-opdracht in het rapport. De opdracht gebruikt standaard
de Hetzner-provider omdat dit de eerste provider is met werkende desktop/VNC-
dekking in de Mantis-lane. Overschrijf dit met --provider, --crabbox-bin of
OPENCLAW_MANTIS_CRABBOX_PROVIDER wanneer je tegen een andere Crabbox-fleet draait.
Handige desktop-smoke-vlaggen:
--lease-id <cbx_...>ofOPENCLAW_MANTIS_CRABBOX_LEASE_IDhergebruikt een opgewarmde desktop.--browser-url <url>wijzigt de pagina die in de zichtbare browser wordt geopend.--html-file <path>rendert een repo-lokaal HTML-artifact in de zichtbare browser. Mantis gebruikt dit om de gegenereerde Discord-statusreactietijdlijn via een echte Crabbox-desktop vast te leggen.--browser-profile-dir <remote-path>hergebruikt een externe Chrome-user-data-dir zodat een persistente Mantis-desktop tussen runs ingelogd kan blijven. Gebruik dit voor het langlevende Discord Web-viewerprofiel.--browser-profile-archive-env <name>herstelt een base64.tgzChrome-user-data-dir-archief uit de genoemde omgevingsvariabele voordat de browser wordt gestart. Gebruik dit voor ingelogde witnesses zoals Discord Web. De standaard-env-var isOPENCLAW_MANTIS_BROWSER_PROFILE_TGZ_B64.--video-duration <seconds>bepaalt de MP4-capturelengte. Gebruik een langere duur voor trage ingelogde webapps die tijd nodig hebben om stabiel te worden.--keep-leaseofOPENCLAW_MANTIS_KEEP_VM=1houdt een nieuw aangemaakte geslaagde lease open voor VNC-inspectie. Mislukte runs houden de lease standaard open wanneer er een is aangemaakt zodat een operator opnieuw kan verbinden.--class,--idle-timeouten--ttltunen machinegrootte en levensduur van de lease.
Voor Discord Web-bewijs gebruikt Mantis een speciaal vieweraccount in plaats van een
bot-token. Het live Discord API-scenario blijft de oracle: het maakt de echte
thread, verzendt de SUT thread-reply en controleert de bijlage via Discord
REST. Wanneer OPENCLAW_QA_DISCORD_CAPTURE_UI_METADATA=1 is ingesteld, schrijft het scenario ook
een Discord Web-URL-artifact. Wanneer OPENCLAW_QA_DISCORD_KEEP_THREADS=1 is
ingesteld, laat het die thread lang genoeg beschikbaar zodat een ingelogde browser hem kan openen
en opnemen.
De GitHub-workflow opent de kandidaat-thread-URL in Discord Web, legt een
screenshot vast, neemt een MP4 op en genereert een ingekorte GIF-preview wanneer Crabbox-
mediatooling beschikbaar is. Geef de voorkeur aan een persistent viewerprofielpad dat is geconfigureerd
via MANTIS_DISCORD_VIEWER_CHROME_PROFILE_DIR, omdat volledige Chrome-profiel-
archieven groter kunnen worden dan GitHub's limiet voor secret-grootte. Voor kleine/bootstrapprofielen
kan de workflow ook een base64 .tgz-archief herstellen uit
MANTIS_DISCORD_VIEWER_CHROME_PROFILE_TGZ_B64. Als geen van beide profielbronnen is
geconfigureerd, publiceert de workflow nog steeds de deterministische baseline/kandidaat-
bijlagescreenshots en logt een notice dat de ingelogde Discord Web-witness
is overgeslagen.
De eerste volledige desktop-transportprimitive is de Slack-desktop-smoke:
pnpm openclaw qa mantis slack-desktop-smoke \ --output-dir .artifacts/qa-e2e/mantis/slack-desktop \ --gateway-setup \ --scenario slack-canary \ --keep-leaseDeze least of hergebruikt een Crabbox-desktopmachine, synchroniseert de huidige checkout naar
de VM, voert pnpm openclaw qa slack binnen die VM uit, opent Slack Web in de VNC-
browser, legt de zichtbare desktop vast en kopieert zowel de Slack-QA-artifacts als
het VNC-screenshot terug naar de lokale outputdirectory. Dit is de eerste Mantis-
vorm waarbij de SUT OpenClaw-gateway en de browser allebei binnen dezelfde
Linux-desktop-VM leven.
Met --gateway-setup bereidt de opdracht een persistente disposable OpenClaw-
home voor op $HOME/.openclaw-mantis/slack-openclaw, patcht Slack Socket Mode-
configuratie voor het geselecteerde kanaal, start openclaw gateway run op poort
38973 en houdt Chrome actief in de VNC-sessie. Dit is de modus "laat mij een
Linux-desktop met Slack en een claw draaien"; de bot-naar-bot Slack-QA-lane
blijft de standaard wanneer --gateway-setup wordt weggelaten.
Vereiste inputs voor --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_KEYvoor de externe modellane. Als alleenOPENAI_API_KEYlokaal is ingesteld, mapt Mantis die naarOPENCLAW_LIVE_OPENAI_KEYvoordat Crabbox wordt aangeroepen, zodat Crabbox'sOPENCLAW_*-env-forwarding hem naar de VM kan meenemen.
Met --gateway-setup --credential-source convex least Mantis de Slack SUT-
referentie uit de gedeelde pool voordat de VM wordt aangemaakt en forwardt het geleasete
kanaal-id, Socket Mode-app-token en bot-token als de OPENCLAW_MANTIS_SLACK_*-
runtime-env binnen de desktop. Dat houdt GitHub-workflows dun: ze hebben alleen
het Convex-brokersecret nodig, niet ruwe Slack-bot- of app-tokens.
Handige Slack-desktop-vlaggen:
--lease-id <cbx_...>voert opnieuw uit tegen een machine waarop een operator al via VNC bij Slack Web heeft ingelogd.--gateway-setupstart een persistente OpenClaw Slack-gateway in de VM in plaats van alleen de bot-naar-bot-QA-lane uit te voeren.--keep-leasehoudt de gateway-VM open voor VNC-inspectie na succes;--no-keep-leasestopt hem na het verzamelen van artifacts.--slack-url <url>opent een specifieke Slack Web-URL. Zonder deze optie leidt Mantishttps://app.slack.com/client/<team>/<channel>af uit Slackauth.testwanneer het SUT-bot-token beschikbaar is.--slack-channel-id <id>bepaalt de Slack-kanaalallowlist die door gateway-setup wordt gebruikt.OPENCLAW_MANTIS_SLACK_BROWSER_PROFILE_DIRbepaalt het persistente Chrome-profiel binnen de VM. De standaard is$HOME/.config/openclaw-mantis/slack-chrome-profile, zodat een handmatige Slack Web-login reruns op dezelfde lease overleeft.--credential-source convex --credential-role cigebruikt de gedeelde referentiepool in plaats van directe Slack-env-tokens.--provider-mode,--model,--alt-modelen--fastworden doorgegeven aan de Slack-live-lane.
Approval checkpoint-runs renderen Slack API-berichtsnapshots naar checkpoint-PNG's
voor CI-veilig visueel bewijs. slack-desktop-smoke.png is alleen bewijs van Slack Web
wanneer de lease een warm browserprofiel gebruikt dat al is ingelogd.
De GitHub-smoke-workflow is Mantis Discord Smoke. De voor- en na-GitHub-
workflow voor het eerste echte scenario is Mantis Discord Status Reactions. Deze
accepteert:
baseline_ref: de ref die naar verwachting queued-only-gedrag reproduceert.candidate_ref: de ref die naar verwachtingqueued -> thinking -> donetoont.
Deze checkt de workflow-harness-ref uit, bouwt afzonderlijke baseline- en kandidaat-
worktrees, voert discord-status-reactions-tool-only tegen elke worktree uit en
uploadt baseline/, candidate/, comparison.json en mantis-report.md als
Actions-artifacts. Deze rendert ook de tijdlijn-HTML van elke lane in een Crabbox-
desktopbrowser en publiceert die VNC-screenshots naast de deterministische
tijdlijn-PNG's in de PR-comment. Dezelfde PR-comment embedt lichte
motion-trimmed GIF-previews die door crabbox media preview zijn gegenereerd, linkt naar de
bijbehorende motion-trimmed MP4-clips en bewaart de volledige desktop-MP4-bestanden voor diepe
inspectie. Screenshots blijven inline voor snelle review. De workflow bouwt de
Crabbox CLI vanaf
openclaw/crabbox main zodat deze de huidige desktop/browser-leasevlaggen kan gebruiken
voordat de volgende Crabbox-binaryrelease wordt uitgebracht.
Mantis Scenario is het generieke handmatige toegangspunt. Het neemt een scenario_id,
candidate_ref, optionele baseline_ref en optionele pr_number, en
stuurt daarna de workflow aan die eigendom is van het scenario. De wrapper is bewust dun:
scenarioworkflows blijven eigenaar van hun transportconfiguratie, referenties, VM-klasse,
verwachte oracle en artifact-manifest.
Mantis Slack Desktop Smoke is de eerste Slack VM-workflow. Deze checkt de
vertrouwde kandidaat-ref uit in een aparte worktree, least een Crabbox Linux-desktop,
voert pnpm openclaw qa mantis slack-desktop-smoke --gateway-setup uit tegen die
kandidaat, opent Slack Web in de VNC-browser, neemt de desktop op, genereert een
bewegingsgetrimde preview met crabbox media preview, uploadt de volledige artifact-
directory en plaatst optioneel de inline evidence-opmerking op de doel-PR.
De standaard is AWS voor de desktoplease en er is een handmatige providerinvoer zodat
operators kunnen overschakelen naar Hetzner wanneer AWS-capaciteit traag of niet
beschikbaar is. Gebruik deze lane wanneer je "een Linux-desktop met Slack en een
draaiende claw" wilt in plaats van alleen een bot-naar-bot Slack-transcript.
Mantis Telegram Live verpakt de bestaande Telegram live QA-lane in dezelfde PR-
evidencepipeline. Deze checkt de vertrouwde kandidaat-ref uit in een aparte
worktree, voert pnpm openclaw qa telegram --credential-source convex --credential-role ci uit, schrijft een mantis-evidence.json-manifest vanuit de
Telegram QA-samenvatting, qa-evidence.json en rapportartifacts, rendert de
geredigeerde evidence-HTML via een Crabbox desktopbrowser, genereert een
bewegingsgetrimde GIF met crabbox media preview en plaatst de inline PR-
evidence-opmerking wanneer een PR-nummer beschikbaar is. Deze lane is visuele
QA-evidence in plaats van bewijs via ingelogde Telegram Web: de Telegram Bot API
geeft stabiele live berichtevidence, maar Telegram Web-loginstatus is niet nodig
voor normale Mantis-automatisering.
Mantis Telegram Desktop Proof is de agentic native Telegram Desktop
voor/na-wrapper. Een maintainer kan deze activeren vanuit een PR-opmerking met
@openclaw-mantis telegram desktop proof, vanuit de Actions-UI met vrije
instructies, of via de generieke Mantis Scenario-dispatcher. De workflow geeft
de PR, baseline-ref, kandidaat-ref en maintainerinstructies door aan Codex.
De agent leest de PR, bepaalt welk Telegram-zichtbaar gedrag de wijziging bewijst,
voert de real-user Crabbox Telegram Desktop proof-lane uit voor baseline en
kandidaat, itereert totdat de native GIFs bruikbaar zijn, schrijft gekoppelde
motionPreview-artifacts naar mantis-evidence.json, uploadt de bundel en
plaatst een PR-evidencetabel met 2 kolommen wanneer een PR-nummer beschikbaar is.
Gebruik voor human-in-the-loop Telegram-desktopconfiguratie de scenariobouwer:
pnpm openclaw qa mantis telegram-desktop-builder \ --credential-source convex \ --credential-role maintainer \ --keep-leaseDe bouwer least of hergebruikt een Crabbox-desktop, installeert de native Linux
Telegram Desktop-binary, herstelt optioneel een gebruikerssessiearchief, configureert
OpenClaw met het geleasede Telegram SUT-bottoken, start openclaw gateway run
op poort 38974, plaatst een gereedheidsbericht van de driver-bot in de geleasede
privégroep en legt daarna een screenshot en MP4 vast van de zichtbare VNC-desktop.
Een bottoken logt Telegram Desktop nooit in; het configureert alleen OpenClaw. De
desktopviewer is een aparte Telegram-gebruikerssessie die wordt hersteld vanuit
--telegram-profile-archive-env <name> of handmatig via VNC wordt gemaakt en met
--keep-lease actief wordt gehouden.
Nuttige Telegram-desktopbouwerflags:
--lease-id <cbx_...>draait opnieuw tegen een VM waarop een operator al is ingelogd bij Telegram Desktop.--telegram-profile-archive-env <name>leest een base64.tgzTelegram Desktop-profielarchief uit die env var en herstelt het voor het starten.--telegram-profile-dir <remote-path>beheert de externe Telegram Desktop-profieldirectory. De standaard is$HOME/.local/share/TelegramDesktop.--no-gateway-setupinstalleert en opent Telegram Desktop zonder OpenClaw te configureren.--credential-source convex --credential-role cigebruikt de gedeelde credentialbroker in plaats van directe Telegram-env-tokens.
Elk PR-publicerend scenario schrijft mantis-evidence.json naast het rapport.
Dit schema is de overdracht tussen scenariocode en GitHub-opmerkingen:
{ "schemaVersion": 1, "id": "discord-status-reactions", "title": "Mantis Discord Status Reactions QA", "summary": "Human-readable top summary for the PR comment.", "scenario": "discord-status-reactions-tool-only", "comparison": { "baseline": { "sha": "...", "status": "fail", "expected": "queued-only" }, "candidate": { "sha": "...", "status": "pass", "expected": "queued -> thinking -> done" }, "pass": true }, "artifacts": [ { "kind": "timeline", "lane": "baseline", "label": "Baseline queued-only", "path": "baseline/timeline.png", "targetPath": "baseline.png", "alt": "Baseline Discord timeline", "width": 420 } ]}Artifact-path-waarden zijn relatief ten opzichte van de manifestdirectory. targetPath-
waarden zijn relatieve paden onder de geconfigureerde Mantis R2/S3-artifactprefix. De
publisher weigert path traversal en slaat vermeldingen over die zijn gemarkeerd met
"required": false wanneer optionele previews of videos niet beschikbaar zijn.
Ondersteunde artifactsoorten:
timeline: deterministische scenarioscreenshot, meestal voor/na.desktopScreenshot: VNC-/browserdesktopscreenshot.motionPreview: inline geanimeerde GIF die is gegenereerd uit de desktopopname.motionClip: bewegingsgetrimde MP4 die statische aanloop en staart verwijdert.fullVideo: volledige MP4-opname voor diepgaande inspectie.metadata: JSON-/log-sidecar.report: Markdown-rapport.
De herbruikbare publisher is scripts/mantis/publish-pr-evidence.mjs. Workflows
roepen deze aan met het manifest, de doel-PR, de doelroot voor artifacts, commentaarmarker,
Actions-artifact-URL, run-URL en aanvraagbron. Deze uploadt gedeclareerde artifacts
naar de geconfigureerde Mantis R2/S3-bucket, bouwt een samenvatting-eerst PR-opmerking
met inline afbeeldingen/previews en gelinkte videos, en werkt daarna de bestaande
markeropmerking bij of maakt er een aan. De workflows publiceren naar
openclaw-crabbox-artifacts met publieke URLs onder https://artifacts.openclaw.ai.
Ze leveren bucket-, regio- en publieke URL-waarden rechtstreeks. De herbruikbare
publisher vereist:
MANTIS_ARTIFACT_R2_ACCESS_KEY_IDMANTIS_ARTIFACT_R2_SECRET_ACCESS_KEYMANTIS_ARTIFACT_R2_BUCKETMANTIS_ARTIFACT_R2_ENDPOINTMANTIS_ARTIFACT_R2_REGIONMANTIS_ARTIFACT_R2_PUBLIC_BASE_URL
Je kunt de status-reactions-run ook rechtstreeks vanuit een PR-opmerking activeren:
@openclaw-mantis discord status reactionsDe commentaartrigger is bewust smal. Deze draait alleen op pull request- opmerkingen van gebruikers met schrijf-, maintain- of beheerdersrechten, en herkent alleen Discord status-reaction-aanvragen. Standaard gebruikt deze de bekende slechte baseline-ref en de huidige PR head SHA als kandidaat. Maintainers kunnen beide refs overschrijven:
@openclaw-mantis discord status reactions baseline=origin/main candidate=HEADTelegram live QA kan ook vanuit een PR-opmerking worden geactiveerd:
@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,telegram-mentioned-message-replyStandaard gebruikt deze de huidige PR head SHA als kandidaat en draait
telegram-status-command. Maintainers kunnen candidate=...,
provider=aws|hetzner en lease=<cbx_...> overschrijven wanneer ze een specifieke
ref of een voorverwarmde Crabbox-desktop nodig hebben.
ClawSweeper-commandovoorbeelden:
@clawsweeper mantis discord discord-status-reactions-tool-only@clawsweeper verify e2e discordDe eerste opdracht is expliciet en scenariogericht. De tweede kan later een PR of issue koppelen aan aanbevolen Mantis-scenario's op basis van labels, gewijzigde bestanden en ClawSweeper-reviewbevindingen.
Runlevenscyclus
- Verkrijg referenties.
- Wijs een VM toe of hergebruik er een.
- Bereid het desktop-/browserprofiel voor wanneer het scenario UI-evidence nodig heeft.
- Bereid een schone checkout voor de baseline-ref voor.
- Installeer afhankelijkheden en bouw alleen wat het scenario nodig heeft.
- Start een onderliggende OpenClaw Gateway met een geïsoleerde statusdirectory.
- Configureer het live transport, de provider, het model en het browserprofiel.
- Draai het scenario en leg baseline-evidence vast.
- Stop de gateway en bewaar logs.
- Bereid de kandidaat-ref in dezelfde VM voor.
- Draai hetzelfde scenario en leg kandidaat-evidence vast.
- Vergelijk de oracle-resultaten en visuele evidence.
- Schrijf Markdown, JSON, logs, screenshots en optionele trace-artifacts.
- Upload GitHub Actions-artifacts.
- Plaats een beknopt PR- of Discord-statusbericht.
Het scenario moet op twee verschillende manieren kunnen falen:
- Bug gereproduceerd: baseline faalde op de verwachte manier.
- Harnessfout: omgevingsconfiguratie, referenties, Discord API, browser of provider faalde voordat de bug-oracle betekenisvol was.
Het eindrapport moet deze gevallen scheiden zodat maintainers een instabiele omgeving niet verwarren met productgedrag.
Discord MVP
Het eerste scenario moet gericht zijn op Discord-statusreacties in guild-kanalen
waar de bronantwoordbezorgmodus message_tool_only is.
Waarom dit een goede Mantis-start is:
- Het is zichtbaar in Discord als reacties op het triggerbericht.
- Het heeft een sterke REST-oracle via de reactiestatus van Discord-berichten.
- Het oefent een echte OpenClaw Gateway, Discord-botauthenticatie, berichtdispatch, bronantwoordbezorgmodus, statusreactiestatus en modelturn-levenscyclus.
- Het is smal genoeg om de eerste implementatie eerlijk te houden.
Verwachte scenariovorm:
id: discord-status-reactions-tool-onlytransport: discordbaseline: expect: reproduced: truecandidate: expect: fixed: trueconfig: messages: ackReaction: "👀" ackReactionScope: "group-mentions" groupChat: visibleReplies: "message_tool" statusReactions: enabled: true timing: debounceMs: 0discord: requireMention: true notifyChannel: operator-notifyevidence: rest: messageReactions: true browser: screenshotMessageRow: trueBaseline-evidence moet de queued-bevestigingsreactie tonen, maar geen
levenscyclustransitie in tool-only-modus. Kandidaat-evidence moet levenscyclus-
statusreacties tonen wanneer messages.statusReactions.enabled expliciet
true is.
De uitvoerbare eerste slice is het opt-in Discord live QA-scenario:
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-candidateHet configureert de SUT met altijd-aan guild-afhandeling, visibleReplies: "message_tool", ackReaction: "👀" en expliciete statusreacties. De oracle
pollt het echte Discord-triggerbericht en verwacht de waargenomen reeks
👀 -> 🤔 -> 👍. Artifacts omvatten discord-qa-reaction-timelines.json,
discord-status-reactions-tool-only-timeline.html en
discord-status-reactions-tool-only-timeline.png.
Bestaande QA-onderdelen
Mantis moet voortbouwen op de bestaande private QA-stack in plaats van vanaf nul te beginnen:
pnpm openclaw qa discorddraait al een live Discord-lane met driver- en SUT-bots.- De live transportrunner schrijft al rapporten, QA-evidence en
transportspecifieke artifacts onder
.artifacts/qa-e2e/. - Convex-credentialleases bieden al exclusieve toegang tot gedeelde live transportreferenties.
- De browserbeheerservice ondersteunt al screenshots, snapshots, headless beheerde profielen en externe CDP-profielen.
- QA Lab heeft al een debugger-UI en bus voor transportvormige tests.
De eerste Mantis-implementatie kan een dunne voor/na-runner over deze onderdelen zijn, plus één visuele evidence-laag.
Evidencemodel
Elke run schrijft een stabiele artifactdirectory:
.artifacts/qa-e2e/mantis/<run-id>/ mantis-report.md mantis-summary.json baseline/ summary.json discord-message.json screenshot-message-row.png gateway-debug/ candidate/ summary.json discord-message.json screenshot-message-row.png gateway-debug/ comparison.json run.logmantis-summary.json moet de machineleesbare bron van waarheid zijn. Het
Markdown-rapport is voor PR-opmerkingen en menselijke beoordeling.
De samenvatting moet bevatten:
- geteste refs en SHA's
- transport en scenario-id
- machineprovider en machine-id of lease-id
- referentiebron zonder geheime waarden
- basislijnresultaat
- kandidaatresultaat
- of de bug op de basislijn is gereproduceerd
- of de kandidaat deze heeft opgelost
- artefactpaden
- opgeschoonde installatie- of opruimingsproblemen
Schermafbeeldingen zijn bewijs, geen geheimen. Ze vereisen nog steeds redactiediscipline: privékanaalnamen, gebruikersnamen of berichtinhoud kunnen verschijnen. Voor openbare PR's hebben GitHub Actions-artefactlinks de voorkeur boven inline-afbeeldingen totdat het redactieverhaal sterker is.
Browser en VNC
De browserlane heeft twee modi:
- Headless automatisering: standaard voor CI. Chrome draait met CDP ingeschakeld, en Playwright of OpenClaw-browserbesturing legt schermafbeeldingen vast.
- VNC-redding: ingeschakeld op dezelfde VM wanneer login, MFA, Discord-anti-automatisering of visuele debugging een mens nodig heeft.
Het browserprofiel van de Discord-observer moet persistent genoeg zijn om niet voor elke run te hoeven inloggen, maar geïsoleerd zijn van persoonlijke browserstatus. Een profiel hoort bij de Mantis-machinepool, niet bij een laptop van een ontwikkelaar.
Wanneer Mantis vastloopt, plaatst het een Discord-statusbericht met:
- run-id
- scenario-id
- machineprovider
- artefactmap
- VNC- of noVNC-verbindingsinstructies indien beschikbaar
- korte blokkadetekst
De eerste private deployment kan deze berichten in het bestaande operatorkanaal plaatsen en later naar een dedicated Mantis-kanaal verplaatsen.
Machines
Mantis moet voor de eerste externe implementatie AWS via Crabbox verkiezen. Crabbox geeft ons voorverwarmde machines, lease-tracking, hydratie, logs, resultaten en opruiming. Als AWS-capaciteit te traag of niet beschikbaar is, voeg dan een Hetzner-provider toe achter dezelfde machine-interface.
Minimale VM-vereisten:
- Linux met een desktopgeschikte Chrome- of Chromium-installatie
- CDP-toegang voor browserautomatisering
- VNC of noVNC voor redding
- Node 22 en pnpm
- OpenClaw-checkout en dependencycache
- Playwright Chromium-browsercache wanneer Playwright wordt gebruikt
- genoeg CPU en geheugen voor één OpenClaw Gateway, één browser en één modelrun
- uitgaande toegang tot Discord, GitHub, modelproviders en de referentiebroker
De VM mag geen langlevende ruwe geheimen bewaren buiten de verwachte referentie- of browserprofielstores.
Geheimen
Geheimen leven in GitHub-organisatie- of repositorygeheimen voor externe runs, en in een lokaal, door de operator beheerd geheimenbestand voor lokale runs.
Aanbevolen geheimnamen:
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=1voor openbare GitHub-artefactuploadsOPENCLAW_QA_CONVEX_SITE_URLOPENCLAW_QA_CONVEX_SECRET_CIOPENCLAW_QA_MANTIS_CRABBOX_COORDINATOROPENCLAW_QA_MANTIS_CRABBOX_COORDINATOR_TOKEN
Op lange termijn moet de Convex-referentiepool de normale bron blijven voor
live transportreferenties. GitHub-geheimen bootstrappen de broker en
fallbacklanes. De Discord-statusreacties-workflow koppelt de Mantis
Crabbox-geheimen terug aan de omgevingsvariabelen CRABBOX_COORDINATOR en
CRABBOX_COORDINATOR_TOKEN die de Crabbox CLI verwacht. De gewone
GitHub-geheimnamen CRABBOX_* blijven geaccepteerd als
compatibiliteitsfallback.
De Mantis-runner mag nooit afdrukken:
- Discord-bottokens
- provider-API-sleutels
- browsercookies
- inhoud van auth-profielen
- VNC-wachtwoorden
- ruwe referentiepayloads
Openbare artefactuploads moeten ook Discord-doelmetadata zoals bot-, guild-,
kanaal- en bericht-id's redigeren. De GitHub-smokeworkflow schakelt om deze
reden OPENCLAW_QA_REDACT_PUBLIC_METADATA=1 in.
Als een token per ongeluk in een issue, PR, chat of log wordt geplakt, roteer het nadat het nieuwe geheim is opgeslagen.
GitHub-artefacten en PR-opmerkingen
Mantis-workflows moeten de volledige bewijsbundel uploaden als een kortlevend Actions-artefact. Wanneer de workflow wordt uitgevoerd voor een bugrapport of fix-PR, moet deze ook geredigeerde inline-media publiceren naar de geconfigureerde Mantis R2/S3-bucket en een opmerking op die bug of fix-PR upserten met inline voor/na-schermafbeeldingen. Plaats het primaire bewijs niet alleen op een generieke QA-automatiserings-PR. Ruwe logs, waargenomen berichten en ander omvangrijk bewijs blijven in het Actions-artefact.
Productieworkflows moeten die opmerkingen plaatsen met de Mantis GitHub App, niet
met github-actions[bot]. Sla de app-id en privésleutel op als
GitHub Actions-geheimen MANTIS_GITHUB_APP_ID en
MANTIS_GITHUB_APP_PRIVATE_KEY. De workflow gebruikt een verborgen marker als
upsert-sleutel, werkt die opmerking bij wanneer het token deze kan bewerken, en
maakt een nieuwe door Mantis beheerde opmerking wanneer een oudere, door een bot
beheerde marker niet kan worden bewerkt.
De PR-opmerking moet kort en visueel zijn:
Mantis Discord Status Reactions QA Summary: Mantis reran the reported Discord status-reaction bug against the knownbad baseline and the candidate fix. The baseline reproduced the bug, while thecandidate showed the expected queued -> thinking -> done sequence. - Scenario: `discord-status-reactions-tool-only`- Run: <workflow run link>- Artifact: <artifact link>- Baseline: `<status>` at `<sha>`- Candidate: `<status>` at `<sha>` | Baseline | Candidate || ------------------- | ------------------- || <inline screenshot> | <inline screenshot> |Wanneer de run mislukt omdat de harness is mislukt, moet de opmerking dat zeggen in plaats van te impliceren dat de kandidaat is mislukt.
Notities voor private deployment
Een private deployment heeft mogelijk al een Mantis Discord-applicatie. Hergebruik die applicatie in plaats van een andere app te maken wanneer deze de juiste botmachtigingen heeft en veilig kan worden geroteerd.
Stel het eerste operatornotificatiekanaal in via geheimen of deploymentconfiguratie. Het kan eerst naar een bestaand maintainer- of operations-kanaal wijzen en daarna naar een dedicated Mantis-kanaal verhuizen zodra dat bestaat.
Plaats geen guild-id's, kanaal-id's, bottokens, browsercookies of VNC-wachtwoorden in dit document. Sla ze op in GitHub-geheimen, de referentiebroker of de lokale geheimenstore van de operator.
Een scenario toevoegen
Een Mantis-scenario moet declareren:
- id en titel
- transport
- vereiste referenties
- beleid voor basislijn-ref
- beleid voor kandidaat-ref
- OpenClaw-configpatch
- installatiestappen
- stimulus
- verwachte basislijn-orakel
- verwachte kandidaat-orakel
- doelen voor visuele vastlegging
- time-outbudget
- opruimingsstappen
Scenario's moeten kleine, getypeerde orakels verkiezen:
- Discord-reactiestatus voor reactiebugs
- Discord-berichtreferenties voor threadbugs
- Slack-thread-ts en reactie-API-status voor Slack-bugs
- e-mailbericht-id's en headers voor e-mailbugs
- browserschermafbeeldingen wanneer UI het enige betrouwbare waarneembare is
Vision-controles moeten aanvullend zijn. Als een platform-API de bug kan bewijzen, gebruik de API dan als pass/fail-orakel en bewaar schermafbeeldingen voor menselijk vertrouwen.
Provideruitbreiding
Na Discord kan dezelfde runner toevoegen:
- Slack: reacties, threads, app-vermeldingen, modals, bestandsuploads.
- E-mail: Gmail-auth en berichtthreading met
gogwaar connectors niet genoeg zijn. - WhatsApp: QR-login, heridentificatie, berichtbezorging, media, reacties.
- Telegram: gating voor groepsvermeldingen, opdrachten, reacties waar beschikbaar.
- Matrix: versleutelde rooms, thread- of reply-relaties, hervatten na herstart.
Elk transport moet één goedkope smoke-scenario en één of meer bugklasse-scenario's hebben. Dure visuele scenario's moeten opt-in blijven.
Open vragen
- Welke Discord-bot moet de driver zijn, en welke de SUT, wanneer de bestaande Mantis-bot wordt hergebruikt?
- Moet de observer-browserlogin een menselijk Discord-account, een testaccount of alleen door bots leesbaar REST-bewijs gebruiken voor de eerste fase?
- Hoe lang moet GitHub Mantis-artefacten voor PR's bewaren?
- Wanneer moet ClawSweeper automatisch Mantis aanbevelen in plaats van te wachten op een maintaineropdracht?
- Moeten schermafbeeldingen worden geredigeerd of bijgesneden vóór upload voor openbare PR's?