[{"data":1,"prerenderedAt":621},["ShallowReactive",2],{"i-simple-icons:github":3,"i-simple-icons:linkedin":8,"blog-\u002Fblog\u002Fce-que-l-ia-ne-voit-pas-dans-une-interface":11,"blog-others-\u002Fblog\u002Fce-que-l-ia-ne-voit-pas-dans-une-interface":202},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9,"hidden":10},"\u003Cpath fill=\"currentColor\" d=\"M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z\"\u002F>",true,{"id":12,"title":13,"body":14,"date":186,"description":187,"extension":188,"meta":189,"navigation":10,"path":190,"readingTime":191,"seo":192,"seoTitle":193,"stem":194,"tags":195,"tone":199,"updated":200,"__hash__":201},"blog\u002Fblog\u002Fce-que-l-ia-ne-voit-pas-dans-une-interface.md","Ce qu’une IA ne voit pas dans une interface",{"type":15,"value":16,"toc":175},"minimark",[17,21,24,29,32,35,38,67,71,74,83,87,99,110,114,117,120,124,127,130,134,137,144,148,151,172],[18,19,20],"p",{},"Demandez à un assistant de code « une page de liste de projets avec un bouton pour en créer un ». Vous aurez une page propre, des cartes alignées, un bouton bleu. Elle marchera. Et elle sera incomplète d’une façon que personne ne remarque dans la conversation, mais que tout le monde remarque en l’utilisant.",[18,22,23],{},"Ce n’est pas une critique des outils. C’est la nature du problème : une interface se juge dans la main, pas sur une capture d’écran. Voici ce que je regarde systématiquement sur un écran généré, et que je trouve presque toujours à corriger.",[25,26,28],"h2",{"id":27},"les-états-que-personne-na-demandés","Les états que personne n’a demandés",[18,30,31],{},"Un écran n’existe pas dans un seul état. Il se charge, il peut être vide, il peut échouer, et seulement ensuite il montre quelque chose. Une génération produit l’état « succès » parce que c’est celui du brief. Les trois autres restent à écrire.",[33,34],"demo-states",{},[18,36,37],{},"Pour chacun, la question est la même : qu’est-ce que la personne comprend, et qu’est-ce qu’elle peut faire ?",[39,40,41,49,55,61],"ul",{},[42,43,44,48],"li",{},[45,46,47],"strong",{},"Chargement"," : montrer la forme de ce qui arrive, pas un spinner au milieu du vide. Un squelette garde la page stable et dit « ça vient ».",[42,50,51,54],{},[45,52,53],{},"Vide"," : ce n’est pas une erreur. Dire qu’il n’y a rien encore, et proposer la première action.",[42,56,57,60],{},[45,58,59],{},"Erreur"," : dire ce qui s’est passé sans jargon, rassurer sur ce qui n’a pas été perdu, et offrir une sortie. « Une erreur est survenue » n’aide personne.",[42,62,63,66],{},[45,64,65],{},"Succès"," : c’est le seul qu’on obtient gratuitement.",[25,68,70],{"id":69},"le-retour-à-laction","Le retour à l’action",[18,72,73],{},"Un bouton généré change de couleur au survol, et c’est tout. Il ne réagit pas à l’appui, il ne confirme rien, il ne dit pas si l’action est en cours. Sur mobile, où il n’y a pas de survol, il ne donne aucun signe de vie.",[18,75,76,77,82],{},"J’ai écrit ",[78,79,81],"a",{"href":80},"\u002Fblog\u002Fun-bouton-qui-repond","un article entier"," sur ce seul point, parce qu’il change la sensation de toute l’interface. Le résumé : le retour visuel part à l’appui, l’action part au relâchement, et la confirmation arrive après.",[25,84,86],{"id":85},"le-clavier","Le clavier",[18,88,89,90,94,95,98],{},"Essayez de parcourir l’écran avec la touche Tab. Souvent, l’ordre de parcours ne suit pas l’ordre visuel, le focus n’est pas visible, et la carte cliquable n’est pas atteignable parce que c’est un ",[91,92,93],"code",{},"div"," avec un ",[91,96,97],{},"@click",". Rien de tout ça ne se voit sur une capture.",[18,100,101,102,105,106,109],{},"Les corrections sont petites : un vrai ",[91,103,104],{},"button"," ou un vrai lien, un ",[91,107,108],{},":focus-visible"," dessiné, l’ordre du DOM aligné sur l’ordre de lecture. Mais il faut les faire, et il faut y penser.",[25,111,113],{"id":112},"le-texte","Le texte",[18,115,116],{},"Les textes générés sont corrects et interchangeables. « Gérer vos projets », « Commencer maintenant », « Une erreur est survenue ». Ils remplissent la case. Un texte qui aide est spécifique : il nomme ce qui va se passer, dans les mots de la personne qui lit.",[18,118,119],{},"Je réécris presque tous les libellés d’un écran généré. C’est le poste qui prend le plus de temps après les états, et c’est celui qui se voit le plus.",[25,121,123],{"id":122},"les-écrans-intermédiaires","Les écrans intermédiaires",[18,125,126],{},"Entre 375 et 1440 pixels, il y a des largeurs où tout casse : une grille à trois colonnes qui devient illisible à 800, un titre qui déborde à 390, un tableau qui force le défilement horizontal. Les générations sont testées sur un écran, le vôtre, et c’est souvent le seul qui marche.",[18,128,129],{},"Je redimensionne la fenêtre lentement, de la plus étroite à la plus large, et je note chaque endroit où quelque chose saute. Ça prend deux minutes et ça évite les retours clients.",[25,131,133],{"id":132},"le-mode-sombre","Le mode sombre",[18,135,136],{},"Si le projet a un thème sombre, le code généré oublie une couleur sur trois. Un fond blanc codé en dur dans une carte, une ombre invisible, un texte gris sur gris. La solution est en amont : ne jamais écrire une couleur dans un composant, toujours passer par les variables du thème. Une fois la règle dans le fichier de conventions, l’assistant la suit.",[138,139,141],"callout",{"type":140},"note",[18,142,143],{},"Tout ce qui précède tient en une idée : l’IA produit ce qu’on lui décrit, et personne ne décrit les états vides, le focus clavier ou le texte d’erreur dans un brief. Ce sont les angles morts de la description, pas de l’outil.",[25,145,147],{"id":146},"ma-liste","Ma liste",[18,149,150],{},"Avant qu’un écran généré n’aille plus loin, je passe ces points dans l’ordre :",[152,153,154,157,160,163,166,169],"ol",{},[42,155,156],{},"Les quatre états existent et disent quoi faire.",[42,158,159],{},"Chaque action a un retour à l’appui et une confirmation.",[42,161,162],{},"Tout est atteignable au clavier, dans le bon ordre, avec un focus visible.",[42,164,165],{},"Chaque libellé nomme ce qui va se passer.",[42,167,168],{},"L’écran tient à 390, 768, 1024 et 1440 pixels.",[42,170,171],{},"Aucune couleur n’est écrite en dur.",[18,173,174],{},"Six points, dix minutes. C’est la différence entre un écran qui fonctionne et un écran qu’on a envie d’utiliser.",{"title":176,"searchDepth":177,"depth":177,"links":178},"",2,[179,180,181,182,183,184,185],{"id":27,"depth":177,"text":28},{"id":69,"depth":177,"text":70},{"id":85,"depth":177,"text":86},{"id":112,"depth":177,"text":113},{"id":122,"depth":177,"text":123},{"id":132,"depth":177,"text":133},{"id":146,"depth":177,"text":147},"2026-10-07","Une IA génère un écran correct en quelques secondes. Les détails qui le rendent agréable, ou simplement utilisable, viennent après. Liste de ce que je vérifie à la main.","md",{},"\u002Fblog\u002Fce-que-l-ia-ne-voit-pas-dans-une-interface",4,{"title":13,"description":187},"Interface générée par IA : 6 points à vérifier à la main","blog\u002Fce-que-l-ia-ne-voit-pas-dans-une-interface",[196,197,198],"IA","Interface","Accessibilité","slate",null,"h6PnK0QzuO576IsiV6s7VYyIjKFmKVXSJ2Lu4TYMc0M",[203,359],{"id":204,"title":205,"body":206,"date":347,"description":348,"extension":188,"meta":349,"navigation":10,"path":350,"readingTime":191,"seo":351,"seoTitle":352,"stem":353,"tags":354,"tone":357,"updated":200,"__hash__":358},"blog\u002Fblog\u002Fcoder-avec-une-ia-sans-perdre-la-main.md","Coder avec une IA sans perdre la main",{"type":15,"value":207,"toc":340},[208,211,214,218,221,224,227,231,237,243,249,255,259,265,271,277,287,291,323,330,334,337],[18,209,210],{},"Il y a deux façons de rater le virage des assistants de code. La première est de les ignorer et de taper à la main ce qu’une machine écrit mieux et plus vite. La seconde est de tout leur laisser et de ne plus savoir ce qui tourne en production. Entre les deux, il y a une pratique, et elle se construit.",[18,212,213],{},"Voici la mienne, telle qu’elle est aujourd’hui, après un an de projets livrés avec Claude Code dans l’éditeur.",[25,215,217],{"id":216},"une-boucle-pas-une-baguette","Une boucle, pas une baguette",[18,219,220],{},"L’erreur la plus courante est de voir l’IA comme un générateur : on décrit, on reçoit, on colle. Ce n’est pas comme ça que ça marche bien. Ce qui marche, c’est une boucle courte où chaque étape a un responsable.",[222,223],"demo-loop",{},[18,225,226],{},"L’IA n’intervient qu’à une étape. Tout le reste, c’est du travail d’ingénierie classique, et c’est lui qui fait la qualité du résultat. Si le brief est flou, la génération est floue. Si la relecture est bâclée, les bugs passent. Si les tests n’existent pas, personne ne sait si la troisième itération a cassé la première.",[25,228,230],{"id":229},"ce-que-je-lui-confie","Ce que je lui confie",[18,232,233,236],{},[45,234,235],{},"Le code qui a déjà été écrit mille fois."," Un formulaire avec validation, un composant de liste avec ses états, une fonction qui formate des dates en français, la configuration d’un module Nuxt. L’IA connaît ces motifs par cœur et les écrit sans faute de frappe. Je gagne vingt minutes par occurrence, et il y en a beaucoup dans une journée.",[18,238,239,242],{},[45,240,241],{},"Les tâches larges et peu risquées."," Renommer un composant dans tout le projet, extraire un composable, ajouter un type manquant, écrire les premiers tests d’un fichier. Ce sont des tâches où l’erreur se voit tout de suite.",[18,244,245,248],{},[45,246,247],{},"La première version de quelque chose."," Quand je ne sais pas encore à quoi va ressembler un écran, je lui demande trois propositions. Je n’en garde jamais une telle quelle, mais je choisis plus vite.",[18,250,251,254],{},[45,252,253],{},"Les explications."," Un code hérité que personne ne commente, une erreur de build incompréhensible, une API que je n’ai jamais utilisée. Demander « explique-moi ce fichier » avant de le modifier m’a évité pas mal de casse.",[25,256,258],{"id":257},"ce-que-je-garde","Ce que je garde",[18,260,261,264],{},[45,262,263],{},"Les décisions."," L’architecture, le découpage en composants, le choix d’une bibliothèque, ce qui va dans le state global et ce qui n’y va pas. L’IA peut argumenter, elle ne tranche pas. C’est moi qui porterai la décision dans six mois.",[18,266,267,270],{},[45,268,269],{},"La relecture, ligne par ligne."," Je ne fusionne rien que je n’ai pas lu. Pas survolé : lu. Si une ligne me paraît magique, je demande pourquoi elle est là, et si la réponse ne me convainc pas, elle saute. Un code que je ne comprends pas est un code que je ne pourrai pas corriger à deux heures du matin.",[18,272,273,276],{},[45,274,275],{},"Tout ce qui touche à la sécurité et à l’argent."," Authentification, paiement, droits d’accès, données personnelles. L’IA écrit ce code aussi bien qu’un autre, mais là, je vérifie deux fois plus, et j’écris les tests moi-même.",[18,278,279,282,283,286],{},[45,280,281],{},"L’interface finale."," Les détails qu’un humain remarque sans savoir les nommer, j’en parle dans ",[78,284,285],{"href":190},"un autre article",". Ils ne viennent pas de la génération, ils viennent de la relecture avec les yeux de l’utilisateur.",[25,288,290],{"id":289},"les-règles-que-je-me-suis-fixées","Les règles que je me suis fixées",[152,292,293,299,305,311,317],{},[42,294,295,298],{},[45,296,297],{},"Un fichier de conventions à la racine du projet."," Nom des composants, structure des dossiers, langue des commentaires, format des commits. L’assistant le lit à chaque session, et le code qu’il produit ressemble au mien. Sans ce fichier, chaque génération part dans une direction différente.",[42,300,301,304],{},[45,302,303],{},"Une tâche à la fois."," « Ajoute le champ téléphone au formulaire de contact, avec la validation et le test » est une tâche. « Améliore le formulaire » n’en est pas une. Plus la demande est bornée, plus la réponse est juste, et plus la relecture est rapide.",[42,306,307,310],{},[45,308,309],{},"Les tests tournent avant que je regarde."," Si la suite Cypress est rouge, je ne lis même pas le diff. Ça m’oblige à garder des tests fiables, et ça m’évite de perdre du temps sur un code qui ne marche pas.",[42,312,313,316],{},[45,314,315],{},"Je relis dans l’éditeur, pas dans la conversation."," Le diff dans Git, avec la coloration, le contexte autour, et la possibilité de lancer le projet. La conversation sert à discuter, pas à valider.",[42,318,319,322],{},[45,320,321],{},"Je garde une trace de ce qui a été généré."," Pas pour m’en excuser, mais parce que si un bug apparaît dans trois semaines, savoir qu’un bloc est sorti d’une génération rapide oriente la recherche.",[138,324,327],{"title":325,"type":326},"Le test du lendemain","tip",[18,328,329],{},"Avant de fusionner un gros morceau généré, je me pose une question simple : si cette fonction casse demain et que je n’ai plus accès à l’assistant, est-ce que je sais la réparer ? Si la réponse est non, ce n’est pas prêt.",[25,331,333],{"id":332},"ce-que-ça-change-concrètement","Ce que ça change, concrètement",[18,335,336],{},"Je livre plus vite, c’est vrai, mais ce n’est pas le plus intéressant. Ce qui a changé, c’est où va mon attention. Moins de temps sur la syntaxe et la plomberie, plus de temps sur ce que l’utilisateur voit et ressent. Plus de temps aussi sur les tests, parce qu’ils sont devenus la vraie garantie, celle qui ne dépend pas de qui a écrit le code.",[18,338,339],{},"Et je comprends toujours ce que je livre. C’était la condition, et elle tient.",{"title":176,"searchDepth":177,"depth":177,"links":341},[342,343,344,345,346],{"id":216,"depth":177,"text":217},{"id":229,"depth":177,"text":230},{"id":257,"depth":177,"text":258},{"id":289,"depth":177,"text":290},{"id":332,"depth":177,"text":333},"2026-10-21","J’utilise Claude Code tous les jours. Voici ce que je lui confie, ce que je garde, et les règles qui m’évitent de livrer du code que je ne comprends pas.",{},"\u002Fblog\u002Fcoder-avec-une-ia-sans-perdre-la-main",{"title":205,"description":348},"Coder avec Claude Code sans perdre la main : ma méthode","blog\u002Fcoder-avec-une-ia-sans-perdre-la-main",[196,355,356],"Méthode","Claude Code","lavender","v2_5veRBSuqiUYQJU5moplrHaQM26kKEITUIO4IdjOU",{"id":360,"title":361,"body":362,"date":612,"description":613,"extension":188,"meta":614,"navigation":10,"path":615,"readingTime":191,"seo":616,"seoTitle":617,"stem":618,"tags":619,"tone":199,"updated":200,"__hash__":620},"blog\u002Fblog\u002Fun-bon-prompt-est-une-bonne-spec.md","Un bon prompt, c’est d’abord une bonne spec",{"type":15,"value":363,"toc":604},[364,367,370,374,377,501,504,508,511,518,524,527,531,534,537,555,559,566,569,573,576,579,583,597,600],[18,365,366],{},"On parle beaucoup de « l’art du prompt », comme s’il existait une tournure qui débloque le bon code. Après un an à travailler avec un assistant dans l’éditeur, je crois que c’est une mauvaise piste. Ce qui change le résultat, ce n’est pas la formule. C’est le contexte : ce que l’outil sait du projet avant même que je lui demande quoi que ce soit.",[18,368,369],{},"Autrement dit, un bon prompt commence bien avant le prompt.",[25,371,373],{"id":372},"le-fichier-que-lassistant-lit-en-premier","Le fichier que l’assistant lit en premier",[18,375,376],{},"À la racine de chaque projet, j’ai un fichier de conventions, lu automatiquement au début de chaque session. Il tient sur une page et il répond aux questions qu’un nouveau développeur poserait le premier jour :",[378,379,383],"pre",{"className":380,"code":381,"filename":382,"language":188,"meta":176,"style":176},"language-md shiki shiki-themes github-light github-dark","# Conventions du projet\n\n- Code en anglais (noms, commentaires), textes visibles en français.\n- Vue 3 en `\u003Cscript setup>` avec TypeScript, jamais l'Options API.\n- Un composant par fichier, nommé en PascalCase, dans `app\u002Fcomponents\u002F\u003Cdomaine>\u002F`.\n- Les couleurs passent par les variables du thème (`var(--accent)`), jamais en dur.\n- Chaque composant qui affiche une liste gère quatre états : chargement, vide, erreur, succès.\n- Tests Cypress dans `tests\u002Fe2e\u002F`, un fichier par parcours utilisateur.\n- Commits en anglais, préfixés [ADD], [CHANGE] ou [DELETE].\n","CLAUDE.md",[91,384,385,394,399,410,424,438,452,460,474],{"__ignoreMap":176},[386,387,390],"span",{"class":388,"line":389},"line",1,[386,391,393],{"class":392},"sq-ep","# Conventions du projet\n",[386,395,396],{"class":388,"line":177},[386,397,398],{"emptyLinePlaceholder":10},"\n",[386,400,402,406],{"class":388,"line":401},3,[386,403,405],{"class":404},"s4XuR","-",[386,407,409],{"class":408},"sVt8B"," Code en anglais (noms, commentaires), textes visibles en français.\n",[386,411,412,414,417,421],{"class":388,"line":191},[386,413,405],{"class":404},[386,415,416],{"class":408}," Vue 3 en ",[386,418,420],{"class":419},"sj4cs","`\u003Cscript setup>`",[386,422,423],{"class":408}," avec TypeScript, jamais l'Options API.\n",[386,425,427,429,432,435],{"class":388,"line":426},5,[386,428,405],{"class":404},[386,430,431],{"class":408}," Un composant par fichier, nommé en PascalCase, dans ",[386,433,434],{"class":419},"`app\u002Fcomponents\u002F\u003Cdomaine>\u002F`",[386,436,437],{"class":408},".\n",[386,439,441,443,446,449],{"class":388,"line":440},6,[386,442,405],{"class":404},[386,444,445],{"class":408}," Les couleurs passent par les variables du thème (",[386,447,448],{"class":419},"`var(--accent)`",[386,450,451],{"class":408},"), jamais en dur.\n",[386,453,455,457],{"class":388,"line":454},7,[386,456,405],{"class":404},[386,458,459],{"class":408}," Chaque composant qui affiche une liste gère quatre états : chargement, vide, erreur, succès.\n",[386,461,463,465,468,471],{"class":388,"line":462},8,[386,464,405],{"class":404},[386,466,467],{"class":408}," Tests Cypress dans ",[386,469,470],{"class":419},"`tests\u002Fe2e\u002F`",[386,472,473],{"class":408},", un fichier par parcours utilisateur.\n",[386,475,477,479,482,486,489,492,495,498],{"class":388,"line":476},9,[386,478,405],{"class":404},[386,480,481],{"class":408}," Commits en anglais, préfixés [",[386,483,485],{"class":484},"svl0z","ADD",[386,487,488],{"class":408},"], [",[386,490,491],{"class":484},"CHANGE",[386,493,494],{"class":408},"] ou [",[386,496,497],{"class":484},"DELETE",[386,499,500],{"class":408},"].\n",[18,502,503],{},"Ce fichier a changé ma façon de travailler plus que n’importe quelle astuce de formulation. Avant, chaque génération partait dans une direction différente : un jour l’Options API, le lendemain des couleurs en dur, des commentaires en anglais puis en français. Depuis, le code généré ressemble au code existant, et la relecture va deux fois plus vite.",[25,505,507],{"id":506},"décrire-le-résultat-pas-la-méthode","Décrire le résultat, pas la méthode",[18,509,510],{},"Une demande efficace dit ce qu’on veut obtenir et comment on saura que c’est bon. Elle ne dicte pas les étapes.",[138,512,515],{"title":513,"type":514},"Trop vague","warning",[18,516,517],{},"« Améliore le formulaire de contact. »",[138,519,521],{"title":520,"type":326},"Bornée et vérifiable",[18,522,523],{},"« Ajoute un champ téléphone au formulaire de contact. Facultatif, format français, message d’erreur sous le champ si le format est faux. Un test Cypress qui soumet avec un numéro faux puis un numéro valide. »",[18,525,526],{},"La seconde version tient en trois lignes et contient tout ce qu’il faut : le périmètre (un champ), les règles (facultatif, format), le comportement visible (le message d’erreur), et la preuve (le test). L’assistant n’a rien à deviner, et moi, j’ai une liste pour vérifier.",[25,528,530],{"id":529},"donner-les-contraintes-avant-les-envies","Donner les contraintes avant les envies",[18,532,533],{},"Les contraintes coûtent cher quand elles arrivent après. Un composant écrit sans savoir qu’il doit marcher sans JavaScript, ou qu’il sera rendu côté serveur, ou qu’il doit rester lisible à 320 pixels, est souvent à refaire plutôt qu’à corriger.",[18,535,536],{},"Je mets donc les contraintes en premier, dans la demande ou dans le fichier de conventions selon qu’elles sont ponctuelles ou permanentes :",[39,538,539,542,549,552],{},[42,540,541],{},"La cible : navigateurs, tailles d’écran, rendu serveur ou non.",[42,543,544,545,548],{},"Ce qui existe déjà et qu’il faut réutiliser : « il y a un composant ",[91,546,547],{},"MdsButton",", utilise-le ».",[42,550,551],{},"Ce qu’il ne faut pas faire : « pas de nouvelle dépendance », « ne touche pas à l’API ».",[42,553,554],{},"Le niveau d’accessibilité attendu : clavier, lecteur d’écran, contrastes.",[25,556,558],{"id":557},"montrer-un-exemple","Montrer un exemple",[18,560,561,562,565],{},"Quand un motif existe déjà dans le projet, je pointe le fichier : « fais comme ",[91,563,564],{},"ProjectCard.vue"," ». Un exemple vaut mieux qu’une description, parce qu’il porte toutes les conventions implicites : l’indentation, la façon de nommer les props, l’ordre des blocs, le style des commentaires.",[18,567,568],{},"C’est aussi le meilleur moyen de garder un projet cohérent dans le temps. Le dixième composant ressemble au premier, parce que le premier a servi de modèle à tous les autres.",[25,570,572],{"id":571},"demander-petit-souvent","Demander petit, souvent",[18,574,575],{},"Une demande qui touche cinq fichiers produit un diff que je mets vingt minutes à relire, et dans lequel une erreur se cache facilement. Cinq demandes qui touchent un fichier chacune produisent cinq diffs lisibles en deux minutes, avec les tests qui tournent entre chaque.",[18,577,578],{},"Ça semble plus lent. En pratique, c’est plus rapide, parce que je ne reviens jamais en arrière.",[25,580,582],{"id":581},"ce-que-je-ne-fais-plus","Ce que je ne fais plus",[39,584,585,588,591,594],{},[42,586,587],{},"Chercher la tournure parfaite. Le contexte compte plus que les mots.",[42,589,590],{},"Demander « le meilleur » ou « le plus propre ». Ça ne veut rien dire pour la machine, et rarement pour moi.",[42,592,593],{},"Accepter une génération sans test quand un test est possible.",[42,595,596],{},"Laisser une convention dans ma tête au lieu de l’écrire dans le fichier.",[18,598,599],{},"Le résultat, c’est un projet où n’importe qui, humain ou assistant, peut arriver et produire du code qui a l’air d’avoir été écrit par la même personne. C’était déjà la définition d’une bonne spec avant l’IA. Ça l’est toujours.",[601,602,603],"style",{},"html pre.shiki code .sq-ep, html code.shiki .sq-ep{--shiki-default:#005CC5;--shiki-default-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .svl0z, html code.shiki .svl0z{--shiki-default:#032F62;--shiki-default-text-decoration:underline;--shiki-dark:#DBEDFF;--shiki-dark-text-decoration:underline}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":176,"searchDepth":177,"depth":177,"links":605},[606,607,608,609,610,611],{"id":372,"depth":177,"text":373},{"id":506,"depth":177,"text":507},{"id":529,"depth":177,"text":530},{"id":557,"depth":177,"text":558},{"id":571,"depth":177,"text":572},{"id":581,"depth":177,"text":582},"2026-09-16","La qualité de ce qu’un assistant de code produit dépend moins de la formule magique que de ce qu’on lui donne à lire. Ce que je mets dans mes projets pour que le code généré ressemble au mien.",{},"\u002Fblog\u002Fun-bon-prompt-est-une-bonne-spec",{"title":361,"description":613},"CLAUDE.md et conventions : un bon prompt est une bonne spec","blog\u002Fun-bon-prompt-est-une-bonne-spec",[196,355],"8fBV_x09XeADuFWk4gEOq3W21DWTQr3e3rJjNdFokbw",1793214702904]