Kısım II · İnşaat · Bölüm 46

Agent'larla Geliştirme

Yapay zekâ agent'larıyla geliştirme (Developing with AI agents)

Neden burada · Neye dayanıyor

Neden burada: Kodun büyük kısmını sen yazmayacaksın; yapay zekâ agent'ları yazacak. Bu kitabın bütün amacı, agent'ın yazdığı şeyi okuyabilmen, hangi katta ne değiştiğini görebilmen ve ona doğru işi doğru biçimde tarif edebilmendi. Bölüm 45'te bir cevabın bütün yolculuğunu haritaladın; bu harita senin elindeki dümen. Bu bölüm, o dümenle agent'ı nasıl yöneteceğini gösterir: ne olduğunu, projenin kurallarını ona nasıl anlatacağını, işi nasıl tarif edeceğini, birden çok agent'ı birbirine çarpmadan nasıl çalıştıracağını, ürettiğini nasıl inceleyeceğini ve sınırlarının nerede olduğunu. Haritayı bilmeseydin agent seni sürüklerdi; biliyorsun, o yüzden yönetebilirsin.

Neye dayanıyor: Bölüm 28 (Git: commit, dal, birleştirme; bu bölümde worktree ile genişliyor), Bölüm 42 (test ve kod incelemesi: agent'ın işinin doğruluğunu ölçen şey), Bölüm 45 (uygulamanın haritası: görevi hangi katta tarif edeceğini bilmek). Ayrıca Bölüm 37 ve Bölüm 39 örneklerde geçen Go ve Postgres işleri için.

  1. Kat 10Bizim uygulamamızAgent'ların yazdığı ve senin yönettiğin ürün. Bu bölümün odağı: Kat 10'u üretme biçimi.
  2. Kat 9Web ve tarayıcıAgent'ın dokunduğu istemci kodu; hata ayıklarken her katı gözünün önünde tut.
  3. Kat 8Ağ ve internetAgent bir API'yi çağırırken ya da sunucu kurarken bu katla uğraşır.
  4. Kat 7İşletim sistemiAgent terminali kullanır; dosya, süreç ve izinler bu katın işi. Bölüm 13–18.
  5. Kat 5Diller ve araçlarAgent kod yazar, derleyiciyi ve testleri çalıştırır. Bölüm 9–11, 21, 29–30.
  6. Kat 3–4İşlemci ve bellekAgent'ı çalıştıran model de sonunda ekran kartlarında ve işlemcilerde koşar; Kısım III bu kata uzanır.

Bu bölümde altı şey var. Agent'ın ne olduğu (46.1), projenin kurallarını anlatan AGENTS.md dosyası (46.2), iyi bir görev tarifi (46.3), git worktree ile paralel çalışma (46.4), agent'ın ürettiği kodu okuyup incelemek (46.5) ve agent'ın sınırları (46.6). Her alt bölümde somut bir şey yapacağız; iki küçük deneyi (bir oyuncak agent döngüsü, gerçek bir git worktree oturumu) bu bölüm yazılırken gerçekten çalıştırdım ve çıktısını aşağıya koydum.

46.1 Kodlama agent'ı nedir

"Yapay zekâ agent'ı" dendiğinde kafa karışıklığı büyüktür; çünkü kelime çok farklı şeyler için kullanılıyor. Anthropic'in "Building effective agents" yazısı bunu şöyle düzenler: bütün bu varyasyonlara agentic sistem (agentic system) denir ve aralarında önemli bir mimari ayrım yapılır. İş akışları (workflows), LLM'lerin ve araçların önceden yazılmış kod yollarıyla yönetildiği sistemlerdir. Agent'lar ise LLM'in kendi sürecini ve araç kullanımını dinamik olarak yönettiği, bir işi nasıl yapacağının kontrolünü elinde tuttuğu sistemlerdir.1 Yani iş akışında yolu sen çizersin; agent'ta yolu model seçer.

Bu tanımın içindeki iki yeni kelimeyi, kitapta daha önce görmediğin için, yavaşça açalım. LLM (large language model, büyük dil modeli), metin alıp metin üreten bir yapay zekâ modelidir; Kısım III'ün sonunda (Bölüm 58) içini açacağız. Şimdilik onu "kendisine verilen metne bakıp en uygun devam metnini yazan bir sistem" olarak düşün. Araç (tool) ise modelin metin üretmenin ötesinde bir şey yapmasını sağlayan işlevdir: bir dosyayı okumak, bir dosyaya yazmak, terminalde komut çalıştırmak, internette aramak. Model araca doğrudan dokunmaz; "şu aracı şu argümanlarla çağırmak istiyorum" diye yazar, çevresindeki program (genellikle harness ya da çatı denir) aracı gerçekten çalıştırır ve sonucu modele metin olarak geri verir.

Anthropic'in yazısındaki temel yapı taşı genişletilmiş LLM (augmented LLM)'dir: arama (retrieval), araçlar ve bellek gibi eklerle güçlendirilmiş bir LLM.1 Kodlama agent'ı bunun en tanıdık örneğidir: LLM + dosya okuma + dosya yazma + terminal. Yazının agent tarifi şu cümlede sıkışır: agent'lar tipik olarak araç kullanan LLM'lerin, çevreden gelen geri bildirimle bir döngü içinde çalışmasından ibarettir.1 Yazı ayrıca, yürütme sırasında agent'ın her adımda çevreden "gerçek zemin" (ground truth) alması gerektiğini söyler: araç sonuçları ya da kod çalıştırma gibi; ilerlemeyi bununla değerlendirir. Görev bitince durur ya da bir durdurma koşuluna (en çok şu kadar tur gibi) ulaşır.

Bir döngüyü gözünle gör

Döngünün şeklini görmek için, gerçek bir model olmadan çalışan bir oyuncak yazdım. "Model" burada önceden yazılmış kurallarla bir sonraki eylemi seçen basit bir fonksiyondur; amaç zekâ göstermek değil, döngünün anatomisini göstermektir. Senaryo: puan() fonksiyonu yanlış cevapta 1 puan veriyor, oysa 0 olmalı; bir test bunu yakalıyor.

gecmis = []
for tur in range(1, 8):            # durdurma koşulu: en çok 7 tur
    karar = model(gecmis)          # MODEL: geçmişe bakıp sıradaki eylemi seçer
    if karar.get("bitti"): break   # model "bitti" derse döngü sona erer
    sonuc = ARACLAR[karar["arac"]](*karar["arg"])   # ÇATI: aracı gerçekten çalıştırır
    gecmis.append({"karar": karar, "sonuc": sonuc})  # sonuç modele geri döner

Programı çalıştırınca çıktı şu oldu (programın tamamı otuz küsur satır: iki dosya, üç araç, bir döngü):

[tur 1] araç=testi_calistir -> 'AssertionError: yanlış cevap 0 puan olmalı'
[tur 2] araç=dosya_oku -> 'def puan(dogru):\n    return 10 if dogru else 1\n'
[tur 3] araç=dosya_yaz -> 'yazıldı'
[tur 4] araç=testi_calistir -> 'testler geçti'
[tur 5] BİTTİ: puan() yanlış cevapta 0 döndürüyor; test geçti.

Döngünün her turunu oku: önce testi çalıştırıp başarısızlığı görüyor (gerçek zemin), sonra dosyayı okuyor, düzeltmeyi yazıyor, sonra testi tekrar çalıştırıp geçtiğini görüyor, ve ancak o zaman bitti diyor. Gerçek kodlama agent'larının yaptığı budur; farkı, "modelin" sabit kurallar yerine bir LLM olması ve araç setinin çok daha geniş olmasıdır (dosya arama, git, tarayıcı, veritabanı...). İlkesel olarak bütün bir kodlama oturumu, bu on satırlık döngünün çok uzun sürümüdür.

Agent ile "chat" arasındaki fark

Bir sohbet penceresinde yapay zekâya kod sorduğunda, cevap bir metindir ve onu kopyalayıp çalıştırmak, sonucu ona geri yapıştırmak senin işindir: döngünün çatı kısmını sen oynarsın. Bir kodlama agent'ında bu döngü otomatiktir: model kodu yazar, çalıştırır, hatayı görür, düzeltir. Bunun bedeli, hatanın da otomatik büyüyebilmesidir; yanlış anlaşılmış bir görev, otuz adım boyunca yanlış yönde ilerleyebilir. Anthropic'in yazısı bunu açıkça söyler: agent'ların özerkliği daha yüksek maliyet ve hataların birikmesi potansiyeli demektir; kum havuzu (sandbox) ortamlarında kapsamlı test ve uygun korkuluklar önerilir.

Bir de Anthropic'in basitlik tavsiyesi var, çünkü kitabın geri kalanında "agent her şeyi çözer" izlenimine kapılmanı istemiyoruz: yazıya göre en iyi çözüm çoğu zaman bulunabilecek en basit çözümdür; karmaşıklık yalnızca gerektiğinde artırılmalıdır, çünkü agentic sistemler daha iyi görev performansı için gecikme ve maliyetten ödün verir.1 Bizim için çıkarım: küçük, tek dosyalık bir düzeltme için karmaşık çok-agent'lı bir kurulum gereksizdir; ama "Kısım II'deki bütün bu parçalardan oluşan bir uygulamayı yan yana yürütmek" gerçek bir orkestrasyon işidir.

Bölüm 21 ve 25 ile bağlantı

Agent'ın dilini artık okuyabilirsin: Python, TypeScript, Go, SQL, Bash. Bölüm 21'deki dil haritası ve Bölüm 25'teki JavaScript, agent'ın ürettiği kodu "anlamadığım bir yazı" olmaktan çıkarır. Kısım III'te (Bölüm 47 ve sonrası) agent'ın içindeki LLM'in nasıl çalıştığını, küçük bir sinir ağından başlayarak açacağız; bu bölümde yalnızca "araç kullanan döngü" kısmını bilmen yeterli.

46.2 AGENTS.md: projenin kuralları, agent için

Bir agent her oturuma sıfır hafızayla başlar: dün konuştuğunuz kararları, ekibinizin kurallarını, projenin tuhaflıklarını bilmez. Kod okuyarak çoğunu çıkarabilir; ama hepsini değil. Bu boşluğu AGENTS.md (AGENTS.md) doldurur: projenin kökünde duran, agent'lara projeyi nasıl çalıştıracağını ve hangi kurallara uyacağını anlatan düz bir Markdown dosyası. agents.md sitesi gerekçeyi şöyle verir: README.md dosyaları insanlar içindir (hızlı başlangıç, proje tanımı, katkı kuralları); AGENTS.md ise kodlama agent'larının ihtiyaç duyduğu ek, bazen ayrıntılı bağlamı (derleme adımları, testler, kurallar) barındırır; README'yi kısa ve insan katkıcılara odaklı tutmak için ayrı bir dosyadır.2

Format ve kurallar

agents.md sitesine göre AGENTS.md, Linux Foundation çatısındaki Agentic AI Foundation tarafından yönetilen açık bir biçimdir, yani tek bir şirkete ait değildir.2 Zorunlu alan yoktur: AGENTS.md sıradan Markdown'dır, istediğin başlıkları kullanırsın, agent verdiğin metni ayrıştırır. Popüler bölümler: proje genel bakışı, derleme ve test komutları, kod stili, test talimatları, güvenlik notları; ek olarak commit mesajı ve pull request kuralları, güvenlik tuzakları, yayın adımları, yani yeni bir ekip arkadaşına söyleyeceğin her şey.2 Dosya nerede olmalı? Depo kökünde. Büyük bir monorepo (birden çok projenin tek depoda durması) için her alt projeye ayrı bir AGENTS.md konabilir: agent'lar ağaçtaki en yakın dosyayı okur ve en yakın olan önceliklidir; talimatlar çakışırsa düzenlenen dosyaya en yakın AGENTS.md kazanır, kullanıcının sohbette açıkça yazdığı istem ise her şeyin üstündedir.2

Aynı formatı farklı araçlar farklı ayrıntılarla uygular. OpenAI Codex belgeleri bunu adım adım anlatır: Codex herhangi bir işe girişmeden önce AGENTS.md dosyalarını okur; önce kullanıcının Codex ev dizinindeki genel dosyaya (~/.codex), sonra proje kökünden bulunduğu dizine kadar inerek her dizindeki dosyaya bakar, dosyaları kökten aşağıya doğru birleştirir; çalışma dizinine daha yakın dosyalar daha sonra gelir, dolayısıyla önceki talimatları geçersiz kılar. Birleşik boyut, varsayılan olarak 32 KiB sınırına (project_doc_max_bytes) ulaşınca dosya eklemeyi bırakır.3 Bu detay önemli bir ders içerir: agent'ın dikkati ve belleği sınırlıdır; kuralların uzunluğu da sınırlıdır.

Kısa tutmak: Anthropic'in tavsiyesi

Claude Code'un kendi talimat dosyasının adı CLAUDE.md'dir; en iyi uygulamalar belgesinin bu dosya için tavsiyesi AGENTS.md için de geçerli mantıktır: dosya her oturuma yüklenir, yani içindeki her satır, ilgili olsun olmasın, her görevde modelin dikkatinden bir pay alır. Bu yüzden dosyaya yalnızca koddan çıkarılamayacak şeyler yazılır: repoyu doğrulamanın tam yolu (test, tip denetimi, lint komutları; tek bir test dosyası nasıl çalıştırılır), kodun yanıltıcı olduğu yerler (her yerde olan ama yeni kodda kopyalanmaması gereken eski bir kalıp), repoda olmayan kararlar (hangi hata yardımcısı seçildi, yayın nasıl yapılır) ve iki kez düzeltmek zorunda kaldığın her şey.4 Belge basit bir sınama önerir: bir şey yazmadan önce sor: "Bunu kodu okuyarak bulabilir mi? Gerçekten gidip bakar mı?" İkisinin cevabı da evetse, yazma.4

Aynı belge ikinci bir ayrım yapar ve bu ayrım hayati: talimat dosyaları ve sohbet istemleri belirsizcil (non-deterministic) yönergelerdir; model onları okur ve ne yapacağına kendisi karar verir, genellikle uyar ama garanti yoktur. Hiç istisnası olmaması gereken kurallar ise belirlenimci (deterministic) mekanizmalara aittir: çatının kendisinin her seferinde uyguladığı kancalar (hooks), yasak kuralları ve ayarlar.4 Bir kuralın sonuna "ÇOK ÖNEMLİ" yazmak çözüm değildir; kural gerçekten istisnasızsa, onu dosyadan çıkarıp zorlayan bir mekanizmaya bağlamak gerekir.

docs/ klasörü

AGENTS.md kısa kalmalıysa, uzun bilgi nereye gider? Kendi tasarım tavsiyem (belgelerden alınmış bir kural değil, bir çalışma biçimi): uzun ve nadiren gereken bilgiyi docs/ klasöründe ayrı dosyalara koy (ör. docs/veri-modeli.md, docs/api.md, docs/yayin.md) ve AGENTS.md'de yalnızca bir satırla işaret et: "veri modeli için docs/veri-modeli.md'ye bak." Claude Code belgesi benzer bir mantığı beceriler (skills) için söyler: uzun bir yayın prosedürü bir becerinin içinde dururken, agent yalnızca ilgili göreve girince tam metni okur; her oturumda her satırı taşımaz.4 Böylece AGENTS.md bir içindekiler sayfası, docs/ ise kitap olur.

Bizim uygulama için örnek bir AGENTS.md. Alanların hepsi uydurma ya da tipik; gerçek komutlar projeye göre değişir:

# AGENTS.md  (örnek taslak)

## Proje
Hukuk öğrenme uygulaması. İstemci: Expo + TypeScript (app/). Sunucu: Go (server/).
Veri: Postgres (gerçeğin kaynağı), Redis (yalnızca leaderboard önbelleği).

## Komutlar
- İstemci testi: cd app && npm test
- Tip denetimi:  cd app && npx tsc --noEmit
- Sunucu testi:  cd server && go test ./...
- Migration: server/migrations/ içinde, yalnızca ileri yönlü; eski dosyaları DEĞİŞTİRME.

## Kurallar
- Doğru cevap bilgisi istemciye ASLA gönderilmez (docs/veri-modeli.md).
- SQL'de değer birleştirme yok; her zaman parametreli sorgu.
- Puan ve seri hesabı yalnızca server/internal/scoring içinde.
- Bir değişiklikte yeni bir kütüphane eklemeden önce sor.

## Bilinen tuzaklar
- Testler DATABASE_URL ister: bkz. .env.example.
- app/legacy/ hâlâ kullanımda ama yeni kodda onun kalıbını kopyalama.
Uygulamamızda

Bu dosya, Bölüm 45'teki haritayı agent'a verir: hangi kat nerede (app/ ve server/), hangi karar pahalı (Postgres gerçeğin kaynağı, istemciye güvenmeme), hangi komut işin bittiğini kanıtlar (test ve tip denetimi). Dosyanın ilk sürümünü sen yazmak zorunda değilsin; agent'tan taslağı üretmesini isteyip sen okuyup kısaltabilirsin. Okurken her satıra "Bunu kodu okuyarak bulabilir mi?" diye sor; evetse sil.

46.3 İyi görev tarifi: kapsam, kabul ölçütleri, küçük adımlar

Agent'ı kullananların yaşadığı en yaygın hayal kırıklığı şudur: "yap" dedin, bir şey yaptı, ama istediğin şey bu değildi. Claude Code'un en iyi uygulamalar belgesi bunu iki kökene bağlar: ya agent, koddan okuyamayacağı bir bilgiden yoksundu (tarif eksikti), ya da işi bitirdiğini doğrulayacak bir şeyi yoktu ("bitti" dedi ama bitmemişti).4 İyi bir görev tarifi bu iki boşluğu doldurur.

Kapsam: dosyayı, belirtiyi, hedefi söyle

Belgenin verdiği örnek ikilisi öğreticidir. Zayıf tarif: "giriş hatasını düzelt." Güçlü tarif: "kullanıcılar oturum zaman aşımından sonra girişin başarısız olduğunu söylüyor; src/auth/ içinde belirteç yenilemeye bak, hatayı yeniden üreten başarısız bir test yaz, sonra düzelt."4 Fark nedir? Güçlü tarif belirtiyi (zaman aşımından sonra), yeri (src/auth/), yöntemi (önce başarısız test) ve dolayısıyla "düzeldi"nin ne demek olduğunu söyler. Hukukçu için tanıdık: iyi bir dava dilekçesi olay, yer ve talep sonucunu açıkça yazar; "hakkım var" yazmakla yetinmez.

Bizim uygulamadan iki karşılaştırma:

ZayıfGüçlü
"Seri sistemini yap.""Seri kuralını server/internal/scoring içinde, Bölüm 45.3'teki tabloya göre uygula: bugün aynı, dün +1, daha eski 1'e dön. Gün sınırı sunucunun saatine göre. Dört durumu da test eden bir tablo-testi yaz."
"Leaderboard yavaş, düzelt.""GET /api/leaderboard 10.000 kullanıcıda 2 saniye sürüyor. Önce EXPLAIN çıktısını göster; çözümü uygulamadan önce Redis'e geçmek mi, dizin eklemek mi daha uygun, iki seçeneği kısaca karşılaştır."

Kabul ölçütleri: "bitti"nin tanımı

Kabul ölçütleri (acceptance criteria), bir işin "bitti" sayılması için sağlanması gereken, evet/hayır cevaplanabilen koşullardır. Claude Code belgesi bunun temel taşını şöyle koyar: agent'a geçti/kaldı diye dönen bir kontrol verirsen, işi kendi kendine kapatabilir: değişikliği yapar, kontrolü çalıştırır, bozulduysa çıktıyı okur, düzeltir ve yeniden çalıştırır.4 Kontrol hemen her şey olabilir: bir test dosyası, bir derlemenin çıkış kodu, bir lint aracı, bir betik. Belge ayrıca kanıt istemeyi öğütler: "tüm testler geçti" cümlesi tek başına çok az şey söyler; çalıştırılan komut ve çıktısı bir kanıttır.4

Dolayısıyla her görevin sonuna şunu eklemek iyi bir alışkanlıktır: "go test ./... ve npx tsc --noEmit geçene kadar devam et; sonunda iki komutun çıktısını göster." Bu cümle, Bölüm 42'deki testin (Bölüm 42, 42.1) ne işe yaradığını bir cümleye sığdırır: testler, agent'ın kendi işini yargılayabileceği nesnel bir hakemdir.

Küçük adımlar ve önce planlama

Büyük bir görevi tek seferde vermek, hata birikme riskini büyütür. Küçük adımlar hem agent için daha az belirsizlik hem de senin için daha okunabilir bir fark (diff) demektir. Ne yapacağını henüz tam bilmiyorsan, belge yöntem önerir: agent'tan seni röportaj yaparak sorgulamasını iste. Örnek istem: "genel API'ye hız sınırlama eklemek istiyorum ama henüz düşünmedim; spec yazabilecek hâle gelene kadar bana soru sor, sonra SPEC.md'ye yaz." Agent seçenekli sorular sorar, cevaplarınla bir şartname (spec) çıkarır; asıl işi o şartnameye göre başka bir oturumda yaptırırsın.4

Belgenin bir uyarısı da önemli: bir görev için gerekli ayrıntıyı tarif ederken "düşün, daha çok düşün" ya da "dikkatli ol" gibi cümleler sıradan metindir; asıl kontrol çabadır (effort), kapsam ise yalnızca senin bildiğin bir şeydir. Agent, isteği çoğu zaman temkinli okur ve istenenin en küçük hâlini yapar; daha fazlasını istiyorsan (boş ve hata durumları, kayıt akışı, klavye gezintisi gibi) bunu açıkça söylemek gerekir.4

Uygulamamızda

İlk gerçek görev önerisi (tamamen bizim planımızdan): "Bölüm 45.1'deki POST /api/answers ucunu server/ altında uygula. İstek ve yanıt gövdeleri docs/api.md'deki gibi olsun. Sahte Store ve Board ile handler testi yaz (gerçek veritabanı yok). Kabul: go vet ve go test geçer; bozuk JSON 400, doğru cevap 200 döner. Sonunda komut çıktılarını göster." Bu tarif kapsamı (bir uç, server/), yöntemi (sahte bağımlılıkla test), kabul ölçütünü (iki komut, iki durum kodu) ve kanıt istemeyi içerir; yani Bölüm 45'in Durak 6'sını, agent'ın tek bir oturumda kapatabileceği boyuta indirir.

46.4 git worktree ile paralel çalışan agent'lar

Şimdi iki agent'ı aynı anda çalıştırmak istediğini düşün: biri seri kuralını, öteki leaderboard ucunu yazsın. Aynı klasörde çalışırlarsa, aynı dosyalara aynı anda dokunur, birbirlerinin yarım işini görür ve dosyalar karışır. Bölüm 28'de Git'in dal (branch) kavramını gördün: bir dal, projenin paralel bir tarihçesidir. Ama bir dalda çalışmak, klasördeki dosyaların o dala göre değişmesi demektir; aynı klasörde aynı anda iki dalı "canlı" tutamazsın. Çözüm: iki ayrı klasör, her biri farklı bir dalda, ama ikisi de aynı depoya bağlı.

Git bunu çalışma ağacı (worktree) ile sağlar. Git'in kılavuzuna göre bir depo birden çok çalışma ağacını destekler; böylece aynı anda birden fazla dalı çıkarılmış (checkout) halde tutabilirsin. Depoyla birlikte hazırlanan ilk ağaç ana (main) çalışma ağacıdır; git worktree add ile eklenenler bağlı (linked) çalışma ağaçlarıdır. İşin bitince bağlı ağacı git worktree remove ile kaldırırsın.5 Yeni ağaçlar depoyu paylaşır; yalnızca HEAD ve index gibi ağaca özgü dosyalar ayrıdır.5 Yani depoyu klonlamak gibi çoğaltma yoktur; tarihçe ve nesneler tek yerde durur.

Gerçek bir oturum

Aşağıdaki komutları geçici bir dizinde çalıştırdım. İki agent için iki dal ve iki klasör açıyoruz:

$ git worktree add -b agent-seri ../agent-seri
$ git worktree add -b agent-liderlik ../agent-liderlik
$ git worktree list
.../anaproje        cd8fac6 [main]
.../agent-liderlik  cd8fac6 [agent-liderlik]
.../agent-seri      cd8fac6 [agent-seri]

Üç klasör var; hepsi aynı cd8fac6 commit'inden başladı, her biri farklı bir dalda. Şimdi bir agent'ın agent-seri klasöründe bir satır ekleyip commit ettiğini düşün; ana klasörde farkı görelim:

$ cd ../agent-seri && echo "seri = 1" >> app.txt && git commit -qam "seri ekle"
$ cd ../anaproje && git diff main agent-seri
--- a/app.txt
+++ b/app.txt
@@ -1 +1,2 @@
 puan = 0
+seri = 1

Ana klasördeki app.txt dokunulmamış kaldı; değişiklik yalnızca agent-seri dalında. Git bir kural da uygular: aynı dalı iki çalışma ağacında birden çıkaramazsın. Denediğimde Git şunu söyledi: fatal: 'main' is already used by worktree at '.../anaproje'. Kılavuz da bunu doğrular: dal başka bir çalışma ağacında çıkarılmışsa komut, --force verilmedikçe reddedilir.5 Bu kural kazaen aynı dala iki agent'ı bindirmeni engeller; bir agent bir dal.

İş bittiğinde: git worktree remove ../agent-liderlik klasörü kaldırdı ve git worktree list artık iki satır gösterdi (anaproje ve agent-seri). Dalın kendisi (ve içindeki commit'ler) depoda kalır; yalnızca klasör gider. Kılavuzun uyarısı: ağaç klasörünü elle silersen, Git'in tuttuğu yönetim dosyaları bir süre sonra kendiliğinden temizlenir ya da git worktree prune ile sen temizlersin.5

Paralel çalışmanın tuzakları

Her yeni çalışma ağacı temiz bir çıkarımdır. Claude Code belgesinin uyarısı pratik: .gitignore'daki dosyalar (ör. .env) yeni ağaçta yoktur ve bağımlılıklar kurulu değildir; belge, gereken dosyaları .worktreeinclude ile kopyalamayı, ya da kurulum komutunu talimat dosyasına yazıp agent'ın her yeni ağaçta çalıştırmasını önerir.4 Bizim AGENTS.md örneğindeki .env.example notu bu yüzden anlamlı. Belgeye göre aynı aracın claude -w bayrağı bir oturumu yeni bir çalışma ağacında başlatır; yani çatılar bu Git özelliğini senin yerine yönetebilir. Bunu bilmek, arka planda neyin olduğunu anlamak için yeterli: sihir yok, klasör ve dal var.

İkinci tuzak: ayrı çalışma ağaçları dosya çatışmasını engeller ama anlam çatışmasını engellemez. İki agent aynı fonksiyonu farklı biçimde değiştirirse, dalları birleştirirken (merge) çatışma (conflict) çıkar ve birini sen çözersin. En iyi önlem, işleri baştan ayrık kapsamlarla bölmektir: biri server/internal/scoring, öteki server/internal/leaderboard. Bu, Bölüm 44'ün modüler monolit fikriyle ilgili pratik bir sonuçtur: iyi sınırlanmış modüller, paralel çalışmayı kolaylaştırır.

Bölüm 28 ile bağlantı

Bölüm 28'deki dal, commit ve birleştirme kavramları burada olduğu gibi çalışır; worktree yalnızca "bir dal = bir klasör" eşlemesini ekler. Agent'ların dallarını ana dala birleştirmeden önce, her dalın git diff ve test sonuçlarını (46.5) incelersin. Kısaca: agent dal üzerinde çalışır; ana dala girişi sen onaylarsın.

46.5 Agent'ın kodunu okumak ve incelemek

Agent işi bitirdiğinde elinde bir fark var: hangi dosyalarda hangi satırlar eklendi, silindi, değişti. Agent'ı yönetmenin asıl işi buradadır: okumak. Bu okuma, hukukçunun bir sözleşme taslağının bir önceki sürümden farkını "değişiklikleri izle" kipinde incelemesine benzer: bütün metni baştan okumazsın; neyin değiştiğine, değişikliğin amaca uyup uymadığına, beklenmedik başka değişiklik olup olmadığına bakarsın.

Diff'i okumak

Yukarıdaki deneyde git diff main agent-seri çıktısı bir fark (diff) idi: - ile başlayan satırlar silindi, + ile başlayanlar eklendi, boşlukla başlayanlar bağlam. @@ -1 +1,2 @@ satırı "eski dosyanın 1. satırından başlayan 1 satır, yenide 1. satırdan başlayan 2 satır" demektir. Agent'ın verdiği özeti okumak yetmez; diff gerçek değişikliği gösterir. Kendine üç soru sor: (1) Kapsam: değişen dosyalar görevle uyumlu mu, yoksa alakasız bir dosyaya mı dokunulmuş? (2) Kat: değişiklik doğru katta mı (iş mantığı katmanında olması gereken puan hesabı bir ekran dosyasında mı yazılmış?) (3) Yasaklar: AGENTS.md'deki kurallar çiğnenmiş mi (SQL'de değer birleştirme, istemciye doğru cevap gönderme)?

Test ve kanıt

Diff'i okumak niyeti yoklar; test davranışı yoklar. İkisi birbirinin yerini tutmaz. Claude Code belgesi şunu öğütler: agent'tan komutu ve çıktısını iste; "tüm testler geçiyor" sözüne değil, çıktıya bak; çıktıyı okumak, kontrolü kendin yeniden çalıştırmaktan hızlıdır.4 Belge ayrıca, "bitti" dedikten sonra uygulamayı gerçekten çalıştırıp sonucu görmesini isteyen bir adım da anar: bu, testlerin ve tip denetiminin kaçırdığı türden sorunları yakalar.4 Yani üç katman: diff (ne değişti), test (çalışıyor mu), çalıştırıp bakmak (gerçekten istenen şey mi).

Bağımsız inceleyici

Belgenin dikkat çekici bir tespiti: işi yazan oturumun yaptığı gerekçelere kapılmayan taze bir inceleyici daha iyi hata bulur. Bir oturum bir şeyi yazar; başka bir oturum, yazılışını izlememiş olarak, aynı dosyayı inceler ve bulgularını geri yapıştırırsın. Belge, bunu en kolay bağımsız inceleyici olarak tarif eder.4 Ayrıca, incelemeyi şartnameye göre yaptırmayı öğütler: "diff'i SPEC.md'ye göre incele, her gereksinimin uygulandığını ve listelenen kenar durumların testi olduğunu kontrol et; doğruluğu etkileyen eksikleri raporla, üslubu atla." Son kısım ("üslubu atla") belgeye göre kritik: hata bulması istenen bir inceleyici her zaman bir şey bulur; her bulguyu düzeltirsen, gereksiz soyutlama katmanları ve olması imkânsız durumlar için testler birikir.4

Küçük commit'ler

Agent'ın işini küçük commit'lere bölmek, incelemeyi ve geri almayı kolaylaştırır. Bölüm 28'de commit'in bir geri dönüş noktası olduğunu gördün. Agent bir seferde 40 dosyalık tek bir commit üretirse, içinde bir hata varsa bütününü geri almak zorunda kalırsın; her mantıksal adım ayrı bir commit olursa yalnızca bozuk adımı geri alırsın. Bunu AGENTS.md'ye yazabilirsin: "her mantıksal adım için ayrı commit; commit mesajı ne ve neden."

Ben anlamıyorum diye geçme

Diff'te anlamadığın bir satır varsa, bu satırı agent'a sormak meşrudur ve gereklidir: "bu satır ne yapıyor, silsek ne olur, hangi dosyada hangi katta?" Anlamadığın değişikliği birleştirmek, bir sözleşmeyi okumadan imzalamaktır. Satırdaki terim sana yabancıysa sözlüğe bak; hangi bölümde anlatıldığını bulur, oradan geri okursun.

46.6 Agent'ın sınırları: uydurma, bağlam, güvenlik

Agent güçlüdür ve sınırsız değildir. Üç sınır, hepsinin kökü bir sonraki kısımda açılacak LLM'in doğasında yatar; bu yüzden burada yalnızca pratik sonuçlarını söylüyoruz.

Uydurma

Uydurma (hallucination), modelin gerçek olmayan bir şeyi inandırıcı biçimde söylemesidir: var olmayan bir fonksiyon adı, bir kütüphanenin olmayan bir seçeneği, hiç yapılmamış bir testi "geçti" diye bildirmek. Nedeni Kısım III'te (Bölüm 58) açılacak: model "doğru olanı" değil, bağlama göre olası olan devam metnini üretir. Kod dünyasında bunun iyi bir tarafı var: kod çalıştırılabilir, yani uydurmanın çoğu hemen derleyiciye ya da teste takılır. İşte bu yüzden 46.3'te kontrol (test, derleme) vermeyi bu kadar vurguladık: kontrol, uydurmaya karşı en ucuz önlemdir. Zor olan uydurma, hiçbir kontrolün yakalayamayacağı türdür: "bu kütüphane şu hukuki durumu destekler" ya da bir mantık hatası. Orada tek korunma insan incelemesidir.

Anthropic'in yazısı bunu kodlama agent'ları için doğrulayıcı bir biçimde söyler: kod çözümleri otomatik testlerle doğrulanabildiği için agent'lar yinelemeye, test sonuçlarını geri bildirim olarak kullanmaya elverişlidir; ancak otomatik test işlevselliği doğrulasa da, çözümün daha geniş sistem gereksinimleriyle uyumunu sağlamak için insan incelemesi hâlâ şarttır.1 Bu cümle bölümün ortak noktasıdır: test gerekli, yeterli değil.

Bağlam sınırı

Bir agent her adımda yalnızca bağlam penceresi (context window)ne sığan metni "görür": talimat dosyaları, konuşma geçmişi, okuduğu dosyalar, araç çıktıları. Pencere dolunca eski şeyler kaybolur ya da özetlenir. Claude Code belgesi bugünkü durumu şöyle anlatır: güncel modellerin çoğunda çok büyük (1 milyon belirteçlik) pencere vardır ve konuşma pencere dolmadan otomatik özetlenir, dolayısıyla taşma nadirdir; yine de görevler arasında oturumu temizlemek (/clear) iyi bir alışkanlıktır, çünkü odaklı bir bağlam daha iyi cevap verir ve daha ucuzdur.4 Bunun bizim için sonucu: bir oturumda her şeyi yaptırmaya çalışma; küçük, odaklı oturumlar (ve dallar) daha iyi iş çıkarır. Aynı belge, bir şeyi agent'a her oturum yeniden anlatmak yerine talimat dosyasına yazmanı önerir: çünkü agent oturumlar arası hatırlamaz.

Güvenlik

Agent senin adına dosya siler, komut çalıştırır, hatta internete erişebilir. Bu yetki ona verdiğin kadar tehlikelidir. Üç ilke, Bölüm 41'deki güvenlik ilkelerinin agent'a uygulanmış hâlidir. En az yetki (Bölüm 41, 41.5): agent'a yalnızca işi için gereken izni ver; üretim veritabanı parolasını verme, geliştirme ortamında çalıştır. Sırlar repoya girmez (Bölüm 41, 41.5): .env dosyası agent'ın okuyacağı yere değil, bir ayrı yere; AGENTS.md'ye şifre yazılmaz. Yıkıcı işlemler için çatının zorladığı kurallar kullan: Claude Code belgesine göre "şu klasörü asla okuma" ya da "migration klasörüne dokunma" gibi istisnasız kurallar talimat dosyasında değil, çatının uyguladığı bir kural ya da kanca olarak kurulmalıdır; çünkü model bir yönergeyi uygulamamayı seçebilir, çatının kuralı ise her seferinde uygulanır.4 Anthropic'in yazısı da agent'ların kum havuzunda ve korkuluklarla test edilmesini önerir.1

Son olarak kime güvendiğin. Agent'ın internetten okuduğu bir sayfa ya da kurduğu bir kütüphane de senin sistemine girer. Bilmediğin bir paketi agent'ın eklemesine izin vermek, bilmediğin birine evin anahtarını vermek gibidir. Bu yüzden 46.2'deki örnek AGENTS.md'ye "yeni kütüphane eklemeden önce sor" satırını koyduk.

Agent'la çalışmanın kısa ritmi

Bölümü tek bir döngüye bağlayalım. (1) Hazırla: AGENTS.md kısa ve güncel; docs/ ayrıntıyı taşıyor. (2) Tarif et: kapsam, yöntem, kabul ölçütü, kanıt isteği. (3) İzole et: her agent kendi dalında, kendi çalışma ağacında. (4) Oku: diff, test çıktısı, gerekirse bağımsız inceleyici. (5) Birleştir ya da geri çevir: kararı sen verirsin, küçük commit'ler sayesinde geri almak kolaydır. (6) Öğren: agent iki kez aynı hatayı yaparsa, o hatayı AGENTS.md'ye yaz (ya da istisnasızsa çatıya zorlat). Bu döngünün her adımı kitapta daha önce öğrendiğin bir kavrama dayanıyor: Git, test, mimari, güvenlik.

Bu bölümde neler kuruldu

Bir kodlama agent'ı, bir LLM'in araçları (dosya okuma, terminal) çevreden gelen geri bildirimle bir döngü içinde kullanmasıdır; iş akışlarında yolu sen çizersin, agent'ta modelin kendisi seçer. Projenin kurallarını anlatan AGENTS.md düz Markdown'dır, kısa tutulur, yalnızca koddan çıkarılamayan bilgiyi taşır; ayrıntı docs/'a gider; istisnasız kurallar talimat dosyasına değil çatının uyguladığı mekanizmalara bağlanır. İyi görev tarifi kapsamı, yöntemi ve kabul ölçütlerini söyler, geçti/kaldı dönen bir kontrol ve kanıt ister; belirsiz işte önce agent seni sorgulayıp bir şartname yazar. git worktree her agent'a ayrı klasör ve dal verir; aynı dal iki ağaçta açılamaz. Agent'ın işini diff, test ve çalıştırarak incelersin; bağımsız bir inceleyici ve küçük commit'ler yardımcıdır. Sınırlar: uydurma (kontrolle sınırlanır), bağlam penceresi (küçük odaklı oturumlar), güvenlik (en az yetki, sırlar, çatı kuralları).

Terimler sözlükte, Bölüm 46 başlığı altında.

Birincil okuma

Anthropic, Building effective agents, şu başlıklar: What are agents?, When (and when not) to use agents, Agents, Appendix 1: Agents in practice → B. Coding agents. Kısa bir yazı; iş akışı ile agent farkı ve "basit başla" ilkesi bu bölümün omurgasıdır. Derinleşmek için: Claude Code belgeleri, Best practices for Claude Code (Tell Claude what it can't see ve Give Claude a check to run bölümleri), agents.md ve git-worktree kılavuzu (Description ve Examples).

Takıldığın her yeri yapay zekâ öğretmenine sor. Bir öneri: ondan, 45. bölümdeki cevap yolculuğunun Durak 7'si (Postgres işlemi) için bir görev tarifi zayıf biçimde, sonra güçlü biçimde yazmasını iste; sen aradaki farkı kapsam, yöntem, kabul ölçütü ve kanıt başlıklarıyla işaretle.

Bölüm sonu soruları

Kitaba bakmadan cevapla. Kâğıt kalem serbest.

1. Agent ile iş akışı (workflow) arasındaki temel fark nedir?
Anthropic'in tarifine göre iş akışlarında LLM ve araçlar önceden yazılmış kod yollarıyla yönetilir; agent'ta LLM kendi sürecini ve araç kullanımını dinamik olarak yönetir. Bkz. 46.1.
2. AGENTS.md dosyasına en çok neyi yazmak mantıklıdır?
Agent kodu okuyarak çoğunu bulur; dosya yalnızca bulamayacağını (komutlar, tuzaklar, kararlar) taşımalıdır. Dosya kısa kalmalıdır, çünkü her satır her görevde dikkat tüketir. Bkz. 46.2.
3. Hiç istisnası olmaması gereken bir kural ne yapılmalıdır?
Talimat dosyası model için bir yönergedir; model uymamayı seçebilir. İstisnasız kural çatının her seferinde uyguladığı bir kanca ya da yasak kuralı olmalıdır. Bkz. 46.2 ve 46.6.
4. Hangi görev tarifi agent için daha güçlüdür?
Güçlü tarif belirtiyi, yeri ve "bitti"nin nasıl ölçüleceğini (geçen bir test gibi) söyler; böylece agent yönü bilir ve işi kendisi doğrulayabilir. Bkz. 46.3.
5. Aynı dalı iki çalışma ağacında çıkarmaya çalışırsan ne olur?
Denemede Git "main is already used by worktree" hatasını verdi; kılavuz da bunun yalnızca --force ile aşılabileceğini söyler. Bu kural iki agent'ı aynı dala bindirmeni engeller. Bkz. 46.4.
6. Agent'ın diff'ini incelerken ilk bakılacak şey nedir?
Önce kapsam: değişen dosyalar görevle uyumlu mu, alakasız bir yere dokunulmuş mu? Sonra kat ve yasaklar. Özet agent'ın anlatımıdır, diff gerçek değişikliktir. Bkz. 46.5.
7. Bağımsız bir inceleyici neden işe yarar?
Taze bir inceleyici, kodu yazan oturumun akıl yürütmesini görmemiştir ve onun gerekçelerine kapılmaz. Hata aratılırsa her zaman bir şey bulur; bu yüzden kapsam sınırlanır. Bkz. 46.5.
8. Kodlama agent'ında uydurmaya karşı en ucuz önlem nedir?
Kod çalıştırılabildiği için uydurmanın çoğu derleyiciye ya da teste takılır. Kontrol vermek hem agent'ın kendini düzeltmesini hem senin doğrulamanı sağlar. Bkz. 46.3 ve 46.6.
9. Agent'a üretim veritabanı parolası vermek hangi ilkeyi çiğner?
Agent'a yalnızca işi için gereken izin verilmelidir; üretim parolası geliştirme işi için gerekmez ve yıkıcı bir hata riskini büyütür. Bkz. 46.6.
10. Kendi cümlelerinle: bir agent ile bir sohbet penceresi arasındaki farkı, "döngü" kelimesini kullanarak anlat. Bu farkın hem faydası hem riski nedir?
Örnek cevabı göster

Sohbette model yalnızca metin üretir; kodu çalıştırıp sonucu geri yapıştırmak benim işimdir, yani döngünün aracı çalıştırma kısmını ben oynarım. Agent'ta bu döngü otomatiktir: model bir araç çağırır, çatı çalıştırır, sonuç modele döner, model bir sonraki eylemi seçer, görev bitene ya da durdurma koşuluna kadar. Faydası, hatayı görüp kendi başına düzeltebilmesi; riski, yanlış anlaşılmış bir görevde hatanın birikebilmesi ve yetkisi kadar zarar verebilmesidir.

11. "Seri sistemi" görevini iki agent'a aynı anda vermek istiyorsun. Hangi araçla, nasıl bölerek yaparsın? Hangi çatışma türü yine de çıkabilir?
Örnek cevabı göster

Her agent için ayrı bir dal ve ayrı bir çalışma ağacı açarım (git worktree add -b ...), böylece dosyalar karışmaz. İşi ayrık kapsamlara bölerim: biri seri kuralını (scoring modülü), öteki seri göstergesinin ekranını yazar. Yine de iki agent aynı dosyayı ya da aynı fonksiyonu farklı biçimde değiştirirse, dalları birleştirirken çatışma (conflict) çıkar ve birini ben çözerim; bu yüzden kapsamların baştan ayrık olması önemlidir.

Kaynaklar

  1. Anthropic, Building effective agents: iş akışı ve agent ayrımı, genişletilmiş LLM, agent'ın çevreden gerçek zemin alması, durdurma koşulları, özerklik maliyeti ve hataların birikmesi, kodlama agent'ları ve insan incelemesi.
  2. agents.md, AGENTS.md: neden README'den ayrı, zorunlu alan yok, en yakın dosyanın önceliği, iç içe AGENTS.md, SSS bölümü; dosya biçiminin Agentic AI Foundation tarafından yönetilmesi.
  3. OpenAI, Custom instructions with AGENTS.md (Codex belgeleri): genel ve proje kapsamı, kökten aşağı birleştirme, yakın dosyanın geçersiz kılması, 32 KiB varsayılan sınır.
  4. Anthropic, Best practices for Claude Code: belirlenimci ve belirlenimsiz yönergeler, CLAUDE.md'yi kısa tutmak, belirli istem, geçti/kaldı kontrolü ve kanıt isteme, bağımsız inceleyici, paralel oturumlar ve çalışma ağaçları, bağlam penceresi.
  5. Git, git-worktree kılavuzu: ana ve bağlı çalışma ağaçları, add, remove, prune, aynı dalın iki ağaçta çıkarılamaması. Bölümdeki git worktree oturumu geçici bir dizinde gerçekten çalıştırıldı. Oyuncak agent döngüsü bu bölüm için yazıldı ve Python ile çalıştırıldı (gerçek bir model kullanmaz).