Nasıl yapılıyor
Bir geliştirici, bir yapay zekâ kodlama asistanı ve makinenin denetlediği bir sürü kural.
Yazan: Nick
Prison Life’ı Claude Code (Anthropic’in kodlama ajanı) ile birlikte yazıyorum. Oyunun ne olduğuna ve hangi seçenekleri izleyeceğimize ben karar veriyorum; yazma işinin çoğunu asistan yapıyor. Kodu benden ve bir inceleme yapay zekâ ajanından başka kimse incelemediği için otomasyona yaslanıyorum: kurallar iyi niyetle değil, otomatik denetimler ve derleme tarafından zorunlu kılınıyor.
Görev devri
Ana Claude Code oturumu işi planlar; görev takipçisini, tasarım kararlarının yazılı kaydını ve değişiklik geçmişini yönetir. Kod yazmaz: her değişikliği, en küçüğünü bile, uzman bir yapay zekâ ajanına devreder. Her birinin, rolünü ve modelini sabitleyen kendi yazılı tanımı vardır.
| Rol | Model seviyesi | Görev |
|---|---|---|
| Mimari | Opus | veri modeli, tick, iş parçacıkları, yol bulma, kararlar |
| Simülasyon kodu | Opus | simülasyon sistemleri, karakter yapay zekâsı, sıcak döngüler |
| Performans | Opus | profilleme, kıyaslama gerilemeleri |
| İnceleme (salt okunur) | Opus | bir diff’i inceler; dosya düzenleyemez |
| İstemci ve araçlar | Sonnet | Godot istemcisi, arayüz, araçlar |
| Testler | Sonnet | kabul ölçütlerinden testler |
| İçerik verisi | Sonnet | şemaya göre JSON tanımları |
| Arama, denetim çalıştırma | Haiku | kod arama; denetimleri çalıştırıp hataları özetleme |
Zor işler en güçlü modele, rutin işler daha ucuz olanlara gider. Daha ucuz bir yapay zekâ ajanı denetimlerden iki kez kalırsa görev bir seviye yukarı çıkar; en üst seviye iki kez başarısız olursa durur ve bana sorar.
Hayır diyen hook’lar
Claude Code hook’ları, asistanın eylemlerinin etrafında çalışan betiklerdir. Benimkiler üç kuralı zorunlu kılar:
- Kırmızıdayken bitirmek yok. Bir oturum ya da yapay zekâ ajanı kodu değiştirdikten sonra durmaya çalıştığında bir hook hızlı denetimi (derleme artı hızlı testler) çalıştırır. Başarısız olursa durma reddedilir.
- Ana oturum kodu düzenleyemez. Bir hook, ana oturumdan kaynak koda, testlere, içeriğe ve araçlara yapılan yazmaları reddeder.
- İnceleyici salt okunurdur. Düzenleme araçları kaldırılmıştır ve bir hook dosyaları ya da proje geçmişini değiştiren komutları reddeder.
Bunlar hatalara karşı korur, kasıtlı atlatmaya karşı değil: kararlı bir kabuk hilesi bunları aşabilir, ve hook’lardan biri bir yapay zekâ ajanındaki kırmızı denetimi görür ama onu durduramaz (ana oturumun durma hook’u yine de yakalar). Bunu açıkça söylemeyi tercih ederim.
Yazılı kararlar ve denetimler
- Önemsiz olmayan her seçim yazıya geçirilir. Görevler, kilometre taşları ve tasarım kararları kodun yanında, bir görev takipçisinde düz metin olarak tutulur. Birden fazla görevi etkileyen seçenekler arasında seçim yaptığımızda, seçim bağlamı ve sonuçlarıyla birlikte yazılır.
- Denetimler benim makinemde çalışır. Bulut CI yok. Tek bir yerel betiğin dört modu var:
fast,test,benchvefull. Betikler ve hook’lar hem Windows’ta hem macOS’ta PowerShell 7 ile yazılı. - Her değişiklikte denetim. Yerel otomasyon kötü açıklanmış ya da kötü biçimlendirilmiş bir değişikliği reddeder. Kod değişikliklerinde hızlı denetimi de çalıştırır; yalnızca notlara ya da web sitesine dokunan değişiklikler derlemeyi atlar.
- Referans dosyaları korunur. Sabitlenmiş determinizm özetleri, altın kayıt dosyaları ve kıyaslama taban çizgisi yalnızca benim açık onayımla değişir, asla sessizce değil.
- Doğruluğun kaynağı projenin kendisidir. Yerel bir bellek aracı, arama için projeyi ve geçmiş konuşmaları dizinler; ama önemli olan her şey aynı zamanda bir görev, kayıtlı bir karar ya da bir belgedir.
Deterministik çekirdek
Simülasyon, hiçbir Godot referansı olmayan sade bir .NET kütüphanesinde yaşar; Godot istemcisi yalnızca durumunu okur ve komut gönderir. Çekirdek sabit kurallara uyar: dünya yalnızca komutlarla değişir, zaman tam sayı tick’lerdir, rastgelelik yalnızca dünyanın tohumlu üreteçlerinden gelir. Aynı tohum ve aynı komut kaydı aynı dünyayı vermelidir. Bu kurallar yalnızca incelemeyle değil, derleyici ve testlerle denetlenir; nasıl olduğu için devlog #1’e, dünya, kayıtlar ve tekrarlar için devlog #2’ye bakın.
- Komutlar tek giriş yoludur. Her birinin sabit bir tür kimliği ve ikili kodlaması vardır, ve reddedilenler dahil her komut sonucuyla birlikte kaydedilir.
- Tick’in sabit sırada üç aşaması vardır. Sistemlerin sırası kodda tek bir yerde belirlenir ve bu sırayı değiştirmek her özeti değiştirir.
- Rastgelelik kendi üreteçlerimizi kullanır (SplitMix64 ve xoshiro256**). Adlandırılmış akışlar dünyanın tohumundan türetilir ve dünya durumunda saklanır. Bir alan, bir anahtar ve tick ile çalışan durumsuz, anahtarlı bir üreteç, sıradan bağımsız işlere hizmet eder.
- Durum özeti, determinizm denetimleri için sıraya duyarlı 64 bitlik bir özettir. Kriptografik değildir.
- Dünya, ayrı katlarda 1×1 m’lik karolardan oluşan bir ızgaradır; duvarlar, kapılar ve zeminler yalnızca inşa komutlarıyla değişir.
- Kayıtlar ve tekrarlar denetlenen tek bir dosya kabını paylaşır. Tekrar, tohum artı komut kaydıdır; yol boyunca kontrol özetleri içerir ve oynatılırken adım adım denetlenir.
- Kıyaslamalar, makine başına bir taban çizgisi ve tick başına sıfır bellek ayırma eşiği olan arayüzsüz bir senaryo çalıştırıcısından gelir.
Tasarım hedefi, saniyede 20 tick ile 1.000’e kadar mahkûm ve çalışandır. Bu bir hedef: henüz karakter yok, yani kıyaslama çalıştırıcısı var ama o ölçekte hiçbir şey ölçülmedi.