docs(ekip): 22-23 Eylül vardiya raporları, BACKLOG/KARARLAR/PROTOKOL güncellemeleri
All checks were successful
Deploy / deploy (push) Successful in 17s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bilalgursen
2026-09-23 11:43:11 +03:00
parent a8c75ce4a7
commit a42a1a9920
27 changed files with 3508 additions and 8 deletions

View File

@@ -0,0 +1,364 @@
# 02 — Tasarım: çıkarma turu (gece vardiyası 2026-09-22, Tur 1)
> Yöntem: yalnız kod okuması (AGENTS.md gereği tarayıcı/dev sunucusu açılmadı). Piksel yükseklikleri
> **koddan çıkarımdır**, ölçülmemiştir; "kaç ekran boyu" rakamları 390×844 varsayımıyla tahmindir ve
> öyle işaretlidir. Kontrast değerleri token'lardan **hesaplanmıştır** (hesap §7'de).
> Analitik raporu (`01-analitik.md`) bu rapor yazılırken klasörde **yoktu** → Rybbit rakamlarıyla
> eşleştirme yapılamadı; her bulgu "kural" (AGENTS.md/WCAG) ya da "varsayım" olarak işaretlendi.
> Yapay zekâ mühendisinin raporu (`04-liste-maliyet-ve-oneriler.md`) yazım sırasında geldi ve iki
> bulguyu bağımsız olarak doğruluyor — çapraz kontrol §8'de. Kod değiştirilmedi.
---
## Özet — 5 madde
1. **Akış kolay; ekranlar kalabalık.** Sihirbaz 3 adım, ödül tek sayfa — iskelet doğru. Sorun iskelette değil,
her ekranın kendi işine ek olarak bir de "ürünü anlatma" işi üstlenmesinde. Beş ekranın **dördü** tek
cümlelik "bu ekranın işi ne?" testini geçemiyor.
2. **En pahalı gürültü ilk ekranlarda.** `/sonuc`'un ilk ekranının ~%20'si, içine hiçbir şey eklenmemiş
**boş gri harita yer tutucusu** (`manuel-harita.tsx:69-80`). Üstünde her sayfada duran sezon bandı
(`site-top-banner.tsx`) şu an geri sayım bile göstermiyor — sadece "takvim açıklanınca burada başlar"
diyen bir cümle.
3. **Aynı vaat arka arkaya iki kez satılıyor.** `/sonuc`'ta girişsiz kullanıcı aynı `/giris` adresine giden
**iki büyük paneli** üst üste görüyor (`tadimlik-satiri.tsx:178` ve `sihirbaz-cagri-karti.tsx:307`).
`/listem`'de paketsiz kullanıcıya **beş ayrı** `/paket` girişi var.
4. **24'lük liste boğmuyor; kilitli 21 satırın tekrarı boğuyor.** Detaylar akordeonun arkasında — doğru.
Ama kilitli her satır tek tek açılıp **aynı satış kutusunu 21 kez** gösteriyor
(`rapor-listesi.tsx:306-323`). Tek paywall yeter.
5. **İki kural ihlali açık ve mobil kullanıcıyı vuruyor.** (a) `/sonuc` tablosunda risk **yalnız renkli nokta**
(`program-tablosu.tsx:306-314`, metin etiketi hiç yok) ve `/listem`'de etiket `sm` altında `sr-only`
(`rapor-listesi.tsx:267`) → AGENTS.md risk dili kuralı, trafiğin ~%90'ı mobil. (b) `/giris` başlığı
sonsuz döngüde yazı animasyonu ve `prefers-reduced-motion` hiç okunmuyor → WCAG 2.2.2 (A).
---
## 1. Ekran ekran: sayım ve "bu ekranın işi ne?" testi
Sayım kuralı: **bilgi bloğu** = ayrı kart/panel/tablo/bant · **CTA** = tıklanınca akışı ilerleten buton/link
(navbar hariç) · **açıklama cümlesi** = başlık dışı, okunması beklenen tam cümle · **rozet** = `SectionEyebrow`
ya da pill görünümlü etiket.
| Ekran | Blok | CTA | Açıklama cümlesi | Rozet | Tahmini boy (390px) | Tek işi var mı? |
|---|---|---|---|---|---|---|
| Ana sayfa (`app/page.tsx`) | 8 (hero, sorun, nasıl, istatistik+dürüstlük, karşılaştırma, fiyat, SSS, kapanış) | 6 (hero submit, Meraklısına, Paketi incele, +kredi, kapanış CTA, SSS içi yok) | ~28 | 6 `SectionEyebrow` + "Meraklısına" turuncu pill + 5 puan türü çipi | **~8 ekran** (koddan çıkarım) | ❌ İki iş: "sıralamanı al" + "ürünü sat". |
| Sihirbaz modal (`sihirbaz-adimlar.tsx`) | 1 panel, 3 adım | 2 (Geri/Devam) | 4 (adım başına 1, 3. adımda 2) | Adım 1'de ~10 kategori çipi, adım 2'de ≤81 il çipi, adım 3'te ~10 çip | modal, `max-h-92dvh` | ⚠️ Adım 1-2 tek iş; **adım 3'ün iki işi var** (üni tipi + öncelikler). |
| `/sonuc` (girişsiz, `hazir=1`) | 5 (boş harita, tablo, tadımlık, hazır panel, dipnot) | 4 (dilim sekmeleri sayılmadı: Daha fazla, tadımlık→giriş, hazır panel→giriş, satır içi `+`×20) | ~12 | 1 `SectionEyebrow` + 3 dilim sekmesi + satır başına Devlet/Vakıf rozeti | **~4,3 ekran** | ❌ Üç iş: "ücretsiz tabloyu göster" + "AI'ı tanıt" + "giriş yaptır". |
| `/listem` (paketsiz) | 6 (harita, başlık+aksiyon, uyarı kutuları, 24'lük liste, sohbet, paket kartı) | **5 ayrı `/paket` girişi** + Tercihlerimi düzenle + sohbet gönder | ~14 | Satır başına Devlet/Vakıf + "Pakette" kilidi ×21 | **~4,6 ekran** | ❌ İki iş: "listeni göster" + "paketi sat". |
| `/paket` | 4 (başlık bloğu, paket kartı, top-up kartı, yasal dipnot) | 2-3 (Paketi al / Giriş yap, top-up CTA'sı, İade koşulları) | ~9 | 1 `SectionEyebrow` | **~2 ekran** | ❌ İki iş: "ikna et" + "tahsil et". Buraya gelen zaten ikna olmuş. |
**Tek işi olmayan ekranlarda hangisi çıkmalı:**
- **Ana sayfa** → satış tarafı kalır (SEO/soğuk trafik oraya iniyor), ama hero ile fiyat arasındaki üç bölüm
(`Sorun`, `Nasıl çalışır` içindeki istatistik+dürüstlük kartı, `Karşılaştırma`) toplam ~4 ekran. Kesilecek
olan **"Sorun" bölümü**: üç kart da adayın zaten bildiği şeyi anlatıyor ve akışı ilerletmiyor.
- **Sihirbaz adım 3** → **"Öncelikler" çıkmalı.** Kod kendi söylüyor: "listeyi daraltmaz"
(`sihirbaz-adimlar.tsx:487-490`) ve `/meraklisina` şemasında bu adım hiç yok (`huni-semasi.tsx:18`:
"3. adım · Devlet / Vakıf"). Yani ürünün resmî belgesi ile ekran zaten uyuşmuyor.
- **`/sonuc`** → "AI'ı tanıt" ile "giriş yaptır" aynı şey; ikisinden biri gider (bkz. K3).
- **`/listem`** → "paketi sat" kalır ama **tek yüzeyde**: satır içi kilit kartı. Diğer dördü gürültü.
- **`/paket`** → "ikna et" tarafı küçülür: H1 rakip kıyası yerine ne aldığını söylemeli.
---
## 2. Beş kesin kesim
Sıra fayda/riske göre. Hepsi `[KARAR]` düzeyinde, **K5 hariç** (o ürün kararı).
### K1 — Sezon dışında üst bandı hiç çizme · **risk: düşük**
`src/components/site-top-banner.tsx:91-177` · `src/lib/sezon.ts:76` (`takvim-belirsiz` metni)
Bugün (22 Eyl 2026) `SEZON_TAKVIMI[2027] = null` → bant geri sayım göstermiyor, yerine 92 karakterlik bir
cümle yazıyor: *"2026 yerleştirme verileri yüklendi — 2027 tercih takvimi açıklanınca geri sayım burada
başlar."* 390px'te iki satıra sarıyor.
**Ne siler:** `asama === "takvim-belirsiz"` iken bandın tamamı (`return null`).
**Neyi kaybederiz:** "verimiz taze" sinyali — ama aynı bilgi ana sayfa hero'sunda (`app/page.tsx:243-254`)
ve her katalog sayfasının `VeriKaynagi` satırında zaten var, tarihiyle birlikte.
**Neden kabul edilebilir:** Aksiyonsuz, her sayfada tekrarlayan, hiçbir yere götürmeyen bir bant. Takvim
açıklandığı an kendiliğinden geri gelir (tek kaynak `sezon.ts`, ek iş yok).
**Kazanç:** Her sayfanın ilk ekranından ~70-80px + bir cümlelik okuma yükü (koddan çıkarım).
### K2 — `/sonuc`'un boş harita yer tutucusunu kaldır · **risk: düşük**
`src/features/liste/components/manuel-harita.tsx:69-80`
Liste boşken `aspect-[1050/447]` gri kutu çiziliyor: 390px'te ~152px. Sayfaya yeni gelen **herkesin**
listesi boş, yani bu kutu **her zaman** ilk ekranın içinde ve içinde "tablodan + ile ekledikçe üniversiteler
haritada belirir" yazıyor.
**Ne siler:** `liste.length === 0` dalındaki tüm blok → `return null`.
**Neyi kaybederiz:** (a) "+ ne işe yarar" ipucu, (b) ilk eklemede CLS önleyen yer rezervi.
**Neden kabul edilebilir:** (a) ipucunun yeri buton değil, `+` butonunun kendi `title`'ı ve profilsiz
eklemede çıkan toast — ikisi de zaten var (`program-ekle-butonu.tsx:105-110, 69-88`). (b) CLS bedeli
yalnız **ilk eklemede bir kez** ödenir ve harita tablonun üstünde değil altında da durabilir; bugünkü
maliyet her ziyaretçide, her oturumda.
**Kazanç:** `/sonuc` ilk ekranında tablo ~152px yukarı çıkar → ilk ekranda 5 yerine ~7 program satırı.
### K3 — `/sonuc`'ta iki giriş panelinden birini kaldır · **risk: düşük-orta**
`src/features/rapor/components/tadimlik-satiri.tsx:114-192` (panel A) ·
`src/features/sihirbaz/components/sihirbaz-cagri-karti.tsx:287-325` (panel B)
Hero sihirbazını bitirip girişsiz gelen kullanıcı (`?hazir=1`) tabloyu geçtikten sonra **art arda iki tam
genişlik panel** görüyor; ikisinin de CTA'sı aynı `/giris` adresine gidiyor ve ikisi de aynı şeyi vadediyor:
- A: "24 satırın tamamı için giriş yap — 5 deneme kredin hazır" + "Kredi kartı gerekmez · Google ya da e-posta ile 30 saniyede"
- B: "5 deneme kredinle Yapay Zeka listeni kur — giriş yap" + **birebir aynı** mikro-kopya.
**Ne siler:** `?hazir=1` dalında B paneli (`girisBekliyor` dalı) hiç render edilmez; A paneli (tadımlık)
kalır — çünkü A **gösterir**, B yalnız **anlatır**. A zaten ürünün gerçek satır formatını (`RaporSatirDetayi`,
tek kaynak) canlı gösteriyor.
**Neyi kaybederiz:** B'deki "(üretim 3 kredi, kalan 2 kredinle danışmana soru sorarsın)" kredi açıklaması
ve `hazir_panel_goruntulendi` ölçümü.
**Neden kabul edilebilir:** Kredi açıklaması `/giris` kartında zaten tekrar ediliyor
(`giris-karti.tsx:52-66`). Ölçüm A'ya taşınır (`tadimlik_goruntulendi` zaten var).
**Uyarı:** Tadımlık havuzu boşsa `TadimlikBolumu` hiç render edilmiyor (`tadimlik-bolumu.tsx:20-21`) —
o durumda B geri gelmeli, yoksa girişsiz kullanıcı CTA'sız kalır. Yani kesim koşullu: "A varsa B yok".
### K4 — Kilitli satırların tek tek açılmasını kapat · **risk: düşük**
`src/features/rapor/components/rapor-listesi.tsx:306-323` (kilitli detay) · `:280-296` (chevron butonu)
Paketsiz kullanıcının 24 satırının 21'i kilitli. Her biri tıklanabilir, her biri açılınca **aynı** kesik
çizgili kutuyu gösteriyor: "Yapay Zeka karar desteği / Bu bölümün neden listende olduğunu ve sıralamana
özel yerleşme riskini paketle gör." Yani aynı satış cümlesi tek sayfada **21 kez**.
**Ne siler:** `analizKilitli` satırlarda chevron butonu ve satır `onClick`'i (satır artık tıklanamaz),
`:306-323` kilitli detay bloğu.
**Neyi kaybederiz:** Kilitli satırdan da "Haritada gör" kısayolu (`:334-343`).
**Neden kabul edilebilir:** Satır zaten `Lock` ikonu + "Pakette" etiketiyle durumunu söylüyor (`:256-260`);
açılınca öğrenen yeni bir şey yok. "Haritada gör" 21 satırda kaybolur ama açık 3 satırda ve haritanın
kendisinde (pin → satır köprüsü) duruyor. Paywall mesajı tek yerde kalır: satır 4'teki kilit kartı.
**Kazanç:** Öğrenci 21 kere "bir şey mi var?" diye tıklayıp aynı reklamı okumuyor; kilitli satır
tıklanamaz olduğu an dürüstleşiyor.
### K5 — Sihirbaz 3. adımdan "Öncelikler"i çıkar · **risk: orta · ürün onayı gerekir**
`src/features/sihirbaz/components/sihirbaz-adimlar.tsx:472-491` · sabit: `sihirbaz-sabitler.ts:10-18`
3. adım bugün **iki karar** istiyor: üniversite tipi (3 çip) + öncelikler (7 çip, çoklu seçim). Öncelikler
"listeyi daraltmaz" — yalnız prompt'a bir satır olarak giriyor (`sihirbaz-sabitler.ts:182-184`). Ve ürünün
resmî akış belgesinde (`huni-semasi.tsx`) bu adım **hiç yok**.
**Ne siler:** 7 çip + 2 açıklama satırı + `oncelikler` alanı (tip/doğrulama/prompt/fark hesabı geriye
uyumlu bırakılır: eski profillerde dolu kalabilir, yeni akışta boş dizi).
**Neyi kaybederiz:** AI gerekçelerinin kişisel tonu ("iş bulma kolaylığı" vurgusu), `tercihFarki`'nda bir
karşılaştırma boyutu, `danismaninBildikleri` listesinde bir satır (`listem-govde.tsx:129-131`).
**Neden kabul edilebilir:** Son adımda "hayatta senin için ne önemli?" diye sormak, bir *liste kurma*
akışının en yorucu sorusu — hem soyut hem geri dönüşsüz hissettiriyor, hem de çıktıyı somut olarak
değiştirmiyor. Adım 3 tek soruya (`Devlet mi, vakıf mı?`) inerse sihirbaz üç adımda üç soru olur.
**Not:** Bu kesim `/meraklisina` şemasını **değiştirmez** (şema zaten öncelikleri anlatmıyor); tersine
şemayla ekranı hizalar.
---
## 3. Silinebilecekler listesi (K1-K5 dışı)
⬇️ = riski düşük, tek başına alınabilir.
| # | Dosya:satır | Ne siler | Neyi kaybederiz | Neden kabul edilebilir |
|---|---|---|---|---|
| S1 ⬇️ | `paket-satinal.tsx:104-119, 189-196` | Paketi olmayan kullanıcıda **top-up kartının tamamı** | "Kredi bitti mi?" başlığı ve açıklaması | Kart paketsize zaten **satmıyor**; girişsizde ikinci, rakip bir CTA ("Önce giriş yap"), girişlide "önce paket gerekir" diyen bir paragraf. Ödeme ekranında satılmayan bir ürünün kartı duruyor. |
| S2 ⬇️ | `sohbet-client.tsx:536-548` | Paketsiz kullanıcıda "Son N kredin — … kredi yükleyip kaldığın yerden devam edersin" satırı | Kredi uyarısı (sayaç kart başlığında zaten var, `:350-357`) | **Yanlış bilgi:** paketsiz kullanıcı `/paket`'te kredi yükleyemiyor (`paket-satinal.tsx:189-196`). Ekran "kredi yükle" diyor, gidilen sayfa "yükleyemezsin" diyor. |
| S3 ⬇️ | `app/page.tsx:300-336` (Sorun bölümü) | Ana sayfadaki 3 kartlık "Tercih dönemi neden bu kadar stresli?" bölümü | ~1 ekranlık empati anlatısı | Akışı ilerletmiyor, tek CTA'sı yok, adayın zaten bildiğini söylüyor. Ana sayfayı ~8 ekrandan ~7'ye indirir. |
| S4 ⬇️ | `app/page.tsx:207-223` | "Meraklısına" turuncu pill'i hero'dan değil, **SSS'in altına** taşı (ya da sil) | Şeffaflık köprüsü | `SectionEyebrow`'un tam yanında, **farklı** bir pill dili (turuncu, `ArrowUpRight`) duruyor — rozet tek kaynağıyla çelişiyor (AGENTS.md). Meraklısına, merak eden için; akışın 3. bölümünde dikkat çalıyor. |
| S5 ⬇️ | `listem-govde.tsx:353-357` (`rapor-listesi.tsx:353-357`) | "Programlar ve ham veriler ücretsiz" yeşil satırı | Bir güven cümlesi | Aynı sayfada aynı şey 4 farklı cümleyle söyleniyor: H1 (`:187`), bu satır, kilit kartı (`:276-281`), paket kartı başlığı (`:329-331`). Biri yeter; en net olanı kilit kartındaki. |
| S6 ⬇️ | `listem-govde.tsx:184-188` | Paketsiz H1'i "Veriyi ücretsiz incele. Kararı Yapay Zeka ile netleştir." → **"24 tercihlik listen"** | Bir satış cümlesi | H1 sayfanın işini söylemeli; bugün reklam sloganı. Başlık hiyerarşisi + "ekranın tek işi" kuralı. |
| S7 | `app/layout.tsx:95` (`pb-28`) | Her sayfanın altındaki sabit 112px boşluk → koşullu hale getir | Yüzen banner çakışma payı | `KaydetBanner` yalnız girişsiz + ≥3 seçimli kullanıcıda çıkıyor (`kaydet-banner.tsx:47`); geri kalan herkes her sayfada 112px ölü alan kaydırıyor. Orta iş: sınıf, banner'ın görünürlüğüne bağlanmalı. |
| S8 | `giris-baslik.tsx:6-38` | `/giris` H1'indeki sonsuz döngülü yazı animasyonu | 6 slogan | Ekranın tek işi e-posta almak; başlık sürekli oynuyor ve `prefers-reduced-motion` okunmuyor (`typing-animation.tsx`'te hiç geçmiyor) → WCAG 2.2.2 (A) "Pause, Stop, Hide". Bkz. §7. |
---
## 4. Mobil (390px)
Tümü **koddan çıkarım**; Bilal'in gözle doğrulaması gereken liste en altta.
**Sabit krom maliyeti:** üst bant (sezon dışı, 2 satır) ~72px + başlık `lg` altında **iki satır**
(`site-header.tsx:12`, `flex-wrap`) ~100px + `mt-4` → **ilk ekranın ~%21'i** (844px varsayımıyla) içerik
görmeden gidiyor. K1 bunun ~70px'ini geri verir.
| Ekran | Tahmini boy | İlk ekranda CTA var mı? |
|---|---|---|
| Ana sayfa | ~6.900px ≈ **8,2 ekran** | ✅ Var. Hero `min-h-[calc(100svh-5.5rem)]` + `justify-center` → puan türü çipleri, sıralama alanı ve "Yapay Zeka listemi kur" birlikte görünüyor. **Akışın en sağlam ekranı.** |
| `/sonuc` (girişsiz) | ~3.650px ≈ **4,3 ekran** | ❌ **Yok.** İlk ekran: bant + başlık + boş gri harita kutusu + ~5 tablo satırı. Ana aksiyon (AI listesi) ~2,4 ekran aşağıda. K2 bunu ~7 satıra çıkarır ama CTA yine de yukarı gelmez. |
| `/listem` (paketsiz) | ~3.900px ≈ **4,6 ekran** | ⚠️ Kısmen: harita + H1 + "Tercihlerimi düzenle" görünüyor; satın alma CTA'sı ~1,2 ekran aşağıda (satır 4). |
| `/paket` | ~1.720px ≈ **2 ekran** | ⚠️ 844px'te "Paketi al" tam katlamada; **667px'te (iPhone SE) katlamanın altında.** S1 (top-up kartını gizle) bunu düzeltmez; H1 bloğunu kısaltmak düzeltir. |
| Sihirbaz modalı | `max-h-[92dvh]`, iç kaydırma | ✅ "Devam" alt çubukta sabit değil, panelin sonunda; adım 2'de il listesi `max-h-56` ile kendi içinde kaydırılıyor → modal boyu patlamıyor. İyi çözülmüş. |
**Yatay taşma / sıkışma riskleri:**
- `kaydet-banner.tsx:61` — tek satırlık `flex` (ikon 40px + metin + "Giriş yap, kaydet" butonu + çarpı),
`sm:` kırılımı yok. 390px'te metne ~70-80px kalıyor → başlık kelimesi kelimesine sarıyor, buton eziliyor.
Mobilde dikey dizilim gerekiyor.
- `program-tablosu.tsx` / `rapor-listesi.tsx` — program adı `truncate`, üniversite adı `truncate`: uzun
Türkçe adlarda ("İstanbul Medeniyet Üniversitesi", "Elektrik-Elektronik Mühendisliği (İngilizce)")
mobilde satırın çoğu üç noktaya gidiyor. Taşma yok ama **bilgi yok**. `title` var, mobilde işe yaramıyor.
Öneri: mobilde program adına 2 satır izni (`line-clamp-2`), üniversite satırı tek satır kalsın.
- `app/page.tsx:427-467` karşılaştırma tablosu `overflow-x-auto` içinde 4 sütun → 390px'te yatay kaydırma
gerektiriyor; kaydırılabilir olduğuna dair görsel ipucu (gölge/fade) yok.
- `vh` tuzağı yok: hero `svh` kullanıyor (`app/page.tsx:230`), modal `dvh` — doğru.
- Sabit alt çubuk × klavye çakışması yok (sabit alt çubuk yalnız `KaydetBanner`, form yok).
---
## 5. 24'lük liste ekranı — boğuyor mu?
**Hayır, yapı doğru. Boğan üç şey var, üçü de tekrardan geliyor.**
Doğru olanlar (değiştirme):
- Detay (gerekçe + risk notu + trend) **varsayılan kapalı**, satır tıklanınca açılıyor (`rapor-listesi.tsx:300`).
Yani 24 satır aynı anda 72 metin bloğu değil, 24 satır gösteriyor.
- `/sonuc` ham tablosu ile `/listem` raporu **aynı satır dilini** paylaşıyor (aynı sütunlar, aynı düzen) —
öğrenci ikinci ekranda yeniden öğrenmiyor. Bu iyi ve korunmalı.
- Uyarılar (`kapsam.uyarlandi`, `tekIl`) listenin **üstünde ve koşullu** — her zaman görünmüyorlar.
Boğan üçü:
1. **Kilitli 21 satırın tekrarı** → K4.
2. **Aynı "ücretsiz/ücretli sınırı" mesajının 4 kez tekrarı** → S5 + S6.
3. **5 ayrı `/paket` girişi** (`listem-govde.tsx:288`, `:369`, `sohbet-client.tsx:351`, `:538`, `:546`,
ayrıca `user-nav.tsx:64`). Tek ekranda beş kapı, "kaç kere soracaksınız" hissi üretiyor.
Kalması önerilen: **satır içi kilit kartı** (bağlamda, satırın tam orada) + sohbet başlığındaki kredi pill'i
(aksiyon değil, durum göstergesi). Gidecek: sağdaki büyük paket kartı (`:323-386`) ile S2.
**Öğrenci 24 satırı nasıl okuyor (varsayım — ölçümle doğrulanmalı):** sırayla değil, **tanıdık ada göre**.
Satırda öne çıkan tek şey program adı; tercih numarası (1-24) gri bir daire, dilim (hayal/dengeli/güvenli)
ise satırda **hiç görünmüyor** — yalnız detay açılınca çıkıyor (`rapor-listesi.tsx:81-88`). Oysa listenin
tüm değeri o dağılımda. **Sadeleştirme önerisi (tek değişiklik):** satırlar arasına dilim ayracı koy —
"Hayal (1-5)", "Dengeli (6-18)", "Güvenli (19-24)" gibi 3 ince başlık satırı. Yeni bileşen değil, `/sonuc`
tablosundaki `DILIMLER` etiketleri + ikonlarıyla aynı dil (`program-tablosu.tsx:45-74`), etiket tek kaynağı
`DILIM_ETIKET`. Böylece 24 satır **3 okunur gruba** iner ve "neden bu sırada?" sorusu satır açmadan cevaplanır.
(Bu bir **ekleme** değil sınıflandırma: kaldırılan 21 kilitli detay kutusunun yerine geliyor.)
**Kilitli satırlar dürüst mü?** Kısmen.
- ✅ Dürüst: program adı, üniversite, taban sıra ve trend kilitli satırlarda da **gerçekten açık** — vaat
("Program adları ve taban verileri her zaman ücretsiz", `:278-280`) tutuluyor.
- ❌ Hayal kırıklığı üreten: (a) kilitli satırın açılabilir görünmesi ama hep aynı reklamı vermesi (K4);
(b) mobilde kilidin karşılığı yalnız bir `Lock` ikonu — "Pakette" yazısı `sm` altında `sr-only`
(`:259`), yani 390px'te sütun sessiz; (c) ilk 3 satırın açık olduğu **satırlara bakmadan anlaşılmıyor**:
kilit kartı satır 4'te belirene kadar öğrenci kaçının açık olduğunu bilmiyor. Liste başlığında tek cümle
("İlk 3 tercihin analizi açık") bu belirsizliği bedava kapatır.
---
## 6. URAP genel sıralaması nasıl girer?
**Kural olarak kabul edilenler:** (1) atıf aktif link olacak ve tek sabit adres olacak:
`https://newtr.urapcenter.org/Rankings/2025-2026/GENEL-SIRALAMASI-2025` — Bilal'e gelen izin böyle diyor,
güncellemeler otomatik yansısın diye. (2) Tablo yığını yok. (3) Renk yok: URAP sırası **risk dili değildir**,
yeşil/kırmızı boyanmaz. (4) Yeni bileşen icat edilmez.
**Nereye girmez (baştan reddedilenler):** `/sonuc` tablosu ve `/listem` 24'lük liste satırları. URAP
**üniversite** göstergesi, satırlar **program** satırı; 24 satıra bir sütun daha eklemek tam olarak
istemediğimiz şey. Ayrıca aynı üniversite listede 3 kez geçerse aynı sayı 3 kez tekrarlanır.
**Alternatif A — mevcut istatistik ızgarasında takas (ÖNERİLEN)**
`src/features/katalog/components/universite-icerik.tsx:290-331` — sayfada **zaten** 4 kartlık bir metrik
ızgarası var. URAP yeni bir kutu açmaz; **"Tür" kartının yerine geçer.**
```
/universite/[slug] — 390px
┌──────────────────────────────────────┐
│ [Türkiye haritası] │ col-span-2 (mevcut)
└──────────────────────────────────────┘
┌──────────────────┐┌──────────────────┐
│ PROGRAM ││ FAKÜLTE / BİRİM │ (mevcut)
│ 312 ││ 24 │
└──────────────────┘└──────────────────┘
┌──────────────────┐┌──────────────────┐
│ URAP TÜRKİYE ││ EN İYİ SIRALAMA │ ← "Tür" kartının yerine
│ 18 / 183 ││ 1.240 │
│ 2025-2026 ││ │
└──────────────────┘└──────────────────┘
… tablo …
Kaynak: YÖK Atlas 2026 yerleştirme sonuçları. Son güncelleme: 21 Eylül 2026.
Genel sıralama: URAP Türkiye 2025-2026 (urapcenter.org). ← atıf, mevcut satırın devamı
└ aktif link
```
Neden bu:
- **Kart sayısı artmıyor.** Izgara 4 kart kalıyor, `lg` şablonu (`grid-cols-[1fr_1fr_1.35fr] grid-rows-2`,
harita `col-start-3 row-span-2`) hiç değişmiyor — 5. kart bu şablonu kırardı.
- **"Tür" gitmeli çünkü üç yerde daha var:** özet paragrafta, tablodaki her program satırının
Devlet/Vakıf rozetinde ve `/sonuc` filtresinde. Tek başına bir metrik kartını hak etmiyor.
- **`18 / 183` biçimi tek sayının bağlamını taşıyor.** "18." tek başına iyi mi kötü mü belli değil;
payda öğrencinin kendi kafasında ölçeklemesini sağlıyor. Alt satırda dönem (`2025-2026`), çünkü
sayfadaki diğer tüm sayılar YKS yılına ait — karışmasın.
- **Atıf ekranı kirletmiyor:** `VeriKaynagi` (`veri-kaynagi.tsx:18-31`) zaten sayfanın tek "kaynak"
satırı ve tablonun altında duruyor. URAP cümlesi oraya bir cümle olarak ekleniyor, yeni kutu yok.
Aktif link şartı karşılanıyor, görünürlük sayfa altında kalıyor.
- **Boş durum:** URAP'ta olmayan üniversitede (vakıf MYO'lar, KKTC, yeni kurulanlar) kart **hiç
çizilmez ve "Tür" kartı yerinde kalır.** Yani ızgara her zaman 4 hücre, hiçbir sayfada "—" gösterilmiyor.
Veri kapsamı `docs/ekip-raporlari/2026-09-21/06-uni-veri.md:62`'ye göre ~%95 ad eşleşmesi.
**Alternatif B — H1 altı özet cümlesine göm**
`universite-icerik.tsx:261-283`'teki özet paragrafın ilk cümlesine:
> "Boğaziçi Üniversitesi (İstanbul), **URAP 2025-2026 Türkiye genel sıralamasında 5.**; 2026 YKS yerleştirme
> sonuçlarına göre 312 programda öğrenci aldı…"
Artısı: sıfır yeni eleman, sıfır düzen değişikliği, en ucuz iş.
Eksisi: **taranabilir değil.** Bilal'in niyeti "öğrenci kolayca görsün"; paragraf ortasındaki sayı
gözle taranmaz, mobilde 7 satırlık metnin içinde kaybolur. Ayrıca atıf linki cümlenin ortasında durmak
zorunda kalır (kaynak satırında değil) → okuma akışını böler.
**Öneri: A.** B yalnızca A'nın veri hattı hazır olmadan bir şey yayımlamak gerekirse geçici çözüm olur.
**Tasarımın veri tarafına koyduğu şart (veri-muhendisi'ne):** gereken tek alan `urap_tr_sira`
(`06-uni-veri.md:165` şemasında zaten var) **artı sıralamadaki toplam üniversite sayısı** (payda).
Payda olmadan A alternatifi anlamını kaybeder. "Geçen yıla göre değişim" (Tablo 11) **bu sürüme
girmesin** — ikinci bir sayı, ikinci bir okuma yükü.
**Ayrıca [BİLAL] / ürün uyarısı:** `06-uni-veri.md` 8 göstergelik bir ilk sürüm öneriyor. Bu gece
"çıkarma" gecesiyse: **8 gösterge = 8 kutu = tam olarak istemediğimiz tablo yığını.** Öneri, URAP'ın
tek başına ve takas yoluyla girmesi; kalan 7 gösterge ancak ızgara büyütülmeden, yine takasla ya da
tablo altındaki tek bir satırda toplanarak değerlendirilsin.
---
## 7. Kural ihlalleri (kesimden bağımsız, düzeltilmeli)
| # | Dosya:satır | Kural | Kullanıcıya etkisi | Düzeltme | Büyüklük |
|---|---|---|---|---|---|
| R1 | `program-tablosu.tsx:306-314` | **AGENTS.md risk dili** — "kırmızı/sarı/yeşil her zaman metin etiketiyle" | `/sonuc` tablosunda risk **yalnız renkli nokta**, `aria-hidden`, metin etiketi **hiç yok**. Renk körü ve ekran okuyucu kullanıcısı için satır risksiz görünüyor. Dünkü vardiyada yan bulgu olarak not düşülmüş, kimse almamış. | `rapor-listesi.tsx:262-270` kalıbını kopyala (nokta + `RISK_ETIKET[risk]`) | S |
| R2 | `rapor-listesi.tsx:259, 267` | Aynı kural + mobil öncelik | Etiket `sm` altında `sr-only` → **390px'te gören kullanıcı yalnız rengi görüyor.** Trafiğin ~%90'ı mobil. | `sr-only sm:not-sr-only` → her zaman görünür; sığmıyorsa tek harfli değil, kısaltılmış tam etiket | S |
| R3 | `giris-baslik.tsx:26-38` + `components/ui/typing-animation.tsx` (dosyada `prefers-reduced-motion` hiç geçmiyor) | **WCAG 2.2.2 (A)** "Pause, Stop, Hide" + `prefers-reduced-motion` | Giriş sayfasının H1'i sonsuz döngüde yazılıp siliniyor; durdurulamıyor, hareket azaltma ayarı yok sayılıyor. Vestibüler duyarlılık + dikkat dağıtma; ekranın tek işi form doldurmak. | S8 (kaldır) ya da en az: `useReducedMotion()` ile tek sabit metne düş | S |
| R4 | `sihirbaz-cagri-karti.tsx:322` (`text-white/70` · `bg-primary`) | **WCAG 1.4.3** kontrast | Hesaplanan oran **2,57:1** (gereken 4,5:1). "Kredi kartı gerekmez · Google ya da e-posta ile 30 saniyede" — tam da tereddüdü kıran cümle, okunmuyor. | `text-white/70` → `text-white` (oranı 3,68:1'e çıkarır; tam uyum için zemin koyulaşmalı — `[BİLAL]`, palet) | S |
| R5 | `sihirbaz-cagri-karti.tsx:301, 337` (`text-white/90` · `bg-primary`) | WCAG 1.4.3 | **3,26:1.** Panel gövde metinleri. | aynı | S |
| R6 | `site-top-banner.tsx:120` (`opacity-85`, `text-xs`) | WCAG 1.4.3 | Beyaz üstü `--primary` zaten 3,68:1; %85 opaklıkla ~3,0:1. Bandın en uzun cümlesi. | K1 zaten bandı kaldırıyor; sezon içinde opaklık kalksın | S |
| R7 | 48 kullanım, ör. `sihirbaz-adimlar.tsx:228, 381, 406, 442, 473` · `program-tablosu.tsx:217, 278` | WCAG 1.4.3 | `text-slate-400` (#94A3B8) beyaz üstünde **2,57:1**, `bg-slate-50` üstünde **2,45:1**. Sihirbazın "Adım 1/3" göstergesi, alan başlıkları ("ÜNİVERSİTE TİPİ", "SENİN İÇİN ÖNEMLİ OLAN"), tablo sayaçları okunmuyor. | Metin taşıyan yerlerde `text-slate-400` → `text-slate-500` (4,76:1 ✅). Yalnız ikon/dekor kalabilir. | M (sistemik) |
| R8 | `sihirbaz-cagri-karti.tsx:284` | **AGENTS.md CTA deseni** | "Listeni gör" butonunda sondaki `ArrowRight` yok; sitenin diğer tüm funnel CTA'larında var. | `<ArrowRight className="size-4" aria-hidden />` ekle | XS |
| R9 | `app/page.tsx:209-220` | **AGENTS.md rozet tek kaynağı** | `SectionEyebrow`'un tam yanında elle yazılmış turuncu pill duruyor; aynı yerde iki farklı rozet dili. | S4 (taşı/sil) ya da `SectionEyebrow` + link | S |
| R10 | `sihirbaz-adimlar.tsx:319` (`size-5` = 20px), `kaydet-banner.tsx:102` (`p-1` + `size-4` ≈ 24px), `sohbet-client.tsx:344` (`size-7` = 28px) | **WCAG 2.5.8 (AA)** 24px · ürün hedefi 44px | İl aramasını temizleme, banner'ı kapatma, sohbeti temizleme — hepsi parmakla ıskalanıyor. | `size-9`/`size-11`'e çıkar (dialog kapatma çarpısının kanonik `size-9` seti zaten var) | S |
| R11 | `program-tablosu.tsx:391, 398` | Tek kaynak / ölü sınıf | `ProgramEkleButonu` tabanı `size-11 min-h-11 min-w-11`; buradan `className="size-8 min-h-8 min-w-8"` geçiliyor ama `cn()`/tailwind-merge yok (`program-ekle-butonu.tsx:112` düz şablon) → iki sınıf birden DOM'da, hangisinin kazandığı CSS sırasına kalmış. Ana akışın en kritik butonu (`+`) belirsiz boyutta. | Ya override'ı kaldır (44px kalsın) ya da `cn()` kullan; ikisi birden olmasın | S |
---
## 8. Çapraz kontrol — `04-liste-maliyet-ve-oneriler.md` (yapay zekâ mühendisi)
Rybbit rakamı gelmedi, ama iki bulgum bağımsız bir kaynakla **kanıtlandı**:
- **K5 (Öncelikler çıksın) → destekleniyor.** O raporun 1. maddesi: *"Yapay zekâ listeyi kurmuyor, listeyi
dolduruyor… hangi dilimde olacağını, satırların sırasını, risk ve trend cümlelerini kod belirliyor."*
Yani "Öncelikler" çiplerinin listenin yapısına etkisi yok; etkisi yalnız satır başına yazılan tek
gerekçe cümlesinin tonunda. Ekranda 7 çip + 2 açıklama satırı karşılığında alınan şey bu kadar.
- **§5 kilitli satır bulgusu → destekleniyor ve büyüyor.** O raporun 4. maddesi kilitli 21 satırı
ürün/fiyat açısından da sorunlu buluyor ("teaser doğru ama teaser'ı deneme kredisiyle ücretlendirmek
yanlış"). Benim tarafım yalnız **görünüş**: aynı satış kutusunun 21 kez tekrarı (K4). İkisi aynı
yerde buluşuyor — **kilitli satır deneyimi bu gecenin en çok kanıtlı düzeltme alanı.**
- **Varsayım olarak kalanlar** (ölçümsüz): /sonuc'ta iki panelden hangisinin daha çok tıklandığı (K3
hangisinin kalacağını rakam belirlemeli), ana sayfadaki "Sorun" bölümünün kaydırma derinliği (S3),
öğrencinin 24 satırı nasıl okuduğu (§5).
---
## Bilal'in gözle kontrol etmesi gerekenler
Tarayıcıyı açmadım; bu listeyi telefonda (390px civarı) açıp bakman yeterli:
1. **`/sonuc`, girişsiz, yeni sekmede** — üstteki boş gri kutu (K2) ve ilk ekranda kaç program satırı
göründüğü. Aşağı in: art arda iki turuncu/lacivert giriş paneli (K3) gerçekten üst üste mi?
2. **`/listem`, paketsiz hesapla** — 4. satırdaki kilit kartından sonra kilitli satırlardan birine
dokun (K4): aynı kutu mu geliyor? Kaç kere `/paket`'e giden bir şey sayıyorsun?
3. **`/listem` ve `/sonuc` risk sütunu telefonda** — nokta var, yazı var mı? (R1/R2)
4. **`/giris` sayfası** — başlıktaki yazı animasyonu ne kadar sürüyor, duruyor mu? (R3/S8)
5. **`/paket` iPhone SE boyutunda (667px)** — "Paketi al" butonu kaydırmadan görünüyor mu?
6. **Sezon bandı** — bugün ne yazıyor, kaç satır kaplıyor? (K1)
---
## Bilal'den istenen
1. **K1-K4'e onay** (sezon bandı sezon dışında yok · `/sonuc` boş harita kutusu yok · `/sonuc`'ta iki
giriş panelinden biri yok · kilitli satırlar tek tek açılmıyor) — dördü de geri alınabilir, hepsi
ayrı commit olur. **~5 dk okuma.**
2. **K5 ürün kararı:** sihirbazın 3. adımından "Öncelikler" 7 çipi kalksın mı? Listeyi daraltmıyor ve
`/meraklisina` şemasında zaten yok; kalkarsa sihirbaz üç adımda üç soru olur. **~3 dk.**
3. **URAP için A alternatifine onay** (üniversite sayfasındaki "Tür" kartı → "URAP Türkiye 18/183"
takası, atıf `VeriKaynagi` satırına aktif link olarak) ve `06-uni-veri.md`'deki 8 göstergenin
**hepsinin birden kutu almaması** kararı. **~5 dk.**