Files
kolaytercih/docs/gece-vardiyasi/2026-09-23/02-tasarim-acik-sorular.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

375 lines
24 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: 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.**