CommunityCodierung & Entwicklunggithub.com

openclaw-test-performance

Benchmarken, Diagnostizieren und Optimieren der Laufzeit, Import-Hotspots, CPU/RSS, Heap-Wachstum und langsamer Code-Pfade von OpenClaw-Tests und Plugin-Suites.

Was ist openclaw-test-performance?

Diese Skill-Anleitung beschreibt einen evidenzbasierten Workflow zur Leistungsoptimierung von OpenClaw-Tests und Plugin-Suites. Sie richtet sich an Entwickler, die die Geschwindigkeit und den Speicherverbrauch realer `pnpm test`-Ausführungen, Plugin-Suites und Plugin-Inspector-Läufe verbessern möchten, während die Testabdeckung erhalten bleibt. Der Ansatz priorisiert klare Metrik-Erfassung (Wanduhrzeit, Vitest-Dauer, Import-Dauer, maximaler RSS, CPU/Systemzeit) vor Codeänderungen, identifiziert gängige Ursachen wie breite Barrel-Imports oder unnötige Laufzeitlasten von statischen Metadaten, und bietet sowohl für einzelne Dateien als auch für ganze Suiten spezifische Benchmark-Befehle. Die Anleitung unterstützt OpenClaw-spezifische Plattformen wie Testbox und Package Acceptance und legt großen Wert auf reproduzierbare Messungen, gezielte Änderungen und die Dokumentation von Vorher/Nachher-Vergleichen in einem standardisierten Berichtsformat.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/clawdbot/clawdbot/tree/main/.agents/skills/openclaw-test-performance

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

OpenClaw Test Performance

Verwende zuerst Beweise. Das Ziel ist eine echte pnpm test-, Plugin-Suite- und Plugin-Inspector-Geschwindigkeits-/RSS-Verbesserung bei intakter Abdeckung, nicht Runner-Optimierung durch Raten.

Arbeitsablauf

  1. Lies die relevanten lokalen AGENTS.md-Dateien, bevor du Änderungen vornimmst:
    • src/agents/AGENTS.md für Agenten/Import-Hotspots.
    • src/channels/AGENTS.md und src/plugins/AGENTS.md für Plugin/Channel-Trägheit.
    • src/gateway/AGENTS.md für Serverlebenszyklus-Tests.
    • test/helpers/AGENTS.md und src/channels/plugins/contracts/test-helpers/AGENTS.md für gemeinsame Contract-Helfer.
    • src/infra/outbound/AGENTS.md für Outbound/Medien/Aktions-Tests.
  2. Erstelle eine Basislinie, bevor du Code änderst:
    • Bevorzuge pnpm test:perf:groups --full-suite --allow-failures --output <datei> für das Ranking der gesamten Suite.
    • Für die Breite gebündelter Plugins führe den kleinsten relevanten pnpm test:extensions:batch <plugin[,plugin...]>- oder Plugin-Inspector-Befehl aus, bevor du zum vollständigen Extension-Durchlauf springst.
    • Für einen eingegrenzten Hotspot verwende: /usr/bin/time -l pnpm test <datei-oder-dateien> --maxWorkers=1 --reporter=verbose
    • Bei Import-Verdacht füge hinzu: OPENCLAW_VITEST_IMPORT_DURATIONS=1 OPENCLAW_VITEST_PRINT_IMPORT_BREAKDOWN=1.
  3. Trenne Wand-/Runner-Rauschen von echten Dateikosten:
    • Vergleiche Vitest-Dauer, Testkörper-Zeit, Import-Aufschlüsselung, Wandzeit und maximalen RSS.
    • Führe einzelne Dateien erneut aus, wenn die Zahlen der Gruppe/vollen Suite veraltet oder verrauscht erscheinen.
    • Wenn ein Gruppenlauf der gesamten Suite einen Lane-Fehler meldet, JSON aber bestandene Tests anzeigt, erfasse dies als Rauschen und überprüfe die verdächtige Datei direkt.
  4. Wähle den nächsten Angriffspunkt nach Ertrag und Risiko:
    • Hoher Ertrag: Eine Datei/ein Test dominiert Sekunden oder RSS und hat eine klare Ursache.
    • Hohe Hebelwirkung: Ein Plugin- oder SDK-Barrel führt dazu, dass jeder Plugin-Inspector- oder Extension-Batch-Lauf die breite Laufzeit lädt.
    • Geringeres Risiko: Statische Deskriptoren, Zielparsing, Routing, Auth-Bypass, Setup-Hinweise, Registry-Fixtures oder Testserver-Lebenszyklus.
    • Höheres Risiko: Echtes Speicher-/Laufzeitverhalten, Live-Anbieter, Protokoll- Contracts oder breite Produktions-Refactorings.
  5. Behebe die Grundursache, nicht das Symptom:
    • Verschiebe statische Metadaten/Parsing in schmale Helfer oder leichtgewichtige Artefakte, die von der vollständigen Laufzeit und schnellen Pfaden wiederverwendet werden.
    • Bevorzuge Dependency Injection, Suche nur nach geladenen Plugins, explizite Fixtures und reine Helfer gegenüber breiten Mocks.
    • Verwende Suite-Level-Server/Clients wieder, wenn ein neuer Handshake irrelevant ist.
    • Halte Scheduler/Hintergrundschleifen ausgeschaltet, es sei denn, der Test beweist Scheduling.
    • Verschiebe in Plugin-Pfaden statische Metadaten in Manifest/leichtgewichtige Artefakte und halte Laufzeit-Plugin-Lasten hinter expliziten Ausführungsgrenzen.
  6. Bewahre die Abdeckungsstruktur:
    • Lösche keinen langsamen Integrationsnachweis, es sei denn, die exakte Produktions- Komposition wird in einen benannten Helfer extrahiert und getestet.
    • Behalte einen billigen Integrations-Smoke-Test bei, wenn die komponentenübergreifende Verdrahtung wichtig ist.
    • Gib explizit an, welche zufällige Abdeckung entfernt wurde, falls vorhanden.
  7. Wiederhole die Benchmark mit demselben Befehl nach der Änderung und berechne Sekunden sowie prozentualen Gewinn.
  8. Aktualisiere den laufenden Bericht, wenn dies angefordert wird oder dieser Thread einen verfolgt. Füge Vorher/Nachher-Befehle, Artefakte, Abdeckungshinweise, Verifizierung und nächste Angriffsreihenfolge hinzu.
  9. Stage die beabsichtigten Pfade, committe mit Standard-Git und pushe, wenn der Benutzer um Commits/Pushes gebeten hat. Stage nur Dateien, die für diesen Angriff berührt wurden.

Plugin-Suite-Workflow

Verwende diesen Abschnitt, wenn Perf-Arbeit gebündelte Plugins, Plugin-Inspector, SDK-Barrels, Package-Grenz-Tests oder Extension-Suiten umfasst.

  1. Kartiere zuerst die Suite-Struktur:
    • Quell-Tests: pnpm test extensions/<id> oder pnpm test:extensions:batch <id>
    • Package-Grenzen: pnpm run test:extensions:package-boundary:canary und pnpm run test:extensions:package-boundary:compile
    • alle gebündelten Quell-Tests: pnpm test:extensions
    • Plugin-Import-Speicher: pnpm test:extensions:memory -- --json .artifacts/test-perf/extensions-memory.json
    • Plugin-Inspector/Report-Arbeit: halte Report-Primitive in plugin-inspector; halte Wrapper dünn und sammle den maximalen RSS, wenn der Befehl dies unterstützt.
  2. Beginne eng, dann erweitern:
    • ein geändertes Plugin: führe die Tests dieses Plugins und den Plugin-Inspector-Teil aus.
    • geändertes SDK/öffentliches Barrel: füge repräsentative Provider-, Channel-, Memory-, und Feature-Plugins hinzu.
    • geänderter Loader/Runtime-Spiegel: füge Package-Grenz-Prüfungen und Build/Package- Nachweis nach Bedarf hinzu.
    • unbekanntes gemeinsames Plugin-Verhalten: führe test:extensions:batch-Gruppen vor pnpm test:extensions aus.
  3. Behandle Plugin-Inspector-Fehler als Produktsignale:
    • JSON muss parsen.
    • Warnungen/Fehler müssen klassifiziert, nicht versteckt werden.
    • Die Laufzeiterfassung sollte leise und konfigurationstolerant sein.
    • Die Befehlsausgabe sollte Wandzeit, Exit-Code und maximalen RSS enthalten, wenn verfügbar.
  4. Folge $openclaw-testing für die Host-Auswahl. Vertrauenswürdige Quell-Benchmarks können lokal mit vergleichbaren Maschinen-/Lastbedingungen ausgeführt werden. Verwende $crabbox, wenn sauberes Packaging, Linux/Plattform-Verhalten, Isolation oder eine explizite Remote- Anforderung Teil des Nachweises sind; verwende den gemieteten Lease erneut und räume nur ihn auf.
  5. Wenn die Plugin-Leistung package-artefaktempfindlich ist, wechsle zu release-openclaw-plugin-testing und Package Acceptance, anstatt sich nur auf Quell-Timing zu verlassen.

Metriksammlung

Sammle vor und nach der Änderung mindestens eine stabile Metrik. Bevorzuge dieselbe Maschine und denselben Befehl. Verwende für Testbox-Vergleiche nach Möglichkeit dieselbe tbx_...-ID.

MetrikVerwendung fürBevorzugte Quelle
Wandzeitbenutzersichtbare Suite-Kosten/usr/bin/time -l, Test-Wrapper-Dauer, Testbox-Laufzeit
Vitest-DauerTestkörper/Import-KostenVitest-Ausgabe pro Datei/Shard
Import-Dauerbreite Barrel-/Laufzeit-LadungenOPENCLAW_VITEST_IMPORT_DURATIONS=1
max RSSSpeicherdruck und OOM-Risiko/usr/bin/time -l, pnpm test:extensions:memory, Wrapper-Speicherzusammenfassungen
CPU/user/sysCPU-gebunden vs. Warte-gebunden-Aufteilung/usr/bin/time -l lokal, Testbox-Job-Timing bei verrauschter lokaler CPU
Heap-Nachweisechtes Leck vs. beibehaltenes Modulgraphopenclaw-test-heap-leaks-Workflow

Lokaler eingegrenzter Befehl mit CPU/RSS:

timeout 240 /usr/bin/time -l pnpm test <datei> --maxWorkers=1 --reporter=verbose

Plugin-Import-Speicherprofil:

pnpm build
pnpm test:extensions:memory -- --top 20 --json .artifacts/test-perf/extensions-memory.json

Gezieltes Plugin-Import-Speicherprofil:

pnpm test:extensions:memory -- --extension discord --extension telegram --skip-combined

Heap/RSS-Eskalation:

pnpm test:perf:groups \
  --config test/vitest/vitest.unit-fast.config.ts \
  --allow-failures \
  --output .artifacts/test-perf/unit-fast-memory.json
pnpm test:perf:profile:runner -- \
  --output-dir .artifacts/test-perf/vitest-runner-profile -- <datei>

Verwende openclaw-test-heap-leaks, wenn der RSS über Intervalle hinweg weiter wächst, Worker OOM werden oder der verdächtige Befehl App-Objekt-Retention aufweist. Bezeichne RSS-Wachstum erst als Leck, wenn Snapshots oder Retainer dies unterstützen.

Häufige Ursachen

  • Vollständig gebündelte Channel-/Plugin-Laufzeit wird für statische Daten geladen.
  • getChannelPlugin()-Fallback wird verwendet, obwohl ein bereits geladener Fixture oder reiner Parser ausreichen würde.
  • Breite api.ts, runtime-api.ts, test-api.ts oder Plugin-SDK-Barrels werden in heiße Tests gezogen.
  • SDK-Root-Alias oder Package-Barrels ziehen fokussierte Unterpfade zurück in einen breiten Plugin-Graphen.
  • Plugin-Inspector lädt Laufzeitcode nur, um Metadaten, Reports oder CI-Richtlinienergebnisse darzustellen.
  • Gebündelte Plugin-Erfassung verwendet echten Konfigurations-/Home-Zustand anstelle von synthetischem, redigiertem, isoliertem Zustand.
  • Teilweise echte Mocks verwenden importActual() um breite Module.
  • vi.resetModules() plus frische Imports in Pro-Test-Schleifen.
  • Test-Plugin-Registry wird in beforeAll initialisiert, während der Laufzeitzustand in afterEach zurückgesetzt wird.
  • Pro-Test-Gateway/Server/Client-Start, obwohl ein Zustands-Reset ausreichen würde.
  • Standardlaufzeit/modell/Auth-Auswahl wird von Leerlauf-Snapshots oder Fixtures bezahlt.
  • Plugin-eigene Medien-/Aktionserkennung wird ausgelöst, bevor geprüft wird, ob Argumente Plugin-eigene Felder enthalten.
  • Parallele Vitest-Läufe teilen sich node_modules/.experimental-vitest-cache ohne unterschiedliche OPENCLAW_VITEST_FS_MODULE_CACHE_PATH-Werte.

Benchmark-Befehle

Eingegrenzte Datei:

timeout 240 /usr/bin/time -l pnpm test <datei> --maxWorkers=1 --reporter=verbose

Eingegrenzte Datei mit Import-Aufschlüsselung:

timeout 240 /usr/bin/time -l env \
  OPENCLAW_VITEST_IMPORT_DURATIONS=1 \
  OPENCLAW_VITEST_PRINT_IMPORT_BREAKDOWN=1 \
  pnpm test <datei> --maxWorkers=1 --reporter=verbose

Gruppierte Suite:

pnpm test:perf:groups --full-suite --allow-failures \
  --output .artifacts/test-perf/<name>.json

Extension-Batch:

pnpm test:extensions:batch <plugin[,plugin...]> -- --reporter=verbose

Alle Extension-Tests:

pnpm test:extensions

Package-Grenz-Plugin-Prüfungen:

pnpm run test:extensions:package-boundary:canary
pnpm run test:extensions:package-boundary:compile

Vorhandenen Vitest-JSON-Report wiederverwenden:

pnpm test:perf:groups --report <vitest-json> \
  --output .artifacts/test-perf/<name>.json

Verifizierung

  • Führe immer die gezielte Testoberfläche aus, die die Änderung beweist.
  • Folge den OpenClaw-Testrichtlinien für fokussierte Tests, erforderliche Builds, Beweis-Routing und Veröffentlichungszeitpunkt.
  • Für reine Teständerungen führe die exakt bearbeiteten Tests mit dem unterstützten Befehl des Eigentümers aus.
  • Für Änderungen am Plugin-SDK/Barrel/Runtime vergleiche exakte Commits mit pnpm plugin-sdk:api:diff -- --base <base-sha> --head <head-sha>, wenn die öffentliche API-Oberfläche abweichen könnte. Verwende für PR-lokale Beweise die Merge-Basis des Branches als <base-sha> und den exakt getesteten Head-Commit als <head-sha>.
  • Für Plugin-Suite-Perf-Fixes verifiziere mindestens einen repräsentativen Plugin-Batch plus das geänderte Gate; verwende Package Acceptance, wenn der Fehler nur in einem gepackten Artefakt existiert.
  • Für fehlende oder veraltete Abhängigkeiten folge den Quellabhängigkeiten und den aktuellen Owner-Anweisungen des Arbeitsbaums. Verwende eine qualifizierte Beweisroute.
  • Verwende das Berichtsformat:
| Metrik          | Vorher |  Nachher |          Gewinn |
| --------------- | -----: | -------: | --------------: |
| Datei-Wandzeit  |   `Xs` |     `Ys` |  `-Zs` (`P%`)   |
| Max RSS         |  `XMB` |    `YMB` | `-ZMB` (`P%`)   |
| CPU user/sys    | `X/Ys` |   `A/Bs` |       erklären  |

Übergabe

Halte die Zusammenfassung kurz:

  • Grundursache.
  • Suite-/Plugin-Umfang.
  • Geänderte Dateien.
  • Vorher/Nachher-Wand-, Vitest-/Import-, CPU- und RSS-Zahlen, wo verfügbar.
  • Leck-Klassifizierung, falls Speicher involviert war: echtes Leck, beibehaltenes Modulgraph oder nicht schlüssig.
  • Abdeckung beibehalten.
  • Verifizierungsbefehle.
  • Testbox-ID oder Workflow-URL für den Remote-Nachweis.
  • Commit-Hash und Push-Status.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

1password

Set up and use 1Password CLI for sign-in, desktop integration, and reading or injecting secrets.

acp-router

Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode, Gemini CLI, Grok Build, Qwen, Kiro, Kimi, iFlow, Factory Droid, Kilocode, or explicit ACP harness work into either OpenClaw ACP runtime sessions or direct acpx-driven sessions ("telephone game" flow). For coding-agent thread requests, read this skill first, then use only `sessions_spawn` for thread creation. Codex chat binding defaults to the native Codex app-server plugin unless ACP is explicit or background spawn needs ACP.

add-model-provider

Add and live-prove a model provider with non-interactive config one-liners, without exposing credentials.

agent-transcript

Requested GitHub PR/issue agent transcripts: redact, trim, preview, and insert safely.

apple-notes

Create, view, edit, delete, search, move, or export Apple Notes via the memo CLI on macOS.

apple-reminders

List, add, edit, complete, or delete Apple Reminders and reminder lists via remindctl.

auto-qa

Run OpenClaw-wide autonomous QA and live/stress campaigns across independent subsystem lanes, with verified fixes and a resumable evidence report.

autoreview

Structured code review through the shared OpenClaw agent-skills installation.

bear-notes

Create, search, and manage Bear notes via grizzly CLI.

blacksmith-testbox

Run Blacksmith Testbox for CI-parity checks, secrets, hosted services, migrations, or builds local cannot reproduce.

block-kit

Use proactively for structured or interactive Slack replies, and when asked to author or validate native Slack Block Kit JSON.

blogwatcher

Monitor blogs and RSS/Atom feeds for updates using the blogwatcher CLI.

blucli

BluOS CLI (blu) for discovery, playback, grouping, and volume.

bluebubbles

Send and manage iMessages via BlueBubbles, including attachments, tapbacks, edits, replies, and groups.

browser-automation

Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs/timeouts.

camsnap

Capture frames or clips from RTSP/ONVIF cameras and local webcams, including USB pan/tilt/zoom control.

canvas

Present HTML on connected OpenClaw node canvases, navigate/eval/snapshot, and debug canvas host URLs.

channel-message-flows

Use when running QA Lab channel message flow evidence.

clawdtributor

Clawtributor PRs here, last week or another window: discover conversation refs, recheck GitHub, rank by impact.

clawhub

Search ClawHub for plugins by default, or skills when explicitly requested; install, verify, update, uninstall, publish, or sync skills.

Verwandte Skills