Document architectural decisions in standardized ADR format. This skill should be used when making significant technical decisions, choosing between approaches, establishing patterns, or when other skills (create-plan, implement-plan, brainstorm) identify decisions that need documentation. Triggers on "document decision", "create ADR", "architectural decision", or automatically when invoked by other skills during planning and implementation.
Installs into .claude/skills of the current project.
Are you the author of Adr?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/levalencia-adr)
---
name: adr
description: Document architectural decisions in standardized ADR format. This skill should be used when making significant technical decisions, choosing between approaches, establishing patterns, or when other skills (create-plan, implement-plan, brainstorm) identify decisions that need documentation. Triggers on "document decision", "create ADR", "architectural decision", or automatically when invoked by other skills during planning and implementation.
argument-hint: "[decision-title?]"
---
# Architectural Decision Records (ADR)
Document significant architectural and technical decisions in a standardized, searchable format optimized for LLM context efficiency.
## Design Principles
### Context Conservation
ADRs are designed for efficient LLM consumption:
1. **Small, focused files** - One decision per ADR, minimal content
2. **Quick Reference block** - First 5 lines summarize the entire ADR
3. **Central INDEX.md** - Single file listing all ADRs with one-line summaries
### LLM Reading Strategy
When consulting ADRs, follow this tiered approach:
```
TIER 1: Read INDEX.md (one file, all summaries)
↓ Identify potentially relevant ADRs
TIER 2: Read Quick Reference block only (first 10 lines of candidate ADRs)
↓ Confirm relevance
TIER 3: Read full ADR content (only when details are needed)
```
**Implementation**:
```
# Tier 1: Scan index
Read("docs/decisions/INDEX.md")
# Tier 2: Quick reference only (use limit parameter)
Read("docs/decisions/ADR-0001-title.md", limit=10)
# Tier 3: Full content (only if needed)
Read("docs/decisions/ADR-0001-title.md")
```
## When to Use This Skill
**Directly invoked when:**
- Making a significant technical decision
- Choosing between architectural approaches
- Establishing patterns or conventions
- Documenting why a particular technology was selected
**Automatically invoked by other skills when:**
- **create-plan**: Design decision is made in Phase 4
- **implement-plan**: Mismatch discovered or architectural choice made during implementation
- **brainstorm**: Key decisions identified during analysis
## ADR Location and Naming
**Directory**: `docs/decisions/`
**Naming Convention**: `ADR-NNNN-short-title.md`
- `NNNN`: Zero-padded sequential number (0001, 0002, etc.)
- `short-title`: Lowercase, hyphenated description (max 50 chars)
**Examples**:
- `ADR-0001-use-jwt-for-authentication.md`
- `ADR-0002-postgresql-over-mongodb.md`
- `ADR-0003-event-sourcing-for-audit.md`
## Getting the Next ADR Number
Before creating an ADR, determine the next sequence number:
```bash
# Find highest existing ADR number
ls docs/decisions/ADR-*.md 2>/dev/null | sort -t- -k2 -n | tail -1 | grep -oP 'ADR-\K\d+' || echo "0000"
```
If no ADRs exist, start with `0001`.
## ADR Status Values
| Status | Meaning |
|--------|---------|
| **Proposed** | Under consideration, not yet decided |
| **Accepted** | Decision made, ready for implementation |
| **Deprecated** | Was accepted, now superseded |
| **Superseded** | Replaced by another ADR (link to replacement) |
## Creating an ADR
### Required Information
Gather these inputs (ask user if not provided):
| Field | Description | Required |
|-------|-------------|----------|
| Title | Short, descriptive title | Yes |
| Context | Why is this decision needed? | Yes |
| Options | What alternatives were considered? | Yes |
| Decision | What was decided? | Yes |
| Rationale | Why this option? | Yes |
| Consequences | What are the implications? | Yes |
| Related ADRs | Links to related decisions | If applicable |
### ADR Template
Use this format (also in `references/adr-template.md`):
```markdown
# ADR-NNNN: [Title]
> **Quick Reference** | Status: [Accepted] | Date: [YYYY-MM-DD]
> **Decision**: [One sentence: what was decided]
> **Context**: [One sentence: why this decision was needed]
> **Alternatives**: [Rejected options, comma-separated]
> **Impact**: [Key areas affected, comma-separated]
---
## Context
[2-3 sentences max. The problem or opportunity being addressed.]
## Decision
**We will use [chosen option].**
[1-2 sentences explaining the decision.]
## Alternatives Considered
| Option | Pros | Cons | Why Not |
|--------|------|------|---------|
| [Option A] | [Key pro] | [Key con] | [Brief reason] |
| [Option B] | [Key pro] | [Key con] | [Brief reason] |
## Consequences
- **Positive**: [Key benefit]
- **Negative**: [Key trade-off]
- **Requires**: [What must be done as a result]
## Related
- [ADR-XXXX](./ADR-XXXX-title.md): [Relationship]
```
### Quick Reference Block (Mandatory)
The first 5 lines after the title form the **Quick Reference** block. This enables LLMs to assess relevance without reading the full document.
**Format** (must fit in ~5 lines):
```markdown
> **Quick Reference** | Status: [Status] | Date: [Date]
> **Decision**: [One sentence summary of what was decided]
> **Context**: [One sentence on why this decision was needed]
> **Alternatives**: [Comma-separated list of rejected options]
> **Impact**: [Comma-separated list of affected areas/components]
```
**Example**:
```markdown
> **Quick Reference** | Status: Accepted | Date: 2024-01-15
> **Decision**: Use JWT tokens for API authentication instead of sessions.
> **Context**: Need stateless auth for horizontal scaling of API servers.
> **Alternatives**: Session cookies, OAuth tokens, API keys
> **Impact**: Auth service, API gateway, client SDKs
```
### Keeping ADRs Small
**Target size**: 30-50 lines maximum (excluding Quick Reference)
**One decision per ADR**. If you find yourself documenting multiple decisions, split into separate ADRs:
| Instead of | Create |
|------------|--------|
| "Database and caching choices" | ADR-0001: PostgreSQL for primary database |
| | ADR-0002: Redis for session caching |
| "Authentication architecture" | ADR-0003: JWT for API auth |
| | ADR-0004: OAuth2 for third-party integration |
**Use tables over prose** - More scannable, less verbose:
```markdown
## Alternatives Considered
| Option | Pros | Cons | Why Not |
|--------|------|------|---------|
| MongoDB | Flexible schema | No ACID | Need transactions |
| MySQL | Mature, fast | Less JSON support | PostgreSQL better fit |
```
## Workflow
### Step 1: Detect ADR Trigger
An ADR should be created when:
1. **Explicit request**: User asks to document a decision
2. **Design choice**: During planning, a significant choice between approaches is made
3. **Pattern establishment**: A new convention or pattern is being introduced
4. **Technology selection**: A library, framework, or service is chosen
5. **Architecture change**: Structural changes to the system
6. **Deviation from plan**: Implementation differs from original plan for good reason
### Step 2: Gather Information
If invoked automatically by another skill, extract:
- Context from the current discussion
- Options that were considered
- The decision that was made
- Rationale from the analysis
If information is incomplete, ask the user:
```
To document this architectural decision, I need:
1. What problem or context led to this decision?
2. What options were considered?
3. Why was this option chosen over others?
4. What are the expected consequences?
```
### Step 3: Create ADR File
1. Determine next ADR number
2. Generate filename from title
3. Write ADR using template
4. Report creation to calling context
### Step 4: Update INDEX.md (Required)
**Always update `docs/decisions/INDEX.md`** when creating, modifying, or deprecating an ADR.
#### INDEX.md Structure
```markdown
# Architectural Decision Records
Quick reference index for all architectural decisions. Read this file first to identify relevant ADRs.
## Active Decisions
| ADR | Decision | Impact | Date |
|-----|----------|--------|------|
| [0001](./ADR-0001-use-jwt-auth.md) | Use JWT for API authentication | Auth, API | 2024-01-15 |
| [0002](./ADR-0002-postgresql-database.md) | PostgreSQL as primary database | Data layer | 2024-01-16 |
| [0003](./ADR-0003-redis-caching.md) | Redis for session and query caching | Performance | 2024-01-17 |
## Superseded Decisions
| ADR | Was | Replaced By | Date |
|-----|-----|-------------|------|
| [0000](./ADR-0000-example.md) | Session-based auth | ADR-0001 | 2024-01-10 |
## By Category
### Authentication & Security
- [ADR-0001](./ADR-0001-use-jwt-auth.md): JWT for API authentication
### Data & Storage
- [ADR-0002](./ADR-0002-postgresql-database.md): PostgreSQL as primary database
- [ADR-0003](./ADR-0003-redis-caching.md): Redis for caching
### API Design
(none yet)
### Infrastructure
(none yet)
```
#### Updating INDEX.md
When adding a new ADR:
1. Add row to "Active Decisions" table
2. Add entry under appropriate category (create category if needed)
When deprecating an ADR:
1. Move row from "Active Decisions" to "Superseded Decisions"
2. Add "Replaced By" reference
3. Update category listing
#### Creating INDEX.md
If `docs/decisions/INDEX.md` doesn't exist, create it:
```bash
mkdir -p docs/decisions
```
Then write the initial structure with the first ADR entry.
## Integration with Other Skills
### From create-plan
When create-plan makes a design decision in Phase 4, it should invoke this skill:
```
TRIGGER: Design option selected in create-plan Phase 4
ACTION: Create ADR documenting the decision
LINK: Reference ADR in plan's "Design Decision" section
```
The plan should include:
```markdown
## Design Decision
[Brief description]
See [ADR-NNNN](../decisions/ADR-NNNN-title.md) for full rationale.
```
### From implement-plan
When implement-plan encounters an architectural choice:
```
TRIGGER:
- Mismatch between plan and reality requiring decision
- New pattern being established
- Technology choice during implementation
ACTION: Create ADR documenting the decision
LINK: Note in plan file and inline status
```
### From brainstorm
When brainstorm identifies key decisions:
```
TRIGGER: Analysis identifies significant decisions that should be documented
ACTION: Create ADRs for each major decision (can be "Proposed" status)
LINK: Reference in brainstorm output's "Key Decisions" section
```
## Response Format (for subagent use)
When this skill is invoked by another skill (as a subagent), return concise output:
```
STATUS: CREATED
ADR: docs/decisions/ADR-NNNN-title.md
INDEX: docs/decisions/INDEX.md (updated)
DECISION: [One-line summary of decision]
IMPACT: [Comma-separated affected areas]
```
**Always confirm INDEX.md was updated** - this is critical for LLM discoverability.
## Listing Existing ADRs
To review existing decisions:
```bash
# List all ADRs with status
grep -l "Status.*Accepted" docs/decisions/ADR-*.md | while read f; do
title=$(head -1 "$f" | sed 's/# //')
echo "$f: $title"
done
```
## Searching ADRs
Find ADRs related to a topic:
```bash
# Search ADR content
grep -l "authentication" docs/decisions/ADR-*.md
```
## Deprecating an ADR
When a decision is superseded:
1. Update old ADR status: `**Status**: Superseded by [ADR-NNNN](./ADR-NNNN-title.md)`
2. Create new ADR referencing the old one in "Related Decisions"
3. Update any plans or docs referencing the old ADR
## Quality Checklist
Before finalizing an ADR:
**Structure (Context Conservation)**:
- [ ] Quick Reference block is complete (all 5 lines)
- [ ] Quick Reference fits in first 10 lines of file
- [ ] Total ADR is under 50 lines
- [ ] One decision per ADR (no bundled decisions)
- [ ] Uses tables instead of verbose prose
**Content**:
- [ ] Decision is clearly stated in one sentence
- [ ] Context is 2-3 sentences max
- [ ] At least 2 alternatives listed with pros/cons
- [ ] Consequences include positive AND negative
**Index**:
- [ ] INDEX.md updated with new entry
- [ ] Category section updated
- [ ] Impact areas listed accurately
## Best Practices
### Writing Concise ADRs
1. **One sentence, one decision**: If you can't state the decision in one sentence, you may be bundling multiple decisions
2. **Tables over paragraphs**: Alternatives table is more scannable than prose
3. **Impact over rationale**: Focus on what's affected, not lengthy justification
4. **Quick Reference is the ADR**: If someone only reads the Quick Reference, they should understand the decision
### Size Guidelines
| Section | Target Length |
|---------|---------------|
| Quick Reference | 5 lines (mandatory) |
| Context | 2-3 sentences |
| Decision | 1-2 sentences |
| Alternatives table | 2-4 rows |
| Consequences | 3 bullets |
| Total ADR | 30-50 lines |
### When to Split ADRs
Split into multiple ADRs when:
- Decision covers multiple technologies
- Decision affects unrelated areas
- You're writing "and" in the decision statement
- Different stakeholders care about different parts
### When NOT to Create an ADR
- Minor implementation details
- Obvious choices with no real alternatives
- Temporary decisions that will be revisited
- Style preferences (unless establishing standards)
### ADR Maintenance
- Review ADRs quarterly for relevance
- Deprecate outdated decisions promptly
- Keep INDEX.md as the single source of truth
- Categories in INDEX.md should match project structure
## Resources
### references/
- `adr-template.md`: Standalone ADR template (30-50 lines target)
- `index-template.md`: INDEX.md template for new projects