Tout ce qui précède détecte une déviation par rapport à une ligne de base. Il existe une classe en dessous : le workflow qui n’a jamais été déclenché une seule fois. Deux d’entre eux nous ont posé problème, et tous les deux sont invisibles pour chaque couche dans ce fil.
1. Un déclencheur d’horaire qui est Actif et ne se déclenche jamais.
Si un déclencheur d’horaire défini sur l’intervalle weeks (semaines) n’a pas weeksInterval dans le JSON du workflow, il ne se déclenche jamais — ni en retard, ni une fois. Nous avons confirmé cela de deux façons sur n8n 2.31.5 : en lisant la vérification de récurrence dans le code source, et en publiant une copie du fichier exactement tel qu’il a été livré et en observant que rien ne se passe. Un triggerAtMinute manquant relève de la même famille — il devient silencieusement une minute pseudo-aléatoire dérivée d’un hash au lieu de celle que vous aviez prévu.
Deux choses rendent cela difficile à détecter avant la publication :
- L’exécution manuelle ignore complètement la vérification de récurrence. « Je l’ai testé et il a fonctionné correctement » ne dit rien sur le fait que le déclencheur se déclenchera jamais de lui-même.
- Ouvrir et enregistrer le nœud de déclenchement une fois dans l’interface normalise le JSON et remplit le champ manquant. Un workflow qui est cassé en tant que fichier devient correct au moment où vous l’inspectez dans l’éditeur, donc les tests basés sur l’interface ne peuvent pas prouver que le fichier que vous avez publié ou importé est correct.
Pourquoi les couches ci-dessus le manquent : la couche 1 a besoin d’une exécution qui échoue, et la couche 3 et le dispositif de surveillance externe ont tous deux besoin d’un « intervalle habituel » ou d’un premier ping pour la comparaison. « N’a pas été exécuté plus longtemps que d’habitude » n’a pas d’habituel quand la vraie réponse est jamais. Zéro exécutions depuis la publication mérite d’être sa propre alarme, distincte de l’arrêt de l’exécution.
La vérification que nous effectuons maintenant : publiez le workflow exactement tel qu’il existe en tant que fichier, sans ouvrir le nœud de déclenchement, puis attendez une exécution en production. Dans la liste des Exécutions, les exécutions programmées n’ont pas d’icône de flacon et les exécutions manuelles l’ont — c’est la preuve vérifiable par machine que l’horaire s’est déclenché plutôt que vous.
Adjacent, même silence : l’heure dans un déclencheur d’horaire est interprétée dans le fuseau horaire de l’instance (Paramètres du workflow → Fuseau horaire), pas le vôtre. Régler 15:38 sur une machine US-Central dont l’instance avait par défaut America/New_York signifiait 14:38 heure locale, déjà dans le passé, donc l’exécution de ce jour-là n’a simplement pas eu lieu.
2. Un nœud désactivé passe chaque couche de validation et raccourcit silencieusement la sortie.
Un nœud laissé avec "disabled": true est exclu de la vérification d’activation — nous avons lu cela à trois endroits dans notre propre installation 2.31.5 : le service de validation côté serveur, le chemin d’activation qui l’appelle, et le bundle frontend. Sur les exécutions en production, un nœud désactivé transmet également son entrée directement. L’exécution signale donc un succès, la sortie est incorrecte exactement de la manière « fonctionne bien, la sortie est incorrecte » décrite plus haut, et rien n’y fait référence nulle part. Celui-ci est introduit au moment de l’édition plutôt que par un changement en amont, donc un canari ne le détecte que si le canari passe par le même chemin.
Caveat de portée : tout ce qui précède a été mesuré sur self-hosted 2.31.5 et 2.32.6. Nous n’avons pas nos propres mesures Cloud.