Qu'est-ce que DESIGN.md pour les Agents de Codage ?

Ashley Innocent

Ashley Innocent

21 May 2026

Qu'est-ce que DESIGN.md pour les Agents de Codage ?

Apidog pour les entreprises

Déploiement sur site

SSO & RBAC

Conforme SOC 2

Explorer Apidog Enterprise

Les agents de codage sont confiants, rapides et totalement ignorants de l'architecture de votre base de code tant que vous ne leur dites pas le contraire. Donnez à Claude Code ou Codex un ticket vague et il écrira joyeusement du code qui compile, passe un test rapide et viole discrètement la frontière entre votre couche de domaine et votre couche HTTP. L'agent n'a pas lu vos documents de conception. Il a lu les fichiers qu'il pouvait voir, a fait de la reconnaissance de formes et a deviné. Un fichier DESIGN.md résout le problème de la devinette en consignant votre intention architecturale à l'endroit que l'agent consulte toujours : le dépôt lui-même.

EN BREF

DESIGN.md est un fichier de dépôt suivant une convention communautaire qui enregistre l'intention architecturale, les contraintes et les décisions de conception d'une base de code en Markdown simple afin que les agents de codage (Claude Code, Codex, Cursor) génèrent du code qui s'intègre au système au lieu de le combattre. Il répond à la question « pourquoi le code est-il structuré de cette manière », tandis que AGENTS.md répond à « comment construire et tester ».

button

Introduction

Voici le mode d'échec que chaque équipe adoptant des agents de codage rencontre en une semaine. Vous demandez à un agent d'ajouter un point d'API de remboursement à un service de paiement. Il renvoie un gestionnaire fonctionnel qui appelle la base de données directement depuis le contrôleur, ignore l'erreur de passerelle et invente un nouveau type de monnaie parce qu'il n'a pas remarqué que vous en aviez déjà un. Le diff est propre. Les tests passent. C'est également faux de trois manières que seul un relecteur connaissant l'architecture peut déceler. L'agent n'est pas mauvais en codage ; il est aveugle aux décisions qui résident dans votre tête, sur une page Notion, ou dans un fil Slack datant d'il y a huit mois.

DESIGN.md est la réponse sur laquelle un nombre croissant d'équipes se sont accordées. C'est un fichier Markdown unique, validé à la racine du dépôt, qui indique à tout agent les faits essentiels concernant votre système : les règles de superposition, les invariants qui ne doivent jamais être rompus, les modèles que vous avez choisis délibérément et ceux que vous avez rejetés. Ce n'est pas une spécification de fournisseur et il n'y a pas de comité qui en est propriétaire ; c'est une convention, de la même manière que ARCHITECTURE.md et CONTRIBUTING.md sont des conventions. Mais il s'associe naturellement aux fichiers d'instructions spécifiques aux outils que les agents lisent déjà, et pour le travail d'API et de backend, c'est l'un des documents les plus efficaces que vous puissiez rédiger.

Ce qu'est réellement DESIGN.md

DESIGN.md est un enregistrement en texte brut de la raison pour laquelle votre code est structuré de cette manière. Pas ce qu'il fait (ça, c'est le README), pas comment l'exécuter (ça, c'est AGENTS.md), mais le raisonnement qu'un ingénieur senior expliquerait à un nouvel employé le premier jour avant de le laisser toucher à quoi que ce soit d'important.

Pensez aux conversations qui ne figurent dans aucun fichier. « Nous n'appelons pas la passerelle de paiement depuis le thread de requête ; tout passe par la table de boîte d'envoi car la passerelle expire sous charge. » « L'argent est toujours un nombre entier d'unités mineures ; nous avons banni les flottants après l'incident d'arrondi. » « L'agrégat Account gère les mutations de solde ; rien d'autre n'écrit dans le grand livre. » Ce sont des décisions de conception. Elles sont invisibles pour un agent lisant le code source, car la source montre le résultat de la décision, pas la décision ou sa justification. Un agent peut voir que Account.debit() existe. Il ne peut pas voir que vous l'avez délibérément rendu le seul chemin d'écriture, il en ajoutera donc joyeusement un second.

La convention trouve ses racines dans des pratiques plus anciennes et bien établies. Le modèle ARCHITECTURE.md (popularisé par l'article largement cité d'Alex Kladov) soutient qu'un dépôt devrait contenir une carte de haut niveau de la base de code qui explique la structure et les invariants sans essayer de rester synchronisé ligne par ligne avec le code. Les enregistrements de décisions d'architecture (ADR) capturent les décisions individuelles et leur justification au fil du temps. DESIGN.md est ce que vous obtenez lorsque vous rédigez ce type de document pour un public qui inclut un agent de codage : concis, déclaratif, axé sur les décisions, et placé là où l'agent le chargera réellement.

Deux propriétés le rendent efficace. Il est dans le dépôt, donc l'agent le lit avec les mêmes outils qu'il utilise pour lire le code ; vous n'avez pas besoin d'un plugin ou d'un appel d'API. Et il concerne l'intention, il reste donc utile même si les fichiers sont déplacés. Renommez un package et vos captures d'écran README pourrissent ; la règle « la logique de domaine n'importe jamais le framework web » reste vraie.

DESIGN.md vs AGENTS.md vs CLAUDE.md vs README

Ces fichiers se chevauchent suffisamment pour prêter à confusion et diffèrent suffisamment pour que les fusionner en un seul soit une erreur. En bref : le README est destiné à l'intégration des humains, AGENTS.md est le contrat opérationnel pour les agents, CLAUDE.md est le fichier d'instructions spécifique à Claude, et DESIGN.md est la justification architecturale dont tous bénéficient.

AGENTS.md est désormais un format réel et largement adopté ; le projet agents.md le décrit comme « un format simple et ouvert pour guider les agents de codage », utilisé sur des dizaines de milliers de projets et géré par la Fondation AI Agentic de la Linux Foundation. Son rôle est opérationnel : étapes de build, commandes de test, style de code, conventions de commit, tout ce que vous diriez à un nouveau coéquipier pour qu'il ne soit pas bloqué. Selon la documentation de la mémoire de Claude Code d'Anthropic, CLAUDE.md joue le même rôle d'instruction spécifiquement pour Claude ; la documentation recommande même que si vous avez déjà un AGENTS.md, vous créiez un CLAUDE.md qui l'importe avec @AGENTS.md afin que les deux outils lisent une seule source de vérité.

Remarquez ce qui manque à ces descriptions : la justification architecturale approfondie. AGENTS.md et CLAUDE.md sont conçus pour être courts. La documentation de Claude Code recommande explicitement de maintenir CLAUDE.md en dessous de 200 lignes, car des fichiers plus longs consomment du contexte et réduisent la fiabilité avec laquelle le modèle les suit. Une véritable explication d'architecture, les limites, les invariants, les alternatives rejetées, les règles du modèle de données, ne tiendront pas là sans le gonfler. Vous le référencez donc à la place. DESIGN.md devient le document approfondi ; AGENTS.md / CLAUDE.md y renvoient avec une seule ligne.

Fichier Public Répond à Durée de vie / Taux de changement Longueur
README.md Humains (utilisateurs, nouveaux contributeurs) Qu'est-ce que c'est, comment le démarrer Évolue avec les fonctionnalités Moyenne
AGENTS.md Tout agent de codage Comment construire, tester, linter, commiter ici Évolue avec les outils Courte (opérationnel)
CLAUDE.md Spécifiquement Claude Code Identique à AGENTS.md, plus les règles spécifiques à Claude Évolue avec les outils Courte (moins de ~200 lignes)
DESIGN.md Agents + ingénieurs + relecteurs Pourquoi le système est-il structuré de cette manière ; ce qui ne doit jamais être rompu Évolue avec l'architecture (rarement) Moyenne, dense en décisions

La relation est complémentaire, et non compétitive. Une configuration propre pour un atelier Claude + Codex ressemble à ceci : README.md pour les humains ; un AGENTS.md avec les règles de build/test/style ; un CLAUDE.md qui n'est que @AGENTS.md plus deux lignes spécifiques à Claude ; et DESIGN.md contenant l'architecture, lié depuis AGENTS.md afin que chaque agent le charge à la demande. Aucune duplication, chaque fichier a un seul rôle. Si vous souhaitez une exploration plus approfondie de la structuration du contexte de Claude à travers ces fichiers, les flux de travail de Claude Code détaillent le modèle de mémoire en pratique.

Que mettre dans DESIGN.md (avec un modèle)

DESIGN.md doit répondre aux questions qu'un agent ne peut pas inférer du code : la forme du système, les règles qui n'apparaissent dans aucun fichier unique, et les décisions que vous avez prises délibérément. Gardez-le déclaratif. Chaque section doit se lire comme une règle qu'un relecteur ferait respecter, pas comme un essai.

Couvrez ces points :

Voici un modèle complet, écrit pour un service d'API de paiement réaliste. Copiez-le, supprimez ce qui ne s'applique pas, complétez le reste.

# DESIGN.md: Service d'API de paiements

Ce fichier enregistre l'intention architecturale et les décisions qui la sous-tendent.
Lisez-le avant de générer ou de modifier du code. Si un changement entre en conflit
avec une règle ici, arrêtez-vous et signalez-le au lieu de le contourner.

## Forme du système

Architecturé en couches, les dépendances ne pointent que vers l'intérieur :

  http (gestionnaires, DTO)  ->  app (cas d'utilisation)  ->  domain (entités,
  invariants)  <-  infra (base de données, clients de passerelle)

- `domain/` n'a aucune importation de `http/`, `app/`, ou de tout framework.
- `infra/` implémente les interfaces déclarées dans `domain/` ou `app/`.
- `http/` ne touche jamais directement la base de données ou la passerelle de paiement.
  Il appelle un cas d'utilisation dans `app/`.

## Invariants (doivent toujours être respectés)

- Une écriture de grand livre est immuable une fois enregistrée. Les corrections sont de nouvelles
  écritures compensatoires, jamais des mises à jour ou des suppressions.
- Le solde du compte est dérivé des écritures de grand livre, et non stocké comme un champ
  mutable que le code peut définir directement.
- L'argent est un nombre entier d'unités mineures (cents) plus un code de devise
  ISO-4217. Jamais un flottant. Ne jamais mélanger les devises dans une même opération.
- Chaque appel à une passerelle de paiement externe est idempotent, identifié par
  `idempotency_key`. Les réessais ne doivent pas entraîner de double facturation.
- Les soldes ne deviennent jamais négatifs, sauf si une `OverdraftPolicy` explicite
  l'autorise pour ce compte.

## Décisions clés et leur justification

- **Modèle Outbox pour les appels de passerelle.** Les gestionnaires écrivent une ligne d'intention
  dans la même transaction de base de données que le changement métier, puis un processus
  travailleur appelle la passerelle. Justification : la passerelle expire sous charge ;
  le faire en ligne rendait la latence de requête et la gestion des erreurs non maîtrisées.
  N'appelez pas la passerelle depuis un gestionnaire de requêtes.
- **Chemin d'écriture unique par agrégat.** Seul `Account.post_entry()` écrit dans le grand livre.
  Justification : un second chemin d'écriture a causé la dérive de solde de Mars 2025.
  Ajoutez de nouveaux comportements comme des méthodes sur l'agrégat, et non de nouvelles requêtes.
- **Event sourcing uniquement pour le grand livre.** Le reste du système est CRUD.
  Justification : nous avons besoin d'une piste d'audit parfaite pour l'argent et
  rien d'autre, et l'event sourcing complet était trop coûteux ailleurs.

## Alternatives rejetées (ne pas réintroduire)

- Chargement paresseux d'ORM à travers les agrégats ; a causé des N+1 et des limites de transaction
  floues. Les dépôts renvoient des agrégats entièrement chargés.
- Stocker le solde comme une colonne mise à jour sur place ; voir l'incident de dérive de solde.
  Le solde est toujours dérivé.
- Une bibliothèque générique `Money` tirée du registre ; nous avons notre
  propre `domain/money.py` ; utilisez-la.
- Webhooks synchrones vers les marchands depuis le thread de requête ; ils
  bloquent et échouent silencieusement. Utilisez la file d'attente de notifications.

## Règles de données et de domaine

- Tous les horodatages sont en UTC, stockés comme `timestamptz`, formatés RFC 3339
  à la limite. Aucune date/heure naïve ne traverse une limite de fonction.
- Les identifiants sont des ULID générés dans la couche application, jamais d'auto-incrément DB.
- La suppression logique n'est pas utilisée. Les enregistrements sont soit actifs, soit déplacés vers
  une table d'archives par un cas d'utilisation explicite.
- Multi-locataire : chaque requête est scopeée par `tenant_id`. Une méthode de dépôt
  sans portée de locataire est un bug.

## Source de vérité du contrat d'API

- La spécification OpenAPI 3.1 dans `api/openapi.yaml` fait autorité.
  Les types de requête/réponse en sont générés ; ne modifiez pas manuellement les
  types générés dans `http/generated/`.
- Nouveaux points de terminaison ou modifiés : mettez à jour `api/openapi.yaml` en premier, puis
  régénérez, puis implémentez. La spécification est conçue et revue dans
  Apidog avant les changements de code.
- Les réponses d'erreur suivent le RFC 9457 (problem+json). Utilisez l'aide partagée
  `problem()` ; n'inventez pas de formes d'erreur ad hoc.

## Où va le nouveau code

- Nouveau point de terminaison : route dans `http/routes/`, DTO dans `http/dto/`,
  cas d'utilisation dans `app/usecases/`, logique de domaine dans `domain/`.
- Nouvelle intégration externe : client dans `infra/clients/`, interface
  dans `app/ports/`.
- Préoccupation transversale (authentification, journalisation, idempotence) : middleware dans
  `http/middleware/`, jamais en ligne dans les gestionnaires.

## Hors périmètre / Ne pas toucher

- `http/generated/` : régénéré à partir d'OpenAPI, les modifications sont perdues.
- `legacy/billing_v1/` : gelé, en cours de migration. Ne pas étendre.
- `migrations/` : ne jamais modifier une migration appliquée ; ajoutez-en une nouvelle.

## En cas de doute

Si un changement demandé exige de rompre une règle ci-dessus, la bonne approche
est de le signaler et de proposer la plus petite alternative de conception cohérente,
plutôt que de contourner silencieusement la règle.

Cette dernière section est plus importante qu'il n'y paraît. Dire à un agent quoi faire lorsque la requête est en conflit avec la conception transforme le fichier d'une documentation passive en un garde-fou actif. Sans cela, un agent qui rencontre une contrainte a tendance à la contourner et à livrer la solution de contournement.

Comment les agents de codage consomment réellement DESIGN.md

Les agents n'ont pas d'analyseur DESIGN.md spécial. Ils le consomment de la même manière qu'ils consomment n'importe quel fichier : en le lisant avec leurs outils de fichier et en traitant le contenu comme du contexte. Ainsi, les mécanismes de chargement sont importants, et ils diffèrent légèrement selon l'outil.

Le modèle fiable consiste à référencer DESIGN.md depuis le fichier d'instructions que chaque agent charge déjà au démarrage. Pour Claude Code, c'est CLAUDE.md ; la documentation sur la mémoire décrit une syntaxe d'importation @path@DESIGN.md étend le fichier dans le contexte au début de la session. Pour l'écosystème AGENTS.md, vous ajoutez une ligne dans AGENTS.md qui y renvoie (« Règles d'architecture et de conception : voir DESIGN.md ; lisez-le avant les changements structurels »). Les agents qui parcourent l'arborescence des répertoires détecteront le AGENTS.md le plus proche, verront le pointeur et chargeront DESIGN.md lorsque le travail touche à l'architecture. Dans les deux cas, vous ne dupliquez pas le contenu ; vous maintenez le fichier opérationnel court et laissez le fichier détaillé être approfondi.

Trois notes pratiques sur le comportement de ces outils :

Premièrement, l'agent traite le fichier comme du contexte, et non comme des règles imposées. La documentation de Claude Code est catégorique : le contenu de CLAUDE.md est une orientation que le modèle essaie de suivre, et non une contrainte stricte. Il en va de même pour tout ce que vous y référencez. C'est pourquoi le modèle formule tout en absolus testables et ajoute une instruction explicite « en cas de doute » ; une prose vague est ignorée sous pression, les règles précises sont suivies plus souvent.

Deuxièmement, la longueur et la structure influencent l'adhérence. Les titres et les puces l'emportent sur les paragraphes car le modèle analyse la structure de la même manière qu'un lecteur. Un mur de philosophie architecturale de 3 pages sera survolé ; dix invariants clairs sous un titre explicite seront utilisés. Écrivez pour la récupération d'informations, pas pour la prose.

Troisièmement, le fichier modifie l'économie de la révision, pas seulement la génération. Même lorsqu'un agent l'ignore en partie, un relecteur peut signaler la règle violée et l'agent la corrige en un seul tour (« cela rompt la règle du chemin d'écriture unique dans DESIGN.md »). Cette boucle de rétroaction, qui ancre la correction dans la décision écrite, est l'endroit où se trouve une grande partie de la valeur réelle. Les équipes construisant leurs propres outils d'agents s'appuient exactement sur cela ; voir construire votre propre Claude Code pour savoir comment cette boucle est intégrée dans les flux autonomes.

Anti-modèles et comment éviter qu'il ne pourrisse

Le moyen le plus rapide de rendre DESIGN.md inutile est de l'écrire comme une page wiki. Un fichier de conception pourri est pire que pas de fichier du tout, car les agents et les humains lui font confiance et sont induits en erreur. Évitez cela.

Un DESIGN.md sain est court, dense, déclaratif, possède un propriétaire et est révisé sur déclencheur. Si le vôtre est long, narratif et n'a pas été touché depuis un an, les agents lisent de la fiction.

DESIGN.md pour les bases de code d'API et de backend

C'est là que le fichier prouve sa valeur. Les services API et backend ont exactement le genre de contraintes invisibles et coûteuses pour lesquelles les agents sont les moins performants : les limites de contrat, la sémantique transactionnelle, l'idempotence, l'intégrité des données, l'architecture en couches. Rien de tout cela n'est évident à partir d'un seul fichier, et se tromper envoie des bugs qui atteignent la production et le portefeuille.

Mettez ces éléments spécifiques aux API dans DESIGN.md et la qualité de la sortie de l'agent sur les tickets backend fera un bond :

Pour le travail backend, les avantages sont concrets : moins de violations de couches, pas d'appels de passerelle en ligne inattendus, des formes d'erreur et de pagination cohérentes, et des gestionnaires conformes au contrat car l'agent a été dirigé vers la spécification OpenAPI au lieu de deviner le schéma. L'agent cesse d'inventer et commence à se conformer. Si vous souhaitez que l'agent exerce également l'API qu'il vient d'écrire, la combinaison contrat-plus-design est ce qui permet aux outils et aux agents de tester une interface connue ; Téléchargez Apidog vous offre l'espace de travail de conception préalable, l'exportation OpenAPI vers laquelle votre DESIGN.md pointe, ainsi qu'un serveur MCP et un débogueur d'agent IA pour vérifier que les points de terminaison générés correspondent réellement au contrat.

Conclusion

FAQ

DESIGN.md est-il une norme officielle comme AGENTS.md ?

Non. AGENTS.md est un format défini et largement adopté, désormais géré par l'Agentic AI Foundation de la Linux Foundation. DESIGN.md est une convention communautaire sans propriétaire unique ni spécification, dans la même famille que ARCHITECTURE.md et les ADR. Traitez-le comme un modèle utile que vous adaptez, et non comme une norme à laquelle vous vous conformez.

Ai-je besoin de DESIGN.md si j'ai déjà AGENTS.md ou CLAUDE.md ?

Si votre architecture a des contraintes non évidentes, oui. AGENTS.md et CLAUDE.md sont destinés à rester courts et opérationnels ; la documentation de Claude Code recommande de maintenir CLAUDE.md en dessous d'environ 200 lignes. Une justification architecturale approfondie n'y tiendrait pas sans le gonfler et nuire à l'adhérence, vous la placez donc dans DESIGN.md et la référencez. Pour le fichier opérationnel lui-même, consultez comment écrire des fichiers AGENTS.md.

En quoi DESIGN.md est-il différent de ARCHITECTURE.md ?

Principalement par l'intention et le public. ARCHITECTURE.md est la convention plus ancienne destinée aux contributeurs humains pour cartographier la base de code. DESIGN.md est la même idée écrite pour un public qui inclut un agent de codage : plus déclaratif, axé sur les décisions et les invariants, et explicitement référencé depuis les fichiers d'instructions de l'agent afin qu'il soit chargé dans le contexte. De nombreuses équipes utilisent un seul fichier et un seul nom ; les principes sont les mêmes.

Quelle doit être la longueur de DESIGN.md ?

Assez long pour couvrir les décisions que les agents continuent de mal comprendre, assez court pour que chaque ligne justifie sa présence. Une densité de décisions l'emporte sur l'exhaustivité. S'il ressemble à un tutoriel ou reformule le code, supprimez-le. Deux à quatre pages ciblées d'invariants et de justifications sont préférables à une narration de quinze pages qu'aucun agent ne lira attentivement.

Comment faire en sorte que l'agent le lise réellement ?

Référencez-le depuis le fichier que l'agent charge déjà au démarrage. Pour Claude Code, importez-le depuis CLAUDE.md avec @DESIGN.md. Pour l'écosystème AGENTS.md, ajoutez une ligne de pointeur dans AGENTS.md indiquant aux agents de lire DESIGN.md avant les changements structurels. Ne collez pas l'intégralité du contenu dans le fichier court ; référencez-le pour que le fichier opérationnel reste concis.

L'agent suivra-t-il toujours DESIGN.md ?

Non, et vous devriez concevoir en tenant compte de cela. Les fichiers d'instructions d'agent sont un contexte que le modèle essaie de suivre, pas une configuration imposée. Rédigez des règles comme des absolus clairs, ajoutez une instruction explicite « signalez les conflits, ne les contournez pas », et appuyez-vous sur la boucle de révision ; signaler une règle violée dans DESIGN.md permet une correction rapide et juste même si la première passe l'a manquée.

DESIGN.md aide-t-il spécifiquement avec les problèmes de contrat d'API ?

Beaucoup. Son utilisation la plus précieuse en backend est de déclarer que la spécification OpenAPI fait autorité et de nommer le fichier, afin que les agents se conforment au contrat au lieu d'inventer des schémas ou de modifier manuellement les types générés. Concevoir ce contrat en premier lieu dans un outil comme Apidog donne à l'agent une cible non ambiguë vers laquelle votre DESIGN.md peut pointer directement.

DESIGN.md doit-il résider dans le dépôt ?

À la racine du dépôt, à côté de README.md et AGENTS.md, afin que les agents et les humains le trouvent sans recherche. Dans un monorepo, un DESIGN.md à la racine pour les règles à l'échelle du système, plus un par package pour l'architecture locale, fonctionne bien, reflétant la façon dont les agents lisent le AGENTS.md le plus proche dans l'arborescence des répertoires.

Pratiquez le Design-first d'API dans Apidog

Découvrez une manière plus simple de créer et utiliser des API

Qu'est-ce que DESIGN.md pour les Agents de Codage ?