Ubiquitous Language
Define the domain model's vocabulary. Each term in this glossary is a model element — changing a term here means changing the model and the code.
Invocation Position
This is a side-route skill that sharpens shared language across the rest of the workflow.
Use /ubiquitous-language when terminology is fuzzy, stakeholders are using conflicting terms, or you want a glossary that improves shaping, QA, issue writing, and refactor conversations.
Do not use it as a substitute for feature shaping or implementation. Its job is to improve the language of those workflows, not replace them.
One question per turn. When walking a workflow story or proposing canonical terms, ask one question at a time and wait for the user's answer before asking the next. Language work is a conversation, not a questionnaire.
Prefer single-select. Use single-select multiple choice when the user is choosing one direction, one priority, or one next step.
Use multi-select rarely. Reserve it for compatible sets — goals, constraints, non-goals, success criteria — that can all coexist. If prioritization matters, follow up asking which selected item is primary.
Use the platform's question tool when available. In Claude Code, use AskUserQuestion; in Codex, request_user_input; in Gemini, ask_user. Otherwise, present numbered options in chat and wait for the user's reply before proceeding.
Process
- Walk one workflow as a story before extracting terms. Ask for one concrete story in the form "[who] does [what] using [tool]." Treat the nouns in the story as term candidates and the verbs as behavior candidates.
- Scan the conversation for domain-relevant nouns, verbs, and concepts. Pay special attention when a domain expert corrects a developer's word choice — these corrections are high-value signals.
- Surface implicit concepts — look for domain knowledge that is discussed but never named:
- Circumlocutions: a concept explained in a full clause because no term exists yet
- Hidden rules: conditional logic or eligibility checks described procedurally ("if X and Y and Z...") that could be named as a policy or constraint
- Contradictions: apparent disagreements between participants that would dissolve if a new concept were introduced
- Identify problems:
- Same word used for different concepts (ambiguity)
- Different words used for the same concept (synonyms)
- Vague or overloaded terms
- Propose a canonical glossary with opinionated term choices
- Check model-code correspondence (when a codebase is present). Scan class, module, and function names for terms that diverge from the glossary. Record divergences as model-code fractures.
- Write to
UBIQUITOUS_LANGUAGE.md in the working directory using the format below
- Output a summary inline in the conversation
Output Format
Write a UBIQUITOUS_LANGUAGE.md file with this structure:
# Ubiquitous Language
## Order lifecycle
| Term | Definition | Aliases to avoid |
| ----------- | ------------------------------------------------------- | --------------------- |
| **Order** | A customer's request to purchase one or more items | Purchase, transaction |
| **Invoice** | A request for payment sent to a customer 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**
## Surfaced implicit concepts
| Proposed term | Evidence |
| ------------------- | ---------------------------------------------------------------------------------------------- |
| **Shipping Policy** | Described procedurally three times ("if the total is above $50 and...") but never given a name |
## Flagged ambiguities
- "account" was used to mean both **Customer** and **User** — these are distinct concepts: a **Customer** places orders, while a **User** is an authentication identity that may or may not represent a **Customer**.
## Model-code fractures
_Include only when a codebase was scanned._
| Glossary term | Code identifier | Location | Recommendation |
| --------------- | ------------------ | ------------------------------- | ----------------------- |
| **Fulfillment** | `order_processing` | `src/services/order_processing` | Rename to `fulfillment` |
Handoff
- Expected input: domain language ambiguity, competing terminology, or a need to harden vocabulary before downstream work
- Produces:
UBIQUITOUS_LANGUAGE.md and clearer naming for issues, specs, QA, and refactor discussion
- Supports:
/shape, /write-a-prd, /qa, /triage-issue, and refactor planning by giving those skills sharper domain terms
- What comes next: return to the workflow that needed better language, now using the glossary consistently
Rules
- This glossary is the model, not documentation of it. If a term is renamed or redefined here, treat it as a model change that should be reflected in code. If a term exists in code but not here, the glossary is incomplete.
- Be opinionated. When multiple words exist for the same concept, pick the best one and list the others as aliases to avoid.
- Flag conflicts explicitly. If a term is used ambiguously in the conversation, call it out in the "Flagged ambiguities" section with a clear recommendation. If the same word legitimately means different things in different subdomains, note it as cross-context divergence rather than a defect.
- Name the unnamed. When a concept appears only as clauses, conditionals, or procedural descriptions ("if X and Y and not Z..."), propose a canonical name for it (e.g., "Free Shipping Eligibility," "Booking Validity"). These are often the highest-value terms in the glossary.
- Only include domain terms. Skip generic programming concepts (array, function, endpoint) and module/class names unless they have meaning in the domain language.
- Keep definitions tight. One sentence max. Define what it IS, not what it does.
- Show relationships. Use bold term names and express cardinality where obvious.
- Group terms into multiple tables when natural clusters emerge (e.g. by subdomain, lifecycle, or actor). Each group gets its own heading and table. If all terms belong to a single cohesive domain, one table is fine — don't force groupings.
- Classify when modeling, not when aligning. If the conversation involves design decisions about identity or lifecycle, add a "Classification" column (Entity, Value Object, or Service). Omit it when the glossary is purely for shared vocabulary between stakeholders.
- Run a "Modeling Out Loud" diagnostic (do not write it to the file). Mentally construct a scenario walkthrough (3-5 exchanges) that forces key glossary terms to bear weight in realistic sentences. If a term feels awkward, requires a parenthetical gloss, or gets silently replaced by a different word, the concept it represents is suspect. Record any findings in Surfaced implicit concepts (for unnamed concepts) or Flagged ambiguities (for term problems) — the dialogue itself is scaffolding that doesn't belong in the output.
Re-running
When invoked again in the same conversation:
- Read the existing
UBIQUITOUS_LANGUAGE.md
- Incorporate any new terms from subsequent discussion
- Surface any newly implicit concepts from subsequent discussion
- Update definitions if understanding has evolved — each change is a model change, not just a wording fix
- Re-flag any new ambiguities
- Re-run the Modeling Out Loud diagnostic with new terms — record findings in Surfaced implicit concepts and Flagged ambiguities
1---2name: ubiquitous-language3description: Side-route skill for hardening domain vocabulary. Use when terminology is fuzzy, competing terms are causing confusion, or a glossary would improve shaping, QA, and refactor conversations. Produces UBIQUITOUS_LANGUAGE.md, then returns to the workflow that needed sharper language.4---56# Ubiquitous Language78Define the domain model's vocabulary. Each term in this glossary is a model element — changing a term here means changing the model and the code.910## Invocation Position1112This is a side-route skill that sharpens shared language across the rest of the workflow.1314Use `/ubiquitous-language` when terminology is fuzzy, stakeholders are using conflicting terms, or you want a glossary that improves shaping, QA, issue writing, and refactor conversations.1516Do not use it as a substitute for feature shaping or implementation. Its job is to improve the language of those workflows, not replace them.1718> **One question per turn.** When walking a workflow story or proposing canonical terms, ask one question at a time and wait for the user's answer before asking the next. Language work is a conversation, not a questionnaire.19>20> **Prefer single-select.** Use single-select multiple choice when the user is choosing one direction, one priority, or one next step.21>22> **Use multi-select rarely.** Reserve it for compatible sets — goals, constraints, non-goals, success criteria — that can all coexist. If prioritization matters, follow up asking which selected item is primary.23>24> **Use the platform's question tool when available.** In Claude Code, use `AskUserQuestion`; in Codex, `request_user_input`; in Gemini, `ask_user`. Otherwise, present numbered options in chat and wait for the user's reply before proceeding.2526## Process27281. **Walk one workflow as a story** before extracting terms. Ask for one concrete story in the form "[who] does [what] using [tool]." Treat the nouns in the story as term candidates and the verbs as behavior candidates.292. **Scan the conversation** for domain-relevant nouns, verbs, and concepts. Pay special attention when a domain expert corrects a developer's word choice — these corrections are high-value signals.303. **Surface implicit concepts** — look for domain knowledge that is discussed but never named:31 - Circumlocutions: a concept explained in a full clause because no term exists yet32 - Hidden rules: conditional logic or eligibility checks described procedurally ("if X and Y and Z...") that could be named as a policy or constraint33 - Contradictions: apparent disagreements between participants that would dissolve if a new concept were introduced344. **Identify problems**:35 - Same word used for different concepts (ambiguity)36 - Different words used for the same concept (synonyms)37 - Vague or overloaded terms385. **Propose a canonical glossary** with opinionated term choices396. **Check model-code correspondence** (when a codebase is present). Scan class, module, and function names for terms that diverge from the glossary. Record divergences as model-code fractures.407. **Write to `UBIQUITOUS_LANGUAGE.md`** in the working directory using the format below418. **Output a summary** inline in the conversation4243## Output Format4445Write a `UBIQUITOUS_LANGUAGE.md` file with this structure:4647```md48# Ubiquitous Language4950## Order lifecycle5152| Term | Definition | Aliases to avoid |53| ----------- | ------------------------------------------------------- | --------------------- |54| **Order** | A customer's request to purchase one or more items | Purchase, transaction |55| **Invoice** | A request for payment sent to a customer after delivery | Bill, payment request |5657## People5859| Term | Definition | Aliases to avoid |60| ------------ | ------------------------------------------- | ---------------------- |61| **Customer** | A person or organization that places orders | Client, buyer, account |62| **User** | An authentication identity in the system | Login, account |6364## Relationships6566- An **Invoice** belongs to exactly one **Customer**67- An **Order** produces one or more **Invoices**6869## Surfaced implicit concepts7071| Proposed term | Evidence |72| ------------------- | ---------------------------------------------------------------------------------------------- |73| **Shipping Policy** | Described procedurally three times ("if the total is above $50 and...") but never given a name |7475## Flagged ambiguities7677- "account" was used to mean both **Customer** and **User** — these are distinct concepts: a **Customer** places orders, while a **User** is an authentication identity that may or may not represent a **Customer**.7879## Model-code fractures8081_Include only when a codebase was scanned._8283| Glossary term | Code identifier | Location | Recommendation |84| --------------- | ------------------ | ------------------------------- | ----------------------- |85| **Fulfillment** | `order_processing` | `src/services/order_processing` | Rename to `fulfillment` |86```8788## Handoff8990- **Expected input:** domain language ambiguity, competing terminology, or a need to harden vocabulary before downstream work91- **Produces:** `UBIQUITOUS_LANGUAGE.md` and clearer naming for issues, specs, QA, and refactor discussion92- **Supports:** `/shape`, `/write-a-prd`, `/qa`, `/triage-issue`, and refactor planning by giving those skills sharper domain terms93- **What comes next:** return to the workflow that needed better language, now using the glossary consistently9495## Rules9697- **This glossary is the model, not documentation of it.** If a term is renamed or redefined here, treat it as a model change that should be reflected in code. If a term exists in code but not here, the glossary is incomplete.98- **Be opinionated.** When multiple words exist for the same concept, pick the best one and list the others as aliases to avoid.99- **Flag conflicts explicitly.** If a term is used ambiguously in the conversation, call it out in the "Flagged ambiguities" section with a clear recommendation. If the same word legitimately means different things in different subdomains, note it as cross-context divergence rather than a defect.100- **Name the unnamed.** When a concept appears only as clauses, conditionals, or procedural descriptions ("if X and Y and not Z..."), propose a canonical name for it (e.g., "Free Shipping Eligibility," "Booking Validity"). These are often the highest-value terms in the glossary.101- **Only include domain terms.** Skip generic programming concepts (array, function, endpoint) and module/class names unless they have meaning in the domain language.102- **Keep definitions tight.** One sentence max. Define what it IS, not what it does.103- **Show relationships.** Use bold term names and express cardinality where obvious.104- **Group terms into multiple tables** when natural clusters emerge (e.g. by subdomain, lifecycle, or actor). Each group gets its own heading and table. If all terms belong to a single cohesive domain, one table is fine — don't force groupings.105- **Classify when modeling, not when aligning.** If the conversation involves design decisions about identity or lifecycle, add a "Classification" column (Entity, Value Object, or Service). Omit it when the glossary is purely for shared vocabulary between stakeholders.106- **Run a "Modeling Out Loud" diagnostic (do not write it to the file).** Mentally construct a scenario walkthrough (3-5 exchanges) that forces key glossary terms to bear weight in realistic sentences. If a term feels awkward, requires a parenthetical gloss, or gets silently replaced by a different word, the concept it represents is suspect. Record any findings in **Surfaced implicit concepts** (for unnamed concepts) or **Flagged ambiguities** (for term problems) — the dialogue itself is scaffolding that doesn't belong in the output.107108## Re-running109110When invoked again in the same conversation:1111121. Read the existing `UBIQUITOUS_LANGUAGE.md`1132. Incorporate any new terms from subsequent discussion1143. Surface any newly implicit concepts from subsequent discussion1154. Update definitions if understanding has evolved — each change is a model change, not just a wording fix1165. Re-flag any new ambiguities1176. Re-run the Modeling Out Loud diagnostic with new terms — record findings in Surfaced implicit concepts and Flagged ambiguities