Testing
Testen
OpenClaw verfügt über drei Vitest-Suites (Unit/Integration, E2E, Live) und eine kleine Reihe von Docker-Runnern. Dieses Dokument ist ein Leitfaden dazu, „wie wir testen“:
- Was jede Suite abdeckt (und was sie bewusst nicht abdeckt).
- Welche Befehle Sie für gängige Workflows ausführen (lokal, vor dem Push, Debugging).
- Wie Live-Tests Zugangsdaten erkennen und Modelle/Provider auswählen.
- Wie Sie Regressionen für reale Modell-/Provider-Probleme hinzufügen.
Schnellstart
An den meisten Tagen:
- Vollständiges Gate (vor dem Push erwartet):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Schnellerer lokaler Full-Suite-Lauf auf einer großzügig ausgestatteten Maschine:
pnpm test:max - Direkte Vitest-Watch-Schleife:
pnpm test:watch - Direktes Datei-Targeting routet jetzt auch Extension-/Channel-Pfade:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Bevorzugen Sie zuerst gezielte Läufe, wenn Sie an einem einzelnen Fehler iterieren.
- Docker-gestützte QA-Site:
pnpm qa:lab:up - Linux-VM-gestützte QA-Lane:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
Wenn Sie Tests berühren oder zusätzliche Sicherheit möchten:
- Coverage-Gate:
pnpm test:coverage - E2E-Suite:
pnpm test:e2e
Beim Debugging realer Provider/Modelle (erfordert echte Zugangsdaten):
- Live-Suite (Modelle + Gateway-Tool-/Bild-Probes):
pnpm test:live - Eine Live-Datei leise ansteuern:
pnpm test:live -- src/agents/models.profiles.live.test.ts - Laufzeit-Performance-Berichte: dispatchen Sie
OpenClaw Performancemitlive_gpt54=truefür einen echtenopenai/gpt-5.4-Agent-Turn oderdeep_profile=truefür Kova-CPU-/Heap-/Trace-Artefakte. Täglich geplante Läufe veröffentlichen Mock-Provider-, Deep-Profile- und GPT-5.4-Lane-Artefakte nachopenclaw/clawgrit-reports, wennCLAWGRIT_REPORTS_TOKENkonfiguriert ist. Der Mock-Provider-Bericht enthält außerdem Zahlen zu Source-Level-Gateway-Boot, Speicher, Plugin-Pressure, wiederholter Fake-Model-Hello-Schleife und CLI-Start. - Docker-Live-Modell-Sweep:
pnpm test:docker:live-models- Jedes ausgewählte Modell führt jetzt einen Text-Turn plus eine kleine Probe im Stil eines Datei-Lesevorgangs aus.
Modelle, deren Metadaten
image-Eingabe ausweisen, führen außerdem einen winzigen Bild-Turn aus. Deaktivieren Sie die zusätzlichen Probes mitOPENCLAW_LIVE_MODEL_FILE_PROBE=0oderOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0, wenn Sie Provider-Fehler isolieren. - CI-Coverage: Die täglichen
OpenClaw Scheduled Live And E2E Checksund die manuellenOpenClaw Release Checksrufen beide den wiederverwendbaren Live-/E2E-Workflow mitinclude_live_suites: trueauf, der separate Docker-Live-Modell-Matrix-Jobs enthält, nach Provider geshardet. - Für fokussierte CI-Reruns dispatchen Sie
OpenClaw Live And E2E Checks (Reusable)mitinclude_live_suites: trueundlive_models_only: true. - Fügen Sie neue signalstarke Provider-Secrets zu
scripts/ci-hydrate-live-auth.shsowie.github/workflows/openclaw-live-and-e2e-checks-reusable.ymlund dessen geplanten/Release-Callern hinzu.
- Jedes ausgewählte Modell führt jetzt einen Text-Turn plus eine kleine Probe im Stil eines Datei-Lesevorgangs aus.
Modelle, deren Metadaten
- Native Codex Bound-Chat-Smoke:
pnpm test:docker:live-codex-bind- Führt eine Docker-Live-Lane gegen den Codex-App-Server-Pfad aus, bindet eine synthetische
Slack-DM mit
/codex bind, übt/codex fastund/codex permissionsaus und verifiziert dann, dass eine einfache Antwort und eine Bildanlage über das native Plugin-Binding statt über ACP geroutet werden.
- Führt eine Docker-Live-Lane gegen den Codex-App-Server-Pfad aus, bindet eine synthetische
Slack-DM mit
- Codex-App-Server-Harness-Smoke:
pnpm test:docker:live-codex-harness- Führt Gateway-Agent-Turns durch das Plugin-eigene Codex-App-Server-Harness aus,
verifiziert
/codex statusund/codex modelsund übt standardmäßig Bild-, Cron-MCP-, Sub-Agent- und Guardian-Probes aus. Deaktivieren Sie die Sub-Agent-Probe mitOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0, wenn Sie andere Codex-App-Server-Fehler isolieren. Für eine fokussierte Sub-Agent-Prüfung deaktivieren Sie die anderen Probes:OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness. Dies beendet nach der Sub-Agent-Probe, sofernOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0nicht gesetzt ist.
- Führt Gateway-Agent-Turns durch das Plugin-eigene Codex-App-Server-Harness aus,
verifiziert
- Crestodian-Rescue-Command-Smoke:
pnpm test:live:crestodian-rescue-channel- Opt-in-Prüfung mit doppelter Absicherung für die Message-Channel-Rescue-Command-Oberfläche.
Sie übt
/crestodian statusaus, stellt eine persistente Modelländerung in die Warteschlange, antwortet mit/crestodian yesund verifiziert den Audit-/Config-Schreibpfad.
- Opt-in-Prüfung mit doppelter Absicherung für die Message-Channel-Rescue-Command-Oberfläche.
Sie übt
- Crestodian-Planner-Docker-Smoke:
pnpm test:docker:crestodian-planner- Führt Crestodian in einem configlosen Container mit einer Fake-Claude-CLI auf
PATHaus und verifiziert, dass der Fuzzy-Planner-Fallback in einen auditierten typisierten Config-Schreibvorgang übersetzt wird.
- Führt Crestodian in einem configlosen Container mit einer Fake-Claude-CLI auf
- Crestodian-First-Run-Docker-Smoke:
pnpm test:docker:crestodian-first-run- Startet aus einem leeren OpenClaw-State-Verzeichnis, routet bloßes
openclawan Crestodian, wendet Setup-/Modell-/Agent-/Discord-Plugin- und SecretRef-Schreibvorgänge an, validiert die Config und verifiziert Audit-Einträge. Derselbe Ring-0-Setup-Pfad wird außerdem in QA Lab durchpnpm openclaw qa suite --scenario crestodian-ring-zero-setupabgedeckt.
- Startet aus einem leeren OpenClaw-State-Verzeichnis, routet bloßes
- Moonshot-/Kimi-Kosten-Smoke: Führen Sie bei gesetztem
MOONSHOT_API_KEYopenclaw models list --provider moonshot --jsonaus und danach einen isoliertenopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsongegenmoonshot/kimi-k2.6. Verifizieren Sie, dass das JSON Moonshot/K2.6 meldet und das Assistant-Transkript normalisierteusage.costspeichert.
QA-spezifische Runner
Diese Befehle stehen neben den Haupt-Testsuites, wenn Sie QA-Lab-Realismus benötigen:
CI führt QA Lab in dedizierten Workflows aus. Agentic Parity ist unter
QA-Lab - All Lanes und Release-Validierung verschachtelt, kein eigenständiger PR-Workflow.
Breite Validierung sollte Full Release Validation mit
rerun_group=qa-parity oder die QA-Gruppe der Release-Checks verwenden. Stabile/standardmäßige Release-
Checks halten exhaustive Live-/Docker-Soak hinter run_release_soak=true; das
full-Profil erzwingt Soak. QA-Lab - All Lanes
läuft nächtlich auf main und per manuellem Dispatch mit der Mock-Parity-Lane, Live-
Matrix-Lane, Convex-verwalteten Live-Telegram-Lane und Convex-verwalteten Live-Discord-
Lane als parallelen Jobs. Geplante QA- und Release-Checks übergeben Matrix
explizit --profile fast, während die Standardwerte der Matrix-CLI und der manuellen Workflow-Eingabe
all bleiben; manueller Dispatch kann all in transport,
media, e2ee-smoke, e2ee-deep und e2ee-cli-Jobs sharden. OpenClaw Release Checks führt vor der Release-Freigabe Parity plus die schnellen Matrix- und Telegram-Lanes aus
und verwendet mock-openai/gpt-5.5 für Release-Transport-Checks, damit sie
deterministisch bleiben und den normalen Start des Provider-Plugins vermeiden. Diese Live-Transport-
Gateways deaktivieren Memory-Suche; Memory-Verhalten bleibt durch die QA-Parity-
Suites abgedeckt.
Full-Release-Live-Media-Shards verwenden
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, das bereits
ffmpeg und ffprobe enthält. Docker-Live-Modell-/Backend-Shards verwenden das gemeinsam genutzte
ghcr.io/openclaw/openclaw-live-test:<sha>-Image, das einmal pro ausgewähltem
Commit gebaut wird, und ziehen es dann mit OPENCLAW_SKIP_DOCKER_BUILD=1, statt es
in jedem Shard neu zu bauen.
pnpm openclaw qa suite- Führt repo-gestützte QA-Szenarien direkt auf dem Host aus.
- Führt mehrere ausgewählte Szenarien standardmäßig parallel mit isolierten
Gateway-Workern aus.
qa-channelverwendet standardmäßig Parallelität 4 (begrenzt durch die Anzahl der ausgewählten Szenarien). Verwenden Sie--concurrency <count>, um die Worker-Anzahl anzupassen, oder--concurrency 1für die ältere serielle Lane. - Beendet mit einem Nicht-Null-Code, wenn ein Szenario fehlschlägt. Verwenden
Sie
--allow-failures, wenn Sie Artefakte ohne fehlschlagenden Exit-Code wünschen. - Unterstützt die Provider-Modi
live-frontier,mock-openaiundaimock.aimockstartet einen lokalen AIMock-gestützten Provider-Server für experimentelle Fixture- und Protokoll-Mock-Abdeckung, ohne die szenariofähigemock-openai-Lane zu ersetzen.
pnpm test:plugins:kitchen-sink-live- Führt den Live-OpenAI-Kitchen-Sink-Plugin-Parcours über QA Lab aus. Er
installiert das externe Kitchen-Sink-Paket, verifiziert das Inventar der
Plugin-SDK-Oberfläche, prüft
/healthzund/readyz, zeichnet Gateway-CPU/RSS-Nachweise auf, führt einen Live-OpenAI-Turn aus und prüft adversariale Diagnosen. Erfordert Live-OpenAI-Authentifizierung wieOPENAI_API_KEY. In hydratisierten Testbox-Sitzungen wird automatisch das Testbox-Live-Auth-Profil bezogen, wenn der Helperopenclaw-testbox-envvorhanden ist.
- Führt den Live-OpenAI-Kitchen-Sink-Plugin-Parcours über QA Lab aus. Er
installiert das externe Kitchen-Sink-Paket, verifiziert das Inventar der
Plugin-SDK-Oberfläche, prüft
pnpm test:gateway:cpu-scenarios- Führt den Gateway-Startup-Benchmark sowie ein kleines Mock-QA-Lab-Szenariopaket
(
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) aus und schreibt eine kombinierte CPU-Beobachtungszusammenfassung unter.artifacts/gateway-cpu-scenarios/. - Markiert standardmäßig nur anhaltend hohe CPU-Beobachtungen (
--cpu-core-warnplus--hot-wall-warn-ms), sodass kurze Startup-Spitzen als Metriken aufgezeichnet werden, ohne wie die minutenlange Gateway-Peg-Regression zu wirken. - Verwendet gebaute
dist-Artefakte; führen Sie zuerst einen Build aus, wenn der Checkout noch keine frische Laufzeitausgabe enthält.
- Führt den Gateway-Startup-Benchmark sowie ein kleines Mock-QA-Lab-Szenariopaket
(
pnpm openclaw qa suite --runner multipass- Führt dieselbe QA-Suite in einer kurzlebigen Multipass-Linux-VM aus.
- Behält dasselbe Szenarioauswahlverhalten wie
qa suiteauf dem Host bei. - Verwendet dieselben Provider-/Modellauswahl-Flags wie
qa suite. - Live-Läufe leiten die unterstützten QA-Auth-Eingaben weiter, die für den Gast
praktikabel sind: env-basierte Provider-Schlüssel, den Pfad zur
QA-Live-Provider-Konfiguration und
CODEX_HOME, wenn vorhanden. - Ausgabeverzeichnisse müssen unter dem Repo-Root bleiben, damit der Gast über den gemounteten Workspace zurückschreiben kann.
- Schreibt den normalen QA-Bericht und die Zusammenfassung plus Multipass-Logs
unter
.artifacts/qa-e2e/....
pnpm qa:lab:up- Startet die Docker-gestützte QA-Site für operatorähnliche QA-Arbeit.
pnpm test:docker:npm-onboard-channel-agent- Baut aus dem aktuellen Checkout einen npm-Tarball, installiert ihn global in Docker, führt nichtinteraktives Onboarding mit OpenAI-API-Schlüssel aus, konfiguriert standardmäßig Telegram, verifiziert, dass die paketierte Plugin-Laufzeit ohne Startup-Abhängigkeitsreparatur geladen wird, führt doctor aus und führt einen lokalen Agent-Turn gegen einen gemockten OpenAI-Endpunkt aus.
- Verwenden Sie
OPENCLAW_NPM_ONBOARD_CHANNEL=discord, um dieselbe Packaged-Install-Lane mit Discord auszuführen.
pnpm test:docker:session-runtime-context- Führt einen deterministischen Built-App-Docker-Smoke für eingebettete
Laufzeitkontext-Transkripte aus. Er verifiziert, dass versteckter
OpenClaw-Laufzeitkontext als nicht angezeigte benutzerdefinierte Nachricht
persistiert wird, statt in den sichtbaren Benutzer-Turn zu gelangen, legt
anschließend eine betroffene defekte Sitzungs-JSONL an und verifiziert, dass
openclaw doctor --fixsie mit Backup auf den aktiven Branch umschreibt.
- Führt einen deterministischen Built-App-Docker-Smoke für eingebettete
Laufzeitkontext-Transkripte aus. Er verifiziert, dass versteckter
OpenClaw-Laufzeitkontext als nicht angezeigte benutzerdefinierte Nachricht
persistiert wird, statt in den sichtbaren Benutzer-Turn zu gelangen, legt
anschließend eine betroffene defekte Sitzungs-JSONL an und verifiziert, dass
pnpm test:docker:npm-telegram-live- Installiert einen OpenClaw-Paketkandidaten in Docker, führt Installed-Package-Onboarding aus, konfiguriert Telegram über die installierte CLI und verwendet dann die Live-Telegram-QA-Lane mit diesem installierten Paket als SUT-Gateway erneut.
- Standard ist
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta; setzen SieOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzoderOPENCLAW_CURRENT_PACKAGE_TGZ, um statt einer Installation aus der Registry einen aufgelösten lokalen Tarball zu testen. - Verwendet dieselben Telegram-env-Zugangsdaten oder dieselbe
Convex-Zugangsdatenquelle wie
pnpm openclaw qa telegram. Setzen Sie für CI-/Release-AutomatisierungOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexplusOPENCLAW_QA_CONVEX_SITE_URLund das Rollen-Secret. WennOPENCLAW_QA_CONVEX_SITE_URLund ein Convex-Rollen-Secret in CI vorhanden sind, wählt der Docker-Wrapper automatisch Convex aus. - Der Wrapper validiert Telegram- oder Convex-Zugangsdaten-env auf dem Host,
bevor Docker-Build-/Installationsarbeit beginnt. Setzen Sie
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1nur, wenn Sie bewusst das Setup vor den Zugangsdaten debuggen. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainerüberschreibt die gemeinsameOPENCLAW_QA_CREDENTIAL_ROLEnur für diese Lane.- GitHub Actions stellt diese Lane als manuellen Maintainer-Workflow
NPM Telegram Beta E2Ebereit. Sie läuft nicht bei Merge. Der Workflow verwendet die Umgebungqa-live-sharedund Convex-CI-Zugangsdaten-Leases.
- GitHub Actions stellt außerdem
Package Acceptancefür seitlich ausgeführten Produktnachweis gegen ein einzelnes Kandidatenpaket bereit. Es akzeptiert einen vertrauenswürdigen Ref, eine veröffentlichte npm-Spezifikation, eine HTTPS-Tarball-URL plus SHA-256 oder ein Tarball-Artefakt aus einem anderen Lauf, lädt das normalisierteopenclaw-current.tgzalspackage-under-testhoch und führt anschließend den bestehenden Docker-E2E-Scheduler mit den Lane-Profilen Smoke, Package, Product, Full oder Custom aus. Setzen Sietelegram_mode=mock-openaioderlive-frontier, um den Telegram-QA-Workflow gegen dasselbepackage-under-test-Artefakt auszuführen.- Neuester Beta-Produktnachweis:
gh workflow run package-acceptance.yml --ref main \
-f source=npm \
-f package_spec=openclaw@beta \
-f suite_profile=product \
-f telegram_mode=mock-openai
- Nachweis mit exakter Tarball-URL erfordert einen Digest:
gh workflow run package-acceptance.yml --ref main \
-f source=url \
-f package_url=https://registry.npmjs.org/openclaw/-/openclaw-VERSION.tgz \
-f package_sha256=<sha256> \
-f suite_profile=package
- Artefaktnachweis lädt ein Tarball-Artefakt aus einem anderen Actions-Lauf herunter:
gh workflow run package-acceptance.yml --ref main \
-f source=artifact \
-f artifact_run_id=<run-id> \
-f artifact_name=<artifact-name> \
-f suite_profile=smoke
-
pnpm test:docker:plugins- Paketiert und installiert den aktuellen OpenClaw-Build in Docker, startet den Gateway mit konfiguriertem OpenAI und aktiviert anschließend gebündelte Channels/Plugins über Konfigurationsänderungen.
- Verifiziert, dass die Setup-Erkennung unkonfigurierte herunterladbare Plugins abwesend lässt, die erste konfigurierte doctor-Reparatur jedes fehlende herunterladbare Plugin explizit installiert und ein zweiter Neustart keine versteckte Abhängigkeitsreparatur ausführt.
- Installiert außerdem eine bekannte ältere npm-Baseline, aktiviert Telegram
vor der Ausführung von
openclaw update --tag <candidate>und verifiziert, dass der doctor des Kandidaten nach dem Update Altlasten aus Plugin-Abhängigkeiten ohne harness-seitige Postinstall-Reparatur bereinigt.
-
pnpm test:parallels:npm-update-
Führt den nativen Packaged-Install-Update-Smoke über Parallels-Gäste aus. Jede ausgewählte Plattform installiert zuerst das angeforderte Baseline-Paket, führt dann im selben Gast den installierten Befehl
openclaw updateaus und verifiziert die installierte Version, den Update-Status, die Gateway-Bereitschaft und einen lokalen Agent-Turn. -
Verwenden Sie
--platform macos,--platform windowsoder--platform linux, während Sie an einem Gast iterieren. Verwenden Sie--jsonfür den Pfad zum Zusammenfassungsartefakt und den Status pro Lane. -
Die OpenAI-Lane verwendet standardmäßig
openai/gpt-5.5für den Live-Agent-Turn-Nachweis. Übergeben Sie--model <provider/model>oder setzen SieOPENCLAW_PARALLELS_OPENAI_MODEL, wenn Sie bewusst ein anderes OpenAI-Modell validieren. -
Kapseln Sie lange lokale Läufe in ein Host-Timeout, damit Parallels-Transport-Stalls nicht den Rest des Testfensters verbrauchen:
timeout --foreground 150m pnpm test:parallels:npm-update -- --json timeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
Das Skript schreibt verschachtelte Lane-Logs unter
/tmp/openclaw-parallels-npm-update.*. Prüfen Siewindows-update.log,macos-update.logoderlinux-update.log, bevor Sie annehmen, dass der äußere Wrapper hängt. -
Das Windows-Update kann auf einem kalten Gast 10 bis 15 Minuten mit doctor- und Paket-Update-Arbeit nach dem Update verbringen; das ist noch gesund, wenn das verschachtelte npm-Debug-Log fortschreitet.
-
Führen Sie diesen aggregierten Wrapper nicht parallel zu einzelnen Parallels-macOS-, Windows- oder Linux-Smoke-Lanes aus. Sie teilen sich den VM-Zustand und können bei Snapshot-Wiederherstellung, Paketbereitstellung oder Gast-Gateway-Zustand kollidieren.
-
Der Nachweis nach dem Update führt die normale gebündelte Plugin-Oberfläche aus, weil Capability-Facades wie Sprache, Bilderzeugung und Medienverständnis über gebündelte Laufzeit-APIs geladen werden, auch wenn der Agent-Turn selbst nur eine einfache Textantwort prüft.
-
-
pnpm openclaw qa aimock- Startet nur den lokalen AIMock-Provider-Server für direktes Protokoll-Smoke-Testing.
-
pnpm openclaw qa matrix- Führt die Matrix-Live-QA-Lane gegen einen kurzlebigen Docker-gestützten Tuwunel-Homeserver aus. Nur Source-Checkout - paketierte Installationen liefern
qa-labnicht mit. - Vollständige CLI, Profil-/Szenariokatalog, env vars und Artefaktlayout: Matrix-QA.
- Führt die Matrix-Live-QA-Lane gegen einen kurzlebigen Docker-gestützten Tuwunel-Homeserver aus. Nur Source-Checkout - paketierte Installationen liefern
-
pnpm openclaw qa telegram- Führt die Telegram-Live-QA-Lane gegen eine echte private Gruppe mit den Driver- und SUT-Bot-Tokens aus env aus.
- Erfordert
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENundOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. Die Gruppen-ID muss die numerische Telegram-Chat-ID sein. - Unterstützt
--credential-source convexfür gemeinsame gepoolte Zugangsdaten. Verwenden Sie standardmäßig den env-Modus, oder setzen SieOPENCLAW_QA_CREDENTIAL_SOURCE=convex, um gepoolte Leases zu verwenden. - Beendet mit einem Nicht-Null-Code, wenn ein Szenario fehlschlägt. Verwenden
Sie
--allow-failures, wenn Sie Artefakte ohne fehlschlagenden Exit-Code wünschen. - Erfordert zwei verschiedene Bots in derselben privaten Gruppe, wobei der SUT-Bot einen Telegram-Benutzernamen bereitstellen muss.
- Aktivieren Sie für stabile Bot-zu-Bot-Beobachtung den Bot-to-Bot Communication Mode in
@BotFatherfür beide Bots und stellen Sie sicher, dass der Driver-Bot Gruppen-Bot-Verkehr beobachten kann. - Schreibt einen Telegram-QA-Bericht, eine Zusammenfassung und ein Artefakt mit beobachteten Nachrichten unter
.artifacts/qa-e2e/.... Antwortszenarien enthalten RTT von der Sendeanforderung des Drivers bis zur beobachteten SUT-Antwort.
Live-Transport-Lanes teilen sich einen Standardvertrag, damit neue Transporte nicht abweichen; die Abdeckungsmatrix pro Lane befindet sich in QA-Übersicht → Live-Transport-Abdeckung. qa-channel ist die breite synthetische Suite und nicht Teil dieser Matrix.
Gemeinsame Telegram-Zugangsdaten über Convex (v1)
Wenn --credential-source convex (oder OPENCLAW_QA_CREDENTIAL_SOURCE=convex) für
openclaw qa telegram aktiviert ist, erhält QA Lab eine exklusive Lease aus einem Convex-gestützten Pool, heartbeated
diese Lease, während die Lane läuft, und gibt die Lease beim Herunterfahren frei.
Referenz-Convex-Projektscaffold:
qa/convex-credential-broker/
Erforderliche env vars:
OPENCLAW_QA_CONVEX_SITE_URL(zum Beispielhttps://your-deployment.convex.site)- Ein Secret für die ausgewählte Rolle:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERfürmaintainerOPENCLAW_QA_CONVEX_SECRET_CIfürci
- Auswahl der Zugangsdatenrolle:
- CLI:
--credential-role maintainer|ci - env-Standard:
OPENCLAW_QA_CREDENTIAL_ROLE(standardmäßigciin CI, sonstmaintainer)
- CLI:
Optionale env vars:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(Standard1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(Standard30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(Standard90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(Standard15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(Standard/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(optionale Trace-ID)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1erlaubt loopback-http://-Convex-URLs für ausschließlich lokale Entwicklung.
OPENCLAW_QA_CONVEX_SITE_URL sollte im Normalbetrieb https:// verwenden.
Maintainer-Adminbefehle (pool add/remove/list) erfordern ausdrücklich
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
CLI-Hilfsbefehle für Maintainer:
pnpm openclaw qa credentials doctor
pnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.json
pnpm openclaw qa credentials list --kind telegram
pnpm openclaw qa credentials remove --credential-id <credential-id>
Verwenden Sie doctor vor Live-Läufen, um die Convex-Site-URL, Broker-Secrets,
Endpoint-Präfix, HTTP-Timeout und Admin-/Listen-Erreichbarkeit zu prüfen, ohne
Secret-Werte auszugeben. Verwenden Sie --json für maschinenlesbare Ausgabe in Skripten und CI
Hilfsprogrammen.
Standard-Endpoint-Vertrag (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1):
POST /acquire- Anfrage:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Erfolg:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Erschöpft/wiederholbar:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Anfrage:
POST /heartbeat- Anfrage:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Erfolg:
{ status: "ok" }(oder leeres2xx)
- Anfrage:
POST /release- Anfrage:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Erfolg:
{ status: "ok" }(oder leeres2xx)
- Anfrage:
POST /admin/add(nur Maintainer-Secret)- Anfrage:
{ kind, actorId, payload, note?, status? } - Erfolg:
{ status: "ok", credential }
- Anfrage:
POST /admin/remove(nur Maintainer-Secret)- Anfrage:
{ credentialId, actorId } - Erfolg:
{ status: "ok", changed, credential } - Schutz bei aktiver Lease:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Anfrage:
POST /admin/list(nur Maintainer-Secret)- Anfrage:
{ kind?, status?, includePayload?, limit? } - Erfolg:
{ status: "ok", credentials, count }
- Anfrage:
Payload-Form für Telegram-Art:
{ groupId: string, driverToken: string, sutToken: string }groupIdmuss eine numerische Telegram-Chat-ID-Zeichenfolge sein.admin/addvalidiert diese Form fürkind: "telegram"und lehnt fehlerhafte Payloads ab.
Einen Kanal zu QA hinzufügen
Die Architektur- und Szenario-Hilfsnamen für neue Kanaladapter finden Sie unter QA-Übersicht → Kanal hinzufügen. Mindestanforderung: Implementieren Sie den Transport-Runner auf dem gemeinsamen qa-lab-Host-Seam, deklarieren Sie qaRunners im Plugin-Manifest, mounten Sie ihn als openclaw qa <runner> und erstellen Sie Szenarien unter qa/scenarios/.
Test-Suites (was wo läuft)
Betrachten Sie die Suites als „zunehmenden Realismus“ (und zunehmende Instabilität/Kosten):
Unit / Integration (Standard)
- Befehl:
pnpm test - Konfiguration: Ungezielte Läufe verwenden das
vitest.full-*.config.ts-Shard-Set und können Multi-Projekt-Shards für parallele Planung in projektbezogene Konfigurationen erweitern - Dateien: Core-/Unit-Inventare unter
src/**/*.test.ts,packages/**/*.test.tsundtest/**/*.test.ts; UI-Unit-Tests laufen im dediziertenunit-ui-Shard - Umfang:
- Reine Unit-Tests
- In-Process-Integrationstests (Gateway-Authentifizierung, Routing, Tooling, Parsing, Konfiguration)
- Deterministische Regressionen für bekannte Bugs
- Erwartungen:
- Läuft in CI
- Keine echten Schlüssel erforderlich
- Sollte schnell und stabil sein
- Resolver- und Public-Surface-Loader-Tests müssen das allgemeine
api.js- undruntime-api.js-Fallback-Verhalten mit generierten kleinen Plugin-Fixtures belegen, nicht mit echten gebündelten Plugin-Quell-APIs. Echte Plugin-API-Ladevorgänge gehören in Plugin-eigene Vertrags-/Integrations-Suites.
Projekte, Shards und bereichsbezogene Lanes
- Ungezieltes
pnpm testführt zwölf kleinere Shard-Konfigurationen (core-unit-fast,core-unit-src,core-unit-security,core-unit-ui,core-unit-support,core-support-boundary,core-contracts,core-bundled,core-runtime,agentic,auto-reply,extensions) statt eines einzigen riesigen nativen Root-Projektprozesses aus. Das reduziert Peak-RSS auf ausgelasteten Maschinen und verhindert, dass auto-reply-/Extension-Arbeit unabhängige Suites ausbremst. pnpm test --watchverwendet weiterhin den nativen Root-Projektgraphenvitest.config.ts, weil eine Multi-Shard-Watch-Schleife nicht praktikabel ist.pnpm test,pnpm test:watchundpnpm test:perf:importsleiten explizite Datei-/Verzeichnisziele zuerst über bereichsbezogene Lanes, sodasspnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsdie vollständige Root-Projekt-Startlast vermeidet.pnpm test:changederweitert geänderte Git-Pfade standardmäßig zu günstigen bereichsbezogenen Lanes: direkte Teständerungen, benachbarte*.test.ts-Dateien, explizite Source-Zuordnungen und lokale Importgraph-Abhängige. Config-/Setup-/Package-Änderungen lösen keine breiten Testläufe aus, außer Sie verwenden explizitOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed.pnpm check:changedist das normale intelligente lokale Check-Gate für schmale Arbeiten. Es klassifiziert den Diff in Core, Core-Tests, Extensions, Extension-Tests, Apps, Docs, Release-Metadaten, Live-Docker-Tooling und Tooling und führt dann die passenden Typecheck-, Lint- und Guard-Befehle aus. Es führt keine Vitest-Tests aus; rufen Siepnpm test:changedoder explizitpnpm test <target>für Testnachweise auf. Versions-Bumps nur für Release-Metadaten führen gezielte Versions-/Config-/Root-Dependency-Checks aus, mit einem Guard, der Package-Änderungen außerhalb des Top-Level-Versionsfelds ablehnt.- Änderungen am Live-Docker-ACP-Harness führen fokussierte Checks aus: Shell-Syntax für die Live-Docker-Auth-Skripte und einen Live-Docker-Scheduler-Dry-Run.
package.json-Änderungen sind nur eingeschlossen, wenn der Diff aufscripts["test:docker:live-*"]beschränkt ist; Dependency-, Export-, Versions- und andere Package-Surface-Änderungen verwenden weiterhin die breiteren Guards. - Import-leichte Unit-Tests aus Agents, Commands, Plugins, auto-reply-Helfern,
plugin-sdkund ähnlichen reinen Utility-Bereichen laufen über dieunit-fast-Lane, dietest/setup-openclaw-runtime.tsüberspringt; zustandsbehaftete/runtime-lastige Dateien bleiben auf den bestehenden Lanes. - Ausgewählte
plugin-sdk- undcommands-Helfer-Quelldateien ordnen Changed-Mode-Läufe außerdem expliziten benachbarten Tests in diesen leichten Lanes zu, sodass Helferänderungen nicht die vollständige schwere Suite für dieses Verzeichnis erneut ausführen. auto-replyhat dedizierte Buckets für Top-Level-Core-Helfer, Top-Level-reply.*-Integrationstests und den Teilbaumsrc/auto-reply/reply/**. CI teilt den Reply-Teilbaum zusätzlich in agent-runner-, dispatch- und commands/state-routing-Shards auf, damit ein importlastiger Bucket nicht den gesamten Node-Rest besitzt.- Normale PR-/main-CI überspringt bewusst den Extension-Batch-Sweep und den nur für Releases vorgesehenen
agentic-plugins-Shard. Full Release Validation dispatcht den separatenPlugin Prerelease-Child-Workflow für diese Plugin-/Extension-lastigen Suites auf Release-Kandidaten.
Abdeckung des eingebetteten Runners
- Wenn Sie Message-Tool-Discovery-Eingaben oder den Compaction-Runtime- Kontext ändern, behalten Sie beide Abdeckungsebenen bei.
- Fügen Sie fokussierte Helfer-Regressionen für reine Routing- und Normalisierungs- Grenzen hinzu.
- Halten Sie die eingebetteten Runner-Integrations-Suites gesund:
src/agents/pi-embedded-runner/compact.hooks.test.ts,src/agents/pi-embedded-runner/run.overflow-compaction.test.tsundsrc/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts. - Diese Suites prüfen, dass bereichsbezogene IDs und Compaction-Verhalten weiterhin
durch die echten
run.ts- /compact.ts-Pfade fließen; reine Helfertests sind kein ausreichender Ersatz für diese Integrationspfade.
Vitest-Pool- und Isolation-Standards
- Die Basis-Vitest-Konfiguration verwendet standardmäßig
threads. - Die gemeinsame Vitest-Konfiguration setzt
isolate: falsefest und verwendet den nicht isolierten Runner über Root-Projekte, e2e und Live-Konfigurationen hinweg. - Die Root-UI-Lane behält ihr
jsdom-Setup und ihren Optimizer bei, läuft aber ebenfalls auf dem gemeinsamen nicht isolierten Runner. - Jeder
pnpm test-Shard übernimmt dieselbenthreads- +isolate: false- Standards aus der gemeinsamen Vitest-Konfiguration. scripts/run-vitest.mjsfügt standardmäßig--no-maglevfür Vitest-Child-Node- Prozesse hinzu, um V8-Kompilieraufwand bei großen lokalen Läufen zu reduzieren. Setzen SieOPENCLAW_VITEST_ENABLE_MAGLEV=1, um mit dem Standard-V8- Verhalten zu vergleichen.
Schnelle lokale Iteration
pnpm changed:laneszeigt, welche Architektur-Lanes ein Diff auslöst.- Der Pre-Commit-Hook ist nur für Formatierung. Er staged formatierte Dateien erneut und führt weder Lint noch Typecheck oder Tests aus.
- Führen Sie
pnpm check:changedexplizit vor der Übergabe oder vor dem Push aus, wenn Sie das intelligente lokale Check-Gate benötigen. pnpm test:changedleitet standardmäßig über günstige bereichsbezogene Lanes. Verwenden SieOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changednur, wenn der Agent entscheidet, dass eine Harness-, Config-, Package- oder Vertragsänderung wirklich breitere Vitest-Abdeckung benötigt.pnpm test:maxundpnpm test:changed:maxbehalten dasselbe Routing- Verhalten bei, nur mit höherer Worker-Obergrenze.- Lokale Worker-Autoskalierung ist bewusst konservativ und fährt zurück, wenn der Host-Load-Average bereits hoch ist, sodass mehrere gleichzeitige Vitest-Läufe standardmäßig weniger Schaden verursachen.
- Die Basis-Vitest-Konfiguration markiert die Projekte/Config-Dateien als
forceRerunTriggers, damit Changed-Mode-Neuläufe korrekt bleiben, wenn sich die Test- Verdrahtung ändert. - Die Konfiguration hält
OPENCLAW_VITEST_FS_MODULE_CACHEauf unterstützten Hosts aktiviert; setzen SieOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path, wenn Sie einen expliziten Cache-Ort für direktes Profiling möchten.
Perf-Debugging
pnpm test:perf:importsaktiviert Vitest-Importdauer-Reporting plus Import-Breakdown-Ausgabe.pnpm test:perf:imports:changedbeschränkt dieselbe Profiling-Ansicht auf Dateien, die seitorigin/maingeändert wurden.- Shard-Timing-Daten werden nach
.artifacts/vitest-shard-timings.jsongeschrieben. Whole-Config-Läufe verwenden den Config-Pfad als Schlüssel; Include-Pattern-CI- Shards hängen den Shard-Namen an, damit gefilterte Shards separat verfolgt werden können. - Wenn ein Hot-Test weiterhin den Großteil seiner Zeit in Startup-Imports verbringt,
halten Sie schwere Dependencies hinter einem schmalen lokalen
*.runtime.ts-Seam und mocken Sie diesen Seam direkt, statt Runtime-Helfer tief zu importieren, nur um sie durchvi.mock(...)zu schleusen. pnpm test:perf:changed:bench -- --ref <git-ref>vergleicht geroutetestest:changedmit dem nativen Root-Projektpfad für diesen committeten Diff und gibt Wall-Time plus macOS-Max-RSS aus.pnpm test:perf:changed:bench -- --worktreebenchmarked den aktuellen Dirty Tree, indem die geänderte Dateiliste überscripts/test-projects.mjsund die Root-Vitest-Konfiguration geroutet wird.pnpm test:perf:profile:mainschreibt ein Main-Thread-CPU-Profil für Vitest-/Vite-Startup- und Transform-Overhead.pnpm test:perf:profile:runnerschreibt Runner-CPU- und Heap-Profile für die Unit-Suite mit deaktivierter Datei-Parallelität.
Stabilität (Gateway)
- Befehl:
pnpm test:stability:gateway - Konfiguration:
vitest.gateway.config.ts, auf einen Worker erzwungen - Umfang:
- Startet einen echten Loopback-Gateway mit standardmäßig aktivierter Diagnose
- Treibt synthetische Gateway-Nachrichten-, Memory- und Large-Payload-Last durch den Diagnose-Event-Pfad
- Fragt
diagnostics.stabilityüber die Gateway-WS-RPC ab - Deckt Persistenzhelfer für Diagnose-Stabilitätsbundles ab
- Prüft, dass der Recorder begrenzt bleibt, synthetische RSS-Samples unter dem Pressure-Budget bleiben und Per-Session-Queue-Tiefen wieder auf null ablaufen
- Erwartungen:
- CI-sicher und ohne Schlüssel
- Schmale Lane für Stabilitätsregressions-Nachverfolgung, kein Ersatz für die vollständige Gateway-Suite
E2E (Gateway-Smoke)
- Befehl:
pnpm test:e2e - Konfiguration:
vitest.e2e.config.ts - Dateien:
src/**/*.e2e.test.ts,test/**/*.e2e.test.tsund E2E-Tests gebündelter Plugins unterextensions/ - Laufzeit-Standardeinstellungen:
- Verwendet Vitest
threadsmitisolate: false, passend zum Rest des Repos. - Verwendet adaptive Worker (CI: bis zu 2, lokal: standardmäßig 1).
- Läuft standardmäßig im Silent-Modus, um Console-I/O-Overhead zu reduzieren.
- Verwendet Vitest
- Nützliche Overrides:
OPENCLAW_E2E_WORKERS=<n>, um die Worker-Anzahl zu erzwingen (auf 16 begrenzt).OPENCLAW_E2E_VERBOSE=1, um ausführliche Konsolenausgabe wieder zu aktivieren.
- Umfang:
- End-to-End-Verhalten von Gateway-Mehrfachinstanzen
- WebSocket/HTTP-Oberflächen, Node-Pairing und umfangreicheres Networking
- Erwartungen:
- Läuft in CI (wenn in der Pipeline aktiviert)
- Keine echten Schlüssel erforderlich
- Mehr bewegliche Teile als Unit-Tests (kann langsamer sein)
E2E: OpenShell-Backend-Smoke-Test
- Befehl:
pnpm test:e2e:openshell - Datei:
extensions/openshell/src/backend.e2e.test.ts - Umfang:
- Startet ein isoliertes OpenShell-Gateway auf dem Host über Docker
- Erstellt eine Sandbox aus einer temporären lokalen Dockerfile
- Testet das OpenShell-Backend von OpenClaw über echtes
sandbox ssh-config+ SSH-Ausführung - Verifiziert remote-kanonisches Dateisystemverhalten über die Sandbox-fs-Bridge
- Erwartungen:
- Nur per Opt-in; nicht Teil des standardmäßigen
pnpm test:e2e-Laufs - Erfordert eine lokale
openshell-CLI sowie einen funktionierenden Docker-Daemon - Verwendet isolierte
HOME/XDG_CONFIG_HOMEund entfernt danach das Test-Gateway und die Sandbox
- Nur per Opt-in; nicht Teil des standardmäßigen
- Nützliche Overrides:
OPENCLAW_E2E_OPENSHELL=1, um den Test beim manuellen Ausführen der breiteren E2E-Suite zu aktivierenOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell, um auf ein nicht standardmäßiges CLI-Binary oder Wrapper-Skript zu verweisen
Live (echte Provider + echte Modelle)
- Befehl:
pnpm test:live - Konfiguration:
vitest.live.config.ts - Dateien:
src/**/*.live.test.ts,test/**/*.live.test.tsund Live-Tests gebündelter Plugins unterextensions/ - Standard: durch
pnpm test:liveaktiviert (setztOPENCLAW_LIVE_TEST=1) - Umfang:
- „Funktioniert dieser Provider/dieses Modell heute tatsächlich mit echten Zugangsdaten?“
- Erkennt Provider-Formatänderungen, Besonderheiten beim Tool-Aufruf, Authentifizierungsprobleme und Rate-Limit-Verhalten
- Erwartungen:
- Absichtlich nicht CI-stabil (echte Netzwerke, echte Provider-Richtlinien, Kontingente, Ausfälle)
- Kostet Geld / nutzt Rate Limits
- Führen Sie vorzugsweise eingegrenzte Teilmengen statt „alles“ aus
- Live-Läufe lesen
~/.profileein, um fehlende API-Schlüssel zu übernehmen. - Standardmäßig isolieren Live-Läufe weiterhin
HOMEund kopieren Konfigurations-/Authentifizierungsmaterial in ein temporäres Test-Home, damit Unit-Fixtures Ihr echtes~/.openclawnicht verändern können. - Setzen Sie
OPENCLAW_LIVE_USE_REAL_HOME=1nur, wenn Live-Tests absichtlich Ihr echtes Home-Verzeichnis verwenden sollen. pnpm test:liveverwendet jetzt standardmäßig einen ruhigeren Modus: Die[live] ...-Fortschrittsausgabe bleibt erhalten, aber der zusätzliche~/.profile-Hinweis wird unterdrückt und Gateway-Bootstrap-Logs/Bonjour-Rauschen werden stummgeschaltet. Setzen SieOPENCLAW_LIVE_TEST_QUIET=0, wenn Sie die vollständigen Startlogs wieder haben möchten.- API-Schlüsselrotation (Provider-spezifisch): Setzen Sie
*_API_KEYSim Komma-/Semikolonformat oder*_API_KEY_1,*_API_KEY_2(zum BeispielOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) oder einen Live-spezifischen Override überOPENCLAW_LIVE_*_KEY; Tests wiederholen bei Rate-Limit-Antworten. - Fortschritts-/Heartbeat-Ausgabe:
- Live-Suites geben jetzt Fortschrittszeilen auf stderr aus, damit lange Provider-Aufrufe sichtbar aktiv bleiben, auch wenn die Vitest-Konsolenerfassung ruhig ist.
vitest.live.config.tsdeaktiviert die Vitest-Konsoleninterception, damit Provider-/Gateway-Fortschrittszeilen während Live-Läufen sofort gestreamt werden.- Stimmen Sie Direct-Model-Heartbeats mit
OPENCLAW_LIVE_HEARTBEAT_MSab. - Stimmen Sie Gateway-/Probe-Heartbeats mit
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MSab.
Welche Suite soll ich ausführen?
Verwenden Sie diese Entscheidungstabelle:
- Logik/Tests bearbeiten: Führen Sie
pnpm testaus (undpnpm test:coverage, wenn Sie viel geändert haben) - Gateway-Networking / WS-Protokoll / Pairing berühren: Fügen Sie
pnpm test:e2ehinzu - „Mein Bot ist ausgefallen“ / Provider-spezifische Fehler / Tool-Aufrufe debuggen: Führen Sie ein eingegrenztes
pnpm test:liveaus
Live-Tests (mit Netzwerkzugriff)
Für die Live-Modellmatrix, CLI-Backend-Smoke-Tests, ACP-Smoke-Tests, den Codex-App-Server-Harness und alle Live-Tests für Medien-Provider (Deepgram, BytePlus, ComfyUI, Bild, Musik, Video, Medien-Harness) sowie den Umgang mit Zugangsdaten für Live-Läufe siehe Live-Suites testen. Für die dedizierte Checkliste zur Update- und Plugin-Validierung siehe Updates und Plugins testen.
Docker-Runner (optionale „funktioniert unter Linux“-Prüfungen)
Diese Docker-Runner sind in zwei Gruppen aufgeteilt:
- Live-Modell-Runner:
test:docker:live-modelsundtest:docker:live-gatewayführen nur ihre passende Live-Datei für Profil-Schlüssel innerhalb des Repo-Docker-Images aus (src/agents/models.profiles.live.test.tsundsrc/gateway/gateway-models.profiles.live.test.ts), mounten Ihr lokales Konfigurationsverzeichnis und Ihren Workspace (und lesen~/.profileein, falls gemountet). Die passenden lokalen Einstiegspunkte sindtest:live:models-profilesundtest:live:gateway-profiles. - Docker-Live-Runner verwenden standardmäßig eine kleinere Smoke-Obergrenze, damit ein vollständiger Docker-Durchlauf praktikabel bleibt:
test:docker:live-modelsverwendet standardmäßigOPENCLAW_LIVE_MAX_MODELS=12, undtest:docker:live-gatewayverwendet standardmäßigOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000undOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Überschreiben Sie diese Umgebungsvariablen, wenn Sie ausdrücklich den größeren vollständigen Scan wünschen. test:docker:allerstellt das Live-Docker-Image einmal übertest:docker:live-build, packt OpenClaw einmal als npm-Tarball überscripts/package-openclaw-for-docker.mjsund erstellt/verwendet dann zweiscripts/e2e/Dockerfile-Images. Das Basis-Image ist nur der Node/Git-Runner für Installations-, Update- und Plugin-Abhängigkeits-Lanes; diese Lanes mounten den vorab erstellten Tarball. Das funktionale Image installiert denselben Tarball nach/appfür Built-App-Funktionalitäts-Lanes. Docker-Lane-Definitionen liegen inscripts/lib/docker-e2e-scenarios.mjs; die Planner-Logik liegt inscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsführt den ausgewählten Plan aus. Das Aggregat verwendet einen gewichteten lokalen Scheduler:OPENCLAW_DOCKER_ALL_PARALLELISMsteuert Prozess-Slots, während Ressourcenlimits verhindern, dass schwere Live-, npm-Installations- und Multi-Service-Lanes alle gleichzeitig starten. Wenn eine einzelne Lane schwerer ist als die aktiven Limits, kann der Scheduler sie trotzdem starten, wenn der Pool leer ist, und sie dann allein weiterlaufen lassen, bis wieder Kapazität verfügbar ist. Standardwerte sind 10 Slots,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10undOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; passen SieOPENCLAW_DOCKER_ALL_WEIGHT_LIMIToderOPENCLAW_DOCKER_ALL_DOCKER_LIMITnur an, wenn der Docker-Host mehr Spielraum hat. Der Runner führt standardmäßig einen Docker-Preflight aus, entfernt veraltete OpenClaw-E2E-Container, gibt alle 30 Sekunden Status aus, speichert erfolgreiche Lane-Zeiten in.artifacts/docker-tests/lane-timings.jsonund verwendet diese Zeiten, um bei späteren Läufen längere Lanes zuerst zu starten. Verwenden SieOPENCLAW_DOCKER_ALL_DRY_RUN=1, um das gewichtete Lane-Manifest ohne Build oder Docker-Ausführung auszugeben, odernode scripts/test-docker-all.mjs --plan-json, um den CI-Plan für ausgewählte Lanes, Paket-/Image-Anforderungen und Zugangsdaten auszugeben.Package Acceptanceist das GitHub-native Paket-Gate für „Funktioniert dieser installierbare Tarball als Produkt?“ Es löst ein Kandidatenpaket aussource=npm,source=ref,source=urlodersource=artifactauf, lädt es alspackage-under-testhoch und führt dann die wiederverwendbaren Docker-E2E-Lanes gegen genau diesen Tarball aus, statt den ausgewählten Ref neu zu packen. Profile sind nach Umfang geordnet:smoke,package,productundfull. Siehe Updates und Plugins testen für den Paket-/Update-/Plugin-Vertrag, die Published-Upgrade-Survivor-Matrix, Release-Standardeinstellungen und Fehlertriage.- Build- und Release-Prüfungen führen nach tsdown
scripts/check-cli-bootstrap-imports.mjsaus. Der Guard durchläuft den statischen gebauten Graphen abdist/entry.jsunddist/cli/run-main.jsund schlägt fehl, wenn Pre-Dispatch-Startup Paketabhängigkeiten wie Commander, Prompt-UI, undici oder Logging vor der Befehlsweiterleitung importiert; außerdem hält er den gebündelten Gateway-Run-Chunk innerhalb des Budgets und weist statische Importe bekannter kalter Gateway-Pfade zurück. Der Packaged-CLI-Smoke-Test deckt außerdem Root-Hilfe, Onboard-Hilfe, Doctor-Hilfe, Status, Konfigurationsschema und einen Modelllistenbefehl ab. - Die Legacy-Kompatibilität von Package Acceptance ist auf
2026.4.25begrenzt (2026.4.25-beta.*eingeschlossen). Bis zu diesem Stichtag toleriert der Harness nur Metadatenlücken ausgelieferter Pakete: ausgelassene private QA-Inventareinträge, fehlendesgateway install --wrapper, fehlende Patchdateien in der aus dem Tarball abgeleiteten Git-Fixture, fehlendes persistiertesupdate.channel, ältere Plugin-Install-Record-Speicherorte, fehlende Marketplace-Install-Record-Persistenz und Konfigurationsmetadaten-Migration währendplugins update. Für Pakete nach2026.4.25sind diese Pfade strikte Fehler. - Container-Smoke-Runner:
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,test:docker:update-channel-switch,test:docker:upgrade-survivor,test:docker:published-upgrade-survivor,test:docker:session-runtime-context,test:docker:agents-delete-shared-workspace,test:docker:gateway-network,test:docker:browser-cdp-snapshot,test:docker:mcp-channels,test:docker:pi-bundle-mcp-tools,test:docker:cron-mcp-cleanup,test:docker:plugins,test:docker:plugin-update,test:docker:plugin-lifecycle-matrixundtest:docker:config-reloadstarten einen oder mehrere echte Container und verifizieren Integrationspfade auf höherer Ebene.
Die Live-Modell-Docker-Runner binden außerdem nur die benötigten CLI-Auth-Homes ein (oder alle unterstützten, wenn der Lauf nicht eingegrenzt ist) und kopieren sie anschließend vor dem Lauf in das Container-Home, damit externes CLI-OAuth Token aktualisieren kann, ohne den Auth-Speicher des Hosts zu verändern:
- Direkte Modelle:
pnpm test:docker:live-models(Skript:scripts/test-live-models-docker.sh) - ACP-Bind-Smoke-Test:
pnpm test:docker:live-acp-bind(Skript:scripts/test-live-acp-bind-docker.sh; deckt standardmäßig Claude, Codex und Gemini ab, mit strenger Droid/OpenCode-Abdeckung überpnpm test:docker:live-acp-bind:droidundpnpm test:docker:live-acp-bind:opencode) - CLI-Backend-Smoke-Test:
pnpm test:docker:live-cli-backend(Skript:scripts/test-live-cli-backend-docker.sh) - Codex-App-Server-Harness-Smoke-Test:
pnpm test:docker:live-codex-harness(Skript:scripts/test-live-codex-harness-docker.sh) - Gateway + Entwicklungsagent:
pnpm test:docker:live-gateway(Skript:scripts/test-live-gateway-models-docker.sh) - Observability-Smoke-Test:
pnpm qa:otel:smokeist ein privater QA-Prüfpfad für Source-Checkouts. Er ist absichtlich nicht Teil der Docker-Release-Prüfpfade für Pakete, weil der npm-Tarball das QA Lab auslässt. - Open WebUI-Live-Smoke-Test:
pnpm test:docker:openwebui(Skript:scripts/e2e/openwebui-docker.sh) - Onboarding-Assistent (TTY, vollständiges Scaffolding):
pnpm test:docker:onboard(Skript:scripts/e2e/onboard-docker.sh) - npm-Tarball-Smoke-Test für Onboarding/Kanal/Agent:
pnpm test:docker:npm-onboard-channel-agentinstalliert den gepackten OpenClaw-Tarball global in Docker, konfiguriert OpenAI über env-ref-Onboarding sowie standardmäßig Telegram, führt doctor aus und führt eine gemockte OpenAI-Agent-Interaktion aus. Verwenden Sie einen vorgebauten Tarball mitOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgzerneut, überspringen Sie den Host-Neubuild mitOPENCLAW_NPM_ONBOARD_HOST_BUILD=0, oder wechseln Sie den Kanal mitOPENCLAW_NPM_ONBOARD_CHANNEL=discordoderOPENCLAW_NPM_ONBOARD_CHANNEL=slack. - Smoke-Test für Update-Kanalwechsel:
pnpm test:docker:update-channel-switchinstalliert den gepackten OpenClaw-Tarball global in Docker, wechselt vom Paketkanalstablezu Gitdev, verifiziert den gespeicherten Kanal und die Plugin-Funktion nach dem Update, wechselt dann zurück zum Paketkanalstableund prüft den Update-Status. - Upgrade-Survivor-Smoke-Test:
pnpm test:docker:upgrade-survivorinstalliert den gepackten OpenClaw-Tarball über ein verunreinigtes Old-User-Fixture mit Agents, Kanalkonfiguration, Plugin-Allowlists, veraltetem Plugin-Abhängigkeitsstatus und vorhandenen Workspace-/Sitzungsdateien. Er führt ein Paket-Update plus nicht interaktiven doctor ohne Live-Provider- oder Kanalschlüssel aus, startet dann ein Loopback-Gateway und prüft die Erhaltung von Konfiguration/Zustand sowie Start-/Status-Budgets. - Veröffentlichter Upgrade-Survivor-Smoke-Test:
pnpm test:docker:published-upgrade-survivorinstalliert standardmäßigopenclaw@latest, erzeugt realistische Existing-User-Dateien, konfiguriert diese Basislinie mit einem eingebetteten Befehlsrezept, validiert die resultierende Konfiguration, aktualisiert diese veröffentlichte Installation auf den Kandidaten-Tarball, führt den nicht interaktiven doctor aus, schreibt.artifacts/upgrade-survivor/summary.json, startet dann ein Loopback-Gateway und prüft konfigurierte Intents, Zustandserhaltung, Start,/healthz,/readyzund RPC-Status-Budgets. Überschreiben Sie eine Basislinie mitOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, weisen Sie den Aggregat-Scheduler an, exakte lokale Basislinien mitOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECSwie[email protected] [email protected] [email protected]zu erweitern, und erweitern Sie issue-artige Fixtures mitOPENCLAW_UPGRADE_SURVIVOR_SCENARIOSwiereported-issues; die Mengereported-issuesenthältconfigured-plugin-installsfür die automatische Reparatur externer OpenClaw-Plugin-Installationen. Package Acceptance stellt diese alspublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesundpublished_upgrade_survivor_scenariosbereit, löst Meta-Basislinien-Token wielast-stable-4oderall-since-2026.4.23auf, und Full Release Validation erweitert den Package-Gate für den Release-Soak auflast-stable-4 2026.4.23 2026.5.2 2026.4.15plusreported-issues. - Smoke-Test für Sitzungslaufzeitkontext:
pnpm test:docker:session-runtime-contextverifiziert die Persistenz versteckter Laufzeitkontext-Transkripte sowie doctor-Reparatur betroffener duplizierter Prompt-Rewrite-Branches. - Bun-Smoke-Test für globale Installation:
bash scripts/e2e/bun-global-install-smoke.shpackt den aktuellen Baum, installiert ihn mitbun install -gin einem isolierten Home und verifiziert, dassopenclaw infer image providers --jsongebündelte Bild-Provider zurückgibt, statt hängen zu bleiben. Verwenden Sie einen vorgebauten Tarball mitOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgzerneut, überspringen Sie den Host-Build mitOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0, oder kopieren Siedist/aus einem gebauten Docker-Image mitOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. - Installer-Docker-Smoke-Test:
bash scripts/test-install-sh-docker.shteilt einen npm-Cache zwischen seinen Root-, Update- und direkten npm-Containern. Der Update-Smoke-Test verwendet standardmäßig npmlatestals stabile Basislinie, bevor auf den Kandidaten-Tarball aktualisiert wird. Überschreiben Sie dies lokal mitOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22oder auf GitHub mit der Eingabeupdate_baseline_versiondes Install Smoke-Workflows. Nicht-Root-Installer-Prüfungen behalten einen isolierten npm-Cache, damit Root-eigene Cache-Einträge das benutzerlokale Installationsverhalten nicht verdecken. Setzen SieOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache, um den Root-/Update-/direkten npm-Cache über lokale Wiederholungen hinweg erneut zu verwenden. - Install Smoke CI überspringt das doppelte direkte globale npm-Update mit
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; führen Sie das Skript lokal ohne diese Env aus, wenn direktenpm install -g-Abdeckung benötigt wird. - CLI-Smoke-Test für das Löschen eines gemeinsam genutzten Workspace durch Agents:
pnpm test:docker:agents-delete-shared-workspace(Skript:scripts/e2e/agents-delete-shared-workspace-docker.sh) baut standardmäßig das Root-Dockerfile-Image, erzeugt zwei Agents mit einem Workspace in einem isolierten Container-Home, führtagents delete --jsonaus und verifiziert gültiges JSON sowie das Verhalten für beibehaltene Workspaces. Verwenden Sie das Install-Smoke-Image mitOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1erneut. - Gateway-Netzwerk (zwei Container, WS-Authentifizierung + Health):
pnpm test:docker:gateway-network(Skript:scripts/e2e/gateway-network-docker.sh) - Browser-CDP-Snapshot-Smoke-Test:
pnpm test:docker:browser-cdp-snapshot(Skript:scripts/e2e/browser-cdp-snapshot-docker.sh) baut das Source-E2E-Image plus eine Chromium-Schicht, startet Chromium mit rohem CDP, führtbrowser doctor --deepaus und verifiziert, dass CDP-Rollen-Snapshots Link-URLs, per Cursor hervorgehobene anklickbare Elemente, iframe-Referenzen und Frame-Metadaten abdecken. - OpenAI Responses-Regression für
web_searchmit minimalem Reasoning:pnpm test:docker:openai-web-search-minimal(Skript:scripts/e2e/openai-web-search-minimal-docker.sh) führt einen gemockten OpenAI-Server über Gateway aus, verifiziert, dassweb_searchreasoning.effortvonminimalauflowanhebt, erzwingt dann die Ablehnung durch das Provider-Schema und prüft, dass das rohe Detail in den Gateway-Logs erscheint. - MCP-Kanal-Bridge (vorbereitetes Gateway + stdio-Bridge + roher Claude-Smoke-Test für Notification-Frames):
pnpm test:docker:mcp-channels(Skript:scripts/e2e/mcp-channels-docker.sh) - Pi-Bundle-MCP-Tools (echter stdio-MCP-Server + eingebetteter Pi-Profil-Allow-/Deny-Smoke-Test):
pnpm test:docker:pi-bundle-mcp-tools(Skript:scripts/e2e/pi-bundle-mcp-tools-docker.sh) - Cron/Subagent-MCP-Bereinigung (echtes Gateway + Teardown des stdio-MCP-Child nach isolierten Cron- und einmaligen Subagent-Ausführungen):
pnpm test:docker:cron-mcp-cleanup(Skript:scripts/e2e/cron-mcp-cleanup-docker.sh) - Plugins (Installations-/Update-Smoke-Test für lokalen Pfad,
file:, npm-Registry mit hoisted Abhängigkeiten, bewegliche Git-Refs, ClawHub-Kitchen-Sink, Marketplace-Updates und Aktivieren/Prüfen des Claude-Bundles):pnpm test:docker:plugins(Skript:scripts/e2e/plugins-docker.sh) Setzen SieOPENCLAW_PLUGINS_E2E_CLAWHUB=0, um den ClawHub-Block zu überspringen, oder überschreiben Sie das standardmäßige Kitchen-Sink-Paket-/Laufzeit-Paar mitOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECundOPENCLAW_PLUGINS_E2E_CLAWHUB_ID. OhneOPENCLAW_CLAWHUB_URL/CLAWHUB_URLverwendet der Test einen hermetischen lokalen ClawHub-Fixture-Server. - Smoke-Test für unverändertes Plugin-Update:
pnpm test:docker:plugin-update(Skript:scripts/e2e/plugin-update-unchanged-docker.sh) - Smoke-Test für Plugin-Lifecycle-Matrix:
pnpm test:docker:plugin-lifecycle-matrixinstalliert den gepackten OpenClaw-Tarball in einem nackten Container, installiert ein npm-Plugin, schaltet Aktivieren/Deaktivieren um, aktualisiert es und führt ein Downgrade über eine lokale npm-Registry durch, löscht den installierten Code und verifiziert dann, dass die Deinstallation weiterhin veralteten Zustand entfernt, während RSS-/CPU-Metriken für jede Lifecycle-Phase protokolliert werden. - Smoke-Test für Config-Reload-Metadaten:
pnpm test:docker:config-reload(Skript:scripts/e2e/config-reload-source-docker.sh) - Plugins:
pnpm test:docker:pluginsdeckt Installations-/Update-Smoke-Tests für lokalen Pfad,file:, npm-Registry mit hoisted Abhängigkeiten, bewegliche Git-Refs, ClawHub-Fixtures, Marketplace-Updates und Aktivieren/Prüfen des Claude-Bundles ab.pnpm test:docker:plugin-updatedeckt unverändertes Update-Verhalten für installierte Plugins ab.pnpm test:docker:plugin-lifecycle-matrixdeckt ressourcenverfolgte npm-Plugin-Installation, Aktivierung, Deaktivierung, Upgrade, Downgrade und Deinstallation bei fehlendem Code ab.
So bauen Sie das gemeinsam genutzte funktionale Image manuell vor und verwenden es erneut:
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-build
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channels
Suite-spezifische Image-Overrides wie OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE haben weiterhin Vorrang, wenn sie gesetzt sind. Wenn OPENCLAW_SKIP_DOCKER_BUILD=1 auf ein entferntes gemeinsam genutztes Image verweist, ziehen die Skripte es, falls es noch nicht lokal vorhanden ist. Die QR- und Installer-Docker-Tests behalten ihre eigenen Dockerfiles, weil sie Paket-/Installationsverhalten statt der gemeinsam gebauten App-Laufzeit validieren.
Die Docker-Runner für Live-Modelle binden außerdem den aktuellen Checkout schreibgeschützt ein und
stellen ihn in einem temporären Arbeitsverzeichnis innerhalb des Containers bereit. Dadurch bleibt das Laufzeit-
Image schlank, während Vitest trotzdem gegen Ihre exakte lokale Source-/Konfigurationsversion läuft.
Der Staging-Schritt überspringt große, nur lokal relevante Caches und App-Build-Ausgaben wie
.pnpm-store, .worktrees, __openclaw_vitest__ sowie app-lokale .build- oder
Gradle-Ausgabeverzeichnisse, damit Docker-Live-Läufe nicht minutenlang
maschinenspezifische Artefakte kopieren.
Sie setzen außerdem OPENCLAW_SKIP_CHANNELS=1, damit Gateway-Live-Probes keine
echten Telegram-/Discord-/usw.-Kanal-Worker innerhalb des Containers starten.
test:docker:live-models führt weiterhin pnpm test:live aus; geben Sie daher auch
OPENCLAW_LIVE_GATEWAY_* durch, wenn Sie die Gateway-Live-Abdeckung in dieser
Docker-Lane eingrenzen oder ausschließen müssen.
test:docker:openwebui ist ein höherstufiger Kompatibilitäts-Smoke: Er startet einen
OpenClaw-Gateway-Container mit aktivierten OpenAI-kompatiblen HTTP-Endpunkten,
startet einen gepinnten Open WebUI-Container gegen dieses Gateway, meldet sich über
Open WebUI an, verifiziert, dass /api/models openclaw/default bereitstellt, und sendet dann eine
echte Chat-Anfrage über den /api/chat/completions-Proxy von Open WebUI.
Der erste Lauf kann spürbar langsamer sein, weil Docker möglicherweise das
Open WebUI-Image pullen muss und Open WebUI eventuell erst seine eigene Cold-Start-Einrichtung abschließen muss.
Diese Lane erwartet einen nutzbaren Live-Model-Key, und OPENCLAW_PROFILE_FILE
(standardmäßig ~/.profile) ist der primäre Weg, ihn in Dockerisierten Läufen bereitzustellen.
Erfolgreiche Läufe geben eine kleine JSON-Nutzlast wie { "ok": true, "model": "openclaw/default", ... } aus.
test:docker:mcp-channels ist absichtlich deterministisch und benötigt kein
echtes Telegram-, Discord- oder iMessage-Konto. Es bootet einen geseedeten Gateway-
Container, startet einen zweiten Container, der openclaw mcp serve spawnt, und
verifiziert dann geroutete Konversationserkennung, Transkriptlesevorgänge, Anhangsmetadaten,
Verhalten der Live-Event-Queue, Routing ausgehender Sends sowie Channel- und
Berechtigungsbenachrichtigungen im Claude-Stil über die echte stdio-MCP-Bridge. Die Benachrichtigungsprüfung
inspiziert die rohen stdio-MCP-Frames direkt, sodass der Smoke validiert, was die
Bridge tatsächlich ausgibt, nicht nur das, was ein bestimmtes Client-SDK zufällig sichtbar macht.
test:docker:pi-bundle-mcp-tools ist deterministisch und benötigt keinen Live-
Model-Key. Es baut das Repo-Docker-Image, startet einen echten stdio-MCP-Probe-Server
innerhalb des Containers, materialisiert diesen Server über die eingebettete Pi-Bundle-
MCP-Runtime, führt das Tool aus und verifiziert dann, dass coding und messaging
bundle-mcp-Tools behalten, während minimal und tools.deny: ["bundle-mcp"] sie filtern.
test:docker:cron-mcp-cleanup ist deterministisch und benötigt keinen Live-Model-
Key. Es startet ein geseedetes Gateway mit einem echten stdio-MCP-Probe-Server, führt einen
isolierten Cron-Turn und einen /subagents spawn-One-Shot-Child-Turn aus und verifiziert dann,
dass der MCP-Child-Prozess nach jedem Lauf beendet wird.
Manueller ACP-Plain-Language-Thread-Smoke (nicht CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Behalten Sie dieses Skript für Regressions-/Debug-Workflows. Es könnte erneut für die ACP-Thread-Routing-Validierung benötigt werden; löschen Sie es daher nicht.
Nützliche Umgebungsvariablen:
OPENCLAW_CONFIG_DIR=...(Standard:~/.openclaw) wird nach/home/node/.openclawgemountetOPENCLAW_WORKSPACE_DIR=...(Standard:~/.openclaw/workspace) wird nach/home/node/.openclaw/workspacegemountetOPENCLAW_PROFILE_FILE=...(Standard:~/.profile) wird nach/home/node/.profilegemountet und vor der Testausführung eingelesenOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1, um nur Umgebungsvariablen zu verifizieren, die ausOPENCLAW_PROFILE_FILEeingelesen wurden, mit temporären Konfigurations-/Workspace-Verzeichnissen und ohne externe CLI-Auth-MountsOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(Standard:~/.cache/openclaw/docker-cli-tools) wird nach/home/node/.npm-globalfür gecachte CLI-Installationen innerhalb von Docker gemountet- Externe CLI-Auth-Verzeichnisse/-Dateien unter
$HOMEwerden schreibgeschützt unter/host-auth...gemountet und dann vor Testbeginn nach/home/node/...kopiert- Standardverzeichnisse:
.minimax - Standarddateien:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Eingegrenzte Provider-Läufe mounten nur die benötigten Verzeichnisse/Dateien, die aus
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERSabgeleitet werden - Manuelles Überschreiben mit
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=noneoder einer kommagetrennten Liste wieOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Standardverzeichnisse:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=..., um den Lauf einzugrenzenOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=..., um Provider im Container zu filternOPENCLAW_SKIP_DOCKER_BUILD=1, um ein vorhandenesopenclaw:local-live-Image für erneute Läufe wiederzuverwenden, die keinen Rebuild benötigenOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1, um sicherzustellen, dass Anmeldedaten aus dem Profil-Store stammen (nicht aus der Umgebung)OPENCLAW_OPENWEBUI_MODEL=..., um das vom Gateway für den Open WebUI-Smoke bereitgestellte Modell auszuwählenOPENCLAW_OPENWEBUI_PROMPT=..., um den vom Open WebUI-Smoke verwendeten Nonce-Check-Prompt zu überschreibenOPENWEBUI_IMAGE=..., um das gepinnte Open WebUI-Image-Tag zu überschreiben
Docs-Sanity
Führen Sie nach Dokumentationsänderungen Docs-Prüfungen aus: pnpm check:docs.
Führen Sie die vollständige Mintlify-Ankervalidierung aus, wenn Sie zusätzlich In-Page-Heading-Prüfungen benötigen: pnpm docs:check-links:anchors.
Offline-Regression (CI-sicher)
Dies sind Regressionen mit einer „echten Pipeline“ ohne echte Provider:
- Gateway-Tool-Calling (Mock-OpenAI, echtes Gateway + Agent-Loop):
src/gateway/gateway.test.ts(Fall: "runs a mock OpenAI tool call end-to-end via gateway agent loop") - Gateway-Assistent (WS
wizard.start/wizard.next, schreibt Konfiguration + Auth erzwungen):src/gateway/gateway.test.ts(Fall: "runs wizard over ws and writes auth token config")
Agent-Zuverlässigkeits-Evals (Skills)
Wir haben bereits einige CI-sichere Tests, die sich wie „Agent-Zuverlässigkeits-Evals“ verhalten:
- Mock-Tool-Calling über das echte Gateway + Agent-Loop (
src/gateway/gateway.test.ts). - End-to-End-Assistenten-Flows, die Session-Verdrahtung und Konfigurationseffekte validieren (
src/gateway/gateway.test.ts).
Was für Skills noch fehlt (siehe Skills):
- Entscheidungsfindung: Wenn Skills im Prompt aufgeführt sind, wählt der Agent den richtigen Skill (oder vermeidet irrelevante)?
- Compliance: Liest der Agent
SKILL.mdvor der Nutzung und befolgt er erforderliche Schritte/Argumente? - Workflow-Verträge: Multi-Turn-Szenarien, die Tool-Reihenfolge, Übernahme des Session-Verlaufs und Sandbox-Grenzen prüfen.
Zukünftige Evals sollten zuerst deterministisch bleiben:
- Ein Szenario-Runner mit Mock-Providern, der Tool-Aufrufe + Reihenfolge, Skill-Dateilesevorgänge und Session-Verdrahtung prüft.
- Eine kleine Suite skill-fokussierter Szenarien (verwenden vs. vermeiden, Gating, Prompt Injection).
- Optionale Live-Evals (Opt-in, env-gesteuert) erst, nachdem die CI-sichere Suite vorhanden ist.
Vertragstests (Plugin- und Channel-Shape)
Vertragstests verifizieren, dass jedes registrierte Plugin und jeder registrierte Channel seinem
Interface-Vertrag entspricht. Sie iterieren über alle gefundenen Plugins und führen eine Suite von
Shape- und Verhaltensassertions aus. Die standardmäßige pnpm test-Unit-Lane überspringt diese gemeinsam genutzten Seam- und Smoke-Dateien absichtlich; führen Sie die Contract-Befehle explizit aus,
wenn Sie gemeinsame Channel- oder Provider-Oberflächen berühren.
Befehle
- Alle Verträge:
pnpm test:contracts - Nur Channel-Verträge:
pnpm test:contracts:channels - Nur Provider-Verträge:
pnpm test:contracts:plugins
Channel-Verträge
Befinden sich in src/channels/plugins/contracts/*.contract.test.ts:
- plugin - Grundlegender Plugin-Shape (ID, Name, Fähigkeiten)
- setup - Setup-Assistent-Vertrag
- session-binding - Verhalten der Session-Bindung
- outbound-payload - Nachrichten-Payload-Struktur
- inbound - Verarbeitung eingehender Nachrichten
- actions - Channel-Action-Handler
- threading - Verarbeitung von Thread-IDs
- directory - Directory-/Roster-API
- group-policy - Durchsetzung der Gruppenrichtlinie
Provider-Status-Verträge
Befinden sich in src/plugins/contracts/*.contract.test.ts.
- status - Channel-Status-Probes
- registry - Plugin-Registry-Shape
Provider-Verträge
Befinden sich in src/plugins/contracts/*.contract.test.ts:
- auth - Auth-Flow-Vertrag
- auth-choice - Auth-Auswahl/Selektion
- catalog - Modellkatalog-API
- discovery - Plugin-Erkennung
- loader - Plugin-Laden
- runtime - Provider-Runtime
- shape - Plugin-Shape/-Interface
- wizard - Setup-Assistent
Ausführungszeitpunkt
- Nach Änderungen an plugin-sdk-Exports oder Subpaths
- Nach dem Hinzufügen oder Ändern eines Channel- oder Provider-Plugins
- Nach dem Refactoring von Plugin-Registrierung oder -Erkennung
Vertragstests laufen in CI und benötigen keine echten API-Keys.
Regressionen hinzufügen (Anleitung)
Wenn Sie ein Provider-/Modellproblem beheben, das live entdeckt wurde:
- Fügen Sie nach Möglichkeit eine CI-sichere Regression hinzu (Mock-/Stub-Provider oder Erfassung der exakten Request-Shape-Transformation)
- Wenn es von Natur aus nur live prüfbar ist (Rate Limits, Auth-Richtlinien), halten Sie den Live-Test schmal und per Umgebungsvariablen opt-in
- Zielen Sie bevorzugt auf die kleinste Ebene, die den Fehler abfängt:
- Provider-Request-Konvertierungs-/Replay-Bug → direkter Modelltest
- Gateway-Session-/History-/Tool-Pipeline-Bug → Gateway-Live-Smoke oder CI-sicherer Gateway-Mock-Test
- SecretRef-Traversal-Guardrail:
src/secrets/exec-secret-ref-id-parity.test.tsleitet aus Registry-Metadaten (listSecretTargetRegistryEntries()) ein gesampeltes Ziel pro SecretRef-Klasse ab und assertet dann, dass Exec-IDs mit Traversal-Segmenten abgelehnt werden.- Wenn Sie eine neue
includeInPlan-SecretRef-Zielfamilie insrc/secrets/target-registry-data.tshinzufügen, aktualisieren SieclassifyTargetClassin diesem Test. Der Test schlägt absichtlich bei unklassifizierten Ziel-IDs fehl, damit neue Klassen nicht stillschweigend übersprungen werden können.