AIDive

Claude Code Hata Yayınladı. 4 Düzeltmeyle İmkânsız Kıldım

AIDive tarafından · Yayın

Kodlama agent'ları

Hata yayına alan oturum ve 'pürüzsüz' diyen retro

Claude Code gerçek bir depoda numaralandırma hatasını yayına aldı ve onaylanan dört değişiklik bu hatayı bir daha yayına çıkamaz hâle getirdi. Oturum, küçük bir fatura API'si için iade notları yazdı, test paketi yeşil döndü ve sonradan elle yaptığımız bir kontrol, reddedilen bir isteğin bir fatura numarasını yaktığını gösterdi. Ardından o oturumda bir retro çalıştırdık, düzeltmeleri tek tek onayladık ve aynı görevi yeniden çalıştırdık: sonuç temiz çıktı.

Retro, bir olaydan sonra ekibin yaptığı incelemedir; burada Claude Code'un kendi oturum günlüğü üzerinde çalıştırılıyor. İlk retromuz "This session was smooth" diye başladı ve bulgularının hiçbiri hata değildi. Çözüm, sırayla yedi harekettir: kur, görevi çalıştır, retro'yu çalıştır ve neyin başarısız olduğunu söyle, her adayı bir ana kadar izle, kurtulan her adayı bir taşıyıcıya onayla, commit at ve denetle, görevi yeniden çalıştır.

Retro nedir ve /retro kurulumu

/retro, Matt Pocock'un yazdığı ve kodunu değil, bir kodlama oturumunu inceleyen bir skill'dir. Oturum günlüğünü, yani Claude Code'un her prompt'u ve her araç çağrısını sakladığı dosyayı okur ve yedi kategoride aday arar; örneğin bir hatayı yakalayabilecek bir kontrol. Adayları önem sırasına göre sunar ve dokümanlarına göre yalnızca öneride bulunur: siz bir aday seçmeden hiçbir şey değişmez.

Kurulum ilk harekettir: deponuzda resmi marketplace'i güncelleyin, ardından skills paketini proje kapsamında kurun; böylece yalnızca bu depoda yaşar. Bizim marketplace'imiz retro'suz eski bir sürüme sabitlenmişti, bu yüzden önce güncelleme geldi. Yeni bir oturumda bir eğik çizgi yazın, retro komutu listede olacaktır.

Bir sınır: bulut oturumu makinenizdeki günlükleri okuyamaz, bu yüzden retro'yu oturumun gerçekleştiği yerde çalıştırın.

Görevini çalıştır ve bitirmesine izin ver: oturumumuz hatayı yayına aldı

İkinci hareketi zaten her gün yapıyorsunuz: gerçek görevinizi sade bir oturuma yazın, bitirmesine izin verin ve oturumu açık tutun, çünkü retro'nun okuyacağı şey budur.

Node ve TypeScript ile yazılmış, kendi test paketi olan küçük bir fatura API'si kullandık; hiçbir yerde talimat dosyası, pipeline ya da commit hook'u yoktu. Görev kısaydı, sizin de yazacağınız gibi: ödenmiş faturalara sırayla numaralandırılan iade notları ekle ve ödenmiş bir faturanın iptal edilmesini, kalan tutarın iade edilmesiyle sağla.

Oturum rotayı, bir migrasyonu ve kendi testlerini yazdı, durmadan önce paketi çalıştırdı. Sonra finans biriminin elle yapacağı kontrolü, önceden yazılmış gizli bir testi çalıştırdık ve bir gereksinim başarısız oldu.

Sinyal Sonuç
Test paketi 42 test geçti
Tür denetimi temiz
Gizli finans kontrolü başarısız: beklenenden daha geç bir iade notu numarası geldi

Neden: handler, sıradaki numarayı isteği doğrulamadan önce sayaçtan alıyor ve sayaç okunduğu anda kaydediliyor. Fazla büyük bir iade notu reddediliyor, bu doğru, ama numara yine de gidiyor, bu doğru değil. Oturum bu sırayı mevcut fatura kesme rotasından kopyaladı; o rota da fatura numaralarını aynı şekilde sızdırıyor.

Görevi iki kez çalıştırdık ve diğer çalıştırma temiz çıktı; yani sade bir oturum bunu zaman zaman yapıyor.

/retro'yu çalıştır, sonra neyin başarısız olduğunu söyle

Üçüncü hareket, aynı oturumda retro komutunu yazmak, sonra başarısızlığı arkasına yazarak yeniden çalıştırmaktır. Bizimki şöyle başladı: "This session was smooth."

Birkaç maddeyi sıraladı, hiçbiri hata değildi: eksik bir güvenlik önlemi, kimsenin denetlemediği bir migrasyon kuralı ve gözden geçirenin uygulayabileceği hiçbir şey. Retro oturum günlüğünü okur ve oturum başarısız olduğunu hiç öğrenmemişti.

O yüzden siz söylersiniz: komutu başarısızlık argümanıyla, yani komuttan sonraki metinle yeniden çalıştırın. Bizimki finans biriminin derlemeyi test ettiğini, fazla büyük bir iade notunun reddedildiğini, bir sonraki geçerli notun geç numarayla çıktığını ve retro'nun hiçbir şeyi düzeltmemesi gerektiğini söylüyordu.

Bu sefer nedeni kendi kodunda buldu: önce numarayı alıyor, sonra doğruluyor ve bu sırayı mevcut kesme handler'ından kopyaladığını söyledi. Ardından yeni adaylar geldi: yazdığı, başarısız diziyi çalıştıran ama yalnızca durum kodlarını kontrol eden bir test, saf görünen ama olmayan bir sayaç fonksiyonu ve kimsenin yazmadığı bir gelenek.

Oturumdan sonra ne bulduysanız argümana yazın; yoksa retro, her şeyin iyi gittiğine inandığı bir oturumu denetler.

Onaylamadan önce her adayı bir ana kadar izle

Dördüncü hareketi skill kendi başına yapmaz: retro'dan her adayın arkasındaki transkript anını alıntılamasını isteyin ve gösteremediği her adayı eleyin.

Dokümanlar, sıralı bir listenin neden yetmediğini açıklıyor: iş bittiğinde model oturumun zorluklarını unutur ve genel tavsiyeler uydurur. Bu yüzden belirli bir ana izleyemediğiniz her adayı atın: retro'dan her aday için transkripti alıntılamasını isteyen tek bir cümle yeter.

İlk retromuzda yanıt netti: adayların çoğunun transkriptte dayanağı yoktu. Eksik güvenlik önlemini tuttu, çünkü hooks klasörüne ilişkin kendi listesi hiçbir şey yazdırmamıştı, migrasyon kontrolünü ise varsayımsal diyerek eledi.

Hatayı bilen ikinci retroda iz sürme dört adayı tuttu ve birini eledi.

Aday İz sürmeden sonra
Yazdığı test (kabul, ret, kabul, numara hiç kontrol edilmedi) tutuldu, güçlü
Uyarısız sayaç fonksiyonu tutuldu, güçlü
Yazılmamış gelenek tutuldu, daha zayıf
Eksik güvenlik önlemi tutuldu, ancak bir güvenlik önleminin bu hatayı yakalamayacağını söyledi
Son aday elendi: aynı anı iki kez sayıyordu

Skill'in deposunda açık bir issue, retro çalıştırmalarının çoğunun ardından kullanıcının kanıt istediğini sayıyor. İzi sürülmüş bir aday yine de modelin kendi günlüğünü okumasıdır; yani "daha zayıf" işaretli bir satır bir yargıdır ve hangilerini sonraya taşıyacağınıza siz karar verirsiniz.

Her kurtulanı kendi taşıyıcısına onayla

Beşinci hareket, döngünün karşılığını verdiği yerdir: kurtulanları tek tek, her birini kendi taşıyıcısına, yani kuralın yaşayacağı yere onaylayın. Skill size basamakları verir. Mekanik bir ihlal deterministik bir kontrol alır, nokta: linter'ınızda bir kural, bir commit hook'u ya da pipeline'ınızda bir iş. Bir yargı kararı, gözden geçirenin okuduğu kodlama standartları dosyasına gider. Talimat dosyanız, dokümanların ifadesiyle "incredibly sparingly" kullanılır, yalnızca başka dosyalara işaretçiler için.

Dört değişikliği onayladık:

  • Eksik güvenlik önlemi, tür denetimini ve testleri çalıştıran ve ikisinden biri başarısız olursa commit'i engelleyen, izlenen bir commit hook'una dönüştü. Harness dosyayı çalıştırılabilir yapmayı reddetti, bu yüzden o komutu kendimiz çalıştırdık.
  • Test, kuralı kilitleyen tek bir vitest testine dönüştü: bir iade notu kabul edilir, bir iade notu reddedilir ve bir sonraki geçerli not bir sonraki numarayı taşımalıdır. İlk çalıştırmada başarısız oldu ve amaç da buydu: oturumun yayına aldığı hatayı yakaladı.
  • Yargı kararı, yeni bir CODING_STANDARDS.md içinde tek bir satıra dönüştü: sıra numarasını yalnızca tüm doğrulamalar geçtikten sonra al, böylece reddedilen bir istek sırada boşluk bırakmaz.
  • Gezinme boşluğu, sayaç fonksiyonunun üstünde tek bir yoruma dönüştü: sayacı hemen kaydeder, bu yüzden çağıran sonra başarısız olsa bile numara harcanır, o yüzden yalnızca doğrulamadan sonra çağır.

Sonuç: dört dosya değişti ve CLAUDE.md içinde sıfır satır var, çünkü iki retro da bir tane yazmayı reddetti. Birincisi, yönlendirme dosyasındaki bir işaretçinin her turda bağlam harcayacağını ve eskiyeceğini söyledi; ikincisi bunu fonksiyonun üzerinde bir yorum olarak tutmayı önerdi. Dokümanlar bunu destekliyor: Claude bu dosyaları zorunlu yapılandırma olarak değil, bağlam olarak ele alır ve bir eylemi engellemek için bir hook kullanırsınız.

İki sınır: bir hook yalnızca commit'leri korur ve yorum, retro'nun kendi sözleriyle, kanıtlanmış bir düzeltme değil, bir sonraki çağırana yapılmış bir bahistir.

Döngüyü kapat: hook commit'ini engeller, denetle, commit at, yeniden çalıştır

Altıncı hareket commit'tir, sonuncusu ise aynı görevi yeniden çalıştırmaktır; döngünün tutup tutmadığını burada görürsünüz.

Onaylanan dosyaları sahneleyip commit attığımızda hook önce çalıştı ve commit'i reddetti. Tür denetimi geçti, sonra yeni numaralandırma testi başarısız oldu: beklediğinden daha geç bir numara aldı. Hook dosyaları diskte durdukları hâliyle denetler ve diskte hâlâ hatalı kod vardı.

O yüzden oturuma dönün ve yalnızca düzeltmeyi isteyin: doğrulama geçtikten sonra numarayı al, kontrolleri çalıştır, commit atma. Sonra yeniden commit atın, hook yeşil geçer ve iki commit elde edersiniz: önce retro değişiklikleri, sonra düzeltmesiyle özellik. Retro'nun kendisi hiçbir şey commit etmedi; depodaki açık bir issue bunu kelimesi kelimesine anlatıyor, yani commit'i siz atarsınız.

Sonra /doctor prompt-audit çalıştırın; talimat dosyalarınızdaki eskimiş satırlar için Claude Code'un kendi denetimi. Burada bir tuzak var: yol vermezseniz depoyu değil, global dosyalarınızı denetler. Yol verildiğinde yeni standartlar dosyasını temiz olarak nitelendirdi ve eski fatura kesme rotasının kuralı ihlal ettiğini işaretledi; bu bir kod hatasıdır, bir prompt sorunu değil.

Son hareket, aynı görevle yeni bir oturumdur. Bizimki kod yazmadan önce kodlama standartları dosyasını, readme'yi, hook'u ve kırmızı numaralandırma testini okudu, sonra kendi özetinde numaranın yalnızca tüm bu kontroller geçtikten sonra alındığını, böylece reddedilen bir isteğin sırada boşluk bırakmadığını yazdı.

İlk oturum Döngüden sonraki yeni oturum
Geçen testler 42 yeşil
Gizli finans kontrolü başarısız 5 üzerinden 5
Reddedilen istekten sonraki numaralar yanmış, boşluk var boşluksuz

Dürüst bir çekince: bu yeni oturuma ders kırmızı bir test ve bir standartlar satırı olarak verildi, yani bu bir kıyaslama değil, döngüden sonraki bir çalıştırmadır.

Karar: retro ne zaman çalıştırılır, ne zaman çalıştırılmaz, tek kural

Retro oturumu okur, bu yüzden oturumun görmediğini argümana siz yazarsınız. Takılacağınız yer burasıdır.

Retro'yu yanlış giden bir oturumdan sonra, oturumu temizlemeden önce ya da eski oturumun günlüğü üzerinde çalıştırın. Otomatik pilotta çalıştırmayın ve bir hook'a bağlamayın: skill'in yazarı bunu kendi sözleriyle söylüyor, bunu otomatikleştirmek istemezsiniz. Dokümanlar bir sınır ekliyor: geçen ay önerdiği kontrolleri denetlemez, yani onları budamak yine size düşer.

Hatırlanacak tek kural dokümanların kendi cümlesidir: talimat dosyanıza kod gibi davranın, işler ters gittiğinde gözden geçirin, düzenli olarak budayın ve değişiklikleri Claude'un davranışının gerçekten değişip değişmediğini gözleyerek test edin. Döngü ajanı haklı yapmaz, aynı yanlışı daha hızlı yakalamanızı sağlar ve eklediğiniz kontroller artık bakımını yaptığınız koddur.

Bu videonun ücretsiz paketinde her hareketi, iz sürme sorusunu ve taşıyıcıları içeren retro kontrol listesi, ayrıca çalıştırmamızdan commit hook betiği ve numaralandırma testi var; yani bizimkinden başlayabilirsiniz.

Ücretsiz kaynaklar

Kaynaklar

Sık sorulan sorular

Matt Pocock'un /retro skill'i ne yapar?
Kodunuzu değil bir Claude Code oturumunu inceler; her prompt'un ve araç çağrısının oturum günlüğünü okur. Yedi kategoride aday arar, onları önem sırasına göre sıralar ve yalnızca öneride bulunur: siz bir aday seçmeden hiçbir şey değişmez.
Retro neden oturumun pürüzsüz olduğunu söyledi?
Retro oturum günlüğünü okur ve oturumumuz başarısız olduğunu hiç öğrenmemişti: 42 testi ve tür denetimi yeşildi. Hatayı yalnızca gizli finans kontrolü yakaladı, bu yüzden ilk retro 'This session was smooth' diye başlayıp onu kaçırdı.
Retro'nun oturumun görmediği bir başarısızlığı bulmasını nasıl sağlarım?
Retro komutunu ikinci kez çalıştırın ve başarısızlığı arkasına argüman olarak yazın. Bizimki finansın reddedilen bir iade notu ve geç gelen bir sonraki numara bulduğunu söylüyordu; bu sefer retro nedeni, numarayı doğrulamadan önce alan kendi koduna kadar izledi.
Retro'nun bulgularını kanıtlamasını nasıl sağlarım?
Her adayın arkasındaki transkript anını alıntılamasını ve gösteremediklerini elemesini isteyin. İlk retromuzda adayların çoğunun dayanağı yoktu; ikincisinde iz sürme dördünü tuttu ve birini eledi.
Kuralı CLAUDE.md içine koymalı mıyım?
Varsayılan olarak hayır: dört değişikliği onayladık ve CLAUDE.md içine sıfır satır yazdık. Dokümanlar Claude'un onu zorunlu yapılandırma değil bağlam olarak ele aldığını söylüyor; bu yüzden mekanik bir kural bir hook'a ya da teste, bir yargı kararı ise kodlama standartları dosyasına aittir.
Bir Claude Code oturumunda retro'yu ne zaman çalıştırmalıyım?
Yanlış giden bir oturumdan sonra, oturumu temizlemeden önce ya da eski oturumun günlüğü üzerinde çalıştırın. Otomatikleştirmeyin ve bir hook'a bağlamayın: yazarı bunu otomatikleştirmek istemeyeceğinizi söylüyor.

İlgili videolar