From lattice
Guides structured conversation to define DDD guardrails for domain design, producing ddd-principles.md as override for domain-driven-design atom. Use for setup DDD principles or aggregate rules.
npx claudepluginhub techygarg/lattice --plugin latticeThis skill uses the workspace's default tool permissions.
- **Output**: `.lattice/standards/ddd-principles.md` (or custom path from `.lattice/config.yaml` → `paths.ddd_principles`)
Applies DDD tactical patterns to domain code: enforces aggregate design, value objects over primitives, entity identity rules, and bounded context boundaries for domain modeling.
Guides Domain-Driven Design for complex business logic: aggregates, bounded contexts, ubiquitous language, value objects, entities, and TypeScript implementations with invariants.
Share bugs, ideas, or general feedback.
.lattice/standards/ddd-principles.md (or custom path from .lattice/config.yaml → paths.ddd_principles)mode: overlay): A slim document containing only sections that differ from the defaults. The domain-driven-design atom reads its embedded defaults first, then applies this document's sections on top. This is the expected common case.mode: override): A comprehensive standalone document that fully replaces the atom's embedded defaults. For teams with fundamentally different domain modeling principles.paths.ddd_principles in .lattice/config.yaml./assets/template.md for the full document structure, default content, and interview guidance commentsThis skill defines the rules of domain crafting, not the domain model itself. The domain model evolves through features; this document defines the guardrails. It covers DDD tactical patterns only -- not strategic DDD (no context mapping, no microservice topology, no bounded context integration).
Before starting the interview, check whether a custom document already exists:
.lattice/config.yaml -- does paths.ddd_principles point to a file?Look for signals that inform the conversation:
domain/ (or core/, model/) folder exist? What's inside it?Share relevant findings with the user at the start: "I noticed your project already has [X patterns]. I'll use that as context."
If the project is new with no code, proceed with pure defaults as the starting point.
The first decision in the conversation. Present the three options:
"How would you like to define your DDD principles?
The defaults cover standard DDD tactical patterns well. Option 1 is recommended unless your domain modeling approach is fundamentally different."
Map the choice:
mode: overlaymode: overrideThis should be fast. Many sections will be "keep as-is."
This is thorough. Every section gets attention and appears in the output.
Read ./assets/template.md and follow the <!-- INTERVIEW GUIDANCE: --> comments for each section. Those comments contain the specific questions to ask, probing questions, and what is customizable vs fixed.
Decisions in early sections affect later sections. When a user changes an early section, flag the dependent sections:
| Decision in | Affects | How |
|---|---|---|
| §1 — Aggregate boundaries | §6 (repositories), §5 (events), §8 (decomposition) | One repo per aggregate root; events for cross-aggregate coordination |
| §1 — Sizing thresholds | §8 (decomposition triggers) | Custom thresholds change decomposition warning signals |
| §2 — Entity identity strategy | §3 (typed ID value objects), §6 (repository signatures) | Typed IDs must be value objects; repository findById uses typed IDs |
| §3 — Value object catalog | §2 (entity fields) | New value objects appear in entity definitions |
| §5 — Event patterns | §1 (cross-aggregate coordination) | Events are the mechanism for cross-aggregate consistency |
| §6 — Repository patterns | §1 (aggregate root identification) | Only roots get repositories |
When a dependency is triggered, inform the user: "Since you changed [X], we should also review [Y] -- it's affected by that decision."
For each of the 9 sections:
For each of the 9 sections:
mode: overlaydefaults.md exactly (the atom matches sections by heading)mode: overrideStrip all <!-- INTERVIEW GUIDANCE: --> comments from the output. The final document is a clean specification.
Determine output path:
.lattice/config.yaml exists and has paths.ddd_principles, use that path..lattice/standards/ddd-principles.md.Write the document:
.lattice/standards/ directory (and .lattice/ parent) if it does not exist.Update config:
.lattice/config.yaml does not exist, create it with:
paths:
ddd_principles: .lattice/standards/ddd-principles.md
.lattice/config.yaml exists but has no paths.ddd_principles, add the key. Preserve all existing content..lattice/config.yaml exists and already has the key, no config change needed.Confirm to user:
"Your DDD principles document has been written to [PATH] in [overlay|override] mode. The domain-driven-design atom will now use it [on top of the defaults | instead of the defaults]."
Before writing the final document, verify:
defaults.md exactly (for section matching by the atom)<!-- INTERVIEW GUIDANCE: --> comments remainmode: overlay<!-- INTERVIEW GUIDANCE: --> comments remainmode: override.lattice/config.yaml) is correctly updated