dotnet-ddd
Domain-Driven Design best practices for .NET 10 domain code.
Skill by fmflurry
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/fmflurry-dotnet-ddd
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: design
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/dotnet-ddd
What's inside
- Skill name
dotnet-ddd- Description
- Domain-Driven Design best practices for .NET 10 domain code. Use when creating or reviewing entities, value objects, aggregates, aggregate roots, repositories, domain services, bounded contexts, or domain events in C#. Use when refactoring anemic models toward rich domain logic, enforcing aggregate invariants, or checking bounded-context boundaries. Provides tactical-pattern guidance, strategic-design rules, and a file:line review checklist. Complements dotnet-clean-architecture (hexagonal layering) and dotnet-cop (pre-merge review enforcement).
- License
- MIT
- Instructions
- 99 lines in SKILL.md · view on GitHub
Files (4)
- SKILL.md
- review-checklist.md
- strategic-design.md
- tactical-patterns.md
SKILL.md (first lines)
# dotnet-ddd Domain-Driven Design guidance for .NET domain code. Makes DDD principles explicit and enforceable for the `coder` and `code-reviewer` agents. ## When to Activate - Creating or modifying domain models (entities, value objects, aggregates) - Adding repositories, factories, or domain services - Defining or refactoring bounded contexts - Reviewing domain code for DDD compliance - Refactoring anemic models toward rich behavior - Enforcing aggregate invariants or encapsulation rules ## Provenance Content is synthesized from established DDD literature: - Eric Evans, *Domain-Driven Design: Tackling Complexity in the Heart of Software* (2003) — "Blue Book" - Vaughn Vernon, *Implementing Domain-Driven Design* (2013) — "Red Book" - Microsoft .NET Architecture guidance (eShop, microservices e-book, CQRS docs) - Martin Fowler, bliki articles on Anemic Domain Model, Domain Event, etc. This is a practitioner synthesis, not a verbatim reproduction. Where sources disagree, the Red Book's pragmatic guidance takes precedence for implementation details. ## Core Principles 1. **The domain model is the software.** Business logic lives in domain objects, not in services or controllers. (Evans, ch. 1) 2. **Ubiquitous Language.** Code names match the domain expert's vocabulary. No translation layer between business and code. (Evans, ch. 2) **In this project the ubiquitous language is English:** one canonical English term per domain concept (anchor: `docs/architecture/ubiquitous-language.md`), no synonyms within a bounded context. 3. **Bounded Contexts define boundaries.** Each context owns its model. Shared types across contexts are a design smell. (Evans, ch. 14) 4. **Aggregates enforce invariants.** All mutations go through the aggregate root. External code never reaches inside. (Vernon, ch. 10) 5. **Value Objects are immutable and identity-free.** They describe characteristics, not things. (Evans, ch. 5) 6. **Repositories return aggregates, not tables.** Persistence is an infrastructure concern. (Vernon, ch. 12) ## Tactical Patterns (summary) | Pattern | One-liner | Reference | |---------|-----------|-----------| | Entity | Has identity; equality by ID, not attributes | [tactical-patterns.md § Entity](tactical-patterns.md#entity) | | Value Object | No identity; immutable; equality by attributes | [tactical-patterns.md § Value Object](tactical-patterns.md#value-object) | | Aggregate + Root | Consistency boundary; root is sole entry point | [tactical-patterns.md § Aggregate](tactical-patterns.md#aggregate--aggregate-root) | | Repository | Collection-like abstraction over aggregates | [tactical-patterns.md § Repository](tactical-patterns.md#repository) | | Factory | Encapsulates complex creation logic | [tactical-patterns.md § Factory](tactical-patterns.md#factory) | | Specification | Reusable, composable query/predicate logic | [tactical-patterns.md § Specification](tactical-patterns.md#specification) | | Domain Service | Stateless logic that doesn't belong to an entity | [tactical-patterns.md § Domain Service](tactical-patterns.md#domain-service-vs-application-service) | | Rich vs Anemic | Behavior lives with data, not in external services | [tactical-patterns.md § Rich vs Anemic](tactical-patterns.md#rich-vs-anemic-model) | Full definitions, GOOD/BAD examples, and per-pattern checklist lines: [tactical-patterns.md](tactical-patterns.md) ## Strategic Design (summary) | Concept | One-liner | Reference | |---------|-----------|-----------| | Bounded Context | Explicit boundary around a model + language | [strategic-design.md § Bounded Context](strategic-design.md#bounded-context) | | Ubiquitous Language | Shared vocabulary within a context | [strategic-design.md § Ubiquitous Language](strategic-design.md#ubiquitous-language) | | Anti-Corruption Layer | Translation boundary shielding your model from external models | [strategic-design.md § ACL](strategic-design.md#anti-corruption-layer) | | Context Mapping | Relationships between contexts (Shared Kernel, Customer/Supplier, etc.) | [strategic-design.md § Context Mapping](strategic-design.md#context-mapping--shared-kernel) | | Domain Events | Immutable record of something that happened in the domain | [strategic-design.md § Domain Events](strategic-design.md#domain-events) | | CQRS | Separate read/write models (deep enforcement defers to dotnet-cop) | [strategic-design.md § CQRS](strategic-design.md#cqrs) | Full definitions, GOOD/BAD examples, and per-concept checklist lines: [strategic-design.md](strategic-design.md) ## Review Checklist The `code-reviewer` agent applies [review-checklist.md](review-checklist.md) when reviewing domain code. It is a terse, file:line-oriented list — one item per pattern/concept. Load it on demand during review. ## Relationship to Other Skills | Skill | Relationship | |-------|-------------| | [[dotnet-clean-architecture]] | Provides hexagonal layering (ports/adapters, module isolation). This skill provides the domain-modeling rules that live *inside* Core. | | [[dotnet-cop]] | Pre-merge review enforcement. Its `optional-cqrs` and `optional-event-sourcing` sub-pages handle deep CQRS/ES review. This skill links to them rather than duplicating. | | [[coding-standards]] | General TypeScript/JS standards. Not .NET-specific; no overlap. | ## Quick-Start Checklist (for `coder`) When writing new domain code: - [ ] Identify the bounded context this code belongs to - [ ] Name types using the context's ubiquitous language — canonical English terms from `docs/architecture/ubiquitous-language.md`; never introduce a synonym - [ ] Model entities with identity + behavior (not just data) - [ ] Extract value objects for descriptive attributes (immutable, no ID) - [ ] Group related entities into aggregates; designate one root - [ ] Enforce invariants inside the aggregate root (constructor + methods) - [ ] Expose mutations only through the aggregate root's public methods - [ ] Define repository interfaces in Core (return aggregates, not EF entities) - [ ] Use domain events for cross-aggregate or cross-context communication - [ ] Keep domain services stateless; prefer entity methods when behavior fits one entity ## Hard Rules 1. **No anemic models.** If a class has only getters/setters and all logic lives in a separate service, that is a violation. Move behavior to the entity. (Fowler, "Anemic Domain Model") 2. **Aggregate root is the only external entry point.** No code outside the aggregate may hold a reference to an internal entity or mutate it directly. (Vernon, ch. 10) 3. **Value objects are immutable.** Use `readonly record struct` or sealed class with init-only properties. No setters. (Evans, ch. 5) 4. **Repositories return aggregates.** Never return EF Core entities, `IQueryable`, or raw DTOs from a domain repository interface. (Vernon, ch. 12) 5. **Bounded-context boundaries are hard.** No shared internal types across contexts. Use ACL or integration events. (Evans, ch. 14) 6. **Domain layer has zero infrastructure dependencies.** No `using Microsoft.EntityFrameworkCore`, no `HttpClient`, no framework attributes in domain types. 7. **Ubiquitous language is English.** All domain names (entities, value objects, events, services) are English; each concept has exactly one name within a bounded context. Canonical terms live in `docs/architecture/ubiquitous-language.md`.
From fmflurry/settings-opencode, MIT.
More from fmflurry/settings-opencode
- 0.779score
interfectio-commentarum
poteto
Spawn Haruspex Commentorum, fix accepted findings, and offer encodings for claimed constraints.
SkillAFreshness: A★ 171Claude Code +9 - 0.655score
chimera
poteto
Spawn N parallel candidates at the same task, pick a base, graft the strongest parts of the losers into it.
SkillAFreshness: A★ 171Claude Code +9 - 0.649score
humanizer
poteto
Cut AI tells from any writing.
SkillAFreshness: A★ 171Claude Code +9 - 0.643score
e2e
fmflurry
Resolve this project's browser end-to-end stack before /e2e or e2e-runner writes tests.
SkillAFreshness: A★ 171Claude Code +9 - 0.643score
show-your-work
fmflurry
Keep a reviewable decision trail for long-running or unattended work: a TSV log with one row per decision (what, why, evidence, result).
SkillAFreshness: A★ 171Claude Code +9 - 0.643score
why
fmflurry
Use for 'why does X work this way', 'why we picked Y', design rationale, regressions, postmortems, or data-backed thresholds.
SkillAFreshness: A★ 171Claude Code +9 - 0.641score
verify-this
fmflurry
Verify a claim with fresh local evidence: restate it falsifiably, capture baseline and treatment, compare artifacts, and return VERIFIED, NOT VERIFIED, or…
SkillAFreshness: A★ 171Claude Code +9 - 0.640score
create-verification-skill
fmflurry
Use when creating or refreshing a project's verify-this override.
SkillAFreshness: A★ 171Claude Code +9 - 0.639score
angular-ddd
fmflurry
Domain-Driven Design for Angular/TypeScript: functional patterns with `type` aliases, `readonly` fields, pure rule functions, immutable value types, branded…
SkillAFreshness: A★ 171Claude Code +9 - 0.639score
codebase-exploration
fmflurry
Use when searching a repository, looking up symbols, callers, callees, or imports, and when deciding whether CodeMemory is on.
SkillAFreshness: A★ 171Claude Code +9 - 0.639score
performance
fmflurry
Use when a task is large enough to press the context window, when choosing plan mode or extended thinking, or when a build fails and needs incremental…
SkillAFreshness: A★ 171Claude Code +9 - 0.639score
worktree-destruction-safety
fmflurry
Use when creating, removing, pruning, moving, or deleting a git worktree, including orca worktree and agent-harness worktree-rm.
SkillAFreshness: A★ 171Claude Code +9
Signals
- Stars
- 171
- Forks
- 9
- Open issues
- 0
- Last commit (this folder)
- Oct 18, 2026 (10 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/fmflurry/settings-opencode
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
Same skill elsewhere
Copies of this SKILL.md published by others; search shows only one of them.
More from fmflurry
- 0.643score
why
fmflurry
Use for 'why does X work this way', 'why we picked Y', design rationale, regressions, postmortems, or data-backed thresholds.
SkillAFreshness: A★ 171Claude Code +9 - 0.643score
show-your-work
fmflurry
Keep a reviewable decision trail for long-running or unattended work: a TSV log with one row per decision (what, why, evidence, result).
SkillAFreshness: A★ 171Claude Code +9 - 0.643score
e2e
fmflurry
Resolve this project's browser end-to-end stack before /e2e or e2e-runner writes tests.
SkillAFreshness: A★ 171Claude Code +9 - 0.641score
verify-this
fmflurry
Verify a claim with fresh local evidence: restate it falsifiably, capture baseline and treatment, compare artifacts, and return VERIFIED, NOT VERIFIED, or…
SkillAFreshness: A★ 171Claude Code +9 - 0.640score
create-verification-skill
fmflurry
Use when creating or refreshing a project's verify-this override.
SkillAFreshness: A★ 171Claude Code +9 - 0.639score
codebase-exploration
fmflurry
Use when searching a repository, looking up symbols, callers, callees, or imports, and when deciding whether CodeMemory is on.
SkillAFreshness: A★ 171Claude Code +9
Cite this page
dotnet-ddd skill. Agent Mart. https://agentmart.dev/skills/fmflurry-dotnet-ddd (last updated 2026-10-24)