Explore and evaluate domain models collaboratively before implementation.

Apache-2.0Auto-check passedDevelopment

Install Ddd

skills CLI
$ npx skills add NTCoding/living-architecture --skill ddd -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install NTCoding/living-architecture ddd --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/NTCoding/living-architecture.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/ddd .claude/skills/ddd && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
ddd
GitHub stars
139
Token cost
~4k tokens
SKILL.md length
2,013 words
Files
1
Skills in repo
4
Repo updated
First seen
Licence
Apache-2.0

At a glance

Explore and evaluate domain models collaboratively before implementation.

  • Works in 6 steps: Read the contents and subdomain overview… → Use the descriptions, package kinds,… → Read the detailed guide sections for… → …
  • Domain concepts
  • SKILL.md covers Start with repository evidence, Establish a challengeable…, Explore before converging and Apply the domain expert test, plus 4 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Ddd is an agent skill from NTCoding/living-architecture. Explore and evaluate domain models collaboratively before implementation. Use for DDD modelling, domain concepts, aggregates, lifecycles, invariants, ownership, subdomain boundaries, or Rivière role questions where domain expertise and repository evidence must shape the model.

Its SKILL.md is about 4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Domain-driven design. The repository describes itself as: Extra software architecture from your code as living documentation. AI-assisted. The licence is Apache-2.0.

When your agent uses it

  • Domain concepts
  • Subdomain boundaries
  • Rivière role questions where domain expertise and repository evidence must shape the model

Example prompts

  • “/ddd”

Workflow steps

6 steps, taken from the first numbered list in SKILL.md.

  1. Read the contents and subdomain overview in the generated
  2. Use the descriptions, package kinds, aggregates, and use case counts to
  3. Read the detailed guide sections for those subdomains. Do not read every
  4. Inspect the affected use cases, or the use cases closest in domain purpose
  5. Follow the aggregate or domain service operations invoked by those use
  6. Read the relevant tests as evidence of behaviour that works under the tested

What it can do on your machine

Read from SKILL.md and the folder at commit a24bc9f. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Ddd loads about 4k tokens when it runs. Until then it costs about 70 tokens; SKILL.md has 2,013 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~70
When it runs · the whole SKILL.md, loaded when a task matches
~4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from NTCoding/living-architecture at commit a24bc9f, republished under its Apache-2.0 licence (© NTCoding). 2,013 words, ~3,980 tokens.

Download SKILL.mdSave it as .claude/skills/ddd/SKILL.md (or your agent's skills folder).
name
ddd
description
Explore and evaluate domain models collaboratively before implementation. Use for DDD modelling, domain concepts, aggregates, lifecycles, invariants, ownership, subdomain boundaries, or Rivière role questions where domain expertise and repository evidence must shape the model.

Domain modelling

Act as an exploratory domain modeller. Build a shared understanding with the user before converging on a model. Do not optimise for the design that is quickest to implement.

Start with repository evidence

Before presenting the first problem interpretation:

  1. Read the contents and subdomain overview in the generated domain guide.
  2. Use the descriptions, package kinds, aggregates, and use case counts to identify the subdomains that may own or use the affected capability.
  3. Read the detailed guide sections for those subdomains. Do not read every subdomain section by default. Expand the scope only when repository evidence reveals another relevant boundary or the overview leaves ownership unclear.
  4. Inspect the affected use cases, or the use cases closest in domain purpose when the capability is new.
  5. Follow the aggregate or domain service operations invoked by those use cases. Inspect repositories, ports, and neighbouring concepts when they clarify ownership, lifecycle, rules, or boundaries.
  6. Read the relevant tests as evidence of behaviour that works under the tested conditions.

The guide is a map of the implemented model. It is not proof that the current model is correct. Do not regenerate it during a modelling discussion.

Consult docs/architecture/domain-terminology/contextive/definitions.glossary.yml for the domain language encountered during the investigation. Claim a glossary match only when the identifier exactly matches a glossary name. Do not change case, split identifiers, infer synonyms, or use semantic similarity. Record <no glossary match> when there is no exact match. Do not change the glossary unless the user separately asks for that change.

Establish a challengeable problem interpretation

Explain what you currently think the domain problem is before introducing a model. Give the user something concrete to correct.

Separate:

  • repository observations;
  • your interpretation of those observations;
  • assumptions and missing domain knowledge;
  • decisions already confirmed by the user.

Use domain language. Do not frame the problem as a class, interface, role, or other implementation task. Ask the user to correct what is wrong, incomplete, or framed at the wrong level.

Explore before converging

Remain in exploration until the user explicitly asks to recommend, converge, or choose a model. Treat candidate models as probes, not proposals.

Start with familiar domain concepts

Explore existing concepts and standard DDD building blocks before introducing new roles or unusual structures. Start with the current aggregate and its owned state, then test existing entities and value objects, followed by the standard aggregate, entity, value object, and domain service tests. Leave new roles and more exotic structures until the end.

Do not skip a familiar model because it appears likely to fail. Validate it against the fixed constraints so the discussion has concrete proof of why it works or does not work. If it fails, show it explicitly as a ruled-out baseline, not as one of the admitted valid options.

For a useful candidate:

  • tell the domain story in plain language before showing code or roles;
  • explain the evidence it fits and what it fails to explain;
  • expose its assumptions;
  • examine identity, ownership, lifecycle, state changes, invariants, and boundaries;
  • identify the domain evidence that would distinguish it from another candidate.

Renaming the same design does not create a different option. Explore genuinely different domain interpretations or ownership of behaviour.

Use one important modelling question per turn by default. Each turn should advance the shared understanding by surfacing one tension, bringing relevant evidence, exploring a different angle, and asking one focused question. Do not front load a questionnaire or race several decisions ahead of the user.

Start new-role exploration with structural options

When exploring a new role, begin by presenting multiple genuinely different configurations. Do not lead with a preferred configuration or define precise implementation details before the structural alternatives are visible.

Start each option with this format:

  1. Option: <configuration name>
  2. One brief description.
  3. A prominent statement of the key idea.
  4. Lightweight diagrams before detailed prose.
  5. A short RISKS FOR ABUSE section that answers whether the proposed role or configuration could become an escape hatch, how it could be abused, and which enforceable constraints limit that abuse. State plainly when the risk cannot be constrained safely.

Every diagram must:

  • name every node and show its concrete current or proposed role;
  • never use placeholders such as new role candidate; if a proposed concept does not yet have a defined role, the option is not ready to present;
  • define each proposed role sufficiently to show that the relationships in the option are permitted; a role name without a role contract is not an option;
  • label every arrow with the relationship it represents;
  • use horizontal space when it makes independent relationships easier to compare;
  • figures may be stacked vertically when each has a clear figure heading, there is clear separation between them, and the option heading makes clear that they belong to the same option;
  • do not dump several figures into one unlabelled vertical sequence that makes independent relationships look sequential;
  • distinguish current roles, concrete proposed roles, external types or systems, and private data that needs no role;
  • show structural differences between options rather than renaming the same design.

For example:

text
***** Option: aggregate with owned value objects *****

One aggregate owns workflow state, event application, and its immutable registry.

KEY IDEA: Start from the state and invariants before considering services or new roles.

CONCRETE ROLES:
aggregate: owns mutable workflow state and enforces workflow invariants.
value-object: represents the immutable registry and each immutable workflow state definition.

RISKS FOR ABUSE: The aggregate could become a large file or construct its own
collaborators. Keep each value object in the file for its domain concept and
inject the registry through the aggregate constructor.

FIGURE: Aggregate ownership                          FIGURE: Application construction

┌─────────────────────────┐                           ┌─────────────────────────┐
│ MaintainerWorkflow      │                           │ ConfigureWorkflow       │
│ role: aggregate         │                           │ role: command-use-case  │
└─────────────────────────┘                           └─────────────────────────┘
            │                                                     │
            │ owns                                                │ parses and injects
            ▼                                                     ▼
┌─────────────────────────┐                           ┌─────────────────────────┐
│ WorkflowRegistry        │                           │ WorkflowRegistry        │
│ role: value-object      │                           │ role: value-object      │
└─────────────────────────┘                           └─────────────────────────┘
            │
            │ contains
            ▼
┌─────────────────────────┐
│ ImplementingState       │
│ role: value-object      │
└─────────────────────────┘

Only discuss detailed trade-offs or identify a leading option after the user can compare the structural configurations.

Admit options before presenting them

Explore the candidate space until further candidates only repeat an existing structure, break an agreed constraint, or add no meaningful trade-off. Reject invalid candidates privately. Let the number of visible options follow from the strong, distinct candidates that remain; never target an arbitrary or user-mentioned count. Never pad the visible options with renamed versions of the same structure or with designs that break an agreed constraint.

Validate every candidate concept name against the represented data and behaviour before presenting it. Treat existing code names as evidence, not as proof of a domain concept. Inspect what the code accepts, what it returns, what state it materialises, and which invariants it protects. Distinguish the source evidence, the process that interprets it, and the domain result. Do not propose a value object named after an algorithm or intermediate mechanism when the code does not materialise that value. For example, a function called buildCallGraph that returns detected architectural links does not establish a CallGraph value object unless it actually produces and protects a graph of code calls.

Apply the basic domain model tests first:

  1. If a concept owns state and enforces invariants, test it as an aggregate.
  2. If a concept has identity and a lifecycle inside an aggregate, test it as an entity.
  3. If a concept is immutable and defined by its attributes, test it as a value object.
  4. Consider a domain service only after aggregate, entity, and value object ownership have been ruled out.

An identifier passed separately from the objects linked to that identifier is a basic entity signal. Before preserving a map, tuple, or parallel parameters with that shape, test whether they are a flattened entity that should own the identity and the relationship.

Before presenting an option, verify all of these points:

  • every fixed user constraint is satisfied;
  • consumers do not copy variant names, identifiers, or lookup tables owned by a published language into string-typed switches, maps, or default branches; resolve extensible strings through the published language API, and make closed variant handling exhaustive against the imported published language union with a never check or an exhaustive satisfies Record<Union, ...>;
  • every proposed concept name accurately describes the data or behaviour it owns rather than copying a possibly misleading code identifier;
  • every primitive result states what the value represents, and every operation name states the relationship or decision it performs;
  • every declaration has a concrete role that fits its responsibility;
  • every dependency and consumer relationship is legal;
  • the option solves the complete error cluster rather than moving the error;
  • each file stays within the 400 line limit for a real domain reason;
  • aggregate ownership has not been confused with putting all code in one file;
  • dependencies are supplied to the aggregate rather than constructed by it;
  • fresh construction is not implemented by abusing rehydration;
  • the option is structurally different from the other visible options;
  • escape hatch risks and enforceable limits are explicit.

If any check fails, do not show the option. If a required fact is unknown, stop and inspect the code or ask the user instead of filling the gap with a sketch.

Show full SKILL.md (628 more words)Show less
Make primitive meanings and operations explicit

Treat an unexplained primitive or broad verb as missing domain language. Ask what a number, boolean, or string represents and what an operation such as compare means before approving the API. For example, compare(other): number hides both the ordering relationship and the meaning of -1, 0, and 1. Prefer an API such as positionRelativeTo(other): 'before' | 'same' | 'after', then translate that meaning into the numeric Array.sort protocol only at the technical boundary.

Apply this test to every domain model decision. A type can be technically correct while still concealing the concept that a reader needs to understand, use, and change the model safely.

Apply the domain expert test

Challenge every candidate with these questions:

  • Would a domain expert recognise and use these concepts and this language?
  • Would they describe the process, decisions, and boundaries this way?
  • Does the model separate things that the expert considers different?
  • Does it group responsibilities because they belong to one domain lifecycle, or because one class would be easier to implement?
  • Can each concept be justified without referring to a technical pattern?

When no domain expert is present, identify the assumptions that require domain expert confirmation. Plausible code vocabulary is not confirmed domain language.

Stress test future evolution

Test candidates against credible changes, such as a different product, market, interface, rule, workflow, integration, or source of information.

For each relevant change, ask what stays stable, what changes, where the change lands, and whether the domain language and invariants remain honest. Prefer a model when likely changes stay local and its concepts retain their meaning. Challenge a model when change spreads across unrelated responsibilities, weakens invariants, stretches an aggregate, or requires exceptions.

Future scenarios test a model. They do not justify speculative abstractions. State why a scenario is credible before allowing it to influence the model.

Treat role enforcement as a quality constraint

Rivière roles express responsibility and protect architectural quality. They do not exist to provide somewhere convenient for code to go.

When role classification matters, read .riviere/role-selection-guide.md and the complete definitions for every role under consideration. Inspect the end to end flow before assigning a role. Responsibility determines the role; the role does not create the responsibility.

When code does not fit, re-examine the model. Do not invent generic helpers, managers, orchestrators, services, roles, folders, exemptions, or other escape hatches. A new role needs a distinct, durable architectural responsibility. Changes inside .riviere and new aggregate classifications require explicit user approval.

Prefer the strongest constraints supported by current evidence when introducing a role. Loosen them only when a concrete valid case shows that a constraint rejects legitimate code.

Converge gradually

When the user asks to converge, identify the model that currently appears most suitable and explain why it leads. Base the recommendation on domain expertise, repository evidence, credible future changes, and role constraints.

Keep the leading model open to challenge. State its important weaknesses, assumptions, and unresolved questions. Compare it with the strongest remaining alternative when that distinction is useful. New evidence can return the discussion to exploration.

Only the user decides when convergence is complete. Do not infer completion from confidence, silence, or implementation convenience. Agreement on a model does not authorise planning or implementation.

Record the approved model

After the user declares convergence complete, draft a concise model summary for their approval. It should cover:

  • the domain problem and story;
  • concepts and responsibilities;
  • identity, ownership, lifecycle, and invariants where relevant;
  • boundaries and collaborations;
  • supported operations;
  • the credible future changes used to test the model;
  • role implications;
  • remaining risks and unresolved questions.

The summary is not an implementation plan. After the user approves it, store it at docs/architecture/ddd/explorations/<stable-descriptive-slug>/model-summary.md. Use lowercase words separated by hyphens, with no date prefix. Update the same summary when the approved model evolves.

© NTCoding, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/ddd of NTCoding/living-architecture.

Open the folder on GitHubat commit a24bc9f

Compare with similar skills

Ddd next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Ddd compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Ddd this skillNTCoding/living-architecture139—~4kAutomated safety check: PassApache-2.0
Domain Modelingfossasia/eventyay-interpretation1.6k29 repos~821Automated safety check: PassApache-2.0
Architecture Governancezai-org/ZCode7.5k—~1.2kAutomated safety check: PassApache-2.0
Evolutionary Modular Architecturetech-leads-club/agent-skills7k—~3.7kAutomated safety check: PassCC-BY-4.0
Domain Modelingbrim-borium/spotify_sdk1665 repos~806Automated safety check: PassApache-2.0
Domain Modeling and Glossarywindmill-labs/windmill18k—~622Automated safety check: PassCustom licence

Similar skills

  • Domain Modeling

    fossasia/eventyay-interpretation

    Build and sharpen a project's domain model. An agent skill from fossasia/eventyay-interpretation.

    1.6k GitHub starsUsed in 29 repos~821 tokens
    DevelopmentAuto-check passed
  • Apply the repository's architecture policy to code changes by generating a bounded context package, checking module and layer boundaries, and reporting baseline-aware violations.

    7.5k GitHub stars~1.2k tokensUpdated 8 days ago
    DevelopmentAuto-check passed
  • Evolutionary Modular Architecture

    tech-leads-club/agent-skills

    Guides design of modular-monolith platforms with DDD, flat-by-aggregate modules, anti-corruption layers, outbox events and resilience, plus an architecture document with SVG diagrams.

    7k GitHub stars~3.7k tokensUpdated 17 days ago
    DevelopmentAuto-check passed
  • Domain Modeling

    brim-borium/spotify_sdk

    Build and sharpen a project's domain model. An agent skill from brim-borium/spotify_sdk.

    166 GitHub starsUsed in 5 repos~806 tokens
    DevelopmentAuto-check passed
  • Domain Modeling and Glossary

    windmill-labs/windmill

    Actively challenges vague or conflicting terminology as you design, and keeps a living domain glossary file up to date in real time.

    18k GitHub stars~622 tokensUpdated today
    DevelopmentAuto-check passed
  • Ddd

    swamp-club/swamp

    Domain Driven Design guidance for TypeScript/Deno codebases.

    642 GitHub stars~1.4k tokensUpdated today
    DevelopmentAuto-check passed

More from NTCoding/living-architecture

  • Dev Workflow Start Implementation

    NTCoding/living-architecture

    Start implementation for a GitHub issue. An agent skill from NTCoding/living-architecture.

    139 GitHub stars~193 tokensUpdated 2 days ago
    Auto-check passed
  • List Review Threads

    NTCoding/living-architecture

    List unresolved review threads for the pull request recorded in workflow state.

    139 GitHub stars~400 tokensUpdated 2 days ago
    Auto-check passed
  • Workflow

    NTCoding/living-architecture

    Execute a low-level dev-workflow-v2 state operation. An agent skill from NTCoding/living-architecture.

    139 GitHub stars~200 tokensUpdated 2 days ago
    Auto-check passed

Categories

Questions about Ddd

What does Ddd do?

Explore and evaluate domain models collaboratively before implementation. Ddd is an agent skill from NTCoding/living-architecture. Explore and evaluate domain models collaboratively before implementation.

When should I use Ddd?

Ddd fits situations like: domain concepts; subdomain boundaries; rivière role questions where domain expertise and repository evidence must shape the model.

How do I install Ddd in Claude Code?

Run `npx skills add NTCoding/living-architecture --skill ddd -a claude-code`. Or copy the skill folder (.agents/skills/ddd in NTCoding/living-architecture) into .claude/skills/ddd in your project. Claude Code loads it when a task matches its description.

How do I install Ddd in Codex?

Run `npx skills add NTCoding/living-architecture --skill ddd -a codex`. Or copy the skill folder (.agents/skills/ddd in NTCoding/living-architecture) into .agents/skills/ddd in your project. Codex loads it when a task matches its description.

Can I use Ddd in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add NTCoding/living-architecture --skill ddd -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ddd, .gemini/skills/ddd, .github/skills/ddd and .opencode/skills/ddd in your project.

What does Ddd need to run?

SKILL.md names no scripts, command-line tools or credentials: Ddd is instructions for the agent only.

Does Ddd access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Ddd safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Ddd use?

Ddd is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Ddd use?

About 4k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Ddd?

Skills that share tags, products or a category with Ddd: Domain Modeling (fossasia/eventyay-interpretation, 1.6k stars), Architecture Governance (zai-org/ZCode, 7.5k stars), Evolutionary Modular Architecture (tech-leads-club/agent-skills, 7k stars) and Domain Modeling (brim-borium/spotify_sdk, 166 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Ddd?

NTCoding (a GitHub user) maintains it in NTCoding/living-architecture, which has 139 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 5, 2026.

Source: NTCoding/living-architecture on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.