AIDive

Shopify'ın 4 Kapısı Claude Code'da: Sadece Testler Yaradı

AIDive tarafından · Yayın

Kodlama agent'larıOtomasyon ve workflow'lar

Giriş: "bitti" demeyi reddeden kapı

Shopify'ın kullandığı anlamda bir kapı (gate), yapay zeka tarafından yazılmış bir değişikliğin ilerleyebilmesi için geçmesi gereken bir kontroldür. Claude Code'da yeniden kurulduğunda yalnızca ilki işe yaradı: kabul testleri. Shopify dört kapı yayımladı, ama tek bir sayı vermedi. Bu deney o kapıları gerçek bir repoda kuruyor, her seferinde bir kapıyı kapatarak elli istek çalıştırıyor ve her kapının neyi yakaladığını, neye mal olduğunu sayıyor.

Helix 21 Eylül 2026'da kamuya açıldı. Her checkpoint'i sırayla dört kapıdan geçiriyor: testler, tasarım incelemesi, iki reviewer ve bir mühendis. Yazı hiçbir pass rate vermiyor. Reviewer'lar çoğu kişinin kopyaladığı kısım, ama bu elli run'da pass rate yalnızca testler döngüdeyken oynadı. Reviewer'lar hiçbir şey katmadı, üstelik yaklaşık üç kat maliyetle.

Aynı bench'ten iki bulgu daha çıkıyor. Aşılamaz olduğu varsayılan bir hook'un kendi belgelerinde üç çıkışı var. Ayrıca testler ile reviewer'lar anlaşamadığında agent, kimsenin planlamadığı bir şey yaptı. Sayım, hiç kapı olmayan durumdan başlıyor.

Dört kapı, sıfır sayı, bir bench

Bench reposu tinydb, gerçek bir doküman veritabanı; kullanılan commit'te 226 test yeşil.

Helix, Shopify'ın mobil uygulamalarını yeniden native koda taşımak için kullandığı iç araç. Yazısı kuralı açıkça söylüyor: her checkpoint sırayla dört kapıdan geçer.

Kapı Shopify'ın yazısında ne yapıyor
Davranış İlgili her vakanın geçmesi gereken testleri çalıştırır
Tasarım İkinci bir modelden mükemmeliyetçi bir tasarım reviewer'ı gibi davranmasını ister
İnceleme İki bağımsız, bağlamı izole reviewer agent; ikisi de onaylayana kadar döngü tekrarlanır
Mühendis Döngüyü bir insan kapatır

Tasarımı satan cümle şu: "An attempt is allowed to be wrong. It is not allowed to ship until it isn't." Tasarım kapısı bir kütüphane için devre dışı kalıyor; yazıya göre yalnızca mantık içeren bir değişiklik onu atlıyor.

Yazının hiçbir zaman vermediği şey bir sayı. Shop app 12 haftada yeniden kuruldu ve Shopify app'te 300'den fazla ekran var; defterin tamamı bu. Ne bir pass rate var, ne bir maliyet, ne de kaçan hataların sayısı.

Bench, bir geliştiricinin yazdığı gibi yazılmış beş istekten oluşuyor: push ve pull işlemleri, bir between sorgusu, bir tablo yeniden adlandırma, sıralı bir arama ve bir yazma cache boyutu. Her isteğin arkasında agent'ın asla görmediği beş gizli gereksinim var; deneyimli bir kıdemli mühendisin bekleyeceği şeyler. Toplamda 25 gereksinim ediyor.

Worker, headless çalıştırılan Sonnet 5.5. Beş konfigürasyon çarpı beş görev çarpı iki tekrar, 50 run veriyor. Bir uyarı: bu isteklerin açık yazılmış sürümleri tek seferde geçiyor, bu yüzden prompt'lar insanların gerçekte yazdığı kadarına kısaltıldı.

Hiç kapı yokken 50 gereksinimden 35'i geçiyor. Bu 70%, ve on run'dan üçü tamamen temiz.

Sıralama görevi, kaçırılanların neye benzediğini gösteriyor. Agent her dokümanı sıralama alanıyla indeksledi ve tek bir doküman bu alandan yoksun olur olmaz tüm arama çöküyor. Beş gereksinim, sıfır geçen, bir eksik anahtar.

"Bitti" demeyi reddeden hook ve üç çıkışı

Stop hook, agent turunu bitirmeye çalıştığı her seferinde Claude Code'un çalıştırdığı bir betiktir. Anthropic'in kendi rehberi bunun hedeflediği sorunu adlandırıyor: Claude, iş bitmiş göründüğünde durur. Çalıştırabileceği bir kontrol olmadan "bitmiş görünüyor" elindeki tek sinyaldir ve doğrulama döngüsü siz olursunuz.

Hook, projenin ayar dosyasında hooks, Stop altında, timeout'lu tek bir komut olarak durur. Burada kapı betiğini çağıran tek satırlık bir sarmalayıcı. Sözleşme çıkış kodudur: 0 turun bitmesine izin verir, 2 engeller ve betiğin standart hataya yazdığı her şey sebep olarak agent'a geri gider.

Pratikte böyle çalışıyor. Agent değişikliğini özetler ve durur. Hook kabul testlerini çalıştırır, biri başarısız olur ve tur bitmez. Agent hatayı hook geri bildirimi olarak okur, bu örnekte tip hatası bekleyip alamayan bir test, kodu düzeltir ve yeniden durur. Bu sefer kapı sessizdir.

Prompt'taki bir kural tavsiyedir. Hook öyle değildir. Yine de aynı belge sayfası üç çıkış sıralıyor.

Çıkış Belge ne diyor
Üst sınır Stop hook'ları turu art arda 8 kez devam ettirdikten sonra Claude Code bir sonraki engeli geçersiz kılar ve turu bitirir. Sayaç agent her tool çağırdığında sıfırlanır ve bir ortam değişkeni sınırı yükseltir.
Timeout Bir command hook için varsayılan 600 saniye; timeout'a ulaşan hook karar üretmez. Yavaş bir test paketi kapıyı kendiliğinden açar.
Bayrak Hook girdisi stop_hook_active taşır; oturum zaten bir stop hook yüzünden devam ediyorsa true olur. Belgeler, çözülemeyecek bir koşulda asla engellememeniz için bunu kontrol etmenizi söylüyor.

Buradaki kapı bu bayrağı loglar ve yok sayar. Altı engelden sonra kendi kendine vazgeçer, böylece döngüler sayılabilir kalır.

Kimsenin belgelemediği bir çıkış daha var. Bir kez engellendikten sonra agent testleri aramaya girişti: hook betiği üzerinde cat çalıştırdı ve test dosyası için tüm diski taradı. Onu yalnızca allow list durdurdu. Bu yüzden kabul testleri repo ağacının dışında duruyor, ayarlar hook'un ve gizli testlerin okunmasını reddediyor ve agent hatayı görüyor ama dosyayı asla görmüyor.

Kapı 1: kabul testleri

Kabul testi kapısı, uygulayandan bağımsız yazılmış, "bitti"nin ne demek olduğunu tanımlayan bir test kümesidir. Shopify'ın ilk kapısı agent'ın kendi testleri değil. Bir subagent her checkpoint için entegrasyon tarzı test vakaları üretiyor, mutlu yolun ötesindeki uç durumları zorluyor ve kanıtlanmış olmanın ne demek olduğunu bu testler tanımlıyor.

Buradaki writer bu yüzden ayrı bir headless Sonnet. Değişiklikten önceki isteği ve repoyu salt okunur görüyor, kod çalıştıramıyor ve deneyimli bir kıdemli mühendisin bekleyeceği her davranış için bir test yazması söyleniyor: eksik alanlar, yanlış tipler, sınırlar, kalıcılık, cache ve mevcut davranışın değişmemesi. 23 ile 53 arasında, ortalama 39 test yazıyor, yaklaşık 40 saniyede. Dosya repo dışına düşüyor, dolayısıyla bir test başarısız olduğunda agent assertion'ı okuyor ama testi asla okumuyor.

Tek başına testler pass rate'i 70%'ten 84%'e çıkarıyor: 50 gereksinimden 42'si ve üç yerine altı tamamen temiz run.

Görev Testsiz Testli
Sıralı arama 10'da 5 10'da 10
Yazma cache boyutu 10'da 8 10'da 10
Push ve pull 10'da 4 10'da 4

Sıralama görevindeki eksik alan çökmesi, writer'ın sorduğu türden tam bir vaka. Cache görevi için writer, birden küçük bir cache boyutunda value error talep etti.

Push ve pull görevi yerinden oynamıyor. Üç gereksinimi kaçırıyor, ikisi alandan yoksun bir doküman hakkında ve istek bunun hakkında hiçbir şey söylemiyordu. Writer tam da prompt'un sustuğu yerde kaçamak yapıyor: testi bir raise'i de sessiz bir no-op'u da kabul ediyor, dolayısıyla kapı kimsenin belirtmediği bir gereksinimi kurtaramıyor.

Testli 30 kapılı run boyunca kapı agent'ı 28 kez gerçek bir gereksinim başarısızken, beş kez de hepsi geçerken geri gönderdi. Bu beşten biri yeniden adlandırma görevinde oldu: writer string olmayan adların reddedilmesini istedi, kimse bunu istememişti ve agent bir tur kaybetti.

Bu kapının ilk sürümü, uygulayanın kendi testlerini yeniden çalıştırıyordu. Gizli bir gereksinim başarısızken her run'a ilk durağında izin verdi, çünkü bir agent'ın kendi testleri onun inşa ettiği şeyi test eder.

Kapının bedeli run başına $0.085 yerine $0.20 ve 33 saniye yerine 60 saniye.

Kapı 3: Shopify'ın yazdığı gibi iki reviewer

İnceleme kapısı, her biri taze bir bağlamda çalışan bir reviewer agent çiftidir. Shopify'ın ifadesi: iki bağımsız, bağlamı izole reviewer agent yeni kodu kontrol eder, her bulgunun düzeltilmesi gerekir ve ikisi de onaylayana kadar döngü tekrarlanır. Anthropic'in rehberi izolasyonun neden önemli olduğunu açıklıyor: taze bağlamdaki bir reviewer yalnızca diff'i ve verdiğiniz kriterleri görür, değişikliği üreten akıl yürütmeyi görmez.

Buradaki her reviewer, salt okunur tool'lara ve en fazla 15 tura sahip headless bir Sonnet. Yapılandırılmış JSON olarak bir karar döndürüyor: bir approve bayrağı ve her biri blocking ya da minor önem derecesi taşıyan bulgular. İki reviewer isteğe ve tam diff'e karşı paralel çalışıyor, bulguları birleştiriliyor ve biri blocking bir şey bulursa kapı engelliyor. Bir çift, durak başına 3 ile 6 sent arasında maliyetli.

Konfigürasyon Geçen gereksinim Pass rate Engeller
Kapısız 50'de 35 70% yok
Sadece reviewer'lar 50'de 34 68% 10 run'da 1
Sadece testler 50'de 42 84% 10 run'da 6 (3 haklı, 3 haksız)
Testlerden sonra reviewer'lar 50'de 41 82% 10 run'da 2, ikisi de haklı

Sadece reviewer'lar hiç kapı olmamasının iki puan altında kalıyor, testlerden sonra reviewer'lar ise sadece testlerin iki puan altında.

Sıralama görevi sayıyı açıklıyor. Bir run'da iki reviewer da engelledi: sıralama dokümanı indeksliyor, bu alandan yoksun tek bir doküman key error fırlatıyor ve tüm arama başarısız oluyor. Agent düzeltti ve beşin beşini geçti.

Diğer iki run'da iki reviewer da aynı çökmeyi gördü ve minor olarak değerlendirdi. Sıralama alanı olmayan bir doküman yalın bir key error fırlatıyor ve docstring bunu belgeliyor. İki reviewer da onayladı ve iki run da sıfır beşle bitti. Aynı model, aynı diff, aynı hata, iki farklı önem derecesi. Reviewer'lar engellediklerinde hiç yanılmadı. Sorun, onların geçirdikleri.

Ağustos'tan bir makale aynı deseni herkese açık bir benchmark'ta ölçtü. Zero-shot 77%, tek reviewer 77% ve iki bağımsız reviewer 75% aldı; hepsi hiç inceleme olmamasının gürültüsü içinde.

LiveCodeBench üzerindeki kurulum Skor
Zero-shot 77%
Tek reviewer 77%
İki bağımsız reviewer 75%
Reviewer artı critic (adversarial review) 87%

Reviewer artı critic ve bitmeyen döngü

Adversarial review, ana agent düzenleme yapmadan önce incelemeyi yapılandırılmış bir anlaşmazlıkla denetleyen bir critic ile eşleştirilmiş bir reviewer'dır. Aynı makale işe yarayan biçimin bu olduğunu buldu. İki reviewer'ın 75%'ine karşı 87% aldı ve 82%'lik en güçlü beş agent'lı baseline'ı geçti.

Benchmark Zero-shot Adversarial review ile Maliyet
SWE-bench 71.6 75.2 yaklaşık 4.5x token

Bu yüzden critic kapıya girdi. Reviewer A inceler. Critic B bulguları ve diff'i alır ve her bulguyu onaylandı ya da reddedildi diye damgalar. Kapıyı yalnızca onaylanmış bir blocking bulgu kapatır.

Bu repoda sonuç 50'de 39, yani 78% oldu. Critic çifti on run'da sıfır kez engelledi. Doğrulama sırasında, iki reviewer'lı biçimin engelleyeceği yanlış bir bulguyu reddetti.

Critic'in düzeltemediği şey döngü. Üç run aynı kabul testinde altı engele ulaştı ve kapı, gerçek gereksinim her durakta başarısızken vazgeçti. Bunlardan ikisinde engelleyen test writer'ın kendi hatasıydı ve agent bunu söyledi: okuyamadığı bir test için kodu değiştirmeyecekti.

Üçüncüsü hatırlanması gereken. Kabul testi, başarısız bir update'in her dokümanı olduğu gibi bırakmasını istiyordu, bu yüzden agent tablonun update metodunu yeniden yazdı. Reviewer'lar bunu engelledi, çünkü update metodundaki değişiklik istenmemişti ve görev iki yeni fonksiyondu. Agent geri aldı. Son mesajı, kabul testi ile kod incelemesinin zıt şeyler istediğini, bu yüzden hiçbir şeyi değiştirmeden durduğunu söylüyordu. Altı engel sonra sayaç onu dışarı çıkardı.

Buradaki vazgeçme noktası altıda. Claude Code'un kendi üst sınırı art arda sekiz engel ve her tool çağrısında sıfırlanıyor, bu yüzden elli run boyunca bir kez bile devreye girmedi.

Kapı 4 sensin: insana ne ulaştı, fatura, kit

Dördüncü kapı mühendis ve Shopify'ın yazısı, kimse izlemediğinde kapıların gevşemeyeceği sözünü veriyor. Mühendise ulaşan, diğer kapıların geçirdiği her şey. Aşağıdaki defter hangi kapının kendini amorti ettiğini yanıtlıyor.

Konfigürasyon 50'de geçen Pass rate Run başına maliyet İnsana kalan
Kapısız 35 70% $0.085 15
Kabul testleri 42 84% $0.20 8
Sadece reviewer'lar 34 68% $0.15 16
Testler ve reviewer'lar 41 82% $0.28 9
Testler ve reviewer artı critic 39 78% $0.28 11

Kapılı her satır run başına 54 ile 86 saniye sürüyor, kapısız ise 33.

Elli run'daki engellerin dökümü şöyle. Testler agent'ı 28 kez haklı, beş kez haksız yere geri gönderdi. Reviewer'lar üç kez engelledi, hiçbiri haksız değildi ve üç döngü vazgeçti. Tüm matris, CLI'ın raporladığı haliyle $9.95'lik liste fiyatı API harcamasına ve toplam worker süresinden yaklaşık 3136 saniyeye, yani 52 dakikaya mal oldu.

Bunun gibi bir repo için hüküm: test kapısını tutun, uygulayan olmayan bir writer ve agent'ın düzenleyemeyeceği testlerle. Altı engelden birinin yanlış olmasını bekleyin ve döngüye bir sayaç verin. Shopify'ın yazdığı haliyle iki reviewer'lı kapı, iki biçimde de burada pass rate'i oynatmadı. Tutarsanız, bir bar olarak değil, geri bildirimde tavsiye olarak tutun.

Yolda bir tuzak. Belgeler, betikli çağrılar için hook'ları, skill'leri, plugin'leri ve belleği atlayan yalın bir bayrağı anlatıyor. Bir abonelik girişinde bu bayrak yalnızca bir API anahtarı okuyor ve hata döndürüyor, bu yüzden her reviewer bunun yerine boş bir settings kaynağı ve kapalı hook'larla yalıtılıyor.

Sınırlar gerçek: bir repo, bir worker modeli, beş görev, hücre başına iki tekrar. Satırlar arasındaki iki puanlık fark gürültü. Kapısız ile test kapısı arasındaki on dört puan değil. Tasarım kapısı kurulmadı ve mühendisin süresi ölçülmedi.

Shopify'ın dört kapısından, bu repoda yalnızca testler karşılığını verdi. Kitin tamamı ücretsiz pakette: hook ve deny list içeren ayar dosyası, stop betiği, kapı, şemalarıyla writer ve reviewer komutları ve defter şablonu.

Ücretsiz kaynaklar

Kaynaklar

Sık sorulan sorular

Shopify'ın dört AI kapısından hangisini Claude Code'da yeniden kurmaya değer?
Kabul testi kapısı. tinydb üzerindeki 50 run boyunca pass rate'i 70%'ten 84%'e çıkardı; iki reviewer'lı kapı ise onu oynatmadı (tek başına 68%, testlerden sonra 82%).
Claude Code'un testler geçmeden bitti demesini nasıl engellerim?
Proje ayarlarına kabul testlerinizi çalıştıran ve başarısızlıkta 2 koduyla çıkan bir Stop hook ekleyin. Claude Code turun bitmesini engeller ve betiğin standart hataya yazdığı her şeyi sebep olarak agent'a geri besler.
Claude Code, bir Stop hook ile gerçekten çalışmaya devam etmeye zorlanabilir mi?
Tamamen değil. Hook belgeleri her tool çağrısında sıfırlanan art arda 8 engellik bir üst sınırı, karar üretmeyen 600 saniyelik varsayılan bir timeout'u ve kontrol etmeniz söylenen stop_hook_active bayrağını sıralıyor. Döngülerin öngörülebilir biçimde bitmesi için kendi engel sayacınızı ekleyin.
İki bağımsız AI code reviewer agent çıktısını iyileştirir mi?
Bu testte hayır. İki Sonnet reviewer tek başına 68%, testlerden sonra 82% aldı; iki run'da gerçek bir çökmeyi minor olarak değerlendirdikleri için her iki baseline'ın da iki puan altında. Bir makale aynı deseni LiveCodeBench üzerinde ölçtü: zero-shot 77%, iki reviewer ile 75%, reviewer artı critic ile 87%.
Claude Code'da her kapı run başına ne kadara mal oluyor?
Run başına liste fiyatı API maliyeti kapısız $0.085, kabul testleriyle $0.20, tek başına reviewer'larla $0.15 ve testler artı reviewer'larla $0.28 oldu. Kapılı run'lar 33'e karşı 54 ile 86 saniye sürdü.
Agent'ın gizli kabul testlerini okumasını nasıl önlerim?
Testleri repo ağacının dışında saklayın ve ayarlarda hook betiğinin ve test dosyalarının okunmasını reddedin. Agent o zaman başarısız assertion'ı görür ama dosyayı asla görmez.

İlgili videolar