Claude Code'a tanımadığınız bir proje verdiniz ve şu yanıtı aldınız: "Geçmiş tarayıcıda tutuluyor, son 100 kaydı saklıyor ve sayfa yenilendikten sonra geri yükleniyor." README'ye eklemek için yeterince somut görünüyor. Ama önce yanıtın dayandığı kaynakları açıp kontrol etmek gerekir.

Bu çıkarımlardan birini ele alalım: gereksinimi sorulara dönüştürelim, kısa bir kod parçasını okuyalım ve çalıştırırken hangi davranışı doğrulamamız gerektiğine bakalım. Sonunda neyin çalıştığını ve nelerin hâlâ kontrol edilmesi gerektiğini gösteren kısa bir rapor hazırlayacağız.

Tüm projeyi incelemek yerine tek bir gereksinim

Haiku 50, anahtar kelimelere göre üç dizelik şiirler üreten küçük bir uygulamadır. Kullanıcı dili seçer, bir metin alır ve ürettiği şiirlerin geçmişini görür. İncelememiz için tek bir gereksinim yeterli: son 100 üretim tarayıcıda saklanmalı ve sayfa yenilendikten sonra da kullanılabilmelidir.

Haiku 50 için görsel. Aşağıda uygulamanın davranışını kod ve senaryolar üzerinden inceleyeceğiz.

Burada Haiku 50 bir eğitim örneği. Kod ve ajan yanıtları inceleme amacıyla hazırlandı; beklenen davranışı koddan çıkarıyoruz. Projenin kaynak arşivini burada incelemiyoruz. Gerekli her şey makalede mevcut: uygulamayı indirmeniz, API anahtarı almanız veya şiir üretimini çalıştırmanız gerekmeyecek.

"Burada her şeyin nasıl çalıştığını açıkla" demek yerine üç soru soralım. Yeni bir üretim depolama alanına yazılıyor mu? Uygulama yeniden açıldığında kaydedilenleri okuyor mu? Kayıt sayısı yüzü aşınca ne oluyor?

Claude Code'a ilk isteğiniz şöyle olabilir:

Yalnızca şiir üretim geçmişini incele. Şimdilik kodu değiştirme.
Yeni şiirin alınmasından kaydedilmesine kadar olan yolu bul,
sonra sayfanın açılmasından geçmişin gösterilmesine kadar olan yolu izle.
Kaydedilen kayıt sayısının nerede sınırlandığını kontrol et.
Her çıkarım için dosyayı, satırları ve kısa bir kod parçasını belirt.
Çalıştırmayı gerektiren noktaları ayrıca listele.

Bu istek arama alanını netleştirir. Ajan geçmişin başka bir dosyayla bağlantılı olduğunu bulursa, o dosyanın neden okunması gerektiğini açıklayabilir. Siz de uygulamanın baştan sona özetini denetlemek yerine birkaç dayanak noktasını daha kolay doğrularsınız.

Dosya bağlantısı okumayı gereksiz kılmaz

history.js adlı bir eğitim dosyası düşünelim. Başarılı bir üretimden sonra arayüz addToHistory(item) işlevini çağırıyor; renderHistory ise yalnızca kendisine verilen listeyi gösteriyor. Bu örnekte geçmişi yöneten başka bir işleyici yok.

const STORAGE_KEY = "haiku-history";
let history = [];

function addToHistory(item) {
  history.unshift(item);
  localStorage.setItem(STORAGE_KEY, JSON.stringify(history));
  renderHistory(history.slice(0, 100));
}

function startHistory() {
  renderHistory(history);
}
startHistory();

Bu parçayı okuyabilmek için verinin tutulduğu iki yeri ayırt etmeniz yeterli. history dizisi açık sayfanın belleğinde yaşar. localStorage, site verilerini tarayıcıda oturumlar arasında saklar; uygulama verileri buraya kendisi yazar ve geri okur. Depolama alanı protokol, ana makine ve porta bağlıdır. Bu yüzden doğrulama sırasında aynı adresi ve tarayıcı profilini kullanın. Bu davranış localStorage belgelerinde açıklanıyor.

Diyelim ki ajan şöyle yanıt verdi:

Geçmiş son 100 üretimi saklıyor ve sayfa yenilendikten
sonra geri yükleniyor. Dayanak: history.js:4-13,
localStorage ve slice(0, 100) kullanılıyor.

Dosya yolu ve satırlar belirtilmiş. Şimdi bunların cümlenin tamamını doğrulayıp doğrulamadığına bakalım. Eğitim dosyasında ilk satır const STORAGE_KEY ile başlıyor; boş satırlar da numaralandırmaya dahil.

  • 5. satırdaki history.unshift(item), yeni kaydı dizinin başına ekler;
  • 6. satırdaki localStorage.setItem çağrısı tüm diziyi depolama alanına yazar. JSON'a dönüştürmek, diziyi metin olarak saklamayı sağlar;
  • 7. satırdaki renderHistory(history.slice(0, 100)), ilk 100 öğeyi ekrana gönderir. slice yeni bir dizi oluşturur, asıl diziyi kısaltmaz; bunu yöntemin belgelerinde görebilirsiniz;
  • başlangıçta 2. satırdaki let history = [] boş bir dizi oluşturur; startHistory işlevi ve 10-13. satırlardaki çağrısı bu diziyi ekrana gönderir. Burada depolama alanından okuma yapılmıyor.

Kodu okuduktan sonra yanıt değişiyor: kod geçmişi kaydetmeyi ve ekranda gösterilen öğeleri yüzle sınırlamayı içeriyor. Ancak bu kodda başlangıçta geri yükleme yok; saklanan kayıt sayısını sınırlayan bir yer de bulunamadı.

Gerçek bir projede bu parça yeterli olmayabilir; veriler başka bir modülde yükleniyor olabilir. Bu yüzden ajana şunu sormak yararlı: "Bu anahtarın okunduğu ve yazıldığı tüm yerleri, ayrıca bu işlevleri kimin çağırdığını göster." Eğitim örneğimizde kapsam belli, devam edebiliriz.

Sayfa yenilendikten sonraki davranışı doğrulayın

Kodu okumak, uyumsuzluğun nerede aranacağını gösterdi. Şimdi gözlem koşullarını belirleyelim. Sayfa, tarayıcının normal profilinde tek bir adreste açık; kaydetmeye izin veriliyor ve geçmiş başlangıçta boş. Eğitim senaryosunda tanınabilir A etiketiyle başarılı bir üretim yapılıyor; adımlar arasında kod değişmiyor.

Aşağıda koddan beklenen senaryo akışı var. Bir adım daha ekleyelim: sayfayı yeniledikten sonra yeni bir B kaydı üretelim.

AdımEkranda beklenenhaiku-history anahtarı altında depolamada beklenen
Geçmiş boşken sayfayı açtıkBoş listeKayıt yok
A üretimini ekledikTek A kaydıA kaydını içeren dizi
Aynı sayfayı yeniledikBoş listeA kaydını içeren dizi duruyor
Yenilemeden sonra B üretimini ekledikYalnızca B kaydıYalnızca B'yi içeren dizi; A kaydının üzerine yazıldı

Gerçek gözlem için depolama içeriğini tarayıcının geliştirici araçlarında, site verilerinin saklandığı bölümde görebilirsiniz. İlgili anahtarın değerini açın ve kaydı az önce eklediğiniz kayıtla karşılaştırın. Ekrandaki boş liste tek başına yeterli değil.

"Sayfa yenilenince her şey silindi" demek doğru olmaz. Veriler depolama alanında kaldı, ancak uygulama onları okumadı. Bu kodda zincir, kaydedilmiş metinle ekrana gönderilen dizi arasında kopuyor.

Bir sonraki ekleme bu hatanın sonucunu gösteriyor. Sayfa yenilendikten sonra bellekteki dizi boş olduğu için yalnızca B eklenir ve localStorage.setItem saklanan geçmişin üzerine tek kayıt içeren yeni bir dizi yazar. Gereksinime göre B ve A kalmalıydı; koda göre yalnızca B kalacak. Sorun hem geçmişin gösterimini hem de saklanmasını etkiliyor.

Koddan çıkarılan sonucu şimdiden kaydedebilirsiniz: "startHistory içinde kaydedilmiş geçmiş okunmuyor; bir sonraki ekleme önceki kayıtların üzerine yazacak." Çalışma sırasındaki davranışı doğrulamak için dört adımın tamamını uygulayın ve her adımın ardından ekrandaki listeyi depolama içeriğiyle karşılaştırın.

100 sayısını doğrulayın

Geri yükleme konusunu inceledik. Gereksinimin diğer kısmı, son 100 üretimin saklanması. Bu sınırı tek bir kayıtla doğrulayamazsınız.

Geçmişin boş olduğu ayrı bir senaryo kuralım. Yenileme yapmadan, 1'den 101'e kadar etiketlenmiş 101 hazır kaydı sırayla aynı ekleme işlevine verelim. Geçmişi doğrulamak için üreticiye 101 istek göndermek gerekmiyor; burada ilgilendiğimiz, hazır bir kayıt geldikten sonraki davranış.

Yeni kayıt dizinin başına ekleniyor. Bu nedenle son eklemeden sonra ekranda 101'den 2'ye kadar etiketler, toplam 100 kayıt görünecek. Ancak kaydetme satırına dizinin tamamı verildi: depolama alanında 101'den 1'e kadar, toplam 101 kayıt kalacak. Hem sayıyı hem de kayıtların hangileri olduğunu kontrol edin. Yoksa uygulamanın en yeniler yerine en eskileri tuttuğunu fark etmeyebilirsiniz.

Ajanın yanıtı tam burada gereğinden fazla genelleme yaptı. Kodda 100 sayısı gerçekten var, ancak gösterilen kayıtları sınırlıyor. Koddan çıkarılabilecek doğru sonuç şu: "Arayüz son 100 kaydı gösteriyor; gösterilen senaryoda depolama alanında 101 kayıt bulunuyor, dolayısıyla saklanan geçmişin boyutuyla ilgili gereksinim karşılanmıyor."

Senaryo uygulamanın hangi bölümünü doğruluyor?

Hazırlanmış kayıtlar geçmişi ayrı olarak doğrulamanızı sağlar. Üretim hizmetinin kullanılabilirliği, şiirlerin kalitesi veya seçilen dilin aktarımı hakkında bir şey söylemezler. Bu gereksinimler için ayrı senaryolar gerekir.

Kısa bir rapor hazırlayın

İncelemenin sonucunu projenin yanında saklamak iyi olur; böylece yarın konuşmayı baştan okumazsınız. Örnekte dosyaya HANDOFF_REVIEW.md adını verelim. Ad sadece bir örnek; önemli olan, kayda bakarak doğrulamanın nasıl yapıldığını yeniden kurabilmek.

Eğitim kodunu okuyarak hazırlanan rapor şöyle. Beklenen davranış alanı, çalıştırma sırasında neyi arayacağınızı gösteriyor:

Kapsam: şiir üretim geçmişi, makaledeki history.js eğitim sürümü.
İnceleme yöntemi: eğitim kodu parçasını okuma.
Tarayıcıda çalıştırma yapılmadı.

Gereksinim: son 100 üretimi tarayıcıda saklamak
ve sayfa yenilendikten sonra göstermek.

Koda göre:
- history.js:6, localStorage.setItem tüm diziyi yazıyor;
- history.js:7, renderHistory(history.slice(0, 100)),
  yalnızca gösterilen kayıtları sınırlıyor;
- history.js:10-13, startHistory ve çağrısı,
  kaydedilmiş veriyi okumadan gösterimi başlatıyor.

Koda göre beklenen davranış:
- A kaydı eklendikten sonra ekranda ve depolamada görünür;
- sayfa yenilendikten sonra A depolamada kalır, liste boş olur;
- yenilemeden sonra B eklenince kayıtlı geçmişin üzerine yazılır:
  A ve B yerine yalnızca B kalır;
- boş başlangıçlı ayrı senaryoda 101 eklemeden sonra
  ekranda 100 kayıt (101..2), depolamada 101 (101..1) olur.

Koda göre uyumsuzluklar: başlangıçta geçmiş geri yüklenmiyor,
bu nedenle sonraki ekleme eski geçmişin üzerine yazacak;
saklanan geçmiş son 100 kayıtla sınırlandırılmamış.

Kontrol edilmedi: üreticinin çalışması, kaydetme hataları,
birden fazla sekmede eşzamanlı kullanım.

Sonraki adım: iki senaryoyu yeniden uygulayıp gözlemleri kaydetmek.
Ardından başlangıçta okuma ve saklanan diziyi sınırlama işlerini
düzeltip aynı senaryoları tekrarlamak.

Kendi raporunuzda "eğitim sürümü" yerine projenin doğruladığınız sürümünü belirtin; örneğin commit'i ve commit edilmemiş değişiklik olup olmadığını yazın. Çalıştırdıktan sonra "Gerçek gözlemler" adlı ayrı bir alan ekleyip sonuçları veya elle uyguladığınız adımları kaydedin. Bunları beklenen davranışla karşılaştırın; çalıştırma mümkün olmadıysa ilgili notla birlikte alanı boş bırakın. Burada gerekli tüm veriler makalede yer alıyor; büyük bir projede satır bağlantıları tek başına doğrulamayı tekrarlamak için yeterli olmaz.

Böyle bir rapor, ajana verilecek sonraki işi netleştirir. Elinde "geçmişi daha güvenilir yap" gibi genel bir istek değil, iki somut uyumsuzluk var. Ayrıca hangi sonuçlara varmak için henüz erken olduğunu da görürsünüz.

Çıkarımı kendiniz doğrulayın

Aynı eğitim uygulamasına bir temizleme düğmesi ekledik. Düğmenin işleyicisi şöyle:

function clearHistory() {
  history = [];
  renderHistory(history);
}

Düğmeye basmadan önce listede ve depolamada A kaydı vardı. Bastıktan sonra liste boşaldı. Ajan şöyle yazdı: "Düğme kaydedilmiş geçmişi tamamen siliyor."

Hangi çıkarım doğrulanıyor: geçmiş ekrandan mı kayboldu, kayıt localStorage'dan mı silindi, yoksa ikisi de mi? Sırada neyi kontrol etmek gerekir? Açıklamayı okumadan önce yanıtlamaya çalışın.

Çözümleme

Listenin ekrandan kaybolduğu doğrulandı. Kod ayrıca bellekteki dizinin sıfırlandığını gösteriyor. Ancak işleyici localStorage'ı değiştirmiyor; koşula göre renderHistory yalnızca listeyi çiziyor. Bu nedenle A kaydı depolamada kalıyor.

Sonraki kontrol, düğmeye bastıktan hemen sonra haiku-history anahtarının değerini okumak. Geçmişi geri yükleme özelliği uygulandıktan sonra sayfayı yenileyip silinen kayıtların geri gelmediğini de doğrulayın. İlk sürümde tek başına yenileme işe yaramazdı: temizleme olmasa da başlangıçta boş liste gösteriyor. Doğrulamanın önündeki küçük ama kolayca gözden kaçan bir engel.

Claude Code'a bu tür işleri nasıl verirsiniz?

Gerçek bir projede, sonraki kararınızı etkileyecek tek bir iddiayla başlayın. Örneğin geçmişi kullanmak mümkün mü, yoksa önce geri yükleme mi düzeltilmeli? Ajandan, kaynağı açıp çıkarımı kolayca doğrulayabileceğiniz bir yanıt biçimi isteyin:

Şu iddiayı doğrula: [uygulamanın belirli bir davranışı].
Önce ilgili dosyaları bul ve gerekli kısımları oku.
Şimdilik kodu değiştirme.

Şunları döndür:
1. Kodun doğruladıkları: dosya, satırlar, kısa bir parça.
2. Çalıştırma sırasındaki davranışı doğrulayacak senaryo.
3. Gerçekte ne yapıldı ve ne gözlemlendi.
4. Kesin sonuç ve hâlâ bilinmeyenler.

Çalıştırma mümkün değilse bunu açıkça belirt.
Önerilen senaryoyu yapılmış bir doğrulama gibi yazma.

Yanıttan sonra temel çıkarımın kaynaklarını açın, gözlemi gereksinimle karşılaştırın ve ancak bundan sonra sonucu notlarınıza ya da belgelere aktarın. Kaynak yetersizse sonraki isteğiniz de belli: geçmişin okunduğu yeri bulmak, anahtarın değerini kontrol etmek, 101 kayıtlı senaryoyu tekrarlamak. Böylece inceleme küçük ve doğrulanabilir adımlarla ilerler.

Bir işlevin adıyla ilgili basit bir soru için kod bağlantısı yeterlidir. Yanıt veri saklama, geri yükleme veya boyut sınırı içeriyorsa ilgili davranışı baştan sona izlemek yararlı olur. Doğrulamanın kapsamını, ileri sürmek istediğiniz iddia belirler.