<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>changeloop blog</title><description>Les release notes en pratique, et le changelog comme artefact de build.</description><link>https://changeloop.dev/</link><language>fr-FR</language><item><title>Release notes de correctifs : écrire des entrées utiles</title><link>https://changeloop.dev/blog/fr/bug-fix-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/bug-fix-release-notes/</guid><description>Les release notes de correctifs marchent si chaque entrée nomme le symptôme, les personnes touchées et la suite. Réécritures, sécurité et perte de données.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;De bonnes release notes de correctifs décrivent ce que l&amp;#39;utilisateur a vu mal tourner, pas ce que le code a mal fait. Chaque entrée dit qui était concerné, depuis quand, si la correction est complète et si le lecteur doit faire quelque chose, même si c&amp;#39;est seulement &amp;quot;aucune action requise&amp;quot;.&lt;/p&gt;
&lt;p&gt;La plupart des équipes recopient une ligne du message de commit. Le tableau montre six réécritures, et les sections qui suivent expliquent les règles.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Avant (le message de commit)&lt;/th&gt;
&lt;th&gt;Après (le symptôme)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Fixed null pointer in export handler&lt;/td&gt;
&lt;td&gt;Les exports n&amp;#39;échouent plus avec &amp;quot;Une erreur est survenue&amp;quot; quand un projet n&amp;#39;a aucun tag. Relancez tout export qui a échoué depuis le 3 septembre.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolved race condition in sync worker&lt;/td&gt;
&lt;td&gt;Les modifications faites sur deux appareils à quelques secondes d&amp;#39;écart ne s&amp;#39;écrasent plus. Rien à faire.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fix timezone bug&lt;/td&gt;
&lt;td&gt;Les rapports planifiés s&amp;#39;exécutent maintenant à l&amp;#39;heure choisie. Les comptes à l&amp;#39;est de UTC voyaient des rapports partir jusqu&amp;#39;à un jour trop tôt depuis le 12 août. Aucun changement nécessaire.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Patched XSS in comment renderer&lt;/td&gt;
&lt;td&gt;Correctif de sécurité : un commentaire spécialement conçu pouvait exécuter un script dans le navigateur d&amp;#39;un autre utilisateur. Passez en 4.2.1 aujourd&amp;#39;hui. Nos logs ne montrent aucune exploitation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed regression from 4.1.0&lt;/td&gt;
&lt;td&gt;La recherche fonctionne de nouveau pour les requêtes contenant un tiret. Elle était cassée en 4.1.0 et corrigée en 4.1.1.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bug fixes and performance improvements&lt;/td&gt;
&lt;td&gt;Dites lesquels. Voir la dernière section.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Comment rédiger une entrée de correctif dans des release notes ?&lt;/h2&gt;
&lt;p&gt;Commencez par le symptôme dans les mots de l&amp;#39;utilisateur, puis qui était touché et depuis quand, puis l&amp;#39;état de la correction, puis l&amp;#39;action. Une ou deux phrases suffisent d&amp;#39;ordinaire. La cause dans le code a sa place dans la pull request, là où un ingénieur ira la chercher.&lt;/p&gt;
&lt;p&gt;Un lecteur cherche une seule chose : &amp;quot;est-ce que c&amp;#39;était moi ?&amp;quot; Quatre éléments couvrent presque toutes les entrées :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Le symptôme.&lt;/strong&gt; Ce qui est apparu à l&amp;#39;écran, dans la réponse de l&amp;#39;API ou sur la facture. Citez le texte de l&amp;#39;erreur s&amp;#39;il y en avait un, car les gens le recherchent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La portée.&lt;/strong&gt; Quel plan, quelle plateforme, quelle version d&amp;#39;API ou forme de données. &amp;quot;Les comptes de plus de 50 000 lignes&amp;quot; se vérifie. &amp;quot;Certains utilisateurs&amp;quot; non.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La période.&lt;/strong&gt; Depuis quelle version ou quelle date, pour qu&amp;#39;un lecteur puisse décider si le résultat bizarre d&amp;#39;hier était ce bug.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L&amp;#39;action.&lt;/strong&gt; Relancer, resynchroniser, mettre à jour, retirer un contournement, ou rien du tout.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Si des utilisateurs ont mis en place un contournement, c&amp;#39;est la ligne d&amp;#39;action qui leur dit qu&amp;#39;ils peuvent le supprimer.&lt;/p&gt;
&lt;h2&gt;Quelle différence entre une release note et un changelog ?&lt;/h2&gt;
&lt;p&gt;Un changelog est le registre complet et continu des changements. Les release notes sont un message choisi et réécrit sur une version, pour des gens qui se demandent si cela les concerne. Pour les correctifs, le changelog liste chaque correction et les notes mettent en tête celles qu&amp;#39;un lecteur pouvait remarquer.&lt;/p&gt;
&lt;p&gt;Une coquille dans une infobulle va seulement dans le changelog. Un mauvais taux de TVA sur les factures va dans les deux. La répartition complète est dans &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-vs-release-notes/&quot;&gt;changelog vs release notes&lt;/a&gt;, et la forme d&amp;#39;un bon ensemble de notes dans &lt;a href=&quot;https://changeloop.dev/blog/fr/how-to-write-release-notes/&quot;&gt;comment écrire des release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt; est une convention pratique pour le côté registre. Elle réserve &amp;quot;Fixed&amp;quot; aux corrections de bugs et une rubrique &amp;quot;Security&amp;quot; séparée aux vulnérabilités, soit la même séparation que fait cet article pour le lecteur.&lt;/p&gt;
&lt;h2&gt;Un correctif est-il une mise à jour ?&lt;/h2&gt;
&lt;p&gt;Oui. Un correctif modifie le produit, donc en livrer un est une mise à jour. Avec le &lt;a href=&quot;https://semver.org/&quot;&gt;versionnage sémantique&lt;/a&gt;, un correctif rétrocompatible est une version patch, par exemple de 4.2.0 à 4.2.1.&lt;/p&gt;
&lt;p&gt;Savoir si le lecteur doit faire quelque chose est une autre question, et la note doit y répondre. Un correctif qui change ce qu&amp;#39;observe un appelant correct est proche d&amp;#39;un changement cassant, et les &lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;changements cassants&lt;/a&gt; expliquent où se situe cette limite.&lt;/p&gt;
&lt;h2&gt;Quand un correctif mérite-t-il sa propre entrée, et quand est-il mineur ?&lt;/h2&gt;
&lt;p&gt;Donnez à un correctif sa propre entrée quand un utilisateur pouvait remarquer le bug, y perdre du temps ou des données, ou bâtir un contournement autour. Regroupez-le dans une courte liste &amp;quot;Corrections mineures&amp;quot; quand personne hors de votre équipe ne pouvait le voir. Jugez selon l&amp;#39;expérience du lecteur, quelle que soit la taille du diff.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A sa propre entrée&lt;/th&gt;
&lt;th&gt;Va dans la liste des corrections mineures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Signalé par un client ou subi par beaucoup&lt;/td&gt;
&lt;td&gt;Défaut cosmétique dans un écran rarement ouvert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A causé un résultat faux, des tâches en échec ou du travail perdu&lt;/td&gt;
&lt;td&gt;Coquille, espacement, icône mal alignée&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Demande une action du lecteur&lt;/td&gt;
&lt;td&gt;Correction dans un outil interne ou une page d&amp;#39;admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Une régression d&amp;#39;une version récente&lt;/td&gt;
&lt;td&gt;Échec vu seulement dans un environnement de test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Touche la facturation, les permissions ou les données&lt;/td&gt;
&lt;td&gt;Libellé de log, mises à jour de dépendances sans effet utilisateur&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Chaque ligne du groupe doit quand même dire quelque chose : &amp;quot;Corrections de quelques problèmes d&amp;#39;interface&amp;quot; est un texte de remplissage.&lt;/p&gt;
&lt;h2&gt;Comment parler d&amp;#39;une régression ?&lt;/h2&gt;
&lt;p&gt;Nommez la version qui l&amp;#39;a introduite, appelez cela une régression et donnez la version qui la corrige. Ceux qui ont subi le bug savent déjà que ça ne marchait pas, donc un aveu court et direct les sert mieux qu&amp;#39;une formulation vague.&lt;/p&gt;
&lt;p&gt;Par exemple : &amp;quot;Les résultats de recherche pour les requêtes contenant un tiret revenaient vides en 4.1.0. C&amp;#39;est corrigé en 4.1.1. Si vous aviez modifié vos requêtes pour éviter les tirets, vous pouvez revenir en arrière.&amp;quot;&lt;/p&gt;
&lt;p&gt;&amp;quot;Fiabilité de la recherche améliorée&amp;quot; passe pour de l&amp;#39;évasion aux yeux de quiconque a perdu un après-midi à cause du bug. Si la cause reste à confirmer, dites-le, comme le formulent les conseils sur les &lt;a href=&quot;https://changeloop.dev/blog/fr/emergency-release-notes/&quot;&gt;release notes d&amp;#39;urgence&lt;/a&gt; : ne laissez jamais la note paraître plus certaine que l&amp;#39;équipe.&lt;/p&gt;
&lt;h2&gt;Comment annoncer un correctif de sécurité ?&lt;/h2&gt;
&lt;p&gt;Indiquez la gravité sans détour, nommez les versions touchées et la version qui corrige, dites l&amp;#39;urgence de la mise à jour et incluez l&amp;#39;identifiant CVE s&amp;#39;il en existe un. Ne publiez les détails que lorsque les utilisateurs peuvent agir sur un correctif, en suivant un processus de divulgation coordonnée quand un rapporteur est impliqué.&lt;/p&gt;
&lt;p&gt;L&amp;#39;ordre compte : le rapporteur vous prévient en privé, vous livrez le correctif, et la note publique sort quand les utilisateurs peuvent se protéger. Le &lt;a href=&quot;https://www.cisa.gov/coordinated-vulnerability-disclosure-process&quot;&gt;processus de divulgation coordonnée des vulnérabilités de la CISA&lt;/a&gt; coordonne le signalement, l&amp;#39;analyse et la divulgation publique des vulnérabilités. Les &lt;a href=&quot;https://www.cve.org/ResourcesSupport/AllResources/CNARules&quot;&gt;règles des CVE Numbering Authorities&lt;/a&gt; régissent l&amp;#39;attribution et la publication des enregistrements CVE, et sur GitHub un &lt;a href=&quot;https://docs.github.com/en/code-security/security-advisories/working-with-repository-security-advisories/about-repository-security-advisories&quot;&gt;repository security advisory&lt;/a&gt; permet de rédiger l&amp;#39;avis en privé et de demander un identifiant.&lt;/p&gt;
&lt;p&gt;Une entrée de sécurité porte en général quatre faits :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ce qu&amp;#39;un attaquant pouvait faire, en une phrase et sans preuve de concept.&lt;/li&gt;
&lt;li&gt;Les versions touchées, et la version qui corrige.&lt;/li&gt;
&lt;li&gt;L&amp;#39;urgence : &amp;quot;mettez à jour aujourd&amp;#39;hui&amp;quot; ou &amp;quot;mettez à jour à votre prochaine version&amp;quot;.&lt;/li&gt;
&lt;li&gt;Si vous avez observé une exploitation, et un crédit au rapporteur s&amp;#39;il est d&amp;#39;accord.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Laissez de côté les étapes d&amp;#39;exploitation.&lt;/p&gt;
&lt;h2&gt;Que doit dire une note sur la correction d&amp;#39;une perte de données ?&lt;/h2&gt;
&lt;p&gt;Dites quelles données étaient touchées, comment savoir si les vôtres l&amp;#39;étaient et si on peut les récupérer. &amp;quot;Aucune action requise&amp;quot; est rarement vrai ici, et la première question du lecteur est &amp;quot;mes données sont-elles perdues&amp;quot;.&lt;/p&gt;
&lt;p&gt;Une entrée utilisable donne la condition qui faisait perdre des données (&amp;quot;supprimer un dossier pendant une synchronisation&amp;quot;), la période où c&amp;#39;était possible, un moyen de vérifier (&amp;quot;ouvrez la Corbeille et cherchez les éléments datés du 3 au 9 septembre&amp;quot;) et le chemin de récupération. Si les données ne peuvent pas être récupérées, dites-le. Contactez aussi directement les clients touchés, car la release note ne doit pas être le seul endroit où quelqu&amp;#39;un apprend que ses données ont été touchées.&lt;/p&gt;
&lt;h2&gt;Pourquoi &amp;quot;Corrections de bugs et améliorations de performance&amp;quot; est-il une mauvaise note ?&lt;/h2&gt;
&lt;p&gt;Cela ne donne rien à faire au lecteur et cache les corrections que quelqu&amp;#39;un attendait. Un client qui avait signalé un plantage ne peut pas savoir s&amp;#39;il est corrigé, et un client qui a un contournement ne peut pas savoir s&amp;#39;il doit le retirer.&lt;/p&gt;
&lt;p&gt;Il y a deux alternatives honnêtes. Si une version n&amp;#39;a rien qu&amp;#39;un lecteur pourrait remarquer, ne publiez pas de notes pour elle et laissez le changelog garder la trace. Si elle a des corrections, listez-les dans les termes du lecteur :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Avant :
  Corrections de bugs et améliorations de performance.

Après :
  Corrigé : l&amp;#39;export CSV échouait pour les projets sans tags.
  Corrigé : le mode sombre cachait le curseur dans les commentaires.
  Plus rapide : le tableau de bord s&amp;#39;ouvre plus vite pour les
  espaces de plus de 100 projets.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;D&amp;#39;où viennent les notes de correctifs ?&lt;/h2&gt;
&lt;p&gt;Elles viennent de la pull request qui a corrigé le bug et du signalement qui l&amp;#39;a déclenchée. Si les mots de la personne qui a signalé le problème accompagnent le correctif, la moitié du symptôme est déjà écrite.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-vs-bug-report/&quot;&gt;Demande de fonctionnalité ou bug&lt;/a&gt; explique pourquoi étiqueter correctement un signalement décide de qui en est responsable. Dans Changeloop, un bug signalé via le widget devient une issue GitHub étiquetée &lt;code&gt;bug&lt;/code&gt;, et l&amp;#39;entrée de changelog est rédigée à partir de la pull request fusionnée puis retenue jusqu&amp;#39;à l&amp;#39;approbation d&amp;#39;une personne avant publication. Le &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;modèle de release notes&lt;/a&gt; vous donne la même forme d&amp;#39;entrée pour écrire à la main : symptôme, portée, période, action.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Que doivent contenir les release notes de correctifs ?&lt;/strong&gt;
Chaque entrée doit nommer le symptôme vu par l&amp;#39;utilisateur, qui était touché, depuis quelle version ou quelle date, si la correction est complète et ce que le lecteur doit faire, y compris &amp;quot;rien&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faut-il lister chaque correctif dans les release notes ?&lt;/strong&gt;
Non. Listez ceux qu&amp;#39;un utilisateur pouvait remarquer, qui lui ont fait perdre du temps ou qu&amp;#39;il a contournés, et regroupez les corrections cosmétiques ou internes dans une courte liste &amp;quot;Corrections mineures&amp;quot;. Le changelog garde chaque correction pour qui doit en retrouver une.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment rédiger des release notes pour un bug que vous avez introduit ?&lt;/strong&gt;
Dites que c&amp;#39;était une régression, nommez la version qui l&amp;#39;a introduite et celle qui la corrige, et indiquez aux lecteurs s&amp;#39;ils peuvent retirer un contournement. Une formulation directe se lit mieux qu&amp;#39;une formulation adoucie.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment consulter les release notes d&amp;#39;un produit que vous utilisez ?&lt;/strong&gt;
Cherchez une page changelog ou release notes liée depuis le menu d&amp;#39;aide, le pied de page ou la documentation du produit, ou l&amp;#39;onglet des releases du dépôt pour les projets open source.&lt;/p&gt;
</content:encoded></item><item><title>Comment demander un feedback client dans un produit logiciel</title><link>https://changeloop.dev/blog/fr/how-to-ask-for-customer-feedback/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/how-to-ask-for-customer-feedback/</guid><description>Posez une question précise juste après une action, là où l&apos;utilisateur travaille. Formulations prêtes à l&apos;emploi pour chaque moment, et erreurs à éviter.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Pour demander un feedback client dans un produit logiciel, posez une question précise sur quelque chose que l&amp;#39;utilisateur vient de faire, à l&amp;#39;endroit où il l&amp;#39;a fait. &amp;quot;Comment s&amp;#39;est passé l&amp;#39;export de ce rapport ?&amp;quot; juste après un export obtient une réponse. &amp;quot;Dites-nous ce que vous pensez de notre produit&amp;quot; dans un pied de page obtient le silence. Le reste de cette page, ce sont les moments, les canaux et les formulations exactes.&lt;/p&gt;
&lt;p&gt;La plupart des conseils sur ce sujet sont écrits pour des boutiques et des services clients. Une équipe logicielle sait exactement ce que l&amp;#39;utilisateur a fait il y a une seconde, donc la question peut porter là-dessus.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Moment&lt;/th&gt;
&lt;th&gt;Où demander&lt;/th&gt;
&lt;th&gt;Question prête à l&amp;#39;emploi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Juste après la fin d&amp;#39;une tâche&lt;/td&gt;
&lt;td&gt;Dans l&amp;#39;app, à côté du résultat&lt;/td&gt;
&lt;td&gt;&amp;quot;Cet export a-t-il fait ce qu&amp;#39;il vous fallait ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Après le premier usage d&amp;#39;une nouvelle fonctionnalité&lt;/td&gt;
&lt;td&gt;Dans l&amp;#39;app, une seule fois&lt;/td&gt;
&lt;td&gt;&amp;quot;Qu&amp;#39;essayiez-vous de faire avec la modification groupée ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Après la résolution d&amp;#39;un ticket de support&lt;/td&gt;
&lt;td&gt;Dans le fil du support&lt;/td&gt;
&lt;td&gt;&amp;quot;Est-ce que ça a réglé le problème, ou y a-t-il encore un souci ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quand un utilisateur bloque ou abandonne un parcours&lt;/td&gt;
&lt;td&gt;E-mail, un jour plus tard&lt;/td&gt;
&lt;td&gt;&amp;quot;Vous vous êtes arrêté à l&amp;#39;étape 3 de la configuration. Qu&amp;#39;est-ce qui vous a freiné ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Après 30 jours d&amp;#39;usage régulier&lt;/td&gt;
&lt;td&gt;E-mail d&amp;#39;une personne identifiée&lt;/td&gt;
&lt;td&gt;&amp;quot;Quelle est la seule chose que vous changeriez ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quand un utilisateur résilie&lt;/td&gt;
&lt;td&gt;Dans le parcours de résiliation&lt;/td&gt;
&lt;td&gt;&amp;quot;Qu&amp;#39;est-ce qui vous a fait décider de partir aujourd&amp;#39;hui ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Après la livraison de ce qu&amp;#39;il avait demandé&lt;/td&gt;
&lt;td&gt;Là où il l&amp;#39;avait demandé&lt;/td&gt;
&lt;td&gt;&amp;quot;Vous aviez demandé l&amp;#39;import CSV. C&amp;#39;est en ligne. Cela couvre-t-il votre cas ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quel est le bon moment pour demander un feedback ?&lt;/h2&gt;
&lt;p&gt;Le bon moment est juste après que l&amp;#39;utilisateur a terminé quelque chose, tant que le détail est encore frais dans sa tête. Une question qui suit une action obtient une réponse sur cette action. Une question qui arrive de nulle part obtient une réponse sur l&amp;#39;humeur du moment, ou aucune réponse.&lt;/p&gt;
&lt;p&gt;Ne demandez pas à l&amp;#39;inscription, car personne n&amp;#39;a rien utilisé. Ne demandez pas au milieu d&amp;#39;une tâche, car vous interrompez ce que vous voulez comprendre. Quand une personne a répondu, laissez-la tranquille jusqu&amp;#39;à ce que vous ayez quelque chose à lui annoncer en retour.&lt;/p&gt;
&lt;h2&gt;Où demander un feedback client ?&lt;/h2&gt;
&lt;p&gt;Demandez à l&amp;#39;endroit où l&amp;#39;expérience a eu lieu. Une invite dans l&amp;#39;app convient à une question sur un écran. Le fil du support convient à une question sur un correctif. L&amp;#39;e-mail convient à une question sur une semaine d&amp;#39;usage, ou sur un parcours que la personne a abandonné. Un appel convient aux questions qu&amp;#39;on ne peut pas prévoir.&lt;/p&gt;
&lt;p&gt;Chaque canal donne un type de réponse différent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dans l&amp;#39;app :&lt;/strong&gt; court, immédiat et précis, mais seulement de la part des personnes présentes. Vous n&amp;#39;entendez rien des utilisateurs partis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fil du support :&lt;/strong&gt; de la part de gens déjà assez frustrés pour écrire. Utile pour trouver ce qui est cassé, peu pour juger le reste du produit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;E-mail :&lt;/strong&gt; réponses plus longues de moins de monde, et seul moyen de joindre les utilisateurs devenus silencieux. Écrivez-le comme un court message d&amp;#39;une personne identifiée, avec une seule question dedans.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entretien :&lt;/strong&gt; la façon de comprendre pourquoi les gens font ce qu&amp;#39;ils font. Demandez-leur de vous montrer comment ils travaillent, et taisez-vous pendant qu&amp;#39;ils le font.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/blog/fr/feedback-signal-quality/&quot;&gt;La qualité du signal de feedback&lt;/a&gt; explique comment pondérer ce que chaque canal vous apprend.&lt;/p&gt;
&lt;h2&gt;Comment demander un feedback de façon professionnelle ?&lt;/h2&gt;
&lt;p&gt;Soyez précis sur l&amp;#39;objet, dites pourquoi vous demandez, et faites en sorte que la réponse prenne moins d&amp;#39;une minute. Une demande professionnelle nomme le moment, fait comprendre qu&amp;#39;une personne lira la réponse, et ne s&amp;#39;excuse pas de déranger.&lt;/p&gt;
&lt;p&gt;Nommez l&amp;#39;action exacte (&amp;quot;l&amp;#39;export que vous venez de lancer&amp;quot;), demandez une seule chose, utilisez une zone de texte libre sans champ obligatoire, et signez d&amp;#39;un prénom.&lt;/p&gt;
&lt;h2&gt;Quelle bonne phrase pour demander un feedback ?&lt;/h2&gt;
&lt;p&gt;Une bonne phrase est une question sur un moment précis, à laquelle on peut répondre en quelques mots. Comparez les deux colonnes ci-dessous. Celles de gauche appellent un haussement d&amp;#39;épaules. Celles de droite obligent la personne à se rappeler quelque chose de réel.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Demande faible&lt;/th&gt;
&lt;th&gt;Demande plus forte&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&amp;quot;Un avis ?&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Quelle a été la partie la plus difficile de cette configuration ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;Comment trouvez-vous notre produit ?&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;À quoi l&amp;#39;avez-vous utilisé la semaine dernière ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;Notez votre expérience de 1 à 10.&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Avez-vous fait aujourd&amp;#39;hui ce que vous veniez faire ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;Dites-nous comment nous améliorer.&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;Qu&amp;#39;est-ce qui vous a ralenti cette semaine ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;quot;Nous recommanderiez-vous ?&amp;quot;&lt;/td&gt;
&lt;td&gt;&amp;quot;À qui l&amp;#39;avez-vous montré en dernier, et qu&amp;#39;avez-vous dit ?&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Une autre qui marche presque partout : &amp;quot;Que faites-vous à la place quand ça ne vous convient pas ?&amp;quot; Elle fait remonter le vrai concurrent, qui est souvent un tableur.&lt;/p&gt;
&lt;h2&gt;Quelles sont les pires façons de demander un feedback ?&lt;/h2&gt;
&lt;p&gt;Les pires demandes sont vagues, prématurées, longues ou orientées. Elles ont un défaut commun : la personne ne peut pas répondre sans faire la réflexion que vous auriez dû faire.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;Merci de remplir notre enquête de 20 questions.&amp;quot;&lt;/strong&gt; Ceux qui vont au bout sont ceux qui ont le plus de temps libre ou les opinions les plus tranchées.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une pop-up sur la première page après la connexion.&lt;/strong&gt; L&amp;#39;utilisateur venait faire quelque chose et vous l&amp;#39;avez bloqué. La fermer est la seule réponse raisonnable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;Nous aimerions avoir votre avis !&amp;quot; sans aucune question.&lt;/strong&gt; Cela demande à l&amp;#39;utilisateur d&amp;#39;inventer le sujet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une question orientée : &amp;quot;À quel point aimez-vous le nouveau tableau de bord ?&amp;quot;&lt;/strong&gt; Vous obtenez un accord et n&amp;#39;apprenez rien.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une note sans suite.&lt;/strong&gt; Un 6 sur 10 vous dit l&amp;#39;humeur. Il ne vous dit pas quoi changer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Demander, puis se taire.&lt;/strong&gt; Cela vous coûte le tour suivant, comme on le verra plus bas.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Comment appelle-t-on les retours clients sur un produit ?&lt;/h2&gt;
&lt;p&gt;Les retours sur un produit s&amp;#39;appellent en général le feedback produit, et ils se rangent en deux sortes. Un rapport de bug dit que quelque chose ne marche pas comme prévu. Une demande de fonctionnalité dit que quelque chose manque. La distinction décide de qui s&amp;#39;en occupe en premier, et &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-vs-bug-report/&quot;&gt;demande de fonctionnalité ou bug&lt;/a&gt; trace cette ligne. Une troisième sorte, les compliments, vaut la peine d&amp;#39;être gardée et citée avec permission.&lt;/p&gt;
&lt;p&gt;Un formulaire de feedback qui propose &amp;quot;Bug&amp;quot; et &amp;quot;Demande de fonctionnalité&amp;quot; comme premier choix fait ce premier tri pour vous.&lt;/p&gt;
&lt;h2&gt;Que faire des réponses ?&lt;/h2&gt;
&lt;p&gt;Mettez chaque réponse là où l&amp;#39;équipe travaille déjà, avec les mots de la personne intacts. Une ligne citée vaut mieux que votre résumé. Étiquetez par type et urgence approximative, fusionnez les doublons, puis décidez : le construire, le mettre de côté ou le refuser.&lt;/p&gt;
&lt;p&gt;Refuser compte aussi comme une réponse. &amp;quot;Nous n&amp;#39;allons pas construire ça, et voici pourquoi&amp;quot; met fin à l&amp;#39;attente, et &lt;a href=&quot;https://changeloop.dev/blog/fr/declining-feature-requests/&quot;&gt;refuser une demande de fonctionnalité&lt;/a&gt; propose des formulations. Pour la tuyauterie, &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-tracking/&quot;&gt;le suivi des demandes de fonctionnalités&lt;/a&gt; décrit comment ramener les demandes de cinq canaux dans une seule liste. Si vous recevez des demandes par écrit, un &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-template/&quot;&gt;template de demande de fonctionnalité&lt;/a&gt; les garde comparables.&lt;/p&gt;
&lt;p&gt;Le widget de Changeloop crée chaque soumission comme une issue GitHub, si bien que le feedback atterrit à côté du code qui le traitera. Avec n&amp;#39;importe quel outil, la règle est la même : une liste, un responsable, aucune réponse oubliée dans la boîte de réception de quelqu&amp;#39;un.&lt;/p&gt;
&lt;h2&gt;Pourquoi dire ce qui a été livré ?&lt;/h2&gt;
&lt;p&gt;Cela montre à la personne que répondre valait son temps. Un utilisateur qui vous a dit quelque chose et apprend plus tard &amp;quot;c&amp;#39;est livré, merci&amp;quot; a une raison de répondre à nouveau. Celui qui n&amp;#39;entend rien en conclut que personne ne lit la boîte.&lt;/p&gt;
&lt;p&gt;La dernière étape de la demande est donc une réponse. Dites à chaque personne qui a demandé quand sa demande est livrée, dans ses propres termes, sur le canal qu&amp;#39;elle a utilisé. &lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;Fermer la boucle de feedback client&lt;/a&gt; décrit le mécanisme : l&amp;#39;entrée de changelog publiée déclenche le message, si bien que le demandeur n&amp;#39;est prévenu qu&amp;#39;une fois le changement en ligne. Dans Changeloop, quand un feedback du widget est devenu une issue GitHub et que la pull request fusionnée la ferme, approuver l&amp;#39;entrée poste un commentaire &amp;quot;Shipped&amp;quot; sur cette issue et montre l&amp;#39;entrée à l&amp;#39;auteur de la soumission dans le widget ; les issues créées à la main, et les dépôts GitLab ou Bitbucket, ne reçoivent aucun commentaire. Notre documentation liste la &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;configuration du widget et du flux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une réponse peut être courte : &amp;quot;Vous aviez demandé l&amp;#39;import CSV en mars. C&amp;#39;est en ligne aujourd&amp;#39;hui, voici comment ça marche.&amp;quot; Elle vous donne aussi la meilleure question suivante : est-ce que cela couvre ce dont la personne avait besoin ?&lt;/p&gt;
&lt;h2&gt;Un plan pour démarrer&lt;/h2&gt;
&lt;p&gt;Choisissez un moment dans le tableau du haut, celui où les utilisateurs réussissent ou abandonnent le plus souvent. Écrivez une question pour lui, placez-la dans un canal, et lisez chaque réponse pendant deux semaines avant d&amp;#39;ajouter une deuxième invite. Répondez à toute personne qui vous a donné quelque chose de concret.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;À quelle fréquence faut-il demander un feedback aux clients ?&lt;/strong&gt;
Rattachez les demandes à des événements, pas à un calendrier. Un utilisateur ne devrait voir qu&amp;#39;une invite par semaine au plus, et aucune juste après en avoir rempli une. Le message qui suit un feedback doit être une réponse sur ce qu&amp;#39;il est devenu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment demander un feedback sans agacer les utilisateurs ?&lt;/strong&gt;
Demandez après une tâche, jamais au milieu d&amp;#39;une tâche, limitez-vous à une question et facilitez le refus. Respectez un refus pendant quelques semaines.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faut-il offrir une contrepartie pour un feedback ?&lt;/strong&gt;
En général ce n&amp;#39;est pas nécessaire. Une question précise et une réponse visible pèsent plus qu&amp;#39;une carte cadeau, et les contreparties attirent des gens qui veulent la récompense. Gardez-les pour les entretiens, où vous demandez 20 minutes du temps de quelqu&amp;#39;un.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que faire si personne ne répond ?&lt;/strong&gt;
Resserrez la question et rapprochez-la du moment, par exemple un seul écran, posée juste après son utilisation. Si le silence persiste, écrivez directement à quelques utilisateurs et servez-vous de ces échanges pour écrire de meilleures invites.&lt;/p&gt;
</content:encoded></item><item><title>Exemples de roadmap produit : six formats et leurs limites</title><link>https://changeloop.dev/blog/fr/product-roadmap-examples/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/product-roadmap-examples/</guid><description>Six exemples de roadmap produit avec des éléments réalistes : Now/Next/Later, trimestrielle, thèmes, résultats, publique et de release. Atouts et limites.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Les exemples de roadmap produit qui méritent d&amp;#39;être copiés se rangent en six formats : Now/Next/Later, une frise trimestrielle, une roadmap par thèmes, une roadmap par résultats, une roadmap publique et une roadmap de releases interne. Chacun répond à une question différente pour un lecteur différent ; le bon exemple est donc celui qui correspond à la personne qui lira la vôtre. La mise en page vient en dernier.&lt;/p&gt;
&lt;p&gt;Tous les exemples ci-dessous portent sur un produit imaginaire, une petite application de tâches pour équipes, et chaque élément est inventé. Ce qui compte, c&amp;#39;est la forme : ce qui va dans chaque case, à quoi ressemble une vraie entrée, et ce qui fait craquer ce format au bout d&amp;#39;un trimestre.&lt;/p&gt;
&lt;h2&gt;Quels sont de bons exemples de roadmap produit ?&lt;/h2&gt;
&lt;p&gt;Un bon exemple de roadmap est court, nomme son lecteur et fait un seul type de promesse. Choisissez le format selon la promesse que vous êtes prêt à tenir : une direction, une date, un thème de travail, un résultat, un engagement public ou un calendrier de livraison.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Pensé pour&lt;/th&gt;
&lt;th&gt;Fonctionne quand&lt;/th&gt;
&lt;th&gt;Échoue quand&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Now/Next/Later&lt;/td&gt;
&lt;td&gt;Toute l&amp;#39;entreprise&lt;/td&gt;
&lt;td&gt;Les plans changent souvent&lt;/td&gt;
&lt;td&gt;&amp;quot;Next&amp;quot; se remplit et devient une file d&amp;#39;attente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frise trimestrielle&lt;/td&gt;
&lt;td&gt;Ventes, support, direction&lt;/td&gt;
&lt;td&gt;Les dates sont de vraies contraintes&lt;/td&gt;
&lt;td&gt;Les dates glissent et personne ne les met à jour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Par thèmes&lt;/td&gt;
&lt;td&gt;Direction, nouvelles recrues&lt;/td&gt;
&lt;td&gt;Vous voulez expliquer le pourquoi&lt;/td&gt;
&lt;td&gt;Les thèmes deviennent si larges que tout y rentre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Par résultats&lt;/td&gt;
&lt;td&gt;Produit et ingénierie&lt;/td&gt;
&lt;td&gt;Vous pouvez mesurer l&amp;#39;objectif&lt;/td&gt;
&lt;td&gt;La métrique n&amp;#39;a ni responsable ni données&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publique&lt;/td&gt;
&lt;td&gt;Clients&lt;/td&gt;
&lt;td&gt;Vous savez la garder petite&lt;/td&gt;
&lt;td&gt;Elle devient un fourre-tout de backlog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Releases interne&lt;/td&gt;
&lt;td&gt;Ingénierie, QA, support&lt;/td&gt;
&lt;td&gt;Plusieurs équipes livrent ensemble&lt;/td&gt;
&lt;td&gt;On la prend pour de la stratégie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;À quoi ressemble chaque exemple de roadmap produit ?&lt;/h2&gt;
&lt;p&gt;Chaque format ci-dessous est montré avec des entrées réalistes, suivies de ceux à qui il convient, de ce qui le fait tenir et de la façon dont il échoue d&amp;#39;ordinaire.&lt;/p&gt;
&lt;h3&gt;Now/Next/Later&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;NOW (en cours de construction ce mois-ci)
  Vues enregistrées dans la boîte de réception
  Export CSV fiable pour les gros comptes
NEXT (décidé, ordre non fixé)
  SSO pour le plan Team
  Notifications Slack
LATER (une direction, aucun engagement)
  Application mobile
  Journal d&amp;#39;audit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce format convient à une entreprise qui ne veut pas promettre de dates, ce qui est le cas de beaucoup d&amp;#39;équipes en phase de démarrage. Il tient parce que les trois colonnes décrivent votre degré de certitude : &amp;quot;now&amp;quot; est en cours, &amp;quot;next&amp;quot; est décidé, &amp;quot;later&amp;quot; est un espoir. Il échoue quand &amp;quot;later&amp;quot; devient le parking de toutes les idées qu&amp;#39;on n&amp;#39;ose pas refuser, et quand &amp;quot;next&amp;quot; acquiert discrètement un ordre et une date sans que personne parle de calendrier.&lt;/p&gt;
&lt;h3&gt;Frise ou roadmap trimestrielle&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;T4 2026
  Oct   Vues enregistrées dans la boîte de réception
  Nov   SSO en bêta avec cinq partenaires de conception
  Déc   SSO en disponibilité générale
T1 2027
  Jan   Notifications Slack
  Mar   Journal d&amp;#39;audit (export seulement)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce format convient aux ventes, au support et à la finance, qui doivent planifier autour de quelque chose. Il fonctionne quand les dates sont de vraies contraintes : un contrat, une conférence, une échéance de conformité. Il échoue quand les dates sont des suppositions, car un mois affiché sur une roadmap devient une promesse dans une présentation commerciale en quelques semaines. Si vous choisissez ce format, indiquez pour chaque trimestre s&amp;#39;il est engagé ou prévisionnel, et rendez le deuxième trimestre visiblement plus flou que le premier.&lt;/p&gt;
&lt;h3&gt;Roadmap par thèmes&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;THÈME : première semaine d&amp;#39;utilisation
  Import depuis CSV et Trello
  Modèles de démarrage
THÈME : prêt pour les grandes équipes
  SSO
  Journal d&amp;#39;audit
  Permissions par rôle
THÈME : moins d&amp;#39;étapes manuelles
  Notifications Slack
  Tâches récurrentes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ce format convient aux points avec la direction et aux nouvelles recrues, parce qu&amp;#39;il explique pourquoi le travail existe avant d&amp;#39;énumérer le travail. Il tient quand chaque thème correspond à une raison pour laquelle un client s&amp;#39;en soucierait. Il échoue quand les thèmes sont si larges (&amp;quot;Croissance&amp;quot;, &amp;quot;Qualité&amp;quot;) que chaque élément rentre sous chacun d&amp;#39;eux ; le regroupement n&amp;#39;explique alors plus rien.&lt;/p&gt;
&lt;h3&gt;Roadmap par résultats&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;OBJECTIF : plus d&amp;#39;équipes terminent la configuration
  Métrique : config terminée en 7 jours, de 40 % à 55 %
  Paris : import CSV, modèles de démarrage
OBJECTIF : moins de tickets support sur les exports
  Métrique : tickets d&amp;#39;export par semaine, de 30 à 10
  Paris : correctif des gros comptes, page d&amp;#39;état des exports
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Les chiffres sont illustratifs, et c&amp;#39;est la structure qui compte : un objectif, une métrique avec un point de départ et une cible, et les paris que vous allez tenter. Ce format convient aux équipes produit et ingénierie à qui l&amp;#39;on fait confiance pour choisir la solution. Il fonctionne quand la métrique existe et que quelqu&amp;#39;un en répond. Il échoue quand l&amp;#39;objectif n&amp;#39;est pas mesurable, ou quand les &amp;quot;paris&amp;quot; sont la même liste de fonctionnalités qu&amp;#39;avant, avec une phrase de résultat collée par-dessus.&lt;/p&gt;
&lt;h3&gt;Roadmap publique orientée client&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;PLANIFIÉ
  Vues enregistrées dans la boîte de réception
EN CONSTRUCTION
  Notifications Slack
LIVRÉ
  Export CSV pour les gros comptes
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;C&amp;#39;est le plus petit format, et il fait la promesse la plus forte. Il convient aux clients, qui veulent savoir si leur demande a été entendue. Il tient avec très peu d&amp;#39;éléments, sans dates, et avec des titres écrits dans les mots du client. Il échoue en fourre-tout de backlog : chaque &amp;quot;peut-être&amp;quot; que vous affichez est une promesse dont quelqu&amp;#39;un vous demandera des comptes plus tard. Le fonctionnement concret à partir de votre issue tracker se trouve dans &lt;a href=&quot;https://changeloop.dev/blog/fr/public-roadmap/&quot;&gt;une roadmap publique en trois colonnes&lt;/a&gt;, on ne le répète donc pas ici.&lt;/p&gt;
&lt;h3&gt;Roadmap de releases interne&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Release&lt;/th&gt;
&lt;th&gt;Cible&lt;/th&gt;
&lt;th&gt;Responsable&lt;/th&gt;
&lt;th&gt;Dépend de&lt;/th&gt;
&lt;th&gt;Statut&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;5.2&lt;/td&gt;
&lt;td&gt;14 oct.&lt;/td&gt;
&lt;td&gt;Plateforme&lt;/td&gt;
&lt;td&gt;Mise à jour du service d&amp;#39;auth&lt;/td&gt;
&lt;td&gt;Code terminé&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.3&lt;/td&gt;
&lt;td&gt;11 nov.&lt;/td&gt;
&lt;td&gt;Inbox&lt;/td&gt;
&lt;td&gt;API des vues enregistrées&lt;/td&gt;
&lt;td&gt;En cours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.4&lt;/td&gt;
&lt;td&gt;9 déc.&lt;/td&gt;
&lt;td&gt;Plateforme&lt;/td&gt;
&lt;td&gt;Contrat du fournisseur SSO&lt;/td&gt;
&lt;td&gt;Bloqué&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Ce format convient à l&amp;#39;ingénierie, à la QA et au support, qui doivent savoir ce qui part ensemble et ce qui bloque quoi. Il fonctionne quand il est exact à la semaine près et qu&amp;#39;il y a un responsable par ligne. Il échoue quand quelqu&amp;#39;un le prend pour de la stratégie : un calendrier de livraison dit ce qui sort et quand, et ne dit rien sur la pertinence de ces releases.&lt;/p&gt;
&lt;h2&gt;Quel format de roadmap produit choisir ?&lt;/h2&gt;
&lt;p&gt;Choisissez d&amp;#39;abord selon le lecteur, puis selon le degré de certitude dont vous disposez réellement. Si vous ne pouvez pas nommer qui lit la roadmap et quelle décision elle l&amp;#39;aide à prendre, aucun des exemples ci-dessus ne la sauvera.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Des clients qui demandent &amp;quot;m&amp;#39;avez-vous entendu ?&amp;quot;&lt;/strong&gt; Utilisez le format public, avec une poignée d&amp;#39;éléments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Des ventes et un support qui demandent &amp;quot;puis-je donner une date au client ?&amp;quot;&lt;/strong&gt; Utilisez la frise trimestrielle, en séparant clairement l&amp;#39;engagé du prévisionnel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une direction qui demande &amp;quot;pourquoi ce travail ?&amp;quot;&lt;/strong&gt; Utilisez des thèmes, ou des résultats si vous avez les données.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une équipe qui change de direction chaque mois.&lt;/strong&gt; Utilisez Now/Next/Later et résistez à l&amp;#39;envie de le dater.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Des ingénieurs qui demandent &amp;quot;qu&amp;#39;est-ce qui sort quand ?&amp;quot;&lt;/strong&gt; Utilisez la roadmap de releases, et gardez-la séparée de la stratégique.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La plupart des équipes finissent avec deux documents : une roadmap stratégique sous l&amp;#39;une des quatre premières formes, et un calendrier de releases en dessous. La roadmap publique est alors une vue filtrée de la stratégique, qui ne montre que ce sur quoi vous acceptez d&amp;#39;être jugé.&lt;/p&gt;
&lt;h2&gt;Comment rédiger une roadmap produit ?&lt;/h2&gt;
&lt;p&gt;Rédigez une roadmap en nommant le lecteur, en choisissant le format qui répond à sa question, en ne listant que les éléments que vous défendriez en réunion, et en donnant à chacun un statut et un responsable. Décidez ensuite à quelle fréquence elle sera relue, avant de la publier.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Nommez le lecteur et la décision.&lt;/strong&gt; &amp;quot;Le support décide quoi dire aux clients sur le SSO&amp;quot; est une raison. &amp;quot;Tout le monde devrait voir la roadmap&amp;quot; ne vous donne rien à concevoir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partez de ce que vous savez déjà.&lt;/strong&gt; Les demandes ouvertes, &lt;a href=&quot;https://changeloop.dev/blog/fr/prioritizing-feature-requests/&quot;&gt;classées selon une règle que vous savez expliquer&lt;/a&gt;, sont une meilleure matière première qu&amp;#39;un brainstorming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Écrivez chaque élément comme un résultat pour le client.&lt;/strong&gt; &amp;quot;Garder un filtre que vous utilisez souvent&amp;quot; se lit mieux que &amp;quot;Implémenter la persistance des vues enregistrées&amp;quot;, et ça dit au client si c&amp;#39;est son problème.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Décidez ce que la roadmap ne contiendra pas.&lt;/strong&gt; Dates, estimations et backlog d&amp;#39;idées sont les trois exclusions habituelles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixez une date de relecture.&lt;/strong&gt; Une roadmap sans relecture planifiée a des funérailles non planifiées.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Comment garder une roadmap produit à jour ?&lt;/h2&gt;
&lt;p&gt;Gardez une roadmap à jour en déplaçant les éléments quand le travail avance, depuis l&amp;#39;endroit où le travail est suivi, et en consignant ce qui s&amp;#39;est passé quand un élément est livré ou abandonné. Une roadmap qu&amp;#39;on met à jour à la main dans un outil séparé devient obsolète parce que ce n&amp;#39;est le travail quotidien de personne.&lt;/p&gt;
&lt;p&gt;La source de vérité la moins coûteuse est l&amp;#39;issue tracker. Si chaque colonne de la roadmap correspond à un label sur l&amp;#39;issue, la roadmap change quand le label change, et rien n&amp;#39;est ressaisi. La version de Changeloop utilise les labels &lt;code&gt;roadmap:planned&lt;/code&gt;, &lt;code&gt;roadmap:building&lt;/code&gt; et &lt;code&gt;roadmap:shipped&lt;/code&gt;, et quand une issue en porte deux, le plus avancé l&amp;#39;emporte. Déplacer une carte vers livré reste un changement de label à part ; intégrez-le à la relecture où vous approuvez l&amp;#39;entrée du changelog.&lt;/p&gt;
&lt;p&gt;Cette entrée est l&amp;#39;autre moitié. Quand un élément est livré, le changelog dit ce qui a changé dans les termes du client, et la personne qui l&amp;#39;avait demandé peut être prévenue. Fermer cette boucle est tout l&amp;#39;objet de la &lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;boucle de feedback client&lt;/a&gt;, et la roadmap est la partie de cette boucle que le client peut voir avant que quoi que ce soit ne soit livré. Si vous abandonnez un élément, dites-le ; un &amp;quot;non&amp;quot; public clôt aussi cette demande, et &lt;a href=&quot;https://changeloop.dev/blog/fr/declining-feature-requests/&quot;&gt;refuser une demande de fonctionnalité&lt;/a&gt; explique comment le formuler. Les équipes qui veulent voir à quoi ressemblent des entrées terminées peuvent parcourir des &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;exemples de changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quel est le format de roadmap produit le plus simple ?&lt;/strong&gt;
Now/Next/Later. Il a trois colonnes, n&amp;#39;exige aucune date et regroupe les éléments par degré de certitude. Pour une petite équipe qui change souvent de direction, c&amp;#39;est aussi le format le plus difficile à rater de façon embarrassante.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combien d&amp;#39;éléments une roadmap produit devrait-elle contenir ?&lt;/strong&gt;
Moins que vous ne croyez. Moins de dix éléments toutes colonnes confondues suffisent pour une roadmap publique, et une roadmap stratégique interne dépasse rarement une douzaine. Au-delà, c&amp;#39;est un backlog avec un plus bel en-tête.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une roadmap produit doit-elle comporter des dates ?&lt;/strong&gt;
Seulement si les dates sont de vraies contraintes, et alors uniquement pour le trimestre le plus proche. Au-delà, utilisez des colonnes ou des thèmes. Une date sur une roadmap devient un engagement dans une conversation commerciale, que vous l&amp;#39;ayez voulu ou non.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle différence entre une roadmap produit et un plan de release ?&lt;/strong&gt;
Une roadmap dit ce que vous comptez construire et pourquoi. Un plan de release dit quelle version sort à quelle date et qui en répond. La roadmap change quand votre stratégie change, et le plan de release change quand le travail change.&lt;/p&gt;
</content:encoded></item><item><title>Release management : processus pour équipes qui livrent vite</title><link>https://changeloop.dev/blog/fr/release-management-process/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/release-management-process/</guid><description>Un processus de release management en sept étapes, avec responsable et critères de sortie, plus les métriques DORA et un KPI supplémentaire à suivre.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un processus de release management est l&amp;#39;ensemble des étapes qui mène un changement de &amp;quot;fusionné&amp;quot; à &amp;quot;en production et expliqué aux personnes concernées&amp;quot;. Pour une équipe qui livre souvent, il se résume à sept étapes : cadrer le périmètre, isoler le changement, construire et tester, approuver, déployer et vérifier, communiquer, et faire le bilan. Chaque étape a besoin d&amp;#39;un responsable nommé et d&amp;#39;un critère de sortie, sans quoi elle cesse discrètement d&amp;#39;avoir lieu.&lt;/p&gt;
&lt;p&gt;Ce guide suppose une équipe de 5 à 50 ingénieurs qui déploient chaque semaine ou chaque jour et veulent que le processus reste discret.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Étape&lt;/th&gt;
&lt;th&gt;Responsable&lt;/th&gt;
&lt;th&gt;Critères de sortie&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1. Cadrer le périmètre&lt;/td&gt;
&lt;td&gt;Product ou tech lead&lt;/td&gt;
&lt;td&gt;La liste des changements de cette release est écrite, et tout ce qui est risqué est marqué&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Branche ou flag&lt;/td&gt;
&lt;td&gt;L&amp;#39;ingénieur qui porte le changement&lt;/td&gt;
&lt;td&gt;Le travail est sur une branche de courte durée ou derrière un flag, pour que main reste livrable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Construire et tester&lt;/td&gt;
&lt;td&gt;La CI, avec l&amp;#39;auteur d&amp;#39;astreinte en cas d&amp;#39;échec&lt;/td&gt;
&lt;td&gt;Pipeline vert sur le commit exact qui sera livré&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Approuver&lt;/td&gt;
&lt;td&gt;Relecteur, plus le release manager pour les changements risqués&lt;/td&gt;
&lt;td&gt;Revue faite, chemin de rollback nommé, décision go ou no-go consignée&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Déployer et vérifier&lt;/td&gt;
&lt;td&gt;Release manager ou ingénieur d&amp;#39;astreinte&lt;/td&gt;
&lt;td&gt;Déployé, smoke checks réussis, taux d&amp;#39;erreur et latence conformes à la référence d&amp;#39;avant release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Communiquer&lt;/td&gt;
&lt;td&gt;Celui qui comprend le changement, relu par quelqu&amp;#39;un qui ne le comprend pas&lt;/td&gt;
&lt;td&gt;Release notes publiées là où les utilisateurs lisent, support et ventes prévenus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7. Faire le bilan&lt;/td&gt;
&lt;td&gt;Release manager&lt;/td&gt;
&lt;td&gt;Métriques lues, tout ce qui a mal tourné a un responsable et un correctif&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qu&amp;#39;est-ce que le processus de release management ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est le chemin reproductible qu&amp;#39;un changement suit pour atteindre les utilisateurs : périmètre, build, test, approbation, déploiement, vérification, annonce, et retour d&amp;#39;expérience. L&amp;#39;intérêt de l&amp;#39;écrire est que chaque release suit le même chemin, de sorte qu&amp;#39;une personne en vacances, une nouvelle recrue ou un ingénieur d&amp;#39;astreinte à 2 h du matin puisse l&amp;#39;exécuter sans demander à personne comment ça marche.&lt;/p&gt;
&lt;h2&gt;Quels sont les différents types de release management ?&lt;/h2&gt;
&lt;p&gt;Il y en a trois en pratique : le déploiement continu, les releases planifiées et la gestion des changements réglementée. Ils diffèrent par ce qui se passe avant une release et par ce qui est automatisé. Le déploiement continu livre chaque changement fusionné, les releases planifiées regroupent les changements dans un train, et la gestion réglementée des changements ajoute une approbation formelle et une piste d&amp;#39;audit.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Déploiement continu&lt;/th&gt;
&lt;th&gt;Releases planifiées&lt;/th&gt;
&lt;th&gt;Gestion des changements réglementée ou ITIL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Unité de release&lt;/td&gt;
&lt;td&gt;Une pull request fusionnée&lt;/td&gt;
&lt;td&gt;Un lot, hebdomadaire ou bimensuel&lt;/td&gt;
&lt;td&gt;Une demande de changement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Étape de périmètre&lt;/td&gt;
&lt;td&gt;Implicite, la fusion est le périmètre&lt;/td&gt;
&lt;td&gt;Réunion de planification de release&lt;/td&gt;
&lt;td&gt;Fiche de changement avec niveau de risque&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Approbation&lt;/td&gt;
&lt;td&gt;Revue de code plus contrôles automatisés&lt;/td&gt;
&lt;td&gt;Le release manager valide le lot&lt;/td&gt;
&lt;td&gt;Comité consultatif des changements ou approbateur délégué&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maîtrise du risque&lt;/td&gt;
&lt;td&gt;Feature flags, canaries, rollback rapide&lt;/td&gt;
&lt;td&gt;Test en staging, release candidate&lt;/td&gt;
&lt;td&gt;Plan de retour arrière documenté, fenêtre de maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rythme typique&lt;/td&gt;
&lt;td&gt;Plusieurs par jour&lt;/td&gt;
&lt;td&gt;Hebdomadaire à mensuel&lt;/td&gt;
&lt;td&gt;Fixé par le calendrier des changements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Point faible&lt;/td&gt;
&lt;td&gt;Personne ne dit aux utilisateurs ce qui a changé&lt;/td&gt;
&lt;td&gt;Les gros lots cachent le changement qui a tout cassé&lt;/td&gt;
&lt;td&gt;Le temps de processus écrase le changement lui-même&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La plupart des équipes sont un mélange. Un produit SaaS peut déployer en continu pendant que son application mobile part sur un train hebdomadaire, et l&amp;#39;unique service de paiement qui intéresse les auditeurs suit une fiche de changement formelle. Choisissez le type par service, pas par entreprise. Quand les changements ne sont exposés que progressivement, la release et l&amp;#39;annonce deviennent deux événements distincts, ce que couvrent les &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-flags-feature-requests/&quot;&gt;release notes avec feature flags&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Quelles sont les responsabilités d&amp;#39;un release manager ?&lt;/h2&gt;
&lt;p&gt;Un release manager est responsable du chemin que suit un changement jusqu&amp;#39;à la production. Il tient le calendrier des releases, décide si un changement est prêt, exécute ou supervise le déploiement, prend la décision de rollback, veille à ce que les utilisateurs soient prévenus et mène le bilan ensuite.&lt;/p&gt;
&lt;p&gt;Avant la release, il confirme le périmètre et vérifie que chaque changement risqué a un chemin de rollback. Pendant, il déroule la checklist de déploiement, surveille les premières minutes des métriques de production et déclenche tôt un rollback. Après, il confirme que les notes sont sorties et consigne ce qu&amp;#39;il faut corriger dans le processus.&lt;/p&gt;
&lt;p&gt;Dans une petite équipe, faites tourner le rôle chaque semaine et rédigez la checklist pour que personne n&amp;#39;ait besoin d&amp;#39;un savoir tribal. Un &lt;a href=&quot;https://changeloop.dev/blog/fr/monorepo-changelogs/&quot;&gt;monorepo&lt;/a&gt; avec de nombreux paquets publiés indépendamment demande en général un responsable de release par paquet, sans quoi le rôle devient un goulot d&amp;#39;étranglement.&lt;/p&gt;
&lt;h2&gt;Quels sont les KPI clés du release management ?&lt;/h2&gt;
&lt;p&gt;Suivez les métriques de livraison logicielle de DORA, et ajoutez-en une de votre cru : le temps qu&amp;#39;il faut pour que les utilisateurs soient prévenus. La recherche de DORA identifie cinq métriques, réparties entre débit (délai de mise en production d&amp;#39;un changement, fréquence de déploiement, temps de rétablissement après un déploiement raté) et instabilité (taux d&amp;#39;échec des changements, taux de reprise des déploiements).&lt;/p&gt;
&lt;p&gt;Le guide de DORA les définit simplement (&lt;a href=&quot;https://dora.dev/guides/dora-metrics/&quot;&gt;dora.dev, software delivery metrics&lt;/a&gt;) :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;KPI&lt;/th&gt;
&lt;th&gt;Ce qu&amp;#39;il mesure&lt;/th&gt;
&lt;th&gt;Ce qu&amp;#39;il faut surveiller&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Délai de mise en production (change lead time)&lt;/td&gt;
&lt;td&gt;Temps entre le commit dans le contrôle de version et le déploiement en production&lt;/td&gt;
&lt;td&gt;Un chiffre qui monte signale en général des files d&amp;#39;attente en revue ou en approbation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fréquence de déploiement&lt;/td&gt;
&lt;td&gt;Combien de fois vous déployez, ou le temps entre deux déploiements&lt;/td&gt;
&lt;td&gt;Une fréquence qui baisse signifie que les lots grossissent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temps de rétablissement après déploiement raté&lt;/td&gt;
&lt;td&gt;Temps pour se remettre d&amp;#39;un déploiement qui exige une intervention immédiate&lt;/td&gt;
&lt;td&gt;Les problèmes de rollback et d&amp;#39;alerte apparaissent ici&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Taux d&amp;#39;échec des changements&lt;/td&gt;
&lt;td&gt;Part des déploiements qui exigent un rollback ou un hotfix&lt;/td&gt;
&lt;td&gt;Monte quand les lots sont trop gros ou les tests trop minces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Taux de reprise des déploiements&lt;/td&gt;
&lt;td&gt;Part des déploiements non planifiés et causés par un incident de production&lt;/td&gt;
&lt;td&gt;Signe que les correctifs sortent plus vite que les leçons&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Délai avant information des utilisateurs&lt;/td&gt;
&lt;td&gt;Minutes entre le déploiement en production et une note publiée côté utilisateurs&lt;/td&gt;
&lt;td&gt;À mesurer vous-même, aucun framework ne la fournit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Les anciens documents listent quatre métriques clés et appellent le rétablissement &amp;quot;time to restore&amp;quot;. Le guide actuel utilise les cinq ci-dessus.&lt;/p&gt;
&lt;p&gt;Le même guide met en garde contre le fait d&amp;#39;en faire des cibles. Fixer un objectif comme &amp;quot;tout se déploie plusieurs fois par jour d&amp;#39;ici la fin de l&amp;#39;année&amp;quot; pousse les équipes à tricher avec les chiffres, et les métriques sont à lire par application ou par service, pas mélangées à l&amp;#39;échelle de l&amp;#39;entreprise. Son conseil pratique pour les améliorer toutes est de réduire la taille de chaque changement, car les petits changements sont plus faciles à relire, à faire passer dans le pipeline et à rattraper.&lt;/p&gt;
&lt;h2&gt;Comment la communication de release s&amp;#39;intègre-t-elle au processus de release management ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est l&amp;#39;étape six, et elle a un responsable et un critère de sortie comme toutes les autres : notes publiées là où les utilisateurs lisent, et équipes internes prévenues. C&amp;#39;est celle que les équipes sautent le plus souvent, parce que l&amp;#39;outillage de déploiement annonce le succès dès que le code est en ligne.&lt;/p&gt;
&lt;p&gt;Le moyen le moins coûteux de tenir cette étape est d&amp;#39;écrire l&amp;#39;entrée quand le changement est fusionné, pas quand la release part. La pull request contient déjà le titre, l&amp;#39;auteur, l&amp;#39;issue liée et le contexte. Un brouillon construit à partir d&amp;#39;elle se retouche au lieu de s&amp;#39;écrire de mémoire une semaine plus tard. C&amp;#39;est l&amp;#39;idée de l&amp;#39;&lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-automation/&quot;&gt;automatisation du changelog&lt;/a&gt; : dériver un brouillon à la fusion, le retenir pour approbation humaine, puis le publier partout depuis une seule source. Changeloop fonctionne ainsi, rédigeant des entrées à partir des pull requests fusionnées avec l&amp;#39;IA et les retenant pour approbation avant toute publication.&lt;/p&gt;
&lt;p&gt;Deux variantes méritent d&amp;#39;être prévues à l&amp;#39;avance. Le support et les ventes ont besoin d&amp;#39;une autre note que les clients, ce à quoi servent les &lt;a href=&quot;https://changeloop.dev/blog/fr/internal-release-notes/&quot;&gt;notes de release internes&lt;/a&gt;. Une release déclenchée par un incident n&amp;#39;a pas le temps de suivre la boucle de rédaction habituelle ; gardez donc un modèle court sous la main, comme décrit dans &lt;a href=&quot;https://changeloop.dev/blog/fr/emergency-release-notes/&quot;&gt;release notes d&amp;#39;urgence&lt;/a&gt;. Le &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;modèle de release notes&lt;/a&gt; vous donne une forme de départ pour la version destinée aux clients.&lt;/p&gt;
&lt;h2&gt;Comment garder le processus léger ?&lt;/h2&gt;
&lt;p&gt;Automatisez chaque critère de sortie qu&amp;#39;une machine peut vérifier, et gardez les humains pour les jugements. Un pipeline vert, un marqueur de déploiement sur les tableaux de bord et une entrée de changelog brouillon par pull request fusionnée se vérifient. Savoir si un plan de rollback est crédible, ou si les notes parlent à un client, demande une personne.&lt;/p&gt;
&lt;p&gt;Pour tester le processus, prenez une release du mois dernier et demandez si quelqu&amp;#39;un hors de l&amp;#39;équipe pourrait dire, à partir du seul dossier écrit, ce qui est sorti, qui l&amp;#39;a approuvé, comment cela a été vérifié et quand les utilisateurs ont été prévenus. Chaque trou est votre prochaine amélioration.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quelle différence entre release management et change management ?&lt;/strong&gt;
Le release management fait construire, tester, déployer et annoncer un ensemble de changements. Le change management, au sens ITIL, est le processus d&amp;#39;approbation et de risque autour de chaque changement. Les équipes qui livrent souvent intègrent l&amp;#39;approbation à la revue de code et aux contrôles automatisés.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;À quelle fréquence faut-il livrer ?&lt;/strong&gt;
Aussi souvent que vos tests et votre chemin de rollback le permettent, ce qui pour beaucoup d&amp;#39;équipes web veut dire chaque jour ou plus. Le conseil de DORA est de réduire la taille de chaque changement, car les petits changements sont plus faciles à relire et à rattraper.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les petites équipes ont-elles besoin d&amp;#39;un release manager ?&lt;/strong&gt;
Elles ont besoin des responsabilités, pas forcément du titre. Faites tourner le rôle entre ingénieurs, donnez à la personne de tour une checklist écrite, et veillez à ce que quelqu&amp;#39;un porte chacune des sept étapes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que doit contenir une checklist de release ?&lt;/strong&gt;
Périmètre confirmé, pipeline vert sur le commit livré, chemin de rollback nommé, approbation consignée, smoke checks après déploiement, métriques comparées à la référence, release notes publiées, support prévenu et bilan planifié. Tenez-la sur une page.&lt;/p&gt;
</content:encoded></item><item><title>Exemples de release notes pour chaque type de changement</title><link>https://changeloop.dev/blog/fr/release-notes-examples/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/release-notes-examples/</guid><description>Exemples de release notes pour une fonctionnalité, un correctif, un changement cassant, une faille, une dépréciation, l&apos;app store et une note interne.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Les meilleurs exemples de release notes sont courts, nomment les personnes concernées et disent quoi faire ensuite. Voici un exemple pour chaque type de changement que vous livrerez, avec la raison pour laquelle il fonctionne, pour que vous puissiez copier la forme et y mettre vos propres faits.&lt;/p&gt;
&lt;p&gt;Tous les exemples sont inventés, pour une application de facturation fictive appelée Tidepool.&lt;/p&gt;
&lt;h2&gt;Que partagent les bons exemples de release notes ?&lt;/h2&gt;
&lt;p&gt;Ils disent aux utilisateurs ce qui a changé et ce qu&amp;#39;ils doivent éventuellement en faire, avec leurs mots à eux. Chaque type de changement a un rôle différent, donc la forme varie de l&amp;#39;un à l&amp;#39;autre.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type de changement&lt;/th&gt;
&lt;th&gt;L&amp;#39;entrée doit dire&lt;/th&gt;
&lt;th&gt;Où la placer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Nouvelle fonctionnalité&lt;/td&gt;
&lt;td&gt;Ce que le lecteur peut faire maintenant, et qui y a accès&lt;/td&gt;
&lt;td&gt;En haut des notes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amélioration&lt;/td&gt;
&lt;td&gt;Ce qui est devenu plus rapide ou plus simple, avec un chiffre si possible&lt;/td&gt;
&lt;td&gt;Après les fonctionnalités&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correctif&lt;/td&gt;
&lt;td&gt;Le symptôme que le lecteur a vu, et que c&amp;#39;est corrigé&lt;/td&gt;
&lt;td&gt;Après les améliorations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changement cassant&lt;/td&gt;
&lt;td&gt;Qui est concerné, la date, la migration&lt;/td&gt;
&lt;td&gt;Toujours en premier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correctif de sécurité&lt;/td&gt;
&lt;td&gt;Ce qui était exposé, si cela a été exploité, quoi faire&lt;/td&gt;
&lt;td&gt;En premier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dépréciation&lt;/td&gt;
&lt;td&gt;Ce qui disparaît, la date de fin, le remplacement&lt;/td&gt;
&lt;td&gt;Près du haut&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Note pour l&amp;#39;app store&lt;/td&gt;
&lt;td&gt;Une phrase simple par changement, dans la limite de caractères&lt;/td&gt;
&lt;td&gt;Fiche de la boutique&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Note interne&lt;/td&gt;
&lt;td&gt;Ce qui a changé et ce qu&amp;#39;il faut dire aux clients&lt;/td&gt;
&lt;td&gt;Canaux support et ventes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;À quoi ressemble une bonne note de nouvelle fonctionnalité ?&lt;/h2&gt;
&lt;p&gt;Une bonne note de fonctionnalité s&amp;#39;ouvre sur ce que le lecteur peut faire maintenant et nomme les plans ou les rôles qui y ont accès. Elle laisse de côté l&amp;#39;implémentation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Envoyez vos factures dans la langue du client.&lt;/strong&gt;
Vous pouvez désormais choisir une langue pour chaque client, et ses factures, ses relances et sa page de paiement la suivent. Le français, l&amp;#39;allemand, l&amp;#39;espagnol et le portugais sont disponibles sur tous les plans. Réglez-la depuis la page du client, sous Préférences de facturation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le titre est une phrase que le lecteur dirait à voix haute, et le corps donne la portée et l&amp;#39;emplacement. Un lecteur qui ne parcourt que la ligne en gras sait déjà ce qui est sorti. La méthode générale est dans &lt;a href=&quot;https://changeloop.dev/blog/fr/how-to-write-release-notes/&quot;&gt;comment écrire des release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble une bonne note d&amp;#39;amélioration ?&lt;/h2&gt;
&lt;p&gt;Une note d&amp;#39;amélioration décrit un changement que le lecteur va ressentir, et y met un chiffre mesuré quand il en existe un. Sans chiffre, dites ce que le lecteur n&amp;#39;a plus à faire.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;La liste des factures se charge environ trois fois plus vite.&lt;/strong&gt;
Les comptes de plus de 5 000 factures attendaient environ neuf secondes pour la liste. Elle s&amp;#39;ouvre maintenant en trois secondes environ. Aucune action requise.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;quot;Améliorations de performance&amp;quot; ne dit rien au lecteur, alors que neuf secondes contre trois est une affirmation qu&amp;#39;il peut vérifier lundi matin. Le &amp;quot;Aucune action requise&amp;quot; final répond à la question que chaque lecteur se pose.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble une bonne note de correctif ?&lt;/h2&gt;
&lt;p&gt;Une note de correctif décrit le symptôme que l&amp;#39;utilisateur a vu, pas la cause dans le code, et dit s&amp;#39;il doit refaire quelque chose. Les corrections que personne n&amp;#39;a remarquées peuvent aller dans la liste du bas.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Corrigé : e-mails de relance envoyés en double le jour d&amp;#39;échéance.&lt;/strong&gt;
Certains clients recevaient deux relances identiques lorsque leur facture arrivait à échéance le dernier jour d&amp;#39;un mois. C&amp;#39;est corrigé. Les relances déjà envoyées ne sont pas concernées, et personne n&amp;#39;a besoin de rien renvoyer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le titre commence par &amp;quot;Corrigé&amp;quot; pour qu&amp;#39;un lecteur qui survole puisse trier d&amp;#39;un coup d&amp;#39;œil, et la vraie condition (le dernier jour du mois) suit aussitôt.&lt;/p&gt;
&lt;h2&gt;Comment rédiger des release notes pour un changement cassant ?&lt;/h2&gt;
&lt;p&gt;Une note de changement cassant commence par la date et le groupe concerné, puis donne la migration dans la même entrée. Elle va en premier dans les release notes, parce que c&amp;#39;est l&amp;#39;entrée qu&amp;#39;un lecteur ne doit pas manquer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Les signatures de webhook deviennent obligatoires le 1er décembre 2026.&lt;/strong&gt;
À partir de cette date, Tidepool cesse d&amp;#39;envoyer des charges utiles de webhook non signées. Cela concerne toute personne qui reçoit des webhooks sans vérifier l&amp;#39;en-tête &lt;code&gt;Tidepool-Signature&lt;/code&gt;. Pour migrer, vérifiez l&amp;#39;en-tête avec le secret sous Paramètres, Développeurs. Si vous vérifiez déjà les signatures, aucune action requise.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La date est dans le titre, donc elle survit à une lecture en diagonale. Le groupe concerné est désigné par ce qu&amp;#39;il fait, et la dernière phrase libère ceux qui sont déjà en règle, ce qui réduit la charge du support. Le guide sur les &lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;changements cassants&lt;/a&gt; explique comment décider si un changement en est un.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble une note de correctif de sécurité ?&lt;/h2&gt;
&lt;p&gt;Une note de sécurité dit ce qui était exposé, si quelqu&amp;#39;un l&amp;#39;a exploité, qui est concerné et ce qu&amp;#39;il doit faire. Restez factuel et calme.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sécurité : des liens de réinitialisation de mot de passe pouvaient être réutilisés.&lt;/strong&gt;
Entre le 3 et le 17 septembre 2026, un lien de réinitialisation de mot de passe restait valide après un premier usage. Nous n&amp;#39;avons trouvé aucun signe d&amp;#39;exploitation. C&amp;#39;est corrigé, et tous les liens de réinitialisation en attente ont été invalidés. Si vous avez demandé une réinitialisation pendant cette période, demandez un nouveau lien.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La période exacte permet au lecteur d&amp;#39;évaluer sa propre exposition, et la phrase sur l&amp;#39;exploitation répond à la première question que tout le monde pose. &amp;quot;Un problème potentiel&amp;quot; ressemble à de la dissimulation, alors dites ce que vous savez.&lt;/p&gt;
&lt;h2&gt;Comment rédiger un avis de dépréciation ?&lt;/h2&gt;
&lt;p&gt;Un avis de dépréciation nomme ce qui est retiré, donne une date de fin ferme et pointe vers le remplacement.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;L&amp;#39;endpoint v1 des factures est déprécié et prend fin le 1er mars 2027.&lt;/strong&gt;
&lt;code&gt;GET /v1/invoices&lt;/code&gt; continue de fonctionner jusqu&amp;#39;au 1er mars 2027, puis renvoie &lt;code&gt;410 Gone&lt;/code&gt;. Utilisez
&lt;code&gt;GET /v2/invoices&lt;/code&gt;, qui renvoie les mêmes champs plus &lt;code&gt;currency&lt;/code&gt;. Les réponses de v1 incluent
désormais un en-tête &lt;code&gt;Sunset&lt;/code&gt; avec la date de fin. Un guide de migration côte à côte est dans la
documentation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le nom de l&amp;#39;endpoint est dans le titre, parce que les personnes concernées le recherchent, et le remplacement se trouve à côté du retrait. L&amp;#39;en-tête &lt;code&gt;Sunset&lt;/code&gt; indique aux développeurs quels appels utilisent encore l&amp;#39;ancienne version. Le traitement plus long est dans &lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;déprécier une API&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble une note de release pour l&amp;#39;app store ?&lt;/h2&gt;
&lt;p&gt;Une note pour l&amp;#39;app store tient en deux ou trois phrases simples, parce que la plupart des gens ne lisent que la première ligne. Commencez par le changement qu&amp;#39;un utilisateur remarquerait.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Scannez un reçu papier et Tidepool remplit le montant, la date et le fournisseur. Le mode sombre suit désormais le réglage de votre téléphone. Nous avons aussi corrigé un plantage à l&amp;#39;ouverture d&amp;#39;une facture depuis une notification.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le changement le plus utile vient en premier, et la correction nomme la situation qui plantait. Pas de numéro de version et pas de &amp;quot;corrections de bugs et améliorations&amp;quot;. &lt;a href=&quot;https://changeloop.dev/blog/fr/mobile-app-release-notes/&quot;&gt;Les release notes pour applications mobiles&lt;/a&gt; couvrent les règles propres aux boutiques.&lt;/p&gt;
&lt;h2&gt;Que doit contenir une note de release interne ?&lt;/h2&gt;
&lt;p&gt;Une note interne est la version pour le support et les ventes. Elle ajoute ce que la note publique omet : ce qu&amp;#39;il faut dire, et ce qu&amp;#39;il faut éviter de promettre.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Les factures multilingues sont sorties aujourd&amp;#39;hui (tous les plans).&lt;/strong&gt;
Support : les clients règlent la langue sous Préférences de facturation, et les factures existantes gardent leur langue d&amp;#39;origine. L&amp;#39;italien n&amp;#39;est pas encore disponible. Ventes : c&amp;#39;est ouvert à tous les plans, ne le présentez donc pas comme une montée en gamme.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Chaque public a sa propre ligne étiquetée, et la note pose la limite (&amp;quot;L&amp;#39;italien n&amp;#39;est pas encore disponible&amp;quot;) avant qu&amp;#39;un client ne la demande. L&amp;#39;article sur les &lt;a href=&quot;https://changeloop.dev/blog/fr/internal-release-notes/&quot;&gt;notes de release internes&lt;/a&gt; couvre le format et les canaux.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble une mauvaise note de release, réécrite ?&lt;/h2&gt;
&lt;p&gt;Une mauvaise note de release énumère ce que l&amp;#39;équipe a fait au lieu de ce que le lecteur obtient. Corrigez-la en mettant le résultat en tête et en supprimant le vocabulaire interne.&lt;/p&gt;
&lt;p&gt;Avant :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;v3.8.1&lt;/strong&gt; Refactorisation du planificateur de relances. Correction d&amp;#39;une race condition dans &lt;code&gt;ReminderJob&lt;/code&gt;. Mise à jour de &lt;code&gt;bull&lt;/code&gt; en 4.12. Améliorations diverses.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Après :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Les e-mails de relance ne partent plus en double.&lt;/strong&gt;
Les clients dont une facture arrivait à échéance le dernier jour d&amp;#39;un mois pouvaient recevoir deux relances. C&amp;#39;est corrigé, et les relances déjà envoyées n&amp;#39;ont pas besoin d&amp;#39;être renvoyées. Aucune action requise.&lt;/p&gt;
&lt;p&gt;Aussi dans 3.8.1 : &lt;code&gt;bull&lt;/code&gt; mis à jour en 4.12.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La mise à jour de dépendance est descendue en pied de note, et la race condition est devenue un symptôme qu&amp;#39;un client reconnaîtrait.&lt;/p&gt;
&lt;h2&gt;Comment garder des release notes cohérentes d&amp;#39;une version à l&amp;#39;autre ?&lt;/h2&gt;
&lt;p&gt;Rédigez chaque entrée quand le changement est fusionné, et faites-la approuver par une personne avant la livraison.&lt;/p&gt;
&lt;p&gt;Changeloop fonctionne ainsi : il rédige une entrée à partir de chaque pull request fusionnée avec l&amp;#39;IA et la retient jusqu&amp;#39;à ce qu&amp;#39;un humain l&amp;#39;approuve. C&amp;#39;est à l&amp;#39;étape d&amp;#39;approbation qu&amp;#39;un éditeur applique les règles ci-dessus. Pour fixer d&amp;#39;abord le format, partez du &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;modèle de release notes&lt;/a&gt;, et consultez des &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;exemples de changelog&lt;/a&gt; pour voir à quoi ressemblent des pages terminées.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Que sont de nouvelles release notes ?&lt;/strong&gt;
De nouvelles release notes sont le message publié avec la dernière version d&amp;#39;un produit, qui décrit ce qui a changé et ce que les utilisateurs doivent faire. Elles couvrent les fonctionnalités, les améliorations, les correctifs et les changements cassants.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre une release note et un changelog ?&lt;/strong&gt;
Le changelog garde tout, pour quiconque veut l&amp;#39;historique complet. Une release note y puise : une seule version, écrite pour les lecteurs qui se demandent si elle les concerne. La comparaison complète est dans &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-vs-release-notes/&quot;&gt;changelog vs release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que signifie release notes ?&lt;/strong&gt;
Les release notes disent aux utilisateurs ce qui a changé dans une version. L&amp;#39;expression couvre tout ce qui explique ce qui est sorti, d&amp;#39;un texte &amp;quot;Nouveautés&amp;quot; de l&amp;#39;app store à une page du site d&amp;#39;une entreprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle longueur pour chaque entrée de release notes ?&lt;/strong&gt;
Deux à quatre phrases suffisent pour la plupart des entrées : le résultat, les personnes concernées et quoi faire. Un changement cassant ou un correctif de sécurité peut être plus long, car il faut une date ou une migration.&lt;/p&gt;
</content:encoded></item><item><title>Versionnage de l&apos;API Stripe : fonctionnement et à copier</title><link>https://changeloop.dev/blog/fr/stripe-api-versioning/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/stripe-api-versioning/</guid><description>Le versionnage de l&apos;API Stripe épingle chaque compte sur une version datée et laisse chaque requête la changer. Fonctionnement, coût, ce qu&apos;on peut copier.</description><pubDate>Fri, 02 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Le versionnage de l&amp;#39;API Stripe fonctionne par date. Chaque compte est épinglé sur une version d&amp;#39;API nommée d&amp;#39;après une date de publication, et n&amp;#39;importe quelle requête peut remplacer cet épinglage avec un en-tête &lt;code&gt;Stripe-Version&lt;/code&gt;. Au moment de la rédaction (octobre 2026), la version actuelle dans la documentation de Stripe est &lt;code&gt;2026-09-30.endive&lt;/code&gt;, et le même schéma est à la portée d&amp;#39;une API bien plus petite, en un week-end.&lt;/p&gt;
&lt;p&gt;Chaque fait sur Stripe ci-dessous vient des pages de Stripe elles-mêmes, liées à l&amp;#39;endroit où il est utilisé.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mécanisme&lt;/th&gt;
&lt;th&gt;Ce que fait Stripe&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Nom de version&lt;/td&gt;
&lt;td&gt;Une date, plus un nom de release depuis 2024 (&lt;code&gt;2026-09-30.endive&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version par défaut&lt;/td&gt;
&lt;td&gt;Épinglée sur le compte, modifiable dans Workbench&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remplacement par requête&lt;/td&gt;
&lt;td&gt;En-tête &lt;code&gt;Stripe-Version&lt;/code&gt;, ou l&amp;#39;option du SDK&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;Upgrades&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webhooks&lt;/td&gt;
&lt;td&gt;Rendus dans la version définie sur l&amp;#39;endpoint&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;Upgrades&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rythme&lt;/td&gt;
&lt;td&gt;Releases mensuelles sans changement cassant, une release majeure deux fois par an&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;Versioning&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anciennes versions&lt;/td&gt;
&lt;td&gt;Maintenues grâce à des modules internes de changement de version&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://stripe.com/blog/api-versioning&quot;&gt;Engineering post&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Comment fonctionne le versionnage de l&amp;#39;API Stripe ?&lt;/h2&gt;
&lt;p&gt;Stripe donne à chaque compte une version d&amp;#39;API par défaut, et toute requête qui ne nomme pas de version l&amp;#39;utilise. Les appelants choisissent quand changer, en modifiant la valeur par défaut ou en indiquant une version sur chaque requête.&lt;/p&gt;
&lt;p&gt;L&amp;#39;article d&amp;#39;ingénierie de Stripe explique que le compte est épinglé dès sa première requête à l&amp;#39;API : il est &amp;quot;automatically pinned to the most recent version available&amp;quot;, et ensuite chaque appel se voit attribuer cette version de manière implicite.&lt;/p&gt;
&lt;p&gt;La version est une chaîne de date. Depuis la release &lt;code&gt;2024-09-30.acacia&lt;/code&gt;, elle porte aussi un nom, comme dans &lt;code&gt;2026-09-30.endive&lt;/code&gt;. La date ordonne les versions, et le nom indique à quelle famille de release majeure appartient une version.&lt;/p&gt;
&lt;h2&gt;Comment choisir une version par requête ?&lt;/h2&gt;
&lt;p&gt;Envoyez l&amp;#39;en-tête &lt;code&gt;Stripe-Version&lt;/code&gt; avec la requête, ou définissez la version dans le SDK. Le guide de mise à niveau de Stripe montre la forme avec l&amp;#39;en-tête, et le même appel fonctionne en production comme en test.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;curl https://api.stripe.com/v1/charges \
  -u &amp;quot;$STRIPE_SECRET_KEY:&amp;quot; \
  -H &amp;quot;Stripe-Version: 2026-09-30.endive&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le guide de Stripe précise que lorsque vous définissez la version globalement ou par requête dans un SDK, les objets de réponse reviennent dans cette version.&lt;/p&gt;
&lt;p&gt;Stripe déconseille aussi de s&amp;#39;appuyer sur la valeur par défaut du compte. Selon ses termes, indiquez la version pour chaque requête, avec l&amp;#39;en-tête ou un SDK épinglé, afin que votre code décide de la version et non un réglage du tableau de bord.&lt;/p&gt;
&lt;p&gt;Les SDK s&amp;#39;épinglent différemment selon le langage. La documentation dit que les versions récentes des bibliothèques à typage dynamique utilisent la version d&amp;#39;API qui était la plus récente à la sortie de cette version du SDK, et que les bibliothèques fortement typées (Java, Go et .NET) y sont fixées. Installer une version de bibliothèque revient, en pratique, à choisir une version d&amp;#39;API.&lt;/p&gt;
&lt;h2&gt;Que deviennent les webhooks quand la version change ?&lt;/h2&gt;
&lt;p&gt;Un événement webhook est rendu dans la version d&amp;#39;API rattachée à son endpoint, et non dans celle que le code de votre serveur utilise. La documentation de Stripe indique que les événements utilisent la version définie à la création de l&amp;#39;endpoint, et sinon la valeur par défaut du compte. Changer la version de votre SDK ne change pas ce que reçoit votre gestionnaire de webhooks.&lt;/p&gt;
&lt;p&gt;Votre chemin de requêtes et votre chemin d&amp;#39;événements peuvent donc reposer sur deux versions différentes. Pour les destinations d&amp;#39;événements, vous ne définissez &lt;code&gt;snapshot_api_version&lt;/code&gt; qu&amp;#39;à la création de la destination ; une autre version signifie donc une nouvelle destination.&lt;/p&gt;
&lt;p&gt;Le chemin de mise à niveau de Stripe pour cela est une exécution en parallèle. Créez un nouvel endpoint à la version cible, envoyez les mêmes événements aux deux, apprenez au gestionnaire à traiter l&amp;#39;un et à ignorer l&amp;#39;autre, puis basculez et désactivez l&amp;#39;ancien endpoint. Comme chaque événement arrive deux fois pendant le chevauchement, le gestionnaire doit être idempotent. C&amp;#39;est un bon schéma à copier pour toute API qui émet des événements, et &lt;a href=&quot;https://changeloop.dev/blog/fr/webhook-changelog/&quot;&gt;un changelog de webhooks&lt;/a&gt; est l&amp;#39;endroit où annoncer les changements de charge utile qui le rendent nécessaire.&lt;/p&gt;
&lt;h2&gt;Que sont les releases mensuelles et majeures ?&lt;/h2&gt;
&lt;p&gt;Depuis la release &lt;code&gt;2024-09-30.acacia&lt;/code&gt;, Stripe publie une nouvelle version d&amp;#39;API chaque mois sans changement cassant, et émet une nouvelle release majeure deux fois par an, qui démarre avec une version contenant des changements cassants. Sa page de versionnage indique que vous pouvez passer à n&amp;#39;importe quelle release mensuelle sans modifier votre code, alors qu&amp;#39;une release majeure peut exiger des changements.&lt;/p&gt;
&lt;p&gt;Les releases majeures portent des noms. La page de versionnage donne Basil en exemple, et l&amp;#39;annonce du processus par Stripe dit que les noms viennent de plantes, en commençant par Acacia, et que les releases mensuelles gardent le nom de la release majeure qui les précède pour signaler qu&amp;#39;on peut les adopter sans risque. Le &lt;a href=&quot;https://docs.stripe.com/changelog&quot;&gt;changelog&lt;/a&gt; de Stripe liste les noms en usage, et au moment de la rédaction l&amp;#39;entrée la plus récente est &lt;code&gt;2026-09-30.endive&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La date répond donc à &amp;quot;quelle fraîcheur&amp;quot;, et le nom à &amp;quot;est-ce une frontière cassante&amp;quot;. L&amp;#39;annonce de Stripe garde aussi une marge pour les exceptions : elle se réserve le droit de publier un changement cassant hors cycle lorsqu&amp;#39;une intégration serait gravement touchée sans lui. L&amp;#39;annonce est sur &lt;a href=&quot;https://stripe.com/blog/introducing-stripes-new-api-release-process&quot;&gt;Stripe&amp;#39;s new API release process&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Quelle est la dernière version de l&amp;#39;API Stripe ?&lt;/h2&gt;
&lt;p&gt;Au moment de la rédaction (octobre 2026), la page de versionnage de Stripe indique que la version actuelle est &lt;code&gt;2026-09-30.endive&lt;/code&gt;, et son changelog liste la même version comme la plus récente. Stripe publie une nouvelle version chaque mois, donc toute chaîne imprimée dans un article vieillit vite. Lisez le changelog en direct avant d&amp;#39;épingler quoi que ce soit, et épinglez la version contre laquelle vous avez testé.&lt;/p&gt;
&lt;h2&gt;Comment Stripe maintient-il les anciennes versions ?&lt;/h2&gt;
&lt;p&gt;Stripe garde les anciennes versions en vie en écrivant chaque changement cassant sous forme de module de changement de version autonome et en appliquant les modules à rebours depuis la forme la plus récente des données. Son &lt;a href=&quot;https://stripe.com/blog/api-versioning&quot;&gt;article d&amp;#39;ingénierie sur le versionnage d&amp;#39;API&lt;/a&gt; décrit le mécanisme.&lt;/p&gt;
&lt;p&gt;Chaque module déclare ce qu&amp;#39;il change, documente le changement et inclut une fonction de transformation. L&amp;#39;article donne l&amp;#39;exemple d&amp;#39;un champ qui passe d&amp;#39;une chaîne à un hash. Pour construire une réponse, le système détermine la version cible, puis remonte le temps en appliquant chaque module rencontré en chemin jusqu&amp;#39;à atteindre cette version.&lt;/p&gt;
&lt;p&gt;Deux effets de bord découlent de cette conception, et l&amp;#39;article nomme les deux. Comme les modules déclarent les champs et ressources qu&amp;#39;ils touchent, Stripe peut générer son changelog d&amp;#39;API à partir d&amp;#39;eux au déploiement. Et comme la version du compte est connue, la documentation peut s&amp;#39;y adapter et avertir des changements rétro-incompatibles depuis cette version.&lt;/p&gt;
&lt;h2&gt;Que coûte-t-il, et que doit copier une API plus petite ?&lt;/h2&gt;
&lt;p&gt;Le versionnage coûte de l&amp;#39;attention d&amp;#39;ingénierie, et Stripe le dit. L&amp;#39;article reconnaît une charge de maintenance et pose comme objectif que moins il faut penser aux anciens comportements en écrivant du nouveau code, mieux c&amp;#39;est. Il décrit aussi des revues d&amp;#39;API légères avant la sortie, pour éviter d&amp;#39;avoir besoin d&amp;#39;un changement de version.&lt;/p&gt;
&lt;p&gt;Une petite API n&amp;#39;a pas les moyens d&amp;#39;avoir une chaîne de modules pour chaque ancienne version, et n&amp;#39;en a pas besoin. Copiez les éléments qui portent la valeur :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Des versions datées.&lt;/strong&gt; Une date n&amp;#39;exige aucun jugement sur ce qui compte comme &amp;quot;majeur&amp;quot;, et les appelants peuvent la lire. L&amp;#39;article sur les &lt;a href=&quot;https://changeloop.dev/blog/fr/api-versioning-best-practices/&quot;&gt;bonnes pratiques de versionnage&lt;/a&gt; la compare aux schémas par URL et par en-tête.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une version par défaut épinglée.&lt;/strong&gt; Fixez le compte ou la clé sur la version au premier usage, pour que l&amp;#39;API ne bouge jamais sous une intégration qui fonctionne.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un remplacement par requête.&lt;/strong&gt; Un en-tête qui permet à un appelant de tester une nouvelle version sur un seul appel, en production, avant de s&amp;#39;engager.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une version sur l&amp;#39;endpoint de webhook.&lt;/strong&gt; Les charges utiles d&amp;#39;événements sont l&amp;#39;endroit où les appelants sont le plus surpris.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une entrée de changelog par version.&lt;/strong&gt; Qu&amp;#39;elle nomme la version, la date, les personnes concernées et ce qu&amp;#39;il faut faire. &lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;Ce qui compte comme cassant&lt;/a&gt; est le test de ce qui a sa place dans une nouvelle version, et l&amp;#39;article sur le &lt;a href=&quot;https://changeloop.dev/blog/fr/api-changelog/&quot;&gt;changelog d&amp;#39;API&lt;/a&gt; couvre l&amp;#39;entrée elle-même.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sautez la chaîne de modules jusqu&amp;#39;à ce que le nombre de versions prises en charge l&amp;#39;impose. Deux ou trois versions actives se gèrent avec quelques branches et une date d&amp;#39;arrêt, que &lt;a href=&quot;https://changeloop.dev/blog/fr/sunsetting-api-version/&quot;&gt;mettre fin à une version d&amp;#39;API&lt;/a&gt; détaille.&lt;/p&gt;
&lt;p&gt;Si vous publiez un changelog daté, l&amp;#39;historique des versions ne vaut que ce que valent ses entrées. Dans &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Changeloop&lt;/a&gt;, une entrée brouillon est créée à partir de chaque pull request fusionnée et retenue jusqu&amp;#39;à l&amp;#39;approbation d&amp;#39;un humain avant d&amp;#39;être publiée sur la page de changelog et le flux. C&amp;#39;est là qu&amp;#39;on écrit l&amp;#39;entrée de chaque version, et l&amp;#39;unique validation humaine est la relecture qui dit ce qu&amp;#39;un appelant doit faire.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la dernière version de l&amp;#39;API Stripe ?&lt;/strong&gt;
Au moment de la rédaction (octobre 2026), la page de versionnage de Stripe indique que la version actuelle est &lt;code&gt;2026-09-30.endive&lt;/code&gt;. Stripe publie une nouvelle version chaque mois ; consultez donc son changelog avant d&amp;#39;épingler, et écrivez la version dans votre code au lieu de vous fier à la valeur par défaut du compte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment définir la version de l&amp;#39;API Stripe sur une requête ?&lt;/strong&gt;
Envoyez l&amp;#39;en-tête &lt;code&gt;Stripe-Version&lt;/code&gt;, par exemple &lt;code&gt;Stripe-Version: 2026-09-30.endive&lt;/code&gt;, ou définissez la version dans votre SDK côté serveur, globalement ou par requête. Sans l&amp;#39;un ni l&amp;#39;autre, une requête utilise la version par défaut de votre compte, que vous définissez dans Workbench.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les webhooks utilisent-ils la même version de l&amp;#39;API Stripe que mes requêtes ?&lt;/strong&gt;
Pas forcément. Les événements webhook utilisent la version définie à la création de l&amp;#39;endpoint, et la valeur par défaut du compte si aucune n&amp;#39;a été définie. Mettre à jour votre SDK ne change pas la charge utile que reçoit votre gestionnaire de webhooks ; mettez donc les endpoints à niveau séparément et testez-les en parallèle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le versionnage par date à la Stripe convient-il à une petite API ?&lt;/strong&gt;
Des versions datées, une version par défaut épinglée, un en-tête par requête et une entrée de changelog par version coûtent peu et valent d&amp;#39;être copiés. La chaîne interne de modules de changement de version, non, tant que vous n&amp;#39;avez pas à prendre en charge de nombreuses anciennes versions à la fois. Commencez avec deux versions actives et une date d&amp;#39;arrêt pour la plus ancienne.&lt;/p&gt;
</content:encoded></item><item><title>Qui écrit le changelog, et qui devrait l&apos;écrire</title><link>https://changeloop.dev/blog/fr/changelog-entry-ownership/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/changelog-entry-ownership/</guid><description>Qui écrit le changelog ? L&apos;autrice de la PR sait ce qui a changé, la PM pourquoi ça compte. Seule, aucune n&apos;écrit une entrée vraiment utile aux clients.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Demandez à une équipe qui écrit le changelog et la réponse honnête est généralement « qui s&amp;#39;en
souvient », ce qui est le même mode d&amp;#39;échec qu&amp;#39;&lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-ci-enforcement/&quot;&gt;imposer une entrée de changelog en
CI&lt;/a&gt; existe pour corriger au niveau mécanique. Mais forcer
l&amp;#39;existence d&amp;#39;une entrée ne décide pas qui est qualifiée pour bien l&amp;#39;écrire, et les équipes qui
sautent cette question ont tendance à se rabattre par défaut sur qui est le plus facile à
contraindre, généralement l&amp;#39;autrice de la PR, sans vérifier si c&amp;#39;est vraiment la personne qui peut
bien l&amp;#39;écrire.&lt;/p&gt;
&lt;h2&gt;Pourquoi l&amp;#39;autrice de la PR n&amp;#39;est-elle pas automatiquement la meilleure rédactrice de changelog ?&lt;/h2&gt;
&lt;p&gt;Parce qu&amp;#39;elle connaît l&amp;#39;implémentation, pas nécessairement l&amp;#39;impact, et ce sont deux types de
connaissance différents. &lt;a href=&quot;https://changeloop.dev/blog/fr/conventional-commits-changelog/&quot;&gt;Où s&amp;#39;arrêtent les conventional commits&lt;/a&gt;
couvre cet écart côté message de commit : &lt;code&gt;fix(auth): reject expired refresh tokens&lt;/code&gt; est correct
et ne dit rien à une cliente, et qui a écrit ce correctif est souvent la personne la moins équipée
pour le traduire, parce qu&amp;#39;elle a pensé en termes du bug pendant des heures et a perdu la vue
extérieure de ce qu&amp;#39;une utilisatrice a réellement vécu. C&amp;#39;est la même raison pour laquelle les
rédactrices techniques existent en tant que profession : traduire l&amp;#39;implémentation en impact est
une compétence distincte du fait d&amp;#39;avoir construit la chose, et ça demande de la pratique, peu
importe la qualité de la développeuse sur le code lui-même.&lt;/p&gt;
&lt;h2&gt;Cela signifie-t-il que le produit ou le support devraient écrire chaque entrée à la place ?&lt;/h2&gt;
&lt;p&gt;Non, parce qu&amp;#39;ils ont l&amp;#39;écart inverse : ils savent ce qui compte pour les utilisatrices mais pas
toujours ce qui a vraiment été livré, ce qui produit des entrées lisibles mais occasionnellement
fausses sur la portée, une affirmation « supporte maintenant X » pour une fonctionnalité encore
derrière un flag, ou un correctif décrit comme complet alors qu&amp;#39;il ne couvre qu&amp;#39;un cas sur trois.
Le mode d&amp;#39;échec des entrées écrites par des développeuses est illisible-mais-précis ; le mode
d&amp;#39;échec des entrées écrites par des PM est lisible-mais-non-vérifié. Aucun rôle ne possède les
deux moitiés de ce dont une bonne entrée a besoin.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rôle&lt;/th&gt;
&lt;th&gt;Réussit généralement&lt;/th&gt;
&lt;th&gt;Rate généralement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Développeuse qui a écrit le code&lt;/td&gt;
&lt;td&gt;Portée exacte de ce qui a changé&lt;/td&gt;
&lt;td&gt;Le cadrer pour quelqu&amp;#39;un qui ne l&amp;#39;a pas construit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PM ou responsable support&lt;/td&gt;
&lt;td&gt;Pourquoi ça compte pour l&amp;#39;utilisatrice&lt;/td&gt;
&lt;td&gt;Limites précises de ce qui a vraiment été livré&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responsable dédiée du changelog&lt;/td&gt;
&lt;td&gt;Voix cohérente, vérifie la portée croisée&lt;/td&gt;
&lt;td&gt;A besoin des deux ci-dessus pour vérifier&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;À quoi ressemble vraiment un modèle de propriété qui fonctionne ?&lt;/h2&gt;
&lt;p&gt;Un brouillon de qui est le plus proche du changement, revu par qui est le plus proche de
l&amp;#39;utilisatrice, avec une personne nommée responsable de la formulation finale au lieu que tout le
monde suppose que quelqu&amp;#39;un d&amp;#39;autre attrapera les problèmes. Le brouillon a davantage besoin
d&amp;#39;exister et d&amp;#39;être précis que d&amp;#39;être bon ; une phrase brute écrite par une développeuse qui dit
correctement ce qui a changé est un meilleur point de départ qu&amp;#39;une polie mais non vérifiée, parce
que réécrire pour la clarté est plus facile que réécrire pour la justesse. L&amp;#39;étape de revue est où
une PM ou responsable support lit le brouillon et pose la seule question qui attrape l&amp;#39;écart de
lisibilité : est-ce que je comprendrais ça si je n&amp;#39;avais pas vu le code.&lt;/p&gt;
&lt;h2&gt;La même personne devrait-elle toujours être la responsable, ou est-ce que ça tourne ?&lt;/h2&gt;
&lt;p&gt;Nommée et stable bat tournante, au moins pour la validation finale. Une responsable tournante
signifie que chaque entrée est revue par quelqu&amp;#39;un qui re-dérive les conventions de l&amp;#39;équipe à
partir de zéro, ce qui est exactement comment la voix dérive d&amp;#39;entrée en entrée et une lectrice
commence à remarquer que le changelog a été écrit par un comité. Une seule personne, ou un très
petit groupe stable, accumule les jugements avec le temps, quand dire « amélioré » plutôt que
nommer le chiffre spécifique, quand un correctif a besoin de sa propre entrée plutôt que d&amp;#39;être
fondu dans un lot, et ce jugement vaut plus que distribuer le travail équitablement.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Brouillon (développeuse, depuis la PR) :
&amp;quot;Fixed pagination cursor not respecting the `sort` param
in some edge cases.&amp;quot;

Revu (responsable du changelog, vérifié contre la vraie PR) :
&amp;quot;Corrigé : les exports triés par date pouvaient retourner
des résultats désordonnés au-delà de la première page.
Maintenant cohérent sur toutes les pages.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Une petite équipe a-t-elle besoin d&amp;#39;autant de processus pour une ligne de texte ?&lt;/h2&gt;
&lt;p&gt;Pas les rôles en tant que personnes séparées, mais les deux étapes comptent encore même en solo.
Une équipe d&amp;#39;une personne est à la fois la développeuse et la revieweuse, et la discipline qui
survit à cette échelle est de faire la revue comme un passage mental séparé, pas de sauter
directement de l&amp;#39;écriture du correctif à la publication d&amp;#39;une description de celui-ci dans le même
souffle. Le piège à petite échelle, c&amp;#39;est de sauter entièrement le deuxième passage, pas le manque
d&amp;#39;une deuxième personne, parce que personne d&amp;#39;externe ne l&amp;#39;impose, et l&amp;#39;écart de précision
que ce passage existe pour attraper ne disparaît pas juste parce que la même personne pourrait
théoriquement remarquer son propre angle mort.&lt;/p&gt;
&lt;h2&gt;Que se passe-t-il quand personne n&amp;#39;est responsable de l&amp;#39;entrée finale ?&lt;/h2&gt;
&lt;p&gt;Le changelog se dégrade de façon inégale plutôt que d&amp;#39;échouer carrément, ce qui est pire parce que
personne ne le remarque jusqu&amp;#39;à ce qu&amp;#39;une lectrice le signale. Certaines entrées restent nettes
parce que qui les a écrites s&amp;#39;en souciait ; d&amp;#39;autres deviennent vagues, « diverses améliorations
et corrections de bugs », parce que qui les a écrites allait vite et que personne ne l&amp;#39;a attrapé
avant publication. Les contraintes de format de &lt;a href=&quot;https://changeloop.dev/blog/fr/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt;
attrapent la dérive structurelle, dates manquantes, mauvaises catégories, mais rien dans un modèle
n&amp;#39;attrape une entrée vague qui est techniquement bien formatée, ce qui est exactement l&amp;#39;écart
qu&amp;#39;une responsable nommée est là pour combler.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;La responsable du changelog devrait-elle être un rôle d&amp;#39;ingénierie ou de produit ?&lt;/strong&gt;
Les deux peuvent fonctionner si la personne a à la fois la fluidité technique pour vérifier la
portée et assez de distance avec l&amp;#39;implémentation pour écrire pour une lectrice externe ; le titre
compte moins que si elle peut faire les deux moitiés, ou sait à qui demander pour la moitié qu&amp;#39;elle
ne peut pas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un planning tournant de type astreinte est-il jamais approprié pour la propriété du changelog ?&lt;/strong&gt;
Pour le volume, parfois, si l&amp;#39;équipe est trop petite pour qu&amp;#39;une personne revoie tout ; pour la
voix et le jugement, non, parce que c&amp;#39;est exactement ce que la rotation érode. Une rotation qui
partage la charge de rédaction tout en gardant une revieweuse stable obtient le bénéfice sans la
dérive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quel est le signe le plus rapide que quelque chose ne va pas avec la configuration actuelle de propriété ?&lt;/strong&gt;
Des entrées précises mais illisibles, ou lisibles mais fausses sur la portée, selon un schéma qui
suit qui les a écrites. Si la qualité corrèle avec l&amp;#39;autrice au lieu de rester cohérente, c&amp;#39;est la
propriété qui est l&amp;#39;écart, pas la compétence rédactionnelle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L&amp;#39;automatisation réduit-elle à quel point la propriété compte ?&lt;/strong&gt;
Elle réduit combien d&amp;#39;écriture est nécessaire, pas combien de jugement est nécessaire.
&lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-automation/&quot;&gt;L&amp;#39;automatisation du changelog&lt;/a&gt; couvre ce qu&amp;#39;un pipeline peut
générer en sécurité, formatage, publication, cross-posting ; la formulation, le regroupement et ce
qui compte comme digne de mention restent des décisions humaines peu importe combien du pipeline
est automatisé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que faire si l&amp;#39;autrice de la PR et la revieweuse ne sont pas d&amp;#39;accord sur la formulation ?&lt;/strong&gt;
C&amp;#39;est à la revieweuse de trancher, parce que la question à laquelle elle répond, une lectrice
extérieure comprendrait-elle ceci, est celle que le rôle existe pour protéger. Ça ne rend pas
l&amp;#39;avis de la développeuse sans valeur : si le désaccord porte sur la justesse plutôt que sur la
formulation, la revieweuse s&amp;#39;efface, parce que la portée est la moitié qui revient à l&amp;#39;autrice de
bien cadrer. Séparer les deux types de désaccord, formulation contre justesse, évite que la
plupart d&amp;#39;entre eux ne tournent à l&amp;#39;impasse.&lt;/p&gt;
</content:encoded></item><item><title>Release notes d&apos;urgence : écrire sous vraie pression</title><link>https://changeloop.dev/blog/fr/emergency-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/emergency-release-notes/</guid><description>Une version pilotée par un incident a besoin de notes écrites en minutes, pas en jours, et le processus habituel de rédaction suppose un temps absent.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;La plupart des release notes sont écrites une fois le code terminé, révisées tranquillement, et
publiées selon un calendrier qui n&amp;#39;a rien à voir avec l&amp;#39;urgence avec laquelle quelqu&amp;#39;un a besoin
de les lire. Une version d&amp;#39;urgence, un patch de sécurité, un bug de perte de données, la
correction d&amp;#39;une panne, inverse chacune de ces conditions à la fois : les notes doivent exister
avant que la plupart des gens commenceraient normalement à les écrire, reçoivent presque aucune
revue, et sont lues par des gens qui sont inquiets plutôt que détendus. &lt;a href=&quot;https://changeloop.dev/blog/fr/how-to-write-release-notes/&quot;&gt;Comment écrire des
release notes&lt;/a&gt; couvre le processus normal ; ceci porte sur
ce qui change quand il ne reste plus de temps pour le suivre.&lt;/p&gt;
&lt;h2&gt;Quelle est la seule chose qu&amp;#39;une release note d&amp;#39;urgence doit absolument réussir ?&lt;/h2&gt;
&lt;p&gt;Si la lectrice doit faire quelque chose, énoncé dans la première phrase, sans aucun cadrage avant.
Une lectrice qui tombe sur une release note pilotée par un incident est souvent déjà inquiète,
ayant entendu parler du problème via une page de statut, un fil de support, ou ses propres
utilisatrices, et une note qui commence par du contexte avant l&amp;#39;action à entreprendre se lit comme
une rétention d&amp;#39;information exactement dans les circonstances où retenir se lit le plus mal.
« Aucune action nécessaire, ceci corrige une vulnérabilité qui ne nécessitait aucune donnée
utilisateur pour être exploitée » et « Mettez à jour immédiatement : cette version corrige un bug
qui pouvait montrer les données d&amp;#39;un compte à un autre » sont toutes deux une phrase, et toutes
deux font tout le travail dont une lectrice paniquée a besoin avant de lire quoi que ce soit
d&amp;#39;autre.&lt;/p&gt;
&lt;h2&gt;Le passage d&amp;#39;édition habituel s&amp;#39;applique-t-il encore quand il n&amp;#39;y a pas le temps d&amp;#39;en faire un ?&lt;/h2&gt;
&lt;p&gt;L&amp;#39;instinct de compresser survit même quand le processus à plusieurs brouillons qui le produit
habituellement ne le fait pas. &lt;a href=&quot;https://changeloop.dev/blog/fr/how-to-write-release-notes/&quot;&gt;La réécriture&lt;/a&gt; décrit le
fait de couper un premier brouillon verbeux jusqu&amp;#39;à sa phrase essentielle ; sous pression de temps
il n&amp;#39;y a souvent pas de premier brouillon à couper, ce qui signifie que la discipline doit tourner
dans votre tête pendant que vous écrivez plutôt que comme passage séparé après. La façon la plus
rapide de l&amp;#39;approximer : écrivez la phrase que vous diriez à voix haute à quelqu&amp;#39;un qui demande
« qu&amp;#39;est-ce que je dois savoir », puis arrêtez-vous, parce que cette phrase est généralement à la
fois la plus rapide à produire et la seule qu&amp;#39;une lectrice dans cet état traitera vraiment.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Release note normale&lt;/th&gt;
&lt;th&gt;Release note d&amp;#39;urgence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Écrite après revue de code, avant publication&lt;/td&gt;
&lt;td&gt;Souvent écrite en même temps que le correctif, avant revue complète&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optimisée pour la lisibilité rapide parmi de nombreuses entrées&lt;/td&gt;
&lt;td&gt;Optimisée pour qu&amp;#39;une entrée soit lue isolément, sous stress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peut renvoyer le détail vers un changelog lié&lt;/td&gt;
&lt;td&gt;Devrait mettre en avant le seul fait le plus important&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Le cadrage et le contexte sont bienvenus&lt;/td&gt;
&lt;td&gt;Le cadrage avant l&amp;#39;action à entreprendre se lit comme un délai&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Est-il jamais acceptable de publier une note avant d&amp;#39;être totalement sûr de la cause du problème ?&lt;/h2&gt;
&lt;p&gt;Oui, si la note est honnête sur cette incertitude au lieu de laisser entendre une confiance que
vous n&amp;#39;avez pas. « Nous avons déployé un correctif pour des taux d&amp;#39;erreur élevés au paiement ;
nous confirmons encore la cause racine et mettrons à jour cette note » est défendable et gagne du
temps correctement ; une note qui affirme une cause spécifique que vous n&amp;#39;avez pas réellement
confirmée est le genre d&amp;#39;hypothèse qui devient ce qu&amp;#39;on vous cite plus tard si ça s&amp;#39;avère faux. La
discipline qui compte ici n&amp;#39;est pas la vitesse de diagnostic, c&amp;#39;est de ne jamais laisser la
confiance de la note dépasser la confiance réelle de l&amp;#39;équipe, parce qu&amp;#39;une affirmation technique
fausse dans une note d&amp;#39;urgence fait plus de dégât à la confiance qu&amp;#39;un inconnu admis.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Trop confiant, non vérifié :
&amp;quot;Corrigé : une race condition dans le gestionnaire du
webhook de paiement causait des débits en double.&amp;quot;

Honnête sous pression de temps :
&amp;quot;Corrigé : certaines clientes ont été débitées deux fois
pour une même commande. Nous avons arrêté les nouvelles
occurrences et remboursons les comptes concernés sous
24 heures. Enquête sur la cause racine en cours.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Une note d&amp;#39;urgence devrait-elle dire ce qui a causé le problème, ou juste que c&amp;#39;est corrigé ?&lt;/h2&gt;
&lt;p&gt;Dites ce qui est corrigé et ce que la lectrice devrait faire ; gardez la cause racine pour un
suivi une fois qu&amp;#39;elle est vraiment connue, pas devinée. Une lectrice en plein incident veut
exactement deux faits, est-ce résolu et est-ce que ça me concerne, et une explication de cause
racine, même précise, entre en concurrence avec ces deux faits pour l&amp;#39;attention au pire moment
possible pour la perdre. Le post-mortem, publié séparément une fois l&amp;#39;enquête terminée, est là où
appartient la cause racine ; mélanger les deux documents sous pression de temps produit une note
plus lente à écrire et plus lente à lire, l&amp;#39;inverse de ce dont une urgence a besoin.&lt;/p&gt;
&lt;h2&gt;Le problème de la mise à jour forcée des applications mobiles s&amp;#39;applique-t-il aussi ici ?&lt;/h2&gt;
&lt;p&gt;Le même principe, encore plus compressé. &lt;a href=&quot;https://changeloop.dev/blog/fr/mobile-app-release-notes/&quot;&gt;Release notes pour les applications mobiles&lt;/a&gt;
couvre les mises à jour forcées, où la note doit énoncer la raison et l&amp;#39;échéance avant tout parce
que la lectrice est déjà agacée de n&amp;#39;avoir aucun choix ; une release note d&amp;#39;urgence web est
généralement opt-in pour la lectrice dans le sens où elle choisit si elle agit dessus, mais le
même instinct « énoncer la contrainte en premier » s&amp;#39;applique, juste pour une raison différente :
pas l&amp;#39;agacement, l&amp;#39;urgence.&lt;/p&gt;
&lt;h2&gt;Comment éviter qu&amp;#39;une note d&amp;#39;urgence se lise comme un aveu de faute quand elle ne devrait pas ?&lt;/h2&gt;
&lt;p&gt;Décrivez le correctif et son effet, pas la faute, et résistez à l&amp;#39;envie de trop vous excuser, ce
qui se lit comme du remplissage pour une lectrice qui veut les deux faits ci-dessus. « Nous avons
trouvé et corrigé un bug affectant certains exports » dit ce qui s&amp;#39;est passé sans lui assigner de
drame ; « Nous sommes incroyablement désolés pour ce problème sérieux qui a affecté nos précieuses
clientes » retarde l&amp;#39;information utile d&amp;#39;une phrase entière pour livrer un moment émotionnel que
la lectrice n&amp;#39;a pas demandé. Une note courte et factuelle n&amp;#39;est pas froide, elle respecte l&amp;#39;état
réel de la lectrice, qui sous vraie pression est l&amp;#39;impatience, pas un besoin de réconfort.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Une release note d&amp;#39;urgence devrait-elle passer par le même processus de revue qu&amp;#39;une normale ?&lt;/strong&gt;
Un plus léger, pas aucun : une seule revieweuse rapide vérifiant que la note n&amp;#39;exagère pas la
certitude vaut les quelques minutes que ça coûte, parce que le risque qu&amp;#39;une affirmation technique
non revue soit fausse est plus élevé précisément parce qu&amp;#39;elle a été écrite vite.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Est-ce acceptable de publier une note d&amp;#39;urgence sans aucun lien vers plus de détails ?&lt;/strong&gt;
Seulement brièvement. Une note sans lien fonctionne comme la première chose publiée ; ajoutez-en
un vers une page de statut ou un suivi dès que l&amp;#39;un des deux existe, parce qu&amp;#39;une lectrice qui
veut plus que la seule phrase que vous lui avez donnée a besoin d&amp;#39;un endroit où aller, même si cet
endroit dit « plus de détails bientôt ».&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une note d&amp;#39;urgence devrait-elle jamais être complètement sautée, laissant le correctif se livrer en silence ?&lt;/strong&gt;
Seulement pour des problèmes qu&amp;#39;aucune lectrice n&amp;#39;aurait pu remarquer ni avoir subis ; s&amp;#39;il y a la
moindre chance qu&amp;#39;une lectrice ait vécu le problème, la note est ce qui lui dit que c&amp;#39;est terminé,
et le silence se lit comme si le problème pouvait encore être actif.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combien de temps une note d&amp;#39;urgence devrait-elle rester épinglée ou visible après résolution de l&amp;#39;incident ?&lt;/strong&gt;
Jusqu&amp;#39;à ce que la fenêtre d&amp;#39;anxiété immédiate se referme, typiquement un jour ou deux, puis elle
peut se replier dans le changelog normal comme n&amp;#39;importe quelle autre entrée ; une note qui reste
épinglée pendant des semaines commence à se lire comme une préoccupation non résolue plutôt que
résolue.&lt;/p&gt;
</content:encoded></item><item><title>Changements cassants Protobuf : ce qui survit sur le fil</title><link>https://changeloop.dev/blog/fr/grpc-protobuf-api-changes/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/grpc-protobuf-api-changes/</guid><description>Les changements cassants Protobuf se jouent sur le fil, pas dans l&apos;URL. Certains changements gRPC sont gratuits, d&apos;autres cassent chaque client en silence.</description><pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Une API REST change quand une forme JSON change, et la majeure partie de cette forme est visible
dans la réponse qu&amp;#39;on peut lire dans un navigateur. Une API gRPC change quand un fichier &lt;code&gt;.proto&lt;/code&gt;
change, et le format binaire sur le fil de Protocol Buffers a ses propres règles sur ce qu&amp;#39;un
client peut tolérer, qui n&amp;#39;ont rien à voir avec ce que disent les noms de champs. Deux
modifications qui paraissent également petites dans un diff, renuméroter un champ contre en
ajouter un, tombent des côtés opposés d&amp;#39;une ligne que &lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;changements cassants&lt;/a&gt;
trace en général : l&amp;#39;une est invisible pour chaque client existant, l&amp;#39;autre les casse tous d&amp;#39;un
coup. Distinguer les changements cassants Protobuf des changements sûrs veut dire lire les règles
propres du format sur le fil, pas deviner d&amp;#39;après l&amp;#39;apparence du changement dans un diff &lt;code&gt;.proto&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Pourquoi la numérotation des champs compte-t-elle plus que le nom du champ dans Protobuf ?&lt;/h2&gt;
&lt;p&gt;Parce que le format sur le fil encode les champs par numéro, pas par nom. Le code généré dans
chaque langage lit et écrit ces numéros ; le nom de champ &lt;code&gt;email&lt;/code&gt; dans votre fichier &lt;code&gt;.proto&lt;/code&gt; est
une commodité pour les humains qui ne touche jamais les octets binaires envoyés sur le réseau.
Renommer un champ, &lt;code&gt;email&lt;/code&gt; en &lt;code&gt;email_address&lt;/code&gt;, est sûr sur le fil binaire tant que le numéro
reste le même, ce qui surprend les ingénieures habituées à REST, où une clé JSON renommée est
exactement le type de changement qui casse un client. L&amp;#39;exception est ce même cas REST : les
&lt;a href=&quot;https://protobuf.dev/programming-guides/json/&quot;&gt;formats ProtoJSON et texte&lt;/a&gt; sérialisent le nom, donc
un renommage casse le transcodage JSON (un grpc-gateway, par exemple), les fichiers au format texte
et les field masks. Renuméroter ce même champ, en gardant le
nom mais en changeant &lt;code&gt;1&lt;/code&gt; en &lt;code&gt;7&lt;/code&gt;, est exactement l&amp;#39;inverse : invisible dans une revue de code qui
ne montre que les noms, et ça corrompt chaque message qu&amp;#39;un client envoie ou reçoit à partir de ce
moment-là.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Changement&lt;/th&gt;
&lt;th&gt;Sûr sur le fil&lt;/th&gt;
&lt;th&gt;Pourquoi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Renommer un champ, garder son numéro&lt;/td&gt;
&lt;td&gt;Binaire oui, JSON et texte non&lt;/td&gt;
&lt;td&gt;L&amp;#39;encodage binaire utilise le numéro ; ProtoJSON et le format texte utilisent le nom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changer le numéro d&amp;#39;un champ&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;Chaque message existant est maintenant lu comme le mauvais champ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ajouter un nouveau champ avec un nouveau numéro&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Les anciens clients ignorent les champs qu&amp;#39;ils ne reconnaissent pas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supprimer un champ, réutiliser son ancien numéro pour autre chose&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;Les anciennes données se décodent dans le mauvais nouveau champ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changer le type d&amp;#39;un champ de façon incompatible (ex. &lt;code&gt;int32&lt;/code&gt; en &lt;code&gt;string&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;L&amp;#39;encodage sur le fil diffère selon le type&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui rend la suppression d&amp;#39;un champ différente de celle dans une réponse JSON REST ?&lt;/h2&gt;
&lt;p&gt;Le numéro devient radioactif. Les &lt;a href=&quot;https://protobuf.dev/programming-guides/proto3/&quot;&gt;directives de Protobuf elles-mêmes&lt;/a&gt;
recommandent de marquer le numéro d&amp;#39;un champ supprimé comme &lt;code&gt;reserved&lt;/code&gt; plutôt que de le laisser
être réutilisé, parce que la
réutilisation est où le vrai dégât se produit : un client qui fait encore tourner du code généré
du mois dernier envoie un message utilisant l&amp;#39;ancien numéro du champ pour l&amp;#39;ancienne signification,
et le serveur, qui s&amp;#39;attend maintenant à ce que ce numéro signifie autre chose, mal-interprète les
données en silence au lieu de les rejeter carrément. REST n&amp;#39;a pas de piège équivalent, parce
qu&amp;#39;une clé JSON supprimée arrête simplement d&amp;#39;apparaître ; il n&amp;#39;y a aucun moyen pour la requête
d&amp;#39;un ancien client d&amp;#39;être silencieusement réinterprétée comme autre chose. Un fichier &lt;code&gt;.proto&lt;/code&gt;
avec &lt;code&gt;reserved 4, 9, 12;&lt;/code&gt; en haut d&amp;#39;un message est une cicatrice permanente, et c&amp;#39;est exactement le
but : ça empêche le numéro d&amp;#39;être attribué à un nouveau champ par quelqu&amp;#39;un qui n&amp;#39;en connaissait
pas l&amp;#39;histoire.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-protobuf&quot;&gt;message Invoice {
  reserved 4; // était `legacy_customer_id`, supprimé le 2026-06-01
  reserved &amp;quot;legacy_customer_id&amp;quot;; // le nom aussi, pour JSON/texte
  string customer_id = 5;
  string status = 6;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Ajouter un champ nécessite-t-il jamais une entrée de changelog ?&lt;/h2&gt;
&lt;p&gt;Généralement pas une entrée de changement cassant, mais souvent une entrée normale, parce que
« sûr sur le fil » et « invisible pour une lectrice à qui ça importe » sont deux affirmations
différentes. Ajouter un champ à un message de réponse ne coûte rien structurellement, les anciens
clients décodent le message et ignorent le nouveau champ automatiquement. Mais quelqu&amp;#39;un qui
construit une nouvelle intégration contre ce service n&amp;#39;a aucun moyen de savoir que le champ existe
à moins que quelqu&amp;#39;un le lui dise, parce que rien dans un build réussi ou un test qui passe ne
rend visible un nouveau champ optionnel. &lt;a href=&quot;https://changeloop.dev/blog/fr/api-changelog/&quot;&gt;Changelog d&amp;#39;API&lt;/a&gt; couvre en
général ce qu&amp;#39;une entrée additive doit à quelqu&amp;#39;un qui la lit ; la raison spécifique à gRPC d&amp;#39;en
écrire une quand même, c&amp;#39;est qu&amp;#39;il n&amp;#39;y a pas d&amp;#39;équivalent à parcourir une réponse REST dans un
débogueur pour remarquer qu&amp;#39;une nouvelle clé est apparue.&lt;/p&gt;
&lt;h2&gt;En quoi est-ce différent de ce à quoi font face les appelants GraphQL ?&lt;/h2&gt;
&lt;p&gt;Les règles pour les ajouts sont les mêmes, mais l&amp;#39;exposition diffère. &lt;a href=&quot;https://changeloop.dev/blog/fr/graphql-schema-deprecation/&quot;&gt;Dépréciation de schéma GraphQL&lt;/a&gt;
couvre un modèle où un client ne reçoit que les champs qu&amp;#39;il demande explicitement, ce qui rend
les changements additifs essentiellement sans risque et les suppressions le seul vrai danger. Les
clients gRPC, à l&amp;#39;inverse, reçoivent tout ce que le serveur envoie et décodent tout contre leur
propre copie compilée du schéma ; l&amp;#39;exposition d&amp;#39;un client n&amp;#39;est pas limitée par ce qu&amp;#39;il a
demandé, seulement par ce que son code généré sait lire. Cette différence compte pour écrire des
changelogs : une entrée GraphQL peut raisonnablement supposer que les clients sont protégés des
champs qu&amp;#39;ils n&amp;#39;ont pas demandés, et une entrée gRPC ne peut pas du tout supposer ça.&lt;/p&gt;
&lt;h2&gt;Versionner un service gRPC fonctionne-t-il comme les &lt;code&gt;/v1/&lt;/code&gt;, &lt;code&gt;/v2/&lt;/code&gt; de REST ?&lt;/h2&gt;
&lt;p&gt;Le mécanisme est différent même quand l&amp;#39;intention est la même. &lt;a href=&quot;https://changeloop.dev/blog/fr/api-versioning-best-practices/&quot;&gt;Que sont v1 et v2 dans une API
REST&lt;/a&gt; couvre le versionnage comme des chemins d&amp;#39;URL
parallèles servant des contrats différents ; les services gRPC versionnent typiquement via le nom
de package dans le fichier &lt;code&gt;.proto&lt;/code&gt; lui-même, &lt;code&gt;payments.v1.InvoiceService&lt;/code&gt; devenant
&lt;code&gt;payments.v2.InvoiceService&lt;/code&gt;, ce qui change le nom de service complètement qualifié qu&amp;#39;un client
compose plutôt qu&amp;#39;un segment d&amp;#39;URL qu&amp;#39;il demande. Les deux approches résolvent le même problème,
laisser un ancien contrat continuer de fonctionner pendant qu&amp;#39;un nouveau existe, mais une équipe
venant d&amp;#39;un contexte REST cherche souvent un numéro de version au mauvais endroit et rate que la
déclaration de package fait ce travail.&lt;/p&gt;
&lt;h2&gt;Que devrait vraiment nommer une entrée de changelog gRPC ?&lt;/h2&gt;
&lt;p&gt;Le message, le numéro de champ, et si c&amp;#39;est additif ou une suppression nécessitant une migration,
dans cet ordre d&amp;#39;importance pour une lectrice décidant d&amp;#39;agir ou non. « Ajout de
&lt;code&gt;shipping_address&lt;/code&gt; (champ 8) à &lt;code&gt;Order&lt;/code&gt; » dit à une intégratrice tout ce dont elle a besoin pour
mettre à jour le code généré et commencer à l&amp;#39;utiliser. « Champ 4 réservé sur &lt;code&gt;Invoice&lt;/code&gt;,
&lt;code&gt;legacy_customer_id&lt;/code&gt; a disparu » lui dit de vérifier si quelque chose dans son code lit encore ce
champ, ce qu&amp;#39;une note style REST « champ supprimé de la réponse » ne communique pas avec la même
urgence, parce que les suppressions REST retournent simplement moins de données alors que la
réutilisation de champ Protobuf les corrompt activement.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Le type d&amp;#39;un champ peut-il jamais être changé sans casser le format sur le fil ?&lt;/strong&gt;
Seulement dans des groupes compatibles spécifiques que Protobuf documente, comme élargir &lt;code&gt;int32&lt;/code&gt;
en &lt;code&gt;int64&lt;/code&gt; dans certains cas. Traitez tout changement de type comme cassant à moins de l&amp;#39;avoir
vérifié contre la table de compatibilité de Protobuf elle-même ; supposer une compatibilité par
analogie avec le système de types d&amp;#39;un langage est comment ça tourne mal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Déprécier un champ dans Protobuf fonctionne-t-il comme la directive &lt;code&gt;@deprecated&lt;/code&gt; de GraphQL ?&lt;/strong&gt;
De façon similaire : Protobuf supporte une option de champ &lt;code&gt;[deprecated = true]&lt;/code&gt; que l&amp;#39;outillage
peut afficher. Aucune des deux n&amp;#39;est appliquée : un serveur GraphQL répond toujours à une requête
sur un champ déprécié, et un client protobuf en encode toujours un. Les deux sont indicatives et
nécessitent le même appui de changelog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Renuméroter est-il jamais sûr si vous contrôlez chaque client ?&lt;/strong&gt;
Dans un système entièrement fermé, en principe, mais ça élimine toute la propriété de sécurité
pour laquelle les numéros de champ existent, et « on contrôle chaque client » est une affirmation
qui cesse d&amp;#39;être vraie dès qu&amp;#39;un build est mis en cache, qu&amp;#39;un déploiement est retardé, ou qu&amp;#39;un
client est ajouté dont personne ne se souvenait. Réservez le numéro plutôt que de le réutiliser,
même en interne.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les services gRPC ont-ils besoin d&amp;#39;une page de changelog comme une API REST publique ?&lt;/strong&gt;
Seulement si des équipes externes les consomment sans lire directement les diffs &lt;code&gt;.proto&lt;/code&gt;, le même
test « qui est de l&amp;#39;autre côté » que &lt;a href=&quot;https://changeloop.dev/blog/fr/internal-api-changelog/&quot;&gt;les changelogs d&amp;#39;API interne&lt;/a&gt;
applique en général. Un service gRPC consommé seulement par d&amp;#39;autres services de la même équipe
peut souvent se passer d&amp;#39;un changelog formel en faveur de l&amp;#39;historique des commits, parce que
quiconque le lit a déjà le schéma ouvert.&lt;/p&gt;
</content:encoded></item><item><title>Formats de fichier changelog : JSON, YAML ou juste Markdown</title><link>https://changeloop.dev/blog/fr/changelog-file-formats/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/changelog-file-formats/</guid><description>Le format d&apos;un fichier changelog décide s&apos;il alimente une page et un widget, ou n&apos;est lu que par une personne. Markdown, JSON et YAML coûtent différemment.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;La plupart des équipes commencent un changelog comme fichier Markdown parce que c&amp;#39;est le chemin
de moindre résistance : lisible dans le diff d&amp;#39;une pull request, lisible sur GitHub sans rien
rendre, et familier pour quiconque a déjà écrit un README. Ce choix fonctionne bien jusqu&amp;#39;à ce que
quelque chose d&amp;#39;autre qu&amp;#39;une personne doive lire le fichier, une page, un widget, un digest email,
et alors le format cesse d&amp;#39;être gratuit. &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-automation/&quot;&gt;Automatisation du changelog&lt;/a&gt;
couvre l&amp;#39;exigence structurelle en général, un type, une date, un corps et un lien ; ceci porte sur
quel format de fichier livre réellement cette structure et ce que chacun coûte pour y arriver.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui ne va pas avec un changelog Markdown simple ?&lt;/h2&gt;
&lt;p&gt;Rien, jusqu&amp;#39;à ce que quelque chose doive le reparser en champs. Un titre, une date et une liste à
puces en dessous est trivial à lire pour une personne et vraiment difficile à parser de façon
fiable, parce que Markdown n&amp;#39;a pas de schéma : la date pourrait être dans le titre, en gras sur la
première ligne, ou totalement absente sur une vieille entrée, et chacune de ces variantes est du
Markdown valide qu&amp;#39;une personne lit correctement et qu&amp;#39;un parser non. Les équipes qui automatisent
un changelog Markdown finissent généralement par écrire un parser maison basé sur des regex qui
casse la première fois que le formatage d&amp;#39;une entrée dérive même légèrement, ce qui arrive
souvent, parce que rien n&amp;#39;impose de cohérence à l&amp;#39;écriture.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;un format structuré apporte réellement ?&lt;/h2&gt;
&lt;p&gt;Une garantie que chaque entrée a la même forme, vérifiée quand l&amp;#39;entrée est écrite plutôt que
devinée quand elle est lue. Un fichier JSON ou YAML avec un schéma défini, type, date, version,
audience, corps, lien, échoue bruyamment si un champ requis manque, de la même façon qu&amp;#39;une
réponse d&amp;#39;API stricte le ferait ; un fichier Markdown rend simplement ce qui est là, correct ou
non. Cette différence est invisible jusqu&amp;#39;au jour où un script a besoin de la date de chaque
entrée pour trier un flux, et où la moitié des entrées l&amp;#39;ont à un endroit différent.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# CHANGELOG.yml
- date: 2026-09-05
  type: breaking
  version: v2
  audience: api
  body: &amp;quot;POST /invoices now rejects a currency mismatch instead of silently converting.&amp;quot;
  link: /blog/api-changelog/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Ça veut dire que le fichier lisible par l&amp;#39;humain doit disparaître ?&lt;/h2&gt;
&lt;p&gt;Non, et essayer de faire jouer à un fichier YAML ou JSON le double rôle de ce qu&amp;#39;une personne lit
dans une pull request est généralement une erreur dans l&amp;#39;autre sens : revoir un diff de JSON
imbriqué est pire que revoir une phrase de prose, et une relectrice qui doit parser mentalement
une structure de données pour repérer une erreur de formulation est une relectrice qui finira par
arrêter de repérer les erreurs de formulation. Les deux formats peuvent coexister : les données
structurées sont la source de vérité que lit un pipeline d&amp;#39;automatisation, et un rendu Markdown ou
HTML généré est ce qu&amp;#39;une personne relit et lit réellement, produit à partir du fichier structuré
plutôt que maintenu à la main à côté.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Lisible par l&amp;#39;humain tel quel&lt;/th&gt;
&lt;th&gt;Parsable par machine sans code sur mesure&lt;/th&gt;
&lt;th&gt;Mode d&amp;#39;échec courant&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;Forme d&amp;#39;entrée incohérente casse les parsers naïfs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;Faible&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Verbeux ; facile à éditer à la main vers du JSON invalide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;Correct&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Sensible aux espaces ; une mauvaise indentation est une erreur de parsing silencieuse, pas bruyante&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quel format structuré est en réalité plus facile à éditer à la main, JSON ou YAML ?&lt;/h2&gt;
&lt;p&gt;YAML, pour quiconque écrit des entrées à la main plutôt que via un générateur, parce qu&amp;#39;il élimine
le quoting et l&amp;#39;appariement d&amp;#39;accolades que JSON exige pour chaque chaîne et objet imbriqué. Le
compromis est que la sensibilité de YAML aux espaces échoue silencieusement d&amp;#39;une façon dont les
désaccords d&amp;#39;accolades de JSON ne le font généralement pas : un parser JSON rejette d&amp;#39;emblée une
entrée mal formée, tandis qu&amp;#39;un parser YAML peut accepter un fichier mal indenté et simplement le
parser dans la mauvaise structure, ce qui est un échec pire parce que rien ne vous dit que c&amp;#39;est
arrivé. Si les entrées ne sont jamais écrites que par un script, ce compromis disparaît largement
et le parsing plus strict de JSON devient le choix par défaut le plus sûr.&lt;/p&gt;
&lt;h2&gt;Une page de changelog a-t-elle besoin de son propre format structuré, séparé du fichier qui l&amp;#39;alimente ?&lt;/h2&gt;
&lt;p&gt;Pas un séparé, le même rendu différemment. &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-page/&quot;&gt;Une page de changelog&lt;/a&gt;
couvre comment rendre la page elle-même lisible par machine via un flux JSON et un balisage
schema.org ; ce flux est une sortie générée, pas une seconde source de vérité à garder
synchronisée avec le fichier sous-jacent. Maintenir des données structurées à la main à deux
endroits, un fichier source et le flux d&amp;#39;une page, est comment les deux finissent par diverger,
donc la décision de format de fichier prise ici devrait être la seule chose dont tout ce qui suit,
page, widget, email, est généré, jamais copié à la main.&lt;/p&gt;
&lt;h2&gt;Le coût de migration en vaut-il la peine pour convertir un changelog Markdown existant en format structuré ?&lt;/h2&gt;
&lt;p&gt;Généralement seulement une fois que l&amp;#39;automatisation est l&amp;#39;objectif réel, pas avant. Un projet
d&amp;#39;une seule personne publiant un fichier Markdown dans un README GitHub n&amp;#39;a pas de vrai besoin
d&amp;#39;automatisation, et le convertir en YAML n&amp;#39;achète rien d&amp;#39;autre que de la cérémonie. La conversion
se rembourse d&amp;#39;elle-même au moment où plus d&amp;#39;un consommateur en aval, une page, un email de
digest, un flux public, a besoin de lire les mêmes données, parce que c&amp;#39;est exactement le point
où les incohérences d&amp;#39;un parser Markdown commencent à produire une sortie visiblement fausse au
lieu d&amp;#39;être juste pénibles à maintenir.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Un changelog Markdown peut-il être rendu parsable sans changer complètement de format ?&lt;/strong&gt;
Partiellement, avec du frontmatter : un petit bloc YAML en haut de chaque entrée (date, type,
version) à côté d&amp;#39;un corps Markdown pour la prose. Ça obtient les champs structurés dont un
parser a besoin sans forcer toute l&amp;#39;entrée en JSON ou YAML, et c&amp;#39;est un terrain d&amp;#39;entente
raisonnable pour une équipe pas encore prête pour une migration complète.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le format du fichier compte-t-il pour le SEO ou pour le classement d&amp;#39;une page de changelog ?&lt;/strong&gt;
Pas directement. Les moteurs de recherche lisent la page rendue, pas le fichier source, donc le
format du fichier leur est invisible ; ce qui compte pour la page elle-même est si elle est
lisible par machine de son propre droit, ce qui est une question séparée de ce qui la génère.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chaque entrée de changelog devrait-elle passer par le même fichier, ou les types peuvent-ils être répartis sur plusieurs fichiers ?&lt;/strong&gt;
Un seul fichier est plus simple jusqu&amp;#39;à ce que le volume d&amp;#39;entrées le rende difficile à differ ou
relire ; diviser par année ou par catégorie est une soupape de sécurité raisonnable une fois que
les diffs d&amp;#39;un seul fichier deviennent trop gros pour être relus sensément, mais ça ajoute une
étape de fusion avant que quoi que ce soit en aval puisse lire « toutes les entrées » comme une
seule liste.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Existe-t-il un format de fichier changelog standard, comme il existe un standard pour RSS ?&lt;/strong&gt;
Pas un largement adopté. Keep a Changelog propose une convention Markdown, et plusieurs outils
ont le leur ; un &lt;a href=&quot;https://github.com/changesets/changesets/blob/main/docs/adding-a-changeset.md&quot;&gt;changeset&lt;/a&gt;
est un fichier Markdown avec un frontmatter YAML qui nomme le package et le saut de version, ce qui
est le modèle de frontmatter décrit plus haut. Aucun n&amp;#39;est un format que d&amp;#39;autres outils lisent d&amp;#39;emblée comme les lecteurs RSS comprennent RSS universellement.&lt;/p&gt;
</content:encoded></item><item><title>Demandes dupliquées : fusionner sans perdre la voix</title><link>https://changeloop.dev/blog/fr/duplicate-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/duplicate-feature-requests/</guid><description>Regrouper les demandes dupliquées protège le décompte. Les fusionner sans soin perd la formulation qui rendait l&apos;une d&apos;elles utile, la perte moindre.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Trois clientes demandent la même capacité sur trois semaines différentes, formulée de trois
façons différentes, et un processus de triage construit pour intercepter les doublons fait son
travail : il les regroupe, les compte comme une seule demande avec trois votes, et le backlog
reste propre. C&amp;#39;est la partie facile. &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-tracking/&quot;&gt;Quelles étiquettes valent la peine&lt;/a&gt;
couvre le regroupement par capacité sous-jacente avant de trier par formulation comme solution
mécanique aux doublons ; ce qu&amp;#39;il ne couvre pas, c&amp;#39;est ce qui arrive aux mots eux-mêmes une fois
que trois demandes deviennent une seule ligne, et cette perte est généralement plus grande que le
problème de comptage des doublons qu&amp;#39;elle a résolu.&lt;/p&gt;
&lt;h2&gt;Que perd-on réellement quand des doublons sont fusionnés ?&lt;/h2&gt;
&lt;p&gt;La formulation spécifique utilisée par chaque demandeuse, qui est souvent plus informative que le
décompte de votes dans lequel elle s&amp;#39;effondre. Une cliente pourrait demander « un moyen d&amp;#39;exporter
des résultats filtrés », une autre « un export CSV qui respecte mes filtres enregistrés », et une
troisième « un export qui n&amp;#39;inclut pas les colonnes masquées ». Les trois sont la même demande
sous-jacente, correctement regroupée, mais chaque formulation porte une emphase légèrement
différente sur ce qui compte pour cette personne, et une fusion qui ne garde que la formulation de
la première soumission jette entièrement les deux autres. Le décompte survit ; la texture qui
aiderait quelqu&amp;#39;un à construire la bonne version de la fonctionnalité, non.&lt;/p&gt;
&lt;h2&gt;Pourquoi la texture compte-t-elle si le décompte de votes dit déjà que la demande existe ?&lt;/h2&gt;
&lt;p&gt;Parce que demande et conception sont des questions différentes, et seule la formulation
spécifique répond à la seconde. Dix votes sur « export » dit à une équipe que ça vaut le coup de
construire la fonctionnalité ; ça ne dit rien sur si « export » signifie CSV, PDF, un email
programmé ou un endpoint API, et une fusion qui écarte neuf des dix soumissions originales en
faveur de la formulation de la première peut discrètement rétrécir la spec à ce que la première
demandeuse a demandé par hasard, même si les neuf autres voulaient quelque chose de subtilement
différent. &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-tracking/&quot;&gt;Ce qu&amp;#39;une demande de fonctionnalité devrait réellement enregistrer&lt;/a&gt;
couvre exactement ce manque du côté de la réception ; fusionner les doublons est là où ça
réapparaît après la réception, précisément au point où une équipe a le plus besoin de l&amp;#39;éventail
de ce qui a vraiment été demandé.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble un processus de fusion qui garde la formulation au lieu de la jeter ?&lt;/h2&gt;
&lt;p&gt;Ajouter plutôt que remplacer. L&amp;#39;élément canonique garde un titre unique pour la vue du backlog,
mais la formulation originale de chaque soumission fusionnée reste attachée à lui, soit comme
liste de citations soit comme tickets sources liés, pour que quiconque revoit l&amp;#39;élément plus tard
puisse voir l&amp;#39;éventail réel de ce que les gens ont demandé au lieu du résumé d&amp;#39;une personne de
l&amp;#39;équipe. Ça ne coûte presque rien à construire, un champ sur le ticket plutôt qu&amp;#39;un nouveau
système, et c&amp;#39;est la différence entre une fusion qui compresse l&amp;#39;information et une qui compresse
juste son affichage.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Fonctionnalité : Export CSV filtré
Votes : 12
Demandes fusionnées :
  - &amp;quot;un moyen d&amp;#39;exporter des résultats filtrés&amp;quot; (acct_4421)
  - &amp;quot;un export CSV qui respecte mes filtres enregistrés&amp;quot; (acct_8832)
  - &amp;quot;un export qui n&amp;#39;inclut pas les colonnes masquées&amp;quot; (acct_1097)
  ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Chaque doublon mérite-t-il d&amp;#39;être fusionné, ou y a-t-il de fausses correspondances ?&lt;/h2&gt;
&lt;p&gt;Certaines sont de fausses correspondances, et traiter « ça sonne similaire » comme « c&amp;#39;est la
même demande » est son propre mode d&amp;#39;échec. « Laissez-moi exporter mes données » et « laissez-moi
exporter juste la vue filtrée » peuvent être regroupées par une correspondance de mot-clé sur
« exporter » alors qu&amp;#39;elles décrivent en réalité deux périmètres différents de la même capacité
générale ; les fusionner gonfle soit le décompte de votes pour la mauvaise chose, soit, pire,
livre la version plus étroite parce qu&amp;#39;elle est arrivée en premier par hasard. Un passage humain
sur le regroupement, même rapide, attrape ça avant que ça ne s&amp;#39;accumule ; une correspondance de
similarité automatique seule sur-fusionnera sur le vocabulaire et sous-fusionnera sur l&amp;#39;intention.&lt;/p&gt;
&lt;h2&gt;À quel moment la détection de doublons doit-elle tourner, à la réception ou plus tard ?&lt;/h2&gt;
&lt;p&gt;Les deux, pour des raisons différentes. Vérifier à la réception attrape le cas évident, une
nouvelle demande qui reformule quelque chose déjà ouvert, avant qu&amp;#39;elle ne devienne sa propre ligne
non suivie ; une recherche de similarité contre les demandes ouvertes au moment de la soumission
traite la plupart de ces cas sans aucune intervention humaine. Un second passage plus tard, à un
rythme plus lent, attrape le cas que la réception rate : deux demandes formulées avec un
vocabulaire assez différent pour échapper à une correspondance de mot-clé ou d&amp;#39;embedding sur le
moment, mais qui s&amp;#39;avèrent, une fois qu&amp;#39;une équipe a vu une dizaine de variations, décrire la même
capacité sous-jacente. Sauter le second passage laisse des quasi-doublons éparpillés sous des
titres séparés indéfiniment, chacun avec son petit décompte de votes qui ne s&amp;#39;additionne jamais au
nombre qui aurait suffi à le faire construire.&lt;/p&gt;
&lt;h2&gt;La demandeuse devrait-elle savoir que sa soumission a été fusionnée dans un élément existant ?&lt;/h2&gt;
&lt;p&gt;Oui, et c&amp;#39;est la même discipline que &lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;boucler la boucle de feedback client&lt;/a&gt;
appliquée une étape plus tôt que d&amp;#39;habitude : une demandeuse qui a soumis quelque chose et n&amp;#39;en
entend jamais reparler conclut que sa demande n&amp;#39;a mené nulle part, même si elle a été correctement
fusionnée dans un élément avec onze autres votes qui a fini par être livré. Un accusé de réception
court, « nous avons combiné ceci avec une demande existante que d&amp;#39;autres ont faite aussi »,
coûte un message et évite qu&amp;#39;une cliente resoumette la même demande tous les quelques mois parce
qu&amp;#39;elle n&amp;#39;a aucune visibilité sur si elle a jamais été réellement suivie.&lt;/p&gt;
&lt;h2&gt;La fusion change-t-elle qui est crédité quand la fonctionnalité est livrée ?&lt;/h2&gt;
&lt;p&gt;Elle devrait inclure tout le monde, pas seulement qui a soumis en premier. &lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;Boucler la boucle de
feedback&lt;/a&gt; couvre le fait d&amp;#39;avertir les demandeuses quand leur
demande est livrée ; pour un élément fusionné, ça veut dire chaque compte attaché à la fusion, pas
seulement celui dont la formulation est devenue le titre canonique, parce que du point de vue de
chaque demandeuse, elle a demandé ceci et ça a été livré, peu importe la formulation qu&amp;#39;un
processus de triage a choisi de garder. Avec changeloop, cela veut dire que la pull request nomme
chaque issue liée (&lt;code&gt;Fixes #142, fixes #187&lt;/code&gt;) ; une issue qu&amp;#39;elle ne nomme pas ne reçoit aucun
commentaire.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Combien de formulation vaut la peine d&amp;#39;être gardée par demande fusionnée, une citation ou un lien complet vers le ticket ?&lt;/strong&gt;
Une courte citation suffit généralement pour le cas courant, puisque son but est de laisser une
relectrice voir l&amp;#39;éventail de formulations d&amp;#39;un coup d&amp;#39;œil ; gardez aussi le lien complet vers le
ticket quand l&amp;#39;original avait un contexte supplémentaire significatif, comme une capture d&amp;#39;écran
ou une description détaillée de workflow qu&amp;#39;une citation d&amp;#39;une ligne aplatirait.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Garder la formulation de chaque doublon rend-il le backlog plus difficile à parcourir ?&lt;/strong&gt;
Pas si c&amp;#39;est replié par défaut. Le titre canonique est ce que voit une relectrice qui parcourt
rapidement ; la formulation fusionnée est à un clic ou un dépliage de distance, présente pour qui
fait une recherche plus approfondie mais sans encombrer la vue de qui compte juste les votes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que faire si deux demandes semblent identiques mais s&amp;#39;avèrent vouloir des choses différentes une fois construites ?&lt;/strong&gt;
Reséparez-les dès que ça devient clair, et traitez la fusion originale comme une décision
raisonnable prise avec l&amp;#39;information disponible à l&amp;#39;époque, pas comme une erreur à éviter de
répéter. Un système de regroupement qui ne défusionne jamais rien finira par avoir quelques
mauvaises fusions gravées en permanence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Y a-t-il un seuil de votes à partir duquel une demande fusionnée devrait recevoir une revue humaine de la formulation sous-jacente ?&lt;/strong&gt;
Pas un nombre fixe, mais toute demande approchant une décision de construction le mérite peu
importe le décompte de votes, parce que c&amp;#39;est le point où la différence entre « export » et
« export en CSV avec filtres enregistrés » cesse d&amp;#39;être une nuance et commence à être la spec.&lt;/p&gt;
</content:encoded></item><item><title>Dépréciation GraphQL sans numéro de version</title><link>https://changeloop.dev/blog/fr/graphql-schema-deprecation/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/graphql-schema-deprecation/</guid><description>GraphQL n&apos;a pas de v1 ni v2 dans l&apos;URL. Les champs sont dépréciés un par un via une directive, dans un schéma commun, et cela change le changelog.</description><pubDate>Thu, 17 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Une API REST peut publier &lt;code&gt;/v2/&lt;/code&gt; à côté de &lt;code&gt;/v1/&lt;/code&gt; et laisser chaque appelant migrer à son propre
rythme. GraphQL a un schéma sur un endpoint, et chaque client, l&amp;#39;app mobile sur le build de
l&amp;#39;année dernière et le dashboard interne déployé ce matin, interroge le même graphe. Il n&amp;#39;y a pas
d&amp;#39;URL à forker. Déprécier un champ signifie le marquer comme déprécié sur place, dans un schéma
dont tout le monde dépend déjà, ce qui rend la discipline différente de REST même si le problème
sous-jacent, dire aux appelants que quelque chose va disparaître, est le même que couvre
&lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;dépréciation d&amp;#39;API&lt;/a&gt; en général.&lt;/p&gt;
&lt;h2&gt;Comment GraphQL marque-t-il un champ comme déprécié, s&amp;#39;il n&amp;#39;y a pas de version à incrémenter ?&lt;/h2&gt;
&lt;p&gt;Avec la &lt;a href=&quot;https://spec.graphql.org/October2021/#sec--deprecated&quot;&gt;directive &lt;code&gt;@deprecated&lt;/code&gt;&lt;/a&gt;, appliquée
directement au champ :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-graphql&quot;&gt;type Product {
  price: Float @deprecated(reason: &amp;quot;Use priceV2 for multi-currency support.&amp;quot;)
  priceV2: Money
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le champ reste interrogeable. Il ne disparaît pas, ne renvoie pas de 404, ne change pas de
comportement ; il porte juste une note lisible par machine que la plupart des outils GraphQL,
GraphiQL, Apollo Studio, les linters de schéma, montreront à quiconque parcourt le schéma ou
écrit une requête contre lui. C&amp;#39;est tout le mécanisme. Il n&amp;#39;y a pas d&amp;#39;endpoint de dépréciation
séparé, pas d&amp;#39;en-tête, pas de document compagnon exigé par la spec, ce qui est à la fois
l&amp;#39;attrait et le piège : la directive est facile à ajouter et facile à ignorer, parce que rien ne
force un client à la regarder.&lt;/p&gt;
&lt;h2&gt;Est-ce que quelqu&amp;#39;un voit vraiment la raison de la dépréciation ?&lt;/h2&gt;
&lt;p&gt;Seulement ceux qui utilisent le schéma directement, par introspection ou un éditeur conscient du
schéma, et c&amp;#39;est un public plus petit que les lecteurs habituels d&amp;#39;un changelog d&amp;#39;API. Une app
mobile construite contre une requête il y a six mois a déjà cuit cette requête dans son binaire ;
elle continuera à demander &lt;code&gt;price&lt;/code&gt; et continuera à recevoir une réponse, déprécié ou non, jusqu&amp;#39;à
ce que quelqu&amp;#39;un reconstruise l&amp;#39;app avec le nouveau champ et publie une mise à jour. La directive
dit à une développeuse qui écrit du nouveau code de ne pas utiliser l&amp;#39;ancien champ. Elle ne fait
rien pour le client déjà déployé et en fonctionnement.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mécanisme&lt;/th&gt;
&lt;th&gt;Qui il atteint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Directive &lt;code&gt;@deprecated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Développeuses parcourant le schéma ou écrivant de nouvelles requêtes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Échecs CI du linter de schéma&lt;/td&gt;
&lt;td&gt;L&amp;#39;équipe propriétaire du code client, si elle en fait tourner un&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Une entrée de changelog&lt;/td&gt;
&lt;td&gt;Quiconque la lit, y compris une équipe cliente sans linter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rien (le champ fonctionne juste)&lt;/td&gt;
&lt;td&gt;Un client déjà construit utilisant l&amp;#39;ancien champ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Un champ déprécié devrait-il quand même avoir une entrée de changelog ?&lt;/h2&gt;
&lt;p&gt;Oui, et elle fait plus de travail que la directive seule, parce qu&amp;#39;un changelog atteint des gens
que la directive ne peut pas : une équipe partenaire qui consomme le graphe sans parcourir son
schéma, un client construit contre une copie en cache du schéma vieille de plusieurs mois,
quiconque ne le remarquerait qu&amp;#39;en lisant de la prose. &lt;a href=&quot;https://changeloop.dev/blog/fr/api-changelog/&quot;&gt;Changelog d&amp;#39;API&lt;/a&gt;
couvre en général ce qu&amp;#39;une entrée doit à un appelant ; une entrée GraphQL doit une chose que REST
n&amp;#39;a rarement besoin d&amp;#39;expliciter, parce que les appelants REST la déduisent du numéro de version :
si l&amp;#39;ancien champ fonctionne encore aujourd&amp;#39;hui, fonctionne encore avec un avertissement, ou a
effectivement cessé de renvoyer des données. La directive seule ne répond à rien de tout ça pour
une lectrice qui n&amp;#39;a jamais ouvert le schéma.&lt;/p&gt;
&lt;h2&gt;Quand est-il vraiment sûr de retirer un champ du schéma ?&lt;/h2&gt;
&lt;p&gt;Seulement une fois que les logs de requêtes montrent que personne ne le demande plus, ce qui est
une question d&amp;#39;usage, pas de calendrier. Un champ peut porter &lt;code&gt;@deprecated&lt;/code&gt; pendant un an et
rester structurant pour un client jamais reconstruit ; le retirer selon un calendrier fixe, comme
le fait souvent un &lt;code&gt;Sunset&lt;/code&gt; REST, casse ce client sans aucun avertissement sur lequel il puisse
agir, parce que GraphQL ne lui donne rien sur quoi agir au-delà de la directive qu&amp;#39;il n&amp;#39;a jamais
lue. Journalisez l&amp;#39;usage au niveau du champ avant de vous engager sur une date de retrait, et
traitez tout compte de requêtes non nul comme une pause, pas un compte à rebours.&lt;/p&gt;
&lt;h2&gt;Ajouter un champ porte-t-il le même risque que dans une API REST ?&lt;/h2&gt;
&lt;p&gt;Moins, pour un nouveau champ, parce qu&amp;#39;un client GraphQL ne reçoit que les champs qu&amp;#39;il demande
explicitement. Ajouter &lt;code&gt;priceV2&lt;/code&gt; à côté de &lt;code&gt;price&lt;/code&gt; ne peut pas casser une requête existante de la
façon dont ajouter un champ à une réponse JSON REST peut casser un désérialiseur strict, parce que
rien ne force le client à demander le nouveau champ. Ajouter une valeur à une énumération existante
est l&amp;#39;exception qui vaut la peine d&amp;#39;être nommée dans le même souffle : un client qui teste
exhaustivement chaque valeur d&amp;#39;énumération, ce que les langages fortement typés encouragent, casse
dès qu&amp;#39;une nouvelle valeur arrive, que ce soit demandé par une requête ou non. La sécurité ne vaut
que pour les champs et les membres d&amp;#39;union auxquels un client choisit d&amp;#39;adhérer ; elle ne vaut pas
pour un ensemble fermé qu&amp;#39;un client énumère à la main dans son code.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;une entrée de changelog GraphQL a besoin que n&amp;#39;a pas une entrée REST ?&lt;/h2&gt;
&lt;p&gt;La forme de la requête, pas seulement le nom du champ, parce que « le champ &lt;code&gt;price&lt;/code&gt; est déprécié »
manque de la pièce dont un appelant a réellement besoin : quels types et quelles requêtes le
touchent. Une entrée utile nomme le type, le champ, le champ de remplacement et, si vous pouvez le
générer, les requêtes réelles en production qui demandent encore l&amp;#39;ancienne forme. Cette dernière
pièce, relier l&amp;#39;avis de dépréciation à l&amp;#39;usage réel, est ce que les appelants REST obtiennent
gratuitement des logs serveur sur une URL et que les appelants GraphQL n&amp;#39;obtiennent pas, parce que
chaque requête frappe le même endpoint quoi qu&amp;#39;elle demande.&lt;/p&gt;
&lt;h2&gt;Autre chose qu&amp;#39;un champ peut-il porter la directive &lt;code&gt;@deprecated&lt;/code&gt; ?&lt;/h2&gt;
&lt;p&gt;Les valeurs d&amp;#39;énumération, en utilisant la même directive directement sur la définition de la
valeur plutôt que sur celle du champ :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-graphql&quot;&gt;enum ShippingMethod {
  STANDARD
  EXPRESS
  OVERNIGHT @deprecated(reason: &amp;quot;Use EXPRESS with priority: true instead.&amp;quot;)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La spec définit &lt;code&gt;@deprecated&lt;/code&gt; pour exactement deux emplacements, une définition de champ ou une
valeur d&amp;#39;énumération, et rien d&amp;#39;autre à ce jour dans la version stable ; la dépréciation au niveau
des arguments et des champs d&amp;#39;entrée n&amp;#39;existe que dans un langage de brouillon plus récent, pas
dans ce que la plupart des serveurs implémentent aujourd&amp;#39;hui. Une valeur d&amp;#39;énumération marquée
ainsi reste une valeur légale qu&amp;#39;un serveur peut encore renvoyer ou accepter, la même promesse de
non-rupture que fait un champ déprécié, ce qui la rend sûre à livrer avant de vraiment retirer la
valeur.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;GraphQL supporte-t-il quelque chose comme un en-tête Sunset pour tout un endpoint ?&lt;/strong&gt;
Non, parce qu&amp;#39;il n&amp;#39;y a généralement qu&amp;#39;un seul endpoint. Le calendrier de dépréciation vit au
niveau du champ, dans le texte de raison de la directive &lt;code&gt;@deprecated&lt;/code&gt; et dans quel que soit le
changelog ou guide de migration qu&amp;#39;une équipe publie à côté, pas dans un en-tête de réponse qu&amp;#39;un
client peut lire de façon programmatique.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un champ déprécié peut-il être retiré puis réajouté plus tard avec un type différent ?&lt;/strong&gt;
Seulement sous un nouveau nom de champ. Réintroduire le même nom de champ avec un type changé est
exactement le changement cassant que le cycle de dépréciation existe pour éviter ; donnez au
remplaçant son propre nom, comme le fait &lt;code&gt;priceV2&lt;/code&gt;, et laissez l&amp;#39;ancien s&amp;#39;éteindre complètement
avant que le nom soit libre pour réutilisation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le texte de raison &lt;code&gt;@deprecated&lt;/code&gt; devrait-il pointer vers l&amp;#39;entrée de changelog ?&lt;/strong&gt;
Oui, quand l&amp;#39;outillage de schéma le supporte. Le champ raison accepte une simple chaîne de
caractères, et une URL à l&amp;#39;intérieur de cette chaîne est le chemin le plus court entre une
développeuse fixant une sortie d&amp;#39;introspection et l&amp;#39;explication plus complète qu&amp;#39;une entrée de
changelog peut donner.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un changement de schéma GraphQL est-il jamais rétrocompatible d&amp;#39;une façon dont REST ne l&amp;#39;est pas ?&lt;/strong&gt;
Les changements additifs de champ, oui, pour la raison ci-dessus : les clients n&amp;#39;obtiennent que
ce qu&amp;#39;ils demandent. Les nouvelles valeurs d&amp;#39;énumération sont l&amp;#39;exception, parce qu&amp;#39;un client qui
énumère un ensemble fermé peut casser sur une valeur qu&amp;#39;il n&amp;#39;attendait pas. Les retraits et les
changements de type sont exactement aussi cassants que leurs équivalents REST.&lt;/p&gt;
</content:encoded></item><item><title>Comment écrire un guide de migration d&apos;API</title><link>https://changeloop.dev/blog/fr/api-migration-guide/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/api-migration-guide/</guid><description>Un guide de migration d&apos;API transforme un changement incompatible en checklist. Ce qu&apos;il doit contenir, et pourquoi une entrée de changelog ne suffit pas.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un guide de migration d&amp;#39;API est le document qui transforme un changement incompatible en checklist
plutôt qu&amp;#39;en panne : ce qui a changé, quoi faire, et avant quand. Une entrée de changelog peut
nommer un changement incompatible en deux phrases ; un guide de migration est ce qu&amp;#39;une appelante
ouvre vraiment quand ces deux phrases disent « ça te casse » et qu&amp;#39;elle a besoin de savoir
exactement quoi modifier. Publier l&amp;#39;entrée sans le guide, c&amp;#39;est comment une appelante apprend un
changement incompatible par un ticket de support plutôt que par le document écrit pour l&amp;#39;éviter.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;un guide de migration d&amp;#39;API ?&lt;/h2&gt;
&lt;p&gt;Un document étape par étape qui fait passer une appelante de l&amp;#39;ancienne forme d&amp;#39;une API à la
nouvelle, écrit pour quelqu&amp;#39;un qui a du code à changer, pas pour quelqu&amp;#39;un qui décide encore
d&amp;#39;adopter l&amp;#39;API. Cette distinction compte : un guide de migration suppose une intégration existante
et du trafic de production existant, donc il doit couvrir le rollback, la migration partielle, et
comment savoir si la migration a réussi, rien de tout cela n&amp;#39;étant nécessaire à un guide de
première intégration.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Document&lt;/th&gt;
&lt;th&gt;Suppose&lt;/th&gt;
&lt;th&gt;Répond à&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Guide de migration&lt;/td&gt;
&lt;td&gt;Une intégration existante&lt;/td&gt;
&lt;td&gt;Comment passer de l&amp;#39;ancienne forme à la nouvelle ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entrée de changelog&lt;/td&gt;
&lt;td&gt;Rien, juste que la lectrice vérifie&lt;/td&gt;
&lt;td&gt;Qu&amp;#39;est-ce qui a changé, et quand ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Référence API&lt;/td&gt;
&lt;td&gt;Rien, ou une première intégration&lt;/td&gt;
&lt;td&gt;Que fait cet endpoint ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avis de dépréciation&lt;/td&gt;
&lt;td&gt;Une intégration utilisant l&amp;#39;ancien&lt;/td&gt;
&lt;td&gt;Quand ça arrête de fonctionner ?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Un guide de migration se situe généralement entre les deux derniers : un avis de dépréciation
lance un compte à rebours, et le guide de migration est ce qu&amp;#39;une appelante suit avant que ce
compte n&amp;#39;expire.&lt;/p&gt;
&lt;h2&gt;Quand un changement a-t-il besoin d&amp;#39;un guide de migration, pas seulement d&amp;#39;une entrée de changelog ?&lt;/h2&gt;
&lt;p&gt;Quand il y a plus d&amp;#39;une étape entre l&amp;#39;ancien comportement et le nouveau, ou quand le changement
touche assez de points d&amp;#39;appel pour qu&amp;#39;une appelante bénéficie d&amp;#39;un exemple travaillé plutôt que
d&amp;#39;une description. &lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;Qu&amp;#39;est-ce qu&amp;#39;un changement incompatible, et comment le livrer&lt;/a&gt;
couvre le test pour savoir si un changement est incompatible ; une fois la réponse oui, la seconde
question est de savoir si la correction est une modification d&amp;#39;une ligne ou une vraie migration.
Un champ renommé, une appelante peut le gérer avec la seule entrée de changelog. Un changement à
l&amp;#39;authentification, à la pagination ou à la gestion des erreurs mérite presque toujours un guide,
parce que le code de remplacement correct n&amp;#39;est pas évident à partir d&amp;#39;une description d&amp;#39;une
phrase.&lt;/p&gt;
&lt;h2&gt;Que doit contenir un guide de migration ?&lt;/h2&gt;
&lt;p&gt;Cinq choses, et en sauter une seule est ce qui transforme un guide en une page qu&amp;#39;une appelante lit
une fois puis abandonne pour procéder par essais-erreurs. L&amp;#39;ancien code, montré tel qu&amp;#39;il
apparaîtrait vraiment dans un projet. Le nouveau code, montré de la même façon, pas comme une
description abstraite de la différence. Ce qui casse si rien ne change, dit clairement, parce que
« rien » est une réponse valide et courante qu&amp;#39;une appelante a quand même besoin d&amp;#39;entendre
explicitement. Un moyen de vérifier que la migration a fonctionné, comme un champ de réponse ou un
code de statut à vérifier. Et un calendrier : quand l&amp;#39;ancien comportement arrête de fonctionner, et
si les deux formes sont disponibles entre-temps.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## Migration des champs monétaires de float vers entier (v3.0.0)

Avant :
  { &amp;quot;amount&amp;quot;: 19.99 }

Après :
  { &amp;quot;amount&amp;quot;: 1999 }  // plus petite unité monétaire (centimes)

Ce qui change : `amount` est maintenant un entier dans la plus petite
unité de la devise du compte. Le code qui lit `amount` comme un float
lira une valeur 100 fois trop grande à partir du 1er octobre 2026.

Vérifier : après migration, un débit de 19,99 € devrait se lire
`amount: 1999`, pas `amount: 19.99`.

Calendrier : v2 continue de renvoyer des floats jusqu&amp;#39;au 15 janvier
2027. v3 renvoie des entiers dès le lancement. Les deux versions sont
actives maintenant.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chacune de ces cinq choses répond à une question qu&amp;#39;une appelante devrait sinon deviner ou poser
au support, et c&amp;#39;est exactement le coût qu&amp;#39;un guide de migration économise.&lt;/p&gt;
&lt;h2&gt;Qui devrait l&amp;#39;écrire, et quand ?&lt;/h2&gt;
&lt;p&gt;Qui a conçu le changement, au moment même où il est livré, pas une équipe support qui le
reconstitue plus tard à partir de tickets. Qui a pris la décision sait sur quelles parties de
l&amp;#39;ancien comportement personne n&amp;#39;aurait dû compter et lesquelles étaient un contrat accidentel ;
un guide écrit plus tard par quelqu&amp;#39;un sans ce contexte a tendance soit à trop expliquer
l&amp;#39;évident, soit à manquer le seul cas limite qui casse vraiment les gens. Le guide et l&amp;#39;entrée de
changelog qui annonce le changement incompatible devraient sortir ensemble, l&amp;#39;entrée renvoyant
vers le guide plutôt que de le répéter.&lt;/p&gt;
&lt;h2&gt;Comment cela se rattache-t-il au versionnage et au changelog d&amp;#39;API ?&lt;/h2&gt;
&lt;p&gt;Directement : un guide de migration est la version détaillée de ce qu&amp;#39;une entrée MAJOR dans
&lt;a href=&quot;https://changeloop.dev/blog/fr/semantic-versioning-changelog/&quot;&gt;semantic versioning et votre changelog&lt;/a&gt; ne résume qu&amp;#39;en
une phrase. L&amp;#39;entrée de changelog dit qu&amp;#39;un changement est incompatible et grosso modo ce qui a
changé ; le guide de migration est le lien que cette entrée devrait porter. &lt;a href=&quot;https://changeloop.dev/blog/fr/api-changelog/&quot;&gt;Changelog d&amp;#39;API : quoi publier et qui le lit&lt;/a&gt;
liste le guide de migration comme l&amp;#39;un des cinq documents qu&amp;#39;une API maintient, chacun répondant à
une question différente ; celui-ci répond à « comment je passe vraiment de A à B », et il mérite sa
propre page précisément parce que cette réponse est généralement trop longue pour une entrée de
changelog.&lt;/p&gt;
&lt;h2&gt;Combien de temps un guide de migration devrait-il rester publié ?&lt;/h2&gt;
&lt;p&gt;Au moins aussi longtemps que l&amp;#39;ancien comportement reste accessible, et idéalement après aussi.
Une appelante qui migre dix-huit mois trop tard, après avoir ignoré trois avis de dépréciation, a
quand même besoin du guide, et le supprimer le jour où l&amp;#39;ancien comportement est coupé garantit
seulement que l&amp;#39;appelante qui en a le plus besoin ne le trouve pas. Gardez-le à une URL stable et
mettez à jour la section calendrier plutôt que de retirer la page. Le &lt;a href=&quot;https://docs.stripe.com/upgrades&quot;&gt;guide de mise à
niveau&lt;/a&gt; de Stripe est un exemple public de ce schéma : une seule
page, tenue à jour release après release, plutôt qu&amp;#39;un nouveau document par version qui devient
obsolète dès que la suivante sort. Votre propre guide mérite un endroit tout aussi facile à trouver,
à côté de &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;la documentation&lt;/a&gt; qu&amp;#39;une appelante lit déjà, plutôt qu&amp;#39;enterré dans des archives de
blog.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Chaque changement incompatible a-t-il besoin d&amp;#39;un guide de migration ?&lt;/strong&gt;
Non. Un changement qu&amp;#39;une appelante peut corriger avec la seule entrée de changelog, comme un
champ renommé avec un remplacement évident, n&amp;#39;a pas besoin d&amp;#39;un guide séparé. Un changement qui
touche plusieurs points d&amp;#39;appel ou nécessite un exemple travaillé, oui.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un guide de migration devrait-il vivre avec la documentation de l&amp;#39;API ou dans le changelog ?&lt;/strong&gt;
Avec la documentation, lié depuis l&amp;#39;entrée de changelog. L&amp;#39;entrée est ce qu&amp;#39;une abonnée voit en
premier ; le guide est ce dont elle a besoin une fois qu&amp;#39;elle a décidé d&amp;#39;agir, et il appartient
juste à côté du matériel de référence qu&amp;#39;une appelante utilise déjà.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre un guide de migration et un avis de dépréciation ?&lt;/strong&gt;
Un avis de dépréciation indique que quelque chose va disparaître et avant quand. Un guide de
migration, ce sont les instructions pour agir en conséquence. Un avis de dépréciation sans guide de
migration lié donne à une appelante une échéance sans lui dire comment la respecter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faut-il documenter à la fois l&amp;#39;ancien et le nouveau comportement pendant une fenêtre de migration ?&lt;/strong&gt;
Oui, sur la même page si possible, pour qu&amp;#39;une appelante voie exactement ce qui a changé plutôt que
de le reconstituer à partir de deux documents séparés écrits à des moments différents.&lt;/p&gt;
</content:encoded></item><item><title>Un check de changelog pour GitHub Actions</title><link>https://changeloop.dev/blog/fr/changelog-ci-enforcement/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/changelog-ci-enforcement/</guid><description>Un check de changelog dans GitHub Actions refuse de merger sans entrée, car une étape qui dépend de la mémoire échoue à coup sûr. Et ce que ce check casse.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Chaque équipe qui tient un changelog à la main a eu la même conversation après le même incident :
une release est sortie sans entrée, quelqu&amp;#39;un demande pourquoi, et la réponse honnête est que la
personne qui l&amp;#39;aurait écrite allait vite et l&amp;#39;étape du changelog ne vivait que dans la mémoire.
&lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-automation/&quot;&gt;L&amp;#39;automatisation du changelog&lt;/a&gt; couvre ce qu&amp;#39;un pipeline peut
automatiser en sécurité et ce qui a encore besoin d&amp;#39;une personne ; un check de changelog en CI est
l&amp;#39;autre moitié de ce problème, parce qu&amp;#39;automatiser l&amp;#39;écriture n&amp;#39;aide pas si personne n&amp;#39;est obligé
de la déclencher en premier lieu. GitHub Actions est là où la plupart des équipes font déjà tourner
leurs checks de pull request, donc c&amp;#39;est là que celui-ci vit aussi.&lt;/p&gt;
&lt;h2&gt;Pourquoi « on demande aux gens d&amp;#39;ajouter une entrée » échoue-t-il selon un schéma prévisible ?&lt;/h2&gt;
&lt;p&gt;Parce que ça rivalise pour l&amp;#39;attention avec tout le reste dans une pull request, et c&amp;#39;est la seule
partie sans conséquence immédiate à la sauter. Les tests échouent bruyamment et bloquent le merge.
Une entrée de changelog manquante ne bloque rien, donc elle perd dès que quelqu&amp;#39;un est pressé, ce
qui en pratique est la plupart du temps. Une politique imposée par la mémoire se dégrade
exactement au rythme attendu : bien pendant les premières semaines après l&amp;#39;accord de tous, puis
silencieusement abandonnée dès que la personne qui s&amp;#39;en souciait part en vacances ou change
d&amp;#39;équipe.&lt;/p&gt;
&lt;h2&gt;Que vérifie vraiment un check CI pour une entrée de changelog ?&lt;/h2&gt;
&lt;p&gt;Pas la qualité de la rédaction, seulement qu&amp;#39;une entrée existe et qu&amp;#39;elle est bien formée, ce qui
est le bon périmètre pour un check de changelog qui tourne en CI plutôt que dans la tête de
quelqu&amp;#39;un. Une forme courante : le check regarde le diff de la PR et exige soit un nouveau
fichier dans un répertoire de changesets (le modèle qu&amp;#39;utilisent
&lt;a href=&quot;https://github.com/changesets/changesets&quot;&gt;Changesets&lt;/a&gt; et des outils similaires) soit une ligne
modifiée dans un fichier de changelog, et fait échouer le build si aucun des deux n&amp;#39;existe. La
revue de ce que dit vraiment l&amp;#39;entrée continue de se passer là où elle s&amp;#39;est toujours passée, en
code review, parce que ce jugement n&amp;#39;a pas sa place dans un script.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ce que vérifie le check CI&lt;/th&gt;
&lt;th&gt;Ce qu&amp;#39;il ne vérifie pas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Un changeset ou une ligne de changelog existe dans le diff&lt;/td&gt;
&lt;td&gt;Si la formulation est claire&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L&amp;#39;entrée référence le bon package, dans un monorepo&lt;/td&gt;
&lt;td&gt;Si le changement mérite vraiment une entrée&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Le fichier est syntaxiquement valide (front matter, forme JSON)&lt;/td&gt;
&lt;td&gt;Si l&amp;#39;entrée est honnête sur l&amp;#39;impact&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Chaque PR en a-t-elle besoin, ou certains changements sont-ils exemptés ?&lt;/h2&gt;
&lt;p&gt;Certains sont exemptés, et la liste des exemptions est là où ces systèmes se construisent ou
s&amp;#39;abandonnent vraiment. Une montée de dépendance sans effet visible, un changement uniquement de
tests, un refactor interne sans changement de comportement : aucun de ceux-là ne devrait forcer
une contributrice à inventer une entrée de changelog pour quelque chose dont personne lisant le
changelog ne se soucie. Le modèle qui fonctionne est une étiquette ou un flag qu&amp;#39;une contributrice
peut appliquer (&lt;code&gt;no-changelog-needed&lt;/code&gt;) et qui satisfait le check CI sans fichier, revu par qui
approuve la PR, pour que l&amp;#39;exemption elle-même passe le même contrôle qu&amp;#39;une entrée.&lt;/p&gt;
&lt;h2&gt;Que se passe-t-il pour les exceptions légitimes, comme un hotfix urgent ?&lt;/h2&gt;
&lt;p&gt;Le gate appartient au merge, pas au déploiement : un hotfix sous vraie pression de temps peut
merger avec une entrée provisoire ou un ticket de suivi,
pourvu que le check CI soit satisfait par l&amp;#39;intention plutôt que seulement par un paragraphe fini ;
certaines équipes acceptent un stub d&amp;#39;une ligne qu&amp;#39;une mainteneuse peaufine avant la prochaine
coupe de release. Ce que le gate ne devrait jamais permettre, c&amp;#39;est de sauter l&amp;#39;étape en silence,
parce qu&amp;#39;un stub qu&amp;#39;on oublie est un échec plus petit qu&amp;#39;une entrée qui n&amp;#39;a jamais existé, et un
stub laisse au moins une trace que quelqu&amp;#39;un peut retrouver plus tard.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# .github/workflows/changelog-check.yml
on:
  pull_request:
    types: [opened, synchronize, reopened, labeled, unlabeled]
jobs:
  changelog:
    if: &amp;gt;-
      !contains(github.event.pull_request.labels.*.name,
      &amp;#39;no-changelog-needed&amp;#39;)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # le diff a besoin de la branche de base
      - name: Require changelog entry
        run: |
          base=&amp;quot;origin/${{ github.base_ref }}&amp;quot;
          if ! git diff --name-only &amp;quot;$base&amp;quot;...HEAD \
              | grep -q &amp;#39;^\.changeset/&amp;#39;; then
            echo &amp;quot;No changeset. Add one, or have a maintainer&amp;quot;
            echo &amp;quot;apply the no-changelog-needed label.&amp;quot;
            exit 1
          fi
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Comment savoir que le check lui-même est correct avant qu&amp;#39;il ne bloque de vraies PR ?&lt;/h2&gt;
&lt;p&gt;Ouvrez d&amp;#39;abord une pull request de test contre une branche jetable : une avec un changeset, une
sans, et une portant l&amp;#39;étiquette d&amp;#39;exemption, et confirmez que les trois obtiennent le résultat
attendu avant que le check ne s&amp;#39;applique au travail de quelqu&amp;#39;un d&amp;#39;autre. Un check de changelog qui
échoue ouvert, laissant passer chaque PR parce qu&amp;#39;une condition a été écrite à l&amp;#39;envers, est pire
que l&amp;#39;absence de check, parce que ça ressemble à une couverture qui n&amp;#39;existe pas.
&lt;code&gt;workflow_dispatch&lt;/code&gt; sur le même fichier, exécuté manuellement contre quelques PR récemment
mergées, attrape la plupart de ces erreurs sans avoir besoin d&amp;#39;une vraie pull request.&lt;/p&gt;
&lt;h2&gt;La même idée fonctionne-t-elle en dehors de GitHub Actions ?&lt;/h2&gt;
&lt;p&gt;La forme se transpose, seule la syntaxe change. GitLab CI exprime la même règle comme un bloc
&lt;code&gt;rules&lt;/code&gt; de job qui vérifie &lt;code&gt;$CI_MERGE_REQUEST_LABELS&lt;/code&gt; au lieu d&amp;#39;un &lt;code&gt;if&lt;/code&gt; GitHub Actions, et une
approbation de merge request obligatoire peut remplacer l&amp;#39;étape de revue d&amp;#39;exemption. Le check que
cet article décrit est GitHub Actions parce que c&amp;#39;est la plateforme sur laquelle la plupart des
lectrices sont déjà, mais l&amp;#39;exigence sous-jacente, un gate vérifié par une machine plutôt qu&amp;#39;une
convention qu&amp;#39;on se contente de demander, est la même partout où une CI tourne avant un merge.&lt;/p&gt;
&lt;h2&gt;Est-ce que ça fonctionne pareil dans un monorepo ?&lt;/h2&gt;
&lt;p&gt;Il faut une pièce de plus : pour quel package est l&amp;#39;entrée.
&lt;a href=&quot;https://changeloop.dev/blog/fr/monorepo-changelogs/&quot;&gt;Les changelogs de monorepo&lt;/a&gt; couvre pourquoi un seul fichier pour
tout le repo cesse de fonctionner dès que les packages sont livrés indépendamment ; le check CI
hérite de la même exigence ; un changeset qui ne nomme pas de package n&amp;#39;est pas une preuve utile
que le bon changelog sera mis à jour, seulement qu&amp;#39;un fichier a changé quelque part dans le diff.
Les outils construits pour ça (Changesets est celui courant dans l&amp;#39;écosystème JavaScript)
demandent à la contributrice de choisir le package concerné et un bump de semver au moment même où
le changeset est créé, donc le check CI obtient les deux pièces gratuitement au lieu de les
inférer plus tard.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Le check CI devrait-il bloquer le merge, ou juste avertir ?&lt;/strong&gt;
Bloquer. Un avertissement est fonctionnellement identique à demander gentiment, ce qui a déjà
échoué. L&amp;#39;étiquette d&amp;#39;exemption existe précisément pour qu&amp;#39;un cas d&amp;#39;avertissement authentique ait
quand même un chemin légitime à travers le même gate strict.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qui vérifie qu&amp;#39;une étiquette d&amp;#39;exemption a été appliquée correctement ?&lt;/strong&gt;
Qui que ce soit qui approuve la pull request, dans le cadre de la revue qu&amp;#39;elle fait déjà de toute
façon. L&amp;#39;étiquette ne devrait jamais être auto-appliquée sans revue, sinon elle devient le même
contournement silencieux que le gate était censé fermer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exiger ça en CI remplace-t-il le besoin d&amp;#39;un pipeline d&amp;#39;automatisation de changelog ?&lt;/strong&gt;
Non, ça l&amp;#39;alimente. &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-automation/&quot;&gt;L&amp;#39;automatisation du changelog&lt;/a&gt; couvre
comment transformer des entrées structurées en une page, un flux et un email ; le check CI est ce
qui garantit que ces entrées structurées existent pour être automatisées en premier lieu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la plus petite version de ça qui vaut la peine d&amp;#39;être construite en premier ?&lt;/strong&gt;
Un seul check qui échoue si aucun fichier n&amp;#39;a changé sous un répertoire de changelog désigné, avec
une étiquette d&amp;#39;exemption. Le routage par package et l&amp;#39;inférence de semver pour un monorepo
peuvent venir plus tard ; l&amp;#39;habitude centrale, une entrée existe ou quelqu&amp;#39;un a explicitement dit
qu&amp;#39;elle n&amp;#39;était pas nécessaire, vaut la peine d&amp;#39;être là dès le premier jour.&lt;/p&gt;
</content:encoded></item><item><title>Refuser une demande de fonctionnalité sans perdre la cliente</title><link>https://changeloop.dev/blog/fr/declining-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/declining-feature-requests/</guid><description>Boucler la boucle veut souvent dire annoncer une livraison. La moitié difficile, c&apos;est dire non, d&apos;une façon qui ne casse pas la relation avec la cliente.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Boucler la boucle veut souvent dire dire à quelqu&amp;#39;un que sa demande a été livrée. La moitié
difficile, celle pour laquelle la plupart des systèmes de suivi n&amp;#39;ont aucun processus, c&amp;#39;est dire
non. La plupart des demandes de fonctionnalités ne sont jamais livrées, ce qui signifie que la
majeure partie du bouclage de boucle qu&amp;#39;un produit doit vraiment à ses utilisatrices est un refus,
pas une annonce, et un refus mal géré coûte plus de bonne volonté que le silence n&amp;#39;en aurait coûté.
Bien géré, il peut ne coûter presque rien, parce que ce que la demandeuse veut vraiment le plus
souvent, ce n&amp;#39;est pas la fonctionnalité, c&amp;#39;est de savoir qu&amp;#39;elle a été entendue.&lt;/p&gt;
&lt;h2&gt;Pourquoi bien refuser compte-t-il autant que bien livrer ?&lt;/h2&gt;
&lt;p&gt;Parce que le silence se lit comme un refus sans explication, et un non expliqué se lit comme de
l&amp;#39;attention. Celle qui n&amp;#39;entend rien suppose que la demande a été ignorée ou perdue, et les deux
conclusions lui apprennent à arrêter de se donner la peine de demander, ce qui est le même résultat
qu&amp;#39;obtient un produit avec un vrai refus, juste atteint plus lentement et avec plus de
ressentiment en chemin. Une réponse qui dit non, clairement et avec une raison, boucle la boucle
aussi complètement qu&amp;#39;une fonctionnalité livrée, et le fait plus vite.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Réponse&lt;/th&gt;
&lt;th&gt;Ce que la demandeuse apprend&lt;/th&gt;
&lt;th&gt;Coût pour la relation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Silence&lt;/td&gt;
&lt;td&gt;Personne n&amp;#39;a lu, ou personne ne s&amp;#39;en soucie&lt;/td&gt;
&lt;td&gt;Élevé, et s&amp;#39;accumule à chaque demande future&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Réponse automatique sans raison&lt;/td&gt;
&lt;td&gt;C&amp;#39;est en file d&amp;#39;attente quelque part, indéfiniment&lt;/td&gt;
&lt;td&gt;Moyen ; gagne du temps mais pas de confiance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refus avec raison&lt;/td&gt;
&lt;td&gt;C&amp;#39;était lu, considéré et répondu&lt;/td&gt;
&lt;td&gt;Faible, si la raison est honnête&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refus avec alternative&lt;/td&gt;
&lt;td&gt;Le vrai besoin a été vraiment entendu&lt;/td&gt;
&lt;td&gt;Le plus faible ; construit souvent de la confiance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui fait mal atterrir un refus ?&lt;/h2&gt;
&lt;p&gt;Presque toujours trois choses, combinées. La généricité : un « merci pour votre retour » tout fait
qui ne fait pas référence à ce qui a vraiment été demandé se lit comme n&amp;#39;ayant pas été lu du tout,
même si ça l&amp;#39;était. Le délai : un refus qui arrive six mois après la demande, une fois que la
demandeuse a oublié avoir demandé, se sent pire qu&amp;#39;un non rapide, parce qu&amp;#39;il implique que la
demande est restée sans y toucher plutôt que d&amp;#39;avoir été considérée et refusée. Et une raison qui
ne tient pas : « pas sur notre roadmap » ne répond à rien, tandis que « cela nécessiterait de
repenser comment fonctionnent les permissions, ce que nous ne prévoyons pas de toucher cette
année » donne à la demandeuse quelque chose qu&amp;#39;elle peut vraiment évaluer et, si ça compte assez,
escalader ou contourner.&lt;/p&gt;
&lt;h2&gt;Que devrait vraiment dire un bon refus ?&lt;/h2&gt;
&lt;p&gt;Quatre choses, dans cet ordre : une reconnaissance qui nomme la demande spécifique, pas une
paraphrase générique ; la vraie raison, énoncée honnêtement même quand la raison honnête est « ça
ne correspond pas à la direction que prend le produit » plutôt qu&amp;#39;une excuse plus douce ; si la
porte est fermée ou juste pas ouverte maintenant, parce que ça nécessite des tons très différents ;
et, quand il en existe une, une alternative qui répond au besoin sous-jacent même si ce n&amp;#39;est pas
la fonctionnalité demandée à la lettre.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Bonjour Jamie,

Merci pour la demande d&amp;#39;ajouter l&amp;#39;import CSV en masse pour les
invitations d&amp;#39;équipe. On a regardé, et on ne va pas la construire :
notre flux d&amp;#39;invitation repose sur la revue individuelle de chaque
nouveau membre pour des raisons de sécurité, et l&amp;#39;import en masse
irait à l&amp;#39;encontre de ça par conception, pas par oubli.

Si le vrai problème est d&amp;#39;inviter rapidement une grande équipe, l&amp;#39;API
prend en charge les invitations individuelles scriptées, ce qui vous
donne presque toute la rapidité sans contourner la revue : [lien].
Content de vous aider à mettre ça en place si vous voulez.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Remarquez ce que ça fait qu&amp;#39;un modèle ne peut pas : ça nomme la vraie fonctionnalité, donne une
raison liée à une vraie décision de conception plutôt qu&amp;#39;à une politique vague, et propose un
chemin qui résout le problème sous-jacent plutôt que de simplement fermer le ticket.&lt;/p&gt;
&lt;h2&gt;En quoi est-ce différent de boucler la boucle sur une fonctionnalité livrée ?&lt;/h2&gt;
&lt;p&gt;La mécanique est similaire, le ton non. &lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;Boucler la boucle de feedback avec le client&lt;/a&gt;
couvre le cas livré, où le message est une bonne nouvelle et le risque principal est d&amp;#39;oublier de
l&amp;#39;envoyer. Un refus est une mauvaise nouvelle, ou du moins une nouvelle non désirée, et il
nécessite plus de soin dans la raison donnée et moins d&amp;#39;automatisation dans la livraison : une
notification de fonctionnalité livrée peut être un commentaire tout fait déclenché par un
changement de statut, mais un refus qui se lit comme tout fait est exactement l&amp;#39;échec que toute
cette approche cherche à éviter. Les deux partagent une exigence, cependant : la demande
originale doit rester liée à la demandeuse, la même discipline de suivi que couvre le &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-tracking/&quot;&gt;suivi des demandes de fonctionnalités&lt;/a&gt;,
sinon il n&amp;#39;y a aucun moyen d&amp;#39;envoyer l&amp;#39;un ou l&amp;#39;autre message individuellement.&lt;/p&gt;
&lt;h2&gt;Un refus devrait-il être public, comme un statut sur une roadmap publique ?&lt;/h2&gt;
&lt;p&gt;Généralement pas la raison spécifique, même si le statut l&amp;#39;est. &lt;a href=&quot;https://changeloop.dev/blog/fr/public-roadmap/&quot;&gt;Roadmap publique&lt;/a&gt;
couvre les étiquettes de statut qu&amp;#39;une demandeuse peut consulter sans redemander, et un statut
« refusé » ou « non prévu » peut faire partie de ce système. Mais la raison détaillée, surtout
quand elle touche à des priorités internes ou à un contexte peu flatteur, vaut généralement mieux
dans la réponse individuelle que sur une page de statut publique, où la même formulation doit
fonctionner pour chaque lectrice au lieu de la seule personne qui a vraiment demandé.&lt;/p&gt;
&lt;h2&gt;Chaque demande refusée mérite-t-elle une réponse individuelle ?&lt;/h2&gt;
&lt;p&gt;Chaque demande d&amp;#39;une personne nommée et joignable, oui, au moins une courte. Les demandes à fort
volume, dupliquées ou anonymes sont l&amp;#39;exception : regrouper des demandes similaires et répondre une
fois par groupe, ou mettre à jour une étiquette de statut partagée, est raisonnable quand les
réponses individuelles ne passent vraiment pas à l&amp;#39;échelle. La ligne à tenir, c&amp;#39;est que « on ne
peut pas répondre à tout le monde individuellement » devrait être une vraie contrainte
opérationnelle, vérifiée contre le volume réel, pas une excuse par défaut pour sauter une réponse
qui aurait pris deux minutes.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Vaut-il mieux refuser rapidement avec une raison faible, ou prendre le temps pour une bonne ?&lt;/strong&gt;
Rapidement, avec une raison honnête, bat les deux pris séparément. Une réponse rapide avec une
vraie raison, même courte, surpasse une réponse lente avec une raison polie ; le délai lui-même
fait partie de ce qui abîme la confiance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un refus devrait-il jamais promettre de reconsidérer la demande plus tard ?&lt;/strong&gt;
Seulement si c&amp;#39;est vraiment probable et qu&amp;#39;il y a un mécanisme pour vraiment la reconsidérer,
comme une étiquette qui la refait remonter à un cycle de planification. Un vague « on va y penser »
sans un tel mécanisme équivaut fonctionnellement au silence, juste formulé plus gentiment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et si la raison honnête est quelque chose que l&amp;#39;entreprise ne peut pas partager, comme une préoccupation concurrentielle ?&lt;/strong&gt;
Dites-le directement plutôt que d&amp;#39;inventer une raison plus douce. « On ne peut pas partager le
raisonnement précis ici, mais ce n&amp;#39;est pas quelque chose qu&amp;#39;on prévoit de construire » est plus
honnête, et plus respecté, qu&amp;#39;une explication inventée qui s&amp;#39;effondre à la première relance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Refuser une demande signifie-t-il qu&amp;#39;elle devrait être supprimée du suivi ?&lt;/strong&gt;
Non. Gardez-la, étiquetée comme refusée avec la raison, pour qu&amp;#39;elle fasse partie du motif contre
lequel la prochaine demande similaire sera regroupée, et pour qu&amp;#39;un contexte modifié plus tard
(une nouvelle intégration, une nouvelle priorité d&amp;#39;équipe) puisse la faire ressurgir plutôt que
de repartir de zéro dans l&amp;#39;évaluation.&lt;/p&gt;
</content:encoded></item><item><title>Release notes de feature flag : quoi dire, et quand</title><link>https://changeloop.dev/blog/fr/feature-flags-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/feature-flags-feature-requests/</guid><description>Les release notes de feature flag séparent fusion et livraison, qui ne coïncident plus avec un flag. Boucler trop tôt annonce une fonction invisible.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Fermer la boucle sur une demande de fonctionnalité suppose un moment net où la chose a été livrée.
Un feature flag supprime ce moment, et c&amp;#39;est ce qui rend les release notes de feature flag si délicates à caler dans le temps. Le code est fusionné, le flag existe, et pendant des jours ou
des semaines la fonctionnalité est à la fois en production et invisible pour presque tout le monde
qui pourrait vouloir l&amp;#39;utiliser, y compris, souvent, la personne qui l&amp;#39;a demandée à l&amp;#39;origine.
Prévenir trop tôt la fait tomber sur une fonctionnalité qui n&amp;#39;est pas encore là. Prévenir trop tard
fait que la boucle censée construire la confiance se lit, au contraire, comme oubliée.&lt;/p&gt;
&lt;h2&gt;Pourquoi un flag casse-t-il la séquence habituelle « livrer, prévenir » ?&lt;/h2&gt;
&lt;p&gt;Parce qu&amp;#39;il divise un événement en au moins deux : le code qui devient actif, et le flag qui
s&amp;#39;active pour un compte donné. Tout processus de fermeture de boucle de feedback suppose que ces
deux choses arrivent ensemble, ce qui est vrai pour la plupart des livraisons et faux pour tout ce
qui se trouve derrière un flag utilisé pour un déploiement progressif, du ciblage ou comme
interrupteur d&amp;#39;urgence. &lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;Fermer la boucle de feedback client&lt;/a&gt;
décrit le fait de prévenir la demandeuse au moment précis où une entrée de changelog est approuvée
et publiée ; cette étape est écrite pour le cas où publier l&amp;#39;entrée et la fonctionnalité devenant
utilisable sont le même moment, et un flag est exactement le cas où ils ne le sont pas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Moment&lt;/th&gt;
&lt;th&gt;Ce qui est vrai&lt;/th&gt;
&lt;th&gt;Faut-il déjà prévenir la demandeuse&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Code fusionné, flag éteint partout&lt;/td&gt;
&lt;td&gt;La fonctionnalité existe, personne ne peut l&amp;#39;utiliser&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag activé pour le compte de la demandeuse&lt;/td&gt;
&lt;td&gt;La fonctionnalité existe, elle peut spécifiquement l&amp;#39;utiliser&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag activé pour un pourcentage de déploiement qui l&amp;#39;exclut&lt;/td&gt;
&lt;td&gt;La fonctionnalité existe, elle ne peut toujours pas l&amp;#39;utiliser&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flag entièrement supprimé, la fonctionnalité est simplement active&lt;/td&gt;
&lt;td&gt;La fonctionnalité existe pour tout le monde&lt;/td&gt;
&lt;td&gt;Oui, si pas déjà prévenue&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quelle est la règle réelle pour savoir quand prévenir quelqu&amp;#39;un ?&lt;/h2&gt;
&lt;p&gt;Prévenir quand le flag est activé pour son compte, pas quand le code est fusionné et pas quand le
flag est créé. Cette seule règle couvre chaque ligne du tableau ci-dessus, parce qu&amp;#39;elle relie la
notification au seul fait qui compte vraiment pour la demandeuse : peut-elle, là maintenant, aller
utiliser la chose. Une notification liée à la fusion ou à la création du flag est en réalité un
rapport d&amp;#39;avancement technique, et quelqu&amp;#39;un qui a demandé une fonctionnalité ne veut pas un
rapport d&amp;#39;avancement, elle veut savoir quand aller regarder.&lt;/p&gt;
&lt;h2&gt;Est-ce que ça veut dire que la demandeuse a besoin d&amp;#39;un accès anticipé ou spécial ?&lt;/h2&gt;
&lt;p&gt;Pas forcément, et forcer ça crée son propre problème. Si le flag est déployé progressivement pour
des raisons de charge ou de stabilité, faire passer un compte en tête de file juste pour fermer une
boucle plus vite sape la raison même pour laquelle le déploiement est échelonné. Les options
honnêtes sont : attendre que le compte de la demandeuse atteigne le déploiement naturellement et
la prévenir alors, ou, si l&amp;#39;urgence le justifie, l&amp;#39;activer délibérément en avance, comme une vraie
décision de qui possède le déploiement, pas comme un effet de bord du désir d&amp;#39;envoyer une
notification.&lt;/p&gt;
&lt;h2&gt;Et si le flag est un interrupteur d&amp;#39;urgence, pas un mécanisme de déploiement ?&lt;/h2&gt;
&lt;p&gt;Alors l&amp;#39;hypothèse sûre s&amp;#39;inverse. Un flag pensé pour pouvoir désactiver rapidement une
fonctionnalité, plutôt que pour échelonner sa sortie, signifie généralement que la fonctionnalité
est censée être entièrement active dès sa création, et le flag existe pour la sécurité plutôt que
pour le séquencement. Dans ce cas, prévenir la demandeuse au moment du déploiement est correct,
comme pour toute livraison sans flag ; la présence du flag est un détail opérationnel qui ne
devrait pas changer quand la boucle se ferme. La distinction qui compte, c&amp;#39;est à quoi sert le flag,
pas s&amp;#39;il en existe un.&lt;/p&gt;
&lt;h2&gt;Le flag change-t-il ce que les release notes de feature flag devraient dire ?&lt;/h2&gt;
&lt;p&gt;Il change quand l&amp;#39;entrée est publiée, pas ce qu&amp;#39;elle contient. Une entrée publiée au moment précis
où le flag est activé pour 100 % des comptes se lit exactement comme une entrée de changelog
normale, et c&amp;#39;est très bien ainsi ; une lectrice qui la trouve plus tard n&amp;#39;a aucune raison de
savoir qu&amp;#39;un flag a un jour été impliqué. Ce qu&amp;#39;elle ne devrait pas faire, c&amp;#39;est être publiée
pendant que le flag n&amp;#39;est activé que pour un petit pourcentage de déploiement, parce qu&amp;#39;une entrée
de changelog publique envoie tous ceux qui la lisent, y compris les comptes sans le flag, chercher
une fonctionnalité qu&amp;#39;ils ne trouveront pas, ce qui est une version pire du même problème, à
l&amp;#39;échelle du produit entier plutôt qu&amp;#39;à l&amp;#39;échelle d&amp;#39;une seule demandeuse. Cette règle de timing est
toute la différence entre des release notes de feature flag et une entrée ordinaire : le contenu
est le même, seule la date de publication bouge.
&lt;a href=&quot;https://changeloop.dev/blog/fr/how-to-write-release-notes/&quot;&gt;Comment écrire des release notes&lt;/a&gt; couvre la discipline du
« aucune action nécessaire » qui s&amp;#39;applique aussi ici : il faut dire à la lectrice si ça la
concerne, pas juste que ça existe quelque part.&lt;/p&gt;
&lt;h2&gt;Les e-mails de mise à jour produit devraient-ils traiter une fonctionnalité flaggée différemment ?&lt;/h2&gt;
&lt;p&gt;Oui, surtout en la retardant plutôt qu&amp;#39;en la réécrivant. &lt;a href=&quot;https://changeloop.dev/blog/fr/product-update-email/&quot;&gt;Le modèle d&amp;#39;e-mail de mise à jour
produit&lt;/a&gt; couvre les notifications ciblées face aux digests larges ;
une fonctionnalité flaggée est un cas où le timing d&amp;#39;une notification ciblée doit être vérifié
contre l&amp;#39;état du flag de la destinataire elle-même avant l&amp;#39;envoi, ce qu&amp;#39;un digest large ne peut pas
faire facilement du tout, ce qui est une raison de plus pour laquelle un digest est le mauvais
canal pour tout ce qui est encore à mi-déploiement.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Faut-il dire à une demandeuse que sa fonctionnalité « arrive bientôt » une fois que le flag existe mais n&amp;#39;est pas encore activé pour elle ?&lt;/strong&gt;
Seulement s&amp;#39;il y a une date réelle et proche, et même là avec parcimonie. Un « bientôt » sans date
se lit, passé assez de temps, exactement comme le silence, et crée une seconde promesse qui doit
elle aussi être suivie et tenue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qui décide quand un flag est assez avancé pour fermer la boucle ?&lt;/strong&gt;
Qui possède le déploiement, pas qui possède la notification. La propriétaire du déploiement sait si
« 100 % des comptes » est imminent ou encore à des semaines ; lier l&amp;#39;étape de fermeture de boucle à
son état, plutôt qu&amp;#39;à une date fixe du calendrier, garde la notification honnête.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une fonctionnalité derrière un flag permanent (jamais entièrement supprimé) reçoit-elle un jour une entrée de changelog publique ?&lt;/strong&gt;
Oui, dès qu&amp;#39;elle atteint ce que signifie « disponibilité générale » pour ce produit, même si le
flag lui-même reste dans le code pour toujours pour des raisons opérationnelles. L&amp;#39;entrée de
changelog parle de la disponibilité pour la lectrice, pas du détail d&amp;#39;implémentation de la façon
dont cette disponibilité est réalisée.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et si le flag est supprimé et que la fonctionnalité est tuée au lieu d&amp;#39;être livrée ?&lt;/strong&gt;
C&amp;#39;est un refus, pas une notification de livraison, et ça mérite le même soin que n&amp;#39;importe quel
autre refus. &lt;a href=&quot;https://changeloop.dev/blog/fr/declining-feature-requests/&quot;&gt;Comment refuser une demande de fonctionnalité&lt;/a&gt;
couvre ce que ce message devrait dire ; fermer la boucle honnêtement signifie parfois la fermer
avec un non.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les release notes de feature flag ont-elles besoin d&amp;#39;un modèle séparé d&amp;#39;une entrée normale ?&lt;/strong&gt;
Aucun changement de modèle, seulement une étape de vérification avant publication : vérifier
l&amp;#39;état du flag pour le compte qui a demandé, pas seulement que le code a été fusionné, et retenir
l&amp;#39;entrée jusqu&amp;#39;à ce que cette vérification passe. Tout le reste de l&amp;#39;entrée, la formulation, la
longueur, la discipline de la FAQ, reste identique à n&amp;#39;importe quelle autre release note.&lt;/p&gt;
</content:encoded></item><item><title>Quand une demande de fonctionnalité est en fait un bug</title><link>https://changeloop.dev/blog/fr/feature-request-vs-bug-report/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/feature-request-vs-bug-report/</guid><description>Un ticket demandant un réglage peut être un contournement pour un bug caché. La mauvaise étiquette l&apos;envoie à la mauvaise responsable et file.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;« Pouvez-vous ajouter un réglage pour augmenter la limite d&amp;#39;export ? » se lit comme une demande de
fonctionnalité, et la plupart des systèmes de triage l&amp;#39;étiquettent ainsi sur le champ. Parfois
c&amp;#39;en est une. Parfois l&amp;#39;export échoue à un nombre inférieur à la limite documentée à cause d&amp;#39;un
bug, et la cliente, incapable de voir le code, a inventé la solution la plus plausible qu&amp;#39;elle
sait décrire : donnez-moi un nombre plus grand et peut-être que ça marchera. &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-tracking/&quot;&gt;Quelles étiquettes
valent la peine&lt;/a&gt; couvre l&amp;#39;étiquette de type qui divise un
backlog en demandes de fonctionnalités et bugs ; voici le cas où les mots mêmes d&amp;#39;une cliente
pointent l&amp;#39;étiquette dans la mauvaise direction, et le coût de se tromper est une dérive lente vers
un backlog plein de demandes que personne ne veut vraiment une fois qu&amp;#39;on regarde en dessous.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble une demande de fonctionnalité qui est en fait un bug ?&lt;/h2&gt;
&lt;p&gt;Elle nomme un contournement au lieu du problème. Une vraie demande de fonctionnalité décrit
généralement un résultat que le produit ne supporte pas du tout : « laissez-moi programmer ça pour
plus tard », « ajoutez un mode sombre ». Un bug mal classé décrit un nombre, un seuil ou un
comportement spécifique qui sonne comme un réglage manquant mais qui est en fait un symptôme :
« augmentez le timeout », « ajoutez une option de retry », « laissez-moi exporter plus de lignes à
la fois ». Le signe révélateur est que la demandeuse propose une implémentation, un réglage, un
interrupteur, une surcharge, plutôt que de décrire un objectif, parce qu&amp;#39;elle a déjà essayé la
fonctionnalité telle que documentée et elle n&amp;#39;a pas fait ce que la documentation dit qu&amp;#39;elle
devrait faire.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Demande de fonctionnalité&lt;/th&gt;
&lt;th&gt;Bug déguisé en demande de fonctionnalité&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Ce que décrit la demandeuse&lt;/td&gt;
&lt;td&gt;Un résultat que le produit ne peut pas faire&lt;/td&gt;
&lt;td&gt;Un paramètre qu&amp;#39;elle veut changer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Si le comportement documenté couvre déjà ça&lt;/td&gt;
&lt;td&gt;Non, vraiment manquant&lt;/td&gt;
&lt;td&gt;Oui, mais ça ne fonctionne pas comme documenté&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Si plus d&amp;#39;effort fait disparaître la demande&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;Parfois, si le bug dépend d&amp;#39;un seuil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Où ça devrait être routé&lt;/td&gt;
&lt;td&gt;Backlog produit&lt;/td&gt;
&lt;td&gt;File des bugs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Pourquoi est-ce plus important que ça n&amp;#39;y paraît ?&lt;/h2&gt;
&lt;p&gt;Parce que les deux files ont des responsables, des délais et des critères de succès différents, et
un bug classé comme demande de fonctionnalité est priorisé contre les demandes de fonctionnalités,
rivalisant pour l&amp;#39;attention avec de vrais manques produit au lieu d&amp;#39;être corrigé selon le délai
qu&amp;#39;un bug mérite. &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-tracking/&quot;&gt;Comment suivre les demandes de fonctionnalités&lt;/a&gt;
couvre pourquoi mélanger bugs et fonctionnalités dans une seule file laisse les plaintes les plus
bruyantes passer devant les vraies demandes ; une demande de fonctionnalité qui est secrètement un
bug fait le dommage inverse, reste dans le backlog produit à accumuler des votes pour une
« fonctionnalité » qui disparaîtrait dès que le bug sous-jacent serait corrigé, ce qui gaspille le
signal de priorisation pour quiconque lit ce backlog.&lt;/p&gt;
&lt;h2&gt;Comment distinguer quand les mots mêmes de la cliente pointent dans la mauvaise direction ?&lt;/h2&gt;
&lt;p&gt;Demandez ce qu&amp;#39;elle s&amp;#39;attendait à voir se passer, pas ce qu&amp;#39;elle veut que vous ajoutiez. « L&amp;#39;export
plafonnait à 500 lignes et j&amp;#39;en ai besoin de 2 000, pouvez-vous augmenter la limite » sonne comme
une demande de fonctionnalité d&amp;#39;augmentation de limite jusqu&amp;#39;à ce que la question de suivi,
« 500 est-elle la limite documentée », révèle que le nombre documenté était 5 000 et que l&amp;#39;export
échoue tôt. Cette seule question, ce qu&amp;#39;elle attendait contre ce qui s&amp;#39;est passé, fait la majeure
partie du travail de tri, parce qu&amp;#39;une vraie demande de fonctionnalité n&amp;#39;a pas de comportement
documenté auquel elle manque ; il n&amp;#39;y a rien à attendre parce que la capacité n&amp;#39;existe pas encore.&lt;/p&gt;
&lt;h2&gt;Les agentes de support ou les ingénieures devraient-elles trancher ?&lt;/h2&gt;
&lt;p&gt;Les agentes de support font le premier passage, parce qu&amp;#39;elles voient le ticket en premier, mais
l&amp;#39;étiquette devrait être facile à changer et bon marché à se tromper, pas une décision unique qui
fixe l&amp;#39;élément dans la mauvaise file pour toujours. Une seconde vérification légère, une ingénieure
qui parcourt chaque semaine les nouvelles étiquettes « demande de fonctionnalité » à la recherche
de ce qui sent le bug déguisé, attrape celles qu&amp;#39;une agente de support sans contexte du code n&amp;#39;aurait
pas pu reconnaître. Ça n&amp;#39;a pas besoin d&amp;#39;être formel ; c&amp;#39;est plus un coup d&amp;#39;œil de cinq minutes
qu&amp;#39;un processus de revue.&lt;/p&gt;
&lt;h2&gt;Boucler la boucle change-t-il une fois le vrai bug trouvé ?&lt;/h2&gt;
&lt;p&gt;Oui, et ça améliore le message que vous pouvez envoyer. &lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;Boucler la boucle de feedback
client&lt;/a&gt; couvre le fait d&amp;#39;avertir la demandeuse quand ce qu&amp;#39;elle a
demandé est livré ; un bug recatégorisé reçoit une meilleure version de ce message, parce que
« nous avons trouvé et corrigé le bug derrière ça » sonne comme de la compétence, alors que « nous
avons construit la fonctionnalité que vous avez demandée » n&amp;#39;aurait été vrai que par accident,
parce que la vraie demande de fonctionnalité, une limite d&amp;#39;export vraiment plus haute, pourrait
n&amp;#39;être jamais construite une fois le bug parti et la limite originale de 5 000 lignes suffisante.&lt;/p&gt;
&lt;h2&gt;Que se passe-t-il si la mauvaise classification n&amp;#39;est jamais repérée ?&lt;/h2&gt;
&lt;p&gt;Le backlog se remplit de demandes qui ressemblent à une vraie demande et qui n&amp;#39;en sont pas, et les
décisions de priorisation prises contre ce backlog héritent de la distorsion. Une
« fonctionnalité » avec quarante votes pourrait en réalité être quarante personnes tombant sur le
même bug, et construire la demande littérale, un réglage pour augmenter une limite qui n&amp;#39;a jamais
vraiment été la contrainte, livre de la complexité qui ne corrige rien, tandis que le bug
sous-jacent continue de générer de nouvelles « demandes de fonctionnalités » de clientes qui n&amp;#39;ont
pas encore trouvé ce fil.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Vaut-il la peine d&amp;#39;ajouter une étape formelle pour vérifier chaque demande de fonctionnalité contre les bugs connus ?&lt;/strong&gt;
Pas une étape formelle, plutôt une habitude : quiconque trie une nouvelle demande de fonctionnalité
devrait demander « le comportement documenté prétend-il déjà faire ça » avant d&amp;#39;appliquer
l&amp;#39;étiquette, parce que cette seule question attrape la plupart des mauvaises classifications sans
ajouter de surcharge de processus.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et si la cliente insiste que c&amp;#39;est une demande de fonctionnalité même après que le bug a été trouvé ?&lt;/strong&gt;
Expliquez ce que vous avez trouvé et pourquoi le réglage qu&amp;#39;elle proposait ne serait plus
nécessaire une fois le bug corrigé. La plupart des clientes demandent un contournement parce
qu&amp;#39;elles ont supposé que le vrai correctif n&amp;#39;était pas disponible, pas parce qu&amp;#39;elles voulaient
spécifiquement ce réglage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un élément recatégorisé perd-il les votes ou commentaires qu&amp;#39;il a accumulés en tant que demande de fonctionnalité ?&lt;/strong&gt;
Il devrait les conserver, visibles, parce que ces votes sont la preuve qui a mené à trouver le bug
en premier lieu, et cacher cette trace rend la même mauvaise classification plus difficile à
repérer la prochaine fois, sur un ticket différent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ça peut arriver dans l&amp;#39;autre sens, un bug qui est en fait une demande de fonctionnalité ?&lt;/strong&gt;
Moins souvent, mais oui : « c&amp;#39;est cassé » signifie parfois « ça ne fait pas ce que j&amp;#39;ai supposé que
ça ferait », ce qui est une capacité manquante, pas un défaut. La même question, ce qu&amp;#39;elle
attendait contre ce qui est documenté, trie aussi dans cette direction.&lt;/p&gt;
</content:encoded></item><item><title>Suivre les demandes de fonctionnalités sans les perdre</title><link>https://changeloop.dev/blog/fr/feature-request-tracking/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/feature-request-tracking/</guid><description>Le suivi des demandes échoue de deux façons : elles n&apos;arrivent nulle part, ou arrivent où personne ne revisite. Un système qui résiste aux deux.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Le suivi des demandes de fonctionnalités échoue presque toujours d&amp;#39;une de deux façons. Soit les
demandes n&amp;#39;ont nulle part où aller, et vivent dans des boîtes mail et des fils Slack où elles sont
oubliées une par une, soit elles ont un endroit où aller que personne ne revisite, et sont
oubliées collectivement. Un système qui fonctionne doit résister aux deux échecs : il faut un
seul endroit où chaque demande atterrit, et une raison de rouvrir cet endroit le mois prochain.&lt;/p&gt;
&lt;h2&gt;D&amp;#39;où viennent vraiment les demandes de fonctionnalités ?&lt;/h2&gt;
&lt;p&gt;De plus de canaux que la plupart des systèmes de suivi ne le prévoient. Un ticket de support qui
inclut un « ce serait bien si ». Un commentaire sur une roadmap publique. Un appel commercial où
une prospecte nomme la seule chose qui bloque la vente. Un widget dans le produit. Chaque canal a
sa propre responsable et ses propres outils, et c&amp;#39;est justement pour ça que les demandes se
dispersent : la file de tickets du support et le backlog de l&amp;#39;équipe produit sont rarement le
même système, et une demande qui n&amp;#39;atteint qu&amp;#39;un des deux n&amp;#39;a, en pratique, atteint qu&amp;#39;un seul
département.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Responsable typique&lt;/th&gt;
&lt;th&gt;Où elle disparaît le plus souvent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tickets de support&lt;/td&gt;
&lt;td&gt;Équipe support&lt;/td&gt;
&lt;td&gt;Fermé comme résolu, jamais revisité&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Appels commerciaux&lt;/td&gt;
&lt;td&gt;Ventes / gestion de comptes&lt;/td&gt;
&lt;td&gt;Un champ CRM que personne en produit ne lit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Widget dans le produit&lt;/td&gt;
&lt;td&gt;Produit&lt;/td&gt;
&lt;td&gt;Un formulaire envoyé sans suivi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commentaires sur la roadmap&lt;/td&gt;
&lt;td&gt;Qui a construit la roadmap&lt;/td&gt;
&lt;td&gt;Le fil de commentaires lui-même&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Réseaux sociaux / avis&lt;/td&gt;
&lt;td&gt;Marketing ou personne&lt;/td&gt;
&lt;td&gt;Capturé une fois en screenshot, puis disparu&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La solution n&amp;#39;est pas un formulaire d&amp;#39;entrée unique pour chaque canal, que personne n&amp;#39;adopte.
C&amp;#39;est une destination où chaque canal se déverse, même si le routage se résume d&amp;#39;abord à cinq
minutes de copier-coller par jour jusqu&amp;#39;à ce que ce soit automatisé.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui casse vraiment le suivi des demandes ?&lt;/h2&gt;
&lt;p&gt;Presque toujours deux choses. La première est une destination manquante : les demandes obtiennent
une réponse dans le canal où elles sont arrivées et ne sont jamais enregistrées durablement nulle
part, si bien que la même demande venant de trois clients différents ressemble à trois réponses
isolées sans lien plutôt qu&amp;#39;à un seul signal. La seconde, plus fréquente, est une destination qui
se remplit et cesse d&amp;#39;être lue. Un tableur de 400 lignes sans filtrage n&amp;#39;est plus un système de
suivi ; c&amp;#39;est une archive qui se trouve être modifiable.&lt;/p&gt;
&lt;p&gt;Le second échec est le plus dangereux, parce qu&amp;#39;il donne l&amp;#39;impression que le suivi fonctionne.
Les demandes sont enregistrées. Rien ne semble cassé jusqu&amp;#39;à ce que quelqu&amp;#39;un demande « combien de
personnes ont demandé X » et que la réponse honnête soit « il faudrait lire les 400 lignes pour
le savoir ».&lt;/p&gt;
&lt;h2&gt;Que devrait vraiment enregistrer une demande de fonctionnalité ?&lt;/h2&gt;
&lt;p&gt;Assez pour répondre à trois questions plus tard sans relire le message d&amp;#39;origine : ce qui a été
demandé, si possible avec les mots exacts de la demandeuse ; qui a demandé, et comment la
contacter si la réponse finit par être « on l&amp;#39;a construit » ; et ce qu&amp;#39;il faudrait pour savoir si
c&amp;#39;est une demande courante ou un cas isolé. Une citation exacte vaut plus qu&amp;#39;une paraphrase, parce
qu&amp;#39;une paraphrase écrite par qui a trié la demande porte déjà sa propre lecture, et c&amp;#39;est
justement cette lecture qu&amp;#39;une deuxième personne ne peut plus vérifier six mois plus tard.&lt;/p&gt;
&lt;h2&gt;Quelles étiquettes valent la peine ?&lt;/h2&gt;
&lt;p&gt;Deux, et elles répondent à des questions différentes. Une étiquette de &lt;strong&gt;type&lt;/strong&gt; distingue une
demande de fonctionnalité d&amp;#39;un rapport de bug, parce que les deux ont besoin de responsables et
de délais différents, et les mélanger dans une seule file laisse les plaintes les plus bruyantes
passer devant les demandes. Une étiquette de &lt;strong&gt;priorité&lt;/strong&gt;, limitée à un petit ensemble comme low,
medium et high, distingue « bloque quelqu&amp;#39;un dans l&amp;#39;usage du produit » de « ce serait sympa »,
parce que les deux méritent des délais de réponse très différents et qu&amp;#39;aucune ne devrait hériter
du rythme de l&amp;#39;autre. Bien mettre
l&amp;#39;étiquette de &lt;strong&gt;type&lt;/strong&gt; suppose que la demande est ce qu&amp;#39;elle prétend être ;
&lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-vs-bug-report/&quot;&gt;quand une demande de fonctionnalité est en fait un bug&lt;/a&gt;
couvre le cas où les mots mêmes d&amp;#39;une cliente pointent cette étiquette dans la mauvaise
direction.&lt;/p&gt;
&lt;p&gt;Le triage automatisé peut appliquer les deux dès que la demande arrive. Chez changeloop, une
soumission via le widget reçoit l&amp;#39;étiquette &lt;code&gt;feature-request&lt;/code&gt; ou &lt;code&gt;bug&lt;/code&gt; et une étiquette
&lt;code&gt;priority:low|medium|high&lt;/code&gt; dans la même passe, plus un tag &lt;code&gt;from-widget&lt;/code&gt; pour que la source soit
visible sans ouvrir l&amp;#39;élément. Cela suffit pour filtrer le backlog en une minute plutôt qu&amp;#39;un
après-midi : montre-moi chaque demande de fonctionnalité haute priorité venue du widget ce mois-ci.&lt;/p&gt;
&lt;p&gt;Une troisième étiquette vaut la peine dès qu&amp;#39;il existe une roadmap publique : un statut que la
demandeuse peut vérifier elle-même. &lt;a href=&quot;https://changeloop.dev/blog/fr/public-roadmap/&quot;&gt;Roadmap publique&lt;/a&gt; couvre en entier
les statuts planned, building et shipped ; en bref, cette étiquette transforme une file privée en
quelque chose que la demandeuse peut consulter sans redemander.&lt;/p&gt;
&lt;h2&gt;Comment décide-t-on ce qu&amp;#39;il faut construire ensuite ?&lt;/h2&gt;
&lt;p&gt;Regrouper avant de compter. Dix demandes formulées différemment pour la même capacité sous-jacente
se lisent comme dix lignes éparpillées dans un tableur, et comme un signal fort une fois
regroupées, et ce regroupement est généralement l&amp;#39;étape manquante, pas le comptage. Un compte brut
sans regroupement tend à récompenser la fonctionnalité au nom le plus accrocheur, pas celle qui a
la plus forte demande réelle derrière elle.&lt;/p&gt;
&lt;p&gt;Pondérer selon qui demande, pas seulement combien demandent. Une demande venant d&amp;#39;un compte proche
du renouvellement porte une urgence différente de la même demande venant d&amp;#39;un essai gratuit, et un
système de suivi qui jette ce contexte au profit d&amp;#39;un chiffre brut optimise pour le nombre le plus
facile à calculer, pas le plus utile.&lt;/p&gt;
&lt;p&gt;Chaque décision ici produit aussi des demandes qui perdent, et elles méritent une réponse aussi ;
&lt;a href=&quot;https://changeloop.dev/blog/fr/declining-feature-requests/&quot;&gt;comment refuser une demande de fonctionnalité&lt;/a&gt; couvre quoi
dire à celles dont la demande n&amp;#39;a pas été retenue. Regrouper et pondérer n&amp;#39;est que la moitié de
&amp;quot;quoi construire ensuite&amp;quot; ; &lt;a href=&quot;https://changeloop.dev/blog/fr/prioritizing-feature-requests/&quot;&gt;prioriser les demandes de fonctionnalités&lt;/a&gt;
couvre les vrais cadres, RICE, la pondération par revenu et les comptes bruts, et où chacun se
casse.&lt;/p&gt;
&lt;h2&gt;Comment boucler la boucle une fois qu&amp;#39;une fonctionnalité est livrée ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est l&amp;#39;étape que les systèmes de suivi sautent le plus souvent, et celle que les demandeuses
remarquent vraiment. &lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;Boucler la boucle de feedback avec le client&lt;/a&gt;
couvre le mécanisme en entier ; ce qui revient ici : boucler la boucle ne fonctionne que si la
demande d&amp;#39;origine est restée liée à la personne qui l&amp;#39;a faite. Un modèle de demande de
fonctionnalité construit à partir d&amp;#39;une issue GitHub, avec l&amp;#39;identité de la demandeuse attachée à
l&amp;#39;issue plutôt qu&amp;#39;enterrée dans un commentaire, est ce qui rend possible une notification
automatique « livré » plutôt qu&amp;#39;une que quelqu&amp;#39;un doit se rappeler d&amp;#39;envoyer. &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-template/&quot;&gt;Modèle de demande de fonctionnalité&lt;/a&gt;
montre le modèle concret et à quoi sert chaque champ.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quel outil utiliser pour suivre les demandes de fonctionnalités ?&lt;/strong&gt;
Ce que l&amp;#39;équipe consulte déjà quotidiennement bat n&amp;#39;importe quel outil dédié que personne
n&amp;#39;ouvre. Un tracker d&amp;#39;issues GitHub fonctionne bien si l&amp;#39;ingénierie vit déjà là ; un tableau léger
fonctionne bien si le produit vit là. L&amp;#39;outil compte moins que le fait d&amp;#39;être rouvert.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment éviter que les demandes de fonctionnalités se dupliquent ?&lt;/strong&gt;
Regrouper par capacité sous-jacente avant de trier par formulation. Une recherche dans les
demandes existantes avant d&amp;#39;en créer une nouvelle intercepte la plupart des doublons ; un
regroupement mensuel intercepte le reste.
&lt;a href=&quot;https://changeloop.dev/blog/fr/duplicate-feature-requests/&quot;&gt;Fusionner les doublons sans perdre la voix originale&lt;/a&gt;
couvre quoi faire de la formulation une fois le regroupement lui-même fait, pour que la fusion ne
rétrécisse pas discrètement la demande à quelle que soit la soumission arrivée en premier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chaque demande de fonctionnalité devrait-elle recevoir une réponse ?&lt;/strong&gt;
Chacune devrait recevoir un accusé de réception, même court, mais pas chacune n&amp;#39;a besoin d&amp;#39;une
décision immédiate. Un statut visible, comme une étiquette de roadmap que la demandeuse peut
vérifier elle-même, remplace la plupart des réponses individuelles qu&amp;#39;une équipe devrait sinon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre le suivi des demandes et une roadmap publique ?&lt;/strong&gt;
Le suivi est le registre interne de chaque demande, y compris celles qui ne seront jamais livrées.
Une roadmap publique est le sous-ensemble auquel une équipe s&amp;#39;engage publiquement, avec un statut
que la demandeuse peut voir sans redemander.&lt;/p&gt;
</content:encoded></item><item><title>Tickets support vs. demandes : qui croire ?</title><link>https://changeloop.dev/blog/fr/feedback-signal-quality/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/feedback-signal-quality/</guid><description>Un ticket support et un tableau de demandes mesurent des choses différentes, et traiter un pic dans l&apos;un comme dans l&apos;autre produit des priorités erronées.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un tableau de demandes de fonctionnalités capture ce que les utilisatrices demandent quand elles
ont le temps de s&amp;#39;asseoir et de décrire ce qu&amp;#39;elles veulent. Un ticket support capture ce sur quoi
les utilisatrices sont bloquées maintenant, souvent agacées, souvent sans le vocabulaire pour
décrire proprement la demande sous-jacente. Les deux sont un signal réel, et les équipes qui ne
regardent que l&amp;#39;un des deux finissent par résoudre le mauvais problème avec assurance, parce que
chaque canal surreprésente systématiquement un type différent d&amp;#39;utilisatrice et un type différent
de besoin. &lt;a href=&quot;https://changeloop.dev/blog/fr/prioritizing-feature-requests/&quot;&gt;Prioriser les demandes de fonctionnalités&lt;/a&gt;
couvre le classement de ce qui est déjà sur le tableau ; ceci concerne l&amp;#39;écart entre ce qui arrive
sur le tableau et ce qui n&amp;#39;apparaît jamais que comme ticket support.&lt;/p&gt;
&lt;h2&gt;Pourquoi le même problème sous-jacent apparaîtrait-il dans un canal et pas dans l&amp;#39;autre ?&lt;/h2&gt;
&lt;p&gt;Parce que les deux canaux ont des coûts d&amp;#39;activation différents, et la taille de ce coût détermine
qui le franchit. Déposer une demande de fonctionnalité demande de l&amp;#39;initiative : une utilisatrice
doit croire que la demande vaut la peine d&amp;#39;être articulée, trouver le tableau, et écrire quelque
chose de cohérent, ce qui sélectionne des utilisatrices engagées et patientes déjà investies dans
le produit. Déposer un ticket support demande presque aucune initiative en comparaison, souvent
juste un clic sur &amp;quot;aide&amp;quot; en plein milieu d&amp;#39;une tâche, ce qui signifie qu&amp;#39;il capture des
utilisatrices frustrées sur le moment, y compris celles qui ne se seraient jamais donné la peine
avec un tableau de demandes. Un vrai manque dans le produit peut être invisible sur le tableau de
fonctionnalités et bruyant dans le support simplement parce que les utilisatrices qui y sont
confrontées sont celles les moins susceptibles de déposer une demande formelle.&lt;/p&gt;
&lt;h2&gt;Le volume de tickets pour une fonctionnalité manquante signifie-t-il la même chose que le nombre de votes pour elle ?&lt;/h2&gt;
&lt;p&gt;Non, parce qu&amp;#39;ils mesurent des populations différentes dans des conditions différentes. Une
demande de fonctionnalité avec cent votes représente cent personnes qui ont pris le temps de
trouver et soutenir une demande existante, ce qui est un signal fort de demande durable et réfléchie.
Cent tickets support sur le même manque sous-jacent, déposés sur la même période, représentent
probablement des utilisatrices qui se heurtent à un mur sur le moment, dont certaines oublieraient
complètement une fois la friction immédiate passée. Traiter les deux comme un signal équivalent de
&amp;quot;cent personnes veulent ça&amp;quot; surpondère le volume de tickets, parce que les tickets sont bon marché
à générer et les votes non.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tableau de demandes&lt;/th&gt;
&lt;th&gt;Tickets support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Demande de l&amp;#39;initiative pour déposer&lt;/td&gt;
&lt;td&gt;En demande presque aucune&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capture une demande réfléchie et durable&lt;/td&gt;
&lt;td&gt;Capture une frustration sur le moment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Penche vers des utilisatrices engagées et patientes&lt;/td&gt;
&lt;td&gt;Capture des utilisatrices qui n&amp;#39;utiliseraient jamais le tableau&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Un compte de votes est un vrai signal d&amp;#39;engagement&lt;/td&gt;
&lt;td&gt;Un compte de tickets reflète la friction, pas toujours le désir&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Que signifie-t-il quand une fonctionnalité a des tickets support mais presque aucun vote sur le tableau ?&lt;/h2&gt;
&lt;p&gt;Souvent, que la demande existe mais que les utilisatrices qui y sont confrontées ne savent pas que
le tableau existe, ne croient pas que voter changerait quoi que ce soit, ou rencontrent le problème
trop rarement pour se donner la peine de changer de canal pour l&amp;#39;enregistrer formellement. C&amp;#39;est
exactement la population qu&amp;#39;un tableau de demandes rate structurellement, et un faible compte de
votes ici n&amp;#39;est pas une preuve de faible demande, c&amp;#39;est une preuve d&amp;#39;un écart de mesure. La
solution n&amp;#39;est pas de se méfier des tickets, c&amp;#39;est de traiter un groupe de tickets support autour
d&amp;#39;une fonctionnalité manquante comme son propre signal, à enregistrer vous-même sur le tableau, au
nom des utilisatrices, pour qu&amp;#39;il ne reste pas invisible à qui priorise seulement à partir des
comptes de votes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Le tableau lit comme priorité basse :
&amp;quot;Export to CSV&amp;quot; : 4 votes sur 6 mois

Le support raconte une autre histoire :
&amp;quot;Export to CSV&amp;quot; : 31 tickets sur la même période, chacun
d&amp;#39;un compte différent, chacun fermé avec &amp;quot;pas
actuellement supporté, nous transmettrons le retour&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Un pic de tickets support signifie-t-il toujours que le problème sous-jacent est une fonctionnalité manquante ?&lt;/h2&gt;
&lt;p&gt;Non, et c&amp;#39;est là que les deux canaux peuvent induire en erreur dans la direction opposée. Un pic
de tickets est tout aussi souvent causé par une interface confuse autour d&amp;#39;une fonctionnalité qui
existe déjà, un bug, ou un changement sorti sans explication adéquate, rien de tout cela ne se
résolvant en construisant quelque chose de nouveau. Lire chaque pic de tickets comme &amp;quot;les
utilisatrices veulent une fonctionnalité que nous n&amp;#39;avons pas&amp;quot; produit une roadmap remplie de
choses qui étaient en réalité des manques de documentation ou des problèmes d&amp;#39;utilisabilité
déguisés. Le ticket support vous dit où est la friction ; il ne vous dit pas à lui seul si la
solution est une nouvelle fonctionnalité, un changement d&amp;#39;interface, ou un meilleur article d&amp;#39;aide,
et confondre cela gaspille du temps d&amp;#39;ingénierie sur la mauvaise solution.&lt;/p&gt;
&lt;h2&gt;Comment les deux signaux devraient-ils vraiment être combinés pour décider quoi construire ?&lt;/h2&gt;
&lt;p&gt;Utilisez les tickets pour trouver où est la friction, et utilisez le tableau de demandes, plus un
contact direct là où le tableau est maigre, pour confirmer à quoi ressemble vraiment le résultat
souhaité. Un groupe de tickets identifie un problème réel et ressenti ; il spécifie rarement la
solution avec assez de précision pour construire dessus, parce qu&amp;#39;une utilisatrice frustrée dans
une conversation de support décrit des symptômes, pas des spécifications. Le tableau de demandes,
quand il a assez de votes sur le même problème sous-jacent, tend à porter plus du détail de &amp;quot;qu&amp;#39;est-ce
qui satisferait vraiment ça&amp;quot;, parce qu&amp;#39;écrire une demande est déjà un acte de spécifier ce qu&amp;#39;on
veut, pas juste de rapporter ce qui ne va pas.&lt;/p&gt;
&lt;h2&gt;Les agentes support devraient-elles enregistrer elles-mêmes les tickets comme demandes de fonctionnalités ?&lt;/h2&gt;
&lt;p&gt;Oui, et c&amp;#39;est le correctif à plus fort levier pour l&amp;#39;écart entre les deux canaux. Une agente qui
reconnaît un ticket comme une demande de fonctionnalité déguisée, plutôt que de simplement le
résoudre et passer à autre chose, peut l&amp;#39;enregistrer sur le tableau au nom de la cliente, ce qui
comble directement l&amp;#39;écart de mesure plutôt que d&amp;#39;exiger que la cliente découvre et utilise un
second canal. Cela ne fonctionne que si l&amp;#39;enregistrement prend des secondes, pas des minutes, pour
l&amp;#39;agente, pour que la friction de le faire soit inférieure à la friction de simplement fermer le
ticket et passer au suivant.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les votes de demandes de fonctionnalités devraient-ils jamais être décomptés s&amp;#39;ils viennent tous d&amp;#39;un seul compte ou d&amp;#39;une seule équipe ?&lt;/strong&gt;
Oui, pondérez par comptes ou organisations distincts plutôt que par compte brut de votes, parce que
cinq votes de cinq personnes de la même entreprise représentent les priorités d&amp;#39;une cliente, pas
cinq confirmations indépendantes de demande.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vaut-il la peine de construire une fonctionnalité qui apparaît beaucoup dans les tickets mais a presque aucun vote ?&lt;/strong&gt;
Souvent oui, à condition que le volume de tickets vienne vraiment de comptes distincts et que le
besoin sous-jacent soit confirmé plutôt que supposé ; traitez le faible compte de votes comme un
artefact de mesure du coût d&amp;#39;activation du tableau, pas comme une preuve que la demande n&amp;#39;est pas
réelle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment distinguer d&amp;#39;un coup d&amp;#39;œil un ticket de confusion d&amp;#39;interface d&amp;#39;un vrai ticket de fonctionnalité manquante ?&lt;/strong&gt;
Regardez si la résolution consiste à expliquer une capacité existante ou à s&amp;#39;excuser pour une
manquante. Un motif de résolutions &amp;quot;oh, c&amp;#39;est en fait juste là&amp;quot; pointe vers un problème d&amp;#39;interface
ou de découvrabilité ; un motif de &amp;quot;on ne supporte pas encore ça&amp;quot; pointe vers un vrai manque.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cette distinction compte-t-elle autant avec un très petit volume de support ?&lt;/strong&gt;
Moins mécaniquement, puisqu&amp;#39;une poignée de tickets est facile à lire individuellement sans avoir
besoin d&amp;#39;analyse agrégée, mais le biais sous-jacent, les tickets surreprésentent les utilisatrices
frustrées et sous-représentent les patientes, est présent à toute échelle et vaut la peine d&amp;#39;être
gardé à l&amp;#39;esprit même quand vous lisez chaque ticket vous-même.&lt;/p&gt;
</content:encoded></item><item><title>Tags git, releases et votre changelog</title><link>https://changeloop.dev/blog/fr/git-tags-releases-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/git-tags-releases-changelog/</guid><description>Un tag git, une release, une entrée de changelog : trois enregistrements d&apos;un événement. Les confondre fait dériver le changelog. Comment les accorder.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un tag git, une release et une entrée de changelog sont trois enregistrements différents du même
événement, et les confondre fait doucement dériver un changelog de ce qui a vraiment été livré. Un
tag marque un commit. Une release empaquette ce tag avec des artefacts et une description. Une
entrée de changelog explique, en des termes qu&amp;#39;une lectrice hors du dépôt peut utiliser, ce qui a
changé. Ils se produisent généralement proches dans le temps, et c&amp;#39;est exactement pourquoi il est
facile de les traiter comme une seule étape plutôt que trois, et exactement pourquoi l&amp;#39;écart ne
devient visible que des mois plus tard, quand quelqu&amp;#39;un demande « qu&amp;#39;est-ce qui est sorti dans la
v2.4 » et que la réponse honnête demande de vraies recherches.&lt;/p&gt;
&lt;h2&gt;Quelle est la différence réelle entre les trois ?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Enregistrement&lt;/th&gt;
&lt;th&gt;Vit dans&lt;/th&gt;
&lt;th&gt;Écrit pour&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tag git&lt;/td&gt;
&lt;td&gt;Le dépôt, en tant que référence&lt;/td&gt;
&lt;td&gt;Quiconque récupère ce commit exact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Release&lt;/td&gt;
&lt;td&gt;L&amp;#39;hébergeur de code (GitHub, GitLab)&lt;/td&gt;
&lt;td&gt;Quiconque télécharge un build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entrée de changelog&lt;/td&gt;
&lt;td&gt;Le changelog propre au produit&lt;/td&gt;
&lt;td&gt;Quiconque utilise le produit, pas que le dépôt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Un tag est le plus mécanique des trois : &lt;code&gt;git tag v2.4.0&lt;/code&gt; et c&amp;#39;est fait, sans aucune obligation
que quelque chose explique ce qu&amp;#39;il contient. Une release ajoute une description et, en général,
des artefacts téléchargeables, et son public reste des développeuses qui savent ce qu&amp;#39;est une page
de release. Une entrée de changelog est la seule des trois écrite pour une lectrice qui n&amp;#39;ouvrira
peut-être jamais le dépôt, c&amp;#39;est pourquoi c&amp;#39;est celle qui demande le plus d&amp;#39;attention éditoriale et
celle la plus susceptible d&amp;#39;être sautée sous pression de délais.&lt;/p&gt;
&lt;h2&gt;Chaque tag git a-t-il besoin d&amp;#39;une entrée de changelog ?&lt;/h2&gt;
&lt;p&gt;Non, et les traiter un-à-un est une erreur courante. Un tag peut marquer un jalon interne, une
release candidate, ou un hotfix qui n&amp;#39;atteint jamais la plupart des utilisatrices ; aucun d&amp;#39;eux
n&amp;#39;a nécessairement besoin d&amp;#39;une entrée publique. Le test est le même que celui qui décide si
quelque chose appartient du tout à un changelog : est-ce qu&amp;#39;une utilisatrice ou une appelante le
remarquerait ou s&amp;#39;en soucierait. La plupart des tags passent ce test. Certains, comme un tag créé
uniquement pour déclencher un pipeline CI, jamais.&lt;/p&gt;
&lt;h2&gt;Chaque entrée de changelog a-t-elle besoin de son propre tag ?&lt;/h2&gt;
&lt;p&gt;Pas toujours, et c&amp;#39;est là que les équipes qui déploient en continu divergent de celles qui livrent
des packages versionnés. Un produit SaaS qui déploie plusieurs fois par jour peut regrouper
plusieurs déploiements sous une entrée de changelog datée sans tag 1:1 par déploiement ; une
bibliothèque publiée dans un registre de packages a généralement besoin d&amp;#39;un tag par version
publiée. Les modules Go et Swift Package Manager résolvent les versions à partir des tags eux-mêmes ;
sur npm ou PyPI, le registre détient la version publiée, et le tag est ce qui permet de relier
cette version à sa source. Un dépôt avec plusieurs packages versionnés indépendamment doit
décider ça par package, pas une seule fois pour tout le repo ;
&lt;a href=&quot;https://changeloop.dev/blog/fr/monorepo-changelogs/&quot;&gt;changelogs de monorepo&lt;/a&gt; couvre comment les préfixes de tags et la
portée du changelog devraient suivre les frontières des packages, pas des dossiers.
&lt;a href=&quot;https://changeloop.dev/blog/fr/semantic-versioning-changelog/&quot;&gt;Semantic versioning et votre changelog&lt;/a&gt;
couvre comment le numéro de version lui-même devrait correspondre aux catégories de changelog ; les
tags sont le mécanisme qui rend un numéro de version vérifiable contre le code réel.&lt;/p&gt;
&lt;h2&gt;Comment une description de release devrait-elle se rattacher à l&amp;#39;entrée de changelog ?&lt;/h2&gt;
&lt;p&gt;Elles peuvent être le même texte, mais seulement si le public des deux est vraiment le même, ce
qui est plus rare qu&amp;#39;il n&amp;#39;y paraît. Une page de release sur un hébergeur de code est lue presque
exclusivement par des développeuses ; si un produit a aussi des utilisatrices non techniques qui
lisent le changelog, dupliquer la description de release mot pour mot livre des termes internes et
une formulation orientée code à une lectrice qui avait besoin de la version en langage clair. Le
schéma le plus propre : écrire l&amp;#39;entrée de changelog comme l&amp;#39;artefact principal orienté lectrice,
et laisser la description de release soit y renvoyer, soit garder un résumé plus court et plus
technique pour le public déjà à l&amp;#39;aise là-bas.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Release v2.4.0 (GitHub, pour développeuses)
Fait passer le pipeline de rapports au nouveau moteur d&amp;#39;agrégation.
Voir le changelog pour le résumé orienté client :
https://example.com/changelog#v2.4.0

## 2026-09-07 (Changelog, orienté client)
### Added
- Les rapports se chargent désormais en moins d&amp;#39;une seconde, même
  pour les comptes de plus d&amp;#39;un million de lignes.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Même release, deux documents, chacun avec sa propre formulation pour sa propre lectrice.&lt;/p&gt;
&lt;h2&gt;D&amp;#39;où vient vraiment l&amp;#39;entrée de changelog ?&lt;/h2&gt;
&lt;p&gt;De deux points de départ, et la plupart des pipelines réels sont un mélange des deux. Elle peut
être générée à partir des messages de commit au moment du tag, ce qui est rapide et ne rate jamais
une pull request fusionnée ; &lt;a href=&quot;https://changeloop.dev/blog/fr/conventional-commits-changelog/&quot;&gt;des conventional commits au changelog&lt;/a&gt;
couvre ce pipeline en entier. Ou elle peut être écrite à la main, séparément du tag, calée sur le
moment où une fonctionnalité est considérée terminée plutôt que sur le moment où le code est
fusionné. Les entrées générées sont cohérentes mais héritent de chaque message de commit vague ;
les entrées écrites à la main sont plus claires mais ont besoin de quelqu&amp;#39;un pour vraiment les
écrire. La plupart des équipes qui automatisent gardent quand même une légère passe d&amp;#39;édition sur
le texte généré avant qu&amp;#39;il ne devienne l&amp;#39;entrée publique, la même discipline que recommande
&lt;a href=&quot;https://changeloop.dev/blog/fr/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog, en pratique&lt;/a&gt;, peu importe d&amp;#39;où vient
originellement le texte brut.&lt;/p&gt;
&lt;h2&gt;Que casse-t-il quand les trois se désynchronisent ?&lt;/h2&gt;
&lt;p&gt;La confiance dans celui que la lectrice a vérifié en premier. Un tag qui existe sans entrée de
changelog correspondante ressemble, du côté de la lectrice du changelog, à rien ne s&amp;#39;étant passé
cette semaine-là. Une entrée de changelog sans tag ou release correspondant rend impossible pour
quelqu&amp;#39;un qui débogue un problème en production de récupérer le code exact qui était en direct
quand une entrée a été publiée. La solution n&amp;#39;est pas une automatisation parfaite, c&amp;#39;est une source
unique de vérité pour la correspondance : un endroit, ne serait-ce que la propre checklist du
processus de release, qui dit qu&amp;#39;un changement livrable reçoit les trois, dans le même commit ou
la même pull request qui l&amp;#39;introduit.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les entrées de changelog devraient-elles être générées automatiquement à partir des tags git ?&lt;/strong&gt;
Elles peuvent être un point de départ, mais un tag seul ne porte aucune description orientée
lectrice, seulement une plage de commits. La génération automatisée doit lire les messages de
commit dans cette plage, pas seulement l&amp;#39;existence du tag, pour produire quelque chose
d&amp;#39;utilisable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et si on ne tague pas chaque release ?&lt;/strong&gt;
Alors l&amp;#39;entrée de changelog devient l&amp;#39;enregistrement principal, et elle devrait quand même porter
une date et, si le produit en a un, un numéro de version, pour que l&amp;#39;entrée reste quelque chose
qu&amp;#39;une lectrice puisse référencer plus tard même sans tag correspondant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les tags de pré-release (comme &lt;code&gt;v2.4.0-rc.1&lt;/code&gt;) devraient-ils avoir des entrées de changelog ?&lt;/strong&gt;
Généralement non. Une release candidate est pour des tests internes ou bêta, et une entrée de
changelog pour elle entraîne les lectrices à attendre des entrées pour des versions qui pourraient
ne jamais sortir telles que décrites. Réservez les entrées aux tags qui atteignent la disponibilité
générale.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une seule entrée de changelog peut-elle couvrir plusieurs tags git ?&lt;/strong&gt;
Oui, et elle le devrait souvent pour les équipes qui taguent fréquemment. Regroupez les tags
apparentés sous une entrée datée décrivant le changement net, plutôt que de publier une entrée
maigre par tag qui fragmente une fonctionnalité sur plusieurs lectures.&lt;/p&gt;
</content:encoded></item><item><title>Changelogs d&apos;API internes : ce qui change</title><link>https://changeloop.dev/blog/fr/internal-api-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/internal-api-changelog/</guid><description>Un changelog d&apos;API publique a un public qu&apos;on ne peut pas contacter directement. Un interne a un public à deux étages, et ça change ce qu&apos;on lui doit.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Chaque autre article de ce hub suppose que l&amp;#39;appelant d&amp;#39;une API est extérieur à l&amp;#39;entreprise :
l&amp;#39;ingénieure d&amp;#39;une cliente, une partenaire, quelqu&amp;#39;un qui a trouvé la doc tout seul. Beaucoup d&amp;#39;API
ont un type d&amp;#39;appelant complètement différent, une équipe dans le bureau d&amp;#39;à côté ou deux étages
plus loin, et ça change le calcul de ce qu&amp;#39;un changelog lui doit, parce qu&amp;#39;un message Slack
l&amp;#39;atteint et qu&amp;#39;aucun ticket de support n&amp;#39;est généralement jamais ouvert. La plupart des équipes en
concluent que les API internes n&amp;#39;ont pas besoin de changelog. Ce dont elles ont vraiment besoin,
c&amp;#39;est d&amp;#39;un différent.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui rend le changelog d&amp;#39;une API interne différent de celui d&amp;#39;une API publique ?&lt;/h2&gt;
&lt;p&gt;Le public est joignable directement, ce qui supprime la raison principale d&amp;#39;exister de la plupart
des changelogs d&amp;#39;API publiques : diffuser vers des appelants qu&amp;#39;on ne peut pas contacter
individuellement. L&amp;#39;équipe propriétaire d&amp;#39;une API interne sait généralement exactement quelles
autres équipes l&amp;#39;appellent, parfois jusqu&amp;#39;au service précis. Ça fait d&amp;#39;un message ciblé, pas d&amp;#39;un
flux public, le choix par défaut naturel, et c&amp;#39;est pour ça que les API internes finissent si
souvent sans aucun changelog : l&amp;#39;équipe propriétaire prévient les deux ou trois équipes dont elle
se souvient, en supposant que ça couvre tout le monde.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Changelog d&amp;#39;API publique&lt;/th&gt;
&lt;th&gt;Changelog d&amp;#39;API interne&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Qui le lit&lt;/td&gt;
&lt;td&gt;N&amp;#39;importe quel appelant externe, généralement injoignable directement&lt;/td&gt;
&lt;td&gt;Un petit ensemble, généralement connu, d&amp;#39;équipes internes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canal par défaut&lt;/td&gt;
&lt;td&gt;Une page et un flux&lt;/td&gt;
&lt;td&gt;Un message aux équipes appelantes, idéalement aussi une page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plus gros risque&lt;/td&gt;
&lt;td&gt;Un appelant rate l&amp;#39;entrée complètement&lt;/td&gt;
&lt;td&gt;L&amp;#39;équipe propriétaire oublie un appelant dont elle ne se souvient plus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ce qui remplace « on ne sait pas qui nous appelle »&lt;/td&gt;
&lt;td&gt;Rien ; publier largement&lt;/td&gt;
&lt;td&gt;Un vrai registre des appelants, tenu à jour&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Pourquoi « on préviendra juste les équipes qui nous appellent » s&amp;#39;effondre-t-il ?&lt;/h2&gt;
&lt;p&gt;Parce que l&amp;#39;ensemble des appelants n&amp;#39;est jamais aussi petit ni aussi statique que l&amp;#39;équipe
propriétaire s&amp;#39;en souvient. Un service construit pour une consommatrice gagne un second appelant
six mois plus tard, via une intégration que personne n&amp;#39;a annoncée, et la liste mentale « qui nous
appelle » de l&amp;#39;équipe propriétaire est désormais fausse sans que personne ne le remarque. L&amp;#39;échec
est ordinaire et courant, le résultat par défaut de compter sur la mémoire plutôt que sur un
registre, pas le signe que quelqu&amp;#39;un a été négligent. &lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;Qu&amp;#39;est-ce qu&amp;#39;un breaking change&lt;/a&gt; couvre comment
décider si un changement d&amp;#39;API compte comme cassant en premier lieu ; le cas interne ajoute une
seconde question, plus difficile, par-dessus celle-là, à savoir qui prévenir.&lt;/p&gt;
&lt;h2&gt;Une API interne a-t-elle même besoin d&amp;#39;une page de changelog façon publique ?&lt;/h2&gt;
&lt;p&gt;Généralement oui, même si le canal principal est direct. Une page donne au message direct quelque
chose vers quoi pointer, si bien que la notification peut rester courte (« breaking change sur
&lt;code&gt;/v2/accounts&lt;/code&gt;, détails ici ») plutôt que d&amp;#39;essayer de porter l&amp;#39;explication complète dans un
message de chat qui va défiler et disparaître. Elle devient aussi ce qu&amp;#39;une nouvelle équipe, ou une
qui a raté le message direct, peut consulter quand son intégration casse et qu&amp;#39;elle essaie de
comprendre pourquoi. La page n&amp;#39;a pas besoin d&amp;#39;être soignée ni publique ; elle doit être liable et
survivre au fil Slack qui l&amp;#39;a annoncée.&lt;/p&gt;
&lt;h2&gt;Qui maintient réellement la liste des appelants ?&lt;/h2&gt;
&lt;p&gt;L&amp;#39;équipe propriétaire, et ça doit être traité comme un vrai artefact, pas comme un savoir tribal.
La version la moins chère est un fichier dans le dépôt même de l&amp;#39;API, une courte liste de services
consommateurs avec une responsable par entrée, mise à jour chaque fois qu&amp;#39;une nouvelle intégration
est construite, la même discipline que n&amp;#39;importe quelle déclaration de dépendance. L&amp;#39;alternative,
demander autour de soi avant chaque breaking change, fonctionne jusqu&amp;#39;au jour où quelqu&amp;#39;un oublie
de demander à la bonne personne, et une API interne qui casse silencieusement pour une équipe est
un incident plus petit qu&amp;#39;un incident public, mais ça reste un incident, généralement découvert par
l&amp;#39;astreinte de cette équipe plutôt que par la propriétaire de l&amp;#39;API.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# consumers.yml
- service: billing-service
  owner: &amp;quot;#team-billing&amp;quot;
  since: 2026-03-01
- service: reporting-pipeline
  owner: &amp;quot;#team-analytics&amp;quot;
  since: 2026-06-14
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un fichier comme celui-ci transforme « qui devons-nous prévenir » d&amp;#39;une question en une simple
consultation. Des outils construits exactement pour ce problème, comme le &lt;a href=&quot;https://backstage.io/docs/features/software-catalog/system-model/&quot;&gt;catalogue de services de
Backstage&lt;/a&gt;, modélisent les API
comme des entités de premier ordre avec des consommateurs déclarés, pour la même raison : une fois
qu&amp;#39;une organisation a assez de services internes, la mémoire de personne sur qui appelle quoi ne
reste plus exacte toute seule, et quelque chose doit tenir le registre à sa place. La
&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;documentation&lt;/a&gt; de l&amp;#39;outil que vous faites déjà tourner en interne est généralement le bon
endroit à vérifier avant d&amp;#39;en construire un sur mesure.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui appartient à une entrée de changelog interne qu&amp;#39;une publique n&amp;#39;aurait pas besoin d&amp;#39;avoir ?&lt;/h2&gt;
&lt;p&gt;Plus de précision opérationnelle, parce que la lectrice est une autre ingénieure qui va agir
là-dessus au sein de la même infrastructure, pas le lire comme un résumé. Dans quels
environnements le changement est en production et quand, parce que les services internes sont
souvent promus par étapes qu&amp;#39;un appelant public ne voit jamais. Si le changement nécessite une
mise à jour de configuration ou de bibliothèque client côté consommatrice, formulée comme une
commande s&amp;#39;il y en a une. Et, parce que les appelants internes peuvent souvent coordonner le
correctif directement avec l&amp;#39;équipe propriétaire, un contact nommé plutôt qu&amp;#39;un canal de support :
« préviens @maria si ça casse quelque chose » est une ligne parfaitement raisonnable dans une
entrée interne et une ligne étrange dans un changelog d&amp;#39;API publique.&lt;/p&gt;
&lt;h2&gt;Est-ce que ça s&amp;#39;applique de la même façon à un changelog dans un monorepo ?&lt;/h2&gt;
&lt;p&gt;Ça aiguise le même problème plutôt que de le remplacer. &lt;a href=&quot;https://changeloop.dev/blog/fr/monorepo-changelogs/&quot;&gt;Changelogs de monorepo&lt;/a&gt;
couvre quand un package a besoin de son propre changelog ; une API interne qui n&amp;#39;est qu&amp;#39;un package
parmi d&amp;#39;autres dans un monorepo a quand même besoin que ses consommateurs soient suivis
explicitement, parce que partager le dépôt avec ses appelants ne veut pas dire qu&amp;#39;ils remarqueront
un changement à moins que quelque chose ne le leur signale. La proximité dans le dépôt n&amp;#39;est pas la
même chose que la proximité dans l&amp;#39;attention.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Une API purement interne a-t-elle besoin d&amp;#39;un changelog si elle n&amp;#39;a qu&amp;#39;un seul appelant ?&lt;/strong&gt;
À peine, et un message direct à cette seule équipe suffit généralement. Le changelog se justifie
dès qu&amp;#39;il y a plus d&amp;#39;un appelant, ou dès que la liste des appelants a déjà surpris l&amp;#39;équipe
propriétaire, parce que c&amp;#39;est le signe que la mémoire seule n&amp;#39;est plus fiable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les changements d&amp;#39;API internes devraient-ils passer par la même revue que les publics ?&lt;/strong&gt;
La formulation peut être plus légère, puisque la lectrice est une collègue et non une appelante
externe, mais la décision de savoir si un changement est cassant mérite le même soin dans les deux
cas. Une appelante interne a quand même du code en production qui dépend de l&amp;#39;ancien comportement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment découvrir qui appelle une API interne si ça n&amp;#39;a jamais été suivi ?&lt;/strong&gt;
Les logs du serveur ou les données de trafic d&amp;#39;un service mesh sont la réponse honnête si aucun
registre des consommateurs n&amp;#39;a jamais été tenu ; traitez cette découverte comme le moment d&amp;#39;en
commencer un, pas comme un nettoyage ponctuel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un message Slack suffit-il, ou un changement interne a-t-il quand même besoin d&amp;#39;une entrée de changelog formelle ?&lt;/strong&gt;
Les deux, pour tout ce qui n&amp;#39;est pas purement additif. Le message est ce qui se lit à temps ;
l&amp;#39;entrée est ce qu&amp;#39;une équipe enquêtant sur un problème des semaines plus tard, qui n&amp;#39;a jamais vu
le message, peut quand même trouver.&lt;/p&gt;
</content:encoded></item><item><title>Notes de release internes : qui d&apos;autre doit savoir</title><link>https://changeloop.dev/blog/fr/internal-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/internal-release-notes/</guid><description>Le support et les ventes apprennent souvent un lancement par une cliente perdue. Les notes internes règlent ça, sous une forme distincte des notes clients.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tous les autres articles de ce hub supposent que le lecteur d&amp;#39;une note de release est un client.
Le support, les ventes et le customer success lisent aussi, ou essaient, et la plupart apprennent
ce qui est sorti parce qu&amp;#39;une cliente le demande en premier. Cet ordre est inversé, et c&amp;#39;est aussi
le défaut dans la plupart des entreprises, parce que le processus de release s&amp;#39;arrête au moment où
la note orientée client sort, et personne n&amp;#39;a construit une deuxième étape, plus petite, pour les
gens qui doivent répondre à des questions dessus une heure plus tard.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;une note de release interne, et en quoi diffère-t-elle d&amp;#39;une note orientée client ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est un document plus court, écrit pour des gens qui connaissent déjà le produit en profondeur,
qui leur dit ce qui a changé et quoi en faire dans leur travail concret. Un agent de support n&amp;#39;a
pas besoin du cadrage soigné qu&amp;#39;utilise une annonce orientée client ; il doit savoir à quoi
ressemble le changement dans le produit en ce moment, quelle sera la question la plus probable à
son sujet, et si des tickets ouverts sont concernés. Une note orientée client vend le changement.
Une note interne équipe quelqu&amp;#39;un pour le gérer.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Public&lt;/th&gt;
&lt;th&gt;Ce qu&amp;#39;il doit savoir&lt;/th&gt;
&lt;th&gt;Où il en a besoin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;Ce qui a changé dans l&amp;#39;interface, questions probables, tickets ouverts concernés&lt;/td&gt;
&lt;td&gt;Là où il cherche déjà des réponses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ventes&lt;/td&gt;
&lt;td&gt;Ce que ça débloque pour une affaire, ce que ça ne fait pas encore&lt;/td&gt;
&lt;td&gt;Là où il se prépare aux appels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer success&lt;/td&gt;
&lt;td&gt;Quoi dire aux clientes existantes, et qui l&amp;#39;a demandé&lt;/td&gt;
&lt;td&gt;Là où il planifie les contacts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direction&lt;/td&gt;
&lt;td&gt;Ce qui est sorti par rapport à ce qui était promis, et quand&lt;/td&gt;
&lt;td&gt;Un résumé court et récurrent, pas par release&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Pourquoi les équipes internes apprennent-elles les lancements en retard ?&lt;/h2&gt;
&lt;p&gt;Parce que le processus de release est généralement construit autour d&amp;#39;un seul artefact, la note
orientée client ou l&amp;#39;entrée de changelog, et tout ce qui est interne est censé découler de la
lecture de ce document unique. Ce n&amp;#39;est pas le cas. Les agents de support sont occupés avec le
ticket devant eux, pas en train de parcourir un changelog pour trouver du contexte, et une note
écrite pour une cliente omet souvent justement le détail opérationnel dont un agent a besoin,
comme à quel plan la fonctionnalité est réservée ou à quoi ressemble le message d&amp;#39;erreur quand ça
échoue. Le temps qu&amp;#39;une cliente pose la question, l&amp;#39;agent lit la même note publique que la cliente
vient de lire, sans aucune longueur d&amp;#39;avance.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;une note interne devrait dire qu&amp;#39;une note orientée client ne dit pas ?&lt;/h2&gt;
&lt;p&gt;Les détails opérationnels qu&amp;#39;une note orientée client omet délibérément. Quels plans ou comptes
l&amp;#39;ont. À quoi ça ressemble quand quelque chose tourne mal, et quoi dire à une cliente qui tombe
dessus. Si ça ferme des demandes ou tickets ouverts, et lesquels, pour qu&amp;#39;un agent travaillant sur
un ticket lié sache qu&amp;#39;il doit vérifier. Qui dans l&amp;#39;équipe en est responsable si une question va
au-delà de ce que couvre la note. Rien de tout ça n&amp;#39;appartient à la version orientée client, écrite
pour être lue une fois par quelqu&amp;#39;un en dehors de l&amp;#39;entreprise ; tout ça est exactement ce dont a
besoin quelqu&amp;#39;un qui répond à la même question quarante fois par semaine.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Note interne : export CSV en masse (sortie le 08/09/2026)

- Réservé aux plans Team et Enterprise. Free et Pro ne voient
  aucun changement.
- Échec fréquent : les exports de plus de 50k lignes expirent ;
  problème connu, correctif suivi séparément. Dire à la cliente
  de filtrer par plage de dates.
- Ferme 14 demandes ouvertes étiquetées `bulk-export`. Modèle de
  réponse dans le document partagé.
- Responsable : équipe platform, #platform-eng pour tout ce qui
  dépasse cette note.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quatre lignes qu&amp;#39;un agent de support peut utiliser immédiatement, dont aucune n&amp;#39;appartiendrait à
l&amp;#39;entrée publique du changelog pour la même fonctionnalité.&lt;/p&gt;
&lt;h2&gt;Qui devrait l&amp;#39;écrire, et quand ?&lt;/h2&gt;
&lt;p&gt;Qui écrit la note orientée client est généralement la bonne personne, parce qu&amp;#39;elle a déjà tout le
contexte, mais ça devrait être un passage court et séparé plutôt qu&amp;#39;une tentative de faire servir
un seul document aux deux publics. Les fusionner produit une note orientée client encombrée de
détails internes, ou une note interne trop soignée pour être vraiment utile, et c&amp;#39;est plus rapide
en pratique d&amp;#39;écrire deux documents courts que de négocier un seul document pour servir deux
publics à la fois. Le timing compte plus que l&amp;#39;auteur : la note interne doit sortir avant celle
orientée client, ne serait-ce que de quelques heures, pour que le support n&amp;#39;apprenne jamais un
changement au même endroit qu&amp;#39;une cliente.&lt;/p&gt;
&lt;h2&gt;Où devrait-elle vivre pour que le support la trouve vraiment au moment d&amp;#39;un ticket ?&lt;/h2&gt;
&lt;p&gt;Là où l&amp;#39;équipe cherche déjà les choses quand un ticket arrive, pas dans un changelog séparé que
personne n&amp;#39;a de raison d&amp;#39;ouvrir de son propre chef. Une équipe de support qui utilise une base de
connaissances partagée a besoin de la note là, liée depuis l&amp;#39;endroit où les tickets sur cette
partie du produit sont déjà étiquetés. Une équipe qui vit dans un canal partagé en a besoin
publiée là, cherchable, au moment où c&amp;#39;est pertinent, plutôt qu&amp;#39;enterrée dans un digest quotidien
qu&amp;#39;elle parcourt une fois. Le schéma orienté client de
&lt;a href=&quot;https://changeloop.dev/blog/fr/product-update-email/&quot;&gt;notification ciblée contre digest&lt;/a&gt; s&amp;#39;applique aussi ici : une
note interne sur un changement précis et imminent devrait atteindre l&amp;#39;équipe directement, pas
attendre un récapitulatif hebdomadaire qui arrive après que le premier ticket existe déjà.&lt;/p&gt;
&lt;h2&gt;A-t-elle besoin de la même rigueur de révision que l&amp;#39;externe ?&lt;/h2&gt;
&lt;p&gt;Moins, et c&amp;#39;est voulu. Une note orientée client représente l&amp;#39;entreprise publiquement et mérite un
passage d&amp;#39;édition soigné ; une note interne existe pour être rapide et précise, et lui imposer le
même niveau de finition est généralement exactement ce qui pousse les équipes à arrêter de
l&amp;#39;écrire du tout. Une note interne rapide et un peu brute qui sort une heure avant le lancement
bat une note polie qui arrive le lendemain, quand le premier ticket de support est déjà arrivé
perdu.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les notes de release internes devraient-elles suivre le même processus d&amp;#39;approbation que celles orientées client ?&lt;/strong&gt;
Non. Un passage plus léger et plus rapide est justement le but. Exiger la même révision transforme
une note interne du jour même en une de la semaine suivante, quand le support a déjà répondu à la
question sans elle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qui est responsable des notes de release internes s&amp;#39;il n&amp;#39;y a pas de rôle dédié à la communication interne ?&lt;/strong&gt;
Qui écrit la note orientée client, comme un deuxième passage court juste après. Ça n&amp;#39;a pas besoin
d&amp;#39;une personne responsable séparée, juste l&amp;#39;habitude de ne pas traiter la note orientée client
comme le seul artefact que produit une release.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les notes de release internes ont-elles besoin de leur propre changelog ou archive ?&lt;/strong&gt;
Un endroit cherchable bat une archive chronologique que personne ne parcourt. Si le support a déjà
une base de connaissances, la note appartient là, étiquetée à la fonctionnalité, plutôt que dans
un changelog interne séparé qui n&amp;#39;aide que quelqu&amp;#39;un qui connaît déjà la date de sortie.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quel est le risque de sauter les notes de release internes pour les petits changements ?&lt;/strong&gt;
Les petits changements sont justement ceux pour lesquels le support reçoit des questions sans
prévenir, parce qu&amp;#39;un petit changement reçoit rarement une annonce à l&amp;#39;échelle de l&amp;#39;entreprise. La
taille de la note de release devrait s&amp;#39;adapter à la taille du changement ; elle ne devrait jamais
tomber à zéro juste parce que le changement était mineur.&lt;/p&gt;
</content:encoded></item><item><title>Release notes mobiles : ce que la limite fait sauter</title><link>https://changeloop.dev/blog/fr/mobile-app-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/mobile-app-release-notes/</guid><description>App Store et Play Store donnent peu de lignes visibles et aucun lien. Ce qui marche sur un changelog web se casse avec ce budget si restreint.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tout ce que ce hub dit sur l&amp;#39;écriture de release notes suppose une page qu&amp;#39;on contrôle
entièrement : n&amp;#39;importe quelle longueur, des liens qui fonctionnent, une mise en forme qui
s&amp;#39;affiche. Les release notes d&amp;#39;une app mobile vivent dans la boîte de quelqu&amp;#39;un d&amp;#39;autre. Apple
donne environ 4 000 caractères mais n&amp;#39;affiche que les premières lignes avant qu&amp;#39;on touche
« plus » ; Google donne un espace similaire avec le même problème d&amp;#39;aperçu, et aucune des deux
plateformes n&amp;#39;affiche de lien cliquable dans le texte. Les règles de &lt;a href=&quot;https://changeloop.dev/blog/fr/how-to-write-release-notes/&quot;&gt;comment écrire des release
notes que les gens lisent vraiment&lt;/a&gt; s&amp;#39;appliquent toujours :
dire ce qui a changé et ce que la lectrice doit faire, mais l&amp;#39;espace pour le faire est une fraction
de ce que permet une page de changelog, et les coupes doivent être délibérées, pas accidentelles.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui entre vraiment dans l&amp;#39;aperçu visible ?&lt;/h2&gt;
&lt;p&gt;Les une à deux premières lignes, environ 80 à 170 caractères selon l&amp;#39;appareil et la taille de
police, avant que la lectrice doive toucher pour développer. C&amp;#39;est tout le budget pour la partie
de la release note qui décide si quelqu&amp;#39;un va lire le reste, et ça veut dire que la phrase la plus
importante doit venir en premier, pas le numéro de version, pas une salutation, pas un en-tête de
catégorie. Une release note qui commence par « Nouveautés de cette version : » a déjà dépensé un
tiers de son espace visible sur quatre mots qui ne disent rien à la lectrice.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plateforme&lt;/th&gt;
&lt;th&gt;Limite totale approximative&lt;/th&gt;
&lt;th&gt;Aperçu effectif avant « plus »&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;App Store (iOS)&lt;/td&gt;
&lt;td&gt;~4 000 caractères&lt;/td&gt;
&lt;td&gt;2-3 lignes, environ 80-170 caractères&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Play&lt;/td&gt;
&lt;td&gt;~500 caractères par langue, certains champs plus courts&lt;/td&gt;
&lt;td&gt;2-3 lignes, similaire à iOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Les deux&lt;/td&gt;
&lt;td&gt;Aucun lien cliquable dans le champ release notes&lt;/td&gt;
&lt;td&gt;N/D&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;La règle « ce que vous pouvez faire maintenant, ce qu&amp;#39;on vous doit » fonctionne-t-elle toujours à cette longueur ?&lt;/h2&gt;
&lt;p&gt;Oui, et elle devient plus stricte, pas différente. Une phrase par entrée, verbe en premier, sans
mise en contexte : « Exportez vos données en CSV depuis Paramètres. » bat « Nous avons ajouté la
possibilité pour les utilisateurs d&amp;#39;exporter désormais leurs données au format CSV » en utilisant
un tiers des mots pour dire la même chose. À la longueur d&amp;#39;une page de changelog, une phrase un
peu bavarde coûte une demi-seconde à la lectrice. À la longueur d&amp;#39;une release note mobile, cette
même verbosité peut pousser la phrase entière hors de l&amp;#39;aperçu visible, si bien que la lectrice ne
voit jamais le verbe qui lui aurait dit ce qui a changé.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Mauvais, gaspille l&amp;#39;aperçu sur l&amp;#39;emballage :
&amp;quot;Nous sommes ravis de vous apporter une nouvelle mise
à jour pleine d&amp;#39;améliorations ! Lisez la suite pour
les détails.&amp;quot;

Bon, toute la valeur dans la première ligne :
&amp;quot;Exportez vos données en CSV. Le mode sombre respecte
désormais le réglage système. Correction d&amp;#39;un plantage
à l&amp;#39;ouverture de liens partagés.&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui doit être coupé qu&amp;#39;une entrée de changelog web garderait normalement ?&lt;/h2&gt;
&lt;p&gt;Les liens, d&amp;#39;abord, parce qu&amp;#39;aucun des deux stores ne les rend cliquables, donc une URL dans le
texte est un poids mort que la lectrice devrait retaper. Si l&amp;#39;entrée a besoin d&amp;#39;une destination,
dites plutôt quoi toucher dans l&amp;#39;app : « Voyez les nouveaux filtres sous Paramètres &amp;gt; Recherche »
fonctionne ; « Lisez-en plus sur example.com/blog/filtres » ne fonctionne pas, sur cette surface.
Ensuite, tout ce qui est conditionnel ou spécifique à un public : un changelog web peut dire « si
vous utilisez l&amp;#39;API, ça vous concerne », mais une fiche de store atteint chaque utilisatrice
installée en même temps, donc une ligne conditionnelle se lit comme du bruit pour les 95 % à qui
ça ne s&amp;#39;applique pas. Mettez le détail conditionnel dans un message in-app à la place, déclenché
pour les comptes que ça concerne réellement.&lt;/p&gt;
&lt;h2&gt;Chaque version devrait-elle avoir ses propres notes, ou est-ce correct de réutiliser « corrections de bugs et améliorations de performances » ?&lt;/h2&gt;
&lt;p&gt;Réutilisez-le pour les versions qui sont vraiment ça, mais vérifiez à quelle fréquence c&amp;#39;est
vraiment vrai. &lt;a href=&quot;https://changeloop.dev/blog/fr/how-to-write-release-notes/&quot;&gt;Comment écrire des release notes&lt;/a&gt; couvre déjà
pourquoi cette phrase trahit une note écrite de l&amp;#39;intérieur plutôt que pour la lectrice ; sur
mobile, elle fait un double dégât, parce que les release notes du store sont l&amp;#39;un des rares
endroits où certaines utilisatrices voient quoi que ce soit entre deux mises à jour, et une longue
série de « corrections de bugs et améliorations de performances » se lit comme si l&amp;#39;app ne
changeait pas, ce qui est une impression pire qu&amp;#39;aucune note du tout pour cette période.&lt;/p&gt;
&lt;h2&gt;Les release notes influencent-elles si les gens mettent à jour l&amp;#39;app ?&lt;/h2&gt;
&lt;p&gt;Indirectement, via la visibilité plutôt que la persuasion. La plupart des utilisatrices mettent à
jour automatiquement et ne lisent jamais les notes avant de le faire ; les notes comptent le plus
pour la minorité qui vérifie les mises à jour manuellement, et pour les critiques ou la presse qui
parcourent l&amp;#39;historique d&amp;#39;une fiche de store. Écrire pour ce public plus restreint est quand même
rentable, parce qu&amp;#39;une fiche avec un vrai historique d&amp;#39;entrées spécifiques et datées se lit comme
une app activement maintenue, et une fiche avec un an de « corrections de bugs et améliorations de
performances » non, peu importe ce qui a réellement été livré durant cette période.&lt;/p&gt;
&lt;h2&gt;Et une mise à jour forcée, où la note doit expliquer pourquoi l&amp;#39;utilisatrice n&amp;#39;a pas le choix ?&lt;/h2&gt;
&lt;p&gt;Indiquez la raison et l&amp;#39;échéance dans la première ligne, avant tout le reste, parce qu&amp;#39;une mise à
jour forcée est le seul cas où la lectrice est agacée avant même de commencer à lire. « Cette mise
à jour est nécessaire pour continuer à synchroniser vos données. Mettez à jour avant le [date] pour
éviter une interruption. » dit quoi faire et pourquoi en une seule phrase ; enterrer cette raison
sous trois lignes de notes de fonctionnalités sans rapport se lit comme si l&amp;#39;app cachait la partie
gênante.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les release notes mobiles devraient-elles correspondre au changelog web de la même version ?&lt;/strong&gt;
Couvrir les mêmes changements sous-jacents, mais pas mot pour mot. Le changelog web peut se
permettre l&amp;#39;explication complète ; la note mobile a besoin des mêmes faits compressés en une
phrase avec le verbe en premier, ce qui veut généralement dire que c&amp;#39;est une réécriture, pas un
copier-coller.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vaut-il la peine de localiser les release notes mobiles pour chaque langue supportée ?&lt;/strong&gt;
Oui, plus que pour un changelog web, parce que la fiche du store est souvent la seule surface
localisée que certaines utilisatrices voient entre deux sessions, et les deux plateformes
supportent des release notes par locale sans travail d&amp;#39;ingénierie supplémentaire au-delà de la
traduction elle-même.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle longueur devrait avoir une release note mobile s&amp;#39;il n&amp;#39;y a pas de limite forçant la concision ?&lt;/strong&gt;
Courte quand même. Le plafond de 4 000 caractères sur iOS est rarement la vraie contrainte ;
c&amp;#39;est l&amp;#39;aperçu de 2-3 lignes qui l&amp;#39;est, et écrire au-delà de ce que cet aperçu montre veut juste
dire que moins de gens lisent la partie qui comptait.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les release notes ont-elles besoin du numéro de version dans le texte visible ?&lt;/strong&gt;
Non. Le store affiche déjà le numéro de version à côté des notes. Le répéter dans le texte dépense
des caractères visibles sur une information que la lectrice a déjà sous les yeux.&lt;/p&gt;
</content:encoded></item><item><title>Changelogs de monorepo : un seul, ou un par package ?</title><link>https://changeloop.dev/blog/fr/monorepo-changelogs/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/monorepo-changelogs/</guid><description>Un monorepo peut avoir un changelog pour tout le repo ou un par package, et se tromper rend chaque release trop bruyante ou trop dispersée à trouver.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un monorepo héberge plusieurs éléments déployables séparément dans un seul dépôt, et un changelog
doit d&amp;#39;abord répondre à une question : le lecteur s&amp;#39;intéresse-t-il au repo, ou à un package
particulier à l&amp;#39;intérieur ? La plupart des équipes ne décident jamais ça délibérément. Elles
commencent avec un changelog parce qu&amp;#39;il y a un repo, ajoutent des packages au fil du temps, et
finissent avec un journal où quelqu&amp;#39;un utilisant la CLI doit défiler devant quarante entrées
backend sans rapport pour trouver celle qui a livré son correctif. Ce qui décide la bonne forme,
ce n&amp;#39;est pas la structure du dépôt, mais qui lit le journal et ce qu&amp;#39;il sait déjà chercher.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui rend le changelog d&amp;#39;un monorepo différent de celui d&amp;#39;un repo unique ?&lt;/h2&gt;
&lt;p&gt;Un changelog de repo unique a un public implicite : tous ceux qui utilisent l&amp;#39;unique chose que ce
repo construit. Le public d&amp;#39;un monorepo se divise par package, et les packages du même repo sont
souvent livrés selon des calendriers différents, à des consommateurs différents, à des niveaux de
stabilité différents. Une bibliothèque publiée dans un registre et un outil d&amp;#39;administration
interne peuvent vivre dans le même monorepo et n&amp;#39;avoir presque rien en commun pour qui lit le
changelog.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Forme du repo&lt;/th&gt;
&lt;th&gt;Lecteur typique&lt;/th&gt;
&lt;th&gt;Changelog adapté&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Une seule app déployable&lt;/td&gt;
&lt;td&gt;Tous ceux qui utilisent le produit&lt;/td&gt;
&lt;td&gt;Un journal, pour tout le repo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workspace de bibliothèques (plusieurs packages publiés)&lt;/td&gt;
&lt;td&gt;Qui dépend d&amp;#39;un package particulier&lt;/td&gt;
&lt;td&gt;Un journal par package&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App plus outillage interne&lt;/td&gt;
&lt;td&gt;Deux publics distincts sans recouvrement&lt;/td&gt;
&lt;td&gt;Divisé par public, pas par dossier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App plus son propre SDK&lt;/td&gt;
&lt;td&gt;Utilisateurs du produit, et intégrateurs du SDK&lt;/td&gt;
&lt;td&gt;Deux journaux : un pour le produit, un pour le SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Chaque package a-t-il besoin de son propre changelog ?&lt;/h2&gt;
&lt;p&gt;Seulement ceux avec un public indépendant. Un package publié dans un registre a besoin de son
propre journal, parce que la personne qui l&amp;#39;installe n&amp;#39;a aucune raison de lire quoi que ce soit
d&amp;#39;autre dans le repo, et les outils de release de monorepo comme &lt;a href=&quot;https://lerna.js.org/&quot;&gt;Lerna&lt;/a&gt; et
Changesets écrivent un &lt;code&gt;CHANGELOG.md&lt;/code&gt; par package, à côté de son &lt;code&gt;package.json&lt;/code&gt;. Un utilitaire interne avec un
seul consommateur, l&amp;#39;app déjà présente dans le même repo, n&amp;#39;a pas besoin d&amp;#39;un journal séparé ;
intégrer ses changements dans les entrées de cette app est plus utile qu&amp;#39;un second fichier que
personne en dehors de l&amp;#39;équipe n&amp;#39;ouvre.&lt;/p&gt;
&lt;p&gt;Le test est le même que celui qui décide si une entrée quelconque appartient à un changelog : le
lecteur le remarquerait-il ou s&amp;#39;en soucierait-il, et peut-il agir en le sachant. Applique-le par
package, pas par dossier, et un repo avec douze packages peut finir avec deux vrais changelogs et
dix packages qui n&amp;#39;en ont tout simplement pas besoin.&lt;/p&gt;
&lt;h2&gt;Comment sait-on quel package a causé quelle entrée de changelog ?&lt;/h2&gt;
&lt;p&gt;Étiquette chaque entrée avec son package au moment où elle est écrite, pas après coup en
inspectant quels fichiers un commit a touchés. Un commit qui corrige une bibliothèque interne
partagée peut produire une entrée de changelog dans chaque package qui en dépend, et les chemins
de fichiers seuls ne peuvent pas dire laquelle de ces entrées en aval le lecteur doit vraiment
voir ; seule une personne qui décide &amp;quot;ceci est visible pour qui utilise le package A et pas pour
qui utilise le package B&amp;quot; le peut. Les &lt;a href=&quot;https://changeloop.dev/blog/fr/conventional-commits-changelog/&quot;&gt;conventional commits&lt;/a&gt;
aident ici mécaniquement, en nommant le package dans chaque commit, mais le scope ne produit
toujours qu&amp;#39;un brouillon. La même règle à deux niveaux de cet article s&amp;#39;applique par package : un
brouillon avec le bon scope a quand même besoin d&amp;#39;un passage humain avant d&amp;#39;être formulé pour le
lecteur réel de ce package.&lt;/p&gt;
&lt;h2&gt;De quoi un changelog partagé a-t-il besoin qu&amp;#39;un changelog de repo unique n&amp;#39;a pas ?&lt;/h2&gt;
&lt;p&gt;Une étiquette de package sur chaque entrée, en tout premier, avant la description, pour qu&amp;#39;un
lecteur qui parcourt le journal puisse sauter en une seule passe tout ce qui ne le concerne pas.
Sans cette étiquette, un journal partagé se lit comme un flux aléatoire, et un lecteur qui
s&amp;#39;intéresse à un package n&amp;#39;a aucun moyen de le filtrer sauf mémoriser quelles lignes comptent, ce
que personne ne fait après la première semaine.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 2026-09-07

### [cli] Ajouté
- `acme push --dry-run` montre ce qui serait envoyé sans
  l&amp;#39;envoyer réellement.

### [core] Corrigé
- Le backoff des tentatives ne se réinitialise plus sur une
  requête réussie qui renvoie un corps vide.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Deux entrées, deux publics, un coup d&amp;#39;œil pour les distinguer. Un workflow façon
&lt;a href=&quot;https://github.com/changesets/changesets/blob/main/docs/intro-to-using-changesets.md&quot;&gt;Changesets&lt;/a&gt;
intègre cet étiquetage directement dans le processus de release : un contributeur écrit une note
courte, avec le scope du package, à côté de son changement, et l&amp;#39;outil assemble les changelogs par
package et les montées de version à partir de ces notes au moment de la release, plutôt que
d&amp;#39;essayer de reconstruire les frontières des packages après coup à partir d&amp;#39;un historique de
commits fusionné.&lt;/p&gt;
&lt;h2&gt;Comment le versioning s&amp;#39;articule-t-il avec un changelog de monorepo ?&lt;/h2&gt;
&lt;p&gt;Les packages versionnés indépendamment ont besoin de leur propre changelog parce qu&amp;#39;ils ont leur
propre numéro de version, et un changelog partagé ne peut pas exprimer &amp;quot;le package A est passé de
2.1 à 2.2 pendant que le package B est resté à 1.4&amp;quot; sans devenir deux journaux dans un seul
fichier. &lt;a href=&quot;https://changeloop.dev/blog/fr/semantic-versioning-changelog/&quot;&gt;Semantic versioning et votre changelog&lt;/a&gt; couvre
comment un numéro de version devrait correspondre aux catégories de changelog ; dans un monorepo,
cette correspondance doit s&amp;#39;appliquer par package, parce qu&amp;#39;un changement cassant dans un package
n&amp;#39;en est pas un pour un package frère qui n&amp;#39;en dépend pas.&lt;/p&gt;
&lt;p&gt;Un repo qui livre un produit comme une seule unité déployable, même s&amp;#39;il est construit à partir de
nombreux packages internes, n&amp;#39;a pas ce problème : les packages partagent une version parce qu&amp;#39;ils
sont toujours livrés ensemble, et un changelog unique est correct.&lt;/p&gt;
&lt;h2&gt;Comment les tags git s&amp;#39;intègrent-ils dans un monorepo ?&lt;/h2&gt;
&lt;p&gt;La même règle de &lt;a href=&quot;https://changeloop.dev/blog/fr/git-tags-releases-changelog/&quot;&gt;tags git, releases et votre changelog&lt;/a&gt;
s&amp;#39;applique, par package : un package avec sa propre version a besoin de son propre préfixe de tag,
typiquement &lt;code&gt;nom-du-package@1.4.0&lt;/code&gt; plutôt qu&amp;#39;un &lt;code&gt;v1.4.0&lt;/code&gt; nu qui ne peut pas dire à quel package il
appartient. Un monorepo tagué seulement avec des numéros de version nus ne peut pas répondre plus
tard &amp;quot;qu&amp;#39;y avait-il dans &lt;code&gt;core&lt;/code&gt; quand &lt;code&gt;cli&lt;/code&gt; a livré la 2.2&amp;quot;, parce que rien sur le disque
n&amp;#39;enregistre à quel package ce tag appartenait réellement.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ai-je besoin d&amp;#39;un changelog séparé pour chaque package d&amp;#39;un monorepo ?&lt;/strong&gt;
Seulement pour les packages avec un public indépendant, généralement tout ce qui est publié dans
un registre. Un package avec un seul consommateur interne déjà présent dans le même repo peut
s&amp;#39;intégrer dans le journal de ce consommateur plutôt que d&amp;#39;en maintenir un propre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qu&amp;#39;est-ce qui étiquette une entrée de changelog avec le bon package ?&lt;/strong&gt;
La personne qui écrit l&amp;#39;entrée, au moment où elle l&amp;#39;écrit, pas un scan automatique des chemins de
fichiers modifiés. Un changement dans une bibliothèque partagée peut produire une entrée
différente dans chaque package qui en dépend, et seule une personne peut décider ce que chacune de
ces entrées en aval devrait vraiment dire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un monorepo devrait-il utiliser un seul numéro de version pour tout ?&lt;/strong&gt;
Seulement si chaque package est toujours livré avec les autres. Si les packages sont un jour
publiés indépendamment, ils ont besoin de versions indépendantes, et les versions indépendantes
ont besoin de changelogs indépendants pour avoir un sens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un outil de changelog de monorepo remplace-t-il l&amp;#39;étape d&amp;#39;édition humaine ?&lt;/strong&gt;
Non. Des outils comme Changesets automatisent la collecte et l&amp;#39;assemblage des notes par package au
moment de la release ; la note elle-même, écrite dans le langage du lecteur plutôt que celui du
contributeur, reste le travail d&amp;#39;une personne, comme dans n&amp;#39;importe quelle autre pipeline de
changelog.&lt;/p&gt;
</content:encoded></item><item><title>Comment annoncer une nouvelle fonctionnalité (sans silence)</title><link>https://changeloop.dev/blog/fr/new-feature-announcement/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/new-feature-announcement/</guid><description>La plupart des annonces meurent dans un canal lu une seule fois. Où annoncer, quoi dire en premier, et comment atteindre celles qui l&apos;ont demandée.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;La plupart des annonces de fonctionnalités meurent dans un canal que personne ne lit deux fois :
un tweet qui défile, un email du jour de sortie enterré sous les douze autres qu&amp;#39;une abonnée a
reçus cette semaine-là, un message Slack dans un canal que la moitié de l&amp;#39;équipe a coupé il y a
des mois. La fonctionnalité est sortie. Presque personne parmi celles qui l&amp;#39;auraient utilisée ne
l&amp;#39;a su. Corriger ça tient moins à écrire une meilleure annonce qu&amp;#39;à choisir le bon canal pour la
bonne lectrice, et à atteindre directement celles qui l&amp;#39;ont explicitement demandée plutôt que de
compter sur le fait qu&amp;#39;elles remarquent une annonce générale.&lt;/p&gt;
&lt;h2&gt;Où une nouvelle fonctionnalité devrait-elle vraiment être annoncée ?&lt;/h2&gt;
&lt;p&gt;À plus d&amp;#39;un endroit, parce que « tout le monde lit le même canal » n&amp;#39;est jamais vrai. Une entrée
de changelog ou de flux sert la lectrice qui vérifie à son propre rythme et veut le registre
permanent et daté. Un avis in-app sert la lectrice déjà en train d&amp;#39;utiliser le produit qui
utiliserait la fonctionnalité aujourd&amp;#39;hui si elle savait qu&amp;#39;elle existe. L&amp;#39;email sert la lectrice
qui n&amp;#39;est pas actuellement dans le produit mais reviendrait pour la bonne mise à jour. Les réseaux
sociaux servent une portée au-delà des utilisatrices existantes, avec presque aucun ciblage.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Canal&lt;/th&gt;
&lt;th&gt;Idéal pour&lt;/th&gt;
&lt;th&gt;Faiblesse&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Changelog / flux&lt;/td&gt;
&lt;td&gt;Le registre permanent ; lectrices à leur propre rythme&lt;/td&gt;
&lt;td&gt;Passif ; inutile pour qui ne vérifie jamais&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avis in-app&lt;/td&gt;
&lt;td&gt;Utilisatrices déjà présentes, qui agiraient aujourd&amp;#39;hui&lt;/td&gt;
&lt;td&gt;N&amp;#39;atteint personne d&amp;#39;actuellement déconnecté&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email&lt;/td&gt;
&lt;td&gt;Utilisatrices inactives qui reviendraient pour cela&lt;/td&gt;
&lt;td&gt;Facile à enterrer sous d&amp;#39;autres emails ; besoin d&amp;#39;un vrai objet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Réseaux sociaux&lt;/td&gt;
&lt;td&gt;Portée au-delà des utilisatrices actuelles&lt;/td&gt;
&lt;td&gt;Presque aucun ciblage ; durée de vie courte&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Aucun des quatre ne suffit seul. &lt;a href=&quot;https://changeloop.dev/blog/fr/what-is-a-changelog/&quot;&gt;Le changelog&lt;/a&gt; est le seul document qui devrait porter chaque
release quelle que soit sa taille, parce que c&amp;#39;est le registre vers lequel tout le reste renvoie ;
les trois autres sont une amplification ajoutée par-dessus, choisie selon l&amp;#39;ampleur réelle de la
fonctionnalité.&lt;/p&gt;
&lt;h2&gt;Que devrait dire l&amp;#39;annonce en premier ?&lt;/h2&gt;
&lt;p&gt;Le résultat, pas le mécanisme. « Nous avons ajouté une couche de cache à l&amp;#39;endpoint des rapports »
décrit ce que l&amp;#39;équipe a construit. « Les rapports se chargent désormais en moins d&amp;#39;une seconde »
décrit ce qui a changé pour la lectrice, et c&amp;#39;est la phrase qui obtient le clic, parce qu&amp;#39;elle
répond à « qu&amp;#39;est-ce que ça m&amp;#39;apporte » dans la première proposition plutôt que la troisième. Le
mécanisme appartient à l&amp;#39;entrée de changelog ou à la page de détail, pas au titre.&lt;/p&gt;
&lt;p&gt;Du concret avant des adjectifs. « Une expérience de rapports plus rapide et plus puissante » ne
dit rien à la lectrice sur quoi agir ; « les rapports se chargent désormais en moins d&amp;#39;une seconde
et peuvent être filtrés par statut » lui dit exactement ce qui a changé et quoi essayer. La
seconde version paraît aussi plus crédible, parce qu&amp;#39;une affirmation vague sonne exactement comme
sonne un texte marketing quand il n&amp;#39;y a rien de concret à dire.&lt;/p&gt;
&lt;h2&gt;En quoi diffère-t-elle d&amp;#39;un email de mise à jour produit ?&lt;/h2&gt;
&lt;p&gt;Elles se recoupent sans être identiques. &lt;a href=&quot;https://changeloop.dev/blog/fr/product-update-email/&quot;&gt;Email de mise à jour produit&lt;/a&gt;
couvre le canal email spécifiquement, y compris la cadence, les objets, et quand un digest bat un
envoi ponctuel. Une annonce de nouvelle fonctionnalité est l&amp;#39;événement sous-jacent ; l&amp;#39;email est
l&amp;#39;un des quatre canaux ci-dessus qui pourrait la porter, choisi quand la fonctionnalité est assez
grande pour justifier un envoi dédié plutôt que de voyager dans le prochain digest. Une petite
fonctionnalité mérite une entrée de changelog et peut-être un avis in-app. Une fonctionnalité
importante mérite les quatre canaux, coordonnés dans le temps.&lt;/p&gt;
&lt;h2&gt;Comment atteindre les personnes précises qui l&amp;#39;ont demandée ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est l&amp;#39;annonce au meilleur rapport effort/impact, et presque toutes les équipes la sautent. Si
dix clientes ont demandé une fonctionnalité par son nom, ces dix personnes méritent une note
directe et personnelle au moment où elle sort, indépendamment de toute annonce plus large qui
part par ailleurs. &lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;Boucler la boucle de feedback avec le client&lt;/a&gt;
couvre le mécanisme en entier ; le résumé ici est que cela ne fonctionne que si la demande
d&amp;#39;origine est restée liée à la demandeuse, ce qui relève plus d&amp;#39;un &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-tracking/&quot;&gt;problème de suivi&lt;/a&gt;
que d&amp;#39;un problème d&amp;#39;annonce. Chez changeloop, quand un retour via le widget est devenu une issue
GitHub et que la pull request mergée la ferme (&lt;code&gt;fixes #142&lt;/code&gt;), approuver l&amp;#39;entrée de changelog poste
une seule fois le commentaire « Shipped — &lt;title&gt; » sur cette issue, qui renvoie vers l&amp;#39;entrée en
direct, et la personne qui a envoyé le retour voit l&amp;#39;entrée livrée dans le widget. Personne n&amp;#39;a à
se rappeler de le lui dire. Les issues créées à la main, et les dépôts GitLab ou Bitbucket, ne
reçoivent pas le commentaire.&lt;/p&gt;
&lt;h2&gt;Comment écrire l&amp;#39;entrée elle-même ?&lt;/h2&gt;
&lt;p&gt;La même discipline que toute autre entrée de notes de version : commencer par ce que la lectrice
peut désormais faire, poursuivre avec la configuration nécessaire, sauter la justification
interne. &lt;a href=&quot;https://changeloop.dev/blog/fr/how-to-write-release-notes/&quot;&gt;Comment rédiger des notes de version&lt;/a&gt; couvre la
méthode complète ; une annonce de nouvelle fonctionnalité est le cas aux enjeux les plus élevés,
parce que c&amp;#39;est l&amp;#39;entrée la plus susceptible d&amp;#39;être capturée en screenshot, transférée, et lue par
quelqu&amp;#39;un qui n&amp;#39;a jamais vu le changelog du produit.&lt;/p&gt;
&lt;h2&gt;Quand ne faut-il pas annoncer largement ?&lt;/h2&gt;
&lt;p&gt;Quand la fonctionnalité est encore en déploiement vers un sous-ensemble de comptes, qu&amp;#39;il s&amp;#39;agit
vraiment d&amp;#39;une bêta, ou qu&amp;#39;elle est tarifée ou verrouillée de telle façon que neuf lectrices sur
dix d&amp;#39;une annonce large ne pourraient pas encore l&amp;#39;utiliser. Une annonce large pour une
fonctionnalité que neuf lectrices sur dix ne peuvent pas utiliser se lit comme un appât, et
grille la confiance dans la prochaine annonce plus qu&amp;#39;elle ne crée d&amp;#39;enthousiasme dans
celle-ci. La solution n&amp;#39;est pas le silence, c&amp;#39;est la portée : informer directement les comptes
éligibles et retenir les canaux larges jusqu&amp;#39;à ce que la disponibilité rattrape l&amp;#39;annonce.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Chaque nouvelle fonctionnalité mérite-t-elle sa propre annonce ?&lt;/strong&gt;
Chacune mérite une entrée de changelog. Seules celles assez significatives pour changer la façon
dont quelqu&amp;#39;un utilise le produit, ou explicitement demandées par leur nom, méritent les canaux
plus larges comme l&amp;#39;email ou les réseaux sociaux.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quel est le meilleur canal pour une petite fonctionnalité ?&lt;/strong&gt;
Le changelog seul, plus un avis in-app si la fonctionnalité est découvrable dans un flux où
l&amp;#39;utilisatrice se trouve déjà. L&amp;#39;email et les réseaux sociaux valent la peine pour des
fonctionnalités qui justifient de demander de l&amp;#39;attention.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment annoncer une fonctionnalité aux personnes qui l&amp;#39;ont spécifiquement demandée ?&lt;/strong&gt;
Garder la demande liée à la demandeuse dès son enregistrement, puis notifier individuellement à
la sortie, séparément de toute annonce plus large. Une étiquette de statut partagée que la
demandeuse peut vérifier elle-même réduit aussi le nombre de messages individuels nécessaires en
premier lieu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une annonce de fonctionnalité a-t-elle besoin d&amp;#39;un screenshot ?&lt;/strong&gt;
Pour tout ce qui est visuel, oui ; une fonctionnalité décrite mais non vue est sautée bien plus
souvent qu&amp;#39;une dont les lectrices peuvent voir un aperçu. Pour une API ou une capacité backend, un
court exemple de code fait le même travail qu&amp;#39;un screenshot pour un changement d&amp;#39;interface.&lt;/p&gt;
</content:encoded></item><item><title>Prioriser les demandes de fonctionnalités qui s&apos;accumulent</title><link>https://changeloop.dev/blog/fr/prioritizing-feature-requests/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/prioritizing-feature-requests/</guid><description>Un backlog laisse ouverte la question difficile : quelle demande sort en premier. Les cadres utiles, où chacun se casse, et ce qu&apos;un compte de votes cache.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Suivre les demandes de fonctionnalités résout où elles vivent. Ça ne résout pas laquelle sort en
premier, et cette deuxième question est celle sur laquelle les équipes restent vraiment coincées.
Un backlog de trois cents demandes, regroupées et étiquetées, a quand même besoin d&amp;#39;une règle de
décision, parce que &amp;quot;construis la chose la plus demandée&amp;quot; ne fonctionne que jusqu&amp;#39;à ce que deux
demandes soient proches et qu&amp;#39;une troisième ait une défenseuse bruyante, ce qui arrive la plupart
des semaines. Les cadres ci-dessous ne sont pas des réponses concurrentes à la même question.
Chacun convient à un type différent de demande, et en utiliser un seul pour toutes est
généralement la vraie erreur.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui rend prioriser les demandes de fonctionnalités différent de prioriser une roadmap ?&lt;/h2&gt;
&lt;p&gt;Une décision de roadmap part de la stratégie et demande quoi construire. Une décision sur une
demande de fonctionnalité part d&amp;#39;une demande qui existe déjà et se demande s&amp;#39;il faut agir dessus,
et les deux tirent dans des directions différentes assez souvent pour qu&amp;#39;une demande ait une forte
demande et reste quand même mauvaise à construire, ou ait une faible demande et vaille quand même
la peine parce qu&amp;#39;elle débloque un compte stratégique. Traiter chaque demande comme un vote de
roadmap saute cette vérification.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cadre&lt;/th&gt;
&lt;th&gt;Ce qu&amp;#39;il pèse&lt;/th&gt;
&lt;th&gt;Où il se casse&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Compte brut de demandes&lt;/td&gt;
&lt;td&gt;Combien de gens ont demandé&lt;/td&gt;
&lt;td&gt;Récompense les noms accrocheurs plutôt que la vraie demande&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RICE&lt;/td&gt;
&lt;td&gt;Portée, impact, confiance, effort&lt;/td&gt;
&lt;td&gt;Nécessite des estimations que personne n&amp;#39;a pour une demande fraîche&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pondéré par le revenu&lt;/td&gt;
&lt;td&gt;Qui a demandé, selon la valeur du compte&lt;/td&gt;
&lt;td&gt;Ignore les demandes de comptes qui ne valent pas encore grand-chose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Votes publics&lt;/td&gt;
&lt;td&gt;Signal visible, faible effort&lt;/td&gt;
&lt;td&gt;N&amp;#39;atteint que les utilisateurs qui savent déjà où regarder&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qu&amp;#39;est-ce que RICE, et ça marche pour les demandes de fonctionnalités ?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.intercom.com/blog/rice-simple-prioritization-for-product-managers/&quot;&gt;RICE&lt;/a&gt; note une
idée sur la portée, l&amp;#39;impact, la confiance et l&amp;#39;effort, puis divise les trois premiers par le
quatrième pour obtenir un chiffre comparable. C&amp;#39;était conçu pour des idées de roadmap auxquelles
une équipe croit déjà, où la partie difficile est de comparer des paris différents entre eux. Les
demandes de fonctionnalités arrivent déjà avec un chiffre de portée, le compte de gens qui ont
demandé, ce qui est plus concret que la portée qu&amp;#39;a habituellement une idée de roadmap toute
fraîche. Là où RICE est mis sous tension par une demande, c&amp;#39;est la confiance et l&amp;#39;impact : une
équipe peut être sûre qu&amp;#39;une demande est réelle et n&amp;#39;avoir quand même aucune base pour savoir
combien elle bougera une métrique, parce que &amp;quot;l&amp;#39;impact&amp;quot; pour une demande qui a déjà un nom et une
trace d&amp;#39;utilisateurs réels est un type d&amp;#39;estimation différent de l&amp;#39;impact pour une idée que
personne en dehors de la salle n&amp;#39;a encore vue.&lt;/p&gt;
&lt;p&gt;Utilise RICE pour les demandes sérieusement envisagées et pas encore tranchées. Ne l&amp;#39;applique pas
à chaque demande entrante ; l&amp;#39;effort de notation ne se justifie que sur celles assez proches pour
avoir besoin d&amp;#39;un départage.&lt;/p&gt;
&lt;h2&gt;Faut-il pondérer par le revenu, ou par qui a demandé ?&lt;/h2&gt;
&lt;p&gt;Par qui a demandé, mais pas seulement par le revenu. Un compte proche du renouvellement, un compte
qui a déjà fait une escalade, et un compte dont la demande débloque une affaire en cours portent
une urgence qu&amp;#39;un chiffre de revenu plat ne capture pas à lui seul, et une demande venant d&amp;#39;un
essai gratuit peut quand même compter si elle bloque une décision qui devient bientôt du revenu.
La pondération par revenu est la plus facile à calculer de toutes celles-ci, et pour cette raison
même la plus facile à surestimer : elle retire correctement le bruit des comptes sans véritable
enjeu, et elle peut tout aussi facilement déclasser une demande qui amènerait un compte bien plus
grand encore dans le pipeline.&lt;/p&gt;
&lt;h2&gt;Quel rôle jouent vraiment les votes ?&lt;/h2&gt;
&lt;p&gt;Un signal bon marché et continu pour des demandes qui existent déjà, et une mauvaise façon de
découvrir quelles demandes devraient exister en premier lieu. Un compte de votes n&amp;#39;atteint que les
utilisateurs qui ont déjà trouvé la demande et jugé qu&amp;#39;elle méritait un clic, ce qui veut dire que
le total des votes d&amp;#39;une roadmap publique reflète autant la visibilité que la demande : une
ancienne demande près du haut de la liste continue d&amp;#39;accumuler des votes en partie parce qu&amp;#39;elle
est facile à trouver, et une demande plus récente et tout aussi réelle part de zéro.
L&amp;#39;article sur la
&lt;a href=&quot;https://changeloop.dev/blog/fr/public-roadmap/&quot;&gt;roadmap publique&lt;/a&gt; plaide pour laisser complètement les votes hors de la
roadmap. Traite les votes comme un signal qui a besoin d&amp;#39;être regroupé
et pondéré par récence, pas comme un classement à construire dans l&amp;#39;ordre.
&lt;a href=&quot;https://changeloop.dev/blog/fr/feedback-signal-quality/&quot;&gt;Tickets support vs. demandes&lt;/a&gt; couvre l&amp;#39;autre angle mort des
comptes de votes : un vrai manque peut générer presque aucun vote si les utilisatrices qui y sont
confrontées ne trouvent jamais le tableau, tout en apparaissant bruyamment dans le support.&lt;/p&gt;
&lt;h2&gt;Quand la cliente la plus bruyante gagne-t-elle, et est-ce un problème ?&lt;/h2&gt;
&lt;p&gt;Parfois, et ce n&amp;#39;est un problème que si personne ne le remarque. Une cliente qui fait souvent des
escalades, écrit des tickets détaillés ou a une ligne directe avec quelqu&amp;#39;un de l&amp;#39;équipe verra ses
demandes examinées plus vite qu&amp;#39;une cliente plus discrète avec une demande tout aussi valable, et
un processus de priorisation qui ne le vérifie jamais favorisera systématiquement qui insiste le
plus, pas qui a le dossier le plus solide. Les clientes bruyantes ne sont pas le problème à
corriger ; leurs demandes sont souvent réellement importantes. La correction est une habitude :
passer en revue le backlog par source périodiquement et vérifier si la même poignée de comptes
explique la majorité de ce qui a été livré récemment, et se demander si ça correspond à où se
trouve vraiment la demande.&lt;/p&gt;
&lt;h2&gt;Comment transformer une décision de priorisation en réponse ?&lt;/h2&gt;
&lt;p&gt;Chaque décision ici produit des gagnantes et des perdantes, et les deux méritent une réponse qui
nomme le raisonnement réel, pas juste un changement de statut sans explication. &lt;a href=&quot;https://changeloop.dev/blog/fr/declining-feature-requests/&quot;&gt;Comment refuser
une demande de fonctionnalité&lt;/a&gt; couvre quoi dire à une demande
qui a perdu, d&amp;#39;une façon qui garde la relation intacte plutôt que de sonner comme un refus
générique. Le travail de regroupement et d&amp;#39;étiquetage qui rend tout ça possible en premier lieu est
couvert dans &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-tracking/&quot;&gt;suivi des demandes de fonctionnalités&lt;/a&gt; ; la
priorisation ne fonctionne que sur des demandes déjà enregistrées et regroupées assez bien pour
être comparées.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quel est le meilleur cadre pour prioriser les demandes de fonctionnalités ?&lt;/strong&gt;
Aucun seul. Utilise les comptes bruts pour trouver le signal le plus bruyant, RICE pour comparer
une courte liste de candidates sérieuses, et une vérification du revenu ou du compte pour repérer
les cas où une demande silencieuse d&amp;#39;un compte stratégique pèse plus qu&amp;#39;un groupe plus bruyant mais
moins important.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les demandes de fonctionnalités devraient-elles être priorisées comme les idées de roadmap ?&lt;/strong&gt;
Non. Les idées de roadmap partent de la stratégie ; les demandes de fonctionnalités partent d&amp;#39;une
demande qui existe déjà. Les noter ensemble fait qu&amp;#39;un pari stratégique bien argumenté mais avec
peu de demande existante perd constamment face à une demande qui a simplement plus de gens qui
l&amp;#39;ont formulée.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les votes sur une roadmap publique reflètent-ils fidèlement la demande ?&lt;/strong&gt;
Seulement parmi les gens qui ont déjà trouvé la demande. Les demandes plus anciennes et plus
visibles accumulent des votes plus vite, indépendamment de la demande réelle derrière une plus
récente, donc traite les totaux de votes comme un signal, regroupé et pondéré par récence, pas
comme un classement à construire dans l&amp;#39;ordre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;À quelle fréquence les priorités des demandes de fonctionnalités devraient-elles être réévaluées ?&lt;/strong&gt;
Selon un cycle fixe, pas seulement quand quelqu&amp;#39;un fait une escalade. Une passe mensuelle ou
trimestrielle qui regroupe les demandes et revérifie la pondération détecte les dérives, comme une
poignée de comptes qui domine ce qui est livré, qu&amp;#39;un processus purement réactif ne fait jamais
apparaître de lui-même.&lt;/p&gt;
</content:encoded></item><item><title>Release notes enterprise : ce qui change pour un compte</title><link>https://changeloop.dev/blog/fr/private-release-notes-enterprise/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/private-release-notes-enterprise/</guid><description>Les release notes enterprise d&apos;un client sur un build privé doivent coller à son instance. Mal réglées, elles révèlent la roadmap ou égarent son support.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un produit SaaS public envoie les mêmes release notes à tout le monde, parce que tout le monde est
sur la même version. Une cliente enterprise sur une version épinglée, une instance dédiée, ou un
sous-ensemble du produit avec des feature flags brise cette hypothèse : les release notes qui
décrivent ce qui a changé pour elle ne sont pas les mêmes que sur votre blog public, et envoyer les
publiques quand même la confond soit avec des changements qu&amp;#39;elle n&amp;#39;a pas encore, soit, pire, lui
parle d&amp;#39;une fonctionnalité que l&amp;#39;équipe de compte d&amp;#39;une autre cliente enterprise vous a
explicitement demandé de garder secrète encore un mois pour la sienne.
&lt;a href=&quot;https://changeloop.dev/blog/fr/release-notes-best-practices/&quot;&gt;Bonnes pratiques pour les release notes&lt;/a&gt;
couvre l&amp;#39;artisanat général ; ceci concerne l&amp;#39;écriture de release notes enterprise pour le problème
de calibrage qui n&amp;#39;apparaît que lorsque vous avez des clientes qui ne sont pas toutes sur le même
build.&lt;/p&gt;
&lt;h2&gt;Pourquoi une cliente enterprise ne peut-elle pas simplement lire le changelog public ?&lt;/h2&gt;
&lt;p&gt;Parce qu&amp;#39;il décrit une version qu&amp;#39;elle n&amp;#39;exécute peut-être pas encore, des fonctionnalités
auxquelles elle n&amp;#39;a peut-être pas accès, et un calendrier qui ne correspond pas au sien. Une
cliente épinglée à un cycle de release trimestriel qui lit une fonctionnalité sortie pour le niveau
public la semaine dernière n&amp;#39;a aucun moyen de savoir, à partir du seul changelog public, si cette
fonctionnalité lui arrivera la semaine prochaine ou le trimestre prochain. Le changelog public
répond à &amp;quot;qu&amp;#39;est-ce qui a changé dans le produit&amp;quot; ; la vraie question d&amp;#39;une cliente enterprise est
&amp;quot;qu&amp;#39;est-ce qui a changé dans la version que j&amp;#39;exécute, et quand est-ce que j&amp;#39;obtiens le reste&amp;quot;, ce
que le changelog public n&amp;#39;a jamais été écrit pour répondre.&lt;/p&gt;
&lt;h2&gt;De quoi une release note privée a-t-elle besoin qu&amp;#39;une publique n&amp;#39;a pas ?&lt;/h2&gt;
&lt;p&gt;Un identifiant de version ou d&amp;#39;environnement contre lequel la cliente peut vraiment vérifier, et
une déclaration explicite de ce qui ne lui est pas encore arrivé. &amp;quot;Cette version inclut les
améliorations d&amp;#39;export en masse de notre release publique 4.3, mais pas le nouveau modèle de
permissions, qui arrive dans votre prochaine mise à jour planifiée&amp;quot; dit à une administratrice
enterprise exactement où en est son instance par rapport au produit dans son ensemble. Une release
note publique n&amp;#39;a jamais besoin de ce cadrage parce qu&amp;#39;il n&amp;#39;y a qu&amp;#39;une seule instance par rapport à
laquelle être relative ; une privée est dénuée de sens sans lui.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Release notes publiques&lt;/th&gt;
&lt;th&gt;Release notes privées (enterprise)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Une version, une audience&lt;/td&gt;
&lt;td&gt;Plusieurs versions, audiences segmentées&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Suppose que la lectrice a chaque fonctionnalité décrite&lt;/td&gt;
&lt;td&gt;Doit énoncer ce que la lectrice a et n&amp;#39;a pas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calée sur la release publique&lt;/td&gt;
&lt;td&gt;Calée sur la propre fenêtre de mise à jour de la cliente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peut être rendue entièrement publique immédiatement&lt;/td&gt;
&lt;td&gt;Peut devoir retenir des éléments que d&amp;#39;autres clientes n&amp;#39;ont pas encore&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Est-il jamais acceptable de simplement retarder l&amp;#39;envoi des release notes publiques aux clientes enterprise plutôt que d&amp;#39;en écrire des séparées ?&lt;/h2&gt;
&lt;p&gt;Seulement si sa version correspond vraiment à la publique à ce moment-là, ce qui est plus rare qu&amp;#39;il
n&amp;#39;y paraît dès que vous avez plus de quelques comptes enterprise sur des rythmes différents.
Retarder les notes publiques fonctionne comme solution temporaire pour une cliente qui a une
version de retard et est sur le point de rattraper ; cela s&amp;#39;effondre au moment où deux clientes
enterprise sont sur des versions différentes l&amp;#39;une de l&amp;#39;autre, parce qu&amp;#39;il n&amp;#39;y a alors plus une
seule &amp;quot;les notes&amp;quot; à retarder, seulement une matrice de ce que chacune a. À ce stade, calibrer les
notes par compte, même si ce n&amp;#39;est qu&amp;#39;une vue filtrée des mêmes entrées sous-jacentes, cesse d&amp;#39;être
optionnel.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Notes publiques, envoyées à un compte enterprise qui
n&amp;#39;a pas encore la fonctionnalité :
&amp;quot;New: Bulk export now supports custom column ordering.&amp;quot;
(Confus : l&amp;#39;admin l&amp;#39;essaie et elle n&amp;#39;est pas là.)

Notes enterprise calibrées pour le même compte :
&amp;quot;Available in your next update (scheduled for 2026-10-15):
bulk export with custom column ordering. Not yet available
on your current version (3.8).&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Qui dans l&amp;#39;organisation de la cliente lit vraiment ceci, et cela change-t-il l&amp;#39;écriture ?&lt;/h2&gt;
&lt;p&gt;Habituellement une administratrice IT ou une contact customer success plutôt qu&amp;#39;une utilisatrice
finale, et cela change ce qui compte comme utile. Une utilisatrice finale veut savoir ce qui a
l&amp;#39;air différent sur son écran ; une administratrice enterprise veut savoir ce qui a changé dans les
permissions, la gestion des données, la configuration SSO, ou quoi que ce soit qui affecte la façon
dont elle gère le déploiement pour ses propres utilisatrices, parce que c&amp;#39;est elle qui répondra aux
questions internes. Une release note privée qui se lit comme un changelog grand public, tout en
boutons neufs et brillants et sans détail opérationnel, force l&amp;#39;administratrice à creuser pour
l&amp;#39;information dont elle avait vraiment besoin.&lt;/p&gt;
&lt;h2&gt;Comment cela interagit-il avec une roadmap publique ou un changelog public qui liste déjà la même fonctionnalité ?&lt;/h2&gt;
&lt;p&gt;Avec prudence, parce qu&amp;#39;une cliente qui lit les deux remarquera toute incohérence. Si votre
changelog public a déjà annoncé une fonctionnalité qu&amp;#39;un compte enterprise spécifique n&amp;#39;a pas
encore, sa release note privée doit reconnaître cet écart plutôt que faire comme si l&amp;#39;entrée
publique n&amp;#39;existait pas ; une administratrice qui a vu l&amp;#39;annonce publique et reçoit des notes
privées qui l&amp;#39;ignorent supposera soit que vous l&amp;#39;avez oubliée, soit que quelque chose est cassé.
&lt;a href=&quot;https://changeloop.dev/blog/fr/public-roadmap/&quot;&gt;Roadmap publique&lt;/a&gt; couvre comment garder une roadmap honnête sur ce qui
est sorti par rapport à ce qui est planifié ; la version enterprise de cette honnêteté dans les
release notes consiste à nommer directement l&amp;#39;écart entre ce qui est public et ce qui est le sien.&lt;/p&gt;
&lt;h2&gt;Une petite entreprise avec seulement une ou deux clientes enterprise a-t-elle besoin de toute cette structure ?&lt;/h2&gt;
&lt;p&gt;Pas le système entièrement segmenté, mais la discipline centrale, énoncer clairement sur quelle
version se trouve la cliente et ce qu&amp;#39;elle a et n&amp;#39;a pas, compte à n&amp;#39;importe quelle échelle dès que
vous avez ne serait-ce qu&amp;#39;une cliente qui n&amp;#39;est pas sur votre build le plus récent. Le mode
d&amp;#39;échec que cela évite, une administratrice confuse quant à savoir si une annonce publique
s&amp;#39;applique à elle, coûte un ticket de support et un coup à la confiance, que vous ayez deux comptes
enterprise ou deux cents.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les release notes privées devraient-elles jamais mentionner des fonctionnalités que d&amp;#39;autres clientes ont déjà mais pas celle-ci ?&lt;/strong&gt;
Seulement si c&amp;#39;est pertinent pour son propre calendrier, formulé comme &amp;quot;arrive dans votre prochaine
mise à jour&amp;quot; plutôt que comme une comparaison à d&amp;#39;autres clientes. Nommer ce qu&amp;#39;une autre cliente
spécifique a franchit un territoire qui n&amp;#39;est pas le vôtre à divulguer ; nommer ce qui arrive
spécifiquement à cette cliente est exactement l&amp;#39;information dont elle a besoin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les mêmes entrées de changelog sous-jacentes peuvent-elles alimenter à la fois les release notes publiques et privées ?&lt;/strong&gt;
Oui, et c&amp;#39;est habituellement l&amp;#39;approche la plus maintenable : étiquetez les entrées avec les
versions ou niveaux auxquels elles s&amp;#39;appliquent, puis filtrez par audience au moment de la
publication plutôt que d&amp;#39;écrire deux documents entièrement séparés qui divergent inévitablement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que faire si une cliente enterprise demande explicitement d&amp;#39;être sur les release notes publiques plutôt que sur un flux privé ?&lt;/strong&gt;
Respectez-le, mais confirmez qu&amp;#39;elle comprend que les notes publiques supposent la version
publique, et signalez vous-même par écrit l&amp;#39;écart si sa version diverge de ce qui est décrit. Cette
confirmation écrite est ce qui vous protège plus tard si elle agit sur des notes publiques qui ne
s&amp;#39;appliquaient pas réellement à son build.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combien de temps à l&amp;#39;avance une cliente enterprise devrait-elle être informée d&amp;#39;une fonctionnalité à laquelle elle aura accès dans la prochaine release ?&lt;/strong&gt;
Dès que la date est confirmée, pas seulement au moment de la release, parce que les
administratrices enterprise doivent souvent planifier leur propre communication interne ou
formation autour d&amp;#39;une fonctionnalité qui arrive, et une notification le jour même ne leur laisse
aucune marge pour cela.&lt;/p&gt;
</content:encoded></item><item><title>Semantic versioning et votre changelog</title><link>https://changeloop.dev/blog/fr/semantic-versioning-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/semantic-versioning-changelog/</guid><description>Le semantic versioning dit combien une release peut faire mal avant qu&apos;on lise le changelog. Ce que chaque chiffre promet, et ce qu&apos;une entrée doit tenir.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Le semantic versioning dit à l&amp;#39;appelante combien une release peut lui faire mal avant qu&amp;#39;elle ne
lise une seule entrée de changelog. Passer de &lt;code&gt;2.4.1&lt;/code&gt; à &lt;code&gt;2.5.0&lt;/code&gt; signifie : nouvelle capacité, rien
ne casse. Passer de &lt;code&gt;2.5.0&lt;/code&gt; à &lt;code&gt;3.0.0&lt;/code&gt; signifie : lire cette entrée avant de mettre à jour. Le
changelog et le numéro de version sont censés affirmer la même chose sous deux formes, et la
plupart des frictions entre les deux apparaissent justement quand ils ne concordent pas, ce qui
arrive plus souvent que la spécification ne le laisserait penser.&lt;/p&gt;
&lt;h2&gt;Que promet vraiment chaque chiffre d&amp;#39;une version ?&lt;/h2&gt;
&lt;p&gt;Le &lt;a href=&quot;https://semver.org/&quot;&gt;semantic versioning&lt;/a&gt; définit trois chiffres, &lt;code&gt;MAJOR.MINOR.PATCH&lt;/code&gt;,
chacun avec une règle stricte sur ce qui le déclenche. Un saut MAJOR signifie un changement
incompatible : quelque chose qu&amp;#39;une intégration correcte et existante pourrait remarquer et pour
lequel elle devrait changer. Un saut MINOR signifie une nouvelle fonctionnalité compatible en
arrière : rien d&amp;#39;existant ne casse, quelque chose de nouveau est disponible. Un saut PATCH
signifie un correctif compatible en arrière : le comportement se rapproche de ce qui était
documenté, et personne qui comptait volontairement sur l&amp;#39;ancien comportement ne devrait rien
remarquer.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Saut&lt;/th&gt;
&lt;th&gt;Signification&lt;/th&gt;
&lt;th&gt;L&amp;#39;entrée devrait se lire comme&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;MAJOR (&lt;code&gt;1.x.x&lt;/code&gt; -&amp;gt; &lt;code&gt;2.0.0&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Un changement incompatible&lt;/td&gt;
&lt;td&gt;« Une action est requise avant de mettre à jour »&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MINOR (&lt;code&gt;1.2.x&lt;/code&gt; -&amp;gt; &lt;code&gt;1.3.0&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Nouvelle capacité compatible&lt;/td&gt;
&lt;td&gt;« Disponible dès maintenant, rien d&amp;#39;autre ne change »&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PATCH (&lt;code&gt;1.2.3&lt;/code&gt; -&amp;gt; &lt;code&gt;1.2.4&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Un correctif compatible&lt;/td&gt;
&lt;td&gt;« Se comporte désormais comme documenté »&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Le tableau sert aussi de test à l&amp;#39;envers : si une entrée ne se lit pas comme sa ligne, soit le
numéro de version est faux, soit l&amp;#39;entrée sous-vend ou survend ce qui s&amp;#39;est réellement passé.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui compte comme incompatible pour le versionnage ?&lt;/h2&gt;
&lt;p&gt;Le même test qui décide si quelque chose appartient à un changelog d&amp;#39;API : si une appelante
correcte, écrite contre l&amp;#39;ancien comportement et jamais touchée depuis, pourrait se comporter
différemment à cause de ce changement. &lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;Qu&amp;#39;est-ce qu&amp;#39;un changement incompatible, et comment le livrer&lt;/a&gt;
couvre la décision en entier, y compris les cas qui semblent incompatibles sans l&amp;#39;être, et ceux
qui semblent petits sans l&amp;#39;être. En bref pour le versionnage : si la réponse est oui, le saut est
MAJOR quel que soit le code que le changement a réellement touché en interne. Les numéros de
version suivent la conséquence pour l&amp;#39;appelante, pas l&amp;#39;effort de l&amp;#39;équipe.&lt;/p&gt;
&lt;h2&gt;Comment une entrée de changelog devrait-elle correspondre à un saut de version ?&lt;/h2&gt;
&lt;p&gt;Une entrée, une catégorie de saut, énoncée d&amp;#39;emblée. Le motif du tableau se poursuit
directement : une entrée incompatible se place sous la version qui l&amp;#39;a introduite, formulée
d&amp;#39;abord comme un avertissement puis comme une description. Une entrée additive se place sous sa
version MINOR, formulée comme une disponibilité. Un correctif se place sous sa version PATCH,
formulé comme une correction. Mélanger les catégories dans une entrée, comme glisser un
changement incompatible dans le même paragraphe qu&amp;#39;un correctif sans rapport, c&amp;#39;est ainsi qu&amp;#39;une
lectrice rate justement la seule chose qui comptait vraiment.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 3.0.0 (2026-09-07)

### Changed
- **BREAKING:** `GET /reports` renvoie désormais les montants sous
  forme d&amp;#39;entiers dans la plus petite unité monétaire (centimes) au
  lieu de flottants. Mettez à jour tout code qui lit `amount`
  directement.

## 2.9.0 (2026-09-01)

### Added
- Les rapports peuvent désormais être filtrés par `status`.

## 2.8.4 (2026-08-28)

### Fixed
- `GET /reports?status=` renvoyait une page vide au lieu d&amp;#39;un 400 pour
  un statut inconnu.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Lu de haut en bas, le numéro de version et l&amp;#39;étiquette de section disent la même chose deux fois,
et c&amp;#39;est exactement le but : une lectrice qui ne parcourt que les titres obtient une lecture
correcte du risque avant d&amp;#39;ouvrir la moindre ligne.&lt;/p&gt;
&lt;h2&gt;La règle du changement incompatible s&amp;#39;applique-t-elle de la même façon avant la 1.0.0 ?&lt;/h2&gt;
&lt;p&gt;Non, et c&amp;#39;est de là que vient la plupart de la confusion sur « est-ce que c&amp;#39;était vraiment
incompatible ». SemVer est explicite : la version majeure zéro, &lt;code&gt;0.y.z&lt;/code&gt;, est pour le développement
initial : tout peut changer à tout moment, et l&amp;#39;API publique ne doit pas être considérée comme
stable. Un saut de &lt;code&gt;0.4.0&lt;/code&gt; à &lt;code&gt;0.5.0&lt;/code&gt; peut porter un changement incompatible sans violer la
spécification, parce que la garantie liée à la version majeure ne commence qu&amp;#39;une fois qu&amp;#39;un
projet livre sa &lt;code&gt;1.0.0&lt;/code&gt;. Une entrée de changelog doit quand même la même honnêteté aux lectrices
sur ce qui a cassé ; ce qui change, c&amp;#39;est seulement que le numéro de version lui-même n&amp;#39;est pas le
signal sur lequel s&amp;#39;appuyer avant l&amp;#39;arrivée de la 1.0.0.&lt;/p&gt;
&lt;h2&gt;Et si votre produit ne livre pas de versions discrètes ?&lt;/h2&gt;
&lt;p&gt;La plupart des produits SaaS déploient en continu et n&amp;#39;exposent jamais de numéro de version à une
appelante, ce qui n&amp;#39;élimine pas le besoin de cette discipline, seulement le chiffre qui la
porterait normalement. L&amp;#39;entrée de changelog doit faire tout le travail seule : dire clairement
si un changement est incompatible, additif, ou un correctif, avec les mêmes trois mots
qu&amp;#39;utilise le semantic versioning, même sans champ de version où les accrocher. Certaines équipes
maintiennent une version purement interne juste pour ancrer les entrées de changelog à quelque
chose de reliable, sans jamais l&amp;#39;exposer directement à l&amp;#39;appelante.&lt;/p&gt;
&lt;h2&gt;Comment cela s&amp;#39;applique-t-il spécifiquement à un changelog d&amp;#39;API ?&lt;/h2&gt;
&lt;p&gt;Plus strictement que presque partout ailleurs, parce que les appelantes d&amp;#39;une API sont du code,
pas des personnes qui peuvent hausser les épaules devant un changement inattendu. &lt;a href=&quot;https://changeloop.dev/blog/fr/api-changelog/&quot;&gt;Changelog d&amp;#39;API : quoi publier et qui le lit&lt;/a&gt;
couvre la forme complète de ce document ; la discipline de versionnage ici est ce qui garde ses
sections breaking et additive honnêtes. Une API qui propose plusieurs versions en parallèle,
comme &lt;code&gt;v1&lt;/code&gt; et &lt;code&gt;v2&lt;/code&gt; servies simultanément pendant une fenêtre de migration, applique en pratique
le semantic versioning à l&amp;#39;échelle de toute l&amp;#39;interface plutôt que d&amp;#39;un seul paquet, et le même
vocabulaire de trois mots s&amp;#39;applique toujours à chaque entrée.&lt;/p&gt;
&lt;h2&gt;Que dit Keep a Changelog sur le versionnage ?&lt;/h2&gt;
&lt;p&gt;Il se lie directement par son nom au semantic versioning et recommande le même vocabulaire de
catégories que cet article utilise : Added, Changed, Deprecated, Removed, Fixed, Security. &lt;a href=&quot;https://changeloop.dev/blog/fr/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog, en pratique&lt;/a&gt;
parcourt comment adopter cette spécification, y compris les endroits où les équipes ont tendance
à en dévier. Le recoupement n&amp;#39;est pas un hasard : les deux spécifications essaient de résoudre le
même problème depuis des extrémités opposées, l&amp;#39;une standardise le numéro de version et l&amp;#39;autre
l&amp;#39;entrée qui l&amp;#39;explique.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Chaque entrée de changelog a-t-elle besoin d&amp;#39;un numéro de version ?&lt;/strong&gt;
Si le produit livre des versions, oui, parce que le chiffre permet à une lectrice de sauter
directement à « à quel point cela me concerne » sans lire l&amp;#39;entrée d&amp;#39;abord. Si le produit déploie
en continu sans champ de version, la formulation de l&amp;#39;entrée doit porter ce signal seule.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre un saut MAJOR et une entrée de changement incompatible ?&lt;/strong&gt;
Ils devraient décrire le même événement sous deux formes. Le numéro de version est le signal
lisible par machine (l&amp;#39;outillage d&amp;#39;une appelante peut y réagir) ; l&amp;#39;entrée de changelog est
l&amp;#39;explication lisible par un humain de ce qui a concrètement changé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une release PATCH peut-elle être incompatible ?&lt;/strong&gt;
Par définition, non. Si une telle release est sortie quand même, ne modifiez pas et ne re-taguez pas
la version publiée : la &lt;a href=&quot;https://semver.org/#what-do-i-do-if-i-accidentally-release-a-backward-incompatible-change-as-a-minor-version&quot;&gt;FAQ SemVer&lt;/a&gt;
recommande de publier une nouvelle version qui rétablit la compatibilité, ou une nouvelle MAJOR si
la rupture reste, et de documenter la version fautive pour que les utilisateurs sachent l&amp;#39;éviter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les changements purement internes ont-ils besoin d&amp;#39;un saut de version ?&lt;/strong&gt;
Non. Le semantic versioning suit l&amp;#39;interface publique. Un refactoring sans effet observable pour
une appelante n&amp;#39;a besoin ni de saut ni d&amp;#39;entrée de changelog, même s&amp;#39;il représentait un travail
d&amp;#39;ingénierie important.&lt;/p&gt;
</content:encoded></item><item><title>L&apos;en-tête sunset d&apos;API, et quand l&apos;envoyer</title><link>https://changeloop.dev/blog/fr/sunsetting-api-version/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/sunsetting-api-version/</guid><description>L&apos;en-tête sunset d&apos;API dit quand une version cessera de répondre, à la différence d&apos;une dépréciation. Ce que couvre la RFC 8594, ce qu&apos;apporte un brownout.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;Sunset&lt;/code&gt; est un en-tête de réponse unique, défini dans la &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc8594&quot;&gt;RFC 8594&lt;/a&gt;,
qui indique à un appelant quand une ressource va cesser de répondre. &lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;Dépréciation d&amp;#39;API&lt;/a&gt;
couvre le calendrier complet annonce-rappel-brownout-retrait et les avis qui l&amp;#39;accompagnent ; ceci
concerne le seul signal lisible par machine dans ce calendrier, ce qu&amp;#39;il dit réellement, et le seul
cas où la RFC elle-même dit de ne pas l&amp;#39;envoyer.&lt;/p&gt;
&lt;h2&gt;Que dit l&amp;#39;en-tête Sunset, et que ne dit-il pas ?&lt;/h2&gt;
&lt;p&gt;Il porte une seule date HTTP, le moment où la ressource devrait cesser de répondre :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Sunset: Sat, 31 Dec 2028 23:59:59 GMT
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La RFC l&amp;#39;appelle un indice, pas une garantie : elle ne promet pas que la ressource continuera de
fonctionner jusqu&amp;#39;à cet horodatage, et elle ne dit rien sur la forme que prendra l&amp;#39;échec ensuite.
Les appelants peuvent recevoir un 4xx, une redirection, ou aucune réponse du tout ; l&amp;#39;en-tête ne
fait pas de distinction. Un horodatage déjà passé signifie « maintenant, ou n&amp;#39;importe quand »
plutôt qu&amp;#39;une erreur dans la valeur. Rien de tout cela n&amp;#39;est imposé par le protocole. Un client qui
ne lit jamais l&amp;#39;en-tête se comporte exactement comme avant, et découvre que la ressource a disparu
de la même façon qu&amp;#39;il l&amp;#39;aurait découvert de toute façon.&lt;/p&gt;
&lt;h2&gt;Quand devriez-vous réellement l&amp;#39;envoyer ?&lt;/h2&gt;
&lt;p&gt;Seulement une fois que la ressource va vraiment cesser de répondre, pas simplement lorsqu&amp;#39;elle
n&amp;#39;est plus le choix recommandé. La RFC est explicite : la dépréciation se déroule en deux étapes,
et le champ d&amp;#39;en-tête Sunset n&amp;#39;appartient qu&amp;#39;à la seconde : l&amp;#39;API reste pleinement opérationnelle
pendant la première étape, l&amp;#39;annonce qu&amp;#39;une version n&amp;#39;est plus préférée, et le champ d&amp;#39;en-tête ne
s&amp;#39;y applique pas. Il s&amp;#39;applique une fois que la version est réellement programmée pour cesser de
répondre.&lt;/p&gt;
&lt;p&gt;Cela correspond directement au calendrier de dépréciation : l&amp;#39;en-tête &lt;code&gt;Deprecation&lt;/code&gt; part dès le
premier jour, à l&amp;#39;étape d&amp;#39;annonce ; &lt;code&gt;Sunset&lt;/code&gt; décrit la date à laquelle l&amp;#39;ancien comportement va
réellement s&amp;#39;arrêter, qui est la même date que &lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;le calendrier en quatre étapes&lt;/a&gt;
appelle le retrait. Envoyer &lt;code&gt;Sunset&lt;/code&gt; dès le premier jour n&amp;#39;est pas une erreur, puisque la date est
déjà fixée à ce moment-là, mais l&amp;#39;envoyer sans avoir aussi annoncé une dépréciation, ou le définir
pour une version que vous ne vous êtes pas réellement engagé à retirer, dit aux appelants quelque
chose que vous n&amp;#39;avez pas encore décidé.&lt;/p&gt;
&lt;h2&gt;Interagit-il avec le cache ?&lt;/h2&gt;
&lt;p&gt;Non, et la RFC le dit directement : &lt;code&gt;Sunset&lt;/code&gt; et le cache HTTP résolvent des problèmes sans rapport
et devraient être lus comme complémentaires, pas comme se recouvrant. Les en-têtes de cache disent
quand une copie en cache peut être réutilisée sans risque ; &lt;code&gt;Sunset&lt;/code&gt; ne dit rien sur l&amp;#39;état actuel
de la ressource, seulement que la ressource elle-même va cesser d&amp;#39;exister. Une réponse peut être
entièrement cacheable jusqu&amp;#39;au moment précis où elle atteint son sunset. N&amp;#39;utilisez pas l&amp;#39;un pour
approximer l&amp;#39;autre, et ne supposez pas qu&amp;#39;un &lt;code&gt;max-age&lt;/code&gt; long annule une date de sunset qui approche,
ni l&amp;#39;inverse.&lt;/p&gt;
&lt;h2&gt;Un seul en-tête peut-il faire disparaître plusieurs endpoints ?&lt;/h2&gt;
&lt;p&gt;L&amp;#39;en-tête s&amp;#39;applique à la ressource qui l&amp;#39;a renvoyé, mais la RFC permet à un service de documenter
une portée plus large : une date Sunset sur la ressource d&amp;#39;accueil d&amp;#39;une API peut être définie pour
signifier que l&amp;#39;API entière disparaît, pas seulement cette URL. Le piège, c&amp;#39;est que ça ne fonctionne
que pour les appelants qui connaissent déjà votre règle de portée. Un appelant qui lit l&amp;#39;en-tête au
pied de la lettre voit un sunset sur la seule ressource qu&amp;#39;il a demandée et rien d&amp;#39;autre, donc une
portée plus large doit être écrite quelque part où un appelant peut la trouver, pas seulement
sous-entendue.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui devrait accompagner l&amp;#39;en-tête ?&lt;/h2&gt;
&lt;p&gt;Un lien vers l&amp;#39;endroit où le retrait est expliqué. La RFC 8594 enregistre sa propre relation de
lien &lt;code&gt;sunset&lt;/code&gt; exactement pour ça : pointer vers une ressource qui décrit la politique de retrait, la
date à venir, ou comment migrer, séparément de l&amp;#39;horodatage brut de l&amp;#39;en-tête.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Sunset: Sat, 31 Dec 2028 23:59:59 GMT
Link: &amp;lt;https://example.com/docs/sunset-policy&amp;gt;; rel=&amp;quot;sunset&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Faire pointer ce lien vers vos propres &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;exemples de changelog&lt;/a&gt; ou une page de
migration dédiée transforme un en-tête que le code client de presque personne n&amp;#39;inspecte en quelque
chose qu&amp;#39;un humain qui va chercher trouve immédiatement. Combinez-le avec la relation
&lt;code&gt;successor-version&lt;/code&gt; des &lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/#which-headers-should-a-deprecated-endpoint-send&quot;&gt;en-têtes de dépréciation&lt;/a&gt;
et un appelant obtient à la fois où aller et ce qui remplace celui-ci, depuis la réponse seule.&lt;/p&gt;
&lt;h2&gt;À quoi ça ressemble de bout en bout ?&lt;/h2&gt;
&lt;p&gt;Disons que &lt;code&gt;v1&lt;/code&gt; disparaît le 1er mars 2027. L&amp;#39;annonce de dépréciation le premier jour ajoute
&lt;code&gt;Deprecation&lt;/code&gt; et &lt;code&gt;Link: rel=&amp;quot;successor-version&amp;quot;&lt;/code&gt; à chaque réponse &lt;code&gt;v1&lt;/code&gt;, selon &lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;les en-têtes de
dépréciation&lt;/a&gt;, mais retient &lt;code&gt;Sunset&lt;/code&gt; jusqu&amp;#39;à ce que la date de retrait
soit vraiment fixée plutôt qu&amp;#39;un espace réservé. Une fois que c&amp;#39;est le cas, chaque réponse &lt;code&gt;v1&lt;/code&gt;
porte :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Deprecation: @1756425600
Sunset: Mon, 01 Mar 2027 00:00:00 GMT
Link: &amp;lt;https://api.example.com/v2/reports&amp;gt;; rel=&amp;quot;successor-version&amp;quot;
Link: &amp;lt;https://example.com/docs/sunset-policy&amp;gt;; rel=&amp;quot;sunset&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le gateway ou le monitoring d&amp;#39;un appelant peut alerter sur chaque en-tête indépendamment :
&lt;code&gt;Deprecation&lt;/code&gt; dit qu&amp;#39;une version plus récente existe, &lt;code&gt;Sunset&lt;/code&gt; dit que celle-ci a une horloge
dessus. Aucun des deux en-têtes n&amp;#39;a besoin de changer avant le 1er mars ; ce qui change, c&amp;#39;est la
réponse elle-même, le jour J, et pendant les éventuelles fenêtres de brownout planifiées avant.&lt;/p&gt;
&lt;h2&gt;Un brownout change-t-il ce que dit l&amp;#39;en-tête ?&lt;/h2&gt;
&lt;p&gt;La valeur de l&amp;#39;en-tête elle-même n&amp;#39;a pas besoin de bouger pour un brownout planifié : la date de
sunset reste la date de sunset, que la ressource échoue par intermittence avant ou non. Ce qui
change, c&amp;#39;est la réponse, pas l&amp;#39;en-tête. Planifier de courtes fenêtres de &lt;code&gt;410 Gone&lt;/code&gt; dans les
semaines précédant la date annoncée, comme le décrit &lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;Dépréciation d&amp;#39;API&lt;/a&gt;,
est ce qui transforme le premier contact d&amp;#39;un appelant avec l&amp;#39;échec en répétition plutôt qu&amp;#39;en
réalité le jour où la date de l&amp;#39;en-tête arrive.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Des clients HTTP ou outils réels lisent-ils vraiment l&amp;#39;en-tête Sunset ?&lt;/strong&gt;
Rarement, côté client. Sa valeur est surtout pour qui exploite l&amp;#39;infrastructure entre vous et
l&amp;#39;appelant : une passerelle API ou un outil de monitoring que vous configurez pour surveiller
l&amp;#39;en-tête peut alerter votre propre équipe, ou celle d&amp;#39;une partenaire, bien avant que le code de
l&amp;#39;appelant ne le remarque jamais. Traitez-le comme un signal autour duquel vous construisez de
l&amp;#39;outillage, pas comme un signal dont vous pouvez supposer que l&amp;#39;autre côté dispose déjà.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Sunset&lt;/code&gt; est-il la même chose que &lt;code&gt;Cache-Control: max-age&lt;/code&gt; ?&lt;/strong&gt;
Non. &lt;code&gt;max-age&lt;/code&gt; concerne la durée pendant laquelle une copie en cache reste valide ; &lt;code&gt;Sunset&lt;/code&gt;
concerne le moment où la ressource cesse d&amp;#39;exister complètement. Une réponse peut porter un
&lt;code&gt;max-age&lt;/code&gt; court et une date &lt;code&gt;Sunset&lt;/code&gt; à des années de distance, ou l&amp;#39;inverse, et aucun des deux
en-têtes ne contraint l&amp;#39;autre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Puis-je envoyer Sunset pour un seul champ qui disparaît, pas tout l&amp;#39;endpoint ?&lt;/strong&gt;
Non, l&amp;#39;en-tête est limité à la ressource, c&amp;#39;est-à-dire l&amp;#39;URL, pas à un champ à l&amp;#39;intérieur du corps
de sa réponse. Pour un champ, un paramètre ou une valeur d&amp;#39;énumération qui disparaît alors que
l&amp;#39;endpoint lui-même reste actif, utilisez plutôt l&amp;#39;en-tête &lt;code&gt;Deprecation&lt;/code&gt; et une entrée de
changelog ; &lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;Dépréciation d&amp;#39;API&lt;/a&gt; couvre l&amp;#39;annonce de ce type de
changement précisément.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et si la date de sunset doit bouger ?&lt;/strong&gt;
Mettez à jour la valeur de l&amp;#39;en-tête et dites-le dans l&amp;#39;entrée de changelog qui l&amp;#39;avait annoncée en
premier lieu ; changer silencieusement une date publiée est la façon dont un appelant décide
qu&amp;#39;aucune de vos dates n&amp;#39;est réelle. La RFC présente la valeur comme un indice précisément parce
que les dates bougent parfois, mais une date déplacée sans explication vous coûte la suivante
aussi.&lt;/p&gt;
</content:encoded></item><item><title>Changelogs de webhooks : le changement cassant non demandé</title><link>https://changeloop.dev/blog/fr/webhook-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/webhook-changelog/</guid><description>Un changement de payload de webhook casse en silence, car personne ne peut le rejeter. Ce qui rend ce changement cassant, et comment le versionner.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un changelog d&amp;#39;API REST existe parce qu&amp;#39;un appelant peut choisir de rejeter une réponse qu&amp;#39;il ne
comprend pas, ou au moins enregistrer une erreur assez bruyante pour que quelqu&amp;#39;un le remarque. Un
récepteur de webhook fait rarement l&amp;#39;un ou l&amp;#39;autre. Il reçoit un POST, lit les champs qu&amp;#39;il
attend, et si un champ a bougé, changé de type ou disparu, l&amp;#39;endpoint plante soit silencieusement
dans une tâche en arrière-plan que personne ne surveille, soit, pire, continue de tourner avec une
valeur fausse qu&amp;#39;il n&amp;#39;a jamais validée. &lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;Qu&amp;#39;est-ce qu&amp;#39;un changement
cassant&lt;/a&gt; couvre la définition générale ; un payload de webhook a
besoin de sa propre réponse, parce que le mode d&amp;#39;échec est différent de celui d&amp;#39;un endpoint que
quelqu&amp;#39;un appelle exprès.&lt;/p&gt;
&lt;h2&gt;Pourquoi un changement de payload de webhook casse-t-il différemment d&amp;#39;un changement de réponse d&amp;#39;API ?&lt;/h2&gt;
&lt;p&gt;Parce que le sens de la requête est inversé. Un appelant REST initie l&amp;#39;appel et peut ajouter un
en-tête de version, réessayer sur un 4xx, ou lire un avis de dépréciation dans la réponse. Un
récepteur de webhook n&amp;#39;a initié aucune de ces choses : votre serveur a décidé d&amp;#39;envoyer, a décidé
quand, et a décidé de la forme du corps. Le seul levier du récepteur est la validation qu&amp;#39;il a
écrite quand l&amp;#39;intégration a été construite, et la plupart des intégrations sont construites une
fois, fonctionnent, et ne sont jamais revues jusqu&amp;#39;à ce qu&amp;#39;elles cassent. Cette asymétrie est toute
la raison pour laquelle un changement de payload de webhook mérite plus de prudence que le même
changement dans un corps de réponse qu&amp;#39;un appelant a activement demandé.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui compte vraiment comme changement cassant dans un payload de webhook ?&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Changement&lt;/th&gt;
&lt;th&gt;Cassant pour la plupart des récepteurs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Ajouter un nouveau champ&lt;/td&gt;
&lt;td&gt;Non, si les récepteurs ignorent les champs inconnus (vérifiez cette hypothèse, ne la supposez pas)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supprimer un champ&lt;/td&gt;
&lt;td&gt;Oui, si quelque chose le lit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Renommer un champ&lt;/td&gt;
&lt;td&gt;Oui, fonctionnellement identique à supprimer l&amp;#39;ancien&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changer le type d&amp;#39;un champ (chaîne vers objet)&lt;/td&gt;
&lt;td&gt;Oui, presque toujours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Réordonner les champs dans le corps JSON&lt;/td&gt;
&lt;td&gt;Non, pour tout récepteur qui parse par clé, ce qui devrait être tous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changer le nom ou le type d&amp;#39;événement&lt;/td&gt;
&lt;td&gt;Oui, si les récepteurs filtrent ou routent dessus&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La ligne « ajouter un champ est sûr » est celle sur laquelle les équipes s&amp;#39;appuient le plus et
celle qu&amp;#39;il vaut le mieux vérifier plutôt que supposer. Un parser JSON permissif ignore les champs
inconnus par défaut, mais un récepteur qui désérialise dans un schéma strict, plusieurs langages
typés le font sans configuration supplémentaire, peut rejeter tout le payload dès qu&amp;#39;un champ
inattendu apparaît. Ajouter un champ n&amp;#39;est sûr pour votre webhook que si vous savez comment les
récepteurs parsent, pas parce que JSON en soi est permissif.&lt;/p&gt;
&lt;h2&gt;Comment versionner un payload de webhook ?&lt;/h2&gt;
&lt;p&gt;À peu près comme pour une réponse d&amp;#39;API, avec une nuance : le récepteur n&amp;#39;envoie jamais de
requête, il ne peut donc pas demander de version, et c&amp;#39;est l&amp;#39;émetteur qui doit l&amp;#39;indiquer. Elle
peut aller dans le corps ou dans un en-tête de requête de la livraison elle-même ;
&lt;a href=&quot;https://docs.github.com/en/webhooks/webhook-events-and-payloads&quot;&gt;les livraisons de GitHub&lt;/a&gt;
portent &lt;code&gt;X-GitHub-Event&lt;/code&gt; et &lt;code&gt;X-GitHub-Hook-ID&lt;/code&gt;, et la
&lt;a href=&quot;https://github.com/standard-webhooks/standard-webhooks/blob/main/spec/standard-webhooks.md&quot;&gt;spécification Standard Webhooks&lt;/a&gt;
place ses métadonnées dans des en-têtes &lt;code&gt;webhook-*&lt;/code&gt;. Un champ de version dans le payload (&lt;code&gt;&amp;quot;payload_version&amp;quot;: 2&lt;/code&gt;) est
l&amp;#39;option la moins chère et fonctionne quand les récepteurs sont prêts à brancher dessus. Un type
d&amp;#39;événement versionné (&lt;code&gt;invoice.updated&lt;/code&gt; devient &lt;code&gt;invoice.updated.v2&lt;/code&gt; comme un événement distinct
auquel un récepteur s&amp;#39;abonne volontairement) demande plus de travail à construire mais signifie
que l&amp;#39;ancienne forme continue d&amp;#39;arriver à qui n&amp;#39;a jamais migré, ce qui compte plus ici que pour un
endpoint REST parce que vous ne pouvez pas appeler chaque récepteur pour lui dire de mettre à
jour. Un réglage par abonnement, choisi à l&amp;#39;enregistrement de l&amp;#39;endpoint du webhook, anticipe la
décision au lieu de brancher à chaque livraison, et c&amp;#39;est le bon choix quand vous avez déjà un
enregistrement d&amp;#39;abonnement auquel l&amp;#39;attacher.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST /endpoint-recepteur
{
  &amp;quot;event&amp;quot;: &amp;quot;invoice.updated&amp;quot;,
  &amp;quot;payload_version&amp;quot;: 2,
  &amp;quot;data&amp;quot;: { &amp;quot;invoice_id&amp;quot;: &amp;quot;inv_123&amp;quot;, &amp;quot;status&amp;quot;: &amp;quot;paid&amp;quot; }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Comment savez-vous même qui écoute ?&lt;/h2&gt;
&lt;p&gt;Pire que la version équivalente de ce problème dans un changelog d&amp;#39;API, parce qu&amp;#39;un webhook n&amp;#39;a
pas de journal de requêtes entrantes de votre côté qui nomme l&amp;#39;appelant ; vous n&amp;#39;avez que votre
propre journal de livraison sortante, qui vous dit qu&amp;#39;un endpoint a reçu un 200, pas ce qu&amp;#39;il a
fait du corps. Suivez au minimum deux choses : chaque endpoint enregistré avec une responsable, la
même discipline que &lt;a href=&quot;https://changeloop.dev/blog/fr/internal-api-changelog/&quot;&gt;les changelogs d&amp;#39;API interne&lt;/a&gt; recommandent
pour les consommateurs internes, et votre taux d&amp;#39;échec de livraison par endpoint après un
changement de payload. Un pic de réponses 4xx ou 5xx d&amp;#39;un endpoint juste après un changement est
ce qui se rapproche le plus d&amp;#39;une stack trace que vous obtiendrez, et c&amp;#39;est souvent le seul signal
qu&amp;#39;un récepteur a cassé, parce que l&amp;#39;équipe qui l&amp;#39;exploite peut mettre des jours à le remarquer.&lt;/p&gt;
&lt;h2&gt;Un changelog de webhooks devrait-il être séparé du changelog d&amp;#39;API ?&lt;/h2&gt;
&lt;p&gt;Une section séparée sur la même page, pas une publication séparée.
&lt;a href=&quot;https://changeloop.dev/blog/fr/api-changelog/&quot;&gt;Un changelog d&amp;#39;API&lt;/a&gt; établit déjà qui le lit et comment on s&amp;#39;y abonne ;
un changement de payload de webhook appartient au même flux, étiqueté avec assez de clarté pour
qu&amp;#39;une développeuse côté récepteur qui scanne pour « est-ce que ça affecte mon intégration »
puisse le filtrer, parce qu&amp;#39;une consommatrice de webhook n&amp;#39;a souvent aucune autre raison de
vérifier un changelog d&amp;#39;API général et ne le trouvera que si quelqu&amp;#39;un l&amp;#39;y renvoie directement.&lt;/p&gt;
&lt;h2&gt;À quoi devrait ressembler une fenêtre de dépréciation raisonnable pour un payload de webhook ?&lt;/h2&gt;
&lt;p&gt;Plus longue que la dépréciation REST équivalente, parce que la migration côté récepteur signifie
généralement qu&amp;#39;une deuxième équipe, avec qui vous n&amp;#39;avez peut-être pas de contact direct, doit le
remarquer, le planifier et le livrer sans urgence propre. Un mois est un minimum raisonnable pour
un champ que le récepteur parse probablement encore avec une bibliothèque permissive ; trois mois
ou plus sont plus sûrs pour une suppression de champ qu&amp;#39;un schéma strict rejetterait complètement.
Envoyez l&amp;#39;ancienne et la nouvelle forme ensemble pendant la fenêtre quand c&amp;#39;est faisable (l&amp;#39;ancien
champ &lt;code&gt;status&lt;/code&gt; et son remplaçant de la version 2 dans le même payload), parce qu&amp;#39;un
récepteur qui lit l&amp;#39;ancien champ continue de fonctionner sans toucher à son code, et un qui a déjà
migré ignore simplement le champ dont il n&amp;#39;a plus besoin.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les consommateurs de webhooks doivent-ils accuser réception d&amp;#39;un changement de payload avant sa mise en ligne ?&lt;/strong&gt;
Aucun mécanisme d&amp;#39;accusé de réception n&amp;#39;existe par défaut, et c&amp;#39;est exactement pourquoi la fenêtre
de dépréciation compte plus ici que pour une API REST : personne ne confirme être prêt, donc la
fenêtre doit être assez longue pour que la plupart des récepteurs migrent à leur propre rythme
avant que l&amp;#39;ancienne forme disparaisse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Est-il jamais sûr d&amp;#39;ajouter des champs inconnus sans préavis ?&lt;/strong&gt;
Seulement une fois que vous avez vérifié, pas supposé, que vos récepteurs parsent de façon
permissive. Une entrée de changelog coûte peu et enlève l&amp;#39;incertitude ; ajouter des champs en
silence en supposant que « les parsers JSON ignorent les extras » casse tout récepteur avec une
désérialisation stricte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quel est le moyen le plus rapide de détecter un récepteur de webhook cassé après un changement de payload ?&lt;/strong&gt;
Un taux d&amp;#39;échec de livraison par endpoint, observé dans les heures juste après le changement. Cela
ne vous dira pas ce qui a cassé, seulement que quelque chose a cassé, mais c&amp;#39;est le signal le plus
précoce et souvent le seul que vous obtiendrez.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;La logique de retry aide-t-elle les récepteurs à survivre à un changement de payload ?&lt;/strong&gt;
Non. Un retry renvoie le même nouveau payload ; il ne revient pas à une forme que le récepteur peut
parser. Un changement de payload casse un récepteur à la première livraison et à chaque retry
suivant de façon identique.&lt;/p&gt;
</content:encoded></item><item><title>Changelog : définition et exemple d&apos;entrée</title><link>https://changeloop.dev/blog/fr/what-is-a-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/what-is-a-changelog/</guid><description>Un changelog est le registre daté des changements d&apos;un produit. Un exemple d&apos;entrée, la différence avec les release notes et le commit log, et où publier.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un changelog est le registre daté de ce qui a changé dans un produit, écrit pour les personnes
que le changement concerne, pas pour l&amp;#39;équipe qui l&amp;#39;a livré. Chaque entrée nomme un changement,
dit quand il a pris effet, et dit ce que la lectrice doit en faire, ce qui, pour la plupart des
entrées, est rien. C&amp;#39;est cette dernière partie qui distingue un changelog d&amp;#39;un journal de
commits : un journal de commits est un registre pour ceux qui ont écrit le code, un changelog est
un registre pour ceux qui l&amp;#39;utilisent.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;un changelog, exactement ?&lt;/h2&gt;
&lt;p&gt;Une liste d&amp;#39;entrées datées, la plus récente en premier, chacune décrivant un seul changement en
des termes que la lectrice peut vérifier. Pas ce que l&amp;#39;équipe a construit, mais ce qui est
différent maintenant. « Refactoring du service de facturation » est un message de commit. « Les
factures affichent désormais la taxe sur une ligne séparée » est une entrée de changelog, parce
qu&amp;#39;elle dit à la lectrice quelque chose qu&amp;#39;elle peut vérifier sur son propre compte.&lt;/p&gt;
&lt;p&gt;Le format est ancien et volontairement simple : un titre par release ou par jour, une courte
liste en dessous, parfois une étiquette de catégorie. &lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;
est la spécification la plus citée pour cette forme, et elle existe parce que la plupart des
projets qui font l&amp;#39;impasse sur une spécification finissent par déverser leur historique de
commits à la place, ce qui répond à une question différente de celle avec laquelle la lectrice
est arrivée.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Document&lt;/th&gt;
&lt;th&gt;Écrit pour&lt;/th&gt;
&lt;th&gt;Répond à&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Changelog&lt;/td&gt;
&lt;td&gt;Quiconque utilise le produit&lt;/td&gt;
&lt;td&gt;Qu&amp;#39;est-ce qui a changé, et quand ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Journal de commits&lt;/td&gt;
&lt;td&gt;L&amp;#39;équipe qui a écrit le code&lt;/td&gt;
&lt;td&gt;Qu&amp;#39;est-ce qui a été fait, dans quel ordre ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notes de version&lt;/td&gt;
&lt;td&gt;Utilisatrices décidant de mettre à jour&lt;/td&gt;
&lt;td&gt;Que puis-je faire maintenant que je ne pouvais pas ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notes de patch&lt;/td&gt;
&lt;td&gt;Joueuses ou utilisatrices d&amp;#39;un correctif précis&lt;/td&gt;
&lt;td&gt;Qu&amp;#39;est-ce que cette release a corrigé ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roadmap&lt;/td&gt;
&lt;td&gt;Quiconque se demande ce qui arrive ensuite&lt;/td&gt;
&lt;td&gt;Qu&amp;#39;est-ce qui est prévu, et où ça en est ?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Les cinq se recoupent en pratique, mais ce ne sont pas les mêmes documents, et la différence
tient à qui les tient en main au moment de les lire. Un changelog est celui construit pour être
recherché et lié plus tard, d&amp;#39;où le besoin de dates et d&amp;#39;URL stables plus que les autres.&lt;/p&gt;
&lt;h2&gt;Que contient vraiment une entrée de changelog ?&lt;/h2&gt;
&lt;p&gt;Quatre choses, dans cet ordre : ce qui a changé, formulé en termes de ce que l&amp;#39;utilisatrice ou
l&amp;#39;appelante remarquerait ; quand cela a pris effet ; à quelle catégorie cela appartient (added,
fixed, changed, removed sont les quatre courantes) ; et, quand cela compte, ce que la lectrice
doit faire. Un lien vers plus de détails est bienvenu. Un paragraphe de justification interne ne
l&amp;#39;est pas, parce que la lectrice n&amp;#39;a pas demandé pourquoi, elle a demandé quoi.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 2026-09-07

### Added
- Les factures affichent désormais la taxe sur une ligne séparée, dans
  la devise du compte du client.

### Fixed
- Exporter un rapport en CSV ne supprime plus la dernière ligne quand
  le rapport dépasse 10 000 lignes.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette forme passe d&amp;#39;une mise à jour de deux lignes à cent entrées dans une release sans changer
de structure, et c&amp;#39;est le vrai test pour savoir si un format fonctionne : se lit-il de la même
façon une semaine chargée et une semaine calme.&lt;/p&gt;
&lt;h2&gt;Qui écrit un changelog, et quand ?&lt;/h2&gt;
&lt;p&gt;Celle qui a fait le changement, au moment où il est livré, pas une rédactrice technique qui le
reconstitue à partir de tickets une semaine plus tard. Celle qui a touché le code sait ce qui a
vraiment changé pour l&amp;#39;utilisatrice ; un résumé écrit après coup tend à décrire le ticket plutôt
que ce qui a réellement été livré, ce qui est souvent plus large ou plus étroit que la réalité.
Certaines équipes ajoutent une étape de relecture avant qu&amp;#39;une entrée devienne publique, surtout
pour intercepter le langage interne qui s&amp;#39;est glissé dedans, et cette relecture doit être assez
rapide pour que l&amp;#39;entrée sorte le jour même.&lt;/p&gt;
&lt;h2&gt;Où un changelog doit-il vivre ?&lt;/h2&gt;
&lt;p&gt;Sur sa propre page, à une URL stable, diffusé en flux. Enterré dans un menu de paramètres ou une
étiquette de release sur un hébergeur de code, il n&amp;#39;atteint que ceux qui savaient déjà où
regarder. Une page publique peut être liée depuis un ticket de support, citée dans un avis, ou
suivie. Le flux compte autant que la page : une lectrice qui vérifie le changelog d&amp;#39;un produit
une fois par mois est rare, une qui s&amp;#39;y abonne ne l&amp;#39;est pas, et seul le flux sert la seconde.&lt;/p&gt;
&lt;h2&gt;En quoi diffère-t-il des notes de version ?&lt;/h2&gt;
&lt;p&gt;Les deux sont constamment confondus, et suffisamment différents pour que les mélanger produise un
document qui ne sert bien ni l&amp;#39;une ni l&amp;#39;autre lectrice. &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-vs-release-notes/&quot;&gt;Changelog vs notes de version&lt;/a&gt;
parcourt la distinction en entier ; en bref, un changelog est le registre complet et
chronologique, et les notes de version sont un sous-ensemble sélectionné, écrit pour qu&amp;#39;une mise
à jour paraisse mériter d&amp;#39;être adoptée. Un produit a généralement besoin des deux, adressés à des
moments différents de la journée de la lectrice.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui rend un changelog digne d&amp;#39;être lu ?&lt;/h2&gt;
&lt;p&gt;La précision et l&amp;#39;honnêteté sur sa propre portée. « Divers correctifs » est la phrase qui apprend
à une lectrice à cesser d&amp;#39;ouvrir la page, parce qu&amp;#39;elle ne promet rien de vérifiable. Une entrée
qui nomme le comportement exact qui a changé, même pour un petit correctif, est celle qui
maintient un abonnement en vie. Cette discipline vaut aussi pour ce qu&amp;#39;on omet : un changelog qui
n&amp;#39;annonce que des réussites, et jamais un correctif pour quelque chose qui était cassé, se lit
comme du marketing déguisé en changelog, et les lectrices le remarquent.&lt;/p&gt;
&lt;p&gt;La discipline de versionnage compte aussi. &lt;a href=&quot;https://changeloop.dev/blog/fr/semantic-versioning-changelog/&quot;&gt;Semantic versioning et votre changelog&lt;/a&gt;
explique comment le numéro de version et l&amp;#39;entrée devraient concorder, pour qu&amp;#39;une lectrice qui
parcourt l&amp;#39;historique des versions reçoive le même signal deux fois plutôt que deux signaux
différents.&lt;/p&gt;
&lt;h2&gt;Comment les changelogs sont-ils générés ?&lt;/h2&gt;
&lt;p&gt;De deux façons, et la plupart des configurations réelles sont un mélange. La génération
automatisée lit les messages de commit, généralement au format &lt;a href=&quot;https://www.conventionalcommits.org/en/v1.0.0/&quot;&gt;Conventional Commits&lt;/a&gt;,
et les transforme en entrées sans que personne ne touche à la sortie ; &lt;a href=&quot;https://changeloop.dev/blog/fr/conventional-commits-changelog/&quot;&gt;des conventional commits au changelog&lt;/a&gt;
couvre ce pipeline. La génération sélectionnée signifie que quelqu&amp;#39;un écrit ou modifie chaque
entrée à la main. La sortie automatisée est plus rapide et ne rate jamais une pull request
fusionnée, mais hérite mot pour mot de chaque message de commit vague, donc la plupart des
équipes qui automatisent gardent quand même une relecture légère avant de publier plutôt que de
montrer la sortie brute.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Tout produit a-t-il besoin d&amp;#39;un changelog ?&lt;/strong&gt;
Tout produit avec des utilisatrices concernées par le changement en a besoin, que ce soit une
application SaaS, un outil interne ou une API publique. La forme s&amp;#39;adapte (un changelog d&amp;#39;API se
lit différemment de celui d&amp;#39;une application grand public), le besoin non.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qu&amp;#39;est-ce qu&amp;#39;un changelog en termes logiciels ?&lt;/strong&gt;
La même définition que ci-dessus : une liste datée et chronologique de ce qui a changé dans le
logiciel, écrite pour ceux qui l&amp;#39;utilisent, pas pour ceux qui l&amp;#39;ont construit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un changelog peut-il être généré automatiquement à partir des commits ?&lt;/strong&gt;
Oui, et de nombreuses équipes font exactement cela, généralement à partir de messages au format
Conventional Commits. Le compromis est qu&amp;#39;une entrée générée est aussi claire que le message de
commit dont elle provient, donc une relecture avant publication intercepte celles à reformuler.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un changelog est-il la même chose qu&amp;#39;un historique des versions ?&lt;/strong&gt;
Assez proche pour que les termes soient utilisés de façon interchangeable. Un historique des
versions n&amp;#39;est parfois qu&amp;#39;une liste de numéros et de dates sans description ; un changelog inclut
toujours ce qui a changé.&lt;/p&gt;
</content:encoded></item><item><title>Changelog d&apos;API : quoi publier et qui le lit</title><link>https://changeloop.dev/blog/fr/api-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/api-changelog/</guid><description>Un changelog d&apos;API est lu par des gens qui décident si leur code marchera encore le mois prochain. Ce que doit chaque entrée, où il vit, comment suivre.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un changelog d&amp;#39;API est le registre daté de chaque changement qu&amp;#39;un appelant pourrait remarquer,
écrit pour ceux qui intègrent l&amp;#39;API plutôt que pour l&amp;#39;équipe qui la livre. Ce public en fait un
document différent d&amp;#39;un changelog produit : le lecteur décide si son code fonctionnera encore le
mois prochain. La plupart échouent de la même façon, en étant une copie filtrée d&amp;#39;un flux interne de
releases, si bien qu&amp;#39;un champ supprimé se retrouve à côté d&amp;#39;une correction de texte avec le même
poids, et aucun des deux n&amp;#39;est lu.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;un changelog d&amp;#39;API ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est le registre public et daté des changements apportés à une interface contre laquelle d&amp;#39;autres
ont écrit du code. Le test utile pour savoir si quelque chose y a sa place n&amp;#39;a rien à voir avec
l&amp;#39;ampleur du changement en interne. Il demande si un appelant correct, écrit l&amp;#39;an dernier et jamais
retouché depuis, pourrait se comporter différemment à cause de lui. Ce test admet certains
changements très petits et exclut certains très gros.&lt;/p&gt;
&lt;p&gt;Tout ce qui suit suppose que l&amp;#39;appelant est extérieur à l&amp;#39;entreprise et effectivement injoignable
autrement que via ce document. Quand l&amp;#39;appelant est une autre équipe de la même entreprise, le
calcul change assez pour mériter son propre traitement ;
&lt;a href=&quot;https://changeloop.dev/blog/fr/internal-api-changelog/&quot;&gt;changelogs d&amp;#39;API interne&lt;/a&gt; couvre ce dont ce public a besoin à
la place.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Document&lt;/th&gt;
&lt;th&gt;Public&lt;/th&gt;
&lt;th&gt;Répond à&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Changelog d&amp;#39;API&lt;/td&gt;
&lt;td&gt;Développeurs qui appellent l&amp;#39;API&lt;/td&gt;
&lt;td&gt;Mon intégration fonctionne-t-elle encore ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notes de version&lt;/td&gt;
&lt;td&gt;Utilisateurs du produit&lt;/td&gt;
&lt;td&gt;Que puis-je faire maintenant que je ne pouvais pas ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avis de dépréciation&lt;/td&gt;
&lt;td&gt;Appelants d&amp;#39;une chose précise&lt;/td&gt;
&lt;td&gt;Quand cela cessera-t-il de fonctionner ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page de statut&lt;/td&gt;
&lt;td&gt;Quiconque est touché maintenant&lt;/td&gt;
&lt;td&gt;Est-ce en panne en ce moment ?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guide de migration&lt;/td&gt;
&lt;td&gt;Appelants qui migrent&lt;/td&gt;
&lt;td&gt;Comment passer de A à B ?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;a href=&quot;https://changeloop.dev/blog/fr/api-migration-guide/&quot;&gt;Comment écrire un guide de migration d&amp;#39;API&lt;/a&gt; couvre ce dernier
document en entier ; en bref, c&amp;#39;est ce vers quoi une entrée de changement incompatible devrait
renvoyer plutôt que d&amp;#39;essayer de le remplacer.&lt;/p&gt;
&lt;p&gt;Les cinq sont des documents séparés avec des cycles de vie séparés. Un avis de dépréciation est
une promesse avec une date, et il appartient aussi au changelog, mais une entrée de changelog
s&amp;#39;écrit une fois tandis qu&amp;#39;une dépréciation se suit jusqu&amp;#39;à son sunset. Les confondre est la raison
pour laquelle les sunsets sont manqués.&lt;/p&gt;
&lt;h2&gt;Que doit contenir une entrée ?&lt;/h2&gt;
&lt;p&gt;Six choses, et les trois premières sont celles qui manquent le plus souvent. Le changement, formulé
en termes de requête ou de réponse plutôt que du composant interne. S&amp;#39;il casse un appelant correct.
Ce que l&amp;#39;appelant doit faire, y compris &amp;quot;rien&amp;quot;. La date de prise d&amp;#39;effet. La ou les versions
concernées. Un lien vers le guide de migration s&amp;#39;il en existe un.&lt;/p&gt;
&lt;p&gt;Une entrée qui dit &amp;quot;amélioration de l&amp;#39;endpoint comptes&amp;quot; échoue sur les six. Une entrée qui dit &amp;quot;le
champ &lt;code&gt;accounts.type&lt;/code&gt; retourne désormais &lt;code&gt;individual&lt;/code&gt; là où il retournait &lt;code&gt;personal&lt;/code&gt; ; les valeurs
existantes restent inchangées pour les comptes créés avant le 2 septembre ; aucune action requise
sauf si vous comparez la chaîne&amp;quot; répond aux six en une phrase.&lt;/p&gt;
&lt;p&gt;Classez les entrées par conséquence, pas par équipe. Trois étiquettes portent presque toute la
valeur : breaking, additive et fixed. &lt;a href=&quot;https://semver.org/&quot;&gt;Semantic Versioning&lt;/a&gt; définit déjà
précisément les deux premières, et emprunter ses définitions plutôt qu&amp;#39;en inventer d&amp;#39;autres
signifie qu&amp;#39;un lecteur qui connaît semver connaît vos étiquettes. &lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;
en propose un jeu plus large si vous le voulez, et sa règle centrale s&amp;#39;applique ici plus fortement
que partout ailleurs : le journal est écrit pour des humains, et un déversement de titres de commit
n&amp;#39;en est pas un.&lt;/p&gt;
&lt;h2&gt;En quoi un changelog d&amp;#39;API diffère-t-il des notes de version ?&lt;/h2&gt;
&lt;p&gt;Les notes de version décrivent ce que le produit peut faire désormais. Un changelog d&amp;#39;API décrit
quel est désormais le contrat. Le même travail livré produit souvent une entrée dans les deux,
rédigée différemment, car les publics ont besoin de choses différentes : un nouveau format
d&amp;#39;export est une fonctionnalité pour un utilisateur et une nouvelle valeur d&amp;#39;enum pour un appelant
qui teste ce champ.&lt;/p&gt;
&lt;p&gt;La conséquence pratique est que les deux ne peuvent pas être le même flux avec un style différent.
Un appelant abonné à tout ce que vous livrez finira par se désabonner, et ratera alors le changement
cassant. Si vous publiez un flux, filtrez-le ; si vous en publiez deux, resserrez celui de l&amp;#39;API et
ne laissez jamais une entrée marketing y entrer. Nous comparons les deux formes côte à côte dans
&lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-vs-release-notes/&quot;&gt;changelog vs notes de version&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Où un changelog d&amp;#39;API devrait-il vivre ?&lt;/h2&gt;
&lt;p&gt;À côté de la documentation de référence, sur une URL stable, avec chaque entrée adressable
individuellement via un fragment ou son propre chemin. Les appelants lient des entrées dans des
revues d&amp;#39;incidents et des tickets internes, et une entrée qui ne peut pas être liée finit collée en
capture d&amp;#39;écran à la place.&lt;/p&gt;
&lt;p&gt;Publiez-le aussi en sortie lisible par machine, en plus d&amp;#39;une page. Un flux JSON suivant la
&lt;a href=&quot;https://www.jsonfeed.org/version/1.1/&quot;&gt;spécification JSON Feed&lt;/a&gt; ou un
&lt;a href=&quot;https://www.rssboard.org/rss-specification&quot;&gt;flux RSS&lt;/a&gt; ne coûte rien une fois les entrées
structurées en données, et c&amp;#39;est ce qui permet à un client d&amp;#39;intégrer vos changements dans son
propre processus de release. C&amp;#39;est aussi ce qui décide si quelqu&amp;#39;un construit dessus. GitHub
documente ses &lt;a href=&quot;https://docs.github.com/en/rest/about-the-rest-api/api-versions&quot;&gt;versions de la REST API&lt;/a&gt;
juste à côté de la référence, pour la même raison : la politique de versionnage fait partie de
l&amp;#39;interface.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble une bonne entrée en pratique ?&lt;/h2&gt;
&lt;p&gt;Trois entrées de la même semaine, sous la forme décrite ci-dessus :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2026-09-02  Breaking  v2
  `POST /invoices` rejette désormais une `currency` qui ne correspond
  pas à la devise du compte du client, en retournant 422 au lieu de
  convertir silencieusement. Les appelants qui comptaient sur la
  conversion doivent envoyer la devise du compte. Concerne uniquement
  v2 ; v1 reste inchangée jusqu&amp;#39;à son sunset le 2027-01-15.

2026-09-02  Additive  v1, v2
  `Invoice` gagne un horodatage `settled_at`, null jusqu&amp;#39;au règlement
  de la facture. Aucune action requise. Les clients qui rejettent les
  champs inconnus devraient être mis à jour.

2026-08-31  Fixed  v2
  `GET /invoices?status=` retournait une page vide au lieu d&amp;#39;un 400
  pour un statut inconnu. Retourne désormais 400 avec les valeurs
  acceptées. Les appelants ayant fait une faute de frappe voyaient
  auparavant zéro résultat et voient désormais une erreur.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La troisième est le type le plus souvent omis, car en interne c&amp;#39;est une correction de bug. Pour un
appelant qui a construit un retry autour de cette page vide, c&amp;#39;est un changement de comportement, et
l&amp;#39;entrée est ce qui évite le ticket de support. L&amp;#39;étiquette dit fixed et le corps dit ce qu&amp;#39;un
appelant pourrait remarquer, ce qui est la distinction qui garde le journal honnête sans gonfler
chaque correction en changement cassant.&lt;/p&gt;
&lt;h2&gt;Comment les appelants s&amp;#39;y abonnent-ils ?&lt;/h2&gt;
&lt;p&gt;Donnez-leur plus d&amp;#39;un canal, car ils ont des tâches différentes. Un flux pour le développeur qui
veut tout. Un email pour celui qui ne veut que les changements cassants. Des en-têtes de réponse
pour le code lui-même, le seul abonné qui n&amp;#39;oublie jamais de vérifier : l&amp;#39;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;en-tête &lt;code&gt;Sunset&lt;/code&gt; défini
dans la RFC 8594&lt;/a&gt; place la date de retrait dans la
réponse, où une bibliothèque cliente peut la journaliser.&lt;/p&gt;
&lt;p&gt;Le canal que la plupart des équipes sautent est le direct. Si un appelant a utilisé le champ que
vous changez la semaine dernière, vous savez qui il est, et un email à ces comptes vaut plus que
n&amp;#39;importe quelle diffusion générale. C&amp;#39;est la même discipline que
&lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;fermer la boucle de feedback client&lt;/a&gt;, appliquée à un changement
que personne n&amp;#39;a demandé : les personnes concernées sont averties individuellement, et tous les
autres reçoivent le flux. Un webhook est un
quatrième canal avec son propre mode d&amp;#39;échec à connaître avant de s&amp;#39;y fier :
&lt;a href=&quot;https://changeloop.dev/blog/fr/webhook-changelog/&quot;&gt;les changelogs de webhooks&lt;/a&gt; couvre pourquoi un changement de payload
là-bas casse en silence, sans appelant pour rejeter la nouvelle forme.&lt;/p&gt;
&lt;h2&gt;Comment rédiger une entrée pour un changement cassant ?&lt;/h2&gt;
&lt;p&gt;Commencez par la rupture, pas par la raison. Un appelant qui parcourt dix entrées doit savoir dès
la première phrase si celle-ci va lui coûter du travail. Puis la date, les versions concernées, la
migration, et l&amp;#39;échéance si l&amp;#39;ancien comportement disparaît plutôt que de changer.&lt;/p&gt;
&lt;p&gt;Mettez le même contenu dans l&amp;#39;avis de dépréciation, l&amp;#39;en-tête de réponse et l&amp;#39;email direct,
formulé de façon cohérente, et donnez aux quatre la même date. Un écart entre eux est l&amp;#39;erreur qui
transforme un changement planifié en incident, car l&amp;#39;appelant qui n&amp;#39;a lu que l&amp;#39;un d&amp;#39;eux agit sur la
mauvaise date.
&lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;Qu&amp;#39;est-ce qu&amp;#39;un changement cassant&lt;/a&gt; couvre la décision elle-même, et
&lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;comment déprécier une API&lt;/a&gt; couvre le calendrier qui suit.&lt;/p&gt;
&lt;p&gt;Chez changeloop, un changement d&amp;#39;API devient une entrée quand la pull request est fusionnée, une
personne édite et approuve le brouillon, et l&amp;#39;entrée est publiée sur le &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;flux et le widget&lt;/a&gt;
au moment même où un appelant dont le retour via le widget est devenu l&amp;#39;issue GitHub que la pull
request ferme en est averti sur cette issue. L&amp;#39;étape de relecture est celle qui
compte ici : un changelog d&amp;#39;API est un document contractuel, et aucun brouillon ne devrait
atteindre un appelant sans qu&amp;#39;une personne l&amp;#39;ait lu.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Chaque changement d&amp;#39;API a-t-il besoin d&amp;#39;une entrée de changelog ?&lt;/strong&gt;
Tout changement qu&amp;#39;un appelant correct pourrait remarquer, oui, y compris ceux que vous jugez
internes. Les changements sans effet observable sur la requête ou la réponse non, et les ajouter
entraîne les lecteurs à survoler.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le changelog d&amp;#39;API devrait-il vivre dans la doc ou sur le site marketing ?&lt;/strong&gt;
Dans la doc, juste à côté de la référence. Le lecteur y est déjà la plupart du temps, et un
changelog sur le site marketing tend à gagner un public pour lequel il n&amp;#39;a pas été écrit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jusqu&amp;#39;où devrait-il remonter ?&lt;/strong&gt;
Indéfiniment. Les entrées sont citées des années plus tard dans des revues d&amp;#39;incidents, et un
journal tronqué casse ces liens. Paginez plutôt que d&amp;#39;élaguer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faut-il un changelog séparé par version d&amp;#39;API ?&lt;/strong&gt;
Non, un seul journal avec un champ version par entrée est plus facile à lire et à chercher. Filtrer
par version est une fonctionnalité de la page, pas une raison de scinder le document.&lt;/p&gt;
</content:encoded></item><item><title>Construire une page de changelog que l&apos;on suit</title><link>https://changeloop.dev/blog/fr/changelog-page/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/changelog-page/</guid><description>Une page de changelog vaut la peine quand quelqu&apos;un y revient. Où elle vit, ce dont une entrée a besoin, flux et balisage, et la place du widget.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Une page de changelog vaut la peine d&amp;#39;être construite quand quelqu&amp;#39;un y reviendrait. C&amp;#39;est une
barre plus haute que d&amp;#39;en avoir simplement une, et c&amp;#39;est la barre où échouent la plupart : une page
qui existe, est liée dans le pied de page, se met à jour par rafales et n&amp;#39;est visitée par personne
sauf pendant un incident. Les décisions qui séparent les deux se prennent avant qu&amp;#39;aucun mot ne soit
écrit, et concernent surtout où vit la page et ce qui d&amp;#39;autre est généré à partir du même contenu.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;une page de changelog ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est la liste publique et datée de ce qui a changé dans un produit, sur une URL qui vous appartient.
C&amp;#39;est l&amp;#39;une des cinq surfaces où peuvent apparaître les mêmes entrées, et la question utile n&amp;#39;est pas
laquelle choisir mais laquelle est canonique et lesquelles en sont générées.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;Idéale pour&lt;/th&gt;
&lt;th&gt;Coût&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Page hébergée&lt;/td&gt;
&lt;td&gt;Recherche, liens, le registre long&lt;/td&gt;
&lt;td&gt;Une URL et un modèle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Widget in-app&lt;/td&gt;
&lt;td&gt;Atteindre les utilisateurs qui ne visitent jamais la page&lt;/td&gt;
&lt;td&gt;Un embed, et de la retenue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Section doc&lt;/td&gt;
&lt;td&gt;Public API et développeurs&lt;/td&gt;
&lt;td&gt;La garder à côté de la référence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flux JSON&lt;/td&gt;
&lt;td&gt;Clients qui construisent sur vos changements&lt;/td&gt;
&lt;td&gt;Une structure que vous avez déjà&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flux RSS&lt;/td&gt;
&lt;td&gt;Développeurs qui s&amp;#39;abonnent une fois&lt;/td&gt;
&lt;td&gt;Presque rien&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Choisissez une source canonique, publiez une fois, et générez le reste. Les équipes qui maintiennent
la page et le widget séparément à la main finissent avec deux textes qui ne concordent pas, et c&amp;#39;est
un client qui découvre l&amp;#39;écart.&lt;/p&gt;
&lt;h2&gt;Où une page de changelog devrait-elle vivre ?&lt;/h2&gt;
&lt;p&gt;Sur votre propre domaine, sur un chemin stable, avec chaque entrée adressable individuellement via
un fragment ou son propre chemin. Les trois emplacements courants sont un chemin sur le site
principal, un sous-domaine, et une section de la documentation. Un chemin sur le site principal est
le choix par défaut contre lequel il faut argumenter, pas pour : il hérite de l&amp;#39;autorité du site,
ne nécessite ni certificat ni DNS supplémentaire, et garde la page dans la même navigation que tout
le reste.&lt;/p&gt;
&lt;p&gt;Un sous-domaine est la bonne réponse quand la page est servie par un système différent du site
marketing et que vous feriez sinon du proxy. Le coût est qu&amp;#39;il accumule de l&amp;#39;autorité séparément.
Placer le changelog dans la doc est juste quand le public est développeur, pour la raison couverte
dans &lt;a href=&quot;https://changeloop.dev/blog/fr/api-changelog/&quot;&gt;changelog d&amp;#39;API&lt;/a&gt; : le lecteur y est en général déjà.&lt;/p&gt;
&lt;p&gt;Ce qui compte plus que le choix, c&amp;#39;est que les entrées soient individuellement liables. Les gens
lient des entrées dans des revues d&amp;#39;incidents et des tickets internes, et une entrée qui ne peut
être liée que comme &amp;quot;le changelog, faites défiler&amp;quot; finit collée en capture d&amp;#39;écran à la place.&lt;/p&gt;
&lt;h2&gt;De quoi a besoin une page de changelog ?&lt;/h2&gt;
&lt;p&gt;Cinq choses, et sur les deux premières échouent la plupart des pages. Une entrée datée par
changement, la plus récente en premier. Une catégorie ou étiquette par entrée pour pouvoir parcourir
selon le type qui intéresse. Un permalien par entrée. Une voie d&amp;#39;abonnement. Une recherche ou un
filtre au-delà d&amp;#39;une cinquantaine d&amp;#39;entrées.&lt;/p&gt;
&lt;p&gt;Tout le reste est optionnel. Les captures d&amp;#39;écran aident et coûtent de l&amp;#39;entretien. Les noms
d&amp;#39;auteurs bâtissent la confiance sur certains produits et du bruit sur d&amp;#39;autres. Les numéros de
version comptent pour les appelants d&amp;#39;une API et pour presque personne d&amp;#39;autre. &lt;a href=&quot;https://keepachangelog.com/en/1.1.0/&quot;&gt;Keep a Changelog&lt;/a&gt;
propose un choix par défaut raisonnable pour les étiquettes si vous n&amp;#39;avez pas de raison d&amp;#39;en
inventer, et sa règle centrale est celle à garder même si vous jetez le reste : le journal est
écrit pour des humains.&lt;/p&gt;
&lt;p&gt;Groupez par date plutôt que par version quand votre produit livre en continu. Un lecteur qui scanne
&amp;quot;était-ce avant ou après notre incident du neuf&amp;quot; cherche une date, et une page organisée par numéro
de version l&amp;#39;oblige à faire du calcul.&lt;/p&gt;
&lt;h2&gt;Page ou widget in-app ?&lt;/h2&gt;
&lt;p&gt;Les deux, à partir d&amp;#39;une source. La page est où vivent la recherche, les liens et le registre long.
Le widget est comment vous atteignez la majorité des utilisateurs qui ne visiteront jamais la page,
et il fonctionne parce qu&amp;#39;il apparaît dans le produit qu&amp;#39;ils utilisent déjà.&lt;/p&gt;
&lt;p&gt;L&amp;#39;échec du widget est l&amp;#39;interruption. Un badge qui exige de l&amp;#39;attention pour chaque entrée est
écarté définitivement en une semaine, ce qui vous coûte le canal pour l&amp;#39;entrée qui comptait
vraiment. Comptez les non lues depuis la dernière consultation, semez le compteur en silence à la
première visite pour que personne ne soit accueilli par un badge d&amp;#39;un an d&amp;#39;historique, et laissez
le lecteur l&amp;#39;ouvrir plutôt que de l&amp;#39;ouvrir pour lui.&lt;/p&gt;
&lt;h2&gt;Comment rendre une page de changelog lisible par machine ?&lt;/h2&gt;
&lt;p&gt;Publiez les mêmes entrées comme flux. Un &lt;a href=&quot;https://www.jsonfeed.org/version/1.1/&quot;&gt;flux JSON&lt;/a&gt; est
l&amp;#39;option la plus simple pour tout ce qui le consomme en code, et un
&lt;a href=&quot;https://www.rssboard.org/rss-specification&quot;&gt;flux RSS&lt;/a&gt; est ce qu&amp;#39;attend un développeur abonné dans
un lecteur. Les deux coûtent peu une fois les entrées structurées en données plutôt qu&amp;#39;en HTML écrit
à la main, ce qui est l&amp;#39;argument réel pour garder la copie canonique structurée.&lt;/p&gt;
&lt;p&gt;Balisez aussi la page. Les entrées sont des œuvres avec date et titre, et
&lt;a href=&quot;https://schema.org/CreativeWork&quot;&gt;schema.org&lt;/a&gt; fournit le vocabulaire. Cela en vaut la peine pour la
même raison que les permaliens : cela rend la page utilisable par des choses qui ne sont pas un
navigateur, y compris le propre processus de release d&amp;#39;un client. Rien de tout
ça ne fonctionne si les entrées sous-jacentes n&amp;#39;ont jamais été des données structurées dès le
départ ; &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-file-formats/&quot;&gt;formats de fichier changelog&lt;/a&gt; couvre ce que coûte
chacun de Markdown, JSON et YAML comme source de vérité dont ce flux et ce balisage sont
réellement générés.&lt;/p&gt;
&lt;h2&gt;Une page de changelog aide-t-elle le SEO ?&lt;/h2&gt;
&lt;p&gt;Indirectement et lentement. Les entrées individuelles se positionnent rarement, car elles ne visent
aucune requête que quelqu&amp;#39;un tape. La page gagne sa place via les liens : les entrées sont citées
dans des réponses de support, des forums et des analyses d&amp;#39;incidents, et ces liens s&amp;#39;accumulent sur
une URL qui vous appartient. Une page mise à jour chaque semaine pendant deux ans est aussi un
signal de fraîcheur crédible pour le produit auquel elle appartient.&lt;/p&gt;
&lt;p&gt;Ce qui ne fonctionne pas, c&amp;#39;est de traiter les entrées comme du content marketing. Une entrée
gonflée à trois paragraphes pour l&amp;#39;allonger est pire dans son vrai travail, qui est de dire à un
lecteur en une phrase si quelque chose qu&amp;#39;il utilise a changé. Si vous voulez que le changelog
soutienne la recherche, mettez l&amp;#39;effort dans les permaliens, le flux et les liens internes vers lui,
et gardez les entrées courtes. Notre propre page d&amp;#39;&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;exemples de changelog&lt;/a&gt;
rassemble des pages qui trouvent cet équilibre.&lt;/p&gt;
&lt;h2&gt;Comment les gens s&amp;#39;abonnent-ils ?&lt;/h2&gt;
&lt;p&gt;Donnez-leur les voies qu&amp;#39;ils utilisent déjà : un flux RSS ou JSON pour les développeurs, un email
pour ceux qui ne veulent entendre que les choses importantes, et le widget in-app pour tous ceux qui
ne feront jamais ni l&amp;#39;un ni l&amp;#39;autre. Demandez ce qu&amp;#39;ils veulent entendre plutôt que de le supposer,
car un lecteur qui veut les changements cassants et reçoit des corrections de texte se désabonne des
deux.&lt;/p&gt;
&lt;p&gt;La voie à ajouter en dernier est celle qui ferme la boucle. Quand une entrée résout ce qu&amp;#39;une
personne précise a demandé, dites-le-lui directement plutôt que d&amp;#39;espérer qu&amp;#39;elle lise la page. Chez
changeloop, l&amp;#39;entrée est publiée d&amp;#39;un coup sur la &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;page, le flux et le widget&lt;/a&gt;, et une personne
dont le retour via le widget est devenu l&amp;#39;issue GitHub que la pull request a fermée en est avertie
sur cette issue, avec un lien vers l&amp;#39;entrée, et voit l&amp;#39;entrée dans le widget. Le mécanisme est le même
que n&amp;#39;importe quel abonnement ; la différence est que le destinataire a déjà demandé. C&amp;#39;est
l&amp;#39;argument développé dans &lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;fermer la boucle de feedback depuis le changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;La page de changelog devrait-elle être sur un sous-domaine ou un chemin ?&lt;/strong&gt;
Un chemin sur le site principal par défaut, car il hérite de l&amp;#39;autorité du site et ne nécessite pas
d&amp;#39;infrastructure supplémentaire. Un sous-domaine se justifie quand un système différent sert la
page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combien d&amp;#39;entrées la page devrait-elle montrer à la fois ?&lt;/strong&gt;
Assez pour remplir un écran et pas plus, avec pagination ensuite. Charger deux ans d&amp;#39;historique dans
un document est lent et rend l&amp;#39;entrée la plus récente plus difficile à trouver.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les anciennes entrées devraient-elles jamais être supprimées ?&lt;/strong&gt;
Non. Elles sont citées depuis l&amp;#39;extérieur de votre site et les liens se cassent. Corrigez une
entrée sur place avec une note, et gardez l&amp;#39;URL en vie.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chaque changement doit-il apparaître sur la page ?&lt;/strong&gt;
Seulement ceux qu&amp;#39;un utilisateur pourrait remarquer. Une page qui journalise des refactorisations
internes entraîne les lecteurs à survoler, et une page survolée échoue le jour où elle porte
quelque chose d&amp;#39;urgent.&lt;/p&gt;
</content:encoded></item><item><title>Le modèle d&apos;email de mise à jour produit qu&apos;on lit</title><link>https://changeloop.dev/blog/fr/product-update-email/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/product-update-email/</guid><description>L&apos;email de mise à jour produit qu&apos;on lit est allé à quelqu&apos;un qui l&apos;avait demandé. Un modèle, les quatre types d&apos;emails, bons objets, le consentement.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;L&amp;#39;email de mise à jour produit qu&amp;#39;on lit est celui envoyé à quelqu&amp;#39;un qui a demandé exactement ce
qu&amp;#39;il annonce. Tout le reste rivalise avec le reste de la boîte de réception en intérêt, une
compétition qu&amp;#39;une annonce de release perd la plupart des semaines. Ce seul fait devrait décider de
la forme de l&amp;#39;email avant toute rédaction : qui le reçoit, et ce que cette personne a fait pour se
retrouver sur la liste.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;un email de mise à jour produit ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est un message qui dit aux utilisateurs existants ce qui a changé dans un produit qu&amp;#39;ils utilisent
déjà. Il en existe quatre types distincts, et les traiter comme une seule liste est la raison pour
laquelle les taux d&amp;#39;ouverture déclinent. Chacun a un déclencheur différent, un public différent et
une fréquence acceptable différente.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Déclencheur&lt;/th&gt;
&lt;th&gt;Public&lt;/th&gt;
&lt;th&gt;Fréquence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Notification ciblée&lt;/td&gt;
&lt;td&gt;La demande précise de quelqu&amp;#39;un est livrée&lt;/td&gt;
&lt;td&gt;Une personne&lt;/td&gt;
&lt;td&gt;Chaque fois que ça arrive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avis de changement cassant&lt;/td&gt;
&lt;td&gt;Un changement qui coûte du travail au lecteur&lt;/td&gt;
&lt;td&gt;Comptes concernés seulement&lt;/td&gt;
&lt;td&gt;Chaque fois que ça arrive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Digest&lt;/td&gt;
&lt;td&gt;Le passage du temps&lt;/td&gt;
&lt;td&gt;Utilisateurs opt-in&lt;/td&gt;
&lt;td&gt;Mensuel au maximum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Annonce de lancement&lt;/td&gt;
&lt;td&gt;Un lancement qui mérite une interruption&lt;/td&gt;
&lt;td&gt;Segment ou tous&lt;/td&gt;
&lt;td&gt;Rare, et devrait sembler rare&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La plupart des équipes ne construisent que le troisième, l&amp;#39;envoient à tout le monde, et en
concluent que les emails de mise à jour produit ne fonctionnent pas. Les deux premiers portent
presque toute la valeur, car le lecteur a une raison préalable de s&amp;#39;y intéresser, et le message
arrive pendant que cette raison est vivante.&lt;/p&gt;
&lt;p&gt;Ces quatre lignes sont toutes écrites pour des clientes. Les ventes, le support et le customer
success doivent aussi savoir ce qui est sorti, généralement sous une forme différente de ces
quatre-là ; &lt;a href=&quot;https://changeloop.dev/blog/fr/internal-release-notes/&quot;&gt;notes de release internes&lt;/a&gt; couvre ce que ce
document devrait dire et pourquoi il doit sortir avant la note orientée client.&lt;/p&gt;
&lt;p&gt;L&amp;#39;email est l&amp;#39;un des plusieurs canaux qu&amp;#39;une annonce de lancement peut utiliser, pas le seul. &lt;a href=&quot;https://changeloop.dev/blog/fr/new-feature-announcement/&quot;&gt;Comment annoncer une nouvelle fonctionnalité&lt;/a&gt; couvre les autres, et comment choisir entre eux selon l&amp;#39;ampleur réelle de la fonctionnalité.&lt;/p&gt;
&lt;h2&gt;Que contient le modèle ?&lt;/h2&gt;
&lt;p&gt;Six blocs, dans cet ordre. Le premier est celui qui manque le plus souvent et celui qui fait le
travail.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Objet :  &amp;lt;ce qui a changé, avec les mots du lecteur&amp;gt;

1. Pourquoi vous recevez ceci
   &amp;quot;Vous avez demandé l&amp;#39;export CSV en mars.&amp;quot; ou
   &amp;quot;Votre intégration appelle /v1/invoices, qui change le 15 janvier.&amp;quot;

2. Ce qui a changé
   Une phrase. Ce qui est désormais possible, ou ce qui casse désormais.

3. Ce que vous devez faire
   Souvent &amp;quot;rien&amp;quot;. Dites-le explicitement, ne le laissez pas implicite.

4. Où le voir
   Un lien vers l&amp;#39;entrée du changelog, pas vers la page d&amp;#39;accueil.

5. Quand
   La date de livraison, ou depuis quand cela s&amp;#39;applique.

6. Comment se désabonner
   Un clic, et respecté immédiatement.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le bloc 1 est la différence entre un message et une diffusion générale. Un lecteur à qui l&amp;#39;on dit,
dès la première ligne, que ceci est la résolution de quelque chose qu&amp;#39;il a personnellement demandé,
lit le reste. Sans lui, les blocs 2 à 5 sont une newsletter, quelle que soit la qualité de l&amp;#39;écriture.&lt;/p&gt;
&lt;p&gt;Gardez l&amp;#39;ensemble sous environ 150 mots. L&amp;#39;email est un pointeur vers l&amp;#39;entrée du changelog, et
l&amp;#39;entrée est où va le détail. Un email qui reproduit l&amp;#39;entrée entière ne donne au lecteur aucune
raison de cliquer, et ne vous donne aucun signal sur l&amp;#39;intérêt que cela a suscité.&lt;/p&gt;
&lt;h2&gt;Quels objets fonctionnent ?&lt;/h2&gt;
&lt;p&gt;Nommez le changement, pas la release. &amp;quot;L&amp;#39;export CSV est en ligne&amp;quot; bat &amp;quot;mise à jour de septembre&amp;quot;
parce que le premier est un fait que le lecteur peut évaluer et le second un contenant. Les numéros
de version dans l&amp;#39;objet sont utiles aux appelants d&amp;#39;une API et du bruit pour tous les autres, autre
raison de séparer les publics.&lt;/p&gt;
&lt;p&gt;Évitez d&amp;#39;affirmer un bénéfice auquel le lecteur n&amp;#39;a pas consenti. &amp;quot;Vos rapports sont désormais plus
rapides&amp;quot; affirme quelque chose sur son expérience ; &amp;quot;Les rapports de plus de 10 000 lignes chargent
désormais en moins d&amp;#39;une seconde&amp;quot; rapporte un changement et le laisse décider si cela compte.&lt;/p&gt;
&lt;h2&gt;Quand en envoyer un, et à qui ?&lt;/h2&gt;
&lt;p&gt;Envoyez une notification ciblée au moment où la chose est livrée, aux personnes qui l&amp;#39;ont demandée,
individuellement. Envoyez un avis de changement cassant dès que la date est certaine et à nouveau
juste avant, aux comptes réellement concernés plutôt qu&amp;#39;à toute la liste. Envoyez un digest
seulement si vous avez assez de changements pour qu&amp;#39;un lecteur en rate sinon, et laissez les gens
s&amp;#39;y inscrire séparément.&lt;/p&gt;
&lt;p&gt;La liste que vous ne devriez presque jamais utiliser est &amp;quot;tous les utilisateurs&amp;quot;. Elle transforme un
message précis en un message générique, et entraîne au désabonnement. Segmentez selon un
comportement que vous stockez déjà : qui l&amp;#39;a demandé, qui utilise cet endpoint, qui est sur ce plan.&lt;/p&gt;
&lt;h2&gt;Faut-il un consentement pour l&amp;#39;envoyer ?&lt;/h2&gt;
&lt;p&gt;Pour les clients existants, une mise à jour sur un service qu&amp;#39;ils utilisent est en général une
question juridique différente du marketing envers un prospect, et la réponse dépend d&amp;#39;où ils se
trouvent et de ce que vous leur avez dit à l&amp;#39;inscription. Dans l&amp;#39;UE, la question pertinente est
quelle base légale de l&amp;#39;&lt;a href=&quot;https://gdpr-info.eu/art-6-gdpr/&quot;&gt;article 6 du RGPD&lt;/a&gt; s&amp;#39;applique, et aux
États-Unis les messages commerciaux portent des exigences précises fixées dans le
&lt;a href=&quot;https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business&quot;&gt;guide de conformité CAN-SPAM de la FTC&lt;/a&gt;.
Les deux exigent la même chose en pratique : dites qui vous êtes, précisez l&amp;#39;objet, et laissez les
gens pouvoir arrêter.&lt;/p&gt;
&lt;p&gt;Quelle que soit la base, gardez les flux transactionnel et marketing séparés au niveau de l&amp;#39;envoi.
Un avis de changement cassant qu&amp;#39;un client a désabonné parce qu&amp;#39;il partageait une liste avec un
digest promotionnel est un incident de support qui attend sa date.&lt;/p&gt;
&lt;h2&gt;À quoi cela ressemble-t-il une fois rempli ?&lt;/h2&gt;
&lt;p&gt;La notification ciblée, l&amp;#39;email de mise à jour produit de plus grande valeur et celui que la
plupart des équipes ne construisent jamais :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Objet : L&amp;#39;export CSV est en ligne

Bonjour Dana,

vous avez demandé l&amp;#39;export CSV en mars.

C&amp;#39;est en ligne depuis ce matin. Les rapports ont désormais un
bouton Export qui génère un CSV de la vue actuelle, filtres
inclus.

Rien à faire de votre côté. C&amp;#39;est déjà activé sur votre compte.

  Détails : example.com/changelog#csv-export
  Livré : 2 septembre 2026

Vous recevez ceci parce que vous l&amp;#39;avez demandé. Se désabonner
des mises à jour de demandes : &amp;lt;lien&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Quatre-vingt-dix mots, et le lecteur sait dès la première ligne pourquoi cela est arrivé. Comparez
avec le même changement dans un digest mensuel, où il apparaît comme un point parmi neuf et Dana n&amp;#39;a
aucune raison de remarquer que sa propre demande est sortie.&lt;/p&gt;
&lt;h2&gt;Que devriez-vous mesurer ?&lt;/h2&gt;
&lt;p&gt;Pas le taux d&amp;#39;ouverture seul. Pour une notification ciblée, la question est de savoir si la
personne qui a demandé est revenue et a utilisé la chose, donc le chiffre à surveiller est le clic
vers l&amp;#39;entrée et si ce compte utilise la fonctionnalité dans la semaine. Pour un avis de changement
cassant, c&amp;#39;est la couverture : quelle part des comptes concernés a ouvert avant la date, et avec qui
vous avez fait un suivi individuel.&lt;/p&gt;
&lt;p&gt;Un digest est le seul des quatre où un taux d&amp;#39;ouverture signifie grand-chose, et même là il est plus
utile comme tendance contre son propre historique que contre un benchmark du secteur. Différents
types d&amp;#39;emails de mise à jour produit ont des tâches différentes, donc un chiffre moyenné sur tous
ne décrit rien sur quoi agir.&lt;/p&gt;
&lt;h2&gt;En quoi est-ce différent des notes de version ?&lt;/h2&gt;
&lt;p&gt;Les notes de version sont un document qui reste disponible. L&amp;#39;email est un mécanisme de livraison
qui arrive une fois. Le même changement produit les deux, et l&amp;#39;email devrait être plus court que
l&amp;#39;entrée vers laquelle il pointe. &lt;a href=&quot;https://changeloop.dev/blog/fr/release-notes-best-practices/&quot;&gt;Bonnes pratiques des notes de version&lt;/a&gt;
couvre le document, et &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-vs-release-notes/&quot;&gt;changelog vs notes de version&lt;/a&gt; couvre
lequel vous êtes en train d&amp;#39;écrire.&lt;/p&gt;
&lt;p&gt;La relation à bien avoir : l&amp;#39;entrée du changelog est le texte canonique et l&amp;#39;email la cite. Quand
les deux divergent, le lecteur qui clique trouve une description différente du changement et cesse
de faire confiance aux deux. Publier l&amp;#39;entrée d&amp;#39;abord et générer l&amp;#39;email à partir d&amp;#39;elle élimine la
dérive par construction. changeloop fonctionne de la même façon de son côté : une entrée est
relue et publiée une fois sur la &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;page, le flux et le widget&lt;/a&gt;, et la personne qui l&amp;#39;a
demandée via le widget en est avertie sur l&amp;#39;issue GitHub qu&amp;#39;est devenu son retour, et dans le widget
lui-même. changeloop n&amp;#39;envoie pas l&amp;#39;email ; votre outil d&amp;#39;emailing cite l&amp;#39;entrée publiée.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;À quelle fréquence devrait sortir un email de mise à jour produit ?&lt;/strong&gt;
Aussi souvent qu&amp;#39;il y a quelque chose de précis que le destinataire veut savoir, ce qui pour une
notification ciblée est chaque fois que sa demande est livrée et pour un digest est mensuel au
maximum.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L&amp;#39;email devrait-il contenir l&amp;#39;entrée entière du changelog ?&lt;/strong&gt;
Non. Une phrase et un lien. L&amp;#39;entrée est la version canonique, et une copie complète dans l&amp;#39;email
signifie deux textes à garder alignés.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quel taux d&amp;#39;ouverture devrais-je attendre ?&lt;/strong&gt;
Comparez chaque type à lui-même plutôt qu&amp;#39;à un benchmark. Une notification ciblée et un digest
mensuel sont des produits différents, et les moyenner cache le seul chiffre qui mérite d&amp;#39;être
surveillé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faut-il une liste séparée pour les changements cassants ?&lt;/strong&gt;
Oui, et cela devrait être celle dont les gens ne peuvent pas se désabonner par inadvertance sans
comprendre la conséquence, car c&amp;#39;est celle qui leur coûte une panne.&lt;/p&gt;
</content:encoded></item><item><title>Comment déprécier une API sans perdre ses développeurs</title><link>https://changeloop.dev/blog/fr/api-deprecation/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/api-deprecation/</guid><description>La dépréciation est une promesse avec une date. Le calendrier, le modèle d&apos;avis, les en-têtes de réponse, et l&apos;étape qui évite un incident au sunset.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Déprécier une API, c&amp;#39;est annoncer que quelque chose fonctionne encore aujourd&amp;#39;hui et cessera de
fonctionner à une date déclarée, puis tenir les deux moitiés de cette promesse. La plupart des
dépréciations échouent sur la seconde moitié : la date glisse silencieusement, ou elle arrive et
les appelants qui n&amp;#39;ont jamais vu l&amp;#39;avis l&amp;#39;apprennent par une erreur. Une dépréciation est terminée
quand chaque appelant concerné a soit migré, soit reçu, individuellement, la confirmation que ce
n&amp;#39;est pas le cas.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce que la dépréciation d&amp;#39;une API ?&lt;/h2&gt;
&lt;p&gt;La dépréciation est la période entre l&amp;#39;annonce qu&amp;#39;un endpoint, un champ ou une version va
disparaître et sa suppression effective. Pendant cette période, l&amp;#39;ancien comportement continue de
fonctionner, la documentation dit qu&amp;#39;il s&amp;#39;en va, et chaque réponse porte un avertissement lisible
par machine. La suppression est l&amp;#39;événement séparé, ultérieur, souvent appelé sunset. Les deux se
confondent, et cette confusion est là où le mal se produit : &amp;quot;deprecated&amp;quot; commence à signifier
&amp;quot;peut-être déjà parti&amp;quot;, et les appelants cessent de faire confiance aux deux mots.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Terme&lt;/th&gt;
&lt;th&gt;Signification&lt;/th&gt;
&lt;th&gt;Sur quoi les appelants peuvent compter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Deprecated&lt;/td&gt;
&lt;td&gt;Annoncé comme disparaissant, fonctionne encore&lt;/td&gt;
&lt;td&gt;Comportement complet jusqu&amp;#39;à la date de sunset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sunset&lt;/td&gt;
&lt;td&gt;La date où ça cesse de fonctionner&lt;/td&gt;
&lt;td&gt;Rien après cette date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retired / supprimé&lt;/td&gt;
&lt;td&gt;Parti ; les requêtes échouent&lt;/td&gt;
&lt;td&gt;Une erreur, idéalement qui nomme le remplacement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legacy&lt;/td&gt;
&lt;td&gt;Indéfini. Éviter le mot&lt;/td&gt;
&lt;td&gt;Rien, ce qui est le problème&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quelle devrait être la durée d&amp;#39;une période de dépréciation ?&lt;/h2&gt;
&lt;p&gt;Assez longue pour qu&amp;#39;un appelant l&amp;#39;apprenne et fasse le travail, mesurée à partir du moment où
l&amp;#39;avis l&amp;#39;a atteint plutôt qu&amp;#39;à partir du moment où vous l&amp;#39;avez écrit. Quatre-vingt-dix jours est le
plancher courant pour une API web publique. Douze mois est normal pour tout ce qui est embarqué
dans un logiciel que les utilisateurs finaux installent, parce que la correction doit aussi passer
par leur processus de release. Le guide de
versionnage de Google, &lt;a href=&quot;https://google.aip.dev/185&quot;&gt;AIP-185&lt;/a&gt;, demande une période de transition
raisonnable et recommande 180 jours avant même de retirer une fonctionnalité bêta, et Kubernetes documente sa
&lt;a href=&quot;https://kubernetes.io/docs/reference/using-api/deprecation-policy/&quot;&gt;politique de dépréciation&lt;/a&gt; en
nombre de releases plutôt qu&amp;#39;en mois, ce qui est la bonne unité quand vos appelants mettent à jour
par version.&lt;/p&gt;
&lt;p&gt;Choisissez une période, écrivez-la comme politique, et arrêtez de la décider par changement. Une
politique publiée transforme chaque dépréciation d&amp;#39;une négociation en une application de règle.&lt;/p&gt;
&lt;p&gt;Écrire la politique de dépréciation couvre le début de la fenêtre ; &lt;a href=&quot;https://changeloop.dev/blog/fr/sunsetting-api-version/&quot;&gt;mettre fin à une version
d&amp;#39;API&lt;/a&gt; couvre l&amp;#39;avis séparé nécessaire à la fin, quand la période
s&amp;#39;écoule réellement et que la version arrête de fonctionner.&lt;/p&gt;
&lt;h2&gt;Le calendrier de dépréciation&lt;/h2&gt;
&lt;p&gt;Quatre dates, annoncées ensemble le premier jour. Chacune est une entrée de changelog séparée à son
arrivée, donc l&amp;#39;histoire est racontée quatre fois à qui ne lit que le changelog.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Annoncer.&lt;/strong&gt; L&amp;#39;entrée dit ce qui est déprécié, pourquoi, ce qui le remplace, et la date de
sunset. La documentation de l&amp;#39;ancienne chose gagne une bannière qui lie vers la migration. Les
réponses gagnent les en-têtes décrits ci-dessous.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rappeler, à mi-chemin.&lt;/strong&gt; Une seconde entrée, et un message direct à chaque appelant qui
utilise encore l&amp;#39;ancien comportement. C&amp;#39;est l&amp;#39;étape qui a besoin de données d&amp;#39;usage : si vous ne
pouvez pas lister qui appelle encore l&amp;#39;endpoint déprécié, vous ne pouvez pas le faire, et ça
vaut la peine de corriger ça avant la prochaine dépréciation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brownout, peu avant la date.&lt;/strong&gt; Renvoyez des erreurs pour l&amp;#39;ancien comportement pendant une
courte fenêtre, une heure ou un jour, puis restaurez-le. Les appelants qui ont manqué tous les
avis l&amp;#39;apprennent maintenant, pendant qu&amp;#39;il reste du temps. GitHub a utilisé des brownouts
planifiés avant de
&lt;a href=&quot;https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/&quot;&gt;retirer l&amp;#39;authentification par mot de passe pour l&amp;#39;API&lt;/a&gt;,
et c&amp;#39;est l&amp;#39;étape individuelle la plus efficace de cette liste.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sunset.&lt;/strong&gt; Supprimez-le. L&amp;#39;erreur qui le remplace nomme le remplacement et lie le guide de
migration. Gardez l&amp;#39;erreur en place longtemps ; un 404 ne dit rien à un appelant.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Que devrait dire un avis de dépréciation ?&lt;/h2&gt;
&lt;p&gt;Un avis de dépréciation dit ce qui disparaît, quand ça s&amp;#39;arrête, quoi utiliser à la place, et qui
est concerné. Voici la forme, remplie :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;GET /v1/reports/daily&lt;/code&gt; est déprécié et cesse de fonctionner le 1er mars 2027.&lt;/strong&gt;
Il est remplacé par &lt;code&gt;GET /v2/reports?granularity=day&lt;/code&gt;, qui renvoie les mêmes données avec un
schéma stable et de la pagination. Concerne les 214 intégrations qui ont appelé l&amp;#39;endpoint v1 au
cours des 30 derniers jours ; si la vôtre en fait partie, vous recevrez aussi cet avis par email.
Guide de migration : [lien]. Rien ne change jusqu&amp;#39;au 1er mars 2027. À partir de cette date,
l&amp;#39;endpoint v1 renvoie &lt;code&gt;410 Gone&lt;/code&gt; avec un lien vers cette entrée.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Chaque phrase porte quelque chose dont la lectrice a besoin. Le nombre d&amp;#39;intégrations concernées
dit à chaque lectrice si elle doit continuer à lire. &amp;quot;Rien ne change jusqu&amp;#39;à&amp;quot; est la phrase qui
laisse celles qui ne sont pas concernées fermer l&amp;#39;onglet. La page
&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;exemples de changelog&lt;/a&gt; rassemble des entrées d&amp;#39;équipes qui écrivent cette
forme de manière cohérente, et ça vaut la peine d&amp;#39;en lire trois avant d&amp;#39;écrire la première sienne.&lt;/p&gt;
&lt;h2&gt;Quels en-têtes un endpoint déprécié devrait-il envoyer ?&lt;/h2&gt;
&lt;p&gt;Envoyez &lt;code&gt;Deprecation&lt;/code&gt;, &lt;code&gt;Sunset&lt;/code&gt; et un &lt;code&gt;Link&lt;/code&gt; vers le successeur, sur chaque réponse de l&amp;#39;endpoint
déprécié, dès le jour de l&amp;#39;annonce. L&amp;#39;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc9745&quot;&gt;en-tête &lt;code&gt;Deprecation&lt;/code&gt;&lt;/a&gt;
porte la date à laquelle la dépréciation a pris effet ; l&amp;#39;
&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;en-tête &lt;code&gt;Sunset&lt;/code&gt;&lt;/a&gt; porte la date où l&amp;#39;endpoint
cesse de répondre ; &lt;code&gt;Link: &amp;lt;url&amp;gt;; rel=&amp;quot;successor-version&amp;quot;&lt;/code&gt; pointe vers ce qu&amp;#39;il faut utiliser à la
place.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HTTP/1.1 200 OK
Deprecation: @1756425600
Sunset: Mon, 01 Mar 2027 00:00:00 GMT
Link: &amp;lt;https://api.example.com/v2/reports&amp;gt;; rel=&amp;quot;successor-version&amp;quot;
Link: &amp;lt;https://example.com/changelog/daily-reports&amp;gt;; rel=&amp;quot;deprecation&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La plupart des appelants ne liront jamais les en-têtes eux-mêmes. Leur valeur est que le client
HTTP, le gateway ou le monitoring d&amp;#39;un appelant le peut, ce qui transforme votre dépréciation en
alerte de leur côté plutôt qu&amp;#39;en page du vôtre. Les SDK que vous livrez devraient
enregistrer un avertissement quand ils en voient un.&lt;/p&gt;
&lt;h2&gt;Qui a été informé, et comment le savez-vous ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est l&amp;#39;étape qui décide si le sunset se passe calmement ou devient un incident de support, et
c&amp;#39;est la plus difficile à faire avec un changelog seul. Une entrée de changelog informe tous ceux
qui lisent le changelog. Une dépréciation doit atteindre les personnes spécifiques dont le code va
échouer, et la façon habituelle de les trouver, ce sont les mêmes données d&amp;#39;usage dont a besoin le
rappel à mi-chemin : les clés API, apps ou comptes qui ont appelé le comportement déprécié
récemment.&lt;/p&gt;
&lt;p&gt;La boucle qu&amp;#39;on exécute : l&amp;#39;entrée est rédigée à partir de la pull request qui ajoute la
dépréciation, une personne relit la formulation et la date, et une fois publiée, l&amp;#39;entrée elle-même
est la notification. Toute personne dont le retour via le widget sur le problème, ou la demande du
remplacement, est devenu une issue GitHub que la pull request ferme reçoit un commentaire sur cette
issue disant que c&amp;#39;est livré, avec un lien vers l&amp;#39;entrée. &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Feed et widget&lt;/a&gt; servent la même entrée à tous les autres, avec chaque autre entrée du
&lt;a href=&quot;https://changeloop.dev/blog/fr/api-changelog/&quot;&gt;changelog d&amp;#39;API&lt;/a&gt;. Ce qu&amp;#39;on ne fait pas,
c&amp;#39;est laisser la dépréciation devenir &amp;quot;livrée&amp;quot; avant qu&amp;#39;une personne l&amp;#39;ait publiée ; un avis avec la
mauvaise date est pire qu&amp;#39;aucun avis.&lt;/p&gt;
&lt;p&gt;Quel que soit votre outillage, la question à laquelle vous devez pouvoir répondre le jour du sunset
est : quels appelants utilisaient encore ça la semaine dernière, et lesquels d&amp;#39;entre eux avons-nous
prévenus directement ? Si la réponse est &amp;quot;on a posté quelque chose à ce sujet&amp;quot;, le sunset n&amp;#39;est pas
prêt.&lt;/p&gt;
&lt;h2&gt;Quelle est la différence entre déprécier et versionner ?&lt;/h2&gt;
&lt;p&gt;Versionner, c&amp;#39;est comment vous gardez disponible l&amp;#39;ancien comportement pendant que le nouveau
existe ; déprécier, c&amp;#39;est comment vous retirez l&amp;#39;ancien. Une nouvelle version d&amp;#39;API sans politique
de dépréciation pour la précédente est un engagement à faire tourner les deux pour toujours. Une
dépréciation sans versionnage est un &lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;changement cassant&lt;/a&gt; avec un
délai. Vous avez besoin des deux, et la version est la moitié la plus facile. GraphQL est
l&amp;#39;exception qui vaut la peine d&amp;#39;être nommée : il n&amp;#39;y a généralement aucun numéro de version à
incrémenter, et &lt;a href=&quot;https://changeloop.dev/blog/fr/graphql-schema-deprecation/&quot;&gt;dépréciation de schéma GraphQL&lt;/a&gt; couvre
comment un unique schéma partagé retire un champ avec une directive à la place.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Un endpoint déprécié devrait-il continuer à fonctionner exactement comme avant ?&lt;/strong&gt;
Oui, jusqu&amp;#39;à la date de sunset. Les seuls changements permis sont les en-têtes ajoutés et, vers la
fin, un brownout planifié annoncé à l&amp;#39;avance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quel code de statut un endpoint retiré devrait-il renvoyer ?&lt;/strong&gt;
&lt;code&gt;410 Gone&lt;/code&gt;, avec un corps et un en-tête &lt;code&gt;Link&lt;/code&gt; pointant vers le remplacement et l&amp;#39;entrée de
changelog. &lt;code&gt;404&lt;/code&gt; dit que l&amp;#39;URL n&amp;#39;a jamais existé, ce qui est faux et inutile.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Peut-on raccourcir une période de dépréciation ?&lt;/strong&gt;
Seulement pour la sécurité. Si l&amp;#39;ancien comportement est exploitable, dites-le, raccourcissez la
période, et prévenez chaque appelant concerné directement plutôt que de compter sur le changelog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Faut-il déprécier un champ, ou seulement des endpoints entiers ?&lt;/strong&gt;
Champs, paramètres, valeurs d&amp;#39;enum, valeurs par défaut et en-têtes ont tous besoin du même
traitement, parce que chacun peut casser un appelant correct. Un champ supprimé est la dépréciation
la plus courante et la plus souvent sautée.&lt;/p&gt;
</content:encoded></item><item><title>Bonnes pratiques de versionnage d&apos;API, pour les appelants</title><link>https://changeloop.dev/blog/fr/api-versioning-best-practices/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/api-versioning-best-practices/</guid><description>Versionnez seulement ce qui casse, mettez la version où les appelants la voient, et gardez l&apos;ancienne active jusqu&apos;à une date. Quatre schémas comparés.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Le versionnage d&amp;#39;API est la pratique de garder fonctionnel un ancien contrat après l&amp;#39;avoir changé,
pour que les appelants puissent avancer selon leur propre calendrier plutôt que le vôtre. Cette
phrase contient les deux décisions qui comptent : ce qui compte comme changer le contrat, et
combien de temps l&amp;#39;ancien continue de fonctionner. Où vit le numéro de version, sujet de la
plupart des débats de versionnage, est la moins importante des trois et la plus facile à réussir.&lt;/p&gt;
&lt;h2&gt;Quand devrait-on versionner une API ?&lt;/h2&gt;
&lt;p&gt;Versionnez une API seulement quand un changement casserait un appelant correct. Les changements
additifs, nouveaux champs, nouveaux endpoints, nouveaux paramètres optionnels, n&amp;#39;ont pas besoin de
version ; les appelants écrits contre l&amp;#39;ancien contrat continuent de fonctionner et la nouvelle
capacité est simplement là. Un &lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;changement cassant&lt;/a&gt; en a besoin, parce
que l&amp;#39;alternative est qu&amp;#39;un appelant l&amp;#39;apprenne par une erreur. Versionner chaque release, y
compris les additives, apprend aux appelants que les versions sont du bruit, et ils cessent de lire
les avis qui comptent.&lt;/p&gt;
&lt;p&gt;Le test pratique est celui de l&amp;#39;article sur les changements cassants : si un appelant qui ne
comptait que sur le comportement documenté doit changer quelque chose pour continuer à
fonctionner, le changement a besoin d&amp;#39;une version. Sinon, livrez-le sous la version actuelle et
écrivez une entrée de changelog.&lt;/p&gt;
&lt;h2&gt;Quel schéma de versionnage d&amp;#39;API devrait-on utiliser ?&lt;/h2&gt;
&lt;p&gt;Utilisez le schéma que vos appelants peuvent voir et fixer le plus facilement, ce qui pour la
plupart des API publiques est une version dans le chemin de l&amp;#39;URL ou un en-tête de version daté.
Les quatre schémas courants diffèrent moins en capacité qu&amp;#39;en ce qu&amp;#39;ils demandent à l&amp;#39;appelant, et
c&amp;#39;est la bonne base pour choisir.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Schéma&lt;/th&gt;
&lt;th&gt;Exemple&lt;/th&gt;
&lt;th&gt;Ce que l&amp;#39;appelant doit faire&lt;/th&gt;
&lt;th&gt;Qui l&amp;#39;utilise&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Chemin URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/v2/invoices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Changer l&amp;#39;URL en migrant&lt;/td&gt;
&lt;td&gt;La plupart des API REST publiques&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;En-tête de version&lt;/td&gt;
&lt;td&gt;&lt;code&gt;X-GitHub-Api-Version: 2022-11-28&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Envoyer un en-tête, ou accepter le défaut&lt;/td&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version de compte datée&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Stripe-Version: 2026-08-26&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fixer une date par requête ou par compte&lt;/td&gt;
&lt;td&gt;Stripe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paramètre de requête&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/invoices?version=2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ajouter un paramètre&lt;/td&gt;
&lt;td&gt;API plus anciennes ; rarement choisi maintenant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type de média&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Accept: application/vnd.example.v2+json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Négocier les types de contenu&lt;/td&gt;
&lt;td&gt;Puristes ; peu d&amp;#39;appelants maîtrisent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Chemin URL&lt;/strong&gt; est le plus visible et le moins flexible. Chaque appelant peut voir dans quelle
version il se trouve en lisant une ligne de log, et un saut de version est un chercher-remplacer.
Le coût : toute la surface bouge d&amp;#39;un coup, vous ne pouvez pas changer le contrat d&amp;#39;un seul
endpoint sans frapper une nouvelle version pour tous, donc les versions de chemin tendent à être
rares et volumineuses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En-tête de version&lt;/strong&gt; garde les URL stables et laisse le serveur choisir un défaut pour les
appelants qui n&amp;#39;envoient rien, comme fonctionne le
&lt;a href=&quot;https://docs.github.com/en/rest/about-the-rest-api/api-versions&quot;&gt;versionnage de l&amp;#39;API REST de GitHub&lt;/a&gt; :
une version nommée par date dans &lt;code&gt;X-GitHub-Api-Version&lt;/code&gt;, avec la version supportée la plus ancienne
comme défaut pour que les appelants non versionnés ne cassent pas. Le coût : la version est
invisible dans une URL et facile à oublier dans un nouveau client.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Version de compte datée&lt;/strong&gt; est le schéma d&amp;#39;en-tête plus un ajout : la version est stockée contre
le compte, donc chaque requête l&amp;#39;obtient sans rien envoyer. Le
&lt;a href=&quot;https://docs.stripe.com/api/versioning&quot;&gt;versionnage d&amp;#39;API de Stripe&lt;/a&gt; fixe chaque compte à la
version avec laquelle il a été créé et laisse une requête l&amp;#39;écraser avec &lt;code&gt;Stripe-Version&lt;/code&gt;. C&amp;#39;est le
schéma le plus favorable à l&amp;#39;appelant et celui qui demande le plus de travail à opérer, parce que
le serveur doit traduire entre chaque version supportée et l&amp;#39;actuelle. Le fonctionnement détaillé
est dans &lt;a href=&quot;https://changeloop.dev/blog/fr/stripe-api-versioning/&quot;&gt;le versionnage de l&amp;#39;API Stripe&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paramètre de requête&lt;/strong&gt; et &lt;strong&gt;type de média&lt;/strong&gt; fonctionnent tous les deux et échouent tous les deux
le test de visibilité de manière différente : un paramètre de requête se perd facilement en
construisant une URL, et une version en type de média est invisible pour presque tout outil avec
lequel un appelant déboguerait.&lt;/p&gt;
&lt;h2&gt;Comment fait-on le versionnage d&amp;#39;API en pratique ?&lt;/h2&gt;
&lt;p&gt;En pratique, une version est un ensemble nommé de comportements, et le serveur mappe chaque
requête sur l&amp;#39;un d&amp;#39;eux. Les étapes sont les mêmes quel que soit le schéma qui porte le nom.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Nommez les versions par date ou par entier, pas par version sémantique.&lt;/strong&gt; Une API web n&amp;#39;est
pas un paquet. Les appelants ne peuvent pas fixer une version mineure d&amp;#39;une URL, donc &lt;code&gt;v2&lt;/code&gt; ou
&lt;code&gt;2026-08-26&lt;/code&gt; dit tout ce dont un appelant a besoin, et le
&lt;a href=&quot;https://semver.org/&quot;&gt;versionnage sémantique&lt;/a&gt; implique une promesse de compatibilité que le
schéma ne peut pas tenir.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gardez la version hors des chemins de code qui s&amp;#39;en fichent.&lt;/strong&gt; Une version devrait
sélectionner une couche de traduction en bordure, pas bifurquer la logique métier. Deux copies
complètes de la codebase, c&amp;#39;est comment une version finit non maintenue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Donnez à chaque version un défaut et un document.&lt;/strong&gt; Les appelants qui n&amp;#39;envoient pas de
version reçoivent la plus ancienne supportée, jamais la plus récente, pour qu&amp;#39;un client non fixé
ne casse pas le jour de la release. Chaque version a une page qui dit ce qui a changé par rapport
à la précédente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixez une fenêtre de support et publiez-la.&lt;/strong&gt; Le guide
de versionnage de Google, &lt;a href=&quot;https://google.aip.dev/185&quot;&gt;AIP-185&lt;/a&gt;, demande une période de
transition raisonnable et bien communiquée, et recommande 180 jours même pour une fonctionnalité
bêta. Choisissez
une fenêtre, écrivez-la, et appliquez-la sans renégocier par version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Retirez les versions comme vous retirez les endpoints.&lt;/strong&gt; Une version passé sa fenêtre reçoit
le même traitement que toute &lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;API dépréciée&lt;/a&gt; : une annonce, un
en-tête &lt;code&gt;Sunset&lt;/code&gt; (&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8594&quot;&gt;RFC 8594&lt;/a&gt;) sur chaque réponse,
un rappel à mi-chemin aux appelants restants, et une date de suppression qui tient.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Que sont v1 et v2 dans une API REST ?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;v1&lt;/code&gt; et &lt;code&gt;v2&lt;/code&gt; sont des noms pour deux contrats que le même serveur supporte en même temps. Un &lt;code&gt;v2&lt;/code&gt;
existe parce que quelque chose dans &lt;code&gt;v1&lt;/code&gt; ne pouvait pas être changé sans casser ses appelants,
donc le changement est allé dans un nouveau contrat et l&amp;#39;ancien a continué de fonctionner. Les
numéros n&amp;#39;impliquent pas que &lt;code&gt;v2&lt;/code&gt; est complet ou que &lt;code&gt;v1&lt;/code&gt; est mort ; les deux ne sont vrais que si
la documentation le dit. Un &lt;code&gt;v3&lt;/code&gt; qui apparaît chaque trimestre est un signe que des changements
additifs sont versionnés, ou que le contrat n&amp;#39;a jamais été conçu pour absorber le changement. gRPC
résout le même problème différemment : &lt;a href=&quot;https://changeloop.dev/blog/fr/grpc-protobuf-api-changes/&quot;&gt;changements d&amp;#39;API gRPC et Protobuf&lt;/a&gt;
couvre le versionnage via le nom de package dans un fichier &lt;code&gt;.proto&lt;/code&gt; plutôt qu&amp;#39;un chemin d&amp;#39;URL, et
un format sur le fil où renommer un champ est gratuit mais le renuméroter est un changement
cassant qu&amp;#39;aucun appelant REST ne reconnaîtrait comme risqué.&lt;/p&gt;
&lt;h2&gt;Que devrait annoncer un changement de version ?&lt;/h2&gt;
&lt;p&gt;Un changement de version devrait annoncer ce qui casse, qui ça concerne, comment migrer, et
combien de temps la version précédente continue de fonctionner. L&amp;#39;entrée a la même forme que
n&amp;#39;importe quelle autre entrée de changement cassant, plus une ligne indiquant la fenêtre de
support. En voici une pour une API versionnée par en-tête :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;La version d&amp;#39;API 2026-11-01 est disponible. La version 2025-06-15 est supportée jusqu&amp;#39;au 1er
novembre 2027.&lt;/strong&gt;
Nouveau dans 2026-11-01 : &lt;code&gt;GET /invoices&lt;/code&gt; renvoie &lt;code&gt;amount&lt;/code&gt; en unités minimales comme entier
plutôt que comme chaîne décimale, et le champ déprécié &lt;code&gt;customer_name&lt;/code&gt; est supprimé au profit de
l&amp;#39;objet &lt;code&gt;customer&lt;/code&gt;. Concerne les appelants sur 2025-06-15 qui parsent &lt;code&gt;amount&lt;/code&gt; comme chaîne, ce
qui est le défaut pour les clients non fixés créés avant juin 2025. Migration : parsez &lt;code&gt;amount&lt;/code&gt;
comme entier et lisez le nom depuis &lt;code&gt;customer.name&lt;/code&gt;. Fixez &lt;code&gt;X-Api-Version: 2026-11-01&lt;/code&gt; quand vous
êtes prêt. Rien ne change pour les appelants qui ne fixent pas de version.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La dernière phrase est celle qui laisse la plupart des lectrices arrêter de lire, et elle appartient
à chaque annonce de version. La page &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;exemples de changelog&lt;/a&gt; inclut des
entrées d&amp;#39;API qui versionnent ainsi, et la différence entre les bonnes et le reste tient surtout
dans cette dernière phrase.&lt;/p&gt;
&lt;h2&gt;Qui est prévenu quand une version change ?&lt;/h2&gt;
&lt;p&gt;Tout le monde sur l&amp;#39;ancienne version, individuellement, et le changelog pour tous les autres. Un
changement de version est le seul cas où &amp;quot;on a posté quelque chose à ce sujet&amp;quot; manque
garantiment exactement les appelants qui comptent : ceux qui ont fixé une version il y a deux ans
et n&amp;#39;ont pas lu de note de release depuis. Les données d&amp;#39;usage répondent qui ils sont ; l&amp;#39;avis doit
les atteindre là où est leur code, dans les en-têtes de réponse et dans un message à la
propriétaire du compte.&lt;/p&gt;
&lt;p&gt;Dans la boucle qu&amp;#39;on exécute, l&amp;#39;entrée qui annonce une version est rédigée à partir de la pull
request qui la livre, relue par une personne, et publiée sur &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;feed et widget&lt;/a&gt;, où un client
versionné peut la lire en JSON. Toute personne dont le retour via le widget a demandé le
changement, ou signalé le bug qu&amp;#39;elle résout, et est devenu une issue GitHub que la pull request
ferme, est prévenue sur cette issue dès que l&amp;#39;entrée est publiée. Le
mécanisme est le même que pour n&amp;#39;importe quelle entrée ; un saut de version n&amp;#39;est que l&amp;#39;entrée avec
l&amp;#39;enjeu le plus élevé.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Chaque changement d&amp;#39;API devrait-il obtenir une nouvelle version ?&lt;/strong&gt;
Non. Seulement les changements cassants. Les changements additifs sont livrés sous la version
actuelle avec une entrée de changelog. Versionner les changements additifs apprend aux appelants à
ignorer les versions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le versionnage par URL est-il meilleur que par en-tête ?&lt;/strong&gt;
Le versionnage par URL est plus facile à voir pour les appelants et plus difficile à faire évoluer
petit à petit pour vous ; le versionnage par en-tête est l&amp;#39;inverse. Pour une API publique avec
beaucoup de petits clients, le versionnage par URL échoue moins. Pour une grande API avec couche de
traduction, la version datée par en-tête passe mieux à l&amp;#39;échelle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combien de versions devraient être supportées à la fois ?&lt;/strong&gt;
Le moins possible selon votre fenêtre de support, et jamais un nombre illimité. Deux ou trois
versions concurrentes est normal ; plus que ça signifie généralement que les versions ne sont pas
retirées.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que devraient recevoir les requêtes non versionnées ?&lt;/strong&gt;
La version supportée la plus ancienne, pour que les clients existants non fixés continuent de
fonctionner, avec un en-tête de réponse leur disant quelle version ils ont reçue.&lt;/p&gt;
</content:encoded></item><item><title>Changements cassants : ce qui compte, comment en livrer un</title><link>https://changeloop.dev/blog/fr/breaking-changes/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/breaking-changes/</guid><description>Un changement cassant est tout changement qu&apos;un appelant correct ne pourrait pas survivre. Ce qui compte, ce qui ne compte pas, comment le repérer en CI.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un changement cassant est un changement qu&amp;#39;un appelant correctement écrit n&amp;#39;aurait pas pu
survivre. La définition compte parce que la plupart des débats sur si quelque chose &amp;quot;compte&amp;quot; sont
en réalité des débats sur qui le tenait mal. Si un appelant a suivi votre documentation et votre
changement a fait cesser de fonctionner son code, le changement était cassant. Ce que vous
vouliez dire n&amp;#39;a rien à voir là-dedans.&lt;/p&gt;
&lt;p&gt;C&amp;#39;est tout le test. Le reste de cet article, c&amp;#39;est ce qui en découle : ce qui y échoue, ce qui le
réussit, comment attraper un échec avant le merge, et quoi faire une fois que vous savez que vous
en livrez un.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui compte comme changement cassant ?&lt;/h2&gt;
&lt;p&gt;Appliquez le test à l&amp;#39;appelant, pas au diff. Un changement est cassant quand un appelant qui ne
comptait que sur le comportement documenté doit changer son code, sa configuration ou ses données
pour continuer à fonctionner. Supprimer un champ, renommer un endpoint, resserrer la validation,
changer une valeur par défaut et changer le type d&amp;#39;une valeur se qualifient tous. Ajouter un champ
optionnel non. Corriger un bug généralement non, avec une exception importante ci-dessous.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Changement&lt;/th&gt;
&lt;th&gt;Cassant ?&lt;/th&gt;
&lt;th&gt;Pourquoi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Supprimer ou renommer un champ, endpoint, flag ou option&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Les appelants corrects le référencent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ajouter un champ optionnel ou un nouvel endpoint&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;Les appels existants ne changent pas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rendre obligatoire une entrée optionnelle&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Les appels qui l&amp;#39;omettaient échouent maintenant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resserrer une validation acceptée auparavant&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Des entrées qui fonctionnaient sont maintenant rejetées&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changer une valeur par défaut&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Les appelants qui ne l&amp;#39;ont pas définie reçoivent un nouveau comportement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changer un type (string vers nombre, valeur unique vers array)&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Les parsers écrits pour le type documenté échouent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Réordonner les clés d&amp;#39;un objet&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;Sauf si vous avez documenté l&amp;#39;ordre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corriger un bug dont dépendaient les appelants&lt;/td&gt;
&lt;td&gt;En pratique oui&lt;/td&gt;
&lt;td&gt;Voir la section sur les contrats accidentels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relever une limite de taux ou un plafond de taille&lt;/td&gt;
&lt;td&gt;Non&lt;/td&gt;
&lt;td&gt;Rien de ce qui fonctionnait ne s&amp;#39;arrête&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Baisser une limite de taux ou un plafond de taille&lt;/td&gt;
&lt;td&gt;Oui&lt;/td&gt;
&lt;td&gt;Du trafic qui allait bien est maintenant limité&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changer la formulation d&amp;#39;un message d&amp;#39;erreur&lt;/td&gt;
&lt;td&gt;Ça dépend&lt;/td&gt;
&lt;td&gt;Cassant si vous l&amp;#39;avez documenté ou si les appelants matchent dessus&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qui n&amp;#39;est pas un changement cassant ?&lt;/h2&gt;
&lt;p&gt;Un changement est non cassant quand chaque appel qui fonctionnait avant fonctionne toujours, sans
modification, et veut toujours dire la même chose. Ajouter un nouvel endpoint, ajouter un paramètre
de requête optionnel, ajouter un champ à une réponse, rendre optionnelle une entrée obligatoire,
relever une limite et améliorer un message d&amp;#39;erreur sur lequel personne ne matche réussissent tous
le test. Ces changements additifs peuvent sortir dans une version mineure avec une entrée de
changelog ordinaire.&lt;/p&gt;
&lt;p&gt;Les changements additifs cassent quand même des appelants dans trois situations. Un client dont le
désérialiseur rejette les champs inconnus échoue dès le premier nouveau champ de réponse : indiquez
tôt dans la documentation que les appelants doivent ignorer les champs qu&amp;#39;ils ne reconnaissent pas.
Une nouvelle valeur d&amp;#39;enum casse tout appelant avec un switch exhaustif (plus bas). Et une réponse
qui grossit peut pousser un appelant au-delà d&amp;#39;une limite de taille, d&amp;#39;un timeout ou d&amp;#39;une largeur
de colonne auxquels il n&amp;#39;a jamais eu à penser.&lt;/p&gt;
&lt;p&gt;Quatre lignes du tableau méritent un regard plus attentif, parce que c&amp;#39;est là que naissent les
désaccords.&lt;/p&gt;
&lt;h2&gt;Les quatre changements cassants que les équipes oublient&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Contrats accidentels.&lt;/strong&gt; Si votre API a renvoyé le même champ non documenté pendant trois ans, un
appelant a construit dessus. La &lt;a href=&quot;https://www.hyrumslaw.com/&quot;&gt;loi de Hyrum&lt;/a&gt; est la version courte :
avec assez d&amp;#39;utilisateurs, chaque comportement observable de votre système dépendra de quelqu&amp;#39;un.
C&amp;#39;est pourquoi &amp;quot;c&amp;#39;était une correction de bug&amp;quot; n&amp;#39;est pas une défense. La correction peut être
correcte et quand même cassante. Livrez-la comme telle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changements de comportement sans changement de schéma.&lt;/strong&gt; Le champ est toujours là, le type est
le même, et la valeur signifie maintenant autre chose. Un &lt;code&gt;status&lt;/code&gt; qui était &lt;code&gt;active&lt;/code&gt; ou &lt;code&gt;inactive&lt;/code&gt;
et renvoie maintenant aussi &lt;code&gt;suspended&lt;/code&gt; casse chaque appelant avec un switch exhaustif. Un
timestamp qui passe de l&amp;#39;heure locale à UTC casse tous ceux qui n&amp;#39;ont pas relu la doc deux fois.
Rien dans un diff du fichier OpenAPI ne montre ça.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Validation resserrée.&lt;/strong&gt; Vous commencez à rejeter des emails sans TLD, ou des espaces en fin de
chaîne, ou des noms de plus de 80 caractères. Chaque appelant qui envoyait exactement ça reçoit
maintenant un 400 pour une requête qui fonctionnait la semaine dernière. Les changements de
validation sont les plus souvent livrés comme correction de &amp;quot;durcissement&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Valeurs par défaut changées.&lt;/strong&gt; Personne qui a défini la valeur explicitement ne remarque rien.
Tous ceux qui ne l&amp;#39;ont pas fait, ce qui est la majorité des appelants, reçoivent un nouveau
comportement sans changer une ligne. Une valeur par défaut changée casse la majorité de vos
utilisateurs précisément parce qu&amp;#39;ils n&amp;#39;ont jamais vu le réglage.&lt;/p&gt;
&lt;h2&gt;Comment détecter un changement cassant avant qu&amp;#39;il sorte ?&lt;/h2&gt;
&lt;p&gt;Comparez le contrat de la pull request au contrat de la branche principale, en CI, et faites
échouer le build sur toute différence cassante. Des outils de diff de schéma existent pour la
plupart des formats d&amp;#39;interface, et chacun connaît les règles de cassure de son propre format :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;th&gt;Outil&lt;/th&gt;
&lt;th&gt;Ce qu&amp;#39;il compare&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;REST (OpenAPI)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/oasdiff/oasdiff&quot;&gt;oasdiff&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Deux specs OpenAPI, avec un rapport des changements cassants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gRPC (Protobuf)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://buf.build/docs/breaking/&quot;&gt;buf breaking&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Les fichiers &lt;code&gt;.proto&lt;/code&gt;, au niveau du wire ou des sources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GraphQL&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/kamilkisiela/graphql-inspector&quot;&gt;GraphQL Inspector&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Deux schémas, en signalant les changements cassants et dangereux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crates Rust&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/obi1kenobi/cargo-semver-checks&quot;&gt;cargo-semver-checks&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;L&amp;#39;API publique face à la dernière version publiée&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paquets TypeScript&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://api-extractor.com/&quot;&gt;API Extractor&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Un rapport versionné de l&amp;#39;API publique du paquet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Ces outils attrapent de façon fiable les champs supprimés, les opérations renommées et les types
changés. Ils ne voient pas les deux premiers des quatre types ci-dessus, un contrat accidentel ou
un changement de comportement, parce qu&amp;#39;aucun n&amp;#39;apparaît dans un schéma. Utilisez l&amp;#39;outil pour
arrêter les cas évidents, et la question de revue &amp;quot;un appelant correct pourrait-il le remarquer ?&amp;quot;
pour le reste. Le même job de CI est un endroit naturel pour exiger une entrée de changelog, comme
décrit dans &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-ci-enforcement/&quot;&gt;imposer les entrées de changelog en CI&lt;/a&gt;, et
&lt;a href=&quot;https://changeloop.dev/blog/fr/grpc-protobuf-api-changes/&quot;&gt;les changements d&amp;#39;API gRPC et Protobuf&lt;/a&gt; passe en revue les
cas au niveau du wire.&lt;/p&gt;
&lt;h2&gt;Comment marquer un changement cassant dans un commit ?&lt;/h2&gt;
&lt;p&gt;Avec &lt;a href=&quot;https://www.conventionalcommits.org/en/v1.0.0/&quot;&gt;Conventional Commits&lt;/a&gt;, un changement cassant
se marque par un &lt;code&gt;!&lt;/code&gt; avant les deux-points (&lt;code&gt;feat(api)!: remove the legacy export endpoint&lt;/code&gt;) ou par
un footer qui commence par &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; suivi d&amp;#39;une description. L&amp;#39;un ou l&amp;#39;autre correspond à
une version majeure. Écrivez le footer comme le premier jet de l&amp;#39;entrée de changelog, en nommant
qui est concerné et ce qu&amp;#39;il doit faire. &lt;a href=&quot;https://changeloop.dev/blog/fr/conventional-commits-changelog/&quot;&gt;Conventional commits et le changelog&lt;/a&gt;
explique jusqu&amp;#39;où la convention vous mène.&lt;/p&gt;
&lt;p&gt;La même règle vaut pour les bibliothèques. Une fonction publique supprimée, un type de paramètre
rétréci ou une valeur de retour changée donnent une version majeure sous versionnage sémantique.
Les bibliothèques ne la suivent pas toujours : une
&lt;a href=&quot;https://arxiv.org/abs/2110.07889&quot;&gt;étude de 119 879 mises à jour sur Maven Central&lt;/a&gt; a trouvé que
16,6% rompaient le versionnage sémantique, alors que seulement 7,9% des projets clients étaient
touchés, parce que la plupart de ces changements concernaient du code qu&amp;#39;aucun client n&amp;#39;appelait.
La casse se mesure chez l&amp;#39;appelant.&lt;/p&gt;
&lt;h2&gt;Comment livre-t-on un changement cassant ?&lt;/h2&gt;
&lt;p&gt;Vous le livrez ouvertement, avec une date, avec un chemin. Les étapes ci-dessous sont dans l&amp;#39;ordre,
et la dernière est celle que la plupart des équipes sautent : dire aux personnes concernées que ce
qu&amp;#39;elles attendaient s&amp;#39;est maintenant produit.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Décidez si c&amp;#39;en est un.&lt;/strong&gt; Utilisez le test ci-dessus, pas le diff. Si deux ingénieurs ne sont
pas d&amp;#39;accord, c&amp;#39;est cassant ; le désaccord est la preuve qu&amp;#39;un appelant aurait raisonnablement
pu compter sur l&amp;#39;ancien comportement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Versionnez-le.&lt;/strong&gt; Sous &lt;a href=&quot;https://semver.org/&quot;&gt;versionnage sémantique&lt;/a&gt;, un changement cassant est
une version majeure. Si vous exploitez une API datée ou versionnée, ça va dans une nouvelle
version et l&amp;#39;ancienne continue de fonctionner jusqu&amp;#39;à une date déclarée. Si vous ne pouvez pas
versionner, vous ne livrez pas un changement cassant, vous livrez une panne avec une entrée de
changelog. Quel schéma porte la version est le sujet de
&lt;a href=&quot;https://changeloop.dev/blog/fr/api-versioning-best-practices/&quot;&gt;bonnes pratiques de versionnage d&amp;#39;API&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Écrivez l&amp;#39;entrée avant que le code soit mergé.&lt;/strong&gt; L&amp;#39;entrée a une forme fixe : ce qui change, qui
ça concerne, ce qu&amp;#39;ils doivent faire, et pour quand. Si vous ne pouvez pas remplir les quatre,
le changement n&amp;#39;est pas prêt. La &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;release notes template&lt;/a&gt; met ces
entrées en premier, avec une date plutôt qu&amp;#39;un numéro de version, exactement pour ça.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Donnez une échéance, pas un numéro de version.&lt;/strong&gt; &amp;quot;Supprimé en v5&amp;quot; ne signifie rien pour
quelqu&amp;#39;un qui ne suit pas vos versions. &amp;quot;Cesse de fonctionner le 1er novembre 2026&amp;quot; signifie la
même chose pour tout le monde.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fournissez la migration.&lt;/strong&gt; Un exemple de code de l&amp;#39;ancien appel à côté du nouveau. Si le
changement est un renommage, donnez les deux noms dans la même phrase. Si c&amp;#39;est un champ
supprimé, dites où sont allées les données.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Annoncez-le partout où l&amp;#39;ancien comportement était documenté.&lt;/strong&gt; Le changelog, la page docs qui
décrit l&amp;#39;endpoint, les release notes du SDK, et l&amp;#39;en-tête de dépréciation dans la réponse si
vous en avez un. Annoncé à un seul endroit, c&amp;#39;est annoncé aux gens qui ont eu la chance de
regarder là.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fermez la boucle.&lt;/strong&gt; Si une cliente a demandé le changement, ou signalé le bug qui y a mené,
dites-le-lui quand ça sort. C&amp;#39;est l&amp;#39;étape qui transforme ça d&amp;#39;une chose faite à vos utilisateurs
en une chose faite avec eux.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;À quoi ressemble une bonne entrée pour un changement cassant ?&lt;/h2&gt;
&lt;p&gt;Une bonne entrée nomme l&amp;#39;appelant concerné dans la première ligne, indique la date, et inclut la
correction. En voici une pour le cas de validation resserrée, dans la forme qu&amp;#39;on utilise :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Les adresses email sans domaine sont rejetées à partir du 1er novembre 2026.&lt;/strong&gt;
&lt;code&gt;POST /users&lt;/code&gt; et &lt;code&gt;PATCH /users/:id&lt;/code&gt; acceptent actuellement des valeurs &lt;code&gt;email&lt;/code&gt; comme
&lt;code&gt;alice@localhost&lt;/code&gt;. À partir du 1er novembre, celles-ci renvoient &lt;code&gt;400 invalid_email&lt;/code&gt;. Concerne
toute intégration qui crée des utilisateurs depuis des annuaires internes. Migration : envoyez
une adresse complètement qualifiée, ou omettez le champ et définissez-le plus tard. Aucun
changement n&amp;#39;est nécessaire si vos adresses ont déjà un domaine, ce qui est vrai pour 99,4% des
comptes créés cette année.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Où cet avis a sa place, et ce qui devrait l&amp;#39;accompagner, fait l&amp;#39;objet du
&lt;a href=&quot;https://changeloop.dev/blog/fr/api-changelog/&quot;&gt;changelog d&amp;#39;API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Le pourcentage à la fin n&amp;#39;est pas de la décoration. Il dit à la lectrice si elle doit s&amp;#39;inquiéter,
ce qui est la question avec laquelle elle a ouvert l&amp;#39;entrée.&lt;/p&gt;
&lt;h2&gt;Pourquoi ne pas simplement les éviter ?&lt;/h2&gt;
&lt;p&gt;Parce que l&amp;#39;alternative est pire. Une API qui ne casse jamais rien accumule chaque erreur qu&amp;#39;elle a
jamais faite : le champ mal nommé, la mauvaise valeur par défaut, le timestamp en heure locale.
Chacune est une taxe sur chaque nouvel appelant pour toujours, pour protéger des appelants qui
auraient pu migrer en un après-midi. Les équipes avec les meilleures réputations de stabilité
cassent rarement des choses, selon un calendrier, avec un chemin de migration et un avertissement
qui a atteint les gens pour qui il était destiné.&lt;/p&gt;
&lt;p&gt;La mécanique de cet avertissement est le sujet de l&amp;#39;article compagnon sur
&lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;déprécier une API&lt;/a&gt;. L&amp;#39;entrée qui l&amp;#39;annonce est rédigée de la même
manière que n&amp;#39;importe quelle autre entrée dans le &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;flux de changelog&lt;/a&gt; : depuis la pull
request mergée, retenue pour un humain, puis publiée à l&amp;#39;endroit où les appelants concernés lisent
déjà.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre un changement cassant et un changement non cassant ?&lt;/strong&gt;
Un changement cassant force un appelant correct à changer son code, sa configuration ou ses
données pour continuer à fonctionner. Un changement non cassant laisse chaque appel existant
fonctionner avec le même sens, ce qui explique pourquoi les ajouts sont généralement sûrs et les
suppressions, renommages et règles resserrées généralement non.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ajouter un champ obligatoire compte-t-il ?&lt;/strong&gt;
Oui. Chaque appel existant l&amp;#39;omet, donc chaque appel existant échoue maintenant. Ajoutez-le comme
optionnel avec une valeur par défaut sensée, ou versionnez l&amp;#39;endpoint.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une correction de bug compte-t-elle ?&lt;/strong&gt;
Ça peut. Si des appelants dépendaient du comportement buggé, le corriger les casse, quoi que dise
la documentation. Traitez toute correction qui change la sortie observable comme cassante, sauf si
vous pouvez montrer que personne n&amp;#39;en dépendait.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le versionnage sémantique s&amp;#39;applique-t-il à une API web ?&lt;/strong&gt;
La règle oui : les changements cassants reçoivent une nouvelle version majeure et l&amp;#39;ancienne
continue de fonctionner pendant une période déclarée. Le numéro vit souvent dans l&amp;#39;URL ou un
en-tête de date plutôt que dans une version de paquet.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Combien de préavis suffit ?&lt;/strong&gt;
Assez pour qu&amp;#39;un appelant trouve l&amp;#39;avis et fasse le travail. Quatre-vingt-dix jours est un plancher
courant pour les API publiques ; plus long pour tout ce qui est utilisé dans du code livré aux
utilisateurs finaux et qui ne peut pas être mis à jour à distance.&lt;/p&gt;
</content:encoded></item><item><title>Fermer la boucle de feedback depuis le changelog</title><link>https://changeloop.dev/blog/fr/customer-feedback-loop/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/customer-feedback-loop/</guid><description>Une boucle de feedback se ferme quand qui a demandé sait que c&apos;est livré. La boucle en quatre étapes, où elle casse, et pourquoi le changelog convient.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Une boucle de feedback client se ferme quand la personne qui a donné le feedback apprend ce qui en
a été fait. Pas quand c&amp;#39;est classé. Pas quand c&amp;#39;est priorisé. Même pas quand c&amp;#39;est livré. Quand on
le lui dit. La plupart des équipes réussissent bien les trois premières étapes et pas du tout la
dernière, puis se demandent pourquoi les gens qui envoient du feedback arrêtent d&amp;#39;en envoyer.&lt;/p&gt;
&lt;p&gt;Cet article traite de cette dernière étape, et d&amp;#39;une affirmation concrète : le changelog est le bon
endroit pour fermer la boucle, parce que c&amp;#39;est le seul artefact qui existe déjà exactement au
moment où la boucle peut être fermée.&lt;/p&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;une boucle de feedback client ?&lt;/h2&gt;
&lt;p&gt;Une boucle de feedback client est le chemin d&amp;#39;une utilisatrice qui vous dit quelque chose jusqu&amp;#39;à
cette utilisatrice apprenant ce que vous en avez fait. Elle a quatre étapes : collecter le
feedback, décider quoi en faire, livrer le résultat, et prévenir la personne qui a demandé. La
boucle est ouverte jusqu&amp;#39;à ce que la quatrième étape arrive. Une équipe qui collecte du feedback et
livre des corrections mais ne prévient jamais personne a une boîte de réception, pas une boucle.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Étape&lt;/th&gt;
&lt;th&gt;Ce qui se passe&lt;/th&gt;
&lt;th&gt;Où ça casse généralement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Collecter&lt;/td&gt;
&lt;td&gt;Le feedback arrive : widget, support, ventes, entretiens&lt;/td&gt;
&lt;td&gt;Rien ; chaque équipe le fait&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Décider&lt;/td&gt;
&lt;td&gt;C&amp;#39;est trié, fusionné avec des doublons, accepté ou refusé&lt;/td&gt;
&lt;td&gt;Les refus ne sont jamais communiqués&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Livrer&lt;/td&gt;
&lt;td&gt;Quelqu&amp;#39;un le construit et ça part en prod&lt;/td&gt;
&lt;td&gt;Le lien vers la demande se perd au merge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prévenir&lt;/td&gt;
&lt;td&gt;La demandeuse apprend que c&amp;#39;est livré&lt;/td&gt;
&lt;td&gt;Sauté, ou fait seulement pour la personne la plus bruyante&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La quatrième ligne est celle dont traite cet article. Elle casse pour une raison structurelle, pas
culturelle : le temps qu&amp;#39;une fonctionnalité soit livrée, la demande qui l&amp;#39;a causée vit dans un
système différent de la chose livrée, et ce n&amp;#39;est le travail de personne de les connecter. La boucle
commence plus tôt, avec la façon dont la demande est formulée au départ ;
&lt;a href=&quot;https://changeloop.dev/blog/fr/how-to-ask-for-customer-feedback/&quot;&gt;comment demander un feedback client&lt;/a&gt; couvre les mots et
le moment.&lt;/p&gt;
&lt;h2&gt;Pourquoi les boucles de feedback restent-elles ouvertes ?&lt;/h2&gt;
&lt;p&gt;Les boucles de feedback restent ouvertes parce que la demande et le changement livré vivent à des
endroits différents et que le lien entre les deux est fait à la main, si tant est qu&amp;#39;il le soit. La
demande est dans un outil de feedback, une boîte de support ou un tableur. Le changement est dans
une pull request. L&amp;#39;annonce est dans un changelog ou un email. Trois systèmes, trois propriétaires,
et le lien du troisième vers le premier est une personne qui se souvient, des mois plus tard, qui a
demandé.&lt;/p&gt;
&lt;p&gt;Il y a une seconde raison. L&amp;#39;étape de prévenir est généralement cadrée comme une tâche marketing
(&amp;quot;annoncer la fonctionnalité&amp;quot;) plutôt qu&amp;#39;une tâche de support (&amp;quot;répondre à la personne&amp;quot;). Les
annonces vont à tout le monde et n&amp;#39;atteignent personne en particulier. La personne qui a demandé la
fonctionnalité en mars lit l&amp;#39;annonce en juin, si elle la lit, comme une actualité, pas comme une
réponse. La boucle se ferme seulement si le message lui est adressé.&lt;/p&gt;
&lt;h2&gt;Pourquoi fermer la boucle depuis le changelog ?&lt;/h2&gt;
&lt;p&gt;Parce que l&amp;#39;entrée de changelog est le seul artefact qui existe exactement au bon moment, contient
exactement les bons mots, et est écrite par exactement la bonne personne. Elle existe quand le
changement est en prod et pas avant. Elle dit ce qui a changé dans les termes de la lectrice, ce
qui est le message dont la demandeuse a besoin. Et elle est écrite par quelqu&amp;#39;un qui vient de lire
la pull request, ce qui est le seul moment où le lien vers la demande originale est encore visible.&lt;/p&gt;
&lt;p&gt;Comparez les alternatives. Fermer la boucle depuis l&amp;#39;outil de feedback signifie que l&amp;#39;outil de
feedback doit savoir quand la fonctionnalité a été livrée, ce qui signifie que quelqu&amp;#39;un met à jour
un statut à la main. La fermer depuis la pull request signifie prévenir la cliente au merge, avant
que le changement soit en prod, une promesse rompue avec horodatage dès que le déploiement se
retarde. La fermer depuis l&amp;#39;annonce marketing signifie en attendre une, et la plupart des
changements livrés n&amp;#39;en ont jamais.&lt;/p&gt;
&lt;p&gt;Le changelog se trouve au milieu : après le merge, au moment de la livraison, avec la formulation
prête.&lt;/p&gt;
&lt;h2&gt;Comment se ferme la boucle, étape par étape&lt;/h2&gt;
&lt;p&gt;Voici le mécanisme qu&amp;#39;on exécute. Il est décrit ici comme une spécification plutôt qu&amp;#39;une visite
de produit, parce que chaque étape peut se faire à la main ou avec d&amp;#39;autres outils ; ce qui compte,
c&amp;#39;est l&amp;#39;ordre.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Le feedback devient une issue dans le repository qui va la corriger.&lt;/strong&gt; Une soumission de
widget est classée comme issue étiquetée sur GitHub (&lt;code&gt;feature-request&lt;/code&gt; ou &lt;code&gt;bug&lt;/code&gt;, une priorité, et
&lt;code&gt;from-widget&lt;/code&gt;), avec l&amp;#39;adresse email de la personne qui l&amp;#39;a envoyée tenue hors du corps de
l&amp;#39;issue. L&amp;#39;issue vit à côté du code, pour que l&amp;#39;étape trois puisse la trouver. Une issue créée à
la main, par exemple depuis une
&lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-template/&quot;&gt;template de demande de fonctionnalité&lt;/a&gt;, est hors de ce
chemin : l&amp;#39;étape cinq ne la commente pas, alors fermez cette boucle vous-même.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La correction référence l&amp;#39;issue.&lt;/strong&gt; La pull request dit &lt;code&gt;Fixes #142&lt;/code&gt;, le propre mot-clé de
fermeture de GitHub. Rien de nouveau à apprendre, et c&amp;#39;est la même phrase que les développeuses
écrivent déjà.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L&amp;#39;entrée de changelog est rédigée à partir de la pull request mergée et porte le lien.&lt;/strong&gt; Au
merge, le brouillon est créé et &lt;code&gt;#142&lt;/code&gt; est lu depuis le corps de la PR et attaché au brouillon.
Le lien est créé pendant qu&amp;#39;il est encore bon marché, par une machine, à partir de données déjà
là.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une personne relit l&amp;#39;entrée.&lt;/strong&gt; Formulation, audience, si ça devrait être publié du tout. Un
brouillon jeté ne ferme rien, ce qui est correct : un refactor interne qui a par hasard référencé
une issue n&amp;#39;est pas une actualité.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;À l&amp;#39;approbation, la demandeuse est prévenue.&lt;/strong&gt; Un commentaire est posté sur l&amp;#39;issue
qu&amp;#39;est devenu son feedback, &amp;quot;Shipped —&amp;quot; suivi du titre de l&amp;#39;entrée et d&amp;#39;un lien vers l&amp;#39;entrée
publiée, et le widget montre à la personne qui l&amp;#39;a envoyé la même entrée livrée. Une fois,
jamais deux, et seulement après qu&amp;#39;une personne a publié l&amp;#39;entrée. La même entrée sort via
&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;feed et widget&lt;/a&gt; vers tous ceux qui n&amp;#39;ont pas demandé.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;L&amp;#39;ordre dans l&amp;#39;étape cinq est tout le design. Prévenir la demandeuse au merge serait plus tôt et
plus facile, et serait faux à peu près aussi souvent que les déploiements se retardent. Un feature
flag casse même cet ordre, parce qu&amp;#39;approuvé et publié peut se produire pendant que la
fonctionnalité reste invisible pour le compte de la demandeuse ;
&lt;a href=&quot;https://changeloop.dev/blog/fr/feature-flags-feature-requests/&quot;&gt;feature flags et demandes de fonctionnalités&lt;/a&gt; couvre la
vérification supplémentaire dont cette étape a besoin dès qu&amp;#39;un flag entre en jeu.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble une boucle fermée pour la cliente ?&lt;/h2&gt;
&lt;p&gt;Ça ressemble à une réponse. La cliente a envoyé une demande via un widget, et un jour le widget
l&amp;#39;affiche comme livrée, avec un lien vers une entrée qui la décrit dans ses termes ; sur GitHub,
l&amp;#39;issue reçoit la même nouvelle sous forme de commentaire. Elle ne s&amp;#39;est pas abonnée à une newsletter, n&amp;#39;a pas vérifié
une roadmap, n&amp;#39;a pas cherché dans le changelog. On le lui a dit.&lt;/p&gt;
&lt;p&gt;C&amp;#39;est l&amp;#39;expérience qui provoque le prochain morceau de feedback. Les gens envoient du feedback à
des produits qui répondent. La page &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;exemples de changelog&lt;/a&gt; inclut des entrées
d&amp;#39;équipes dont les utilisateurs reviennent visiblement avec des demandes, et le fil commun n&amp;#39;est
pas l&amp;#39;outil ; c&amp;#39;est que les entrées se lisent comme des réponses.&lt;/p&gt;
&lt;h2&gt;Comment mesure-t-on une boucle de feedback ?&lt;/h2&gt;
&lt;p&gt;Mesurez la fraction des changements livrés qui ont prévenu au moins une demandeuse, et le temps
entre la livraison et l&amp;#39;avis. Deux chiffres, tous deux faciles une fois que le lien existe et
impossibles avant.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Taux de fermeture&lt;/strong&gt; : des entrées de changelog publiées ce mois-ci, combien liaient au moins
une demande, et parmi celles-ci, combien ont prévenu la demandeuse. Si le second chiffre est bien
plus bas que le premier, les notifications échouent ; si le premier est bas, les demandes ne sont
pas référencées depuis les pull requests, et la correction est une phrase dans le template de PR.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Temps de livraison à avis&lt;/strong&gt; : combien de temps entre l&amp;#39;entrée qui passe en prod et l&amp;#39;avis à la
demandeuse. Avec le mécanisme ci-dessus, c&amp;#39;est des secondes. À la main, c&amp;#39;est typiquement des
semaines, ou jamais, et &amp;quot;jamais&amp;quot; est le chiffre qui compte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ne mesurez pas la boucle par le volume de feedback collecté. Collecter est l&amp;#39;étape facile, et une
équipe qui la mesure va l&amp;#39;optimiser, ce qui produit plus de boucles ouvertes.&lt;/p&gt;
&lt;h2&gt;Où s&amp;#39;insère la roadmap ?&lt;/h2&gt;
&lt;p&gt;Une roadmap publique est une façon de fermer la boucle tôt : elle dit à la demandeuse que sa
demande a été entendue, avant qu&amp;#39;elle soit livrée. C&amp;#39;est utile, et ça ne remplace pas la dernière
étape. &amp;quot;Planifié&amp;quot; est une promesse sur l&amp;#39;avenir ; &amp;quot;Livré&amp;quot; est un fait sur le présent.
Exécutez la &lt;a href=&quot;https://changeloop.dev/blog/fr/public-roadmap/&quot;&gt;roadmap publique&lt;/a&gt; depuis les mêmes issues, avec un label par
colonne, pour que la même demande passe de planifiée à livrée sans être ressaisie nulle part. Le
passage à livrée est un changement de label (&lt;code&gt;roadmap:shipped&lt;/code&gt;) que personne ne fait à votre place quand
l&amp;#39;entrée est approuvée, alors faites-le dans la même relecture.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Quelles sont les quatre étapes d&amp;#39;une boucle de feedback client ?&lt;/strong&gt;
Collecter, décider, livrer, prévenir. La boucle est ouverte jusqu&amp;#39;à ce que la quatrième étape
arrive. La plupart des cadres ajoutent des étapes d&amp;#39;analyse et de priorisation au milieu ; ce sont
des raffinements de &amp;quot;décider&amp;quot;, et aucune d&amp;#39;elles ne ferme rien.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Devrait-on prévenir les clients quand une demande est refusée ?&lt;/strong&gt;
Oui, et c&amp;#39;est le message le plus négligé de la boucle. Un clair &amp;quot;on ne va pas faire ça, et voici
pourquoi&amp;quot; met fin à l&amp;#39;attente. Le silence laisse la boucle ouverte pour toujours et la cliente à
vérifier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En quoi fermer la boucle diffère-t-il d&amp;#39;annoncer une fonctionnalité ?&lt;/strong&gt;
Une annonce va à tout le monde. Fermer la boucle est une réponse aux gens qui ont demandé, sur le
canal par lequel ils ont demandé. Faites les deux ; ce sont des messages différents pour des
lectrices différentes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et si la demandeuse n&amp;#39;est pas sur GitHub ?&lt;/strong&gt;
La plupart n&amp;#39;y sont pas, et ce n&amp;#39;est pas grave. Le widget continue de leur montrer le statut de ce
qu&amp;#39;elles ont envoyé, y compris l&amp;#39;entrée livrée et son lien, donc elles n&amp;#39;ont besoin de rien d&amp;#39;autre
que la page depuis laquelle elles ont écrit. Le commentaire sur l&amp;#39;issue est pour les personnes qui
peuvent voir le repository.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Est-ce que cette boucle fonctionne sur GitLab ou Bitbucket au lieu de GitHub ?&lt;/strong&gt;
Le widget et le changelog, oui ; le commentaire automatique de l&amp;#39;étape cinq, pas encore aujourd&amp;#39;hui.
Une équipe sur GitLab ou Bitbucket reçoit quand même chaque soumission, la classe quand même comme
une issue, et montre quand même à la demandeuse un statut dans le widget, mais refermer cette
boucle précise jusque sur l&amp;#39;issue elle-même est une étape à faire à la main tant que cette
intégration n&amp;#39;existe pas.&lt;/p&gt;
</content:encoded></item><item><title>Template de demande de fonctionnalité qui devient changelog</title><link>https://changeloop.dev/blog/fr/feature-request-template/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/feature-request-template/</guid><description>Une demande de fonctionnalité ne sert que si on la retrouve à la livraison. Le modèle, les labels qui la routent et les champs que lit le changelog.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Une template de demande de fonctionnalité est un formulaire avec quatre questions : ce que la
personne essaie de faire, ce qui l&amp;#39;en empêche, ce qu&amp;#39;elle a essayé à la place, et comment elle veut
être prévenue quand c&amp;#39;est fait. Tout le reste qui apparaît généralement sur une, sélecteurs de
priorité, estimations d&amp;#39;effort, scores de valeur business, est pour l&amp;#39;équipe qui reçoit la demande,
et c&amp;#39;est mal rempli par celle qui l&amp;#39;envoie.&lt;/p&gt;
&lt;p&gt;Les demandes bien rangées sont le mauvais test pour une template. Le bon : six mois plus tard,
quand la fonctionnalité est livrée, quelqu&amp;#39;un peut-il trouver la demande, la comprendre, et
prévenir la personne qui l&amp;#39;a écrite ? La plupart des templates sont conçues pour l&amp;#39;accueil.
Celle-ci est conçue pour le jour où la boucle se ferme.&lt;/p&gt;
&lt;h2&gt;Que devrait inclure une template de demande de fonctionnalité ?&lt;/h2&gt;
&lt;p&gt;Elle devrait inclure l&amp;#39;objectif, le blocage, la solution de contournement, et un moyen de revenir
vers la demandeuse. Quatre champs, dans cet ordre, chacun répond à une question que l&amp;#39;équipe posera
plus tard.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Champ&lt;/th&gt;
&lt;th&gt;La question à laquelle il répond plus tard&lt;/th&gt;
&lt;th&gt;Pourquoi il est dans le formulaire&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Qu&amp;#39;essayez-vous de faire ?&lt;/td&gt;
&lt;td&gt;La fonctionnalité construite est-elle celle qu&amp;#39;il fallait ?&lt;/td&gt;
&lt;td&gt;L&amp;#39;objectif survit à toute proposition concrète&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qu&amp;#39;est-ce qui vous en empêche aujourd&amp;#39;hui ?&lt;/td&gt;
&lt;td&gt;À quoi ressemble &amp;quot;terminé&amp;quot; ?&lt;/td&gt;
&lt;td&gt;Nomme le vide sans prescrire la correction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Que faites-vous à la place ?&lt;/td&gt;
&lt;td&gt;À quel point est-ce vraiment urgent ?&lt;/td&gt;
&lt;td&gt;Une solution de contournement douloureuse est un signal plus fort qu&amp;#39;un sélecteur de priorité&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comment devrions-nous vous prévenir ?&lt;/td&gt;
&lt;td&gt;Qui reçoit le message &amp;quot;livré&amp;quot; ?&lt;/td&gt;
&lt;td&gt;Le champ que la plupart des templates omettent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Ce qui manque délibérément : une solution proposée comme champ obligatoire (bienvenue en
commentaire, fausse comme cadrage), un sélecteur de priorité (chaque soumetteur choisit haute), et
toute estimation d&amp;#39;effort ou de valeur (travail de l&amp;#39;équipe, après le tri). Une template qui demande
une solution reçoit des demandes de boutons ; une template qui demande un objectif reçoit des
demandes de résultats, et c&amp;#39;est sur des résultats qu&amp;#39;on écrit une entrée de changelog.&lt;/p&gt;
&lt;h2&gt;La template&lt;/h2&gt;
&lt;p&gt;Voici la template d&amp;#39;issue GitHub qu&amp;#39;on utilise, sous forme de formulaire. Collez-la dans
&lt;code&gt;.github/ISSUE_TEMPLATE/feature_request.yml&lt;/code&gt; et elle se rend comme formulaire structuré sur la page
de nouvelle issue. Les demandes classées via elle atterrissent comme des issues avec les mêmes
champs que celles classées depuis un widget de feedback, ce qui compte pour la section suivante.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: Feature request
description: What you are trying to do, and what stops you.
labels: [&amp;quot;feature-request&amp;quot;]
body:
  - type: textarea
    id: goal
    attributes:
      label: What are you trying to do?
      description: &amp;gt;-
        The outcome, not the button. &amp;quot;Export a month of invoices as one
        PDF&amp;quot; beats &amp;quot;add a PDF export&amp;quot;.
    validations:
      required: true
  - type: textarea
    id: blocker
    attributes:
      label: What stops you today?
      description: &amp;gt;-
        Where the product runs out. An error, a missing option, a limit.
    validations:
      required: true
  - type: textarea
    id: workaround
    attributes:
      label: What do you do instead?
      description: &amp;gt;-
        The spreadsheet, the script, the manual step. &amp;quot;Nothing, I gave
        up&amp;quot; is a valid answer.
  - type: input
    id: contact
    attributes:
      label: How should we tell you when it ships?
      description: &amp;gt;-
        An email address, or leave blank to be notified only on this
        issue.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Deux détails font le travail. &lt;code&gt;labels: [&amp;quot;feature-request&amp;quot;]&lt;/code&gt; signifie que la demande est classifiée
à la création plutôt que d&amp;#39;attendre que quelqu&amp;#39;un la trie. Et le dernier champ existe parce que &amp;quot;on
te préviendra&amp;quot; est une promesse, et une promesse a besoin d&amp;#39;une adresse.&lt;/p&gt;
&lt;h2&gt;Quels labels une demande de fonctionnalité devrait-elle porter ?&lt;/h2&gt;
&lt;p&gt;Une demande de fonctionnalité devrait porter un label pour ce qu&amp;#39;elle est, un pour son urgence, et
un pour d&amp;#39;où elle vient. Trois labels, trois axes, et chacun est lu par une lectrice différente.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Valeurs&lt;/th&gt;
&lt;th&gt;Qui le lit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;&lt;code&gt;feature-request&lt;/code&gt;, &lt;code&gt;bug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Qui décide dans quelle file elle entre&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Priorité&lt;/td&gt;
&lt;td&gt;&lt;code&gt;priority:low&lt;/code&gt;, &lt;code&gt;priority:medium&lt;/code&gt;, &lt;code&gt;priority:high&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Qui planifie le prochain cycle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source&lt;/td&gt;
&lt;td&gt;&lt;code&gt;from-widget&lt;/code&gt;, &lt;code&gt;from-form&lt;/code&gt;, &lt;code&gt;from-support&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Qui mesure d&amp;#39;où viennent les demandes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Le widget applique les deux premiers axes et &lt;code&gt;from-widget&lt;/code&gt; quand il classe une soumission comme
issue ; &lt;code&gt;from-form&lt;/code&gt; et &lt;code&gt;from-support&lt;/code&gt; sont des suggestions pour les demandes qui arrivent par
d&amp;#39;autres voies. Les labels du widget sont un type (&lt;code&gt;bug&lt;/code&gt; ou &lt;code&gt;feature-request&lt;/code&gt;, décidé par un classificateur à partir du seul
message), une priorité (un rapport de crash calme et précis est haut ; un doublon de quelque chose
déjà demandé est bas ; tout ce qui suggère même vaguement un problème de sécurité est &lt;code&gt;bug&lt;/code&gt; et
haut, quelle que soit la formulation), et &lt;code&gt;from-widget&lt;/code&gt;. Les mêmes trois axes fonctionnent pour les
demandes qui arrivent à la main via la template ci-dessus, et c&amp;#39;est le point : une demande est une
demande, peu importe par où elle est entrée.&lt;/p&gt;
&lt;p&gt;Une convention de plus : le widget retire l&amp;#39;adresse email de la personne qui soumet du corps de
l&amp;#39;issue avant de la classer, parce que l&amp;#39;issue vit dans un repository qui peut être public, et la
remplace par une référence de soumission. L&amp;#39;adresse reste hors de l&amp;#39;issue ; la personne qui
soumet suit le résultat dans le widget lui-même.
Faites de même avec le champ de contact si votre tracker est visible pour des gens hors de l&amp;#39;équipe.&lt;/p&gt;
&lt;h2&gt;Comment une demande de fonctionnalité devient-elle une entrée de changelog ?&lt;/h2&gt;
&lt;p&gt;Une demande de fonctionnalité devient une entrée de changelog quand une pull request ferme
l&amp;#39;issue et que l&amp;#39;entrée rédigée à partir de cette pull request lie en retour. Le mécanisme, ce sont
les propres mots-clés de fermeture de GitHub : une PR dont la description dit &lt;code&gt;Fixes #142&lt;/code&gt; ferme
l&amp;#39;issue 142 au merge. Si vos entrées de changelog sont rédigées à partir de pull requests mergées,
le brouillon peut porter le numéro d&amp;#39;issue avec lui, et l&amp;#39;entrée sait qui a demandé.&lt;/p&gt;
&lt;p&gt;C&amp;#39;est la raison pour laquelle la template demande l&amp;#39;objectif plutôt que la solution. Quand l&amp;#39;entrée
est écrite, l&amp;#39;objectif est la phrase dont a besoin qui écrit : &amp;quot;Vous pouvez maintenant exporter un
mois de factures comme un seul PDF&amp;quot; est une entrée de changelog. &amp;quot;Ajout de l&amp;#39;export PDF&amp;quot; est un
message de commit. Les &lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;outils de changelog&lt;/a&gt; qui rédigent à partir de pull
requests peuvent faire la collecte et le lien ; la formulation a toujours besoin d&amp;#39;une personne, et
la personne a besoin de l&amp;#39;objectif.&lt;/p&gt;
&lt;h2&gt;Que se passe-t-il quand c&amp;#39;est livré ?&lt;/h2&gt;
&lt;p&gt;La demandeuse est prévenue, avec un lien vers l&amp;#39;entrée. Dans notre configuration, c&amp;#39;est automatique
pour les demandes arrivées via le widget : un commentaire disant &amp;quot;Shipped — &amp;lt;titre de l&amp;#39;entrée&amp;gt;&amp;quot;
avec un lien vers l&amp;#39;entrée publiée, posté sur l&amp;#39;issue dès qu&amp;#39;une personne approuve l&amp;#39;entrée, pendant
que le widget montre la même entrée à la personne qui l&amp;#39;a soumise. Une issue créée à la main depuis
cette template ne reçoit aucun commentaire automatique ; fermez cette boucle vous-même, selon la
même règle. Le commentaire est posté
délibérément à l&amp;#39;approbation plutôt qu&amp;#39;au merge : un commentaire disant que quelque chose est en
prod avant que ce le soit est une promesse rompue avec horodatage. Chaque demande est notifiée au
plus une fois ; une seconde approbation de la même entrée ne produit pas un second commentaire.&lt;/p&gt;
&lt;p&gt;Si vous faites ça à la main, la même règle s&amp;#39;applique. Ne fermez pas la boucle depuis la pull
request. Fermez-la depuis l&amp;#39;entrée publiée, et fermez-la une fois. &lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;Feed et widget&lt;/a&gt; portent
la même entrée à tous ceux qui n&amp;#39;ont pas demandé, qui sont la plupart ; le commentaire est pour ceux
qui ont demandé.&lt;/p&gt;
&lt;h2&gt;Pourquoi la plupart des templates de demande de fonctionnalité échouent&lt;/h2&gt;
&lt;p&gt;Elles sont conçues pour faciliter le tri et y réussissent, au prix du seul moment qui compte pour la
demandeuse. Une template avec douze champs reçoit moins de demandes, et celles qu&amp;#39;elle reçoit
viennent de gens avec la patience de remplir douze champs, ce qui n&amp;#39;est pas la même population que
celle qui a besoin de la fonctionnalité. Une template avec quatre champs, dont un &amp;quot;comment vous
contactons-nous&amp;quot;, reçoit plus de demandes et peut toutes les honorer.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Une template de demande de fonctionnalité devrait-elle demander la priorité ?&lt;/strong&gt;
Non. Demandez plutôt la solution de contournement. &amp;quot;J&amp;#39;exporte vers un tableur et je le ressaisis
chaque vendredi&amp;quot; en dit plus sur la priorité qu&amp;#39;un menu déroulant que la personne qui a soumis a
mis sur haute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les demandeurs devraient-ils proposer une solution ?&lt;/strong&gt;
Ils peuvent, dans le texte libre. N&amp;#39;en faites pas le cadrage. Les demandes écrites comme des
solutions sont plus difficiles à fusionner entre elles et plus difficiles à transformer en entrée
de changelog.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les demandes de fonctionnalité devraient-elles apparaître sur une roadmap publique ?&lt;/strong&gt;
Une fois planifiées, oui : un label sur la même issue la met dans la colonne planifiée, et la
demandeuse peut voir comment elle avance. L&amp;#39;article &lt;a href=&quot;https://changeloop.dev/blog/fr/public-roadmap/&quot;&gt;roadmap publique&lt;/a&gt;
est le mécanisme.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment gérer les doublons ?&lt;/strong&gt;
Liez la nouvelle demande à l&amp;#39;issue existante et étiquetez-la priorité basse ; ne la fermez pas.
Chaque doublon est une personne de plus à prévenir quand c&amp;#39;est livré. Avec le commentaire
automatique de changeloop, cette personne n&amp;#39;est prévenue que si la pull request nomme aussi son
issue (&lt;code&gt;Fixes #142, fixes #187&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Où devrait vivre la template ?&lt;/strong&gt;
Dans le repository qui recevra la pull request, pour que le mot-clé de fermeture fonctionne. Une
demande dans un tracker séparé doit être liée à la main au merge, et c&amp;#39;est cette étape qui est
sautée.&lt;/p&gt;
</content:encoded></item><item><title>Roadmap publique depuis votre issue tracker, trois colonnes</title><link>https://changeloop.dev/blog/fr/public-roadmap/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/public-roadmap/</guid><description>Une roadmap publique est une promesse sur l&apos;avenir. Gardez-la petite, alimentez-la depuis vos issues et déplacez chaque élément avec un label sur l&apos;issue.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Une roadmap publique est une liste de ce que vous prévoyez de construire, publiée là où les
clients peuvent la voir. Le mot qui fait le travail est &lt;em&gt;prévoyez&lt;/em&gt; : une roadmap est un ensemble de
promesses sur l&amp;#39;avenir, et chaque élément dessus est un que vous tiendrez ou qu&amp;#39;on verra que vous
n&amp;#39;avez pas tenu. C&amp;#39;est la raison d&amp;#39;en publier une, et c&amp;#39;est aussi la raison pour laquelle la
plupart des roadmaps publiques deviennent obsolètes en un trimestre. La version qui survit est
petite, dérivée de données que vous maintenez déjà, et connectée à l&amp;#39;autre bout au changelog, pour
qu&amp;#39;une promesse devienne un fait sans que personne ne la ressaisisse.&lt;/p&gt;
&lt;h2&gt;À quoi sert une roadmap publique ?&lt;/h2&gt;
&lt;p&gt;Une roadmap publique dit à une cliente avec une demande que sa demande a été entendue, avant
qu&amp;#39;elle soit livrée. C&amp;#39;est la moitié précoce de la fermeture de boucle : &amp;quot;planifié&amp;quot; répond à la
question &amp;quot;quelqu&amp;#39;un a-t-il lu ça&amp;quot;, et &amp;quot;en construction&amp;quot; répond à &amp;quot;est-ce vraiment en train
d&amp;#39;arriver&amp;quot;. Aucune des deux ne remplace la dernière étape, prévenir la demandeuse quand c&amp;#39;est
livré, mais toutes deux réduisent le nombre de gens qui demandent entre-temps.&lt;/p&gt;
&lt;p&gt;Ça fait aussi une chose pour l&amp;#39;équipe : ça force un engagement public, ce qui est le remède le
moins cher connu contre un backlog qui cache silencieusement quatre cents éléments que personne ne
construira.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Colonne&lt;/th&gt;
&lt;th&gt;La promesse qu&amp;#39;elle fait&lt;/th&gt;
&lt;th&gt;Ce qui déplace un élément dedans&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Planifié&lt;/td&gt;
&lt;td&gt;On prévoit de construire ça&lt;/td&gt;
&lt;td&gt;Une décision, enregistrée comme label sur l&amp;#39;issue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;En construction&lt;/td&gt;
&lt;td&gt;Quelqu&amp;#39;un y travaille maintenant&lt;/td&gt;
&lt;td&gt;Un label &lt;code&gt;roadmap:building&lt;/code&gt; sur l&amp;#39;issue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Livré&lt;/td&gt;
&lt;td&gt;C&amp;#39;est en prod&lt;/td&gt;
&lt;td&gt;Un label &lt;code&gt;roadmap:shipped&lt;/code&gt;, ou la fermeture de l&amp;#39;issue qui en porte un&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Trois colonnes, dans un ordre fixe, suffisent. Une quatrième colonne (&amp;quot;en considération&amp;quot;, &amp;quot;en
révision&amp;quot;, &amp;quot;backlog&amp;quot;) est là où les bonnes intentions deviennent un musée, et c&amp;#39;est la première que
les clients apprennent à ignorer.&lt;/p&gt;
&lt;h2&gt;Votre roadmap devrait-elle être publique ?&lt;/h2&gt;
&lt;p&gt;Rendez-la publique si vous pouvez la garder petite et honnête ; gardez-la privée si l&amp;#39;alternative
est une longue liste de peut-être. Le coût d&amp;#39;une roadmap publique n&amp;#39;a rien à voir avec sa
publication : chaque élément dessus est maintenant une question que quelqu&amp;#39;un posera, en support,
dans les appels de vente et dans les conversations de renouvellement. Dix éléments que vous
construirez sont un atout. Soixante éléments que vous pourriez construire sont soixante
conversations futures sur pourquoi non.&lt;/p&gt;
&lt;p&gt;Deux raisons honnêtes de ne pas publier : vos plans changent plus vite qu&amp;#39;un trimestre, ou votre
concurrence lit votre roadmap plus attentivement que vos clients. Les deux sont réelles, et les deux
se résolvent en publiant moins plutôt que rien : seulement &amp;quot;en construction&amp;quot;, avec &amp;quot;planifié&amp;quot; gardé
en interne, dit quand même à une demandeuse que son issue bouge.&lt;/p&gt;
&lt;h2&gt;Comment construit-on une roadmap publique à partir d&amp;#39;issues GitHub ?&lt;/h2&gt;
&lt;p&gt;Mettez un label par colonne sur les issues que vous suivez déjà, et rendez les issues étiquetées
comme la roadmap. Rien n&amp;#39;est ressaisi, la roadmap ne peut pas dériver du travail, et la même issue
qui a commencé comme demande d&amp;#39;une cliente se déplace à travers les colonnes sans changer
d&amp;#39;identité.&lt;/p&gt;
&lt;p&gt;Le mécanisme, tel qu&amp;#39;on l&amp;#39;exécute :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Un label par colonne, avec préfixe fixe&lt;/strong&gt; : &lt;code&gt;roadmap:planned&lt;/code&gt;, &lt;code&gt;roadmap:building&lt;/code&gt;,
&lt;code&gt;roadmap:shipped&lt;/code&gt;. Toute issue dans un repository connecté qui en porte un apparaît dans cette
colonne. Une issue sans aucun d&amp;#39;eux n&amp;#39;est pas sur la roadmap, ce qui est la plupart des issues,
ce qui est correct.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les colonnes sont un tableau ordonné, toujours dans le même ordre.&lt;/strong&gt; Planifié, en
construction, livré. Pas une map indexée par nom, pour qu&amp;#39;une lectrice (ou un widget) n&amp;#39;ait
jamais à deviner la séquence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Si une issue porte deux labels, le plus avancé gagne.&lt;/strong&gt; Quelqu&amp;#39;un ajoutera
&lt;code&gt;roadmap:shipped&lt;/code&gt; avant de retirer &lt;code&gt;roadmap:planned&lt;/code&gt; ; une machine à états guidée par &amp;quot;quel
webhook est arrivé en dernier&amp;quot; mettrait l&amp;#39;élément dans des colonnes différentes selon l&amp;#39;ordre de
livraison. Décider uniquement à partir de l&amp;#39;ensemble de labels rend la réponse la même quel que
soit l&amp;#39;ordre d&amp;#39;arrivée des événements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Livré est un état de label comme les autres.&lt;/strong&gt; La carte se déplace quand l&amp;#39;issue reçoit
&lt;code&gt;roadmap:shipped&lt;/code&gt;, ou est fermée alors qu&amp;#39;elle le porte. La carte elle-même ne lie pas vers
l&amp;#39;entrée de changelog ; l&amp;#39;entrée, rédigée à partir de la pull request qui a fermé l&amp;#39;issue, est
l&amp;#39;endroit où vivent les détails.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Servez-la comme données.&lt;/strong&gt; La roadmap est un document JSON avec ces trois colonnes, publié à
côté du flux de changelog avec les mêmes en-têtes de cache, pour qu&amp;#39;un site docs, un widget ou
une page de statut puissent la rendre sans seconde intégration. La
&lt;a href=&quot;https://changeloop.dev/docs&quot;&gt;documentation du flux&lt;/a&gt; a la forme exacte.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Un label est peu demander à une mainteneuse, et c&amp;#39;est toute l&amp;#39;intégration. Aucun tableau à garder
synchronisé, aucun outil séparé où se connecter, et la demande que la cliente a classée est
l&amp;#39;élément sur la roadmap ; quand c&amp;#39;est livré, c&amp;#39;est le même élément.&lt;/p&gt;
&lt;h2&gt;Que ne devrait pas contenir une roadmap publique ?&lt;/h2&gt;
&lt;p&gt;Elle ne devrait pas contenir de dates, d&amp;#39;estimations, ni rien dont vous auriez honte qu&amp;#39;on vous
demande dans neuf mois. Les dates sont l&amp;#39;erreur classique : un trimestre sur une roadmap devient un
engagement dans un deck de vente devient un ticket appelé &amp;quot;vous avez dit Q3&amp;quot;. Les colonnes disent
assez. &amp;quot;En construction&amp;quot; signifie déjà &amp;quot;assez bientôt que quelqu&amp;#39;un y est&amp;quot;.&lt;/p&gt;
&lt;p&gt;Elle ne devrait pas non plus contenir le backlog interne. Une roadmap avec trois cents éléments est
un problème de recherche, pas une promesse, et la cliente qui trouve sa demande en position 212 a
appris quelque chose que vous ne vouliez pas lui dire.&lt;/p&gt;
&lt;h2&gt;Comment la roadmap se connecte-t-elle au changelog ?&lt;/h2&gt;
&lt;p&gt;La roadmap et le changelog décrivent les mêmes issues de deux côtés, l&amp;#39;un pour l&amp;#39;avenir et l&amp;#39;autre
pour le passé. Personne ne déplace une carte sur un tableau séparé. Une mainteneuse change le label
sur l&amp;#39;issue sur laquelle elle travaillait déjà, l&amp;#39;entrée est rédigée à partir de la pull request, et
quand une personne approuve cette entrée, une demandeuse dont le feedback via le widget est
devenu cette issue y est prévenue. Déplacer la
carte vers livré reste une étape à part, le label &lt;code&gt;roadmap:shipped&lt;/code&gt;, alors intégrez-la à la même
relecture ; approuver l&amp;#39;entrée ne le fait pas pour vous.&lt;/p&gt;
&lt;p&gt;C&amp;#39;est la même boucle que décrit l&amp;#39;&lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;article sur la boucle de feedback&lt;/a&gt;
du côté du changelog ; la roadmap est ce que la cliente voit au milieu de ça. Le récap
&lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;outils de changelog&lt;/a&gt; couvre quels produits offrent une vue roadmap et lesquels la
traitent comme un tableau séparé, ce qui est la différence qui décide si elle reste exacte.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble une bonne roadmap publique ?&lt;/h2&gt;
&lt;p&gt;Elle a l&amp;#39;air courte, et chaque élément dessus est une issue que n&amp;#39;importe qui peut ouvrir. Le test
est de savoir si une cliente peut aller d&amp;#39;un élément à la discussion derrière lui, et d&amp;#39;un élément
livré à l&amp;#39;entrée qui décrit ce qui a réellement changé. Une roadmap qui est une liste de noms de
fonctionnalités sans entrée est une brochure.&lt;/p&gt;
&lt;p&gt;Un exemple travaillé, comme le JSON qu&amp;#39;un widget irait chercher :&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;columns&amp;quot;: [
    { &amp;quot;column&amp;quot;: &amp;quot;planned&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;6b0c1f...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;planned&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Saved views on the inbox&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;Keep a filter you use often and come back to it.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-16T10:04:11.000Z&amp;quot; }
    ]},
    { &amp;quot;column&amp;quot;: &amp;quot;building&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;71a4e2...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;building&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Roadmap column in the widget&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;See what is coming without leaving the page.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-12T08:20:02.000Z&amp;quot; }
    ]},
    { &amp;quot;column&amp;quot;: &amp;quot;shipped&amp;quot;, &amp;quot;hasMore&amp;quot;: false, &amp;quot;items&amp;quot;: [
      { &amp;quot;id&amp;quot;: &amp;quot;5c9d70...&amp;quot;, &amp;quot;column&amp;quot;: &amp;quot;shipped&amp;quot;,
        &amp;quot;publicTitle&amp;quot;: &amp;quot;Feedback filed as labelled issues&amp;quot;,
        &amp;quot;publicDescription&amp;quot;: &amp;quot;Widget submissions arrive as issues your triage already handles.&amp;quot;,
        &amp;quot;publishedAt&amp;quot;: &amp;quot;2026-09-02T15:41:37.000Z&amp;quot; }
    ]}
  ],
  &amp;quot;enabled&amp;quot;: true,
  &amp;quot;language&amp;quot;: &amp;quot;en&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Trois éléments sur trois colonnes forment une roadmap publique parfaitement bonne. Elle dit ce qui
arrive, ce qui se passe, et ce qui s&amp;#39;est passé, et chaque ligne est vérifiable. Cinq autres formats,
de Now/Next/Later à la roadmap par résultats, sont présentés avec des exemples d&amp;#39;éléments dans
&lt;a href=&quot;https://changeloop.dev/blog/fr/product-roadmap-examples/&quot;&gt;exemples de roadmap produit&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Combien d&amp;#39;éléments une roadmap publique devrait-elle avoir ?&lt;/strong&gt;
Le moins possible que vous puissiez défendre. Moins de dix au total est normal pour un petit
produit ; plus de trente en &amp;quot;planifié&amp;quot; est un backlog déguisé en roadmap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Une roadmap publique devrait-elle avoir des dates ?&lt;/strong&gt;
Non. Les colonnes communiquent une séquence sans créer d&amp;#39;échéance. Si une cliente a besoin d&amp;#39;une
date, c&amp;#39;est une conversation, pas un élément de roadmap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les clients devraient-ils voter sur les éléments de la roadmap ?&lt;/strong&gt;
Les votes mesurent qui s&amp;#39;est présenté, pas ce qui compte. Un commentaire sur l&amp;#39;issue expliquant la
solution de contournement qu&amp;#39;ils utilisent aujourd&amp;#39;hui vaut plus que cinquante votes, et ça coûte
quelque chose à qui vote, ce qui est le point.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que se passe-t-il pour un élément de roadmap annulé ?&lt;/strong&gt;
Retirez le label et dites pourquoi sur l&amp;#39;issue. Un &amp;quot;on ne va pas faire ça&amp;quot; public fait partie de la
boucle, et c&amp;#39;est le message que la plupart des équipes n&amp;#39;envoient jamais.&lt;/p&gt;
</content:encoded></item><item><title>Automatisation du changelog, et ses limites</title><link>https://changeloop.dev/blog/fr/changelog-automation/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/changelog-automation/</guid><description>Automatisez collecte, formatage et publication. N&apos;automatisez ni la sélection ni la formulation. Où se situe la ligne et ce qui arrive quand elle bouge.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;L&amp;#39;automatisation du changelog fonctionne quand elle automatise la collecte, la classification et la
publication, et s&amp;#39;arrête à la sélection et à la formulation. Automatisez tout et vous livrez un git
log formaté ; n&amp;#39;automatisez rien et le changelog est écrit par rafales, de mémoire, avant les
versions. La question utile est quelles parties automatiser, pas combien.&lt;/p&gt;
&lt;p&gt;Les projets d&amp;#39;automatisation de changelog échouent dans une de deux directions, et les deux sont
prévisibles dès la première réunion de design. Automatisez trop peu et le changelog est un document
que quelqu&amp;#39;un est censé mettre à jour, ce qui signifie qu&amp;#39;il est mis à jour par rafales, par
quiconque a tiré la courte paille. Automatisez trop et ça devient un git log formaté : complet,
précis, et lu par personne.&lt;/p&gt;
&lt;h2&gt;Quelles parties d&amp;#39;un changelog devraient être automatisées ?&lt;/h2&gt;
&lt;p&gt;Trois des quatre étapes. Collecte et publication complètement ; classification comme première
passe avec dérogation humaine ; sélection et formulation jamais.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Étape&lt;/th&gt;
&lt;th&gt;Automatiser ?&lt;/th&gt;
&lt;th&gt;Pourquoi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Collecte : changements depuis commits, PR, tickets vers une liste&lt;/td&gt;
&lt;td&gt;Complètement&lt;/td&gt;
&lt;td&gt;Fastidieux, sauté sous délai, les machines le font parfaitement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Classification : Added, Fixed, Changed, Deprecated, Removed, Security&lt;/td&gt;
&lt;td&gt;Première passe, dérogation humaine&lt;/td&gt;
&lt;td&gt;Environ 80% correct depuis les métadonnées seules ; les 20% faux sont les entrées qui comptent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sélection et formulation : quoi dire au lecteur, et comment&lt;/td&gt;
&lt;td&gt;Jamais&lt;/td&gt;
&lt;td&gt;C&amp;#39;est toute la valeur de l&amp;#39;artefact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Publication : page, flux, email, widget, Slack&lt;/td&gt;
&lt;td&gt;Complètement, depuis une source&lt;/td&gt;
&lt;td&gt;Où va la majorité de l&amp;#39;effort manuel réel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Collecte.&lt;/strong&gt; Sortir les changements de l&amp;#39;endroit où ils se produisent (commits, PR, tickets) et
les mettre dans une liste. Automatisez ça complètement. Les humains sont mauvais pour ça, c&amp;#39;est
fastidieux, et c&amp;#39;est l&amp;#39;étape sautée sous délai.
&lt;a href=&quot;https://changeloop.dev/blog/fr/conventional-commits-changelog/&quot;&gt;Conventional commits&lt;/a&gt; ou les labels de PR sont la
matière première habituelle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Classification.&lt;/strong&gt; Décider si quelque chose est Added, Fixed, Changed, Deprecated, Removed ou
Security. Automatisez la première passe depuis le type de commit ou le label de PR, et laissez un
humain déroger. La précision ici tourne autour de quatre-vingts pour cent depuis les métadonnées
seules, et les vingt pour cent faux se concentrent exactement sur les entrées qui comptent, parce
que l&amp;#39;ambiguïté corrèle avec l&amp;#39;importance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sélection et formulation.&lt;/strong&gt; Décider ce qu&amp;#39;un lecteur devrait savoir et comment le dire.
&lt;strong&gt;N&amp;#39;automatisez pas ça.&lt;/strong&gt; C&amp;#39;est toute la valeur de l&amp;#39;artefact. Tout le reste est de la logistique.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Publication.&lt;/strong&gt; Amener les entrées finies vers une page, un flux, un email, un widget in-app, un
canal Slack. Automatisez complètement, et depuis une source. C&amp;#39;est là que va la majorité de
l&amp;#39;effort manuel réel, et presque personne ne le compte. C&amp;#39;est aussi l&amp;#39;étape qui peut dire à la
personne qui a demandé le changement qu&amp;#39;il a été livré, ce qui est tout le sujet de
&lt;a href=&quot;https://changeloop.dev/blog/fr/customer-feedback-loop/&quot;&gt;fermer la boucle de feedback depuis le changelog&lt;/a&gt;. La moitié
email de cette étape a sa propre forme, dans
&lt;a href=&quot;https://changeloop.dev/blog/fr/product-update-email/&quot;&gt;le modèle d&amp;#39;email de mise à jour produit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce dernier point mérite qu&amp;#39;on s&amp;#39;y arrête. Les équipes tendent à voir le changelog comme un problème
d&amp;#39;écriture, puis passent la majorité de leur temps sur la distribution : copier des entrées dans un
outil email, reformater pour l&amp;#39;in-app, coller dans Slack, mettre à jour une page docs. L&amp;#39;écriture
prend une heure. La copie prend une heure à chaque version, pour toujours, et c&amp;#39;est la partie
qu&amp;#39;une machine devrait avoir.&lt;/p&gt;
&lt;h2&gt;Que se passe-t-il quand la ligne bouge ?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Déplacez-la vers le haut et vous obtenez un dump de git.&lt;/strong&gt; L&amp;#39;automatisation totale depuis les
commits produit &lt;code&gt;bump deps&lt;/code&gt;, &lt;code&gt;fix flaky test&lt;/code&gt;, &lt;code&gt;wip&lt;/code&gt; et &lt;code&gt;address review comments&lt;/code&gt; devant les
clients. Chaque équipe qui a fait ça a ensuite ajouté un filtre, et le filtre est une étape de
sélection réintroduite sous un autre nom, avec une pire ergonomie.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Déplacez-la vers le bas et vous obtenez des rafales.&lt;/strong&gt; La collecte totalement manuelle signifie
que les entrées sont écrites de mémoire au moment de la version. C&amp;#39;est le mode contre lequel
&lt;a href=&quot;https://changeloop.dev/blog/fr/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt; avertit dès le début, et ça se dégrade
silencieusement : le changelog paraît entretenu jusqu&amp;#39;à la semaine où personne n&amp;#39;a eu le temps.&lt;/p&gt;
&lt;h2&gt;À quoi ressemble un pipeline d&amp;#39;automatisation de changelog ?&lt;/h2&gt;
&lt;p&gt;Quatre étapes, avec exactement une porte humaine, placée là où un brouillon devient public.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Au merge, dérivez une entrée brouillon de la PR : type depuis le label ou le préfixe de commit,
titre comme premier brouillon, lien retour vers la PR, autrice enregistrée. Faites-la atterrir
dans un bac non publié.&lt;/li&gt;
&lt;li&gt;N&amp;#39;importe qui peut éditer n&amp;#39;importe quel brouillon à n&amp;#39;importe quel moment, et éditer est bon
marché. La plupart reçoivent une ligne réécrite.&lt;/li&gt;
&lt;li&gt;Tailler une version exige que chaque entrée du bac soit soit éditée soit explicitement marquée
interne. Cette porte est tout le design. Sans elle, les brouillons sont livrés non édités la
semaine chargée.&lt;/li&gt;
&lt;li&gt;Publier est un fan-out depuis l&amp;#39;ensemble publié : la page publique, le flux, l&amp;#39;email, le
widget, le post Slack. Une source, plusieurs rendus, pas de copie.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;L&amp;#39;étape 3 est le seul endroit où une personne est requise, et elle prend environ dix minutes par
version une fois que les brouillons sont corrects. Là où une demande de cliente est impliquée, le
brouillon porte aussi l&amp;#39;issue qu&amp;#39;il ferme, ce qui est ce qui permet à l&amp;#39;étape 4 d&amp;#39;avertir la
demandeuse ; la &lt;a href=&quot;https://changeloop.dev/blog/fr/feature-request-template/&quot;&gt;template de demande de fonctionnalité&lt;/a&gt; est
conçue pour que ce lien survive. La place de cette étape dans le flux de release plus large fait
l&amp;#39;objet du &lt;a href=&quot;https://changeloop.dev/blog/fr/release-management-process/&quot;&gt;processus de release management&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Que demande l&amp;#39;automatisation à vos données ?&lt;/h2&gt;
&lt;p&gt;Rien de tout ça ne fonctionne si le changelog est un fichier Markdown, parce qu&amp;#39;un fichier ne peut
pas être rendu sur cinq surfaces sans être reparsé, et parser de la prose est comment on finit avec
un widget qui affiche la moitié d&amp;#39;un titre.&lt;/p&gt;
&lt;p&gt;Les entrées doivent être structurées : un type, une date, une version ou identifiant de release, une
audience, un corps et un lien. Alors le fichier, la page, le flux et l&amp;#39;email sont tous des vues. Ce
point structurel est la seule chose qui vaut la peine d&amp;#39;être bien faite avant de choisir un outil,
parce que c&amp;#39;est ce qu&amp;#39;on ne peut pas rajouter après bon marché. Rien de tout
ça ne fonctionne si une entrée n&amp;#39;est pas vraiment créée pour chaque changement qui en a besoin ;
&lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-ci-enforcement/&quot;&gt;exiger une entrée de changelog en CI&lt;/a&gt; couvre comment faire
refuser un merge sans entrée par le pipeline, au lieu de laisser cette étape à la mémoire.&lt;/p&gt;
&lt;p&gt;On construit &lt;a href=&quot;https://changeloop.dev/&quot;&gt;changeloop&lt;/a&gt;, où le changelog est d&amp;#39;abord un flux puis une page, donc lisez ça comme
un intérêt plutôt qu&amp;#39;une recommandation impartiale ; le &lt;a href=&quot;https://changeloop.dev/pricing&quot;&gt;pricing&lt;/a&gt; est un repository
gratuit sans carte, suffisant pour voir la forme. &lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;Outils de changelog&lt;/a&gt; est notre
récap de ce qui existe d&amp;#39;autre, y compris les produits avec lesquels on est en concurrence, et le
&lt;a href=&quot;https://changeloop.dev/changelog-generator&quot;&gt;générateur de changelog&lt;/a&gt; fait les étapes de collecte et classification dans
le navigateur si vous voulez voir la dérivation avant de vous engager dans un pipeline.&lt;/p&gt;
&lt;h2&gt;Le test&lt;/h2&gt;
&lt;p&gt;Comptez les minutes entre un changement mergé et ce changement visible pour une cliente qui ne lit
pas votre repo. Si la plupart de ces minutes, c&amp;#39;est quelqu&amp;#39;un qui copie du texte entre outils,
l&amp;#39;automatisation dont vous avez besoin est dans la publication, pas dans l&amp;#39;écriture.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;L&amp;#39;IA peut-elle écrire le changelog ?&lt;/strong&gt;
Elle peut en rédiger un brouillon. Un modèle à qui on donne la pull request mergée produit la
plupart du temps un premier brouillon utilisable du titre et du corps, ce qui est la collecte et la
classification mieux faites. La sélection, si dire quelque chose à un lecteur, et la formulation
finale, ont toujours besoin de la personne qui connaît l&amp;#39;audience, et un pipeline qui publie des
brouillons sans cette porte a automatisé la mauvaise étape.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre un générateur de changelog et l&amp;#39;automatisation du changelog ?&lt;/strong&gt;
Un générateur transforme des commits en une liste formatée une fois, à la demande. L&amp;#39;automatisation
tourne à chaque merge, maintient un bac non publié, conditionne la version à une revue humaine, et
publie sur chaque surface depuis une source. Le générateur est la première étape du pipeline,
exécutée à la main.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le changelog devrait-il être automatisé depuis les commits ou les pull requests ?&lt;/strong&gt;
Depuis les pull requests, où l&amp;#39;unité de changement est la PR : le titre et la description sont
écrits une fois, pour tout le changement, et la PR lie l&amp;#39;issue qu&amp;#39;elle ferme. La dérivation basée
sur les commits fonctionne quand le commit est l&amp;#39;unité et suit une convention.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment empêche-t-on l&amp;#39;automatisation de publier des changements internes ?&lt;/strong&gt;
Classifiez &lt;code&gt;chore&lt;/code&gt;, &lt;code&gt;ci&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;refactor&lt;/code&gt; et les mises à jour de dépendances comme internes par
défaut, et faites de la promotion vers public un acte délibéré. Le défaut inverse, public sauf si
quelqu&amp;#39;un le cache, est comment &lt;code&gt;bump deps&lt;/code&gt; atteint les clients.&lt;/p&gt;
</content:encoded></item><item><title>Changelog vs release notes : quelle est la différence ?</title><link>https://changeloop.dev/blog/fr/changelog-vs-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/changelog-vs-release-notes/</guid><description>Un changelog est un registre continu pour qui cherche quelque chose. Les release notes sont un message trié pour qui décide si ça l&apos;intéresse. La division.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Un changelog est un registre continu et cumulatif de tout ce qui a changé, écrit pour quelqu&amp;#39;un qui
cherche quelque chose. Les release notes sont un message trié sur une version, écrit pour quelqu&amp;#39;un
qui décide si ça le concerne. La différence est l&amp;#39;audience, pas le format, et la plupart des
équipes ont besoin des deux : l&amp;#39;un comme référence, l&amp;#39;autre comme annonce, dérivés des mêmes
entrées.&lt;/p&gt;
&lt;p&gt;La plupart des équipes finissent avec l&amp;#39;un par accident et l&amp;#39;autre sur demande. Vous commencez par
un changelog parce qu&amp;#39;un développeur veut un registre de ce qui a été livré. Des mois plus tard,
quelqu&amp;#39;un du support demande pourquoi les clients ne savaient pas qu&amp;#39;une fonctionnalité est en
production depuis avril, et maintenant il vous faut des release notes.&lt;/p&gt;
&lt;h2&gt;Changelog vs release notes, côte à côte&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Changelog&lt;/th&gt;
&lt;th&gt;Release notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Lecteur&lt;/td&gt;
&lt;td&gt;Quelqu&amp;#39;un qui cherche quelque chose&lt;/td&gt;
&lt;td&gt;Quelqu&amp;#39;un qui décide si ça le concerne&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portée&lt;/td&gt;
&lt;td&gt;Tout ce qui a changé&lt;/td&gt;
&lt;td&gt;Ce qui vaut la peine d&amp;#39;être dit sur cette version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cadence&lt;/td&gt;
&lt;td&gt;Continue, par merge ou par version&lt;/td&gt;
&lt;td&gt;Par version, et seulement celles qui méritent d&amp;#39;être annoncées&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ton&lt;/td&gt;
&lt;td&gt;Concis, factuel, souvent impératif&lt;/td&gt;
&lt;td&gt;Explicatif, parfois persuasif&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Durée de vie&lt;/td&gt;
&lt;td&gt;Permanente, lue des années plus tard&lt;/td&gt;
&lt;td&gt;Lue la première semaine, puis archivée&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vit dans&lt;/td&gt;
&lt;td&gt;Le repo, un site de docs, une page &lt;code&gt;/changelog&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Email, in-app, un article de blog, une page de version&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Échoue par&lt;/td&gt;
&lt;td&gt;Être incomplet&lt;/td&gt;
&lt;td&gt;Être ennuyeux, ou arriver après coup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Qu&amp;#39;est-ce qu&amp;#39;un changelog ?&lt;/h2&gt;
&lt;p&gt;Un changelog est un registre chronologique, quasi complet, de ce qui a changé, le plus récent en
premier, avec chaque entrée typée (added, changed, deprecated, removed, fixed, security) et datée.
Son lecteur a déjà décidé que ça l&amp;#39;intéresse. Il cherche quelque chose : quand un comportement a
changé, si un bug est corrigé, quelle version a introduit un flag. La complétude est toute la
valeur, c&amp;#39;est pourquoi la convention &lt;a href=&quot;https://changeloop.dev/blog/fr/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt;
consacre l&amp;#39;essentiel de son unique page à la structure et presque rien à la prose.&lt;/p&gt;
&lt;h2&gt;Que sont les release notes ?&lt;/h2&gt;
&lt;p&gt;Les release notes sont un message sélectif, écrit en prose, sur une version. Leur lecteur n&amp;#39;a
encore rien décidé. Il décide si cette version le concerne, et s&amp;#39;il doit faire quelque chose à ce
sujet. La sélection est toute la valeur : une release note qui liste tout est un changelog avec des
paragraphes, et elle échoue son lecteur de la même façon qu&amp;#39;un changelog qui saute des choses
échoue le sien. &lt;a href=&quot;https://changeloop.dev/blog/fr/how-to-write-release-notes/&quot;&gt;Comment écrire des release notes&lt;/a&gt; traite de
la sélection et de la formulation.&lt;/p&gt;
&lt;h2&gt;Faut-il un changelog et des release notes ?&lt;/h2&gt;
&lt;p&gt;Il vous faut les deux dès que vos deux audiences veulent des choses différentes ; jusque-là, un
seul artefact qui fait les deux jobs est correct. Les petites équipes publient une seule page
&lt;code&gt;/changelog&lt;/code&gt; avec un court paragraphe en haut de chaque entrée, et pendant un moment ça sert aussi
bien un développeur qui cherche une correction qu&amp;#39;une cliente qui parcourt les nouveautés. Diviser
trop tôt vous donne deux choses à maintenir et l&amp;#39;une des deux pourrira.&lt;/p&gt;
&lt;p&gt;La division vaut la peine quand ça commence à arriver :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vos entrées de changelog ont développé des paragraphes explicatifs que les développeurs scrollent
sans lire.&lt;/li&gt;
&lt;li&gt;Ou l&amp;#39;inverse : vos annonces de version ont commencé à lister des mises à jour de dépendances.&lt;/li&gt;
&lt;li&gt;Le support copie des entrées dans des emails et les réécrit au passage.&lt;/li&gt;
&lt;li&gt;Quelqu&amp;#39;un demande &amp;quot;juste les changements cassants&amp;quot; et vous ne pouvez pas les filtrer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce dernier point est le vrai signal. Si personne ne peut répondre &amp;quot;qu&amp;#39;est-ce qui a changé qui me
concerne&amp;quot; sans tout lire, vous avez un artefact qui fait mal deux jobs.&lt;/p&gt;
&lt;h2&gt;Une source, deux vues&lt;/h2&gt;
&lt;p&gt;L&amp;#39;erreur est de les traiter comme deux documents. Ce sont deux vues sur le même ensemble de
changements.&lt;/p&gt;
&lt;p&gt;Écrivez le changelog au fil de l&amp;#39;eau, une entrée par changement significatif, chacune étiquetée
avec ce qu&amp;#39;elle est : fixed, added, changed, removed, deprecated, security. Gardez les entrées
assez courtes pour qu&amp;#39;en écrire une ne soit pas une décision. Puis, au moment de la version, les
release notes sont une sélection et une réécriture : prenez les entrées qui importent à une
personne, regroupez-les par ce qu&amp;#39;elles permettent de faire, et mettez la raison en haut.&lt;/p&gt;
&lt;p&gt;Ça a une conséquence pratique. Si le changelog est la source, il doit être des données
structurées, pas une page maintenue à la main. Une entrée a besoin d&amp;#39;un type, d&amp;#39;une date, d&amp;#39;une
version, et d&amp;#39;une façon de dire pour qui elle est. Une fois qu&amp;#39;elle a ça, la page publique, le
widget in-app et le flux RSS ou JSON sont trois rendus d&amp;#39;une seule chose, et personne ne
réécrit rien en chemin vers une cliente. Un email de release notes peut citer la même entrée,
depuis n&amp;#39;importe quel outil qui envoie vos emails. &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-automation/&quot;&gt;Automatisation du changelog&lt;/a&gt;
traite de laquelle de ces étapes devrait appartenir à une machine. C&amp;#39;est tout l&amp;#39;argument pour
traiter un changelog comme un flux plutôt qu&amp;#39;une page. C&amp;#39;est aussi, en toute transparence, ce qu&amp;#39;on
construit, donc lisez ça comme un intérêt plutôt qu&amp;#39;un sondage neutre.&lt;/p&gt;
&lt;h2&gt;Si vous n&amp;#39;avez le temps que pour un seul&lt;/h2&gt;
&lt;p&gt;Écrivez le changelog. C&amp;#39;est moins cher par entrée, c&amp;#39;est utile le jour où vous l&amp;#39;écrivez, et les
release notes peuvent en être dérivées après. L&amp;#39;inverse n&amp;#39;est pas vrai : vous ne pouvez pas
reconstruire un an de changements à partir de douze emails d&amp;#39;annonce, et on vous le demandera.&lt;/p&gt;
&lt;p&gt;Gardez-le dans un format fixe pour que la dérivation reste possible. Notre page
&lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;exemples de changelog&lt;/a&gt; rassemble des entrées d&amp;#39;équipes qui font ça bien, et
la &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;release notes template&lt;/a&gt; est la forme qu&amp;#39;on utilise en transformant un
ensemble d&amp;#39;entrées en quelque chose qui vaut la peine d&amp;#39;être envoyé.&lt;/p&gt;
&lt;h2&gt;Une note sur les noms&lt;/h2&gt;
&lt;p&gt;Rien de tout ça n&amp;#39;est standardisé, et vous trouverez &amp;quot;release notes&amp;quot; utilisé pour une liste
continue et &amp;quot;changelog&amp;quot; utilisé pour une annonce trimestrielle. Discuter des mots ne vaut pas le
coup. Décidez lequel des deux jobs fait chacun de vos artefacts, appelez-le comme votre équipe
l&amp;#39;appelle déjà, et assurez-vous qu&amp;#39;aucun des deux ne fait silencieusement les deux.&lt;/p&gt;
&lt;p&gt;Sur quelle surface le résultat atterrit est une décision à part, couverte dans
&lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-page/&quot;&gt;construire une page de changelog&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Un changelog est-il la même chose que les release notes ?&lt;/strong&gt;
Non. Un changelog est le registre complet, lu par ceux qui cherchent quelque chose ; les release
notes sont l&amp;#39;annonce sélectionnée, lue par ceux qui décident si ça les intéresse. Le même
changement apparaît dans les deux, formulé différemment pour chaque lecteur.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Peut-on générer des release notes à partir d&amp;#39;un changelog ?&lt;/strong&gt;
Oui, et c&amp;#39;est la bonne direction. Sélectionnez les entrées qui importeraient à une personne,
regroupez-les par résultat, réécrivez le titre. L&amp;#39;inverse, reconstruire un changelog à partir
d&amp;#39;annonces, perd tout ce que les annonces ont laissé de côté.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Où devrait vivre un changelog ?&lt;/strong&gt;
Quelque part de permanent et liable auquel la lectrice peut accéder sans repository : une page
&lt;code&gt;/changelog&lt;/code&gt;, un site de docs, ou un flux qui se rend à plusieurs endroits. Un &lt;code&gt;CHANGELOG.md&lt;/code&gt; seul
atteint les contributeurs, pas les clients.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un changelog devrait-il inclure les changements internes ?&lt;/strong&gt;
Oui, en bas, une ligne chacun. Le changelog est le registre complet. Les release notes peuvent
aussi les garder, dans une courte dernière section, tant que les changements qu&amp;#39;un lecteur
remarquera viennent en premier.&lt;/p&gt;
</content:encoded></item><item><title>Des conventional commits à un changelog</title><link>https://changeloop.dev/blog/fr/conventional-commits-changelog/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/conventional-commits-changelog/</guid><description>Les conventional commits rendent un changelog dérivable, pas lisible. Ce que la convention apporte, où elle s&apos;arrête, et comment combler l&apos;écart.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Les conventional commits offrent gratuitement trois choses à un changelog : le type de chaque
changement, la partie du système touchée, et si ça casse quelque chose. Ils n&amp;#39;offrent rien
d&amp;#39;autre. La formulation, le regroupement et la sélection, qui sont le changelog, restent
entièrement ouverts, et un pipeline qui prétend le contraire livre un git log formaté.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;feat(exports): add CSV column selection
fix(auth): reject expired refresh tokens
chore(deps): bump node-pg to 8.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Trois commits au format &lt;a href=&quot;https://www.conventionalcommits.org/&quot;&gt;Conventional Commits&lt;/a&gt;. À partir de
ceux-ci, une machine peut vous dire qu&amp;#39;un est une fonctionnalité, un est une correction, un est du
ménage, et quelle partie du système chacun a touché. C&amp;#39;est vraiment utile, et c&amp;#39;est toute la
promesse de la convention : un historique de commits lisible par autre chose qu&amp;#39;une personne.
L&amp;#39;erreur est de penser que ça vous donne un changelog. Ça vous donne la matière première.&lt;/p&gt;
&lt;h2&gt;Que spécifie la convention ?&lt;/h2&gt;
&lt;p&gt;Un type, un scope optionnel, et une description : &lt;code&gt;type(scope): description&lt;/code&gt;. Les types sont
conventionnellement &lt;code&gt;feat&lt;/code&gt;, &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;chore&lt;/code&gt;, &lt;code&gt;docs&lt;/code&gt;, &lt;code&gt;refactor&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;perf&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt;, &lt;code&gt;ci&lt;/code&gt;. Deux
choses marquent un changement cassant : un &lt;code&gt;!&lt;/code&gt; avant les deux-points, ou un footer
&lt;code&gt;BREAKING CHANGE:&lt;/code&gt;. Les outils se basent sur &lt;code&gt;feat&lt;/code&gt; et &lt;code&gt;fix&lt;/code&gt; pour les bumps de version mineure et
patch, et sur le marqueur breaking pour une majeure.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Le commit vous donne&lt;/th&gt;
&lt;th&gt;Le changelog a besoin de&lt;/th&gt;
&lt;th&gt;Qui comble l&amp;#39;écart&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feat&lt;/code&gt; / &lt;code&gt;fix&lt;/code&gt; / &lt;code&gt;chore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Added / Fixed / interne&lt;/td&gt;
&lt;td&gt;Un mapping, automatique&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;(scope)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Un regroupement que le lecteur reconnaît&lt;/td&gt;
&lt;td&gt;Une personne, une fois par scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;!&lt;/code&gt; ou &lt;code&gt;BREAKING CHANGE:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Qui casse, pour quand, et quoi faire&lt;/td&gt;
&lt;td&gt;Une personne, à chaque fois&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;La description, écrite pour une revieweuse&lt;/td&gt;
&lt;td&gt;Le résultat, écrit pour une cliente&lt;/td&gt;
&lt;td&gt;Une personne, chaque entrée&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Un commit&lt;/td&gt;
&lt;td&gt;Un changement, qui peut être plusieurs commits&lt;/td&gt;
&lt;td&gt;Règles de squash, ou une personne&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Le marqueur le dit à l&amp;#39;outil ; il ne le dit pas à l&amp;#39;appelant, ce qui est le sujet de
&lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;comment déprécier une API&lt;/a&gt; et
&lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;qu&amp;#39;est-ce qu&amp;#39;un changement cassant&lt;/a&gt;. C&amp;#39;est une petite spec et ça vaut
la peine de la suivre même si vous n&amp;#39;en générez jamais rien, parce qu&amp;#39;elle force une décision par
commit : est-ce un changement que les utilisateurs voient, ou non.&lt;/p&gt;
&lt;h2&gt;Où s&amp;#39;arrêtent les conventional commits ?&lt;/h2&gt;
&lt;p&gt;Ils s&amp;#39;arrêtent à la phrase. Tout ce que la convention capture, ce sont des métadonnées sur un
changement ; le changement lui-même est toujours décrit dans le vocabulaire d&amp;#39;une revieweuse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les messages de commit sont écrits pour des revieweuses.&lt;/strong&gt; &lt;code&gt;fix(auth): reject expired refresh tokens&lt;/code&gt; est correct et ne dit rien à une cliente. La lectrice d&amp;#39;un changelog veut &amp;quot;vous serez
déconnecté quand une session a vraiment expiré, au lieu de voir des 401 intermittents&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les scopes sont internes.&lt;/strong&gt; &lt;code&gt;exports&lt;/code&gt;, &lt;code&gt;auth&lt;/code&gt;, &lt;code&gt;ingest&lt;/code&gt; sont des noms de modules. Ils sont
stables, ce qui les rend bons pour regrouper, et sans signification pour quiconque en dehors de la
codebase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un changement, c&amp;#39;est souvent plusieurs commits.&lt;/strong&gt; Une fonctionnalité mergée sur onze commits
produit onze entrées, dix desquelles du bruit, et les écraser pour cacher ça perd l&amp;#39;historique de
revue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;chore&lt;/code&gt; est un fourre-tout, pas une catégorie.&lt;/strong&gt; Mises à jour de dépendances, changements CI et
renommages atterrissent tous là, et certains comptent pour les utilisateurs alors que la plupart
non.&lt;/p&gt;
&lt;p&gt;Donc : la convention vous donne gratuitement type, scope et statut breaking, et laisse la
formulation, le regroupement et la sélection entièrement ouverts. Ces trois-là sont le changelog. &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-entry-ownership/&quot;&gt;À qui
appartient vraiment une entrée de changelog&lt;/a&gt; couvre qui
devrait s&amp;#39;occuper de cette formulation, ce regroupement et cette sélection, puisque la convention
elle-même n&amp;#39;a aucun avis là-dessus.&lt;/p&gt;
&lt;h2&gt;Comment génère-t-on un changelog à partir de conventional commits ?&lt;/h2&gt;
&lt;p&gt;En deux couches, et la seconde doit être obligatoire.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Couche un, automatique.&lt;/strong&gt; Au merge, dérivez une entrée brouillon du commit : type mappé sur un
type de changelog (&lt;code&gt;feat&lt;/code&gt; sur Added, &lt;code&gt;fix&lt;/code&gt; sur Fixed, un marqueur breaking sur Changed plus un
flag), scope gardé comme métadonnée plutôt que comme texte, lien vers la PR. Faites-la atterrir dans
la section Unreleased que demande &lt;a href=&quot;https://changeloop.dev/blog/fr/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Couche deux, humaine, et requise.&lt;/strong&gt; Avant qu&amp;#39;une version sorte, chaque entrée brouillon reçoit
soit une réécriture d&amp;#39;une ligne dans le vocabulaire de l&amp;#39;utilisateur, soit est marquée interne et
retirée de la vue publique. C&amp;#39;est l&amp;#39;étape que les gens essaient de sauter, et la sauter est ce qui
produit des changelogs qui se lisent comme un diff.&lt;/p&gt;
&lt;p&gt;Le détail de design important est que la couche deux n&amp;#39;est pas optionnelle dans le pipeline. Si une
version peut être taillée avec des brouillons non édités, elle le sera, la semaine où tout le monde
est occupé. Quelles étapes appartiennent à la machine et lesquelles à la personne, c&amp;#39;est tout le
sujet de l&amp;#39;&lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-automation/&quot;&gt;automatisation du changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tailler la release est aussi le moment où un tag git, une release et cette entrée de changelog
s&amp;#39;accordent ou commencent à diverger ; &lt;a href=&quot;https://changeloop.dev/blog/fr/git-tags-releases-changelog/&quot;&gt;tags git, releases et votre changelog&lt;/a&gt;
couvre comment garder les trois synchronisés.&lt;/p&gt;
&lt;h2&gt;Trois pièges&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les squash merges mangent les footers.&lt;/strong&gt; Si votre plateforme écrase avec le titre de la PR comme
message, le footer &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; d&amp;#39;un commit à l&amp;#39;intérieur de cette branche disparaît, et
votre outillage cesse silencieusement de voir le changement cassant. Vérifiez ce que votre template
de squash garde vraiment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les commits de revert produisent des entrées fantômes.&lt;/strong&gt; Un &lt;code&gt;fix&lt;/code&gt; qui est reverté le lendemain
génère une entrée pour quelque chose qui n&amp;#39;a jamais été livré, sauf si la dérivation réconcilie les
reverts. La plupart des outils ne le font pas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le bump de version et le changelog se désynchronisent.&lt;/strong&gt; Si la version est calculée à partir des
commits et le changelog écrit à la main après, ils divergent en environ deux versions. Calculez les
deux dans la même passe ou acceptez que l&amp;#39;un des deux soit faux.&lt;/p&gt;
&lt;h2&gt;Si vous voulez la partie mécanique sans pipeline&lt;/h2&gt;
&lt;p&gt;Notre &lt;a href=&quot;https://changeloop.dev/changelog-generator&quot;&gt;générateur de changelog&lt;/a&gt; fait l&amp;#39;étape de dérivation dans le
navigateur : collez des commits, obtenez des entrées regroupées et typées en sortie. C&amp;#39;est
délibérément déterministe et entièrement côté client, donc les commits que vous collez ne quittent
jamais votre machine, ce qui compte quand les messages viennent d&amp;#39;un repository privé. Ça fait
honnêtement la moitié collecte et ne tente pas la couche deux, parce que la couche deux est un
jugement et un outil qui la simule produit exactement le changelog contre lequel cet article
argumente.&lt;/p&gt;
&lt;p&gt;Pour la version pipeline, &lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;outils de changelog&lt;/a&gt; couvre ce qui existe.&lt;/p&gt;
&lt;h2&gt;Le résumé&lt;/h2&gt;
&lt;p&gt;Les conventional commits répondent &amp;quot;quel type de changement est-ce&amp;quot; de manière fiable et bon
marché. Ils ne répondent pas &amp;quot;que devrait-on dire aux gens&amp;quot;, et aucune quantité d&amp;#39;outillage
au-dessus du message de commit ne le fera, parce que l&amp;#39;information n&amp;#39;a jamais été dans le message
de commit. Budgétez la réécriture.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les conventional commits génèrent-ils automatiquement un changelog ?&lt;/strong&gt;
Ils génèrent automatiquement un brouillon : entrées typées, avec scope, liées. La formulation pour
une cliente, le regroupement et la décision de ce qu&amp;#39;il faut laisser de côté ont toujours besoin
d&amp;#39;une personne, et un pipeline qui saute cette étape publie des messages de commit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quels types de conventional commit apparaissent dans un changelog ?&lt;/strong&gt;
&lt;code&gt;feat&lt;/code&gt; et &lt;code&gt;fix&lt;/code&gt; toujours, comme Added et Fixed. &lt;code&gt;perf&lt;/code&gt; généralement, comme Changed. &lt;code&gt;chore&lt;/code&gt;,
&lt;code&gt;docs&lt;/code&gt;, &lt;code&gt;refactor&lt;/code&gt;, &lt;code&gt;test&lt;/code&gt;, &lt;code&gt;build&lt;/code&gt; et &lt;code&gt;ci&lt;/code&gt; sont internes par défaut et n&amp;#39;apparaissent que si une
personne en promeut un.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment les conventional commits marquent-ils un changement cassant ?&lt;/strong&gt;
Un &lt;code&gt;!&lt;/code&gt; après le type ou le scope (&lt;code&gt;feat(api)!: ...&lt;/code&gt;), ou un footer &lt;code&gt;BREAKING CHANGE:&lt;/code&gt; dans le corps
du commit. Les deux se perdent si un squash merge ne garde que le titre de la PR.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A-t-on besoin de conventional commits pour automatiser un changelog ?&lt;/strong&gt;
Non. Les labels de PR, les templates de PR et les liens d&amp;#39;issues portent les mêmes métadonnées
pour les équipes qui mergent par pull request. Les conventional commits sont l&amp;#39;option la moins
chère quand l&amp;#39;unité de changement est le commit.&lt;/p&gt;
</content:encoded></item><item><title>Comment écrire des release notes que les gens lisent</title><link>https://changeloop.dev/blog/fr/how-to-write-release-notes/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/how-to-write-release-notes/</guid><description>«Corrections de bugs et améliorations de performance» n&apos;est pas une release note. La question que chaque entrée doit résoudre, et une réécriture réelle.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Pour écrire des release notes que les gens lisent, répondez à une question par entrée : qu&amp;#39;est-ce
que la lectrice peut faire maintenant qu&amp;#39;elle ne pouvait pas avant, et que doit-elle faire à ce
sujet. Mettez en premier tout ce qui a une échéance, nommez qui est concerné, dites &amp;quot;aucune action
requise&amp;quot; quand c&amp;#39;est vrai, et sautez les versions qui n&amp;#39;ont rien à dire. Tout le reste de cette
page est cette règle appliquée.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Corrections de bugs et améliorations de performance.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Chaque produit a publié ça un jour. La cause est rarement la paresse : c&amp;#39;est ce qu&amp;#39;on obtient quand
les release notes sont écrites de l&amp;#39;intérieur, par quelqu&amp;#39;un qui a passé deux semaines dans le diff
et ne peut plus voir quelles parties intéresseraient un inconnu. Un meilleur ton ne réglera pas ça ;
répondre à la question, oui.&lt;/p&gt;
&lt;h2&gt;Que devraient inclure des release notes ?&lt;/h2&gt;
&lt;p&gt;Les release notes devraient inclure, pour chaque changement qui mérite d&amp;#39;être mentionné : ce que la
lectrice peut faire maintenant, qui est concerné, ce qu&amp;#39;elle doit faire (y compris &amp;quot;rien&amp;quot;), et
quand entre en vigueur ce qui a une échéance. Elles ne devraient pas inclure de numéros de tickets
internes, de noms de composants que seule l&amp;#39;équipe utilise, ou un numéro de version comme seul
titre.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Inclure&lt;/th&gt;
&lt;th&gt;Laisser de côté&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Le résultat, dans les termes de la lectrice&lt;/td&gt;
&lt;td&gt;L&amp;#39;implémentation, dans les termes de l&amp;#39;équipe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qui est concerné, par plan, rôle ou version d&amp;#39;API&lt;/td&gt;
&lt;td&gt;&amp;quot;Certains utilisateurs&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L&amp;#39;action requise, ou &amp;quot;aucune action requise&amp;quot;&lt;/td&gt;
&lt;td&gt;Le silence, que la lectrice remplit par le pire scénario&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Une date pour tout ce qui a une échéance&lt;/td&gt;
&lt;td&gt;Un numéro de version en guise de date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Un lien vers la doc qui explique&lt;/td&gt;
&lt;td&gt;Un lien vers la pull request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Les bugs signalés, et la limite qui a été relevée&lt;/td&gt;
&lt;td&gt;Des id de tickets internes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;La section ennuyeuse, une ligne chacune, en bas&lt;/td&gt;
&lt;td&gt;La section ennuyeuse mélangée aux nouveautés&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La séparation entre une release note et une &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-vs-release-notes/&quot;&gt;entrée de changelog&lt;/a&gt;
est ce qui rend cette liste possible : le changelog garde tout, donc les notes peuvent laisser des
choses de côté. Des exemples annotés de chaque type d&amp;#39;entrée sont rassemblés dans
&lt;a href=&quot;https://changeloop.dev/blog/fr/release-notes-examples/&quot;&gt;exemples de release notes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;La question à laquelle répond chaque entrée&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Qu&amp;#39;est-ce que la lectrice peut faire maintenant qu&amp;#39;elle ne pouvait pas avant, et que doit-elle
faire à ce sujet ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si une entrée ne peut pas répondre à ça, elle appartient au changelog et non aux release notes. Les
deux moitiés comptent. La première moitié, c&amp;#39;est la valeur. La deuxième moitié, c&amp;#39;est celle que les
équipes oublient, et c&amp;#39;est celle qui génère des tickets de support quand elle manque.&lt;/p&gt;
&lt;p&gt;Deux exemples de la seconde moitié qui fait un vrai travail :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Les webhooks existants continuent de fonctionner jusqu&amp;#39;au 1er novembre. Après cette date, les
payloads non signés seront rejetés.&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Aucune action requise. Les exports existants sont automatiquement réencodés la prochaine fois
que vous les ouvrez.&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le second dit explicitement &amp;quot;aucune action requise&amp;quot;. Cette phrase vaut la peine d&amp;#39;être écrite à
chaque fois, parce qu&amp;#39;une lectrice qui ne la trouve pas suppose le pire.&lt;/p&gt;
&lt;h2&gt;Comment devrait-on ordonner des release notes ?&lt;/h2&gt;
&lt;p&gt;Ordonnez-les par conséquence pour la lectrice, jamais par la partie du système qui a changé.
Regrouper par API, dashboard, mobile et infrastructure, c&amp;#39;est votre organigramme, pas le problème
de la lectrice.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Les changements cassants et tout ce qui a une échéance.&lt;/strong&gt; En premier, toujours, même si c&amp;#39;est
petit. Si une lectrice arrête de lire après une ligne, c&amp;#39;est celle-là qu&amp;#39;elle devait avoir lue.
Si l&amp;#39;échéance est un sunset, l&amp;#39;entrée devrait ressembler à un
&lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;avis de dépréciation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ce qui est nouveau et qu&amp;#39;elles voudront.&lt;/strong&gt; Un par paragraphe, avec le résultat dans la première
proposition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ce qui s&amp;#39;est amélioré.&lt;/strong&gt; Les bugs signalés, les limites relevées, les choses qui étaient
lentes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tout le reste, en liste.&lt;/strong&gt; Mises à jour de dépendances, refactors internes, copy mineur. Une
ligne chacune. Personne ne lit cette section, et elle devrait quand même être là, parce que la
personne qui la cherche en a vraiment besoin.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;La réécriture&lt;/h2&gt;
&lt;p&gt;Avant :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;v4.2.0&lt;/strong&gt; Correction d&amp;#39;un problème où l&amp;#39;endpoint &lt;code&gt;POST /exports&lt;/code&gt; renvoyait de manière
intermittente 500 sous charge. Refactorisation du worker d&amp;#39;export. Mise à jour de &lt;code&gt;node-pg&lt;/code&gt; en
8.11. Amélioration de la gestion d&amp;#39;erreurs dans le sérialiseur CSV.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Après :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Les exports ne plantent plus sur les gros comptes.&lt;/strong&gt;
Les comptes de plus de 50 000 lignes environ pouvaient recevoir un 500 au démarrage d&amp;#39;un export,
plus souvent en fin de mois. C&amp;#39;est corrigé, et les exports de toute taille se relancent
maintenant tout seuls plutôt que d&amp;#39;échouer. Aucune action requise, et tout export qui a échoué la
semaine dernière peut simplement être relancé.&lt;/p&gt;
&lt;p&gt;Aussi dans la 4.2.0 : &lt;code&gt;node-pg&lt;/code&gt; 8.11, erreurs plus claires dans le sérialiseur CSV.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Même version. La seconde nomme le compte concerné, le moment où c&amp;#39;était le pire, ce qui a changé, et
quoi faire. La mise à jour de dépendance n&amp;#39;a pas disparu, elle a juste cessé d&amp;#39;être le titre.
L&amp;#39;article &lt;a href=&quot;https://changeloop.dev/blog/fr/release-notes-best-practices/&quot;&gt;bonnes pratiques des release notes&lt;/a&gt; a le reste
des règles que suit cette réécriture, chacune avec ce qu&amp;#39;il en coûte de la sauter.&lt;/p&gt;
&lt;h2&gt;Choses qui valent la peine d&amp;#39;être supprimées&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;Nous sommes ravis d&amp;#39;annoncer.&amp;quot;&lt;/strong&gt; La lectrice n&amp;#39;est pas encore ravie. Gagnez-la dans la phrase
suivante.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Numéros de tickets internes.&lt;/strong&gt; &lt;code&gt;PROJ-4471&lt;/code&gt; ne signifie rien hors de votre tracker. Si l&amp;#39;entrée
a besoin d&amp;#39;une référence, liez la page de doc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noms de composants que seule votre équipe utilise.&lt;/strong&gt; Si vous avez renommé le &amp;quot;pipeline
d&amp;#39;ingest&amp;quot;, dites &amp;quot;imports&amp;quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un numéro de version comme seul titre.&lt;/strong&gt; &lt;code&gt;v4.2.0&lt;/code&gt; est une étiquette d&amp;#39;archivage, pas un résumé.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Captures d&amp;#39;écran d&amp;#39;une page de réglages que personne n&amp;#39;a jamais visitée.&lt;/strong&gt; Montrez ce qui a
changé, en usage.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;À quelle fréquence devrait-on publier des release notes ?&lt;/h2&gt;
&lt;p&gt;Publiez quand quelque chose s&amp;#39;est passé, pas selon un calendrier. Des notes qui arrivent à chaque
version entraînent tout le monde à les ignorer. Des notes qui arrivent quand quelque chose s&amp;#39;est
passé se font ouvrir. C&amp;#39;est correct, et généralement juste, de livrer une version sans aucune note
et de faire rouler ses entrées dans le prochain lot qui a un titre qui vaut la peine d&amp;#39;être lu.&lt;/p&gt;
&lt;p&gt;Le changelog continue de tout enregistrer. C&amp;#39;est la répartition du travail : le changelog est
complet, les notes sont sélectives. Si vous gardez le changelog structuré au fil de l&amp;#39;eau, écrire
les notes devient de la sélection et de la réécriture plutôt que de l&amp;#39;archéologie.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;release notes template&lt;/a&gt; est la forme qu&amp;#39;on utilise pour l&amp;#39;étape de
sélection, et &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;exemples de changelog&lt;/a&gt; rassemble des entrées d&amp;#39;équipes dont le
changelog est assez bon pour en dériver des notes.&lt;/p&gt;
&lt;p&gt;Tout ça suppose une page qu&amp;#39;on contrôle entièrement, sans limite de longueur et avec des liens qui
fonctionnent. &lt;a href=&quot;https://changeloop.dev/blog/fr/mobile-app-release-notes/&quot;&gt;Release notes mobiles&lt;/a&gt; couvre ce qui change
quand la surface est une fiche App Store ou Play Store.
&lt;a href=&quot;https://changeloop.dev/blog/fr/emergency-release-notes/&quot;&gt;Release notes d&amp;#39;urgence&lt;/a&gt; couvre l&amp;#39;autre exception : ce qui
change quand il ne reste plus du tout de temps pour suivre le processus normal de rédaction.&lt;/p&gt;
&lt;h2&gt;Un test avant de publier&lt;/h2&gt;
&lt;p&gt;Lisez les notes comme quelqu&amp;#39;un qui a été en vacances deux semaines et a 40 secondes. Si dans ce
temps, cette personne ne peut pas dire si quelque chose lui est demandé, les notes ne sont pas
finies, aussi précises soient-elles.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Combien de temps devraient durer des release notes ?&lt;/strong&gt;
Autant que le nécessitent les changements à conséquences, et pas une ligne de plus. Une version
avec un changement cassant et deux améliorations, c&amp;#39;est trois paragraphes. Gonfler une version
tranquille pour la faire paraître substantielle, c&amp;#39;est comment les lecteurs apprennent à sauter les
notes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qui devrait écrire les release notes ?&lt;/strong&gt;
La personne qui comprend le changement, éditée par quelqu&amp;#39;un qui ne le comprend pas. L&amp;#39;ingénieure
sait ce qui a changé ; l&amp;#39;éditrice sait ce qu&amp;#39;un inconnu comprendra de travers. Écrire l&amp;#39;entrée au
moment du merge, pendant que l&amp;#39;ingénieure s&amp;#39;en souvient encore, est la pratique qui rend tout ça
bon marché.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les release notes devraient-elles inclure des corrections de bugs ?&lt;/strong&gt;
Oui, celles que quelqu&amp;#39;un a signalées ou subies. Indiquez le symptôme vu par la lectrice, pas la
cause. &amp;quot;Les exports de plus de 50 000 lignes échouaient&amp;quot; est une correction qu&amp;#39;une lectrice
reconnaît ; &amp;quot;correction d&amp;#39;une race condition dans le worker d&amp;#39;export&amp;quot; est un message de commit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quelle est la différence entre des release notes et un changelog ?&lt;/strong&gt;
Le changelog est le registre complet et continu ; les release notes sont le message sélectionné sur
une version, écrit pour des gens qui n&amp;#39;ont pas encore décidé si ça les intéresse. La réponse plus
longue est dans &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-vs-release-notes/&quot;&gt;changelog vs release notes&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Keep a Changelog, vraiment implémenté</title><link>https://changeloop.dev/blog/fr/keep-a-changelog-implemented/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/keep-a-changelog-implemented/</guid><description>La spec Keep a Changelog tient en une page et se lit en dix minutes. Les équipes dérivent en l&apos;appliquant. Ce qu&apos;elle dit, ce qu&apos;elle laisse ouvert.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Keep a Changelog est une convention d&amp;#39;une page pour un &lt;code&gt;CHANGELOG.md&lt;/code&gt; : version la plus récente en
premier, une section par version avec un numéro et une date ISO, entrées regroupées sous six types
(Added, Changed, Deprecated, Removed, Fixed, Security), et une section Unreleased en haut pour les
entrées entre les versions. La plupart des équipes qui la citent en implémentent environ deux
tiers, et le tiers qu&amp;#39;elles laissent tomber est celui qui protège leurs utilisateurs.&lt;/p&gt;
&lt;p&gt;Olivier Lacan a publié &lt;a href=&quot;https://keepachangelog.com/&quot;&gt;Keep a Changelog&lt;/a&gt; en 2014 avec une phrase qui
a mieux vieilli que la plupart de la prose logicielle : &lt;em&gt;don&amp;#39;t let your friends dump git logs into
changelogs&lt;/em&gt;. Dix ans plus tard, c&amp;#39;est ce qui se rapproche le plus d&amp;#39;un standard dans ce coin du
logiciel. Ça vaut la peine de lire la source plutôt qu&amp;#39;un résumé ; ceci traite des parties
abandonnées.&lt;/p&gt;
&lt;h2&gt;Que demande Keep a Changelog ?&lt;/h2&gt;
&lt;p&gt;Un &lt;code&gt;CHANGELOG.md&lt;/code&gt; à la racine du repo, le plus récent en premier, avec une section par version.
Chaque version porte un numéro et une date ISO, et regroupe ses entrées sous six types :&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Pour&lt;/th&gt;
&lt;th&gt;Ce que ça coûte de l&amp;#39;abandonner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Added&lt;/td&gt;
&lt;td&gt;Nouvelles fonctionnalités&lt;/td&gt;
&lt;td&gt;Rien ; personne n&amp;#39;abandonne celui-là&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changed&lt;/td&gt;
&lt;td&gt;Changements de comportement existant&lt;/td&gt;
&lt;td&gt;Les lecteurs découvrent un changement de comportement par une erreur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deprecated&lt;/td&gt;
&lt;td&gt;Fonctionnalités sur le point d&amp;#39;être supprimées&lt;/td&gt;
&lt;td&gt;Une suppression devient un incident plutôt qu&amp;#39;un événement planifié&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;Fonctionnalités supprimées dans cette version&lt;/td&gt;
&lt;td&gt;Personne ne distingue une suppression d&amp;#39;un bug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;Corrections de bugs&lt;/td&gt;
&lt;td&gt;Rien ; personne n&amp;#39;abandonne celui-là non plus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Vulnérabilités&lt;/td&gt;
&lt;td&gt;La seule lectrice qui le cherchait ne le trouve pas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Plus une section &lt;code&gt;Unreleased&lt;/code&gt; en haut, pour qu&amp;#39;il y ait un endroit où mettre une entrée dès qu&amp;#39;elle
est mergée, et pour que n&amp;#39;importe qui puisse voir ce qui arrive.&lt;/p&gt;
&lt;p&gt;C&amp;#39;est à peu près tout. Le reste, c&amp;#39;est le raisonnement : les entrées sont pour des humains, une
entrée par changement, et le fichier est un document plutôt qu&amp;#39;un log.&lt;/p&gt;
&lt;h2&gt;Quelles parties de Keep a Changelog sont abandonnées ?&lt;/h2&gt;
&lt;p&gt;La section Unreleased, puis quatre des six types, Security parmi eux, dans
cet ordre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;Unreleased&lt;/code&gt; disparaît en premier.&lt;/strong&gt; C&amp;#39;est la section sans échéance, donc c&amp;#39;est celle dont
l&amp;#39;entretien s&amp;#39;arrête en premier, et une fois partie les entrées sont écrites au moment de la
version à partir de l&amp;#39;historique des commits. C&amp;#39;est précisément le dump de git log contre lequel la
spec avertit dès le départ, atteint progressivement.
&lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-automation/&quot;&gt;Automatisation du changelog&lt;/a&gt; consiste surtout à garder cette
section vivante sans que personne ait à s&amp;#39;en souvenir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les six types s&amp;#39;effondrent en deux.&lt;/strong&gt; La plupart des vrais changelogs finissent avec Added et
Fixed, parce que Changed et Deprecated demandent un jugement sur ce que quelqu&amp;#39;un tenait pour
acquis. Ce jugement est la partie précieuse. Deprecated en particulier est le seul type qui est une
promesse sur l&amp;#39;avenir, et l&amp;#39;abandonner, c&amp;#39;est comment une suppression se transforme en incident ; la
mécanique pour tenir cette promesse est dans &lt;a href=&quot;https://changeloop.dev/blog/fr/api-deprecation/&quot;&gt;comment déprécier une API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security cesse d&amp;#39;être séparé.&lt;/strong&gt; Une correction de sécurité classée sous Fixed est invisible pour
la seule lectrice qui la cherchait. Gardez-la distincte même quand la correction est triviale, et
surtout quand vous préféreriez ne pas y attirer l&amp;#39;attention.&lt;/p&gt;
&lt;h2&gt;Que ne répond pas la spec ?&lt;/h2&gt;
&lt;p&gt;C&amp;#39;est un format de fichier. Elle ne dit rien sur les questions qu&amp;#39;on rencontre immédiatement après
l&amp;#39;avoir adoptée :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comment quelqu&amp;#39;un l&amp;#39;apprend-il ?&lt;/strong&gt; Un fichier dans un repo atteint les contributeurs. Il
n&amp;#39;atteint pas une cliente qui n&amp;#39;a jamais ouvert GitHub.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Et les produits sans versions ?&lt;/strong&gt; Un service déployé en continu n&amp;#39;a pas de v4.2.0 pour
regrouper. La plupart des équipes substituent des dates, ce qui fonctionne, et la spec ne
l&amp;#39;approuve ni ne l&amp;#39;interdit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Qui écrit l&amp;#39;entrée ?&lt;/strong&gt; La spec suppose qu&amp;#39;un humain le fait. Elle ne dit pas quand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Et les audiences multiples ?&lt;/strong&gt; Un fichier sert les développeurs. Il ne sert pas le même contenu
à une administratrice non technique, et le reformater à la main pour elle est où commence la
duplication. &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-vs-release-notes/&quot;&gt;Changelog vs release notes&lt;/a&gt; est la division
que la spec vous laisse faire vous-même.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://common-changelog.org/&quot;&gt;Common Changelog&lt;/a&gt;, un fork plus strict de l&amp;#39;idée, resserre une
partie de ça : il interdit certaines formulations d&amp;#39;entrées, exige un lien vers le changement, et a
un avis tranché sur qui est le lecteur. Ça vaut la peine à lire si les parties floues de Keep a
Changelog sont ce sur quoi votre équipe n&amp;#39;arrête pas de se disputer.&lt;/p&gt;
&lt;h2&gt;Peut-on automatiser Keep a Changelog sans dumper des git logs ?&lt;/h2&gt;
&lt;p&gt;Oui : dérivez le brouillon de commits structurés, mettez-le dans Unreleased avec son type
pré-rempli, et exigez qu&amp;#39;un humain édite la formulation avant qu&amp;#39;une version soit taillée.
L&amp;#39;avertissement de la spec concerne le résultat, pas l&amp;#39;outillage. Dériver un brouillon de commits,
c&amp;#39;est correct. Publier ce brouillon non édité est ce à quoi elle s&amp;#39;oppose.&lt;/p&gt;
&lt;p&gt;La machine gère la collecte et le formatage, ce en quoi elle est bonne. L&amp;#39;humain gère la sélection
et la formulation, ce en quoi elle ne l&amp;#39;est pas.
&lt;a href=&quot;https://changeloop.dev/blog/fr/conventional-commits-changelog/&quot;&gt;Conventional commits&lt;/a&gt; couvre la séparation en deux
couches sur laquelle ça repose, et quels types de commit correspondent à quelles des six
catégories ci-dessus. Notre récap &lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;outils de changelog&lt;/a&gt; couvre ce qui existe pour
la moitié collecte.&lt;/p&gt;
&lt;h2&gt;Où Keep a Changelog cesse-t-il d&amp;#39;être suffisant ?&lt;/h2&gt;
&lt;p&gt;Ça s&amp;#39;arrête à la distribution. Keep a Changelog est une bonne réponse à &amp;quot;à quoi devrait ressembler
ce fichier&amp;quot;. Ce n&amp;#39;est pas une réponse à &amp;quot;comment nos utilisateurs apprennent-ils ce qui a changé&amp;quot;,
parce qu&amp;#39;un fichier Markdown dans un repo est une stratégie de distribution qui ne fonctionne que
si vos utilisateurs sont des contributeurs.&lt;/p&gt;
&lt;p&gt;C&amp;#39;est l&amp;#39;obstacle que la plupart des équipes rencontrent en second : le fichier va bien, et personne
en dehors de l&amp;#39;équipe ne le lit. Le résoudre signifie que les entrées doivent devenir des données
qui peuvent être rendues ailleurs, ce qui est un problème différent de formater un fichier, et la
raison pour laquelle &lt;a href=&quot;https://changeloop.dev/changelog-examples&quot;&gt;exemples de changelog&lt;/a&gt; rassemble des pages publiques de
changelog plutôt que des fichiers de repository. Comment transformer ces entrées en quelque chose
auquel les gens reviennent est couvert dans &lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-page/&quot;&gt;construire une page de changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Adoptez quand même la spec. Ça coûte un après-midi, ça rend le second problème traitable, et c&amp;#39;est
toujours la meilleure page jamais écrite sur ce sujet.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Keep a Changelog est-il un standard ?&lt;/strong&gt;
C&amp;#39;est une convention largement adoptée, pas la spécification d&amp;#39;un organisme de normalisation. Les
outils (scripts de release, linters, parsers) supposent souvent sa forme, au point que la suivre
achète de la compatibilité.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Que met-on dans la section Unreleased ?&lt;/strong&gt;
Chaque entrée pour un changement qui a été mergé mais pas encore livré dans une version numérotée.
Quand une version est taillée, la section est renommée avec la version et la date, et une nouvelle
section Unreleased vide se place au-dessus.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un changelog devrait-il utiliser le versionnage sémantique ?&lt;/strong&gt;
Keep a Changelog le recommande et ne l&amp;#39;exige pas. Les bibliothèques et les API en bénéficient ; un
service déployé en continu substitue généralement des dates, ce que le format accommode.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les corrections de sécurité devraient-elles être dans le changelog avant d&amp;#39;être publiques ?&lt;/strong&gt;
Ajoutez l&amp;#39;entrée quand la correction est livrée, avec assez de détail pour qu&amp;#39;une opératrice
puisse agir et pas plus. Retarder l&amp;#39;entrée jusqu&amp;#39;à une date de divulgation coordonnée est normal ;
l&amp;#39;omettre ne l&amp;#39;est pas.&lt;/p&gt;
</content:encoded></item><item><title>Bonnes pratiques des release notes qui comptent</title><link>https://changeloop.dev/blog/fr/release-notes-best-practices/</link><guid isPermaLink="true">https://changeloop.dev/blog/fr/release-notes-best-practices/</guid><description>Les listes de bonnes pratiques sont des conseils de style. Celles-ci changent ce que fait le lecteur, et trois conseils courants sont du folklore.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Les bonnes pratiques de release notes qui comptent sont celles avec une conséquence attachée :
écrire l&amp;#39;entrée au moment du merge, nommer qui est concerné, indiquer l&amp;#39;action requise même quand
c&amp;#39;est aucune, dater les changements cassants, garder une entrée permanente par changement, regrouper
par résultat, et garder la section ennuyeuse. Chacune change ce que fait le lecteur. La plupart des
autres conseils sur ce sujet changent l&amp;#39;apparence des notes.&lt;/p&gt;
&lt;p&gt;Cherchez des bonnes pratiques de release notes et vous obtenez des conseils de style : soyez clair,
soyez concis, utilisez un langage simple, ajoutez des captures d&amp;#39;écran. Rien de tout cela n&amp;#39;est
faux et rien de tout cela ne change quoi que ce soit, parce qu&amp;#39;aucune équipe ne s&amp;#39;est jamais assise
avec l&amp;#39;intention d&amp;#39;être peu claire. Les pratiques ci-dessous sont accompagnées de ce qu&amp;#39;il en coûte
de les sauter, parce qu&amp;#39;une pratique sans mode d&amp;#39;échec attaché n&amp;#39;est qu&amp;#39;une préférence.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pratique&lt;/th&gt;
&lt;th&gt;Ce que ça coûte de la sauter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Écrire l&amp;#39;entrée au merge, pas à la version&lt;/td&gt;
&lt;td&gt;Les entrées reconstruites après disent &amp;quot;diverses améliorations&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nommer qui est concerné&lt;/td&gt;
&lt;td&gt;Chaque lecteur décide que ça ne le concerne pas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indiquer l&amp;#39;action requise, y compris &amp;quot;aucune&amp;quot;&lt;/td&gt;
&lt;td&gt;Quarante tickets de support identiques, et des lecteurs qui présument le pire&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dater les changements cassants, ne pas les versionner&lt;/td&gt;
&lt;td&gt;L&amp;#39;échéance se découvre après être passée&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Une entrée permanente et liable par changement&lt;/td&gt;
&lt;td&gt;Personne ne peut répondre &amp;quot;quand ça a changé&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regrouper par résultat, pas par système&lt;/td&gt;
&lt;td&gt;Les lecteurs ont besoin de votre architecture pour trouver leur section&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Garder la section ennuyeuse&lt;/td&gt;
&lt;td&gt;La sécurité, la conformité et qui débogue une version perdent leur source&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Quelles sont les bonnes pratiques pour les release notes ?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Écrivez l&amp;#39;entrée quand vous mergez, pas quand vous livrez.&lt;/strong&gt;
Coût de sauter ça : la personne qui reconstruit la version depuis l&amp;#39;historique des commits n&amp;#39;est
pas celle qui a fait le changement, et elle devinera l&amp;#39;intention. Les entrées écrites deux semaines
plus tard sont celles qui disent &amp;quot;diverses améliorations&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dites qui est concerné, par nom.&lt;/strong&gt;
&amp;quot;Équipes sur le plan Business&amp;quot;, &amp;quot;quiconque utilise l&amp;#39;API d&amp;#39;export v1&amp;quot;, &amp;quot;installations self-hosted
sur Postgres 14&amp;quot;. Coût de sauter ça : chaque lecteur doit deviner si ça le concerne, et la plupart
décideront que non.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Indiquez l&amp;#39;action requise, y compris quand c&amp;#39;est aucune.&lt;/strong&gt;
Coût de sauter ça : le support répond quarante fois à la même question, et les lecteurs qui n&amp;#39;ont
pas demandé présument que quelque chose est requis et le repoussent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Datez les changements cassants, pas de numéro de version.&lt;/strong&gt;
&amp;quot;Supprimé en v5&amp;quot; ne signifie rien pour quelqu&amp;#39;un qui ne sait pas quand v5 arrive. &amp;quot;Cesse de
fonctionner le 1er novembre&amp;quot; est une date qu&amp;#39;on peut noter au calendrier. Coût de sauter ça :
l&amp;#39;échéance se découvre après être passée. Ce qui compte comme telle, et la checklist pour la
livrer, sont dans &lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;qu&amp;#39;est-ce qu&amp;#39;un changement cassant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gardez une entrée permanente et liable par changement.&lt;/strong&gt;
Un email n&amp;#39;est pas une archive et un message Slack n&amp;#39;est pas une référence. Coût de sauter ça :
personne ne peut répondre &amp;quot;quand ça a changé&amp;quot; six mois plus tard, vous non plus. L&amp;#39;email a quand
même un rôle, couvert dans &lt;a href=&quot;https://changeloop.dev/blog/fr/product-update-email/&quot;&gt;le modèle d&amp;#39;email de mise à jour produit&lt;/a&gt; ;
il pointe vers l&amp;#39;entrée plutôt que de la remplacer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Regroupez par résultat, pas par système.&lt;/strong&gt;
Coût de sauter ça : le lecteur doit garder votre architecture en tête pour savoir quelle section le
concerne. L&amp;#39;ordre qui en découle est dans
&lt;a href=&quot;https://changeloop.dev/blog/fr/how-to-write-release-notes/&quot;&gt;comment écrire des release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gardez la section ennuyeuse.&lt;/strong&gt;
Les mises à jour de dépendances et les changements internes restent, en bas, une ligne chacun.
Coût de sauter ça : l&amp;#39;équipe sécurité, la personne qui vérifie la conformité et celle qui débogue un
décalage de version perdent leur unique source. Les entrées où l&amp;#39;on se trompe le plus souvent sont
les correctifs ; &lt;a href=&quot;https://changeloop.dev/blog/fr/bug-fix-release-notes/&quot;&gt;release notes de correctifs&lt;/a&gt; montre comment les
rédiger pour que le lecteur sache s&amp;#39;il doit agir.&lt;/p&gt;
&lt;h2&gt;Quelles sont les bonnes pratiques de changelog, et en quoi diffèrent-elles ?&lt;/h2&gt;
&lt;p&gt;Un changelog est une référence, donc ses pratiques concernent la complétude et la structure plutôt
que la persuasion. Les quatre qui comptent :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Un type d&amp;#39;entrée fixe par ligne.&lt;/strong&gt; Added, Changed, Deprecated, Removed, Fixed, Security. Ce
n&amp;#39;est pas un style maison, c&amp;#39;est un filtre : c&amp;#39;est ce qui permet de demander &amp;quot;juste les
changements cassants&amp;quot;. La convention &lt;a href=&quot;https://changeloop.dev/blog/fr/keep-a-changelog-implemented/&quot;&gt;Keep a Changelog&lt;/a&gt;
en est la source habituelle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une section non publiée.&lt;/strong&gt; Où vivent les entrées entre le merge et la version. Son absence est
la raison pour laquelle les équipes écrivent des entrées tardivement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Des dates ISO.&lt;/strong&gt; &lt;code&gt;2026-08-28&lt;/code&gt;, pas &lt;code&gt;28/08/26&lt;/code&gt;, qui signifie deux jours différents selon le
lecteur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Une entrée par changement, pas par commit.&lt;/strong&gt; Trois commits qui corrigent un bug sont une
entrée.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les deux artefacts sont comparés en détail dans
&lt;a href=&quot;https://changeloop.dev/blog/fr/changelog-vs-release-notes/&quot;&gt;changelog vs release notes&lt;/a&gt; ; la version courte est que les
pratiques du changelog protègent la complétude et celles des release notes protègent l&amp;#39;attention.
&lt;a href=&quot;https://changeloop.dev/blog/fr/private-release-notes-enterprise/&quot;&gt;Release notes privées pour clientes enterprise&lt;/a&gt;
couvre une version de ceci qui n&amp;#39;apparaît que lorsque vos clientes ne sont plus toutes sur le même
build : les mêmes objectifs de complétude et d&amp;#39;attention, mais calibrés par compte plutôt que
diffusés à toutes en même temps.&lt;/p&gt;
&lt;h2&gt;Trois qui sont du pur folklore&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les emoji comme types d&amp;#39;entrée.&lt;/strong&gt; Une fusée et une clé à molette ne sont pas une taxonomie. Ça a
l&amp;#39;air propre et ça ne peut être ni filtré, ni trié, ni lu utilement par un lecteur d&amp;#39;écran. Utilisez
des mots, et si vous voulez l&amp;#39;emoji, mettez-le après le mot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les numéros de version sémantique comme titres pour un produit hébergé.&lt;/strong&gt; Semver est une promesse
sur la compatibilité d&amp;#39;API. Pour un produit SaaS où personne ne choisit sa version, un numéro de
version en titre est de l&amp;#39;archivage interne déguisé en actualité. Gardez semver dans le changelog
et hors de l&amp;#39;annonce.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Publier selon un calendrier indépendamment du contenu.&lt;/strong&gt; Des notes mensuelles sans rien dedans
apprennent aux gens que vos notes sont du bruit. Publiez quand il y a quelque chose à dire. Le
changelog couvre le reste.&lt;/p&gt;
&lt;h2&gt;Celle qui est vraiment difficile&lt;/h2&gt;
&lt;p&gt;Garder le changelog et l&amp;#39;annonce synchronisés, sans tout écrire deux fois.&lt;/p&gt;
&lt;p&gt;La plupart des équipes commencent avec une seule page, la divisent quand les audiences divergent,
puis laissent silencieusement l&amp;#39;une des deux pourrir, généralement le changelog, parce que c&amp;#39;est
celui sans échéance attachée. La sortie est structurelle plutôt que disciplinaire : gardez les
entrées comme des données avec un type, une date et une audience, et traitez les deux surfaces
comme des rendus de ça. Notre récap &lt;a href=&quot;https://changeloop.dev/changelog-tools&quot;&gt;outils de changelog&lt;/a&gt; couvre ce qui existe
pour ça, y compris les outils avec lesquels on est en concurrence, et la page
&lt;a href=&quot;https://changeloop.dev/beamer-alternative&quot;&gt;alternative à Beamer&lt;/a&gt; est la comparaison honnête face au widget dont partent
la plupart des équipes.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;release notes template&lt;/a&gt; est où vit l&amp;#39;étape de sélection une fois que
les entrées existent.&lt;/p&gt;
&lt;h2&gt;Si vous n&amp;#39;en adoptez qu&amp;#39;une&lt;/h2&gt;
&lt;p&gt;Écrivez l&amp;#39;entrée au moment du merge, dans un format fixe, avec un type. Toutes les autres pratiques
de cette page deviennent plus faciles une fois que celle-là est en place, et aucune ne survit sans
elle.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Les release notes devraient-elles avoir des captures d&amp;#39;écran ?&lt;/strong&gt;
Seulement de ce qui a changé, en usage. Une capture d&amp;#39;une page de réglages que personne n&amp;#39;a jamais
visitée ajoute du scroll, pas de l&amp;#39;information. Un texte qui nomme le résultat et le lecteur
concerné bat une image qui ne montre ni l&amp;#39;un ni l&amp;#39;autre.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Comment écrit-on des release notes pour un changement cassant ?&lt;/strong&gt;
D&amp;#39;abord la date, ensuite les appelants concernés, puis l&amp;#39;action requise, puis la migration. Ne
commencez jamais par le numéro de version. La forme complète, avec une entrée d&amp;#39;exemple, est dans
&lt;a href=&quot;https://changeloop.dev/blog/fr/breaking-changes/&quot;&gt;qu&amp;#39;est-ce qu&amp;#39;un changement cassant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les release notes devraient-elles être écrites par l&amp;#39;ingénierie ou le marketing ?&lt;/strong&gt;
Rédigées par l&amp;#39;ingénieur qui a fait le changement, au moment du merge, et éditées par quelqu&amp;#39;un qui
les lit comme un inconnu. Ni l&amp;#39;un ni l&amp;#39;autre seul ne produit des notes sur lesquelles un client
peut agir.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quel est le format idéal de release notes ?&lt;/strong&gt;
D&amp;#39;abord les éléments avec échéance, puis les nouvelles capacités, puis les améliorations, puis une
liste d&amp;#39;une ligne chacune pour le reste. La &lt;a href=&quot;https://changeloop.dev/release-notes-template&quot;&gt;release notes template&lt;/a&gt; est
ce format sous forme de page à remplir.&lt;/p&gt;
</content:encoded></item></channel></rss>