Les artefacts permanents et “à la demande” du projet
Un artefact de projet, c’est ce qui survit à une tâche : la doctrine chargée à chaque session, la règle, le glossaire, l’ADR. À distinguer des artefacts de tâche (traités au chapitre 5.1), ils se rangent en deux familles :
- Prescriptif — le comment faire (
AGENT/CLAUDE.md,.claude/rules, coding standard). - Descriptif — ce qui est vrai (glossaire, ADR, cartographie).
Six familles couvrent l’essentiel : doctrine, règle, sémantique métier, décision d’architecture, cartographie, documentation de référence.
Quel que soit le type, un artefact doit :
- porter un nom court et sans ambiguïté ;
- annoncer son contenu en une ligne (champ
descriptionen front-matter) ; - dire quand on l’utilise et quand on le met à jour ;
- définir son périmètre, explicitement ou par sa position dans l’arborescence (
UBIQUITOUS_LANGUAGE.mdposé dans/root/module1/se limite au module 1).
Par convention dans ce chapitre, chaque artefact est écrit en markdown versionné, avec un front-matter qui porte au minimum un champ description.
Doctrine (prescriptif)
La doctrine est le contrat permanent : CLAUDE.md / AGENT.md, chargé à chaque session. Elle pose les guardrails, pas une base de connaissance. Sa raison d’être recouvre celle du chapitre 4.2 : cesser de re-prompter, aligner humains et agents, rendre l’agent prévisible.
- Contenu : description courte du projet ; conventions et contraintes non négociables ; commandes de démarrage / build / test / lint ; pointeurs vers les autres artefacts.
- Principe clé : construire incrémentalement, partir minimal et ajouter ce qui manque au fil des sessions.
- Granularité :
CLAUDE.mdracine sous 100 lignes, toujours vrai ; références par dossier pour spécialiser patterns et contraintes locales, chargées à la volée (cf. progressive disclosure). - Quand le mettre à jour : à chaque erreur récurrente de l’agent, à chaque changement de convention ou de commande. Heuristique : un dossier change → le
CLAUDE.mdle plus proche est candidat.
Exemple
// `CLAUDE.md` racine d'un backend e-commerce
Go 1.22, monorepo, DDD avec bounded contexts dans domain/.
Commandes : make test, make build, make lint.
Règles non négociables : pas de panic en prod, erreurs wrappées avec `fmt.Errorf("...: %w", err)`.
Voir domain/CLAUDE.md pour les patterns DDD, infrastructure/http/CLAUDE.md pour les endpoints.
Règle (prescriptif)
Là où la doctrine est toujours chargée, la règle est conditionnelle. .claude/rules, coding standard, pattern d’implémentation, CLAUDE.md dans des sous-répertoires : autant de conventions ciblées que l’agent ne lit que lorsqu’un fichier concerné entre dans le contexte.
- Contenu : la convention à respecter (écriture d’un test, pattern de résilience, style fonctionnel…) ; son déclencheur (type de fichier ou pattern) ; exemples et contre-exemples, avec un lien vers le code de référence plutôt qu’une théorie.
- Principe clé : une règle = un périmètre net.
- Granularité : une règle par préoccupation, un fichier
myrule.mdpar type de fichier ou pattern dans le répertoire.claude/rulesou un fichierCLAUDE.mddans les sous-répertoires (donc chargé lorsque Claude travaille dans ces sous-répertoires). Jamais un fourre-tout. Ce fichier ne sert qu’à une garde globale. - Quand le mettre à jour : quand le pattern évolue, ou quand l’agent enfreint une règle qu’on croyait implicite.
- Forme : front-matter
pathspour le déclencheur ; positionné près des fichiers concernés ou référencés depuis la doctrine.
Exemple
// `domain/order/CLAUDE.md`
---
when_to_use: éditer un agrégat dans domain/order/
---
Un agrégat se met à jour via une méthode qui retourne un nouvel état, jamais par mutation directe.
✓ o2 := o.Cancel(now)
✗ o.Status = Cancelled
Référence : domain/order/order.go:Cancel
Modèle du domaine & Sémantique métier (descriptif)
UBIQUITOUS_LANGUAGE.md ou glossaire : le vocabulaire métier partagé qui fixe le sens des termes du domaine. Sans cette référence, l’agent devine, et il invente des règles plausibles mais fausses. Aligne humains et agents sur un même langage (vocabulaire DDD : bounded context, agrégat, value object).
- Contenu : termes du domaine et leur définition non ambiguë ; agrégats, entités, value objects et leurs invariants ; synonymes à proscrire et terme canonique retenu ; pointeur vers le code qui matérialise chaque concept.
- Principe clé : un terme = un sens dans un périmètre. Le glossaire est la source de vérité sémantique ; le code en est le reflet.
- Granularité : un glossaire par bounded context ou par module, scopé par sa position dans l’arborescence. Pas de glossaire global fourre-tout.
- Quand le mettre à jour : nouvelle notion du domaine, redéfinition d’un terme, divergence constatée entre le langage métier et le code.
Exemple
// `domain/order/UBIQUITOUS_LANGUAGE.md`
- Order : commande passée par un Customer, agrégat racine.
- OrderLine : value object, immutable, prix figé à la création.
- Customer : référencé par ID, jamais embarqué dans l'Order.
- Synonymes à proscrire : panier → utiliser Cart (bounded context distinct).
Le plus important dans nos logiciels sont les concepts qui sont manipulés et exposés à l’utilisateur (Order, Stock, Location, Product, etc,).

Tout modèle de domaine doit être exhaustif sur trois dimensions pour être complet et implémentable sans informations supplémentaires :
- Structure : Les données, les types, les agrégats et leurs hiérarchies et relations.
- Comportement : Le comportement qui fait changer l’état des concepts en réponse à des stimulis, et donc le cycle de vie de ces concepts et les règles métier qu’ils embarquent (États, transitions, invariants). Ce comportement attendu pourra à minima être décrit par des scénarios en Given/When/Then.
- Interactions : La répartition des responsabilités et les flux entre composants (Dépendances et interactions).

Les concepts issus du Domain-Driven Design sont très efficaces pour décrire les concepts qui seront manipulés par notre logiciel en dehors de toute considération technologique. Ci-après un résumé de ces concepts avec lesquels nous pouvons structurer notre domaine (le métamodèle DDD).

Ces Skills de design du domaine peuvent être utile pour construire ou extraire un modèle du domaine et ensuite alimenter le contexte du projet (⚠️ Disclaimer : nous sommes à l’origine de ces skills, tout feedback quel qu’il soit est donc le bienvenu et nous sera très précieux 🙂).
Design du système : quelle décomposition ?
Avec les agents IA, le développeur devient Designer, il doit décrire la structure et le découpage de sa solution. Il peut également demander des suggestions de software design à l’agent.
Demander à l’agent de proposer une décomposition : L’agent est très bon pour décomposer un problème si on le lui demande. Exemple de prompt : « Décompose ce problème en composants autonomes, propose leur interface (API), leurs responsabilités et interactions entre eux et les tâches nécessaires pour les implémenter. »
Un composant logiciel peut être décrit de manière minimale avec :
- son nom
- sa responsabilité (single responsibility principle…)
- son interface = un ensemble d’opérations.
- Une opération = un nom, des structures de données en entrée, une en sortie, des erreurs pouvant être levées). Bonus : décrire les règles et invariants utilisés par l’opération ou le composant (pré et post-conditions).
- ses dépendances et les interactions avec d’autres compos (pré et post-conditions)ants : Les interactions entre composants peuvent être décrites avec un diagramme de séquence style Mermaid.
Une manière très efficace de bien séparer les responsabilités dans notre logiciel et de conserver notre domaine agnostique des considérations technologiques est de dériver le code applicatif (celui qui nous permet d’interagir avec le logiciel : UI, API, CLI, etc.) et le code d’infrastructure (DB, Messaging, autres systèmes invoqués à travers des SPI) depuis le domaine. Chaque concept doit être conçu et décrit de manière suffisante (éventuellement avec l’aide de l’agent lui-même) afin de laisser ensuite l’agent en faire son implémentation. Cette approche se marie très bien avec la description du comportement attendu avec les approches BDD/ATDD. Le style d’architecture “Hexagonale” et ses variantes nous semble donc le plus efficace dans la séparation correcte des responsabilités techniques d’un système logiciel type “backend pour une application de gestion” : code application, code du domaine et code d’infrastructure.
Décision d’architecture (descriptif)
L’ADR consigne une décision structurante, son contexte, ses alternatives écartées et ses conséquences. Une décision non tracée se re-débat à chaque session, un agent ou un humain la remet en cause faute d’en connaître le pourquoi. L’ADR fige le raisonnement, pas seulement le choix.
- Contenu : contexte (politique, économique, temporel, culturel, technique) ; problème qui a forcé la décision ; décision prise ; alternatives envisagées et pourquoi écartées ; conséquences (ce que ça contraint, ce que ça facilite) ; statut (proposé / accepté / remplacé par…).
- Principe clé : on documente le pourquoi avant le quoi. Une décision reste immuable jusqu’à ce qu’une nouvelle ADR la remplace.
- Granularité : un ADR = une décision. Réservé aux choix structurants et coûteux à inverser.
- Quand le mettre à jour : jamais. On ajoute un nouvel ADR qui modifie le statut du précédent quand le contexte évolue.
- Forme : numéroté et daté (
adr/0001-*.md) ; front-matter avec statut.
Exemple
// `adr/0007-event-sourcing-order.md`
Date : 2026-03-15
Status : accepté
Contexte : besoin de tracer chaque modification d'une commande pour audit légal (RGPD, finance).
Décision : le contexte Order est event-sourced, snapshot tous les 50 events.
Alternatives écartées : audit log relationnel (perte de causalité), CDC (trop d'infra).
Conséquences : reads via projections, complexité de migration accrue.
Cartographie (descriptif)
La carte du projet : où vivent les choses, comment les modules s’articulent, par où entrer. Elle évite que l’agent explore à l’aveugle ou se perde dans l’arborescence. On l’oriente, on ne déverse pas tout le code.
- Contenu : modules et dossiers majeurs avec leur responsabilité (une ligne chacun) ; points d’entrée par type de tâche (ajouter un invariant →
domain/, ajouter une API →infrastructure/http) ; frontières entre modules et leurs dépendances ; pointeurs vers les autres artefacts scopés. - Principe clé : c’est un index. Il pointe vers la source de vérité, il ne la recopie pas.
- Granularité : une carte racine de haut niveau ; en monorepo, une carte par module. Volontairement grossière.
- Quand le mettre à jour : la structure bouge (nouveau module, déplacement majeur, changement de frontière).
- Forme : souvent porté par la doctrine racine (
CLAUDE.md) ou un fichier dédié ; arborescence annotée plutôt que prose.
Exemple
// arborescence annotée dans `CLAUDE.md`
domain/ # logique métier pure, un dossier par bounded context
order/ # commandes (event-sourced)
cart/ # panier
catalog/ # produits
infrastructure/
http/ # endpoints REST — point d'entrée API
db/ # repos Postgres
eventstore/ # event store Order
cmd/ # binaires
# Ajouter un invariant métier → domain/<context>/
# Ajouter un endpoint → infrastructure/http/
Documentation de référence (descriptif)
Un pointeur vers une base de connaissance externe que l’agent ne peut pas déduire du repo : libs critiques, API, schémas, formats. Sur une dépendance structurante, sans ancrage, l’agent prend des fausses hypothèses. La doc de référence le ramène à la réalité de l’outil, à l’endroit où la connaissance est maintenue.
Format de référence :
llms.txtest un fichier texte standardisé qu’une lib publie à sa racine pour exposer une vue curée de sa doc, lisible par un agent.
- Contenu :
llms.txtou extrait curé de la doc des libs critiques ; conventions d’appel d’API, schémas de données et leur sémantique ; contraintes de version et de compatibilité ; pointeur vers la source officielle. - Principe clé : curé, pas exhaustif. On embarque ce qui est structurant et que le modèle ne connaît pas de façon fiable.
- Granularité : un fichier par dépendance structurante, chargé à la volée selon la tâche.
- Quand le mettre à jour : montée de version d’une lib critique, changement d’API, ou erreur de l’agent sur un usage.
- Forme : front-matter
when_to_use; référencé depuis la doctrine ou centralisé dans/docs.
Exemple
// `docs/pgx.md`
when_to_use: requêter Postgres dans infrastructure/db/
Lib : jackc/pgx v5.
llms.txt : https://pkg.go.dev/github.com/jackc/pgx/v5
Convention projet : toujours passer un context.Context explicite à pool.QueryRow.
Piège : pgx.ErrNoRows doit être wrappé en domain.ErrNotFound dans le repo, jamais propagé.
Ces six familles couvrent le contexte qui survit aux sessions. Le chapitre suivant traite l’autre moitié du métier : les artefacts de travail, ceux qui ne vivent que le temps d’un travail à mener.