EN
← Bloga dön

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:

  • Organization bloğunda sameAs yoktu. 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.
  • BlogPosting bloğunda image yoktu — 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 BreadcrumbList yoktu.

Üçü 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.txt ve robots.txt iç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.