Second Brain documentation

ADR 0027 – Dépendances « bloqué par » : liens bloquants et états finaux

Accepté (2026-10-15, mode autonome)

← Toutes les décisions

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} : blockedBy liste les dépendances non terminées (id, titre, type, état), triées par titre.
  • GET /api/nodes/tree : chaque ligne a blocked.

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-soft avec 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-par codé en dur : le moteur ne connaît que la clé blocking. Le nom, les libellés et les contraintes vivent dans config/.

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).