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,374 @@
# 02 — Tasarım: CEO'nun açık soruları (gece vardiyası 2026-09-23)
> Yöntem: yalnız kod + DB okuması. Tarayıcı/dev sunucusu açılmadı, kod değiştirilmedi.
> R7 taraması orkestratörden hazır geldi (48 kullanım / 19 dosya), yeniden koşuldu ve
> bağlam satırları çekildi — sınıflandırma aşağıda. Kontrast değerleri token'lardan
> **hesaplandı** (§2.4). Piksel tahminleri "koddan çıkarım" olarak işaretli.
---
## Özet — 5 madde
1. **Öncelikler kalkarsa sihirbaz 3 adımda kalmalı, 2'ye inmemeli.** Üç adım = üç soru olur;
2'ye indirmek ikinci adıma ikinci bir iş yükler (tam da 3. adımdan çıkardığımız hata) ve
`/meraklisina` şemasını, `sihirbaz_adim` serisini birden bozar. Hüküm §1.2.
2. **`/meraklisina` şemasında değiştirilecek tek karakter yok.** Ne `SEMA`, ne `aria-label`,
ne figcaption, ne 4. bölüm anlatımı öncelikleri anlatıyor — grep ile doğrulandı (§1.3).
AGENTS.md senkron borcu bu işte **sıfır**; değişmesi gereken ekran, belge değil.
3. **Kaldırma "veri kaybı" değil ama bir yerde sessiz regresyon üretir:** `tercih-farki.ts`
`oncelikler`'i kıyaslamaya devam ederse, hiçbir şey değiştirmemiş eski kullanıcı /listem'de
kalıcı "Tercihlerin değişmiş → 3 kredi harca" uyarısı görür. Tek dosya, dört nokta (§1.4).
Ayrıca dünkü raporumun eksiği: öncelikler **yalnız prompt tonuna dokunmuyor**,
`tercih-degerlendirme.ts:59` üzerinden değerlendirme satırlarına da dokunuyor.
4. **R7 hüküm: tek commit, 28 satır.** 48 kullanımın 26'sı gerçek metin, 2'si placeholder
(= 28 düzeltilecek), 11'i dekoratif ikon, 4'ü fonksiyonel ikon (ayrı kural, 1.4.11),
1'i devre dışı durum (WCAG muaf), 4'ü dev paneli (kapsam dışı). **Büyük punto: 0** —
hiçbiri 18,66 px kalın / 24 px eşiğini geçmiyor, yani 28'inin de 4,5:1 borcu var.
5. **URAP takasının telafisi tek cümlelik ve sıfır yeni eleman:** özet paragrafın ilk
virgülüne "devlet üniversitesi" / "vakıf üniversitesi" girer. Yan kazanç: bugünkü "Tür"
kartı zaten 6 `unitur` değerinin 4'ünde bozuk metin basıyor ("Kktc", "Vakıf Myo",
"Yurtdısı Kamu" — `trBaslikDuzeni` tr-TR küçültmesi, `slug.ts:56-64`).
---
## 1. "Öncelikler" kalkarsa — son adımın tasarımı
Kaynak: `sihirbaz-adimlar.tsx:432-492` (3. adım paneli), `:224-231` (adım göstergesi),
`:495-540` (alt çubuk), `sihirbaz-sabitler.ts:10-18` (`ONCELIKLER`).
### 1.1 (a) Tek ekran taslağı — 375 px
Bugün 3. adımda: h3 "Üniversite tipi & öncelikler" + alt satır + "ÜNİVERSİTE TİPİ" etiketi
+ 3-4 çip + "SENİN İÇİN ÖNEMLİ OLAN" etiketi + 7 çip (375 px'te ~4 satıra sarıyor)
+ 2 satırlık açıklama. Kalkınca:
```
375 px · DialogContent (max-h-[92dvh], p-6, dikey ortalı) · sihirbaz-modal.tsx:41
┌───────────────────────────────────────────┐
│ (✕) │ ← kanonik dialog çarpısı, size-9,
│ │ border-slate-200 (dialog.tsx varsayılanı)
│ ▬▬ ▬▬ ▬▬▬▬▬ Adım 3/3 │ ← :224-231 aynen kalır
│ │ metin text-slate-500 (bugün 400, bkz. §2)
│ │
│ Devlet mi, vakıf mı? │ ← h3, font-heading text-lg font-bold
│ Seçimin hem yapay zekâ listende hem │ ← p, text-sm text-slate-500
│ sonuç sayfasındaki ücretsiz tabloda │ (bu cümle doğru: meraklisina-icerik:116-117)
│ geçerli olur. │
│ │
│ ┌─────────────┐ ┌───────────────────────┐│ ← mevcut <Cip>, canliFacetler sayılarıyla
│ │ Devlet 412 │ │ Vakıf (burslu olursa) ││ yeni bileşen yok
│ └─────────────┘ │ 288 ││
│ └───────────────────────┘│
│ ┌──────────────┐ │
│ │ Fark etmez │ │
│ └──────────────┘ │
│ │
│ ·· min-h tabanı: boş alan (bkz. 1.1-c) ··│
│ │
│───────────────────────────────────────────│ ← border-t border-slate-100 pt-4 (mevcut)
│ ← Geri Listemi oluştur → │ ← CTA deseni doğru: metin + ArrowRight size-4
└───────────────────────────────────────────┘
```
Üç karar, gerekçesiyle:
- **"ÜNİVERSİTE TİPİ" üst etiketi (`:441-444`) silinir.** h3 artık aynı soruyu soruyor;
etiket kalırsa aynı soru ekranda iki kez yazar. (Adım 1-2'deki etiketler yerinde kalır —
oralarda h3 ile etiket farklı şeyler söylüyor.)
- **h3 soru cümlesine döner:** "Üniversite tipi & öncelikler" → **"Devlet mi, vakıf mı?"**
Adım 1 ve 2 de tek soru sorduğu için sihirbaz üç adımda üç soru olur; CEO §5-1'in (a)
şıkkının ekran karşılığı bu.
- **Modal yüksekliği — tek gerçek risk ve tek satırlık çözümü.** `TransitionPanel` panel
yüksekliğini ölçüp animasyonla geçiriyor (`:207-211`, `:246-259`); 3. adım bugün en uzun
panellerden biri, kalkınca en kısası olur (koddan çıkarım: ~%50 kısalma). Dialog dikey
ortalı olduğu için modal **hem üstten hem alttan** içeri gelir: kullanıcının "Devam"a
bastığı nokta, geçişten sonra **"Listemi oluştur"un yeni yeri**ne yakın düşer. O buton
kredi harcayan butondur; yanlış basma bedeli para. **Çözüm:** yalnız 3. adım paneline
`min-h-[Npx]` ver, N = 1. adım panelinin 375 px'teki ölçülen yüksekliği (yazılımcı
ölçer; ben ölçmedim, tarayıcı açmam yasak). Yeni bileşen yok, yeni animasyon yok,
`prefers-reduced-motion` dalı (`hareketiAzalt`, `:249`) zaten var ve korunur. Büyüklük: XS.
**Aynı commit'e sığan bedava düzeltme:** bu dosyada zaten 5 `text-slate-400` metin var
(`:228, 381, 406, 442, 473`); `:473` ve `:442` bu kesimle ölüyor, kalan üçü (`228, 381, 406`)
`text-slate-500`'e çekilsin — R7'nin en görünür üç satırı, ek dosya açmadan kapanır.
### 1.2 (b) Hüküm: 3 adım kalır, 2'ye inmez
| Kriter | 3 adım (öneri) | 2 adım |
|---|---|---|
| Ekranın tek işi | ✅ her adım tek soru | ❌ 2. adım "il **ve** tür" — 3. adımdan çıkardığımız hatayı 2'ye taşır |
| `/meraklisina` şeması | ✅ `SEMA` zaten "3. adım · Devlet / Vakıf" diyor, senkron | ❌ şema + `aria-label` + figcaption + 4. bölüm anlatımı baştan yazılır |
| Ölçüm | ✅ `sihirbaz_adim{1,2,3}` serisi kırılmaz | ❌ P4'ten hemen sonra ikinci bir seri kırılması |
| 375 px | ✅ tür çipleri kendi ekranında | ❌ il araması (`max-h-56` kaydırmalı liste, `:333`) + seçilenler + tür çipleri tek panelde; iç kaydırma ile çip satırı üst üste biner |
| Algılanan yük | 3 adım × 1 soru = sihirbazın en sade hâli | 2 adım ama biri iki soruluk — kısalma hissi yok |
**Hüküm: 3 adım.** Tek karşı argüman "adım sayısı azalsın" hissi; onu zaten öncelikleri
silerek alıyoruz (ekranda 7 çip + 2 açıklama satırı eksiliyor), adım birleştirmeye gerek yok.
### 1.3 (c) `/meraklisina` mermaid şeması — **gereken düzeltme: yok**
AGENTS.md şema senkronunu zorunlu tutuyor, o yüzden borcu tek tek doğruladım:
```
grep -rni "öncelik\|oncelik" src/features/pazarlama/ src/app/meraklisina/ → 0 satır
```
- `huni-semasi.tsx` `SEMA`: `C("3. adım · Devlet / Vakıf<br/>sayılar hem alanı hem ili
hesaba katar")` — öncelik geçmiyor, adım sayısı-sırası değişmiyor, havuz kuralı
değişmiyor, 24'lük iskelet (5/13/6) değişmiyor, gevşetme sırası değişmiyor,
havuz-dışına-çıkamama değişmiyor. **Düzenlenecek düğüm yok.**
- `aria-label` (`huni-semasi.tsx:44`): "…alan, il ve devlet/vakıf adımlarıyla…" — doğru kalıyor.
- `figcaption`: öncelik geçmiyor.
- `meraklisina-icerik.tsx:107-127` (4. bölüm): "üçüncü adımdaki devlet/vakıf sayıları da
hem alan hem il seçimini hesaba katar" — doğru kalıyor.
**Yani bu kesim, belgeyi ekrana değil, ekranı belgeye uyduruyor** — CEO §2 doğrulama #9 ile
aynı sonuç. Commit mesajına tek satır yeter:
`/meraklisina şeması değişmedi: 3. adım zaten yalnız devlet/vakıf olarak belgeliydi (huni-semasi.tsx SEMA düğümü C).`
> Tek isteğe bağlı rötuş (zorunlu değil): 3. adımın ekrandaki h3'ü "Devlet mi, vakıf mı?"
> olunca şemadaki "3. adım · Devlet / Vakıf" etiketiyle kelimesi kelimesine aynı dili
> konuşur. Şemaya dokunulmaz.
### 1.4 (d) Kaldırılan alan veride ve kayıtlı raporlarda ne olacak
Kural: **hiçbir şey silinmez, yalnız bir kıyas durdurulur.** Alan alan:
| # | Yer | Karar | Neden |
|---|---|---|---|
| 1 | `types/rapor.ts:71` `oncelikler?: string[]` | **Kalır** (zaten opsiyonel) | Kayıtlı raporlar `params` JSON'ı olarak duruyor (`rapor-actions.ts:91`); tip daraltılırsa eski kayıtlar tipten düşer. Göç yok, şema değişikliği yok. |
| 2 | `sihirbaz-sabitler.ts:10-18` `ONCELIKLER` sabiti | **Silinmez** | `sihirbazDogrula` (`:108-124`) eski localStorage profillerindeki değerleri bu listeye göre süzüyor; sabit silinirse eski profillerin seçimi sessizce düşer. Sabit kalır, yalnız ekranda render edilmez. |
| 3 | `sihirbaz-sabitler.ts:132` `oncelikNormalize` | **Kalır** | Eski "İş garantisi" adını eşleyen geriye uyum köprüsü; eski raporlar gösterilirken hâlâ gerekli. |
| 4 | **`tercih-farki.ts` — tek zorunlu değişiklik** | `"oncelikler"` kıyastan **çıkar** | Çıkmazsa: eski raporun `params.oncelikler = ["Prestijli üniversite"]`, yeni profilin `s.oncelikler = []` → `kumeFarkli` **true** → /listem başlığında kalıcı "Tercihlerin değişmiş" rozeti ve 3 kredilik güncelleme çağrısı, kullanıcı **hiçbir şey değiştirmediği hâlde**. Dosyanın kendi ilkesine aykırı (`:8-12`: "olmayan alan değişmiş sayılmaz"). Dokunulacak dört nokta: `FarkAlani` union (`:22-28`), `FARK_ETIKET` (`:30-37`), `tercihFarklari` içindeki `if (kumeFarkli(params.oncelikler?…))` (`:73-75`), `farkSatirlari` içindeki `case "oncelikler"` (`:112-114`). |
| 5 | `listem-govde.tsx:129-131` "Önceliklerin: …" | **Kalır** | Koşullu (`params.oncelikler?.length`); eski raporda dolu görünür — danışmanın neyi bildiğini dürüst gösterir. Yeni raporda hiç çıkmaz. Sıfır iş. |
| 6 | `sihirbaz-sabitler.ts:182-184` prompt satırı | **Kalır** | Aynı koşul. Eski bir rapor yeniden üretilirse kullanıcının kaydettiği tercih korunur. |
| 7 | `app/api/soru/route.ts:32,77` · `lib/ai/rapor.ts:251,279` | **Değişmez** | Zaten `?? []` ile null-safe. |
| 8 | `tercih-degerlendirme.ts:59-66` `"Kolay yerleşme"` dalı | **Kalır (ölü değil, geriye uyumlu)** | **Dünkü raporumun eksiği:** öncelikler yalnız gerekçe tonuna değil, tercih değerlendirmesindeki olumlu/çelişki satırlarına da dokunuyor ("Daha güvenli seçenek önceliğini destekliyor"). Yeni kullanıcıda hiç çalışmaz, eski profilde çalışmaya devam eder. Kayıp: güvenli dilim programlarında bir olumlu satırı — kabul edilebilir, çünkü bu satır zaten yalnız 7 çipten birini seçmiş azınlıkta çıkıyordu. |
| 9 | `sihirbaz_tamamlandi` olayındaki `oncelik_sayisi` (`sihirbaz-adimlar.tsx:524`) | **Olayda kalır, hep 0 olur** | Alanı kaldırmak Rybbit'te geriye dönük okumayı bozar. **Commit mesajına seri kırılması notu** (P4'teki kalıp): *"bu tarihten sonra `oncelik_sayisi` her zaman 0'dır."* |
**Özetle geri alınabilirlik:** karar dönerse yalnız 3. adıma çip bloğu ve `tercih-farki.ts`'e
dört nokta geri konur; veride, DB'de, kayıtlı raporlarda hiçbir şey kaybolmamış olur.
CEO §5-1'deki "ucuz ve geri alınabilir" hükmü kod tarafından doğrulanıyor.
---
## 2. R7 — `text-slate-400` sınıflandırması (48 kullanım / 19 dosya)
### 2.1 Sayılar
| Sınıf | Adet | Hüküm |
|---|---|---|
| **Gerçek metin** (WCAG 1.4.3, 4,5:1 borcu) | **26** | Düzeltilir |
| **Placeholder metni** (1.4.3 kapsamında) | **2** | Düzeltilir |
| **Dekoratif ikon / `aria-hidden` glif** | **11** | Sorun değil, dokunulmaz |
| **Fonksiyonel ikon** (WCAG 1.4.11, 3:1 borcu) | **4** | Ayrı kural, ucuz — aynı commit'e katlanabilir |
| **Devre dışı durum** (`disabled:`) | **1** | WCAG 1.4.3 muaf, dokunulmaz |
| **Dev paneli** (kullanıcı görmez) | **4** | Kapsam dışı |
| | **48** | |
**Büyük punto: 0.** Eşik 18,66 px kalın ya da 24 px normal. En büyük aday
`katalog-arama.tsx:419` placeholder'ı (`text-base sm:text-lg` = 16/18 px, kalın değil) —
eşiğin altında. Yani 28'inin de borcu 4,5:1, hiçbirine 3:1 indirimi uygulanmıyor.
### 2.2 Gerçek metin — 26 satır (düzeltilecek)
`liste-uretici.tsx:429` (üretim sırasında "sayfayı kapatma" uyarısı) ·
`sihirbaz-adimlar.tsx:228` ("Adım 1/3"), `:381`, `:406` ("Seçtiklerin:"), `:442`, `:473` ·
`universite-listesi.tsx:26` (il + program sayısı), `:65`, `:75`, `:86` (başlık sayaçları) ·
`giris-form.tsx:159` ("veya" ayracı) ·
`katalog-arama.tsx:567` ("Keşfet"), `:703` (bölüm başlığı `h3`), `:742` (sağdaki detay, yalnız `sm+`) ·
`bolum-listesi.tsx:21`, `:66` · `program-netleri.tsx:176` (" / {max}" paydası) ·
`bolum-program-listesi.tsx:235` ("· 4 yıl") ·
`liste-cekmecesi.tsx:131` ("3/24" sayacı), `:231` (kesikli "ekle" butonunun etiketi) ·
`program-tablosu.tsx:217` (dilim toplamı), `:278` ("20 / 1.340 program"), `:349` ("· 4 yıl") ·
`tercih-profili-kapisi.tsx:369` (**`<label htmlFor>` — form etiketi**) ·
`secimlerim-paneli.tsx:108` ("3/24") · `tercih-haritasi.tsx:525` ("Kilitli tercih" durum metni)
Placeholder (2): `sihirbaz-adimlar.tsx:312` · `katalog-arama.tsx:419`
### 2.3 Dokunulmayanlar
- **Dekoratif ikon (11):** `liste-uretici:268` · `rapor-listesi:258` · `cta-sira-form:233` ·
`sihirbaz-adimlar:304` · `sayfalama:136` (`aria-hidden` "…") · `katalog-arama:408`, `:600` ·
`kaydet-banner:75` · `liste-cekmecesi:253` · `tercih-profili-kapisi:376` ·
`program-liste-verileri:52` ("—" veri yok glifi). Bunları koyulaştırmak metin/ikon
hiyerarşisini bozar, kazanç sıfır.
- **Fonksiyonel ikon (4):** `sihirbaz-adimlar:319` (aramayı temizle) · `kaydet-banner:102`
(banner'ı kapat) · `liste-cekmecesi:141` (sil), `:147` (`DrawerClose`). Bunlar 1.4.3
değil **1.4.11** (3:1) kapsamında ve 2,56:1 ile onu da geçmiyorlar — ama bunlar zaten
dünkü R10'da (dokunma hedefi < 44 px) ellenecek butonlar; ikisini **aynı** commit'te
yapmak mantıklı.
- **Devre dışı (1):** `giris-form.tsx:127` `disabled:text-slate-400` — WCAG 1.4.3 devre dışı
bileşenleri açıkça muaf tutuyor. Değiştirilirse "tıklanabilir" hissi verir, zarar.
- **Dev paneli (4):** `dev-panel.tsx:185, 232, 239, 320` — kullanıcı görmez.
### 2.4 Hesap ve hedef token
Kaynak: `globals.css`/Tailwind slate ölçeği, WCAG 2.x göreli parlaklık formülü.
| Renk çifti | Oran | Sonuç |
|---|---|---|
| `slate-400` (#94A3B8) / beyaz | **2,56:1** | ❌ |
| `slate-400` / `slate-50` (#F8FAFC) | **2,45:1** | ❌ |
| `slate-500` (#64748B) / beyaz | **4,76:1** | ✅ |
| `slate-500` / `slate-50` | **4,55:1** | ✅ (payı dar) |
| `slate-500` / `slate-100` (#F1F5F9) | **4,34:1** | ❌ — bu zeminde `slate-600` (6,92:1) gerekir |
| `slate-600` (#475569) / beyaz | **7,58:1** | ✅ |
**Kural:** hedef `text-slate-500`; **yalnız `bg-slate-100` üstünde duran satırlarda**
`text-slate-600`. Yeni token icat edilmiyor, palet değişmiyor (palet değişikliği `[BİLAL]`).
### 2.5 Hüküm
**Tek commit, 28 satır** (26 metin + 2 placeholder) → `text-slate-500`. Fonksiyonel 4 ikon
isteğe bağlı olarak aynı commit'e (R10 ile birlikte daha mantıklı). **Kör `sed` değil:**
aynı dosyalarda dokunulmaması gereken 11 dekoratif ikon var, bu yüzden 28 hedefli satır
düzenlemesi. Yeni bileşen yok, yeni sabit yok, düzen değişmiyor, `tsc`/`lint` riski yok.
Büyüklük: **S–M (~45-60 dk)**, tek dosyaya değil 15 dosyaya dokunduğu için inceleme yükü
küçük ama geniş → **ayrı ve tek amaçlı dal** şart.
**Bütçe sıkışırsa düzeltilecek 9 satır** (sıralı, en yüksek zarardan):
1. `tercih-profili-kapisi.tsx:369` — **form etiketi**; funnel'ın giriş kapısındaki alanın adı.
2. `sihirbaz-adimlar.tsx:228` — "Adım 1/3"; sihirbazdaki tek yazılı ilerleme göstergesi.
3. `sihirbaz-adimlar.tsx:381` ve `:406` — adım 1-2 alan etiketleri (`:442`/`:473` K5 ile ölüyor).
4. `liste-uretici.tsx:429` — "sayfayı kapatma" uyarısı; okunmazsa kullanıcı üretimi yarıda keser, **kredi yanar**.
5. `program-tablosu.tsx:278` — "20 / 1.340 program"; /sonuc'ta "daha var mı?" sorusunun tek cevabı.
6. `liste-cekmecesi.tsx:131` + `secimlerim-paneli.tsx:108` — "3/24" sayacı; manuel listenin tek geri bildirimi.
7. `tercih-haritasi.tsx:525` — "Kilitli tercih" durum metni.
8. `universite-listesi.tsx:26` — en kalabalık hub'daki tek satır üstü bilgi (il + program sayısı).
---
## 3. URAP takasının telafisi
### 3.1 Dün neyi yanlış yaptım — tek cümle
**Bir sayfada bilginin "zaten var" olduğunu, o sayfada o bilgiyi hiç aratmadan, farklı bir
sayfa tipindeki (karışık üniversiteli `/sonuc` ve `/bolum` listelerindeki Devlet/Vakıf
rozetlerinden) genellemeyle varsaydım** — oysa tek üniversitelik detay sayfasında rozet
tekrar olacağı için hiç yok. Doğrulama tek komutmuş:
```
grep -n "unitur" src/features/katalog/components/universite-icerik.tsx
→ 316-319 (yalnız "Tür" kartı)
grep -n "unitur\|Devlet\|Vakıf" src/features/katalog/components/universite-program-tablosu.tsx
→ 0 satır
```
Kural: "X bilgisi başka yerde de var" gerekçesi, **o dosyada grep'lenmeden** kullanılamaz.
### 3.2 Yan bulgu: takas edilen kart zaten bozuktu
`programs` tablosunda 6 `unitur` değeri var: `DEVLET` (12.142), `VAKIF` (7.974),
`KKTC` (1.145), `VAKIF MYO` (121), `YURTDISI KAMU` (99), `YURTDISI VAKIF` (12).
Kart `trBaslikDuzeni(uni.unitur)` kullanıyor (`universite-icerik.tsx:318`) ve
`slug.ts:56-64` tr-TR küçültmesi yapıyor → ekranda **"Kktc", "Vakıf Myo", "Yurtdısı Kamu",
"Yurtdısı Vakıf"** yazıyor. Yani 6 değerin 4'ünde bugünkü kart zaten hatalı metin basıyor.
Telafi metni **açık bir etiket haritasıyla** yazılmalı, `trBaslikDuzeni` ile değil.
### 3.3 İki alternatif
**Alternatif A — özet paragrafın ilk cümlesine tek sözcük öbeği (ÖNERİLEN)**
`universite-icerik.tsx:262-266`
```
390 px · /universite/[slug] · ilk ekran
Ana Sayfa › Üniversiteler › Boğaziçi Üniversitesi
[logo] Boğaziçi Üniversitesi Taban
Puanları 2026
Boğaziçi Üniversitesi (İstanbul), devlet üniversitesi; ← TEK EKLENEN ÖBEK
2026 YKS yerleştirme sonuçlarına göre 312 programda (mevcut <p> içinde)
öğrenci aldı; programlar 24 fakülte/yüksekokula
dağılıyor. En iyi taban başarı sıralaması 1.240. …
[ Sıralaman Boğaziçi tabanlarının neresinde? → ] ← ustSiraSatiri (mevcut)
┌──────────────────┐┌──────────────────┐
│ PROGRAM ││ FAKÜLTE / BİRİM │
│ 312 ││ 24 │
└──────────────────┘└──────────────────┘
┌──────────────────┐┌──────────────────┐
│ URAP TÜRKİYE ││ EN İYİ SIRALAMA │ ← ızgara 4 kart, CEO §3-P3 aynen
│ 18 / 198 ││ 1.240 │
│ 2025-2026 ││ │
└──────────────────┘└──────────────────┘
```
Metin (tam): `"{uni.ad}{il ? ` (${il})` : ""}, {TUR_CUMLESI[uni.unitur]}; {SON_YIL} YKS …"`
| `unitur` | Cümledeki öbek |
|---|---|
| `DEVLET` | devlet üniversitesi |
| `VAKIF` | vakıf üniversitesi |
| `VAKIF MYO` | vakıf meslek yüksekokulu |
| `KKTC` | KKTC üniversitesi |
| `YURTDISI KAMU` | yurt dışında bir kamu üniversitesi |
| `YURTDISI VAKIF` | yurt dışında bir vakıf üniversitesi |
| `null` | öbek **hiç yazılmaz** (virgül de yazılmaz — "—" yok, boşluk yok) |
Neden A:
- **Sıfır yeni eleman, sıfır düzen değişikliği, sıfır CLS, sıfır mobil taşma riski.**
Izgara 4 kart kalır; P3'ün kabul kriteri (1) hiç zorlanmaz.
- **En çok okunan konumda:** cümlenin ilk 6 kelimesi, ad ve ilin hemen yanında. Dün
paragrafı "taranabilir değil" diye reddettiğim şey bir **sayıydı** (18/198 — okuyucunun
kafasında ölçeklemesi gereken, gözle aranan bir değer); devlet/vakıf **kategorik tek
sözcük** ve zaten cümlenin öznesine yapışık — aranmıyor, okunuyor.
- **Ekran okuyucu tarafı kazanıyor:** bugün `dt/dd` çiftinde tek başına duran "Tür"
yerine, bilgiyi bağlamıyla birlikte veren bir cümle.
- **Ücret sinyali doğru kullanıcıya gidiyor:** Boğaziçi'nde kimse "devlet mi?" diye sormaz;
asıl muhatap az bilinen vakıf üniversitesinin sayfasına Google'dan inen öğrenci ve o
sayfada ilk okuduğu satır bu cümle.
**Alternatif B — "Program" kartının değerinin altına ikinci satır**
```
┌──────────────────┐┌──────────────────┐
│ PROGRAM ││ FAKÜLTE / BİRİM │
│ 312 ││ 24 │
│ Devlet üniv. ││ │ ← eklenen satır
└──────────────────┘└──────────────────┘
```
Artısı: taranabilir, kart sayısı yine 4. Eksileri: (a) kartın başlığı "PROGRAM", altındaki
satır programla ilgili değil — `dt`/`dd` anlamı bozulur; (b) 390 px'te 2 sütunlu ızgarada
kartlar eşit yükseklik aldığı için **dört kartın hepsi** birer satır uzar, ilk ekrandan
~28 px daha gider; (c) "Vakıf meslek yüksekokulu" 190 px'lik karta sığmaz, kısaltma
uydurmak gerekir. **Reddediliyor.**
### 3.4 Öneri
**A.** Büyüklük **XS** (tek `<p>` + bir etiket haritası sabiti, ~12 satır), P3 dalının
**aynı commit'ine** girmeli — takas ile telafi ayrı commit'lerde giderse arada 198 sayfa
bilgisiz kalır. Kabul kriteri ekle: *"`/universite/[slug]` çıktısında üniversitenin türü
(devlet/vakıf/KKTC/…) tam olarak bir kez, özet paragrafın ilk cümlesinde geçer;
`unitur` NULL olan kurumda hiç geçmez ve cümlede boşluk/kopuk virgül kalmaz."*
Dumandan doğrulaması ucuz: `bogazici-universitesi.html`'de "devlet üniversitesi" = 1,
`koc-universitesi.html`'de "vakıf üniversitesi" = 1.
---
## Bilal'in gözle kontrol etmesi gerekenler (375-390 px)
1. **Sihirbaz, 2. adımdan 3. adıma geçiş** — "Devam"a bastıktan sonra modal ne kadar
kısalıyor, "Listemi oluştur" parmağın kaldığı yere geliyor mu? (§1.1, `min-h` kararı buna bağlı)
2. **Sihirbaz 3. adım bugünkü hâli** — "Senin için önemli olan" çipleri 375 px'te kaç satıra sarıyor?
3. **`/universiteler` hub'ı** — üniversite adının altındaki gri "İstanbul · 312 program"
satırı gün ışığında okunuyor mu? (R7'nin en kalabalık yüzeydeki örneği)
4. **Liste üretimi sırasında** — "Bu işlem yarım dakika kadar sürebilir, sayfayı kapatma."
cümlesi görünüyor mu, yoksa gri mi kayboluyor? (R7 · kredi yakma riski)
5. **`/universite/koc-universitesi`** — bugün "Tür" kartında ne yazıyor; sayfada başka
hiçbir yerde "Vakıf" geçmediğini gözle doğrula (§3.1'in görsel karşılığı).
## Bilal'den istenen (2 madde)
1. **CEO §5 soru 1'i cevapla** (sihirbazın son adımındaki 7 öncelik çipi kalksın mı).
"Evet" ise uygulanacak her şey yukarıda hazır: tek ekran taslağı, 3 adım hükmü,
`/meraklisina` için "şema değişmiyor" kanıtı ve `tercih-farki.ts`'teki tek zorunlu
düzeltme. **~3 dk.**
2. **R7 için bütçe seç:** tam iş (28 satır, tek dal, ~45-60 dk, geniş ama sığ inceleme) mi,
yoksa §2.5'teki **9 satırlık** kısa liste mi. **~2 dk.**