Files
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

167 lines
20 KiB
Markdown
Raw Permalink 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.
# 12 — Bağımsız kod denetimi (Tur 5)
**Dal:** `gece/0922-entegrasyon` @ `9e1506d` · **Taban:** `main` @ `9bd448b` · **Denetçi:** `cto` (kodu yazmadı)
**Kapsam:** `git diff 9bd448b..HEAD` — 20 dosya, +948/−38, `data/yokatlas.db` binary dahil. Salt okuma; hiçbir dosya değiştirilmedi, commit atılmadı, `git status` entegrasyon worktree'sinde **temiz**.
---
## HÜKÜM
**İncelemeye çıkabilir.** Kritik bulgu yok; veri bütünlüğü bağımsız olarak doğrulandı ve iddia edildiği gibi çıktı. Ancak dalı Bilal'in önüne koymadan önce **iki tek-satırlık düzeltme** yapılmasını öneriyorum (Y1 ve O2 aynı dosyayı ilgilendirmiyor, ikisi birlikte ~10 dk): biri P4'ün tek çıktısını okunabilir kılıyor, diğeri yanlış bir doğrulama rakamını kayda geçiriyor. Bunlar yapılmazsa da dal çalışır ve kullanıcıya zarar vermez — yalnız 2 Kasım'daki ölçüm okuması bozuk olur.
## Özet (5 madde)
1. **Veri commit'i temiz.** `data/yokatlas.db`'nin iki sürümünü ayrı kopyalara çıkarıp 45 kolonu tek tek kıyasladım: değişen **yalnız `unitur` (100 satır) ve `il` (26 satır)**. `id` kümesi aynı, `programs_arsiv`/`netler`/`veri_meta` sıfır fark, 2021–2026 puan/sıra/kontenjan/yerleşen kolonlarında **0 satır** değişti. P2'nin iddiası birebir doğru.
2. **Paketler birleşince doğru davranıyor.** P3'ün boş durum varyantı P2'nin yeni `unitur` değerleriyle üç kurumun üçünde de doğru cümleyi veriyor — kod okumasıyla değil, **dalın kendi ürettiği statik HTML'den** doğrulandı (Kıbrıs Amerikan, Balkan, Saraybosna → "URAP yalnız Türkiye'deki üniversiteleri sıralıyor"). Hub'da üçü de "KKTC ve Yurt Dışı" bölümüne geçmiş.
3. **P4'ün tek çıktısı ölçüm olarak kullanılamaz durumda.** `sihirbaz_adim{1}` oturum başına tekil (`olayBirKez`), `{2}`/`{3}` ise geçiş başına atılıyor. Paydayla pay farklı birimde olduğu için huni oranı %100'ü aşabilir. Kodun kendi yazılı kuralı (`analitik.ts:23`) bu tercihe karşı. Tek kelimelik düzeltme.
4. **P2'nin rapor/commit rakamlarından biri yanlış:** "`/universiteler` hub'ında Devlet listesi 170 → 166". Gerçek sayı üretilmiş HTML'de **129** (öncesi 132). Kriterin kendisi karşılanıyor, yalnız kanıt rakamı ham DB adlarını sayıyor ve yanındaki "iki yazım iki ayrı slug" gerekçesi de yanlış.
5. **P1'in mobil iddiası doğru, P3'ün atıf şartı sağlam.** `TableCell`/`TableHead` varsayılanı `whitespace-nowrap` + kap `overflow-x-auto` + program hücresi `truncate` → etiket kesilmez, satır taşmaz. URAP sayısı 198 sayfada, hepsinde aynı ekranda `rel="noopener"` link, `nofollow` yok; sayı derin sayfalarda hiç çizilmiyor, dolayısıyla "linksiz sayı" hiçbir yerde oluşmuyor.
---
## Bulgular (şiddet sırasına göre)
### KRİTİK — yok
### YÜKSEK
#### Y1 · Huninin paydası ile payı farklı birimde; oran %100'ü aşabilir
**Dosya:** `src/features/sihirbaz/components/sihirbaz-adimlar.tsx:154-156` (yeni) ile `:220` (mevcut)
```ts
// :154-156 — oturum başına EN FAZLA BİR KEZ
useEffect(() => { olayBirKez("sihirbaz_adim", { adim: 1 }, "adim1"); }, []);
// :220 — her ileri geçişte, sınırsız
if (yeniAdim > adim) olay("sihirbaz_adim", { adim: yeniAdim + 1 });
```
`olayBirKez` `sessionStorage` anahtarıyla tekilleştiriyor (`src/lib/analitik.ts:169-184`), `olay` tekilleştirmiyor.
**Somut senaryo (tek sekme, tek oturum):** Öğrenci ana sayfadaki hero formundan sıralamasını girer, sihirbazı 1→2→3 tamamlar → `adim:1` ×1, `adim:2` ×1, `adim:3` ×1. `/sonuc`'a düşer, "Tercihlerini güncelle" ile tercih kapısını açar → `SihirbazAdimlar` yeniden mount olur ama `sessionStorage`'da `kolaytercih.olay.sihirbaz_adim.adim1` zaten yazılı, **`adim:1` atılmaz**; öğrenci yine 1→2→3 gider → `adim:2` ×2, `adim:3` ×2. Panelde adım 1→2 geçiş oranı **%200** görünür. Aynı şey `/bolum` ve `/universite` sayfalarında iki ayrı `CtaSiraForm` (üst ve alt) bulunduğu için tek sayfada da olur.
**Neden bu bir tasarım tercihi değil:** `src/lib/analitik.ts:22-24` aynı sorunu daha önce yaşayıp yazıya dökmüş:
> `liste_uretim_basladi` … *Bilerek `olayBirKez` KULLANILMAZ: aynı oturumdaki ikinci deneme de sayılmalı, yoksa payda başarıdan (liste_olusturuldu) küçük kalır.*
P4 tam tersini yapmış ve bunu raporunda tartışmamış (`08-p4-olcum.md`, kabul kriteri 1 yalnız "iki kez düşmesin"e bakıyor — kriter karşılanıyor, ölçüm bozuluyor).
**Önerim (tek kelime, mevcut serileri bozmaz):** `olayBirKez` → `olay`. Mount zaten "sihirbaz bir kez açıldı"ya eşit; `1→2→1→2` gezinmesi unmount etmediği için CEO'nun "tekrar düşmesin" kriteri korunur, ikinci **açılış** ise `adim:2`/`{3}` ile aynı mantıkla yeniden sayılır. Alternatif (2 ve 3'ü de oturum-tekil yapmak) doğru ama `sihirbaz_adim{2,3}` serisinde **ikinci** bir kırılma yaratır — o yüzden önermiyorum.
### ORTA
#### O1 · P2'nin hub rakamı yanlış; yanındaki gerekçe de yanlış
**Dosya:** `1df86cf` commit gövdesi ("`/universiteler` hub'ında Devlet listesi 170 → 166 kurum") ve `docs/gece-vardiyasi/2026-09-22/09-p2-unitur.md:107,110`
Dalın kendi build'inin ürettiği HTML (`.next/server/app/universiteler.html`):
```
Devlet Üniversiteleri …>129 Vakıf Üniversiteleri …>78 (üçüncü bölüm: "KKTC ve Yurt Dışı")
```
Düzeltme öncesi DB üzerinde `getAllUniversiteler`in algoritmasını birebir koşturduğumda **132** çıkıyor. Yani gerçek değişim **132 → 129 (3 kurum)**; raporun yazdığı 170 → 166 ham `programs.universite` ad sayısıdır (eski DB'de `DEVLET` etiketli 170 farklı ad, yenide 166), hub satırı değil.
Rapordaki gerekçe de yanlış: *"Kıbrıs Amerikan'ın iki yazımı bugün iki ayrı slug"*. `uniAdiNormalize` (`src/lib/harita.ts:32-34`) sondaki parantezli eki atıyor, `uniSayfaSlug` (`src/lib/slug.ts:41-43`) da aynı kuralı uyguluyor → iki yazım **tek slug** (`kibris-amerikan-universitesi`, 42 program, tek sayfa). Buna bağlanan BACKLOG #10 atfı da bu satır için geçersiz.
**Etkisi:** Davranış doğru — üç kurumun üçü de "Devlet" listesinden çıkmış, "KKTC ve Yurt Dışı" bölümüne geçmiş (HTML'de konumları doğrulandı). Yalnız **kanıt rakamı** yanlış. Bu commit `[BİLAL]` onayına gidiyor ve onay mesajdaki fark raporuna dayanıyor; rakam düzeltilmeden gitmemeli.
#### O2 · P4 ikinci bir seri kırılması yaratıyor, commit'te yazmıyor
**Dosya:** `src/features/odeme/components/paket-gorunum-olayi.tsx:16-38` (allowlist 3 → 13) ile `:45-47`
```ts
const kaynak = KAYNAKLAR.find((k) => k === ham) ?? "diger";
olayBirKez("paket_goruntulendi", { kaynak }, kaynak); // tekilleştirme anahtarı = kaynak
```
Tekilleştirme anahtarı `kaynak` olduğu için allowlist genişleyince olayın **oturum başına atılabilme sayısı 4'ten 14'e** çıkıyor.
**Somut senaryo:** Bir oturumda kullanıcı ana sayfanın fiyat bölümünden `/paket`'e gidiyor, geri dönüyor, sonra danışman ekranındaki kredi rozetinden tekrar gidiyor. **Önce:** iki gidişte de `kaynak="diger"` → tek `paket_goruntulendi`. **Sonra:** `fiyat_paket` ve `danisman_rozet` → iki ayrı olay. Yani `paket_goruntulendi` toplamı trafikten bağımsız olarak yükselecek ve `diger` kovasının anlamı tamamen değişecek (eskiden "10 bilinen yüzey + gerçekten bilinmeyen", şimdi yalnız "gerçekten bilinmeyen"). Deploy tarihinden önceki/sonraki `paket_goruntulendi` karşılaştırılamaz.
Commit gövdesi (`26893ce`) seri kırılması notunu yalnız `sihirbaz_adim` için yazıyor. `program_eklendi` için 21 Eylül'de konan kuralın gereği: bu da yazılmalı.
#### O3 · P2 + P3 birleşince üç üniversite sayfasında bozuk Türkçe etiket
**Dosya:** `src/features/katalog/components/universite-icerik.tsx:381-385` → `trBaslikDuzeni` (`src/lib/slug.ts:56-62`)
`trBaslikDuzeni` `toLocaleLowerCase("tr-TR")` kullanıyor; tr-TR'de `I` → `ı`, dolayısıyla `"YURTDISI KAMU"` → **`"Yurtdısı Kamu"`**. (Orkestratör günlüğü bunu "Yurtdisi Kamu" diye kaydetmiş; üretilen HTML'deki gerçek çıktı "Yurtdısı Kamu" — Türkçede var olmayan bir kelime.)
**Hangi paket yaptı:** ikisi birden. P2 `unitur`'ü `DEVLET` → `YURTDISI KAMU`/`KKTC` yaptı; P3 "Tür" kartını **yalnız** URAP dışındaki 31 kurumda bıraktığı için bu değerler o sayfaların tek metrik kartı hâline geldi. Ayrı ayrı iki dal da sorunsuz görünüyordu.
**Kanıt (dalın ürettiği HTML):**
```
uluslararasi-balkan-universitesi.html : <dd …>Yurtdısı Kamu</dd> (dün: "Devlet")
uluslararasi-saraybosna-universitesi.html : <dd …>Yurtdısı Kamu</dd> (dün: "Devlet")
kibris-amerikan-universitesi.html : <dd …>Kktc</dd> (dün: "Devlet")
```
"Yurtdısı" içeren sayfa: 6 · ">Kktc<" içeren sayfa: 16 · "Tür" kartı olan toplam sayfa: 31.
**Not:** doğruluk arttı (KKTC kurumuna "Devlet" demekten iyidir), görünürlük kalitesi düştü. Düzeltme `unitur` → görünen etiket için 5 satırlık bir harita; `trBaslikDuzeni`'ye dokunmaya gerek yok. Bilerek yapılmadığı günlükte yazılı, itiraz etmiyorum — ama sabah incelemesinde gözle görülecek ilk şey bu.
#### O4 · 198 üniversite sayfasında "devlet mi, vakıf mı" bilgisi tamamen kayboldu
**Dosya:** `src/features/katalog/components/universite-icerik.tsx:363-397` (kart takası)
CEO kararı bunu açıkça "takas" diye tanımlamış (§3/P3), yani **şartname ihlali değil**. Ama karar kaydında "bilgi yerine başka bir yerde kalıyor" demiyor; kalmıyor:
```
.next/server/app/universite/bogazici-universitesi.html → "Devlet" kelimesi 0 kez
.next/server/app/universite/koc-universitesi.html → "Vakıf" kelimesi 0 kez
```
H1'de yok, giriş paragrafında yok (`:310-330`), `uniSayfaMetadata` açıklamasında yok (`:180-183`), breadcrumb'da yok, program tablosunda yok (`UniDetay.stats.devletMi` üretiliyor ama `katalog.ts:409`'dan sonra hiç okunmuyor). Sitenin en kalabalık yüzeyinde (`/universite/*`) bir öğrencinin ilk sorduğu ikili bilgi ekrandan çıktı.
**Ucuz telafi (ızgaraya dokunmadan):** giriş paragrafındaki cümleye tek sıfat — "… bir **devlet üniversitesi** olarak 2026 YKS yerleştirme sonuçlarına göre N programda öğrenci aldı." Kart sayısı 4'te kalır, yeni kutu açılmaz. Bu bir `[BİLAL]` kararı; ben yalnız kaybın gerçek olduğunu belgeliyorum.
### DÜŞÜK
- **D1 · `/listem` risk sütunu artık kendi içinde tutarsız.** Kilitli satır `rapor-listesi.tsx:259` hâlâ `sr-only sm:not-sr-only` "Pakette", kilitsiz satır `:267` görünür etiket. Paketsiz kullanıcıda 24 satırın 21'i kilitli, yani P1'in mobil kazancı o kullanıcı için 3 satır. Sütun genişliğini zaten "Az riskli" belirlediği için "Pakette"yi görünür yapmanın **ek genişlik maliyeti yok**. (P1 raporu ve orkestratör günlüğü bunu zaten not etmiş.)
- **D2 · AGENTS.md renk kuralının açık kaldığı üçüncü yüzey.** `src/features/liste/components/liste-cekmecesi.tsx:424-428` — risk yalnız renkli nokta + `aria-label`; görünür metin yok. Kapsam dışı bırakılması bilinçliydi; kural hâlâ ihlal.
- **D3 · URAP sabitinde denetimsiz tek alan: `URAP_KAYNAK_URL`.** `URAP_DONEM`/`URAP_TOPLAM`/`URAP_SIRA` birbirine `veri-kalite` kontrolleriyle bağlı (`scripts/veri-kalite.ts:191-266`), URL hiçbirine bağlı değil. Gelecek Ekim'de dönem `2026-2027` olup URL unutulursa sayfa "URAP Türkiye Sıralaması **2026-2027** … Kaynak: urapcenter.org" der ve **2025-2026 sayfasına** link verir — izin şartı biçimsel olarak ihlal edilir, `pnpm veri-kalite` sessiz kalır. Tek satır kapatır: `zorunlu("URAP: kaynak URL dönemi tutuyor", URAP_KAYNAK_URL.includes(URAP_DONEM), URAP_KAYNAK_URL)`. *(URL'nin kendisi doğru: URAP'ın izin e-postasındaki adres — `00-brief.md:8`; veri mühendisi 22 Eyl'de tarayıcı paneliyle okumuş — `05-urap.md:17`. Bu oturumda tarayıcı açmadım.)*
- **D4 · Yeni `veri-kalite` kontrolünün bilgi kolu hiçbir zaman uyarı üretmiyor.** `scripts/veri-kalite.ts:318` `bilgi(..., false, ...)` — sabit `false`. Bugün iki kurum bu kolda: Kırgızistan-Türkiye Manas ve Hoca Ahmet Yesevi, iki yazımı `YURTDISI KAMU` + `YURTDISI VAKIF`. Kullanıcıya yansımıyor (devlet/vakıf ayrımını bölmüyor, sayfa tek slug'da birleşiyor), ama P2'nin kapattığı hata sınıfı iki kurumda hâlâ açık ve sayaca girmiyor.
- **D5 · URAP dışı 9 Türkiye kurumunda gerekçesiz olumsuz cümle.** "Bu üniversite URAP Türkiye Sıralaması 2025-2026 listesinde yer almıyor." — dördü MYO, üçü yeni devlet üniversitesi (Sivas Bilim ve Teknoloji, Türk-Japon, Ankara Müzik ve Güzel Sanatlar), biri de üniversite bile değil (`icisleri-bakanligi-ve-milli-savunma-bakanligi-adina-…`). Sabitin kendi yorumu ("kötü demek değildir; MYO'lar ve yeni üniversiteler listeye girmiyor" — `src/lib/urap-siralama.ts:13-16`) kullanıcıya ulaşmıyor. CEO'nun yazdığı kanonik cümle birebir uygulandığı için **şartname ihlali değil**.
- **D6 · `data/yokatlas.db-shm` / `-wal` git'te izleniyor.** Veri commit'i ana dosyayı değiştirdi, yan dosyalar commit'e girmedi. Bugün zararsız (`-wal` 0 bayt) ama repoda tutulmaları ileride tutarsız çift üretebilir. P2 raporu da not etmiş; backlog.
- **D7 · Tür rozeti hâlâ ikili.** `program-tablosu.tsx:311` ve `rapor-listesi.tsx:225-233`: `unitur === "DEVLET" ? "Devlet" : "Vakıf"`. P2'den sonra düzeltilen 27 program artık **"Vakıf"** rozetiyle görünüyor. "Devlet"ten doğru, gerçekten doğru değil; aynı durumda ~1.350 KKTC/yurt dışı satırı zaten vardı. Backlog.
---
## Temiz çıkanlar (denetlendi, bulgu yok)
**Veri (P2) — bağımsız SQL doğrulaması.** `git show` ile iki sürüm ayrı kopyalara çıkarıldı, `sqlite3 "file:…?immutable=1"` ile ATTACH edilip 45 kolon tek tek kıyaslandı:
- `programs`: 21.493 → 21.493, `id` kümesi farkı 0/0. Değişen kolon **yalnız `unitur` (100) ve `il` (26)**; diğer 43 kolonda değişen satır 0.
- `programs_arsiv` 3.735 → 3.735 (unitur/il/universite farkı 0) · `netler` 62.975 → 62.975 (fark 0) · `veri_meta` 37 → 37 (fark 0).
- Değişimler: Kıbrıs Amerikan (iki yazım, 36+6) `DEVLET`→`KKTC`; Balkan (34) ve Saraybosna (24) `DEVLET`→`YURTDISI KAMU`; Balkan'ın 26 satırında il `SARAYBOSNA - BOSNA - HERSEK`→`ÜSKÜP-MAKEDONYA`. Başka kuruma dokunulmamış.
- Havuz etkisi bağımsız sayıldı: `unitur='DEVLET'` + efektif sırası dolu bu dört adda **27 → 0**.
- Düzeltme sonrası `programs`'ta `unitur IS NULL` satır yok ve aynı ham adın iki farklı `unitur`'ü yok.
**P2 + P3 birleşik davranışı (denetim sorusu #1).** `UrapKaynakSatiri` (`universite-icerik.tsx:129-133`) `unitur === "KKTC" || unitur?.startsWith("YURTDISI")` bakıyor. DB'deki 229 slug'ın tamamını `uniSayfaSlug` ile üretip URAP sabitiyle kesiştirdim: URAP dışı 31 slug'ın 22'si `KKTC`/`YURTDISI *` → yurt dışı cümlesi, 9'u Türkiye → liste cümlesi. Üç düzeltilen kurumun üçü de yurt dışı kolunda. Dalın ürettiği HTML de aynı sonucu veriyor. **Ek kod gerekmemiş, iddia doğru.**
**`olayBirKez` dayanıklılığı (denetim sorusu #3).** `src/lib/analitik.ts:169-184`: SSR'da `typeof window === "undefined"` ile çıkıyor; `window.sessionStorage`'a **erişimin kendisi** `try` bloğunun içinde, dolayısıyla storage kapalı/engelli ortamda `SecurityError` yutuluyor ve olay tekilleştirmesiz yine atılıyor — patlamıyor, sessizce düşmüyor. Gizli sekmede `sessionStorage` normal çalışır. Dev StrictMode'un çift effect'i ilk koşuda yazılan anahtarla yutulur (ve Rybbit script'i zaten yalnız prod build'de yükleniyor). Sihirbaz `dynamic(..., { ssr: false })` ile yükleniyor (`sihirbaz-adimlar-lazy.tsx:46-53`), sunucuda hiç koşmuyor.
**"Mount = 1. adım görüldü" varsayımı.** `SihirbazAdimlar`'ın beş mount noktasının beşi de koşullu: `sihirbaz-modal.tsx:47` (Radix `Dialog`, kapalıyken unmount), `hero-form.tsx:216` (`facetler && sira`), `cta-sira-form.tsx:328` (`facetler && sira != null`, form dalıyla ayrık ternary), `tercih-profili-kapisi.tsx:450` (`facetler` yalnız `facetYukle` sonrası doluyor). Sayfa yüklenirken kendiliğinden mount olan bir yüzey yok. Varsayım tutuyor; sorun yalnızca Y1'deki birim uyuşmazlığı.
**P1'in mobil taşma iddiası (denetim sorusu #2).** `src/components/ui/table.tsx:86` `TableCell` varsayılanı `whitespace-nowrap`, `:73` `TableHead` aynı, `:11` tablo kabı `overflow-x-auto`; program hücresi `program-tablosu.tsx:324` `max-w-0 w-full` + içeride `truncate`. Yani etiket sarmalanamaz/kesilemez, artan genişliği program adı sütunu yutar, en kötü durumda tablo yatay kayar — sayfa taşmaz. **İddia doğru.** "Az riskli" en uzun etiket (`src/lib/risk.ts:8-12`); kalan genişlik Bilal'in gözle bakacağı bir tasarım kararı, hata değil.
**P4 link envanteri.** `grep -rn '"/paket' src/` → gezinme amaçlı 14 `<Link>`'in 14'ünde `?kaynak=` var, 13 tekil değerin **13'ü de** `KAYNAKLAR` allowlist'inde (fazlası/eksiği yok). Kalan `/paket` geçişleri `redirect()` ve giriş `callback`'leri — kullanıcı tıklaması değil, CEO'nun listesinde de yoklar.
**P3 sızıntı denetimi.** `src/lib/urap-siralama.ts`'i içe aktaran yalnız `src/lib/katalog.ts:13`, `universite-icerik.tsx:33-37` ve `scripts/veri-kalite.ts:129`. LLM prompt'una (`src/lib/ai/rapor.ts`), `/sonuc` tablosuna, OG görsellerine, hub'a girmiyor. `universite-icerik.tsx` sunucu bileşeni (`"use client"` yok) → 14 KB'lık sabit tarayıcıya inmiyor, standalone/bellek etkisi yok.
**Atıf şartı.** Metrik ızgarası `ilkSayfa` koşulunun içinde (`:308` açılıyor, `:400` kapanıyor), kaynak satırı da `:441`'de aynı koşulla. Yani URAP sayısının göründüğü tek yüzeyde link her zaman aynı ekranda. Üretilen HTML: 198 sayfada `URAP Türkiye</dt>`, 31 sayfada `Tür</dt>`, toplam 229 — delik yok, "—" yok.
**`veri-kalite` #14'ün sezgisi veriyle tutuyor.** Türkiye ili sezgisi "tire yok + `KKTC_ILLERI`'nde değil". DB'deki tireli il değerleri yalnız 5 yurt dışı değer (`BAKÜ-AZERBAYCAN`, `BİŞKEK-KIRGIZİSTAN`, `SARAYBOSNA - BOSNA - HERSEK`, `TÜRKİSTAN-KAZAKİSTAN`, `ÜSKÜP-MAKEDONYA`); KKTC il değerlerinin **hepsi** sabitte (GİRNE, LEFKOŞA, GAZİMAĞUSA, LEFKE, GÜZELYURT, KIBRIS); ili NULL olan kurumlar `HAVING SUM(il IS NOT NULL) > 0` ile eleniyor. Yanlış pozitif/negatif üretecek bir boşluk bulamadım.
**AGENTS.md (denetim sorusu #6).** Yeni badge/eyebrow yok (`SectionEyebrow` dışı pill eklenmemiş), yeni modal/kapatma çarpısı yok, yeni CTA butonu yok — dokunulan CTA'ların `ArrowRight` deseni korunmuş. `/meraklisina` şeması **doğru olarak güncellenmedi**: sihirbaz adımlarının sayısı-sırası-içeriği, aday havuzu kuralları, 24'lük iskelet, gevşetme sırası ve havuz-dışı kuralı değişmedi; P2 havuzun *içeriğini* düzeltti, *mimarisini* değil. Risk renk dili P1 ile **güçlendi** (tek kalan ihlal D2).
---
## Backlog önerileri (kapsam dışı, kayda değer)
1. `unitur` → görünen etiket haritası (`Devlet / Vakıf / KKTC / Yurt dışı — kamu / Yurt dışı — vakıf`), tek kaynak; `trBaslikDuzeni` ham DB değerlerine uygulanmasın (O3, D7 aynı kökten).
2. `/sonuc` ve `/listem` satır rozetinde üçüncü değer (KKTC/yurt dışı) — bugün ~1.350 satır "Vakıf" diye etiketleniyor.
3. `veri-kalite`'ye `URAP_KAYNAK_URL ⊃ URAP_DONEM` kontrolü (D3) ve #13'ün bilgi kolunun gerçekten uyarı sayması (D4).
4. `data/yokatlas.db-shm` / `-wal` git izlemesinden çıksın (D6).
5. `listem-govde.tsx:288` ve `:369` iki ayrı kilit yüzeyi, ikisi de `kaynak=kilit` — P4'ün kendi raporunda not edilmiş, ayrılmalı.
---
## Bilal'den istenen (3 madde)
1. **Y1'i merge öncesi düzelttir** — `sihirbaz-adimlar.tsx:155`'te `olayBirKez` → `olay`; yoksa 2 Kasım'daki huni okuması payda/pay uyuşmazlığı yüzünden şişik çıkar. **~5 dk.**
2. **O1'i kayda geçir** — veri commit'inin gövdesindeki "170 → 166" gerçek hub sayısı değil; doğrusu **132 → 129**, düzeltme mesajı onayla birlikte girsin. **~3 dk.**
3. **O4'e karar ver** — üniversite sayfalarında "devlet mi vakıf mı" bilgisi tamamen kayboldu; giriş cümlesine tek sıfat ekleyelim mi, yoksa takas bu hâliyle mi kalsın? **~2 dk.**