home / skills / mhylle / claude-skills-collection / adr

adr skill

/skills/adr

This skill documents significant architectural decisions in ADR format to keep decisions accessible, searchable, and consistent across projects.

npx playbooks add skill mhylle/claude-skills-collection --skill adr

Review the files below or copy the command above to add this skill to your agents.

Files (3)
SKILL.md
13.0 KB
---
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

Overview

This skill documents significant architectural and technical decisions in a compact, standardized ADR format. It creates one-decision-per-file ADRs in docs/decisions/, enforces a five-line Quick Reference for LLM-friendly scanning, and always updates a central INDEX.md. Use it to capture rationale, alternatives, and consequences so decisions remain discoverable and actionable.

How this skill works

When invoked it collects required fields (title, context, options, decision, rationale, consequences, related ADRs), determines the next ADR sequence number, generates an ADR file from a template, and updates docs/decisions/INDEX.md. ADRs are short (target 30–50 lines) with a mandatory Quick Reference block in the first five lines so downstream LLMs can triage relevance quickly. The skill can be called directly or automatically by other planning and implementation skills when a decision is made or discovered.

When to use it

  • Recording a significant design or technology choice during planning or implementation
  • Establishing a new pattern, convention, or architecture for the project
  • Documenting why one option was chosen over others for future reference
  • When other skills (create-plan, implement-plan, brainstorm) surface decisions to capture
  • Deprecating or superseding an earlier architectural choice

Best practices

  • Write one decision per ADR and state the decision in one sentence
  • Keep ADRs small (30–50 lines) and place the Quick Reference in the first 5 lines
  • List at least two alternatives with concise pros/cons in a table format
  • Update INDEX.md and the appropriate category entry every time an ADR is added or deprecated
  • Prefer impact-focused content over long justification; include positive and negative consequences

Example use cases

  • Deciding between PostgreSQL and MongoDB for the primary data store and documenting trade-offs
  • Choosing JWT-based stateless authentication for horizontally scaled API services
  • Recording the introduction of Redis for session and query caching and its impact areas
  • Capturing a deviation found during implementation that affects earlier design assumptions
  • Creating a Proposed ADR after a brainstorm identifies a major architectural choice

FAQ

What file name and numbering convention do you use?

Files are named ADR-NNNN-short-title.md with a zero-padded sequence (0001, 0002, ...). Determine the next number by scanning docs/decisions/ for the highest existing ADR.

What must be included in the Quick Reference block?

Five lines: Status and Date, one-sentence Decision, one-sentence Context, comma-separated Alternatives, and Impact areas. It must appear in the first 10 lines for LLM tiered reading.