Bir web sitesini yapay zekâya teslim ettim: kafa1milyon'un otonom yayın mimarisi (Bölüm 1) Güray, kafa1milyon.com adlı Türkçe içerik portalının arkasındaki otonom yayın mimarisini belgeliyor. Sistem, bir LLM ajanının kural dosyalarını uzun süreli hafıza olarak kullanarak insan müdahalesi olmadan içerik üretip yayınlamasını sağlıyor. Tasarım, statik HTML ve JSON dosyalarına dayalı şeffaf bir durum yönetimi ile üretim ve yayın hızını ayırıyor. Bu serinin yazarı Güray: AI geliştirmecisi, prompt ve analiz mühendisi. Kodun büyük kısmını bir LLM ajanıyla pair programming yaparak yazıyorum; benim işim mimariyi, protokolleri ve kalite çıtasını tasarlamak. Bu seri, kafa1milyon.com'un perde arkasını mühendis gözüyle belgeliyor. kafa1milyon.com dışarıdan bakınca sıradan bir Türkçe içerik portalı: bilim, tarih, psikoloji yazıları, günlük tarot falı, arkeoloji haberleri, sesli anlatımlar, X ve Instagram'da video fragmanlar. Perde arkasında ise insan müdahalesi olmadan şunları yapan bir sistem çalışıyor: Bu yazı serinin ilki: sistemin genel mimarisi ve en önemli tasarım kararı olan "kural dosyaları = sistemin uzun süreli hafızası" yaklaşımı. Kaba şema şöyle: ┌─────────────────────────────────────────────────────┐ │ LLM AJAN Cursor içinde çalışan agent │ │ - araştırma, yazım, kod üretimi, tarayıcı kontrolü │ └──────────────┬──────────────────────────────────────┘ │ her oturumda okur ┌──────────────▼──────────────────────────────────────┐ │ KURAL DOSYALARI .cursor/rules/ .mdc │ │ yazım stili · SEO protokolü · seslendirme akışı │ │ X/Instagram standardı · tarot formatı · video │ │ standardı · taslak kuyruğu politikası │ └──────────────┬──────────────────────────────────────┘ │ üretir / günceller ┌──────────────▼──────────────────────────────────────┐ │ DURUM dosya tabanlı, git'lenebilir │ │ xpost/queue.json · instagram/queue.json │ │ tarot/gecmis.json · radar/son-tarama.json │ │ taslak-durum.json VPS'te küçük bir API │ └──────────────┬──────────────────────────────────────┘ │ rsync ┌──────────────▼──────────────────────────────────────┐ │ VPS nginx, statik HTML + Cloudflare │ └─────────────────────────────────────────────────────┘ Dikkat çekmek istediğim üç karar var. Sitenin tamamı statik HTML. Kuyruklar, geçmiş kayıtları ve radar çıktıları düz JSON dosyaları. Örneğin sosyal medya kuyruğundaki bir öğe: { "text": "Tıraş ettikçe kıl gürleşir diyorlar.\n\nBilim buna neredeyse yüz yıldır aynı cevabı veriyor.", "url": "https://kafa1milyon.com/yazi/tiras-efsanesi/", "kat": "Bilim", "video": "video-lab/xvideo/elif-tiras-efsanesi.mp4", "hold until": "2026-08-12", "posted": false } hold until alanı sistemin tempo kontrolü: ajan istediği kadar içerik üretebilir ama X'in spam filtresine yakalanmamak için günde 2-3 paylaşım limiti var. Üretim ve yayın birbirinden ayrıştı; üretim hızlı, yayın sabırlı. Bir LLM ajanla çalışırken dosya tabanlı durumun büyük avantajı şu: ajan durumu cat ile okuyabiliyor, python3 - ile güncelleyebiliyor, hata yaptığında diff'ten geri alınabiliyor. ORM'siz, migration'sız, şeffaf. Sistemin asıl "zekâsı" modellerde değil, kural dosyalarında birikiyor. Her .mdc dosyası, yaşanmış bir problemin damıtılmış çözümü. Gerçek bir örnek, yazım stili kuralından: Uzunluk: KISA TUT kullanıcı geri bildirimi, ZORUNLU Yazılar haddinden uzun olunca okur detaylarda boğulup yarıda bırakıyor. - Hedef: 700-1.100 kelime 4-7 dk okuma . - Giriş 2 paragrafı geçmez; ilk cümle doğrudan sahneye/soruya girer. - Aynı iddiayı ikinci örnekle kanıtlama; en güçlü tek örneği seç, gerisini at. Bu satırlar bir prompt değil, protokol . Okur yazıları yarıda bırakınca analiz ettik, kararı verdik, kurala işledik. Artık sistem her yeni yazıda bu dersi hatırlıyor. "Kendi kendine gelişen sistem" derken kastettiğim mekanizma bu: her hata ve her geri bildirim, bir kural dosyası güncellemesine dönüşüyor. Model unutur; dosya unutmaz. Şu an ~10 kural dosyası var: yazım stili, SEO standardı, seslendirme akışı, X paylaşım formatı fragman tarzı, spoiler yasağı , Instagram aynalama, günlük tarot formatı üç kart + "bize ne olacak" bölümü , arkeoloji radarının görsel politikası, sanal sunucu Elif'in sabit karakter tanımı... LLM tabanlı otomasyonda en tehlikeli an, sistemin "bitti" dediği an. Bu yüzden her üretim adımının bir doğrulayıcısı var: segments, info = model.transcribe "elif-clip.mp4", language="tr" soylenen = " ".join s.text for s in segments istenen metinle benzerlik düşükse: RED, yeniden üret Bu döngü bizi en az bir kez kurtardı: model, yeni konu için ürettiğimiz videoda eski bir çekimin kapanış cümlesini söylemişti. Transkript kontrolü olmasaydı yanlış video yayına girecekti. Başta her konu adayı kullanıcı onayı bekliyordu. Bir taslak sayfası, VPS'te minik bir onay API'si {"onayli": , "yazildi": } , seçilenlerin yazılması... Sonra fark ettik ki dar boğaz onay adımının kendisi. Kalite kriterleri zaten kurallarda yazılıysa, süzgeci ajan kendisi işletebilir. Şimdiki model: ajan adayları bulur, kalite/etik süzgecinden geçirir tıbbi tavsiye yok, siyaset yok, zayıf hikâye elenir , uygun olanları kuyruğa alır ve yazar. İnsan istediği an taslak sayfasından kuyruğa öncelik verebilir ama sistemin ilerlemesi insana bağlı değil . İnsan onayı bir kapı olmaktan çıkıp bir yönlendirme sinyaline dönüştü. Bu, prompt mühendisliğinden çok analiz mühendisliği : hangi kararların gerçekten insan yargısı gerektirdiğini, hangilerinin yazılı kritere indirgenebileceğini ayrıştırmak. İndirgenebilen her karar, otonom sistemin bir parçası oluyor. Bu seride pembe tablo çizmeyeceğim; sistemin bugünkü hâli, çöpe giden denemelerin üstünde duruyor: DataTransfer enjeksiyonu gerekti. Bölüm 2'nin konusu. ^~ CORS detayıSorusu olan yorumlara beklerim. Sistemin ürettiklerini görmek isterseniz: kafa1milyon.com https://kafa1milyon.com