« Quelles sont mes tâches aujourd’hui ? »

Productivity

Quelqu’un, devant son tableau kanban dans Notez, a ouvert le chat IA et tapé cinq mots : quelles sont mes tâches aujourd’hui.

Le chat a répondu par une liste. Ce n’était pas la bonne.

Rien n’avait planté. Aucune erreur ne s’était affichée. L’assistant avait cherché, trouvé quelques notes et les avait présentées avec une assurance totale — et aucune n’était l’une des cartes posées sur le tableau, quelques centimètres plus à gauche. C’est le pire type de bug dans un produit d’IA, parce qu’il ressemble exactement à une réponse.

Trois choses qui manquaient à l’assistant

Face à une mauvaise réponse, on est tenté d’accuser le prompt : ajouter une ligne qui demande au modèle de faire plus d’efforts, livrer, espérer. J’ai commencé par là, sans résultat, parce que le problème n’était pas la formulation. Il manquait trois pièces, et aucun réglage du prompt ne crée une pièce absente.

Il ne voyait pas l’écran. La requête qui arrivait au modèle contenait la question et rien d’autre. Ni la vue ouverte, ni le tableau, ni le filtre d’étiquette qui réduisait la liste, ni la note ouverte dans le panneau latéral. Une personne assise à côté de vous peut jeter un œil à votre écran. Le modèle répondait les yeux fermés, sans pouvoir le signaler.

Il ne savait pas ce qu’est une tâche. Notez n’a volontairement aucune entité « tâche ». Pas de type Tâche, pas de champ d’échéance, pas de colonne de cases à cocher que l’application traiterait à part. Il y a un tableau, et ses cartes sont ce que les gens appellent « mes tâches ». Personne ne l’avait dit au modèle. Interrogé sur les tâches, il a fait la seule chose possible : chercher le mot tâche par mots-clés.

Il n’avait aucun outil pour lire un tableau. C’est ce manque qui rendait les deux autres impossibles à corriger. Même un modèle qui aurait su exactement ce que vous vouliez dire et quel tableau vous regardiez n’avait aucun moyen de le récupérer. Il y avait un outil pour lister les notes et un autre pour les filtrer par étiquette, et un tableau n’est ni l’un ni l’autre : c’est un ensemble de colonnes, chacune avec une suite ordonnée de cartes. On ne répond pas à une question sur un tableau avec une fonction de liste.

Dire au modèle où vous êtes

La correction commence dans le navigateur. Chaque message est désormais accompagné d’une courte description de l’écran sur lequel il a été tapé : le mode d’affichage, le tableau ouvert, si vous êtes dans la corbeille, le texte de recherche et les filtres d’étiquettes appliqués, la note ouverte et les cartes sélectionnées.

Cette description entre dans le prompt sous forme de phrases simples que le modèle peut citer. Pas d’embeddings, pas d’état caché, pas de déduction sur ce que vous vouliez probablement dire. Si l’assistant sait que vous êtes sur un tableau, c’est parce que le tableau le lui a dit.

Deux détails m’ont demandé plus de réflexion que prévu.

Le premier : une note peut être ouverte par-dessus une liste. Notez ouvre les notes dans un panneau latéral, donc le tableau de bord derrière reste monté et continue de décrire son propre écran. Les deux composants veulent décrire le contexte, et un seul est celui que vous regardez. Le panneau l’emporte, parce qu’il est au-dessus.

Le second : les gens doivent pouvoir le voir. Sous la conversation, une rangée de pastilles — Vue tableau, Cette note, Sélection : 3 — indique précisément ce que l’assistant voit. Un assistant au contexte invisible, il faut le tester à tâtons avant de lui faire confiance. Avec les pastilles, il suffit de lire.

Définir une tâche, par écrit

Le modèle dispose maintenant d’une définition qu’il n’avait pas :

Il n’existe pas d’entité tâche ou to-do à part. Quand l’utilisateur parle de tâches, de choses à faire, de ce sur quoi travailler ou de ce qui est en cours, il veut dire les cartes du tableau qu’il regarde — ou le tableau de l’espace de travail quand aucun n’est à l’écran. Les colonnes dont le nom signifie « fini » (Done, Completed, Archived et similaires) ne sont pas en attente.

Cette dernière phrase pèse plus lourd que tout le reste. Sans elle, « quelles sont mes tâches aujourd’hui » renvoie tout le tableau, y compris la colonne de ce que vous avez fini la semaine dernière : une réponse complète sur le papier et inutile en pratique.

La même définition est envoyée aux clients MCP. Si Notez est connecté à Claude Code ou à Cursor, votre assistant y lit exactement le même texte.

Un outil qui lit un tableau

get_board renvoie un tableau avec ses cartes regroupées par colonne, et un total pour chaque colonne. Il fonctionne sur le tableau de l’espace de travail comme sur le tableau propre à n’importe quelle note. Demandez « qu’est-ce qui est en cours » : c’est un seul appel, pas une recherche suivie de cinq lectures de notes.

J’ai aussi fusionné deux outils en un. filter_notes a disparu, absorbé par list_notes, qui accepte maintenant les colonnes de tableau, les valeurs de propriétés personnalisées et des plages de dates de création ou de modification, en plus des filtres qu’il avait déjà. Tous les filtres se combinent par un ET logique, donc une question comme « les notes étiquetées travail, modifiées cette semaine, hors de Done » tient en un seul appel au lieu d’une boucle où l’on récupère puis trie. Et chaque note d’un résultat porte désormais ses étiquettes, sa colonne, ses valeurs de propriétés et ses dates : l’assistant n’ouvre plus une note juste pour lire un champ.

Mieux vaut moins d’outils, mais plus complets, que beaucoup d’outils limités. Chaque outil de plus est une occasion de plus pour le modèle de choisir le mauvais.

Le bug que j’ai écrit en corrigeant le bug

Qui dit filtres de date dit que quelqu’un doit décider ce que signifie « aujourd’hui », et la réponse honnête est que cela dépend de l’endroit où vous êtes. Le navigateur envoie donc son fuseau horaire, et le serveur calcule la plage dans ce fuseau.

La première version de ce code était fausse d’une manière très difficile à remarquer. La bibliothèque que j’utilisais pour construire une date liée à un fuseau garde son décalage à la sérialisation — or les colonnes d’horodatage des notes sont en timestamp without time zone, ce qui veut dire que Postgres aurait discrètement ignoré ce décalage et déplacé chaque plage du nombre d’heures qui vous sépare d’UTC. Tout utilisateur hors d’UTC aurait reçu des réponses légèrement fausses à « qu’ai-je créé aujourd’hui », sans que rien ne signale d’erreur.

Le test correspondant est passé au rouge avant de passer au vert, et c’est la seule raison pour laquelle j’y crois. Puis j’ai revérifié sur une vraie base de données : une note créée à 22:00 UTC — une heure du matin en heure locale — compte toujours pour aujourd’hui, exactement comme il faut.

Les clients MCP reçoivent l’heure UTC, parce qu’il n’y a pas de navigateur à interroger. Cette limite est écrite dans la description de l’outil au lieu d’être cachée, donc l’assistant qui la lit sait ce qu’il reçoit.

Deux interfaces, un seul jeu d’outils

Notez offre deux façons d’atteindre vos notes avec un assistant : le chat dans l’application, et le serveur MCP auquel votre propre éditeur se connecte. Ils partagent 29 outils, et le serveur MCP en ajoute trois : deux pour importer des fichiers, qui ont besoin d’un shell, et un qui liste vos espaces de travail quand la connexion passe par votre compte Notez. Les outils partagés ne sont pas « semblables » : ils ont les mêmes noms, les mêmes arguments, les mêmes champs obligatoires, et un test fait échouer le build si les deux listes divergent.

Ce test existe parce qu’elles ont déjà divergé une fois. Six outils sont restés des mois dans le seul chat, et personne ne l’a remarqué, parce que rien ne comparait les deux. Une parité qu’il faut penser à maintenir finit par se perdre.

Ce qu’il répond maintenant

Les cinq mêmes mots, sur le même tableau :

To Do : Corriger le bug de connexion, Rédiger les notes de version In Progress : Relire la PR 42

J’ai laissé de côté Done, parce que c’est terminé : Planifier la feuille de route du T4.

Un seul appel d’outil. La bonne liste. Et une phrase qui explique ce qu’il a volontairement laissé de côté — ce qui, pour un assistant qui a passé des mois à répondre avec assurance à la mauvaise question, est peut-être le plus important.

À lire aussi