skills/adr/SKILL.md
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.
npx skillsauth add mhylle/claude-skills-collection adrInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Document significant architectural and technical decisions in a standardized, searchable format optimized for LLM context efficiency.
ADRs are designed for efficient LLM consumption:
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")
Directly invoked when:
Automatically invoked by other skills when:
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.mdADR-0002-postgresql-over-mongodb.mdADR-0003-event-sourcing-for-audit.mdBefore creating an ADR, determine the next sequence number:
# 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.
| 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) |
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 |
Use this format (also in references/adr-template.md):
# 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]
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):
> **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:
> **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
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:
## Alternatives Considered
| Option | Pros | Cons | Why Not |
|--------|------|------|---------|
| MongoDB | Flexible schema | No ACID | Need transactions |
| MySQL | Mature, fast | Less JSON support | PostgreSQL better fit |
An ADR should be created when:
If invoked automatically by another skill, extract:
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?
Always update docs/decisions/INDEX.md when creating, modifying, or deprecating an ADR.
# 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)
When adding a new ADR:
When deprecating an ADR:
If docs/decisions/INDEX.md doesn't exist, create it:
mkdir -p docs/decisions
Then write the initial structure with the first ADR entry.
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:
## Design Decision
[Brief description]
See [ADR-NNNN](../decisions/ADR-NNNN-title.md) for full rationale.
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
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
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.
To review existing decisions:
# 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
Find ADRs related to a topic:
# Search ADR content
grep -l "authentication" docs/decisions/ADR-*.md
When a decision is superseded:
**Status**: Superseded by [ADR-NNNN](./ADR-NNNN-title.md)Before finalizing an ADR:
Structure (Context Conservation):
Content:
Index:
| 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 |
Split into multiple ADRs when:
adr-template.md: Standalone ADR template (30-50 lines target)index-template.md: INDEX.md template for new projectstools
--- name: tt-workflow-build description: Tasktracker-native trigger for a PARALLEL build via the Claude Code Workflow tool. Thin by design — it does two things, then drives to done: (1) ensure a tasktracker project exists (use the existing one, or create one), then (2) start a dynamic `Workflow` that builds it, tracking the work in tasktracker and using the build + verify skills. It does NOT analyze parallelism up front, ask the user to choose a mode, hand back, or fall back to a sequential skil
tools
--- name: grumpy-reviewer description: A single grumpy, nitpicky structural code reviewer that runs as an isolated subagent and treats the code as third-party work submitted by a junior programmer for validation. It cares about exactly one thing — maintainability — judged through separation of concerns, service-oriented design, helper-method extraction, small files, and the rule of 7 (as any grouping nears 7 members, it pushes for sub-groupings). It is deliberately kept OUT of the implementation
development
--- name: tt-workflow-run description: Tasktracker-native autonomous build-loop orchestrator. Drives a first-class `workflow_run` end-to-end — create the run (Gate 1 lifecycle completeness + Gate 2 zero-defects-in), then loop while `getNextReadyTask(projectId)` returns a slice — `setActiveTask` → record a pre-slice `scanArchitectureDrift` baseline → delegate the slice to `/tt-implement-phase` (which does the code work, registers the architecture delta in-slice, and auto-logs defects/learnings/fr
tools
Tasktracker-native project-wide parallel audit using the Claude Code Workflow tool (dynamic workflows). Partitions a repo / backlog / architecture and fans out read-only agents (one per partition) that return schema-checked findings, aggregates them into a deduplicated, ranked risk register, and OPTIONALLY writes fixes back as tasks under a Bug Fix phase — with all tasktracker writes done by the PARENT, never the parallel agents (single global active-task pointer). Journaled and resumable, so a rate-limit or crash mid-audit resumes without re-running completed partitions. Use for large, embarrassingly-parallel, read/analyze-heavy jobs where each unit is self-contained and the output aggregates — audit every file/component for risk, find all architecture drift (scanArchitectureDrift) or duplicate tasks (detectDuplicates/auditDuplicates), per-file tech-debt sweep, test-coverage or security-surface scan across a whole project. Triggers on "/tt-workflow-audit", "audit the whole repo", "parallel audit", "scan every file/component", "find all drift/duplicates", "tech-debt sweep (tasktracker)", or any whole-project analyze-at-scale request inside a session with a tasktracker project. Prefer this over /codebase-audit or /code-quality-audit when the project is tracked in tasktracker AND you want the findings written back as tasks; prefer it over team-* modes when the units don't need to negotiate live (they just report).