agentleFS
d-padmanabhand-padmanabhan/agent-engineering-handbook/skills/domain-driven-design/SKILL.md

domain-driven-design

Skill17 starsChanged 56 days agoMITView on GitHub

Designs and reviews software domain models using Domain-Driven Design, including subdomains, bounded contexts, context maps, ubiquitous language, aggregates, value objects, domain events, repositories, and anti-corruption layers. Use when business rules are complex, service or module boundaries are unclear, teams disagree on terminology, or the user mentions DDD, bounded contexts, aggregates, or domain modeling.

25 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use hexagonal-architecture, clean-architecture and 2 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • ffsshhttiikkSkill

    hexagonal-architecture

    Hexagonal architecture patterns and implementation

    Also in 4 projects that use this

  • harrissohail6Skill

    clean-architecture

    Clean architecture and SOLID principles. Auto-activates when designing systems or refactoring code structure.

    Also in 4 projects that use this

  • xenitV1Skill

    clean-code

    Pragmatic coding standards - concise, direct, no over-engineering, no unnecessary comments

    Also in 4 projects that use this

  • SentrySkill

    review

    Fixture review skill.

    Also in 3 projects that use this

The file

We split this skill into the rules it gives an agent

11 rules. 0 are common, 9 are distinctive, and 2 are very specific to this project.

  • 0

    Common

    Most of the 23 edited versions we read keep these.

  • 9

    Distinctive

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Use Domain-Driven Design (DDD) to make complex business rules and ownership boundaries explicit.

    line 8
  2. Distinctive:

    Start from business capabilities, policies, language, and change patterns, not tables, endpoints, or deployment units.

    line 12
  3. Distinctive:

    Treat one model as valid only inside its bounded context.

    line 13
  4. Distinctive:

    Use a ubiquitous language shared by domain experts and engineers in conversations, code, tests, APIs, and events.

    line 14
  5. Distinctive:

    Keep aggregate boundaries small.

    line 16
  6. Distinctive:

    Prefer a modular monolith until independent deployment, scaling, security, data ownership, or team autonomy justifies distribution.

    line 19
  7. Distinctive:

    Create a glossary only from validated language.

    line 34
  8. Distinctive:

    Do not label every component "core." The classification should influence build-versus-buy, staffing, design depth, and tolerance for vendor …

    line 44
  9. Very specific:

    Use the strategic design reference (${HANDBOOK_ROOT}/skills/domain-driven-design/references/strategic-design.md) for context maps and …

    line 60
  10. Very specific:

    Use the tactical modeling reference (${HANDBOOK_ROOT}/skills/domain-driven-design/references/tactical-modeling.md) for aggregate and event …

    line 76
  11. Distinctive:

    Do not share database tables, ORM entities, or mutable domain objects across bounded contexts.

    line 88

“Common” is measured: kept by at least 6 in 10 of the 23 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Domain-Driven Design

Use Domain-Driven Design (DDD) to make complex business rules and ownership boundaries explicit. Do not use DDD vocabulary to disguise ordinary CRUD or technology-driven service decomposition.

DDD Contract

  • Start from business capabilities, policies, language, and change patterns, not tables, endpoints, or deployment units.
  • Treat one model as valid only inside its bounded context. The same term may intentionally mean different things elsewhere.
  • Use a ubiquitous language shared by domain experts and engineers in conversations, code, tests, APIs, and events.
  • Align boundaries with cohesive invariants and ownership. A bounded context is a semantic and organizational boundary, not automatically a microservice.
  • Keep aggregate boundaries small. One aggregate is one transactional consistency boundary.
  • Reference other aggregates by stable identity rather than loading or mutating a large object graph.
  • Make cross-context contracts explicit and versioned. Use an anti-corruption layer when an upstream model must not leak inward.
  • Prefer a modular monolith until independent deployment, scaling, security, data ownership, or team autonomy justifies distribution.
  • Validate models through concrete scenarios and examples with domain experts.

Workflow

1. Establish the domain language

Collect:

  • business outcomes and critical decisions;
  • domain terms and definitions;
  • actors, commands, policies, constraints, and exceptional cases;
  • examples that distinguish similar concepts;
  • terms with conflicting meanings across teams.

Create a glossary only from validated language. Treat unresolved synonyms and overloaded terms as modeling questions.

2. Classify subdomains

Separate:

  • Core subdomains: differentiated capabilities that justify focused investment.
  • Supporting subdomains: necessary business-specific capabilities that are not differentiators.
  • Generic subdomains: commodity capabilities better bought, reused, or delegated when practical.

Do not label every component "core." The classification should influence build-versus-buy, staffing, design depth, and tolerance for vendor coupling.

3. Discover bounded contexts

For each candidate context, state:

  • purpose and language;
  • decisions and invariants it owns;
  • authoritative data;
  • team or owner;
  • commands, queries, and published contracts;
  • upstream and downstream relationships;
  • expected rate and reason for change.

Split when language, invariants, ownership, or change cadence diverge materially. Merge contexts that are separated only by technical layers or speculative scaling.

Use the strategic design reference (${HANDBOOK_ROOT}/skills/domain-driven-design/references/strategic-design.md) for context maps and integration relationships.

4. Model behavior inside a context

Identify:

  • entities with continuity and identity;
  • value objects defined by immutable attributes;
  • aggregates that protect invariants;
  • aggregate roots as the only external mutation entry point;
  • domain events that record meaningful completed facts;
  • domain services for stateless domain behavior that has no natural entity or value-object home;
  • repositories for loading and saving aggregate roots.

Application services orchestrate use cases, authorization, transactions, and external ports. They should not contain the domain rules that determine valid state.

Use the tactical modeling reference (${HANDBOOK_ROOT}/skills/domain-driven-design/references/tactical-modeling.md) for aggregate and event design.

5. Design cross-context interaction

Choose deliberately:

  • synchronous request/response for immediate decisions;
  • asynchronous events for facts and decoupled reactions;
  • published language for stable shared contracts;
  • anti-corruption layer for translation and model protection;
  • separate ways when integration cost exceeds its value.

Do not share database tables, ORM entities, or mutable domain objects across bounded contexts. Shared kernels require explicit joint ownership and should remain small.

For consistency across contexts, use the distributed transactions skill (${HANDBOOK_ROOT}/skills/distributed-transactions/SKILL.md).

6. Validate and evolve

Validate with:

  • example mapping or scenario walkthroughs;
  • aggregate invariant tests;
  • contract tests between contexts;
  • architecture tests for forbidden dependencies;
  • production signals tied to domain outcomes;
  • explicit migration and compatibility plans.

Revisit boundaries when language, ownership, coupling, or change patterns provide evidence that the model is wrong. Avoid large rewrites solely to achieve a theoretically pure model.

Review Questions

  1. Which business decision or invariant does each model element protect?
  2. Where does each term have one precise meaning?
  3. Does each bounded context own its data and contract?
  4. Can one command atomically preserve one aggregate's invariants?
  5. Are cross-aggregate workflows explicit and eventually consistent where necessary?
  6. Does infrastructure vocabulary leak into the domain model?
  7. Are boundaries supported by team ownership and change patterns?
  8. Is DDD complexity justified by domain complexity?

Anti-Patterns

  • One enterprise-wide canonical model for unrelated teams and workflows.
  • One bounded context or service per database table.
  • Aggregates that load an entire customer, account, or order graph.
  • Repositories for every entity regardless of aggregate ownership.
  • Anemic models where application services hold every business rule.
  • Domain events used as commands or mutable data-transfer objects.
  • Shared databases presented as independent services.
  • Generic Manager, Processor, or Service types that conceal domain language.
  • Applying event sourcing, CQRS, or microservices merely because DDD is mentioned.

Required Output

Produce:

  1. Domain goal, assumptions, and validated terminology
  2. Subdomain classification
  3. Bounded contexts with ownership and authoritative data
  4. Context map and integration contracts
  5. Key aggregates, invariants, commands, and domain events
  6. Transaction and consistency boundaries
  7. Migration and validation plan
  8. Risks, unresolved language, and evidence that would change the model

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.