Spec, Domain ve Disposable Code
Spec-Driven Development: Milyarlarca Sterlinlik Ödeme Trafiğinden Dersler
Spec-Driven Development: Lessons from £Billions in Payments
Ödemede hata sadece bug değil, kayıp paradır; bu yüzden önce davranışı yazılı sözleşmeye dökmek, sonra kodu ve AI Agent'larını o sözleşmeye bağlamak gerekir. 2026'da Agent'ların kendisi ödeme başlatmaya başladığı için Spec'in kapsamı da genişledi.
Ödemede belirsiz Spec kayıp paradır; durum makinesi, idempotency, para temsili ve kayıt kuralları koddan önce yazılmalı, kod ve Agent'lar bu sözleşmeye bağlanmalı.
Idempotency ve çift taraflı kayıt ödemede yerleşik pratik; SDD araçları ise yaygınlaşırken küçük işler için fazla ağır olmakla eleştiriliyor.
Zihinsel model
Spec bir binanın statik projesidir: duvarı Agent örebilir, ama taşıyıcı kolonların yeri ve yükü önceden çizilmiş olmalı.
Neden
- Ağ zaman aşımında ödeme bankada gerçekleşmiş olabilir; Spec bu 'bilinmiyor' durumunu yazmazsa Agent onu başarısız sayar.
- Agent, Spec'in boş bıraktığı yuvarlama, tekrar deneme ve geçiş kurallarını makul ama yanlış varsayımlarla doldurur.
- Spec'teki invariant'lar property-based test ve mutabakata dönüşür; yazılmayan kural ne test edilebilir ne denetlenebilir.
Kanıt
Stripe, aynı idempotency anahtarıyla farklı parametre gönderilen isteği reddederek yanlış işlem eşleşmesini önlüyor.
Stripe API Reference: Idempotent requestsSWIFT'e göre sınır ötesi ödeme talimatlarının yüzde 98'inden fazlası artık katı alan kuralları olan ISO mesaj standardıyla gönderiliyor.
East & Partners, 2025Agent ödeme protokolü, kullanıcının Agent'a hangi ödeme aracı ve limitle yetki verdiğini imzalı mandate kaydıyla kanıtlıyor.
Google Cloud, AP2 duyurusu, 2025Karşı görüş
SDD araçları küçük işler için ağırdır, çok sayıda markdown üretir ve Agent'lar Spec'i her zaman izlemez. Spec kodla birlikte PR ile güncellenmezse kodla ayrışır ve sonraki her Agent'ı yanıltır.
Kavramlar
Pratikte
- Ödemeyi izinli geçişleri ve 'bilinmiyor' durumu olan bir durum makinesi tablosuyla tanımla.
- Parayı en küçük birimde tamsayı ya da decimal olarak, para birimi koduyla birlikte tut.
- Spec'teki her kurala kimlik ver, testlerde ona atıf yap; Spec'e dokunmayan ödeme PR'larını işaretle.
Spec-driven development (SDD, şartname güdümlü geliştirme), yüksek hacimli ödeme sistemlerinde en çok karşılığını bulan yaklaşımlardan biri. Milyarlarca sterlinlik ödeme trafiğinin öğrettiği dersler büyük ölçüde alanın yerleşik pratiklerinde toplanıyor: durum makineleri, idempotency, para temsili, çift taraflı kayıt, mutabakat ve sözleşme testleri. Konu şimdi önemli çünkü AI kod ajanları spesifikasyondan kod üretmeyi ucuzlattı ve GitHub Spec Kit gibi araçlar 'önce spec, sonra plan, sonra görev' akışını yaygınlaştırdı; Spec Kit Ağustos 2026'da 1.0 sürümüne ulaştı. Ödeme gibi hatanın doğrudan para kaybına dönüştüğü bir alanda, spec'in belirsiz bıraktığı her nokta modelin tahminine kalıyor. SWIFT'in sınır ötesi ödeme talimatlarında MT ile ISO 20022 arasındaki birlikte yaşam dönemini Kasım 2025'te bitirmesi de mesaj sözleşmelerinin ne kadar katı olduğunu hatırlattı; Ağustos 2026'da ise yapılandırılmış adres geçişinin ertelenmesi, sözleşme tarihlerinin de değişebileceğini gösterdi. Google'ın AP2'si ve Stripe ile OpenAI'ın ACP'si gibi Agent ödeme protokolleri, Spec'e 'kullanıcı Agent'a neyi yetkilendirdi' sorusunu da ekledi.
Çıkarımlar
- Ödemede spec'in belirsiz bıraktığı her nokta, AI ajanının makul ama yanlış bir tahminine dönüşür.
- Ödemeyi tek bir başarılı/başarısız alanıyla değil, izinli geçişleri olan bir durum makinesiyle tanımla; 'bilinmiyor' durumunu unutma.
- Idempotency kuralları spec'te yazmalı: hangi uç nokta, ne kadar süre, aynı anahtarla farklı parametre gelirse ne olur.
- Parayı float ile tutma; tamsayı en küçük birim ya da decimal, her zaman para birimi koduyla birlikte.
- Spec'i koddan sonradan üretme; spec kaynaktır, kod ve testler ondan türer, değişiklik PR ile gelir.
- 2026'da Agent'lar ödeme başlatmaya başladı: AP2 ve ACP gibi protokoller, kullanıcının Agent'a hangi limit ve koşulla yetki verdiğini Spec'in bir parçası yapıyor.
- SDD'yi her işe değil, para hareket ettiren modüllere uygula; küçük işlerde ağır Spec akışı, eleştirmenlerin haklı olarak işaret ettiği gibi gereksiz yük getiriyor.
Alt başlıklar
Spec-driven development nedir, ödemede neden farklıdır
SDD, kodu yazmadan önce sistemin davranışını makinece okunabilir ve insanca anlaşılır bir şartnamede tanımlama yaklaşımıdır. GitHub'ın Eylül 2025'te duyurduğu açık kaynak Spec Kit aracı bu akışı spec, plan, görev ve uygulama adımlarına ayırıyor, Claude Code, Copilot, Gemini CLI gibi birçok ajanla çalışıyor ve Ağustos 2026'da 1.0 sürümüne ulaştı.
Çoğu üründe belirsiz bir spec, yanlış renkte bir buton ya da eksik bir filtre üretir. Ödemede ise aynı belirsizlik çift çekime, kaybolan iadeye ya da mutabakatta açıklanamayan bir farka dönüşür. Örneğin 'ödeme başarısız olursa kullanıcıya hata göster' cümlesi, ağ zaman aşımında ödemenin aslında bankada gerçekleşmiş olabileceği durumu kapsamaz.
Bu yüzden ödeme spec'i üç şeyi açıkça yazmalıdır: her durum ve geçiş, her dış çağrının tekrar edildiğinde ne olacağı ve paranın her hareketinin hangi hesaplara yazılacağı. Bu üçü yoksa, AI ajanı boşlukları makul ama yanlış varsayımlarla doldurur.
Ekim 2026 itibarıyla durum
Son 12 ayda SDD, deneysel bir akıştan araç ekosistemine dönüştü. GitHub Spec Kit Ağustos 2026'da 1.0 sürümüne ulaştı ve artık onlarca Agent entegrasyonu, eklenti ve preset kataloğuyla geliyor; Amazon'un Spec odaklı IDE'si Kiro da ilk yılını geride bırakıp Eylül 2026'da workflow özelliğini ekledi. Eleştiri de olgunlaştı: Thoughtworks'ten Birgitta Böckeler, Ekim 2025'te bu araçların küçük işler için fazla ağır olduğunu, çok sayıda markdown dosyası ürettiğini ve Agent'ların Spec'i her zaman izlemediğini yazdı. Pratik sonuç, SDD'nin her iş için değil, ödeme gibi yüksek riskli modüller için seçici kullanılması.
Sözleşme tarafında OpenAPI 3.2 Eylül 2025'te, 3.2.1 Eylül 2026'da yayımlandı; Arazzo 1.1 Mayıs 2026'da AsyncAPI desteği getirdi. Idempotency-Key başlığı için IETF taslağı ise RFC olmadan süresi dolmuş durumda; yani standart davranış hâlâ sağlayıcı dokümanlarında. SWIFT yapılandırılmış adres geçişini erteledi. Ödemenin kendisinde ise yeni bir aktör var: AP2 ve ACP ile Agent'lar kullanıcı adına ödeme başlatıyor, bu da Spec'e imzalı yetki ve limit kurallarını ekliyor.
Ödemeyi durum makinesi olarak tanımlamak
Bir ödeme tek bir 'başarılı' ya da 'başarısız' alanıyla temsil edilemez. Tipik bir yaşam döngüsünde oluşturuldu, yetkilendirme bekliyor, yetkilendirildi, tahsil edildi, kısmen iade edildi, iade edildi, ters ibraz edildi gibi durumlar ve aralarındaki izinli geçişler vardır.
Spec'te bu durum makinesini bir tablo ya da diyagram olarak yazmak, iki tür hatayı baştan engeller. Birincisi imkânsız geçişler: iade edilmiş bir ödemenin tekrar tahsil edilmesi gibi. İkincisi belirsiz durumlar: sağlayıcıdan yanıt gelmediğinde ödemeyi 'bilinmiyor' durumuna alıp bir mutabakat işine bırakmak, onu 'başarısız' sayıp kullanıcıya tekrar denetmekten çok daha güvenlidir.
Somut bir kural: her geçiş için tetikleyici olay, ön koşul ve yan etki yazılmalı. Veritabanında da durum alanı serbest metin değil, izinli değerlerle sınırlı bir enum olmalı ve geçişler tek bir fonksiyondan yapılmalı. AI ajanına bu tabloyu verdiğinde, yazdığı kodun her dalını tabloyla karşılaştırabilirsin.
Idempotency: tekrar denemenin sözleşmesi
Ağ güvenilmezdir. Mobil uygulama ödeme isteğini gönderir, bağlantı kopar, kullanıcı tekrar dener. Sunucu iki isteği ayırt edemezse müşteri iki kez ödeme yapar. Idempotency, aynı işlemin birden fazla kez çalıştırılmasının tek seferle aynı sonucu vermesidir ve ödeme API'lerinde genelde istemcinin ürettiği bir anahtarla sağlanır.
Stripe'ın dokümantasyonu iyi bir referans: anahtar 255 karaktere kadar olabilir, V4 UUID gibi yüksek entropili bir değer önerilir ve API v1'de anahtarlar en az 24 saat sonra temizlenebilir. Aynı anahtarla farklı parametreler gönderilirse istek hata verir; bu, yanlışlıkla başka bir işlemi aynı anahtarla eşleştirmeyi önler.
Spec'te yazılması gerekenler: hangi uç noktalar anahtar ister, anahtar ne kadar saklanır, aynı anahtarla eşzamanlı iki istek gelirse ne olur, ilk istek 500 ile bittiyse tekrar ne döner. Bu soruların cevabı kodda kalırsa her servis farklı davranır.
Para temsili ve çift taraflı kayıt
0.1 artı 0.2'nin kayan noktalı sayılarla tam olarak 0.3 etmemesi, ödeme sistemlerinde teorik bir merak değildir. Para ya en küçük birim cinsinden tamsayı olarak (kuruş, peni) ya da sabit hassasiyetli bir decimal tipiyle tutulmalı ve her tutar bir para birimi koduyla birlikte taşınmalıdır. Japon yeni gibi bazı para birimlerinin ondalık basamağı yoktur; spec bunu ISO 4217'ye göre tanımlamalı.
Çift taraflı kayıt (double-entry), her para hareketinin en az bir borç ve bir alacak kaydı olarak yazılması ve toplamların her zaman sıfırlanması kuralıdır. Örneğin 100 liralık bir satışta müşteri alacak hesabı, komisyon gelir hesabı ve satıcı borç hesabı aynı işlemde güncellenir.
Spec'te bu kural bir değişmez (invariant) olarak yazılırsa test edilebilir hâle gelir: 'her işlemde kayıtların toplamı sıfırdır.' Yuvarlama kuralı da açıkça yazılmalı; komisyonu üç satıcıya bölerken kalan kuruşun kime gideceği spec'te yoksa, AI ajanı bir tercih yapar ve bu tercih sonra mutabakatta karşına çıkar.
Sözleşme olarak spec: OpenAPI, AsyncAPI ve ISO 20022
Ödeme sistemleri nadiren yalnızdır: banka, kart ağı, dolandırıcılık servisi ve muhasebe sistemiyle konuşur. Her entegrasyon bir sözleşmedir. REST uç noktaları için OpenAPI (güncel sürüm Eylül 2026 tarihli 3.2.1), olay akışları için AsyncAPI, bankalar arası mesajlaşma için ISO 20022 bu sözleşmeleri makinece okunabilir kılan standartlardır.
ISO 20022 iyi bir örnek: SWIFT, sınır ötesi ödeme talimatlarında eski MT formatıyla birlikte yaşam dönemini 22 Kasım 2025'te bitirdi ve bu mesajlar artık yalnızca ISO 20022 formatında iletiliyor. SWIFT'e göre ödeme talimatlarının yüzde 98'den fazlası artık ISO 20022 ile gönderiliyor. Zengin, yapılandırılmış alanlar uyum kontrolünü kolaylaştırıyor ama alan uzunlukları ve zorunluluklar konusunda hata payı bırakmıyor. Bir sonraki adım olan ve Kasım 2026'ya planlanan yapılandırılmamış adres kaldırımını ise SWIFT, Ağustos 2026'da topluluk talebiyle erteledi; yeni takvimi en geç Aralık 2026'da açıklayacak. Ders: Spec'te dış sözleşmenin tarihini sabit kabul etme, sürümünü ve geçerlilik tarihini ayrı bir alan olarak tut.
Spec'i tek doğru kaynak yapmak için sözleşmeden kod üretimi, istek ve yanıt doğrulaması ve tüketici güdümlü sözleşme testleri kullanılır. Anti-pattern: OpenAPI dosyasını koddan sonradan üretmek. Bu durumda spec, sistemin olması gereken davranışını değil, o anki hâlini belgeler ve hiçbir hatayı yakalamaz.
Spec'ten teste: değişmezler, özellik tabanlı test ve mutabakat
Örnek tabanlı testler 'şu girdide şu çıktı' der. Ödemede asıl riskler beklenmedik kombinasyonlardadır: kısmi iade sonrası ters ibraz, farklı para birimlerinde bölünmüş ödeme, aynı anda gelen iki webhook. Özellik tabanlı test (property-based testing), spec'teki değişmezleri rastgele üretilen binlerce senaryoya karşı sınar. Örneğin 'iade toplamı hiçbir zaman tahsil edilen tutarı aşamaz' bir özelliktir; araç bunu bozan en küçük girdiyi bulmaya çalışır.
İkinci savunma hattı mutabakattır (reconciliation): kendi kayıtlarını banka ya da sağlayıcı raporuyla düzenli karşılaştırmak. Spec, mutabakatın ne sıklıkla yapılacağını, hangi farkın otomatik düzeltileceğini ve hangisinin insana gideceğini tanımlamalı.
AI ajanı burada güçlü bir yardımcı: spec'teki değişmezlerden test iskeleti üretebilir. Ama testin neyi kanıtladığını kontrol etmek insan işi; ajanın yazdığı bir testin her zaman geçmesi, onun bir şey test etmediği anlamına gelebilir.
AI ajanlarıyla SDD: spec'i yaşayan belge tutmak
Spec Kit benzeri akışlarda ajan önce spec'i okur, bir teknik plan çıkarır, bunu görevlere böler ve uygular. Bu akışın ödemede çalışması için spec'in kod kadar ciddiye alınması gerekir: sürüm kontrolünde durmalı, PR ile değişmeli ve her değişiklik ilgili test ve sözleşme güncellemesini tetiklemeli.
Tipik bir hata zinciri şöyle işler: bir ürün yöneticisi kısmi iadeyi ister, geliştirici ajanla kodu yazdırır, spec güncellenmez. Altı ay sonra başka bir ajan spec'e bakarak bir rapor yazar ve kısmi iadeyi bilmediği için toplamları yanlış hesaplar. Spec ile kodun ayrışması, ajanlar çoğaldıkça hızlanan bir risk.
Pratik kurallar: spec'te her kural için bir kimlik numarası tut ve testlerde bu numaraya atıf yap. CI'da spec'i değiştirmeden ödeme modülüne dokunan PR'ları işaretle. Ajanın spec'te olmayan bir davranış eklemesi gerekiyorsa, önce spec'i değiştiren ayrı bir PR açmasını iste.
Son gelişmeler
Ekim 2026 itibarıyla
Önce kendi cevabını düşün, sonra aç.
SDD eski şelale modelinin yeni adı değil mi?
Değil, çünkü spec bir kez yazılıp dondurulan bir belge değil; kodla aynı depoda yaşar ve PR ile değişir. Fark, değişikliğin önce spec'te, sonra kodda olması. Küçük iterasyonlarla çalışmaya engel değil, her iterasyonun ne yaptığını netleştiriyor.
Küçük bir girişimde bu kadar spec yazmaya zaman var mı?
Tüm ürün için yok; SDD araçlarına yöneltilen eleştirilerin de işaret ettiği gibi küçük işlerde ağır Spec akışı gereksiz yük getirir. Ama para hareket ettiren modül için var. Ödeme durum makinesi, idempotency kuralları ve kayıt yapısı bir iki sayfalık bir belgeye sığar. Bu sayfaları yazmamanın maliyeti, ilk çift çekim ya da mutabakat farkında çok daha yüksek çıkar.
AI ajanı spec'i okuyup doğru kodu yazacaksa, kod incelemesine gerek kalır mı?
Kalır. Spec, neyin yapılması gerektiğini söyler; ajanın bunu doğru yapıp yapmadığını test ve inceleme gösterir. Özellikle ajanın yazdığı testlerin gerçekten bir şeyi sınayıp sınamadığını insan kontrol etmeli.
Ödeme sağlayıcısı zaten idempotency sağlıyorsa, bizim tarafta ayrıca gerek var mı?
Evet. Sağlayıcı kendi API çağrısını korur, ama senin sisteminde siparişin oluşturulması, stok düşülmesi ya da e-posta gönderimi gibi yan etkiler de tekrar edebilir. Kendi uç noktalarının da istemciden gelen tekrarlara karşı korunması gerekir.
Spec ile kod ayrıştığında hangisine güveniriz?
Önce bunun bir hata olduğunu kabul ederiz. Kod gerçekte ne yapıyorsa üretimdeki davranış odur; ama doğru davranış spec'te yazandır. Farkı bulduğunda ya kodu düzeltir ya da bilinçli bir kararla spec'i güncellersin; ikisini ayrık bırakmak sonraki her ajanı yanıltır.
Ödemeyi artık bir AI Agent başlatıyorsa Spec'te ne değişir?
Durum makinesine yeni bir soru eklenir: bu ödemeyi kim, hangi yetkiyle başlattı? Google'ın AP2 protokolü bunu kullanıcının imzaladığı mandate kayıtlarıyla, Stripe ve OpenAI'ın ACP'si ise satıcının Agent bazında kabul ya da red kuralıyla çözüyor. Spec'te limit, geçerlilik süresi ve hangi durumda insan onayının şart olduğu açıkça yazmalı.
Notun kaynakları
- Stripe API Reference: Idempotent requests
- GitHub Spec Kit
- East & Partners: Swift ISO 20022 goes live as deadline passes
- Swift: structured address migration extension for ISO 20022 payment messages
- GitHub Spec Kit Releases
- Google Cloud: Powering AI commerce with the new Agent Payments Protocol (AP2)
- OpenAPI Initiative Blog (Arazzo 1.1 duyurusu)
Sunum stili
12 slayt. Tıklarsan sunum o slayttan başlar.
Slayt notları
Ödeme alanının yerleşik pratikleri ve Ekim 2026'daki araç ekosistemi üzerinden SDD'yi anlatacağım.
Çoğu üründe belirsiz Spec yanlış renkte bir buton üretir. Ödemede aynı belirsizlik doğrudan para kaybıdır.
Ağ zaman aşımında ödeme bankada gerçekleşmiş olabilir. 'Hata göster' cümlesi bu durumu kapsamaz.
GitHub Spec Kit Ağustos 2026'da 1.0'a ulaştı ve bu akışı birçok Agent ile çalıştırıyor. Akış ancak Spec kod kadar ciddiye alınırsa ödemede işe yarar.
Bu altısından biri eksikse Agent boşluğu kendi varsayımıyla doldurur. Her biri test edilebilir bir kurala dönüşmeli.
Her geçiş için tetikleyici, ön koşul ve yan etki yaz. Durum alanı serbest metin değil enum olsun, geçişler tek fonksiyondan yapılsın.
Stripe referansı: V4 UUID gibi yüksek entropili anahtar, aynı anahtarla farklı parametre gelirse hata. Eşzamanlı iki istek ve 500 sonrası davranış da Spec'te yazmalı.
SWIFT sınır ötesi talimatlarda MT ile birlikte yaşamı 22 Kasım 2025'te bitirdi; Kasım 2026 adres kuralını Ağustos 2026'da erteledi. Alan uzunluklarında hata payı yok.
Kısmi iade kodda var, Spec'te yok; altı ay sonra başka bir Agent raporu yanlış hesaplar. Agent'lar çoğaldıkça Spec ile kodun ayrışması hızlanır.
Spec, hangi farkın otomatik düzeltileceğini ve hangisinin insana gideceğini önceden tanımlamalı. Kalan kuruşun kime gideceği yazılı değilse, Agent karar verir.
Değişmezleri property-based testing ile binlerce senaryoya karşı sına: 'iade toplamı tahsil edilen tutarı aşamaz'. Agent'ın yazdığı testin de bir mutantı yakaladığını gör.
Son mesaj: Spec sürüm kontrolünde, PR ile değişir, testler ona atıf yapar.