domain-driven-design

pluginagentmarketplace's avatarfrom pluginagentmarketplace

Model business domains using DDD tactical and strategic patterns

⭐1stars🔀1forks📁View on GitHub🕐Updated Jan 5, 2026

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.
namedomain-driven-design
descriptionModel business domains using DDD tactical and strategic patterns
sasmp_version"1.3.0"
bonded_agent05-domain-driven
bond_typePRIMARY_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)