Files
kolaytercih/docs/gece-vardiyasi/2026-09-22/36-tasarimci-g1-ve-navbar.md
bilalgursen 2b350d0c5d content(rehber): gece vardiyasının 14 yeni yazısı + 2 düzeltme, ekip raporları ve kurallar
14 yeni rehber yazısı (hepsi editör denetiminden geçti, 46 yazıda 829 iç link
tarandı, 0 kırık hedef; 180+ DB rakamı yazıların kendi filtreleriyle yeniden
koşuldu):

  taban-siralamalari-alti-yilda-nasil-degisti · kac-net-ile-hangi-bolum ·
  siralama-bandlari-hangi-kapilar-acilir · ayni-bolum-farkli-universite-siralama-farki ·
  hangi-bolumlerin-kontenjani-azaldi · yeni-acilan-bolumler-nasil-degerlendirilir ·
  bilgisayar-mi-yazilim-muhendisligi-mi · kktc-universiteleri-okunur-mu ·
  yapay-zekaya-tercih-sordum-guvenilir-mi · ek-madde-1-puanim-yetiyor-mu ·
  universitede-ilk-hafta-ders-kaydi-muafiyet-kayit-dondurma · yks-2027-takvimi ·
  rehber-ogretmenler-icin-veri-kaynaklari · bolumumu-sevmedim-hangi-kapilar-var

İki canlı yazı düzeltildi:
- veliler-icin-tercih-rehberi: veli diliyle kapanış; altındaki "sıralamanı gir"
  kutusu artık veliye ölü uç değil
- bos-kontenjanlar-ne-anlatiyor: "birkaç yüz kişilik fark" aslında ~9 bin
  (ÖSYM 265.356 ↔ bizim 256.532); payda açıklaması tersti — ek kontenjan
  paydaya girseydi oran düşerdi. guncelleme alanı eklendi (sitemap lastmod).

Kurallar (AGENTS.md):
- Yayın sonrası arama motoru bildirimi: URL denetimi yalnız canlıda 200 dönen
  adrese; kota sayacı; mülk/hesap notu; sitemap grep kuralı
- Yıkıcı git komutları yasak: reset/checkout --/restore/clean/stash
- Tarayıcı açma: tasarımcı ve UX gerekli gördüğünde açabilir (yetenek için
  .claude/agents/tasarimci.md'ye tarayıcı araçları eklendi)

docs/gece-vardiyasi/2026-09-22/ — 34 rapor: CEO kararları ve kapanış turu,
marka/ödeme analizi, sıfır ödeme teşhisi, SEO konu planı, veri kalitesi,
editör denetimi, CTO şartnamesi, yazılımcı ve güvenlik raporları, SABAH-OZETI.

docs/ekip/YAYIN-KUYRUGU.md — Search Console bildirim kuyruğu.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 23:25:34 +03:00

238 lines
23 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.
# 36 — Tasarımcı: navbar taşması + G1 merge öncesi denetimi
Tarih: 22 Eylül 2026 · Rol: `tasarimci` · Taban: `main` `9bd448b`
İşaret: **[D]** doğrulandı (canlı HTML / font metriği / hesap) · **[Ç]** koddan çıkarım · **[BİLAL]** karar Bilal'in
---
## Özet (5 madde)
1. **Navbar taşmasının kök nedeni tek satır değil, bir yapısal varsayım:** orta alan `absolute` olduğu için flex onu göremiyor, sağ küme `shrink-0` olduğu için çekilmiyor — çakışma sessiz. Tetikleyici ise `xl:inline`: **`max-w-6xl` konteyneri 1152 px'te kilitlendiği için `xl` (1280 px) hiç yeni yer açmıyor, ama o noktada ~229 px etiket geri geliyor.** [D, hesap aşağıda]
2. **P4 (`cb22faf`) dört ayrı genişlikte kırılma üretti:** ≥1280 px'te orta alanla çakışma (−28 … −220 px), 1024–1151 px'te dar bir bantta çakışma (−48 px), ve **640–1023 px'te header'ın 2 satırdan 3 satıra çıkması** (tasarımın kendi yorumu "lg altında 2 satır" diyor, `site-header.tsx:11`). 375 px'te de sınırda taşıyor.
3. **Önerilen düzeltme 2 satır:** `user-nav.tsx:59` ve `listem-butonu.tsx:39`'daki etiket span'lerinden **hem `xl:inline` hem `sm:inline`** kalkar. Bu etiketler yalnızca sığmadıkları iki bantta görünüyor. Kalan tek açık 1024–1151 bandı için ikinci, tek satırlık bir seçenek aşağıda.
4. **G1 merge edilebilir — ama bir düzeltmeyle.** Boş harita `null` olunca **hidrasyon CLS'i doğdu**: kayıtlı manuel listesi olan kullanıcıda sunucu 0 px, hidrasyondan sonra ~368 px harita sayfanın **tepesine** giriyor ve tadımlık + tablo aşağı kayıyor. Eski placeholder tam da bunu engelliyordu. G1 raporunda bu yok.
5. **Metinde bir artık kaldı:** buton "24 satırın tamamı" iddiasından arındırıldı ama **iki eleman yukarıdaki paragraf aynı vaadi sürdürüyor** — `tadimlik-satiri.tsx:135` "24 tercihlik listenin **her satırı** bu formatta kurulur". Maske girişsiz kullanıcıya 3 satır açıyor (`rapor-maske.ts:12`).
---
# İŞ 1 · Navbar taşması
## Yöntem — neden koddan yetinmedim, ne yaptım
Kural değişikliği geldi (tarayıcı serbest), ama bu oturumun araç setinde tarayıcı/önizleme aracı yok (`Bash`, `Read`, `Write`, `Edit`, `Skill`). `preview_stop` da çağıramıyorum, dolayısıyla açık sunucu bırakmadım. Onun yerine iki gerçek ölçüm yaptım:
1. **Canlı sunucu HTML'i çekildi** (`curl https://kolaytercih.com`, 392 KB) — navbar markup'ı `main` ile birebir aynı [D]. **Ama girişsiz ziyaretçide "Yapay Zeka Listem" pill'i HTML'de hiç yok** (`grep -c` → 0); yalnızca "Giriş yap" var. Pill sadece girişli kullanıcıda render ediliyor (`user-nav.tsx:40-76`), giriş yapmam ise yasak. **Yani taşmayı canlıda gözle göremem — Bilal kendi oturumunda görüyor.**
*Düzeltme notu: orkestratörün "canlıda `Yapay Zeka listemi kur` etiketi duruyor" bilgisi yanlış; o dize navbar'ın değil hero formunun submit butonunun metni (`hero-form.tsx:194`). Navbar etiketi `Yapay Zeka Listem`.*
2. **Gerçek font metriğiyle ölçüm.** Tahmin yerine `src/fonts/og/ClarityCity-SemiBold.ttf` ve Bricolage `.woff` dosyalarının `hmtx`/`cmap` tablolarını ayrıştırıp her dizenin ilerleme genişliğini hesapladım [D]. Aşağıdaki piksellerin hepsi bu ölçümden gelir, yuvarlama dışında tahmin yok.
| Dize | Boyut | Genişlik |
|---|---|---|
| `Yapay Zeka Listem` | 14 px / 600 | **129,7 px** |
| `Kendi Listem` | 14 px / 600 | 89,4 px |
| `Sıralamanı gir` | 16 px | 107,8 px |
| `Nasıl çalışır?` | 16 px | 96,9 px |
| `KolayTercih` (Bricolage) | 30 px | 168,6 px (tracking-tighter ile 152,1) |
## Kök neden — üç katman
**(a) Orta alan akışın dışında.** `katalog-arama.tsx:270` → `absolute left-1/2 -translate-x-1/2 … lg:flex`. Konteyner `site-header.tsx:12`'de `relative`. Absolute eleman flex satırında yer kaplamaz, dolayısıyla sağ küme büyüdükçe **flex hiçbir şey fark etmez**; taşma yerine sessiz çakışma olur. Üstelik boyama sırası gereği (CSS 2.1 Ek E, adım 8 > adım 7) konumlanmış `<nav>` statik pill'lerin **üstüne** boyanır — yani koyu "Ara" butonu "Yapay Zeka Listem" pill'inin sol ucunu kapatır. (`Kendi Listem` butonu `relative` olduğu için tersine, o nav'ın üstüne çıkar — `listem-butonu.tsx:35`.) Bilal'in gördüğü "üstüne çıkıyor" tam olarak bu.
**(b) Asıl tetikleyici: `xl` yeni yer açmıyor.** Konteyner `max-w-6xl` = **1152 px**. Yani viewport 1152'yi geçtikten sonra içerik genişliği **artık büyümüyor**. Ama `user-nav.tsx:59` ve `listem-butonu.tsx:39`, `lg:hidden xl:inline` deseniyle **1280 px'te iki etiketi birden geri getiriyor (+229 px)**. 1280 px'te kazanılan yer: **0 px.** Bu desen daha baştan tutarsız.
**(c) P4'ün eklediği yük.** `cb22faf` sağ kümeye lg–xl bandında +66 px, xl+ bandında +204 px ekledi. Sınır zaten dardı; bu onu geçirdi.
## Genişlik genişlik — ne oluyor
Geometri: konteyner genişliği `Wd = min(viewport, 1152)`; orta `<nav>`'ın merkezi `Wd/2`; sağ kümenin sağ kenarı `Wd − 16`. **BOŞLUK = küme sol kenarı − nav sağ kenarı**; negatif = çakışma. [D, hesap]
Ölçülen parça genişlikleri: orta nav **profilsiz 480 px** / **profilli 357 px**; sağ küme **lg–xl 304 px** (liste dolu) / **xl+ 540 px** (liste dolu).
### 375 px (mobil) — orta nav gizli, ama satır taşıyor
| Durum | Logo | Sağ küme | Toplam | Sığan | Sonuç |
|---|---|---|---|---|---|
| Liste dolu, 3 haneli kredi | 123 | 225,3 | **356,5** | 351 | **Satır-2'ye taşar → 3 satırlık header** |
| Liste boş | 123 | 153,3 | 284,5 | 351 | Tek satır OK |
Sınırda (5,5 px). 3 satıra çıkınca yapışkan header ≈ **140 px** — 667 px'lik iPhone SE ekranının **%21'i kalıcı olarak gidiyor**. P4 öncesi bu durum yoktu (küme 179 px idi).
### 768 px (tablet) — en kötü bant
| Durum | Logo | Sağ küme | Toplam | Sığan | Sonuç |
|---|---|---|---|---|---|
| Liste dolu | 196 | **582,8** | 790,9 | 736 | **Satır-2'ye taşar → 3 satırlık header (~176 px)** |
| Liste boş | 196 | 391,4 | 599,5 | 736 | Tek satır OK |
Sebep: `sm:inline` etiketleri 640 px'te açıyor ve `lg:hidden` 1024'e kadar kapatmıyor — yani **640–1023 px arası etiketler açık, ama yer yok**. 640 px'te liste boşken bile pay sadece 8,5 px. P4 öncesi küme 379 px idi, rahat sığıyordu.
### 1024 px
| Profil | Liste | nav sağ | küme sol | BOŞLUK |
|---|---|---|---|---|
| yok | dolu | 752 | 703 | **−48 px ÇAKIŞMA** |
| yok | boş | 752 | 798 | +46 |
| var | dolu | 690 | 703 | +13 (çok dar) |
| var | boş | 690 | 798 | +107 |
### 1280 px (ve tüm üstü — 1440, 1920 aynı, konteyner 1152'de sabit)
| Profil | Liste | nav sağ | küme sol | BOŞLUK |
|---|---|---|---|---|
| yok | boş | 816 | 788 | **−28 px ÇAKIŞMA** ← *Bilal'in gördüğü en olası hâl* |
| yok | dolu | 816 | 596 | **−220 px ÇAKIŞMA** |
| var | dolu | 754 | 596 | **−158 px ÇAKIŞMA** |
| var | boş | 754 | 788 | +33 |
**Kırılmanın başladığı nokta: tam olarak 1280 px** (`xl` sınırı). 1152–1279 arası sorunsuz, 1280'de bir anda −28 … −220 px. Konteyner büyümediği için **daha geniş ekran hiçbir şeyi düzeltmiyor** — 1920 px'te de aynı çakışma sürüyor.
## Düzeltme
### Önerilen — Alternatif 1 (en küçük, tek amaçlı, `[KARAR]`)
**Etiket span'leri her genişlikte gizli kalır; ikon + `aria-label` anlamı taşır.**
- `src/features/kullanici/components/user-nav.tsx:59`
`className="hidden sm:inline lg:hidden xl:inline"` → **`className="hidden"`** (ya da span tümden silinir; `aria-label="Yapay Zeka Listem"` ve `title` satır 52-53'te zaten var)
- `src/features/liste/components/listem-butonu.tsx:39`
aynı değişiklik (`aria-label` satır 33'te var)
Sonuç [D, hesap]: 375 px → 284,5/351 tek satır ✔ · 768 px → 555,8/736 tek satır ✔ · 1280+ → boşluk +15,5 … +110 px, çakışma yok ✔.
Kalan tek açık: **1024–1151 px, profilsiz + liste dolu → −48 … −1 px**.
**Bedeli dürüstçe:** P4'ün amacı keşfedilebilirlikti ("girişli 14 oturumun 7'si `/listem`'i hiç görmedi"). İkona indirince o kazanç zayıflar. Ama ölçüm şunu söylüyor: **1152 px'lik konteynerde, 480 px'lik ortalanmış bir nav'ın yanında sağ kümeye kalan bütçe ~304 px** — bu tam olarak dört ikon-pill eder, bir etiket bile fazladır. Etiketi korumanın yolu navbar'dan **bir şey çıkarmaktır**, daraltmak değil.
### Alternatif 2 (1 satır daha, 1024–1151 bandını da kapatır) — `[BİLAL]`
Alternatif 1 + `katalog-arama.tsx:310-314` → `Nasıl çalışır?` linkine `hidden xl:block`.
Orta nav profilsiz 480 → 339 px'e iner; 1024 px'te boşluk −48 → **+22 px** olur, her bant temizlenir [D, hesap].
`[BİLAL]` çünkü bu bir navigasyon/IA kararı: "Nasıl çalışır?" dar masaüstünde kaybolur. (Not: bu link yalnızca profilsiz durumda render ediliyor — yani tam da çakışan durumda.)
**Karşılaştırma:** Alt-1 tek başına Bilal'in gördüğü her şeyi çözer ve karar gerektirmez. Alt-2 kalan %10'u da kapatır ama bir menü öğesini dar masaüstünden düşürür. **Alt-1'i şimdi uygula, Alt-2'yi Bilal'e sor.**
### Yapılmaması gerekenler (değerlendirildi, elendi)
- `max-w-6xl` → `max-w-7xl`: 1280 px'te bile çakışma −156 px kalıyor. Çözmüyor.
- Orta nav'ı absolute'tan çıkarıp flex öğesi yapmak: doğru yapı ama nav'ın optik ortalanmasını bozar ve nav'ın butonları kısalmaya uygun değil — **navbar yeniden tasarımı, şimdi değil.**
- Etiket metnini kısaltmak: `[BİLAL]` gerektirir ve yetmez — `Yapay Zeka Listem` 129,7 px, 0'a inse bile xl bandındaki `Kendi Listem` (89,4 px) tek başına taşırmaya devam eder.
## Navbar'da ayrıca bulunan (P4 ile ilgisiz, küçük)
| Yer | Kural/sorun | Etki | Düzeltme | Büyüklük |
|---|---|---|---|---|
| `user-nav.tsx:63-74` | Kredi link'inin erişilebilir adı **"12"** (salt sayı). İçerikten gelen ad `title`'ı ezer; `Coins` `aria-hidden`, "kredi" span'i `lg:hidden` | Ekran okuyucu "12, bağlantı" diyor — nereye gittiği belirsiz | `aria-label="12 kredin var — kredi yükle"` ekle | XS |
| Tüm pill'ler, <640 px | Dokunma hedefi `h-9` = **36 px** (< 44 px) | Dar ekranda ıskalama | `sm` altında `h-11` ya da dokunma alanı genişletme | S |
---
# İŞ 2 · G1 (`funnel/sonuc-ilk-ekran`) merge öncesi tasarım denetimi
Diff okundu (`git diff 9bd448b..funnel/sonuc-ilk-ekran`, 6 dosya / 61+ 39−). Dal değiştirilmedi, çalışma ağacına dokunulmadı.
## HÜKÜM
> ### Şu bir düzeltmeyle merge edilebilir.
> **Engelleyici:** B1 (hidrasyon CLS'i). Tek dosya, tek satırlık yer değişikliği.
> **Aynı commit'e alınması güçlü önerilen:** B2 (paragraftaki artık vaat) — G1'in kendi amacı bu.
> Geri kalan her şey (hiyerarşi, mobil, AGENTS.md kuralları, CTA dili) **temiz.**
## Neyi doğruladım — temiz çıkanlar
- **CTA ok deseni ✔** `tadimlik-satiri.tsx:204` → metin önce, sonunda `<ArrowRight className="size-4" aria-hidden />`. `Sparkles` yok (dosyada hiç import edilmemiş).
- **`SectionEyebrow` ✔** `tadimlik-satiri.tsx:129` kanonik bileşeni kullanıyor, elle pill yok.
- **Kapatma çarpısı:** G1 hiçbir modal'a dokunmuyor — konu dışı ✔.
- **Risk dili ✔** `RaporSatirDetayi` (`rapor-listesi.tsx:60`) renk noktasının yanında `DILIM_ETIKET`/`RISK_ETIKET` metnini basıyor; renk tek başına anlam taşımıyor. G1 dokunmadı.
- **`first:mt-0` mantığı doğru [Ç]** JSX yorumları DOM düğümü üretmez; `ManuelHarita` `null` dönünce `<section>` gerçekten `main`'in ilk element çocuğu olur, `:first-child` eşleşir. Harita göründüğünde `mt-16` geri gelir. Doğru kurulmuş.
- **Mobil 375 px'te tadımlık kartı taşmıyor ✔** dış sarmalayıcı `flex-wrap` + `min-w-0`; program adı `truncate`; sıralama geçmişi `hidden md:inline-flex` ile mobilde düşüyor; CTA `w-full sm:w-auto` ve `h-11` = **44 px dokunma hedefi ✔**. Uzun üniversite adı yatay kaydırma üretmiyor.
## İlk ekran hiyerarşisi — yeni sıra mantıklı, bir uyarıyla
Yeni sıra: `ManuelHarita` (boşsa yok) → `TadimlikBolumu` → `SonucProgramTablosu` → `SonucSihirbazi` → dipnot.
- **Girişsiz + liste boş (ana hedef kitle):** kullanıcı ilk olarak tadımlığı görüyor. Doğru karar — ödeme öncesi gösterilebilen tek gerçek önizleme bu ve eskiden ~2.200 px aşağıdaydı.
- **Girişli kullanıcı:** `TadimlikBolumu` `null` döner (`tadimlik-bolumu.tsx:19`). Liste de boşsa `<main>`'in ilk çocuğu doğrudan tablo olur — **başlıksız, girişsiz, bağlamsız bir tablo**. Bu G1'in getirdiği bir bozulma değil (önce de öyleydi) ama boş harita gidince **daha çıplak** kaldı. A3 (`/sonuc` `<h1>`) bunu kapatacak; G1'i bloke etmez.
- Mobilde tadımlığın giriş bloğu (rozet + 2 satırlık h2 + 3 satırlık paragraf) **~195 px** yer tutuyor; 667 px'lik ekranda kartın yalnızca üst ~300 px'i görünüyor, CTA katlanın çok altında. Kabul edilebilir ama iyileştirilebilir — aşağıda Ö1.
## Erişilebilirlik — `<h1>` durumu
**Canlı `/sonuc` sunucu HTML'i çekildi [D]:** `<h1>` sayısı **0**, `<h2>` sayısı **5**. İlk üç h2 arama modalının içindeki `text-xs uppercase` etiketleri ("Popüler Bölümler", "Keşfet", "Rehberden").
- **G1 bunu değiştirmedi** (kapsam dışı bırakılmış, CTO şartnamesi açıkça yazıyor) ve **sorunu büyütmedi**: tadımlık h2'si zaten sayfadaki tek gerçek içerik başlığıydı, sadece yukarı taşındı. Belge sırasındaki başlık sayısı ve seviyeleri aynı kaldı.
- Küçük bir **iyileşme** bile var: başlık sırası artık görsel sırayla uyumlu (tadımlık h2 → sihirbaz h2), eskiden tersti.
- **A3 (`a11y/sonuc-h1`, `24-ceo-kapanis.md` §A) zaten kuyrukta.** G1'i bunun için bekletmeye gerek yok, ama **A3 merge edilirken `<h1>`'in tadımlığın h2'sinin ÜSTÜNE** konması gerekir — yoksa sayfa h2 ile açılır.
## BULGULAR
### B1 — ENGELLEYİCİ · Hidrasyon CLS'i: harita sayfanın tepesine sonradan giriyor
**Yer:** `manuel-harita.tsx:71` (`if (liste.length === 0) return null;`) + `sonuc/page.tsx:103` (sıradaki ilk eleman)
**Kural/sorun:** `useManuelListe` sunucu snapshot'ı olarak **her zaman boş liste** döner (`liste-store.ts:86` → `() => BOS_LISTE`); localStorage ilk client abonesinde okunuyor (`liste-store.ts:49-52, 72`). Yani **kayıtlı listesi olan her dönüş ziyaretçisinde**: sunucu 0 px yer ayırır → hidrasyondan sonra harita belirir → **tadımlık ve tablo aşağı itilir**.
**Kayma miktarı [D, hesap]:** `main` = `max-w-4xl px-4` → içerik 864 px; `aspect-[1050/447]` → **367,8 px** (375 px'te 146 px). Bu, `<main>`'in **ilk** çocuğunda olduğu için altındaki her şey kayıyor — impact fraction ~1. CLS eşiğini (0,1) rahatlıkla aşar.
**Eski kod tam da bunu engelliyordu:** silinen placeholder `aspect-[1050/447]` ile yeri **sunucuda** rezerve ediyordu; hidrasyonda gerçek harita aynı orana oturuyordu → kayma ~0. `TercihHaritasiLazy`'nin kendi `HaritaIskeleti`'si (`tercih-haritasi-lazy.tsx:10-17`) yalnızca **chunk** gecikmesini karşılar, `null` → görünür geçişini karşılamaz.
**Kullanıcıya etkisi:** Dönen kullanıcı sayfayı açıyor, tadımlığı okumaya başlıyor, saniyeler içinde metin 368 px aşağı kayıyor; tıklamak istediği yerde başka bir şey oluyor.
**Not:** CEO §3 G1-b'de onaylanan takas "**ilk `+` tıklamasında** haritanın belirmesi" — yani **kullanıcının kendi eylemi**. Sayfa yüklenirken kendiliğinden gelen kayma o onayın kapsamında değil ve G1 raporunda hiç geçmiyor.
**Önerilen düzeltme (en küçüğü):** `sonuc/page.tsx`'te **`<ManuelHarita />`'yı `<SonucProgramTablosu>`'nun ALTINA al** (satır 103'ten satır 128'in hemen öncesine). Gerekçe iki yönlü: (a) hidrasyonda gelen harita artık yalnızca sihirbaz + dipnotu iter, ikisi de katlanın altında → CLS ihmal edilebilir; (b) harita zaten tablodan kurulan listenin görselleştirmesi, tablodan **sonra** gelmesi bilgi mimarisi olarak da doğru. `first:mt-0` o zaman her durumda geçerli olur ve daha da sağlamlaşır.
**Büyüklük: XS** (tek JSX bloğunun yeri). Alternatif (yer rezervi için çerez mirror'ı) over-engineering — önerilmiyor.
### B2 — YÜKSEK · Butondan kaldırılan vaat paragrafta duruyor
**Yer:** `tadimlik-satiri.tsx:134-136`
> "Sıralamana uygun bir programın gerekçesi, yerleşme riski ve taban trendi — 24 tercihlik listenin **her satırı bu formatta kurulur**."
**Kural/sorun:** `2373a9a` butondan "24 satırın tamamı" iddiasını kaldırdı, ama iki eleman yukarıdaki paragraf aynı vaadi başka kelimelerle sürdürüyor. Maske girişsiz/paketsiz kullanıcıya **3 satır** açıyor (`rapor-maske.ts:12` `ACIK_SATIR = 3`); kalan 21 satırın gerekçe/risk/trend metni `SAHTE_*` sabitleriyle değiştiriliyor. Öğrenci bu cümleyi "24 satırın hepsini bu ayrıntıda göreceğim" diye okur.
**Kullanıcıya etkisi:** G1'in tam olarak kapatmak istediği beklenti açığı, kaldırdığı yerin 40 px yukarısında açık kalıyor. Girişten sonra 21 maskeli satır görmek, buton metninin düzeltilmesinden daha güçlü bir hayal kırıklığı.
**Önerilen düzeltme:** son cümleciği teslim edilene çek — ör. "— listendeki her satır bu formatta kurulur, ilk üçünü hemen açıyoruz." Sayı `"use client"` dosyaya import edilemiyor (`rapor-maske.ts` `server-only`, CTO Özet #4), bu yüzden **sayısız da yazılabilir**: "— listendeki satırlar bu formatta kurulur." **Sayı yazılacaksa `[BİLAL]`**, çünkü `3` elle yazılırsa tek kaynak kuralı bozulur.
**Büyüklük: XS** (tek cümle). `[BİLAL]` — marka/vaat metni.
### B3 — ORTA · Suspense fallback'i gerçek düzenle aynı genişlikte değil
**Yer:** `sonuc/page.tsx:47` (`max-w-6xl px-4 py-10`) ↔ `:99` (`max-w-4xl px-4 py-12`)
**Kural/sorun:** Fallback konteyneri **1152 px**, gerçek içerik **896 px**. `cookies()` sayfayı dinamik yaptığı için bu fallback gerçekten görülüyor. Çözüldüğü anda içerik 256 px daralıyor ve yeniden ortalanıyor → yatay + dikey kayma, her `/sonuc` yüklemesinde.
**G1 ile ilişkisi:** G1 fallback'e dokunmadı ve CTO "yanlışlığı artmıyor" dedi — doğru. Hatta **yapısal olarak iyileşti**: fallback'in `pill + başlık + alt satır` iskeleti artık gerçekten sayfanın tepesindeki `SectionEyebrow + h2 + p` ile eşleşiyor (eskiden tepede harita vardı, eşleşmiyordu). Ama genişlik ve hizalama (fallback sola, gerçek içerik `items-center text-center`) hâlâ uyumsuz.
**Önerilen düzeltme:** `max-w-6xl` → `max-w-4xl`, `py-10` → `py-12`, iskeletler `mx-auto` ile ortalanır. **Büyüklük: XS.** G1'i bloke etmez — ayrı bir commit ya da A3 dalıyla birlikte gidebilir.
### B4 — DÜŞÜK · "Giriş sonrası liste hemen üretilir" kredisiz kullanıcıda tutmuyor
**Yer:** `tadimlik-satiri.tsx:188-189`
Tadımlık yalnızca girişsiz kullanıcıya render ediliyor, ama girişsiz ≠ yeni kullanıcı: **çıkış yapmış, kredisi tükenmiş** bir kayıtlı kullanıcı da bu CTA'yı görür. `/listem?uret=1` o durumda üretemez. Cümle "hemen üretilir" diye koşulsuz vaat ediyor.
**Etki:** dar bir kitle, ama vaat tutmadığında tam huninin ortasında.
**Öneri:** ya cümle yumuşatılır ("Giriş sonrası liste üretimi başlar") ya da `/listem`'in kredisiz hata durumunun ne dediği QA'da doğrulanır. **Büyüklük: XS.** Bu paket için **engelleyici değil**.
## G1'in doğru yaptıkları (kayda geçsin)
- `listemUretHref`'in tek kaynağa taşınması (`sihirbaz-sabitler.ts:181`) + `uret=1` sıra sözleşmesinin doküman olarak oraya yazılması: iyi iş, ilerideki sessiz kırılmaları önler.
- `IZINLI_KAYNAKLAR`'a `"tadimlik"` eklenmesi (`uretim-basladi-olayi.tsx:33`) — ölçüm sessizce `bilinmiyor`a düşmüyor.
- Seri kırılması notunun kodun yanına yazılması (`tadimlik-satiri.tsx:100-106`). Doğru refleks.
- CTA hedefinin `/sonuc` yerine `/listem?uret=1` olması: girişten sonra kullanıcıyı başladığı yere geri atmak yerine sonuca götürüyor. Huni açısından doğru.
---
# İŞ 3 · CEO'nun reddettiği iki UX kararına görüş
**R3 (mobil yapışkan alt çubuk) — katılıyorum, hem de gerekçesinden daha güçlü bir sebeple.** CEO "95 ziyaret/hafta, ekran alanı yiyen over-engineering" diyor; ben buna şunu eklerim: bu üründe yapışkan alt çubuk **şu anda aktif olarak zararlı olurdu**, çünkü `/sonuc` zaten `sticky top-4` bir header taşıyor ve İş 1'de ölçtüğüm gibi o header 375 px'te 3 satıra çıkıp ~140 px (ekranın %21'i) yiyebiliyor; buna bir de alt çubuk eklenirse mobil okuma alanı ~%30 azalır, üstelik sanal klavye açıldığında `position: fixed` alt çubukların iOS Safari'de içeriğin üstüne binmesi klasik bir tuzaktır. Çözülmesi gereken şey CTA'nın görünürlüğü değil, header'ın şişkinliği. **R4 (`/paket` girişsiz birincil CTA'sının fiyata çevrilmesi) — karara katılıyorum, gerekçesine kısmen.** "Veri yok, T4'e bağlandı" doğru bir disiplin ve fiyatı erken göstermenin dönüşümü düşürebileceği de doğru. Ama şunu kayda geçiriyorum: bu bir A/B sorusu değil, bir **dürüstlük** sorusu — kullanıcı ödeme fiiline kaç adım kala fiyatı öğrendiğini bilmiyorsa, öğrendiği anda geri dönüyor ve bunu "fiyat yüksek" diye değil "kandırıldım" diye yapıyor. T4 eşiği (`/odeme`'yi 30 kişi görsün) bir payda üretir ama **o paydanın kendisi fiyatın geç gösterilmesinden etkileniyor** — yani ölçüm, ölçmek istediği şeyin içinden geçiyor. Kararı değiştirmiyorum; T4 açıldığında bakılacak metriğin "`/paket` → `/odeme` geçişi" değil "**`/odeme`'yi gördükten sonra terk oranı**" olmasını öneriyorum, çünkü fiyat şokunu yalnızca o gösterir.
---
## Bilal'in gözle kontrol etmesi gereken ekranlar
Görsel doğrulama bende yapılamadı (araç setinde tarayıcı yok + pill yalnızca girişli render ediliyor, giriş yasak). Şu beş ekran:
1. **Navbar, kendi girişli oturununda, 1280 px ve üstü** — "Yapay Zeka Listem" pill'inin sol ucunun ortadaki koyu "Ara" butonunun altında kalıp kalmadığı. (Bulgumun ana kanıtı bu.)
2. **Navbar, 768 px** (tablet / tarayıcıyı yarım ekran) girişli + manuel listede en az 1 program — header'ın **3 satıra** çıkıp çıkmadığı.
3. **Navbar, 375 px** girişli + liste dolu + 3 haneli kredi bakiyesi — aynı 3 satır kontrolü (sınırda, 5 px).
4. **`/sonuc`, merge sonrası, kayıtlı manuel listesi olan bir oturumda** — sayfa açıldıktan ~1 sn sonra haritanın gelip tadımlığı aşağı itip itmediği (B1). *Bunu merge öncesi göremeyiz; G1 canlıda yok.*
5. **`/sonuc`, girişsiz, 375 px** — tadımlık kartının CTA'sına ulaşmak için kaç ekran kaydırmak gerektiği (Ö1 kararı buna bağlı).
## Bilal'den istenen (3 madde)
1. **Navbar düzeltmesi için onay:** Alternatif 1'i (iki etiket span'i her genişlikte gizli) yazılımcıya verelim mi, yoksa Alternatif 2'yi de (`Nasıl çalışır?` yalnız ≥1280) ekleyip 1024–1151 bandını da kapatalım mı? **~3 dk.**
2. **G1'in B1 düzeltmesi:** `<ManuelHarita />`'yı tablonun altına almak — dalın 7. commit'i olarak yazılsın mı, yoksa merge edilip ayrı mı gitsin? **~2 dk.**
3. **B2 metni `[BİLAL]`:** `tadimlik-satiri.tsx:135`'teki "24 tercihlik listenin her satırı bu formatta kurulur" cümlesi ne olsun — sayısız mı ("listendeki satırlar bu formatta kurulur"), yoksa açıkça "ilk üçü hemen açılır" mı? **~3 dk.**