ADR ve OpenSpec: Karar ve Spec Yönetimi

Architecture Decision Records (ADR) ve OpenSpec, yazılım geliştirme süreçlerinde farklı ama tamamlayıcı roller üstlenir. ADR 'neden' sorusuna, OpenSpec 'ne' sorusuna yanıt verir.

Ceyhun Enki Aksan
Ceyhun Enki Aksan Girişimci, Maker

TL;DR: ADR (Architecture Decision Records) mimari kararların “neden”ini belgeler, OpenSpec ise implementasyon öncesi “ne yapılacağını” tanımlar. AI destekli geliştirmede ikisi birlikte kullanıldığında tam context sağlar: what + why + how to verify.

KISS, SoC ve benzeri prensiplerin yer aldığı yazı serisine, AI destekli geliştirme süreçlerinde önem kazanan iki kavramla devam etmek istiyorum: Architecture Decision Records (ADR) ve OpenSpec.

Bu iki yaklaşım, ilk bakışta benzer görünse de temelde farklı soruları yanıtlar. ADR “neden bu yolu seçtik?” sorusuna odaklanırken, OpenSpec “ne yapacağız ve nasıl doğrulayacağız?” sorusunu ele alır.

Peki, nedir bu iki kavram ve birlikte nasıl kullanabiliriz?

Architecture Decision Records (ADR)

ADR, bir yazılım projesinde alınan mimari kararları ve bu kararların arkasındaki gerekçeleri belgeleyen yapılandırılmış dokümanlardır. Michael Nygard tarafından 2011 yılında popülerleştirilen bu yaklaşım1, özellikle uzun ömürlü projelerde “neden bu kararı verdik?” sorusuna yanıt bulmayı kolaylaştırır.

Bir ADR genellikle şu bileşenlerden oluşur:

  • Status: Proposed, Accepted, Deprecated, Superseded
  • Context: Problemi ve mevcut durumu açıklar
  • Decision: Ne yapmaya karar verildiğini ve nedenini belirtir
  • Consequences: Kararın olumlu ve olumsuz sonuçlarını listeler

Neden ADR?

Yazılım projeleri zamanla büyür ve ekip üyeleri değişir. Altı ay önce alınan bir kararın nedenini hatırlamak zorlaşır. “Neden Redux yerine Zustand kullandık?”, “Neden monolith yerine microservice tercih ettik?” gibi sorular, ADR olmadan cevapsız kalır.

AWS’in 2025 yılında yayımladığı kılavuzda belirtildiği üzere2:

Bir mimari karar kaydı (ADR), çözüm mimarının en önemli çıktılarından biridir. Bu kayıt, tasarım süreci boyunca aldığınız mimari kararları belgeler ve her karar için bağlama özgü gerekçeler sunar.

OpenSpec

OpenSpec, AI destekli kodlama asistanlarıyla çalışırken spec-driven development (SDD) yaklaşımını benimseyen bir framework’tür3. Temel felsefesi, implementasyona başlamadan önce “ne yapılacağını” netleştirmek ve hem insan hem de AI paydaşlarının aynı sayfada olmasını sağlamaktır.

OpenSpec’in yaşam döngüsü üç aşamadan oluşur:

  1. Propose: İnsan ve AI kodlama asistanı, spec üzerinde anlaşır
  2. Implement: Onaylanan spec’e göre kod yazılır
  3. Archive: Değişiklikler canlı dokümantasyona dahil edilir

Neden OpenSpec?

AI kodlama asistanları (Claude, Cursor, Gemini, GitHub Copilot, vb.) güçlü araçlardır, ancak net talimatlar olmadan beklenmedik sonuçlar üretebilirler. OpenSpec, bu belirsizliği ortadan kaldırarak:

  • Implementasyon öncesi gereksinimleri kilitler
  • Deterministik ve gözden geçirilebilir çıktılar sağlar
  • Kodun “ne yapması gerektiğini” canlı dokümantasyon olarak korur

ADR vs OpenSpec: Temel Farklar

AspectADROpenSpec
OdakWHY (Neden bu yaklaşım?)WHAT + HOW (Ne yapılacak, nasıl test edilecek?)
ZamanlamaKarar sonrasıİmplementasyon öncesi
FormatLightweight (context, decision, consequences)Formal (requirements, scenarios, specs)
Yaşam DöngüsüBir kez yaz, nadiren güncelleProposal → Implement → Archive
KapsamMimari/teknik kararlarFeature/capability değişiklikleri
Hedef KitleMimarlar, geliştiriciler, paydaşlarAI asistanlarıyla çalışan geliştiriciler

Birlikte Kullanım

Bu iki yaklaşım birbirinin alternatifi değil, tamamlayıcısıdır. Tipik bir senaryo şöyle işler:

flowchart TD
    A[1. Yeni feature geliyor] --> B[OpenSpec proposal oluştur - WHAT]
    A --> C[ADR yaz - WHY]

    B --> D[openspec/changes/add-2fa/]
    D --> E[proposal.md<br/>Ne değişecek]
    D --> F[tasks.md<br/>Implementation checklist]
    D --> G[specs/<br/>Requirements + scenarios]

    C --> H[docs/decisions/005-2fa-totp-vs-sms.md<br/>Neden TOTP seçildi, SMS neden reddedildi]

OpenSpec, feature’ın “ne” olduğunu tanımlarken, ADR o feature içindeki kritik teknik kararların “neden”ini belgeler.

Interview Aşaması (2025+)

Modern AI kodlama asistanları, implementasyon öncesi interview aşamasını destekliyor:

ToolYaklaşımÇıktı
Claude CodeAskUserQuestion + Plan Modeplan.md
Gemini CLIConductor + Onboarding Interviewproduct.md, tech_stack.md

Bu aşama, OpenSpec’in “Propose” aşamasını güçlendirir:

flowchart TD
    A[1. Yeni feature geliyor] --> B[Interview]
    A --> C[OpenSpec proposal - WHAT]
    A --> D[ADR - WHY<br/>kritik karar varsa]

    B --> E[AI asistan clarifying questions sorar]
    E --> F["Bu API fail-fast mı retry mi?"]
    E --> G["Auth gerektiriyor mu?"]
    E --> H[Cevaplar spec'e dahil edilir]

    C --> I[Interview çıktıları ile zenginleştirilmiş]

Avantajları:

  • Assumptions açığa çıkar: Code review’da değil, başlangıçta
  • Decision tree önceden navigate edilir: Her soru bir fork, her cevap çözüm alanını daraltır
  • Spec daha deterministik olur: AI belirsizlik olmadan execute eder

Ne Zaman Hangisi?

DurumYaklaşım
Feature/capability eklemeOpenSpec
Breaking API changeOpenSpec
Kütüphane X vs Y seçimiADR
Mimari pattern kararıADR
Bug fixSadece commit message

Worktree ile Workflow

OpenSpec’in aşamalarını git worktree ile birleştirmek, paralel çalışmayı mümkün kılar:

AşamaWorktree?Sebep
ProposalHayırSadece markdown, reject edilebilir
ImplementationEvetKod değişikliği, izolasyon önemli
ArchiveHayırMerge sonrası, sadece dosya taşıma
# 1. Proposal (main'de)
openspec/changes/add-feature/
├── proposal.md   # Review için hazır
├── tasks.md
└── specs/

# 2. Approval sonrası worktree
git worktree add ../project-add-feature -b feat/add-feature
cd ../project-add-feature

# 3. Implement (worktree'de)
# ... kod yaz ...

# 4. PR & Merge

# 5. Archive (main'de)
openspec archive add-feature --yes

Bu yaklaşım, büyük feature’larda main branch’te conflict oluşmasını engeller.

Pratik Uygulama

Projenize bu sistemleri eklemek için minimum iki dosya yeterlidir:

  1. docs/decisions/_TEMPLATE.md - ADR şablonu
  2. CLAUDE.md veya proje konfigürasyonunda referans

ADR şablonu şu yapıda olabilir:

# ADR-XXX: Title

## Status
Proposed | Accepted | Deprecated | Superseded by ADR-YYY

## Date
YYYY-MM-DD

## Context
Problemi ve mevcut durumu açıkla.

## Decision
Ne yapmaya karar verdik ve neden?

## Consequences

### Positive
- Fayda 1

### Negative
- Trade-off 1

## Alternatives Considered
- Alternatif A: Neden reddedildi

Sonuç

AI destekli geliştirme araçlarının yaygınlaşmasıyla birlikte, “ne yapacağız” ve “neden bu yolu seçtik” sorularına sistemli yanıtlar vermek daha da önemli hale geliyor. OpenSpec implementasyon öncesi netlik sağlarken, ADR kararların arkasındaki mantığı sonraki süreçlere aktarır.

İkisi birlikte: tam context (ne + neden + nasıl).

İleri Okumalar

  1. Architectural Decision Records
  2. OpenSpec - Spec-Driven Development
  3. AWS: Master ADRs Best Practices
  4. Google Cloud: Architecture Decision Records Overview
  5. Decision-Driven vs Spec-Driven Software Engineering
  6. Claude Code: Best Practices for Agentic Coding
  7. Gemini CLI Conductor: Context-Driven Development

Footnotes

  1. Michael Nygard, Documenting Architecture Decisions, 2011
  2. AWS Prescriptive Guidance, ADR Process
  3. Fission AI, OpenSpec: Spec-driven development for AI coding assistants