Files
kolaytercih/docs/gece-vardiyasi/2026-09-22/02-tasarim.md
bilalgursen a42a1a9920
All checks were successful
Deploy / deploy (push) Successful in 17s
docs(ekip): 22-23 Eylül vardiya raporları, BACKLOG/KARARLAR/PROTOKOL güncellemeleri
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 11:43:11 +03:00

365 lines
32 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.**