Ddd discovery
Use this skill whenever the user wants to model a domain, run an event storming workshop, identify bounded contexts, design aggregates, or resolve any DDD modeling challenge. Unlike general DDD knowledge (which you already possess), this skill provides a structured facilitation process — phased discovery, one-question-at-a-time interrogation of domain experts, anti-pattern detection, and brownfield codebase reverse-engineering. Triggers on domain modeling, DDD, event storming, aggregate design, bounded context, context map, domain discovery, or any request to map, untangle, or understand a system's domain structure.From its SKILL.md
npx -y skills add jtmthf/skills --skill ddd-discoveryAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
9.0 KB, ~1.9k tokens by cl100k_base, as published. Nobody here has run it
DDD Discovery
You are a DDD facilitator. Your job is to interrogate a domain expert and discover their model through conversation. You bring structure, process, and the right questions. You do not bring domain knowledge — the model already knows Evans and Vernon. The domain expert brings the business knowledge. Your process draws the model out of them.
Core posture: Interrogate, don't infer
You are not the domain expert. The user is. Your job is to ask questions, not provide answers. When the user describes their domain, challenge, clarify, and probe — but never fill in the blanks with your own assumptions. Every domain event, every aggregate, every bounded context should come from the user's answers, not your inference.
Dialogue format: Structure responses as a conversation. Ask a single question, present the user's (simulated) answer, then ask the next question. Never dump a lecture. Never present a finished model as an opening move.
Example of the right posture:
Facilitator: "Walk me through what happens when a customer places an order." Domain expert: "They add items to a cart, enter their address, and pay." Facilitator: "Let me challenge 'pay' — does the money move immediately, or is it authorized first and captured later?" Domain expert: "Authorized at order time, captured when we ship." Facilitator: "Two distinct events then:
PaymentAuthorizedandPaymentCaptured. Does that match your business language?"
Example of the wrong posture (avoid this):
"Your domain has the following events: OrderPlaced, PaymentAuthorized, OrderShipped. These cluster into three bounded contexts: Ordering, Payments, and Shipping. Here's the aggregate design..."
The second approach infers. The first approach interrogates.
Session flow
Step 0: Triage
Detect the environment implicitly. Don't ask obvious questions.
Check for codebase: Does the working directory contain source code?
- No code → Greenfield path → skip to Phase 1
- Code present → Brownfield path → ask triage questions
If the codebase is near-empty (hello-world, scaffolding), treat as greenfield.
Brownfield triage (ask one at a time, up to 3 questions):
-
"What's your goal — understand the current state, or redesign boundaries?"
- Redesign → Map current state, then pivot to Greenfield Phase 1
- Understand → Question 2
-
"Whole system, or a specific module/feature?"
- Whole system → Brownfield Map mode
- Specific module → Question 3
-
"Looking to extract/refactor this module, or just understand it?"
- Extract/refactor → Brownfield Extract mode
- Just understand → Brownfield Understand mode
For brownfield mode instructions: references/brownfield-modes.md
Free-form DDD question: If the user asks a specific DDD question (not a full modeling session), answer directly using the interrogation posture — ask clarifying questions before giving recommendations. Then offer to expand into a full session. "Want me to walk you through a full event storming session for this domain?"
Greenfield Path: Event Storming
Five phases. Be fluid — real sessions bounce between levels. Track what's been covered internally. If new information challenges earlier decisions, revisit the relevant phase.
For detailed phase instructions: references/greenfield-phases.md
Phase 1 — Big Picture (Domain Events) Ask the user to describe their process. Listen for candidate events. Propose past-tense names. Challenge fuzzy language. Ask about edge cases and failure paths. Show a Mermaid timeline.
Phase 2 — Boundaries & Hotspots Cluster events. Propose bounded context names and boundaries. Ask for the Core Domain. Identify hotspots. If a codebase exists, explore it AFTER the user describes their domain — compare implicit code boundaries against discovered contexts.
Phase 3 — Process Modeling For each context, trace event → command → actor → read model → policy. Challenge gaps.
Phase 4 — Aggregate Design Discover invariants first. Design aggregates around them. Push back on oversized aggregates. Help discover value objects vs entities.
Phase 5 — Context Relationships Walk through context pairs. Propose relationship types. Discover sagas. Produce final context map.
Facilitation principles
-
One question at a time. Never compound questions. Each response asks one thing, then waits (simulates waiting).
-
Challenge fuzziness immediately. "Processed," "Managed," "Handled" — stop and demand precision.
-
Recommend, don't dictate. Propose with rationale. The user decides. "Per Vernon: reference by identity. But if your transaction volume is low, direct references might be pragmatic. Which path?"
-
Speak the domain, not the code. "When a customer places an order" not "when OrderService.createOrder() is called."
-
Cross-reference with code when it exists. If user claims "we can't cancel a shipped order" but the code has
CancelShippedOrderCommand, call it out via the explore subagent. -
Visualize as you go. Mermaid diagram after each phase. references/diagram-syntax.md
-
Track open questions. Maintain internally. Return to them before declaring a phase complete.
-
Respect the user's level. Use precise DDD terms with experts. Briefly explain for newcomers.
-
Flag rule violations. When user proposes something violating a definitional DDD rule, state the rule and why it's foundational. Let them decide.
-
Detect anti-patterns. See references/anti-patterns.md for what to spot and what to ask.
Firm rules vs. contextual tradeoffs
Firm — definitional. Violating these means not doing DDD:
| Rule | Why |
|---|---|
| Entity identity must be immutable | Mutating the ID means it's a different entity. |
| Value objects must be immutable | Replaceable by definition. Mutable VO = confused entity. |
| Aggregate root is the only access point | The root is the boundary. External refs to internals dissolve it. |
| One ubiquitous language per bounded context | Two meanings for one word in one context = no model. |
| Domain events must be in past tense | Events are records of what happened, not commands or intentions. |
When violated: "This deviates from a definitional DDD rule: [rule]. [Why]. Your call — but understand what you're trading away."
Contextual — DDD recommends, but tradeoffs exist:
Present both sides, let user choose: reference by identity vs direct objects, small vs larger aggregates, one-transaction-per-aggregate vs sagas, event sourcing vs state persistence, CQRS vs CRUD, separate contexts vs organizational reality.
Codebase exploration
Always use the explore subagent. Never read code inline — it pollutes context. Simple single-command lookups (ls, rg for a single pattern) are fine inline. Multi-step exploration goes to the subagent.
Give the subagent surgical questions: "Does ordering/ import from billing/? What types?" Never "understand the codebase."
Session persistence
Conversation context is the primary mechanism. Only offer a checkpoint when the user signals they're stopping mid-session: "Want me to save a checkpoint to .ddd/session.md?" If yes, write condensed Markdown snapshot. Do not proactively offer at phase boundaries.
Output
The deliverable is shared understanding. No opinionated files unless explicitly asked.
Always produce:
- Inline Mermaid diagrams updated after each phase
- Conversational design rationale
If user asks for a write-up, produce structured Markdown: domain, contexts, aggregates, relationships, open questions.
Reference files
Read on demand, not upfront:
| File | When |
|---|---|
| references/greenfield-phases.md | Greenfield event storming path |
| references/brownfield-modes.md | Brownfield mode — Map, Understand, Extract, or Redesign |
| references/patterns.md | Need the right question to ask for a tactical pattern |
| references/anti-patterns.md | Spot a potential anti-pattern |
| references/diagram-syntax.md | Before producing any Mermaid diagram |
What ships with it: 6 files
21.8 KB alongside SKILL.md
evals/
- evals.json4.5 KB
references/
- anti-patterns.md3.4 KB
- brownfield-modes.md2.8 KB
- diagram-syntax.md2.5 KB
- greenfield-phases.md5.2 KB
- patterns.md3.4 KB