Ubiquitous Language
Write and maintain docs/ai/specs/ubiquitous-language.md: one table of the
domain terms this repository uses, what each means here, and the code
identifiers that carry it. Grill Me and PRD authoring read it when present, so
a term is pinned once and reused instead of re-derived in every interview.
Ground recommendations
Inspect the tools and skills actually available. Follow the shared
capability-discovery
and grounding contracts.
A term's meaning comes from the code and documents that use it; disclose
uncertainty and do not invent a definition.
Codex Skill-Selection Guard
If Codex loaded this Claude variant, stop and follow
../../codex-skills/ubiquitous-language/SKILL.md
as the active skill. The payload builder removes this guard from Claude installs.
Workflow
Read what exists. If docs/ai/specs/ubiquitous-language.md exists,
read it first and treat its rows as settled unless the user reopens one.
Read .specify/memory/constitution.md, the technical roadmaps under
docs/ai/specs/, and any PRD under docs/ for terms already in use.
Scan the repository. Collect candidate terms from module and package
names, exported classes and functions, database tables and columns, API
routes, and README or docs headings. Group names that split the same
concept (Invoice, bill, statement) and names that overload one word
for two concepts.
Propose the table. For each term, write one row: the term, its meaning
in this repository in one sentence, and the identifiers that carry it.
Where the codebase disagrees with itself, propose one term and list the
other spellings under Identifiers so the lint maps them. Ask the user about
a genuinely ambiguous term with AskUserQuestion, one term at a time, with
your recommendation first; do not ask about terms the evidence settles.
Write the document only after the user confirms the proposal. Keep the
format exactly:
# Ubiquitous Language
| Term | Meaning here | Identifiers |
|---|---|---|
| Invoice | A billable statement issued to one customer for one period. | `Invoice`, `invoice_ledger` |
Preserve existing rows and their order on an update; append new terms;
never delete a row without saying which identifiers lose their mapping.
Lint, advisory only. Run
${CLAUDE_PLUGIN_ROOT}/scripts/ubiquitous-language-lint.py --base <base>
(default base origin/main). It prints a JSON report of declared
identifiers in the diff that map to no term. Report the summary and the
unmapped identifiers to the user; suggest a term or a rename for each. The
lint always exits 0 and never blocks a gate.
Output contract
docs/ai/specs/ubiquitous-language.md: the terms table above, committed.
- A short report: terms added, changed, or kept; unmapped identifiers from
the lint with a suggestion each.
This skill does not conduct a scoping interview (/speckit-pro:grill-me),
author a PRD (/speckit-pro:speckit-prd), or explain SDD
(/speckit-pro:speckit-coach).
1---2name: ubiquitous-language3description: Build or refresh the repository's ubiquitous-language terms document, a committed Markdown table of domain terms (term, meaning here, identifiers) that humans and agents read before designing. Use when the user asks to define domain terms, create or update a glossary or ubiquitous language, pin what a term means in this codebase, reconcile names between the spec and the code, or invokes /speckit-pro:ubiquitous-language. Also runs the advisory identifier lint on a diff. Not for scoping interviews, PRD authoring, or general SDD coaching.4license: MIT5---67# Ubiquitous Language89Write and maintain `docs/ai/specs/ubiquitous-language.md`: one table of the10domain terms this repository uses, what each means here, and the code11identifiers that carry it. Grill Me and PRD authoring read it when present, so12a term is pinned once and reused instead of re-derived in every interview.1314## Ground recommendations1516Inspect the tools and skills actually available. Follow the shared17[capability-discovery](${CLAUDE_PLUGIN_ROOT}/skills/speckit-autopilot/references/capability-discovery.md)18and [grounding](${CLAUDE_PLUGIN_ROOT}/skills/speckit-autopilot/references/grounding.md) contracts.19A term's meaning comes from the code and documents that use it; disclose20uncertainty and do not invent a definition.2122## Codex Skill-Selection Guard2324If Codex loaded this Claude variant, stop and follow25[`../../codex-skills/ubiquitous-language/SKILL.md`](../../codex-skills/ubiquitous-language/SKILL.md)26as the active skill. The payload builder removes this guard from Claude installs.2728## Workflow29301. **Read what exists.** If `docs/ai/specs/ubiquitous-language.md` exists,31 read it first and treat its rows as settled unless the user reopens one.32 Read `.specify/memory/constitution.md`, the technical roadmaps under33 `docs/ai/specs/`, and any PRD under `docs/` for terms already in use.342. **Scan the repository.** Collect candidate terms from module and package35 names, exported classes and functions, database tables and columns, API36 routes, and README or docs headings. Group names that split the same37 concept (`Invoice`, `bill`, `statement`) and names that overload one word38 for two concepts.393. **Propose the table.** For each term, write one row: the term, its meaning40 in this repository in one sentence, and the identifiers that carry it.41 Where the codebase disagrees with itself, propose one term and list the42 other spellings under Identifiers so the lint maps them. Ask the user about43 a genuinely ambiguous term with `AskUserQuestion`, one term at a time, with44 your recommendation first; do not ask about terms the evidence settles.454. **Write the document** only after the user confirms the proposal. Keep the46 format exactly:4748 ```markdown49 # Ubiquitous Language5051 | Term | Meaning here | Identifiers |52 |---|---|---|53 | Invoice | A billable statement issued to one customer for one period. | `Invoice`, `invoice_ledger` |54 ```5556 Preserve existing rows and their order on an update; append new terms;57 never delete a row without saying which identifiers lose their mapping.585. **Lint, advisory only.** Run59 `${CLAUDE_PLUGIN_ROOT}/scripts/ubiquitous-language-lint.py --base <base>`60 (default base `origin/main`). It prints a JSON report of declared61 identifiers in the diff that map to no term. Report the summary and the62 unmapped identifiers to the user; suggest a term or a rename for each. The63 lint always exits 0 and never blocks a gate.6465## Output contract6667- `docs/ai/specs/ubiquitous-language.md`: the terms table above, committed.68- A short report: terms added, changed, or kept; unmapped identifiers from69 the lint with a suggestion each.7071This skill does not conduct a scoping interview (`/speckit-pro:grill-me`),72author a PRD (`/speckit-pro:speckit-prd`), or explain SDD73(`/speckit-pro:speckit-coach`).