# 05 — CEO kararları — 2026-09-21 gece vardiyası (Tur 2) Hazırlayan: CEO ajanı · Girdi: `01`–`04` raporları + kod doğrulaması · Kod/içerik değiştirilmedi, yalnızca bu dosya yazıldı. İşaretler: **[KARAR]** ajan yetkisinde, bu gece uygulanır (yalnız `gece/*` dalında, push/merge yok) · **[BİLAL]** Bilal onayı bekliyor; ben yalnızca tavsiye veriyorum. ## 1. Özet — bu gecenin ve bu haftanın odağı (5 madde) 1. **Sezon dışındayız ve veri yok denecek kadar az** (son 7g 86 oturum; gerçek kullanıcıdan `odeme_baslatildi` = 0; huni adımlarında n < 40). Bu yüzden fiyat, paket, /sonuc→/giris dönüşümü ve katalog köprüsü üzerinde **deney/yeniden tasarım yapmıyoruz**. Bu dönemin işi: ölçümü onarmak, içerik altyapısını düzeltmek, kendi vaadimizi delen metinleri temizlemek. 2. **Bu gece 4 teknik paket + 3 yazı.** Marka raporunun 8 "hemen" işinden yalnızca tartışmasız olanı (olmayan özelliği satan "yerleşme olasılığı" dili + 4/5 yıl tutarsızlığı) yapılıyor; SEO'nun 15 yazısından 3'ü yazılıyor. Geri kalan her şey ya Bilal kararına ya veriye bağlı. 3. **Çelişki çözümü — SEO "15 yeni yazı" diyor, analitik "24 yazının 16'sı ≤7 oturum, 4'ü sıfır; önce nedenini anla" diyor.** Karar: ikisi de haklı. Takvimi kaçmayacak 1 yazı + 2027 adayına (gelecek sezonun müşterisi) dönük 2 yazı yazılır; kalan 12 yazı, Search Console indekslenme verisi gelmeden onaylanmaz. Yeni yazıdan önce altyapı: şema metni botlara görünmüyor ve güncelleme tarihi alanı yok (ikisi de koddan doğrulandı). 4. **Bilal'in bu haftası (~7–10 saat) şu sırayla harcanmalı:** (a) `ek-yerlestirme-sonuclari-ve-kayit` yazısını + rehber altyapı dalını gözden geçirip yayına almak — sonuçlar açıklanmadan, tercihen Çarşamba'ya kadar; (b) 1 saatlik elle işler: DMARC/SPF, magic link tıklama testi, Rybbit ayarları; (c) §4'teki kararlar (30 dk); (d) **ÖSYM 2026 yerleştirme tablolarını indirip repoya koymak** — karne, veri raporu, en değerli rehber yazısının güncellenmesi ve 2027 sezonunun tamamı buna bağlı; ajanlar dosya indiremiyor. 5. **Geri dönüşü zor marka kararlarını (Garanti→Güvenli, YÖK logosu, kurucu kimliği, fiyat kıyası) ben vermiyorum;** ucuz olanları ayrı commit olarak dalda hazırlatıyorum ki Bilal "evet" derse cherry-pick etsin, "hayır" derse atsın. Pahalı olanı (Garanti→Güvenli, ~10 dosya + şema) karar gelmeden hazırlatmıyorum. ### Raporlardaki iddiaların kod doğrulaması | İddia | Sonuç | |---|---| | `use-gorunum-olayi.ts:28-31` ref null iken effect bir daha çalışmıyor; `kaydet-banner.tsx` ve `tadimlik-satiri.tsx` koşullu `return null` yapıyor (01) | **Doğru.** Effect deps `[ad, anahtarEki]`; iki bileşen de ilk render'da null dönüyor. | | `el-cizimi-sema.tsx` mermaid zincirinde `catch` yok; `aria-label` yalnız `svg` dolunca render ediliyor, SSR'da yalnız `aria-hidden` iskelet var (01, 02-T1) | **Doğru** (satır 55-74 ve 85-97). | | `rehber.ts` tırnak regex'i baş/son tırnağı bağımsız siliyor; 2 yazının açıklaması bozuk (02-T2) | **Doğru.** `merkezi-yerlestirme-nasil-calisir.md:3` ve `taban-siralamalar-nasil-degisir.md:3` tırnakla başlayıp tırnakla bitmiyor. | | `guncelleme` alanı / `dateModified` yok; sitemap `lastModified: y.tarih`; "diğer yazılar" = son 4 (02-T3, T4) | **Doğru** (`sitemap.ts`, `seo.tsx` `articleJsonLd`, `rehber-makale.tsx:40-42`). | | "yerleşme olasılığı" vaadi `page.tsx:180`, `paket-satinal.tsx:31`; "yüksek ihtimalle yerleşirsin" `rapor.ts:166` (03) | **Doğru.** Ek: `rapor.ts:168` "orta ihtimalle yerleşilebilir" de aynı sorun. | | "2.000–10.000 TL" ve "onda bir" kıyası (03-G4) | **Doğru ama eksik sayılmış:** `src/app/layout.tsx:55` (site geneli meta description) ve `page.tsx:228` de "onda bir fiyatına" diyor; marka raporunun dosya listesinde yok. | | "Garanti" üç sözlük (03-G1) | **Doğru, aslında dört:** `rapor-yazdir.tsx:13` "Garanti (Güvenli)" ve `meraklisina-demo.tsx:149,207` de var; marka raporunun İŞ-7 dosya listesinde eksik. | | "4 yıl" ↔ "5 yıl" (03-G7) | **Doğru.** DB'de `sira2021…sira2025` = 5 yıl; ana sayfa ve `/paket` "4 yıl" diyor. Doğrusu 5. | | `eposta-gonder.ts` / `auth.ts` prod'da anahtar yoksa konsola yazıp başarı dönüyor; `EMAIL_FROM` sessiz fallback; `Reply-To` yok (04) | **Doğru.** | | `rybbit-identify.tsx:28-31` e-posta+isim trait gönderiyor (01) | **Doğru.** Gizlilik metni yalnızca "ziyaretin hesabınla eşleştirilir" diyor; e-posta/isim/IP'den söz etmiyor. | | `error.tsx`'te ChunkLoadError toparlanması var mı? (01) | **Yok** (dosyada chunk/reload geçmiyor). Tek olay; bu gece kapsam dışı. | | "`content/rehber/` altında 25 yazı" (02-T13) | **Yanlış.** `ls content/rehber \| wc -l` = **24**. Analitik raporundaki 24 doğru. İşlevsel etkisi yok. | | "Katalog köprüsünü değiştirmeden önce CTA tıklama olayı eklenmeli" (01) | **Kısmen gereksiz.** `sira_girildi` zaten `kaynak: hero \| cta \| …` taşıyor (`hero-form.tsx:82`, `cta-sira-form.tsx:105`, `tercih-profili-kapisi.tsx:160`) ve Rybbit pathname'i kaydediyor. Eksik olan payda: CTA formunun *görüntülenmesi*. | | **Yeni bulgu (raporlarda yok):** `el-cizimi-sema.tsx:14-15` yorumu: şema fontu (Sweet Cucumber Mocktail) "kişisel kullanım için ücretsiz — canlıya çıkmadan ticari lisans alınmalı". | Site canlı ve 24 yazıda bu font kullanılıyor. Lisansın alınıp alınmadığı koddan anlaşılamıyor → §5. | --- ## 2. Bu gece yazılacak blog yazıları (3 yazı; 4. slot bilinçli boş) Ortak yazar kuralları **[KARAR]**: - Dal: tek ortak dal `gece/rehber-yazilari`; yalnızca `content/rehber/*.md` değişir, `src/` değişmez (P1 ile çakışmasın). - Frontmatter `tarih: 2026-09-22` (Bilal yayın gününe göre düzeltir). Güncellenen eski yazılara `guncelleme: 2026-09-22` satırı eklenir — P1 bu alanı okuyacak; eski parser'da zararsız (fazla anahtar yok sayılıyor). - 1 `flowchart TD` şema (`%% aria:` zorunlu, `%% altyazi:` önerilir; `hayal`/`uyari`/`garanti` classDef'leri yalnızca iç anahtar, renk her zaman metin etiketiyle) + en az 1 tablo + ilk paragraf tek başına cevap + soru biçimli H2'ler + sonda **"Kaynaklar"** bölümü (resmî URL + erişim tarihi). - **Doğrulama kuralı:** resmî sayfa/PDF bu gece açılıp okunamadıysa o cümle yumuşatılmaz, **yazıdan çıkarılır**; yazar raporuna "doğrulanamadı" diye düşülür. Haber sitesinden tarih/tutar alınmaz. 2027'ye dair hiçbir tarih yazılmaz. - Dil: `03-marka-stratejisi.md` Ek A. "Garanti/kesin/yerleşirsin/olasılık" yok. Dilim adı ilk geçişte **"güvenli tercih (halk arasında 'garanti tercih')"**, sonrasında "güvenli" — H2 kararı ne çıkarsa çıksın uyumlu kalır. - CTA: yazı sonundaki `CtaSiraForm` zaten otomatik. Metin içi ürün linki `/tercih-robotu` olarak kalır (mevcut 24 yazıyla tutarlı; 301 tek sıçrama, GEO T13 landing'i yapılırsa kendiliğinden düzelir — bkz. §6). ### 2.1 `ek-yerlestirme-sonuclari-ve-kayit` — takvim aciliyeti - **Neden:** Ek tercih bu gece 23.59'da bitti; sorgu 7–10 gün içinde zirve yapar ve bir daha gelmez. Sitenin en çok gösterim alan kümesine (`yerlesemedim-ne-yapmaliyim`, 23 oturum / 171 AI gösterimi) eklemleniyor. Ürün bağı zayıf (okuyucu 2026'da tercihi bitirmiş kişi) — değeri tazelik + marka anılması; bu yüzden tek "takvim" yazısı bu. - **Doğrulanacak (resmî):** ÖSYM ek yerleştirme duyurusu `https://www.osym.gov.tr/2026-yks-ek-yerlestirme-icin-tercih-islemleri` (tercih tarihleri 17–21 Eylül, ücret son günü); 2026 Ek Yerleştirme Kılavuzu PDF'i (kayıt süreci, ek yerleşenin sonraki yıl OBP durumu). **Sonuç tarihi açıklanmadı** → "21 Eylül 2026 itibarıyla ÖSYM tarih açıklamadı; sonuç `sonuc.osym.gov.tr`'de yayımlanır" yazılır, tahmin yazılmaz. KYK ek yurt bölümü yalnız `gsb.gov.tr`/`kygm.gsb.gov.tr` sayfası açılabildiyse; yoksa bölüm çıkarılır. - **İç link/CTA:** `/rehber/ek-yerlestirme-2026`, `/rehber/universite-kayit-rehberi-2026`, `/rehber/obp-nedir-nasil-hesaplanir`, `/rehber/yerlesemedim-ne-yapmaliyim`, §2.2 yazısı. Kapanış: "seneye listeyi baştan doğru kur" → `/tercih-robotu`. - **Bu yazarın sahip olduğu ek dosya:** `ek-yerlestirme-2026.md` — "ne zaman?" bölümü geçmiş zamana çevrilir (gerçekleşen tarih yalnız ÖSYM duyurusundan), yeni yazıya link, `guncelleme` satırı. Boş kontenjan rakamı **yazılmaz** (114.808 / 110.053 çelişkisi çözülmedi). ### 2.2 `mezuna-kalmak-mi-kayit-olmak-mi` — 2027 müşterisinin ilk kararı - **Neden:** Mezuna kalan aday = 2027 sezonunun en olası ödeyen kullanıcısı. Karar ağacı formatı rakipte yok; forum ağırlıklı SERP. Dayandığı tek kural (OBP çarpanı 0,12 → 0,06) mevcut yazımızla tutarlı (`obp-nedir-nasil-hesaplanir.md:34`) ve "15–30 puan" rakamı formülden deterministik (not × 5 × 0,06). - **Doğrulanacak (resmî):** 2026-YKS Kılavuzu OBP maddesi — (i) "yerleştirilen" mi "kayıt yaptıran" mı, (ii) kontenjansız açıköğretim istisnası, (iii) kuralın yalnızca izleyen yılda mı uygulandığı. Ek Madde-1 cümlesi: YÖK yatay geçiş yönetmeliği (`mevzuat.gov.tr`) ve mevcut `yerlesemedim-ne-yapmaliyim.md` "Yol 2" ile birebir tutarlı olmalı. Doğrulanamayan alt madde çıkarılır. - **Yazılmayacak:** askerlik/tecil; "psikolojik yük" gibi kaynaksız tablo satırı; "X bin sıra farkı küçüktür/büyüktür" türü uydurma eşik. - **İç link/CTA:** `/rehber/yerlesemedim-ne-yapmaliyim`, `/rehber/yatay-gecis-cap-yandal`, `/rehber/obp-nedir-nasil-hesaplanir`, §2.1 ve §2.3; "hedef bölümünün son 5 yıl tabanına bak" → `/bolumler`. - **Bu yazarın sahip olduğu ek dosyalar:** `yerlesemedim-ne-yapmaliyim.md` ve `obp-nedir-nasil-hesaplanir.md` — yalnızca yeni yazıya birer link + `guncelleme`. (OBP kırılması SSS'si ayrı yazı olmayacak — §6.) ### 2.3 `hedef-siralama-nasil-belirlenir` — ürünle en güçlü bağ, tamamen kendi verimiz - **Neden:** 12. sınıf ve mezunlar Eylül–Kasım'da hedef koyar; AI gösteriminde 1 numaramız olan `kac-siralama-ile-hangi-bolume-girebilirim`'in 2027 ikizi. **Doğrulanabilirliği en yüksek yazı:** tablo `data/yokatlas.db`'den (`programs` + `netler`), salt-okunur `sqlite3` sorgusuyla. Ayrıca iki ölü yazıya (`taban-siralamalar-nasil-degisir`, `taban-puan-mi-siralama-mi`) doğal iç link verir. - **Doğrulanacak:** önce `netler` tablosunun şeması ve anlamı okunur (`src/features/katalog/components/program-netleri.tsx` nasıl sunuyorsa yazı da öyle adlandırır). Tablodaki her rakam sorgu çıktısından; veri yılı açıkça yazılır ("2025 yerleştirmesi; 2026 verisi yüklenince güncellenecek"), kaynak satırı YÖK Atlas. `data/app.db`'ye dokunulmaz; `yokatlas.db`'ye yazılmaz. - **Yazılmayacak:** SEO planındaki "hedef sıra = en sıkı yılın %10–15 üstü" tamponu — üründe böyle bir kural yok, uydurma yöntem olur. Yerine ürünün gerçek kuralı: taban > 1,4 × sıra = güvenli, [sıra, 1,4 × sıra] = dengeli (`src/lib/risk.ts:36-37`, `/meraklisina`). "Bu netle girersin" dili yasak → "2025'te yerleşen son kişinin netleri". - **İç link/CTA:** örnek bölümün `/bolum/` sayfası, `/rehber/kac-siralama-ile-hangi-bolume-girebilirim`, iki ölü yazı, `/meraklisina`; kapanış "deneme sıralamanı gir, hangi dilimde olduğunu gör" → `/tercih-robotu`. - **Bu yazarın sahip olduğu ek dosyalar:** `kac-siralama-ile-hangi-bolume-girebilirim.md`, `taban-siralamalar-nasil-degisir.md`, `taban-puan-mi-siralama-mi.md` — yalnızca yeni yazıya link + `guncelleme`. **Bilal onayı:** üç yazı da dalda kalır. §2.1 ve §2.2 YMYL'ye yakın (resmî kural anlatıyor) → Bilal "Kaynaklar" bölümündeki linkleri açıp kural cümlelerini gözle teyit etmeden yayımlamasın. --- ## 3. Bu gece CTO'ya verilen teknik işler (4 paket, öncelik sıralı) Ortak: her paket kendi worktree + `gece/` dalı; AGENTS.md geçerli (kod yazmadan önce `node_modules/next/dist/docs/`; tarayıcı/dev sunucusu yok); `data/app.db`, `docker-compose.yml`, `docs/geo/geo-raporu.md` dokunulmaz; **şema/DB migrasyonu gerektiren hiçbir iş yok**. Her paket sonunda kendi dalında `pnpm build` (en az `tsc` + lint) geçmeli. Paketlerin dosya kümeleri ayrık tasarlandı; aşağıdaki "sahip olduğu dosyalar" dışına çıkılmaz. Hiçbiri Bilal görmeden merge edilmez; ayrıca işaretlenenler **karar** gerektirir. ### P1 · Rehber altyapısı: şema metni SSR'da, hata toparlama, `guncelleme` alanı - **Dayanak:** 02-T1 (P0), 02-T2, 02-T3, 02-T5, 02-T9; 01-CTO-3 (`getBBox` → sonsuz iskelet). - **Sahip olduğu dosyalar:** `src/features/rehber/components/el-cizimi-sema.tsx`, `src/features/rehber/components/rehber-makale.tsx`, `src/lib/rehber.ts`, `src/app/sitemap.ts`, `src/lib/seo.tsx` (yalnız `articleJsonLd`). - **Kabul kriterleri:** 1. `ariaLabel` metni sunucu HTML'inde **görünür** biçimde var (figcaption altında `
Şemayı metin olarak oku…`); gizli metin yok. Doğrulama: build çıktısındaki bir rehber sayfasının HTML'inde aria cümlesi `grep` ile bulunur. `role="img" aria-label` korunur. 2. `mermaid.render` hata verirse iskelet kalkar, metin alternatifi açık gösterilir; yakalanmamış promise kalmaz. 3. Frontmatter: tırnak yalnızca baş **ve** son aynıysa soyulur; iki etkilenen yazının `aciklama`'sı `"` ile başlar (node ile doğrula). 4. İsteğe bağlı `guncelleme` alanı: sitemap `lastModified = guncelleme ?? tarih`; JSON-LD `dateModified`; OG `modifiedTime`; gövdede görünür `