Skip to main content

adr-documentation

Architecture Decision Records (ADR) documentation practice. Use when documenting architectural decisions, recording technical trade-offs, creating decision logs, or establishing architectural patterns. Trigger keywords - "ADR", "architecture decision", "decision record", "trade-offs", "architectural decision", "decision log".

معلومات المصدر

المستودع
MadAppGang/claude-code
آخر نشاط في المصدر
٢٨ يناير ٢٠٢٦ في ١٢:٢٨
لغة SKILL.md المكتشفة
الإنجليزية
النجوم
٢٨٤
التفرعات
٢٥

خيارات التثبيت

يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.

مراجعة ملفات المصدر

اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.

عرض SKILL.md

SKILL.md
تعليمات المصدر · معاينة للقراءة فقط
name
adr-documentation
description
Architecture Decision Records (ADR) documentation practice. Use when documenting architectural decisions, recording technical trade-offs, creating decision logs, or establishing architectural patterns. Trigger keywords - "ADR", "architecture decision", "decision record", "trade-offs", "architectural decision", "decision log".
version
0.1.0
tags
["dev","adr","architecture","decisions","documentation","trade-offs"]
keywords
["adr","architecture","decision","record","trade-offs","documentation","rationale","alternatives"]
plugin
dev
updated
2026-01-28T00:00:00.000Z
# ADR Documentation ## Overview ### What are ADRs? Architecture Decision Records (ADRs) are lightweight documents that capture important architectural decisions along with their context and consequences. They serve as a historical record of why certain choices were made, helping teams avoid revisiting settled debates and providing context for future developers. **Key characteristics:** - **Immutable**: Once accepted, ADRs are rarely modified (supersede instead) - **Context-rich**: Capture the environment and constraints at decision time - **Outcome-focused**: Document what was decided and why - **Alternative-aware**: Show what options were considered and rejected ### Why Document Decisions? **Context Preservation:** - Future team members understand *why* things are the way they are - Avoid "we've always done it this way" without knowing the reason - Preserve institutional knowledge across team changes **Onboarding:** - New developers can read ADR history to understand system evolution - Reduces repetitive explanations of architectural choices - Provides learning path through project decisions **Avoiding Repeat Mistakes:** - Document why certain approaches were rejected - Prevent re-proposing failed solutions - Learn from past trade-offs **Alignment:** - Create shared understanding across team - Resolve disagreements with documented rationale - Enable asynchronous decision-making ### When to Write an ADR Write an ADR when: - **Significant architectural choices**: Microservices vs monolith, event-driven vs request/response - **Technology selections**: Database choice, framework adoption, language decisions - **Pattern decisions**: State management approach, authentication strategy, error handling patterns - **Breaking changes**: API redesigns, data model changes, migration strategies - **Performance-critical decisions**: Caching strategies, optimization approaches, scalability patterns - **Security-related choices**: Authentication methods, encryption strategies, access control models - **Infrastructure decisions**: Deployment strategy, hosting platform, CI/CD approach - **Dependency selections**: Major library choices, third-party service integrations **Don't write an ADR for:** - Minor implementation details - Temporary workarounds - Personal coding style preferences - Reversible low-impact choices ## ADR Structure ### Standard Format ```markdown # ADR-XXXX: [Short Title] ## Status [Proposed | Accepted | Deprecated | Superseded by ADR-YYYY] ## Date YYYY-MM-DD ## Context [Problem statement and environment] ## Decision [What was decided] ## Consequences [What results from this decision] ## Alternatives Considered [Other options evaluated] ## Related ADRs [Links to related decisions] ## References [External links and documentation] ``` ### Section Guidelines **Title:** - Format: `ADR-XXXX: Short Decision Title` - Be specific: "ADR-0012: Use PostgreSQL for Primary Database" - Not generic: "ADR-0012: Database Choice" **Status:** - **Proposed**: Under discussion, not yet accepted - **Accepted**: Decision is final and being implemented - **Deprecated**: No longer recommended but not replaced - **Superseded by ADR-YYYY**: Replaced by a newer decision **Date:** - Use ISO format: YYYY-MM-DD - Date of status change, not original proposal **Context:** - Describe the forces at play - Technical constraints - Business requirements - Team capabilities - Timeline pressures - Budget considerations - Example: "We need to store structured data with complex relationships. Team has limited database expertise. Must support 100k+ users within 6 months." **Decision:** - State clearly what was decided - Include scope and boundaries - Specify what is NOT included - Example: "We will use PostgreSQL as our primary database for all structured data. NoSQL solutions may be used for specific use cases (caching, session storage) but PostgreSQL is the default." **Consequences:** - **Positive**: What benefits we gain - **Negative**: What drawbacks we accept - **Neutral**: What trade-offs we're making Example: ```markdown ### Positive - Strong ACID guarantees for transactions - Rich query capabilities with SQL - Mature ecosystem and tooling ### Negative - Requires careful index management for performance - Scaling horizontally is more complex than NoSQL - Team needs PostgreSQL training ### Neutral - Need to establish backup/restore procedures - Must define connection pooling strategy ``` **Alternatives Considered:** - List 2-4 alternatives seriously evaluated - For each: Pros, Cons, Why rejected - Be fair to alternatives (avoid strawman arguments) **Related ADRs:** - Link to decisions that influenced this one - Link to decisions this one influences - Create a decision graph over time **References:** - Documentation links - Blog posts or articles that influenced decision - Benchmark results - Proof of concepts ## ADR Numbering and Naming ### Sequential Numbering Use zero-padded sequential numbers: - `ADR-0001`, `ADR-0002`, ..., `ADR-0010`, ..., `ADR-0100` - Four digits handles up to 9,999 ADRs (enough for most projects) - Don't skip numbers when superseding (new ADR gets next number) ### File Naming Format: `ADR-XXXX-short-title.md` Examples: - `ADR-0001-use-postgresql-database.md` - `ADR-0002-adopt-react-19-frontend.md` - `ADR-0003-implement-jwt-authentication.md` **Naming guidelines:** - Use lowercase - Use hyphens (not underscores or spaces) - Keep title short but descriptive - Include key technology/pattern name ### Location Recommended locations: - **Option 1**: `ai-docs/decisions/` (alongside other AI-focused docs) - **Option 2**: `docs/adr/` (standard documentation location) - **Option 3**: Root `adr/` directory (if ADRs are primary docs) **Choose consistently across project.** For Claude Code plugins: - Use `ai-docs/decisions/` to co-locate with CLAUDE.md and other AI docs - Makes ADRs easily discoverable by Claude ## When to Write an ADR ### Technology Adoption **Write an ADR when:** - Adopting a new framework or major library - Choosing between competing technologies - Upgrading to a new major version with breaking changes **Examples:** - ADR-0015: Migrate from Webpack to Vite - ADR-0023: Adopt TypeScript for Backend Services - ADR-0031: Use Bun Runtime Instead of Node.js ### Architectural Pattern Selection **Write an ADR when:** - Choosing architectural style (monolith, microservices, serverless) - Selecting state management approach - Defining API design patterns - Establishing error handling strategies **Examples:** - ADR-0008: Use Event-Driven Architecture for Order Processing - ADR-0012: Implement Repository Pattern for Data Access - ADR-0019: Adopt REST over GraphQL for Public API ### Breaking Changes **Write an ADR when:** - Making changes that break backward compatibility - Migrating data models - Redesigning core APIs - Changing authentication mechanisms **Examples:** - ADR-0025: Remove Legacy API v1 Endpoints - ADR-0033: Migrate from Sessions to JWT Tokens - ADR-0041: Change User ID from Integer to UUID ### Performance-Critical Decisions **Write an ADR when:** - Implementing caching strategies - Making database optimization choices - Selecting algorithms for hot paths - Deciding on async vs sync processing **Examples:** - ADR-0017: Implement Redis for Session Caching - ADR-0022: Use WebSockets for Real-Time Updates - ADR-0028: Adopt Background Job Queue for Heavy Processing ### Security-Related Choices **Write an ADR when:** - Choosing authentication methods - Implementing authorization strategies - Selecting encryption approaches - Defining security policies **Examples:** - ADR-0010: Use OAuth 2.0 with PKCE for Mobile Auth - ADR-0014: Implement Row-Level Security in PostgreSQL - ADR-0020: Adopt OWASP Guidelines for API Security ## ADR Lifecycle ### Proposal Phase **Creating a Proposal:** 1. Draft ADR with status "Proposed" 2. Share with team for feedback 3. Discuss in team meeting or async comments 4. Iterate on Context and Alternatives sections **Review Process:** - Ensure all alternatives are fairly represented - Verify consequences are realistic - Check that context captures current constraints - Validate decision aligns with project goals ### Acceptance **When to Accept:** - Team consensus reached (or decision maker approves) - Decision is being implemented - No major unresolved concerns **Accepting an ADR:** 1. Change status to "Accepted" 2. Update date to acceptance date 3. Commit to repository 4. Communicate to team **Post-Acceptance:** - ADR becomes immutable (don't edit decision or alternatives) - May add notes or references sections if new info emerges - Use comments to clarify, don't rewrite history ### Deprecation Process **When to Deprecate:** - Decision is no longer recommended but not replaced - Technology or pattern is obsolete - Security vulnerability makes approach unsafe **Deprecating an ADR:** 1. Change status to "Deprecated" 2. Add "Deprecation Note" section explaining why 3. Update date to deprecation date 4. Don't remove ADR from repository Example deprecation note: ```markdown ## Deprecation Note (2026-01-15) This decision has been deprecated due to security vulnerabilities discovered in the XYZ library. See ADR-0045 for the replacement approach using the ABC library. ``` ### Superseding Old ADRs **When to Supersede:** - Making a decision that replaces an old one - Reversing a previous decision - Evolving a decision with significant changes **Superseding Process:** 1. Create new ADR with next sequential number 2. Reference old ADR in "Context" section 3. Update old ADR status to "Superseded by ADR-XXXX" 4. Explain why old decision is being replaced **Example:** Old ADR-0012: ```markdown ## Status Superseded by ADR-0034 ``` New ADR-0034: ```markdown ## Context ADR-0012 chose MongoDB for our primary database. After 2 years of production use, we've encountered scaling issues with our relational data model. This ADR supersedes ADR-0012. ``` ## Integration with Claude Code ### Guiding Agent Behavior ADRs help Claude understand project conventions: **In CLAUDE.md:** ```markdown ## Architectural Decisions Key decisions documented in ai-docs/decisions/: - ADR-0001: Use PostgreSQL for all structured data - ADR-0005: Adopt React 19 with TypeScript strict mode - ADR-0012: Implement repository pattern for data access Claude should follow these patterns in all code generation. ``` ### Referencing ADRs **In skill files:** ```markdown ## Data Access Patterns Follow the repository pattern (ADR-0012). All database queries must go through repository classes in the `repositories/` directory. ``` **In agent instructions:** ```markdown When generating database code: 1. Use PostgreSQL (ADR-0001) 2. Implement via repository pattern (ADR-0012) 3. Use TypeORM for ORM layer (ADR-0018) ``` ### ADR Compliance Checking Create a validation agent to check ADR compliance: **Example agent task:** ```markdown Review the code changes and check compliance with ADRs: - ADR-0001: All database access uses PostgreSQL - ADR-0012: All queries go through repository classes - ADR-0022: Real-time features use WebSockets Report any violations. ``` ## Best Practices ### Do **✓ Write ADRs for significant decisions** - Technology choices with long-term impact - Architectural patterns affecting multiple components - Security or performance-critical decisions **✓ Document alternatives fairly** - Present real alternatives, not strawmen - Show pros/cons objectively - Explain rejection reasons clearly **✓ Keep ADRs immutable after acceptance** - Don't rewrite history - Use new ADRs to supersede old ones - Preserve original context and rationale **✓ Link related ADRs** - Show decision dependencies - Create decision graph over time - Help readers understand evolution **✓ Update status promptly** - Accept when implementation begins - Deprecate when no longer valid - Supersede when replaced ### Don't **✗ Don't over-document** - Skip ADRs for trivial choices - Don't write ADRs for personal style preferences - Avoid ADRs for easily reversible decisions **✗ Don't write vague context** - Bad: "We needed a database" - Good: "We need ACID transactions for financial data, team has SQL experience, must scale to 1M users" **✗ Don't ignore alternatives** - Always document what else was considered - Explain why alternatives were rejected - Be honest about trade-offs **✗ Don't let ADRs get stale** - Update status when decisions change - Deprecate obsolete ADRs - Don't leave "Proposed" ADRs open indefinitely **✗ Don't make ADRs too long** - Keep to 1-2 pages maximum - Link to detailed docs instead of including them - Focus on decision and rationale, not implementation details ### Writing Good Context **Include:** - Technical constraints (performance, security, scalability) - Business requirements (timeline, budget, features) - Team capabilities (skills, experience, size) - Environmental factors (existing systems, integrations) **Example - Poor Context:** ```markdown ## Context We need a database for our application. ``` **Example - Good Context:** ```markdown ## Context Our e-commerce platform needs to store product catalogs, orders, and user data. Key requirements: - ACID transactions for order processing (financial accuracy) - Support for complex queries (product search, filtering) - Scale to 100k daily active users within 6 months - Team has 3 years SQL experience, no NoSQL experience - Must integrate with existing PostgreSQL warehouse system - Budget allows managed database hosting Performance requirements: - 95th percentile query time < 100ms - Support 1000 concurrent connections - 99.9% uptime SLA ``` ### Documenting Alternatives Fairly **Structure for each alternative:** ```markdown ### Alternative X: [Technology/Pattern Name] **Description**: [Brief overview] **Pros**: - [Benefit 1] - [Benefit 2] - [Benefit 3] **Cons**: - [Drawback 1] - [Drawback 2] **Why Rejected**: [Honest explanation of why this wasn't chosen] ``` **Example:** ```markdown ### Alternative 2: MongoDB **Description**: Document-oriented NoSQL database **Pros**: - Flexible schema allows rapid iteration - Built-in horizontal scaling - Good for unstructured data **Cons**: - No ACID transactions across collections (deal-breaker for orders) - Team has no MongoDB experience (6-month learning curve) - Query language less powerful for complex joins **Why Rejected**: Lack of multi-document transactions is critical for our order processing workflow where we need to atomically update inventory, orders, and user balances. The 6-month learning curve also conflicts with our launch timeline. ``` ## Examples ### Example 1: Database Selection ```markdown # ADR-0001: Use PostgreSQL for Primary Database ## Status Accepted ## Date 2026-01-28 ## Context Our SaaS application needs a database for user accounts, subscriptions, and billing data. Requirements: **Functional:** - Store structured relational data (users, plans, invoices) - Support complex queries (reporting, analytics) - ACID transactions for billing operations **Non-Functional:** - Scale to 500k users in year one - 99.9% uptime requirement - Response time < 100ms for 95th percentile - Point-in-time recovery for data safety **Team & Environment:** - Team has 5+ years PostgreSQL experience - Existing monitoring tools support PostgreSQL - Running on AWS with RDS available - $500/month database budget ## Decision We will use PostgreSQL (version 15+) as our primary database for all structured data. Deployment via AWS RDS for managed service. **Scope:** - All user data, subscriptions, billing - Application-level caching with Redis - Logs stored in CloudWatch, not database ## Consequences ### Positive - Strong ACID guarantees protect billing integrity - Rich SQL query support for complex reports - Mature ecosystem (ORMs, monitoring, tools) - Team expertise minimizes ramp-up time - AWS RDS provides automated backups and high availability ### Negative - Horizontal scaling requires careful sharding strategy - More expensive than serverless options at low volume - Requires connection pool management ### Neutral - Need to establish index management process - Must define migration strategy for schema changes - Need to set up automated backup testing ## Alternatives Considered ### Alternative 1: MongoDB **Pros**: - Flexible schema for rapid iteration - Built-in horizontal scaling (sharding) - JSON-native data model **Cons**:
عرض على GitHub
ملف SKILL.md هذا كبير جدا، لذلك يعرض SkillsMP القسم الاول فقط هنا. عرض على GitHub