Grace
Roadmap des talents

Craft

Profil Software Craftsman — conception métier rigoureuse.

Persona Software Craftsman — conception métier rigoureuse : architecture, DDD, tests, refactoring. La liste ci-dessous est exhaustive : les 17 talents déjà publiés (✅) et la profondeur restante (P0 → P2).

Arbitrages de session (29/06/2026)

Décisions de taxonomie issues de la revue des talents — elles guident la liste ci-dessous :

  • Familles d'architecture séparées. architecture.hexagonal se recentre sur ses quatre concepts (port/adapter, domaine, infra) ; la notion de use-case relève de architecture.clean, pas de l'hexagonal. Hexagonal, Clean et Onion se recommandent mutuellement plutôt que de se lier en dur : on ne « nomme » pas l'archi, on prend les concepts voulus (un talent peut citer le concept de plus haut niveau d'où il vient — axe formation). architecture.three-tier couvre les petits domaines.
  • Le TDD n'est pas un talent de test (c'est une méthode de dev) → famille quality. Pour une IA, privilégier quality.test-first (le test précède le code, sans micro-cycle) ; quality.tdd reste pour qui veut garder la main (validation pas à pas).
  • api.idempotency = idempotence HTTP uniquement (clés d'idempotence). Le cas « n'émettre l'événement qu'après le commit » est le outbox pattern (integration.outbox) — à ne pas confondre.
  • Patterns d'intégration/résilience (circuit-breaker, retry, compensation, saga) = talents d'architecture (avant le code), regroupés sous la famille integration.
  • Concepts transverses à porter par le moteur (hors talents) : sélection partielle d'un composite (prendre use-case sans output-port), niveaux de talent (CQRS simple → DB séparée → +event-driven), talents par personne (outside-in vs inside-out, via install/désactivation MCP), et l'aperçu d'un talent comme support de formation.

Correctifs à appliquer (talents publiés)

Points relevés sur le catalogue actuel, à retravailler — la génération initiale par l'IA a mélangé certains concepts :

TalentCorrectif
architecture.hexagonalRetirer requires: architecture.use-case (le use-case relève de Clean). Recentrer le contenu (compact.md / talent.md) sur port/adapter + domaine + infra ; les étapes « use case » sortent du talent.
architecture.use-caseRattacher conceptuellement à Clean : devenir un requires de architecture.clean plutôt qu'un satellite d'hexagonal.
ddd.tacticalVérifier le mélange de concepts « clean » signalé pendant la revue ; retravailler le corps si besoin.
api.idempotency (backlog)Requalifier en idempotence HTTP ; sortir le « event après commit » vers integration.outbox.
testing.property-based (backlog)Mal rattaché par l'IA à API / event-driven ; contexte = testing (déjà reclassé ici).

Dépendances (cœur P0–P1)

flowchart TB
  classDef existing fill:#eee,stroke:#999,color:#555;
  classDef composite fill:#e7e3ff,stroke:#6d5ef6,color:#3a2f9e;
  classDef atomic fill:#fff,stroke:#6d5ef6,color:#3a2f9e;

  hexa["hexagonal"]:::existing
  usecase["architecture.use-case"]:::existing
  bdd["testing.bdd"]:::existing
  ulang["ubiquitous-language"]:::existing
  domevt["domain-event"]:::existing
  deprule["dependency-rule"]:::existing

  clean["architecture.clean"]:::composite
  onion["architecture.onion"]:::composite
  bc["ddd.bounded-context"]:::composite
  cmap["ddd.context-map"]:::atomic
  acl["ddd.anti-corruption-layer"]:::atomic
  tdd["quality.tdd"]:::composite
  tfirst["quality.test-first"]:::atomic
  di["design.dependency-inversion"]:::atomic
  solid["design.solid"]:::composite
  cqrs["architecture.cqrs"]:::composite
  eda["architecture.event-driven"]:::composite
  outbox["integration.outbox"]:::atomic

  clean --> usecase
  hexa -.-> clean
  clean -.-> hexa
  clean -.-> onion
  hexa -.-> onion
  ulang --> bc
  bc --> cmap
  bc --> acl
  bdd --> tdd
  bdd -.-> tfirst
  deprule --> di
  di --> solid
  hexa -.-> cqrs
  domevt --> eda
  cqrs -.-> eda
  domevt --> outbox
  outbox -.-> eda

Talents

= déjà publié au catalogue · P0 → P2 = à développer. Dans « Dépend de » : requires · recommends · inclut (composite).

Architecture

TalentTypePDépend deDescription
architecture.hexagonalcomposite→ dependency-rule, use-case ⚠️, port-adapter, value-object · ≈ ddd.tactical, domain-eventBackend où le domaine reste indépendant de l'infra. (⚠️ voir correctifs)
architecture.use-caseatomic→ dependency-rule · ≈ port-adapter, acceptance-testsAction applicative qui orchestre le domaine via des ports.
architecture.dependency-ruleatomic≈ port-adapterLes dépendances pointent vers le domaine ; jamais l'inverse.
architecture.port-adapteratomic→ dependency-rulePorts côté domaine/application, adaptateurs côté infra.
architecture.cleancompositeP0→ use-case · ≈ hexagonalUse-cases, frontières, règle de dépendance ; présenteur / output-port en option.
architecture.onioncompositeP1≈ hexagonal · ≈ cleanDomaine scindé en domain-service / application-service.
architecture.three-tiercompositeP2Présentation / business service / accès données — petits domaines.
architecture.vertical-slicingatomicP1≈ hexagonalDécouper par tranche fonctionnelle plutôt que par couche (respecter l'ordre des dépendances).
architecture.modular-monolithcompositeP2→ bounded-contextMonolithe modulaire : modules à frontières nettes avant tout split en services.
architecture.cqrscompositeP1≈ hexagonal · ≈ aggregateSéparer modèles de lecture et d'écriture (niveaux : même DB → DB séparée → +event-driven).
architecture.event-drivencompositeP1→ domain-event · ≈ cqrsDécouplage asynchrone, cohérence à terme.

DDD stratégique & tactique

TalentTypePDépend deDescription
ddd.tacticalcomposite⊃ entity, value-object, aggregate, domain-event, repository, domain-service · ≈ hexagonal, ubiquitous-languageModéliser le cœur métier avec des objets expressifs protégés par des invariants.
ddd.value-objectatomic→ ubiquitous-language · ≈ primitive-obsessionValeur métier validée et immuable.
ddd.entityatomic≈ ubiquitous-language, value-objectObjet métier avec une identité stable dans le temps.
ddd.aggregateatomic→ entity · ≈ domain-event, repositoryFrontière de cohérence transactionnelle autour d'une racine.
ddd.domain-eventatomic≈ aggregate, ubiquitous-languageFait métier survenu, capturé comme événement immuable.
ddd.repositoryatomic→ aggregate · ≈ port-adapterAbstraire la persistance d'un aggregate derrière un port.
ddd.domain-serviceatomic≈ ubiquitous-languageLogique métier sans entité naturelle propre.
ddd.ubiquitous-languageatomicAligner le code sur le vocabulaire métier partagé.
ddd.bounded-contextcompositeP0≈ ubiquitous-languageDélimiter un contexte métier cohérent — concrètement un package/module à forte cohésion, faible couplage.
ddd.context-mapatomicP1→ bounded-contextRelations entre contextes (ACL, conformist, customer/supplier…).
ddd.anti-corruption-layeratomicP1→ bounded-context · ≈ context-mapTraduire à la frontière d'un contexte externe (≈ rôle des ports/adapters).
ddd.specificationatomicP1≈ value-objectEncapsuler une règle métier composable.
ddd.factoryatomicP2≈ aggregate · ≈ value-objectEncapsuler la création d'objets riches quand elle porte de la logique.
ddd.shared-kernelatomicP2→ bounded-contextNoyau partagé entre contextes (lib commune) — couplage assumé.
ddd.open-host-serviceatomicP2≈ context-map · ≈ api.contract-firstService ouvert + published language (OpenAPI / protobuf).

Testing

TalentTypePDépend deDescription
testing.bddatomic→ acceptance-criteria · ≈ acceptance-tests, ubiquitous-languageSpécifier le comportement par l'exemple (Given/When/Then).
testing.acceptance-testsatomic→ acceptance-criteria · ≈ bdd, use-caseTests d'acceptation pilotés par les critères.
testing.contract-testsatomic→ port-adapter · ≈ acceptance-testsVérifier le contrat entre consommateur et fournisseur.
testing.test-doublesatomicP1≈ tdd · ≈ port-adapterMocks / stubs / fakes / spies : quand et lequel.
testing.test-pyramidatomicP1≈ bddRépartition unit / intégration / E2E.
testing.approval-testingatomicP1≈ refactoring.patterns · ≈ contract-testsFiger une sortie de référence (golden master) — refacto/legacy & Storybook.
testing.mutation-testingatomicP1≈ test-pyramidMesurer la qualité des tests par mutants.
testing.outside-inatomicP2≈ tddDévelopper de l'API vers l'intérieur (double boucle) — alternative à inside-out.
testing.property-basedatomicP2≈ test-doublesTester des invariants sur entrées générées.
testing.test-data-buildersatomicP2≈ test-doublesBuilders / object mother pour des données de test lisibles.

Quality

TalentTypePDépend deDescription
quality.test-firstatomicP0≈ bddÉcrire le test avant le code — variante adaptée à l'IA (pas de micro-cycle).
quality.tddcompositeP1→ bdd · ≈ acceptance-testsCycle red-green-refactor — pilotage pas à pas, humain dans la boucle.
quality.continuous-verificationatomicP2≈ tdd« never commit on red ».
quality.tcratomicP2≈ continuous-verificationTest && Commit || Revert — incréments atomiques.
quality.code-reviewatomicP2Revue orientée comportement et conception.
quality.technical-debtatomicP2≈ refactoring.patternsIdentifier, classer et rembourser la dette.

Design & Clean Code

TalentTypePDépend deDescription
design.dependency-inversionatomicP0≈ dependency-rule · ≈ port-adapterDépendre d'abstractions (le « D » de SOLID).
clean-code.namingatomicP0≈ ubiquitous-languageNommer par l'intention et le vocabulaire métier.
clean-code.small-functionsatomicP1≈ namingFonctions courtes, une responsabilité, niveaux d'abstraction homogènes.
design.solidcompositeP1→ dependency-inversionLes cinq principes SOLID.
design.coupling-cohesionatomicP1≈ dependency-inversionCouplage faible, forte cohésion — la boussole de conception.
design.tell-dont-askatomicP2≈ entityConfier le comportement à l'objet qui détient l'état.
error-handling.domain-errorsatomicP0≈ hexagonal · ≈ value-objectModéliser les échecs dans le langage du domaine.
error-handling.result-typeatomicP1≈ domain-errorsResult / Either typé plutôt qu'exceptions pour les échecs attendus.

Refactoring

TalentTypePDépend deDescription
refactoring.primitive-obsessionatomic→ value-object · ≈ ubiquitous-languageRemplacer les types primitifs par des value objects.
refactoring.guard-clauseatomicP0≈ primitive-obsessionAplatir les conditionnels par sorties anticipées.
refactoring.patternscompositeP2≈ guard-clauseCatalogue Fowler : strangler fig, parallel change…
refactoring.replace-conditionalatomicP2≈ guard-clauseRemplacer un switch par du polymorphisme (à pondérer : pas toujours plus simple).

Intégration & résilience

TalentTypePDépend deDescription
integration.outboxatomicP1→ domain-event · ≈ event-drivenN'émettre l'événement qu'après le commit transactionnel.
integration.circuit-breakeratomicP1Couper les appels vers une dépendance défaillante (arrêter de « tabasser » l'API).
integration.retryatomicP1≈ circuit-breakerRéessais avec backoff, jitter, budget.
integration.dead-letteratomicP2≈ retryFile de rejets (DLQ), reprise, poison messages.
integration.compensationatomicP2≈ sagaAction de compensation quand un partenaire échoue (état partiel comblé plus tard).
integration.sagacompositeP2→ domain-event · ≈ compensationTransaction distribuée : orchestration vs chorégraphie.

API & contrats

TalentTypePDépend deDescription
api.contract-firstatomicP1≈ contract-testsOpenAPI, versioning, breaking changes.
api.error-formatatomicP2≈ contract-firstFormat d'erreur standard (RFC 7807 problem+json).
api.idempotencyatomicP2≈ api.contract-firstIdempotence des opérations HTTP (clés d'idempotence) — distinct de l'outbox.

Observabilité (vue dev)

TalentTypePDépend deDescription
observability.structured-loggingatomicP1Logs structurés, correlation id, redaction PII. (volet métriques/traces : profil DevOps)

Documentation & cartographie

Cible : un persona Architecte (livrables = schémas, avant ou en marge du dev) — voir Personas.

TalentTypePDépend deDescription
documentation.sequence-diagramatomicP2Diagramme de séquence par geste (API → base → partenaires) en livrable.
documentation.architecture-diagramatomicP2≈ context-mapC4 / Mermaid / PlantUML — schémas d'archi-solution.

Produit (élaboration des US)

TalentTypePDépend deDescription
product.acceptance-criteriaatomicFormuler des critères d'acceptation vérifiables.
product.user-storyatomicP1≈ acceptance-criteriaFormuler une story orientée valeur.
product.story-splittingatomicP2→ user-storyDécouper une story en incréments livrables.
product.example-mappingatomicP2≈ bdd · ≈ acceptance-criteriaCartographier règles et exemples (atelier Three Amigos).

On this page