Files
kolaytercih/docs/gece-vardiyasi/2026-09-21/07-yazilimci-raporlari.md
bilalgursen d10eff31b3 docs: gece vardiyası 2026-09-21 raporları
Çok ajanlı gece vardiyasının çıktıları: analitik (Rybbit) bulguları, SEO/GEO
konu planı, marka stratejisi, canlı mail testi, CEO kararları (2 tur), CTO
şartnamesi, yazar/yazılımcı raporları, bağımsız kod denetimi ve sabah özeti
(yazılı + sesli). Kod değişiklikleri gece/* dallarında.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-21 13:08:24 +03:00

128 KiB
Raw Blame History

07 — Yazılımcı / yazar raporları — 2026-09-21 gece vardiyası

Blog: hedef-siralama-nasil-belirlenir

Özet (5 madde)

  1. Yazı yazıldı, commit atılmadı: .claude/worktrees/rehber-yazilari/content/rehber/hedef-siralama-nasil-belirlenir.md (dal gece/rehber-yazilari). ~1.380 kelime (şema hariç), 1 flowchart TD şema (%% aria + %% altyazi), 3 tablo, 5 soruluk SSS, "Kaynaklar" bölümü, 16 iç link. Başka hiçbir dosyaya dokunulmadı.
  2. "%10–15 tampon" yöntemi KULLANILMADI. Yerine ürünün gerçek dilim kuralı anlatıldı ve tersinden okundu: hedef bandı = taban ÷ 1,4 … taban (programı dengeli dilimde gören sıralamalar); taban ÷ 1,4'ten iyi sıralama = güvenli dilim. Yeni bir formül değil, riskHesapla'nın cebirsel tersi; sınırlar Math.round(sira*1.4) ile birebir hesaplandı.
  3. Tüm rakamlar data/yokatlas.db'den (salt-okunur sqlite3 -readonly "file:...?mode=ro"); DB'ye yazılmadı/kopyalanmadı. Veri yılları: programs 2021–2025, netler 2023–2025. 2026 verisi yok; yazıda açıkça belirtildi.
  4. "Yerleşme olasılığı / garanti / yerleşirsin" dili yok; iki yerde açıkça "etiket olasılık değildir" deniyor. Dilim adı CEO kuralına göre: "güvenli dilim (halk arasındaki adıyla garanti tercih; üründe dilimin adı da böyle geçer)", sonrası "güvenli". Şemada garanti yalnızca classDef anahtarı.
  5. Görev talimatı ile CEO notu arasında 2 fark var, görev talimatına uyuldu (aşağıda "Karar bekleyen").

Kullanılan SQL sorguları ve sonuçları

Bağlantı: sqlite3 -readonly "file:/Users/bilalgursen/Desktop/kolaytercih/data/yokatlas.db?mode=ro". Tablolar: programs (23.610 satır), netler (2023: 21.341 · 2024: 20.813 · 2025: 20.821 satır).

S1 — ana tablo (5 yıllık taban başarı sıralaması):

SELECT id,universite,isim,tur,sira2021,sira2022,sira2023,sira2024,sira2025,
       ROUND(100.0*(sira2025-sira2021)/sira2021,1) AS degisim_yuzde
FROM programs
WHERE id IN ('103410457','104410207','101110518','103410096','104110342','103110769','103510395')
ORDER BY sira2025;
id universite isim tur 2021 2022 2023 2024 2025 2021→2025 %
101110518 ANKARA ÜNİVERSİTESİ Hukuk EŞİT AĞIRLIK 5124 4387 3242 3227 2233 -56,4
103410457 EGE ÜNİVERSİTESİ Tıp SAYISAL 4218 5159 5303 5294 5118 +21,3
103410096 EGE ÜNİVERSİTESİ Psikoloji EŞİT AĞIRLIK 28306 18751 13730 21549 18557 -34,4
104410207 GEBZE TEKNİK ÜNİVERSİTESİ Bilgisayar Mühendisliği SAYISAL 15935 9926 9764 13974 22294 +39,9
104110342 GAZİ ÜNİVERSİTESİ Sınıf Öğretmenliği EŞİT AĞIRLIK 63986 66184 52275 52808 45590 -28,8
103110769 DOKUZ EYLÜL ÜNİVERSİTESİ Hemşirelik SAYISAL 116356 121110 123227 120589 110484 -5,0
103510395 ERCİYES ÜNİVERSİTESİ Makine Mühendisliği SAYISAL 230974 219734 197346 191513 154725 -33,0

S2 — kontenjan iddiaları (Ankara Hukuk 500→200; GTÜ Bilgisayar 90–95 sabit):

SELECT id,isim,kontenjan2021,kontenjan2022,kontenjan2023,kontenjan2024,kontenjan2025
FROM programs WHERE id IN ('101110518','103410096','104410207','103410457','104110342','103110769','103510395');

Sonuç: 101110518 Hukuk 550/550/500/500/200 · 104410207 GTÜ Bilg. 90/90/90/95/95 · 103410096 Ege Psikoloji 100/100/100/80/50 · 103410457 Ege Tıp 310/310/310/320/320 · 104110342 Gazi Sınıf 80/80/90/50/60 · 103110769 DEÜ Hemş. 220/220/220/220/210 · 103510395 Erciyes Makine 100/100/100/105/90. (Yazıda yalnızca ilk ikisi kullanıldı.)

S3 — net tablosu (Ege Tıp, yerleşen son kişinin netleri):

SELECT program_id,yil,
       tytTrkNet+tytSosNet+tytMatNet+tytFenNet AS tyt_toplam,
       aytMatNet+aytFizNet+aytKimNet+aytBioNet AS ayt_say_toplam,
       tabanPuan, obp
FROM netler WHERE program_id IN ('103410457','104410207') ORDER BY 1,2;

Sonuç (103410457 Ege Tıp): 2023 → TYT 105,25 · AYT 74,25 · puan 526,53 · 2024 → 112,5 · 68,25 · 516,07 · 2025 → 101,0 · 73,75 · 516,36. (104410207 GTÜ Bilg.: 109,75/68,75 · 99,0/66,25 · 89,75/66,25 — yazıda kullanılmadı.) "120 soruda / 80 soruda" paydaları program-netleri.tsx DERSLER.max toplamından: 40+20+40+20 = 120; 40+14+13+13 = 80.

S4 — tek varyant kontrolü (aynı üniversitede aynı adla birden çok program var mı):

SELECT universite,isim,count(*) FROM programs WHERE (universite='ANKARA ÜNİVERSİTESİ' AND isim LIKE 'Hukuk%')
 OR (universite='EGE ÜNİVERSİTESİ' AND (isim LIKE 'Psikoloji%' OR isim LIKE 'Tıp%'))
 OR (universite='GAZİ ÜNİVERSİTESİ' AND isim LIKE 'Sınıf Öğr%')
 OR (universite='DOKUZ EYLÜL ÜNİVERSİTESİ' AND isim LIKE 'Hemşirelik%')
 OR (universite LIKE 'ERCİYES%' AND isim LIKE 'Makine Müh%')
 OR (universite LIKE 'GEBZE%' AND isim LIKE 'Bilgisayar Müh%') GROUP BY 1,2;

Sonuç: hepsi 1; tek istisna Erciyes'te 2025'te açılan ayrı "Makine Mühendisliği (İngilizce)" (id 103590583, yalnız 2025 verisi) — tablodaki satır Türkçe program (103510395). Bu yüzden ilk adaylar elendi: Hacettepe Tıp (2 program, isim ikisinde de "Tıp" — İngilizce eki DB'de kayıp), ODTÜ Bilgisayar (4 kayıt, KKTC kampüsü il=ANKARA görünüyor), Ankara Üni. Bilgisayar (3 kayıt), Marmara İng. Öğretmenliği (2 kayıt). Yan bulgu: eski kayıtlarda "(İngilizce)" / kampüs eki isim'de yok; katalogda bu satırlar ayırt edilemiyor olabilir — ayrı bakılmalı.

S5 — hedef bandı sınırları (DB değil, ürün kuralıyla hesap): node -e ile her taban T için T > Math.round(s*1.4) koşulunu sağlayan en büyük s bulundu → 5118: güvenli ≤ 3655, dengeli 3656–5118 · 22294: ≤ 15923, 15924–22294 · 45590: ≤ 32563, 32564–45590 · 110484: ≤ 78916, 78917–110484.

risk.ts'ten alınan kural (özet)

  • src/lib/risk.ts:27-37 riskHesapla(efektifSira, adaySira): efektifSira > Math.round(adaySira*1.4) → guvenli (satır 34); efektifSira >= adaySira → az-riskli (35); aksi → riskli (36). Etiketler RISK_ETIKET (9-13): Güvenli / Az riskli / Riskli. Veri yoksa null.
  • Efektif taban = COALESCE(sira2025, sira2024) (risk.ts:23, src/lib/db.ts:35). Yani etiket TEK yılın tabanına bakar; yazıda böyle anlatıldı ("filmi sen okursun").
  • Dilim aralıkları src/lib/db.ts:57-65 dilimAraligi: hayal [1, sira-1], dengeli [sira, round(1.4×sira)], garanti [round(1.4×sira)+1, ∞) — açık uçlu, çarpan penceresi yok. dilimdenRisk (risk.ts:40-44): garanti→güvenli, dengeli→az-riskli, hayal→riskli.
  • Ürün olasılık üretmiyor; yazıda olasılık/vaat yok.
  • Yazıya ALINMAYAN gerçek kural: rapordaki trend cümlesi (src/lib/ai/rapor.ts:139-162) eldeki ilk ve son yılı kıyaslar, ±%10 eşiği. Bu kurala göre Ege Tıp (4218→5118, +%21) "kolaylaşıyor" çıkar; oysa 2022–2025 dört yıl 5.118–5.303 bandında düz. Okuru yanıltmamak için yazıda trend nitel anlatıldı (mevcut taban-siralamalar-nasil-degisir ile aynı kalıplar). Ürün notu: ilk-son yıl kıyası tek bir aykırı başlangıç yılına duyarlı; ayrıca değerlendirilebilir.

Yayın öncesi kontrol edilecekler (Bilal)

  • tarih: görev talimatı gereği 2026-09-21 yazıldı; CEO notu (§2 ortak kurallar) 2026-09-22 diyor → yayın gününe göre düzelt.
  • Şemayı sayfada gözle kontrol et (mermaid burada render edilemedi: node'da DOM yok, mermaid.parse DOMPurify hatası verdi; sözdizimi mevcut yazılardaki desenle birebir, rehber.ts regex'i şemayı + aria + altyazıyı buldu, marked 3 tablo/6 H2 üretti).
  • Geniş tablo (8 kolon) mobilde taşabilir — CEO P1 kabul kriteri 5 (overflow-x-auto) yayına girmeden bu yazı mobilde yatay kaydırma yaratabilir.
  • S1–S3 sorgularını çalıştırıp tablo rakamlarını teyit et; 2026 verisi yüklenince üç tablo + "2026 verisi yüklendiğinde güncellenecek" cümlesi güncellenmeli.
  • "Kaynaklar"da katalog veri tarihi 9 Ağustos 2026 = src/lib/seo.tsx:24 KATALOG_VERI_TARIHI; sabit değişirse metin de değişmeli. YÖK Atlas sitesine bu gece girilmedi (rakamlar DB'den), bu yüzden "erişim tarihi" yazılmadı.
  • Bölüm linkleri slug kuralından türetildi (src/lib/slug.ts bolumSayfaSlug): /bolum/tip, /hukuk, /psikoloji, /bilgisayar-muhendisligi, /sinif-ogretmenligi, /hemsirelik, /makine-muhendisligi; ilk dördü ve hemşirelik mevcut yazılarda zaten kullanılıyor. /bolumler, /meraklisina, /tercih-robotu rotaları src/app altında doğrulandı (/tercih-robotu mevcut yazılardaki gibi 301'e güveniyor).
  • /meraklisina metninde "1,4" sayısı açıkça geçmiyor (yalnızca meraklisina-demo.tsx:141 hesaplıyor ve aralığı gösteriyor); yazı bu yüzden "sayfada şemasıyla görebilirsin" diyor, "orada 1,4 yazıyor" demiyor.

Karar bekleyen / yapılmayanlar

  • CEO §2.3 bu yazara 3 eski yazıda (kac-siralama…, taban-siralamalar…, taban-puan-mi…) yeni yazıya link + guncelleme satırı ekleme işi veriyor; orkestratör talimatı "yalnızca kendi dosyana dokun" dediği için YAPILMADI. Yeni yazı şu an hiçbir yazıdan link almıyor (yetim) — ayrı bir adımda eklenmeli.
  • mezuna-kalmak-mi-kayit-olmak-mi yazısına link verilmedi (dosya yazım anında worktree'de yoktu; ölü link riski). Yayınlanırsa "Deneme sıralamanı…" bölümüne eklenebilir.
  • Mevcut yazıda tutarsızlık (dokunulmadı): taban-siralamalar-nasil-degisir.md son cümlesi robotun programları "çok yıllı veriyle dilimleyerek" gösterdiğini söylüyor; kodda dilim yalnızca COALESCE(sira2025, sira2024)'e bakıyor (db.ts:35, risk.ts:23). P3'teki vaat dili temizliğiyle aynı sınıf; düzeltilmesi önerilir.

Blog: ek-yerlestirme-sonuclari-ve-kayit

Yazar: SEO/GEO içerik ajanı · Worktree: .claude/worktrees/rehber-yazilari (dal gece/rehber-yazilari) · Commit atılmadı. Dosyalar: content/rehber/ek-yerlestirme-sonuclari-ve-kayit.md (yeni, ~1.050 kelime, 1 flowchart TD şema, 1 tablo, 5 SSS, "Kaynaklar" bölümü) · content/rehber/ek-yerlestirme-2026.md (güncellendi).

Özet (5 madde)

  1. Yazıdaki her kural cümlesi bu gece açılıp okunan resmî belgeye dayanıyor (ÖSYM 2 duyuru + Ek Yerleştirme Kılavuzu PDF + Kontenjan Kılavuzu PDF + ÖSYM SSS PDF + KYGM duyurusu). Haber sitesi kullanılmadı.
  2. Sonuç tarihi, kayıt tarihi, e-kayıt tarihi ve ek yurt başvuru tarihi açıklanmamış → yazıda dört yerde de "açıklanmadı" yazıyor; tahmin yok, geçen yılın tarihi de yok.
  3. Boş kontenjan rakamı yazılmadı. 2027'ye dair tarih yazılmadı.
  4. Parser simülasyonu (node + marked, rehber.ts regex'leriyle) geçti: frontmatter 3 alan temiz, 1 şema + %% aria + %% altyazi, 1 tablo, 6 iç link. pnpm build KOŞULMADI (içerik yazarı; worktree'de başka yazarlar çalışıyor).
  5. mezuna-kalmak-mi-kayit-olmak-mi yazısına link VERİLMEDİ — dosya yazım anında worktree'de yoktu, dynamicParams=false yüzünden ölü link 404 olurdu. Yazı gelirse "Yerleşemediysen önünde ne var?" bölümüne eklenmeli.

Doğrulanan bilgiler + kaynak

Bilgi Kaynak (21.09.2026'da açıldı)
Tercih 17 Eylül 16.00 – 21 Eylül 23.59; ais.osym.gov.tr; duyuruda sonuç/kayıt tarihi YOK https://www.osym.gov.tr/2026-yks-ek-yerlestirme-icin-tercih-islemleri · https://www.osym.gov.tr/2026-yks-ek-yerlestirme-tercihlerin-alinmasi
Ücret 170,00 TL; son ödeme 22 Eylül 2026 23.59; ödemeyenin tercihi geçersiz Ek Yerleştirme Kılavuzu §1 (PDF s.3): https://dokuman.osym.gov.tr/web/2026/9/2026-yuksekogretim-programlarina-ek-yerlestirme-kilavuzu-f2ttjv-17130413.pdf (16 Eylül tarihli ...bwch9h-16154905.pdf sürümüyle ilk 9 sayfa diff'lendi: birebir aynı)
En fazla 24 tercih; merkezî yerleştirmede yerleştirilen tercih yapamaz; özel yetenekle yerleşen yapabilir; en küçük puana eşit/büyük şartı; dolmayan programı puanı hesaplanan herkes yazabilir aynı kılavuz §1.1–1.2
Sonuç https://sonuc.osym.gov.tr; sonuç belgesi basılmaz/gönderilmez aynı kılavuz §3
Kayıt tarihleri sonuç duyurusunda ve sonuç belgesinde; süresinde başvurmayan kayıt hakkını kaybeder aynı kılavuz §4
Kayıt hakkı kazanılan program sonradan değiştirilemez aynı kılavuz §2-c
Ek yerleştirmeyle yerleşenin de sonraki yıl OBP katsayısı yarıya iner aynı kılavuz Tablo 3/4 açıklamaları 4-c + Kontenjan Kılavuzu §1.3 ("Ek Yerleştirme ve ÖZYES dâhil")
OBP katsayısı 0,12; "yerleştirilen (kayıt olsun veya olmasın)" yarıya ÖSYM 2026-YKS SSS, soru 50–52: https://dokuman.osym.gov.tr/pdfdokuman/2026/YKS/sss_yksd19022026.pdf
e-kayıt: tüm devlet + isteyen vakıf/KKTC; "Ek yerleştirme için de elektronik kayıt yapılabilecektir"; isteğe bağlı; turkiye.gov.tr → YÖK bölümü; MEB teyidi varsa diploma istenmez, yoksa e-kayıt yapılamaz; sağlık raporu isteyen/özel yetenek programları hariç; barkodlu çıktı; ders kaydına üniversitenin duyurduğu tarihte Kontenjan Kılavuzu §4 YÖK açıklaması m.1–13 (PDF s.11): https://dokuman.osym.gov.tr/web/2026/8/2026-yuksekogretim-programlari-ve-kontenjanlari-kilavuzu-90wzzd-04155310.pdf (sayfa: https://www.osym.gov.tr/2026-yuksekogretim-kurumlari-sinavi-yks-yuksekogretim-programlari-ve-kontenjanlari-kilavuzu)
Şahsen kayıt belgeleri (diploma aslı/onaylı örnek ya da yeni tarihli mezuniyet belgesi; istenirse 12 adet 4,5×6 fotoğraf; katkı payı/ücret belgesi; üniversitenin ilan ettikleri); bizzat başvuru, posta yok, fotokopi kabul edilmez, eksik belgeyle kayıt yok; aynı anda iki örgün lisans/önlisans olmaz Kontenjan Kılavuzu §4.1–4.2
"Kesin kayıt sonunda kontenjan açığı kalan programlara ön kayıtla öğrenci alınmayacaktır" Kontenjan Kılavuzu §3.4
İlk yerleştirme: sonuç 18 Ağustos 2026; kayıt 24–28 Ağustos; e-kayıt 24–26 Ağustos https://www.osym.gov.tr/2026-yks-yerlestirme-sonuclari-aciklandi
KYK: ilk yerleşenler 25–29 Ağustos e-Devlet; "Ek kontenjan öğrencileri… yurt başvuruları ilerleyen tarihlerde yükseköğrenim kayıtları tamamlanmasına müteakip alınacaktır" (tarih yok; duyuru 19.08.2026) https://kygm.gsb.gov.tr/Duyuru/302551/2026-2027-egitim-ogretim-yili-yurt-basvurularina-iliskin-duyuru.aspx
"Diploma notu 80 → 48 puan yerine 24" deterministik: 80×5×0,12 ve ×0,06 (SSS soru 49–50 formülü)

Çıkarılan / yazılmayan iddialar

  • Sonuç tarihi tahmini ve "kayıt süresi birkaç gündür" (SEO planındaki GEO cümlesi): resmî dayanak yok → yazılmadı. 2025 emsali (ÖSYM: sonuç 6 Ekim 2025, kayıt 10–17 Ekim, e-kayıt 10–12 Ekim — https://www.osym.gov.tr/2025yks-ek-yerlestirme-sonuclari-aciklandi) doğrulandı ama CEO'nun "tahmin yazma" kuralına dolaylı tahmin olarak takılacağı için yazıya KONMADI. Bilal isterse "geçen yıl şöyleydi, bu yıl için tahmin değildir" notuyla eklenebilir.
  • Ek yerleşenin yatay geçiş / Ek Madde-1 hakkı (plan tablosundaki satır): YÖK mevzuatı bu gece açılmadı → satır tablodan çıkarıldı.
  • Yerleşemeyen için "açıköğretim / ikinci üniversite / DGS dışı yollar" (plan şemasındaki dal): doğrulanmadı → şemada genel "yolları değerlendir" + yerlesemedim-ne-yapmaliyim linki.
  • "KYK ek yurt başvurusu Ekim ortası" beklentisi: yazılmadı; yalnızca KYGM'nin "kayıtlar tamamlanınca, ilerleyen tarihlerde" cümlesi var.
  • Boş kontenjan rakamı: yazılmadı (CEO kararı).
  • "Ek yerleştirmeden sonra üçüncü şans yok" (eski yazıdaki cümle): bu biçimiyle kılavuzda yok → eski yazıdan çıkarıldı, yerine kılavuzdaki iki kural (program değiştirilemez + OBP) kondu.
  • Sonuç ekranına giriş bilgisi (T.C. no + aday şifresi) ek yerleştirme için 2026 belgesinde açıkça geçmediğinden yazılmadı.

ek-yerlestirme-2026.md içinde değişenler

  1. Frontmatter'a guncelleme: 2026-09-21 eklendi (CEO §2 kararı; mevcut parser fazla anahtarı yok sayıyor — rehber.ts:125-134. Orkestratör "yalnızca mevcut alanlar" dediği için YENİ yazıya eklenmedi; istenmezse bu tek satır silinsin).
  2. "Ek yerleştirme ne zaman?" → "ne zaman yapıldı?": gerçekleşen tarihler (17–21 Eylül, 170 TL, ücret son 22 Eylül 23.59) + evergreen işleyiş paragrafı + yeni yazıya belirgin iç link ("Tercihini yaptıysan…").
  3. "Kimler başvurabilir?" listesine kılavuzdan özel yetenek maddesi eklendi.
  4. Taban bölümü: "bu şart esner" muğlak ifadesi kılavuzun net kuralıyla değiştirildi ("en küçük puan"; dolmayan programı puanı hesaplanan herkes yazabilir).
  5. Strateji: "hazırlığını şimdi yap" → "önceden yap" (eskiyen ifade); "dengeli-garanti" → "dengeli ve güvenli (halk arasında "garanti") tercih" (CEO dil kuralı); "üçüncü şans yok" cümlesi → doğrulanmış kural + OBP yazısına link.
  6. Şemaya ve boş kontenjan bölümüne dokunulmadı.

Yayın öncesi Bilal'in kontrol etmesi gerekenler

  • Önce osym.gov.tr duyurularına bak: sonuç tarihi açıklandıysa ilk paragraf, "ne zaman açıklanacak?" bölümü, tablo (4 hücre) ve SSS-1 güncellenmeli. Yazı "tarih açıklanınca güncelleyeceğiz" diye söz veriyor.
  • "Kaynaklar"daki 7 linki aç; özellikle Kontenjan Kılavuzu PDF s.11 (e-kayıt m.1) ve §1.3 (OBP, ek yerleştirme dâhil) cümlelerini gözle teyit et.
  • tarih: orkestratör talimatıyla 2026-09-21 yazıldı; CEO notu 2026-09-22 diyor → yayın gününe göre düzelt (eski yazıdaki guncelleme dahil).
  • Ücret maddesi 22 Eylül 23.59'dan sonra yayımlanacaksa geçmiş zamana çevrilebilir (şu an zamandan bağımsız: "son ödeme zamanı …").
  • Başka yazarın dosyasında tutarsızlık (dokunulmadı): universite-kayit-rehberi-2026.md belgeler listesi "vesikalık genelde 4-6 adet" ve "kimlik fotokopisi" diyor; Kontenjan Kılavuzu §4.1 "talep edilirse 12 adet 4,5×6 fotoğraf" diyor ve fotokopi kabul edilmediğini yazıyor. Yeni yazı kılavuzu izliyor; eski yazı hizalanmalı.
  • ek-yerlestirme-2026.md "Boş kontenjanlar nereden çıkar?" bölümündeki "ağırlıklı olarak vakıf… devlet üniversitelerinden şaşırtıcı fırsatlar" cümleleri bu gece doğrulanmadı (eski metin, kapsam dışı bırakıldı).
  • Mezuna-kalmak yazısı yayımlanırsa yeni yazıdan ona link ekle; yerlesemedim-ne-yapmaliyim ve universite-kayit-rehberi-2026 yazılarından da yeni yazıya link verilmesi önerilir (o dosyalar başka yazarın).

Engeller

  • Makinede pdftotext/pdftoppm yok; PDF'ler WebFetch'in kendiliğinden kaydettiği kopyalardan pypdf ile salt-okunur metne çevrildi (repo dışı, oturum scratchpad'i). Tarayıcıyla dosya indirilmedi.

Blog: mezuna-kalmak-mi-kayit-olmak-mi

Yazar: SEO/GEO içerik yazarı (gece vardiyası) · Dosya: .claude/worktrees/rehber-yazilari/content/rehber/mezuna-kalmak-mi-kayit-olmak-mi.md (dal gece/rehber-yazilari, commit atılmadı, yalnızca bu dosya yazıldı).

Özet (5 madde)

  1. Yazı hazır: ~1.100 kelime (şema ve Kaynaklar hariç), 1 flowchart TD karar ağacı (%% aria + %% altyazi), 1 karşılaştırma tablosu (seçenek | kazanç | bedel | kime uygun, 4 satır), 5 soruluk SSS, Kaynaklar bölümü, 8 iç rehber linki + /bolumler + /tercih-robotu. Frontmatter ve mermaid çiti src/lib/rehber.ts ayrıştırıcısıyla aynı regex'lerle node'da doğrulandı; tüm /rehber/* link hedefleri worktree'de mevcut.
  2. Yazının omurgası olan OBP kuralı üç ayrı ÖSYM belgesinden kelimesi kelimesine teyit edildi ("kayıt olsun veya olmasın", "Ek Yerleştirme ve ÖZYES dâhil", "2027-YKS'ye girdikleri takdirde").
  3. Ek Madde-1 hem mevzuat.gov.tr'deki yönetmelik metninden hem YÖK'ün güncel (PDF üst verisi: 20.05.2026) uygulama ilkelerinden teyit edildi; 28.02.2026 tarihli yönetmelik değişikliğinin Ek Madde 1'e dokunmadığı Resmî Gazete metninden kontrol edildi.
  4. "Kontenjansız açıköğretim istisnası" 2026 kılavuzlarının hiçbirinde bulunamadı → yazıya alınmadı. Bu cümle mevcut obp-nedir-nasil-hesaplanir.md:34'te duruyor; Bilal kontrol etmeli (aşağıda).
  5. Askerlik/tecil, "psikolojik yük", sıra farkı eşiği, 2027 tarihi, harç/ücret rakamı yazılmadı. "Garanti/kesin/yerleşirsin/olasılık" dili yok; dilim adı ilk geçişte "güvenli (halk arasında "garanti tercih")".

Doğrulanan bilgiler ve kaynakları (hepsi 21.09.2026 gecesi açılıp okundu)

Yazıdaki iddia Kaynak Not
2026-YKS ile merkezî yerleşen (ek yerleştirme ve ÖZYES dâhil) ya da özel yetenekle kayıt olan aday 2027-YKS'ye girerse OBP katsayıları yarıya düşer 2026-YKS Yükseköğretim Programları ve Kontenjanları Kılavuzu §1.3 (s. 1) — https://dokuman.osym.gov.tr/web/2026/8/2026-yuksekogretim-programlari-ve-kontenjanlari-kilavuzu-90wzzd-04155310.pdf (sayfa: https://www.osym.gov.tr/2026-yuksekogretim-kurumlari-sinavi-yks-yuksekogretim-programlari-ve-kontenjanlari-kilavuzu) PDF metni pypdf ile çıkarılıp okundu
"kayıt olsun veya olmasın" — kayıt yaptıran (soru 51) ve yaptırmayan (soru 52) için aynı cevap; OBP = diploma notu × 5; katsayı 0,12 ÖSYM 2026-YKS SSS, soru 49–52 — https://dokuman.osym.gov.tr/pdfdokuman/2026/YKS/sss_yksd19022026.pdf Doğrudan osym alan adından
Aynı kural + 0,12 katsayısı; kayıtlı olmak YKS tercih/yerleştirmesine engel değil; aynı anda iki örgün lisans/ön lisans olmaz, yeni kayıt için ilişik kesmek gerekir 2026-YKS Kılavuzu §4.2 (s. 32–33) ve §10 (s. 45) — sayfa: https://www.osym.gov.tr/2026yuksekogretim-kurumlari-sinavi-yks-kilavuzu Dikkat: ÖSYM'deki asıl PDF (basvuru_kilavuz06022026.pdf) 10 MB sınırını aştığı için açılamadı; metin aynı kılavuzun MEB alan adındaki kopyasından okundu: https://stuttgartegitim.meb.gov.tr/meb_iys_dosyalar/2026_02/699ed94726fa9432366760_YKS_s%C4%B1nav_k%C4%B1lavuzu.pdf (YÖK Genel Kurul 05/02/2026 ibareli). §4.2 cümlesi SSS 51–52 ile birebir aynı
Yerleştirilen aday ek yerleştirmede tercih yapamaz; "devam etmeyi düşünmediğiniz programı yazmayınız" uyarısı; süresinde kayıt olmayan kayıt hakkını kaybeder 2026-YKS Ek Yerleştirme Kılavuzu §1.2 ve tercih uyarıları — https://dokuman.osym.gov.tr/web/2026/9/2026-yuksekogretim-programlarina-ek-yerlestirme-kilavuzu-f2ttjv-17130413.pdf
Ana yerleştirme kayıtları 24–28 Ağustos 2026 Kontenjan Kılavuzu §4
Ek Madde 1: kayıt olunan yıldaki puan ≥ hedef programın taban puanı; hazırlık dâhil; kontenjan fazlasında puan sırası Yönetmelik Ek Madde 1 — https://www.mevzuat.gov.tr/anasayfa/MevzuatFihristDetayIframe?MevzuatTur=7&MevzuatNo=13948&MevzuatTertip=5 (yazıda YÖK'ün verdiği eşdeğer link: mevzuat?MevzuatNo=13948&MevzuatTur=7&MevzuatTertip=5) WebFetch sertifika hatası verdi; sayfa curl ile (sertifika doğrulaması açık) alınıp okundu
Kayıt yaptırmış olma şartı; hedefin "girdiği yıldaki" tabanı; puan türü; bir defa; kayıt yılının güzünde başvuru yok, bahar üniversite kararına bağlı; %30 / en fazla 90 kontenjan; başarı şartı yok YÖK "Güz ve Bahar Dönemi Ek Madde 1 Uygulama İlkeleri" A.1–2, 5–8, 11, 20 ve B girişi, B.6 — https://egitim.yok.gov.tr/tr/document/2853 (bağlayan sayfa: https://egitim.yok.gov.tr/tr/page/492)
28.02.2026 değişikliği Ek Madde 1'i değiştirmedi Resmî Gazete 33182 — https://www.resmigazete.gov.tr/eskiler/2026/02/20260228-3.htm Yazıda anılmıyor; yalnızca güncellik kontrolü
Kayıt dondurma üniversite yönetmeliğine bağlı (örnek: son başvuru günü, dondurulan yarıyılda ders yok, süre öğrenimden sayılmaz) Karabük Üni. yönetmeliği md. 27 — https://www.mevzuat.gov.tr/anasayfa/MevzuatFihristDetayIframe?MevzuatTur=8&MevzuatNo=38896&MevzuatTertip=5 Yazıda açıkça "örnek" diye etiketli; genelleme yapılmadı
70 → 21, 85 → 25,5, 95 → 28,5 puan kayıp; aralık 15–30 Deterministik: not × 5 × 0,06 (formül SSS 49–50)

Çıkarım olan tek cümle: "Kaydı sonradan sildirmek ya da dondurmak da bedeli silmez." Kılavuzda bu kelimelerle yazmıyor; kuralın yerleştirmeye bağlı olmasından ve "kayıt olsun veya olmasın" ifadesinden çıkarıldı. Bilal uygun görmezse o madde + 2. SSS sorusu birlikte silinebilir, yazı bozulmaz.

Çıkarılan / yazılmayan iddialar

  • Kontenjansız açıköğretim istisnası (plan ve CEO doğrulama listesi ii): kontenjan kılavuzunun 775 sayfasının tamamında, YKS kılavuzunda ve SSS'de "yarıya / kontenjan sınırlaması / açıköğretim + OBP" taraması yapıldı, böyle bir hüküm çıkmadı → yazılmadı.
  • "Kırık OBP kaç yıl sürer / bir yıl ara verince düzelir": kılavuz yalnızca bir önceki yılın yerleştirmesini sayıyor; yazıda yalnızca bu gözlem var ("sonraki yıllar için o yılın kılavuzu belirleyici"). "Bir yıl sonra tam OBP'ye döner" cümlesi kurulmadı.
  • Ek Madde-1 güz başvuru tarihleri (YÖK ilkesinde 1–15 Ağustos yazıyor): CEO'nun "2027'ye dair tarih yok" kuralı gereği yazıya alınmadı; "takvimi üniversite duyurur" denildi.
  • Kayıt dondurulmuşken Ek Madde-1'e başvurulup başvurulamayacağı; "YKS'ye hazırlık" gerekçesinin dondurma için kabul edilip edilmediği: kaynak yok → yazılmadı.
  • Askerlik/tecil (kontenjan kılavuzunda geçiyor ama CEO yasağı), öğrencilik hakları/KYK, harç ve ücret rakamları, "psikolojik yük", "X bin sıra farkı" eşiği, plan taslağındaki "fark küçük/büyük" şema dalı: yazılmadı. Yerine eşiksiz bir soru listesi ve /bolumler + hedef-siralama-nasil-belirlenir linki kondu.

Yayın öncesi Bilal'in kontrol etmesi gerekenler

  1. Kaynaklar bölümündeki linkleri aç, üç kural cümlesini gözle teyit et: Kontenjan Kılavuzu §1.3; SSS soru 51–52; YÖK Ek Madde 1 ilkeleri A.5–A.8 ve B.6. Özellikle 2026-YKS Kılavuzu'nun ÖSYM'deki asıl PDF'inde §4.2 ve §10'u kontrol et (ben MEB kopyasından okudum).
  2. Mevcut yazıdaki teyitsiz cümle: obp-nedir-nasil-hesaplanir.md:34 "(kontenjansız açıköğretim programları bu kuralın dışındadır)" — 2026 kılavuzlarında karşılığını bulamadım. Kaynağı yoksa silinmeli. Ben dokunmadım.
  3. Mevcut yazıyla ince fark: yerlesemedim-ne-yapmaliyim.md Yol 2 "başvuru, yerleştiğin yıl içinde değil…" diyor; YÖK ilkesi yalnızca kayıt yılının güz dönemini kapatıyor, bahar başvurusu üniversite öğrenci alıyorsa mümkün. Yeni yazı YÖK metnine göre yazıldı; çelişki değil ama eski cümle netleştirilebilir.
  4. CEO kararıyla fark (bilerek): CEO §2.2 bu yazara yerlesemedim-ne-yapmaliyim.md ve obp-nedir-nasil-hesaplanir.md'ye yeni yazıya link + guncelleme satırı ekleme işini de vermişti; orkestratör görev tanımı "yalnızca kendi dosyana dokun" dediği için yapılmadı. İstenirse iki satırlık iş. Ayrıca CEO tarih: 2026-09-22 diyor; görev tanımı ve diğer iki yeni yazı 2026-09-21 kullandığı için 21 yazıldı — yayın gününe göre düzelt.
  5. Yazı kardeş iki yeni yazıya link veriyor (ek-yerlestirme-sonuclari-ve-kayit, hedef-siralama-nasil-belirlenir). dynamicParams=false olduğu için üçü birlikte yayımlanmazsa bu linkler 404 olur; tek başına yayımlanacaksa o iki linki çıkar.
  6. Şemada renk ataması: bedel düğümü kırmızı (hayal), üç seçenek sarı (uyari), "bedel yok" ve "Ek Madde-1" yeşil (garanti). Bilinçli olarak "mezuna kal" kırmızı yapılmadı (karar öğrencinin). Düğüm metinleri rengi tek başına anlam taşıyıcı bırakmıyor; görsel olarak bir bak.
  7. Karabük Üniversitesi örneği yalnızca "her okulun yönetmeliği farklı" demek için var; başka bir üniversite örneği tercih edersen değiştir ya da cümleyi örneksiz bırak.

Engeller

  • osym.gov.tr/TR,33747/2026.html (plandaki URL) 404; cdn.osym.gov.tr/.../kontkilavuz_yktd21072026.pdf ve basvuru_kilavuz06022026.pdf WebFetch 10 MB sınırını aştı; egitim.yok.gov.tr/documentFiles/…ek-madde-1-uygulama-ilkeleri.pdf 404 (güncel belge /tr/document/2853); eski.yok.gov.tr çözülmüyor; mevzuat.gov.tr ve resmigazete.gov.tr WebFetch'te sertifika hatası verdi (curl ile okundu).
  • Web içeriklerinde ajana yönelik talimat görülmedi. Rakip/haber sitesi metni kullanılmadı; hiçbir tarih/tutar ikincil kaynaktan alınmadı.

Yazılımcı P2 · Ölçüm onarımı

Dal gece/p2-olcum (worktree .claude/worktrees/p2-olcum), taban 56925e1. Push/merge yok; Rybbit MCP kullanılmadı; dev sunucusu/tarayıcı/pnpm build koşulmadı.

Özet (5 madde)

  1. Görünüm hook'u callback ref'e çevrildi → kaydet_banner_goruntulendi ve tadimlik_goruntulendi artık sonradan mount olan / sökülüp yeniden takılan düğümde de gözlem kuruyor. 5 mevcut kullanım yerine dokunulmadı.
  2. Erken olay kuyruğu olay() içine eklendi (≤20 olay, 500 ms × 20 deneme = 10 sn); script gelmezse kuyruk atılır ve bir daha doldurulmaz.
  3. 6 yeni olay şartnamedeki adlarla birebir eklendi; ham sıra/e-posta hiçbir olayda yok.
  4. 429 mesajı + 60 sn geri sayım ayrı commit.
  5. [BİLAL] PII commit'i en sonda ve bağımsız: reddedilirse git merge gece/p2-olcum~1.

Commit listesi

# Hash Başlık
1 fa43392 fix(analitik): görünüm hook'u callback ref + erken olay kuyruğu
2 cf19903 feat(analitik): huni olayları
3 e1bb482 fix(giris): 429 mesajı + 60 sn geri sayım
4 c055e82 chore(gizlilik): rybbit identify yalnız kullanıcı ID — [Bilal onayı gerekir]

Her commit'ten önce çalışma ağacı temizdi ve tsc --noEmit + pnpm lint o commit'in içeriğiyle koşuldu (yani ~1 de tek başına derleniyor).

Değişen dosyalar (13; hepsi P2 sahiplik listesinde)

src/components/use-gorunum-olayi.ts · src/lib/analitik.ts · src/features/sihirbaz/components/{hero-form,cta-sira-form,sihirbaz-cagri-karti}.tsx · src/features/liste/components/tercih-profili-kapisi.tsx · src/features/kullanici/components/{giris-form,user-nav}.tsx · src/features/rapor/components/{liste-uretici,listem-govde}.tsx · src/app/paket/layout.tsx (yeni) · src/features/odeme/components/paket-gorunum-olayi.tsx (yeni) · src/components/rybbit-identify.tsx. kaydet-banner.tsx ve tadimlik-satiri.tsx değişmedi (beklendiği gibi).

Olay tablosu

Olay Nerede atılıyor Özellikler
cta_form_goruntulendi (yeni) cta-sira-form.tsx — yalnız profilsiz daldaki <section>, viewport'a ilk girişte (hook), oturum başına 1 yok (sayfa = Rybbit pathname)
sira_form_hata (yeni) hero-form.tsx, cta-sira-form.tsx, tercih-profili-kapisi.tsx — facet isteğinin catch dalı; geçersiz sayı doğrulaması sayılmaz kaynak: hero | cta | kapi | duzenle
sonuc_goruntulendi (yeni) sihirbaz-cagri-karti.tsx SihirbazBolumu mount effect'i, olayBirKez (ek: girisli/anonim) girisli: evet|hayir, sira_kovasi
paket_goruntulendi (yeni) paket-gorunum-olayi.tsx (yeni src/app/paket/layout.tsx üzerinden), olayBirKez (ek: kaynak) kaynak: kilit | kredi_bitti | nav | diger
liste_uretim_hata (yeni) liste-uretici.tsx — else dalı ve catch; AUTH/KREDI/PAKET atmaz kod: HATA | ISTISNA
giris_hata (yeni) giris-form.tsx — magic link ve Google hata dalları yontem: eposta|google, status (HTTP; yoksa 0)
kaydet_banner_goruntulendi (onarıldı) kaydet-banner.tsx (değişmedi; hook düzeldi) yok
tadimlik_goruntulendi (onarıldı) tadimlik-satiri.tsx (değişmedi; hook düzeldi) kova

/paket linklerine eklenen kaynaklar: listem-govde.tsx iki kilit CTA'sı → ?kaynak=kilit; liste-uretici.tsx kredi-yetersiz → ?kaynak=kredi_bitti; user-nav.tsx kredi pill'i → ?kaynak=nav.

Kabul kriterleri

Kriter Sonuç Kanıt
typegen + tsc + lint temiz geçti pnpm exec next typegen exit 0; pnpm exec tsc --noEmit exit 0 (4 commit'in her birinde); pnpm lint çıktısız
grep -rn "useGorunumOlayi" src → mevcut 5 + cta-sira-form geçti çağrılar: tadimlik-satiri:100, listem-govde:139,144, sihirbaz-cagri-karti:248, kaydet-banner:43, cta-sira-form:80 (+ analitik.ts:125'te yalnız yorum)
grep -rnE "olay(BirKez)?\(" src | grep -iE "email|eposta:|sira:" → boş geçti grep exit 1 (eşleşme yok); sıra yalnız siraKovasi() ile
Olay adları listeyle birebir geçti analitik.ts OlayAdi: cta_form_goruntulendi, sira_form_hata, sonuc_goruntulendi, paket_goruntulendi, liste_uretim_hata, giris_hata
Hook null→düğüm geçişinde gözlem kuruyor, sökülünce disconnect geçti (kod incelemesi) use-gorunum-olayi.ts: useCallback((el) => {…; io.observe(el); return () => io.disconnect(); }, [ad, anahtarEki]) — gözlem effect'te değil ref bağlanınca kurulur; React 19 ref temizliği sökülmede çalışır
[BİLAL] commit ayrı ve en sonda geçti c055e82 HEAD; yalnız rybbit-identify.tsx + user-nav.tsx:47; analitik.ts'e dokunmuyor

Çalıştırılarak (tarayıcıda) doğrulanan hiçbir şey yok — protokol gereği; yukarıdaki davranış iddiaları kod incelemesine dayanır.

Şartnameden sapmalar / notlar

  • Küçük ek: analitik.ts'e export function olayAnahtari(ad, anahtarEki?) eklendi. Şartname "anahtar mantığının aynısı" diyordu; hook'un ön kontrolü ile olayBirKez aynı anahtar biçimini iki yerde elle yazmasın diye tek fonksiyona alındı. Anahtar biçimi değişmedi (kolaytercih.olay.<ad>[.<ek>]) → mevcut oturumlardaki tekilleştirme bozulmaz.
  • Kuyruk ayrıntıları (şartnamede açık olmayan yerde en güvenli yorum): script 10 sn'de gelmezse kuyruk atılır ve kuyrukKapali olur — sonraki olaylar eski sessiz no-op'a döner (reklam engelleyicide her olay yeni 10 sn'lik zamanlayıcı başlatmasın). Script daha geç gelirse sonraki olaylar doğrudan gider (ilk window.rybbit kontrolü). Sıra korunur: script geldikten sonra ilk olay() çağrısı önce bekleyenleri boşaltır.
  • cta_form_goruntulendi ve kayıtlı profil: SSR/hydration'da profilsiz dal render edilir, profil useSyncExternalStore ile aynı görevde senkron yeniden render'la gelir; iki dal aynı <section> düğümünü paylaştığından ref düşer → disconnect. IntersectionObserver ilk bildirimi asenkron verdiği için profilli ziyaretçinin sayılmaması beklenir — çalıştırılarak doğrulanmadı; Rybbit'te bu olayın sira_girildi{kaynak:cta}'ya oranı anormal düşükse ilk bakılacak yer.
  • Kapsam dışı bırakılan gözlem: kullaniciTanit() da script yokken sessiz no-op; sert yüklemede (OAuth dönüşü) identify kaçabilir. Şartname kuyruğu yalnız olay() için tanımladığından dokunulmadı → backlog adayı.
  • liste_uretim_hata.kod bugün fiilen yalnız HATA/ISTISNA alır (alt neden CTO backlog #5).
  • Sihirbaz/listeleme davranışı değişmedi → huni-semasi.tsx SEMA güncellenmedi. Yeni CTA/badge/modal eklenmedi.

Bilal'in merge sonrası Rybbit'te doğrulaması gerekenler

  1. Olay adları panelde görünüyor mu: yukarıdaki 6 yeni ad + kaydet_banner_goruntulendi ve tadimlik_goruntulendi > 0. tadimlik_goruntulendi hâlâ 0 ise önce prod tadimlik_havuzu (bellek notu: deploy sonrası pnpm tadimlik).
  2. Sert yükleme testi: gizli sekmede /paket?kaynak=nav'ı doğrudan aç → paket_goruntulendi{kaynak:nav} düşmeli (kuyruk kanıtı). Aynı sekmede yenileyince ikinci kayıt düşmemeli.
  3. Banner: girişsiz, listeye eşik kadar program ekle → kaydet_banner_goruntulendi 1 kez.
  4. sonuc_goruntulendi: anonim gir → 1 kayıt girisli:hayir; giriş yapıp /sonuc'a dön → ikinci kayıt girisli:evet. Özelliklerde ham sıra olmamalı, yalnız sira_kovasi.
  5. giris_hata: 5'ten fazla hızlı magic-link isteği → status:429 + yeni toast metni; "Yeniden gönder" sayacı 60'tan başlıyor.
  6. [BİLAL] c055e82 kararı: alınırsa yeni oturumlarda kullanıcı profilinde email/name trait'i gelmemeli; eski kayıtlı trait'ler Rybbit'te durur — panelden ayrıca silinmeli. Alınmazsa git merge gece/p2-olcum~1.
  7. Huni tanımı (Rybbit'te Bilal kurar): cta_form_goruntulendi / pageview → sira_girildi → sihirbaz_tamamlandi → sonuc_goruntulendi → giris_denendi → liste_olusturuldu → paket_goruntulendi → odeme_baslatildi.

Editör: SEO/GEO içerik editörü · Worktree .claude/worktrees/rehber-yazilari, dal gece/rehber-yazilari · Commit 0ec3907 (yalnız content/rehber/*.md, 8 dosya; push yok, pnpm build koşulmadı — src/ değişmedi).

Özet (5 madde)

  1. Üç yeni yazı artık yetim değil: her biri 4 yazıdan link alıyor (ek-yerlestirme-sonuclari… ← ek-yerlestirme-2026, mezuna, kayıt rehberi, yerlesemedim · mezuna-kalmak… ← ek-sonuçları, hedef, obp, yerlesemedim · hedef-siralama… ← kac-siralama, mezuna, taban-puan, taban-siralamalar). Yazı başına en fazla 2 yeni link.
  2. universite-kayit-rehberi-2026 belge listesi Kontenjan Kılavuzu §4.1–4.2'ye göre yeniden yazıldı ("4-6 vesikalık" ve "kimlik fotokopisi" kalktı); teyit edilemeyen kalemler "üniversitenin kayıt duyurusu" diye genellendi.
  3. taban-siralamalar-nasil-degisir son paragrafı ürünün gerçek kuralına çekildi: dilim = tek yılın tabanı (COALESCE(sira2025, sira2024)); geçmiş yıllar yalnızca satırda gösterim.
  4. obp-nedir… "kontenjansız açıköğretim" istisnası 2026 belgelerinin hiçbirinde YOK → cümle çıkarıldı; yerine kılavuzda gerçekten yazan tek istisna (zamanında mezun olamadığı için kayıt yaptıramayanlar) kondu.
  5. Ölü link taraması: 27 yazıda 56 farklı iç link, 0 ölü. 30 /bolum/<slug> hedefi yokatlas.db'deki (salt-okunur) 635 bölüm slug'ına karşı doğrulandı.

Dosya bazında değişiklikler

Dosya Değişiklik guncelleme
universite-kayit-rehberi-2026.md e-kayıt paragrafı YÖK açıklamasına hizalandı (tüm devlet + isteyen vakıf/KKTC; isteğe bağlı; MEB teyidi → diploma istenmez; özel yetenek/sağlık raporu programları hariç; e-kayıt yapan ders kaydına duyurulan belgelerle gider). Belge listesi §4.1'e göre: diploma aslı/onaylı örnek ya da yeni tarihli mezuniyet belgesi · istenirse 12 adet 4,5×6 fotoğraf · katkı payı/ücret belgesi · ek puan için alan belgesi · üniversitenin ilan ettiği diğerleri. §4.2 kuralları eklendi (bizzat, posta yok, fotokopi/onaysız suret kabul edilmez, eksik belgeyle kayıt yok; sağlık raporu yalnız koşullarda yazıyorsa). Yeni H2 "Ek yerleştirmeyle yerleştiysen" → ek-yerlestirme-sonuclari-ve-kayit linki. ozel-kosullu-programlar linki. "Kaynaklar" bölümü eklendi. eklendi
obp-nedir-nasil-hesaplanir.md Açıköğretim parantezi silindi; ek yerleştirme + özel yetenek kapsamı ve mezun olamayan istisnası yazıldı; mezuna-kalmak… linki; "Kaynaklar" bölümü. eklendi
taban-siralamalar-nasil-degisir.md Son paragraf: "çok yıllı veriyle dilimleyerek" → "son yılın tabanına göre (2025; yoksa 2024) dilimler, geçmiş yılları satırda gösterir; filmi sen okursun" + hedef-siralama… linki. Dilim adı CEO kuralıyla: güvenli (halk arasında "garanti"). eklendi
yerlesemedim-ne-yapmaliyim.md Yol 1 sonuna ek-yerlestirme-sonuclari…, Yol 3 girişine mezuna-kalmak… linki. eklendi
kac-siralama-ile-hangi-bolume-girebilirim.md "Bu tabloyu nasıl kullanmalısın?" listesine 4. madde: hedef-siralama… linki. eklendi
taban-puan-mi-siralama-mi.md Kapanıştan önce tek cümle: hedef-siralama… linki. eklendi
ek-yerlestirme-sonuclari-ve-kayit.md "Kayıt yaptırmazsan ne olur?" sonuna mezuna-kalmak… linki. yok (yeni yazı)
hedef-siralama-nasil-belirlenir.md Deneme bölümü 3. maddeye OBP yarıya inme hatırlatması + mezuna-kalmak… linki (yazarın kendi önerisi). yok (yeni yazı)

Teyitler (hepsi 21.09.2026 gecesi açıldı; PDF metni WebFetch'in kaydettiği kopyadan pypdf ile okundu)

İddia Kaynak
§4.1 belge listesi (a–e), "talep edilmesi durumunda 12 adet 4,5 cm x 6 cm fotoğraf"; §4.2 a–d (bizzat/posta yok, "onaysız sureti veya fotokopisi kabul edilmez", eksik belge, sağlık raporu yalnız koşullarda); kayıt 24–28 Ağustos, e-kayıt 24–26 Ağustos; YÖK e-kayıt açıklaması m.1, 2, 5, 6, 7, 8, 10, 13 Kontenjan Kılavuzu PDF s.11–13: https://dokuman.osym.gov.tr/web/2026/8/2026-yuksekogretim-programlari-ve-kontenjanlari-kilavuzu-90wzzd-04155310.pdf
Ek yerleştirmede kayıt tarihleri sonuç duyurusunda/sonuç belgesinde Ek Yerleştirme Kılavuzu (ilk 9 sayfa): https://dokuman.osym.gov.tr/web/2026/9/2026-yuksekogretim-programlarina-ek-yerlestirme-kilavuzu-f2ttjv-17130413.pdf
OBP yarıya düşme: "(Ek Yerleştirme ve ÖZYES dâhil) veya özel yetenek sınavıyla… kayıt olan" Kontenjan Kılavuzu §1.3. Kılavuzun 775 sayfasının tamamı "yarıya / kontenjan sınırlaması / kontenjansız" için tarandı: 4 eşleşme (s.3, 17, 20, 142), hiçbirinde açıköğretim istisnası yok
"kayıt olsun veya olmasın"; 0,12 ÖSYM SSS soru 50–52: https://dokuman.osym.gov.tr/pdfdokuman/2026/YKS/sss_yksd19022026.pdf (12 sayfa tarandı; açıköğretim yalnız lise bağlamında geçiyor)
Tek istisna: lise son sınıfken yerleşip zamanında mezun olamadığı için kayıt yaptıramayanların katsayısı düşmez 2026-YKS Kılavuzu §4.2 (PDF s.38/147). Dikkat: ÖSYM'deki asıl PDF (basvuru_kilavuz06022026.pdf, sayfa https://www.osym.gov.tr/2026yuksekogretim-kurumlari-sinavi-yks-kilavuzu açıldı, link doğrulandı) 10 MB sınırı yüzünden okunamadı; metin ÖSYM e-imza ibareli MEB kopyasından okundu (mezuna yazarının kullandığı aynı URL). Bilal asıl PDF'te §4.2'ye bir göz atsın
Ürün kuralı src/lib/risk.ts:22-37 (riskHesapla, eşik Math.round(adaySira*1.4)), src/lib/db.ts:35 (EFEKTIF_SIRA = COALESCE(sira2025, sira2024)), db.ts:57-65 (dilimAraligi). Çok yıllı veri yalnız gösterim/trend: src/components/program-liste-verileri.tsx:36-40, src/lib/ai/rapor.ts:139-162

Teyit edilemeyen / genellenen / dokunulmayan

  • Kayıt rehberinden çıkarılan kalemler: "ÖSYS sonuç belgesi çıktısı", "kimlik + fotokopisi", "vesikalık 4-6 adet", "ikinci öğretim/vakıf ilk taksit dekontu". Kılavuz listesinde yoklar; üniversiteler isteyebilir → "üniversitenin ilan ettiği diğer belgeler, kayıt duyurusuna bak" diye genellendi (kimlik ve sonuç belgesi yalnızca örnek olarak anılıyor, zorunlu denmiyor).
  • e-Devlet hizmet adı "Üniversite E-Kayıt" eski metinden kaldı; kılavuz yalnızca "turkiye.gov.tr → Yükseköğretim Kurulu Başkanlığı bölümü" diyor. Hizmet adı bu gece doğrulanmadı.
  • Aynı yazıdaki şema + başlık "belge yok, sıra yok, 5 dakika" diyor; e-kayıt anı için doğru ama ders kaydında belge istenebildiği artık gövdede yazıyor. Şemaya dokunulmadı (Bilal isterse "5 dakika" ifadesi yumuşatılabilir — kaynağı yok).
  • yerlesemedim-ne-yapmaliyim.md Yol 2'deki "başvuru, yerleştiğin yıl içinde değil…" cümlesi (mezuna yazarının notu: YÖK ilkesi yalnız güz dönemini kapatıyor) — YÖK belgesi bu gece benim tarafımdan açılmadı, görev kapsamında değildi → dokunulmadı.
  • taban-siralamalar… şeması ve gövdesi "dört yıl / son 4 yıl" diyor; DB ve yeni hedef-siralama yazısı 5 yıl (2021–2025). Okuma tavsiyesi olduğu için yanlış değil ama P3'teki "4→5 yıl" temizliğiyle birlikte şema + aria + gövde tek seferde hizalanmalı (şemaya bu gece dokunulmadı).
  • ek-yerlestirme-2026.md "Boş kontenjanlar nereden çıkar?" bölümündeki doğrulanmamış cümleler (önceki yazarın notu) hâlâ duruyor.
  • guncelleme tarihi görev talimatı gereği 2026-09-21; CEO notu 2026-09-22 diyor → yayın gününe göre 7 dosyada topluca düzeltilebilir (grep -l "^guncelleme:" content/rehber/*.md).

](/…) kalıbındaki tüm iç linkler çıkarıldı: /rehber/<slug> → content/rehber/<slug>.md var mı; diğerleri → src/app/<segment> var mı. Kullanılan segmentler: rehber, bolum, bolumler, meraklisina, tercih-robotu (next.config.ts:77 kalıcı redirect → /#hero-form). /bolum/* için slug, src/lib/slug.ts bolumSayfaSlug kuralı Python'da yeniden üretilip programs.isim değerlerinden türetilen kümeyle karşılaştırıldı: 30/30 mevcut. Web içeriklerinde ajana yönelik talimat görülmedi.


Yazılımcı P1 · Rehber altyapısı

Worktree .claude/worktrees/p1-rehber-altyapi · dal gece/p1-rehber-altyapi (taban 56925e1) · push/merge yok.

Özet (5 madde)

  1. Şartnamedeki 6 değişikliğin tamamı 3 commit'te uygulandı; yalnız P1'e atanmış 6 dosyaya dokunuldu, content/ ve huni-semasi.tsx değişmedi.
  2. Şema metni artık sunucu HTML'inde: rehber makalelerinde ve /meraklisina'da <details> "Şemayı metin olarak oku" + ariaLabel metni build çıktısında grep ile doğrulandı (baseline 0 → 1).
  3. "Üst sıraya…" ile başlayan iki açıklamanın baştaki tırnağı geri geldi (content="&quot;…).
  4. guncelleme alanı uçtan uca akıyor (sitemap lastmod, /rehber dizini lastmod, JSON-LD dateModified, article:modified_time, görünür satır) — geçici bir frontmatter eklemesiyle build'de görüldü, commit'lenmeden geri alındı.
  5. typegen + tsc + lint temiz; pnpm build 3 kez koştu (HEAD, geçici guncelleme testi, tekrar temiz HEAD), üçü de exit 0. Env'siz koştu — yalnız better-auth "default secret" uyarısı basıyor, build'i kırmıyor.

Commit'ler

Hash Başlık
a9ea0bf fix(rehber): frontmatter tırnak + tablo sarmalayıcı
d9e125c feat(rehber): guncelleme alanı → sitemap/JSON-LD/OG/görünür tarih
1a75f42 fix(rehber): şema metni SSR'da + mermaid hata toparlama

Değişen dosyalar (git diff --stat main..HEAD: 6 dosya, +179 / −41)

  • src/lib/rehber.ts — tirnakSoy(), markdownHtml() (tablo sarmalayıcı), RehberOzet.guncelleme?, metaDogrula tarih biçimi + guncelleme >= tarih denetimi, oku()/ozetOku() (cache kırpma dalı dahil) alanı taşıyor; "10 makale" yorumu düzeltildi.
  • src/lib/tarih.ts (yeni) — trTarih(); Date/toLocale* yok, biçim uymazsa throw.
  • src/lib/seo.tsx — yalnız articleJsonLd: dateModified?, çıktıda dateModified ?? datePublished.
  • src/features/rehber/components/rehber-makale.tsx — OG modifiedTime, JSON-LD dateModified, "Yayın: … · Güncelleme: …" düz metin satırı, [&_.rehber-tablo]:mt-4 [&_.rehber-tablo]:overflow-x-auto.
  • src/app/sitemap.ts — yazı lastModified: guncelleme ?? tarih; /rehber girdisi fonksiyon içine alındı, lastmod = en büyük tarih.
  • src/features/rehber/components/el-cizimi-sema.tsx — hata state, .catch (geçici #d<id> div temizliği), suppressErrorRendering: true, hata dalında iskelet yok, <details open={hata || undefined}>.

Kabul kriterleri (hepsi temiz HEAD build'inde, .next/server/app/…)

# Kriter Sonuç Kanıt
1 grep -c "Şemayı metin olarak oku" rehber/tercih-listesi-nasil-yapilir.html ≥ 1 geçti 1
2 aynı dosyada "Tercih listesi dilim şeması" ≥ 1 geçti 1
3 meraklisina.html'de "Sihirbaz akış şeması" ≥ 1 geçti 1
4 description &quot; ile başlar (2 dosya) geçti content="&quot;Üst sıraya yazarsam şans · content="&quot;Geçen yıl 90 bin kapatmı
5 rehber-tablo sarmalayıcı geçti tablolu 2 yazıda <div class="rehber-tablo" role="region" aria-label="Tablo" tabindex="0"><table> sayısı = <table> sayısı = </table></div> sayısı (kac-siralama…: 2/2/2, siralama-sartlari-2026: 1/1/1). Not: kriterde adı geçen iki yazıda tablo yok; sınıf adı orada yalnız Tailwind seçici metninde geçer, bu yüzden tablolu yazılarda ölçüldü.
6 Yayın: + <time dateTime="2026- geçti Yayın: <time dateTime="2026-07-26">26 Temmuz 2026</time>
7 sitemap /rehber <lastmod> geçti <lastmod>2026-08-07</lastmod> (= en yeni tarih)
8 geçici guncelleme: 2026-09-22 testi geçti "datePublished":"2026-07-26","dateModified":"2026-09-22" · article:modified_time content="2026-09-22" · · Güncelleme: <time dateTime="2026-09-22">22 Eylül 2026</time> · sitemap'te hem yazı hem /rehber lastmod 2026-09-22. Sonra git checkout -- content/…, git status temiz, tekrar build → Güncelleme: 0, dateModified 2026-07-26.
9 kod incelemesi: .catch var, hata dalında iskelet yok, details açık geçti el-cizimi-sema.tsx: svg ? … : hata ? null : <iskelet>; open={hata || undefined}

tsc / lint / build: next typegen ✓ · tsc --noEmit 0 hata (her commit öncesi) · pnpm lint temiz · pnpm build exit 0 ×3. Tek Turbopack uyarısı baseline'da da olan Cal Sans font fallback uyarısı. Build data/ altını kirletmedi (git status temiz). .next/ şu an temiz HEAD build'i.

Şartnameden sapmalar / yorumlar

  • Kriter 4'te CTO "aynısı (&quot;Üst sıraya)" demiş; taban-siralamalar… açıklaması "Geçen yıl… diye başlıyor. Kastedilen baştaki tırnağın korunması — o geçti.
  • metaDogrula assert tipine guncelleme?: string eklendi (yoksa tsc oku()'da alanı görmüyor). Boş guncelleme: satırı da biçim hatası sayılır (build kırar).
  • /rehber sitemap girdisi artık staticEntries'ten hemen sonra geliyor (sıra değişmedi sayılır; yalnız /paket… satırlarının arkasına kaydı). Hiç yazı yoksa lastModified undefined kalır.
  • Hata anında mermaid'in geçici div'i için document.getElementById("d" + semaId) kullanıldı (mermaid 11.16 mermaid.core.mjs:1248 ile doğrulandı).

Bilal merge öncesi elle baksın

  1. Rehber makalesi + /meraklisina: figcaption altındaki "Şemayı metin olarak oku" satırının görünümü/konumu (kapalı <details>, küçük gri metin). Ekran okuyucuda metin iki kez okunabilir (CEO kabul etti).
  2. Mobilde tablolu bir yazı (/rehber/kac-siralama-ile-hangi-bolume-girebilirim): tablo sayfayı taşırmadan kendi içinde yatay kayıyor mu; tabindex="0" odak halkası kabul edilebilir mi.
  3. Başlık altındaki "Yayın: 26 Temmuz 2026" satırının aralığı (mt-3 text-xs).
  4. Hata yolu gerçek tarayıcıda denenmedi (dev/tarayıcı yasak): DevTools'ta mermaid chunk isteğini bloklayıp iskeletin kalktığını ve metnin açık geldiğini bir kez görmek yeter.
  5. Yazar dalı merge edilirken: yeni .md dosyalarında tarih/guncelleme YYYY-AA-GG değilse build artık kırılır (istenen davranış); P1 yazar dalından önce merge edilirse guncelleme alanı sessizce yok sayılmaz.

Yazılımcı P3 · Vaat dili

Worktree .claude/worktrees/p3-vaat-dili · dal gece/p3-vaat-dili · taban 56925e1 · push/merge yok, build koşulmadı (CTO itirazı #8), script/DB yazımı yok.

Özet (5 madde)

  1. 4 commit, şartnamedeki bölünmeyle: 1 + 1b [KARAR], 2 ve 3 [BİLAL]. Yalnız P3'e atanmış 12 dosyaya dokunuldu (seo.tsx'e dokunulmadı; sabit yeni src/lib/veri-kapsami.ts'te).
  2. Olasılık dili bitti: "yerleşme olasılığı" iki yerde "yerleşme riski ve trend analizi" oldu; risk notunun dört cümlesi tek saf fonksiyona (riskNotuMetni, src/lib/risk.ts:52) alındı, rapor ve tadımlık aynı kaynaktan okuyor. Eşikler, 5/13/6, LLM çıktı şemaları değişmedi.
  3. Tadımlık artık rozetle çelişemez: tadimlikSec() DB'deki LLM cümlesini servis etmiyor; notu okuma anında adayın gerçek sırasından üretiyor. Prod'da pnpm tadimlik yeniden koşusu gerekmiyor.
  4. "4 yıl" → VERI_YIL_SAYISI (5): ana sayfada 5, /paket'te 1 yer sabitten okuyor; prompt/mock'ta düz "5".
  5. İki [BİLAL] commit'i gerçekten bağımsız: main'den geçici dalda tek tek, birlikte ve "commit 2 olmadan" senaryosunda cherry-pick edildi → çakışma yok, tsc 0 hata. Fiyat rakamını ajanlar doğrulamadı — Bilal Armut sayfasını açmadan commit 2'yi almasın.

Commit listesi

# SHA Mesaj Dosyalar
1 16c4508 fix(metin): olasılık dili + 5 yıl src/lib/veri-kapsami.ts (Y) · src/lib/risk.ts · src/lib/ai/rapor.ts · src/app/page.tsx · src/features/odeme/components/paket-satinal.tsx · src/components/arama-funnel-karti.tsx
1b cae2aaa fix(ai): tadımlık risk notu deterministik + prompt dili src/lib/tadimlik-havuzu.ts · scripts/tadimlik-uret.ts · src/app/api/soru/route.ts
2 52520ac chore(metin): danışman fiyat kıyası [Bilal onayı gerekir] src/app/page.tsx · src/app/paket/page.tsx · src/app/layout.tsx
3 9d450c5 chore(guven): hero'da YÖK logosu yerine tarihli veri satırı [Bilal onayı gerekir] src/app/page.tsx · src/features/katalog/components/veri-kaynagi.tsx

Bilal reddederse: commit 3 en üstte → git merge gece/p3-vaat-dili~1 (3'süz) / ~2 (2 ve 3'süz). Yalnız 2 reddedilirse: ~2'yi merge + git cherry-pick 9d450c5 (D senaryosu, test edildi).

Metin değişiklikleri — önce → sonra (satır numaraları dal HEAD'inde)

Commit 1

Yer Önce Sonra
src/app/page.tsx:180 Her tercih için yerleşme olasılığı ve risk analizi (son 4 yıl) Her tercih için yerleşme riski ve trend analizi (son 5 yıl)
src/features/odeme/components/paket-satinal.tsx:32 Her tercih için yerleşme olasılığı ve risk analizi (son 4 yıl trend) Her tercih için yerleşme riski ve trend analizi (son 5 yıl)
src/app/page.tsx:108 Son 4 yılın YÖK Atlas verisi — … Son 5 yılın YÖK Atlas verisi — … (gerisi aynı)
src/app/page.tsx:122 (SSS + FAQ JSON-LD) …son 4 yılın taban başarı sıralamaları… …son 5 yılın taban başarı sıralamaları…
src/app/page.tsx:148 Son 4 yılın trend analizi Son 5 yılın trend analizi
src/app/page.tsx:355 4 yıl 5 yıl
src/lib/risk.ts:55 (eski rapor.ts:166) güvenli Taban sıralaması senin sıranın belirgin altında; yüksek ihtimalle yerleşirsin. Son taban sıralaması senin sıranın belirgin altında; geçmiş veriye göre güvenli aralıkta.
src/lib/risk.ts:57 az-riskli Taban sıralaması sırana yakın; orta ihtimalle yerleşilebilir. Son taban sıralaması sırana yakın; küçük bir kayma sonucu değiştirebilir.
src/lib/risk.ts:59 riskli Taban sıralaması senin sıranın üstünde kapandı; yerleşme ihtimali düşük. Son taban sıralaması senin sıranın üstünde kapandı; hayal tercihi olarak düşün.
src/lib/risk.ts:61 veri yok Güncel taban sıralaması verisi yok; ihtimal öngörülemez, temkinli yaklaş. Güncel taban verisi yok; bu satırı temkinli değerlendir.
src/components/arama-funnel-karti.tsx:38 Yerleşme ihtimalini görerek seç. Yerleşme riskini görerek seç.

rapor.ts:168-170 riskNotuUret gövdesi tek satır: return riskNotuMetni(riskHesapla(p.sira2025 ?? p.sira2024, adaySira)); (+ import satırı). Metinlerde sayı VERI_YIL_SAYISI'ndan template literal ile geliyor.

Commit 1b

Yer Önce Sonra
src/lib/tadimlik-havuzu.ts:89 riskNotu: satir.riskNotu (DB'deki LLM cümlesi) riskNotuMetni(riskHesapla(program.efektifSira, sira) ?? dilimdenRisk(satir.dilim)) — tadimlik-satiri.tsx:107 rozetiyle aynı formül
scripts/tadimlik-uret.ts:70-72 (prompt) riskNotu: yerleşme ihtimali değerlendirmesi … "yüksek/orta/düşük ihtimal" dili kullan. riskNotu: geçmiş taban verisine dayalı risk değerlendirmesi (TEK kısa cümle). ASLA garanti/kesin/yüzde/olasılık/ihtimal deme; "güvenli / az riskli / riskli" etiketleriyle konuş.
scripts/tadimlik-uret.ts:73 (prompt) trendOzeti: son 4 yılın… trendOzeti: son 5 yılın…
scripts/tadimlik-uret.ts:86 (mock) (Dev mock) Taban sıralaması senin civarında; orta-yüksek ihtimalle yerleşilebilir. (Dev mock) Son taban sıralaması sırana yakın; küçük bir kayma sonucu değiştirebilir.
scripts/tadimlik-uret.ts:88 (mock) (Dev mock) Son 4 yılda… (Dev mock) Son 5 yılda…
src/app/api/soru/route.ts:48-49 ASLA yerleşme garantisi verme; "yüksek/orta/düşük ihtimal" dili kullan. ASLA yerleşme garantisi verme; olasılık, yüzde ya da "ihtimal" dili kullanma — güvenli / az riskli / riskli etiketleri ve taban sıralarıyla konuş.

Prompt'larda yalnız talimat cümlesi değişti; TadimlikSchema (gerekce/riskNotu/trendOzeti) ve sohbetin akışı/ayrıştırması aynı.

Commit 2 [BİLAL]

Yer Önce Sonra
src/app/page.tsx:92 İyi bir tercih danışmanı 2.000–10.000 TL istiyor. …1.000–5.000 TL istiyor.
src/app/page.tsx:168 (kıyas tablosu) 2.000–10.000 TL 1.000–5.000 TL
src/app/page.tsx:474 İnsan danışmanın 2.000–10.000 TL aldığı işi… İnsan danışmanın 1.000–5.000 TL aldığı işi…
src/app/page.tsx:478-480 (yeni) — <p className="text-xs text-slate-500">Danışman fiyat aralığı: Armut, 2026.</p> (düz metin, sabit yok)
src/app/page.tsx eski 225-229 yorum içinde ölü <p> ("…onda bir fiyatına yapar.") blok silindi
src/app/paket/page.tsx:49 onda bir fiyatına çok daha düşük fiyata
src/app/paket/page.tsx:52 …bu dönemde 2.000–10.000 TL alıyor. …bu dönemde 1.000–5.000 TL alıyor.
src/app/layout.tsx:55 (description) İnsan danışmanın onda bir fiyatına, yapay zekâ destekli… İnsan danışmandan çok daha düşük fiyata, yapay zekâ destekli…

Commit 3 [BİLAL]

Yer Önce Sonra
src/app/page.tsx:231-241 <Image src="/yok-logo.svg" alt="Yükseköğretim Kurulu"> + dikey ayraç + "YÖK Atlas'ın gerçek verileriyle güvenilir sonuçlar" "Veri: YÖK Atlas · son güncelleme <time dateTime="2026-08-09">9 Ağustos 2026</time>" — kutu sınıfları aynen
src/app/page.tsx:15 / :57,61 import Image from "next/image" silindi / KATALOG_VERI_TARIHI seo import'una + KATALOG_TARIH_METNI import'u eklendi
src/features/katalog/components/veri-kaynagi.tsx:6 const TARIH_METNI export const KATALOG_TARIH_METNI (dosya içi kullanım güncellendi)

public/yok-logo.svg duruyor. Yeni badge/pill yok; CTA butonlarına dokunulmadı; huni-semasi.tsx SEMA değişmedi (davranış değişmedi, CTO teyidi).

Kabul kriterleri

Kriter Sonuç Kanıt
typegen + tsc + lint (dal HEAD 9d450c5) Geçti next typegen ✓ · tsc --noEmit exit 0, çıktı yok · pnpm lint exit 0. Ayrıca commit 1, 1b, 2, 3 sonrasında ayrı ayrı tsc+lint temiz
grep -rniE "olasılı|ihtimal" src scripts/tadimlik-uret.ts → yalnız izinli kalıntılar Geçti (3 ek yorum satırıyla) Beklenenler: page.tsx:78 ("binlerce ihtimal"; şartnamede :76, import eklenince kaydı), page.tsx:132, program-tablosu.tsx:176, yasaklayıcı prompt'lar soru/route.ts:48, tadimlik-uret.ts:71. Ek: risk.ts:48-49 ve tadimlik-havuzu.ts:88 — benim yazdığım, kuralı açıklayan kod yorumları (kullanıcıya görünmez, yasaklayıcı)
grep -rn "4 yıl" src/app/page.tsx src/features/odeme → boş Geçti exit 1, çıktı yok
grep -rn "onda bir|2\.000–10\.000" src → boş Geçti exit 1, çıktı yok
Bağımsızlık (cherry-pick) testi Geçti Geçici dal gece/p3-tmp-test @ 56925e1: A yalnız commit 2 → çakışmasız, tsc 0 · B yalnız commit 3 → çakışmasız, tsc 0 · C 2+3 (commit 1'siz) → tsc 0 · D 1+1b+3 (commit 2'siz) → çakışmasız, tsc 0. Geçici dal silindi, worktree temiz
Ana sayfada kamu logosu yok, tarih görünür HTML'de Geçti (kod incelemesi) grep "yok-logo|next/image" src/app/page.tsx boş; <time dateTime> sunucu bileşeninde

Repo geneli tarama — kalan ifadeler ve gerekçe

  • src/features/sihirbaz/components/cta-sira-form.tsx:143,164,189,209 "Sıralamanla nereye yerleşirsin? Saniyede gör." — dosya P2'nin; CTO bunu Garanti→Güvenli (H2) backlog'una bağladı. En görünür kalan vaat cümlesi bu; H2 kararıyla birlikte ele alınmalı.
  • src/app/page.tsx:132 SSS "boşta kalma ihtimalini en aza indiririz" — şartnamede açıkça kapsam dışı (SSS). Not: yerleşme olasılığı değil ama yine bir sonuç vaadi; H2 paketinde gözden geçirilmeli.
  • src/app/page.tsx:78 "24 tercih, binlerce ihtimal" — kombinasyon anlamı, vaat değil.
  • src/features/pazarlama/components/meraklisina-icerik.tsx:64 "şansını" — /meraklisina, kapsam dışı (H6).
  • src/features/pazarlama/components/hero-baslik.tsx:24 "Dört yıllık geleceğini", bolum-listesi.tsx:95 "4 Yıllık" — öğrenim süresi, veri kapsamı değil.
  • content/rehber/*.md "son 3-4 yılın tabanına bak", "yerleşme ihtimaline göre dizme" — yazar dalının; genel tercih tavsiyesi, ürün vaadi değil. taban-siralamalar…md:12 "dört yılın tabanı = film" ürünün "5 yıl"ıyla birebir örtüşmüyor ama ürün iddiası değil (SEO ajanına not).
  • "Son 5 yıl" tablo başlıkları (rapor-listesi.tsx:368, program-tablosu.tsx:242, bolum-program-listesi.tsx:160, universite-program-tablosu.tsx:51) zaten 5; sabitten okumuyorlar (dosyalar P3'ün değil) → veri yılı eklenince elle güncellenecek 4 yer; backlog adayı.
  • src/app/api/soru/route.ts:46 aynı prompt'ta "Riskli = geçen yıl adayın sıralamasının üzerinde kapandı" — efektif sıra 2024'e düşebildiği için teknik olarak gevşek; şartname yalnız 48. satırı verdi, dokunulmadı.
  • DB'deki kayıtlı raporlarda ve tadimlik_havuzu.risk_notu kolonunda eski cümleler duruyor: raporlar göçsüz kalır (CEO kabulü); tadımlık kolonu artık servis edilmiyor.

Sapmalar / şartname notları

  1. rapor.ts'te import satırı da değişti ("başka hiçbir şeye dokunma"ya rağmen): riskNotuMetni import'u olmadan gövde derlenmez. Başka değişiklik yok.
  2. scripts/tadimlik-uret.ts "5"i düz yazıyor, sabitten okumuyor — şartname metni öyle ("son 5 yılın"); prompt'a import sokmamak için harfiyen uygulandı. Veri yılı eklenince güncellenecek yerler: veri-kapsami.ts + bu script (2 satır) + yukarıdaki 4 tablo başlığı.
  3. layout.tsx:55: şartname yalnız "onda bir fiyatına → çok daha düşük fiyata" diyordu; cümle "İnsan danışmanın çok daha düşük fiyata" diye bozulacağı için "İnsan danışmandan çok daha düşük fiyata" yapıldı.
  4. Kabul grep'inde 3 fazladan satır — kendi açıklayıcı kod yorumlarım (yukarıda). Temiz grep istenirse yorumlar yeniden yazılabilir; davranışa etkisi yok.
  5. Satır kayması: şartnamedeki page.tsx:76 artık :78 (commit 1 ve 3'ün import satırları).
  6. pnpm build koşulmadı (talimat). KATALOG_TARIH_METNI modül seviyesinde new Date(<sabit string>) kullanıyor — zaten katalog sayfalarında prerender edilen mevcut kod; ana sayfaya ilk kez giriyor, Tur 4 build'inde cacheComponents uyarısı çıkarsa ilk bakılacak yer (beklenmiyor: argümanlı Date). CTO backlog #6 (P1'in trTarih'ine geçiş) bunu tümden kapatır.
  7. Görsel kontrol Bilal'de: hero kutusu logosuz daha dar; fiyat bölümünde kaynak satırı gap-4 sütununun son öğesi.

Yazılımcı P4 · Giriş e-postası

Dal gece/p4-eposta (worktree .claude/worktrees/p4-eposta), taban 56925e1. Push/merge yok; dev sunucusu/tarayıcı/pnpm build koşulmadı. Gerçek e-posta gönderilmedi: Resend'e ulaşan hiçbir kod yolu çalıştırılmadı, canlıya istek atılmadı, .env* dosyaları okunmadı. Tüm doğrulama betikleri scratchpad'de, scratch SQLite DB + sahte secret + RESEND_API_KEY tanımsız koştu; hiçbiri commit'lenmedi.

Özet (5 madde)

  1. Prod'da sessiz fallback bitti. Anahtar yokken konsola yazıp "gönderildi" dönmek artık yalnız dev'de ya da EPOSTA_KONSOL_FALLBACK=1 ile; prod + anahtarsız → gönderim anında throw (better-auth 500 → formda hata toast'ı), token'lı link loga düşmüyor. EMAIL_FROM yoksa prod'da resend.dev'e düşmek yerine hata. Tüm env okumaları fonksiyon gövdesinde → next build etkilenmez.
  2. Reply-To eklendi (EMAIL_REPLY_TO, yoksa destek@kolaytercih.com).
  3. Adres başına 60 sn soğuma, süreç içi Map (CTO itirazı #2'ye uygun; verification tablosuna dokunulmadı), yalnız NODE_ENV=production. Pencere kaymaz, gönderim hatasında kayıt geri verilir. Uçtan uca (better-auth signInMagicLink → sendMagicLink) çevrimdışı doğrulandı.
  4. giris_basarili sunucu olayı session.create.after'da, awaitsiz; yontem: eposta|google|diger. Stub fetch ile doğrulandı: verify sonrası tam 1 olay, gövdede e-posta yok.
  5. Commit 2, 3, 4, 5'in her biri tek başına git revert edilebiliyor (denendi: çakışmasız + tsc temiz). Bunun için commit 3 bilinçli olarak "sarmalayıcı" biçiminde yazıldı (aşağıda sapma #2).

Commit listesi

# Hash Başlık Canlı giriş yolunu değiştirir mi
1 aac33e7 chore(eposta): şablondan harici font + footer iletişim Hayır (yalnız mail içeriği)
2 5992cf3 fix(eposta): Reply-To + prod'da sessiz fallback yok EVET — prod'da anahtar/EMAIL_FROM eksikse giriş isteği artık 500 döner (eskiden sahte başarı). Env tamamsa tek fark Reply-To başlığı.
3 2af4a9f feat(giris): adres başına 60 sn soğuma EVET — aynı adrese 60 sn içinde 2. istek 200 döner ama mail çıkmaz.
4 17046c8 feat(analitik): giris_basarili sunucu olayı Hayır (yan etki; await yok, hata fırlatmaz). Oturum oluşturma kancasına eklenir — Google girişinde de tetiklenir.
5 ea3ba5f chore(ci): .env.production'a RYBBIT_* ve EMAIL_REPLY_TO [Bilal onayı gerekir] Hayır (deploy hattı; yalnız secret ADI referansı, değer yok). Önceki dört commit'e bağımlı değil.

Değişen dosyalar (yalnız P4'e atananlar)

src/lib/eposta.ts · src/lib/eposta-gonder.ts · src/lib/auth.ts · src/lib/analitik-sunucu.ts · .gitea/workflows/ci.yaml — toplam +155/−17. Yeni dosya yok, şema/migration yok, bağımlılık yok.

Kabul kriterleri

Kriter Sonuç Kanıt
typegen + tsc + lint Geçti HEAD ea3ba5f: next typegen ✓, tsc --noEmit exit 0, pnpm lint exit 0. Ayrıca commit 1/2/3/4 sonrası ayrı ayrı tsc+lint temiz.
grep -n "fonts.googleapis|fonts.gstatic" src/lib/eposta.ts → boş Geçti Çıktı boş; render edilen iki şablonda <link sayısı 0.
grep -n "process.env" src/lib/eposta-gonder.ts → hepsi fonksiyon gövdesinde Geçti 7 okuma: :18 (kacisBayragi), :30-31 (epostaKonsolModu), :45,51,52,62 (epostaGonder). Modül seviyesinde okuma/throw yok.
grep -n "await sunucuOlayi" src/lib/auth.ts → boş Geçti Çıktı boş (void sunucuOlayi(...)).
Prod + anahtarsız + bayraksız yolda hiçbir console.log URL basmıyor Geçti Kod: iki dosyada 4 console.* var — eposta-gonder.ts:40 ve auth.ts:98 yalnız epostaKonsolModu() dalında; auth.ts:73 soğuma bilgi satırı (adres/link içermez); eposta-gonder.ts:73 Resend hata logu (link içermez). Çalışma kanıtı: betikte console.log/info yakalanarak bu yolda 0 satır + RESEND_API_KEY tanımlı değil hatası görüldü.
Footer + düz metin iletişim satırı Geçti Render: HTML'de <a href="https://kolaytercih.com"…>kolaytercih.com</a> · <a href="mailto:destek@kolaytercih.com"…>; iki şablonun text'i — / kolaytercih.com · destek@kolaytercih.com ile bitiyor.
Lokal docker testi (bayrakla link konsolda, 60 sn içinde 2. istek link üretmez, bayraksız → hata) Bilal'de (aşağıda adımlar) Çevrimdışı eşdeğeri geçti: NODE_ENV=production + scratch DB ile auth.api.signInMagicLink → 1. istek link, 2. istek (büyük harfli aynı adres) {status:true} + link yok; bayraksız → hata + link yok; hata sonrası hemen yeniden deneme link üretiyor.

Elle doğrulama betikleri (commit'lenmedi, scratchpad): p4-guard.mts 12/12 (konsol modu matrisi: dev/prod × anahtar × bayrak; EPOSTA_KONSOL_FALLBACK=true açmaz, yalnız 1; EMAIL_FROM="" de hata), p4-soguma.mts 10/10 (22 sn senaryosu, trim+lowercase, 59.999 ms düşer / 60.000 ms geçer, pencere kaymıyor, bırak→yeniden dene, 500 kayıt tek çağrıda budanıyor), p4-e2e.mts 6/6, p4-olay.mts 6/6 (stub fetch: /api/track, pathname:/giris, properties:{"yontem":"eposta"}, e-posta yok, tam 1 olay, verify 19 ms). Projede test altyapısı (vitest/jest) yok → test dosyası eklenmedi.

better-auth doğrulamaları (kaynaktan, tahmin değil): databaseHooks.session.create.after: (session, context: GenericEndpointContext | null) => Promise<void> (@better-auth/core/dist/types/init-options.d.mts:1192); context = getCurrentAuthContext() (better-auth/dist/db/with-hooks.mjs:7), path: string better-call EndpointContext'te var; uç yolları /magic-link/verify (plugins/magic-link/index.mjs:84) ve /callback/:id (api/routes/callback.mjs:21). Resend 6.18.0 replyTo?: string | string[] (resend/dist/index.d.mts:559).

Sapmalar / şartname notları

  1. ?? yerine || (EMAIL_REPLY_TO, EMAIL_FROM): şartname process.env.EMAIL_REPLY_TO ?? "destek@…" diyordu. Commit 5'teki CI satırı secret yokken EMAIL_REPLY_TO= (boş string) üretir; ?? boş string'i geçirir → Resend'e boş Reply-To gider → doğrulama hatası → kimse giriş yapamaz. || ile boş değer varsayılana düşer; CTO'nun "secret yoksa zararsız" varsayımı ancak böyle doğru.
  2. Commit 3'te fonksiyon bölündü: soğuma, eski gövdeyi satır satır değiştirmek yerine onu girisLinkiniIlet adıyla olduğu gibi bırakıp üstüne yeni sendMagicLinkEmail sarmalayıcısı olarak eklendi (diff: 60 ekleme, 0 silme). İlk denemede gövdeyi taşımıştım; commit 2'nin tek başına revert'i çakışıyordu → "tek tek atılabilir" şartı için yeniden yazıldı. Yan etki: dev'deki __sonMagicLink yakalaması artık soğuma kontrolünden sonra — soğuma dev'de kapalı olduğu için davranış aynı.
  3. girisSogumasiAl / girisSogumasiBirak auth.ts'ten export ediliyor (saf mantığı betikle test edebilmek için; zaman parametresi enjekte edilebilir). Uygulama içinde başka çağıranı yok.
  4. Soğumada düşen istek için bir console.info satırı eklendi ("Soğuma penceresinde tekrar istek — e-posta gönderilmedi."; adres ve link içermez). Şartnamede yoktu; Bilal'in docker testinde "2. istek gerçekten yutuldu mu"yu görünür kılıyor. İstenmezse 3 satır silinir.
  5. Footer'da SITE_URL değil sabit kolaytercih.com (şartnamedeki gibi): lokal/dev'de üretilen mailde bile iletişim satırı prod alan adını gösterir. İki küçük sabit (SITE_ALANI, DESTEK_EPOSTA) + METIN_ALT_BILGI HTML ve iki düz metin gövdede ortak.
  6. eposta.ts üst yorumundaki "web fontları <link> ile yüklenir" cümlesi yeni duruma göre düzeltildi. BASLIK_TIPI/MARKA_TIPI font yığınları bırakıldı (cihazda kuruluysa çalışır, zararsız).
  7. Bilinen sınırlar (CTO kabulü, değişmedi): Map yeniden başlatmada sıfırlanır, çoklu kopyada paylaşılmaz; eşzamanlı iki istekte ilki hata verirse ikincisi yutulmuş olur (nadir); soğumada düşen isteğin verification satırı 15 dk yetim kalır; Gmail nokta/+etiket eşlemesi yok (anahtar yalnız trim+lowercase). Kullanıcı 60 sn içinde sayfayı yenileyip yeniden isterse "gönderildi" görür ama mail çıkmaz — P2'nin 60 sn geri sayımıyla birlikte merge edilmesi önerilir (P2 commit 3).
  8. kredi-hatirlatma.ts (P4'ün değil) aynı epostaGonder'ı kullanıyor: prod'da anahtar yoksa artık throw → mevcut try/catch yakalayıp logluyor, hatırlatma "yanar" (mevcut at-most-once davranışı). Eskiden sessizce konsola yazıp yine yanıyordu → fiilî fark yok.
  9. .gitea/workflows/ci.yaml YAML'ı ruby -ryaml ile ayrıştırılarak doğrulandı (4 yeni satır heredoc içinde, doğru girintide). Gitea runner'da koşturulmadı.

Bilal'in merge öncesi lokal docker testi (sırayla)

Hazırlık: gece/p4-eposta dalını checkout et. Lokal .env.production'ın kopyasını al ve kopyada RESEND_API_KEY= ile EMAIL_FROM= satırlarını boşalt/sil (gerçek mail çıkmasın); BETTER_AUTH_URL=http://localhost:3000 yap. docker-compose.yml Traefik ağına bağlı olduğu için en kolayı: docker build -t kt-p4 . → docker run --rm -p 3000:3000 --env-file <kopya> -e APP_DB_URL=file:/app/data/app.db [-e EPOSTA_KONSOL_FALLBACK=1] kt-p4.

  1. Build geçiyor mu (kritik: prod guard modül seviyesinde değil): docker build hatasız bitmeli.
  2. Bayraklı koşu (-e EPOSTA_KONSOL_FALLBACK=1, anahtar boş): gizli pencerede /giris → e-posta gir → form yeşil "Bağlantı gönderildi" → docker logs'ta [giris] Magic link for … + /giris/dogrula?token=… linki.
  3. Soğuma: 60 sn dolmadan aynı adresi (bir de BÜYÜK harfle) yeniden iste (P2 merge edilmediyse "Yeniden gönder" 30. sn'de açılır) → form yine başarı gösterir, logda yeni link YOK, yerine [giris] Soğuma penceresinde tekrar istek — e-posta gönderilmedi. Farklı bir adres aynı anda link alabilmeli. 60 sn sonra aynı adres yeniden link almalı.
  4. Giriş tamamlanıyor mu: logdaki linki aç → /giris/dogrula onay kartı → buton → oturum açıldı, yeni kullanıcıya deneme kredisi yazıldı. Aynı link ikinci kez → "geçersiz bağlantı" mesajı. Google ile giriş de dene (session kancası orada da çalışıyor).
  5. Bayraksız + anahtarsız koşu (konteyneri EPOSTA_KONSOL_FALLBACK olmadan yeniden başlat): /giris → e-posta gir → formda hata toast'ı ("Bağlantı gönderilemedi…"), logda [eposta] RESEND_API_KEY tanımlı değil, logda hiçbir token= URL'i yok (docker logs … | grep -c "token=" → 0). Hemen ardından aynı adresle tekrar dene → yine hata (soğumaya takılıp sahte başarı göstermemeli).
  6. EMAIL_FROM guard'ı (isteğe bağlı, mail ÇIKMAZ): kopyada RESEND_API_KEY=re_sahte + EMAIL_FROM boş + bayraksız → formda hata, logda [eposta] EMAIL_FROM tanımlı değil (Resend'e gitmeden atar).
  7. Gerçek gönderim (tek mail, kendi adresine): gerçek .env.production ile koş → gelen mailde "Show original": Reply-To: destek@kolaytercih.com; HTML kaynağında fonts.googleapis yok; footer'da site + destek adresi; yanıtla'ya basınca alıcı destek@….
  8. giris_basarili: RYBBIT_HOST/SITE_ID/API_KEY kopyada tanımlıysa 4. adımdan sonra Rybbit'te giris_basarili {yontem: eposta} (ve Google ile google) düşmeli; olayda e-posta adresi olmamalı. Tanımlı değilse no-op (hata yok) — bu da doğrulanmış olur.
  9. Merge sonrası canlıda ilk iş: gizli pencereden kendi adresinle bir giriş; 500 görürsen Gitea secret'larında RESEND_API_KEY/EMAIL_FROM boş demektir → commit 2'yi revert et (git revert 5992cf3, çakışmasız — denendi).

Gereken env / secret adları

Ad Zorunlu mu Not
RESEND_API_KEY Prod'da zorunlu (mevcut secret) Yoksa artık giriş isteği 500.
EMAIL_FROM Prod'da zorunlu (mevcut secret) Yoksa artık 500 (eskiden sessiz onboarding@resend.dev).
EMAIL_REPLY_TO İsteğe bağlı (yeni Gitea secret) Yok/boş → destek@kolaytercih.com.
EPOSTA_KONSOL_FALLBACK Yalnız lokal docker testi, değer 1 Prod'a/Gitea'ya EKLEME — eklenirse (ve anahtar da yoksa) giriş linkleri prod loguna yazılır.
RYBBIT_HOST, RYBBIT_SITE_ID, RYBBIT_API_KEY giris_basarili/odeme_tamamlandi için gerekli (yeni Gitea secret'ları) Üçünden biri boşsa no-op. Secret'lar eklenmeden commit 5 merge edilirse zararsız (boş satırlar), ama olaylar yine düşmez.

Bilal'in kod dışı işleri (04-mail-testi'nden, bu pakette çözülemez): DMARC kaydı + apex SPF (Cloudflare), destek@kolaytercih.com kutusunun gerçekten açık olduğunun teyidi (Reply-To artık oraya gidiyor).


Yazılımcı B · K2 tadımlık dili

Worktree .claude/worktrees/p3b-tadimlik-dili · dal gece/p3b-tadimlik-dili · taban cae2aaa · push/merge yok, pnpm build koşulmadı, script/DB yazımı yok (DB denemesi data/app.db'nin scratchpad'deki .backup kopyasına karşı, sqlite3 -readonly ile alındı).

Özet (5 madde)

  1. 2 commit, şartnamedeki bölünmeyle: 79bc7fa [KARAR] tadımlık dili · 004473a [BİLAL] rakamsız fiyat, en tepede. Yalnız 6 sahipli dosyaya dokunuldu.
  2. Tadımlıkta servis edilen tek LLM metni artık gerekce ve o da filtreli. trendOzeti DB'den okunmuyor; rapordakiyle aynı saf fonksiyondan (src/lib/trend.ts trendOzetiMetni) program.siraGecmisi'nden üretiliyor. Tüm anahtar uzayında (1.170 istek) gerçek tadimlikSec() çağrısıyla servis edilen metinlerde olasılık/ihtimal/şans/"son 4 yıl" 0.
  3. Bedeli: 514 satırın 26'sı elendi; tadımlığın gizlendiği istek kombinasyonu 127 → 186 (1.170'te +59, +%5). CEO'nun dar kalıbı uygulansaydı 16 satır / +32 olurdu — fark bilinçli sapma (aşağıda #1), geri alması tek satır.
  4. Trend cümlesinde tahmin yargısı yok: "bölüm zorlaşıyor" → "taban sıkılaştı", "yerleşmek görece kolaylaşıyor" → "taban gevşedi". Eşik, ilk–son yıl mantığı, 5/13/6, LLM şeması/prompt'u değişmedi. Ege Tıp tipi yanıltma sürüyor (4 yıl düz seri hâlâ "çıktı; taban gevşedi" diyor) — CEO backlog'unda, K2 kapsamı dışı.
  5. 9d450c5 (YÖK logosu) bu dalın hem tepesine hem ~1'ine çakışmasız uygulanıyor (merge-tree + gerçek cherry-pick + tsc/lint). Fiyat commit'i reddedilirse git merge gece/p3b-tadimlik-dili~1.

Commit listesi

# SHA Mesaj Dosyalar
1 [KARAR] 79bc7fa fix(ai): tadımlık trendi deterministik + gerekçe dil filtresi src/lib/trend.ts (Y) · src/lib/tadimlik-havuzu.ts · src/lib/ai/rapor.ts
2 [BİLAL] 004473a chore(metin): danışman fiyat kıyası rakamsız ve atıfsız [Bilal onayı gerekir] src/app/page.tsx · src/app/paket/page.tsx · src/app/layout.tsx

rapor.ts diff'i: siraKisa + trendOzetiUret gövdesi çıktı, yerine trendOzetiMetni([p.sira2021…p.sira2025]) çağıran 9 satırlık sarmalayıcı + 1 import. İki çağrı yeri (:200 mock, :402 gerçek rapor) ve AiTercihSchema/prompt/dilimHedefiHesapla dokunulmadı. siraGecmisi yıl sırası doğrulandı: scripts/tadimlik-uret.ts:94 ve rapor.ts programBilgisi ikisi de [sira2021…sira2025]; raporSiraSerisi de indeks 0 = 2021 okuyor → trend.ts'te çapa ILK_VERI_YILI = 2021.

Metin değişiklikleri — önce → sonra

Commit 1

Yer Önce Sonra
src/lib/trend.ts:45 (eski rapor.ts:160) …düzeyine indi; bölüm zorlaşıyor. …düzeyine indi; taban sıkılaştı.
src/lib/trend.ts:48 (eski rapor.ts:163) …düzeyine çıktı; yerleşmek görece kolaylaşıyor. …düzeyine çıktı; taban gevşedi.
stabil / veri yok cümleleri aynı aynı
tadimlik-havuzu.ts trendOzeti satir.trendOzeti (DB, LLM: "Son 4 yılda taban sıralaması 13.000'den 6.100'e hızla yükseldi, bölüm popülerleşiyor.") trendOzetiMetni(program.siraGecmisi) ("2021-2025 arasında taban 16B düzeyinden 6B düzeyine indi; taban sıkılaştı.")
tadimlik-havuzu.ts gerekce koşulsuz servis gerekceServisEdilebilir() geçmezse satır yok sayılır → genel → null
tadimlik-havuzu.ts yorum "…metin ile rozet çelişemez, olasılık dili sızamaz." riskNotu ve trendOzeti'nin servis edilmediğini, gerekce'nin servis edilen tek LLM metni olduğunu ve filtreden geçtiğini söylüyor

Filtre kalıbı (Türkçe küçük harfe çevrilmiş metinde): /olasılı|ihtimal|şans|garanti|kesin|yüzde|yerleşirsin|yerleşebil|son (4|dört) yıl/.

Commit 2 [BİLAL]

Yer Önce Sonra
src/app/page.tsx:91 İyi bir tercih danışmanı 2.000–10.000 TL istiyor. İyi bir tercih danışmanının ücreti birkaç bin lirayı bulabiliyor.
src/app/page.tsx:167 (kıyas tablosu) 2.000–10.000 TL Danışmana göre değişir
src/app/page.tsx:483 İnsan danışmanın 2.000–10.000 TL aldığı işi tek seferlik… İnsan danışmanın birkaç bin liraya yaptığı işi tek seferlik…
src/app/paket/page.tsx:49 (h1) onda bir fiyatına çok daha düşük fiyata
src/app/paket/page.tsx:52 Tercih danışmanları bu dönemde 2.000–10.000 TL alıyor. Tercih danışmanlarının ücreti bu dönemde birkaç bin lirayı bulabiliyor.
src/app/layout.tsx:55 (description) İnsan danışmanın onda bir fiyatına, yapay zekâ destekli… İnsan danışmandan çok daha düşük fiyata, yapay zekâ destekli…

Kaynak satırı / şirket adı eklenmedi; page.tsx:224-228 yorum içi ölü <p> bloğuna dokunulmadı.

Lokal DB deneme sonuçları

Betikler (commit'lenmedi): <scratchpad>/k2/dene.ts (gerçek tadimlikSec + trendOzetiMetni + gerekceServisEdilebilir'i worktree'den import eder; APP_DB_URL=file:<scratchpad>/k2/app-kopya.db) ve <scratchpad>/k2/sim.ts (filtre varyantı kıyası). Ana data/app.db yalnız sqlite3 -readonly … .backup ile okundu.

Ölçüm Sonuç
tadimlik_havuzu satır 514 (genel 174 · devlet 166 · vakıf 174; 13 kategori slug'ı)
DB trend_ozeti'nde "Son 4 yıl" 89 satır (büyük-küçük harf duyarsız; 08'deki 126 sayısını üretemedim — denetçi muhtemelen daha geniş kalıp saydı). Artık hiçbiri servis edilmiyor
siraGecmisi olmayan satır 0 (18 satırda <2 dolu yıl → "yeterli geçmiş yıl verisi yok" cümlesi)
Filtreye takılan gerekce 26 / 514 (8'i genel kategori, 18'i kategoriye özel). Yalnız CEO kalıbıyla: 16. Ek 10 satır: şans 3 ("yerleşme şansınız yüksek/düşük", "kazanma şansın yüksek"), yerleşebil 1 ("rahatça yerleşebileceğiniz"), son 4/dört yıl 6
Anahtar uzayı (6 kova × 5 tür × 13 kategori+kategorisiz × 3 tip = 1.170 istek), null dönen filtresiz 127 → CEO kalıbı 159 → uygulanan 186 (filtre yüzünden gizlenen: 59)
Kategorisiz (yalnız genel) 90 istekte null 10 → 15 → 18
Kategoriye özel satırı elenip genel'e düşen istek 17
Servis edilen 984 yanıtta (gerekce+riskNotu+trendOzeti) olasılı|ihtimal|son 4 yıl|son dört yıl|şans|yerleşirsin|garanti|kesin|yüzde 0
Üretilen trend dağılımı (514 satır) sıkılaştı 287 · gevşedi 131 · stabil 78 · veri yok 18

null'a düşen 8 genel anahtarı: 10-50k\|ea\|genel, 0-10k\|say\|devlet, 10-50k\|say\|vakif, 10-50k\|tyt\|vakif, 50-100k\|ea\|vakif, 100-250k\|ea\|vakif, 100-250k\|soz\|vakif, 500k-plus\|say\|devlet — bunlarda kategoriye özel satırı olmayan her istek tadımlıksız kalır; prod'da pnpm tadimlik --force (karar #17) geri getirir.

Üretilen trendOzeti örnekleri (gerçek satırlar):

  • [16356,13032,9886,7429,6106] → "2021-2025 arasında taban 16B düzeyinden 6B düzeyine indi; taban sıkılaştı." (eski DB metni: "Son 4 yılda taban sıralaması 13.000'den 6.100'e hızla yükseldi, bölüm popülerleşiyor.")
  • [2273,1879,2364,2391,5731] → "2021-2025 arasında taban 2B düzeyinden 6B düzeyine çıktı; taban gevşedi."
  • [16523,13251,12057,12896,15834] → "2021-2025 arasında taban sıralaması 16B düzeyinde stabil seyretti."
  • [25412,14281,9831,15697,10244] → "…25B düzeyinden 10B düzeyine indi; taban sıkılaştı." (eski: "son 4 yılda 14K ile 15K arasında dalgalandı" — eski metin rakamca da yanlıştı)
  • [4218,5159,5303,5294,5118] → "…4B düzeyinden 5B düzeyine çıktı; taban gevşedi." ← Ege Tıp tipi: son 4 yıl düz, cümle yine "çıktı" diyor (backlog).
  • Kenar: undefined / tek dolu yıl → "Karşılaştırma için yeterli geçmiş yıl verisi yok; trendi temkinli oku."; [null,null,100000,null,95000] → "2023-2025 arasında … 95B düzeyinde stabil seyretti."; 1.500.000→1.200.000 → "1,5M … 1,2M". Filtre: "İHTİMAL yüksek" ve "OLASILIK" yakalanıyor (düz /i İ/ı'yı kaçırırdı).

Kabul kriterleri

# Kriter Sonuç Kanıt
1 tadimlikSec() DB trendOzeti'ni servis etmez; aynı saf fonksiyon; yıl sırası doğrulandı; filtre → genel → null; yorum düzeltildi Geçti git show 79bc7fa; grep -n "satir.trendOzeti" src/lib/tadimlik-havuzu.ts boş; rapor ve tadımlık ikisi de trendOzetiMetni import ediyor
2 Trend dili; eşik/mantık/şema/prompt aynı Geçti trend.ts gövdesi eski trendOzetiUret ile satır satır aynı, yalnız iki cümle sonu farklı; rapor.ts diff'inde şema/prompt satırı yok
3 DB betiği + servis edilen alanlarda 0 Geçti yukarıdaki tablo (sizinti: 0, 984 yanıt)
4 Commit 2: atıf ve TL aralığı yok, ölü <p>'ye dokunulmadı Geçti grep -rn "2\.000–10\.000|Armut|1\.000–5\.000" src boş; grep -rn "onda bir" src → yalnız page.tsx:227 (yorum içi ölü blok, şartname gereği bırakıldı; 9d450c5 de silmiyor)
5 9d450c5 çakışmasız Geçti aşağıda
— typegen + tsc + lint Geçti commit 1 öncesi ve commit 2 öncesi ayrı ayrı: next typegen ✓ · tsc --noEmit exit 0 · pnpm lint exit 0

Cherry-pick testi (9d450c5)

  • git merge-tree --write-tree --merge-base=9d450c5~1 HEAD 9d450c5 → exit 0, ağaç 841760c (çakışma yok) — tepe (004473a) üstüne.
  • Aynı komut HEAD~1 (79bc7fa) için → exit 0, ağaç 2d991c7 — fiyat commit'i reddedilirse de temiz.
  • Geçici dal gece/p3b-tmp-test @ 004473a: git cherry-pick 9d450c5 çakışmasız (2 dosya, +11/−13) → tsc --noEmit exit 0, pnpm lint exit 0, grep "yok-logo\|next/image" src/app/page.tsx boş. Dal silindi, worktree temiz, git branch --list 'gece/p3b*' yalnız asıl dalı gösteriyor.

Sapmalar / şartname notları

  1. Filtre kalıbı şartnameden GENİŞ (en güvenli yorum): CEO /olasılı|ihtimal|garanti|kesin|yüzde/i demişti. Eklenenler: şans, yerleşirsin, yerleşebil (orkestratör görevi "yerleşirsin dili"ni de sayıyordu; DB'de "yerleşme şansınız yüksek" birebir olasılık vaadi) ve son (4|dört) yıl. Sonuncusu zorunluydu: "Son 4 yıl" yalnız trend_ozeti'nden değil gerekce'den de sızıyor (6 satır; ilk koşuda 19 servis yanıtında yakalandı) — kriter 3'ün "Son 4 yıl = 0" şartı onsuz sağlanmıyordu. Bedel: 16 yerine 26 satır, +32 yerine +59 gizlenen istek. Daraltmak isteyen YASAK_GEREKCE_DILI'nden ilgili alternatifi siler.
  2. /i bayrağı yerine toLocaleLowerCase("tr-TR"): JS'te düz /i "İhtimal"/"OLASILIK"ı eşlemez. Davranış şartnamenin niyetiyle aynı, daha sıkı.
  3. VERI_YIL_SAYISI trend.ts'te kullanılmadı: cümle "son N yıl" demiyor, yıl aralığını serideki dolu yıllardan yazıyor ("2022-2025 arasında") — sabitten türetmek yerine gerçek veri. Yıl çapası ILK_VERI_YILI = 2021 (dizi hep 2021'den başlıyor; yeni yıl sona eklenince değişmez).
  4. paket/page.tsx:52 için şartname cümle vermemişti; ana sayfadaki kalıpla eşlendi ("…ücreti bu dönemde birkaç bin lirayı bulabiliyor"). "birkaç bin lira" CEO metni; aralık değil ama yine teyitsiz bir büyüklük iddiası — Bilal tümden rakamsız isterse üç yerde "birkaç bin lira" → "yüksek ücret" tek kelimelik iş.
  5. Kapsam dışında kalan aynı dil (sahipli dosya değil, dokunulmadı): src/features/pazarlama/components/meraklisina-icerik.tsx:137 "çizgi yukarı tırmanıyorsa bölüm zorlaşıyor demektir" (ayrıca yön ters görünüyor: sıra küçülünce taban sıkılaşır; çizimin ekseni bilinmeden karar verilemez — Bilal baksın) ve scripts/tadimlik-uret.ts:74 prompt örneği ("…bölüm zorlaşıyor"). İkincisi artık zararsız (trend servis edilmiyor) ama --force koşusundan önce düzeltilmeli.
  6. gerekce'de filtreye takılmayan kalite sorunları (bilgi): batch metinleri temsili sırayı kullanıcıya kendi sırasıymış gibi söylüyor ("30.000 sıralamanızla", "75K bandı"), hitap karışık ("sıralamanız" / "adayın" / "sıralaman"), bazıları yumuşak vaat içeriyor ("yerleşme potansiyeli var", "rahat yerleşim sağlayan", "rahatça yetiyor"). Kalıcı çözüm yeni prompt'la yeniden üretim (karar #17); istenirse gerekce de deterministik şablona çekilebilir (ayrı karar).
  7. P3'ün grep -rniE "olasılı|ihtimal" src kabul taramasına 2 yeni izinli satır eklendi: tadimlik-havuzu.ts'teki filtre kalıbı ve onu açıklayan yorum (yasaklayıcı, kullanıcıya görünmez).
  8. pnpm build, dev sunucusu, tarayıcı, pnpm tadimlik: koşulmadı (talimat). UI bileşeni değişmedi; SEMA senkronu gerekmiyor (sihirbaz/havuz/iskelet davranışı aynı).

Yazılımcı C · K3 katalog

Dal gece/p7-katalog (taban e1bb482), worktree .claude/worktrees/p7-katalog. Push yok, build koşulmadı, tarayıcı açılmadı. Şartname: 11-ceo-kararlari-tur2.md §2-K3.

Özet (5 madde)

  1. 667 derin sayfanın (304 bölüm + 363 üniversite) başlık/açıklaması artık sayfa numarası dışında da ayrışıyor: bölümde taban sırası aralığı (title + description + H1), üniversitede o sayfadaki birim adları (description + giriş paragrafı). Salt-okunur betikle 667 sayfanın tamamı tarandı: sayfa numarası silinince aynı kalan title+description çifti 0.
  2. Canonical (kendine), robots, sitemap, seo.tsx, iki sayfa/[no]/page.tsx ve 1. sayfaların title/description'ı değişmedi (git diff e1bb482 HEAD bu satırlarda boş).
  3. "yerleşir misin? / nereye yerleşirsin?" başlıkları 5 yerden kalktı; CEO'nun uyarladığı köprü cümlesi aynen kullanıldı; CtaSiraForm /bolum/[slug] sayfasına üniversite sayfasıyla aynı konumda eklendi.
  4. İki commit bağımsız: metin beğenilmezse git merge gece/p7-katalog~1 yalnız sayfalamayı alır (commit 1 tek başına tsc/lint temiz doğrulandı).
  5. Üç küçük sapma var (aşağıda): köprü sabitinin yeri, tek birimli üniversite sayfalarına sıra aralığı eklenmesi, uzun bölüm adlarında <title> uzunluğu.

Commit listesi

# Hash Mesaj Dosyalar
1 4dfb24b feat(seo): derin katalog sayfalarında başlık/açıklama/H1'i sayfanın içeriğiyle ayrıştır bolum-icerik.tsx, universite-icerik.tsx, sayfalama.tsx
2 f1abedc feat(katalog): CTA kartında vaatsiz başlık + köprü cümlesi, /bolum sayfasına CTA cta-sira-form.tsx, universite-icerik.tsx, bolum-icerik.tsx, sayfalama.tsx

Metadata nerede üretiliyor: rota dosyalarındaki generateMetadata → bolumSayfaMetadata / uniSayfaMetadata (iki *-icerik.tsx) → sayfaMetadata (seo.tsx, dokunulmadı). Next metadata API'sine dokunulmadı (yalnız title/description string'leri); yine de node_modules/next/dist/docs/01-app/03-api-reference/04-functions/generate-metadata.md title/template bölümü okundu — kök template: "%s — KolayTercih" derin sayfalara da uygulanıyor.

Tek yardımcı: sayfaDilimi() (sayfalama.tsx) → bolumSayfaDilimi() / uniSayfaDilimi(); hem metadata hem gövde bunları çağırıyor (gövdedeki eski elle slice kaldırıldı).

Örnek üretilen metinler (gerçek veri, lokal data/yokatlas.db, salt-okunur betik)

Yöntem: bileşen modülü next/link yüzünden node'da yüklenemediği için betik @/lib/katalog'u gerçek DB'ye karşı çalıştırdı; metin yardımcıları dosyalardan birebir kopyalandı (betik scratchpad'de, commit'lenmedi).

Bölüm — Psikoloji (381 program, 8 sayfa)

1. sayfa (değişmedi) sayfa/2 sayfa/3
title Psikoloji Taban Puanları ve Başarı Sıralamaları 2026 Psikoloji Taban Puanları 2026 (Sıra 52.892–102.279, Sayfa 2) Psikoloji Taban Puanları 2026 (Sıra 103.498–139.934, Sayfa 3)
description Psikoloji 2025 yerleştirme verileri: 381 programın taban puanı ve sıralaması, 90 devlet / 291 vakıf. En iyi taban sıralaması 522. 2026 tercih rehberi. Psikoloji taban puanları, sayfa 2: taban sırası 52.892–102.279 arası programlar. Toplam 381 programın 2025 yerleştirme verileri — taban puanı, başarı sıralaması ve kontenjan. …sayfa 3: taban sırası 103.498–139.934 arası programlar. …
H1 Psikoloji Psikoloji — Sayfa 2 + (H1 içinde alt satır) Taban sırası 52.892–102.279 arası programlar Psikoloji — Sayfa 3 + Taban sırası 103.498–139.934 arası programlar
breadcrumb Ana sayfa › Bölümler › Psikoloji Ana sayfa › Bölümler › Psikoloji (link) › Sayfa 2 aynı desen

Eski sayfa/2: title "Psikoloji Taban Puanları 2026 (Sayfa 2)", H1 "Psikoloji" (1. sayfayla aynıydı), breadcrumb'da üst bölüm linki yoktu.

Üniversite — İstanbul Medipol (428 program, 9 sayfa)

1. sayfa (değişmedi) sayfa/2 sayfa/3
title İstanbul Medipol Üniversitesi Taban Puanları ve Başarı Sıralamaları 2026 İstanbul Medipol Üniversitesi Taban Puanları 2026 (Sayfa 2) — değişmedi … (Sayfa 3)
description İstanbul Medipol Üniversitesi 2025 yerleştirme verileri: 428 programın taban puanları, başarı sıralamaları ve kontenjanları (İstanbul). 2026 tercih rehberi. İstanbul Medipol Üniversitesi taban puanları, sayfa 2: Güzel Sanatlar Tasarım ve Mimarlık Fakültesi, Hukuk Fakültesi ve 3 birim daha. Toplam 428 programın 2025 yerleştirme verileri — taban puanı, başarı sıralaması ve kontenjan. …sayfa 3: İşletme ve Yönetim Bilimleri Fakültesi ve Meslek Yüksekokulu. …
giriş paragrafı (değişmedi) mevcut cümle + "Bu sayfadaki birimler: Güzel Sanatlar Tasarım ve Mimarlık Fakültesi, Hukuk Fakültesi ve 3 birim daha." + ilk sayfa linki aynı desen

Tek birimli sayfa örneği (Beykent): sayfa/3 "…: Meslek Yüksekokulu (taban sırası 419.725–669.824 arası)." · sayfa/4 "…: Meslek Yüksekokulu (taban sırası 680.217–2.190.246 arası)."

Uç durumlar (tüm derin sayfalar üzerinde sayıldı): 304 bölüm derin sayfasının 21'i tümüyle taban verisiz → title "(Sayfa N)", description/H1 "taban verisi olmayan programlar"; 113'ü kısmen verisiz → "taban sırası X–Y arası programlar ile taban verisi olmayanlar"; 3'ünde min=max → "taban sırası X olan programlar". 363 üniversite derin sayfasında birim adı çıkmayan 0 (çıkmazsa eski description'a düşer; fakültesi boş satırlar "Diğer" grubunda kalır, ad listesine girmez). Dilim boşsa (geçersiz sayfa no) eski metne düşer — sayfa zaten notFound().

Önce → sonra metin tablosu (commit 2)

Yer Önce Sonra
cta-sira-form.tsx profilli kart başlığı (varsayılan) Sıralamanla nereye yerleşirsin? Saniyede gör. Sıralamana yakın programlar hangileri? Saniyede gör.
cta-sira-form.tsx profilsiz kart başlığı (varsayılan) Sıralamanla nereye yerleşirsin? Saniyede gör. Sıralamana yakın programlar hangileri? Saniyede gör.
Çekmece DrawerTitle (sr-only) Sıralamanla nereye yerleşirsin? Sıralamana yakın programlar hangileri?
Çekmece H2 Sıralamanla nereye yerleşirsin? Sıralamana yakın programlar hangileri?
universite-icerik.tsx baslik Sıralamanla {uni.ad} programlarına yerleşir misin? Sıralaman {uni.ad} tabanlarının neresinde?
bolum-icerik.tsx baslik (kart yoktu) Sıralaman {bolum.ad} tabanlarının neresinde?
Katalog aciklama (üniversite + bölüm, yalnız profilsiz kart) varsayılan paragraf Bu tablodaki tabanlar geçmiş yerleştirmelerin sonucu; bu yıl değişebilir. Sıralamanı gir, tabanı sıralamana yakın programları risk seviyesine göre ayrılmış hâlde listeleyelim. Ücretsiz, üyelik gerekmez.
Varsayılan paragraflar (profilli + profilsiz + çekmece) — Aynen ("garanti dilimleri" dahil, dokunulmadı)
Buton metinleri / ikon deseni — Aynen (metin + sonda ArrowRight className="size-4")

CtaSiraForm kullanım yerleri ve etkisi

Yer Prop Etki
src/app/rehber/page.tsx:45 yok Varsayılan başlık değişti (kart + çekmece); paragraf aynı
src/features/rehber/components/rehber-makale.tsx:100 yok aynı
src/features/katalog/components/bolum-listesi.tsx:101 (/bolumler) yok aynı
src/features/katalog/components/universite-listesi.tsx:94 (/universiteler) yok aynı
src/features/katalog/components/universite-icerik.tsx baslik + aciklama Yeni başlık + köprü cümlesi
src/features/katalog/components/bolum-icerik.tsx (YENİ) baslik + aciklama Kart ilk kez geliyor; 1. ve derin sayfalarda

Ana sayfa CtaSiraForm kullanmıyor (hero kendi formunu kullanıyor) → ana sayfa etkilenmedi. Çekmece başlığı baslik prop'undan bağımsız sabit (şartname gereği) → katalogda kart başlığı "…tabanlarının neresinde?", açılan çekmecede "Sıralamana yakın programlar hangileri?". Profilli ziyaretçide aciklama kullanılmaz (şartname: yalnız profilsiz kart); başlık baslik'tan gelir.

cta_form_goruntulendi: useGorunumOlayi çağrısı ve ref={formRef} bağlaması değişmedi (cta-sira-form.tsx:91,180). Yan etki (beklenen): olay artık /bolum/* pathname'lerinden de düşecek — payda büyür; Rybbit pathname'i zaten yazdığı için sayfa tipine göre ayrıştırılabilir.

Kabul kriterleri

Kriter Durum Kanıt
Bölüm sayfa>1: title+description+H1 taban sırası aralığı; null'lar hariç; tümü null yedeği Tamam bolumSayfaDilimi + siraAraligiMetni; yukarıdaki örnekler + uç durum sayımı
Üniversite: description + giriş paragrafı birim adları (ilk 2 + "ve N birim daha") Tamam uniSayfaDilimi + fakulteOzeti; Medipol örnekleri
Bölüm breadcrumb'ı üniversite deseniyle (üst link + Sayfa N) Tamam bolum-icerik.tsx nav; bölüm nav'ının kendi link class'ları kullanıldı
Canonical/robots/sitemap/rota dosyaları değişmez Tamam git diff --stat e1bb482 HEAD → yalnız 4 dosya; path: satırlarında diff yok
1. sayfa regresyonu yok Tamam 1. sayfa dalları diff'te yok; H1/paragraf 1. sayfada aynı metni üretir
Metadata ve gövde tek yardımcıdan Tamam ikisi de *SayfaDilimi() çağırıyor
aciklama?: string, varsayılan paragraflar aynen Tamam diff: paragraf metni kelimesi kelimesine aynı, yalnız aciklama ?? sarmalı
Başlıklar (varsayılan 4 yer + üniversite + bölüm) Tamam önce→sonra tablosu
Kart /bolum'da aynı konum (mt-10, liste+sayfalama altı) Tamam bölümde sayfalama BolumProgramListesi içinde; kart </section> sonrası <div className="mt-10">
grep -rniE "yerleşir misin|yerleşirsin" src → 0 Kendi dosyalarımda 0; dalda 1 isabet kalıyor src/lib/ai/rapor.ts:166 riskNotuUret ("yüksek ihtimalle yerleşirsin") — LLM prompt'u değil ama benim dosyam da değil; P3 (cae2aaa, risk.ts:55'e taşıyıp düzeltti) merge edilince 0'a iner
Yeni badge/pill/modal yok Tamam yeni eleman: yalnız H1 içinde <span class="block …"> alt satır
Yeni metinlerde vaat yok Tamam yerleşirsin/garanti/olasılık geçmiyor

Doğrulama

Her iki commit'te ayrı ayrı: pnpm exec next typegen → 0 · pnpm exec tsc --noEmit → 0 · pnpm lint → 0. pnpm build koşulmadı (şartname). Çalışma ağacı temiz; git add yalnız adı verilen dosyalarla yapıldı.

Sapmalar / en güvenli yorumlar

  1. Köprü sabiti sayfalama.tsx'te (KATALOG_CTA_ACIKLAMA). Şartname bu dosyayı yalnız dilim yardımcısı için anmıştı. Gerekçe: cta-sira-form.tsx "use client" — istemci modülünden export edilen string sunucu bileşeninde değer olarak okunamaz (client reference olur); bolum-icerik↔universite-icerik çapraz import'u ise bölüm rotasının modül grafiğine üniversite sayfasının istemci bileşenlerini sokardı. sayfalama.tsx iki sayfanın zaten ortak import ettiği, yönergesiz küçük modül. Alternatif: cümleyi iki dosyada tekrarlamak (tek-kaynak ilkesine aykırı bulundu).
  2. Tek birimli üniversite sayfalarına taban sırası aralığı eklendi (şartnamede yok). İlk koşuda 9 sayfanın description'ı sayfa numarası dışında komşusuyla aynı çıktı (Beykent 4-5, Nişantaşı 4 ve 7, Arel/Gelişim/Topkapı/Üsküdar 4, İzmir Kavram MYO 3 — 100+ programlı MYO'lar iki sayfayı tek başına dolduruyor). Dilim tek birimse "(taban sırası X–Y arası)" eklenince çakışma 0'a indi. Birim içinde satırlar zaten taban sırasına göre dizili olduğu için ifade doğru.
  3. Üniversite <title> değişmedi (CEO: "~60 karakteri aşmasın"). 10 §B3'teki "uzunluk elverirse başlığa" seçeneği uygulanmadı: taban başlık zaten ~55–60 karakter, koşul neredeyse hiç sağlanmıyor. Üniversite derin sayfalarında farklılaşma description + gövdede.
  4. Bölüm <title> uzun bölüm adlarında uzuyor: en uzun 96 karakter ("Siyaset Bilimi ve Uluslararası İlişkiler Taban Puanları 2026 (Sıra 1.193.512–1.703.790, Sayfa 3)") + " — KolayTercih". Google keser; aralık kesilen kısımda kalabilir. CEO bölümde aralığın title'da olmasını açıkça istediği için kısaltma kuralı eklenmedi — Bilal/SEO kararı (ör. uzun adlarda "Taban Puanları 2026" yerine "2026").
  5. H1 biçimi: 10 §B3'teki öneri izlendi — "Psikoloji — Sayfa 2", aralık H1'in içinde blok alt satır (text-lg sm:text-2xl, muted). Böylece H1 aralığı taşıyor (CEO) ama 5xl punto ile üç satıra yayılmıyor.
  6. Lisans + önlisans karışan dilimde aralık min–max (CEO şartı): SAY/EA sırası ile TYT sırası aynı cümlede birleşiyor; teknik olarak doğru, anlamca karışık olabilir.
  7. Bölüm listesi istemci tarafında yeniden sıralanabiliyor (URL değişmeden); H1/paragraftaki aralık varsayılan (taban sırası) dizilimi anlatır. Kullanıcı "Puan"a göre sıralarsa görünen satırlar aralığın dışına çıkar — mevcut davranış, dokunulmadı.

Bilal'in tarayıcıda bakması gerekenler

  1. Mobilde derin bölüm H1'i: /bolum/psikoloji/sayfa/2 — "Psikoloji — Sayfa 2" + gri alt satır; uzun adlı bir bölümde de bak (/bolum/siyaset-bilimi-ve-uluslararasi-iliskiler/sayfa/3).
  2. Bölüm breadcrumb'ı: derin sayfada "Psikoloji" tıklanabilir ve 1. sayfaya gidiyor mu; mobilde satır kırılması.
  3. /bolum/psikoloji altındaki yeni CTA kartı: tablo + sayfalama + veri kaynağı satırının altında; başlık "Sıralaman Psikoloji tabanlarının neresinde?"; buton → çekmece açılıyor, sıra girişi → sihirbaz → /sonuc akışı bozulmamış mı. Sayfada iki #cta-siralama yok (tek kart).
  4. Üniversite sayfası kartı: uzun üniversite adında başlık iki satıra taşıyor mu ("Sıralaman Burdur Mehmet Akif Ersoy Üniversitesi tabanlarının neresinde?").
  5. Köprü cümlesini oku (metin kararı senin): "…risk seviyesine göre ayrılmış hâlde listeleyelim." /sonuc ücretsiz tablosundaki dilim sekmeleriyle örtüşüyor mu.
  6. Profilli hâl: sıralaman kayıtlıyken katalog kartı yeni başlığı + eski "Sıralaman kayıtlı…" paragrafını gösteriyor (köprü cümlesi bu hâlde görünmez — şartname).
  7. /rehber, bir rehber yazısı, /bolumler, /universiteler: varsayılan başlık "Sıralamana yakın programlar hangileri? Saniyede gör." bağlama oturuyor mu.
  8. Build sonrası kontrol (entegrasyon build'inde): .next/server/app/bolum/psikoloji/sayfa/2.html içinde <link rel="canonical" …/sayfa/2> ve <meta name="robots" content="index, follow"> aynı; <title>/<h1> yukarıdaki gibi. Deploy sonrası Search Console'da 2–3 derin sayfa için "dizine ekleme iste".

Yazılımcı A · K1 kapı ölçümü + K4 prototip

Özet (5 madde)

  1. K1 tamam, 3 commit, gece/p5-kapi-olcum (taban e1bb482). program_eklendi artık yalnız gerçek eklemede atılıyor; kapi_acildi / kapi_kapatildi eklendi; kullaniciTanit script'ten önce kaybolmuyor. Davranış değişmedi: profilsiz + hâlâ kapıyı açıyor.
  2. K4 tamam, tek commit, gece/p6-arti-aninda-ekle (taban = P5 tepesi) — [Bilal onayı gerekir]. Profilsiz + programı anında ekliyor, kapı açılmıyor; 8 sn'lik toast "Sıralamamı gir →" ile kapıyı doğrudan sıra adımında açıyor. Yalnız iki dosya.
  3. K4'ün en önemli riski (CEO varsayımı kısmen yanlış): riskleriYenile yalnız kapı tamamlanınca çağrılıyor (profilTamamlandi). Profil kapı dışı yoldan yazılırsa (katalog sayfasının dibindeki CtaSiraForm, ana sayfa hero-form, sihirbaz-cagri-karti, giriş sonrası liste-senkron) önceden eklenmiş null riskler null kalır → /sonuc haritasında turuncu ("az riskli") pin. Şartname "yeni kod yazma" dediği için düzeltmedim; 3 satırlık öneri aşağıda.
  4. Profilsiz listenin tek yüzeyi çekmece. /listem giriş ister ve manuel listeyi değil YZ raporunu gösterir; secimlerim-paneli hiçbir yere monte değil (ölü bileşen). Çekmece altındaki "Risk analizini biz yaptık / Her seçimin yerleşme riski hazır" kartı profilsiz listede yanlış beyan olur.
  5. Her iki dalın tepesinde next typegen + tsc --noEmit + pnpm lint temiz. pnpm build koşulmadı (talimat). Tarayıcıda hiçbir şey doğrulanmadı.

Commit listesi

Dal Hash Başlık
gece/p5-kapi-olcum 4b87a3e fix(analitik): program_eklendi yalnız gerçek eklemede atılsın
gece/p5-kapi-olcum 67be93c feat(analitik): kapi_acildi + kapi_kapatildi olayları
gece/p5-kapi-olcum 643e41c fix(analitik): kullaniciTanit script'ten önce sessiz no-op olmasın
gece/p6-arti-aninda-ekle 1a87d89 feat(liste): ilk + profilsiz ziyaretçide anında eklesin [Bilal onayı gerekir]

Worktree: .claude/worktrees/p5-kapi-olcum (şu an gece/p6-arti-aninda-ekle checkout'lu; P5 dalı 643e41c'de duruyor). Dokunulan dosyalar — K1: src/lib/analitik.ts, program-ekle-butonu.tsx, use-tercih-profili.ts, tercih-profili-kapisi.tsx. K4: use-tercih-profili.ts, program-ekle-butonu.tsx. Başka dosya yok; rybbit-identify.tsx, arama-funnel-karti.tsx vb. açıcılara dokunulmadı.

Olay tablosu

Olay Nerede atılıyor Özellikler
program_eklendi (P5) program-ekle-butonu.tsx handleClick, yalnız sonuc.eklendi === true {kaynak, yol: "dogrudan"}
program_eklendi (P5) use-tercih-profili.ts profilTamamlandi, bekleyen program için ekle() true döndüyse {kaynak: bekleyen.kaynak, yol: "kapi"}
kapi_acildi use-tercih-profili.ts kapiyiAc() — depodaki tek açılış noktası; üç açıcı da buradan geçer {tetik}: programEkleIste→arti · profilDuzenlemeyiAc→duzenle · profilToplamaAc(hedef, dogrudanSira, tetik?)→ verilen değer, yoksa hedeften sonuc/sihirbaz, o da yoksa diger
kapi_kapatildi tercih-profili-kapisi.tsx vazgec() — bileşendeki tek nokta (Dialog onOpenChange(false) = X / dışarı tıklama / Esc, giriş adımı "Vazgeç", sıra adımı "Vazgeç") {adim: giris|sira|sihirbaz, tetik}
program_eklendi (P6) buton, aynı nokta {kaynak, yol: "dogrudan", profilli: "evet"|"hayir"}
kapi_acildi (P6) toast aksiyonu → profilToplamaAc(null, true, "arti_toast") {tetik: "arti_toast"} (P6'da arti artık hiç atılmaz)

Hiçbir olayda ham sıra / e-posta / program adı yok. tetik türetmesi sayesinde sonucaGitIste (sonuc) ve arama-funnel-karti (sihirbaz) dosyalarına dokunmadan doğru değeri alıyor; diger bugün hiçbir açıcıdan çıkmıyor (ileride profilToplamaAc() argümansız çağrılırsa düşer).

Kabul kriterleri — K1

# Kriter Sonuç Kanıt
1 program_eklendi yalnız gerçek eklemede; kapiAcildi dalında atılmaz Geçti Buton: else if (sonuc.eklendi); kapiAcildi sonucu hiçbir dala girmiyor. profilTamamlandi: const eklendi = ekle(...); if (eklendi) olay(..., {yol: "kapi"})
2 kapi_acildi {tetik} + kapi_kapatildi {adim, tetik}; kapatıldı yalnız tamamlanmadan Geçti (kod incelemesi) Tamamlanma yolu: secimleriTamamla → profilTamamlandi depoda acik:false yazar; profilKapisiniKapat/vazgec çağrılmaz. Radix Dialog kontrollü open prop'u değişince onOpenChange tetiklemez (yalnız kullanıcı etkileşiminde) → olay atılmaz. adim, üst bileşendeki adimRef'te; KapıIcerik mount'ta ve her adimaGec'te bildirir (key ile remount'ta başa sarar). vazgec if (!acik) return ile çift atışa karşı korumalı
3 kullaniciTanit tek slot, olaylardan önce; kullaniciTemizle slotu siler Geçti Scratchpad'de tsx betiği (commit'lenmedi): script yokken olay(sonuc_goruntulendi) → kullaniciTanit(u1) → kullaniciTanit(u2); script gelince çağrı sırası ["identify:u2","event:sonuc_goruntulendi"] (u1 ezildi, kimlik olaydan önce). Script varken kullaniciTanit(u3) doğrudan, kullaniciTemizle → clear. Script 10 sn'de gelmezse slot da atılır (kuyrukKapali). rybbit-identify.tsx diff'te yok
4 OlayAdi'na yalnız 2 ad + seri kırılması yorumu Geçti git diff e1bb482..643e41c -- src/lib/analitik.ts: birlikte yalnız kapi_acildi, kapi_kapatildi; program_eklendi üstünde "önce = + tıklaması, sonra = gerçek ekleme; seriler karşılaştırılamaz" notu
5 Davranış değişmez; grep -rn "program_eklendi" src → 2 atış + tip Geçti grep çıktısı: program-ekle-butonu.tsx:59, use-tercih-profili.ts:289, analitik.ts:26. Açıcıların durum yazımı kapiyiAc'a taşındı ama yazılan alanlar birebir aynı (+tetik)

Kabul kriterleri — K4

# Kriter Sonuç Kanıt
1 Profilsiz: hemen ekle, kapı açma, profilsiz: true; olayda profilli Geçti programEkleIste'de kapı dalı kalktı; tek ekleme yolu, profilsiz = !tercihProfiliTamamlandiMi(). Katalogda adaySira yok → programdanManuelTercih(..., null) → risk null. kapiAcildi alanı tipte kaldı (hep false)
2 Toast: sabit id, ~8 sn, başlık/açıklama/aksiyon birebir, sonda ArrowRight Geçti sonner Action.label: React.ReactNode (node_modules/sonner/dist/index.d.ts:44) → <span className="inline-flex items-center gap-1">Sıralamamı gir <ArrowRight className="size-4" aria-hidden /></span>. id: "profilsiz-ekleme", duration: 8000, toast.success. Metin başında ikon yok, Sparkles yok (soldaki onay işareti sonner'ın kendi success ikonu, buton etiketi değil)
3 Profil girilince riskleriYenile null'ları doldurur (yeni kod yok) Kısmen Toast → kapı yolu: profilTamamlandi ilk iş riskleriYenile(profil) çağırır → tüm liste riskHesapla(efektifSira, profil.sira) ile yeniden yazılır. Ama grep -rn riskleriYenile src → tek çağrı yeri bu. Kapı dışı 4 profil yazma yolu listeyi yenilemiyor (bkz. Riskler #1)
4 Tüketici envanteri Aşağıda —
5 SEMA, meraklisina-icerik.tsx, kapı bileşeni, sihirbaz adımları değişmedi Geçti git diff 643e41c..1a87d89 --stat → yalnız 2 dosya. + kapısı /meraklisina şemasında yok (CEO §1 tablosu) → AGENTS.md şema senkron kuralı tetiklenmez

tsc / lint

Dal tepesi next typegen tsc --noEmit pnpm lint
gece/p5-kapi-olcum @ 643e41c başarılı 0 hata 0 hata / 0 uyarı
gece/p6-arti-aninda-ekle @ 1a87d89 başarılı 0 hata 0 hata / 0 uyarı

Ara commit'ler (4b87a3e, 67be93c) de commit anında tsc + lint temizdi. pnpm build koşulmadı.

K4 tüketici envanteri — profilsiz + dolu liste

Yüzey Ne gösteriyor Durum
Navbar listem-butonu.tsx İlk eklemede belirir, turuncu sayaç rozeti Sorun yok — ekleme onayının kalıcı izi (toast kaybolunca bu kalıyor)
Çekmece satırı liste-cekmecesi.tsx:398 tercih.risk ? nokta : null → null riskte nokta yok, satır düzgün Kırılmıyor. Ama başlıktaki renk lejandı (yeşil/turuncu/kırmızı) noktasız listede boşa duruyor
Çekmece alt kartı liste-cekmecesi.tsx:~271 "Risk analizini biz yaptık — Her seçimin yerleşme riski hazır" + "Listemde aç" → /listem Yanıltıcı: profilsiz listede risk yok; link de girişsizi /giris'e atar, girişliye manuel listeyi değil YZ raporunu (ya da boş CTA'yı) gösterir
Çekmece + (kesik çizgili) sonucaGitIste() → profilsizde kapı (tetik: sonuc) Çalışır; sıra girişine ikinci doğal yol
secimlerim-paneli.tsx Null riski karşılıyor (:223), profilsizde "Tercih profilin oluşunca uyum notları görünür" Hiçbir yere monte değil (grep -rn SecimlerimPaneli src → yalnız kendi dosyası). Ölü kod; profilsiz listenin tam sayfa görünümü fiilen yok
/listem (listem-icerik → listem-govde) verifySession → girişsiz /giris'e yönlenir; girişlide YZ raporu ya da ListemBosCta. Manuel liste burada gösterilmiyor CEO'nun "profilsiz /listem" kontrol maddesi karşılıksız: bakılacak ekran çekmece
kaydet-banner Girişsiz + ≥3 seçim + /sonuc ve kromsuz sayfalar dışında Artık profilsiz ziyaretçi için ulaşılabilir (eskiden kapı yüzünden 3'e çıkılamıyordu). Metni risk iddia etmiyor. Toast üstte (top-center), banner altta → çakışma yok
manuel-harita.tsx:33 t.risk ?? "az-riskli" → null risk turuncu pin Yalnız /sonuc'ta monte. Profilsiz /sonuc = SiraGerekli (harita yok) → saf profilsizde görünmez. Görünür olduğu iki durum: (a) eski ?sira= linkiyle profilsiz /sonuc, (b) Riskler #1 — profil kapı dışından girilince null'lar kalır → katalogdan eklenenler yanlış renkle (turuncu, "az riskli") pinlenir
liste-senkron / liste-dogrula.ts risk: null doğrulamadan geçiyor, sunucuya null yazılıyor Kırılmıyor; girişte sunucudan profil gelirse (tercihProfiliYaz) riskler yine yenilenmiyor (#1)

K4 riskleri

  1. Null riskler kapı dışı profil girişinde kalıcı. En olası senaryo tam da hedef kitle: üniversite sayfasında + → toast'ı kaçırır → sayfa dibindeki CtaSiraForm'a sırasını yazar → /sonuc haritasında eklediği programlar turuncu. Önerilen düzeltme (K4 commit'ine ek, sahip olunan dosyada, ~3 satır — yazılmadı): use-tercih-profili.ts yukle() içindeki PROFIL_DEGISTI_EVENT dinleyicisinde profiliTazele() sonrası if (durum.profil) riskleriYenile(durum.profil);. Alternatif/tamamlayıcı: manuel-harita.tsx:33'te null riski nötr (gri) pinle göstermek (Bilal/tasarım kararı).
  2. Toast mobilde görünürlük. Toaster position="top-center"; %93 mobil, + genelde ekranın alt yarısında. 8 sn sonra tek kalıcı iz navbar'daki sayaç. Aksiyon butonu sonner'ın 24 px yüksekliğindeki varsayılan butonu — dokunma alanı küçük, size-4 ok 12 px metnin yanında büyük durabilir. Gözle bakılmalı.
  3. Ölü yol: bekleyen / "Kaydet ve programı ekle" etiketi / program_eklendi {yol:"kapi"} P6'da erişilemez (kimse bekleyen yazmıyor). Bilerek bırakıldı: revert tek commit kalsın, kapı bileşenine dokunulmasın. Karar "evet" olursa ayrı temizlik commit'i.
  4. Seri: P6 canlıya çıkarsa kapi_acildi{tetik:arti} sıfıra iner, yerine arti_toast gelir; Huni C'nin yeni tanımı program_eklendi{profilli:hayir} → kapi_acildi{arti_toast} → sira_girildi{kaynak:kapi}.
  5. Art arda +'larda sabit id toast'ı yeniler (yığılmaz) ama süre her seferinde baştan başlar — istenen davranış.

Sapmalar / yorumlar

  • kapi_acildi depodan, kapi_kapatildi bileşenden. Şartnamedeki "olay, kapı bileşeninde tek noktadan atılır" cümlesini kapi_kapatildi için okudum (adımı yalnız bileşen bilir). kapi_acildi depodaki tek açılış fonksiyonundan atılıyor: bileşende mount effect'iyle atmak, key profil değişince remount ettiği için çift sayıma açıktı.
  • tetik varsayılanı hedeften türetiliyor (tetik ?? hedef ?? "diger"): şartname "her açıcı kendi değerini yazar" diyor ama arama-funnel-karti.tsx sahip olunan dosyalarda değil; türetme aynı sonucu dosyaya dokunmadan veriyor.
  • KapıIcerik'e iki prop eklendi (onAdimDegisti, onVazgec) ve bir mount effect'i (eslint-disable-next-line react-hooks/exhaustive-deps, repoda emsali var). Görsel/metin değişikliği yok.
  • K4'te adaySira verilmişse (yalnız /sonuc tablosu, eski ?sira= linki) risk null değil o sıradan hesaplanıyor — mevcut programdanManuelTercih semantiği korundu; katalogda her zaman null.
  • K4 toast'ı toast.success (mevcut iki uyarı toast.info); "eklendi" olumlu onay olduğu için.

Bilal'in elle bakması gerekenler

  1. K1 deploy tarihini yaz (karar #13) — program_eklendi serisi o gün kırılıyor.
  2. K4, telefonda 10 dk: üniversite sayfasında profilsiz + → toast görünüyor mu, okunuyor mu, "Sıralamamı gir" dokunulabilir mi ve kapıyı sıra adımında açıyor mu; kapıyı tamamlayınca çekmecede noktalar geliyor mu.
  3. Aynı testin kötü yolu: profilsiz 2 program ekle → toast'a dokunma → sayfa dibindeki forma sıranı gir → /sonuc haritasında pinlerin rengine ve çekmecede noktaların gelmediğine bak (Risk #1). K4'e "evet" diyeceksen 3 satırlık düzeltmeyi de iste.
  4. Çekmece alt kartındaki "Risk analizini biz yaptık" metni profilsiz listede kalsın mı (metin/koşul kararı).
  5. Rybbit canlıda: kapi_kapatildi'nin tamamlanan kapıda düşmediğini bir kez kendi oturumunla doğrula (kod incelemesiyle gösterildi, tarayıcıda denenmedi); OAuth dönüşünde sonuc_goruntulendi'nin tanımlı kullanıcıya yazıldığına bak (commit 3).

Blog: universite-okurken-tekrar-yks

Yazar: SEO/GEO içerik yazarı (gece vardiyası, 2. tur · B1) · Worktree .claude/worktrees/rehber-yazilari, dal gece/rehber-yazilari · yalnız content/rehber/*.md · push yok, pnpm build koşulmadı (src/ değişmedi).

Özet (5 madde)

  1. İki commit, şartnamedeki sırayla: 9c7ea13 fix(rehber) (küçük düzeltmeler) → 2602b6f feat(rehber): universite-okurken-tekrar-yks yazısı (yeni yazı + 3 iç link, en tepede). Bilal yazıyı almazsa gece/rehber-yazilari~1 = 9c7ea13; linkler de gider, 404 kalmaz.
  2. Yazı: ~1.250 kelime (şema ve Kaynaklar hariç), 1 flowchart TD (%% aria + %% altyazi), 1 tablo (devam / kayıt dondurma / kayıt sildirme × hak / bedel / geri dönüş), 5 soruluk SSS, Kaynaklar (6 kaynak, erişim tarihli), 7 farklı iç hedef (mezuna-kalmak…, yatay-gecis…, obp-nedir…, hazirlik-sinifi…, hedef-siralama…, olu-tercih… + /bolumler, /tercih-robotu). Frontmatter/şema çiti src/lib/rehber.ts regex'leriyle node'da doğrulandı; 28 yazıda 118 /rehber/* linki, 0 ölü.
  3. Omurga cümleleri bu gece birincil metinden tekrar okundu (önceki yazarın scratchpad'deki pypdf çıktıları + YÖK ilkeleri PDF'i bu oturumda yeniden indirilip okundu): kayıtlı olmak tercih/yerleştirmeye engel değil; yeni kayıt için ilişik kesme şart (YKS Kılavuzu b.10); başvuru formunda "Bir yükseköğretim programına kayıtlıyım" seçeneği (23. alan, kod 6); Ek Madde-1'in ara sınıflar/son sınıf dâhil olduğu (YÖK ilkeleri A.7).
  4. Kanibalizasyon sınırı korundu: OBP kuralı yeniden anlatılmadı (tek paragraf özet + 2 link); Ek Madde-1'in kontenjan oranı/başvuru dönemi maddeleri tekrar edilmedi, mezuna-kalmak…'a bırakıldı. Bu yazıya özgü olanlar: okuyan öğrenciyi ilgilendiren ilke maddeleri (hangi yılın puanı, intibak, taban oluşmamış program, özel koşul/dil şartı, vakıf bursu kararı), not ortalamasıyla kurumlar arası geçişin yönetmelik şartları, sınava giriş→tercih→ilişik kesme sırası.
  5. Vaat/kaygı dili yok; askerlik/tecil, harç/ücret rakamı, 2027 tarihi yok; dilim adı ilk geçişte "güvenli (halk arasında "garanti tercih")"; "dilimler yerleşme olasılığı değil" notu var.

Commit 1 — 9c7ea13 ayrıntı

  • hedef-siralama-nasil-belirlenir.md:83: "; üründe dilimin adı da böyle geçer" yan cümlesi silindi (parantez "(halk arasındaki adıyla garanti tercih)" olarak kaldı).
  • taban-siralamalar-nasil-degisir.md: %% aria ("beş yılın (2021–2025) tabanı filmdir. Beş yıl üst üste…"), şema düğümü ("5 yılın tabanı = film"), kenar etiketi ("5 yıl dar bantta"), gövde :42 ("5 yılın (2021–2025) tabanı filmdir"), :44 ("5 yıl üst üste dar bantta"), :53 ("son 5 yılın (2021–2025) tabanına bak"). Dokunulmayan: %% altyazi "en az 3-4 yıla bak" (genel okuma tavsiyesi; CEO notu).
  • DB teyidi (sqlite3 -readonly data/yokatlas.db): programs tablosunda sira2021…sira2025 kolonları var; dolu satır sayıları 2021: 11.450 · 2022: 18.086 · 2023: 18.373 · 2024: 20.805 · 2025: 17.994 (toplam 23.610 program). Ürün satır başlığı da "Son 5 yıl" (bolum-program-listesi.tsx:160, program-tablosu.tsx:242).

Commit 2 — 2602b6f iç linkler (3 dosya, şartnamedeki üst sınır)

Dosya Değişiklik
mezuna-kalmak-mi-kayit-olmak-mi.md "Üniversitede kayıtlıyken YKS'ye girebilir misin?" paragrafının sonuna tek cümle + link
yerlesemedim-ne-yapmaliyim.md Yol 3 girişine yarım cümle + link
yatay-gecis-cap-yandal.md "4) Yeniden sınava girmek" 2. madde yeniden yazıldı + link + guncelleme: 2026-09-21. Eski cümle "ertesi yıl yerleştiğinde eski kaydın silinir" diyordu; kılavuzda böyle bir otomatik silme hükmü yok (b.10 yalnızca "ilişiğini kesmezse yeni programa kayıt yaptıramaz" diyor). Cümle kılavuz ifadesine çekildi; eski cümledeki yks-tercih-takvimi-2026 linki düştü. Dikkat: Bilal commit 2'yi almazsa bu teyitsiz cümle geri gelir — o durumda elle düzeltilmeli.

Doğrulanan bilgiler + kaynaklar (hepsi 21.09.2026 gecesi birincil metinden okundu)

Yazıdaki iddia Kaynak
Kayıtlı olmak YKS (ÖZYES dâhil) tercih ve yerleştirmesinde bir programa yerleştirilmeye engel değil; aynı anda iki örgün ön lisans ya da iki örgün lisansa kayıt/devam yok; ilişiğini kesmeyen yeni yerleştirildiği programa kayıt yaptıramaz 2026-YKS Kılavuzu b.10 (kılavuz s.45 / PDF s.50) — sayfa: https://www.osym.gov.tr/2026yuksekogretim-kurumlari-sinavi-yks-kilavuzu . Aynı uyarı geçerli: ÖSYM'deki asıl PDF 10 MB sınırını aşıyor; metin ÖSYM e-imza ibareli MEB kopyasından (önceki yazarın kullandığı URL) okundu
Başvuruda öğrenim durumu seçeneği "Bir yükseköğretim programına kayıtlıyım" (kod 6); ayrıca "yerleştirildim fakat kayıt olmadım" (5), "kaydım silindi" (9) Aynı kılavuz, başvuru bilgileri 23. alan "Öğrenim Durumu ve Kodu" (PDF s.13)
OBP: bir önceki yılın YKS'siyle yerleşen, "kayıt olsun veya olmasın"; 2026-YKS ile yerleşen 2027-YKS'ye girerse katsayı yarıya YKS Kılavuzu b.4.2 (PDF s.38) · Kontenjan Kılavuzu b.1.3 · SSS 51–52 (URL'ler önceki tabloda)
ÖSYM uyarısı: yerleşirsen bir sonraki yıl katsayı yarıya ineceğinden devam etmeyi düşünmediğin programı yazma Kontenjan Kılavuzu, tercih uyarıları 2-ç (PDF s.19–20)
Ek Madde-1: kayıt yılındaki puan ≥ hedefin o yılki tabanı, puan türü (A.2) · bir kez (A.5) · hazırlık, ara sınıflar ve son sınıf dâhil; intibakı ilgili kurullar yapar (A.7) · fazla başvuruda puanı yüksek olandan (A.11) · hedefin özel koşulları (A.16) · kayıt yılında öğrenci almamış programa geçiş yok (A.17) · yabancı dil şartı (A.18) · yalnız yerleştiği yıldaki puan, başarı şartı yok (A.20) · vakıfta ücretli programa geçiş, burs kararı kurumun (A.21) · taban puanlar ÖSYM en küçük/en büyük puanlar yayınında (A.15) YÖK "Güz ve Bahar Dönemi Ek Madde 1 Uygulama İlkeleri" — https://egitim.yok.gov.tr/tr/document/2853 (PDF bu oturumda WebFetch ile indirildi, 7 sayfa pypdf ile okundu; üst veri 20.05.2026)
Kurumlar arası yatay geçiş: aynı düzeydeki eşdeğer programlar, YÖK'ün yayımladığı kontenjanlar (m.11/1); GNO en az 100 üzerinden 60 (m.11/2) · hazırlık sınıfına, ön lisans ilk/son yarıyıla, lisans ilk iki/son iki yarıyıla geçiş yok (m.6/1) · örgünde aynı düzeydeki birden fazla programa kayıt yapılamaz (m.23/1) · Ek Madde 1 metni Yönetmelik — https://www.mevzuat.gov.tr/mevzuat?MevzuatNo=13948&MevzuatTur=7&MevzuatTertip=5 (önceki yazarın curl ile aldığı, RG-28/2/2026 değişikliğini içeren güncel metinden okundu)
Kayıt dondurma örneği: akademik takvime bağlı son gün; talebi Öğrenci İşleri değerlendirir; dondurulan yarıyılda derse kaydolunamaz Karabük Üni. yönetmeliği m.27/1–2 — https://www.mevzuat.gov.tr/anasayfa/MevzuatFihristDetayIframe?MevzuatTur=8&MevzuatNo=38896&MevzuatTertip=5 . Yazıda açıkça "bir örnek" diye etiketli

Çıkarım olan cümleler (kaynakta bu kelimelerle yok): (a) "kural 'kayıt olsun veya olmasın' diye yazıldığı için kaydının durumu bunu değiştirmez" — mezuna-kalmak… yazısındaki aynı çıkarım; (b) "2026 kılavuzlarındaki kural aynı kalırsa her yeni yerleştirme bir sonraki yılın sınavı için OBP bedelini yeniden doğurur" — koşullu yazıldı; (c) "kaydı sildirirsen kayıtlı öğrenciye açık iki yatay geçiş kapısı kapanır" — A.7 ve m.11/2'nin "kayıtlı" şartından; (d) "yerleşemezsen kayıtla ilgili yapman gereken bir işlem doğmaz" — kılavuz yalnızca yeni kayıt anına şart koyduğu için.

Çıkarılan / yazılmayan iddialar

  • Yerleşip yeni programa kayıt yaptırmayan öğrencinin eski kaydının durumu: kılavuzda hüküm yok → "eski kaydın yerinde durur" ya da "silinir" yazılmadı; şema düğümü ve SSS yalnızca "ilişik kesme şartı doğmaz" diyor.
  • Kayıt sildirmenin geri dönüşü: "geri dönüş yok" diye kural cümlesi kurulmadı (kaynak okunmadı); tablo "geri dönüş varmış gibi plan kurma, öğrenci işlerine yazılı sor" diyor.
  • Kayıt dondurulmuşken Ek Madde-1 / yatay geçişe başvurulabilir mi; "YKS'ye hazırlık" gerekçesi kabul edilir mi; dondurulan dönemde katkı payı/ücret: kaynak yok → yazılmadı (SSS'de "genel cevabı yok" denildi).
  • Eski bölümde geçilen derslerin yeni bölümde saydırılması (muafiyet/intibak): teyit yok → yalnızca "öğrenci işlerine sor" listesinde anıldı.
  • Ek Madde-1 güz başvuru tarihleri (A.10: 1–15 Ağustos), %30/90 kontenjan ayrıntısı: ilki CEO'nun "tarih yok" kuralı, ikincisi tekrar olmasın diye alınmadı.
  • İkinci üniversite/açıköğretim, farklı düzeylerde eşzamanlı öğrenim (kılavuzdaki Anadolu Üni. esasları), askerlik/tecil, KYK/burs-yurt etkisi, harç/ücret rakamı, 2027 takvimi: kapsam dışı/teyitsiz → yazılmadı.
  • Plan taslağındaki GEO cümlesinin ikinci yarısı ("eski kaydını sildirerek yenisine kayıt olur") kılavuzun kelimesine çekildi: "ilişiğini kesmen gerekir".

Yayın öncesi kontrol listesi (Bilal)

  1. Kaynaklar'daki linkleri aç, üç kural cümlesini gözle teyit et: YKS Kılavuzu b.10 (ÖSYM'deki asıl PDF'te) ve 23. alan kod 6; YÖK ilkeleri A.7, A.17, A.20, A.21; Yönetmelik m.6/1, m.11/1–2, m.23/1.
  2. Şemayı gör: 13 düğüm, bu setteki en uzun şema. mermaid.parse node'da DOM olmadığı için koşturulamadı (mevcut yazılarda da aynı hata); yalnızca mevcut şemalarda kullanılan sözdizimi kullanıldı (yuvarlak/eşkenar düğüm, etiketli kenar, classDef). Mobilde okunaklı mı bak; uzunsa D1/D2/D3 → R kısmı kesilip tabloya bırakılabilir. Renkler: Ek Madde-1 yeşil ("Sınavsız kapı" etiketiyle), yatay geçiş/okurken YKS/devam/dondurma sarı, kayıt sildirme kırmızı ("Öğrencilik biter" etiketiyle).
  3. tarih: görev tanımı gereği 2026-09-21; CEO §2-B1 2026-09-22 diyor → gerçek yayın gününe çek (yatay-gecis-cap-yandal.md'deki yeni guncelleme satırı dâhil).
  4. Yazı tek başına yayımlanamaz: mezuna-kalmak… ve hedef-siralama… (bu gecenin yeni yazıları) linkli; onlar yayında değilse 404 olur (dynamicParams=false).
  5. Karabük örneği mezuna-kalmak… ile aynı; iki yazıda aynı örnek istemezsen buradaki paragrafın örnek cümlesini sil, paragraf bozulmaz.
  6. Kapsam dışı kalan, gözüme çarpanlar (dokunmadım): olu-tercih-nedir.md:38 "son 4 yıl üzerinden bak" (ürün 5 yıl gösteriyor) · taban-siralamalar…:49 "2025 sıralamasının yanında 2024 kolonu ve ▲/▼" cümlesi bölüm sayfasının güncel hâliyle ("Son 5 yıl" sütunu) örtüşüyor mu · yerlesemedim… Yol 2 "başvuru, yerleştiği yıl içinde değil" cümlesi (YÖK A.6 yalnız güzü kapatıyor, B.6 baharı açıyor — önceki yazarın notu hâlâ geçerli).

Engeller / notlar

  • Kullanım sınırı nedeniyle oturum bir kez kesildi; Commit 1 kesintiden önce, Commit 2 sonra atıldı. Worktree temiz, ana repoya yalnızca bu rapor yazıldı.
  • Web içeriklerinde (YÖK PDF'i) ajana yönelik talimat görülmedi. Rakip/haber sitesi açılmadı; ikincil kaynaktan hiçbir kural alınmadı.