ADR 0059 – « Ajouter à… » et détection de doublon à la capture
Accepté (2026-10-16, mode autonome)
ADR 0059 – « Ajouter à… » et détection de doublon à la capture
Statut : Accepté (2026-10-16, mode autonome)
Item 28 du jalon 3 (vague 2 du document d’idées). Deux gestes autour de la capture (ADR 0014, 0042) :
- une ligne capturée peut aller à la fin d’un nœud existant (un journal, une liste, une note de réunion) au lieu de créer un nœud ;
- la capture signale qu’un nœud porte déjà le titre tapé, avant d’en créer un second.
Contexte
- « + Capturer », le champ de l’accueil et la palette Ctrl+K créent un nœud par ligne ; l’aperçu de l’ADR 0042 est calculé par le serveur à la frappe.
- Le titre d’un nœud a déjà une clé de comparaison : celle des liens wiki (
title_key, ADR 0009), qui ignore casse et espaces. - Une modification du corps passe par
NodeService.update, avec ses verrous (index wiki, puis ligne du nœud), ses contrôles (liens wiki, #tags du corps) et son journal (node.updated, corps avant et après).
Décision
Doublons possibles
- L’aperçu de capture gagne
sameTitle: au plus 3 nœuds hors corbeille dont la clé de titre (WikiLinks.key) est celle du titre aperçu (la ligne sans les marques reconnues), du plus récemment modifié au plus ancien. Une requête indexée par aperçu. - Affichage :
- sous le champ de capture : « Existe déjà : Titre », en lien vers le nœud (un clic l’ouvre et vide le champ) ;
- dans la palette : le même signal, en texte. Le nœud existant figure de toute façon dans les résultats juste en dessous.
- Pas de blocage : Entrée crée toujours. Deux nœuds au même titre sont permis, comme avant (ADR 0009) ; l’aperçu ne fait que prévenir.
« Ajouter à… »
- Serveur :
POST /api/nodes/{id}/append { text }ajoute la ligne, sans ses blancs de bord, comme un paragraphe à la fin du corps : séparée par une ligne vide, ou seule si le corps est vide.- La lecture du corps et l’écriture se font sous les verrous de
update(index wiki puis ligne du nœud) : deux ajouts simultanés ne se perdent pas. - L’écriture passe par
updatelui-même : mêmes contrôles et même journal qu’une édition (node.updated, corps avant et après). Les#tagset[[liens]]de la ligne sont indexés. - Un texte vide (espaces insécables compris) est refusé (400
errors.text), comme un corps qui dépasserait sa longueur maximale après l’ajout ; un nœud inconnu ou en corbeille aussi (404).
- La lecture du corps et l’écriture se font sous les verrous de
- Front : un dialogue chargé à la demande cherche le nœud par son titre (motif combobox/listbox de la palette) ; Entrée ajoute. Il est ouvert :
- par le bouton « Ajouter à… » de la capture rapide (« + Capturer », accueil), actif dès qu’une ligne est tapée ;
- par l’entrée « Ajouter « … » à un nœud… » de la palette, placée juste après « Capturer » : Entrée crée toujours (ADR 0014), ↓ puis Entrée ajoute.
- Après l’ajout : la notification « Ajouté à « Titre » » propose « Ouvrir ». La ligne est envoyée telle qu’elle a été tapée : les marques de capture (
demain,+projet) n’y sont pas interprétées, ce n’est plus une tâche à créer.
Alternatives écartées
- Ajouter par
PATCHdepuis le navigateur (lire le corps, concaténer, réécrire) : un ajout fait entre la lecture et l’écriture serait perdu, et le corps entier ferait l’aller-retour. - Bloquer la capture d’un titre existant : on capture souvent deux choses distinctes au même titre (« Appeler le plombier » une seconde fois) ; un avertissement suffit.
- Rapprochement approché (titres voisins) : trop de faux doublons à la frappe. La clé des liens wiki dit déjà ce qu’est « le même titre » dans l’application.
Conséquences
- « Ajouter à… » n’a pas de « Annuler » (ADR 0049) : l’API des lots ne sait pas défaire un ajout de texte. Le corps d’avant reste dans l’historique du nœud ; on retire la ligne dans l’éditeur.
- L’aperçu fait une requête de plus par frappe (après la pause de 200 ms), sur l’index de
title_key. - Un titre qui ne se distingue que par les accents n’est pas signalé : la clé des liens wiki y est sensible (ADR 0009).
- Un corps ancien qui viole déjà les règles du contenu (trop de liens ou de tags, toléré à la lecture) refuse l’ajout avec le message de
body, comme un enregistrement. - Un corps qui finit dans un bloc de code non fermé reçoit la ligne dans ce bloc : l’ajout ne réécrit pas le Markdown existant.