Notes de version AgentDoc â Avril 2026
Une sĂ©rie courte et dense de corrections a Ă©tĂ© livrĂ©e dans AgentDoc (aussi connu sous le nom de agent doc, agentdocs, docedit) au cours du dernier sprint. Le thĂšme de cette fois est la justesse du moteur de rendu : des cas limites oĂč la sortie d'outil de l'agent Ă©tait techniquement valide mais oĂč la couche visuelle perdait des informations ou, pire encore, fabriquait des styles que l'agent n'avait pas rĂ©ellement demandĂ©s. Cinq correctifs, tous ciblĂ©s, sans modification de l'API.
1. Listes imbriquées : profondeur relative préservée pendant la normalisation
c62928c · fix(renderer): preserve relative depth in nested-list normalization
Lorsque l'agent émettait des listes ordonnées/non ordonnées imbriquées avec une indentation mixte, la passe de
normalisation du moteur de rendu rĂ©duisait les profondeurs au niveau minimum prĂ©sent dans le markdown â ce qui
signifiait qu'une liste de la forme 1. â 1.1. â 1.1.1. s'affichait
comme trois Ă©lĂ©ments du mĂȘme niveau plutĂŽt que comme une arborescence. Le correctif fait passer le normaliseur du
plancher absolu au décalage relatif : les différences de profondeur au sein du bloc sont
préservées, seule l'indentation globale est normalisée.
Pourquoi cela compte pour les agents : de nombreux modÚles émettent des appels insert_text dont le contenu a
été reformaté au niveau du LLM (par exemple un modÚle ayant appris l'indentation à 2 espaces alors que le
document utilise 4 espaces). Le moteur de rendu doit respecter la structure, et non les espaces bruts.
2. Les classes de décoration se composent désormais au lieu de se remplacer
ddfb64a · fix(formatting): decoration-* classes compose instead of replacing
Auparavant, appeler apply_decoration(target, "decoration-underline") sur un span
qui portait déjà decoration-strikethrough écrasait la classe existante.
C'est la mauvaise sémantique : les décorations sont orthogonales (vous pouvez souligner et barrer
le mĂȘme token), et notre docstring promettait exactement cela. Le bug provenait d'une unique
affectation className = dans le setter de décoration, que nous avons remplacée par une gestion appropriée de
classList qui ajoute sans supprimer les frĂšres de la mĂȘme famille.
3. Les outils apply_* ont désormais une sémantique TOGGLE correcte
8201f0a · fix(content_ops): implement TOGGLE on apply_* tools (matches docstrings)
La surface d'outils MCP annonçait un comportement de bascule sur apply_bold,
apply_italic, apply_underline, etc. â ce qui signifie qu'un second appel sur
la mĂȘme sĂ©lection devait retirer la mise en forme, et non l'appliquer en double. L'implĂ©mentation,
cependant, était toujours en mode activation. Le correctif introduit une vérification d'état sur le span résolu et
se ramifie : si la mise en forme est déjà présente et couvre entiÚrement la sélection, elle est
retirée ; si elle est absente ou partielle, elle est appliquée uniformément.
Cela compte plus qu'il n'y paraßt. Les flux vocaux s'appuient fortement sur « en fait, annule ça »
comme signal de répétition ; l'agent qui traduit cela en un second appel apply_bold fait désormais
ce qu'il faut sans avoir besoin d'appeler un outil remove_format distinct.
Nous avons supprimé deux allers-retours LLM d'un chemin courant.
4. Ăchappement du code en ligne Ă l'intĂ©rieur des attributs [text]{.class}
1e32d70 · fix(renderer): rewrite [text]{.class} swallowed inside inline-code
La pré-passe du moteur de rendu pour notre syntaxe d'attributs étendue s'exécutait avant
l'étape markdown-vers-HTML, ce qui signifiait que des chaßnes comme `[text]{.foo}` apparaissant
à l'intérieur de code en ligne délimité par des backticks (c'est-à -dire la documentation littérale de la syntaxe)
Ă©taient réécrites en spans stylisĂ©s au lieu d'ĂȘtre affichĂ©es comme du code.
Nous ignorons désormais la réécriture lorsque l'offset se trouve à l'intérieur d'un span de code. Les pages de documentation
â y compris celle-ci â s'affichent Ă nouveau correctement.
5. Les classes decoration-* s'appliquent à n'importe quel élément
a05b44c · fix(frontend): style decoration-* classes on any element, not just span
Les rĂšgles CSS pour .decoration-underline, .decoration-strikethrough
etc. étaient cantonnées à span.decoration-*. Cela fonctionnait pour le cas courant mais
échouait lorsque l'agent appliquait une décoration à un titre, un élément de liste ou une cellule de tableau. Le
correctif retire le qualificateur de nom d'élément, de sorte que les décorations sont désormais orthogonales au type d'élément
â cohĂ©rent avec le correctif de sĂ©mantique de bascule ci-dessus et avec la documentation.
La suite
Le prochain lot de travaux est en file d'attente autour des flux BYOK (apportez votre propre clé API Gemini),
ce qui nĂ©cessite d'apprendre Ă la fenĂȘtre modale du frontend et Ă la pastille d'Ă©tat du quota Ă coexister avec
les nouveaux modules byok_modal.js et quota_status.js. Ensuite, nous effectuerons
une passe ciblée sur le routeur de chat, qui a accumulé des branches.
Si vous souhaitez comprendre le raisonnement technique derriĂšre les dĂ©cisions de conception d'outils Ă©voquĂ©es ci-dessus, l' article sur la granularitĂ© des outils prĂ©sente le cadre que nous utilisons pour dĂ©cider si un comportement doit ĂȘtre un outil, un argument d'outil, ou poussĂ© dans la couche de raisonnement du LLM.