# Eval profil matrisi ve soru seti — tercih robotu + danışman sohbeti 5 Ekim 2026 · yapay zekâ mühendisi + ürün yöneticisi · dal `gece/eval-jev` Veri dosyası: `scripts/eval/profiller.ts` (40 profil, 112 soru). Eval betiği bu turda yazılmadı; ikinci dalga bu dosyayı okuyacak. ## Özet (5 madde) 1. **40 profil, 112 soru hazır ve gerçek veride doğrulandı.** 12 kişinin her birinden en az bir profil var (15 profil), 17 profil yalnız algoritma kapsamı (`a`), 8 profil danışman profilinin havuza etkisi için (`b`); danışman profili taşıyan toplam 9 profil var (p07 + b01–b08). Beş puan türü, gevşetmenin yedi farklı sonucu ve 11 aracın her biri (en az 2 soru) kapsandı. `beklenen` değerleri tahmin değil: `havuzOlustur()` gerçek `data/yokatlas.db` üzerinde koşturulup okundu (40/40 eşleşti). 2. **En büyük bulgu (B3): sihirbazda il seçmeyen adayın alan seçimi çoğu zaman sessizce düşüyor.** Tek alan + il yok + "fark etmez" ile 318 denemenin 206'sında (%65) alan gevşedi; oysa sihirbaz o alanda 24'ten fazla program olduğunu göstermişti. Sebep: önce sıraya en yakın 60'ar program alınıyor, alan süzgeci ondan sonra uygulanıyor. 3. **Liste, adayın yazamayacağı programları içerebiliyor (B2, B8).** Başarı sırası barajı havuzda hiç denetlenmiyor (52.000 sıralı adayın havuzunda 3 tıp programı), "KKTC Uyruklu" ve "M.T.O.K." kontenjan satırları da havuza giriyor (Mert profilinde 54 programın 7'si). 4. **"24'lük liste" her zaman 24 değil ve en düşük sıralar için tamamı "hayal" (B1, B6).** 24 eşiği, dilim başına 20'ye kırpmadan önce sayılıyor: 6 profilde liste 20–22 satır. Kontenjanı dolmayan 3.239 programın 2.888'i taban sırası boş olduğu için havuza hiç giremiyor; en düşük sıralı aday için en gerçekçi seçenekler görünmüyor. 5. **Sohbet soruları ürünün dürüst kalması gereken yerleri hedefliyor:** 12 vaat/olasılık, 5 kriz + 1 "kriz değil" kontrolü, 7 enjeksiyon, 24 veri-yok, 13 boş dönen araç, 23 "ürün buna hizmet etmiyor" sorusu (lise 9, lise 11, DGS, yatay geçiş, veli, öğretmen, meslek lisesi ek puanı). Gerçek modelle koşulmadı; bu tur yalnız veri ve deterministik doğrulama. ## 1. Dosya şeması ```ts EvalProfil { id, kisi, aciklama, sihirbaz: { sira, tur, secimler: { kategoriler, iller, universiteTipi, oncelikler } }, // listeOlustur girdisiyle birebir danismanProfili?: DanismanProfili, // evIl, maxKm, ucretUst, burs, dil, ogretimTuru, kampus paketli?: boolean, // false → sohbete yalnız ilk 3 satır girer beklenen: { senaryoEtiketleri, havuzGevsetmeBasamagi, minAday, hedef: {hayal,dengeli,garanti}, supheli?, notlar } } EvalSoru { id, profilId, gecmis?, soru, beklenenAraclar, aracKurali?: "hepsi" | "herhangi", yasakAraclar?, beklenenDavranis, // hakem için tek cümle etiketler, kontrol?: { icermeli?, icermeliBiri?, icermemeli? } } ``` Alan adları koddan alındı: `SihirbazSecimleri` (`src/features/sihirbaz/sihirbaz-sabitler.ts:54`), `RaporParams` (`src/features/rapor/types/rapor.ts:64`), `DanismanProfili` (`src/lib/danisman-profil.ts:42`), `Gevsetilen` ve `DilimHedef` (`src/lib/rapor-havuzu.ts:21,75`). Kategori ve öncelik adları tip düzeyinde allowlist'e bağlı; yanlış yazım derlenmez. `pnpm exec tsc --noEmit` temiz, `eslint scripts/eval/profiller.ts` temiz. Çalıştırıcı için notlar (dosyanın başında da yazılı): - Havuz/hedef denetimi LLM istemez; 40 profil bedava koşar. `raporParams = { sira, tur, ...secimler }`. - Sohbet rapor ister (`/api/soru` 409 `NO_REPORT`); bağlam için önce profilin listesi üretilmeli (anahtarsız ortamda `mockRapor` yeter). - `profil_guncelle` app DB'ye yazar: eval'de sahtelenmeli. Öteki 10 araç salt okunur. - 112 sorunun tamamı gerçek modelle ≈ 112 sohbet çağrısı + araç turları: PROTOKOL gereği 50 çağrıyı aşan koşu `[BİLAL]`. - Aynı klasörde başka bir ajanın `scripts/eval/jev-sorulari.ts` dosyası var (Jev çıktı denetimi için cevap örnekleri); bu dosyayla çakışmıyor. ## 2. Senaryo × profil kapsamı Kısaltma: `p` = kişiden türeyen, `a` = algoritma, `b` = danışman profilli. Tam id'ler veri dosyasında. | Senaryo | Profiller | |---|---| | **Puan türü** SAY | p01 p02 p05 p09 p14 a01 a02 a04 a06 a08 a13 a14 a17 b01 b05 b06 | | EA | p03 p04 p06 p07 p10 p12 a03 a05 a16 b02 b03 b04 b07 b08 | | SÖZ | p13 a07 | | DİL | a09 a10 a11 | | TYT (ön lisans) | p08 p11 p15 a12 a15 | | **Sıra bandı** çok üst (ilk 1.000) | a01 (1), a02 (800), a03 (500) | | üst | p01 (50.000), a04 (52.000), b01 (60.000) | | orta | p02–p08, p10–p14, a05, a09, a10, a13, a15, a16, b02, b05–b08 | | alt | p09 (410.000), p15, a06, a07, a08, a14, b03, b04 | | çok düşük / uç değer | a11 (DİL 140.000 > en kötü taban 137.571), a12 (4.000.000, kabul edilen üst sınır), a17 (SAY 1.300.000 > en kötü taban 1.253.835), a01 (1) | | **Baraj** tam sınır / hemen içi | p01 (tıp 50.000), p04 (hukuk, 99.500) | | hemen dışı | a04 (tıp, 52.000), p03 a05 b07 (hukuk, 105.000), a06 (mühendislik, 310.000), a07 (öğretmenlik, 310.000), a08 (mimarlık, 251.000), p09 (mühendislik, 410.000) | | **İl** yok | p03 p04 p05 p07 p09 p10 p11 a01 a02 a04 a06 a07 a08 a11 a12 a13 a16 b01 b03 | | tek il | p01 p06 p12 p13 p15 a05 a09 a15 b02 b04–b08 | | çok il | p02 p08 p14 a03 a10 a14 · 5 il (üst sınır): a17 | | **Tip** yalnız devlet | 21 profil (ör. p05, p12, a02) | | yalnız vakıf | a13 a14 b02 b05 b08 | | fark etmez | 14 profil (ör. p03, p08, a01) | | **Gevşetme** yok | 24 profil | | yalnız alan (2. basamak, il korunur) | p01 p06 a15 · il seçilmeden: p03 p09 a01 a07 a08 a16 | | yalnız il (3. basamak) | p12 p13 a09 | | il + alan (4. basamak) | a05 | | yalnız profil | b03 | | profil + il | b06 | | profil + il + alan (hepsi) | b07 | | profil uygulanır, gevşemez (0. basamak) | p07 b01 b02 b05 | | **Dağılım** ideal 5/13/6 | 23 profil | | hayal yetersiz | a01 (0), a02 (1), a15 (4) | | dengeli yetersiz | p01 p06 p08 p13 p15 a01 a02 a03 a06 a09 a11 a15 a17 b04 | | güvenli yetersiz | p07 (5), p13 (0), p15 (1), a11 (0), a17 (0), b04 (3) | | tamamı hayal | a11 a12 a17 b05 | | liste 24'ün altında | a01 (21), a02 (22), a11 a12 a17 b05 (20) | | havuz tam 24 (seçim payı yok) | a15 | | **Özel** burslu/indirimli vakıf | a13 a14 b02 b05 b08 | | KKTC / yurt dışı | a14 (60/60), a13 (10), a04 (7), a08 (6), a06, a11, a12, a16, b06, p03 | | özel kontenjan satırı havuzda | p02 (7), p14 (6), p09 (5), p05 (4), a07 (3), a08, a17 | | meslek lisesi ek puanı | p15 (+ sorular s100, s101) | | paketsiz / kilitli | b02 (+ s075, s106) | | ürünün hizmet edemediği kişi | p01 (lise 9), p02 p03 (lise 11), p10 (yatay geçiş), p11 (DGS), p12 (veli), p13 (öğretmen) | | yeni açılmış / dolmamış program | Havuza giremediği için profil yok; sohbet soruları s052 (Batman Bilgisayar Müh.), s064, s018 | | özel koşullu program | s009 (Pilotaj, kılavuz koşulları `program_detay.kosullar`) | ### 12 kişi → profil ve soru eşlemesi | Kişi | Profil | Sohbet soruları | |---|---|---| | 01 Ece (lise 9) | p01 | s020 s049 s050 s070 s090 s091 | | 02 Mert (lise 11) | p02, p03 | s068 s092 s093 s103 | | 03 Zeynep (lise 12) | p04 | s004 s016 s028 s063 s071 s080 s094 | | 04 Can (tercih dönemi) | p05 | taban çizgisi; 36 soru (araç, vaat, enjeksiyon, konu dışı sorularının çoğu) | | 05 Elif (mezun, tekrar) | p06, p07 | s003 s010 s014 s022 s032 s034–s036 s044 s095 s110 | | 06 Burak (yerleşemedi) | p08, p09 | s017 s025 s052 s066 s067 s102 s105 | | 07 Selin (yatay geçiş) | p10 | s019 s057 s096 s097 | | 08 Emre (DGS) | p11 | s098 s099 | | 09 Ayşe (veli) | p12 | s013 s023 s046 s062 s069 s082–s085 | | 10 Hakan (öğretmen) | p13 | s086–s089 | | 11 Yusuf (ilk nesil) | p14 | s015 s026 s039 s054 | | 12 Deniz (meslek lisesi) | p15 | s005 s100 s101 | ## 3. Kanıt: her profil gerçek veride ne üretti Koşu: `havuzOlustur(params, danismanProfili)` + `dilimHedefiHesapla(havuz)`, `data/yokatlas.db` (2026 yenilemesi, `veri_meta.refresh_2026_tarih = 2026-09-21`). Sütunlar: *alan içi* = havuzda seçilen kategoriyle eşleşen program; *il içi* = seçilen illerde olan; *baraj dışı* = `program_ozellik.min_basari_sirasi` adayın sırasından küçük (aday yazamaz); *özel kont.* = adı "KKTC Uyruklu" ya da "M.T.O.K." içeren. | id | gevşetilen | havuz (H/D/G) | hedef (H/D/G) | liste | alan içi | il içi | baraj dışı | KKTC/yurt dışı | özel kont. | |---|---|---|---|---|---|---|---|---|---| | p01-ece-say-50000-tip-eskisehir | kategori | 40 (13/7/20) | 8/7/9 | 24 | 7 | 40 | 0 | 0 | 0 | | p02-mert-say-120000-muh-kocaeli-istanbul | — | 54 (20/14/20) | 5/13/6 | 24 | 54 | 54 | 0 | 0 | 7 | | p03-mert-ea-105000-hukuk-psikoloji | kategori | 60 (20/20/20) | 5/13/6 | 24 | 8 | – | 1 | 2 | 0 | | p04-zeynep-ea-99500-hukuk-psikoloji | — | 60 (20/20/20) | 5/13/6 | 24 | 60 | – | 0 | 1 | 1 | | p05-can-say-180000-muh-devlet | — | 60 (20/20/20) | 5/13/6 | 24 | 60 | – | 0 | 0 | 4 | | p06-elif-ea-87000-psikoloji-izmir-devlet | kategori | 46 (20/6/20) | 8/6/10 | 24 | 8 | 46 | 0 | 0 | 0 | | p07-elif-ea-87000-psikoloji-profil-izmir-300km | — | 29 (12/12/5) | 7/12/5 | 24 | 29 | – | 0 | 0 | 0 | | p08-burak-tyt-780000-bilgisayar-4il | — | 48 (17/12/19) | 5/12/7 | 24 | 48 | 48 | 0 | 0 | 0 | | p09-burak-say-410000-muh-devlet | kategori | 60 (20/20/20) | 5/13/6 | 24 | 4 | – | 0 | 0 | 5 | | p10-selin-ea-117000-psikoloji-devlet | — | 43 (16/20/7) | 5/13/6 | 24 | 43 | – | 0 | 0 | 0 | | p11-emre-tyt-650000-bilgisayar-devlet | — | 59 (20/20/19) | 5/13/6 | 24 | 59 | – | 0 | 0 | 0 | | p12-ayse-veli-ea-200000-isletme-kayseri-devlet | il | 60 (20/20/20) | 5/13/6 | 24 | 60 | 1 | 0 | 0 | 0 | | p13-hakan-ogretmen-soz-150000-egitim-trabzon | il | 25 (18/7/0) | 17/7/0 | 24 | 25 | 0 | 0 | 0 | 0 | | p14-yusuf-say-140000-muh-marmara-4il | — | 60 (20/20/20) | 5/13/6 | 24 | 60 | 60 | 0 | 0 | 6 | | p15-deniz-tyt-900000-elektrik-kocaeli-devlet | — | 28 (20/7/1) | 16/7/1 | 24 | 28 | 28 | 0 | 0 | 0 | | a01-say-1-saglik | kategori | 21 (0/1/20) | 0/1/20 | 21 | 11 | – | 0 | 0 | 0 | | a02-say-800-tip-devlet | — | 22 (1/1/20) | 1/1/20 | 22 | 22 | – | 0 | 0 | 0 | | a03-ea-500-hukuk-iktisat-istanbul-ankara | — | 34 (9/5/20) | 9/5/10 | 24 | 34 | 34 | 0 | 0 | 0 | | a04-say-52000-tip | — | 44 (16/14/14) | 5/13/6 | 24 | 44 | – | 3 | 7 | 0 | | a05-ea-105000-hukuk-kayseri-devlet | il → kategori | 60 (20/20/20) | 5/13/6 | 24 | 5 | 1 | 1 | 0 | 0 | | a06-say-310000-muh | — | 29 (14/7/8) | 9/7/8 | 24 | 29 | – | 5 | 4 | 0 | | a07-soz-310000-egitim-devlet | kategori | 60 (20/20/20) | 5/13/6 | 24 | 0 | – | 0 | 0 | 3 | | a08-say-251000-mimarlik | kategori | 60 (20/20/20) | 5/13/6 | 24 | 5 | – | 1 | 6 | 1 | | a09-dil-30000-ogretmenlik-konya-devlet | il | 27 (14/5/8) | 11/5/8 | 24 | 27 | 1 | 0 | 0 | 0 | | a10-dil-30000-sosyal-istanbul-ankara | — | 56 (20/16/20) | 5/13/6 | 24 | 56 | 56 | 0 | 0 | 2 | | a11-dil-140000-uc | — | 20 (20/0/0) | 20/0/0 | 20 | 20 | – | 0 | 3 | 0 | | a12-tyt-4000000-uc | — | 20 (20/0/0) | 20/0/0 | 20 | 20 | – | 0 | 4 | 0 | | a13-say-200000-muh-vakif | — | 57 (19/18/20) | 5/13/6 | 24 | 57 | – | 0 | 10 | 0 | | a14-say-250000-kktc-illeri-vakif | — | 60 (20/20/20) | 5/13/6 | 24 | 60 | 60 | 0 | 60 | 0 | | a15-tyt-650000-teknik-kilis-devlet | kategori | 24 (4/5/15) | 4/5/15 | 24 | 5 | 24 | 0 | 0 | 0 | | a16-ea-200000-turizm | kategori | 60 (20/20/20) | 5/13/6 | 24 | 1 | – | 0 | 3 | 0 | | a17-say-1300000-uc | — | 20 (20/0/0) | 20/0/0 | 20 | 20 | 20 | 0 | 0 | 1 | | b01-say-60000-muh-profil-ingilizce | — | 60 (20/20/20) | 5/13/6 | 24 | 60 | – | 0 | 0 | 0 | | b02-ea-120000-isletme-istanbul-vakif-yalniz-burslu | — | 60 (20/20/20) | 5/13/6 | 24 | 60 | 60 | 0 | 0 | 0 | | b03-ea-250000-isletme-profil-hakkari-50km | profil | 60 (20/20/20) | 5/13/6 | 24 | 60 | – | 0 | 0 | 0 | | b04-ea-250000-isletme-izmir-profil-hakkari-50km | — | 25 (20/2/3) | 19/2/3 | 24 | 25 | 25 | 0 | 0 | 0 | | b05-say-150000-muh-ankara-vakif-profil-ucret-ingilizce | — | 20 (20/0/0) | 20/0/0 | 20 | 20 | 20 | 0 | 0 | 0 | | b06-say-150000-muh-duzce-profil-ingilizce | profil → il | 60 (20/20/20) | 5/13/6 | 24 | 60 | 2 | 0 | 3 | 0 | | b07-ea-105000-hukuk-kayseri-devlet-profil-ingilizce | profil → il → kategori | 60 (20/20/20) | 5/13/6 | 24 | 5 | 1 | 1 | 0 | 0 | | b08-ea-120000-isletme-istanbul-vakif-profil-yuzde50 | — | 60 (20/20/20) | 5/13/6 | 24 | 60 | 60 | 0 | 0 | 0 | Yeniden üretmek için (depo kökünden, `pnpm exec tsx `; betik commit'lenmedi): ```ts import { PROFILLER } from "./scripts/eval/profiller"; import { havuzOlustur, dilimHedefiHesapla } from "./src/lib/rapor-havuzu"; for (const p of PROFILLER) { const r = havuzOlustur({ sira: p.sihirbaz.sira, tur: p.sihirbaz.tur, ...p.sihirbaz.secimler }, p.danismanProfili); console.log(p.id, r.gevsetildi, r.havuz.length, dilimHedefiHesapla(r.havuz)); } ``` Seçimleri dayandırdığım sorgular (`E = COALESCE(sira2026, sira2025)`, `sqlite3 -readonly data/yokatlas.db`): | Soru | Sorgu | Sonuç | |---|---|---| | Puan türü başına program ve taban aralığı | `select tur, count(*), min(E), max(E) from programs group by tur` | DİL 681 (595–137.571) · EA 3.900 (67–1.464.636) · SAY 5.744 (1–1.253.835) · SÖZ 1.914 (99–1.161.622) · TYT 9.254 (57.284–2.297.391) | | Barajlar | `select min_basari_sirasi, tur, count(*) from program_ozellik join programs using(id) group by 1,2` | 50.000 tıp (226) · 80.000 diş (182) · 100.000 hukuk EA (161) ve eczacılık SAY (101) · 250.000 mimarlık (176) · 300.000 mühendislik SAY (2.143), öğretmenlik EA/SÖZ/DİL (752) | | Tek ilde 24'ten az program | `... group by il having count(*) < 24` | SAY: Düzce 23 · EA devlet: Kayseri 22 · DİL: Konya 20 · SÖZ: Trabzon 21 · TYT: Kilis 24 | | Dolmayan program | `select count(*) from programs where yerlesen2026 < kontenjan2026` | 3.239; hepsinde `sira2026` boş; 2.888'inde `E` de boş, 351'i 2025 sırasına düşüyor | | Özel kontenjan satırı (taban sırası olan) | `... where isim like '%KKTC Uyruklu%' or isim like '%M.T.O.K.%'` | 118 | | KKTC / yurt dışı | `select unitur, count(*) from programs group by 1` | KKTC 1.187 · yurt dışı kamu 157 · yurt dışı vakıf 12 | | Burs dağılımı | `select burs_orani, count(*) from program_ozellik group by 1` | Burslu 4.214 · %50 3.717 · %25 230 · Ücretli 1.409 | Sohbet sorularında geçen rakamlar araçlar gerçek veriyle çağrılarak doğrulandı (`aracCalistirici`, `profil_guncelle` hariç). Örnekler: `program_ara` SAY adayı için "hukuk" → 0 sonuç (s048); "Hemsirelik" → 0 (s049); il "Urfa" ve "Lefkoşa" → "İl tanınmadı" (s050, s051); Batman Bilgisayar Müh. → 0 (s052); üniversite "ODTÜ" → 0, "orta doğu teknik" → 3 (s053); `universite_profili("DEÜ")` → bulunamadı (s032); `il_ozeti("Afyon")` → bulunamadı (s024); `rehber_ara("DGS")`, `("erasmus")`, `("askerlik tecil")` → boş (s098, s056, s102); `program_netleri` Kayseri Üniv. YBS → "net verisi yok" (s013); `tercih_takvimi` → "2027 takvimi açıklanmadı", 2026: 29 Temmuz – 10 Ağustos (s028). ## 4. Şüpheli davranışlar ve bug adayları Önem sırasıyla. "Doğrulandı" = gerçek veride çalıştırılıp görüldü; "koddan çıkarım" = yalnız okundu. **B3 — Alan süzgeci 60'lık limitten SONRA uygulanıyor; il seçilmese bile alan gevşiyor.** *Doğrulandı.* `src/lib/rapor-havuzu.ts:189-197` (SQL dilim başına `LIMIT 60`, sonra JS'te `kategoriFiltre`) ve `:205-210` (24'ü bulmazsa alan gevşer). Sıraya en yakın 60'ar program her alandan karışık geldiği için seçilen alan 24'ü bulmuyor; daha uzaktaki eşleşenlere bakılmıyor. - a16: EA 200.000, Turizm & Gastronomi, il yok → EA'da 78 turizm programı var (8 hayal / 5 dengeli / 65 güvenli), havuzdaki 60 programın **1**'i turizm. - p03: EA 105.000, Hukuk & Siyasal → 40 dengeli + 260 güvenli program varken havuzda 8. - a08: SAY 251.000, Mimarlık & Tasarım → 47 dengeli + 124 güvenli varken havuzda 5. - Tarama: 5 puan türü, 8–11 sıra noktası, sihirbazın "24+ program" gösterdiği her alan tek başına, il yok, fark etmez → **318 denemenin 206'sında (%65) alan gevşedi** (SAY %59, EA %75, SÖZ %35, DİL %32, TYT %80). Kullanıcıya "seçtiğin alanlarda yeterli program yoktu" deniyor (`src/lib/ai/rapor.ts:268-272`); bu cümle bu durumlarda yanlış. **B2 — Başarı sırası barajı havuzda denetlenmiyor.** *Doğrulandı.* `src/lib/db.ts:186-190` (`dilimAra` yalnız taban sırasına bakar), `src/lib/rapor-havuzu.ts:145-232` (`min_basari_sirasi` hiç okunmuyor). Hayal dilimi "adayın sırasının üstünde kapanan her şey" olduğu için barajın hemen dışındaki adaya tam da yazamayacağı programlar düşüyor: a04 (52.000) havuzunda 3 tıp, a06 (310.000) havuzunda 5 mühendislik, p03 havuzunda 1 hukuk. Ayrıca 5 programın efektif sırası barajından kötü (2026'da dolmamış, 2025 sırası kullanılıyor; ör. Altınbaş Hukuk %50: taban 117.681, baraj 100.000) ve 105.000 sıralı adaya "Dengeli" diye çıkıyor. `program_ara` da aynı etiketi verir (`src/lib/ai/araclar.ts:300-305`); baraj yalnız `ozellik` metninde geçer. **B1 — 24 eşiği kırpmadan önce sayılıyor; liste 20–22 satırda kalıyor.** *Doğrulandı.* `src/lib/rapor-havuzu.ts:179-182`, `:197-201`, `:222-226`: `length >= 24` denetimi 60'lık ham havuzda, ardından `dilimBasinaKirp(..., 20)` (`:121-124`). Havuz tek dilime yığıldığında 20'ye iner: a02 (SAY 800, devlet sağlık: 617 güvenli program var) → 22 satır; a01 → 21; a11, a12, a17, b05 → 20 satır. b05'te bu yüzden profil de gevşemiyor (60 ≥ 24 sayılıyor, sonra 20 hayal kalıyor). **B6 — Kontenjanı dolmayan programlar havuza ve aramaya giremiyor.** *Doğrulandı.* `src/lib/veri-yillari.ts` (`EFEKTIF_SIRA_SQL`), `src/lib/db.ts:189`, `src/lib/ai/araclar.ts:362` (`IS NOT NULL`). 2026'da dolmayan 3.239 programın hepsinde `sira2026` boş; 2.888'i hiç görünmüyor, 351'i 2025 sırasıyla değerlendiriliyor. Devlette bu görünmeyen programlarda 3.196 kontenjan, 854 yerleşen var. Örnek: Batman Üniversitesi Bilgisayar Mühendisliği, 70 kontenjan, 69 yerleşen, taban sırası yok → ne listede ne `program_ara`'da. Sonuç: a11/a12/a17 gibi en düşük sıralı adaylara tamamı "hayal" 20 satır veriliyor; gerçekte girebilecekleri programlar gösterilmiyor. (Kural bilinçli olabilir — "taban yoksa risk hesaplanamaz" — ama o zaman listede bunun söylenmesi gerekir.) **B8 — Özel kontenjan satırları herkesin havuzuna giriyor.** *Doğrulandı.* İsim süzgeci yok (`src/lib/db.ts:186-190`). Taban sırası olan 118 "(KKTC Uyruklu)" / "(M.T.O.K.)" satırı var. p02'de (SAY 120.000, Kocaeli + İstanbul, devlet) havuzdaki 54 programın 7'si böyle: ör. İTÜ Elektrik Müh. (KKTC Uyruklu), YTÜ Yapay Zeka ve Veri Müh. (KKTC Uyruklu), Marmara Siber Güvenlik Müh. (M.T.O.K.). 24 Eylül sabah raporundaki "KKTC Uyruklu satırlar sayılmaz kuralı tek yerde tanımlanacak" işi havuza da uygulanmalı. **B5 — Gevşetilen filtreyle eşleşen programlar havuzda korunmuyor.** *Doğrulandı.* `src/lib/rapor-havuzu.ts:212-226`: il gevşeyince havuz baştan, ilsiz kuruluyor; seçili ildeki programlar ayrıca eklenmiyor. p12 (Kayseri): 60 programın 1'i Kayseri'de (ilde alanla eşleşen 9 program vardı). p13 (Trabzon): 25 programın **0**'ı Trabzon'da. Prompt ise modele "seçili illere öncelik ver" diyor (`src/lib/ai/rapor.ts:263-267`) — havuzda olmayanı seçemez. **B4 — Gevşetme sırası belgede ve kodda farklı.** *Doğrulandı (okuma + koşu).* Kod: profil → **alan** (2. basamak, `rapor-havuzu.ts:204-210`) → **il** (3. basamak, `:212-227`) → ikisi. Fonksiyon yorumu (`rapor-havuzu.ts:142`) ve `/meraklisina` şeması (`src/features/pazarlama/components/huni-semasi.tsx:22` ve `:48` aria-label) "önce danışmana söylediklerin, sonra il, sonra alan" diyor. p01, p06, a15 il korunup alanın gevşediğini gösteriyor. AGENTS.md "şema mimariyle senkron" kuralı gereği biri düzeltilmeli. **B7 — "Vakıf" seçimi KKTC ve yurt dışı kamu üniversitelerini de getiriyor; araçla tutarsız.** *Doğrulandı.* `src/lib/db.ts:120-124`: vakıf = `unitur <> 'DEVLET'` (KKTC, YURTDISI KAMU dahil). a13'te havuzun 10'u KKTC/yurt dışı. Danışman aracında `tur=vakif` yalnız VAKIF + VAKIF MYO (`src/lib/unitur.ts:55`, `araclar.ts:395-400`). Ayrıca `program_ara` KKTC şehirlerini il olarak tanımıyor (`araclar.ts:380-383`; "İl tanınmadı: Lefkoşa") ama `il_ozeti("Lefkoşa")` çalışıyor: KKTC programı yalnız üniversite adıyla aranabiliyor. **B9 — Profildeki "%50 burslu da olur" hiçbir şeyi süzmüyor.** *Doğrulandı.* `src/lib/rapor-havuzu.ts:49-52` ve `araclar.ts:414-417` yalnız `yalniz-burslu` değerine bakıyor. b08 ile b02 aynı sihirbaz; b08'in havuzu süzülmemiş hâliyle aynı. Kullanıcıya ise "listen ve aramalar buna göre süzülür" deniyor (`src/lib/ai/danisman-prompt.ts`, PROFİL kuralı). **B10 — Üniversite kısaltmaları.** *Doğrulandı.* `src/lib/ai/araclar.ts:727-733`: tabloda `dtu: "deu"` var; "DEÜ" bulunamıyor (anahtar `deu`, değer `dokuz-eylul` olmalıydı gibi görünüyor). `program_ara`'nın `universite` parametresi kısaltma tanımıyor (`:372-377`): "ODTÜ" → 0 sonuç, "İTÜ"/"YTÜ" de aynı yoldan geçer. Öğrenci dili kısaltmadır; model her seferinde ikinci araç turu harcar. **B11 — `il_ozeti` "Afyon"u bulamıyor, `program_ara` buluyor.** *Doğrulandı.* `araclar.ts:648` slug ile birebir arıyor; `:380` `ilAdiNormalize` ön ek eşlemesi yapıyor. "Urfa", "Antep", "Maraş" ikisinde de tanınmıyor. **B12 — Kilitli listede "kalan 21 tercih" sabit.** *Koddan çıkarım.* `src/app/api/soru/route.ts:165`: `24 - ACIK_SATIR` sabit; liste 20–22 satırsa (B1) modele yanlış sayı gidiyor. **B13 — Şüpheli veri: İstanbul Medipol satırları.** *Doğrulandı (sorgu); nedeni bilinmiyor.* `203110477` Tıp: `sira2026 = 1`, kontenjan 3, yerleşen 3 (2025'te 38). `203101291` Tıp (İngilizce) (Ücretli): efektif sıra 27. `203101158` Yapay Zeka Müh. (İngilizce) (Ücretli): 1.016. Ücretli kontenjanların ilk 30'da kapanması olası görünmüyor; a01'in tek "dengeli" satırı bu. Veri mühendisi YÖK Atlas'tan doğrulamalı. **B14 — Liste özetinde program kimliği yok; her ayrıntı sorusu iki araç turu.** *Koddan çıkarım.* `src/lib/ai/rapor.ts:446` özet satırına `programId` yazmıyor; `program_detay`/`program_netleri` id istiyor. Model önce `program_ara` çağırmak zorunda; araç turu sınırı 3 (`src/lib/ai/sohbet-akisi.ts:26,53-54`). Yazım hatası + kısaltma (B10) + ayrıntı zinciri sınıra dayanır. Özet satırına id eklemek tur ve token tasarrufu sağlar. **B15 — Bedelsiz onay mesajı 40 karaktere kadar soru taşıyabiliyor.** *Koddan çıkarım.* `src/app/api/soru/route.ts:43`: "evet izmirde hukuk kaç sırayla alıyor" (36 karakter) kredi harcamadan geçer. Yorum bu riski biliyor; düşük önem. **B16 — Sistem prompt'u "geçen yıl" diyor, veri bazen 2025.** *Koddan çıkarım.* `src/lib/ai/danisman-prompt.ts:50` ("Riskli = geçen yıl adayın sıralamasının üzerinde kapandı"); `src/lib/risk.ts:72-78` aynı cümleyi bilinçli olarak yıl vermeden kuruyor. 351 programda efektif sıra 2025'ten. Gözlem (bug değil): `sihirbazDogrula` il adlarını denetlemiyor (`sihirbaz-sabitler.ts:92-100`); tanınmayan il SQL'de sıfır eşleşir ve il gevşer. Profil dil süzgeci `program_ozellik` satırı olmayan programı dışlar, örgün süzgeci içeri alır (`db.ts:96-100`) — küçük tutarsızlık. ## 5. Kapsanamayanlar - **Gevşetmeyle bile dolmayan havuz ve `MIN_LISTE` hata dalı** (`src/lib/ai/rapor.ts:239-243`): gerçek veride tetiklenemiyor. Son basamak ilsiz ve alansız havuzu döner; en küçük puan türünde (DİL) bile 591 taban sıralı program var. En dar gerçek sonuç 20 satır (B1). Bu dal ancak sahte veriyle sınanabilir. - **Yeni açılmış / hiç taban sırası olmayan program**: havuza ve `program_ara`'ya giremediği için sihirbaz profili yazılamadı; yalnız sohbet sorusuyla (s052, s064) "veri yok" davranışı sınanıyor. - **Meslek lisesi ek puanı**: sihirbazda okul türü alanı yok; ürün hesaplayamıyor. Yalnız danışmanın bunu dürüstçe söylemesi sınanıyor (s100, s101). - **Eski akış alanları** (`RaporParams.il`, `notlar`) ve **revizyon** (`raporUret`'in `revizyonNotu` yolu): sihirbaz üretmiyor; kapsam dışı bırakıldı. - **Engelli aday, açıköğretim, YÖS**: 40-elestiri.md'de eksik kişi olarak geçiyor; kişi dosyası olmadığı için profil türetilmedi. Tek ilgili soru s042/s112 (özel nitelikli veri). - **Gerçek model koşusu yok**: `beklenenAraclar` ve `beklenenDavranis` sistem prompt'u ile araç tanımlarından türetildi; modelin gerçekte ne yaptığı ölçülmedi. `kontrol.icermemeli` listeleri yanlış alarm vermesin diye dar tutuldu; asıl karar hakemde. - **Takvime bağlı sorular** (s028, s029): beklenti "2027 takvimi açıklanmadı" durumuna göre yazıldı; ÖSYM açıklayınca güncellenmeli. - **Kredi/ödeme, hız sınırı, 2.000 karakter üstü mesaj**: API katmanı; bu soru seti kapsamıyor. ## 6. Backlog önerisi (ürün yöneticisine) | İş | Neden | Karar | |---|---|---| | Alan süzgecini SQL'e ya da limitten önceye al (B3) | İl seçmeyen adayların %65'inde alan seçimi düşüyor | `[KARAR]` — havuz kuralı değişir, `/meraklisina` şeması aynı commit'te güncellenir | | Barajı ve özel kontenjan satırlarını havuzdan çıkar (B2, B8) | Liste yazılamayacak tercih öneriyor | `[KARAR]` | | 24 eşiğini kırpmadan sonra uygula ya da eksik dilimi tamamla (B1) | "24'lük liste" 20 satır çıkıyor | `[KARAR]` | | Dolmayan programlar için karar (B6) | En düşük sıralı adaya gerçek seçenek gösterilmiyor | `[BİLAL]` — "taban yok" satırını listeye almak ürün vaadini değiştirir | | Şema/yorum ile kod sırasını eşitle (B4) | AGENTS.md kuralı | `[KARAR]` | ## Bilal'den istenen 1. **Dolmayan programlar (B6) listeye girsin mi?** "Taban sırası yok, 2026'da dolmadı" etiketiyle ayrı bir satır türü olarak mı, yoksa hiç mi — tek cümlelik karar (5 dk). 2. **Gerçek modelle eval koşusuna izin**: 112 soru ≈ 112+ sohbet çağrısı, 40 liste ≈ 40–80 çağrı; 50 çağrı sınırını aşıyor (2 dk). 3. **B13 (Medipol sıraları)** için YÖK Atlas'ta tek bakış: Tıp burslu 2026 tabanı gerçekten 1. sıra mı (3 dk).