# 37 — Yazılımcı: navbar taşması + G1 harita/metin düzeltmesi Tarih: 22 Eylül 2026 · Rol: `yazilimci` · Şartname: `36-tasarimci-g1-ve-navbar.md` İşaret: **[D]** koşarak doğruladım · **[Ç]** koddan çıkarım --- ## Özet (5 madde) 1. **İki dal, sırayla, ayrı ayrı commit'lendi.** `duzeltme/navbar-tasmasi` (1 commit, `main`'den) ve `funnel/sonuc-ilk-ekran` (mevcut dala 2 commit eklendi, geçmiş yeniden yazılmadı). Push/merge yok, `main`'e commit yok. 2. **Navbar:** tasarımcının Alternatif 1'i uygulandı — iki etiket span'inden hem `xl` hem `sm` görünürlük sınıfları kaldırıldı. `aria-label`'ların ikisi de zaten yerindeydi, doğrulandı; erişilebilirlik değişmedi. Alternatif 2'ye (`Nasıl çalışır?`) dokunulmadı. 3. **G1 (a):** `` tablonun altına alındı (silinmedi, geri getirilmedi). Yeni sıra: **tadımlık → tablo → harita → sihirbaz → dipnot.** Sıraya bağlı stiller yeni sıraya göre denetlendi; harita ilk çocuk olmaktan çıktığı için kendi `mt-16` boşluğunu almak zorunda kaldı (bkz. §Sapmalar 1). 4. **G1 (b):** `tadimlik-satiri.tsx` paragrafına "ilk üçü hemen açılır" eklendi; ayrı `[Bilal]` commit'i, dalın tepesinde. İki `[Bilal]` commit'inin de tek tek düşürülebilir olduğu ters yama denemesiyle doğrulandı [D]. 5. **Doğrulama iki dalda da temiz:** `next typegen` ✓ · `tsc --noEmit` → **0** · `pnpm lint` → **0** [D]. `pnpm install`/`pnpm build` talimat gereği koşulmadı; tarayıcı/dev sunucusu açılmadı. **Bana ait olmayan 19 commit'lenmemiş dosyaya dokunulmadı** — hiçbiri stage'lenmedi, `git add -A`/`.` kullanılmadı, dosyalar yol vererek eklendi. Yasaklı komutların (`reset`, `checkout --`, `restore`, `clean`, `stash`) hiçbiri koşulmadı; ters yama denemeleri bile `git apply --check` ile ağaca dokunmadan yapıldı. --- # DAL 1 — `duzeltme/navbar-tasmasi` Taban: `main` `9bd448b`. **1 commit.** | SHA | Mesaj | |---|---| | `9abfdf4` | `fix(navbar): pill etiketleri her genişlikte gizli — çakışma kapanır` | **Dokunulan dosyalar (2):** `src/features/kullanici/components/user-nav.tsx` · `src/features/liste/components/listem-butonu.tsx` ## Ne değişti - `user-nav.tsx:59` → `className="hidden sm:inline lg:hidden xl:inline"` **→ `className="hidden"`** (span korundu, metin DOM'da ama `display:none`). - `listem-butonu.tsx:39` → aynı değişiklik. - Her iki yerdeki eski yorum ("lg–xl arasında metin gizli") artık yanlış olacağından yeniden yazıldı; kök neden (konteyner 1152'de kilitli, `xl` yeni yer açmıyor, sağ kümenin bütçesi ~304 px) kodun yanına not düşüldü. - **Kapsam dışı bırakılan:** `user-nav.tsx:73`'teki kredi etiketi (`hidden md:inline lg:hidden`) — şartname yalnız iki etiket span'ini sayıyor, dokunulmadı. ## Kabul kriterleri | Kriter | Durum | Nasıl doğrulandı | |---|---|---| | `grep -n "xl:inline\|sm:inline"` iki dosyada 0 sonuç | ✔ | `GREP_EXIT=1` (eşleşme yok) [D] | | `aria-label` her iki dosyada var | ✔ | `user-nav.tsx:52` `aria-label="Yapay Zeka Listem"` · `listem-butonu.tsx:33` `aria-label={\`Kendi listem — ${liste.length}/${MANUEL_LISTE_MAX} program\`}` [D] | | Alternatif 2 uygulanmadı | ✔ | `katalog-arama.tsx` dalın diff'inde yok [D] | | Tasarımcının hesabı (375 → 284,5/351 · 768 → 555,8/736 · 1280+ pozitif) | ✔ [Ç] | Kod değişikliği tasarımcının hesapladığı girdiyi birebir üretiyor; piksel ölçümü onun raporundan, ben ölçmedim | > **Not — grep kriterini kirleten tuzak:** ilk yazdığım yorum gerekçeyi anlatırken `xl:inline` dizesini literal geçiriyordu ve kabul kriteri grep'i 1 sonuç dönüyordu. Yorum, anlamı koruyarak dizeyi içermeyecek biçimde yeniden yazıldı. Kriter artık gerçekten 0. ## Doğrulama çıktıları ``` $ pnpm exec next typegen Generating route types... ✓ Types generated successfully $ pnpm exec tsc --noEmit ; echo "TSC_EXIT=$?" TSC_EXIT=0 $ pnpm lint ; echo "LINT_EXIT=$?" > kolaytercih@0.1.0 lint > eslint LINT_EXIT=0 ``` --- # DAL 2 — `funnel/sonuc-ilk-ekran` Mevcut dalın tepesine (`d2e1190`) **2 commit eklendi**; geçmiş yeniden yazılmadı, hiçbir commit amend/rebase edilmedi. | # | SHA | Mesaj | Dosyalar | |---|---|---|---| | 7 | `e912665` | `fix(sonuc): harita tablonun altına alınır — hidrasyon kayması kapanır` | `sonuc/page.tsx`, `manuel-harita.tsx`, `tadimlik-satiri.tsx` | | 8 | **`e3519a5`** | **`[Bilal] content(tadimlik): paragraf maskenin gerçeğini söyler`** | `tadimlik-satiri.tsx` | **Dalın `[Bilal]` commit'leri: `d2e1190` (6.) ve `e3519a5` (8., tepe).** Dalın `main`'den toplam diff'i hâlâ aynı 6 dosya; yeni dosya eklenmedi. ## (a) `e912665` — harita tablonun altına Yeni sıra `src/app/sonuc/page.tsx` içinde: ``` 118 124 131 135 ``` Gerekçe (B1) kodun yanına yorum olarak yazıldı: sunucu snapshot'ı hep boş liste döndüğü için harita yukarıdayken kayıtlı listesi olan dönüş ziyaretçisinde hidrasyondan sonra ~368 px'lik bir blok `
`'in tepesine giriyor, impact fraction ~1. Aşağıda belirince yalnızca sihirbaz + dipnot iteliyor. ### Sıraya bağlı stiller — tek tek denetlendi | Eleman | Kural | Yeni sırada durum | |---|---|---| | `tadimlik-satiri.tsx:127` `
` | `first:mt-0` | ✔ **Sağlamlaştı.** Harita artık üstünde olmadığı için bu `
` `
`'in ilk DOM çocuğu; kural her durumda eşleşiyor, eskiden "harita null'sa" koşuluna bağlıydı. Yorum yeni gerçeğe göre güncellendi. | | `program-tablosu.tsx:175` `
` | sabit üst boşluk | ✔ Değişmedi; tadımlık render edilmediğinde (girişli kullanıcı) ilk çocuk olup `mt-16` alıyor — G1 öncesindeki davranışın aynısı, bu commit'in getirdiği bir değişiklik değil. | | `sihirbaz-cagri-karti.tsx:321` `
` | sabit üst boşluk | ✔ Değişmedi. | | `manuel-harita.tsx:74` kök `
` | **boşluğu yoktu** | ⚠ **Düzeltildi** — bkz. Sapmalar 1. | ## (b) `e3519a5` — `[Bilal]` metin artığı `tadimlik-satiri.tsx:135` civarı: > Sıralamana uygun bir programın gerekçesi, yerleşme riski ve taban trendi — 24 tercihlik listenin her satırı bu formatta kurulur**, ilk üçü hemen açılır.** - Sayı yazıldı, bulanıklaştırılmadı (Bilal'in seçtiği yön). - Garanti/vaat dili yok; cümle bir şey **eklemiyor**, var olan iddiayı **sınırlıyor**. - `3` elle yazıldı: `ACIK_SATIR` `src/lib/rapor-maske.ts:12`'de ve o dosya `server-only`; `tadimlik-satiri.tsx` ise `"use client"` — sabit import edilemiyor. **Tek kaynak bağı kodun yanına yorum olarak iliştirildi**: `ACIK_SATIR` değişirse bu cümle aynı commit'te değişmeli. [D — `rapor-maske.ts:12` okundu, değer 3] ### `[Bilal]` commit'lerinin tek tek düşürülebilirliği — doğrulandı [D] Dizilim `… 2373a9a → d2e1190 [Bilal] → e912665 → e3519a5 [Bilal]` olduğu için `d2e1190` tepede değil; düşürme yolu `git revert` (yıkıcı komut yasağına da uygun olan tek yol). Ters yamanın temiz uyguladığı, **çalışma ağacına dokunmadan** sınandı: ``` $ git show d2e1190 | git apply --check --reverse - → EVET (temiz ters yama) $ git show e3519a5 | git apply --check --reverse - → EVET (temiz ters yama) ``` Hunk'lar birbirinden uzak ve kesişmiyor: `d2e1190` → satır 188 ve 202 (CTA metni), `e3519a5` → satır 133-142 (paragraf). Aralarındaki `e912665` ise 123-127 (yorum) bölgesine dokunuyor. **Ana commit'ler `[Bilal]` commit'leri olmadan derlenir mi?** - `e912665` için **[D]**: `tsc` ve `lint` tam olarak bu commit'in ağacı üzerinde koşuldu (commit'ten hemen önce), ikisi de 0. - `d2e1190` düşürülürse: o commit yalnızca iki metin dizesini değiştiriyor (`Giriş yap ve listeni oluştur` → `Kendi listemi oluştur` ve alt satıra bir cümle), hiçbir tanımlayıcıya dokunmuyor — geri alınması derlemeyi kıramaz **[Ç]**. ## Doğrulama çıktıları (dal 2, tepe commit'in ağacında) ``` $ pnpm exec next typegen Generating route types... ✓ Types generated successfully $ pnpm exec tsc --noEmit ; echo "TSC_EXIT=$?" TSC_EXIT=0 $ pnpm lint ; echo "LINT_EXIT=$?" > kolaytercih@0.1.0 lint > eslint LINT_EXIT=0 ``` `/meraklisina` şeması el değmedi [D]: ``` $ git diff --name-only 9bd448b..HEAD | grep -E "huni-semasi|meraklisina|analitik.ts|rapor-maske|credits.ts" (boş) ``` --- ## Şartnameden sapmalar (2) 1. **`manuel-harita.tsx`'in kök `
`'ine `mt-16` eklendi** — şartname yalnız `page.tsx`'te yer değişimi istiyordu. Gerekçe: haritanın kök öğesinin üst boşluğu yoktu, çünkü `
`'in ilk çocuğuyken boşluğu `main`'in `py-12`'sinden alıyordu. Tablonun altına taşınınca tabloya yapışık kalacaktı; sayfadaki diğer bölümlerin hepsi `mt-16` kullanıyor (tablo `
`'ı, sihirbaz kartları, tadımlık). Bu bir ritim düzeltmesi, davranış değişikliği değil. Dosya zaten G1'in sahiplik kümesinde. **Gözle kontrol edilmeli** (aşağı, Bilal'den istenen 1). 2. **İki commit'te yorum güncellemeleri** — `tadimlik-satiri.tsx:123`'teki `first:mt-0` yorumu haritanın üstte olduğunu varsayıyordu, `page.tsx`'teki hiyerarşi yorumu da eski sırayı anlatıyordu. İkisi de yeni sıraya göre yeniden yazıldı; kod değil belge düzeltmesi, ama diff'e giriyor. ## Kapsam dışı bırakılanlar (bilerek) - **B3** (Suspense fallback `max-w-6xl` ↔ içerik `max-w-4xl`, 256 px genişlik farkı) — `sonuc/page.tsx:47`. Bu işin parçası değil, dokunulmadı. Aynı dosyada duruyor; A3 (`/sonuc` `

`) dalıyla birlikte gitmesi ucuz olur. - **B4** ("Giriş sonrası liste hemen üretilir" kredisiz kullanıcıda tutmuyor) — `tadimlik-satiri.tsx:188-189`, yani `d2e1190`'ın kendi hunk'ı. Dokunmadım; düzeltilecekse o `[Bilal]` commit'iyle birlikte ele alınmalı. - Navbar'daki küçük bulgular (kredi link'inin erişilebilir adının salt "12" olması, <640 px'te 36 px dokunma hedefi) — şartname bunları istemedi. - Alternatif 2 (`Nasıl çalışır?` gizleme) — Bilal A'yı seçti. ## Merge sonrası doğrulanması gerekenler 1. **`pnpm build` iki dalda da alınmadı** (disk talimatı). Push edilecek commit'in **kendisi** üzerinde alınmalı — çalışma ağacı kirli olduğu için buradaki bir build zaten yanıltıcı olurdu (AGENTS.md "Push öncesi build zorunlu"). 2. **Navbar, girişli oturumda 375 / 768 / 1280 px** — header tek satıra indi mi, pill'ler ikon+rozet hâliyle tanınabiliyor mu. Tasarımcının hesabı bunu söylüyor ama ölçüm hesapla yapıldı, gözle değil. 3. **Ekran okuyucuyla iki pill** — etiket artık yalnız `aria-label`'dan geliyor; VoiceOver/NVDA'da "Yapay Zeka Listem, bağlantı" ve "Kendi listem — 3/24 program, düğme" duyuluyor mu. 4. **`/sonuc`, kayıtlı manuel listesi olan oturumda** — harita hidrasyonda tablonun altında belirip **üstündeki hiçbir şeyi itmiyor** mu (B1'in asıl testi), ve tabloyla arasındaki `mt-16` boşluğu doğru duruyor mu. 5. **Analitik serisi** — `tadimlik_goruntulendi` için 32 numaralı raporun uyarısı geçerliliğini koruyor; tadımlık hâlâ ilk ekranda, bu commit'ler paydayı değiştirmedi. `guvenlik-uyum` denetimi **gerekmiyor**: iki dalda da para, giriş kimlik doğrulaması ya da kişisel veri akışına dokunulmadı — değişenler yerleşim sırası, iki CSS sınıfı ve bir cümle. ## Bilal'den istenen (3 madde) 1. **`manuel-harita.tsx`'e eklediğim `mt-16`'yı gözle onayla** — harita artık tablonun hemen altında, aradaki boşluk diğer bölümlerle aynı ritimde mi, yoksa fazla/az mı? **~2 dk.** 2. **`e3519a5` (`[Bilal] content(tadimlik): paragraf maskenin gerçeğini söyler`) onayı** — "…24 tercihlik listenin her satırı bu formatta kurulur, **ilk üçü hemen açılır**." senin dilin mi? Hayırsa `git revert e3519a5`; altındaki hiçbir şey etkilenmez (ters yama temiz doğrulandı). **~2 dk.** 3. **Navbar'da kalan 1024–1151 px bandı** — Alternatif 1 bu dar bantta profilsiz + liste dolu durumda −48 … −1 px açık bırakıyor (tasarımcının hesabı). Alternatif 2'yi (`Nasıl çalışır?` yalnız ≥1280 px) isteyecek misin, yoksa bu bant kabul mü? **~3 dk.**