Tests
OpenClaw possède trois suites Vitest (unit/integration, e2e, live) et un petit ensemble de runners Docker. Ce document est un guide “comment nous testons” :
- Ce que couvre chaque suite (et ce qu’elle ne couvre pas délibérément).
- Quelles commandes exécuter pour les workflows courants (local, pre-push, débogage).
- Comment les tests live découvrent les identifiants et sélectionnent les modèles/providers.
- Comment ajouter des régressions pour les problèmes réels de modèles/providers.
Quick start
Section intitulée « Quick start »La plupart des jours :
- Passerelle complète (attendue avant le push) :
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Exécution locale plus rapide de la suite complète sur une machine puissante :
pnpm test:max - Boucle de surveillance directe Vitest :
pnpm test:watch - Le ciblage direct de fichiers route désormais également les chemins d’extension/de canal :
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Privilégiez d’abord les exécutions ciblées lorsque vous itérez sur un seul échec.
- Site QA avec support Docker : Docker
pnpm qa:lab:up - Voie QA avec support VM Linux : Linux
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
Lorsque vous modifiez des tests ou souhaitez une confiance supplémentaire :
- Passerelle de couverture :
pnpm test:coverage - Suite E2E :
pnpm test:e2e
Lors du débogage de vrais providers/modèles (nécessite de vrais identifiants) :
- Suite Live (modèles + sondes d’outil/image de passerelle) :
pnpm test:live - Cibler un fichier live en silence :
pnpm test:live -- src/agents/models.profiles.live.test.ts - Rapports de performance d’exécution : dispatchez
OpenClaw Performanceaveclive_openai_candidate=truepour un tour d’agentopenai/gpt-5.5réel oudeep_profile=truepour les artefacts de trace, de tas et de CPU de Kova. Les exécutions planifiées quotidiennes publient les artefacts des voies mock-provider, deep-profile et GPT 5.5 versopenclaw/clawgrit-reportslorsqueCLAWGRIT_REPORTS_TOKENest configuré. Le rapport du mock-provider inclut également les chiffres de démarrage du CLI, du démarrage de la passerelle au niveau source, de la mémoire, de la pression des plugins, et de la boucle de salutation hello-loop avec fake-model répétée. - Balayage de modèle en direct Docker :
pnpm test:docker:live-models- Chaque modèle sélectionné exécute désormais un tour de texte plus une petite sonde de type lecture de fichier.
Les modèles dont les métadonnées annoncent une entrée
imageexécutent également un minuscule tour d’image. Désactivez les sondes supplémentaires avecOPENCLAW_LIVE_MODEL_FILE_PROBE=0ouOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0lors de l’isolement des pannes de fournisseur. - Couverture CI : le
OpenClaw Scheduled Live And E2E Checksquotidien et leOpenClaw Release Checksmanuel appellent tous deux le workflow réutilisable live/E2E avecinclude_live_suites: true, qui inclut des travaux de matrice distincts pour les modèles en direct Docker partitionnés par fournisseur. - Pour des réexécutions CI ciblées, dispatchez
OpenClaw Live And E2E Checks (Reusable)avecinclude_live_suites: trueetlive_models_only: true. - Ajoutez de nouveaux secrets de fournisseur à signal élevé à
scripts/ci-hydrate-live-auth.shainsi qu’à.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 de texte plus une petite sonde de type lecture de fichier.
Les modèles dont les métadonnées annoncent une entrée
- Test de fumée de chat lié Codex natif :
pnpm test:docker:live-codex-bind- Exécute une voie en direct Docker sur le chemin du serveur d’application Codex, lie un
Slack DM synthétique avec
/codex bind, exerce/codex fastet/codex permissions, puis vérifie qu’une réponse simple et une pièce jointe d’image passent par la liaison native du plugin au lieu de l’ACP.
- Exécute une voie en direct Docker sur le chemin du serveur d’application Codex, lie un
Slack DM synthétique avec
- Test de fumée du harnais de serveur d’application Codex :
pnpm test:docker:live-codex-harness- Exécute les tours de l’agent passerelle via le harnais app-server Codex propriétaire du plugin,
vérifie
/codex statuset/codex models, et par défaut teste image, cron MCP, sub-agent, et les sondes Guardian. Désactivez la sonde sub-agent avecOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0lors de l’isolement d’autres échecs du app-server Codex. Pour une vérification ciblée du sub-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. Ceci s’arrête après la sonde sub-agent à moins queOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0ne soit défini.
- Exécute les tours de l’agent passerelle via le harnais app-server Codex propriétaire du plugin,
vérifie
- Test de fumée de l’installation à la demande de Codex :
pnpm test:docker:codex-on-demand- Installe l’archive tar OpenClaw empaquetée dans Docker, exécute l’onboarding
de la clé OpenAI API, 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 l’archive tar OpenClaw empaquetée dans Docker, exécute l’onboarding
de la clé OpenAI API, et vérifie que le plugin Codex ainsi que la dépendance
- Test de fumée de la dépendance d’outil de plugin en direct :
pnpm test:docker:live-plugin-tool- Empaquette un plugin de test avec une dépendance
slugifyréelle, l’installe vianpm-pack:, vérifie la dépendance sous la racine npm gérée, puis demande à un model OpenAI en direct d’appeler l’outil du plugin et de retourner le slug masqué.
- Empaquette un plugin de test avec une dépendance
- Test de fumée de la commande de secours Crestodian :
pnpm test:live:crestodian-rescue-channel- Vérification de sécurité supplémentaire (opt-in) pour la surface de commande de secours
du message-channel. Elle exécute
/crestodian status, met en file un changement de model persistant, répond/crestodian yes, et vérifie le chemin d’écriture d’audit/config.
- Vérification de sécurité supplémentaire (opt-in) pour la surface de commande de secours
du message-channel. Elle exécute
- Test de fumée du planificateur Crestodian Docker :
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 approximatif se traduit par une écriture de configuration typée et auditée.
- Exécute Crestodian dans un conteneur sans configuration avec un faux CLI Claude sur
- Test de fumée de la première exécution Crestodian Docker :
pnpm test:docker:crestodian-first-run- Commence à partir d’un répertoire d’état OpenClaw vide, achemine OpenClaw
openclawnu vers Crestodian, applique l’écriture de la configuration/modele/agent/plugin Discord + SecretRef, valide la configuration et vérifie les entrées d’audit. Le même chemin de configuration Ring 0 est également couvert dans le QA Lab parpnpm openclaw qa suite --scenario crestodian-ring-zero-setup.
- Commence à partir d’un répertoire d’état OpenClaw vide, achemine OpenClaw
- 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 rapporte Moonshot/K2.6 et que la transcription de l’assistant stocke leusage.costnormalisé.
Runners spécifiques QA
Section intitulée « Runners spécifiques QA »Ces commandes se situent à côté des principales suites de tests lorsque vous avez besoin de réalisme de laboratoire QA :
CI exécute QA Lab dans des workflows dédiés. La parité agentic est imbriquée sous
QA-Lab - All Lanes et la validation de version, et non dans un workflow de PR autonome.
Une validation large doit utiliser Full Release Validation avec
rerun_group=qa-parityDocker ou le groupe QA release-checks. Les vérifications de version stables/défaut gardent
un soak exhaustif live/Docker derrière run_release_soak=true ; le
profil full force le soak. QA-Lab - All Lanes
s’exécute nightly sur main et depuis un déclenchement manuel avec le volet de parité simulée, le
volet live Matrix, le volet live Telegram géré par Convex, et le volet live Discord géré par Convex
comme travaux parallèles. Les QA planifiés et les vérifications de version passent le Matrix
--profile fast explicitement, alors que le Matrix CLI et l’entrée du workflow manuel restent
par défaut all ; le déclenchement manuel peut diviser all en transport,
media, e2ee-smoke, e2ee-deep, et e2ee-cli travaux. OpenClaw Release Checks exécute la parité ainsi que les volets rapides Matrix et Telegram avant l’approbation de
la version, en utilisant mock-openai/gpt-5.5 pour les vérifications de transport de version afin qu’elles restent déterministes et évitent le démarrage normal des plugins de fournisseur. Ces passerelles de transport live désactivent la recherche de mémoire ; le comportement de la mémoire reste couvert par les suites de parité QA.
Les shards de médias live complets pour la version utilisent
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, qui possède déjà
ffmpeg et ffprobe. Les shards live de modèle/backend Docker utilisent l’image partagée
ghcr.io/openclaw/openclaw-live-test:<sha> construite une fois par commit
sélectionné, puis la tirent avec OPENCLAW_SKIP_DOCKER_BUILD=1 au lieu de la reconstruire
à l’intérieur de chaque shard.
pnpm openclaw qa suite- Exécute les scénarios QA basés sur le 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 de passerelle isolés.
qa-channela une concurrence par défaut 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’ancienne voie série. - Se termine avec un code non-zéro si un scénario échoue. Utilisez
--allow-failureslorsque vous souhaitez des artefacts sans code de sortie en échec. - Prend en charge les modes de provider
live-frontier,mock-openaietaimock.aimockdémarre un serveur provider local soutenu par AIMock pour une couverture expérimentale de fixtures et de mocks de protocole sans remplacer la voiemock-openaiconsciente des scénarios.
pnpm test:plugins:kitchen-sink-live- Exécute le gauntlet du plugin Kitchen Sink en direct OpenAI 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 de la passerelle, exécute un tour en direct OpenAI et vérifie les diagnostics contradictoires. Nécessite une authentification live OpenAI telle queOPENAI_API_KEY. Dans les sessions Testbox hydratées, il sourç automatiquement le profil live-auth Testbox lorsque le helperopenclaw-testbox-envest présent.
- Exécute le gauntlet du plugin Kitchen Sink en direct OpenAI 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 de la passerelle plus un petit pack de scénarios simulés QA Lab
(
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) et écrit un résumé combiné d’observations CPU sous.artifacts/gateway-cpu-scenarios/. - Signale par défaut uniquement les observations CPU chaudes soutenues (
--cpu-core-warnplus--hot-wall-warn-ms), de sorte que les courtes poussées de démarrage sont enregistrées comme métriques sans ressembler à la régression de blocage de passerelle de plusieurs minutes. - Utilise les artefacts
distconstruits ; lancez d’abord une build lorsque le checkout ne possède pas déjà une sortie d’exécution fraîche.
- Exécute le banc de démarrage de la passerelle plus un petit pack de scénarios simulés QA Lab
(
pnpm openclaw qa suite --runner multipass- Exécute la même suite QA dans une machine virtuelle 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 de provider/model que
qa suite. - Les exécutions Live transmettent les entrées d’auth QA prises en charge qui sont pratiques pour l’invité :
les clés de provider basées sur env, le chemin de configuration du provider QA live, et
CODEX_HOMElorsqu’elles sont présentes. - Les répertoires de sortie doivent rester sous la racine du dépôt pour que l’invité puisse écrire en retour à travers l’espace de travail monté.
- Écrit le rapport QA normal + le résumé ainsi que les journaux Multipass sous
.artifacts/qa-e2e/....
pnpm qa:lab:up- Démarre le site QA soutenu par Docker pour un travail de style opérateur.
pnpm test:docker:npm-onboard-channel-agent- Construit un tarball npm à partir du checkout actuel, l’installe globalement dans Docker, exécute un onboarding non-interactif de la clé API OpenAI, configure Telegram par défaut, vérifie que le runtime du plugin packagé se charge sans réparation des dépendances au démarrage, exécute doctor, et lance un tour d’agent local contre une endpoint OpenAI simulée.
- Utilisez
OPENCLAW_NPM_ONBOARD_CHANNEL=discordpour exécuter la même voie d’installation packagée avec Discord.
pnpm test:docker:session-runtime-context- Exécute un smoke déterministe de l’application intégrée via Docker pour les transcripts de contexte d’exécution intégrés. Il vérifie que le contexte d’exécution caché de OpenClaw est conservé sous forme de message personnalisé non affiché au lieu de fuir dans le tour utilisateur visible, puis insère un JSONL de session cassée affectée et vérifie que
openclaw doctor --fixle réécrit vers la branche active avec une sauvegarde.
- Exécute un smoke déterministe de l’application intégrée via Docker pour les transcripts de contexte d’exécution intégrés. Il vérifie que le contexte d’exécution caché de OpenClaw est conservé sous forme de message personnalisé non affiché au lieu de fuir dans le tour utilisateur visible, puis insère un JSONL de session cassée affectée et vérifie que
pnpm test:docker:npm-telegram-live- Installe un candidat de paquet OpenClaw dans Docker, exécute l’onboarding du paquet installé, configure Telegram via le CLI installé, puis réutilise le voie QA Telegram en direct avec ce paquet installé en tant que Gateway du SUT.
- Le wrapper monte uniquement la source du harnais
qa-labdepuis l’extraction ; le package installé possèdedist,openclaw/plugin-sdket le runtime du plugin groupé de sorte que la voie ne mélange pas les plugins de l’extraction actuelle dans le package testé. - 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 un tarball local résolu au lieu de l’installer depuis le registre. - Utilise les mêmes informations d’identification env Telegram ou la source d’informations d’identification Convex que
pnpm openclaw qa telegram. Pour l’automatisation CI/release, définissezOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexplusOPENCLAW_QA_CONVEX_SITE_URLet le secret de rôle. SiOPENCLAW_QA_CONVEX_SITE_URLet un secret de rôle Convex sont présents dans CI, le wrapper Docker sélectionne automatiquement Convex. - Le wrapper valide les informations d’identification env Telegram ou Convex sur l’hôte avant
le travail de construction/installation Docker. Définissez
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1uniquement lors du débogage délibéré de la configuration pré-information d’identification. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainerremplace leOPENCLAW_QA_CREDENTIAL_ROLEpartagé pour cette voie uniquement.- GitHub Actions expose cette voie sous le nom de workflow manuel du mainteneur
NPM Telegram Beta E2E. Il ne s’exécute pas lors de la fusion. Le workflow utilise l’environnementqa-live-sharedet les baux d’identifiants CI Convex.
- GitHub Actions expose également
Package Acceptancepour la preuve de produit parallèle contre un package candidat. Il accepte une référence de confiance, une spec npm publiée, une URL d’archive tar HTTPS plus SHA-256, ou un artefact d’archive tar d’une autre exécution, télécharge leopenclaw-current.tgznormalisé sous le nompackage-under-test, puis exécute le planificateur E2E Docker existant avec les profils de voie 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.- Dernière vérification de produit bêta :
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- La vérification exacte par URL d’archive tar nécessite un résumé :
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- La vérification par artefact télécharge une archive tar d’une autre exécution d’Actions :
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- Empaquette et installe la version actuelle de OpenClaw dans Docker, démarre le Gateway avec OpenAI configuré, puis active les channel/plugins groupés via des modifications de configuration.
- Vérifie que la découverte de la configuration laisse les plugins téléchargeables non configurés absents, que la première réparation de doctor configurée installe explicitement chaque plugin téléchargeable manquant, et qu’un second redémarrage n’exécute pas la réparation des dépendances cachées.
- Installe également une base de référence npm plus ancienne connue, active Telegram avant d’exécuter
openclaw update --tag <candidate>, et vérifie que le médecin post-mise à jour du candidat nettoie les débris de dépendance de plugin hérités sans réparation postinstall du côté du harnais.
-
pnpm test:parallels:npm-update-
Exécute le test de fumée de mise à jour d’installation packagée native sur les invités Parallels. Chaque plateforme sélectionnée installe d’abord le package de base de référence demandé, puis exécute la commande
openclaw updateinstallée sur le même invité et vérifie la version installée, l’état de la mise à jour, la disponibilité de la passerelle et un tour d’agent local. -
Utilisez
--platform macos,--platform windowsou--platform linuxtout en itérant sur un invité. Utilisez--jsonpour le chemin de l’artefact récapitulatif et l’état par voie. -
La voie OpenAI utilise
openai/gpt-5.5pour la preuve de tour d’agent en direct par défaut. Passez--model <provider/model>ou définissezOPENCLAW_PARALLELS_OPENAI_MODELlors de la validation délibérée d’un autre model OpenAI. -
Encadrez les exécutions locales longues avec un délai d’attente de l’hôte pour que les blocages du transport Parallels ne puissent pas consommer le reste de la fenêtre de tests :
Fenêtre de terminal timeout --foreground 150m pnpm test:parallels:npm-update -- --jsontimeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
Le script écrit des journaux de voie 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 travail de diagnostic et de mise à jour des packages sur un invité à froid ; cela est encore sain lorsque le journal de debug npm imbriqué progresse.
-
N’exécutez pas cet enveloppeur agrégé en parallèle avec les voies de test de fumée Parallels macOS, Windows ou Linux individuelles. Elles partagent l’état de la machine virtuelle et peuvent entrer en collision lors de la restauration d’instantané, de la diffusion de packages ou de l’état de la passerelle de l’invité.
-
La preuve de post-mise à jour exécute la surface normale du plugin groupé car les façades de fonctionnalités telles que la reconnaissance vocale, la génération d’images et la compréhension des médias sont chargées via les API d’exécution groupées, même lorsque le tour d’agent lui-même ne vérifie qu’une réponse textuelle simple.
-
-
pnpm openclaw qa aimock- Démarre uniquement le serveur de fournisseur AIMock local pour le test de fumée direct du protocole.
-
pnpm openclaw qa matrix- Exécute la voie QA live Matrix sur un serveur domestique Tuwunel éphémère soutenu par Docker. Réservé au checkout source - les installations empaquetées n’incluent pas
qa-lab. - CLI complet, catalogue de profils/scénarios, env vars et disposition des artefacts : Matrix QA.
- Exécute la voie QA live Matrix sur un serveur domestique Tuwunel éphémère soutenu par Docker. Réservé au checkout source - les installations empaquetées n’incluent pas
-
pnpm openclaw qa telegram- Exécute la voie QA en direct Telegram contre un groupe privé réel en utilisant les jetons de bot du pilote et du SUT provenant de l’environnement.
- Nécessite
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENetOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. L’identifiant de groupe doit être l’identifiant de chat numérique Telegram. - Prend en charge
--credential-source convexpour les identifiants partagés en pool. Utilise le mode env par défaut, ou définissezOPENCLAW_QA_CREDENTIAL_SOURCE=convexpour opter pour les baux en pool. - Les valeurs par défaut couvrent canary, mention gating, addressing de commande,
/status, les réponses mentionnées bot-à-bot et les réponses de commandes natives principales. Les valeurs par défautmock-openaicouvrent également les régressions de chaîne de réponse déterministe et le streaming de message final Telegram. Utilisez--list-scenariospour des sondes facultatives telles quesession_status. - Sort avec un code non nul si un scénario échoue. Utilisez
--allow-failureslorsque vous souhaitez des artefacts sans code de sortie d’échec. - Nécessite deux bots distincts dans le même groupe privé, le bot SUT exposant un nom d’utilisateur Telegram.
- Pour une observation stable bot-à-bot, activez le mode de communication Bot-to-Bot dans
@BotFatherpour les deux bots et assurez-vous que le bot pilote peut observer le trafic du bot de groupe. - Écrit un rapport QA Telegram, un résumé et un artefact des messages observés sous
.artifacts/qa-e2e/.... Les scénarios de réponse incluent le RTT de la demande d’envoi du pilote à la réponse observée du SUT.
Mantis Telegram Live est le wrapper de preuves pour PR autour de cette voie. Il exécute la référence candidate avec les identifiants Telegram loués via Convex, rend la transcription des messages observés expurgés dans un navigateur de bureau Crabbox, enregistre une preuve MP4, génère un GIF rogné par mouvement, télécharge le bundle d’artefacts et publie des preuves en ligne dans la PR via l’application Mantis GitHub 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 demande de tirage :
@openclaw-mantis telegram@openclaw-mantis telegram scenario=telegram-status-command@openclaw-mantis telegram scenarios=telegram-status-command,telegram-mentioned-message-replyMantis Telegram Desktop Proof est le wrapper d’agent natif avant/après pour Telegram Desktop, destiné à 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 :
@openclaw-mantis telegram desktop proofL’agent Mantis lit la PR, décide quel comportement visible sur Telegram prouve le changement, exécute la voie de preuve Crabbox Telegram Desktop utilisateur réel sur les références de base et candidates, itère jusqu’à ce que les GIF natifs soient utiles, écrit un manifeste motionPreview couplé et publie le même tableau GIF à 2 colonnes via l’application Mantis GitHub lorsque pr_number est défini.
pnpm openclaw qa mantis telegram-desktop-builder- Loue ou réutilise un bureau Crabbox Linux, installe le bureau natif Telegram Desktop, configure OpenClaw avec un jeton de bot SUT Telegram loué, démarre la passerelle et enregistre des preuves de capture d’écran/MP4 depuis le bureau VNC visible.
- Par défaut, il utilise
--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 a toujours besoin d’une connexion/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.
Les voies de transport en direct partagent un contrat standard afin que les nouveaux transports ne dérivent pas ; la matrice de couverture par voie se trouve dans QA overview → Live transport coverage. qa-channel est la suite synthétique large et ne fait pas partie de cette matrice.
Identifiants Telegram partagés via Convex (v1)
Section intitulée « Identifiants Telegram partagés via Convex (v1) »Lorsque --credential-source convex (ou OPENCLAW_QA_CREDENTIAL_SOURCE=convex) est activé pour la QA du transport en direct, le laboratoire de QA acquiert un bail exclusif depuis un pool alimenté par Convex, envoie un signal de présence (heartbeat) sur ce bail pendant que la voie est en cours d’exécution, et libère le bail à l’arrêt. Le nom de la section précède le support de Discord, Slack et WhatsApp ; le contrat de bail est partagé entre les différents types.
Référence de l’échafaudage de projet Convex :
qa/convex-credential-broker/
Variables d’environnement requises :
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 - Env par défaut :
OPENCLAW_QA_CREDENTIAL_ROLE(vautcipar défaut dans CI,maintainersinon)
- CLI :
Variables d’environnement optionnelles :
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(défaut1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(défaut30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(défaut90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(défaut15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(défaut/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(id de trace optionnel)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1permet les URL de bouclage (loopback)http://Convex pour un développement uniquement local.
OPENCLAW_QA_CONVEX_SITE_URL devrait utiliser https:// en fonctionnement normal.
Les commandes d’administration du mainteneur (pool add/remove/list) nécessitent OPENCLAW_QA_CONVEX_SECRET_MAINTAINER spécifiquement.
Aides CLI pour les responsables :
pnpm openclaw qa credentials doctorpnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.jsonpnpm openclaw qa credentials list --kind telegrampnpm openclaw qa credentials remove --credential-id <credential-id>Utilisez doctor avant les exécutions en direct pour vérifier l’URL du site Convex, les secrets du courtier, le préfixe de point de terminaison, le délai d’attente HTTP et l’accessibilité de la liste d’administration sans imprimer les valeurs secrètes. Utilisez --json pour une sortie lisible par machine dans les scripts et les utilitaires CI.
Contrat de point de terminaison 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é/réessayable :
{ 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" }(ou vide2xx)
- Requête :
POST /release- Requête :
{ kind, ownerId, actorRole, credentialId, leaseToken } - Succès :
{ status: "ok" }(ou vide2xx)
- Requête :
POST /admin/add(secret de mainteneur uniquement)- Requête :
{ kind, actorId, payload, note?, status? } - Succès :
{ status: "ok", credential }
- Requête :
POST /admin/remove(secret de mainteneur uniquement)- Requête :
{ credentialId, actorId } - Succès :
{ status: "ok", changed, credential } - Garantie de bail actif :
{ status: "error", code: "LEASE_ACTIVE", ... }
- Requête :
POST /admin/list(secret de mainteneur uniquement)- Requête :
{ kind?, status?, includePayload?, limit? } - Succès :
{ status: "ok", credentials, count }
- Requête :
Structure de la charge utile pour le type Telegram :
{ groupId: string, driverToken: string, sutToken: string }groupIddoit être une chaîne d’identifiant de chat Telegram numérique.admin/addvalide cette forme pourkind: "telegram"et rejette les charges utiles malformées.
Structure de la charge utile pour le type réel d’utilisateur Telegram :
{ 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"est réservé pour le flux de travail de preuve Mantis Telegram Desktop. Les voies QA Lab génériques ne doivent pas l’acquérir.
Payloads multi-canal validés par le courtier :
- Discord : Discord :
{ guildId: string, channelId: string, driverBotToken: string, sutBotToken: string, sutApplicationId: string, voiceChannelId?: string } - WhatsApp : WhatsApp :
{ driverPhoneE164: string, sutPhoneE164: string, driverAuthArchiveBase64: string, sutAuthArchiveBase64: string, groupJid?: string }
Les voies Slack peuvent également louer depuis le pool, mais la validation des payloads Slack réside actuellement dans le runner QA Slack plutôt que dans le courtier. Utilisez { channelId: string, driverBotToken: string, sutBotToken: string, sutAppToken: string } pour les lignes Slack.
Ajouter un canal à QA
Section intitulée « Ajouter un canal à QA »L’architecture et les noms des assistants de scénario pour les nouveaux adaptateurs de canal se trouvent dans Aperçu QA → Ajouter un canal. Le minimum requis : implémenter le runner de transport sur le seam d’hôte partagé qa-lab, déclarer qaRunners dans le manifeste du plugin, monter en tant que openclaw qa <runner>, et rédiger des scénarios sous qa/scenarios/.
Suites de tests (ce qui s’exécute où)
Section intitulée « Suites de tests (ce qui s’exécute où) »Pensez aux suites comme à un « réalisme croissant » (et à une instabilité/coût croissants) :
Unité / intégration (par défaut)
Section intitulée « Unité / intégration (par défaut) »- Commande :
pnpm test - Config : les exécutions non ciblées utilisent l’ensemble de shards
vitest.full-*.config.tset peuvent étendre les shards multi-projets 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 UI s’exécutent dans le shard dédiéunit-ui - Portée :
- Tests unitaires purs
- Tests d’intégration en processus (auth passerelle, routage, outils, analyse, config)
- Régressions déterministes pour les bogues connus
- Attentes :
- S’exécute dans CI
- Aucune clé réelle requise
- Doit être rapide et stable
- Les tests de résolveur et de chargeur de surface publique doivent prouver un large comportement de repli
api.jsetruntime-api.jsavec des fixtures de minuscules plugins générés, et non les vraies API sources de plugins empaquetés. Les vrais chargements d’API de plugin appartiennent aux suites de contrat/intégration propres aux plugins.
Politique de dépendance native :
- Les installations de test par défaut ignorent les constructions natives optionnelles d’opus Discord. La réception vocale Discord utilise le décodeur pure-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 dédiée aux performances vocales ou en direct Discord si vous avez besoin de comparer une construction native d’opus. Ne définissez pas
@discordjs/opussurtruedans leallowBuildspar défaut ; cela ferait compiler du code natif lors des boucles d’installation/test sans rapport.
Projets, shards et volets délimités
pnpm testnon ciblé exécute douze configurations de shard 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 seul processus géant de projet racine natif. Cela réduit le RSS de pointe sur les machines chargées et évite que le travail de réponse automatique/d’extension ne prive les suites non liées.pnpm test --watchutilise toujours le graphe de projet racine natifvitest.config.ts, car une boucle de surveillance multi-shard n’est pas pratique.pnpm test,pnpm test:watchetpnpm test:perf:importsacheminent d’abord les cibles de fichiers/répertoires explicites via des volets délimités, de sorte quepnpm test extensions/discord/src/monitor/message-handler.preflight.test.tsévite de payer la taxe de démarrage complète du projet racine.pnpm test:changeddéveloppe les chemins git modifiés en volets délimités peu coûteux par défaut : modifications directes de tests, fichiers*.test.tsfrères, mappages de source explicites et dépendants du graphe d’importation local. Les modifications de configuration/d’installation/package n’exécutent pas des tests étendus sauf si vous utilisez explicitementOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed.pnpm check:changedest la passerelle de contrôle locale intelligente normale pour les travaux étroits. Il classe la différence en core, tests core, extensions, tests d’extension, applications, documentation, métadonnées de publication, outil Docker en direct, et outil, puis exécute les commandes typecheck, lint et guard correspondantes. Il n’exécute pas les tests Vitest ; appelezpnpm test:changedou un `pnpm test
explicite pour la preuve de test. Les incrémentations de version uniquement pour les métadonnées de publication exécutent des vérifications ciblées de version/config/root-dependency, avec une garde qui rejette les modifications de package en dehors du champ de version de niveau supérieur. - Les modifications du harnais ACP Docker en direct exécutent des vérifications ciblées : syntaxe shell pour les scripts d'authentification Docker en direct et un essai à sec du planificateur Docker en direct. Les modificationspackage.jsonne sont incluses que lorsque la différence est limitée àscripts[“test:docker:live-”]; les modifications de dépendance, d'exportation, de version et d'autres éditions de surface de package utilisent toujours les gardes plus larges. - Les tests unitaires légers en importation des agents, commandes, plugins, assistants de réponse automatique,plugin-sdket zones utilitaires pures similaires passent par le voletunit-fast, qui saute test/setup-openclaw-runtime.ts; les fichiers lourds avec état/runtime restent sur les volets existants. - Certains fichiers source assistantsplugin-sdketcommandssélectionnés mappent également les exécutions en mode modifié à des tests frères explicites dans ces volets légers, afin que les modifications d'assistants évitent de réexécuter la suite lourde complète pour ce répertoire. -auto-replya des compartiments dédiés pour les assistants de niveau supérieur, les tests d'intégrationreply.de niveau supérieur, et le sous-arbresrc/auto-reply/reply/**. Le CI divise davantage le sous-arbre de réponse en shards agent-runner, dispatch et commands/state-routing afin qu'un compartiment lourd en importations ne possède pas la totalité de la file d'attente Node. - Le CI PR/main normal ignore intentionnellement le balayage par lots d'extension et le shard agentic-pluginsréservé aux publications. La validation complète de la publication dispatche le workflow enfant séparéPlugin Prerelease` pour ces suites lourdes en plugins/extensions sur les candidats à la publication.
Couverture du runner intégré
- Lorsque vous modifiez les entrées de découverte de message-tool ou le contexte d’exécution de la compaction, maintenez les deux niveaux de couverture.
- Ajoutez des régressions d’assistant ciblées pour les limites de routage pur et de normalisation.
- Maintenez les suites d’intégration du runner intégré en bonne santé :
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 identifiants délimités et le comportement de compaction circulent toujours à travers les vrais chemins
run.ts/compact.ts; les tests basés uniquement sur les assistants ne sont pas un substitut suffisant à ces chemins d’intégration.
Pool Vitest et paramètres d'isolement par défaut
- La configuration de base de Vitest est réglée par défaut sur
threads. - La configuration partagée de Vitest fixe
isolate: falseet utilise le runner non isolé dans les configurations des projets racine, e2e et live. - La voie UI racine conserve sa configuration
jsdomet son optimiseur, mais s’exécute également sur le runner partagé non isolé. - Chaque shard
pnpm testhérite des mêmes paramètres par défautthreads+isolate: falsede la configuration partagée Vitest. scripts/run-vitest.mjsajoute--no-maglevpour les processus enfants Node de Vitest par défaut afin de réduire l’impact de la compilation V8 lors des grandes exécutions locales. DéfinissezOPENCLAW_VITEST_ENABLE_MAGLEV=1pour comparer avec le comportement standard de V8.
Itération locale rapide
pnpm changed:lanesindique quelles voies architecturales sont déclenchées par une diff.- Le hook de pré-commit ne s’occupe que du formatage. Il remet les fichiers formatés dans l’index et n’exécute pas le linting, le typecheck ou les tests.
- Exécutez
pnpm check:changedexplicitement avant le transfert ou le push lorsque vous avez besoin de la porte de vérification intelligente locale. pnpm test:changedroute par défaut via des voies délimitées peu coûteuses. UtilisezOPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changeduniquement lorsque l’agent décide qu’une modification du harnais, de la configuration, du package ou du contrat nécessite vraiment une couverture Vitest plus large.pnpm test:maxetpnpm test:changed:maxconservent le même comportement de routage, mais avec une capacité de workers plus élevée.- L’autoscaling local des workers est intentionnellement prudent et se désactive lorsque la charge moyenne de l’hôte est déjà élevée, afin que plusieurs exécutions Vitest simultanées causent moins de dégâts par défaut.
- La configuration de base Vitest marque les fichiers de projets/configuration comme
forceRerunTriggersafin que les réexécutions en mode modifié restent correctes lorsque le câblage des tests change. - La configuration conserve
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
pnpm test:perf:importsactive le rapport de durée d’import Vitest ainsi que la sortie de répartition des importations.pnpm test:perf:imports:changedlimite la même vue de profilage aux fichiers modifiés depuisorigin/main.- Les données de chronométrage des shards sont écrites dans
.artifacts/vitest-shard-timings.json. Les exécutions sur l’ensemble de la configuration utilisent le chemin de la configuration comme clé ; les shards CI avec motif d’inclusion ajoutent le nom du shard afin que les shards filtrés puissent être suivis séparément. - Lorsqu’un test à chaud passe encore la majeure partie de son temps dans les importations de démarrage,
gardez les dépendances lourdes derrière une jointure
*.runtime.tslocale étroite et mockez cette jointure directement au lieu d’importer profondément les helpers d’exécution juste pour les transmettre viavi.mock(...). - `pnpm test:perf:changed:bench — —ref
compare les test:changedacheminés avec le chemin natif du projet racine pour ce diff validé et affiche le temps réel ainsi que le RSS maximal macOS. -pnpm test:perf:changed:bench — —worktreeeffectue un benchmark de l'arbre sale actuel en acheminant la liste des fichiers modifiés via scripts/test-projects.mjset la configuration racine Vitest. -pnpm test:perf:profile:mainécrit un profil CPU du thread principal pour le démarrage et la surcharge de transformation de Vitest/Vite. -pnpm test:perf:profile:runner` écrit les profils CPU+tas du runner pour
la suite unitaire avec le parallélisme de fichiers désactivé.
Stabilité (gateway)
Section intitulée « Stabilité (gateway) »- Commande :
pnpm test:stability:gateway - Configuration :
vitest.gateway.config.ts, forcée à un worker - Portée :
- Démarre un vrai Gateway en boucle avec les diagnostics activés par défaut
- Pilote des messages synthétiques, la mémoire et l’activité de charge utile importante du gateway via le chemin d’événement de diagnostic
- Interroge
diagnostics.stabilityvia le Gateway WS RPC - Couvre les helpers de persistance du bundle de stabilité de diagnostic
- Affirme que l’enregistreur reste borné, que les échantillons RSS synthétiques restent sous le budget de pression et que les profondeurs de file d’attente par session se drainent jusqu’à zéro
- Attentes :
- Sûr pour la CI et sans clé
- Voie étroite pour le suivi de régression de stabilité, pas un substitut à la suite Gateway complète
E2E (gateway smoke)
Section intitulée « E2E (gateway smoke) »- Commande :
pnpm test:e2e - Config :
vitest.e2e.config.ts - Fichiers :
src/**/*.e2e.test.ts,test/**/*.e2e.test.ts, et les tests E2E des bundled-plugins sousextensions/ - Paramètres d’exécution par défaut :
- Utilise Vitest
threadsavecisolate: false, correspondant au 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 la charge des E/S de la console.
- Utilise Vitest
- Substitutions 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 de bout en bout de la passerelle multi-instance
- Surfaces WebSocket/HTTP, appariement de nœuds et réseau plus complexe
- Attentes :
- S’exécute dans la CI (lorsqu’elle est activée dans le pipeline)
- Aucune vraie clé requise
- Plus de pièces mobiles que les tests unitaires (peut être plus lent)
E2E : test de fumée du backend OpenShell
Section intitulée « E2E : test de fumée du backend OpenShell »- Commande :
pnpm test:e2e:openshell - Fichier :
extensions/openshell/src/backend.e2e.test.ts - Portée :
- Démarre une passerelle OpenShell isolée sur l’hôte via Docker
- Crée un bac à sable à partir d’un Dockerfile local temporaire
- Teste le backend OpenShell de OpenClaw sur de vrais
sandbox ssh-config+ exec SSH - Vérifie le comportement du système de fichiers distant canonique via le pont fs du bac à sable
- Attentes :
- Optionnel uniquement ; ne fait pas partie de l’exécution
pnpm test:e2epar défaut - Nécessite un CLI
openshelllocal ainsi qu’un démon Docker fonctionnel - Utilise des
HOME/XDG_CONFIG_HOMEisolés, puis détruit la passerelle de test et le bac à sable
- Optionnel uniquement ; ne fait pas partie de l’exécution
- Substitutions 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 (vrais fournisseurs + vrais modèles)
Section intitulée « Live (vrais fournisseurs + vrais modèles) »- Commande :
pnpm test:live - Config :
vitest.live.config.ts - Fichiers :
src/**/*.live.test.ts,test/**/*.live.test.ts, et les tests live des bundled-plugins sousextensions/ - Par défaut : activé par
pnpm test:live(définitOPENCLAW_LIVE_TEST=1) - Portée :
- “Est-ce que ce provider/model fonctionne réellement aujourd’hui avec de vrais identifiants ?”
- Détecter les changements de format du provider, les bizarreries de l’appel d’outils, les problèmes d’authentification et le comportement des limites de taux
- Attentes :
- Pas stable dans CI par conception (réseaux réels, politiques réelles des providers, quotas, pannes)
- Coûte de l’argent / utilise les limites de taux
- Privilégiez l’exécution de sous-ensembles réduits plutôt que de “tout”
- Les exécutions Live utilisent des clés API déjà exportées et des profils d’authentification mis en scène.
- Par défaut, les exécutions Live isolent toujours
HOMEet copient le matériel de configuration/d’authentification dans un répertoire de test temporaire afin que les fixtures unitaires ne puissent pas modifier votre véritable~/.openclaw. - Définissez
OPENCLAW_LIVE_USE_REAL_HOME=1uniquement lorsque vous avez intentionnellement besoin que les tests Live utilisent votre véritable répertoire personnel. pnpm test:liveutilise par défaut un mode plus silencieux : il conserve la sortie de progression[live] ...et coupe les journaux de démarrage de la passerelle/les bavardages Bonjour. DéfinissezOPENCLAW_LIVE_TEST_QUIET=0si vous souhaitez récupérer les journaux de démarrage complets.- Rotation des clés API (spécifique au provider) : définissez
*_API_KEYSavec un format virgule/point-virgule ou*_API_KEY_1,*_API_KEY_2(par exempleOPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) ou une priorité par Live viaOPENCLAW_LIVE_*_KEY; les tests réessayent en cas de réponse de limite de taux. - Sortie de progression/heartbeat :
- Les suites Live émettent désormais des lignes de progression vers stderr afin que les appels longs au provider soient visiblement actifs même lorsque la capture de console Vitest est silencieuse.
vitest.live.config.tsdésactive l’interception de la console Vitest afin que les lignes de progression du provider/de la passerelle diffusent immédiatement pendant les exécutions Live.- Ajustez les heartbeats du modèle direct avec
OPENCLAW_LIVE_HEARTBEAT_MS. - Ajustez les heartbeats de la passerelle/sonde avec
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Quelle suite dois-je exécuter ?
Section intitulée « Quelle suite dois-je exécuter ? »Utilisez ce tableau de décision :
- Modification de la logique/tests : exécutez
pnpm test(etpnpm test:coveragesi vous avez beaucoup modifié) - Touching gateway networking / WS protocol / pairing: ajoutez
pnpm test:e2e - Debugging “my bot is down” / provider-specific failures / tool calling: exécutez un
pnpm test:liveciblé
Tests en direct (accès réseau)
Section intitulée « Tests en direct (accès réseau) »Pour la matrice de model en direct, les tests de fumée du backend CLI, les tests de fumée ACP, le harnais Codex app-server, et tous les tests en direct de provider de médias (Deepgram, BytePlus, ComfyUI, image, musique, vidéo, harnais média) — ainsi que la gestion des identifiants pour les exécutions en direct — consultez Testing live suites. Pour la liste de contrôle dédiée à la validation des mises à jour et des plugins, consultez Testing updates and plugins.
Runners Docker (vérifications optionnelles “fonctionne sous Linux”)
Section intitulée « Runners Docker (vérifications optionnelles “fonctionne sous Linux”) »Ces runners Docker sont divisés en deux catégories :
- Runners de model en direct :
test:docker:live-modelsettest:docker:live-gatewayDocker n’exécutent que leur fichier live correspondant à la clé 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, votre espace de travail et le fichier d’environnement de profil optionnel. Les points d’entrée locaux correspondants sonttest:live:models-profilesettest:live:gateway-profiles. - Les runners Docker en ligne utilisent par défaut une limite de fumée plus petite afin qu’un balayage Docker complet reste pratique :
DockerDocker
test:docker:live-modelsest par défautOPENCLAW_LIVE_MAX_MODELS=12, ettest:docker:live-gatewayest 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 env vars lorsque vous souhaitez explicitement le scan exhaustif plus large. test:docker:allDocker construit l’image Docker live une fois viatest:docker:live-buildOpenClawnpm, empaquète 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 n’est que le runner Node/Git pour les voies d’installation/de mise à jour/de dépendances de plug-in ; ces voies montent le tarball préconstruit. L’image fonctionnelle installe le même tarball dans/appDocker pour les voies de fonctionnalité d’application construite. Les définitions de voies Docker se trouvent dansscripts/lib/docker-e2e-scenarios.mjs; la logique du planificateur réside 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_PARALLELISMnpm contrôle les créneaux de processus, tandis que les plafonds de ressources empêchent les voies lourdes live, npm-install et multi-service de démarrer toutes en même temps. Si une seule voie est plus lourde que les plafonds actifs, le planificateur peut tout de même la démarrer lorsque le pool est vide, puis la laisse fonctionner seule jusqu’à ce que la capacité soit à nouveau disponible. Les valeurs par défaut sont 10 créneaux,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10etOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; ajustezOPENCLAW_DOCKER_ALL_WEIGHT_LIMITouOPENCLAW_DOCKER_ALL_DOCKER_LIMITDockerDockerOpenClaw uniquement lorsque l’hôte Docker dispose de plus de marge. Le runner effectue une pré-vérification Docker par défaut, supprime les conteneurs E2E OpenClaw périmés, imprime le statut toutes les 30 secondes, stocke les timings de voies réussis dans.artifacts/docker-tests/lane-timings.jsonet utilise ces timings pour démarrer d’abord les voies plus longues lors des exécutions ultérieures. UtilisezOPENCLAW_DOCKER_ALL_DRY_RUN=1Docker pour imprimer le manifeste des voies pondérées sans construire ni exécuter Docker, ounode scripts/test-docker-all.mjs --plan-jsonpour imprimer le plan CI pour les voies sélectionnées, les besoins de paquet/image et les identifiants.Package Acceptanceest la passerelle de package native GitHub pour « est-ce que cette archive tar installable fonctionne en tant que produit ? ». Elle résout un package candidat à partir desource=npm,source=ref,source=urlousource=artifact, le télécharge en tant quepackage-under-test, puis exécute les voies E2E Docker réutilisables sur cette archive tar exacte au lieu de réempaqueter la référence sélectionnée. Les profils sont ordonnés par étendue :smoke,package,productetfull. Voir Testing updates and plugins pour le contrat package/update/plugin, la matrice de survie des mises à niveau publiées, les valeurs par défaut de release et le triage des échecs.- Les vérifications de build et de release exécutent
scripts/check-cli-bootstrap-imports.mjsaprès tsdown. Le garde parcourt le graphe de build statique à partir dedist/entry.jsetdist/cli/run-main.jset échoue si l’importation de démarrage pré-répartition importe des dépendances de package telles que Commander, l’interface utilisateur d’invite, undici ou la journalisation avant la répartition des commandes ; il maintient également le bloc d’exécution de passerelle regroupé sous le budget et rejette les importations statiques de chemins de passerelle froids connus. Le test de fumée du CLI empaqueté couvre également l’aide racine, l’aide à l’intégration, l’aide du médecin, le statut, le schéma de configuration et une commande de liste de modèles. - La compatibilité héritée de l’acceptation des packages est plafonnée à
2026.4.25(2026.4.25-beta.*incluse). Jusqu’à cette limite, le harnais tolère uniquement les lacunes de métadonnées des packages expédiés : entrées d’inventaire QA privées omises,gateway install --wrappermanquant, fichiers de correctifs manquants dans le git dérivé de l’archive tar,update.channelpersisté manquant, emplacements hérités des enregistrements d’installation de plugins, persistance manquante des enregistrements d’installation du marketplace et migration des métadonnées de configuration pendantplugins update. Pour les packages après2026.4.25, ces chemins entraînent des échecs stricts. - Container smoke runners :
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,test:docker:release-user-journey,test:docker:release-typed-onboarding,test:docker:release-media-memory,test:docker:release-upgrade-user-journey,test:docker:release-plugin-marketplace,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 conteneurs réels et vérifient les chemins d’intégration de niveau supérieur.
Les runners Docker pour les Dockers en direct montent également (bind-mount) uniquement les répertoires d’authentification CLI nécessaires (ou tous ceux pris en charge lorsque l’exécution n’est pas restreinte), puis les copient dans le répertoire personnel du conteneur avant l’exécution, afin que l’CLI OAuth externe puisse actualiser les jetons sans modifier le magasin d’authentification de l’hôte :
-
Modèles directs :
pnpm test:docker:live-models(script :scripts/test-live-models-docker.sh) -
ACP bind smoke :
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 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 harnais app-server Codex :
pnpm test:docker:live-codex-harness(script :scripts/test-live-codex-harness-docker.sh) -
Gateway + agent dev :
pnpm test:docker:live-gateway(script :scripts/test-live-gateway-models-docker.sh) -
Observability smoke :
pnpm qa:otel:smokeest une voie privée de vérification du code source (source-checkout) QA. Elle n’est intentionnellement pas incluse dans les voies de publication de package Docker car l’archive npm omet le Lab QA. -
Open WebUI live smoke :
pnpm test:docker:openwebui(script :scripts/e2e/openwebui-docker.sh) -
Onboarding wizard (TTY, full scaffolding) :
pnpm test:docker:onboard(script :scripts/e2e/onboard-docker.sh) -
Npm tarball onboarding/channel/agent smoke :
pnpm test:docker:npm-onboard-channel-agentOpenClawDockerOpenAITelegramOpenAI installe la tarball OpenClaw empaquetée globalement dans Docker, configure OpenAI via env-ref onboarding plus Telegram par défaut, exécute doctor, et exécute un tour d’agent OpenAI simulé. Réutilisez une tarball préconstruite avecOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz, sautez la reconstruction de l’hôte avecOPENCLAW_NPM_ONBOARD_HOST_BUILD=0, ou changez de channel avecOPENCLAW_NPM_ONBOARD_CHANNEL=discordouOPENCLAW_NPM_ONBOARD_CHANNEL=slack. -
Release user journey smoke :
pnpm test:docker:release-user-journeyOpenClawDockerOpenAIGateway installe la tarball OpenClaw empaquetée globalement dans un home Docker propre, exécute l’onboarding, configure un provider OpenAI simulé, exécute un tour d’agent, installe/désinstalle des plugins externes, configure ClickClack contre un fixture local, vérifie la messagerie sortante/entrante, redémarre Gateway, et exécute doctor. -
Release typed onboarding smoke :
pnpm test:docker:release-typed-onboardinginstalle la tarball empaquetée, piloteopenclaw onboardOpenAI à travers un TTY réel, configure OpenAI comme un provider env-ref, vérifie qu’il n’y a pas de persistance de clé brute, et exécute un tour d’agent simulé. -
Release media/memory smoke :
pnpm test:docker:release-media-memoryOpenAIGateway installe la tarball empaquetée, vérifie la compréhension d’image à partir d’une pièce jointe PNG, la sortie de génération d’image compatible OpenAI, le rappel de recherche de mémoire, et la survie du rappel à travers le redémarrage de Gateway. -
Release upgrade user journey smoke :
pnpm test:docker:release-upgrade-user-journeyinstalleopenclaw@latestpar défaut, configure l’état provider/plugin/ClickClack sur le package publié, effectue une mise à niveau vers la tarball candidate, puis réexécute le parcours cœur agent/plugin/channel. Remplacez la base de référence avecOPENCLAW_RELEASE_UPGRADE_BASELINE_SPEC=openclaw@<version>. -
Test de fumaison du marketplace de plugins de version :
pnpm test:docker:release-plugin-marketplaceinstalle à partir d’un marketplace de fixtures local, met à jour le plugin installé, le désinstalle et vérifie que le CLI disparaît avec les métadonnées d’installation nettoyées. -
Test de fumaison d’installation de compétence :
pnpm test:docker:skill-installinstalle globalement l’archive tar OpenClaw empaquetée dans Docker, désactive les installations d’archives téléchargées dans la configuration, résout le slug de compétence ClawHub actuel à partir de la recherche, l’installe avecopenclaw skills installet vérifie la compétence installée ainsi que les métadonnées d’origine/verrouillage.clawhub. -
Test de fumaison de changement de canal de mise à jour :
pnpm test:docker:update-channel-switchinstalle globalement l’archive tar OpenClaw empaquetée dans Docker, passe du paquetstableà gitdev, vérifie que le canal persistant et le plugin fonctionnent après la mise à jour, puis repasse au paquetstableet vérifie l’état de la mise à jour. -
Test de fumaison de survie à la mise à niveau :
pnpm test:docker:upgrade-survivorinstalle l’archive tar OpenClaw empaquetée sur une fixture d’ancien utilisateur sale avec des agents, une configuration de canal, des listes d’autorisation de plugins, un état obsolète des dépendances de plugins et des fichiers d’espace de travail/session existants. Il exécute la mise à jour du paquet ainsi qu’un diagnostic non interactif sans clés de provider ou de canal en direct, puis démarre un Gateway en boucle et vérifie la préservation de la configuration/de l’état ainsi que les budgets de démarrage/statut. -
Published upgrade survivor smoke :
pnpm test:docker:published-upgrade-survivorinstalleopenclaw@latestpar défaut, sème des fichiers d’utilisateurs existants réalistes, configure cette base de référence avec une commande de recette intégrée, valide la configuration résultante, met à jour cette installation publiée vers l’archive tar candidate, exécute le doctor en mode non interactif, écrit.artifacts/upgrade-survivor/summary.json, puis démarre un Gateway en boucle locale et vérifie les intentions configurées, la préservation de l’état, le démarrage,/healthz,/readyzet les budgets de statut RPC. Remplacer une base de référence parOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, demander à l’ordonnanceur agrégé d’étendre les bases locales exactes avecOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECStelles que[email protected] [email protected] [email protected], et étendre les fixtures en forme de problème avecOPENCLAW_UPGRADE_SURVIVOR_SCENARIOStelles quereported-issues; l’ensemble de problèmes signalés inclutconfigured-plugin-installspour la réparation automatique de l’installation du plugin externe OpenClaw. L’acceptation de package expose ceux-ci commepublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesetpublished_upgrade_survivor_scenarios, résout les jetons de méta-base de référence tels quelast-stable-4ouall-since-2026.4.23, et la validation complète de version étend la porte du package de trempage de version àlast-stable-4 2026.4.23 2026.5.2 2026.4.15plusreported-issues. -
Session runtime context smoke :
pnpm test:docker:session-runtime-contextvérifie la persistance de la transcription du contexte d’exécution cachée ainsi que la réparation par le doctor des branches de réécriture de prompt dupliquées affectées. -
Bun global install smoke :
bash scripts/e2e/bun-global-install-smoke.shempaquète 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 regroupés au lieu de se bloquer. Réutiliser une archive tar préconstruite avecOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz, sauter la construction de l’hôte avecOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0ou copierdist/depuis une image Docker construite avecOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. -
Installer Docker smoke : Docker
bash scripts/test-install-sh-docker.shpartage un cache npmnpm entre ses conteneurs racine, de mise à jour et direct-npm. Le smoke de mise à jour utilise par défaut npmlatestcomme base stable avant de passer à l’archive candidate. Remplacez parOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22en local, ou avec l’entréeupdate_baseline_versiondu workflow Install Smoke sur GitHub. Les vérifications de l’installateur non-root gardent un cache npm isolé pour que les entrées de cache détenues par root ne masquent pas le comportement d’installation local à l’utilisateur. DéfinissezOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cachenpm pour réutiliser le cache racine/mise à jour/direct-npm lors des exécutions locales répétées. -
Install Smoke CI saute la mise à jour globale direct-npm en double avec npm
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; exécutez le script localement sans cette variable d’environnement lorsque la couverture directenpm install -gest nécessaire. -
Les agents suppriment le smoke CLI de l’espace de travail partagé :
pnpm test:docker:agents-delete-shared-workspace(script :scripts/e2e/agents-delete-shared-workspace-docker.sh) construit par défaut l’image du Dockerfile racine, initialise deux agents avec un espace de travail dans un home de conteneur isolé, exécuteagents delete --jsonet vérifie le JSON valide ainsi que le comportement de l’espace de travail conservé. 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éseautage Gateway (deux conteneurs, auth WS + santé) :
pnpm test:docker:gateway-network(script :scripts/e2e/gateway-network-docker.sh) -
Smoke de snapshot 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 --deepet vérifie que les snapshots de rôle 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 du raisonnement minimal web_search des réponses OpenAI : OpenAI
pnpm test:docker:openai-web-search-minimal(script :scripts/e2e/openai-web-search-minimal-docker.shOpenAIGateway) exécute un serveur OpenAI simulé via le Gateway, vérifie queweb_searchaugmentereasoning.effortdeminimalàlowGateway, puis force le rejet du schéma du provider et vérifie que le détail brut apparaît dans les journaux du Gateway. -
Pont de channel MCP (Gateway amorcé + pont stdio + test de fumée du cadre de notification brut Claude) : Gateway
pnpm test:docker:mcp-channels(script :scripts/e2e/mcp-channels-docker.sh) -
Outils MCP du bundle Pi (vrai serveur MCP stdio + test de fumée autoriser/refuser 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 (véritable Gateway + arrêt de l’enfant MCP stdio après des tâches cron isolées et des exécutions de sous-agent ponctuelles) :
pnpm test:docker:cron-mcp-cleanup(script :scripts/e2e/cron-mcp-cleanup-docker.sh) -
Plugins (smoke d’installation/mise à jour pour le chemin local,
file:, registre npm avec dépendances hissées, métadonnées de paquet npm malformées, refs git en mouvement, kitchen-sink ClawHub, mises à jour de la marketplace et activation/inspection de 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 paquet/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 de fixtures 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) -
Plugin lifecycle matrix smoke:
pnpm test:docker:plugin-lifecycle-matrixinstalls the packed OpenClaw tarball in a bare container, installs an npm plugin, toggles enable/disable, upgrades and downgrades it through a local npm registry, deletes the installed code, then verifies uninstall still removes stale state while logging RSS/CPU metrics for each lifecycle phase. -
Config reload metadata smoke:
pnpm test:docker:config-reload(script:scripts/e2e/config-reload-source-docker.sh) -
Plugins:
pnpm test:docker:pluginscovers install/update smoke for local path,file:, npm registry with hoisted dependencies, git moving refs, ClawHub fixtures, marketplace updates, and Claude-bundle enable/inspect.pnpm test:docker:plugin-updatecovers unchanged update behavior for installed plugins.pnpm test:docker:plugin-lifecycle-matrixcovers resource-tracked npm plugin install, enable, disable, upgrade, downgrade, and missing-code uninstall.
To prebuild and reuse the shared functional image manually:
OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-buildOPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channelsSuite-specific image overrides such as OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE still win when set. When OPENCLAW_SKIP_DOCKER_BUILD=1 points at a remote shared image, the scripts pull it if it is not already local. The QR and installer Docker tests keep their own Dockerfiles because they validate package/install behavior rather than the shared built-app runtime.
Les exécuteurs Docker de modèle en direct (live-model) montent également le checkout actuel en lecture seule (bind-mount) et le mettent en scène dans un répertoire de travail temporaire à l’intérieur du conteneur. Cela permet de garder l’image d’exécution légère tout en exécutant Vitest par rapport à votre source/configuration locale exacte. L’étape de mise en scène ignore les caches locaux volumineux et les sorties de compilation de l’application tels que Docker.pnpm-store, .worktrees, __openclaw_vitest__, et les répertoires de sortie Gradle ou locaux à l’application .buildDocker, afin que les exécutions Docker en direct ne passent pas des minutes à copier des artefacts spécifiques à la machine. Ils définissent également OPENCLAW_SKIP_CHANNELS=1TelegramDiscord afin que les sondes en direct du Gateway ne démarrent pas de véritables workers de channel Telegram/Discord/etc. à l’intérieur du conteneur. test:docker:live-models exécute toujours pnpm test:live, donc transmettez également OPENCLAW_LIVE_GATEWAY_*Docker lorsque vous devez restreindre ou exclure la couverture en direct du Gateway de cette voie Docker. test:docker:openwebuiOpenClawOpenAI est un test de smoke de compatibilité de plus haut niveau : il démarre un conteneur Gateway OpenClaw avec les points de terminaison HTTP compatibles OpenAI activés, démarre un conteneur Open WebUI épinglé (pinned) contre ce Gateway, se connecte via Open WebUI, vérifie que /api/models expose openclaw/default, puis envoie une véritable requête de chat via le proxy /api/chat/completions d’Open WebUI. Définissez OPENWEBUI_SMOKE_MODE=modelsDocker pour les vérifications CI de chemin de publication (release-path) qui doivent s’arrêter après la connexion à Open WebUI et la découverte de modèle, sans attendre une complétion de modèle en direct. La première exécution peut être sensiblement plus lente car Docker peut avoir besoin de tirer (pull) l’image Open WebUI et Open WebUI peut avoir besoin de terminer sa propre configuration de démarrage à froid (cold-start). Cette voie s’attend à une clé de modèle en direct utilisable. Fournissez-la via l’environnement de processus, les profils d’authentification mis en scène, ou une variable OPENCLAW_PROFILE_FILE explicite. Les exécutions réussies impriment une petite charge utile JSON comme { "ok": true, "model": "openclaw/default", ... }. test:docker:mcp-channelsTelegramDiscordiMessageGateway est intentionnellement déterministe et n’a pas besoin d’un compte Telegram, Discord ou iMessage réel. Il démarre un conteneur Gateway amorcé (seeded), démarre un deuxième conteneur qui génère openclaw mcp serve, puis vérifie la découverte de conversation routée, les lectures de transcription, les métadonnées de pièces jointes, le comportement de la file d’attente d’événements en direct, le routage d’envoi sortant, et les notifications de channel + style Claude via le véritable pont MCP stdio. La vérification des notifications inspecte directement les trames MCP stdio brutes, de sorte que le test de smoke valide ce que le pont émet réellement, et pas seulement ce qu’un SDK client spécifique se trouve à exposer. test:docker:pi-bundle-mcp-toolsDocker est déterministe et n’a pas besoin d’une clé de modèle en direct. Il construit l’image Docker du dépôt, démarre un véritable serveur de sonde MCP stdio à l’intérieur du conteneur, matérialise ce serveur via le runtime MCP du bundle Pi intégré, 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-cleanupGateway est déterministe et n’a pas besoin d’une clé de modèle en direct. Il démarre un Gateway amorcé avec un véritable 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.
Test de fumé manuel du fil en langage clair de l’ACP (pas de 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 peut être nécessaire à nouveau pour la validation du routage des fils de l’ACP, ne le supprimez donc pas.
Env vars utiles :
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=...monté et sourcé avant l’exécution des testsOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1pour vérifier uniquement les env vars sourcés depuisOPENCLAW_PROFILE_FILECLI, en utilisant des répertoires de config/workspace temporaires et aucun montage d’auth CLI externeOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(par défaut :~/.cache/openclaw/docker-cli-tools) monté sur/home/node/.npm-globalCLIDocker pour les installations CLI mises en cache à l’intérieur de Docker- Les répertoires/fichiers d’auth CLI externes sous CLI
$HOMEsont montés en lecture seule sous/host-auth..., puis copiés dans/home/node/...avant le début 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 de providers ne montent que les répertoires/fichiers nécessaires déduits de
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Remplacer manuellement avec
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=none, ou 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 providers dans le conteneurOPENCLAW_SKIP_DOCKER_BUILD=1pour réutiliser une imageopenclaw:local-liveexistante pour les 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 (et non des env vars)OPENCLAW_OPENWEBUI_MODEL=...pour choisir le model exposé par le Gateway pour le test de fumée Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...pour remplacer le prompt de vérification de nonce utilisé par le test de fumée Open WebUIOPENWEBUI_IMAGE=...pour remplacer le tag d’image épinglée Open WebUI
Cohérence de la documentation
Section intitulée « Cohérence de la documentation »Exécutez les vérifications de documentation après les modifications : pnpm check:docs.
Exécutez la validation complète des ancres Mintlify lorsque vous avez également besoin de vérifications des titres intra-page : pnpm docs:check-links:anchors.
Régression hors ligne (sûr pour CI)
Section intitulée « Régression hors ligne (sûr pour CI) »Il s’agit de régressions de « vrai pipeline » sans vrais providers :
- Appel de tool du Gateway (mock OpenAI, vrai gateway + boucle agent) : GatewayOpenAI
src/gateway/gateway.test.tsOpenAI (cas : “exécute un appel tool mock OpenAI de bout en bout via la boucle agent du gateway”) - Assistant du Gateway (WS Gateway
wizard.start/wizard.next, écrit la config + auth forcée) :src/gateway/gateway.test.ts(cas : “exécute l’assistant via ws et écrit la config du jeton d’auth”)
Évaluations de fiabilité de l’agent (Skills)
Section intitulée « Évaluations de fiabilité de l’agent (Skills) »Nous avons déjà quelques tests sûrs pour CI qui se comportent comme des « évaluations de fiabilité de l’agent » :
- Mock d’appel de tool via le vrai gateway + boucle d’agent (
src/gateway/gateway.test.ts). - Flux d’assistant de bout en bout qui valident le câblage de session et les effets de la config (
src/gateway/gateway.test.ts).
Ce qui manque encore pour les Skills (voir Skills) :
- Prise de décision : lorsque les Skills sont listés dans le prompt, l’agent choisit-il le bon Skill (ou évite-t-il ceux qui ne sont pas pertinents) ?
- 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 tools, le report de l’historique de session et les limites du bac à sable.
Les futures évaluations doivent d’abord rester déterministes :
- Un exécuteur de scénario utilisant des mocks de providers pour vérifier les appels de tools + l’ordre, les lectures de fichiers de Skills, et le câblage de session.
- Une petite suite de scénarios axés sur les Skills (utilisation vs évitement, restriction, injection de prompt).
- Évaluations en direct optionnelles (opt-in, restreintes par env) uniquement après la mise en place de la suite sûre pour CI.
Tests de contrat (structure de plugin et de channel)
Section intitulée « Tests de contrat (structure de plugin et de channel) »Les tests de contrat vérifient que chaque plugin et channel enregistré est conforme à son contrat d’interface. Ils itèrent sur tous les plugins découverts et exécutent une suite d’assertions de forme et de comportement. La pnpm test unit lane par défaut ignore intentionnellement ces fichiers de seam et de fumée partagés ; exécutez les commandes de contrat explicitement lorsque vous touchez aux surfaces partagées du channel ou du provider.
Commandes
Section intitulée « Commandes »- Tous les contrats :
pnpm test:contracts - Contrats de channel uniquement :
pnpm test:contracts:channels - Contrats de provider uniquement :
pnpm test:contracts:plugins
Contrats de channel
Section intitulée « Contrats de channel »Situés dans src/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 du payload du message
- inbound - Gestion des messages entrants
- actions - Gestionnaires d’actions de channel
- threading - Gestion de l’ID de fil de discussion
- directory - API de répertoire/liste API
- group-policy - Application de la stratégie de groupe
Contrats de statut de provider
Section intitulée « Contrats de statut de provider »Situés dans src/plugins/contracts/*.contract.test.ts.
- status - Sondes de statut de channel
- registry - Forme du registre de plugins
Contrats de provider
Section intitulée « Contrats de provider »Situés dans src/plugins/contracts/*.contract.test.ts :
- auth - Contrat de flux d’authentification
- auth-choice - Choix/sélection de l’authentification
- catalog - API du catalogue de models
- discovery - Découverte de plugins
- loader - Chargement des plugins
- runtime - Runtime du provider
- shape - Forme/interface du plugin
- wizard - Assistant de configuration
Quand exécuter
Section intitulée « Quand exécuter »- Après avoir modifié les exportations ou les sous-chemins de plugin-sdk
- Après avoir ajouté ou modifié un plugin de channel ou de provider
- Après avoir refactorisé l’enregistrement ou la découverte de plugins
Les tests de contrat s’exécutent dans CI et ne nécessitent pas de clés API réelles.
Ajouter des régressions (conseils)
Section intitulée « Ajouter des régressions (conseils) »Lorsque vous corrigez un problème de provider/model découvert en live :
- Ajoutez si possible une régression sûre pour CI (provider simulé/bouchonné, ou capturez la transformation exacte de la forme de la requête)
- Si c’est intrinsèquement uniquement en live (limites de débit, stratégies d’auth), gardez le test live étroit et optionnel via des variables d’environnement
- Privilégiez le ciblage de la plus petite couche qui détecte le bogue :
- bug de conversion/relecture de requête provider → test direct des models
- bug du pipeline de session/historique/tool de la passerelle → test de fumée live de la passerelle ou test mock de passerelle sûr pour la 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 affirme que les ids d’exécution de 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 intentionnellement sur les ids de cibles non classifiés afin que les nouvelles classes ne puissent pas être ignorées silencieusement.