ADR 0027 – Dépendances « bloqué par » : liens bloquants et états finaux
Accepté (2026-10-15, mode autonome)
ADR 0027 – Dépendances « bloqué par » : liens bloquants et états finaux
Statut : Accepté (2026-10-15, mode autonome)
Décisions prises en mode autonome (Aurélien, 2026-10-15 : options les plus simples, sûres et réversibles).
Décision
Format : blocking: true sur un type de lien
name: bloque-par
label: Bloquée par
inverseLabel: Bloque
blocking: true
source: { aspects: [tache] }
target: { aspects: [tache] }
La source d’un lien bloquant est bloquée tant qu’au moins une de ses cibles hors corbeille a un état de workflow non final. L’état se lit comme dans l’ADR 0024 ; « final » vient de l’ADR 0026. Ne bloquent pas :
- une cible sans état ;
- une cible dont le workflow ne déclare aucun état
final, faute de savoir quand lever le blocage (Workflows.blocks).
Une source elle-même dans un état final (tâche faite ou abandonnée) n’est pas signalée comme bloquée, même si une dépendance reste ouverte. Les liens se créent comme les autres, depuis la section « Liens sortants » du panneau de contexte, avec leurs contraintes source et target.
Calcul à la lecture
GET /api/nodes/{id}:blockedByliste les dépendances non terminées (id, titre, type, état), triées par titre.GET /api/nodes/tree: chaque ligne ablocked.
Une seule requête SQL suffit par appel. Elle joint node_link, le nœud cible (hors corbeille) et l’état de la cible, en n’extrayant que le champ d’état du JSONB. La sous-requête d’état est restreinte aux cibles des liens demandés, car PostgreSQL ne fait pas descendre la jointure dans un DISTINCT ON. L’ordre des aspects est en collation C, comme le TreeMap de Workflows.statusOf. Java ne fait que le test final.
Interface
- Fiche : un bandeau « Bloqué · en attente de
(état), … », sur fond --sb-warn-softavec une icône d’avertissement. Le texte reste dans la couleur du texte, pour le contraste. Chaque dépendance est un lien. - Arbre : la méta devient « bloqué · <état> ·
». - Rafraîchissement : ajouter ou retirer un lien dans le panneau de contexte fait relire les dépendances de la fiche (saisie en cours conservée) et l’arbre (
NodeContext.linksVersion). Une dépendance terminée ailleurs est prise en compte à l’enregistrement suivant ou au retour sur la fiche.
Alternatives écartées
- Interdire certaines transitions tant que la tâche est bloquée (par exemple passer à
en-cours) : utile, mais c’est une règle. Les règles déclaratives relèvent du jalon 3. Ici, l’information suffit. - Lien
bloque-parcodé en dur : le moteur ne connaît que la cléblocking. Le nom, les libellés et les contraintes vivent dansconfig/.
Conséquences
- Une dépendance mise à la corbeille cesse de bloquer.
- Le blocage n’est pas transitif : A bloquée par B, elle-même bloquée par C, ne remonte que l’état de B.
- La revue hebdomadaire et les vues pourront filtrer les tâches bloquées (jalon 2, moteur de vues).
Amendement (ADR 0040) : le champ
blocked, même règle, est disponible dans les vues (where,styles, tri, colonnes).