# 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 , 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
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` (**`