All checks were successful
Deploy / deploy (push) Successful in 17s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
167 lines
20 KiB
Markdown
167 lines
20 KiB
Markdown
# 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.**
|