Second Brain documentation

ADR 0042 – Capture en une ligne : dates en français, #tags et marques déclarées dans config/captures

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

← Toutes les décisions

ADR 0042 – Capture en une ligne : dates en français, #tags et marques déclarées dans config/captures

Statut : Accepté (2026-10-16, mode autonome)

Tâche lancée par le fil coordinateur (vague 2 du document d’idées, en attendant l’arbitrage d’Aurélien sur la suite) : taper « Appeler le plombier demain #maison +Rénovation » dans « + Capturer » ou Ctrl+K crée la tâche complète (dates françaises, #tag, +projet, !priorité, @contexte), avec un aperçu des champs reconnus avant de valider ; règles en configuration si l’approche YAML s’y prête.

Contexte

La capture (ADR 0014) crée un nœud de l’inbox à partir d’un titre seul. Le classement se fait ensuite (« Classer comme… »). Pour une tâche simple, c’est deux gestes de trop. Le moteur ne doit connaître ni les tâches ni les projets : l’aspect tache, ses champs et les valeurs de priorité ou de contexte sont dans config/.

Décision

Syntaxe déclarée : config/captures/<nom>.yaml

name: tache
label: Tâche
default: true                 # syntaxe utilisée par la capture (la première par nom si plusieurs)
type: tache                   # type donné quand une date ou une marque est reconnue
date: tache.echeance          # champ date qui reçoit la date reconnue
markers:
  - { prefix: "+", field: tache.projet }                               # champ référence
  - { prefix: "!", field: tache.priorite, aliases: { "!": haute, h: haute } }   # énumération
  - { prefix: "@", field: tache.contexte, aliases: { tel: telephone } }
  • Nouveau type de définition, chargé comme les autres (méta-schéma capture.schema.json, santé de la configuration, version précédente gardée si le fichier devient invalide).
  • Contrôles : type connu ; date sur un champ date d’aspect ; + sur un champ référence (format: node-ref), ! et @ sur un champ à énumération ; alias vers des valeurs admises ; chaque préfixe une fois. # est réservé aux tags et refusé comme préfixe.

Interprétation (serveur)

POST /api/capture/preview (aperçu, rien n’est écrit) et POST /api/capture (création) prennent { text, zone }. Une seule implémentation, côté serveur : l’aperçu montre exactement ce que la création fera, et la recherche du projet se fait en base.

  • Date (première expression seulement) : « aujourd’hui », « demain », « après-demain », un jour de la semaine (le prochain, jamais aujourd’hui ; « prochain » accepté), « la semaine prochaine » (lundi), « dans N jours / semaines / mois », « 22/10 », « 22/10/2026 », « 22 octobre », « 1er novembre 2026 » ; un « le » placé devant est absorbé ; une date sans année déjà passée désigne l’année suivante. « Aujourd’hui » est celui du fuseau zone du navigateur.
  • #tag : forme canonique des tags (ADR 0006), tag saisi du nœud. Reconnu même sans syntaxe de capture.
  • +texte ou +"texte avec espaces" : nœud admis par le champ référence (x-target), hors corbeille, dont le titre est identique (accents, casse, tirets et soulignés ignorés), sinon le seul dont le titre commence par le texte. Aucun ou plusieurs : avertissement (« Projet ambigu : « Cuisine » désigne Cuisine neuve, Cuisine d’été ; précisez »).
  • !texte / @texte : valeur de l’énumération, alias, puis seul début de valeur ; sinon avertissement listant les valeurs.
  • Ce qui est reconnu sort du titre ; ce qui ne l’est pas y reste. Une deuxième marque pour un même champ reste dans le titre, avec un avertissement.
  • Résultat : si une date ou une marque est reconnue, le nœud prend le type de la syntaxe, les champs reconnus et n’entre pas dans l’inbox (il est déjà classé). Sinon, c’est la capture de l’ADR 0014 : un nœud sans type dans l’inbox, avec ses tags. Un titre vide (« demain !haute » seul) est refusé (400 errors.text).
  • La création passe par NodeService.create : aspects obligatoires du type, valeurs par défaut (statut « à faire »), validation, journal, tout est inchangé.

Front

  • « + Capturer », le champ de capture de l’accueil et la palette Ctrl+K interrogent l’aperçu à la frappe (après une courte pause, la réponse obsolète annulée) et montrent sous le champ : type, titre, puces des champs reconnus (« Échéance : vendredi 16 octobre 2026 », « Projet : Rénovation chambre », « #maison »), avertissements. Sans rien de reconnu : « Inbox » et le titre.
  • Entrée crée le nœud ; l’annonce dit « Tâche « Appeler le plombier » créée » ou « … ajouté à l’inbox ».
  • Une aide courte rappelle la syntaxe (demain #tag +projet !priorité @contexte).

Alternatives écartées

  • Analyse dans le navigateur : aperçu instantané, mais deux implémentations à garder d’accord, et la recherche du projet demanderait de charger tous les projets. Le serveur répond en quelques millisecondes à l’aperçu.
  • Bibliothèque de dates en langage naturel (Natty, chrono-node) : anglaises pour l’essentiel, lourdes, et une liste fermée de formes françaises suffit.
  • Syntaxe codée en dur : contredit la règle « le domaine vit dans config/ ».
  • Création dans l’inbox même quand tout est reconnu : obligerait à reclasser une tâche déjà complète.

Conséquences

  • La capture devient le moyen le plus court de créer une tâche ; le comportement sans marque ne change pas.
  • Les heures (« à 14 h ») et les récurrences ne sont pas reconnues (reportées).
  • Un mot qui ressemble à une date (« Version 2/3 ») est pris comme date ; l’aperçu le montre avant validation, et l’on reformule (« Version 2 sur 3 »).