extensions/qa-channel: synthetischer Nachrichtenkanal mit Oberflächen für DM, Kanal, Thread, Reaktion, Bearbeiten und Löschen.extensions/qa-lab: Debugger-UI und QA-Bus zum Beobachten des Transkripts, Einspeisen eingehender Nachrichten und Exportieren eines Markdown-Berichts.qa/: repository-gestützte Seed-Assets für die Startaufgabe und grundlegende QA- Szenarien.
- Links: Gateway-Dashboard (Control UI) mit dem Agenten.
- Rechts: QA Lab, das das Slack-ähnliche Transkript und den Szenarioplan anzeigt.
qa:lab:up:fast hält die Docker-Dienste auf einem vorgebauten Image und bind-mountet
extensions/qa-lab/web/dist in den Container qa-lab. qa:lab:watch
baut dieses Bundle bei Änderungen neu, und der Browser lädt automatisch neu, wenn sich der QA-Lab-
Asset-Hash ändert.
Für eine transportechte Matrix-Smoke-Lane führen Sie aus:
qa-channel in der Child-Konfiguration läuft. Sie schreibt die Artefakte des strukturierten Berichts und
ein kombiniertes stdout/stderr-Log in das ausgewählte Matrix-QA-Ausgabeverzeichnis. Um auch die äußere
Build-/Launcher-Ausgabe von scripts/run-node.mjs zu erfassen, setzen Sie
OPENCLAW_RUN_NODE_OUTPUT_LOG=<path> auf eine repository-lokale Logdatei.
Für eine transportechte Telegram-Smoke-Lane führen Sie aus:
OPENCLAW_QA_TELEGRAM_GROUP_ID,
OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN und
OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN sowie zwei unterschiedliche Bots in derselben
privaten Gruppe. Der SUT-Bot muss einen Telegram-Benutzernamen haben, und die Beobachtung von Bot zu Bot funktioniert am besten, wenn bei beiden Bots der Bot-to-Bot Communication Mode
in @BotFather aktiviert ist.
Der Befehl endet mit einem Nicht-Null-Code, wenn ein Szenario fehlschlägt. Verwenden Sie --allow-failures, wenn
Sie Artefakte ohne fehlschlagenden Exit-Code möchten.
Der Telegram-Bericht und die Zusammenfassung enthalten RTT pro Antwort von der Sendeanfrage der Driver-
Nachricht bis zur beobachteten Antwort des SUT, beginnend mit dem Canary.
Für eine transportechte Discord-Smoke-Lane führen Sie aus:
OPENCLAW_QA_DISCORD_GUILD_ID, OPENCLAW_QA_DISCORD_CHANNEL_ID,
OPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN, OPENCLAW_QA_DISCORD_SUT_BOT_TOKEN
und OPENCLAW_QA_DISCORD_SUT_APPLICATION_ID, wenn Umgebungsanmeldedaten verwendet werden.
Die Lane prüft das Verhalten bei Kanalerwähnungen und kontrolliert, dass der SUT-Bot
den nativen Befehl /help bei Discord registriert hat.
Der Befehl endet mit einem Nicht-Null-Code, wenn ein Szenario fehlschlägt. Verwenden Sie --allow-failures, wenn
Sie Artefakte ohne fehlschlagenden Exit-Code möchten.
Live-Transport-Lanes teilen jetzt einen kleineren gemeinsamen Vertrag, statt jeweils
ihre eigene Form für Szenariolisten zu erfinden:
qa-channel bleibt die breite synthetische Suite für Produktverhalten und ist nicht Teil
der Live-Transport-Abdeckungsmatrix.
| Lane | Canary | Erwähnungs-Gating | Allowlist-Block | Antwort auf oberster Ebene | Neustart-Fortsetzung | Thread-Follow-up | Thread-Isolation | Reaktionsbeobachtung | Help-Befehl | Registrierung nativer Befehle |
|---|---|---|---|---|---|---|---|---|---|---|
| Matrix | x | x | x | x | x | x | x | x | ||
| Telegram | x | x | x | |||||||
| Discord | x | x | x |
qa-channel die breite Suite für Produktverhalten, während Matrix,
Telegram und künftige Live-Transporte eine gemeinsame explizite Transport-Vertrags-
Checkliste teilen.
Für eine Lane auf einer wegwerfbaren Linux-VM, ohne Docker in den QA-Pfad einzubringen, führen Sie aus:
qa suite aus und kopiert dann den normalen QA-Bericht und die
Zusammenfassung zurück nach .artifacts/qa-e2e/... auf dem Host.
Es verwendet dasselbe Verhalten bei der Szenarioauswahl wie qa suite auf dem Host.
Host- und Multipass-Suite-Läufe führen standardmäßig mehrere ausgewählte Szenarien parallel
mit isolierten Gateway-Workern aus. qa-channel verwendet standardmäßig Parallelität 4,
begrenzt durch die Anzahl der ausgewählten Szenarien. Verwenden Sie --concurrency <count>, um die
Anzahl der Worker anzupassen, oder --concurrency 1 für serielle Ausführung.
Der Befehl endet mit einem Nicht-Null-Code, wenn ein Szenario fehlschlägt. Verwenden Sie --allow-failures, wenn
Sie Artefakte ohne fehlschlagenden Exit-Code möchten.
Live-Läufe leiten die unterstützten QA-Auth-Eingaben weiter, die für den
Gast praktikabel sind: env-basierte Provider-Schlüssel, den Konfigurationspfad des QA-Live-Providers und
CODEX_HOME, sofern vorhanden. Halten Sie --output-dir unter dem Repository-Root, damit der Gast
über den gemounteten Workspace zurückschreiben kann.
Repository-gestützte Seeds
Seed-Assets liegen inqa/:
qa/scenarios/index.mdqa/scenarios/<theme>/*.md
qa-lab sollte ein generischer Markdown-Runner bleiben. Jede Markdown-Szenariodatei ist
die Quelle der Wahrheit für einen einzelnen Testlauf und sollte Folgendes definieren:
- Szenario-Metadaten
- optionale Metadaten zu Kategorie, Fähigkeit, Lane und Risiko
- Dokumentations- und Code-Referenzen
- optionale Plugin-Anforderungen
- optionalen Gateway-Konfigurations-Patch
- den ausführbaren
qa-flow
qa-flow unterstützt, darf generisch
und querschnittlich bleiben. Markdown-Szenarien können zum Beispiel Transport-seitige
Hilfen mit Browser-seitigen Hilfen kombinieren, die die eingebettete Control UI über die
Schnittstelle browser.request des Gateway steuern, ohne einen Spezialfall-Runner hinzuzufügen.
Szenariodateien sollten nach Produktfähigkeit statt nach Quellbaum-Ordner gruppiert werden.
Halten Sie Szenario-IDs stabil, wenn Dateien verschoben werden; verwenden Sie docsRefs und codeRefs
für die Nachverfolgbarkeit der Implementierung.
Die Baseline-Liste sollte breit genug bleiben, um Folgendes abzudecken:
- DM- und Kanal-Chat
- Thread-Verhalten
- Lebenszyklus von Nachrichtenaktionen
- Cron-Callbacks
- Memory-Recall
- Modellwechsel
- Subagent-Handoff
- Lesen von Repository und Dokumentation
- eine kleine Build-Aufgabe wie Lobster Invaders
Provider-Mock-Lanes
qa suite hat zwei lokale Provider-Mock-Lanes:
mock-openaiist der szenariobewusste OpenClaw-Mock. Er bleibt die standardmäßige deterministische Mock-Lane für repository-gestützte QA und Paritäts-Gates.aimockstartet einen AIMock-gestützten Provider-Server für experimentelle Protokoll-, Fixture-, Record/Replay- und Chaos-Abdeckung. Er ist additiv und ersetzt nicht den Szenario-Dispatcher vonmock-openai.
extensions/qa-lab/src/providers/.
Jeder Provider besitzt seine Standardwerte, den lokalen Serverstart, die Gateway-Modellkonfiguration,
den Bedarf an Auth-Profil-Staging sowie Live-/Mock-Fähigkeits-Flags. Gemeinsamer Suite- und
Gateway-Code sollte über die Provider-Registry routen, statt nach Providernamen zu verzweigen.
Transport-Adapter
qa-lab besitzt eine generische Transport-Schnittstelle für Markdown-QA-Szenarien.
qa-channel ist der erste Adapter auf dieser Schnittstelle, aber das Designziel ist breiter:
künftige echte oder synthetische Kanäle sollen in denselben Suite-Runner eingesteckt werden,
statt einen transportspezifischen QA-Runner hinzuzufügen.
Auf Architekturebene ist die Aufteilung:
qa-labbesitzt generische Szenarioausführung, Worker-Parallelität, Artefaktschreiben und Berichterstellung.- der Transport-Adapter besitzt Gateway-Konfiguration, Bereitschaft, Beobachtung von Ein- und Ausgang, Transportaktionen und normalisierten Transportstatus.
- Markdown-Szenariodateien unter
qa/scenarios/definieren den Testlauf;qa-labstellt die wiederverwendbare Laufzeitoberfläche bereit, die sie ausführt.
Berichterstellung
qa-lab exportiert einen Markdown-Protokollbericht aus der beobachteten Bus-Zeitleiste.
Der Bericht sollte beantworten:
- Was hat funktioniert
- Was ist fehlgeschlagen
- Was blieb blockiert
- Welche Folge-Szenarien sollten ergänzt werden
SOUL.md setzen und dann gewöhnliche Benutzer-Turns
wie Chat, Workspace-Hilfe und kleine Datei-Aufgaben ausführen. Dem Kandidatenmodell
sollte nicht gesagt werden, dass es bewertet wird. Der Befehl bewahrt jedes vollständige
Transkript, zeichnet grundlegende Laufstatistiken auf und bittet dann die Judge-Modelle im schnellen Modus mit
xhigh-Reasoning, wo unterstützt, darum, die Läufe nach Natürlichkeit, Vibe und Humor zu ranken.
Verwenden Sie --blind-judge-models, wenn Sie Provider vergleichen: Der Judge-Prompt erhält weiterhin
jedes Transkript und den Laufstatus, aber Kandidaten-Refs werden durch neutrale Labels wie
candidate-01 ersetzt; der Bericht ordnet die Rankings nach dem Parsen wieder den echten Refs zu.
Kandidatenläufe verwenden standardmäßig high Thinking, mit medium für GPT-5.4 und xhigh
für ältere OpenAI-Eval-Refs, die dies unterstützen. Überschreiben Sie einen bestimmten Kandidaten inline mit
--model provider/model,thinking=<level>. --thinking <level> setzt weiterhin einen
globalen Fallback, und die ältere Form --model-thinking <provider/model=level> bleibt aus
Kompatibilitätsgründen erhalten.
OpenAI-Kandidaten-Refs verwenden standardmäßig den schnellen Modus, damit Prioritätsverarbeitung genutzt wird, wo
der Provider dies unterstützt. Fügen Sie ,fast, ,no-fast oder ,fast=false inline hinzu, wenn ein
einzelner Kandidat oder Judge eine Überschreibung benötigt. Übergeben Sie --fast nur, wenn Sie den schnellen Modus
für jedes Kandidatenmodell erzwingen möchten. Kandidaten- und Judge-Dauern werden zur Benchmark-
Analyse im Bericht aufgezeichnet, aber in Judge-Prompts wird ausdrücklich gesagt, nicht nach Geschwindigkeit zu ranken.
Kandidaten- und Judge-Modelläufe verwenden beide standardmäßig eine Parallelität von 16. Reduzieren Sie
--concurrency oder --judge-concurrency, wenn Provider-Limits oder Druck auf das lokale Gateway
einen Lauf zu unruhig machen.
Wenn kein Kandidat mit --model übergeben wird, verwendet Character Eval standardmäßig
openai/gpt-5.4, openai/gpt-5.2, openai/gpt-5, anthropic/claude-opus-4-6,
anthropic/claude-sonnet-4-6, zai/glm-5.1,
moonshot/kimi-k2.5 und
google/gemini-3.1-pro-preview, wenn kein --model übergeben wird.
Wenn kein --judge-model übergeben wird, verwenden die Judges standardmäßig
openai/gpt-5.4,thinking=xhigh,fast und
anthropic/claude-opus-4-6,thinking=high.