
Notre test de bout en bout le plus difficile pouvait passer quarante minutes à attendre un agent. La première version lui accordait un timeout de quatre-vingts minutes. Quand l’exécution cessait de faire un travail utile, j’attendais souvent l’essentiel de ce délai avant de m’en apercevoir.
Je repensais sans cesse à Dujiangyan. L’UNESCO décrit un système d’irrigation entrepris au IIIe siècle av. J.-C., qui régule le débit d’une rivière sans barrage. Il est toujours en service, grâce à l’entretien.
La comparaison m’a servi pour une décision précise dans mon test. Il me fallait un signal venu du processus en cours, plutôt qu’une supposition de plus sur le temps qu’il devrait prendre.
Le test pilote OwlMeans depuis le navigateur. Il inscrit un utilisateur, envoie un prompt, attend une spécification et la valide. Un nouveau bac à sable Kubernetes démarre pour le projet. Puis un agent développe la première user story.
Cette dernière étape a pris entre dix et quarante minutes lors des exécutions sur lesquelles s’appuie cet article de juin.
Simuler le modèle répondrait à une autre question. Ici, je voulais savoir si le navigateur, le pipeline et l’environnement du projet pouvaient aller ensemble au bout du parcours.
Le harnais de test côté navigateur utilise @owlmeans/test-ui, qui enveloppe Playwright. Sa connexion de test passe par notre mécanisme de superviseur : ce test-là n’établit donc pas qu’une vraie connexion Google fonctionne.
Le bac à sable vient de @owlmeans/kephemeral. Ce package provisionne le namespace temporaire, le stockage, la charge de travail et la politique réseau. Il surveille aussi la charge de travail et peut rétablir un pod qui a planté.
Cette reprise aide l’environnement à rester disponible. Elle ne dit pas au test si la réponse de l’agent est correcte.
La boucle d’attente
L’agent consomme des tokens pendant qu’il travaille. Je me suis servi des variations du solde enregistré comme signe que l’exécution était toujours active.
Le test relevait ce solde toutes les vingt secondes. Tant qu’il bougeait, le détecteur laissait l’attente se poursuivre. S’il restait figé pendant dix minutes, le détecteur faisait échouer l’exécution, soupçonnée d’être bloquée.
C’était une heuristique d’activité pour notre pipeline. Un solde qui bouge peut correspondre à un travail improductif. Un solde figé peut aussi signifier une attente légitime, une comptabilisation en retard ou un problème extérieur au modèle.
Il me fallait toujours des assertions sur l’état attendu de la story et sur le comportement du navigateur. Dépenser des tokens ne peut pas satisfaire ces assertions.
J’ai choisi ces seuils pour le parcours de juin ; ce ne sont pas des valeurs par défaut que je prescrirais à une autre équipe. Enregistre ce qu’émet réellement ton opération de longue durée, puis décide au bout de combien de temps un silence mérite qu’on s’y penche.
Les bonnes pratiques de Playwright insistent aussi sur l’isolation des tests. Notre longue attente n’était qu’une des sources d’exécutions peu fiables.
Le bac à sable abandonné
Interromps un test après le provisionnement, et il peut laisser un projet derrière lui. L’exécution suivante tombe alors sur un environnement que le test n’avait pas prévu de créer.
On réutilisait un seul profil de test. Avant et après chaque exécution, le harnais détruisait les projets de test de ce profil. Le nettoyage préalable comptait, parce que le processus précédent n’avait peut-être jamais atteint sa phase de démontage.
Le périmètre de suppression doit rester étroit. Une routine de nettoyage qui toucherait des projets sans rapport poserait un problème bien plus grave qu’un test instable.
Signale les échecs de nettoyage. S’il reste des ressources, lancer le test suivant comme si le nettoyage avait réussi cache des indices utiles. Vérifie l’état de départ réel avant de continuer.
Dans cette configuration, ça a supprimé une source d’interférences récurrente. Les échecs suivants restaient quand même à analyser.
La route jusqu’à la maison

Le cluster tournait sur un serveur à la maison, derrière une connexion de FAI sans adresse publique utilisable en entrée.
Notre route passait par une VM dans le cloud avec une IP publique réservée, un proxy Nginx et WireGuard. Le trafic allait de Cloudflare au relais, traversait le tunnel chiffré jusqu’au serveur de la maison, puis rejoignait le service Kubernetes.
C’était notre montage à base de relais. Il ne faut pas le confondre avec l’usage du connecteur de Cloudflare Tunnel comme seul moyen de transport.
Terraform, Ansible et des scripts shell configuraient la route. Un watchdog vérifiait les règles du pare-feu toutes les soixante secondes et corrigeait les dérives qu’il reconnaissait. Il pouvait rétablir certaines règles. Le réseau pouvait quand même tomber.
L’adresse réservée était censée rester la même malgré les démontages que décrit la configuration. L’état chez le fournisseur, les identifiants et la configuration restaient à entretenir.
Une panne réseau devrait désormais me donner une panne réseau à examiner. Attendre un agent plus longtemps ne peut pas réparer une route coupée vers son environnement.
Ce travail a rendu le test plus facile à diagnostiquer. Je pouvais distinguer un agent silencieux, un bac à sable abandonné et un chemin coupé vers le cluster, au lieu de leur accorder à tous les trois une heure de plus.
Le raccourci de connexion, la bibliothèque de provisionnement, les permissions de nettoyage, le décompte des tokens et la configuration réseau demandent toujours de l’entretien. Un changement dans n’importe lequel d’entre eux peut invalider une hypothèse du test.
Les Services OwlMeans peuvent inclure ce genre d’infrastructure de livraison et de test. Le travail doit coller à la stack réelle et à ses modes de défaillance ; la configuration de juin ne promet pas de déployer n’importe quel système en quelques jours.
J’ai échangé du temps passé à attendre contre du temps passé à entretenir le harnais. Pour ce parcours, ça valait le coup.
Initialement publié le 23 juin 2026. Révisé le 15 octobre 2026 pour séparer le détecteur d’activité des vérifications d’exactitude et nuancer les affirmations sur l’infrastructure.