Tout ce qui précède suppose qu’une exécution existe. Deux classes de défaillance que nous avons mesurées n’en produisent pas — ou produisent une exécution correcte avec des valeurs silencieusement erronées.
1. L’exécution qui n’a jamais eu lieu. Sur self-hosted 2.31.5, nous avons trouvé qu’un Schedule Trigger de type weeks dont le JSON n’a pas weeksInterval ne se déclenche jamais en production. Pas en retard — jamais. Il n’y a pas de ligne d’exécution, donc la relecture, les diffs de réconciliation, les journaux d’audit et les assertions de comptage de lignes n’ont rien à inspecter, et « silencieux » se rend identiquement à « sain ». Deux propriétés le rendent vicieux :
- L’exécution manuelle ignore la vérification de récurrence, donc les tests manuels ne peuvent pas la trouver par construction.
- Enregistrer le déclencheur une fois dans l’interface utilisateur normalise le nœud et remplit le champ manquant. Un workflow que vous avez testé via l’interface utilisateur n’est pas le workflow dans votre fichier JSON. Si vous livrez ou versionnez JSON (modèles, git, IaC), l’artefact que vous avez vérifié n’est pas l’artefact que vous avez livré.
- Un
triggerAtMinute manquant relève de la même classe, plus doux : il devient une minute pseudo-aléatoire dérivée du hash au lieu de celle que vous avez définie.
Ce que nous faisons maintenant : publier une copie exactement comme le fichier la définit, sans enregistrement intermédiaire via l’interface utilisateur, et surveiller un vrai sinistre de production. Dans la liste Executions, les exécutions déclenchées par l’horaire ne portent pas d’icône de ballon tandis que les exécutions manuelles le font — un discriminateur mécanique bon marché pour « l’horaire a fait cela, pas moi ».
2. Plausible mais erroné en raison du fuseau horaire. Workflow Settings → Timezone affecte le déclenchement du déclencheur mais pas new Date() à l’intérieur d’un nœud Code, qui se résout dans l’heure locale du processus. L’horaire se déclenche correctement et seules les mathématiques de date sont décalées d’un jour : les comptages de lignes sont corrects, la relecture correspond à ce que vous avez écrit, la valeur est simplement erronée. Connexe : new Date('YYYY-MM-DD') s’analyse comme minuit UTC, donc dans les zones UTC-moins une chaîne de date d’une feuille atterrit le jour local précédent et chaque différence de jour se décale d’un. Celui-ci nous l’avons livré — il ne se reproduit pas en JST, donc il était invisible pendant le développement et n’a émergé que lorsque nous avons exécuté les cas limites (due−2 ne doit pas se déclencher, due−3 doit se déclencher). Ce qui l’a corrigé : construire « aujourd’hui » à partir de $now (Luxon, fuseau horaire du workflow), faire l’arithmétique des parties de date au lieu d’addition de millisecondes, et arrondir plutôt que de tronquer pour les différences de jour afin que les transitions d’heure d’été ne mordent pas.
3. Les nœuds désactivés transmettent l’entrée directement. Sur les exécutions de production, un nœud désactivé renvoie son entrée inchangée. Si quoi que ce soit en aval a une expression de secours, vous obtenez une dégradation silencieuse — pas d’erreur, pas d’avertissement, et une sortie qui ressemble à l’entrée non traitée. Elle survit à la relecture, donc elle appartient à la liste « réussit tout en ne faisant rien ».
Mise en garde : tout ce qui précède a été mesuré sur self-hosted 2.31.5 ; nous n’avons pas nos propres mesures Cloud.
Sur les entrées de test à réponse connue — bon instinct, mais cela n’attrape toujours que les choses une fois qu’une exécution existe. L’équivalent côté déclencheur est d’affirmer qu’une exécution a eu lieu du tout : faire en sorte que le workflow écrive sa propre ligne de battement de cœur et alerte sur l’absence d’une. L’absence de signal est la seule chose qu’aucune des couches de relecture ne peut voir.