domain-driven-design
Model business domains using DDD tactical and strategic patterns
When & Why to Use This Skill
The Domain-Driven Design (DDD) skill empowers developers and architects to model complex business domains using proven tactical and strategic patterns. It automates the identification of entities, value objects, and aggregates, while facilitating the strategic mapping of bounded contexts to ensure a robust, scalable, and maintainable software architecture.
Use Cases
- System Architecture Planning: Transform complex business requirements into structured domain models with clearly defined entities, value objects, and relationships.
- Microservices Decomposition: Define bounded contexts and context maps to logically partition monolithic applications into independent, scalable services.
- Aggregate Boundary Definition: Establish transactional consistency boundaries by identifying aggregate roots and enforcing critical business invariants.
- Ubiquitous Language Development: Bridge the gap between technical teams and business stakeholders by generating a shared vocabulary and glossary of domain terms.
- Event Storming & Workflow Analysis: Model business processes and state transitions to visualize how data flows through different domain contexts.
| name | domain-driven-design |
|---|---|
| description | Model business domains using DDD tactical and strategic patterns |
| sasmp_version | "1.3.0" |
| bonded_agent | 05-domain-driven |
| bond_type | PRIMARY_BOND |
| version | "2.0.0" |
| updated | "2025-12-30" |
Domain-Driven Design Skill
Atomic skill for domain modeling and DDD pattern application
Skill Definition
skill_id: domain-driven-design
responsibility: Single - Domain modeling and DDD pattern guidance
atomic: true
idempotent: true
Parameter Schema
interface SkillParams {
// Required
action: 'model' | 'aggregate' | 'context_map' | 'event_storm';
domain_description: string;
// Optional
existing_models?: string;
stakeholder_terms?: string[];
complexity?: 'core' | 'supporting' | 'generic';
output_format?: 'text' | 'code' | 'diagram';
}
interface SkillResult {
domain_model?: DomainModel;
aggregates?: AggregateDefinition[];
context_map?: ContextMap;
event_storm?: EventStormResult;
ubiquitous_language?: GlossaryEntry[];
}
Validation Rules
input_validation:
action:
required: true
enum: [model, aggregate, context_map, event_storm]
domain_description:
required: true
min_length: 50
max_length: 10000
Retry Logic
retry_config:
max_attempts: 3
backoff:
type: exponential
initial_delay_ms: 1500
max_delay_ms: 15000
multiplier: 2
retryable_errors:
- TIMEOUT
- RATE_LIMIT
non_retryable_errors:
- INSUFFICIENT_DOMAIN_INFO
DDD Building Blocks
Tactical Patterns
entity:
characteristics:
- Has identity
- Has lifecycle
- Can change state
example:
name: Order
identity: orderId
value_object:
characteristics:
- No identity
- Immutable
- Equality by attributes
example:
name: Money
attributes: [amount, currency]
aggregate:
characteristics:
- Consistency boundary
- Single root entity
- Transactional unit
rules:
- Reference by ID only
- Single aggregate per transaction
Strategic Patterns
bounded_context:
identification:
- Linguistic boundary
- Team ownership
- Model consistency scope
context_map_patterns:
- partnership
- customer_supplier
- conformist
- anticorruption_layer
- open_host_service
Usage Examples
Domain Modeling
// Input
{
action: "model",
domain_description: `
E-commerce order management system. Customers place orders
containing multiple products.
`
}
// Output
{
domain_model: {
entities: [
{ name: "Order", identity: "orderId" },
{ name: "Customer", identity: "customerId" }
],
value_objects: [
{ name: "Address", attributes: ["street", "city", "zip"] },
{ name: "Money", attributes: ["amount", "currency"] }
],
aggregates: [
{
name: "Order",
root_entity: "Order",
entities: ["OrderLine"],
invariants: ["Order total must equal sum of line totals"]
}
]
},
ubiquitous_language: [
{ term: "Order", definition: "A customer's request to purchase products" }
]
}
Unit Test Template
describe('DomainDrivenDesignSkill', () => {
describe('model', () => {
it('should identify entities from domain description', async () => {
const result = await skill.execute({
action: 'model',
domain_description: 'Customers place orders for products'
});
expect(result.domain_model.entities.map(e => e.name))
.toContain('Customer');
});
});
describe('aggregate', () => {
it('should define aggregate boundaries based on invariants', async () => {
const result = await skill.execute({
action: 'aggregate',
domain_description: 'Order with lines, total must match'
});
expect(result.aggregates[0].invariants).toBeDefined();
});
});
});
Error Handling
errors:
INSUFFICIENT_DOMAIN_INFO:
code: 400
message: "Domain description lacks sufficient detail"
recovery: "Provide more business context and rules"
AMBIGUOUS_BOUNDARIES:
code: 422
message: "Cannot determine clear aggregate boundaries"
recovery: "Clarify invariants and transactional requirements"
Integration
requires:
- nlp_analyzer
- domain_extractor
emits:
- domain_modeled
- aggregate_defined
- context_mapped
consumed_by:
- 05-domain-driven (bonded agent)
- 07-architecture-patterns (for architecture mapping)