opencode-workflow/skills/write_adr/SKILL.md

4.9 KiB

name description
write_adr Produce Architectural Decision Records with Context, Decision, Consequences, and Alternatives. A deliverable skill referenced by design-architecture.

This skill provides guidance and format requirements for producing Architectural Decision Records (ADRs) within the architecture document.

This is a deliverable skill, not a workflow skill. It is referenced by design-architecture when documenting significant architectural decisions.

Purpose

The Architect must document significant architectural decisions using the ADR format. ADRs provide a permanent record of the context, decision, consequences, and alternatives considered for each important choice.

When to Write an ADR

Write an ADR for any decision that:

  • Affects the system structure or service boundaries
  • Involves a technology selection (language, framework, database, queue, cache, infra)
  • Involves a consistency model choice (strong vs eventual, idempotency strategy)
  • Involves a security architecture decision
  • Involves a significant trade-off (performance vs consistency, complexity vs simplicity)
  • Would be difficult or costly to reverse
  • Other engineers would question "why was this chosen?"

ADR Format

Each ADR must follow this format:

### ADR-{N}: {Decision Title}

- **Context**: Why this decision was needed. What is the problem or situation that requires a decision? Which PRD requirements drove this decision? What constraints exist?

- **Decision**: What was decided. State the decision clearly and specifically. Include the specific technology, pattern, or approach chosen.

- **Consequences**: What trade-offs or implications result from this decision. Include both positive and negative consequences. Address:
  - What becomes easier?
  - What becomes harder?
  - What are the risks?
  - What are the operational implications?

- **Alternatives**: What other options were considered. For each alternative:
  - Brief description
  - Why it was not chosen
  - Under what circumstances it might be the better choice

ADR Numbering

  • Start with ADR-001 for the first decision
  • Number sequentially (ADR-001, ADR-002, etc.)
  • Each ADR in the architecture document gets a unique number

ADR Examples

ADR-001: Use Cassandra for Job Storage

  • Context: The system needs to handle high write throughput (10,000+ writes/second) for job status updates. Jobs are write-once with frequent status updates. Queries are primarily by job ID and by status+created_at. The PRD requires 99.9% availability for job status writes.

  • Decision: Use Cassandra as the primary storage for job data. Use PostgreSQL for relational data that requires complex queries and transactions.

  • Consequences:

    • (+) High write throughput for job status updates
    • (+) Horizontal scalability for job storage
    • (+) 99.9% availability for job writes
    • (-) Eventual consistency for job reads (stale reads possible within replication window)
    • (-) No complex joins for job data
    • (-) Additional operational complexity of managing two database systems
    • (-) Data migration if requirements change
  • Alternatives:

    • PostgreSQL only: Simpler operations, but may not handle write throughput under peak load. Would be appropriate if write throughput stays below 5,000 writes/second.
    • MongoDB: Good balance of write throughput and query flexibility, but less mature for time-series-like access patterns.
    • Redis + PostgreSQL: Redis for hot job data, PostgreSQL for cold storage. Adds complexity of data synchronization.

ADR-002: Use Event-Driven Architecture for Order Processing

  • Context: The PRD requires orders to be processed asynchronously with decoupled services. Order processing involves multiple steps (validation, payment, inventory, notification) that may fail independently. Each step must be retryable.

  • Decision: Use event-driven architecture with the outbox pattern for order processing. Publish OrderCreated events from the Order Service, consumed by downstream services.

  • Consequences:

    • (+) Services are decoupled and can evolve independently
    • (+) Individual steps can be retried without reprocessing the entire order
    • (+) Natural fit for saga pattern for distributed transactions
    • (-) Eventual consistency — downstream services may see stale data
    • (-) More complex debugging and tracing
    • (-) Requires outbox pattern implementation to ensure at-least-once delivery
  • Alternatives:

    • Synchronous orchestration: Simpler to implement and debug, but creates tight coupling and doesn't handle partial failures well. Appropriate for simple, synchronous workflows.
    • Saga orchestration with a central coordinator: More control over flow, but adds a single point of failure and operational complexity.

Embedding in Architecture Document

All ADRs must be embedded within the ## ADR section of docs/architecture/{feature}.md.

Do NOT produce separate ADR files. All ADRs must be within the single architecture document.