{"pageProps":{"locale":{"code":"fr","domain":"frenchstack.fr","lang":"fr-FR","json":{"TRANSLATE":"Traduire en","EN":"Anglais","FR":"Français","NO_TRANSLATION_AVAILABLE":"Aucune traduction disponible","PROFILE_OF":"Profil de","FILTER_BY_TAG":"Filtrer par tag","REMOVE_FILTER":"Supprimer le filtre","RESULT":"Résulat","RESULTS":"Résulats","FORM_CONTACT_SUPPORT":"Support","FORM_CONTACT_SALES":"Devis","FORM_CONTACT_BUGS":"Rapport de bug","FORM_LOADING":"Chargement","FORM_SEND":"Envoyer","FORM_VERIFY":"Vérifier","FORM_NAME":"Nom","FORM_TOPIC":"Sujet","FORM_PHONE":"Téléphone","FORM_EMAIL":"Email","FORM_MESSAGE":"Message","FORM_DOMAIN_PLACEHOLDER":"exemple.fr","FORM_DOMAIN_AVAILABLE":"Félicitations, le domaine <span data-selector='domain'></span> est disponible !","FORM_DOMAIN_TAKEN":"Désolé, le domaine <span data-selector='domain'></span> est pris.","SUBSCRIBE":"S'abonner","SUCCESS_CONTACT":"Votre message a bien été envoyé ! Nous vous répondrons dans les plus brefs délais.","SOMETING_WENT_WRONG":"Oops, une erreur s'est produite. Veuillez réessayer ultérieurement.","PERFORMANCE":"Performance","ACCESSIBILITY":"Accessibilité","BEST_PRACTICES":"Bonnes pratiques","SEO":"Référencement","MOBILE":"Mobile","TABLET":"Tablette","DESKTOP":"Ordinateur","VISITORS":"Visiteurs","ENGAGEMENT":"Engagement","CONVERSIONS":"Conversions","JAN":"Janv","FEB":"Févr","MAR":"Mars","APR":"Avr","MAY":"Mai","JUN":"Juin","JUL":"Juil","AUG":"Août","SEP":"Sept","OCT":"Oct","NOV":"Nov","DEC":"Déc","METHOD_PHONE":"Téléphone","METHOD_EMAIL":"Email","FOOTER_TAGLINE":"Nous créons des expériences numériques uniques pour les marques et les entreprises."},"subdomains":{"blog":"blog","clients":"references","videos":"videos","services":"services"},"ogSection":"Technologie"},"slugs":["fr","blog","fallow-codebase-intelligence-typescript"],"component":"article","article":{"id":"content/articles/fr/fallow-codebase-intelligence-typescript.mdx","heroSection":{"heroTitle":"Fallow : quand un agent IA code comme un architecte","heroSubtitle":"Retour d'expérience sur un bot de réservation","heroBadge":"","heroColoredWords":"1","heroBreakTitle":"","heroDescription":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Un agent IA a fait grandir notre bot de réservation. Fallow l'a obligé à le découper, et le code a retrouvé du sens."}]}]},"heroSubtitleIsInline":false,"heroHasBackground":false,"heroImage":"/images/code-laptop.png","heroVideoBackground":"","heroStyle":{"heroBg":"","heroMaxWidth":"","heroMs":"","heroTitleMb":"","heroTitleColor":"","heroContentBg":"","heroContentAlign":"","heroContentBlur":"","heroBlurImage":"","navbarBg":"","navbarBorderColor":"","navbarLinkActive":"","navbarLinkHover":""},"imageAlt":"code laptop","imageWidth":5184,"imageHeight":3456},"seoSection":{"metaTitle":"Fallow : quand un agent IA code comme un architecte","metaDescription":"Retour d'expérience : confié à un agent IA, notre bot de réservation est devenu fonctionnel mais touffu. Fallow lui a imposé des fonctions courtes, et le code a retrouvé une architecture claire.","metaTags":"Fallow, TypeScript, agent IA, qualité de code, refactoring, complexité, architecture logicielle, Home Assistant","socialImageWidth":0,"socialImageHeight":0},"heroUpdatedAt":"2026-10-17T20:00:00.000Z","localeCode":"fr","slug":"fallow-codebase-intelligence-typescript","url":"/fr/blog/fallow-codebase-intelligence-typescript","ogId":"fallow-codebase-intelligence-typescript-blog-fr","ogImagePath":"/og/fallow-codebase-intelligence-typescript-blog-fr.png","type":"Article","title":"Fallow : quand un agent IA code comme un architecte","subtitle":"Retour d'expérience sur un bot de réservation remis en ordre par un agent IA","browserUrl":"","textPreview":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Confié à un agent IA, notre bot de réservation fonctionnait, mais une seule fonction faisait tout. Avec Fallow, l'agent l'a découpé en étapes claires et bien nommées, comme l'aurait fait un architecte logiciel."}]}]},"subdomainKey":"blog","subdomain":"blog","draft":true,"logoAlt":"","logoWidth":0,"logoHeight":0,"icon":"code","body":{"type":"root","children":[{"type":"h2","children":[{"type":"text","text":"1. Un bot écrit à la main"}]},{"type":"p","children":[{"type":"text","text":"Tout part d'un besoin simple : réserver automatiquement mes cours de "},{"type":"text","text":"RPM","bold":true},{"type":"text","text":", du vélo en salle, dont les places partent en quelques minutes. J'ai écrit à la main un petit bot en "},{"type":"text","text":"TypeScript","bold":true},{"type":"text","text":" qui interroge le planning de la salle, repère le bon créneau et réserve dès qu'une place est disponible."}]},{"type":"p","children":[{"type":"text","text":"Quelques jours plus tard, j'ai voulu l'intégrer à "},{"type":"text","text":"Home Assistant","bold":true},{"type":"text","text":" : un tableau de bord, des interrupteurs par jour, des notifications sur le téléphone. J'ai confié ce chantier à un agent IA."}]},{"type":"hr","children":[{"type":"text","text":""}]},{"type":"h2","children":[{"type":"text","text":"2. Un agent efficace, un code touffu"}]},{"type":"p","children":[{"type":"text","text":"L'agent a livré vite et tout fonctionnait. En relisant le code, une inquiétude est pourtant apparue : chaque demande avait été ajoutée là où elle tombait le mieux, c'est-à-dire "},{"type":"text","text":"dans la fonction existante","bold":true},{"type":"text","text":"."}]},{"type":"p","children":[{"type":"text","text":"La réservation tenait en une seule grande fonction qui se connectait à l'API, lisait le planning, calculait les jours et les heures, choisissait le créneau puis réservait. Autour d'elle, la boucle principale du bot enchaînait les jours, les notifications et la mise à jour de Home Assistant. Le code marchait, mais plus personne n'aurait su dire en un coup d'œil ce qu'il faisait, ni où modifier une règle sans risquer d'en casser une autre."}]},{"type":"hr","children":[{"type":"text","text":""}]},{"type":"h2","children":[{"type":"text","text":"3. Fallow entre en jeu"}]},{"type":"p","children":[{"type":"text","text":"Je venais de découvrir "},{"type":"a","url":"https://fallow.tools","title":"Fallow - Codebase intelligence","children":[{"type":"text","text":"Fallow"}]},{"type":"text","text":", un analyseur statique pour TypeScript et JavaScript. Il mesure la "},{"type":"text","text":"complexité","bold":true},{"type":"text","text":" de chaque fonction, repère le "},{"type":"text","text":"code dupliqué","bold":true},{"type":"text","text":" et le "},{"type":"text","text":"code mort","bold":true},{"type":"text","text":", et rend un verdict déterministe : la même entrée donne toujours le même résultat."}]},{"type":"p","children":[{"type":"text","text":"Je l'ai confié à l'agent avec une consigne unique : "},{"type":"text","text":"faire passer le projet au vert","bold":true},{"type":"text","text":"."}]},{"type":"p","children":[{"type":"text","text":"Fallow ne dit pas comment corriger, il dit seulement ce qui est trop long, trop imbriqué ou répété. Pour respecter ses seuils, l'agent n'avait donc qu'une solution : "},{"type":"text","text":"découper","bold":true},{"type":"text","text":"."}]},{"type":"hr","children":[{"type":"text","text":""}]},{"type":"h2","children":[{"type":"text","text":"4. Le découpage"}]},{"type":"p","children":[{"type":"text","text":"Le résultat m'a surpris. L'agent n'a pas coupé au hasard pour faire baisser un chiffre : il a séparé chaque "},{"type":"text","text":"étape métier","bold":true},{"type":"text","text":" dans une fonction dédiée, et lui a donné un nom qui dit exactement ce qu'elle fait."}]},{"type":"p","children":[{"type":"text","text":"Le schéma ci-dessous montre la fonction de réservation avant et après. Survolez une étape pour voir où elle se cachait dans la fonction d'origine :"}]},{"type":"mdxJsxFlowElement","name":"functionSplit","children":[{"type":"text","text":""}],"props":{"name":"tryReserve","caption":"88 lignes où la connexion, le planning, le choix du créneau et la réservation s'entremêlent.","label":"découpé par l'agent","parts":[{"name":"getAuthAndBooked","params":"config","comment":"se connecter et lister mes réservations","weight":5},{"name":"getRPMSessions","params":"planning","comment":"ne garder que les cours de RPM","weight":3},{"name":"pickLatestPerWeek","params":"sessions","comment":"le dernier créneau du jour, semaine par semaine","weight":4},{"name":"tryBookSession","params":"session","comment":"vérifier les places, puis réserver","weight":7}],"result":"La fonction principale passe de 88 à 28 lignes et se lit désormais comme une recette."}},{"type":"p","children":[{"type":"text","text":"Le même mouvement s'est répété sur tout le projet. La boucle principale du bot est devenue une suite de quatre appels lisibles, l'envoi des notifications, écrit trois fois, n'existe plus qu'à un seul endroit sous le nom "},{"type":"text","text":"notifyBookingSuccess","code":true},{"type":"text","text":", et l'interface est passée d'un fichier de "},{"type":"text","text":"501 lignes","bold":true},{"type":"text","text":" à "},{"type":"text","text":"sept composants","bold":true},{"type":"text","text":" réutilisables."}]},{"type":"mdxJsxFlowElement","name":"callout","children":[{"type":"text","text":""}],"props":{"title":"Pourquoi les noms s'améliorent","variant":"success","content":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Une fonction de cent lignes peut porter un nom vague, car personne ne lit son nom pour comprendre ce qu'elle fait. Une fonction de dix lignes doit être nommée avec précision, sans quoi le code qui l'appelle devient illisible. En imposant des fonctions courtes, Fallow oblige l'agent à "},{"type":"text","text":"nommer chaque responsabilité","bold":true},{"type":"text","text":"."}]}]}}},{"type":"hr","children":[{"type":"text","text":""}]},{"type":"h2","children":[{"type":"text","text":"5. Ce que j'en retiens"}]},{"type":"p","children":[{"type":"text","text":"Le code obtenu est celui qu'un architecte logiciel aurait proposé : une étape par fonction, des noms qui racontent le métier, aucune répétition. Je n'ai pas eu à le décrire à l'agent : "},{"type":"text","text":"la contrainte a suffi à faire émerger la structure","bold":true},{"type":"text","text":"."}]},{"type":"p","children":[{"type":"text","text":"Depuis, Fallow tourne avant chaque commit sur tous mes projets TypeScript. L'agent écrit, Fallow mesure, l'agent découpe. Le code reste facile à "},{"type":"text","text":"comprendre, maintenir et faire évoluer","bold":true},{"type":"text","text":", même quand ce n'est plus moi qui l'écris."}]},{"type":"mdxJsxFlowElement","name":"buttons","children":[{"type":"text","text":""}],"props":{"buttons":[{"icon":"gitHub","label":"Fallow sur GitHub","link":"https://github.com/fallow-rs/fallow","style":"primary"},{"icon":"codeFile","label":"Documentation","link":"https://fallow.tools/docs","style":"light"}]}}]},"dateCreate":"2026-08-26T09:00:00.000Z","dateUpdate":"2026-10-17T20:00:00.000Z","author":{"id":"content/authors/fr/nicolas-roehm-bettcher.mdx","heroSection":{"heroTitle":"Nicolas Roehm","heroSubtitle":"Ingénieur logiciel","heroBadge":"","heroColoredWords":"","heroBreakTitle":"","heroDescription":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Fondateur de French Stack, je conçois des solutions informatiques complètes."}]},{"type":"p","children":[{"type":"text","text":"Développeur full-stack, j'interviens principalement sur des projets frontend avec Angular, React ou Vue."}]},{"type":"p","children":[{"type":"text","text":"Passionné de design, voici quelques-unes de mes "},{"type":"a","url":"https://www.artstation.com/nicolas-roehm","title":"ArtStation - Nicolas Roehm","children":[{"type":"text","text":"conceptions graphiques"}]},{"type":"text","text":"."}]},{"type":"mdxJsxFlowElement","name":"socialLinks","children":[{"type":"text","text":""}],"props":{"links":[{"icon":"gitHub","link":"https://github.com/NicolasRoehm"},{"icon":"stackOverflow","link":"https://stackoverflow.com/users/7462178/nicolas-roehm?tab=profile"},{"icon":"linkedIn","link":"https://fr.linkedin.com/in/nicolas-roehm-bettcher"}]}}]},"heroSubtitleIsInline":true,"heroHasBackground":false,"heroImage":"/images/nicolas-roehm-bettcher.png","heroVideoBackground":"","heroStyle":{"heroBg":"linear-gradient(312deg, #0800ff 0%, #4300ff00 70%)","heroMaxWidth":"","heroMs":"25%","heroTitleMb":"0.5rem","heroTitleColor":"","heroContentBg":"","heroContentAlign":"","heroContentBlur":"","heroBlurImage":"","navbarBg":"#fff0","navbarBorderColor":"","navbarLinkActive":"#6785be","navbarLinkHover":"#6785be"},"imageAlt":"nicolas roehm bettcher","imageWidth":0,"imageHeight":0},"seoSection":{"metaTitle":"Nicolas Roehm, Ingénieur logiciel","metaDescription":"Passionné d'informatique, je conçois des sites web dans leur intégralité : design, developpement, référencement, e-reputation, e-mailling, hébergement","metaTags":"Nicolas Roehm, Ingénieur logiciel, web, mobile, site internet","socialImageWidth":0,"socialImageHeight":0},"heroUpdatedAt":"2024-12-09T00:38:50.025Z","localeCode":"fr","slug":"nicolas-roehm-bettcher","url":"/fr/nicolas-roehm-bettcher","ogId":"nicolas-roehm-bettcher-fr","ogImagePath":"/og/nicolas-roehm-bettcher-fr.png","type":"Author","title":"Nicolas Roehm-Bettcher","avatar":"/images/nicolas-roehm-avatar.png","lname":"Roehm","fname":"Nicolas","name":"Nicolas Roehm","translations":[{"localeCode":"en","title":"Nicolas Roehm-Bettcher","slug":"nicolas-roehm-bettcher","url":"/en/nicolas-roehm-bettcher"}]},"translations":[],"tags":[{"id":"content/tags/fr/typescript.mdx","localeCode":"fr","title":"TypeScript","slug":"typescript","url":"/fr/blog/typescript"}]},"page":{"id":"content/subdomains/fr/blog.mdx","heroSection":{"heroTitle":"Actualités digitales","heroSubtitle":"","heroBadge":"","heroColoredWords":"2","heroBreakTitle":"","heroShape":"shiny","heroGradient":"business-gradient","heroDescription":{"type":"root","children":[{"type":"p","children":[{"type":"text","text":"Explorez les dernières avancées en "},{"type":"text","text":"design web","bold":true},{"type":"text","text":", "},{"type":"text","text":"SEO","bold":true},{"type":"text","text":", "},{"type":"text","text":"marketing digital","bold":true},{"type":"text","text":", "},{"type":"text","text":"développement web","bold":true},{"type":"text","text":" et bien plus."}]},{"type":"p","children":[{"type":"text","text":"Nos articles décryptent les "},{"type":"text","text":"technologies innovantes","bold":true},{"type":"text","text":" et les "},{"type":"text","text":"standards du web","bold":true},{"type":"text","text":" qui façonnent l'"},{"type":"text","text":"avenir du numérique","bold":true},{"type":"text","text":"."}]},{"type":"p","children":[{"type":"text","text":"Restez connecté, suivez-nous sur les "},{"type":"text","text":"réseaux sociaux","bold":true},{"type":"text","text":"."}]}]},"heroSubtitleIsInline":false,"heroHasBackground":false,"heroImage":"/images/blog-news-web.jpg","heroVideoBackground":"","heroStyle":{"heroBg":"linear-gradient(353deg, rgba(255,129,0,0.64) 0%, #0018ffe0 120%)","heroMaxWidth":"","heroMs":"","heroTitleMb":"","heroTitleColor":"","heroContentBg":"","heroContentAlign":"","heroContentBlur":"","heroBlurImage":"","navbarBg":"","navbarBorderColor":"","navbarLinkActive":"","navbarLinkHover":""},"imageAlt":"blog news web","imageWidth":0,"imageHeight":0},"seoSection":{"metaTitle":"Actualité numérique","metaDescription":"Magazine en ligne pour apprendre le Web, trouver des ressources, parcourir les tendances et déguster un café chaud","metaTags":"inspiration web, tutoriels développement web, tendances web","socialImageWidth":0,"socialImageHeight":0},"heroUpdatedAt":"2024-12-12T18:23:51.381Z","localeCode":"fr","slug":"blog","url":"/fr/blog","ogId":"blog-fr","ogImagePath":"/og/blog-fr.png","type":"Subdomain","title":"Blog","subdomainKey":"blog","subdomain":"blog","translations":[{"localeCode":"en","title":"Blog","slug":"blog","url":"/en/blog"}],"canShare":true,"canComment":true,"hasAuthor":true,"tagsInPanel":true,"cardContainer":"col-md-6","cardTemplate":"default"},"neighbors":[null,null],"global":{"id":"content/global/fr/settings.json","localeCode":"fr","header":{"nav":[{"href":"index","label":"Accueil"},{"href":"blog","label":"Blog"},{"href":"videos","label":"Vidéos"},{"href":"services","label":"Prestations"},{"href":"references","label":"Références"},{"href":"a-propos","label":"À propos"},{"href":"contact","label":"Contact"}]},"footer":{"social":[{"website":"x","account":"RoehmNicolas"},{"website":"instagram","account":"roehm.nicolas"},{"website":"facebook","account":"thefrenchstack"},{"website":"youtube","account":"@frenchstack"}],"hasSocial":true,"nav":[{"title":"L'agence","links":[{"href":"references","label":"Références"},{"href":"a-propos","label":"À propos"},{"href":"contact","label":"Contact"}]},{"title":"Prestations","links":[{"href":"services/creation-graphique","label":"Graphisme"},{"href":"services/developpement-web-mobile","label":"Développement"},{"href":"services/marketing-web","label":"Marketing"},{"href":"services/formation-informatique","label":"Formation"}]},{"title":"Blog","links":[{"href":"blog/angular","label":"Angular"},{"href":"blog/jquery","label":"jQuery"}]},{"title":"Vidéos","links":[{"href":"videos/marketing-audiovisuel","label":"Marketing audiovisuel"}]}]},"bottom":{"dateCreate":"2015-12-27T05:55:00.000Z","nav":[{"href":"mentions-legales","label":"Mentions légales"},{"href":"politique-de-confidentialite","label":"Politique de confidentialité"}],"hasLinks":true},"contactInfo":{"contactMethods":[{"id":"email","icon":"envelope","value":"frenchstack@gmail.com"},{"id":"phone","icon":"phone","value":"0651570751"}]}}},"__N_SSG":true}