AI-Dostu Sandığım Siteyi Denetledim
Bu siteyi "AI-dostu" diye inşa ettim. Semantik HTML vardı, her sayfada JSON-LD vardı,
llms.txt vardı, iki dil hreflang ile bağlıydı. Liste tamamdı.
Sonra oturup tek tek kontrol ettim. Dört iddiadan üçü kısmen yanlıştı.
Bu yazı o denetimin notları: ne kırıktı, nasıl fark ettim, ve neden artık listeye değil build'i düşüren bir kontrole güveniyorum.
Kırık olan: kategori sayfalarında hreflang yoktu
Site iki dilli. Türkçe kökte, İngilizce /en/ altında. Yazılar, ana sayfa, hakkında —
hepsi karşılıklı hreflang taşıyordu.
Kategori sayfaları taşımıyordu. On tane.
Sebep basit ve sinsi: kategori slug'ları iki dilde farklı. yapay-zeka karşılığı ai,
urun-gelistirme karşılığı product-building. Yazılar arasındaki eşleşme frontmatter'daki
bir anahtarla kuruluyordu ama kategoriler için hiç eşleme tanımlanmamıştı. Kod da bunu
sormuyordu: kategori sayfası kendi diline bakıyor, karşı dile hiç bakmıyordu.
Arama motoru açısından sonucu şu: /blog/kategori/yapay-zeka/ ile
/en/blog/category/ai/ aynı şeyin iki dili değil, birbirinden habersiz iki sayfa.
Çözüm kod değil, kayıt oldu — kategorilerin iki dildeki slug'ını, görünen adını ve açıklamasını tutan tek bir kaynak. hreflang oradan kuruluyor artık. Yan fayda: kategori adları sayfalarda ham slug olarak görünüyordu ("urun-gelistirme yazıları"), o da düzeldi.
Kırık olan: JSON-LD'nin yarısı eksikti
JSON-LD "var" durumundaydı. İçine bakınca:
OrganizationbloğundasameAsyoktu. Yani sitede, JUKIPER'i GitHub/GitLab/X hesaplarına bağlayan hiçbir işaret yoktu. Arama motoru bunları ayrı ayrı şeyler olarak görüyordu.BlogPostingbloğundaimageyoktu — oysa her yazının OG kartı zaten build sırasında üretiliyordu. Google'ın makale zengin sonuçlarında beklediği alan boş duruyordu.- Hiçbir sayfada
BreadcrumbListyoktu.
Üçü de "eklemeyi unutmak" kategorisinde. Hiçbiri hata vermiyor, hiçbiri sayfayı bozmuyor. Sadece sessizce eksikler.
Kırık olan: llms.txt sitenin yarısını anlatıyordu
llms.txt, AI ajanlarına siteyi tanıtan düz metin bir harita. Bende vardı ve düzgün
yazılmıştı — ama ana sayfayı, kategorileri ve eğitim serisini hiç listelemiyordu.
Yani ajanın eline verdiğim harita, sitenin omurgasını göstermiyordu. Kategoriler bu blogun omurgası; onları atlayan bir harita eksik harita.
Sürpriz: canlıdaki robots.txt benim yazdığım dosya değildi
Bunu Lighthouse söyledi. SEO puanı 92'de takılıydı ve tek şikâyeti "robots.txt geçersiz: tanınmayan direktif" idi.
Depodaki robots.txt dört satırdı. Canlıdaki otuz satırdan uzundu.
Aradaki farkı Cloudflare koyuyordu: "Managed robots.txt" özelliği kendi bloğunu enjekte
ediyor. İçinde bir içerik sinyali politikası ve GPTBot, ClaudeBot, CCBot, Google-Extended
gibi tarayıcılar için Disallow: / satırları vardı.
Buradaki asıl ders şu: eğitim tarayıcısı ile arama tarayıcısı aynı şey değil. GPTBot OpenAI'ın eğitim tarayıcısı; ChatGPT'nin seni kaynak göstermesini sağlayan OAI-SearchBot. Aynı şekilde ClaudeBot ile Claude-SearchBot, Applebot-Extended ile Applebot ayrı. Engellenen listede yalnızca eğitim tarafı vardı; arama ve alıntı tarafı açıktı. Google'ın kendi belgesi de Google-Extended'ın aramadaki yeri etkilemediğini söylüyor.
Panelin kendi rakamları bunu doğruluyordu: Googlebot ve BingBot istekleri geçmiş, ClaudeBot ve ChatGPT-User sıfırda kalmıştı.
Yani ayar bilinçli kurulsa savunulabilir bir duruştu. Sorun, benim kurmamış olmamdı — varsayılan olarak açıktı ve sitemin ne söylediğini bilmiyordum.
Asıl mesele: liste çürür
Yukarıdaki dördü de bir zamanlar "yapıldı" işaretliydi. hreflang yapılmıştı — kategoriler
sonradan eklendi. JSON-LD yapılmıştı — OG görselleri sonradan geldi, kimse geri dönüp
image alanını eklemedi. llms.txt yazılmıştı — sonra kategoriler ve seri doğdu.
Kontrol listesi bir anın fotoğrafı. Site ise değişiyor. Aradaki fark her commit'te biraz büyüyor ve kimse fark etmiyor, çünkü hiçbiri hata vermiyor.
O yüzden listeyi bıraktım, build'e bir denetim koydum.
Build'i düşüren kontrol
Site üretildikten sonra çalışan bir script şunları doğruluyor:
- Üretilen her sayfa sitemap'te var mı, sitemap'teki her girdi gerçekten üretilmiş mi
- Her sayfanın canonical'ı kendi URL'i mi
- hreflang karşılıklı mı — A sayfası B'yi gösteriyorsa B de A'yı gösteriyor mu, ve x-default doğru dili mi işaret ediyor
- Karşı dilde eşi olmayan bir sayfa varsa: bu bilinçli mi? Script'te açık bir liste var, oraya eklenmeden build geçmiyor
- Her JSON-LD bloğu ayrıştırılabiliyor mu, tipine göre zorunlu alanları taşıyor mu, breadcrumb sırası bozuk mu
- JSON-LD içindeki kendi origin'imize ait her URL çıktıda gerçekten var mı — kırık bir OG görseli yolu buradan yakalanır
llms.txtverobots.txtiçindeki iç linkler var olan sayfalara mı gidiyor
Biri tutmazsa build kırmızı. Deploy yok.
Bir denetimin işe yaradığını, işe yaramadığını görene kadar bilemezsin. O yüzden çıktıyı kasten bozdum: bir sayfadan hreflang sildim, sitemap'te olan bir sayfayı sildim, llms.txt'de bir linki bozdum, JSON-LD'den zorunlu bir alanı çıkardım, breadcrumb sırasını karıştırdım. Altısını da isabetli mesajlarla yakaladı.
Geriye kalan
Bugün: üretilen her sayfa sitemap'te, sitemap'teki her girdi gerçek bir sayfa, her JSON-LD bloğu geçerli. Lighthouse masaüstünde dört kategori de 100.
Ama asıl çıktı bu değil. Asıl çıktı şu: AI-dostu olmak eklediğin bir işaretleme değil, koruduğun bir değişmez. Ekleme bir günlük iş; korumak her build'in işi.
Bir de şu: sitenin canlıda ne söylediğini kontrol et. Depodaki dosyaya bakıp emin olma.