Human in the Loop
Mettez un workflow en pause pour qu'une personne le revoie, puis approuvez et reprenez, ou rejetez
Le bloc Human in the Loop met en pause un workflow en cours et attend qu'une personne prenne une décision. Le relecteur voit la sortie du workflow jusqu'ici, puis approuve (le workflow reprend) ou rejette (le workflow s'arrête). Utilisez-le pour les validations, les approbations, et toute étape où un humain doit décider avant que l'automatisation continue.
Un workflow en pause attend indéfiniment qu'un relecteur agisse — il n'y a pas de délai d'expiration automatique. Les relecteurs sont notifiés et peuvent ouvrir la revue depuis leurs notifications.
Quand l'utiliser
- Approbations — un remboursement, un contrat, une étape de publication qui exige une validation.
- Contrôles qualité — une personne vérifie un brouillon généré par l'IA avant son envoi.
- Conformité — une décision humaine requise est enregistrée avant que le processus continue.
Ce que l'auteur configure
| Paramètre | Ce qu'il fait |
|---|---|
| Review Question | La question affichée en haut du panneau de revue. Accepte des variables comme <blockName.field>, résolues avec les vraies valeurs du workflow au moment de la pause. |
| Paused Output (Context) | Les champs que voit le relecteur — la sortie du workflow dont il a besoin pour décider. Référencez les blocs en amont avec <blockName.field>. |
| Resume Form Fields | Des champs typés optionnels que le relecteur remplit (texte, nombre, booléen, …). Chacun devient disponible pour les blocs en aval après la reprise. |
| Decision Options | Optionnel. Remplace Approuver / Rejeter par vos propres choix — Go / No go / Reporter, un niveau de gravité — chacun associé à une issue. Voir Options de décision. |
| Approver Notifications | Des notifications optionnelles (par ex. Slack, e-mail) envoyées lorsque le workflow se met en pause. |
| Reviewer Role | Qui peut résoudre la pause — un rôle d'organisation, admin ou member. Rien d'autre n'est accepté : pour nommer des personnes précises, choisissez-les comme approbateurs. Voir Qui sont les relecteurs. |
| Narrow reviewers at runtime | Désactivé par défaut. Une fois activé, un bloc précédent choisit lesquels des approbateurs déclarés sont sollicités. Voir Choisir les relecteurs à l'exécution. |
| Runtime reviewer selection | Affiché lorsque le filtrage est activé. Une référence comme <pick_reviewers.result> vers une sortie en amont qui est une liste d'identifiants d'utilisateurs. |
| Resolution | First claim (un seul relecteur décide), All must approve, ou Quorum (N relecteurs). |
Choisir les relecteurs à l'exécution
Parfois, les bons relecteurs ne sont connus qu'au moment de l'exécution : les experts de la juridiction de ce contrat, ou les responsables du système concerné. Calculez la liste dans un bloc précédent (un bloc Function, un Agent, un appel d'API) et transmettez-la au bloc Humain dans la boucle :
- Déclarez le vivier comme d'habitude : Specific Approvers, ou un Reviewer Role (
adminoumember). C'est l'ensemble le plus large de personnes pouvant examiner cette étape. - Activez Narrow reviewers at runtime.
- Renseignez Runtime reviewer selection avec la sortie en amont, par exemple
<pick_reviewers.result>. La valeur doit être une liste d'identifiants d'utilisateurs, comme["user_123", "user_456"].
Lorsque le bloc se met en pause, seules les personnes sélectionnées sont notifiées, et elles seules peuvent le résoudre.
La sélection peut uniquement restreindre le vivier. Le bloc échoue avec une erreur explicite, et personne n'est notifié, lorsque :
- un utilisateur sélectionné ne fait pas partie du vivier déclaré. Une valeur fournie à l'exécution ne peut jamais ajouter un approbateur que le modèle n'a pas déclaré ;
- la sélection désigne l'utilisateur de l'exécution elle-même ou l'utilisateur qui a démarré l'instance de processus. Une exécution ne peut pas se choisir elle-même comme approbateur ;
- un utilisateur sélectionné n'est pas membre de l'organisation ;
- la sélection est vide ou mal formée : une référence non résolue, un identifiant seul au lieu d'une liste, un objet, ou plus de 50 identifiants. Il n'y a aucun repli sur l'ensemble du vivier ; corrigez plutôt le bloc en amont.
Si l'appartenance à l'organisation ne peut pas être vérifiée à ce moment-là, la mise en pause est réessayée au lieu d'échouer.
Approvals required est plafonné au nombre de personnes réellement sélectionnées : un point de contrôle qui demande trois validations et reçoit deux relecteurs se libère dès que les deux ont approuvé. Il ne reste jamais bloqué.
Chaque sélection et chaque refus sont enregistrés dans le journal d'audit de l'organisation (workflow.hitl.reviewers_selected et workflow.hitl.reviewer_selection_refused). Chaque entrée indique le vivier, les relecteurs choisis et les identités de l'exécution qui ont été exclues. Si la sélection ne peut pas être enregistrée, le bloc ne se met pas en pause.
Les approbateurs déclarés (sans filtrage à l'exécution) sont eux aussi vérifiés comme membres de l'organisation au moment de la pause. Un approbateur nommé qui a quitté l'organisation fait échouer le bloc au lieu de recevoir une revue qu'il ne peut plus ouvrir.
Ce que voit le relecteur
Lorsqu'un relecteur ouvre un workflow en pause, le panneau de revue affiche, dans l'ordre :
Statut — Paused, Queued, Resuming, Resumed ou Rejected.
Avis IA (lorsqu'une intégration LLM est configurée) — une courte synthèse de décision, fondée sur la sortie en pause du workflow, qui résume ce qu'il faut peser. Dépliez Reasoning details pour voir comment l'IA a pesé l'information.
L'avis n'est qu'une aide à la décision — il ne dit jamais « approuver » ou « rejeter », et il ne décide jamais à votre place. C'est vous qui décidez. Il s'appuie sur la sortie en pause exposée par le workflow ; s'il n'y a rien sur quoi s'appuyer, aucun avis n'est affiché.
Question de revue et sortie en pause — la question de l'auteur (ou un résumé d'une ligne) et le tableau de contexte des valeurs du workflow à revoir.
Formulaire de reprise — les champs que l'auteur a demandé au relecteur de remplir.
Approuver ou rejeter — Resume Execution poursuit le workflow ; Reject l'arrête. Lorsque l'auteur a déclaré des options de décision, le panneau affiche à la place un bouton par option, avec une note facultative.
Approuver ou rejeter
- Approuver / Reprendre — le workflow continue là où il s'était arrêté. Les valeurs du formulaire de reprise sont transmises aux blocs en aval.
- Rejeter — la porte refuse. Lorsque le refus tranche la porte (voir ci-dessous), le workflow s'arrête et ne peut pas être poursuivi : le statut devient
Rejectedet le workflow ne reprendra pas. Vous pouvez ajouter une raison facultative, enregistrée avec la décision.
Quand un seul rejet arrête-t-il le workflow ?
Cela dépend de la règle d'approbation, et la réponse est la lecture littérale de la règle choisie :
| Règle d'approbation | Un seul rejet |
|---|---|
| Tous les approbateurs doivent approuver | Arrête le workflow immédiatement. Tout le monde devait approuver, donc un refus est la réponse — les autres approbateurs ne sont pas sollicités sur une question tranchée. |
| Un nombre défini doit approuver (2 ou plus) | Ne l'arrête pas. « 2 sur 5 doivent approuver » n'est pas tranché par un seul refus, donc la porte continue à collecter. Le refus est enregistré et ne compte ni dans les approbations ni dans la libération. |
| Un nombre défini doit approuver = 1 | Arrête le workflow. La première réponse décide, quel que soit son sens. |
Jusqu'à ce changement, un seul rejet arrêtait toutes les portes, y compris un quorum — un panel de cinq personnes pouvait donc être tranché par un seul relecteur en désaccord alors que le décompte enregistré affichait quatre approbations. Si vous voulez qu'un refus soit décisif, choisissez Tous les approbateurs doivent approuver.
Une porte à quorum se ferme aussi lorsque les approbations nécessaires ne peuvent plus arriver. Avec 2 sur 3 requis et deux relecteurs qui rejettent, une approbation est le maximum possible — la porte se résout donc comme rejetée à ce moment-là, plutôt que d'attendre une troisième réponse qui ne peut pas changer le résultat. Le relecteur qui n'avait pas répondu est informé que la revue est close, exactement comme lorsqu'un quorum est atteint tôt.
Le rejet est définitif. Une fois une pause rejetée, cette exécution du workflow est terminée — rouvrir la revue ne permet pas de la reprendre. Si un workflow doit pouvoir continuer sur un autre chemin au lieu de s'arrêter, déclarez une option de décision avec l'issue other et aiguillez sur elle, plutôt que Reject.
Options de décision
Approuver / Rejeter répond à une question fermée. Beaucoup de décisions n'en sont pas une : go, no go ou reporter ; une gravité faible, moyenne ou élevée. Decision Options vous permet de déclarer les choix, et chacun dit comment la porte doit le compter :
| Issue | Comment la porte la compte |
|---|---|
approve | Une validation. Compte pour Approvals required. |
reject | Un refus — exactement comme le bouton Reject, y compris quand il arrête le workflow (voir ci-dessus). |
other | Ni l'un ni l'autre. Ne compte jamais comme validation et n'arrête pas le workflow. |
Chaque option est une ligne à trois colonnes :
| Colonne | Quoi y mettre |
|---|---|
| Value | Ce que voient les blocs en aval. Lettres, chiffres, _ et - uniquement (go, no_go, defer). |
| Label | Le texte du bouton que voit le relecteur. |
| Outcome | approve, reject ou other. |
Déclarez au moins deux options — une seule option n'est pas un choix. Il n'y
a pas de pondération : le vote de chaque relecteur compte une fois. Déployer un
workflow avec une option invalide (une seule option, une valeur incorrecte, une
issue inconnue, un doublon) échoue avec un message qui nomme l'option ; un
bulletin sans option approve est permis mais signalé, car cette porte ne peut
jamais être approuvée. Laissez le tableau vide pour garder Approuver / Rejeter.
Comment une décision à options est libérée
- Approvals required = 1 — le premier vote décide. Un vote
otherlibère la porte avec le verdictundecided, et le workflow continue. - Tous les approbateurs doivent approuver — un vote
rejectla tranche comme un refus, et un voteotherla tranche commeundecided: dans les deux cas, tout le monde n'a pas approuvé. - Un nombre défini doit approuver (2 ou plus) — seuls les votes
approvecomptent pour ce nombre. Lorsque suffisamment de votesrejectetothersont arrivés pour que ce nombre ne puisse plus être atteint, la porte se ferme : comme rejetée si quelqu'un a choisi une optionreject(le workflow s'arrête), sinon comme undecided (le workflow continue).
Aiguillez sur le résultat avec un bloc Condition ou Router : <gate.verdict>
vaut approve, reject ou undecided, et <gate.aggregate.byOption.defer>
est le nombre de relecteurs qui ont choisi Reporter — 0 si personne ne l'a
fait.
Avec des options de décision déclarées, la porte n'accepte qu'un vote pour
l'une d'elles. Une soumission sans option, ou avec une option jamais
déclarée, est refusée (HTTP 400, allowed liste les valeurs) et n'est pas
enregistrée.
Qui sont les relecteurs
Le Reviewer Role est toujours un rôle d'organisation, admin ou member. Il ne peut pas désigner une persona personnalisée d'un flux de processus. Une persona peut être assignée par le workflow en cours d'exécution lui-même : une porte relue par une persona laisserait donc le workflow choisir qui l'approuve. Une porte dont le rôle de relecteur est autre chose est refusée au build et à l'import de l'extension, au déploiement du workflow, et encore à l'exécution de la porte.
Hors d'un flux de processus, les relecteurs sont les membres de ce rôle d'organisation.
Dans un flux de processus, les relecteurs sont résolus dans cet ordre :
- les personnes assignées à une persona du même nom (
adminoumember) sur cette instance du flux de processus ; - sinon, les membres du rôle d'organisation lui-même.
Les administrateurs de l'organisation ne servent pas de repli ici. Les relecteurs sont les personnes autorisées à reprendre le workflow, ce qui est une autorité d'approbation, et seul un titulaire de la persona la donne. Si personne n'est résolu, la pause échoue avec une erreur de configuration au lieu d'attendre une liste de relecteurs vide. Assignez quelqu'un à la persona, puis relancez le workflow.
Les notifications du flux de processus vont plus loin : quand personne ne tient la persona, elles atteignent les administrateurs de l'organisation pour que quelqu'un la pourvoie. Une distribution n'envoie à ces administrateurs qu'un avis de pourvoi, jamais son contenu, et elle est envoyée au titulaire de la persona dès que quelqu'un est assigné. Dans les deux cas, les administrateurs sont informés, et ils ne peuvent pas approuver à la place de la persona.
Quand un relecteur est vérifié
Un rôle de relecteur qui n'est pas un rôle d'organisation est refusé avant l'ouverture de la porte. La vérification s'exécute à chacun de ces moments :
| Quand | Ce qui se passe |
|---|---|
Build de l'extension et extension validate | Un rôle de relecteur autre que admin ou member fait échouer le build (hitl_reviewer_not_org_role), qu'un flux de processus de l'extension déclare ou non une persona de ce nom. |
| Import de l'extension | La même vérification, qui refuse aussi l'import. Une extension construite avant que cette vérification n'existe est refusée tant que sa porte n'est pas corrigée et l'extension reconstruite. |
Déploiement — depuis le canevas, Monitor, une automatisation, une promotion vers un autre environnement, ou POST /api/v1/workflows/{id}/deploy | Une porte incorrecte quel que soit le flux qui l'exécute refuse le déploiement, et l'erreur nomme la porte : un champ du formulaire de reprise au nom réservé, des options de décision sur lesquelles on ne peut pas voter, ou un rôle de relecteur qui n'est pas un rôle d'organisation. Un retour arrière vers une version antérieure n'est jamais refusé : il restaure une version qui s'est déjà exécutée, ses constats reviennent donc comme avertissements (hitlWarnings dans la réponse de l'API). |
| Ouverture d'une instance de flux de processus | La page de l'instance liste les personas relecteurs des portes des workflows qu'elle exécute et que personne ne tient encore. Elle les lit dans les versions déployées de ces workflows, celles qui s'exécutent. |
| Quand la porte se met en pause | Un rôle de relecteur qui n'est pas un rôle d'organisation fait échouer l'exécution, même dans une version déployée avant cette vérification ; personne n'est notifié. Si un rôle d'organisation n'est résolu vers personne, l'exécution échoue aussi. L'erreur nomme la porte, le relecteur et ce que chaque étape de l'ordre ci-dessus a trouvé. |
Un rôle d'organisation est uniquement admin ou member. L'ancien rôle owner ne correspond à personne.
Ouvrir une revue
Les relecteurs reçoivent une notification lorsqu'un workflow se met en pause. Ouvrir la notification vous amène directement au workflow avec le panneau de revue ouvert, où vous pouvez lire le contexte et décider.
Plusieurs relecteurs
Avec All must approve ou Quorum, le workflow reste en pause jusqu'à ce que suffisamment de relecteurs aient répondu. L'avis IA est généré une fois par pause et partagé entre tous les relecteurs — tout le monde voit la même synthèse.
Seuls les relecteurs de la porte comptent pour son seuil. Une personne ayant accès en modification au workflow sans être relecteur — typiquement son propriétaire — peut tout de même répondre ; sa réponse est conservée dans responses, mais elle ne compte pas parmi celles des relecteurs : elle ne vaut pas approbation, n'occupe pas la place d'un relecteur dans un quorum et ne clôt pas à elle seule une porte All must approve. Avec une validation unique (First claim, ou Approvals required = 1), toute réponse autorisée tranche, comme avant.
Quand un quorum se ferme tôt
Une porte Quorum se libère dès que le nombre requis de relecteurs a répondu — c'est tout son intérêt. Les relecteurs qui n'avaient pas encore répondu sont notifiés que la revue est close, pour que personne ne le découvre en essayant de soumettre.
Si une réponse arrive après la fermeture de la porte, elle est enregistrée, pas écartée. Le relecteur est informé que la revue était déjà close et que sa réponse n'a pas changé l'issue, et la réponse est conservée dans l'enregistrement de l'exécution en pause, à côté des réponses qui ont compté. Les réponses tardives ne modifient jamais la décision libérée et ne relancent jamais le workflow.
Si des réponses tardives continuent d'arriver sur une porte, son nombre Approvals required est probablement plus bas que ce que la décision justifie — les réponses tardives sont le signal pour l'augmenter.
Ce que les blocs en aval peuvent lire
Chaque porte libérée porte les mêmes sorties, quelle que soit la règle d'approbation :
| Sortie | Ce que c'est |
|---|---|
verdict | approve, reject ou undecided. À privilégier pour l'aiguillage. |
decision | approved, rejected ou undecided — la même chose sous forme de phrase. |
approved | true / false. Absent lorsque le verdict est undecided. |
responses | La soumission de chaque relecteur, dans l'ordre. |
aggregate.approvedCount · rejectedCount · otherCount · totalResponses | Le décompte des relecteurs. otherCount est le nombre de votes d'issue other. |
aggregate.byOption.<value> | Avec des options de décision : le nombre de votes par option. Chaque option déclarée est présente, y compris celles que personne n'a choisies (0). |
option | Avec des options de décision et Approvals required = 1 : la valeur choisie par le relecteur. |
reason | La raison du refus — uniquement sur une porte qui a refusé. |
responses et aggregate n'apparaissaient auparavant que lorsque plus d'une
validation était requise, donc un design à plusieurs relecteurs réglé sur
Approvals required = 1 ne gardait que la première réponse et perdait
silencieusement les autres. Ils sont désormais toujours présents.
Aiguillez sur verdict ou decision, pas sur approved. approved est
absent sur une porte undecided, et <gate.approved> === false ne
correspond pas à une valeur absente — une Condition écrite ainsi ne
prendra aucune des deux branches.
Noms de champs réservés dans le formulaire de reprise
Ces noms appartiennent à la sortie du bloc et sont écrasés à l'exécution, donc un champ du formulaire de reprise ne doit pas les utiliser :
approved · decision · reason · verdict · responses · aggregate ·
submission · response · url · option
Un champ nommé approved est le cas le plus grave : soumettre la revue écrit
toujours approved: true par-dessus, donc un relecteur qui a choisi « Non »
verrait sa réponse enregistrée comme une approbation. Si vous avez besoin d'un
vote plus riche qu'approuver/rejeter, déclarez des options de
décision — la porte compte alors le vote elle-même, au
lieu d'un champ de formulaire que la règle de libération ne voit pas.