chore(i18n): refresh fr translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-30 18:42:20 +00:00
parent c952ef66cc
commit 5a05b5e12c
5 changed files with 747 additions and 716 deletions

View File

@ -3,73 +3,73 @@ read_when:
- Vous devez comprendre pourquoi une tâche CI sest exécutée ou non
- Vous déboguez une vérification GitHub Actions en échec
- Vous coordonnez une exécution ou une réexécution de validation de version
summary: Graphe des jobs CI, garde-fous de périmètre, regroupements de publication et équivalents locaux des commandes
summary: Graphe des tâches CI, contrôles de périmètre, regroupements de publication et équivalents des commandes locales
title: Pipeline CI
x-i18n:
generated_at: "2026-04-30T07:16:33Z"
generated_at: "2026-04-30T18:38:52Z"
model: gpt-5.5
provider: openai
source_hash: a9c18f0801864ca1030aac9ea81117b011bd7936388984a1809ce3ae6e906e62
source_hash: a24afc27606ac7f4e9ead89acdd319bffa23336610f8a6cd8b576ea1a5b233dd
source_path: ci.md
workflow: 16
---
OpenClaw CI sexécute à chaque poussée vers `main` et pour chaque pull request. Le job `preflight` classe le diff et désactive les voies coûteuses lorsque seules des zones sans rapport ont changé. Les exécutions manuelles `workflow_dispatch` contournent volontairement le cadrage intelligent et déploient le graphe complet pour les versions candidates et la validation large. Les voies Android restent optionnelles via `include_android`. La couverture des plugins réservée aux releases se trouve dans le workflow séparé [`Plugin Préversion`](#plugin-prerelease) et ne sexécute quà partir de [`Validation complète de release`](#full-release-validation) ou dun dispatch manuel explicite.
OpenClaw CI sexécute à chaque push vers `main` et pour chaque pull request. Le job `preflight` classe le diff et désactive les lanes coûteuses lorsque seules des zones sans rapport ont changé. Les exécutions manuelles `workflow_dispatch` contournent intentionnellement le périmétrage intelligent et déploient tout le graphe pour les release candidates et les validations larges. Les lanes Android restent opt-in via `include_android`. La couverture Plugin réservée aux releases se trouve dans le workflow séparé [`Plugin Prerelease`](#plugin-prerelease) et ne sexécute quà partir de [`Full Release Validation`](#full-release-validation) ou dun dispatch manuel explicite.
## Vue densemble du pipeline
| Job | Objectif | Quand il sexécute |
| -------------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------ |
| `preflight` | Détecter les changements limités aux docs, les portées modifiées, les extensions modifiées et construire le manifeste CI | Toujours sur les poussées et PR non brouillon |
| `security-scm-fast` | Détection de clés privées et audit des workflows via `zizmor` | Toujours sur les poussées et PR non brouillon |
| `security-dependency-audit` | Audit du lockfile de production sans dépendances par rapport aux avis npm | Toujours sur les poussées et PR non brouillon |
| `security-fast` | Agrégat requis pour les jobs de sécurité rapides | Toujours sur les poussées et PR non brouillon |
| `check-dependencies` | Passe Knip de production limitée aux dépendances, plus garde de la liste dautorisation des fichiers inutilisés | Changements pertinents pour Node |
| `build-artifacts` | Construire `dist/`, la Control UI, les vérifications dartefacts construits et les artefacts aval réutilisables | Changements pertinents pour Node |
| `checks-fast-core` | Voies rapides de correction Linux, comme les vérifications bundled/contrat de plugin/protocole | Changements pertinents pour Node |
| `checks-fast-contracts-channels` | Vérifications fragmentées des contrats de canaux avec un résultat de vérification agrégé stable | Changements pertinents pour Node |
| `checks-node-core-test` | Fragments de tests Node du cœur, hors voies canal, bundled, contrat et extension | Changements pertinents pour Node |
| `check` | Équivalent fragmenté de la porte locale principale : types prod, lint, gardes, types de tests et smoke strict | Changements pertinents pour Node |
| `check-additional` | Fragments darchitecture, de frontière, de gardes de surface dextension, de frontière de package et de gateway-watch | Changements pertinents pour Node |
| `build-smoke` | Tests smoke de CLI construite et smoke de mémoire au démarrage | Changements pertinents pour Node |
| `checks` | Vérificateur pour les tests de canaux sur artefacts construits | Changements pertinents pour Node |
| `checks-node-compat-node22` | Voie de build et smoke de compatibilité Node 22 | Dispatch CI manuel pour les releases |
| `check-docs` | Formatage, lint et vérifications de liens brisés des docs | Docs modifiées |
| `skills-python` | Ruff + pytest pour les skills adossés à Python | Changements pertinents pour les Skills Python |
| `checks-windows` | Tests de processus/chemins spécifiques à Windows, plus régressions de spécificateurs dimport runtime partagés | Changements pertinents pour Windows |
| `macos-node` | Voie de tests TypeScript macOS utilisant les artefacts construits partagés | Changements pertinents pour macOS |
| `macos-swift` | Lint, build et tests Swift pour lapp macOS | Changements pertinents pour macOS |
| `android` | Tests unitaires Android pour les deux variantes, plus un build dAPK debug | Changements pertinents pour Android |
| `test-performance-agent` | Optimisation quotidienne des tests lents Codex après une activité approuvée | Succès de la CI principale ou dispatch manuel |
| Job | Objectif | Quand il sexécute |
| -------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------- |
| `preflight` | Détecter les changements limités aux docs, les scopes modifiés, les extensions modifiées, et construire le manifeste CI | Toujours sur les pushs et PRs non draft |
| `security-scm-fast` | Détection de clés privées et audit des workflows via `zizmor` | Toujours sur les pushs et PRs non draft |
| `security-dependency-audit` | Audit du lockfile de production sans dépendances par rapport aux avis npm | Toujours sur les pushs et PRs non draft |
| `security-fast` | Agrégat requis pour les jobs de sécurité rapides | Toujours sur les pushs et PRs non draft |
| `check-dependencies` | Passe Knip de production limitée aux dépendances plus garde de lallowlist des fichiers inutilisés | Changements pertinents pour Node |
| `build-artifacts` | Construire `dist/`, Control UI, les vérifications dartefacts construits, et les artefacts aval réutilisables | Changements pertinents pour Node |
| `checks-fast-core` | Lanes de correction Linux rapides telles que les vérifications groupées/contrat Plugin/protocole | Changements pertinents pour Node |
| `checks-fast-contracts-channels` | Vérifications fragmentées des contrats de channels avec un résultat de vérification agrégé stable | Changements pertinents pour Node |
| `checks-node-core-test` | Shards de tests Node du noyau, hors lanes channel, groupées, contrat et extension | Changements pertinents pour Node |
| `check` | Équivalent fragmenté de la porte locale principale : types prod, lint, gardes, types de tests et smoke strict | Changements pertinents pour Node |
| `check-additional` | Shards darchitecture, de frontières, de gardes de surface dextension, de frontières de package et de gateway-watch | Changements pertinents pour Node |
| `build-smoke` | Tests smoke de CLI construite et smoke de mémoire au démarrage | Changements pertinents pour Node |
| `checks` | Vérificateur pour les tests de channels dartefacts construits | Changements pertinents pour Node |
| `checks-node-compat-node22` | Lane de build et smoke de compatibilité Node 22 | Dispatch CI manuel pour les releases |
| `check-docs` | Vérifications de formatage, lint et liens cassés des docs | Docs modifiées |
| `skills-python` | Ruff + pytest pour les skills adossées à Python | Changements pertinents pour les skills Python |
| `checks-windows` | Tests spécifiques Windows de processus/chemins plus régressions de spécificateurs dimport runtime partagés | Changements pertinents pour Windows |
| `macos-node` | Lane de tests TypeScript macOS utilisant les artefacts construits partagés | Changements pertinents pour macOS |
| `macos-swift` | Lint, build et tests Swift pour lapp macOS | Changements pertinents pour macOS |
| `android` | Tests unitaires Android pour les deux flavors plus un build APK debug | Changements pertinents pour Android |
| `test-performance-agent` | Optimisation quotidienne des tests lents par Codex après une activité approuvée | Succès de la CI principale ou dispatch manuel |
## Ordre fail-fast
1. `preflight` décide quelles voies existent effectivement. La logique `docs-scope` et `changed-scope` correspond à des étapes dans ce job, et non à des jobs autonomes.
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` et `skills-python` échouent rapidement sans attendre les jobs plus lourds de matrice dartefacts et de plateformes.
3. `build-artifacts` se chevauche avec les voies Linux rapides afin que les consommateurs aval puissent démarrer dès que le build partagé est prêt.
4. Les voies plus lourdes de plateformes et de runtime se déploient ensuite : `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-core-test`, `checks`, `checks-windows`, `macos-node`, `macos-swift` et `android`.
1. `preflight` décide quelles lanes existent réellement. Les logiques `docs-scope` et `changed-scope` sont des étapes dans ce job, et non des jobs autonomes.
2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs` et `skills-python` échouent rapidement sans attendre les jobs plus lourds dartefacts et de matrice de plateformes.
3. `build-artifacts` chevauche les lanes Linux rapides afin que les consommateurs aval puissent commencer dès que le build partagé est prêt.
4. Les lanes de plateformes et de runtimes plus lourdes se déploient ensuite : `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-core-test`, `checks`, `checks-windows`, `macos-node`, `macos-swift` et `android`.
GitHub peut marquer des jobs remplacés comme `cancelled` lorsquune poussée plus récente arrive sur la même PR ou la même référence `main`. Traitez cela comme du bruit CI, sauf si lexécution la plus récente pour la même référence échoue aussi. Les vérifications agrégées de fragments utilisent `!cancelled() && always()` afin de toujours signaler les échecs normaux de fragments, mais sans se mettre en file dattente après que lensemble du workflow a déjà été remplacé. La clé de concurrence CI automatique est versionnée (`CI-v7-*`) afin quun zombie côté GitHub dans un ancien groupe de file dattente ne puisse pas bloquer indéfiniment les nouvelles exécutions principales. Les exécutions manuelles de suite complète utilisent `CI-manual-v1-*` et nannulent pas les exécutions en cours.
GitHub peut marquer les jobs remplacés comme `cancelled` lorsquun push plus récent arrive sur la même PR ou référence `main`. Traitez cela comme du bruit CI, sauf si la plus récente exécution pour la même référence échoue aussi. Les vérifications agrégées de shards utilisent `!cancelled() && always()` afin de toujours signaler les échecs normaux de shards, sans toutefois se mettre en file dattente une fois tout le workflow déjà remplacé. La clé de concurrence automatique CI est versionnée (`CI-v7-*`) afin quun zombie côté GitHub dans un ancien groupe de file dattente ne puisse pas bloquer indéfiniment les nouvelles exécutions main. Les exécutions manuelles de suite complète utilisent `CI-manual-v1-*` et nannulent pas les exécutions en cours.
## Portée et routage
## Périmètre et routage
La logique de portée se trouve dans `scripts/ci-changed-scope.mjs` et est couverte par des tests unitaires dans `src/scripts/ci-changed-scope.test.ts`. Le dispatch manuel ignore la détection `changed-scope` et fait agir le manifeste preflight comme si chaque zone cadrée avait changé.
La logique de périmètre se trouve dans `scripts/ci-changed-scope.mjs` et est couverte par des tests unitaires dans `src/scripts/ci-changed-scope.test.ts`. Le dispatch manuel ignore la détection changed-scope et fait agir le manifeste preflight comme si chaque zone périmétrée avait changé.
- **Les modifications du workflow CI** valident le graphe CI Node ainsi que le lint des workflows, mais ne forcent pas à elles seules les builds natifs Windows, Android ou macOS ; ces voies de plateforme restent limitées aux changements de sources de plateforme.
- **Les modifications limitées au routage CI, certaines modifications peu coûteuses de fixtures de tests du cœur, ainsi que les modifications étroites daides/tests de routage de contrat de plugin** utilisent un chemin de manifeste rapide limité à Node : `preflight`, la sécurité et une seule tâche `checks-fast-core`. Ce chemin ignore les artefacts de build, la compatibilité Node 22, les contrats de canaux, les fragments complets du cœur, les fragments de plugins bundled et les matrices de gardes additionnelles lorsque le changement se limite aux surfaces de routage ou daide que la tâche rapide exerce directement.
- **Les vérifications Windows Node** sont limitées aux wrappers de processus/chemins spécifiques à Windows, aux aides dexécution npm/pnpm/UI, à la configuration du gestionnaire de packages et aux surfaces du workflow CI qui exécutent cette voie ; les changements sans rapport de source, de plugin, dinstall-smoke et uniquement de tests restent sur les voies Linux Node.
- **Les modifications du workflow CI** valident le graphe CI Node plus le lint des workflows, mais ne forcent pas à elles seules les builds natifs Windows, Android ou macOS ; ces lanes de plateformes restent limitées aux changements de sources de plateformes.
- **Les modifications limitées au routage CI, certaines modifications peu coûteuses de fixtures de tests core, et les modifications étroites de helpers/tests de routage de contrats Plugin** utilisent un chemin de manifeste rapide Node uniquement : `preflight`, sécurité, et une seule tâche `checks-fast-core`. Ce chemin ignore les artefacts de build, la compatibilité Node 22, les contrats de channels, les shards core complets, les shards de Plugins groupés, et les matrices de gardes supplémentaires lorsque le changement est limité aux surfaces de routage ou de helpers directement exercées par la tâche rapide.
- **Les vérifications Node Windows** sont limitées aux wrappers de processus/chemins spécifiques à Windows, aux helpers de runners npm/pnpm/UI, à la configuration du gestionnaire de packages, et aux surfaces du workflow CI qui exécutent cette lane ; les changements sans rapport de sources, Plugin, install-smoke et tests uniquement restent sur les lanes Node Linux.
Les familles de tests Node les plus lentes sont divisées ou équilibrées afin que chaque job reste petit sans sur-réserver les runners : les contrats de canaux sexécutent en trois fragments pondérés, les petites voies unitaires du cœur sont appariées, auto-reply sexécute avec quatre workers équilibrés (avec le sous-arbre reply divisé en fragments agent-runner, dispatch et commands/state-routing), et les configurations agentic de Gateway/plugin sont réparties dans les jobs Node agentic existants limités aux sources au lieu dattendre les artefacts construits. Les tests larges de navigateur, QA, médias et plugins divers utilisent leurs configurations Vitest dédiées plutôt que le fourre-tout partagé des plugins. Les fragments par motifs dinclusion enregistrent les entrées de durée avec le nom du fragment CI, afin que `.artifacts/vitest-shard-timings.json` puisse distinguer une configuration complète dun fragment filtré. `check-additional` garde ensemble le travail de compilation/canary de frontière de package et sépare larchitecture de topologie runtime de la couverture gateway watch ; le fragment de garde de frontière exécute ses petits gardes indépendants simultanément dans un seul job. Gateway watch, les tests de canaux et le fragment de frontière de support du cœur sexécutent simultanément dans `build-artifacts` après que `dist/` et `dist-runtime/` ont déjà été construits.
Les familles de tests Node les plus lentes sont divisées ou équilibrées afin que chaque job reste petit sans sur-réserver de runners : les contrats de channels sexécutent en trois shards pondérés, les petites lanes dunités core sont appairées, auto-reply sexécute avec quatre workers équilibrés (avec le sous-arbre reply divisé en shards agent-runner, dispatch et commands/state-routing), et les configurations agentic gateway/Plugin sont réparties sur les jobs Node agentic existants limités aux sources au lieu dattendre les artefacts construits. Les tests larges de navigateur, QA, médias et Plugins divers utilisent leurs configs Vitest dédiées au lieu du catch-all Plugin partagé. Les shards à motifs dinclusion enregistrent les entrées de timing avec le nom de shard CI, afin que `.artifacts/vitest-shard-timings.json` puisse distinguer une config entière dun shard filtré. `check-additional` conserve ensemble les travaux de compilation/canary de frontières de packages et sépare larchitecture de topologie runtime de la couverture gateway watch ; le shard de garde de frontières exécute ses petits gardes indépendants en parallèle dans un seul job. Gateway watch, les tests de channels et le shard core support-boundary sexécutent en parallèle dans `build-artifacts` après que `dist/` et `dist-runtime/` ont déjà été construits.
La CI Android exécute à la fois `testPlayDebugUnitTest` et `testThirdPartyDebugUnitTest`, puis construit lAPK debug Play. La variante tierce na pas de source set ni de manifeste séparé ; sa voie de tests unitaires compile tout de même la variante avec les flags BuildConfig SMS/call-log, tout en évitant un job de packaging APK debug dupliqué à chaque poussée pertinente pour Android.
La CI Android exécute à la fois `testPlayDebugUnitTest` et `testThirdPartyDebugUnitTest`, puis construit lAPK debug Play. Le flavor tiers na pas de source set ni de manifeste séparé ; sa lane de tests unitaires compile tout de même le flavor avec les flags BuildConfig SMS/call-log, tout en évitant un job de packaging APK debug en double à chaque push pertinent pour Android.
Le fragment `check-dependencies` exécute `pnpm deadcode:dependencies` (une passe Knip de production limitée aux dépendances, épinglée à la dernière version de Knip, avec lâge minimal de release de pnpm désactivé pour linstallation `dlx`) et `pnpm deadcode:unused-files`, qui compare les résultats de fichiers de production inutilisés trouvés par Knip à `scripts/deadcode-unused-files.allowlist.mjs`. Le garde des fichiers inutilisés échoue lorsquune PR ajoute un nouveau fichier inutilisé non revu ou laisse une entrée périmée dans la liste dautorisation, tout en préservant les surfaces intentionnelles de plugin dynamique, générées, de build, de tests live et de ponts de packages que Knip ne peut pas résoudre statiquement.
Le shard `check-dependencies` exécute `pnpm deadcode:dependencies` (une passe Knip de production limitée aux dépendances, épinglée à la dernière version de Knip, avec lâge minimal de publication de pnpm désactivé pour linstallation `dlx`) et `pnpm deadcode:unused-files`, qui compare les résultats de fichiers de production inutilisés de Knip à `scripts/deadcode-unused-files.allowlist.mjs`. Le garde des fichiers inutilisés échoue lorsquune PR ajoute un nouveau fichier inutilisé non revu ou laisse une entrée dallowlist obsolète, tout en préservant les surfaces intentionnelles de Plugins dynamiques, générées, de build, de live-test et de ponts de packages que Knip ne peut pas résoudre statiquement.
## Dispatchs manuels
## Dispatches manuels
Les dispatchs CI manuels exécutent le même graphe de jobs que la CI normale, mais activent de force chaque voie cadrée non Android : fragments Linux Node, fragments de plugins bundled, contrats de canaux, compatibilité Node 22, `check`, `check-additional`, build smoke, vérifications des docs, Skills Python, Windows, macOS et i18n de la Control UI. Les dispatchs CI manuels autonomes exécutent Android uniquement avec `include_android=true` ; lombrelle de release complète active Android en passant `include_android=true`. Les vérifications statiques de préversion de plugins, le fragment `agentic-plugins` réservé aux releases, le balayage complet par lots des extensions et les voies Docker de préversion de plugins sont exclus de la CI. La suite Docker de préversion sexécute uniquement lorsque `Validation complète de release` déclenche le workflow séparé `Plugin Préversion` avec la porte de validation de release activée.
Les dispatches CI manuels exécutent le même graphe de jobs que la CI normale mais forcent lactivation de chaque lane périmétrée non Android : shards Node Linux, shards de Plugins groupés, contrats de channels, compatibilité Node 22, `check`, `check-additional`, build smoke, vérifications docs, Skills Python, Windows, macOS et i18n Control UI. Les dispatches CI manuels autonomes exécutent Android uniquement avec `include_android=true` ; lombrelle de release complète active Android en passant `include_android=true`. Les vérifications statiques de prerelease Plugin, le shard `agentic-plugins` réservé aux releases, le balayage complet par lots des extensions, et les lanes Docker de prerelease Plugin sont exclus de la CI. La suite Docker de prerelease ne sexécute que lorsque `Full Release Validation` déclenche le workflow séparé `Plugin Prerelease` avec la porte release-validation activée.
Les exécutions manuelles utilisent un groupe de concurrence unique afin quune suite complète de release candidate ne soit pas annulée par une autre poussée ou exécution de PR sur la même référence. Lentrée optionnelle `target_ref` permet à un appelant approuvé dexécuter ce graphe sur une branche, un tag ou un SHA de commit complet, tout en utilisant le fichier de workflow depuis la référence de dispatch sélectionnée.
Les exécutions manuelles utilisent un groupe de concurrence unique afin quune suite complète de release candidate ne soit pas annulée par un autre push ou une autre exécution de PR sur la même référence. Lentrée facultative `target_ref` permet à un appelant approuvé dexécuter ce graphe sur une branche, un tag ou un SHA de commit complet tout en utilisant le fichier de workflow de la référence de dispatch sélectionnée.
```bash
gh workflow run ci.yml --ref release/YYYY.M.D
@ -80,14 +80,14 @@ gh workflow run full-release-validation.yml --ref main -f ref=<branch-or-sha>
## Runners
| Exécuteur | Tâches |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ubuntu-24.04` | `preflight`, tâches et agrégats de sécurité rapides (`security-scm-fast`, `security-dependency-audit`, `security-fast`), vérifications rapides de protocole/contrat/bundled, vérifications fragmentées des contrats de canaux, fragments `check` sauf lint, fragments et agrégats `check-additional`, vérificateurs dagrégats de tests Node, vérifications de docs, Skills Python, workflow-sanity, labeler, auto-response ; le preflight install-smoke utilise aussi Ubuntu hébergé par GitHub afin que la matrice Blacksmith puisse être mise en file plus tôt |
| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`, fragments dextensions plus légers, `checks-fast-core`, `checks-node-compat-node22`, `check-prod-types` et `check-test-types` |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, fragments de tests Node Linux, fragments de tests de Plugins bundled, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (assez sensible au CPU pour que 8 vCPU aient coûté plus quils nont économisé) ; builds Docker install-smoke (le temps de file dattente 32 vCPU a coûté plus quil na économisé) |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ubuntu-24.04` | `preflight`, tâches de sécurité rapides et agrégats (`security-scm-fast`, `security-dependency-audit`, `security-fast`), vérifications rapides de protocole/contrat/groupées, vérifications fragmentées de contrats de canaux, fragments `check` sauf lint, fragments et agrégats `check-additional`, vérificateurs dagrégats de tests Node, vérifications de docs, Skills Python, workflow-sanity, labeler, auto-response ; le preflight install-smoke utilise aussi Ubuntu hébergé par GitHub afin que la matrice Blacksmith puisse se mettre en file plus tôt |
| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`, fragments de Plugin à charge plus faible, `checks-fast-core`, `checks-node-compat-node22`, `check-prod-types` et `check-test-types` |
| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, fragments de tests Node Linux, fragments de tests de Plugins groupés, `android` |
| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (assez sensible au CPU pour que 8 vCPU coûtent plus quils néconomisent) ; builds Docker install-smoke (le temps de file de 32 vCPU coûtait plus quil néconomisait) |
| `blacksmith-16vcpu-windows-2025` | `checks-windows` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` sur `openclaw/openclaw` ; les forks se rabattent sur `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` sur `openclaw/openclaw` ; les forks se rabattent sur `macos-latest` |
| `blacksmith-6vcpu-macos-latest` | `macos-node` sur `openclaw/openclaw` ; les forks se replient sur `macos-latest` |
| `blacksmith-12vcpu-macos-latest` | `macos-swift` sur `openclaw/openclaw` ; les forks se replient sur `macos-latest` |
## Équivalents locaux
@ -115,25 +115,25 @@ pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-per
pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json
```
## Validation complète de release
## Validation complète de publication
`Full Release Validation` est le workflow manuel englobant pour « tout exécuter avant la release ». Il accepte une branche, une balise ou un SHA de commit complet, déclenche le workflow manuel `CI` avec cette cible, déclenche `Plugin Prerelease` pour les preuves réservées à la release concernant Plugin/package/statique/Docker, et déclenche `OpenClaw Release Checks` pour les install smoke, lacceptation de package, les suites de chemin de release Docker, live/E2E, OpenWebUI, la parité QA Lab, Matrix et les voies Telegram. Il peut aussi exécuter le workflow post-publication `NPM Telegram Beta E2E` lorsquune spécification de package publiée est fournie.
`Full Release Validation` est le workflow parapluie manuel pour « tout exécuter avant la publication ». Il accepte une branche, un tag ou un SHA de commit complet, déclenche le workflow manuel `CI` avec cette cible, déclenche `Plugin Prerelease` pour la preuve réservée à la publication des Plugins/packages/statiques/Docker, et déclenche `OpenClaw Release Checks` pour le smoke dinstallation, lacceptation de package, les suites de chemin de publication Docker, le live/E2E, OpenWebUI, la parité QA Lab, Matrix et les voies Telegram. Il peut aussi exécuter le workflow post-publication `NPM Telegram Beta E2E` lorsquune spécification de package publiée est fournie.
`release_profile` contrôle létendue live/fournisseur transmise aux vérifications de release :
`release_profile` contrôle létendue live/fournisseur transmise aux vérifications de publication :
- `minimum` conserve les voies critiques de release OpenAI/core les plus rapides.
- `minimum` conserve les voies OpenAI/core critiques pour la publication les plus rapides.
- `stable` ajoute lensemble stable de fournisseurs/backends.
- `full` exécute la large matrice consultative fournisseurs/médias.
- `full` exécute la large matrice consultative fournisseur/médias.
Lenglobant enregistre les ID dexécution enfant déclenchées, et la tâche finale `Verify full validation` revérifie les conclusions actuelles des exécutions enfant et ajoute des tableaux des tâches les plus lentes pour chaque exécution enfant. Si un workflow enfant est relancé et passe au vert, relancez seulement la tâche de vérification parente pour actualiser le résultat englobant et le résumé des temps.
Le parapluie enregistre les identifiants des exécutions enfants déclenchées, et la tâche finale `Verify full validation` revérifie les conclusions actuelles des exécutions enfants et ajoute des tableaux des tâches les plus lentes pour chaque exécution enfant. Si un workflow enfant est relancé et passe au vert, relancez uniquement la tâche de vérification parente pour actualiser le résultat du parapluie et le résumé des temps.
Pour la récupération, `Full Release Validation` et `OpenClaw Release Checks` acceptent tous deux `rerun_group`. Utilisez `all` pour une release candidate, `ci` uniquement pour lenfant CI complet normal, `release-checks` pour chaque enfant de release, ou un groupe plus étroit : `install-smoke`, `cross-os`, `live-e2e`, `package`, `qa`, `qa-parity`, `qa-live` ou `npm-telegram` sur lenglobant. Cela garde bornée la relance dune boîte de release échouée après un correctif ciblé.
Pour la récupération, `Full Release Validation` et `OpenClaw Release Checks` acceptent tous deux `rerun_group`. Utilisez `all` pour un candidat de publication, `ci` uniquement pour lenfant CI complet normal, `release-checks` pour chaque enfant de publication, ou un groupe plus étroit : `install-smoke`, `cross-os`, `live-e2e`, `package`, `qa`, `qa-parity`, `qa-live` ou `npm-telegram` sur le parapluie. Cela limite la relance dune boîte de publication échouée après un correctif ciblé.
`OpenClaw Release Checks` utilise la ref de workflow de confiance pour résoudre une fois la ref sélectionnée en tarball `release-package-under-test`, puis transmet cet artefact à la fois au workflow Docker de chemin de release live/E2E et au fragment dacceptation de package. Cela maintient les octets du package cohérents entre les boîtes de release et évite de reconditionner le même candidat dans plusieurs tâches enfant.
`OpenClaw Release Checks` utilise la référence de workflow de confiance pour résoudre une fois la référence sélectionnée en tarball `release-package-under-test`, puis transmet cet artefact à la fois au workflow Docker de chemin de publication live/E2E et au fragment dacceptation de package. Cela maintient des octets de package cohérents entre les boîtes de publication et évite de réemballer le même candidat dans plusieurs tâches enfants.
## Fragments live et E2E
Lenfant live/E2E de release conserve une large couverture native `pnpm test:live`, mais lexécute comme fragments nommés via `scripts/test-live-shard.mjs` au lieu dune tâche sérielle unique :
Lenfant live/E2E de publication conserve une large couverture native `pnpm test:live`, mais lexécute sous forme de fragments nommés via `scripts/test-live-shard.mjs` au lieu dune seule tâche série :
- `native-live-src-agents`
- `native-live-src-gateway-core`
@ -145,57 +145,57 @@ Lenfant live/E2E de release conserve une large couverture native `pnpm test:l
- `native-live-extensions-openai`
- `native-live-extensions-o-z-other`
- `native-live-extensions-xai`
- fragments médias audio/vidéo séparés et fragments musicaux filtrés par fournisseur
- fragments médias audio/vidéo séparés et fragments musique filtrés par fournisseur
Cela conserve la même couverture de fichiers tout en rendant les échecs lents de fournisseurs live plus faciles à relancer et à diagnostiquer. Les noms de fragments agrégés `native-live-extensions-o-z`, `native-live-extensions-media` et `native-live-extensions-media-music` restent valides pour les relances manuelles ponctuelles.
Cela conserve la même couverture de fichiers tout en rendant les défaillances lentes des fournisseurs live plus faciles à relancer et à diagnostiquer. Les noms de fragments agrégés `native-live-extensions-o-z`, `native-live-extensions-media` et `native-live-extensions-media-music` restent valides pour les relances manuelles en une seule fois.
Les fragments médias live natifs sexécutent dans `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, construit par le workflow `Live Media Runner Image`. Cette image préinstalle `ffmpeg` et `ffprobe` ; les tâches médias vérifient seulement les binaires avant la configuration. Gardez les suites live adossées à Docker sur les exécuteurs Blacksmith normaux — les tâches de conteneur ne sont pas le bon endroit pour lancer des tests Docker imbriqués.
Les fragments de médias live natifs sexécutent dans `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, construit par le workflow `Live Media Runner Image`. Cette image préinstalle `ffmpeg` et `ffprobe` ; les tâches médias ne font que vérifier les binaires avant la configuration. Gardez les suites live adossées à Docker sur des exécuteurs Blacksmith normaux : les tâches conteneur sont le mauvais endroit pour lancer des tests Docker imbriqués.
Les fragments live modèle/backend adossés à Docker utilisent une image partagée distincte `ghcr.io/openclaw/openclaw-live-test:<sha>` par commit sélectionné. Le workflow live de release construit et pousse cette image une fois, puis les fragments modèle live Docker, Gateway, backend CLI, liaison ACP et harnais Codex sexécutent avec `OPENCLAW_SKIP_DOCKER_BUILD=1`. Si ces fragments reconstruisent indépendamment la cible Docker source complète, lexécution de release est mal configurée et gaspillera du temps réel sur des builds dimage en double.
Les fragments live de modèles/backends adossés à Docker utilisent une image partagée distincte `ghcr.io/openclaw/openclaw-live-test:<sha>` par commit sélectionné. Le workflow de publication live construit et pousse cette image une seule fois, puis les fragments du modèle live Docker, du Gateway, du backend CLI, de la liaison ACP et du harnais Codex sexécutent avec `OPENCLAW_SKIP_DOCKER_BUILD=1`. Si ces fragments reconstruisent indépendamment la cible Docker source complète, lexécution de publication est mal configurée et gaspillera du temps mural avec des builds dimage dupliqués.
## Acceptation de package
Utilisez `Package Acceptance` lorsque la question est « ce package OpenClaw installable fonctionne-t-il comme produit ? ». Elle diffère de la CI normale : la CI normale valide larborescence source, tandis que lacceptation de package valide un seul tarball via le même harnais Docker E2E que les utilisateurs exercent après installation ou mise à jour.
Utilisez `Package Acceptance` lorsque la question est « ce package OpenClaw installable fonctionne-t-il comme un produit ? » Cest différent de la CI normale : la CI normale valide larborescence source, tandis que lacceptation de package valide un tarball unique via le même harnais Docker E2E que les utilisateurs exercent après une installation ou une mise à jour.
### Tâches
1. `resolve_package` extrait `workflow_ref`, résout un candidat package, écrit `.artifacts/docker-e2e-package/openclaw-current.tgz`, écrit `.artifacts/docker-e2e-package/package-candidate.json`, téléverse les deux comme artefact `package-under-test`, et imprime la source, la ref de workflow, la ref de package, la version, le SHA-256 et le profil dans le résumé détape GitHub.
2. `docker_acceptance` appelle `openclaw-live-and-e2e-checks-reusable.yml` avec `ref=workflow_ref` et `package_artifact_name=package-under-test`. Le workflow réutilisable télécharge cet artefact, valide linventaire du tarball, prépare les images Docker à condensé de package si nécessaire, et exécute les voies Docker sélectionnées contre ce package au lieu de packager lextraction du workflow. Lorsquun profil sélectionne plusieurs `docker_lanes` ciblées, le workflow réutilisable prépare le package et les images partagées une fois, puis déploie ces voies en tâches Docker ciblées parallèles avec des artefacts uniques.
1. `resolve_package` extrait `workflow_ref`, résout un candidat de package, écrit `.artifacts/docker-e2e-package/openclaw-current.tgz`, écrit `.artifacts/docker-e2e-package/package-candidate.json`, téléverse les deux en tant quartefact `package-under-test`, et affiche la source, la référence de workflow, la référence de package, la version, le SHA-256 et le profil dans le résumé détape GitHub.
2. `docker_acceptance` appelle `openclaw-live-and-e2e-checks-reusable.yml` avec `ref=workflow_ref` et `package_artifact_name=package-under-test`. Le workflow réutilisable télécharge cet artefact, valide linventaire du tarball, prépare les images Docker de digest de package lorsque nécessaire, et exécute les voies Docker sélectionnées contre ce package au lieu de packager lextraction du workflow. Lorsquun profil sélectionne plusieurs `docker_lanes` ciblées, le workflow réutilisable prépare le package et les images partagées une seule fois, puis déploie ces voies en tâches Docker ciblées parallèles avec des artefacts uniques.
3. `package_telegram` appelle éventuellement `NPM Telegram Beta E2E`. Il sexécute lorsque `telegram_mode` nest pas `none` et installe le même artefact `package-under-test` lorsque Package Acceptance en a résolu un ; un déclenchement Telegram autonome peut toujours installer une spécification npm publiée.
4. `summary` fait échouer le workflow si la résolution de package, lacceptation Docker ou la voie Telegram facultative a échoué.
4. `summary` fait échouer le workflow si la résolution du package, lacceptation Docker ou la voie Telegram facultative a échoué.
### Sources candidates
- `source=npm` accepte uniquement `openclaw@beta`, `openclaw@latest` ou une version de publication OpenClaw exacte telle que `openclaw@2026.4.27-beta.2`. Utilisez cela pour lacceptation publiée bêta/stable.
- `source=ref` empaquette une branche, une balise ou un SHA de commit complet `package_ref` de confiance. Le résolveur récupère les branches/balises OpenClaw, vérifie que le commit sélectionné est accessible depuis lhistorique de branche du dépôt ou une balise de publication, installe les dépendances dans un worktree détaché, puis lempaquette avec `scripts/package-openclaw-for-docker.mjs`.
- `source=npm` accepte uniquement `openclaw@beta`, `openclaw@latest` ou une version de publication OpenClaw exacte telle que `openclaw@2026.4.27-beta.2`. Utilisez ceci pour lacceptation des versions bêta/stables publiées.
- `source=ref` empaquette une branche, une étiquette ou un SHA de commit complet `package_ref` de confiance. Le résolveur récupère les branches/étiquettes OpenClaw, vérifie que le commit sélectionné est atteignable depuis lhistorique des branches du dépôt ou une étiquette de publication, installe les dépendances dans un worktree détaché et lempaquette avec `scripts/package-openclaw-for-docker.mjs`.
- `source=url` télécharge un `.tgz` HTTPS ; `package_sha256` est requis.
- `source=artifact` télécharge un `.tgz` depuis `artifact_run_id` et `artifact_name` ; `package_sha256` est facultatif mais devrait être fourni pour les artefacts partagés en externe.
- `source=artifact` télécharge un `.tgz` depuis `artifact_run_id` et `artifact_name` ; `package_sha256` est facultatif mais doit être fourni pour les artefacts partagés en externe.
Gardez `workflow_ref` et `package_ref` séparés. `workflow_ref` est le code de workflow/harnais de confiance qui exécute le test. `package_ref` est le commit source qui est empaqueté quand `source=ref`. Cela permet au harnais de test actuel de valider danciens commits source de confiance sans exécuter lancienne logique de workflow.
Gardez `workflow_ref` et `package_ref` séparés. `workflow_ref` est le code de workflow/harnais de confiance qui exécute le test. `package_ref` est le commit source qui est empaqueté lorsque `source=ref`. Cela permet au harnais de test actuel de valider danciens commits source de confiance sans exécuter lancienne logique de workflow.
### Profils de suite
- `smoke``npm-onboard-channel-agent`, `gateway-network`, `config-reload`
- `package``npm-onboard-channel-agent`, `doctor-switch`, `update-channel-switch`, `bundled-channel-deps-compat`, `plugins-offline`, `plugin-update`
- `package``npm-onboard-channel-agent`, `doctor-switch`, `update-channel-switch`, `upgrade-survivor`, `bundled-channel-deps-compat`, `plugins-offline`, `plugin-update`
- `product``package` plus `mcp-channels`, `cron-mcp-cleanup`, `openai-web-search-minimal`, `openwebui`
- `full` — fragments complets du chemin de publication Docker avec OpenWebUI
- `custom``docker_lanes` exact ; requis quand `suite_profile=custom`
- `custom``docker_lanes` exact ; requis lorsque `suite_profile=custom`
Le profil `package` utilise une couverture de plugins hors ligne afin que la validation des packages publiés ne dépende pas de la disponibilité en direct de ClawHub. La voie Telegram facultative réutilise lartefact `package-under-test` dans `NPM Telegram Beta E2E`, le chemin de spécification npm publié étant conservé pour les dispatches autonomes.
Le profil `package` utilise une couverture des plugins hors ligne afin que la validation des packages publiés ne dépende pas de la disponibilité en direct de ClawHub. Le lane Telegram facultatif réutilise lartefact `package-under-test` dans `NPM Telegram Beta E2E`, avec le chemin de spécification npm publiée conservé pour les dispatchs autonomes.
Les vérifications de publication appellent Package Acceptance avec `source=ref`, `package_ref=<release-ref>`, `workflow_ref=<release workflow ref>`, `suite_profile=custom`, `docker_lanes='bundled-channel-deps-compat plugins-offline'` et `telegram_mode=mock-openai`. Les fragments Docker du chemin de publication couvrent les voies package/update/plugin qui se chevauchent ; Package Acceptance conserve la compatibilité bundled-channel native de lartefact, le plugin hors ligne et la preuve Telegram sur la même archive tar de package résolue. Les vérifications de publication inter-OS couvrent toujours lonboarding, linstallateur et le comportement de plateforme propres à lOS ; la validation produit package/update devrait commencer avec Package Acceptance. Les voies Windows packaged et installer fresh vérifient aussi quun package installé peut importer un remplacement browser-control depuis un chemin Windows absolu brut. Le smoke de tour dagent OpenAI inter-OS utilise par défaut `OPENCLAW_CROSS_OS_OPENAI_MODEL` quand il est défini, sinon `openai/gpt-5.4-mini`, afin que la preuve dinstallation et de Gateway reste rapide et déterministe.
Les vérifications de publication appellent Package Acceptance avec `source=ref`, `package_ref=<release-ref>`, `workflow_ref=<release workflow ref>`, `suite_profile=custom`, `docker_lanes='bundled-channel-deps-compat plugins-offline'` et `telegram_mode=mock-openai`. Les fragments Docker du chemin de publication couvrent les lanes qui se chevauchent pour les packages/mises à jour/plugins ; Package Acceptance conserve la preuve de compatibilité des canaux groupés native de lartefact, des plugins hors ligne et de Telegram contre le même tarball de package résolu. Les vérifications de publication multi-OS couvrent toujours lonboarding propre au système dexploitation, linstalleur et le comportement de plateforme ; la validation produit des packages/mises à jour doit commencer par Package Acceptance. Les lanes Windows de package et dinstallation fraîche vérifient également quun package installé peut importer un remplacement de contrôle du navigateur depuis un chemin Windows absolu brut. Le smoke de tour dagent multi-OS OpenAI utilise par défaut `OPENCLAW_CROSS_OS_OPENAI_MODEL` lorsquil est défini, sinon `openai/gpt-5.4-mini`, afin que la preuve dinstallation et de Gateway reste rapide et déterministe.
### Fenêtres de compatibilité héritée
### Fenêtres de compatibilité héritées
Package Acceptance dispose de fenêtres bornées de compatibilité héritée pour les packages déjà publiés. Les packages jusquà `2026.4.25`, y compris `2026.4.25-beta.*`, peuvent utiliser le chemin de compatibilité :
- les entrées QA privées connues dans `dist/postinstall-inventory.json` peuvent pointer vers des fichiers omis de larchive tar ;
- `doctor-switch` peut ignorer le sous-cas de persistance `gateway install --wrapper` quand le package nexpose pas ce drapeau ;
- `update-channel-switch` peut élaguer les `pnpm.patchedDependencies` manquants depuis la fausse fixture git dérivée de larchive tar et peut journaliser labsence de `update.channel` persistant ;
- les smokes de plugins peuvent lire danciens emplacements denregistrement dinstallation ou accepter labsence de persistance de lenregistrement dinstallation de la marketplace ;
- les entrées QA privées connues dans `dist/postinstall-inventory.json` peuvent pointer vers des fichiers omis du tarball ;
- `doctor-switch` peut ignorer le sous-cas de persistance `gateway install --wrapper` lorsque le package nexpose pas cet indicateur ;
- `update-channel-switch` peut supprimer les `pnpm.patchedDependencies` manquantes du faux fixture git dérivé du tarball et peut journaliser labsence du `update.channel` persistant ;
- les smokes de plugins peuvent lire les anciens emplacements denregistrements dinstallation ou accepter labsence de persistance de lenregistrement dinstallation marketplace ;
- `plugin-update` peut autoriser la migration des métadonnées de configuration tout en exigeant que lenregistrement dinstallation et le comportement sans réinstallation restent inchangés.
Le package `2026.4.26` publié peut aussi avertir pour les fichiers dhorodatage de métadonnées de build local déjà livrés. Les packages ultérieurs doivent satisfaire les contrats modernes ; les mêmes conditions échouent au lieu davertir ou dêtre ignorées.
Le package publié `2026.4.26` peut aussi avertir pour les fichiers dhorodatage de métadonnées de build local déjà livrés. Les packages ultérieurs doivent satisfaire les contrats modernes ; les mêmes conditions échouent au lieu démettre un avertissement ou dêtre ignorées.
### Exemples
@ -238,60 +238,60 @@ gh workflow run package-acceptance.yml \
-f docker_lanes='install-e2e plugin-update'
```
Lors du débogage dune exécution Package Acceptance échouée, commencez par le résumé `resolve_package` pour confirmer la source, la version et le SHA-256 du package. Inspectez ensuite lexécution enfant `docker_acceptance` et ses artefacts Docker : `.artifacts/docker-tests/**/summary.json`, `failures.json`, les journaux de voie, les temps de phase et les commandes de réexécution. Préférez réexécuter le profil de package échoué ou les voies Docker exactes plutôt que de relancer toute la validation de publication.
Lors du débogage dune exécution Package Acceptance échouée, commencez par le résumé `resolve_package` pour confirmer la source du package, la version et le SHA-256. Inspectez ensuite lexécution enfant `docker_acceptance` et ses artefacts Docker : `.artifacts/docker-tests/**/summary.json`, `failures.json`, les journaux de lane, les minutages de phase et les commandes de réexécution. Préférez réexécuter le profil de package échoué ou les lanes Docker exacts plutôt que de relancer la validation complète de publication.
## Smoke dinstallation
Le workflow `Install Smoke` séparé réutilise le même script de portée via sa propre tâche `preflight`. Il divise la couverture smoke entre `run_fast_install_smoke` et `run_full_install_smoke`.
Le workflow distinct `Install Smoke` réutilise le même script de portée via son propre job `preflight`. Il divise la couverture smoke entre `run_fast_install_smoke` et `run_full_install_smoke`.
- **Chemin rapide** sexécute pour les pull requests touchant les surfaces Docker/package, les changements de package/manifeste de plugins groupés, ou les surfaces principales de plugin/canal/Gateway/Plugin SDK que les tâches de smoke Docker exercent. Les changements de plugins groupés limités au source, les modifications limitées aux tests et les modifications limitées à la documentation ne réservent pas de workers Docker. Le chemin rapide construit limage Dockerfile racine une fois, vérifie la CLI, exécute le smoke CLI de suppression des agents dans lespace de travail partagé, exécute le2e gateway-network du conteneur, vérifie un argument de build dextension groupée, puis exécute le profil Docker borné de plugin groupé sous un délai global de commande de 240 secondes (chaque exécution Docker de scénario étant plafonnée séparément).
- **Chemin complet** conserve linstallation de package QR et la couverture Docker/update de linstallateur pour les exécutions planifiées nocturnes, les dispatches manuels, les vérifications de publication par workflow-call et les pull requests qui touchent réellement les surfaces installateur/package/Docker. En mode complet, install-smoke prépare ou réutilise une image de smoke Dockerfile racine GHCR pour le SHA cible, puis exécute linstallation de package QR, les smokes Dockerfile racine/Gateway, les smokes installateur/update et lE2E Docker rapide de plugin groupé comme tâches séparées afin que le travail dinstallation nattende pas derrière les smokes de limage racine.
- **Chemin rapide** sexécute pour les pull requests touchant les surfaces Docker/package, les changements de package/manifeste de plugin groupé, ou les surfaces Plugin SDK de plugin/canal/Gateway cœur que les jobs smoke Docker exercent. Les changements de plugin groupé uniquement source, les modifications uniquement de tests et les modifications uniquement de documentation ne réservent pas de workers Docker. Le chemin rapide construit une fois limage Dockerfile racine, vérifie la CLI, exécute le smoke CLI de suppression des agents pour lespace de travail partagé, exécute le2e gateway-network du conteneur, vérifie un argument de build dextension groupée et exécute le profil Docker borné des plugins groupés sous un délai global de commande de 240 secondes (chaque exécution Docker de scénario étant plafonnée séparément).
- **Chemin complet** conserve la couverture dinstallation de package QR et dinstallation/mise à jour Docker pour les exécutions nocturnes planifiées, les dispatchs manuels, les vérifications de publication workflow-call et les pull requests qui touchent réellement les surfaces dinstalleur/package/Docker. En mode complet, install-smoke prépare ou réutilise une image smoke GHCR Dockerfile racine pour le SHA cible, puis exécute linstallation de package QR, les smokes Dockerfile racine/Gateway, les smokes installeur/mise à jour et lE2E Docker rapide des plugins groupés comme jobs séparés afin que le travail dinstallation nattende pas derrière les smokes de limage racine.
Les pushes sur `main` (y compris les commits de merge) ne forcent pas le chemin complet ; quand la logique de portée des changements demanderait une couverture complète sur un push, le workflow conserve le smoke Docker rapide et laisse le smoke dinstallation complet à la validation nocturne ou de publication.
Les pushs vers `main` (y compris les commits de fusion) ne forcent pas le chemin complet ; lorsque la logique de portée des changements demanderait une couverture complète sur un push, le workflow conserve le smoke Docker rapide et laisse le smoke dinstallation complet à la validation nocturne ou de publication.
Le smoke lent de fournisseur dimage par installation globale Bun est contrôlé séparément par `run_bun_global_install_smoke`. Il sexécute selon le planning nocturne et depuis le workflow de vérifications de publication, et les dispatches manuels `Install Smoke` peuvent choisir de linclure, mais les pull requests et les pushes sur `main` ne le font pas. Les tests Docker QR et installateur conservent leurs propres Dockerfiles centrés sur linstallation.
Le smoke lent du fournisseur dimage dinstallation globale Bun est contrôlé séparément par `run_bun_global_install_smoke`. Il sexécute sur la planification nocturne et depuis le workflow de vérifications de publication, et les dispatchs manuels `Install Smoke` peuvent lactiver, mais pas les pull requests ni les pushs vers `main`. Les tests Docker QR et dinstalleur conservent leurs propres Dockerfiles orientés installation.
## E2E Docker local
`pnpm test:docker:all` préconstruit une image de test en direct partagée, empaquette OpenClaw une fois sous forme darchive tar npm, puis construit deux images `scripts/e2e/Dockerfile` partagées :
`pnpm test:docker:all` préconstruit une image de test en direct partagée, empaquette OpenClaw une fois comme tarball npm et construit deux images `scripts/e2e/Dockerfile` partagées :
- un exécuteur Node/Git minimal pour les voies installateur/update/dépendances de plugin ;
- une image fonctionnelle qui installe la même archive tar dans `/app` pour les voies de fonctionnalité normales.
- un exécuteur Node/Git minimal pour les lanes installeur/mise à jour/dépendance de plugin ;
- une image fonctionnelle qui installe le même tarball dans `/app` pour les lanes de fonctionnalité normale.
Les définitions de voies Docker se trouvent dans `scripts/lib/docker-e2e-scenarios.mjs`, la logique du planificateur dans `scripts/lib/docker-e2e-plan.mjs`, et lexécuteur exécute uniquement le plan sélectionné. Lordonnanceur sélectionne limage par voie avec `OPENCLAW_DOCKER_E2E_BARE_IMAGE` et `OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`, puis exécute les voies avec `OPENCLAW_SKIP_DOCKER_BUILD=1`.
Les définitions de lanes Docker se trouvent dans `scripts/lib/docker-e2e-scenarios.mjs`, la logique du planificateur se trouve dans `scripts/lib/docker-e2e-plan.mjs`, et lexécuteur nexécute que le plan sélectionné. Lordonnanceur sélectionne limage par lane avec `OPENCLAW_DOCKER_E2E_BARE_IMAGE` et `OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`, puis exécute les lanes avec `OPENCLAW_SKIP_DOCKER_BUILD=1`.
### Paramètres ajustables
| Variable | Par défaut | Objectif |
| -------------------------------------- | ---------- | --------------------------------------------------------------------------------------------- |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Nombre de créneaux du pool principal pour les voies normales. |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | Nombre de créneaux du pool final sensible aux fournisseurs. |
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | Plafond de voies en direct concurrentes pour éviter que les fournisseurs ne limitent le débit. |
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | Plafond de voies dinstallation npm concurrentes. |
| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | Plafond de voies multi-services concurrentes. |
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | Décalage entre les démarrages de voies pour éviter les tempêtes de création du démon Docker ; définissez `0` pour aucun décalage. |
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | Délai de secours par voie (120 minutes) ; certaines voies live/tail utilisent des plafonds plus stricts. |
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | non défini | `1` affiche le plan de lordonnanceur sans exécuter les voies. |
| `OPENCLAW_DOCKER_ALL_LANES` | non défini | Liste exacte de voies séparées par des virgules ; ignore le smoke de nettoyage afin que les agents puissent reproduire une voie échouée. |
| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Nombre de slots du pool principal pour les lanes normales. |
| `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | Nombre de slots du pool de fin sensible aux fournisseurs. |
| `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | Plafond de lanes en direct concurrentes afin que les fournisseurs ne limitent pas le débit. |
| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | Plafond de lanes dinstallation npm concurrentes. |
| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | Plafond de lanes multiservices concurrentes. |
| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | Décalage entre les démarrages de lanes pour éviter les tempêtes de création du démon Docker ; définissez `0` pour aucun décalage. |
| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | Délai de secours par lane (120 minutes) ; certaines lanes en direct/de fin utilisent des plafonds plus stricts. |
| `OPENCLAW_DOCKER_ALL_DRY_RUN` | non défini | `1` affiche le plan de lordonnanceur sans exécuter les lanes. |
| `OPENCLAW_DOCKER_ALL_LANES` | non défini | Liste exacte de lanes séparées par des virgules ; ignore le smoke de nettoyage afin que les agents puissent reproduire une lane échouée. |
Une voie plus lourde que son plafond effectif peut tout de même démarrer depuis un pool vide, puis sexécuter seule jusquà libérer de la capacité. Le préflight agrégé local vérifie Docker, supprime les conteneurs E2E OpenClaw obsolètes, émet létat des voies actives, persiste les temps de voie pour lordre du plus long au plus court, et cesse par défaut de planifier de nouvelles voies mutualisées après le premier échec.
Une lane plus lourde que son plafond effectif peut quand même démarrer depuis un pool vide, puis sexécute seule jusquà libérer de la capacité. Lagrégat local effectue les prévalidations Docker, supprime les conteneurs E2E OpenClaw obsolètes, émet létat des lanes actives, persiste les minutages de lanes pour lordre du plus long dabord et arrête par défaut de planifier de nouvelles lanes groupées après le premier échec.
### Workflow live/E2E réutilisable
### Workflow en direct/E2E réutilisable
Le workflow live/E2E réutilisable demande à `scripts/test-docker-all.mjs --plan-json` quelle couverture de package, type dimage, image live, voie et identifiants est requise. `scripts/docker-e2e.mjs` convertit ensuite ce plan en sorties et résumés GitHub. Il empaquette OpenClaw via `scripts/package-openclaw-for-docker.mjs`, télécharge un artefact de package de lexécution courante, ou télécharge un artefact de package depuis `package_artifact_run_id` ; valide linventaire de larchive tar ; construit et pousse les images E2E Docker GHCR bare/fonctionnelles étiquetées par digest de package via le cache de couches Docker de Blacksmith quand le plan a besoin de voies avec package installé ; et réutilise les entrées `docker_e2e_bare_image`/`docker_e2e_functional_image` fournies ou les images existantes par digest de package au lieu de reconstruire. Les pulls dimages Docker sont retentés avec un délai borné de 180 secondes par tentative afin quun flux registre/cache bloqué retente rapidement au lieu de consommer la majeure partie du chemin critique CI.
Le workflow en direct/E2E réutilisable demande à `scripts/test-docker-all.mjs --plan-json` quels package, type dimage, image en direct, lane et couverture didentifiants sont requis. `scripts/docker-e2e.mjs` convertit ensuite ce plan en sorties et résumés GitHub. Il empaquette OpenClaw via `scripts/package-openclaw-for-docker.mjs`, télécharge un artefact de package de lexécution actuelle ou télécharge un artefact de package depuis `package_artifact_run_id` ; valide linventaire du tarball ; construit et pousse des images E2E Docker GHCR bare/fonctionnelles étiquetées par le digest du package via le cache de couches Docker de Blacksmith lorsque le plan nécessite des lanes avec package installé ; et réutilise les entrées `docker_e2e_bare_image`/`docker_e2e_functional_image` fournies ou des images existantes fondées sur le digest du package au lieu de reconstruire. Les extractions dimages Docker sont réessayées avec un délai borné de 180 secondes par tentative afin quun flux de registre/cache bloqué soit réessayé rapidement au lieu de consommer lessentiel du chemin critique CI.
### Fragments du chemin de publication
La couverture Docker de publication exécute des tâches fragmentées plus petites avec `OPENCLAW_SKIP_DOCKER_BUILD=1`, afin que chaque fragment ne tire que le type dimage dont il a besoin et exécute plusieurs voies via le même ordonnanceur pondéré :
La couverture Docker de publication exécute des jobs fragmentés plus petits avec `OPENCLAW_SKIP_DOCKER_BUILD=1`, afin que chaque fragment ne récupère que le type dimage dont il a besoin et exécute plusieurs lanes via le même ordonnanceur pondéré :
- `OPENCLAW_DOCKER_ALL_PROFILE=release-path`
- `OPENCLAW_DOCKER_ALL_CHUNK=core | package-update-openai | package-update-anthropic | package-update-core | plugins-runtime-plugins | plugins-runtime-services | plugins-runtime-install-a..h | bundled-channels`
Les fragments Docker de la version actuelle sont `core`, `package-update-openai`, `package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`, `plugins-runtime-services`, `plugins-runtime-install-a` à `plugins-runtime-install-h`, `bundled-channels-core`, `bundled-channels-update-a`, `bundled-channels-update-discord`, `bundled-channels-update-b` et `bundled-channels-contracts`. Le fragment agrégé `bundled-channels` reste disponible pour les réexécutions manuelles ponctuelles, et `plugins-runtime-core`, `plugins-runtime` et `plugins-integrations` restent des alias agrégés de plugin/runtime. Lalias de voie `install-e2e` reste lalias de réexécution manuelle agrégé pour les deux voies dinstallation des fournisseurs. Le fragment `bundled-channels` exécute des voies scindées `bundled-channel-*` et `bundled-channel-update-*` plutôt que la voie série tout-en-un `bundled-channel-deps`.
Les fragments Docker de la version actuelle sont `core`, `package-update-openai`, `package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`, `plugins-runtime-services`, `plugins-runtime-install-a` à `plugins-runtime-install-h`, `bundled-channels-core`, `bundled-channels-update-a`, `bundled-channels-update-discord`, `bundled-channels-update-b` et `bundled-channels-contracts`. Le fragment agrégé `bundled-channels` reste disponible pour les relances manuelles en une seule passe, et `plugins-runtime-core`, `plugins-runtime` et `plugins-integrations` restent des alias agrégés de Plugin/runtime. Lalias de voie `install-e2e` reste lalias de relance manuelle agrégé pour les deux voies dinstallation de fournisseur. Le fragment `bundled-channels` exécute les voies divisées `bundled-channel-*` et `bundled-channel-update-*` plutôt que la voie sérielle tout-en-un `bundled-channel-deps`.
OpenWebUI est intégré à `plugins-runtime-services` lorsque la couverture complète du chemin de publication le demande, et conserve un fragment autonome `openwebui` uniquement pour les dispatches limités à OpenWebUI. Les voies de mise à jour des canaux groupés réessaient une fois en cas déchecs réseau npm transitoires.
OpenWebUI est intégré à `plugins-runtime-services` lorsque la couverture complète du chemin de publication le demande, et conserve un fragment autonome `openwebui` uniquement pour les dispatchs limités à OpenWebUI. Les voies de mise à jour des canaux groupés réessaient une fois en cas déchecs réseau npm transitoires.
Chaque fragment téléverse `.artifacts/docker-tests/` avec les journaux de voie, les durées, `summary.json`, `failures.json`, les durées de phase, le JSON du planificateur, les tableaux de voies lentes et les commandes de réexécution par voie. Lentrée `docker_lanes` du workflow exécute les voies sélectionnées sur les images préparées au lieu des jobs de fragments, ce qui limite le débogage dune voie en échec à un seul job Docker ciblé et prépare, télécharge ou réutilise lartefact de package pour cette exécution ; si une voie sélectionnée est une voie Docker live, le job ciblé construit localement limage de test live pour cette réexécution. Les commandes de réexécution GitHub générées par voie incluent `package_artifact_run_id`, `package_artifact_name` et les entrées dimages préparées lorsque ces valeurs existent, de sorte quune voie en échec puisse réutiliser exactement le package et les images de lexécution échouée.
Chaque fragment téléverse `.artifacts/docker-tests/` avec les journaux de voie, les timings, `summary.json`, `failures.json`, les timings de phase, le JSON du plan dordonnancement, les tableaux des voies lentes et les commandes de relance par voie. Lentrée de workflow `docker_lanes` exécute les voies sélectionnées sur les images préparées au lieu des jobs de fragments, ce qui limite le débogage des voies en échec à un seul job Docker ciblé et prépare, télécharge ou réutilise lartefact de package pour cette exécution ; si une voie sélectionnée est une voie Docker live, le job ciblé construit localement limage de test live pour cette relance. Les commandes de relance GitHub générées par voie incluent `package_artifact_run_id`, `package_artifact_name` et les entrées dimages préparées lorsque ces valeurs existent, afin quune voie en échec puisse réutiliser exactement le package et les images de lexécution échouée.
```bash
pnpm test:docker:rerun <run-id> # download Docker artifacts and print combined/per-lane targeted rerun commands
@ -302,47 +302,47 @@ Le workflow live/E2E planifié exécute quotidiennement la suite Docker complèt
## Préversion de Plugin
`Plugin Prerelease` offre une couverture produit/package plus coûteuse ; il sagit donc dun workflow distinct déclenché par `Full Release Validation` ou par un opérateur explicite. Les pull requests normales, les pushes sur `main` et les dispatches CI manuels autonomes gardent cette suite désactivée. Il répartit les tests des plugins groupés sur huit workers dextension ; ces jobs de fragments dextension exécutent jusquà deux groupes de configuration de plugin à la fois, avec un worker Vitest par groupe et un tas Node plus grand afin que les lots de plugins lourds en imports ne créent pas de jobs CI supplémentaires.
`Plugin Prerelease` offre une couverture produit/package plus coûteuse, cest donc un workflow séparé déclenché par `Full Release Validation` ou par un opérateur explicite. Les pull requests normales, les poussées sur `main` et les dispatchs CI manuels autonomes laissent cette suite désactivée. Il répartit les tests des Plugins groupés sur huit workers dextension ; ces jobs de shards dextension exécutent jusquà deux groupes de configuration de Plugin à la fois, avec un worker Vitest par groupe et un tas Node plus grand, afin que les lots de Plugins lourds en imports ne créent pas de jobs CI supplémentaires.
## Labo QA
## Laboratoire QA
Le Labo QA dispose de voies CI dédiées en dehors du workflow principal à périmètre intelligent.
QA Lab dispose de voies CI dédiées en dehors du workflow principal à portée intelligente.
- Le workflow `Parity gate` sexécute sur les changements de PR correspondants et par dispatch manuel ; il construit le runtime QA privé et compare les packs agentiques fictifs GPT-5.5 et Opus 4.6.
- Le workflow `QA-Lab - All Lanes` sexécute chaque nuit sur `main` et par dispatch manuel ; il répartit en jobs parallèles la porte de parité fictive, la voie Matrix live, ainsi que les voies Telegram et Discord live. Les jobs live utilisent lenvironnement `qa-live-shared`, et Telegram/Discord utilisent des baux Convex.
- Le workflow `Parity gate` sexécute sur les changements de PR correspondants et par dispatch manuel ; il construit le runtime QA privé et compare les packs agentiques simulés GPT-5.5 et Opus 4.6.
- Le workflow `QA-Lab - All Lanes` sexécute chaque nuit sur `main` et par dispatch manuel ; il distribue en jobs parallèles la porte de parité simulée, la voie Matrix live et les voies Telegram et Discord live. Les jobs live utilisent lenvironnement `qa-live-shared`, et Telegram/Discord utilisent des baux Convex.
Les contrôles de publication exécutent les voies de transport live Matrix et Telegram avec le fournisseur fictif déterministe et des modèles qualifiés pour le mock (`mock-openai/gpt-5.5` et `mock-openai/gpt-5.5-alt`), afin que le contrat de canal soit isolé de la latence des modèles live et du démarrage normal des plugins fournisseurs. Le Gateway de transport live désactive la recherche mémoire, car la parité QA couvre séparément le comportement mémoire ; la connectivité fournisseur est couverte par les suites distinctes de modèles live, fournisseurs natifs et fournisseurs Docker.
Les vérifications de publication exécutent les voies de transport live Matrix et Telegram avec le fournisseur simulé déterministe et les modèles qualifiés mock (`mock-openai/gpt-5.5` et `mock-openai/gpt-5.5-alt`) afin que le contrat de canal soit isolé de la latence des modèles live et du démarrage normal des Plugins de fournisseur. Le gateway de transport live désactive la recherche mémoire parce que la parité QA couvre séparément le comportement mémoire ; la connectivité fournisseur est couverte par les suites séparées de modèles live, de fournisseurs natifs et de fournisseurs Docker.
Matrix utilise `--profile fast` pour les portes planifiées et de publication, en ajoutant `--fail-fast` uniquement lorsque la CLI extraite le prend en charge. La valeur par défaut de la CLI et lentrée manuelle du workflow restent `all` ; un dispatch manuel `matrix_profile=all` fragmente toujours la couverture Matrix complète en jobs `transport`, `media`, `e2ee-smoke`, `e2ee-deep` et `e2ee-cli`.
Matrix utilise `--profile fast` pour les portes planifiées et de publication, en ajoutant `--fail-fast` uniquement lorsque la CLI extraite le prend en charge. La valeur par défaut de la CLI et lentrée de workflow manuelle restent `all` ; le dispatch manuel `matrix_profile=all` répartit toujours la couverture Matrix complète en jobs `transport`, `media`, `e2ee-smoke`, `e2ee-deep` et `e2ee-cli`.
`OpenClaw Release Checks` exécute également les voies QA Lab critiques pour la publication avant lapprobation de publication ; sa porte de parité QA exécute les packs candidat et de référence comme jobs de voies parallèles, puis télécharge les deux artefacts dans un petit job de rapport pour la comparaison finale de parité.
`OpenClaw Release Checks` exécute également les voies QA Lab critiques pour la publication avant lapprobation de publication ; sa porte de parité QA exécute les packs candidat et de référence comme jobs de voie parallèles, puis télécharge les deux artefacts dans un petit job de rapport pour la comparaison de parité finale.
Ne placez pas le chemin dintégration des PR derrière `Parity gate` sauf si le changement touche réellement au runtime QA, à la parité des packs de modèles ou à une surface appartenant au workflow de parité. Pour les correctifs normaux de canal, de configuration, de documentation ou de tests unitaires, traitez-le comme un signal facultatif et suivez plutôt les preuves CI/contrôles à périmètre défini.
Ne placez pas le chemin de landing de PR derrière `Parity gate` sauf si le changement touche réellement le runtime QA, la parité des packs de modèles ou une surface détenue par le workflow de parité. Pour les corrections normales de canal, de configuration, de documentation ou de tests unitaires, traitez-le comme un signal facultatif et suivez plutôt les preuves CI/vérifications à portée limitée.
## CodeQL
Le workflow `CodeQL` est intentionnellement un analyseur de sécurité étroit de premier passage, et non un balayage complet du dépôt. Les exécutions quotidiennes, manuelles et de garde sur pull requests non brouillons analysent le code des workflows Actions ainsi que les surfaces JavaScript/TypeScript les plus risquées, avec des requêtes de sécurité à haute confiance filtrées sur `security-severity` élevée/critique.
Le workflow `CodeQL` est volontairement un analyseur de sécurité de premier passage étroit, et non un balayage complet du dépôt. Les exécutions quotidiennes, manuelles et de garde des pull requests non brouillon analysent le code des workflows Actions ainsi que les surfaces JavaScript/TypeScript les plus à risque, avec des requêtes de sécurité à haute confiance filtrées sur les `security-severity` élevées/critiques.
La garde des pull requests reste légère : elle démarre uniquement pour les changements sous `.github/actions`, `.github/codeql`, `.github/workflows`, `packages` ou `src`, et exécute la même matrice de sécurité à haute confiance que le workflow planifié. Android et macOS CodeQL restent exclus des valeurs par défaut des PR.
La garde des pull requests reste légère : elle ne démarre que pour les changements sous `.github/actions`, `.github/codeql`, `.github/workflows`, `packages` ou `src`, et elle exécute la même matrice de sécurité à haute confiance que le workflow planifié. CodeQL Android et macOS restent exclus des valeurs par défaut des PR.
### Catégories de sécurité
| Catégorie | Surface |
| ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-security-high/core-auth-secrets` | Authentification, secrets, sandbox, Cron et référence du Gateway |
| `/codeql-security-high/channel-runtime-boundary` | Contrats dimplémentation du canal principal, plus runtime de plugin de canal, Gateway, SDK Plugin, secrets et points de contact daudit |
| `/codeql-security-high/network-ssrf-boundary` | Surfaces SSRF principales, analyse IP, garde réseau, web-fetch et politique SSRF du SDK Plugin |
| `/codeql-security-high/mcp-process-tool-boundary` | Serveurs MCP, helpers dexécution de processus, livraison sortante et portes dexécution doutils agent |
| `/codeql-security-high/plugin-trust-boundary` | Installation de Plugin, chargeur, manifeste, registre, préparation des dépendances runtime, chargement des sources et surfaces de confiance du contrat de package du SDK Plugin |
| `/codeql-security-high/core-auth-secrets` | Authentification, secrets, sandbox, cron et base de référence du Gateway |
| `/codeql-security-high/channel-runtime-boundary` | Contrats dimplémentation des canaux cœur, plus le runtime de Plugin de canal, le Gateway, le SDK Plugin, les secrets et les points de contact daudit |
| `/codeql-security-high/network-ssrf-boundary` | Surfaces SSRF cœur, analyse IP, garde réseau, récupération web et politique SSRF du SDK Plugin |
| `/codeql-security-high/mcp-process-tool-boundary` | Serveurs MCP, assistants dexécution de processus, livraison sortante et portes dexécution doutils agent |
| `/codeql-security-high/plugin-trust-boundary` | Surfaces de confiance de linstallation de Plugin, du chargeur, du manifeste, du registre, de la mise en attente des dépendances runtime, du chargement de source et du contrat de package du SDK Plugin |
### Fragments de sécurité spécifiques à la plateforme
### Shards de sécurité propres aux plateformes
- `CodeQL Android Critical Security`fragment de sécurité Android planifié. Construit manuellement lapplication Android pour CodeQL sur le plus petit runner Blacksmith Linux accepté par la vérification de cohérence du workflow. Téléverse sous `/codeql-critical-security/android`.
- `CodeQL macOS Critical Security`fragment de sécurité macOS hebdomadaire/manuel. Construit manuellement lapplication macOS pour CodeQL sur Blacksmith macOS, filtre les résultats de build de dépendances hors du SARIF téléversé et téléverse sous `/codeql-critical-security/macos`. Conservé hors des valeurs quotidiennes par défaut, car le build macOS domine la durée dexécution même lorsquil est propre.
- `CodeQL Android Critical Security`shard de sécurité Android planifié. Construit manuellement lapplication Android pour CodeQL sur le plus petit runner Blacksmith Linux accepté par la vérification de cohérence du workflow. Téléverse sous `/codeql-critical-security/android`.
- `CodeQL macOS Critical Security`shard de sécurité macOS hebdomadaire/manuel. Construit manuellement lapplication macOS pour CodeQL sur Blacksmith macOS, filtre les résultats de build de dépendances hors du SARIF téléversé, et téléverse sous `/codeql-critical-security/macos`. Conservé hors des valeurs par défaut quotidiennes parce que le build macOS domine le temps dexécution même lorsquil est propre.
### Catégories de qualité critiques
### Catégories de qualité critique
`CodeQL Critical Quality` est le fragment non lié à la sécurité correspondant. Il exécute uniquement des requêtes de qualité JavaScript/TypeScript de sévérité erreur et non liées à la sécurité sur des surfaces étroites à forte valeur, sur le plus petit runner Blacksmith Linux. Sa garde de pull request est intentionnellement plus réduite que le profil planifié : les PR non brouillons exécutent uniquement les fragments correspondants `agent-runtime-boundary`, `config-boundary`, `core-auth-secrets`, `channel-runtime-boundary`, `gateway-runtime-boundary`, `memory-runtime-boundary`, `mcp-process-runtime-boundary`, `provider-runtime-boundary`, `session-diagnostics-boundary`, `plugin-boundary`, `plugin-sdk-package-contract` et `plugin-sdk-reply-runtime` pour les changements de code dexécution des commandes/modèles/outils dagent et de dispatch de réponses, de code de schéma/migration/E/S de configuration, de code auth/secrets/sandbox/sécurité, de runtime des canaux principaux et des plugins de canaux groupés, de protocole Gateway/méthode serveur, de runtime mémoire/liaison SDK, de MCP/processus/livraison sortante, de runtime fournisseur/catalogue de modèles, de diagnostics de session/files de livraison, de chargeur de plugin, de SDK Plugin/contrat de package ou de runtime de réponse du SDK Plugin. Les changements de configuration CodeQL et de workflow qualité exécutent les douze fragments de qualité PR.
`CodeQL Critical Quality` est le shard non lié à la sécurité correspondant. Il exécute uniquement des requêtes de qualité JavaScript/TypeScript de sévérité erreur et non liées à la sécurité sur des surfaces étroites à forte valeur, sur le plus petit runner Blacksmith Linux. Sa garde de pull request est volontairement plus petite que le profil planifié : les PR non brouillon nexécutent que les shards correspondants `agent-runtime-boundary`, `config-boundary`, `core-auth-secrets`, `channel-runtime-boundary`, `gateway-runtime-boundary`, `memory-runtime-boundary`, `mcp-process-runtime-boundary`, `provider-runtime-boundary`, `session-diagnostics-boundary`, `plugin-boundary`, `plugin-sdk-package-contract` et `plugin-sdk-reply-runtime` pour les changements concernant lexécution de commandes/modèles/outils agent et le code de dispatch des réponses, le schéma/la migration/les E/S de configuration, le code dauthentification/secrets/sandbox/sécurité, le runtime des canaux cœur et des Plugins de canaux groupés, le protocole/la méthode serveur du Gateway, la colle runtime/SDK de mémoire, MCP/processus/livraison sortante, le runtime fournisseur/catalogue de modèles, les diagnostics de session/files de livraison, le chargeur de Plugin, le contrat SDK Plugin/package, ou le runtime de réponse du SDK Plugin. Les changements de configuration CodeQL et de workflow qualité exécutent les douze shards qualité de PR.
Le dispatch manuel accepte :
@ -350,40 +350,40 @@ Le dispatch manuel accepte :
profile=all|agent-runtime-boundary|config-boundary|core-auth-secrets|channel-runtime-boundary|gateway-runtime-boundary|memory-runtime-boundary|mcp-process-runtime-boundary|plugin-boundary|plugin-sdk-package-contract|plugin-sdk-reply-runtime|provider-runtime-boundary|session-diagnostics-boundary
```
Les profils étroits sont des points dentrée dapprentissage et ditération pour exécuter un fragment de qualité isolément.
Les profils étroits sont des points dentrée dapprentissage/itération pour exécuter un shard qualité isolément.
| Catégorie | Surface |
| ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-critical-quality/core-auth-secrets` | Code de frontière de sécurité pour lauthentification, les secrets, le sandbox, Cron et le Gateway |
| `/codeql-critical-quality/config-boundary` | Schéma de configuration, migration, normalisation et contrats dE/S |
| `/codeql-critical-quality/gateway-runtime-boundary` | Schémas du protocole Gateway et contrats des méthodes serveur |
| `/codeql-critical-quality/channel-runtime-boundary` | Contrats dimplémentation du canal principal et du plugin de canal groupé |
| `/codeql-critical-quality/agent-runtime-boundary` | Exécution des commandes, dispatch des modèles/fournisseurs, dispatch et files de réponse automatique, et contrats dexécution du plan de contrôle ACP |
| `/codeql-critical-quality/mcp-process-runtime-boundary` | Serveurs MCP et ponts doutils, assistants de supervision de processus, et contrats de livraison sortante |
| `/codeql-critical-quality/memory-runtime-boundary` | SDK de lhôte mémoire, façades dexécution mémoire, alias mémoire du Plugin SDK, logique dactivation de lexécution mémoire, et commandes doctor de mémoire |
| `/codeql-critical-quality/session-diagnostics-boundary` | Internes de la file de réponses, files de livraison de session, assistants de liaison/livraison de session sortante, surfaces de bundle dévénements/journaux de diagnostic, et contrats CLI doctor de session |
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | Dispatch des réponses entrantes du Plugin SDK, assistants de charge utile/découpage/exécution des réponses, options de réponse de canal, files de livraison, et assistants de liaison session/fil |
| `/codeql-critical-quality/provider-runtime-boundary` | Normalisation du catalogue de modèles, authentification et découverte des fournisseurs, enregistrement de lexécution des fournisseurs, valeurs par défaut/catalogues des fournisseurs, et registres web/recherche/récupération/embedding |
| `/codeql-critical-quality/ui-control-plane` | Amorçage de linterface de contrôle, persistance locale, flux de contrôle du Gateway, et contrats dexécution du plan de contrôle des tâches |
| `/codeql-critical-quality/web-media-runtime-boundary` | Contrats dexécution pour la récupération/recherche web principale, les E/S média, la compréhension média, la génération dimages et la génération de médias |
| `/codeql-critical-quality/plugin-boundary` | Contrats du chargeur, du registre, de la surface publique et des points dentrée du Plugin SDK |
| `/codeql-critical-quality/plugin-sdk-package-contract` | Source du Plugin SDK côté package publié et assistants de contrat de package de plugin |
| Catégorie | Surface |
| ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/codeql-critical-quality/core-auth-secrets` | Code de limite de sécurité pour lauthentification, les secrets, le bac à sable, Cron et le Gateway |
| `/codeql-critical-quality/config-boundary` | Schéma de configuration, migration, normalisation et contrats dE/S |
| `/codeql-critical-quality/gateway-runtime-boundary` | Schémas du protocole Gateway et contrats de méthodes serveur |
| `/codeql-critical-quality/channel-runtime-boundary` | Contrats dimplémentation du canal central et des Plugins de canal intégrés |
| `/codeql-critical-quality/agent-runtime-boundary` | Exécution des commandes, dispatch des modèles/fournisseurs, dispatch et files dattente des réponses automatiques, et contrats dexécution du plan de contrôle ACP |
| `/codeql-critical-quality/mcp-process-runtime-boundary` | Serveurs MCP et ponts doutils, assistants de supervision de processus et contrats de livraison sortante |
| `/codeql-critical-quality/memory-runtime-boundary` | SDK hôte de mémoire, façades dexécution de mémoire, alias du SDK de Plugin mémoire, liaison dactivation de lexécution mémoire et commandes doctor de mémoire |
| `/codeql-critical-quality/session-diagnostics-boundary` | Internes de file de réponses, files de livraison de session, assistants de liaison/livraison de session sortante, surfaces dévénements diagnostiques/de bundles de journaux, et contrats CLI doctor de session |
| `/codeql-critical-quality/plugin-sdk-reply-runtime` | Dispatch des réponses entrantes du SDK de Plugin, assistants de charge utile/segmentation/exécution des réponses, options de réponse de canal, files de livraison et assistants de liaison session/fil |
| `/codeql-critical-quality/provider-runtime-boundary` | Normalisation du catalogue de modèles, authentification et découverte des fournisseurs, enregistrement de lexécution des fournisseurs, valeurs par défaut/catalogues des fournisseurs, et registres web/recherche/récupération/embeddings |
| `/codeql-critical-quality/ui-control-plane` | Amorçage de linterface de contrôle, persistance locale, flux de contrôle du Gateway et contrats dexécution du plan de contrôle des tâches |
| `/codeql-critical-quality/web-media-runtime-boundary` | Contrats dexécution pour la récupération/recherche web centrale, les E/S média, la compréhension des médias, la génération dimages et la génération de médias |
| `/codeql-critical-quality/plugin-boundary` | Contrats du chargeur, du registre, de la surface publique et des points dentrée du SDK de Plugin |
| `/codeql-critical-quality/plugin-sdk-package-contract` | Source du SDK de Plugin côté package publié et assistants de contrat de package de Plugin |
La qualité reste séparée de la sécurité afin que les constats de qualité puissent être planifiés, mesurés, désactivés ou étendus sans masquer le signal de sécurité. Lextension CodeQL pour Swift, Python et les plugins groupés ne doit être réintroduite sous forme de travail de suivi ciblé ou fragmenté quune fois que les profils restreints disposent dune exécution et dun signal stables.
La qualité reste séparée de la sécurité afin que les constats de qualité puissent être planifiés, mesurés, désactivés ou étendus sans masquer le signal de sécurité. Lextension CodeQL à Swift, Python et aux Plugins intégrés ne doit être réintégrée sous forme de travail de suivi limité ou partitionné quune fois que les profils étroits disposent dune exécution et dun signal stables.
## Workflows de maintenance
### Docs Agent
Le workflow `Docs Agent` est une voie de maintenance Codex pilotée par les événements pour garder la documentation existante alignée sur les changements récemment intégrés. Il na pas de planification pure : une exécution CI réussie issue dun push non-bot sur `main` peut le déclencher, et un déclenchement manuel peut lexécuter directement. Les invocations par workflow-run sont ignorées lorsque `main` a avancé ou lorsquune autre exécution non ignorée de Docs Agent a été créée au cours de la dernière heure. Lorsquil sexécute, il examine la plage de commits allant du précédent SHA source non ignoré de Docs Agent jusquau `main` actuel, de sorte quune exécution horaire peut couvrir tous les changements de main accumulés depuis la dernière passe de documentation.
Le workflow `Docs Agent` est une voie de maintenance Codex pilotée par événements pour maintenir les docs existantes alignées avec les changements récemment intégrés. Il na pas de planification pure : une exécution CI réussie déclenchée par un push non-bot sur `main` peut le lancer, et un dispatch manuel peut lexécuter directement. Les invocations par workflow-run sont ignorées lorsque `main` a avancé ou lorsquune autre exécution Docs Agent non ignorée a été créée dans la dernière heure. Lorsquil sexécute, il examine la plage de commits allant du SHA source du précédent Docs Agent non ignoré jusquau `main` actuel, de sorte quune exécution horaire peut couvrir tous les changements de main accumulés depuis le dernier passage docs.
### Test Performance Agent
Le workflow `Test Performance Agent` est une voie de maintenance Codex pilotée par les événements pour les tests lents. Il na pas de planification pure : une exécution CI réussie issue dun push non-bot sur `main` peut le déclencher, mais il sinterrompt si une autre invocation par workflow-run a déjà été exécutée ou est en cours ce jour UTC. Le déclenchement manuel contourne cette barrière dactivité quotidienne. La voie construit un rapport de performance Vitest groupé pour toute la suite, autorise Codex à napporter que de petites corrections de performance de tests préservant la couverture au lieu de larges refactorisations, puis réexécute le rapport de toute la suite et rejette les changements qui réduisent le nombre de tests de référence réussis. Si la référence contient des tests en échec, Codex ne peut corriger que les échecs évidents et le rapport de toute la suite après lagent doit réussir avant que quoi que ce soit soit committé. Lorsque `main` avance avant que le push du bot natterrisse, la voie rebase le correctif validé, réexécute `pnpm check:changed`, puis retente le push ; les correctifs obsolètes en conflit sont ignorés. Elle utilise Ubuntu hébergé par GitHub afin que laction Codex puisse conserver la même posture de sécurité sans sudo que lagent de documentation.
Le workflow `Test Performance Agent` est une voie de maintenance Codex pilotée par événements pour les tests lents. Il na pas de planification pure : une exécution CI réussie déclenchée par un push non-bot sur `main` peut le lancer, mais il sinterrompt si une autre invocation par workflow-run a déjà été exécutée ou est en cours ce jour UTC. Le dispatch manuel contourne cette barrière dactivité quotidienne. Cette voie construit un rapport de performance Vitest groupé sur la suite complète, permet à Codex de neffectuer que de petites corrections de performance de tests qui préservent la couverture au lieu de vastes refactorisations, puis relance le rapport sur la suite complète et rejette les changements qui réduisent le nombre de tests réussis dans la référence. Si la référence comporte des tests en échec, Codex ne peut corriger que les échecs évidents et le rapport de suite complète après agent doit réussir avant tout commit. Lorsque `main` avance avant que le push du bot natterrisse, la voie rebase le patch validé, relance `pnpm check:changed` et réessaie le push ; les patchs obsolètes en conflit sont ignorés. Elle utilise Ubuntu hébergé par GitHub afin que laction Codex puisse conserver la même posture de sécurité sans sudo que lagent docs.
### PR dupliquées après merge
### PRs dupliquées après fusion
Le workflow `Duplicate PRs After Merge` est un workflow mainteneur manuel pour le nettoyage des doublons après intégration. Il est en simulation par défaut et ne ferme que les PR explicitement listées lorsque `apply=true`. Avant de modifier GitHub, il vérifie que la PR intégrée est fusionnée et que chaque doublon possède soit une issue référencée en commun, soit des hunks modifiés qui se chevauchent.
Le workflow `Duplicate PRs After Merge` est un workflow mainteneur manuel destiné au nettoyage des doublons après intégration. Il utilise le mode simulation par défaut et ne ferme que les PRs explicitement listées lorsque `apply=true`. Avant de modifier GitHub, il vérifie que la PR intégrée est fusionnée et que chaque doublon possède soit une issue référencée commune, soit des hunks modifiés qui se chevauchent.
```bash
gh workflow run duplicate-after-merge.yml \
@ -394,25 +394,25 @@ gh workflow run duplicate-after-merge.yml \
## Portes de vérification locales et routage des changements
La logique locale des voies modifiées se trouve dans `scripts/changed-lanes.mjs` et est exécutée par `scripts/check-changed.mjs`. Cette porte de vérification locale est plus stricte sur les frontières darchitecture que le périmètre large de la plateforme CI :
La logique locale des voies de changements se trouve dans `scripts/changed-lanes.mjs` et est exécutée par `scripts/check-changed.mjs`. Cette porte de vérification locale est plus stricte sur les limites darchitecture que le périmètre large de la plateforme CI :
- les changements de production du cœur exécutent la vérification de types prod du cœur et tests du cœur, plus le lint/les gardes du cœur ;
- les changements concernant uniquement les tests du cœur exécutent seulement la vérification de types des tests du cœur plus le lint du cœur ;
- les changements de production des plugins exécutent la vérification de types prod des plugins et tests des plugins, plus le lint des plugins ;
- les changements concernant uniquement les tests des plugins exécutent la vérification de types des tests des plugins plus le lint des plugins ;
- les changements du Plugin SDK public ou du contrat de plugin sétendent à la vérification de types des plugins parce que les plugins dépendent de ces contrats du cœur (les balayages dextensions Vitest restent un travail de test explicite) ;
- les augmentations de version limitées aux métadonnées de release exécutent des vérifications ciblées de version/configuration/dépendances racine ;
- les changements racine/configuration inconnus échouent prudemment vers toutes les voies de vérification.
- les changements de production du cœur exécutent le typecheck de production du cœur et des tests du cœur, ainsi que le lint/les gardes du cœur ;
- les changements limités aux tests du cœur nexécutent que le typecheck des tests du cœur et le lint du cœur ;
- les changements de production dextension exécutent le typecheck de production et de test des extensions, ainsi que le lint des extensions ;
- les changements limités aux tests dextension exécutent le typecheck des tests dextension et le lint des extensions ;
- les changements publics du SDK de Plugin ou des contrats de Plugin sétendent au typecheck des extensions, car les extensions dépendent de ces contrats du cœur (les balayages Vitest dextensions restent un travail de test explicite) ;
- les incréments de version limités aux métadonnées de release exécutent des vérifications ciblées de version/configuration/dépendances racine ;
- les changements racine/config inconnus échouent prudemment vers toutes les voies de vérification.
Le routage local des tests modifiés se trouve dans `scripts/test-projects.test-support.mjs` et est intentionnellement moins coûteux que `check:changed` : les modifications directes de tests sexécutent elles-mêmes, les modifications de source privilégient les correspondances explicites, puis les tests frères et les dépendants du graphe dimport. La configuration partagée de livraison group-room fait partie des correspondances explicites : les changements apportés à la configuration des réponses visibles de groupe, au mode de livraison des réponses source ou au prompt système de loutil de message passent par les tests de réponse du cœur, plus les régressions de livraison Discord et Slack, afin quun changement de valeur par défaut partagée échoue avant le premier push de PR. Utilisez `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` uniquement lorsque le changement est suffisamment global au harnais pour que lensemble mappé peu coûteux ne soit pas un proxy fiable.
Le routage local des tests modifiés se trouve dans `scripts/test-projects.test-support.mjs` et est volontairement moins coûteux que `check:changed` : les modifications directes de tests exécutent ces tests eux-mêmes, les modifications de source privilégient les mappings explicites, puis les tests voisins et les dépendants du graphe dimport. La configuration partagée de livraison de salle de groupe fait partie des mappings explicites : les changements apportés à la configuration de réponse visible du groupe, au mode de livraison des réponses source ou au prompt système de loutil de messages passent par les tests de réponse du cœur ainsi que par les régressions de livraison Discord et Slack, afin quun changement de valeur par défaut partagée échoue avant le premier push de PR. Utilisez `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` uniquement lorsque le changement touche assez largement le harnais pour que lensemble mappé peu coûteux ne soit pas un proxy fiable.
## Validation Testbox
Exécutez Testbox depuis la racine du dépôt et privilégiez une boîte fraîche préchauffée pour les preuves larges. Avant de consacrer une porte lente à une boîte réutilisée, expirée ou qui vient de signaler une synchronisation inhabituellement volumineuse, exécutez dabord `pnpm testbox:sanity` dans la boîte.
Exécutez Testbox depuis la racine du dépôt et privilégiez une box fraîche préchauffée pour les preuves larges. Avant de consacrer une porte lente à une box réutilisée, expirée ou venant de signaler une synchronisation anormalement volumineuse, exécutez dabord `pnpm testbox:sanity` dans la box.
La vérification de cohérence échoue rapidement lorsque des fichiers racine requis comme `pnpm-lock.yaml` ont disparu ou lorsque `git status --short` affiche au moins 200 suppressions suivies. Cela signifie généralement que létat de synchronisation distant nest pas une copie fiable de la PR ; arrêtez cette boîte et préchauffez-en une nouvelle au lieu de déboguer léchec du test produit. Pour les PR avec suppressions massives intentionnelles, définissez `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` pour cette exécution de cohérence.
La vérification de sanité échoue rapidement lorsque des fichiers racine requis comme `pnpm-lock.yaml` ont disparu ou lorsque `git status --short` affiche au moins 200 suppressions suivies. Cela signifie généralement que létat de synchronisation distant nest pas une copie fiable de la PR ; arrêtez cette box et préchauffez-en une nouvelle au lieu de déboguer léchec du test produit. Pour les PRs comportant intentionnellement de nombreuses suppressions, définissez `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` pour cette exécution de sanité.
`pnpm testbox:run` termine également une invocation locale du CLI Blacksmith qui reste en phase de synchronisation plus de cinq minutes sans sortie post-synchronisation. Définissez `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` pour désactiver cette garde, ou utilisez une valeur plus grande en millisecondes pour des diffs locaux inhabituellement volumineux.
`pnpm testbox:run` termine également une invocation locale de la CLI Blacksmith qui reste en phase de synchronisation pendant plus de cinq minutes sans sortie post-synchronisation. Définissez `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` pour désactiver cette garde, ou utilisez une valeur en millisecondes plus élevée pour des diffs locaux exceptionnellement volumineux.
## Connexe

View File

@ -1,48 +1,49 @@
---
read_when:
- Vous avez besoin dune procédure pas à pas exacte de la boucle dagent ou des événements de cycle de vie
- Vous modifiez la mise en file dattente des sessions, les écritures de transcription ou le comportement du verrou décriture de session
summary: Cycle de vie de la boucle de lagent, flux et sémantique dattente
title: Boucle de lagent
- Vous avez besoin dune procédure pas à pas exacte de la boucle de lagent ou des événements du cycle de vie
- Vous modifiez la mise en file dattente des sessions, les écritures dans la transcription ou le comportement du verrou décriture de session
summary: Cycle de vie de la boucle dagent, flux et sémantique dattente
title: Boucle dagent
x-i18n:
generated_at: "2026-04-30T07:20:37Z"
generated_at: "2026-04-30T18:38:49Z"
model: gpt-5.5
provider: openai
source_hash: 902d543bd71dd517a810d825cbe92e244fe89230f47eeada72477c657a2bec32
source_hash: 5466893253e1f82482284ff82db56f4c3fca018bf12e4114fad76d37cad954df
source_path: concepts/agent-loop.md
workflow: 16
---
Une boucle agentique est lexécution complète et « réelle » dun agent : réception → assemblage du contexte → inférence du modèle →
Une boucle agentique est lexécution « réelle » complète dun agent : réception → assemblage du contexte → inférence du modèle →
exécution doutils → réponses en streaming → persistance. Cest le chemin faisant autorité qui transforme un message
en actions et en réponse finale, tout en maintenant létat de session cohérent.
en actions et en réponse finale, tout en conservant un état de session cohérent.
Dans OpenClaw, une boucle est une exécution unique, sérialisée par session, qui émet des événements de cycle de vie et de flux
pendant que le modèle réfléchit, appelle des outils et diffuse la sortie. Ce document explique comment cette boucle authentique est
Dans OpenClaw, une boucle est une exécution unique et sérialisée par session, qui émet des événements de cycle de vie et de flux
pendant que le modèle raisonne, appelle des outils et diffuse la sortie. Ce document explique comment cette boucle authentique est
câblée de bout en bout.
## Points dentrée
- RPC du Gateway : `agent` et `agent.wait`.
- RPC Gateway : `agent` et `agent.wait`.
- CLI : commande `agent`.
## Fonctionnement (vue densemble)
1. Le RPC `agent` valide les paramètres, résout la session (sessionKey/sessionId), persiste les métadonnées de session, puis renvoie immédiatement `{ runId, acceptedAt }`.
1. Le RPC `agent` valide les paramètres, résout la session (sessionKey/sessionId), persiste les métadonnées de session, renvoie immédiatement `{ runId, acceptedAt }`.
2. `agentCommand` exécute lagent :
- résout les valeurs par défaut du modèle + thinking/verbose/trace
- charge linstantané des Skills
- résout le modèle et les valeurs par défaut de réflexion/verbosité/trace
- charge linstantané Skills
- appelle `runEmbeddedPiAgent` (runtime pi-agent-core)
- émet **lifecycle end/error** si la boucle intégrée nen émet pas
- émet **lifecycle end/error** si la boucle embarquée nen émet pas
3. `runEmbeddedPiAgent` :
- sérialise les exécutions via des files dattente par session + globales
- résout le modèle + le profil dauthentification et construit la session Pi
- sabonne aux événements Pi et diffuse les deltas assistant/outil
- applique le délai dexpiration -> abandonne lexécution sil est dépassé
- renvoie les payloads + les métadonnées dutilisation
4. `subscribeEmbeddedPiSession` relie les événements pi-agent-core au flux `agent` dOpenClaw :
- sérialise les exécutions via des files par session et globales
- résout le modèle et le profil dauthentification, puis construit la session pi
- sabonne aux événements pi et diffuse les deltas assistant/outil
- applique le délai dexpiration -> interrompt lexécution sil est dépassé
- pour les tours app-server Codex, interrompt un tour accepté qui cesse de produire une progression app-server avant un événement terminal
- renvoie les payloads et les métadonnées dutilisation
4. `subscribeEmbeddedPiSession` fait le pont entre les événements pi-agent-core et le flux `agent` dOpenClaw :
- événements doutil => `stream: "tool"`
- deltas dassistant => `stream: "assistant"`
- deltas assistant => `stream: "assistant"`
- événements de cycle de vie => `stream: "lifecycle"` (`phase: "start" | "end" | "error"`)
5. `agent.wait` utilise `waitForAgentRun` :
- attend **lifecycle end/error** pour `runId`
@ -53,137 +54,138 @@ câblée de bout en bout.
- Les exécutions sont sérialisées par clé de session (voie de session) et éventuellement via une voie globale.
- Cela évite les courses entre outils/sessions et maintient lhistorique de session cohérent.
- Les canaux de messagerie peuvent choisir des modes de file dattente (collect/steer/followup) qui alimentent ce système de voies.
Voir [File dattente des commandes](/fr/concepts/queue).
Voir [File de commandes](/fr/concepts/queue).
- Les écritures de transcript sont également protégées par un verrou décriture de session sur le fichier de session. Le verrou est
conscient des processus et basé sur un fichier ; il détecte donc les rédacteurs qui contournent la file en processus ou proviennent
conscient des processus et basé sur les fichiers, ce qui lui permet de détecter les rédacteurs qui contournent la file en processus ou proviennent
dun autre processus.
- Les verrous décriture de session ne sont pas réentrants par défaut. Si un assistant imbrique intentionnellement lacquisition du
- Par défaut, les verrous décriture de session ne sont pas réentrants. Si un assistant imbrique intentionnellement lacquisition du
même verrou tout en préservant un seul rédacteur logique, il doit lactiver explicitement avec
`allowReentrant: true`.
## Préparation de la session + de lespace de travail
- Lespace de travail est résolu et créé ; les exécutions en bac à sable peuvent être redirigées vers une racine despace de travail de bac à sable.
- Les Skills sont chargés (ou réutilisés depuis un instantané) et injectés dans lenvironnement et le prompt.
- Les fichiers de bootstrap/contexte sont résolus et injectés dans le rapport du prompt système.
- Un verrou décriture de session est acquis ; `SessionManager` est ouvert et préparé avant le streaming. Tout chemin ultérieur de
réécriture, Compaction ou troncature du transcript doit prendre le même verrou avant douvrir ou de modifier le fichier de transcript.
- Les Skills sont chargées (ou réutilisées depuis un instantané) et injectées dans lenvironnement et le prompt.
- Les fichiers de bootstrap/contexte sont résolus et injectés dans le rapport de prompt système.
- Un verrou décriture de session est acquis ; `SessionManager` est ouvert et préparé avant le streaming. Tout
chemin ultérieur de réécriture, de Compaction ou de troncature du transcript doit prendre le même verrou avant douvrir ou
de modifier le fichier de transcript.
## Assemblage du prompt + prompt système
- Le prompt système est construit à partir du prompt de base dOpenClaw, du prompt des Skills, du contexte de bootstrap et des substitutions par exécution.
- Le prompt système est construit à partir du prompt de base dOpenClaw, du prompt Skills, du contexte de bootstrap et des remplacements par exécution.
- Les limites propres au modèle et les jetons de réserve de Compaction sont appliqués.
- Voir [Prompt système](/fr/concepts/system-prompt) pour ce que voit le modèle.
## Points de hook (où intercepter)
## Points de hook (où vous pouvez intercepter)
OpenClaw dispose de deux systèmes de hooks :
- **Hooks internes** (hooks Gateway) : scripts pilotés par événements pour les commandes et événements de cycle de vie.
- **Hooks de Plugin** : points dextension dans le cycle de vie agent/outil et le pipeline du Gateway.
- **Hooks internes** (hooks Gateway) : scripts pilotés par événements pour les commandes et les événements de cycle de vie.
- **Hooks Plugin** : points dextension dans le cycle de vie agent/outil et le pipeline Gateway.
### Hooks internes (hooks Gateway)
- **`agent:bootstrap`** : sexécute pendant la construction des fichiers de bootstrap, avant la finalisation du prompt système.
Utilisez-le pour ajouter/supprimer des fichiers de contexte de bootstrap.
- **Hooks de commande** : `/new`, `/reset`, `/stop` et autres événements de commande (voir le document Hooks).
- **Hooks de commande** : `/new`, `/reset`, `/stop` et autres événements de commande (voir la documentation Hooks).
Voir [Hooks](/fr/automation/hooks) pour la configuration et des exemples.
Voir [Hooks](/fr/automation/hooks) pour la configuration et les exemples.
### Hooks de Plugin (cycle de vie agent + Gateway)
### Hooks Plugin (cycle de vie agent + Gateway)
Ceux-ci sexécutent dans la boucle agent ou le pipeline du Gateway :
Ils sexécutent dans la boucle de lagent ou le pipeline Gateway :
- **`before_model_resolve`** : sexécute avant la session (sans `messages`) pour remplacer de manière déterministe le fournisseur/modèle avant la résolution du modèle.
- **`before_prompt_build`** : sexécute après le chargement de la session (avec `messages`) pour injecter `prependContext`, `systemPrompt`, `prependSystemContext` ou `appendSystemContext` avant lenvoi du prompt. Utilisez `prependContext` pour du texte dynamique par tour et les champs de contexte système pour des directives stables qui doivent résider dans lespace du prompt système.
- **`before_agent_start`** : hook de compatibilité hérité qui peut sexécuter dans lune ou lautre phase ; privilégiez les hooks explicites ci-dessus.
- **`before_agent_reply`** : sexécute après les actions en ligne et avant lappel LLM, ce qui permet à un Plugin de revendiquer le tour et de renvoyer une réponse synthétique ou de réduire entièrement le tour au silence.
- **`agent_end`** : inspecte la liste finale des messages et les métadonnées dexécution après la fin.
- **`before_prompt_build`** : sexécute après le chargement de la session (avec `messages`) pour injecter `prependContext`, `systemPrompt`, `prependSystemContext` ou `appendSystemContext` avant lenvoi du prompt. Utilisez `prependContext` pour le texte dynamique par tour et les champs de contexte système pour les directives stables qui doivent résider dans lespace du prompt système.
- **`before_agent_start`** : hook de compatibilité hérité qui peut sexécuter dans lune ou lautre phase ; préférez les hooks explicites ci-dessus.
- **`before_agent_reply`** : sexécute après les actions en ligne et avant lappel au LLM, ce qui permet à un plugin de prendre en charge le tour et de renvoyer une réponse synthétique ou de réduire entièrement le tour au silence.
- **`agent_end`** : inspecte la liste finale des messages et les métadonnées dexécution après lachèvement.
- **`before_compaction` / `after_compaction`** : observe ou annote les cycles de Compaction.
- **`before_tool_call` / `after_tool_call`** : intercepte les paramètres/résultats doutil.
- **`before_install`** : inspecte les résultats danalyse intégrés et bloque éventuellement les installations de Skills ou de Plugin.
- **`before_install`** : inspecte les résultats danalyse intégrés et bloque éventuellement les installations de skill ou de plugin.
- **`tool_result_persist`** : transforme de manière synchrone les résultats doutil avant leur écriture dans un transcript de session appartenant à OpenClaw.
- **`message_received` / `message_sending` / `message_sent`** : hooks de messages entrants + sortants.
- **`session_start` / `session_end`** : limites du cycle de vie de session.
- **`gateway_start` / `gateway_stop`** : événements du cycle de vie du Gateway.
- **`gateway_start` / `gateway_stop`** : événements du cycle de vie Gateway.
Règles de décision des hooks pour les protections sortantes/doutils :
Règles de décision des hooks pour les garde-fous sortants/outils :
- `before_tool_call` : `{ block: true }` est terminal et arrête les gestionnaires de priorité inférieure.
- `before_tool_call` : `{ block: false }` est un no-op et nefface pas un blocage antérieur.
- `before_tool_call` : `{ block: false }` est une absence dopération et nefface pas un blocage antérieur.
- `before_install` : `{ block: true }` est terminal et arrête les gestionnaires de priorité inférieure.
- `before_install` : `{ block: false }` est un no-op et nefface pas un blocage antérieur.
- `before_install` : `{ block: false }` est une absence dopération et nefface pas un blocage antérieur.
- `message_sending` : `{ cancel: true }` est terminal et arrête les gestionnaires de priorité inférieure.
- `message_sending` : `{ cancel: false }` est un no-op et nefface pas une annulation antérieure.
- `message_sending` : `{ cancel: false }` est une absence dopération et nefface pas une annulation antérieure.
Voir [Hooks de Plugin](/fr/plugins/hooks) pour lAPI de hook et les détails denregistrement.
Voir [Hooks Plugin](/fr/plugins/hooks) pour lAPI de hook et les détails denregistrement.
Les harnesses peuvent adapter ces hooks différemment. Le harness app-server Codex conserve
les hooks de Plugin OpenClaw comme contrat de compatibilité pour les surfaces miroir documentées,
tandis que les hooks natifs Codex restent un mécanisme Codex de plus bas niveau séparé.
les hooks Plugin OpenClaw comme contrat de compatibilité pour les surfaces miroirs documentées,
tandis que les hooks natifs Codex restent un mécanisme Codex de niveau inférieur distinct.
## Streaming + réponses partielles
- Les deltas dassistant sont diffusés depuis pi-agent-core et émis comme événements `assistant`.
- Le streaming par blocs peut émettre des réponses partielles sur `text_end` ou `message_end`.
- Le streaming de raisonnement peut être émis comme flux distinct ou comme réponses par blocs.
- Voir [Streaming](/fr/concepts/streaming) pour le comportement de découpage et de réponse par blocs.
- Les deltas assistant sont diffusés depuis pi-agent-core et émis comme événements `assistant`.
- Le streaming par bloc peut émettre des réponses partielles soit sur `text_end`, soit sur `message_end`.
- Le streaming du raisonnement peut être émis comme flux séparé ou comme réponses par bloc.
- Voir [Streaming](/fr/concepts/streaming) pour le découpage en fragments et le comportement des réponses par bloc.
## Exécution doutils + outils de messagerie
- Les événements de début/mise à jour/fin doutil sont émis sur le flux `tool`.
- Les résultats doutil sont assainis pour la taille et les payloads dimage avant journalisation/émission.
- Les envois doutils de messagerie sont suivis afin de supprimer les confirmations dassistant en double.
- Les envois doutils de messagerie sont suivis pour supprimer les confirmations assistant dupliquées.
## Mise en forme des réponses + suppression
- Les payloads finaux sont assemblés à partir de :
- texte de lassistant (et raisonnement facultatif)
- résumés doutils en ligne (quand verbose + autorisé)
- texte derreur de lassistant quand le modèle échoue
- texte assistant (et raisonnement facultatif)
- résumés doutils en ligne (quand verbeux + autorisé)
- texte derreur assistant quand le modèle échoue
- Le jeton silencieux exact `NO_REPLY` / `no_reply` est filtré des payloads
sortants.
- Les doublons doutils de messagerie sont supprimés de la liste finale des payloads.
- Sil ne reste aucun payload affichable et quun outil a échoué, une réponse derreur doutil de secours est émise
- Sil ne reste aucun payload rendable et quun outil a échoué, une réponse de secours derreur doutil est émise
(sauf si un outil de messagerie a déjà envoyé une réponse visible par lutilisateur).
## Compaction + nouvelles tentatives
- La Compaction automatique émet des événements de flux `compaction` et peut déclencher une nouvelle tentative.
- Lors dune nouvelle tentative, les tampons en mémoire et les résumés doutils sont réinitialisés pour éviter les sorties en double.
- Lors de la nouvelle tentative, les tampons en mémoire et les résumés doutils sont réinitialisés pour éviter une sortie dupliquée.
- Voir [Compaction](/fr/concepts/compaction) pour le pipeline de Compaction.
## Flux dévénements (aujourdhui)
- `lifecycle` : émis par `subscribeEmbeddedPiSession` (et en secours par `agentCommand`)
- `lifecycle` : émis par `subscribeEmbeddedPiSession` (et en repli par `agentCommand`)
- `assistant` : deltas diffusés depuis pi-agent-core
- `tool` : événements doutil diffusés depuis pi-agent-core
## Gestion des canaux de chat
- Les deltas dassistant sont mis en tampon dans des messages `delta` de chat.
- Les deltas assistant sont mis en tampon dans des messages de chat `delta`.
- Un `final` de chat est émis sur **lifecycle end/error**.
## Délais dexpiration
- Valeur par défaut de `agent.wait` : 30 s (seulement lattente). Le paramètre `timeoutMs` remplace cette valeur.
- Runtime de lagent : `agents.defaults.timeoutSeconds` vaut par défaut 172800 s (48 heures) ; appliqué dans le minuteur dabandon de `runEmbeddedPiAgent`.
- Runtime Cron : le `timeoutSeconds` isolé du tour dagent appartient à Cron. Le planificateur démarre ce minuteur au début de lexécution, abandonne lexécution sous-jacente à léchéance configurée, puis exécute un nettoyage borné avant denregistrer le délai dexpiration afin quune session enfant obsolète ne puisse pas bloquer la voie.
- Récupération de session bloquée : avec les diagnostics activés, `diagnostics.stuckSessionWarnMs` détecte les longues sessions `processing`. Les exécutions intégrées actives, les opérations de réponse actives et les tâches de voie de session actives restent par défaut limitées à des avertissements ; si les diagnostics ne montrent aucun travail actif pour la session, le watchdog libère la voie de session affectée afin que le travail de démarrage en file dattente puisse sécouler.
- Délai dinactivité du modèle : OpenClaw abandonne une requête de modèle quand aucun fragment de réponse narrive avant la fenêtre dinactivité. `models.providers.<id>.timeoutSeconds` étend ce watchdog dinactivité pour les fournisseurs locaux/auto-hébergés lents ; sinon OpenClaw utilise `agents.defaults.timeoutSeconds` quand il est configuré, plafonné à 120 s par défaut. Les exécutions déclenchées par Cron sans délai de modèle ou dagent explicite désactivent le watchdog dinactivité et sappuient sur le délai externe de Cron.
- Délai dexpiration des requêtes HTTP fournisseur : `models.providers.<id>.timeoutSeconds` sapplique aux fetchs HTTP de modèle de ce fournisseur, y compris la connexion, les en-têtes, le corps, le délai de requête SDK, la gestion totale dabandon de fetch protégé et le watchdog dinactivité du flux du modèle. Utilisez-le pour les fournisseurs locaux/auto-hébergés lents comme Ollama avant daugmenter le délai dexpiration de tout le runtime de lagent.
- Runtime de lagent : valeur par défaut de `agents.defaults.timeoutSeconds` à 172800 s (48 heures) ; appliquée dans le minuteur dinterruption `runEmbeddedPiAgent`.
- Runtime Cron : le `timeoutSeconds` de tour dagent isolé appartient à cron. Le planificateur démarre ce minuteur au début de lexécution, interrompt lexécution sous-jacente à léchéance configurée, puis lance un nettoyage borné avant denregistrer le délai dexpiration afin quune session enfant obsolète ne puisse pas bloquer la voie.
- Récupération de session bloquée : avec les diagnostics activés, `diagnostics.stuckSessionWarnMs` détecte les sessions longues en `processing`. Les exécutions embarquées actives, les opérations de réponse actives et les tâches actives de voie de session restent par défaut limitées aux avertissements ; si les diagnostics nindiquent aucun travail actif pour la session, le watchdog libère la voie de session affectée afin que le travail de démarrage en file puisse sécouler.
- Délai dinactivité du modèle : OpenClaw interrompt une requête de modèle quand aucun fragment de réponse narrive avant la fenêtre dinactivité. `models.providers.<id>.timeoutSeconds` étend ce watchdog dinactivité pour les fournisseurs locaux/auto-hébergés lents ; sinon OpenClaw utilise `agents.defaults.timeoutSeconds` lorsquil est configuré, plafonné par défaut à 120 s. Les exécutions déclenchées par Cron sans délai explicite de modèle ou dagent désactivent le watchdog dinactivité et sappuient sur le délai externe de Cron.
- Délai dexpiration des requêtes HTTP du fournisseur : `models.providers.<id>.timeoutSeconds` sapplique aux fetches HTTP de modèle de ce fournisseur, y compris la connexion, les en-têtes, le corps, le délai dexpiration des requêtes SDK, la gestion totale de linterruption guarded-fetch et le watchdog dinactivité du flux de modèle. Utilisez-le pour les fournisseurs locaux/auto-hébergés lents tels quOllama avant daugmenter le délai dexécution global de lagent.
## Où les choses peuvent se terminer tôt
- Délai dexpiration de lagent (abandon)
- Délai dexpiration de lagent (interruption)
- AbortSignal (annulation)
- Déconnexion du Gateway ou délai dexpiration RPC
- Déconnexion Gateway ou délai dexpiration RPC
- Délai dexpiration de `agent.wait` (attente uniquement, narrête pas lagent)
## Connexe
- [Outils](/fr/tools) — outils dagent disponibles
- [Hooks](/fr/automation/hooks) — scripts pilotés par événements déclenchés par les événements du cycle de vie de lagent
- [Hooks](/fr/automation/hooks) — scripts pilotés par événements déclenchés par les événements de cycle de vie de lagent
- [Compaction](/fr/concepts/compaction) — comment les longues conversations sont résumées
- [Approbations dexécution](/fr/tools/exec-approvals) — portes dapprobation pour les commandes shell
- [Approbations Exec](/fr/tools/exec-approvals) — barrières dapprobation pour les commandes shell
- [Réflexion](/fr/tools/thinking) — configuration du niveau de réflexion/raisonnement

View File

@ -1,19 +1,19 @@
---
read_when:
- Modifier lexécution ou la concurrence des réponses automatiques
- Explication des modes de /queue ou du comportement dorientation des messages
summary: Modes de file dattente de réponse automatique, valeurs par défaut et remplacements par session
- Explication des modes /queue ou du comportement dorientation des messages
summary: Modes de la file dattente de réponse automatique, valeurs par défaut et remplacements par session
title: File dattente des commandes
x-i18n:
generated_at: "2026-04-30T07:23:47Z"
generated_at: "2026-04-30T18:38:41Z"
model: gpt-5.5
provider: openai
source_hash: 2ac0c0ded9558b080714fa4b8be0d552f985911bf19b427020f9654ae4955b2d
source_hash: fbf1bb1ffd4ce06fa138f63e31651b8821226d9c95dd6b93d68326a5fb91fdd0
source_path: concepts/queue.md
workflow: 16
---
Nous sérialisons les exécutions de réponse automatique entrantes (tous les canaux) via une petite file dattente en processus afin déviter les collisions entre plusieurs exécutions dagent, tout en autorisant un parallélisme sûr entre les sessions.
Nous sérialisons les exécutions de réponse automatique entrantes (tous les canaux) via une petite file dattente en processus afin dempêcher plusieurs exécutions dagent dentrer en collision, tout en permettant un parallélisme sûr entre les sessions.
## Pourquoi
@ -22,11 +22,11 @@ Nous sérialisons les exécutions de réponse automatique entrantes (tous les ca
## Fonctionnement
- Une file dattente FIFO consciente des voies vide chaque voie avec une limite de concurrence configurable (1 par défaut pour les voies non configurées ; la voie principale utilise 4 par défaut, les sous-agents 8).
- `runEmbeddedPiAgent` met en file dattente par **clé de session** (voie `session:<key>`) afin de garantir une seule exécution active par session.
- Chaque exécution de session est ensuite placée dans une **voie globale** (`main` par défaut), de sorte que le parallélisme global est limité par `agents.defaults.maxConcurrent`.
- Une file FIFO tenant compte des voies vide chaque voie avec un plafond de concurrence configurable (1 par défaut pour les voies non configurées ; la voie principale vaut 4 par défaut, les sous-agents 8).
- `runEmbeddedPiAgent` met en file par **clé de session** (voie `session:<key>`) afin de garantir une seule exécution active par session.
- Chaque exécution de session est ensuite mise en file dans une **voie globale** (`main` par défaut) afin que le parallélisme global soit plafonné par `agents.defaults.maxConcurrent`.
- Lorsque la journalisation détaillée est activée, les exécutions en file émettent un court avis si elles ont attendu plus denviron 2 s avant de démarrer.
- Les indicateurs de saisie se déclenchent toujours immédiatement lors de la mise en file (lorsque le canal le prend en charge), de sorte que lexpérience utilisateur reste inchangée pendant lattente de notre tour.
- Les indicateurs de saisie se déclenchent toujours immédiatement à la mise en file (lorsque le canal le prend en charge), de sorte que lexpérience utilisateur reste inchangée pendant lattente de notre tour.
## Valeurs par défaut
@ -39,26 +39,26 @@ Lorsquelles ne sont pas définies, toutes les surfaces de canaux entrants uti
`steer` est la valeur par défaut, car elle garde le tour du modèle actif réactif sans
démarrer une seconde exécution de session. Elle vide tous les messages de pilotage arrivés
avant la prochaine limite du modèle. Si lexécution actuelle ne peut pas accepter le pilotage,
OpenClaw revient à une entrée de file de suivi.
avant la prochaine frontière de modèle. Si lexécution actuelle ne peut pas accepter le pilotage,
OpenClaw se replie sur une entrée de file de suivi.
## Modes de file dattente
Les messages entrants peuvent piloter lexécution actuelle, attendre un tour de suivi, ou faire les deux :
- `steer` : met les messages de pilotage en file dans le runtime actif. Pi livre tous les messages de pilotage en attente **après la fin de lexécution des appels doutils du tour actuel de lassistant**, avant le prochain appel LLM ; le serveur dapplication Codex reçoit un `turn/steer` groupé. Si lexécution nest pas en diffusion active ou si le pilotage est indisponible, OpenClaw revient à une entrée de file de suivi.
- `queue` (hérité) : ancien pilotage un par un. Pi livre un message de pilotage en file à chaque limite du modèle ; le serveur dapplication Codex reçoit des requêtes `turn/steer` distinctes. Préférez `steer`, sauf si vous avez besoin du comportement sérialisé précédent.
- `steer` : met en file les messages de pilotage dans le runtime actif. Pi livre tous les messages de pilotage en attente **après que le tour dassistant actuel a fini dexécuter ses appels doutils**, avant le prochain appel LLM ; le serveur dapplication Codex reçoit un `turn/steer` groupé. Si lexécution nest pas en diffusion active ou si le pilotage nest pas disponible, OpenClaw se replie sur une entrée de file de suivi.
- `queue` (hérité) : ancien pilotage un par un. Pi livre un message de pilotage en file à chaque frontière de modèle ; le serveur dapplication Codex reçoit des requêtes `turn/steer` séparées. Préférez `steer`, sauf si vous avez besoin du comportement sérialisé précédent.
- `followup` : met chaque message en file pour un tour dagent ultérieur après la fin de lexécution actuelle.
- `collect` : fusionne les messages en file dans un **seul** tour de suivi après la fenêtre de silence. Si les messages ciblent des canaux/fils différents, ils sont vidés individuellement afin de préserver le routage.
- `collect` : regroupe les messages en file dans un **seul** tour de suivi après la fenêtre de silence. Si les messages ciblent différents canaux/fils, ils sont vidés individuellement afin de préserver le routage.
- `steer-backlog` (alias `steer+backlog`) : pilote maintenant **et** conserve le même message pour un tour de suivi.
- `interrupt` (hérité) : abandonne lexécution active pour cette session, puis exécute le message le plus récent.
Steer-backlog signifie que vous pouvez obtenir une réponse de suivi après lexécution pilotée, donc
Steer-backlog signifie que vous pouvez obtenir une réponse de suivi après lexécution pilotée, de sorte que
les surfaces de diffusion peuvent ressembler à des doublons. Préférez `collect`/`steer` si vous voulez
une réponse par message entrant.
Pour le minutage propre au runtime et le comportement des dépendances, consultez
[File dattente de pilotage](/fr/concepts/queue-steering).
[File de pilotage](/fr/concepts/queue-steering).
Configurez globalement ou par canal via `messages.queue` :
@ -78,21 +78,21 @@ Configurez globalement ou par canal via `messages.queue` :
## Options de file dattente
Les options sappliquent à `followup`, `collect` et `steer-backlog` (ainsi quà `steer` ou à lancien `queue` lorsque le pilotage revient à un suivi) :
Les options sappliquent à `followup`, `collect` et `steer-backlog` (ainsi quà `steer` ou à lancien `queue` lorsque le pilotage se replie sur un suivi) :
- `debounceMs` : fenêtre de silence avant de vider les suivis en file. Les nombres nus sont des millisecondes ; les unités `ms`, `s`, `m`, `h` et `d` sont acceptées par les options `/queue`.
- `debounceMs` : fenêtre de silence avant de vider les suivis en file. Les nombres seuls sont en millisecondes ; les unités `ms`, `s`, `m`, `h` et `d` sont acceptées par les options `/queue`.
- `cap` : nombre maximal de messages en file par session. Les valeurs inférieures à `1` sont ignorées.
- `drop: "summarize"` : valeur par défaut. Supprime les entrées les plus anciennes en file selon les besoins, conserve des résumés compacts et les injecte comme invite de suivi synthétique.
- `drop: "old"` : supprime les entrées les plus anciennes en file selon les besoins, sans conserver de résumés.
- `drop: "summarize"` : valeur par défaut. Supprime les entrées en file les plus anciennes selon les besoins, conserve des résumés compacts et les injecte comme invite de suivi synthétique.
- `drop: "old"` : supprime les entrées en file les plus anciennes selon les besoins, sans conserver de résumés.
- `drop: "new"` : rejette le message le plus récent lorsque la file est déjà pleine.
Valeurs par défaut : `debounceMs: 500`, `cap: 20`, `drop: summarize`.
## Précédence
## Priorité
Pour la sélection du mode, OpenClaw résout :
1. Remplacement `/queue` par session, en ligne ou stocké.
1. Remplacement `/queue` en ligne ou stocké par session.
2. `messages.queue.byChannel.<channel>`.
3. `messages.queue.mode`.
4. Valeur par défaut `steer`.
@ -100,8 +100,8 @@ Pour la sélection du mode, OpenClaw résout :
Pour les options, les options `/queue` en ligne ou stockées lemportent sur la configuration. Ensuite,
le debounce propre au canal (`messages.queue.debounceMsByChannel`), les valeurs par défaut de debounce du Plugin,
les options globales `messages.queue` et les valeurs par défaut intégrées sont
appliqués. `cap` et `drop` sont des options globales/de session, pas des clés
de configuration par canal.
appliqués. `cap` et `drop` sont des options globales/de session, pas des clés de configuration
par canal.
## Remplacements par session
@ -111,20 +111,21 @@ de configuration par canal.
## Portée et garanties
- Sapplique aux exécutions dagents de réponse automatique sur tous les canaux entrants qui utilisent le pipeline de réponse du Gateway (web WhatsApp, Telegram, Slack, Discord, Signal, iMessage, webchat, etc.).
- La voie par défaut (`main`) sapplique à tout le processus pour les messages entrants et les Heartbeat principaux ; définissez `agents.defaults.maxConcurrent` pour autoriser plusieurs sessions en parallèle.
- Des voies supplémentaires peuvent exister (par exemple `cron`, `cron-nested`, `nested`, `subagent`) afin que les tâches en arrière-plan puissent sexécuter en parallèle sans bloquer les réponses entrantes. Les tours dagent Cron isolés occupent un emplacement `cron` pendant que leur exécution dagent interne utilise `cron-nested` ; les deux utilisent `cron.maxConcurrentRuns`. Les flux `nested` non Cron partagés conservent leur propre comportement de voie. Ces exécutions détachées sont suivies comme des [tâches en arrière-plan](/fr/automation/tasks).
- Sapplique aux exécutions dagent de réponse automatique sur tous les canaux entrants qui utilisent le pipeline de réponse du Gateway (WhatsApp web, Telegram, Slack, Discord, Signal, iMessage, webchat, etc.).
- La voie par défaut (`main`) est à léchelle du processus pour les messages entrants et les Heartbeats principaux ; définissez `agents.defaults.maxConcurrent` pour autoriser plusieurs sessions en parallèle.
- Des voies supplémentaires peuvent exister (par exemple `cron`, `cron-nested`, `nested`, `subagent`) afin que les tâches darrière-plan puissent sexécuter en parallèle sans bloquer les réponses entrantes. Les tours dagent Cron isolés occupent un emplacement `cron` pendant que leur exécution dagent interne utilise `cron-nested` ; les deux utilisent `cron.maxConcurrentRuns`. Les flux `nested` partagés non-Cron conservent leur propre comportement de voie. Ces exécutions détachées sont suivies comme [tâches darrière-plan](/fr/automation/tasks).
- Les voies par session garantissent quune seule exécution dagent touche une session donnée à la fois.
- Aucune dépendance externe ni thread de worker en arrière-plan ; TypeScript pur + promesses.
- Aucune dépendance externe ni thread de worker darrière-plan ; TypeScript pur + promesses.
## Dépannage
- Si les commandes semblent bloquées, activez les journaux détaillés et recherchez les lignes « queued for …ms » pour confirmer que la file se vide.
- Si vous avez besoin de la profondeur de file, activez les journaux détaillés et surveillez les lignes de minutage de la file.
- Lorsque les diagnostics sont activés, les sessions qui restent en `processing` au-delà de `diagnostics.stuckSessionWarnMs` journalisent un avertissement de session bloquée. Les exécutions intégrées actives, les opérations de réponse actives et les tâches de voie actives restent uniquement des avertissements par défaut ; une comptabilité de démarrage périmée sans travail de session actif peut libérer la voie de session concernée afin que le travail en file se vide.
- Si vous avez besoin de la profondeur de file, activez les journaux détaillés et surveillez les lignes de minutage de file.
- Les exécutions du serveur dapplication Codex qui acceptent un tour puis cessent démettre une progression sont interrompues par ladaptateur Codex afin que la voie de session active puisse se libérer au lieu dattendre le délai dexpiration de lexécution externe.
- Lorsque les diagnostics sont activés, les sessions qui restent en `processing` au-delà de `diagnostics.stuckSessionWarnMs` journalisent un avertissement de session bloquée. Les exécutions intégrées actives, les opérations de réponse actives et les tâches de voie actives restent uniquement des avertissements par défaut ; une comptabilité de démarrage obsolète sans travail de session actif peut libérer la voie de session affectée afin que le travail en file se vide.
## Liens connexes
## Connexe
- [Gestion des sessions](/fr/concepts/session)
- [File dattente de pilotage](/fr/concepts/queue-steering)
- [File de pilotage](/fr/concepts/queue-steering)
- [Politique de nouvelle tentative](/fr/concepts/retry)

File diff suppressed because it is too large Load Diff

View File

@ -4,55 +4,56 @@ read_when:
summary: Comment exécuter les tests localement (vitest) et quand utiliser les modes force/couverture
title: Tests
x-i18n:
generated_at: "2026-04-30T07:47:38Z"
generated_at: "2026-04-30T18:38:34Z"
model: gpt-5.5
provider: openai
source_hash: 9328d6f0383b5067fa8bb5d0f1bf22a3b9048a267908bf85167842ddc3d12e42
source_hash: 131f2bad3b2806d28394213cec38d632d106ddbf8ff04d06345ab8046fb8bcf2
source_path: reference/test.md
workflow: 16
---
- Kit de test complet (suites, en direct, Docker) : [Tests](/fr/help/testing)
- Kit de tests complet (suites, tests en direct, Docker) : [Tests](/fr/help/testing)
- `pnpm test:force` : tue tout processus Gateway persistant qui occupe le port de contrôle par défaut, puis exécute toute la suite Vitest avec un port Gateway isolé afin que les tests serveur nentrent pas en conflit avec une instance en cours dexécution. Utilisez cela lorsquune exécution Gateway précédente a laissé le port 18789 occupé.
- `pnpm test:coverage` : exécute la suite unitaire avec la couverture V8 (via `vitest.unit.config.ts`). Il sagit dun contrôle de couverture unitaire des fichiers chargés, pas dune couverture de tous les fichiers de tout le dépôt. Les seuils sont 70 % pour les lignes/fonctions/instructions et 55 % pour les branches. Comme `coverage.all` vaut false, le contrôle mesure les fichiers chargés par la suite de couverture unitaire au lieu de traiter chaque fichier source de voie séparée comme non couvert.
- `pnpm test:force` : tue tout processus Gateway persistant qui occupe le port de contrôle par défaut, puis exécute la suite Vitest complète avec un port Gateway isolé afin que les tests serveur nentrent pas en conflit avec une instance en cours dexécution. Utilisez-le lorsquune exécution Gateway précédente a laissé le port 18789 occupé.
- `pnpm test:coverage` : exécute la suite unitaire avec la couverture V8 (via `vitest.unit.config.ts`). Il sagit dune porte de couverture unitaire des fichiers chargés, et non dune couverture de tous les fichiers de tout le dépôt. Les seuils sont de 70 % pour les lignes/fonctions/instructions et de 55 % pour les branches. Comme `coverage.all` vaut false, la porte mesure les fichiers chargés par la suite de couverture unitaire au lieu de considérer chaque fichier source de voie fractionnée comme non couvert.
- `pnpm test:coverage:changed` : exécute la couverture unitaire uniquement pour les fichiers modifiés depuis `origin/main`.
- `pnpm test:changed` : exécution de tests modifiés intelligente et peu coûteuse. Elle exécute des cibles précises à partir des modifications directes de tests, des fichiers frères `*.test.ts`, des correspondances source explicites et du graphe dimport local. Les modifications larges de configuration/paquet sont ignorées sauf si elles correspondent à des tests précis.
- `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` : exécution large explicite des tests modifiés. Utilisez-la lorsquune modification de harnais de test/configuration/paquet doit revenir au comportement plus large de Vitest pour les tests modifiés.
- `pnpm test:changed` : exécution de tests modifiés intelligente et peu coûteuse. Elle exécute des cibles précises à partir des modifications directes de tests, des fichiers frères `*.test.ts`, des correspondances de sources explicites et du graphe dimport local. Les changements larges de configuration ou de package sont ignorés sauf sils correspondent à des tests précis.
- `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` : exécution large explicite des tests modifiés. Utilisez-la lorsquune modification du harnais de test, de la configuration ou dun package doit revenir au comportement plus large de Vitest pour les tests modifiés.
- `pnpm changed:lanes` : affiche les voies architecturales déclenchées par le diff par rapport à `origin/main`.
- `pnpm check:changed` : exécute le contrôle intelligent des changements pour le diff par rapport à `origin/main`. Il exécute les commandes de typage, de lint et de garde pour les voies architecturales affectées, mais nexécute pas les tests Vitest. Utilisez `pnpm test:changed` ou `pnpm test <target>` explicite pour la preuve par les tests.
- `pnpm test` : route les cibles de fichier/répertoire explicites vers des voies Vitest limitées. Les exécutions sans cible utilisent des groupes de partitions fixes et sétendent aux configurations feuilles pour lexécution parallèle locale ; le groupe dextensions sétend toujours aux configurations de partitions par extension au lieu dun unique processus de projet racine géant.
- Les exécutions de lenveloppe de test se terminent par un court résumé `[test] passed|failed|skipped ... in ...`. La ligne de durée propre à Vitest reste le détail par partition.
- `pnpm check:changed` : exécute la porte de vérification intelligente des changements pour le diff par rapport à `origin/main`. Elle exécute les commandes de vérification de types, de lint et de garde pour les voies architecturales affectées, mais nexécute pas les tests Vitest. Utilisez `pnpm test:changed` ou un `pnpm test <target>` explicite comme preuve de test.
- `pnpm test` : achemine les cibles explicites de fichiers/répertoires via les voies Vitest limitées au périmètre. Les exécutions sans cible utilisent des groupes de fragments fixes et se développent en configurations feuilles pour lexécution parallèle locale ; le groupe dextensions se développe toujours en configurations de fragments par extension au lieu dun seul énorme processus de projet racine.
- Les exécutions du wrapper de test se terminent par un court résumé `[test] passed|failed|skipped ... in ...`. La ligne de durée propre à Vitest reste le détail par fragment.
- État de test OpenClaw partagé : utilisez `src/test-utils/openclaw-test-state.ts` depuis Vitest lorsquun test a besoin dun `HOME`, `OPENCLAW_STATE_DIR`, `OPENCLAW_CONFIG_PATH`, dun fixture de configuration, dun espace de travail, dun répertoire dagent ou dun magasin de profils dauthentification isolé.
- Assistants E2E de processus : utilisez `test/helpers/openclaw-test-instance.ts` lorsquun test E2E au niveau processus Vitest a besoin dun Gateway en cours dexécution, dun environnement CLI, dune capture de journaux et du nettoyage au même endroit.
- Assistants E2E Docker/Bash : les voies qui sourcent `scripts/lib/docker-e2e-image.sh` peuvent passer `docker_e2e_test_state_shell_b64 <label> <scenario>` dans le conteneur et le décoder avec `scripts/lib/openclaw-e2e-instance.sh` ; les scripts multi-maisons peuvent passer `docker_e2e_test_state_function_b64` et appeler `openclaw_test_state_create <label> <scenario>` dans chaque flux. Les appelants de plus bas niveau peuvent utiliser `scripts/lib/openclaw-test-state.mjs shell --label <name> --scenario <name>` pour un extrait shell dans le conteneur, ou `node scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --json` pour un fichier denvironnement hôte sourçable. Le `--` avant `create` empêche les runtimes Node plus récents de traiter `--env-file` comme un indicateur Node. Les voies Docker/Bash qui lancent un Gateway peuvent sourcer `scripts/lib/openclaw-e2e-instance.sh` dans le conteneur pour la résolution du point dentrée, le démarrage OpenAI factice, le lancement du Gateway au premier plan/en arrière-plan, les sondes de disponibilité, lexport de lenvironnement détat, les vidages de journaux et le nettoyage des processus.
- Les exécutions de partitions complètes, dextensions et à motif dinclusion mettent à jour les données de minutage locales dans `.artifacts/vitest-shard-timings.json` ; les exécutions ultérieures de configuration complète utilisent ces minutages pour équilibrer les partitions lentes et rapides. Les partitions CI à motif dinclusion ajoutent le nom de la partition à la clé de minutage, ce qui garde les minutages filtrés visibles sans remplacer les données de minutage de configuration complète. Définissez `OPENCLAW_TEST_PROJECTS_TIMINGS=0` pour ignorer lartefact de minutage local.
- Certains fichiers de test `plugin-sdk` et `commands` sont désormais routés par des voies légères dédiées qui ne conservent que `test/setup.ts`, en laissant les cas lourds à lexécution sur leurs voies existantes.
- Les fichiers source avec des tests frères correspondent dabord à ce frère avant de revenir à des globs de répertoire plus larges. Les modifications dassistants sous `src/channels/plugins/contracts/test-helpers`, `src/plugin-sdk/test-helpers` et `src/plugins/contracts` utilisent un graphe dimport local pour exécuter les tests importateurs au lieu dexécuter largement chaque partition lorsque le chemin de dépendance est précis.
- `auto-reply` se sépare désormais aussi en trois configurations dédiées (`core`, `top-level`, `reply`) afin que le harnais de réponse ne domine pas les tests plus légers de statut/jeton/assistant de premier niveau.
- La configuration Vitest de base utilise désormais par défaut `pool: "threads"` et `isolate: false`, avec lexécuteur non isolé partagé activé dans les configurations du dépôt.
- Helpers E2E de processus : utilisez `test/helpers/openclaw-test-instance.ts` lorsquun test E2E Vitest au niveau processus a besoin dun Gateway en cours dexécution, dun environnement CLI, dune capture de journaux et dun nettoyage au même endroit.
- Helpers E2E Docker/Bash : les voies qui sourcent `scripts/lib/docker-e2e-image.sh` peuvent transmettre `docker_e2e_test_state_shell_b64 <label> <scenario>` dans le conteneur et le décoder avec `scripts/lib/openclaw-e2e-instance.sh` ; les scripts multi-home peuvent transmettre `docker_e2e_test_state_function_b64` et appeler `openclaw_test_state_create <label> <scenario>` dans chaque flux. Les appelants de plus bas niveau peuvent utiliser `scripts/lib/openclaw-test-state.mjs shell --label <name> --scenario <name>` pour un extrait shell dans le conteneur, ou `node scripts/lib/openclaw-test-state.mjs -- create --label <name> --scenario <name> --env-file <path> --json` pour un fichier denvironnement hôte sourçable. Le `--` avant `create` empêche les runtimes Node récents de traiter `--env-file` comme un indicateur Node. Les voies Docker/Bash qui lancent un Gateway peuvent sourcer `scripts/lib/openclaw-e2e-instance.sh` dans le conteneur pour la résolution de lentrypoint, le démarrage OpenAI simulé, le lancement Gateway au premier plan/en arrière-plan, les sondes de disponibilité, lexport de lenvironnement détat, les dumps de journaux et le nettoyage des processus.
- Les exécutions fragmentées complètes, par extension et avec motif dinclusion mettent à jour les données de timings locales dans `.artifacts/vitest-shard-timings.json` ; les exécutions ultérieures de configuration complète utilisent ces timings pour équilibrer les fragments lents et rapides. Les fragments CI avec motif dinclusion ajoutent le nom du fragment à la clé de timing, ce qui garde les timings filtrés visibles sans remplacer les données de timing de configuration complète. Définissez `OPENCLAW_TEST_PROJECTS_TIMINGS=0` pour ignorer lartifact de timing local.
- Certains fichiers de test `plugin-sdk` et `commands` passent maintenant par des voies légères dédiées qui ne conservent que `test/setup.ts`, en laissant les cas lourds côté runtime sur leurs voies existantes.
- Les fichiers source avec des tests frères correspondent à ce frère avant de revenir à des globs de répertoires plus larges. Les modifications de helpers sous `src/channels/plugins/contracts/test-helpers`, `src/plugin-sdk/test-helpers` et `src/plugins/contracts` utilisent un graphe dimport local pour exécuter les tests importeurs au lieu dexécuter largement chaque fragment lorsque le chemin de dépendance est précis.
- `auto-reply` se divise maintenant aussi en trois configurations dédiées (`core`, `top-level`, `reply`) afin que le harnais de réponse ne domine pas les tests plus légers de statut, de jetons et de helpers au niveau supérieur.
- La configuration Vitest de base utilise maintenant par défaut `pool: "threads"` et `isolate: false`, avec le runner non isolé partagé activé dans les configurations du dépôt.
- `pnpm test:channels` exécute `vitest.channels.config.ts`.
- `pnpm test:extensions` et `pnpm test extensions` exécutent toutes les partitions dextension/plugin. Les plugins de canaux lourds, le plugin navigateur et OpenAI sexécutent comme partitions dédiées ; les autres groupes de plugins restent regroupés. Utilisez `pnpm test extensions/<id>` pour une voie de plugin groupé.
- `pnpm test:perf:imports` : active les rapports de durée dimport et de décomposition des imports Vitest, tout en utilisant le routage par voie limitée pour les cibles explicites de fichier/répertoire.
- `pnpm test:extensions` et `pnpm test extensions` exécutent tous les fragments dextensions/Plugin. Les Plugins de canaux lourds, le Plugin de navigateur et OpenAI sexécutent comme fragments dédiés ; les autres groupes de Plugins restent regroupés. Utilisez `pnpm test extensions/<id>` pour une voie de Plugin groupé.
- `pnpm test:perf:imports` : active les rapports de durée dimport et de répartition des imports de Vitest, tout en utilisant toujours le routage par voie limitée au périmètre pour les cibles explicites de fichiers/répertoires.
- `pnpm test:perf:imports:changed` : même profilage des imports, mais uniquement pour les fichiers modifiés depuis `origin/main`.
- `pnpm test:perf:changed:bench -- --ref <git-ref>` mesure le chemin routé en mode changements par rapport à lexécution native du projet racine pour le même diff git validé.
- `pnpm test:perf:changed:bench -- --worktree` mesure lensemble de changements de larbre de travail actuel sans validation préalable.
- `pnpm test:perf:profile:main` : écrit un profil CPU pour le thread principal Vitest (`.artifacts/vitest-main-profile`).
- `pnpm test:perf:profile:runner` : écrit des profils CPU et tas pour lexécuteur unitaire (`.artifacts/vitest-runner-profile`).
- `pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json` : exécute chaque configuration feuille Vitest de suite complète en série et écrit des données de durée groupées ainsi que des artefacts JSON/journaux par configuration. Le Test Performance Agent lutilise comme référence avant de tenter de corriger les tests lents.
- `pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json` : compare les rapports groupés après un changement axé sur les performances.
- `pnpm test:perf:changed:bench -- --ref <git-ref>` compare par benchmark le chemin routé en mode changements avec lexécution native du projet racine pour le même diff git commité.
- `pnpm test:perf:changed:bench -- --worktree` benchmarke lensemble de changements du worktree courant sans commit préalable.
- `pnpm test:perf:profile:main` : écrit un profil CPU pour le thread principal de Vitest (`.artifacts/vitest-main-profile`).
- `pnpm test:perf:profile:runner` : écrit des profils CPU + heap pour le runner unitaire (`.artifacts/vitest-runner-profile`).
- `pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-perf/baseline-before.json` : exécute chaque configuration feuille Vitest de suite complète en série et écrit des données de durée groupées ainsi que des artifacts JSON/journaux par configuration. Le Test Performance Agent lutilise comme référence avant de tenter des corrections de tests lents.
- `pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json` : compare les rapports groupés après une modification axée sur les performances.
- Intégration Gateway : activation explicite via `OPENCLAW_TEST_INCLUDE_GATEWAY=1 pnpm test` ou `pnpm test:gateway`.
- `pnpm test:e2e` : exécute les tests de fumée de bout en bout du Gateway (appariement multi-instance WS/HTTP/node). Utilise par défaut `threads` + `isolate: false` avec des workers adaptatifs dans `vitest.e2e.config.ts` ; ajustez avec `OPENCLAW_E2E_WORKERS=<n>` et définissez `OPENCLAW_E2E_VERBOSE=1` pour des journaux détaillés.
- `pnpm test:live` : exécute les tests live de fournisseurs (minimax/zai). Nécessite des clés API et `LIVE=1` (ou `*_LIVE_TEST=1` spécifique au fournisseur) pour lever lexclusion.
- `pnpm test:docker:all` : construit limage de test live partagée, empaquette OpenClaw une fois comme archive npm, construit/réutilise une image dexécution Node/Git minimale plus une image fonctionnelle qui installe cette archive dans `/app`, puis exécute les voies de fumée Docker avec `OPENCLAW_SKIP_DOCKER_BUILD=1` via un ordonnanceur pondéré. Limage minimale (`OPENCLAW_DOCKER_E2E_BARE_IMAGE`) est utilisée pour les voies dinstallation/mise à jour/dépendances de plugin ; ces voies montent larchive préconstruite au lieu dutiliser des sources du dépôt copiées. Limage fonctionnelle (`OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`) est utilisée pour les voies de fonctionnalité normale de lapplication construite. `scripts/package-openclaw-for-docker.mjs` est lempaqueteur unique local/CI et valide larchive ainsi que `dist/postinstall-inventory.json` avant que Docker ne la consomme. Les définitions de voies Docker se trouvent dans `scripts/lib/docker-e2e-scenarios.mjs` ; la logique de planification se trouve dans `scripts/lib/docker-e2e-plan.mjs` ; `scripts/test-docker-all.mjs` exécute le plan sélectionné. `node scripts/test-docker-all.mjs --plan-json` émet le plan CI détenu par lordonnanceur pour les voies sélectionnées, les types dimages, les besoins de paquet/image live, les scénarios détat et les contrôles didentifiants, sans construire ni exécuter Docker. `OPENCLAW_DOCKER_ALL_PARALLELISM=<n>` contrôle les emplacements de processus et vaut 10 par défaut ; `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>` contrôle le groupe de fin sensible aux fournisseurs et vaut 10 par défaut. Les plafonds de voies lourdes valent par défaut `OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`, `OPENCLAW_DOCKER_ALL_NPM_LIMIT=10` et `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7` ; les plafonds de fournisseurs valent par défaut une voie lourde par fournisseur via `OPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT=4`, `OPENCLAW_DOCKER_ALL_LIVE_CODEX_LIMIT=4` et `OPENCLAW_DOCKER_ALL_LIVE_GEMINI_LIMIT=4`. Utilisez `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT` ou `OPENCLAW_DOCKER_ALL_DOCKER_LIMIT` pour des hôtes plus grands. Si une voie dépasse le poids effectif ou le plafond de ressources sur un hôte à faible parallélisme, elle peut tout de même démarrer depuis un groupe vide et sexécuter seule jusquà libérer de la capacité. Les démarrages de voies sont espacés de 2 secondes par défaut pour éviter les tempêtes de création du démon Docker local ; surchargez avec `OPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>`. Lexécuteur précontrôle Docker par défaut, nettoie les conteneurs E2E OpenClaw périmés, émet létat des voies actives toutes les 30 secondes, partage les caches doutils CLI de fournisseurs entre voies compatibles, retente une fois par défaut les échecs transitoires de fournisseurs live (`OPENCLAW_DOCKER_ALL_LIVE_RETRIES=<n>`) et stocke les minutages de voies dans `.artifacts/docker-tests/lane-timings.json` pour un ordre du plus long au plus court lors des exécutions suivantes. Utilisez `OPENCLAW_DOCKER_ALL_DRY_RUN=1` pour imprimer le manifeste des voies sans exécuter Docker, `OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS=<ms>` pour ajuster la sortie détat, ou `OPENCLAW_DOCKER_ALL_TIMINGS=0` pour désactiver la réutilisation des minutages. Utilisez `OPENCLAW_DOCKER_ALL_LIVE_MODE=skip` uniquement pour les voies déterministes/locales ou `OPENCLAW_DOCKER_ALL_LIVE_MODE=only` uniquement pour les voies de fournisseurs live ; les alias de paquet sont `pnpm test:docker:local:all` et `pnpm test:docker:live:all`. Le mode live seul fusionne les voies live principales et de fin dans un groupe unique du plus long au plus court afin que les compartiments de fournisseurs puissent regrouper le travail Claude, Codex et Gemini. Lexécuteur cesse de planifier de nouvelles voies groupées après le premier échec sauf si `OPENCLAW_DOCKER_ALL_FAIL_FAST=0` est défini, et chaque voie a un délai dexpiration de repli de 120 minutes surchargeable avec `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` ; certaines voies live/de fin utilisent des plafonds par voie plus stricts. Les commandes de configuration Docker du backend CLI ont leur propre délai dexpiration via `OPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS` (180 par défaut). Les journaux par voie, `summary.json`, `failures.json` et les minutages de phases sont écrits sous `.artifacts/docker-tests/<run-id>/` ; utilisez `pnpm test:docker:timings <summary.json>` pour inspecter les voies lentes et `pnpm test:docker:rerun <run-id|summary.json|failures.json>` pour imprimer des commandes de réexécution ciblées peu coûteuses.
- `pnpm test:docker:browser-cdp-snapshot` : construit un conteneur E2E source adossé à Chromium, démarre le CDP brut plus un Gateway isolé, exécute `browser doctor --deep` et vérifie que les instantanés de rôles CDP incluent les URL de liens, les éléments cliquables promus par le curseur, les références diframe et les métadonnées de cadre.
- Les sondes Docker live du backend CLI peuvent être exécutées comme voies ciblées, par exemple `pnpm test:docker:live-cli-backend:codex`, `pnpm test:docker:live-cli-backend:codex:resume` ou `pnpm test:docker:live-cli-backend:codex:mcp`. Claude et Gemini ont des alias `:resume` et `:mcp` correspondants.
- `pnpm test:docker:openwebui` : démarre OpenClaw + Open WebUI dans Docker, se connecte via Open WebUI, vérifie `/api/models`, puis exécute une vraie discussion proxifiée via `/api/chat/completions`. Nécessite une clé de modèle live utilisable (par exemple OpenAI dans `~/.profile`), récupère une image Open WebUI externe et nest pas censé être stable en CI comme les suites unitaires/e2e normales.
- `pnpm test:docker:mcp-channels` : démarre un conteneur Gateway prérempli et un second conteneur client qui lance `openclaw mcp serve`, puis vérifie la découverte de conversations routées, les lectures de transcriptions, les métadonnées de pièces jointes, le comportement de la file dévénements live, le routage des envois sortants, ainsi que les notifications de canal et dautorisation de style Claude sur le vrai pont stdio. Lassertion de notification Claude lit directement les trames MCP stdio brutes afin que le test de fumée reflète ce que le pont émet réellement.
- `pnpm test:e2e` : exécute les tests smoke Gateway de bout en bout (appariement multi-instance WS/HTTP/node). Utilise par défaut `threads` + `isolate: false` avec des workers adaptatifs dans `vitest.e2e.config.ts` ; ajustez avec `OPENCLAW_E2E_WORKERS=<n>` et définissez `OPENCLAW_E2E_VERBOSE=1` pour des journaux détaillés.
- `pnpm test:live` : exécute les tests live des fournisseurs (minimax/zai). Nécessite des clés API et `LIVE=1` (ou `*_LIVE_TEST=1` propre au fournisseur) pour ne plus être ignoré.
- `pnpm test:docker:all` : construit limage de test live partagée, empaquette OpenClaw une seule fois comme tarball npm, construit/réutilise une image runner Node/Git nue ainsi quune image fonctionnelle qui installe ce tarball dans `/app`, puis exécute les voies smoke Docker avec `OPENCLAW_SKIP_DOCKER_BUILD=1` via un ordonnanceur pondéré. Limage nue (`OPENCLAW_DOCKER_E2E_BARE_IMAGE`) est utilisée pour les voies dinstallation, de mise à jour et de dépendances de Plugin ; ces voies montent le tarball préconstruit au lieu dutiliser les sources copiées du dépôt. Limage fonctionnelle (`OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`) est utilisée pour les voies de fonctionnalité normale de lapplication construite. `scripts/package-openclaw-for-docker.mjs` est lunique empaqueteur de package local/CI et valide le tarball ainsi que `dist/postinstall-inventory.json` avant consommation par Docker. Les définitions de voies Docker se trouvent dans `scripts/lib/docker-e2e-scenarios.mjs` ; la logique du planificateur se trouve dans `scripts/lib/docker-e2e-plan.mjs` ; `scripts/test-docker-all.mjs` exécute le plan sélectionné. `node scripts/test-docker-all.mjs --plan-json` émet le plan CI détenu par lordonnanceur pour les voies sélectionnées, les types dimages, les besoins de package/image live, les scénarios détat et les vérifications didentifiants sans construire ni exécuter Docker. `OPENCLAW_DOCKER_ALL_PARALLELISM=<n>` contrôle les emplacements de processus et vaut 10 par défaut ; `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM=<n>` contrôle le pool de fin sensible aux fournisseurs et vaut 10 par défaut. Les plafonds de voies lourdes valent par défaut `OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`, `OPENCLAW_DOCKER_ALL_NPM_LIMIT=10` et `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7` ; les plafonds de fournisseurs valent par défaut une voie lourde par fournisseur via `OPENCLAW_DOCKER_ALL_LIVE_CLAUDE_LIMIT=4`, `OPENCLAW_DOCKER_ALL_LIVE_CODEX_LIMIT=4` et `OPENCLAW_DOCKER_ALL_LIVE_GEMINI_LIMIT=4`. Utilisez `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT` ou `OPENCLAW_DOCKER_ALL_DOCKER_LIMIT` pour les hôtes plus grands. Si une voie dépasse le poids effectif ou le plafond de ressources sur un hôte à faible parallélisme, elle peut tout de même démarrer depuis un pool vide et sexécuter seule jusquà libérer de la capacité. Les démarrages de voies sont espacés de 2 secondes par défaut pour éviter les tempêtes de création du daemon Docker local ; remplacez ce délai avec `OPENCLAW_DOCKER_ALL_START_STAGGER_MS=<ms>`. Le runner prévérifie Docker par défaut, nettoie les conteneurs E2E OpenClaw obsolètes, émet létat des voies actives toutes les 30 secondes, partage les caches doutils CLI fournisseur entre voies compatibles, réessaie une fois par défaut les échecs transitoires de fournisseurs live (`OPENCLAW_DOCKER_ALL_LIVE_RETRIES=<n>`) et stocke les timings des voies dans `.artifacts/docker-tests/lane-timings.json` pour un ordre du plus long au plus court lors des exécutions ultérieures. Utilisez `OPENCLAW_DOCKER_ALL_DRY_RUN=1` pour imprimer le manifeste des voies sans exécuter Docker, `OPENCLAW_DOCKER_ALL_STATUS_INTERVAL_MS=<ms>` pour ajuster la sortie détat, ou `OPENCLAW_DOCKER_ALL_TIMINGS=0` pour désactiver la réutilisation des timings. Utilisez `OPENCLAW_DOCKER_ALL_LIVE_MODE=skip` uniquement pour les voies déterministes/locales ou `OPENCLAW_DOCKER_ALL_LIVE_MODE=only` uniquement pour les voies de fournisseurs live ; les alias de package sont `pnpm test:docker:local:all` et `pnpm test:docker:live:all`. Le mode live uniquement fusionne les voies live principales et de fin dans un seul pool du plus long au plus court afin que les compartiments de fournisseurs puissent regrouper le travail Claude, Codex et Gemini. Le runner cesse de planifier de nouvelles voies en pool après le premier échec sauf si `OPENCLAW_DOCKER_ALL_FAIL_FAST=0` est défini, et chaque voie dispose dun délai dexpiration de repli de 120 minutes remplaçable avec `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` ; certaines voies live/de fin sélectionnées utilisent des plafonds par voie plus stricts. Les commandes de configuration Docker du backend CLI ont leur propre délai dexpiration via `OPENCLAW_LIVE_CLI_BACKEND_SETUP_TIMEOUT_SECONDS` (180 par défaut). Les journaux par voie, `summary.json`, `failures.json` et les timings de phase sont écrits sous `.artifacts/docker-tests/<run-id>/` ; utilisez `pnpm test:docker:timings <summary.json>` pour inspecter les voies lentes et `pnpm test:docker:rerun <run-id|summary.json|failures.json>` pour imprimer des commandes de réexécution ciblées et peu coûteuses.
- `pnpm test:docker:browser-cdp-snapshot` : construit un conteneur E2E source adossé à Chromium, démarre CDP brut ainsi quun Gateway isolé, exécute `browser doctor --deep`, puis vérifie que les instantanés de rôle CDP incluent les URL de liens, les éléments cliquables promus par le curseur, les références diframe et les métadonnées de frame.
- Les sondes Docker live du backend CLI peuvent être exécutées comme voies ciblées, par exemple `pnpm test:docker:live-cli-backend:codex`, `pnpm test:docker:live-cli-backend:codex:resume` ou `pnpm test:docker:live-cli-backend:codex:mcp`. Claude et Gemini disposent dalias `:resume` et `:mcp` correspondants.
- `pnpm test:docker:openwebui` : démarre OpenClaw + Open WebUI dockerisés, se connecte via Open WebUI, vérifie `/api/models`, puis exécute une vraie conversation proxifiée via `/api/chat/completions`. Nécessite une clé de modèle live utilisable (par exemple OpenAI dans `~/.profile`), tire une image Open WebUI externe et nest pas censé être stable en CI comme les suites unitaires/e2e normales.
- `pnpm test:docker:mcp-channels` : démarre un conteneur Gateway préinitialisé et un second conteneur client 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 denvois sortants, ainsi que les notifications de canal et dautorisation de style Claude via le vrai pont stdio. Lassertion de notification Claude lit directement les trames MCP stdio brutes afin que le smoke reflète ce que le pont émet réellement.
- `pnpm test:docker:upgrade-survivor` : installe larchive tarball OpenClaw empaquetée par-dessus une fixture sale dancien utilisateur, exécute la mise à jour du paquet ainsi que le doctor non interactif sans clés de provider ou de canal actives, puis démarre un Gateway en loopback et vérifie que les agents, la configuration des canaux, les listes dautorisation des plugins, les fichiers despace de travail/session, létat obsolète des dépendances dexécution des plugins, le démarrage et létat RPC survivent.
## Contrôle PR local
## Gate PR local
Pour les vérifications locales dintégration et de validation de PR, exécutez :
Pour les vérifications locales de fusion/gate de PR, exécutez :
- `pnpm check:changed`
- `pnpm check`
@ -61,27 +62,27 @@ Pour les vérifications locales dintégration et de validation de PR, exécut
- `pnpm test`
- `pnpm check:docs`
Si `pnpm test` échoue de façon intermittente sur un hôte chargé, relancez-le une fois avant de le considérer comme une régression, puis isolez avec `pnpm test <path/to/test>`. Pour les hôtes à mémoire contrainte, utilisez :
Si `pnpm test` échoue de manière intermittente sur un hôte fortement chargé, relancez-le une fois avant de considérer cela comme une régression, puis isolez avec `pnpm test <path/to/test>`. Pour les hôtes contraints en mémoire, utilisez :
- `OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test`
- `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/tmp/openclaw-vitest-cache pnpm test:changed`
## Banc de latence des modèles (clés locales)
## Banc de mesure de latence des modèles (clés locales)
Script : [`scripts/bench-model.ts`](https://github.com/openclaw/openclaw/blob/main/scripts/bench-model.ts)
Utilisation :
- `source ~/.profile && pnpm tsx scripts/bench-model.ts --runs 10`
- Env optionnelles : `MINIMAX_API_KEY`, `MINIMAX_BASE_URL`, `MINIMAX_MODEL`, `ANTHROPIC_API_KEY`
- Prompt par défaut : « Réponds avec un seul mot : ok. Sans ponctuation ni texte supplémentaire. »
- Variables denvironnement optionnelles : `MINIMAX_API_KEY`, `MINIMAX_BASE_URL`, `MINIMAX_MODEL`, `ANTHROPIC_API_KEY`
- Invite par défaut : « Reply with a single word: ok. No punctuation or extra text. »
Dernière exécution (2025-12-31, 20 exécutions) :
- médiane minimax 1279 ms (min 1114, max 2431)
- médiane opus 2454 ms (min 1224, max 3170)
- minimax médiane 1279 ms (min 1114, max 2431)
- opus médiane 2454 ms (min 1224, max 3170)
## Banc de démarrage CLI
## Banc de mesure du démarrage de la CLI
Script : [`scripts/bench-cli-startup.ts`](https://github.com/openclaw/openclaw/blob/main/scripts/bench-cli-startup.ts)
@ -109,23 +110,23 @@ Préréglages :
- `real` : `health`, `status`, `status --json`, `sessions`, `sessions --json`, `tasks --json`, `tasks list --json`, `tasks audit --json`, `agents list --json`, `gateway status`, `gateway status --json`, `gateway health --json`, `config get gateway.port`
- `all` : les deux préréglages
La sortie inclut `sampleCount`, la moyenne, p50, p95, min/max, la distribution des codes de sortie/signaux et les résumés du RSS maximal pour chaque commande. Les options `--cpu-prof-dir` / `--heap-prof-dir` écrivent des profils V8 pour chaque exécution afin que la mesure du temps et la capture des profils utilisent le même harnais.
La sortie inclut `sampleCount`, la moyenne, p50, p95, min/max, la distribution code de sortie/signal, ainsi que des résumés du RSS maximal pour chaque commande. Les options facultatives `--cpu-prof-dir` / `--heap-prof-dir` écrivent des profils V8 pour chaque exécution afin que le minutage et la capture de profils utilisent le même banc.
Conventions des sorties enregistrées :
Conventions de sortie enregistrée :
- `pnpm test:startup:bench:smoke` écrit lartefact de smoke ciblé dans `.artifacts/cli-startup-bench-smoke.json`
- `pnpm test:startup:bench:save` écrit lartefact de suite complète dans `.artifacts/cli-startup-bench-all.json` avec `runs=5` et `warmup=1`
- `pnpm test:startup:bench:update` actualise la fixture de référence versionnée dans `test/fixtures/cli-startup-bench.json` avec `runs=5` et `warmup=1`
- `pnpm test:startup:bench:smoke` écrit lartefact ciblé de test de fumée dans `.artifacts/cli-startup-bench-smoke.json`
- `pnpm test:startup:bench:save` écrit lartefact de la suite complète dans `.artifacts/cli-startup-bench-all.json` avec `runs=5` et `warmup=1`
- `pnpm test:startup:bench:update` actualise le jeu de données de référence versionné dans `test/fixtures/cli-startup-bench.json` avec `runs=5` et `warmup=1`
Fixture versionnée :
Jeu de données de test versionné :
- `test/fixtures/cli-startup-bench.json`
- Actualisez avec `pnpm test:startup:bench:update`
- Comparez les résultats actuels à la fixture avec `pnpm test:startup:bench:check`
- Comparez les résultats actuels au jeu de données avec `pnpm test:startup:bench:check`
## E2E donboarding (Docker)
## E2E dintégration initiale (Docker)
Docker est facultatif ; ceci nest nécessaire que pour les smoke tests donboarding conteneurisés.
Docker est facultatif ; cela nest nécessaire que pour les tests de fumée dintégration initiale conteneurisés.
Flux complet de démarrage à froid dans un conteneur Linux propre :
@ -135,15 +136,15 @@ scripts/e2e/onboard-docker.sh
Ce script pilote lassistant interactif via un pseudo-tty, vérifie les fichiers de configuration/espace de travail/session, puis démarre le Gateway et exécute `openclaw health`.
## Smoke dimport QR (Docker)
## Test de fumée dimport QR (Docker)
Vérifie que laide dexécution QR maintenue se charge avec les runtimes Docker Node pris en charge (Node 24 par défaut, Node 22 compatible) :
Vérifie que lassistant dexécution QR maintenu se charge sous les environnements dexécution Docker Node pris en charge (Node 24 par défaut, Node 22 compatible) :
```bash
pnpm test:docker:qr
```
## Connexe
## Associés
- [Tests](/fr/help/testing)
- [Tests en direct](/fr/help/testing-live)