OpenClaw dispose de trois suites Vitest (unitaires/intégration, e2e, live) et d’un petit ensemble d’exécuteurs Docker. Ce document est un guide « comment nous testons » :Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
- Ce que couvre chaque suite (et ce qu’elle ne couvre délibérément pas).
- Quelles commandes exécuter pour les workflows courants (local, pré-push, débogage).
- Comment les tests live découvrent les identifiants et sélectionnent les modèles/fournisseurs.
- Comment ajouter des régressions pour les problèmes réels de modèles/fournisseurs.
La pile QA (qa-lab, qa-channel, voies de transport live) est documentée séparément :
- Vue d’ensemble QA - architecture, surface de commandes, création de scénarios.
- QA matricielle - référence pour
pnpm openclaw qa matrix. - Canal QA - le plugin de transport synthétique utilisé par les scénarios adossés au dépôt.
qa concrètes et renvoie aux références ci-dessus.Démarrage rapide
La plupart du temps :- Barrière complète (attendue avant push) :
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Exécution plus rapide de toute la suite locale sur une machine confortable :
pnpm test:max - Boucle de surveillance Vitest directe :
pnpm test:watch - Le ciblage direct de fichiers route désormais aussi les chemins d’extensions/canaux :
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Préférez d’abord les exécutions ciblées lorsque vous itérez sur un seul échec.
- Site QA adossé à Docker :
pnpm qa:lab:up - Voie QA adossée à une VM Linux :
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
- Barrière de couverture :
pnpm test:coverage - Suite E2E :
pnpm test:e2e
- Suite live (modèles + sondes d’outils/images du Gateway) :
pnpm test:live - Cibler silencieusement un fichier live :
pnpm test:live -- src/agents/models.profiles.live.test.ts - Rapports de performances d’exécution : déclenchez
OpenClaw Performanceaveclive_gpt54=truepour un vrai tour d’agentopenai/gpt-5.4oudeep_profile=truepour des artefacts CPU/tas/trace Kova. Les exécutions planifiées quotidiennes publient des artefacts des voies fournisseur simulé, profil profond et GPT 5.4 versopenclaw/clawgrit-reportslorsqueCLAWGRIT_REPORTS_TOKENest configuré. Le rapport fournisseur simulé inclut aussi les chiffres de démarrage du Gateway au niveau source, mémoire, pression des plugins, boucle de salutation répétée avec faux modèle et démarrage CLI. - Balayage live des modèles Docker :
pnpm test:docker:live-models- Chaque modèle sélectionné exécute désormais un tour texte plus une petite sonde de type lecture de fichier.
Les modèles dont les métadonnées annoncent une entrée
imageexécutent aussi un petit tour image. Désactivez les sondes supplémentaires avecOPENCLAW_LIVE_MODEL_FILE_PROBE=0ouOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0lors de l’isolation des échecs de fournisseur. - Couverture CI : les workflows quotidiens
OpenClaw Scheduled Live And E2E Checkset manuelsOpenClaw Release Checksappellent tous deux le workflow live/E2E réutilisable avecinclude_live_suites: true, ce qui inclut des jobs distincts de matrice live Docker par fragments de fournisseur. - Pour des relances CI ciblées, déclenchez
OpenClaw Live And E2E Checks (Reusable)avecinclude_live_suites: trueetlive_models_only: true. - Ajoutez les nouveaux secrets fournisseur à fort signal dans
scripts/ci-hydrate-live-auth.shainsi que.github/workflows/openclaw-live-and-e2e-checks-reusable.ymlet ses appelants planifiés/release.
- Chaque modèle sélectionné exécute désormais un tour texte plus une petite sonde de type lecture de fichier.
Les modèles dont les métadonnées annoncent une entrée
- Smoke test de discussion liée Codex natif :
pnpm test:docker:live-codex-bind- Exécute une voie live Docker contre le chemin serveur d’application Codex, lie un DM Slack synthétique
avec
/codex bind, exerce/codex fastet/codex permissions, puis vérifie qu’une réponse simple et une pièce jointe image passent par la liaison native du plugin au lieu d’ACP.
- Exécute une voie live Docker contre le chemin serveur d’application Codex, lie un DM Slack synthétique
avec
- Smoke test du harnais serveur d’application Codex :
pnpm test:docker:live-codex-harness- Exécute des tours d’agent Gateway via le harnais serveur d’application Codex détenu par le plugin,
vérifie
/codex statuset/codex models, et exerce par défaut les sondes image, MCP Cron, sous-agent et Guardian. Désactivez la sonde sous-agent avecOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0lors de l’isolation d’autres échecs du serveur d’application Codex. Pour une vérification ciblée du sous-agent, désactivez les autres sondes :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. Cela quitte après la sonde sous-agent sauf siOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0est défini.
- Exécute des tours d’agent Gateway via le harnais serveur d’application Codex détenu par le plugin,
vérifie
- Smoke test d’installation Codex à la demande :
pnpm test:docker:codex-on-demand- Installe le tarball OpenClaw empaqueté dans Docker, exécute l’onboarding par clé API OpenAI,
et vérifie que le plugin Codex ainsi que la dépendance
@openai/codexont été téléchargés à la demande dans la racine npm gérée.
- Installe le tarball OpenClaw empaqueté dans Docker, exécute l’onboarding par clé API OpenAI,
et vérifie que le plugin Codex ainsi que la dépendance
- Smoke test live de dépendance d’outil de plugin :
pnpm test:docker:live-plugin-tool- Empaquète un plugin fixture avec une vraie dépendance
slugify, l’installe vianpm-pack:, vérifie la dépendance sous la racine npm gérée, puis demande à un modèle OpenAI live d’appeler l’outil du plugin et de renvoyer le slug masqué.
- Empaquète un plugin fixture avec une vraie dépendance
- Smoke test de commande de secours Crestodian :
pnpm test:live:crestodian-rescue-channel- Vérification opt-in renforcée de la surface de commande de secours du canal de messages.
Elle exerce
/crestodian status, met en file d’attente un changement persistant de modèle, répond/crestodian yes, et vérifie le chemin d’écriture audit/config.
- Vérification opt-in renforcée de la surface de commande de secours du canal de messages.
Elle exerce
- Smoke test Docker du planificateur Crestodian :
pnpm test:docker:crestodian-planner- Exécute Crestodian dans un conteneur sans configuration avec un faux CLI Claude sur
PATHet vérifie que le repli du planificateur flou se traduit par une écriture de configuration typée auditée.
- Exécute Crestodian dans un conteneur sans configuration avec un faux CLI Claude sur
- Smoke test Docker de première exécution Crestodian :
pnpm test:docker:crestodian-first-run- Démarre depuis un répertoire d’état OpenClaw vide, route
openclawnu vers Crestodian, applique des écritures setup/modèle/agent/plugin Discord + SecretRef, valide la configuration et vérifie les entrées d’audit. Le même chemin de configuration Ring 0 est aussi couvert dans QA Lab parpnpm openclaw qa suite --scenario crestodian-ring-zero-setup.
- Démarre depuis un répertoire d’état OpenClaw vide, route
- Smoke test de coût Moonshot/Kimi : avec
MOONSHOT_API_KEYdéfini, exécutezopenclaw models list --provider moonshot --json, puis exécutez unopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonisolé contremoonshot/kimi-k2.6. Vérifiez que le JSON indique Moonshot/K2.6 et que la transcription de l’assistant stockeusage.costnormalisé.
Exécuteurs propres à QA
Ces commandes complètent les suites de tests principales lorsque vous avez besoin du réalisme de QA-lab : La CI exécute QA Lab dans des workflows dédiés. La parité agentique est imbriquée sousQA-Lab - All Lanes et la validation de release, pas dans un workflow PR autonome.
La validation large doit utiliser Full Release Validation avec
rerun_group=qa-parity ou le groupe QA des vérifications de release. Les vérifications
de release stables/par défaut gardent le soak live/Docker exhaustif derrière run_release_soak=true ; le
profil full force le soak. QA-Lab - All Lanes
s’exécute chaque nuit sur main et depuis un déclenchement manuel avec la voie de parité simulée, la voie Matrix live, la voie Telegram live gérée par Convex et la voie Discord live gérée par Convex comme jobs parallèles. Les vérifications QA planifiées et de release passent explicitement
Matrix --profile fast, tandis que le CLI Matrix et l’entrée de workflow manuelle
restent par défaut sur all ; le déclenchement manuel peut fragmenter all en jobs transport,
media, e2ee-smoke, e2ee-deep et e2ee-cli. OpenClaw Release Checks exécute la parité ainsi que les voies rapides Matrix et Telegram avant l’approbation de release, en utilisant mock-openai/gpt-5.5 pour les vérifications de transport de release afin qu’elles restent
déterministes et évitent le démarrage normal du plugin fournisseur. Ces Gateways de transport live
désactivent la recherche mémoire ; le comportement mémoire reste couvert par les suites de parité QA.
Les fragments live media de release complète utilisent
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, qui dispose déjà de
ffmpeg et ffprobe. Les fragments live Docker modèle/backend utilisent l’image partagée
ghcr.io/openclaw/openclaw-live-test:<sha> construite une fois par commit sélectionné,
puis la récupèrent avec OPENCLAW_SKIP_DOCKER_BUILD=1 au lieu de reconstruire
dans chaque fragment.
pnpm openclaw qa suite- Exécute les scénarios QA adossés au dépôt directement sur l’hôte.
- Exécute plusieurs scénarios sélectionnés en parallèle par défaut avec des
workers Gateway isolés.
qa-channelutilise par défaut une concurrence de 4 (limitée par le nombre de scénarios sélectionnés). Utilisez--concurrency <count>pour ajuster le nombre de workers, ou--concurrency 1pour l’ancien lane série. - Se termine avec un code non nul si un scénario échoue. Utilisez
--allow-failureslorsque vous voulez des artefacts sans code de sortie en échec. - Prend en charge les modes fournisseur
live-frontier,mock-openaietaimock.aimockdémarre un serveur fournisseur local adossé à AIMock pour une couverture expérimentale des fixtures et des mocks de protocole sans remplacer le lanemock-openaisensible aux scénarios.
pnpm test:plugins:kitchen-sink-live- Exécute le gauntlet live du plugin OpenAI Kitchen Sink via QA Lab. Il
installe le package externe Kitchen Sink, vérifie l’inventaire de surface du
SDK de plugin, sonde
/healthzet/readyz, enregistre les preuves CPU/RSS du Gateway, exécute un tour OpenAI live et vérifie les diagnostics adversariaux. Nécessite une authentification OpenAI live telle queOPENAI_API_KEY. Dans les sessions Testbox hydratées, il source automatiquement le profil live-auth Testbox lorsque l’assistantopenclaw-testbox-envest présent.
- Exécute le gauntlet live du plugin OpenAI Kitchen Sink via QA Lab. Il
installe le package externe Kitchen Sink, vérifie l’inventaire de surface du
SDK de plugin, sonde
pnpm test:gateway:cpu-scenarios- Exécute le banc de démarrage du Gateway ainsi qu’un petit pack de scénarios
QA Lab mock (
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) et écrit un résumé combiné des observations CPU sous.artifacts/gateway-cpu-scenarios/. - Signale par défaut uniquement les observations de CPU élevé soutenu
(
--cpu-core-warnplus--hot-wall-warn-ms), afin que les courts pics de démarrage soient enregistrés comme métriques sans ressembler à la régression de Gateway bloqué pendant plusieurs minutes. - Utilise les artefacts
distconstruits ; exécutez d’abord une build lorsque le checkout ne contient pas déjà une sortie runtime fraîche.
- Exécute le banc de démarrage du Gateway ainsi qu’un petit pack de scénarios
QA Lab mock (
pnpm openclaw qa suite --runner multipass- Exécute la même suite QA dans une VM Linux Multipass jetable.
- Conserve le même comportement de sélection de scénarios que
qa suitesur l’hôte. - Réutilise les mêmes indicateurs de sélection fournisseur/modèle que
qa suite. - Les exécutions live transmettent les entrées d’authentification QA prises en
charge qui sont pratiques pour l’invité : clés fournisseur basées sur l’env,
chemin de configuration du fournisseur live QA et
CODEX_HOMElorsqu’il est présent. - Les répertoires de sortie doivent rester sous la racine du dépôt afin que l’invité puisse réécrire via l’espace de travail monté.
- Écrit le rapport QA et le résumé normaux, plus les journaux Multipass sous
.artifacts/qa-e2e/....
pnpm qa:lab:up- Démarre le site QA adossé à Docker pour le travail QA de type opérateur.
pnpm test:docker:npm-onboard-channel-agent- Construit une tarball npm depuis le checkout actuel, l’installe globalement dans Docker, exécute l’onboarding non interactif avec clé API OpenAI, configure Telegram par défaut, vérifie que le runtime du plugin packagé se charge sans réparation de dépendances au démarrage, exécute doctor, puis exécute un tour d’agent local contre un endpoint OpenAI mocké.
- Utilisez
OPENCLAW_NPM_ONBOARD_CHANNEL=discordpour exécuter le même lane d’installation packagée avec Discord.
pnpm test:docker:session-runtime-context- Exécute un smoke Docker déterministe d’application construite pour les
transcriptions de contexte runtime embarqué. Il vérifie que le contexte
runtime OpenClaw masqué est persisté comme message personnalisé non affiché
au lieu de fuiter dans le tour utilisateur visible, puis amorce une session
JSONL cassée affectée et vérifie que
openclaw doctor --fixla réécrit vers la branche active avec une sauvegarde.
- Exécute un smoke Docker déterministe d’application construite pour les
transcriptions de contexte runtime embarqué. Il vérifie que le contexte
runtime OpenClaw masqué est persisté comme message personnalisé non affiché
au lieu de fuiter dans le tour utilisateur visible, puis amorce une session
JSONL cassée affectée et vérifie que
pnpm test:docker:npm-telegram-live- Installe un package candidat OpenClaw dans Docker, exécute l’onboarding du package installé, configure Telegram via la CLI installée, puis réutilise le lane QA Telegram live avec ce package installé comme Gateway SUT.
- Le wrapper monte uniquement la source du harness
qa-labdepuis le checkout ; le package installé possèdedist,openclaw/plugin-sdket le runtime de plugins groupés afin que le lane ne mélange pas les plugins du checkout actuel dans le package testé. - Utilise par défaut
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta; définissezOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzouOPENCLAW_CURRENT_PACKAGE_TGZpour tester une tarball locale résolue au lieu d’installer depuis le registre. - Utilise les mêmes identifiants env Telegram ou la même source d’identifiants
Convex que
pnpm openclaw qa telegram. Pour l’automatisation CI/release, définissezOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexainsi queOPENCLAW_QA_CONVEX_SITE_URLet le secret de rôle. SiOPENCLAW_QA_CONVEX_SITE_URLet un secret de rôle Convex sont présents en CI, le wrapper Docker sélectionne automatiquement Convex. - Le wrapper valide l’env d’identifiants Telegram ou Convex sur l’hôte avant
le travail de build/installation Docker. Définissez
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1uniquement lorsque vous déboguez délibérément la configuration préalable aux identifiants. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainerremplace leOPENCLAW_QA_CREDENTIAL_ROLEpartagé uniquement pour ce lane.- GitHub Actions expose ce lane comme workflow mainteneur manuel
NPM Telegram Beta E2E. Il ne s’exécute pas lors d’un merge. Le workflow utilise l’environnementqa-live-sharedet les baux d’identifiants CI Convex.
- GitHub Actions expose également
Package Acceptancepour la preuve produit en exécution annexe contre un package candidat. Il accepte une ref approuvée, une spec npm publiée, une URL de tarball HTTPS avec SHA-256, ou un artefact tarball d’une autre exécution, téléverse leopenclaw-current.tgznormalisé commepackage-under-test, puis exécute le planificateur Docker E2E existant avec les profils de lane smoke, package, product, full ou custom. Définisseztelegram_mode=mock-openaioulive-frontierpour exécuter le workflow QA Telegram contre le même artefactpackage-under-test.- Preuve produit de la dernière bêta :
- La preuve par URL de tarball exacte nécessite un digest :
- La preuve par artefact télécharge un artefact tarball depuis une autre exécution Actions :
-
pnpm test:docker:plugins- Pack et installe la build OpenClaw actuelle dans Docker, démarre le Gateway avec OpenAI configuré, puis active les canaux/plugins groupés via des modifications de configuration.
- Vérifie que la découverte de configuration laisse absents les plugins téléchargeables non configurés, que la première réparation doctor configurée installe explicitement chaque plugin téléchargeable manquant et qu’un second redémarrage n’exécute pas de réparation de dépendances masquée.
- Installe également une baseline npm plus ancienne connue, active Telegram
avant d’exécuter
openclaw update --tag <candidate>, puis vérifie que le doctor post-update du candidat nettoie les débris de dépendances de plugin héritées sans réparation postinstall côté harness.
-
pnpm test:parallels:npm-update-
Exécute le smoke natif de mise à jour d’installation packagée sur des
invités Parallels. Chaque plateforme sélectionnée installe d’abord le
package de baseline demandé, puis exécute la commande
openclaw updateinstallée dans le même invité et vérifie la version installée, le statut de mise à jour, la disponibilité du Gateway et un tour d’agent local. -
Utilisez
--platform macos,--platform windowsou--platform linuxlors de l’itération sur un seul invité. Utilisez--jsonpour le chemin de l’artefact de résumé et le statut par lane. -
Le lane OpenAI utilise
openai/gpt-5.5par défaut pour la preuve de tour d’agent live. Passez--model <provider/model>ou définissezOPENCLAW_PARALLELS_OPENAI_MODELlorsque vous validez délibérément un autre modèle OpenAI. -
Encadrez les longues exécutions locales avec un timeout hôte afin que les
blocages de transport Parallels ne consomment pas le reste de la fenêtre de test :
-
Le script écrit les journaux de lane imbriqués sous
/tmp/openclaw-parallels-npm-update.*. Inspectezwindows-update.log,macos-update.logoulinux-update.logavant de supposer que le wrapper externe est bloqué. - La mise à jour Windows peut passer 10 à 15 minutes dans le doctor post-update et le travail de mise à jour de package sur un invité froid ; cela reste sain lorsque le journal de debug npm imbriqué progresse.
- N’exécutez pas ce wrapper agrégé en parallèle avec des lanes smoke Parallels individuels macOS, Windows ou Linux. Ils partagent l’état des VM et peuvent entrer en collision lors de la restauration de snapshot, du service de package ou de l’état du Gateway invité.
- La preuve post-update exécute la surface normale des plugins groupés parce que les façades de capacité telles que la parole, la génération d’images et la compréhension média sont chargées via les API runtime groupées même lorsque le tour d’agent lui-même ne vérifie qu’une simple réponse textuelle.
-
Exécute le smoke natif de mise à jour d’installation packagée sur des
invités Parallels. Chaque plateforme sélectionnée installe d’abord le
package de baseline demandé, puis exécute la commande
-
pnpm openclaw qa aimock- Démarre uniquement le serveur fournisseur AIMock local pour des tests smoke directs du protocole.
-
pnpm openclaw qa matrix- Exécute le lane QA live Matrix contre un homeserver Tuwunel jetable adossé à Docker. Checkout source uniquement - les installations packagées ne livrent pas
qa-lab. - CLI complète, catalogue de profils/scénarios, variables env et disposition des artefacts : QA Matrix.
- Exécute le lane QA live Matrix contre un homeserver Tuwunel jetable adossé à Docker. Checkout source uniquement - les installations packagées ne livrent pas
-
pnpm openclaw qa telegram- Exécute le lane QA live Telegram contre un vrai groupe privé avec les tokens du bot driver et du bot SUT issus de l’env.
- Nécessite
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENetOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. L’id du groupe doit être l’id numérique du chat Telegram. - Prend en charge
--credential-source convexpour des identifiants mutualisés partagés. Utilisez le mode env par défaut, ou définissezOPENCLAW_QA_CREDENTIAL_SOURCE=convexpour opter pour les baux mutualisés. - Les valeurs par défaut couvrent canary, gating par mention, adressage de commandes,
/status, réponses mentionnées bot-à-bot et réponses de commandes natives du core. Les valeurs par défautmock-openaicouvrent également les régressions déterministes de chaîne de réponses et de streaming du message final Telegram. Utilisez--list-scenariospour les sondes optionnelles telles quesession_status. - Se termine avec un code non nul si un scénario échoue. Utilisez
--allow-failureslorsque vous voulez des artefacts sans code de sortie en échec. - Nécessite deux bots distincts dans le même groupe privé, avec le bot SUT exposant un nom d’utilisateur Telegram.
- Pour une observation bot-à-bot stable, activez Bot-to-Bot Communication Mode dans
@BotFatherpour les deux bots et assurez-vous que le bot driver peut observer le trafic de bots du groupe. - Écrit un rapport QA Telegram, un résumé et un artefact de messages observés sous
.artifacts/qa-e2e/.... Les scénarios de réponse incluent le RTT depuis la demande d’envoi du driver jusqu’à la réponse SUT observée.
Mantis Telegram Live est le wrapper de preuve PR autour de ce lane. Il exécute
la ref candidate avec des identifiants Telegram loués via Convex, rend la
transcription expurgée des messages observés dans un navigateur de bureau
Crabbox, enregistre une preuve MP4, génère un GIF découpé selon le mouvement,
téléverse le bundle d’artefacts et publie une preuve PR inline via la Mantis
GitHub App lorsque pr_number est défini. Les mainteneurs peuvent le démarrer
depuis l’interface Actions via Mantis Scenario (scenario_id: telegram-live) ou directement depuis un commentaire de pull request :
Mantis Telegram Desktop Proof est le wrapper agentique natif Telegram Desktop
avant/après pour la preuve visuelle de PR. Démarrez-le depuis l’interface
Actions avec des instructions libres, via Mantis Scenario (scenario_id: telegram-desktop-proof), ou depuis un commentaire de PR :
motionPreview appairé, et publie le même tableau GIF à 2 colonnes via la
Mantis GitHub App lorsque pr_number est défini.
pnpm openclaw qa mantis telegram-desktop-builder- Loue ou réutilise un bureau Linux Crabbox, installe Telegram Desktop natif, configure OpenClaw avec un jeton de bot SUT Telegram loué, démarre le Gateway, et enregistre des preuves par capture d’écran/MP4 depuis le bureau VNC visible.
- Utilise par défaut
--credential-source convexafin que les workflows n’aient besoin que du secret du courtier Convex. Utilisez--credential-source envavec les mêmes variablesOPENCLAW_QA_TELEGRAM_*quepnpm openclaw qa telegram. - Telegram Desktop nécessite toujours une connexion/un profil utilisateur. Le jeton de bot configure uniquement OpenClaw. Utilisez
--telegram-profile-archive-env <name>pour une archive de profil.tgzen base64, ou utilisez--keep-leaseet connectez-vous manuellement une fois via VNC. - Écrit
mantis-telegram-desktop-builder-report.md,mantis-telegram-desktop-builder-summary.json,telegram-desktop-builder.pngettelegram-desktop-builder.mp4dans le répertoire de sortie.
qa-channel est la suite synthétique large et ne fait pas partie de cette matrice.
Identifiants Telegram partagés via Convex (v1)
Lorsque--credential-source convex (ou OPENCLAW_QA_CREDENTIAL_SOURCE=convex) est activé pour
la QA de transport en direct, le labo QA acquiert un bail exclusif depuis un pool adossé à Convex, envoie des heartbeats pour ce
bail pendant l’exécution de la voie, puis libère le bail à l’arrêt. Le nom de la section est antérieur
à la prise en charge de Discord, Slack et WhatsApp ; le contrat de bail est partagé entre les types.
Échafaudage de référence du projet Convex :
qa/convex-credential-broker/
OPENCLAW_QA_CONVEX_SITE_URL(par exemplehttps://your-deployment.convex.site)- Un secret pour le rôle sélectionné :
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERpourmaintainerOPENCLAW_QA_CONVEX_SECRET_CIpourci
- Sélection du rôle d’identifiants :
- CLI :
--credential-role maintainer|ci - Valeur par défaut via l’environnement :
OPENCLAW_QA_CREDENTIAL_ROLE(par défautcien CI, sinonmaintainer)
- CLI :
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(par défaut1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(par défaut30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(par défaut90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(par défaut15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(par défaut/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(identifiant de trace facultatif)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1autorise les URL Convexhttp://en local loopback pour le développement local uniquement.
OPENCLAW_QA_CONVEX_SITE_URL doit utiliser https:// en fonctionnement normal.
Les commandes d’administration des mainteneurs (ajout/suppression/liste du pool) exigent spécifiquement
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
Aides CLI pour les mainteneurs :
doctor avant les exécutions en direct pour vérifier l’URL du site Convex, les secrets du courtier,
le préfixe d’endpoint, le délai d’expiration HTTP et l’accessibilité admin/liste sans afficher
les valeurs secrètes. Utilisez --json pour une sortie exploitable par machine dans les scripts et les utilitaires
CI.
Contrat d’endpoint par défaut (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1) :
POST /acquire- Requête :
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Succès :
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Épuisé/retentable :
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Requête :
POST /payload-chunk- Requête :
{ kind, ownerId, actorRole, credentialId, leaseToken, index } - Succès :
{ status: "ok", index, data }
- Requête :
POST /heartbeat- Requête :
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Succès :
{ status: "ok" }(ou2xxvide)
- Requête :
POST /release- Requête :
{ kind, ownerId, actorRole, credentialId, leaseToken } - Succès :
{ status: "ok" }(ou2xxvide)
- Requête :
POST /admin/add(secret mainteneur uniquement)- Requête :
{ kind, actorId, payload, note?, status? } - Succès :
{ status: "ok", credential }
- Requête :
POST /admin/remove(secret mainteneur uniquement)- Requête :
{ credentialId, actorId } - Succès :
{ status: "ok", changed, credential } - Garde de bail actif :
{ status: "error", code: "LEASE_ACTIVE", ... }
- Requête :
POST /admin/list(secret mainteneur uniquement)- Requête :
{ kind?, status?, includePayload?, limit? } - Succès :
{ status: "ok", credentials, count }
- Requête :
{ groupId: string, driverToken: string, sutToken: string }groupIddoit être une chaîne d’identifiant numérique de chat Telegram.admin/addvalide cette forme pourkind: "telegram"et rejette les payloads mal formés.
{ groupId: string, sutToken: string, testerUserId: string, testerUsername: string, telegramApiId: string, telegramApiHash: string, tdlibDatabaseEncryptionKey: string, tdlibArchiveBase64: string, tdlibArchiveSha256: string, desktopTdataArchiveBase64: string, desktopTdataArchiveSha256: string }groupId,testerUserIdettelegramApiIddoivent être des chaînes numériques.tdlibArchiveSha256etdesktopTdataArchiveSha256doivent être des chaînes hexadécimales SHA-256.kind: "telegram-user"représente un compte jetable Telegram. Traitez le bail comme couvrant tout le compte : le pilote CLI TDLib et le témoin visuel Telegram Desktop sont restaurés à partir du même payload, et une seule tâche doit détenir le bail à la fois.
Telegram -workdir "$tmp/desktop" lorsqu’un enregistrement visuel est nécessaire. Dans les environnements opérateur locaux, scripts/e2e/telegram-user-credential.ts lit ~/.codex/skills/custom/telegram-e2e-bot-to-bot/convex.local.env par défaut si les variables d’environnement du processus sont absentes.
Session Crabbox pilotée par agent :
start loue l’identifiant telegram-user, restaure le même compte dans
TDLib et Telegram Desktop sur un bureau Linux Crabbox, démarre un Gateway SUT
mock local depuis le checkout courant, ouvre le chat Telegram visible, lance
l’enregistrement du bureau et écrit un session.json privé. Tant que la session est
active, un agent peut continuer à tester jusqu’à être satisfait :
send --session <file> --text <message>envoie via l’utilisateur réel TDLib et attend la réponse du SUT.run --session <file> -- <remote command>exécute une commande arbitraire sur la Crabbox et enregistre sa sortie, par exemplebash -lc 'source /tmp/openclaw-telegram-user-crabbox/env.sh && python3 /tmp/openclaw-telegram-user-crabbox/user-driver.py transcript --limit 20 --json'.screenshot --session <file>capture le bureau visible courant.status --session <file>affiche le bail et la commande WebVNC.finish --session <file>arrête l’enregistreur, capture les artefacts de capture d’écran/vidéo/motion-trim, libère l’identifiant Convex, arrête les processus SUT locaux et arrête le bail Crabbox sauf si--keep-boxest passé.publish --session <file> --pr <number>publie par défaut un commentaire de PR contenant uniquement des GIFs. Passez--full-artifactsseulement lorsque des journaux ou des artefacts JSON sont intentionnellement nécessaires.
--mock-response-file <path> à start
ou au raccourci en une commande probe. Le runner utilise par défaut une classe
Crabbox standard, un enregistrement à 24 fps, des aperçus GIF de mouvement à 24 fps et une largeur de GIF
de 1920 px. Remplacez avec --class, --record-fps, --preview-fps et
--preview-width seulement lorsque la preuve nécessite des paramètres de capture différents.
Preuve Crabbox en une commande :
probe par défaut est un raccourci pour un cycle start/send/finish unique. Utilisez-la pour un smoke /status rapide. Utilisez les commandes de session pour la revue de PR,
le travail de reproduction de bogues, ou tout cas où l’agent a besoin de plusieurs minutes
d’expérimentation arbitraire avant de décider que la preuve est complète. Utilisez --id <cbx_...> pour
réutiliser un bail de bureau chaud, --keep-box pour garder VNC ouvert après finish,
--desktop-chat-title <name> pour choisir le chat visible, et --tdlib-url <tgz>
lorsque vous utilisez une archive Linux libtdjson.so précuite au lieu de compiler TDLib sur
une nouvelle machine. Le runner vérifie --tdlib-url avec --tdlib-sha256 <hex> ou,
par défaut, un fichier frère <url>.sha256.
Payloads multicanaux validés par le courtier :
- Discord :
{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string } - WhatsApp :
{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }
{ channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string }
pour les lignes Slack.
Ajouter un canal à la QA
L’architecture et les noms d’aides de scénario pour les nouveaux adaptateurs de canal se trouvent dans Aperçu de la QA → Ajouter un canal. Le minimum requis : implémenter le runner de transport sur le seam hôte partagéqa-lab, déclarer qaRunners dans le manifeste du plugin, le monter en tant que openclaw qa <runner> et écrire les scénarios sous qa/scenarios/.
Suites de tests (ce qui s’exécute où)
Considérez les suites comme un « réalisme croissant » (et un coût/une instabilité croissants) :Unitaires / intégration (par défaut)
- Commande :
pnpm test - Configuration : les exécutions non ciblées utilisent l’ensemble d’éclats
vitest.full-*.config.tset peuvent étendre les éclats multiprojets en configurations par projet pour la planification parallèle - Fichiers : inventaires core/unit sous
src/**/*.test.ts,packages/**/*.test.tsettest/**/*.test.ts; les tests unitaires d’UI s’exécutent dans l’éclat dédiéunit-ui - Portée :
- Tests purement unitaires
- Tests d’intégration in-process (authentification du Gateway, routage, outillage, parsing, configuration)
- Régressions déterministes pour les bogues connus
- Attentes :
- S’exécute en CI
- Aucune vraie clé requise
- Doit être rapide et stable
- Les tests du résolveur et du chargeur de surface publique doivent prouver le comportement de fallback large de
api.jsetruntime-api.jsavec de minuscules fixtures de plugin générées, et non de vraies API sources de plugins groupés. Les chargements d’API de plugins réels relèvent des suites de contrat/intégration détenues par les plugins.
- Les installations de test par défaut ignorent les builds natifs opus Discord facultatifs. La réception vocale Discord utilise le décodeur pur JS
opusscript, et@discordjs/opusreste désactivé dansallowBuildsafin que les tests locaux et les voies Testbox ne compilent pas l’addon natif. - Utilisez une voie Discord voix dédiée aux performances ou au direct si vous devez intentionnellement comparer un build opus natif. Ne définissez pas
@discordjs/opussurtruedans leallowBuildspar défaut ; cela force des boucles d’installation/test sans rapport à compiler du code natif.
Projects, shards, and scoped lanes
Projects, shards, and scoped lanes
pnpm testsans cible exécute douze configurations de fragments plus petites (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) au lieu d’un unique énorme processus natif de projet racine. Cela réduit le RSS de pointe sur les machines chargées et évite que le travail auto-reply/extensions n’affame des suites sans rapport.pnpm test --watchutilise toujours le graphe de projet racine natifvitest.config.ts, car une boucle de surveillance multi-fragments n’est pas pratique.pnpm test,pnpm test:watchetpnpm test:perf:importsacheminent d’abord les cibles explicites de fichiers/répertoires par des voies à portée limitée, doncpnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsévite de payer le coût complet de démarrage du projet racine.pnpm test:changedétend par défaut les chemins git modifiés en voies à portée limitée peu coûteuses : modifications directes de tests, fichiers frères*.test.ts, mappages source explicites et dépendants du graphe d’import local. Les modifications de config/setup/package ne déclenchent pas d’exécution large des tests, sauf si vous utilisez explicitementOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed.pnpm check:changedest la barrière normale de vérification locale intelligente pour les travaux étroits. Elle classe le diff en core, tests core, extensions, tests d’extension, apps, docs, métadonnées de release, outillage Docker live et outillage, puis exécute les commandes correspondantes de typecheck, lint et garde. Elle n’exécute pas les tests Vitest ; appelezpnpm test:changedou unpnpm test <target>explicite pour la preuve de test. Les changements de version limités aux métadonnées de release exécutent des vérifications ciblées de version/config/dépendances racine, avec une garde qui rejette les changements de package en dehors du champ de version de premier niveau.- Les modifications du harnais Docker ACP live exécutent des vérifications ciblées : syntaxe shell pour les scripts d’auth Docker live et dry-run du planificateur Docker live. Les changements de
package.jsonsont inclus uniquement lorsque le diff est limité àscripts["test:docker:live-*"]; les modifications de dépendances, exports, version et autres surfaces de package utilisent toujours les gardes plus larges. - Les tests unitaires légers en imports provenant des agents, commandes, plugins, helpers auto-reply,
plugin-sdket zones utilitaires pures similaires passent par la voieunit-fast, qui ignoretest/setup-openclaw-runtime.ts; les fichiers avec état ou lourds côté runtime restent sur les voies existantes. - Certains fichiers source helpers
plugin-sdketcommandssélectionnés associent aussi les exécutions en mode changé à des tests frères explicites dans ces voies légères, afin que les modifications de helpers évitent de relancer toute la suite lourde de ce répertoire. auto-replydispose de compartiments dédiés pour les helpers core de premier niveau, les tests d’intégrationreply.*de premier niveau et le sous-arbresrc/auto-reply/reply/**. La CI divise en outre le sous-arbre reply en fragments agent-runner, dispatch et commands/state-routing afin qu’un compartiment lourd en imports ne possède pas toute la traîne Node.- La CI normale PR/main ignore intentionnellement le balayage par lot des extensions et le fragment
agentic-pluginsréservé aux releases. La Validation de Release complète déclenche le workflow enfant séparéPlugin Prereleasepour ces suites lourdes en plugins/extensions sur les release candidates.
Embedded runner coverage
Embedded runner coverage
- Lorsque vous modifiez les entrées de découverte des outils de messages ou le contexte runtime de compaction, conservez les deux niveaux de couverture.
- Ajoutez des régressions de helpers ciblées pour les frontières pures de routage et de normalisation.
- Gardez les suites d’intégration du runner intégré en bon état :
src/agents/pi-embedded-runner/compact.hooks.test.ts,src/agents/pi-embedded-runner/run.overflow-compaction.test.tsetsrc/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts. - Ces suites vérifient que les ids à portée limitée et le comportement de Compaction transitent toujours par les vrais chemins
run.ts/compact.ts; les tests limités aux helpers ne remplacent pas suffisamment ces chemins d’intégration.
Vitest pool and isolation defaults
Vitest pool and isolation defaults
- La configuration Vitest de base utilise
threadspar défaut. - La configuration Vitest partagée fixe
isolate: falseet utilise le runner non isolé dans les projets racine, e2e et configurations live. - La voie UI racine conserve sa configuration
jsdomet son optimiseur, mais s’exécute elle aussi sur le runner partagé non isolé. - Chaque fragment
pnpm testhérite des mêmes valeurs par défautthreads+isolate: falsedepuis la configuration Vitest partagée. scripts/run-vitest.mjsajoute par défaut--no-maglevaux processus Node enfants de Vitest afin de réduire le renouvellement de compilation V8 pendant les grosses exécutions locales. DéfinissezOPENCLAW_VITEST_ENABLE_MAGLEV=1pour comparer au comportement V8 standard.
Fast local iteration
Fast local iteration
pnpm changed:lanesmontre quelles voies architecturales un diff déclenche.- Le hook pre-commit ne fait que du formatage. Il restage les fichiers formatés et n’exécute pas lint, typecheck ni tests.
- Exécutez explicitement
pnpm check:changedavant le handoff ou le push lorsque vous avez besoin de la barrière de vérification locale intelligente. pnpm test:changedpasse par défaut par des voies à portée limitée peu coûteuses. UtilisezOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changeduniquement lorsque l’agent décide qu’une modification de harnais, config, package ou contrat nécessite réellement une couverture Vitest plus large.pnpm test:maxetpnpm test:changed:maxconservent le même comportement de routage, simplement avec un plafond de workers plus élevé.- L’auto-scaling local des workers est intentionnellement conservateur et réduit la charge lorsque la moyenne de charge de l’hôte est déjà élevée, de sorte que plusieurs exécutions Vitest concurrentes causent moins de dégâts par défaut.
- La configuration Vitest de base marque les projets/fichiers de configuration comme
forceRerunTriggersafin que les réexécutions en mode changé restent correctes lorsque le câblage des tests change. - La configuration garde
OPENCLAW_VITEST_FS_MODULE_CACHEactivé sur les hôtes pris en charge ; définissezOPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/pathsi vous voulez un emplacement de cache explicite pour le profilage direct.
Perf debugging
Perf debugging
pnpm test:perf:importsactive le rapport des durées d’import Vitest ainsi que la sortie de ventilation des imports.pnpm test:perf:imports:changedlimite la même vue de profilage aux fichiers modifiés depuisorigin/main.- Les données de timing des fragments sont écrites dans
.artifacts/vitest-shard-timings.json. Les exécutions de configuration complète utilisent le chemin de configuration comme clé ; les fragments CI à motif d’inclusion ajoutent le nom du fragment afin que les fragments filtrés puissent être suivis séparément. - Lorsqu’un test chaud passe encore la majeure partie de son temps dans les imports de démarrage, gardez les dépendances lourdes derrière une frontière locale étroite
*.runtime.tset mockez directement cette frontière au lieu de deep-importer des helpers runtime uniquement pour les faire passer parvi.mock(...). pnpm test:perf:changed:bench -- --ref <git-ref>compare letest:changedrouté au chemin natif du projet racine pour ce diff committé et affiche le temps réel ainsi que le RSS maximal macOS.pnpm test:perf:changed:bench -- --worktreebenchmarke l’arbre de travail sale courant en routant la liste des fichiers modifiés viascripts/test-projects.mjset la configuration Vitest racine.pnpm test:perf:profile:mainécrit un profil CPU du thread principal pour les surcoûts de démarrage et de transformation Vitest/Vite.pnpm test:perf:profile:runnerécrit des profils CPU+heap du runner pour la suite unitaire avec le parallélisme de fichiers désactivé.
Stabilité (gateway)
- Commande :
pnpm test:stability:gateway - Config :
vitest.gateway.config.ts, forcée à un worker - Portée :
- Démarre un vrai Gateway loopback avec les diagnostics activés par défaut
- Fait passer une agitation synthétique de messages Gateway, de mémoire et de grandes charges utiles par le chemin d’événements de diagnostic
- Interroge
diagnostics.stabilityvia le RPC WS du Gateway - Couvre les helpers de persistance du bundle de stabilité de diagnostic
- Vérifie que l’enregistreur reste borné, que les échantillons RSS synthétiques restent sous le budget de pression et que les profondeurs de file par session reviennent à zéro
- Attentes :
- Compatible CI et sans clé
- Voie étroite pour le suivi des régressions de stabilité, pas un substitut à la suite Gateway complète
E2E (smoke gateway)
- Commande :
pnpm test:e2e - Config :
vitest.e2e.config.ts - Fichiers :
src/**/*.e2e.test.ts,test/**/*.e2e.test.tset tests E2E de plugins groupés sousextensions/ - Valeurs runtime par défaut :
- Utilise les
threadsVitest avecisolate: false, comme le reste du dépôt. - Utilise des workers adaptatifs (CI : jusqu’à 2, local : 1 par défaut).
- S’exécute en mode silencieux par défaut pour réduire le surcoût des E/S console.
- Utilise les
- Surcharges utiles :
OPENCLAW_E2E_WORKERS=<n>pour forcer le nombre de workers (plafonné à 16).OPENCLAW_E2E_VERBOSE=1pour réactiver la sortie console verbeuse.
- Portée :
- Comportement Gateway end-to-end multi-instance
- Surfaces WebSocket/HTTP, appairage de nœuds et réseau plus lourd
- Attentes :
- S’exécute en CI (lorsque c’est activé dans le pipeline)
- Aucune clé réelle requise
- Plus de pièces mobiles que les tests unitaires (peut être plus lent)
E2E : smoke du backend OpenShell
- Commande :
pnpm test:e2e:openshell - Fichier :
extensions/openshell/src/backend.e2e.test.ts - Portée :
- Démarre un Gateway OpenShell isolé sur l’hôte via Docker
- Crée une sandbox à partir d’un Dockerfile local temporaire
- Exerce le backend OpenShell d’OpenClaw via de vrais
sandbox ssh-config+ exécution SSH - Vérifie le comportement de système de fichiers canonique distant via le pont fs de la sandbox
- Attentes :
- Opt-in uniquement ; ne fait pas partie de l’exécution
pnpm test:e2epar défaut - Nécessite une CLI
openshelllocale ainsi qu’un démon Docker fonctionnel - Utilise des
HOME/XDG_CONFIG_HOMEisolés, puis détruit le Gateway de test et la sandbox
- Opt-in uniquement ; ne fait pas partie de l’exécution
- Surcharges utiles :
OPENCLAW_E2E_OPENSHELL=1pour activer le test lors de l’exécution manuelle de la suite e2e plus largeOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellpour pointer vers un binaire CLI non par défaut ou un script wrapper
Live (fournisseurs réels + modèles réels)
- Commande :
pnpm test:live - Configuration :
vitest.live.config.ts - Fichiers :
src/**/*.live.test.ts,test/**/*.live.test.ts, et tests live des plugins intégrés sousextensions/ - Valeur par défaut : activé par
pnpm test:live(définitOPENCLAW_LIVE_TEST=1) - Périmètre :
- « Ce fournisseur/modèle fonctionne-t-il réellement aujourd’hui avec de vrais identifiants ? »
- Détecter les changements de format des fournisseurs, les particularités d’appel d’outils, les problèmes d’authentification et le comportement des limites de débit
- Attentes :
- Non stable en CI par conception (vrais réseaux, vraies politiques de fournisseurs, quotas, pannes)
- Coûte de l’argent / utilise les limites de débit
- Préférer l’exécution de sous-ensembles restreints plutôt que « tout »
- Les exécutions live chargent
~/.profilepour récupérer les clés API manquantes. - Par défaut, les exécutions live isolent toujours
HOMEet copient la configuration/le matériel d’authentification dans un répertoire personnel de test temporaire afin que les fixtures unitaires ne puissent pas modifier votre vrai~/.openclaw. - Définissez
OPENCLAW_LIVE_USE_REAL_HOME=1uniquement lorsque vous avez intentionnellement besoin que les tests live utilisent votre vrai répertoire personnel. pnpm test:liveutilise désormais par défaut un mode plus silencieux : il conserve la sortie de progression[live] ..., mais supprime l’avis supplémentaire~/.profileet met en sourdine les journaux d’amorçage du Gateway/le bruit Bonjour. DéfinissezOPENCLAW_LIVE_TEST_QUIET=0si vous voulez retrouver les journaux de démarrage complets.- Rotation des clés API (spécifique au fournisseur) : définissez
*_API_KEYSau format virgule/point-virgule ou*_API_KEY_1,*_API_KEY_2(par exempleOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) ou une substitution par live viaOPENCLAW_LIVE_*_KEY; les tests réessaient sur les réponses de limite de débit. - Sortie de progression/Heartbeat :
- Les suites live émettent désormais des lignes de progression vers stderr afin que les longs appels fournisseur soient visiblement actifs même lorsque la capture de console Vitest est silencieuse.
vitest.live.config.tsdésactive l’interception de console de Vitest afin que les lignes de progression du fournisseur/Gateway soient diffusées immédiatement pendant les exécutions live.- Ajustez les Heartbeat de modèle direct avec
OPENCLAW_LIVE_HEARTBEAT_MS. - Ajustez les Heartbeat Gateway/sonde avec
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Quelle suite dois-je exécuter ?
Utilisez ce tableau de décision :- Modification de logique/tests : exécutez
pnpm test(etpnpm test:coveragesi vous avez beaucoup changé) - Modification du réseau Gateway / protocole WS / appairage : ajoutez
pnpm test:e2e - Débogage de « mon bot est en panne » / échecs spécifiques à un fournisseur / appel d’outils : exécutez un
pnpm test:liverestreint
Tests live (qui touchent au réseau)
Pour la matrice des modèles live, les smokes du backend CLI, les smokes ACP, le harnais de serveur d’app Codex et tous les tests live des fournisseurs média (Deepgram, BytePlus, ComfyUI, image, musique, vidéo, harnais média) — ainsi que la gestion des identifiants pour les exécutions live — consultez Tester les suites live. Pour la liste de contrôle dédiée à la mise à jour et à la validation des plugins, consultez Tester les mises à jour et les plugins.Exécuteurs Docker (vérifications facultatives « fonctionne sous Linux »)
Ces exécuteurs Docker se répartissent en deux catégories :- Exécuteurs de modèles live :
test:docker:live-modelsettest:docker:live-gatewayexécutent uniquement leur fichier live correspondant de clés de profil dans l’image Docker du dépôt (src/agents/models.profiles.live.test.tsetsrc/gateway/gateway-models.profiles.live.test.ts), en montant votre répertoire de configuration local et l’espace de travail (et en chargeant~/.profiles’il est monté). Les points d’entrée locaux correspondants sonttest:live:models-profilesettest:live:gateway-profiles. - Les exécuteurs Docker live utilisent par défaut un plafond de smoke plus réduit afin qu’un balayage Docker complet reste praticable :
test:docker:live-modelsutilise par défautOPENCLAW_LIVE_MAX_MODELS=12, ettest:docker:live-gatewayutilise par défautOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000, etOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Remplacez ces variables d’environnement lorsque vous voulez explicitement l’analyse exhaustive plus large. test:docker:allconstruit l’image Docker live une fois viatest:docker:live-build, empaquette OpenClaw une fois sous forme de tarball npm viascripts/package-openclaw-for-docker.mjs, puis construit/réutilise deux imagesscripts/e2e/Dockerfile. L’image nue est seulement l’exécuteur Node/Git pour les voies d’installation/mise à jour/dépendance de Plugin ; ces voies montent le tarball préconstruit. L’image fonctionnelle installe le même tarball dans/apppour les voies de fonctionnalité de l’app construite. Les définitions de voies Docker se trouvent dansscripts/lib/docker-e2e-scenarios.mjs; la logique du planificateur se trouve dansscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsexécute le plan sélectionné. L’agrégat utilise un planificateur local pondéré :OPENCLAW_DOCKER_ALL_PARALLELISMcontrôle les emplacements de processus, tandis que les plafonds de ressources empêchent les voies live lourdes, d’installation npm et multiservices de toutes démarrer en même temps. Si une seule voie est plus lourde que les plafonds actifs, le planificateur peut quand même la démarrer lorsque le pool est vide, puis la garde seule en cours d’exécution jusqu’à ce que la capacité soit de nouveau disponible. Les valeurs par défaut sont 10 emplacements,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10, etOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; ajustezOPENCLAW_DOCKER_ALL_WEIGHT_LIMITouOPENCLAW_DOCKER_ALL_DOCKER_LIMITuniquement lorsque l’hôte Docker dispose de plus de marge. L’exécuteur effectue par défaut un prévol Docker, supprime les conteneurs E2E OpenClaw obsolètes, affiche l’état toutes les 30 secondes, stocke les durées des voies réussies dans.artifacts/docker-tests/lane-timings.jsonet utilise ces durées pour démarrer les voies plus longues en premier lors des exécutions ultérieures. UtilisezOPENCLAW_DOCKER_ALL_DRY_RUN=1pour afficher le manifeste pondéré des voies sans construire ni exécuter Docker, ounode scripts/test-docker-all.mjs --plan-jsonpour afficher le plan CI des voies sélectionnées, des besoins en paquet/image et des identifiants.Package Acceptanceest la barrière de paquet native GitHub pour « ce tarball installable fonctionne-t-il comme un produit ? » Elle résout un paquet candidat depuissource=npm,source=ref,source=urlousource=artifact, le téléverse sous le nompackage-under-test, puis exécute les voies Docker E2E réutilisables contre ce tarball exact au lieu de réempaqueter la référence sélectionnée. Les profils sont ordonnés par largeur :smoke,package,productetfull. Consultez Tester les mises à jour et les plugins pour le contrat de paquet/mise à jour/Plugin, la matrice des survivants de mise à niveau publiée, les valeurs par défaut de publication et le triage des échecs.- Les vérifications de construction et de publication exécutent
scripts/check-cli-bootstrap-imports.mjsaprès tsdown. La garde parcourt le graphe statique construit depuisdist/entry.jsetdist/cli/run-main.jset échoue si le démarrage avant répartition importe des dépendances de paquet comme Commander, l’interface de prompt, undici ou la journalisation avant la répartition de commande ; elle maintient aussi le fragment d’exécution Gateway intégré sous le budget et rejette les imports statiques de chemins Gateway froids connus. Le smoke de CLI empaquetée couvre également l’aide racine, l’aide d’onboarding, l’aide de doctor, le statut, le schéma de configuration et une commande de liste de modèles. - La compatibilité héritée de Package Acceptance est plafonnée à
2026.4.25(2026.4.25-beta.*inclus). Jusqu’à cette limite, le harnais tolère uniquement les lacunes de métadonnées des paquets publiés : entrées d’inventaire QA privées omises,gateway install --wrappermanquant, fichiers de patch manquants dans la fixture git dérivée du tarball,update.channelpersisté manquant, emplacements hérités des enregistrements d’installation de plugins, persistance manquante des enregistrements d’installation de marketplace, et migration des métadonnées de configuration pendantplugins update. Pour les paquets après2026.4.25, ces chemins sont des échecs stricts. - Exécuteurs de smoke de conteneur :
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,test:docker:skill-install,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-matrixettest:docker:config-reloaddémarrent un ou plusieurs vrais conteneurs et vérifient des chemins d’intégration de plus haut niveau.
- Modèles directs :
pnpm test:docker:live-models(script :scripts/test-live-models-docker.sh) - Smoke ACP bind :
pnpm test:docker:live-acp-bind(script :scripts/test-live-acp-bind-docker.sh; couvre Claude, Codex et Gemini par défaut, avec une couverture stricte de Droid/OpenCode viapnpm test:docker:live-acp-bind:droidetpnpm test:docker:live-acp-bind:opencode) - Smoke du backend CLI :
pnpm test:docker:live-cli-backend(script :scripts/test-live-cli-backend-docker.sh) - Smoke du harness app-server Codex :
pnpm test:docker:live-codex-harness(script :scripts/test-live-codex-harness-docker.sh) - Gateway + agent de développement :
pnpm test:docker:live-gateway(script :scripts/test-live-gateway-models-docker.sh) - Smoke d’observabilité :
pnpm qa:otel:smokeest une voie privée de vérification QA sur une extraction des sources. Elle ne fait volontairement pas partie des voies Docker de publication du package, car l’archive tar npm omet QA Lab. - Smoke live Open WebUI :
pnpm test:docker:openwebui(script :scripts/e2e/openwebui-docker.sh) - Assistant d’onboarding (TTY, échafaudage complet) :
pnpm test:docker:onboard(script :scripts/e2e/onboard-docker.sh) - Smoke d’onboarding/canal/agent de l’archive tar npm :
pnpm test:docker:npm-onboard-channel-agentinstalle globalement dans Docker l’archive tar OpenClaw empaquetée, configure OpenAI via un onboarding avec référence d’environnement ainsi que Telegram par défaut, exécute doctor, puis exécute un tour d’agent OpenAI simulé. Réutilisez une archive tar préconstruite avecOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz, ignorez la reconstruction hôte avecOPENCLAW_NPM_ONBOARD_HOST_BUILD=0, ou changez de canal avecOPENCLAW_NPM_ONBOARD_CHANNEL=discordouOPENCLAW_NPM_ONBOARD_CHANNEL=slack. - Smoke d’installation de Skill :
pnpm test:docker:skill-installinstalle globalement dans Docker l’archive tar OpenClaw empaquetée, désactive dans la configuration les installations d’archives téléversées, résout depuis la recherche le slug live actuel de Skill ClawHub, l’installe avecopenclaw skills install, puis vérifie la Skill installée ainsi que les métadonnées d’origine/verrou.clawhub. - Smoke de changement de canal de mise à jour :
pnpm test:docker:update-channel-switchinstalle globalement dans Docker l’archive tar OpenClaw empaquetée, bascule du packagestablevers gitdev, vérifie le canal persistant et le fonctionnement du Plugin après mise à jour, puis rebascule vers le packagestableet vérifie l’état de mise à jour. - Smoke de survie à la mise à niveau :
pnpm test:docker:upgrade-survivorinstalle l’archive tar OpenClaw empaquetée par-dessus un fixture d’ancien utilisateur sale avec agents, configuration de canal, listes d’autorisation de Plugins, état obsolète des dépendances de Plugin et fichiers d’espace de travail/session existants. Il exécute la mise à jour du package plus doctor en mode non interactif sans fournisseur live ni clés de canal, puis démarre une Gateway loopback et vérifie la préservation de la configuration/de l’état ainsi que les budgets de démarrage/état. - Smoke publié de survie à la mise à niveau :
pnpm test:docker:published-upgrade-survivorinstalleopenclaw@latestpar défaut, initialise des fichiers réalistes d’utilisateur existant, configure cette référence avec une recette de commande intégrée, valide la configuration obtenue, met à jour cette installation publiée vers l’archive tar candidate, exécute doctor en mode non interactif, écrit.artifacts/upgrade-survivor/summary.json, puis démarre une Gateway loopback et vérifie les intentions configurées, la préservation de l’état, le démarrage,/healthz,/readyzet les budgets d’état RPC. Remplacez une référence avecOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, demandez au planificateur agrégé d’étendre des références locales exactes avecOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECScommeopenclaw@2026.5.2 openclaw@2026.4.23 openclaw@2026.4.15, et étendez les fixtures en forme d’issues avecOPENCLAW_UPGRADE_SURVIVOR_SCENARIOScommereported-issues; l’ensemble reported-issues inclutconfigured-plugin-installspour la réparation automatique de l’installation de Plugins OpenClaw externes. Package Acceptance les expose souspublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesetpublished_upgrade_survivor_scenarios, résout des jetons de référence méta commelast-stable-4ouall-since-2026.4.23, et Full Release Validation étend la porte de package release-soak àlast-stable-4 2026.4.23 2026.5.2 2026.4.15plusreported-issues. - Smoke du contexte d’exécution de session :
pnpm test:docker:session-runtime-contextvérifie la persistance du transcript de contexte d’exécution masqué ainsi que la réparation par doctor des branches affectées de réécriture de prompt dupliquées. - Smoke d’installation globale Bun :
bash scripts/e2e/bun-global-install-smoke.shempaquette l’arborescence actuelle, l’installe avecbun install -gdans un répertoire personnel isolé, et vérifie queopenclaw infer image providers --jsonrenvoie les fournisseurs d’images groupés au lieu de rester bloqué. Réutilisez une archive tar préconstruite avecOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz, ignorez la construction hôte avecOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0, ou copiezdist/depuis une image Docker construite avecOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. - Smoke Docker de l’installateur :
bash scripts/test-install-sh-docker.shpartage un même cache npm entre ses conteneurs root, update et direct-npm. Le smoke de mise à jour utilise par défaut npmlatestcomme référence stable avant la mise à niveau vers l’archive tar candidate. Remplacez avecOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22localement, ou avec l’entréeupdate_baseline_versiondu workflow Install Smoke sur GitHub. Les vérifications d’installateur non-root conservent un cache npm isolé afin que les entrées de cache appartenant à root ne masquent pas le comportement d’installation local à l’utilisateur. DéfinissezOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cachepour réutiliser le cache root/update/direct-npm lors des réexécutions locales. - Install Smoke CI ignore la mise à jour globale direct-npm dupliquée avec
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; exécutez le script localement sans cette variable d’environnement lorsque la couverture directe denpm install -gest nécessaire. - Smoke CLI de suppression d’espace de travail partagé par les agents :
pnpm test:docker:agents-delete-shared-workspace(script :scripts/e2e/agents-delete-shared-workspace-docker.sh) construit par défaut l’image Dockerfile racine, initialise deux agents avec un espace de travail dans un home de conteneur isolé, exécuteagents delete --json, puis vérifie un JSON valide ainsi que le comportement de conservation de l’espace de travail. Réutilisez l’image install-smoke avecOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1. - Réseau Gateway (deux conteneurs, authentification WS + santé) :
pnpm test:docker:gateway-network(script :scripts/e2e/gateway-network-docker.sh) - Smoke d’instantané CDP du navigateur :
pnpm test:docker:browser-cdp-snapshot(script :scripts/e2e/browser-cdp-snapshot-docker.sh) construit l’image E2E source plus une couche Chromium, démarre Chromium avec CDP brut, exécutebrowser doctor --deep, puis vérifie que les instantanés de rôles CDP couvrent les URL de liens, les éléments cliquables promus par le curseur, les références iframe et les métadonnées de frame. - Régression OpenAI Responses web_search avec raisonnement minimal :
pnpm test:docker:openai-web-search-minimal(script :scripts/e2e/openai-web-search-minimal-docker.sh) exécute un serveur OpenAI simulé via Gateway, vérifie queweb_searchélèvereasoning.effortdeminimalàlow, puis force le rejet du schéma fournisseur et vérifie que le détail brut apparaît dans les journaux Gateway. - Pont de canal MCP (Gateway initialisée + pont stdio + smoke de trame de notification Claude brute) :
pnpm test:docker:mcp-channels(script :scripts/e2e/mcp-channels-docker.sh) - Outils MCP du bundle Pi (serveur MCP stdio réel + smoke allow/deny du profil Pi intégré) :
pnpm test:docker:pi-bundle-mcp-tools(script :scripts/e2e/pi-bundle-mcp-tools-docker.sh) - Nettoyage MCP Cron/sous-agent (Gateway réelle + arrêt de l’enfant MCP stdio après exécutions isolées de cron et de sous-agent ponctuel) :
pnpm test:docker:cron-mcp-cleanup(script :scripts/e2e/cron-mcp-cleanup-docker.sh) - Plugins (smoke d’installation/mise à jour pour chemin local,
file:, registre npm avec dépendances hissées, refs git mouvantes, ClawHub kitchen-sink, mises à jour de marketplace et activation/inspection du bundle Claude) :pnpm test:docker:plugins(script :scripts/e2e/plugins-docker.sh) DéfinissezOPENCLAW_PLUGINS_E2E_CLAWHUB=0pour ignorer le bloc ClawHub, ou remplacez la paire package/runtime kitchen-sink par défaut avecOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECetOPENCLAW_PLUGINS_E2E_CLAWHUB_ID. SansOPENCLAW_CLAWHUB_URL/CLAWHUB_URL, le test utilise un serveur fixture ClawHub local hermétique. - Smoke de mise à jour de Plugin inchangée :
pnpm test:docker:plugin-update(script :scripts/e2e/plugin-update-unchanged-docker.sh) - Smoke de matrice de cycle de vie de Plugin :
pnpm test:docker:plugin-lifecycle-matrixinstalle l’archive tar OpenClaw empaquetée dans un conteneur nu, installe un Plugin npm, active/désactive, le met à niveau et le rétrograde via un registre npm local, supprime le code installé, puis vérifie que la désinstallation retire toujours l’état obsolète tout en journalisant les métriques RSS/CPU pour chaque phase du cycle de vie. - Smoke des métadonnées de rechargement de configuration :
pnpm test:docker:config-reload(script :scripts/e2e/config-reload-source-docker.sh) - Plugins :
pnpm test:docker:pluginscouvre le smoke d’installation/mise à jour pour chemin local,file:, registre npm avec dépendances hissées, refs git mouvantes, fixtures ClawHub, mises à jour de marketplace et activation/inspection du bundle Claude.pnpm test:docker:plugin-updatecouvre le comportement de mise à jour inchangée pour les Plugins installés.pnpm test:docker:plugin-lifecycle-matrixcouvre l’installation, l’activation, la désactivation, la mise à niveau, la rétrogradation et la désinstallation avec code manquant d’un Plugin npm avec suivi des ressources.
OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE, restent prioritaires lorsqu’ils sont définis. Lorsque OPENCLAW_SKIP_DOCKER_BUILD=1 pointe vers une image partagée distante, les scripts la récupèrent si elle n’est pas déjà locale. Les tests Docker QR et installateur conservent leurs propres Dockerfiles, car ils valident le comportement de package/d’installation plutôt que l’exécution de l’application construite partagée.
Les runners Docker à modèle live montent également le checkout actuel en lecture seule et
le préparent dans un répertoire de travail temporaire à l’intérieur du conteneur. Cela garde l’image
runtime légère tout en exécutant Vitest sur votre source/configuration locale exacte.
L’étape de préparation ignore les gros caches locaux uniquement et les sorties de build d’app telles que
.pnpm-store, .worktrees, __openclaw_vitest__, ainsi que les répertoires de sortie .build locaux à l’app ou
Gradle, afin que les exécutions live Docker ne passent pas des minutes à copier des artefacts
spécifiques à la machine.
Ils définissent aussi OPENCLAW_SKIP_CHANNELS=1 afin que les sondes live du Gateway ne démarrent pas
de vrais workers de canaux Telegram/Discord/etc. dans le conteneur.
test:docker:live-models exécute toujours pnpm test:live, donc transmettez aussi
OPENCLAW_LIVE_GATEWAY_* quand vous devez restreindre ou exclure la couverture live du Gateway
de cette lane Docker.
test:docker:openwebui est un smoke de compatibilité de plus haut niveau : il démarre un
conteneur Gateway OpenClaw avec les endpoints HTTP compatibles OpenAI activés,
démarre un conteneur Open WebUI épinglé contre ce Gateway, se connecte via
Open WebUI, vérifie que /api/models expose openclaw/default, puis envoie une
vraie requête de chat via le proxy /api/chat/completions d’Open WebUI.
Définissez OPENWEBUI_SMOKE_MODE=models pour les contrôles CI du chemin de release qui doivent s’arrêter
après la connexion à Open WebUI et la découverte des modèles, sans attendre une complétion
de modèle live.
La première exécution peut être sensiblement plus lente, car Docker peut devoir tirer l’image
Open WebUI et Open WebUI peut devoir terminer sa propre configuration de démarrage à froid.
Cette lane attend une clé de modèle live utilisable, et OPENCLAW_PROFILE_FILE
(~/.profile par défaut) est le moyen principal de la fournir dans les exécutions Dockerisées.
Les exécutions réussies affichent une petite charge utile JSON comme { "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels est volontairement déterministe et ne nécessite pas de
vrai compte Telegram, Discord ou iMessage. Il démarre un conteneur Gateway prérempli,
démarre un second conteneur qui lance openclaw mcp serve, puis vérifie la
découverte de conversations routées, la lecture de transcriptions, les métadonnées de pièces jointes,
le comportement de la file d’événements live, le routage des envois sortants et les notifications de canal +
permission de style Claude via le vrai pont MCP stdio. La vérification des notifications
inspecte directement les trames MCP stdio brutes afin que le smoke valide ce que le
pont émet réellement, pas seulement ce qu’un SDK client spécifique expose par hasard.
test:docker:pi-bundle-mcp-tools est déterministe et ne nécessite pas de clé de modèle live.
Il construit l’image Docker du dépôt, démarre un vrai serveur de sonde MCP stdio
dans le conteneur, matérialise ce serveur via le runtime MCP du bundle Pi embarqué,
exécute l’outil, puis vérifie que coding et messaging conservent les outils
bundle-mcp tandis que minimal et tools.deny: ["bundle-mcp"] les filtrent.
test:docker:cron-mcp-cleanup est déterministe et ne nécessite pas de clé de modèle live.
Il démarre un Gateway prérempli avec un vrai serveur de sonde MCP stdio, exécute un
tour Cron isolé et un tour enfant ponctuel /subagents spawn, puis vérifie
que le processus enfant MCP se termine après chaque exécution.
Smoke manuel de thread ACP en langage naturel (pas CI) :
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Conservez ce script pour les workflows de régression/débogage. Il pourra être de nouveau nécessaire pour la validation du routage de thread ACP, donc ne le supprimez pas.
OPENCLAW_CONFIG_DIR=...(par défaut :~/.openclaw) monté sur/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(par défaut :~/.openclaw/workspace) monté sur/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...(par défaut :~/.profile) monté sur/home/node/.profileet sourcé avant l’exécution des testsOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1pour vérifier uniquement les variables d’environnement sourcées depuisOPENCLAW_PROFILE_FILE, avec des répertoires temporaires de configuration/workspace et sans montages d’authentification CLI externesOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(par défaut :~/.cache/openclaw/docker-cli-tools) monté sur/home/node/.npm-globalpour les installations CLI mises en cache dans Docker- Les répertoires/fichiers d’authentification CLI externes sous
$HOMEsont montés en lecture seule sous/host-auth..., puis copiés dans/home/node/...avant le démarrage des tests- Répertoires par défaut :
.minimax - Fichiers par défaut :
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Les exécutions restreintes à des fournisseurs montent uniquement les répertoires/fichiers nécessaires déduits de
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Remplacez manuellement avec
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=noneou une liste séparée par des virgules commeOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Répertoires par défaut :
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...pour restreindre l’exécutionOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...pour filtrer les fournisseurs dans le conteneurOPENCLAW_SKIP_DOCKER_BUILD=1pour réutiliser une imageopenclaw:local-liveexistante lors des réexécutions qui ne nécessitent pas de reconstructionOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1pour s’assurer que les identifiants proviennent du magasin de profils (pas de l’environnement)OPENCLAW_OPENWEBUI_MODEL=...pour choisir le modèle exposé par le Gateway pour le smoke Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...pour remplacer le prompt de vérification par nonce utilisé par le smoke Open WebUIOPENWEBUI_IMAGE=...pour remplacer le tag d’image Open WebUI épinglé
Vérification de cohérence des docs
Exécutez les contrôles de docs après les modifications de documentation :pnpm check:docs.
Exécutez la validation complète des ancres Mintlify quand vous avez aussi besoin de contrôles des titres dans la page : pnpm docs:check-links:anchors.
Régression hors ligne (compatible CI)
Il s’agit de régressions de « vrai pipeline » sans vrais fournisseurs :- Appel d’outils du Gateway (OpenAI simulé, vrai Gateway + boucle d’agent) :
src/gateway/gateway.test.ts(cas : “runs a mock OpenAI tool call end-to-end via gateway agent loop”) - Assistant de configuration du Gateway (WS
wizard.start/wizard.next, écrit la configuration + auth appliquée) :src/gateway/gateway.test.ts(cas : “runs wizard over ws and writes auth token config”)
Évaluations de fiabilité de l’agent (skills)
Nous avons déjà quelques tests compatibles CI qui se comportent comme des « évaluations de fiabilité d’agent » :- Appel d’outils simulé via le vrai Gateway + boucle d’agent (
src/gateway/gateway.test.ts). - Flux d’assistant de configuration de bout en bout qui valident le câblage de session et les effets de configuration (
src/gateway/gateway.test.ts).
- Prise de décision : quand les skills sont listées dans le prompt, l’agent choisit-il la bonne skill (ou évite-t-il celles qui ne sont pas pertinentes) ?
- Conformité : l’agent lit-il
SKILL.mdavant utilisation et suit-il les étapes/arguments requis ? - Contrats de workflow : scénarios multi-tours qui vérifient l’ordre des outils, la conservation de l’historique de session et les limites du bac à sable.
- Un runner de scénarios utilisant des fournisseurs simulés pour vérifier les appels d’outils + leur ordre, les lectures de fichiers de skill et le câblage de session.
- Une petite suite de scénarios centrés sur les skills (utiliser ou éviter, garde-fous, injection de prompt).
- Des évaluations live optionnelles (opt-in, conditionnées par l’environnement) uniquement après la mise en place de la suite compatible CI.
Tests de contrat (forme des plugins et des canaux)
Les tests de contrat vérifient que chaque plugin et canal enregistré respecte son contrat d’interface. Ils itèrent sur tous les plugins découverts et exécutent une suite de vérifications de forme et de comportement. La lane unitairepnpm test par défaut
ignore volontairement ces fichiers partagés de seam et de smoke ; exécutez explicitement
les commandes de contrat quand vous touchez des surfaces partagées de canal ou de fournisseur.
Commandes
- Tous les contrats :
pnpm test:contracts - Contrats de canaux uniquement :
pnpm test:contracts:channels - Contrats de fournisseurs uniquement :
pnpm test:contracts:plugins
Contrats de canaux
Situés danssrc/channels/plugins/contracts/*.contract.test.ts :
- plugin - Forme de base du plugin (id, nom, capacités)
- setup - Contrat de l’assistant de configuration
- session-binding - Comportement de liaison de session
- outbound-payload - Structure de la charge utile des messages
- inbound - Gestion des messages entrants
- actions - Gestionnaires d’actions de canal
- threading - Gestion des ID de thread
- directory - API d’annuaire/roster
- group-policy - Application de la politique de groupe
Contrats d’état des fournisseurs
Situés danssrc/plugins/contracts/*.contract.test.ts.
- status - Sondes d’état de canal
- registry - Forme du registre de plugins
Contrats de fournisseurs
Situés danssrc/plugins/contracts/*.contract.test.ts :
- auth - Contrat du flux d’authentification
- auth-choice - Choix/sélection d’authentification
- catalog - API de catalogue de modèles
- discovery - Découverte de plugins
- loader - Chargement de plugins
- runtime - Runtime de fournisseur
- shape - Forme/interface de plugin
- wizard - Assistant de configuration
Quand exécuter
- Après avoir modifié les exports ou sous-chemins de plugin-sdk
- Après avoir ajouté ou modifié un plugin de canal ou de fournisseur
- Après avoir refactorisé l’enregistrement ou la découverte de plugins
Ajouter des régressions (conseils)
Quand vous corrigez un problème de fournisseur/modèle découvert en live :- Ajoutez une régression compatible CI si possible (fournisseur simulé/stub, ou capture de la transformation exacte de la forme de requête)
- Si c’est intrinsèquement live-only (limites de débit, politiques d’authentification), gardez le test live restreint et opt-in via des variables d’environnement
- Préférez cibler la plus petite couche qui détecte le bug :
- bug de conversion/rejeu de requête fournisseur → test direct des modèles
- bug de pipeline session/historique/outils du Gateway → smoke live Gateway ou test Gateway simulé compatible CI
- Garde-fou de traversée SecretRef :
src/secrets/exec-secret-ref-id-parity.test.tsdérive une cible échantillonnée par classe SecretRef à partir des métadonnées du registre (listSecretTargetRegistryEntries()), puis vérifie que les ids exec à segment de traversée sont rejetés.- Si vous ajoutez une nouvelle famille de cibles SecretRef
includeInPlandanssrc/secrets/target-registry-data.ts, mettez à jourclassifyTargetClassdans ce test. Le test échoue volontairement sur les ids de cible non classifiés afin que les nouvelles classes ne puissent pas être ignorées silencieusement.