Ubiquitous Language
Upstream: Adapted from mattpocock/skills/ubiquitous-language. Concept from Eric Evans, Domain-Driven Design.
Extract and formalize domain terminology from the current conversation into a consistent glossary stored at product-docs/UBIQUITOUS_LANGUAGE.md. The same vocabulary is used by domain experts, the user, and the AI — both in planning docs (PRD, JTBD, discovery, tech-decomposition) and in code.
When called from task work, resolve the repository and task with
../setup/references/task-context.md. Context-reading calls from
/nf, /product, and /ct are load-only. Write the glossary only for an explicit update request
or an authorized post-grill update, then link the result from the task record when relevant.
Classify the invocation before writing. A caller's context-reading request is read-only loading. An
explicit request to build/update the project glossary or define its domain terms authorizes
the glossary update; an authorized post-grill caller may do the same. An explanatory request
without that update intent returns proposed terms without writing.
When this fires
/nf Step 0: load existing glossary so discovery questions and the discovery doc use canonical terms.
/nf Step 4 → Step 5 transition: after the grill round, update glossary with new terms before writing the discovery doc.
/product Step 0 and after Step 4 grill: same pattern — load before interview, update before writing PRD/JTBD.
/ct context reading: reuse established project terms from the task's relevant inputs.
- Manual update invocation: when the user explicitly asks to harden terminology, define
domain terms in the project glossary, or build/update the glossary. If the user only asks
an explanatory terminology question, return a proposal without writing.
Process
Load-only branch (context reading)
- Read existing glossary at
product-docs/UBIQUITOUS_LANGUAGE.md (if it exists) and
report its current canonical terms. Stop here. Do not scan, merge, rewrite, or update the
example dialogue for a load-only call.
Build/update branch (explicit request or authorized post-grill call)
- Read existing glossary at
product-docs/UBIQUITOUS_LANGUAGE.md (if it exists). Hold
its content in memory — do NOT use Edit/section-patching. The file is small; the safe path
is read → merge in memory → overwrite.
- Scan the relevant scope for domain-relevant nouns, verbs, and concepts:
- Current conversation
- The active task's PRD / JTBD / discovery doc
- Source code only when terms are ambiguous and the code resolves them
- Identify problems:
- Same word used for different concepts (ambiguity)
- Different words used for the same concept (synonyms)
- Vague or overloaded terms
- Merge in memory: combine existing entries with new findings. Preserve every existing term unless evidence shows it's wrong; revise definitions that have sharpened. Add newly discovered terms. Update "Flagged ambiguities" with anything resolved.
- When the update branch is authorized, ensure the parent directory exists:
mkdir -p product-docs/ (the directory is repo-level, alongside .claude/, and may not
exist on a fresh repo).
- When the update branch is authorized, write the full merged glossary to
product-docs/UBIQUITOUS_LANGUAGE.md, fully overwriting the prior file.
- Output a summary inline so the caller (
/nf, /product, /ct) can paste it into its doc.
Output format
product-docs/UBIQUITOUS_LANGUAGE.md:
# Ubiquitous Language
> Domain terms used across PRDs, JTBDs, discovery docs, technical plans, and code. Read during relevant context gathering; update via `/ubiquitous-language` when authorized.
## [Subdomain or lifecycle name]
| Term | Definition | Aliases to avoid |
| ----------- | ------------------------------------------------------- | --------------------- |
| **Order** | A customer's request to purchase one or more items | Purchase, transaction |
| **Invoice** | A request for payment sent after delivery | Bill, payment request |
## People
| Term | Definition | Aliases to avoid |
| ------------ | ------------------------------------------- | ---------------------- |
| **Customer** | A person or organization that places orders | Client, buyer, account |
| **User** | An authentication identity in the system | Login, account |
## Relationships
- An **Invoice** belongs to exactly one **Customer**
- An **Order** produces one or more **Invoices**
## Example dialogue
> **Dev:** "When a **Customer** places an **Order**, do we create the **Invoice** immediately?"
> **Domain expert:** "No — an **Invoice** is only generated once a **Fulfillment** is confirmed."
## Flagged ambiguities
- "account" was used to mean both **Customer** and **User** — these are distinct: a **Customer** places orders, while a **User** is an authentication identity.
Rules
- Be opinionated. When multiple words exist for the same concept, pick one and list the others as aliases to avoid.
- Flag conflicts explicitly. If a term is used ambiguously, call it out in "Flagged ambiguities" with a recommendation.
- Only domain terms. Skip generic programming concepts (array, function, endpoint) and skip the names of modules or classes unless they have meaning in the domain language.
- Tight definitions. One sentence max. Define what it IS, not what it does.
- Show relationships. Use bold term names; express cardinality where obvious.
- Group into multiple tables when natural clusters emerge (subdomain, lifecycle, actor). One table is fine if the domain is cohesive.
- Write an example dialogue. A short conversation (3-5 exchanges) between a dev and a domain expert that uses the terms precisely. The dialogue clarifies boundaries between related concepts.
- No file paths or code snippets. This is a domain document, not an implementation reference.
Re-running
When invoked again in the same conversation, follow the invocation branch:
- Step 0 load: reread and report the existing
UBIQUITOUS_LANGUAGE.md; do not rewrite it.
- Explicit build/update or authorized post-grill update: read the existing file,
incorporate new terms, update definitions and ambiguities, and rewrite the example dialogue
before the authorized full-file write.
Return to caller
After writing/updating the file, return a compact summary so /nf, /product, or /ct can reference it without re-reading the file:
- Terms added: [list]
- Terms revised: [list]
- Ambiguities flagged: [list]
- Suggested canonical phrasing for the upcoming doc: [1-3 examples]
1---2name: ubiquitous-language3description: Build or update a DDD-style ubiquitous language glossary when the user explicitly asks to define domain terms, build/update the project glossary, or harden terminology. For /nf, /product, or /ct context-reading calls, load and report the glossary; for authorized post-grill updates, merge and write it. Do not write for a load-only or explanatory request. NOT for architectural vocabulary (use /architecture-language).4---56# Ubiquitous Language78> **Upstream**: Adapted from [mattpocock/skills/ubiquitous-language](https://github.com/mattpocock/skills/blob/main/ubiquitous-language/SKILL.md). Concept from Eric Evans, *Domain-Driven Design*.910Extract and formalize domain terminology from the current conversation into a consistent glossary stored at `product-docs/UBIQUITOUS_LANGUAGE.md`. The same vocabulary is used by domain experts, the user, and the AI — both in planning docs (PRD, JTBD, discovery, tech-decomposition) and in code.1112When called from task work, resolve the repository and task with13[`../setup/references/task-context.md`](../setup/references/task-context.md). Context-reading calls from14`/nf`, `/product`, and `/ct` are load-only. Write the glossary only for an explicit update request15or an authorized post-grill update, then link the result from the task record when relevant.1617Classify the invocation before writing. A caller's context-reading request is read-only loading. An18explicit request to build/update the project glossary or define its domain terms authorizes19the glossary update; an authorized post-grill caller may do the same. An explanatory request20without that update intent returns proposed terms without writing.2122## When this fires2324- **`/nf` Step 0**: load existing glossary so discovery questions and the discovery doc use canonical terms.25- **`/nf` Step 4 → Step 5 transition**: after the grill round, update glossary with new terms before writing the discovery doc.26- **`/product` Step 0** and **after Step 4 grill**: same pattern — load before interview, update before writing PRD/JTBD.27- **`/ct` context reading**: reuse established project terms from the task's relevant inputs.28- **Manual update invocation**: when the user explicitly asks to harden terminology, define29 domain terms in the project glossary, or build/update the glossary. If the user only asks30 an explanatory terminology question, return a proposal without writing.3132## Process3334### Load-only branch (context reading)35361. **Read existing glossary** at `product-docs/UBIQUITOUS_LANGUAGE.md` (if it exists) and37 report its current canonical terms. Stop here. Do not scan, merge, rewrite, or update the38 example dialogue for a load-only call.3940### Build/update branch (explicit request or authorized post-grill call)41421. **Read existing glossary** at `product-docs/UBIQUITOUS_LANGUAGE.md` (if it exists). Hold43 its content in memory — do NOT use Edit/section-patching. The file is small; the safe path44 is read → merge in memory → overwrite.452. **Scan the relevant scope** for domain-relevant nouns, verbs, and concepts:46 - Current conversation47 - The active task's PRD / JTBD / discovery doc48 - Source code only when terms are ambiguous and the code resolves them493. **Identify problems**:50 - Same word used for different concepts (ambiguity)51 - Different words used for the same concept (synonyms)52 - Vague or overloaded terms534. **Merge in memory**: combine existing entries with new findings. Preserve every existing term unless evidence shows it's wrong; revise definitions that have sharpened. Add newly discovered terms. Update "Flagged ambiguities" with anything resolved.545. **When the update branch is authorized**, ensure the parent directory exists:55 `mkdir -p product-docs/` (the directory is repo-level, alongside `.claude/`, and may not56 exist on a fresh repo).576. **When the update branch is authorized**, write the full merged glossary to58 `product-docs/UBIQUITOUS_LANGUAGE.md`, fully overwriting the prior file.597. **Output a summary** inline so the caller (`/nf`, `/product`, `/ct`) can paste it into its doc.6061## Output format6263`product-docs/UBIQUITOUS_LANGUAGE.md`:6465```md66# Ubiquitous Language6768> Domain terms used across PRDs, JTBDs, discovery docs, technical plans, and code. Read during relevant context gathering; update via `/ubiquitous-language` when authorized.6970## [Subdomain or lifecycle name]7172| Term | Definition | Aliases to avoid |73| ----------- | ------------------------------------------------------- | --------------------- |74| **Order** | A customer's request to purchase one or more items | Purchase, transaction |75| **Invoice** | A request for payment sent after delivery | Bill, payment request |7677## People7879| Term | Definition | Aliases to avoid |80| ------------ | ------------------------------------------- | ---------------------- |81| **Customer** | A person or organization that places orders | Client, buyer, account |82| **User** | An authentication identity in the system | Login, account |8384## Relationships8586- An **Invoice** belongs to exactly one **Customer**87- An **Order** produces one or more **Invoices**8889## Example dialogue9091> **Dev:** "When a **Customer** places an **Order**, do we create the **Invoice** immediately?"92> **Domain expert:** "No — an **Invoice** is only generated once a **Fulfillment** is confirmed."9394## Flagged ambiguities9596- "account" was used to mean both **Customer** and **User** — these are distinct: a **Customer** places orders, while a **User** is an authentication identity.97```9899## Rules100101- **Be opinionated.** When multiple words exist for the same concept, pick one and list the others as aliases to avoid.102- **Flag conflicts explicitly.** If a term is used ambiguously, call it out in "Flagged ambiguities" with a recommendation.103- **Only domain terms.** Skip generic programming concepts (array, function, endpoint) and skip the names of modules or classes unless they have meaning in the domain language.104- **Tight definitions.** One sentence max. Define what it IS, not what it does.105- **Show relationships.** Use bold term names; express cardinality where obvious.106- **Group into multiple tables** when natural clusters emerge (subdomain, lifecycle, actor). One table is fine if the domain is cohesive.107- **Write an example dialogue.** A short conversation (3-5 exchanges) between a dev and a domain expert that uses the terms precisely. The dialogue clarifies boundaries between related concepts.108- **No file paths or code snippets.** This is a domain document, not an implementation reference.109110## Re-running111112When invoked again in the same conversation, follow the invocation branch:113114- **Step 0 load:** reread and report the existing `UBIQUITOUS_LANGUAGE.md`; do not rewrite it.115- **Explicit build/update or authorized post-grill update:** read the existing file,116 incorporate new terms, update definitions and ambiguities, and rewrite the example dialogue117 before the authorized full-file write.118119## Return to caller120121After writing/updating the file, return a compact summary so `/nf`, `/product`, or `/ct` can reference it without re-reading the file:122123- Terms added: [list]124- Terms revised: [list]125- Ambiguities flagged: [list]126- Suggested canonical phrasing for the upcoming doc: [1-3 examples]