Record a technology decision as an ADR
COMMAND: Capture a decision or design rule with its rationale. Triage between architectural decisions (ADRs), UX decisions, cross-cutting DESIGN.md rules, feature specs, and NFRs — write to the correct place.
DESIGN.md and design/ux-decisions/ (or any design/ subdirectory). Design tree is opt-in — if it doesn't exist, UX decisions are unavailable, but DESIGN.md rules are still available when the file exists or the user agrees to scaffold it.DESIGN.md rules are available when DESIGN.md exists, or when the user agrees to scaffold it.docs/adrs/design/ exists) → design/ux-decisions/DESIGN.md at repo root (read existing if present; offer to scaffold once if absent)Do NOT narrate design triage, design-tree absence, or "no design tree" reasoning when both of the following hold:
design/ nor DESIGN.md exists in the repo.In that case, skip steps 2 and 4 in your user-visible output entirely. Just create the ADR and report it. Phrases like "Pure architectural decision, no design tree → ADR-NNN", "design tree not set up", or "filing as ADR since no design exists" are noise here — the design machinery is irrelevant to a backend/library/CLI repo deciding on a database.
Surface design-related triage only when:
design/ or DESIGN.md (then triage between trees is meaningful).Before creating files, classify each distinct concern in the input:
| Signal | Type | Destination | Available |
|---|---|---|---|
| Tech choice, library, infra, runtime/framework/database, code-level design pattern, "[X] over [Y]" technical | Architectural | ADR (docs/adrs/NNN-[slug].md) |
Always |
| User flow, navigation choice, "modal vs page", confirmation pattern, copy/voice, empty/error/loading state, interaction model, layout, visual hierarchy, motion, a11y trade-off | UX | UX decision (design/ux-decisions/NNN-[slug].md) |
Only if design/ tree exists |
| Broad design rule, token usage, type scale, voice/tone, palette limit, "never use [X] on any screen", "all CTAs..." | Design rule | DESIGN.md |
If present, or user agrees to scaffold |
| "users can", feature behavior, workflow, user story | Functional | Feature spec (docs/specs/features/) |
Always (redirect to /blueprint:require) |
| Latency, throughput, uptime, encryption, SLA, scalability target | Non-functional | NFR (docs/specs/non-functional/) |
Always (redirect to /blueprint:require) |
Tree separation is strict. UX decisions live in design/ux-decisions/, NEVER in docs/adrs/. Different reviewers own each tree.
Design tree is opt-in. If design/ does not exist in the repo, do NOT route anything as a UX decision — even if the input looks like one. See "Strong UX Signal Without Tree" below.
Cross-cutting UI rules belong in DESIGN.md, not as a UX decision. UX decisions are per-context choices with alternatives considered ("modal vs full page for destructive confirmation — chose modal because..."). If the input is really a cross-cutting rule that applies broadly with no alternatives ("never use more than 3 colours on a screen", "all destructive actions require confirmation", "imperative voice for CTAs"), route it to DESIGN.md at the repo root — the community-format design context file.
If DESIGN.md exists: update the relevant short section. If it does not exist, ask once:
This sounds like a cross-cutting design rule, which belongs in DESIGN.md.
DESIGN.md does not exist yet. Scaffold it and add this rule?
Options:
- Scaffold DESIGN.md and add the rule
- Capture as UX decision instead
- Skip
Never duplicate a DESIGN.md rule into a UX decision; reference it instead.
If input mixes types:
DESIGN.md if present or confirmed/blueprint:require/blueprint:requireIf input is purely functional or non-functional (no decision rationale):
_templates/TEMPLATES.md)/blueprint:require for future requirements."If classification is ambiguous (e.g. a choice that's both technical and UX-facing) and design/ exists:
If classification is ambiguous and design/ is missing: file as ADR. The user can always re-file later by running /blueprint:onboard-design and /blueprint:supersede.
Use this only for cross-cutting design rules and prohibitions, not per-context rationale.
DESIGN.md if present.Visual rules, Voice and tone, Prohibitions) or create a concise heading if needed.UX-NNN; if a later UX decision follows the rule, reference DESIGN.md from that UX decision instead of duplicating the text.If the input clearly looks like a UX decision (e.g. mentions modal vs page, confirmation pattern, navigation, copy/voice, empty state, motion, interaction model) and the design/ tree does NOT exist:
docs/adrs/ becomes a content classification violation later.This looks like a UX/design decision, but this repo has no `design/` tree.
The design tree is opt-in to keep design and engineering review paths separate.
Options:
- Run `/blueprint:onboard-design` to set up the design tree, then re-run this command
- File as ADR anyway (you can move it later with `/blueprint:supersede`)
- Cancel
AskUserQuestion to capture the choice.Note: this captures UX rationale but is filed as ADR because no design tree exists. Move with /blueprint:supersede after running /blueprint:onboard-design.| Input | Action |
|---|---|
/decide PostgreSQL because team knows it |
Create ADR immediately |
/decide PostgreSQL |
Ask for rationale |
/decide |
Ask what to document |
Search ONLY the relevant tree (architectural conflicts in docs/adrs/, UX conflicts in design/ux-decisions/).
If new decision conflicts with existing one in the same tree:
Source of truth: _templates/TEMPLATES.md
<!-- SECTION: adr-template --><!-- SECTION: ux-decision-template -->docs/adrs/NNN-[slug].md)---
status: Active
date: YYYY-MM-DD
---
# ADR-NNN: [Choice] as [CATEGORY]
## Context
[What problem are we solving?]
## Options Considered
### Option 1: [Alternative]
- Pro: [advantage]
- Con: [disadvantage]
## Decision
We chose **[CHOICE]** because [primary motivation].
## Consequences
**Positive:**
- [benefit]
**Negative:**
- [tradeoff]
## Related
- Tech stack: [docs/specs/tech-stack.md](../specs/tech-stack.md)
design/ux-decisions/NNN-[slug].md)Same shape, different title prefix and tree.
---
status: Active
date: YYYY-MM-DD
---
# UX-NNN: [Choice] for [Context]
## Context
[User problem / interaction tension]
## Options Considered
### Option 1: [Alternative]
- Pro: [advantage]
- Con: [disadvantage]
## Decision
We chose **[CHOICE]** because [primary motivation].
## Consequences
**Positive:**
- [benefit]
**Negative:**
- [tradeoff]
## Related
- Related UX decisions: [UX-NNN]
Status values: Draft (emerging, iterate freely), Active (settled), Superseded (replaced), Deprecated (retired)
Prefer Draft first. When the user is still exploring options or rationale is thin, create as Draft. Don't force a premature Active status — decisions are meant to evolve.
ADR and UX decision numbers are independent. Get the next number by globbing the relevant directory:
docs/adrs/*.md → next number after the highestdesign/ux-decisions/*.md → next number after the highestDecision filenames must stay in sync with their current title:
docs/adrs/NNN-[slug-from-current-title].mddesign/ux-decisions/NNN-[slug-from-current-title].mdWhen creating a decision, derive a descriptive slug from the title; it need not repeat every word. When updating an existing decision title, rename the file if the old slug no longer describes it. Keep the same decision number and tree. Search the repo for the old basename and extensionless stem as well as the full path. Update references that resolve to this decision, including relative Markdown links, superseded_by values, spec references, pattern headers, and agent instructions. Preserve number-only references (ADR-NNN, UX-NNN, related_adrs) and references to other decisions in the other tree. Verify the updated references resolve to the renamed file.
MANDATORY: Use the exact format above. DO NOT deviate.
| DO NOT use | USE instead |
|---|---|
## Status with "Accepted" in body |
YAML frontmatter status: Active |
**Benefits:** |
**Positive:** |
**Trade-offs:** |
**Negative:** |
## References |
## Related |
Filing UX decision in docs/adrs/ |
File in design/ux-decisions/ |
# ADR-NNN for a UX decision |
# UX-NNN |
# UX-NNN for an architectural decision |
# ADR-NNN |
| Title changed so the slug is stale, but old filename kept | Rename the file and update in-repo references |
Before writing: Verify YAML frontmatter, title format (ADR-NNN vs UX-NNN), destination tree, filename/title sync, and all sections match the template.
Architectural decision:
Created ADR-NNN at docs/adrs/NNN-technology.md
UX decision:
Created UX-NNN at design/ux-decisions/NNN-slug.md
Cross-cutting design rule:
Updated DESIGN.md with rule: [short rule]
Mixed input (triaged across both trees):
Triaged input into 3 concerns:
- ADR-NNN: [architectural decision] → docs/adrs/NNN-slug.md
- UX-NNN: [UX decision] → design/ux-decisions/NNN-slug.md
- DESIGN.md: [cross-cutting design rule]
- Feature: [feature name] → docs/specs/features/slug.md (linked to ADR-NNN)
Redirected (no decision rationale):
This is a functional requirement, not a decision.
Created feature spec at docs/specs/features/slug.md
Tip: Use /blueprint:require for future requirements.
If rationale missing, mark as Draft with TBD.