ADR 0090 – Devinettes de capture sans marque
Accepté (2026-10-17, fil B du jalon 4, cadre : ADR 0086)
ADR 0090 – Devinettes de capture sans marque
Statut : Accepté (2026-10-17, fil B du jalon 4, cadre : ADR 0086)
Une capture sans @ # + (« Appeler le plombier pour la rénovation, urgent ») entre dans l’Inbox sans rien de reconnu. Cet ADR ajoute l’étage 1 de l’assistant : des devinettes déclarées en YAML, visibles comme telles et jamais écrites sans acceptation.
Décision
Déclaration. config/captures/<syntaxe>.yaml gagne la clé guess (méta-schéma capture.schema.json, contrôles dans DefinitionLoader.checkGuess) :
minConfidence(0,6) : en dessous, une règle n’est pas proposée ;autoAccept(0,85, au moinsminConfidence) : seuil des « sûrs » pour l’Inbox (ligne B3).rules[]:words(mots ou expressions, accents et casse ignorés, mots entiers),set(champ d’aspect → valeur d’une énumération, champ et valeur vérifiés au chargement),confidence(0,75 par défaut). À confiance égale la première règle du fichier gagne ; par champ, la règle la plus confiante gagne.project: { nearest, field, minScore }: projet dont la plus grande part des mots significatifs (3 lettres au moins, hors mots de liaison, singulier approché) figure dans le titre ;fieldpar défaut = champ de la marque+. Un ex æquo ne désigne aucun projet. La confiance est le score ; seulminScore(0,5) sert de seuil au projet.
Calcul. assist/CaptureGuesser est une fonction pure (règles, titre restant, champs déjà saisis, candidats chargés à la demande). Un champ saisi (date, marque) n’est jamais deviné. Le titre n’est pas modifié : les mots devinés y restent.
API. POST /api/capture/preview renvoie en plus guesses[] ; chaque CaptureItem porte origin (typed | guessed, puis learned et similar aux lignes B4 et B5) et confidence (valeurs devinées). Les valeurs saisies sont inchangées dans items. POST /api/capture accepte accepted: [{field, value}] : le serveur recalcule les devinettes et n’écrit que les couples champ et valeur qu’il retrouve à l’identique (400 sinon : le texte a pu changer depuis que l’utilisateur a vu la valeur) en plus des valeurs saisies ; accepter une valeur type le nœud et le sort de l’Inbox comme une marque. Sans acceptation, rien de deviné n’est écrit. Les suggestions gardées dans l’Inbox viennent avec la ligne B3.
« Projet le plus proche ». Quand +Projet ne se résout pas, le mot de la marque reste dans le titre et sert à la devinette : le projet le plus proche est proposé sur le même champ, en plus de l’avertissement (ex æquo ou aucun mot commun : rien).
Alternatives écartées
- Écrire les valeurs devinées et les marquer : contraire au principe « l’assistant suggère » (ADR 0086), et une mauvaise devinette polluerait les vues.
- Faire confiance aux valeurs renvoyées par le client : le serveur recalcule, la valeur écrite ne dépend que de la configuration et du titre.
- Mots-clés dans le code : le domaine vit dans
config/.
Limites connues
- Les mots sont comparés entiers : « appelle » ne déclenche pas la règle « appeler » ; l’auteur de la règle liste les formes utiles.
- Une seule valeur par champ ; pas de devinette de date ni de type (le type d’un nœud accepté est celui de la syntaxe).
- Les candidats « projet » sont les 500 premiers du champ référence, comme pour la marque
+. - Interface (puces, Tab, sélecteurs) : ligne B2 ; apprentissage des corrections : B4 ; sens des mots (plongements) : B5.