3 kurum (Kıbrıs Amerikan, Uluslararası Balkan, Uluslararası Saraybosna)
kaynak CSV'den `unitur='DEVLET'` geliyordu. `db.ts:79-82` filtreleri
yüzünden "devlet üniversitesi istiyorum" diyen öğrencinin aday havuzuna
27 KKTC/yurt dışı programı sızıyor, "vakıf" diyende aynı 27'si eksik
kalıyordu. Kullanıcının fark edemeyeceği bir doğruluk hatasıydı.
unitur-onar.ts — Aşama D (KURUM_DUZELT):
A/B/C yalnız `unitur IS NULL` satırlara dokunuyordu; bu satırlar NULL
değil, DOLU ve YANLIŞ. D koşulsuz çalışır ve Aşama A'dan ÖNCE koşar ki
yanlış değer başka satırlara kopyalanmasın. İdempotent (2. koşu: 0/0).
Her düzeltmenin kanıtı kurumun YÖK Atlas'taki kendi parantezli ikinci
yazımı: "(ÜSKÜP-MAKEDONYA)" → YURTDISI KAMU, "(KKTC-LEFKOŞA)" → KKTC.
refresh.ts:519 `uniturSec` DB'deki değeri kopyaladığı için düzeltme
buraya yazılınca her tazelemede kalıcı olur.
veri-kalite.ts — iki yeni ZORUNLU kontrol (dosyanın sonuna):
13. "baz ad başına tek unitur" — kök neden buydu: unitur-onar.ts'in
eski çelişki koruması GROUP BY universite (TAM ad) ile çalıştığı
için aynı kurumun iki yazımı arasındaki DEVLET↔YURTDISI KAMU
çelişkisini hiç görmüyordu.
14. "DEVLET etiketi Türkiye ili ile destekli" — 13'ün kör noktası:
Kıbrıs Amerikan'ın İKİ yazımı da yanlış etiketli olduğu için
ortada çelişki yok. 13 tek başına 100 satırın yalnız 58'ini
koruyordu. Şartnamenin ötesinde, gerekçesi raporun §4'ünde.
Doğrulama: düzeltme öncesi DB'de iki kontrol de KALDI (çıkış kodu 1);
sonrasında 0 ZORUNLU kaldı, 3 uyarı (üçü de önceden vardı). Tek satır
bilerek bozulduğunda ikisi de yakaladı. tsc + eslint temiz.
Veri (126 satır) ayrı commit'te. Rapor: docs/gece-vardiyasi/2026-09-22/
09-p2-unitur.md
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
12 KiB
09 · P2 — Sihirbaz havuzundaki sessiz sızıntı kapatıldı
Dal: gece/0922-unitur-kacagi · Şartname: 06-ceo-kararlari.md §3 P2 · Teşhis: 05-urap.md §6
Commit düzeni: (1) kod + bu rapor, (2) data/yokatlas.db binary'si.
Özet (5 madde)
- Sızıntı kapandı. "Devlet üniversitesi istiyorum" diyen öğrencinin aday havuzuna giren 27 KKTC/yurt dışı programı artık devlet filtresinde 0, vakıf filtresinde 27. Ölçüldü, çıkarım değil.
- 126 satır düzeldi, tam şartnamedeki sayı: 100
unitur+ 26il. Değişen kolon yalnız bu ikisi;programstablosunun 45 kolonu tek tek karşılaştırıldı. - 2021–2026 puan/sıra/kontenjan/yerleşen kolonlarında değişen satır: 0. 34 yıl kolonu, 21.493 satır, öncesi/sonrası birebir.
programs_arsiv,netler,veri_metade dokunulmadı. - Kök neden kapandı, tekrarı denetleniyor.
unitur-onar.ts'e NULL koşulundan bağımsız Aşama D (KURUM_DUZELT) eklendi;veri-kalite.ts'e iki yeni ZORUNLU kontrol geldi. Kontroller düzeltme öncesi DB'de KALDI, sonrasında GEÇTİ verdi; ayrıca tek satır bilerek bozulduğunda ikisi de yakaladı. - Bir kapsam genişletmesi var, bilerek: şartnamedeki "baz ad başına tek
unitur" kontrolü Kıbrıs Amerikan'ı (100 satırın 42'si) yakalayamıyor — o kurumun iki yazımı da yanlış etiketli olduğu için ortada çelişki yok. Bu yüzden ikinci bir 6 satırlık kontrol eklendi (§4). Onaysız bırakılırsa "kök neden kapandı" cümlesi yalan olurdu.
1. Ne değişti
| Dosya | Değişiklik |
|---|---|
scripts/unitur-onar.ts |
KURUM_DUZELT haritası + Aşama D (Aşama A'dan önce koşar). KKTC_ILLERI dışa aktarıldı (tek kaynak). Başlık yorumu "yalnızca NULL satırlara dokunur" → A/B/C NULL, D koşulsuz. |
scripts/veri-kalite.ts |
Kontrol 13 (baz ad başına tek unitur) + kontrol 14 (DEVLET etiketi Türkiye ili ile destekli). Dosyanın en sonuna eklendi; mevcut satırlar yeniden düzenlenmedi (P3 ile çakışmayı küçültmek için). |
data/yokatlas.db |
126 satır (ayrı commit). |
KURUM_DUZELT içeriği ve her satırın kanıtı — kurumun YÖK Atlas'taki kendi parantezli ikinci yazımı:
| Ad (DB'de) | unitur önce → sonra |
il |
|---|---|---|
| KIBRIS AMERİKAN ÜNİVERSİTESİ | DEVLET → KKTC (36) | değişmedi |
| KIBRIS AMERİKAN ÜNİVERSİTESİ (KKTC-LEFKOŞA) | DEVLET → KKTC (6) | değişmedi |
| ULUSLARARASI BALKAN ÜNİVERSİTESİ | DEVLET → YURTDISI KAMU (34) | SARAYBOSNA - BOSNA - HERSEK → ÜSKÜP-MAKEDONYA (26) |
| ULUSLARARASI SARAYBOSNA ÜNİVERSİTESİ | DEVLET → YURTDISI KAMU (24) | değişmedi (kurum gerçekten Saraybosna'da) |
ÜSKÜP-MAKEDONYA yazımı uydurma değil: kurumun kendi adındaki parantezli ek, DB'deki diğer yurt dışı illerin biçimiyle (BİŞKEK-KIRGIZİSTAN, TÜRKİSTAN-KAZAKİSTAN, BAKÜ-AZERBAYCAN) aynı.
unitur dağılımı: DEVLET 12142→12042, KKTC 1145→1187, YURTDISI KAMU 99→157. Toplam sabit.
2. Fark raporu (öncesi/sonrası)
Yöntem: düzeltme öncesi DB sqlite3 .backup ile scratchpad'e alındı, sonra ATTACH ile kolon kolon karşılaştırıldı.
programs: önce 21493 → sonra 21493 (satır kaybı/ekleme yok)
programs_arsiv: önce 3735 → sonra 3735 (unitur/il değişen satır: 0)
netler: önce 62975 → sonra 62975
veri_meta: önce 37 → sonra 37
programs, 45 kolon tarandı — DEĞİŞEN: unitur=100, il=26
yıl kolonları (34 kolon: sıra/puan/kontenjan/yerleşen + 2025 ek kontenjanları,
2021-2026) değişen satır: 0
pnpm veri-kalite --onceki kendi bağımsız kontrolüyle aynı sonucu verdi:
GEÇTİ önceki DB: satır kaybı — 0
GEÇTİ önceki DB: geçmiş yıllar korunmuş — 20 kolonda dolu değeri değişen/silinen satır: 0
2025 sağlaması (count | Σsira | Σpuan | Σkontenjan | Σyerlesen)
önceki DB : 21493 | 11099796362 | 5433214.11872 | 756453 | 740586
şimdi, önceki DB'deki aynı id'ler : 21493 | 11099796362 | 5433214.11872 | 756453 | 740586
3. Kabul kriterleri — tek tek
(1) pnpm veri-kalite temiz ve yeni kontrol çelişkiyi gerçekten yakalıyor. ✅
pnpm veri-kalite --yil 2026 --db data/yokatlas.db --onceki <öncesi>
…
GEÇTİ baz ad başına tek unitur — aynı kurumun iki yazımı devlet/vakıf filtresini bölmüyor
bilgi baz ad unitur farkı (devlet/vakıf ayrımını bölmeyen) — HOCA AHMET YESEVİ …/YURTDISI KAMU,YURTDISI VAKIF/17 ; KIRGIZİSTAN-TÜRKİYE MANAS …/29
GEÇTİ DEVLET etiketi Türkiye ili ile destekli — DEVLET etiketli her kurumun en az bir programı Türkiye ilinde
Sonuç: 0 ZORUNLU kontrol kaldı, 3 uyarı. (çıkış kodu 0)
3 uyarı düzeltme öncesiyle birebir aynı, hiçbiri bu işten doğmadı: il boş 110 satır (kapsam dışı), kimlik ATLANDI (data/ham repoda yok), yetim netler 2066.
Yakalama iki yoldan kanıtlandı:
- Düzeltme öncesi DB'de (gerçek kusur):
KALDI baz ad başına tek unitur — … ULUSLARARASI BALKAN ÜNİVERSİTESİ/DEVLET,YURTDISI KAMU/48 ; ULUSLARARASI SARAYBOSNA ÜNİVERSİTESİ/DEVLET,YURTDISI KAMU/38veKALDI DEVLET etiketi Türkiye ili ile destekli — KIBRIS AMERİKAN ÜNİVERSİTESİ/LEFKOŞA/36 ; … (KKTC-LEFKOŞA)/KIBRIS/6 ; ULUSLARARASI BALKAN …/34 ; ULUSLARARASI SARAYBOSNA …/24→Sonuç: 2 ZORUNLU kontrol kaldı, çıkış kodu 1. - Bilerek bozma (düzeltilmiş DB'nin atılabilir kopyasında tek satır
DEVLET'e döndürüldü): ikisi de yakaladı →Sonuç: 2 ZORUNLU kontrol kaldı. Kopya silindi; gerçek DB'ye dokunulmadı.
(2) db.ts devlet filtresi 27 programı artık döndürmüyor, vakıf filtresi döndürüyor. ✅ Ölçüldü.
src/lib/db.ts:79-82 filtreleri + EFEKTIF_SIRA = COALESCE(sira2026, sira2025) (havuza ancak efektif sırası olan satır girer):
-- devlet: AND unitur = 'DEVLET'
-- vakıf : AND unitur IS NOT NULL AND unitur <> 'DEVLET'
SELECT COUNT(*) FROM programs
WHERE universite IN ('KIBRIS AMERİKAN ÜNİVERSİTESİ',
'KIBRIS AMERİKAN ÜNİVERSİTESİ (KKTC-LEFKOŞA)',
'ULUSLARARASI BALKAN ÜNİVERSİTESİ',
'ULUSLARARASI SARAYBOSNA ÜNİVERSİTESİ')
AND <filtre> AND COALESCE(sira2026, sira2025) IS NOT NULL;
| önce | sonra | |
|---|---|---|
| devlet havuzu | 27 | 0 |
| vakıf havuzu | 0 | 27 |
(3) /universiteler hub'ında üç kurum "Devlet" listesinden çıkıyor. ✅ (kısmen koddan çıkarım — tarayıcı açılmadı)
getAllUniversiteler (src/lib/katalog.ts:268-271) MAX(unitur) GROUP BY universite okur; universite-listesi.tsx:44-47 u.unitur === "DEVLET" olanı devlet listesine, VAKIF/VAKIF MYO olanı vakfa, kalanı digerUniler'e koyar. Aynı SQL DB'de koşturuldu:
önce : KIBRIS AMERİKAN …|DEVLET … (KKTC-LEFKOŞA)|DEVLET ULUSLARARASI BALKAN …|DEVLET ULUSLARARASI SARAYBOSNA …|DEVLET
sonra: KIBRIS AMERİKAN …|KKTC … (KKTC-LEFKOŞA)|KKTC ULUSLARARASI BALKAN …|YURTDISI KAMU ULUSLARARASI SARAYBOSNA …|YURTDISI KAMU
Devlet listesindeki kurum sayısı: 170 → 166
166 = 170 − 4 yazım (3 kurum; Kıbrıs Amerikan'ın iki yazımı bugün iki ayrı slug — kategoriBul baz ad birleştirmesi kapsam dışı, BACKLOG #10).
Dördü de KKTC/YURTDISI KAMU olduğu için vakıf listesine girmiyor, "Diğer" grubuna düşüyor — hub'da sayı dengesi bozulmuyor.
(4) 2021–2026 puan/sıra kolonlarında hiçbir değişiklik yok. ✅ §2.
Ayrıca: npx next typegen && npx tsc --noEmit temiz, npx eslint scripts/unitur-onar.ts scripts/veri-kalite.ts temiz. Betik idempotent: ikinci koşu unitur 0 satır, il 0 satır.
4. Kapsam genişletmesi ve gerekçesi (şeffaflık)
Şartname veri-kalite.ts'e tek kontrol istiyordu: "baz ad başına tek unitur" (~8 satır). Uygulandı — ama düzeltme öncesi DB'de koşturunca Kıbrıs Amerikan'ı hiç görmüyor: o kurumun her iki yazımı da DEVLET etiketli, yani baz ad içinde çelişki yok. Bu kontrol tek başına 100 satırın yalnız 58'ini koruyor; 42'si (öğrenciye sızan 27 programın 12'si) denetimsiz kalıyordu.
Bu yüzden kontrol 14 eklendi (6 satır): DEVLET etiketli bir kurumun en az bir programı Türkiye ilinde olmalı. Türkiye illerinde tire geçmiyor, yurt dışı iller tireli, KKTC illeri KKTC_ILLERI'nde; hiç ili olmayan kurumlar (MSB/İçişleri) hariç tutuldu. Düzeltme öncesi DB'de yanlış 4 yazımın dördünü birden, sıfır yanlış pozitifle yakalıyor.
Kapsam dışında bırakılanlara dokunulmadı: il boş 19 satır, burs/dil ekli adlar (B4), kategoriBul düzeltmesi.
5. Yeni bulgular (bu geceye alınmadı — backlog önerisi)
| # | Bulgu | Sorgu / kanıt | Önem |
|---|---|---|---|
| A | programs_arsiv'de aynı yanlış etiket sürüyor: 31 satır ULUSLARARASI BALKAN + 30 satır ULUSLARARASI SARAYBOSNA unitur='DEVLET', 24 satırda il Saraybosna. CEO §6'nın veri mühendisine sorduğu soru buydu. |
SELECT universite, unitur, il, COUNT(*) FROM programs_arsiv WHERE universite LIKE '%BALKAN%' OR universite LIKE '%SARAYBOSNA%' GROUP BY 1,2,3 |
Düşük — kullanıcıya yansımıyor. src/ tarafında programs_arsiv'i okuyan hiçbir SQL yok (tablo yalnızca src/lib/kapanan-sluglar.ts'te bir yorumda geçer); db.ts havuzu yalnız programs'tan besleniyor. Yine de bir sonraki denetimde yeniden "bulgu" olarak çıkacak; KURUM_DUZELT'i arşive de uygulamak tek satırlık iş. |
| B | data/yokatlas.db-shm ve -wal git'te izleniyor (32 KB + 0 bayt). Bunlar SQLite'ın geçici dosyaları: DB her açılıp kapandığında oluşup siliniyor, dolayısıyla git status kendiliğinden kirleniyor. |
git ls-files data/ |
Düşük. Uygulamanın better-sqlite3 ile readonly açılışı eski -shm yanındayken de sorunsuz çalışıyor (ölçtüm); ama sqlite3 -readonly CLI'ı bu durumda "unable to open database file (14)" veriyor — denetim sorgusu koşarken yanıltır. Öneri: git rm --cached + .gitignore. Bu commit'e dahil etmedim: .gitignore'da Bilal'in commit'lenmemiş değişikliği var. |
| C | Baz ad çelişkisi kalan 2 kurum: Manas ve Hoca Ahmet Yesevi (YURTDISI KAMU ↔ YURTDISI VAKIF). |
kontrol 13'ün bilgi satırı |
Yok. İkisi de <> 'DEVLET' olduğu için devlet/vakıf filtresini bölmüyor; kurum gerçekten ortak. Bilerek ZORUNLU yapılmadı, bilgi olarak görünür duruyor. |
6. Kullanıcıya yansıyan etki (düzelen)
| Yüzey | Önce | Sonra |
|---|---|---|
| Sihirbaz → "Devlet üniversitesi" | Havuzda 27 KKTC/Bosna/Makedonya programı | 0 |
| Sihirbaz → "Vakıf" | Aynı 27 program eksik | 27'si havuzda |
/universiteler hub'ı |
3 kurum (4 yazım) "Devlet üniversiteleri" listesinde | "Diğer" grubunda |
/universite/uluslararasi-balkan-universitesi |
"Tür: Devlet", şehir Saraybosna (Bosna) | Tür: Yurt dışı kamu, şehir Üsküp-Makedonya |
Tadımlık satırı (tadimlik-satiri.tsx:37) |
Aynı semantik, aynı sızıntı | Düzeldi (aynı unitur alanını okur) |
Bilal'den istenen
- Dalı incele ve merge kararını ver (
gece/0922-unitur-kacagi, 2 commit: kod+rapor, veri). Fark raporu §2'de ve veri commit'inin mesajında; geri dönüş içinveri-2025-sonetiketi duruyor. ~10 dk. - Elindeki ham CSV'de tek
grep—data/ham/repoda yok: bu üç kurum kaynak dosyada gerçektenDEVLETmi yazıyor? Doğrularsa teşhis kapanır,ingest.ts'e aynı harita eklenir. ~5 dk. - Karar: §5-A (arşiv tablosundaki aynı yanlış etiket) ve §5-B (
-shm/-walgit'ten çıkarılsın mı) backlog'a mı, yoksa bu dala ek commit mi? İkisi de kullanıcıya yansımıyor. ~2 dk.