# Yazılımcı · aday havuzu düzeltmeleri (B1, B2, B3, B4, B5, B8) 5 Ekim 2026 · yazılımcı · dal `gece/eval-jev` · kaynak: `02-profil-matrisi.md` §4 ## Özet (5 madde) 1. **Altı bulgu kapandı, altı ayrı commit.** B3, B1, B5, B8, B2 davranışı düzeltti; B4'te davranış değişmedi, anlatım koda eşitlendi (KARARLAR.md'de gevşetme sırası için karar yok). 2. **40 profilde hiçbir liste kısalmadı.** 24'ün altında kalan liste 6 → 0; alanı gevşeyen profil 11 → 4 (kalan dördünde alan gerçekten dar); havuzlardaki baraj dışı program 12 → 0, özel kontenjan satırı 30 → 0. 3. **B3 taraması (tek alan, il yok, fark etmez; sihirbazın 24+ gösterdiği her alan):** alan gevşeyen deneme 203/308 → 1/308. Kalan tek deneme meşru: SAY 400.000 + Eğitim, alandaki programların hepsi 300.000 barajlı. 4. **Baraj için tablo uydurulmadı.** Kaynak `program_ozellik.min_basari_sirasi` (YÖK Atlas API, 2026 kılavuzu; katalogdaki "baraj … sıra" satırı aynı kolonu okuyor). Kolon bazı barajlı bölümlerde boş: bu satırlar süzülmüyor, veri işi olarak aşağıda. 5. **22 profilin `beklenen` değeri değişti** (tablo §3). `scripts/eval/profiller.ts`'e dokunulmadı; eval mühendisi işleyecek. ## 1. Commit listesi | sha | B | Mesaj | |---|---|---| | `ef68f93` | B3 | fix(havuz): alan süzgeci kırpmadan önce uygulansın [KARAR] | | `c1d81cd` | B1 | fix(havuz): tek dilime yığılan havuz 24'ün altına kırpılmasın [KARAR] | | `497b024` | B5 | fix(havuz): gevşeyen filtreye uyan programlar havuzda kalsın [KARAR] | | `22ac604` | B8 | fix(havuz): KKTC uyruklu ve M.T.O.K. kontenjan satırları havuza girmesin [KARAR] | | `0a11b15` | B2 | fix(havuz): başarı sırası barajını geçemeyen adaya o bölüm önerilmesin [KARAR] | | `1d970ec` | B4 | docs(havuz): gevşetme sırası anlatımı koda eşitlendi (profil → alan → il) [KARAR] | Dokunulan dosyalar: `src/lib/rapor-havuzu.ts`, `src/lib/db.ts`, `src/features/pazarlama/components/huni-semasi.tsx`, `src/features/pazarlama/components/meraklisina-icerik.tsx`. `src/lib/risk.ts` değişmedi. `data/app.db` commit'lenmedi. ## 2. Bulgu bulgu: kök neden, değişiklik, kanıt Kanıtların hepsi `havuzOlustur()` gerçek `data/yokatlas.db` üzerinde koşturularak alındı (betikler worktree dışında, scratchpad `havuz/`: `matris.ts` 40 profil, `degismez.ts` değişmez denetimi, `tarama.ts` B3 taraması; "önce" değerleri `ef68f93^` sürümünün kopyasıyla aynı betikten). ### B3 — alan süzgeci limitten sonra uygulanıyordu - **Kök neden:** `searchByRank(... limitPerBucket: 60)` her dilimden sıraya en yakın 60 programı alıyor, `kategoriFiltre` ondan sonra çalışıyordu. 24 eşiği gerçek program sayısına değil, o 180 satırın içindeki eşleşmeye bakıyordu. - **Değişiklik:** `db.ts` → yeni `havuzAdaylari()` dilimin tamamını (limitsiz, yakından uzağa) döndürür. `havuzOlustur` il + alan süzgecini bu tam listeye uygular, 24 eşiğini ona göre sayar, kırpmayı en sonda yapar. `searchByRank` ve `/sonuc` tablosu değişmedi. - **Kanıt (havuzda seçili alanla eşleşen):** a16 EA 200.000 Turizm 1/60 → 33/33; p03 8/60 → 60/60; a08 5/60 → 60/60; p09 4/60 → 57/57; a01 11/21 → 24/24. Hiçbiri artık alan gevşetmiyor. İl seçili profiller de kazandı (p08 48 → 60: aynı kök neden). - **Şema:** kullanıcıya anlatılan kural değişmedi ("elde kalan gerçek programlar" zaten bunu söylüyordu); şemaya dokunulmadı. - **Maliyet:** havuz kurulumu 1–114 ms'den 6–130 ms'ye çıktı (40 profil, en büyük puan türü ~9 bin satır). LLM çağrısının yanında ihmal edilebilir. ### B1 — 24 eşiği kırpmadan önce sayılıyordu - **Kök neden:** `length >= 24` denetiminden sonra `dilimBasinaKirp(…, 20)`; havuz tek dilime yığılınca 20–22 satır kalıyordu. - **Değişiklik:** kırpma dilim başına 20'yi korur; toplam 24'ün altına düşecekse eksiği, adayı kalan dilimlerden tamamlar. Dağıtım `dilimHedefiHesapla` ile aynı öncelikte (dengeli → güvenli → hayal) ve tek yardımcıda (`eksigiDagit`). 5/13/6 iskeleti ve hedef hesabı aynı. - **Kanıt (liste satırı):** a02 SAY 800 devlet sağlık 22 → 24 (1/1/22); a01 21 → 24; a11, a12, a17, b05 20 → 24. - **Not:** a11/a12/a17/b05 listesi hâlâ tamamı hayal (24/0/0). Bu B6'nın (dolmayan programlar) konusu; dokunulmadı. ### B5 — gevşeyen filtreye uyan programlar korunmuyordu - **Kök neden:** il gevşeyince havuz ilsiz, baştan kuruluyordu; seçili ildeki programlar sıraya en yakın 20'ye giremezse düşüyordu. - **Değişiklik:** `oncelikliBirlestir()` — gevşetmenin her basamağında seçime uyanlar önce alınır, boşluk sıraya en yakın diğer programlarla dolar. Kırpmadan sonra havuz yine dilim sırasında ve dilim içinde yakından uzağa dizilir (eski düzen). - **Kanıt (havuzda seçili ildeki program):** p12 Kayseri 1 → 9 (ilde alanla eşleşen 9'un 9'u), p13 Trabzon 0 → 4 (4'ün 4'ü), b06 Düzce 2 → 10 (10'un 10'u), a09 Konya 1 → 3, a05/b07 Kayseri 1 → 3. `degismez.ts`: gevşeyen 10 profilin hepsinde tam eşleşenlerin tamamı havuzda, tekrar yok, sıra bozulmamış. - **Şema:** gevşetme düğümü, 4. bölüm anlatımı ve aria-label'a "seçimine uyan programlar havuzda kalır, boşluk sıralamana en yakın diğer programlarla dolar" eklendi. - **Sınır (koddan çıkarım):** dilim başına 20 sınırı öncelikli katmana da uygulanır; seçime uyan programların 20'den fazlası aynı dilimdeyse fazlası kırpılır. Uyanlar zaten 24'ten az olduğu için ancak 21–23'ü tek dilimdeyse olur; 40 profilde görülmedi. ### B8 — özel kontenjan satırları herkesin havuzundaydı - **Kök neden:** isim süzgeci yoktu. Veride 236 satır var (208 "(KKTC Uyruklu)", 28 "(M.T.O.K.)"), 118'inin taban sırası var. - **Değişiklik:** `rapor-havuzu.ts` → export'lu `ozelKontenjanSatiriMi(isim)`; havuz girdisinin tamamına uygulanır. - **Kanıt (havuzdaki özel satır):** p02 7 → 0, p14 6 → 0, p05 4 → 0, p09 5 → 0, a07 3 → 0; 40 profilde toplam 30 → 0. - **Şema:** aday havuzu düğümü, anlatım, aria-label ve figcaption'a "yalnızca KKTC uyruklulara ya da meslek lisesi mezunlarına ayrılmış kontenjanlar havuza girmez" eklendi. ### B2 — başarı sırası barajı denetlenmiyordu - **Baraj bilgisi nerede:** `program_ozellik.min_basari_sirasi` (`scripts/program-ozellik.ts` YÖK Atlas API'sinden yazar; 21.493 satırın hepsi `yil = 2026`). Okuyanlar: `src/lib/program-ozellik.ts:133` (katalogdaki "baraj … sıra") ve `src/lib/ai/araclar.ts:536` (`tercihBaraji`). Dağılım: 50.000 (226, SAY) · 80.000 (182, SAY) · 100.000 (161 EA + 101 SAY) · 250.000 (176, SAY) · 300.000 (2.143 SAY, 214 EA, 382 SÖZ, 156 DİL). - **Değişiklik:** `db.ts` → `dilimAra`'ya `barajDisiHaric` seçeneği (varsayılan kapalı; öteki çağıranlar etkilenmez), `havuzAdaylari` bunu hep açar: `min_basari_sirasi < adayın sırası` olan program çıkar. Barajı boş program süzülmez. Sınır: baraj 50.000 ise 50.000. sıradaki aday içeride, 50.001 dışarıda. - **Kanıt (havuzdaki baraj dışı program):** a04 (52.000, tıp) 3 → 0; a06 (310.000, mühendislik) 5 → 0; p03, a05, a08, b07 1 → 0. B3'ten sonra bu sayılar büyümüştü (a06 11, p03 17, a07 24/24); B2 ile hepsi 0. - **a07 (SÖZ 310.000, devlet, Eğitim):** alandaki programların biri hariç hepsi 300.000 barajlı; alan artık gerçekten gevşiyor, liste 5/13/6. Kullanıcıya giden "seçtiğin alanlarda yeterli program yoktu" cümlesi doğru ama sebebi (baraj) söylemiyor; `rapor.ts` benim dosyam değil, öneri §5. - **Şema:** aday havuzu düğümü, anlatım, aria-label ve figcaption'a "sıralaman bir bölümün başarı sırası barajının gerisindeyse o bölüm havuza girmez" eklendi; rakam yazılmadı (yıldan yıla değişebilir). - **DOĞRULANMALI / veri işi:** kolon bazı barajlı bölümlerde boş. Tıp: 16 satır (ör. Dokuz Eylül Tıp (İngilizce), Bitlis Eren Tıp, Ankara Medipol Tıp); Hukuk: 11 satır (ör. Ankara Medipol, İbn Haldun %50). Bu satırlar baraj dışı adaya hâlâ çıkabilir. Mühendislikte 349 barajsız satırın bir kısmı meşru muafiyet olabilir (ziraat/orman/su ürünleri) — ayrım veriden yapılamadı. Baraj değerlerinin kendisi ÖSYM kılavuzuyla tek tek karşılaştırılmadı; kaynak YÖK Atlas API'sidir. ### B4 — gevşetme sırası belgede ve kodda farklıydı - **Karar var mı:** `docs/ekip/KARARLAR.md`'de "gevşet" geçen karar yok. Bu yüzden kod davranışı değiştirilmedi. - **Değişiklik:** fonksiyon yorumu, şema düğümü, 4. bölüm anlatımı ve aria-label "önce danışmana söylediklerin, sonra alan, sonra il" oldu (kodun yaptığı). - **Kanıt:** p01 (Eskişehir), p06 (İzmir), a15 (Kilis): il korunur, alan gevşer. Bu commit öncesi/sonrası 40 profilin havuzu birebir aynı. ## 3. 40 profil: önce → sonra "Önce" = `72b673b` (düzeltmeler öncesi), "sonra" = `1d970ec`. Değişmeyen hücre tek değer. | id | gevşetilen | havuz (H/D/G) | hedef | liste | alan içi | il içi | baraj dışı | özel kont. | |---|---|---|---|---|---|---|---|---| | p01 | kategori | 40 (13/7/20) | 8/7/9 | 24 | 7 → **8** | 40 | 0 | 0 | | p02 | - | 54 (20/14/20) → **53 (20/13/20)** | 5/13/6 | 24 | 54 → **53** | 54 → **53** | 0 | 7 → **0** | | p03 | kategori → **-** | 60 (20/20/20) | 5/13/6 | 24 | 8 → **60** | – | 1 → **0** | 0 | | p04 | - | 60 (20/20/20) | 5/13/6 | 24 | 60 | – | 0 | 1 → **0** | | p05 | - | 60 (20/20/20) | 5/13/6 | 24 | 60 | – | 0 | 4 → **0** | | p06 | kategori | 46 (20/6/20) | 8/6/10 | 24 | 8 | 46 | 0 | 0 | | p07 | - | 29 (12/12/5) | 7/12/5 | 24 | 29 | – | 0 | 0 | | p08 | - | 48 (17/12/19) → **60 (20/20/20)** | 5/12/7 → **5/13/6** | 24 | 48 → **60** | 48 → **60** | 0 | 0 | | p09 | kategori → **-** | 60 (20/20/20) → **57 (20/20/17)** | 5/13/6 | 24 | 4 → **57** | – | 0 | 5 → **0** | | p10 | - | 43 (16/20/7) → **51 (20/20/11)** | 5/13/6 | 24 | 43 → **51** | – | 0 | 0 | | p11 | - | 59 (20/20/19) → **60 (20/20/20)** | 5/13/6 | 24 | 59 → **60** | – | 0 | 0 | | p12 | il | 60 (20/20/20) | 5/13/6 | 24 | 60 | 1 → **9** | 0 | 0 | | p13 | il | 25 (18/7/0) → **27 (20/7/0)** | 17/7/0 | 24 | 25 → **27** | 0 → **4** | 0 | 0 | | p14 | - | 60 (20/20/20) | 5/13/6 | 24 | 60 | 60 | 0 | 6 → **0** | | p15 | - | 28 (20/7/1) | 16/7/1 | 24 | 28 | 28 | 0 | 0 | | a01 | kategori → **-** | 21 (0/1/20) → **24 (0/1/23)** | 0/1/20 → **0/1/23** | 21 → **24** | 11 → **24** | – | 0 | 0 | | a02 | - | 22 (1/1/20) → **24 (1/1/22)** | 1/1/20 → **1/1/22** | 22 → **24** | 22 → **24** | – | 0 | 0 | | a03 | - | 34 (9/5/20) | 9/5/10 | 24 | 34 | 34 | 0 | 0 | | a04 | - | 44 (16/14/14) → **60 (20/20/20)** | 5/13/6 | 24 | 44 → **60** | – | 3 → **0** | 0 | | a05 | il>kategori → **il** | 60 (20/20/20) → **52 (20/12/20)** | 5/13/6 → **5/12/7** | 24 | 5 → **52** | 1 → **3** | 1 → **0** | 0 | | a06 | - | 29 (14/7/8) → **60 (20/20/20)** | 9/7/8 → **5/13/6** | 24 | 29 → **60** | – | 5 → **0** | 0 | | a07 | kategori | 60 (20/20/20) | 5/13/6 | 24 | 0 → **1** | – | 0 | 3 → **0** | | a08 | kategori → **-** | 60 (20/20/20) | 5/13/6 | 24 | 5 → **60** | – | 1 → **0** | 1 → **0** | | a09 | il | 27 (14/5/8) → **41 (20/8/13)** | 11/5/8 → **7/8/9** | 24 | 27 → **41** | 1 → **3** | 0 | 0 | | a10 | - | 56 (20/16/20) → **55 (20/15/20)** | 5/13/6 | 24 | 56 → **55** | 56 → **55** | 0 | 2 → **0** | | a11 | - | 20 (20/0/0) → **24 (24/0/0)** | 20/0/0 → **24/0/0** | 20 → **24** | 20 → **24** | – | 0 | 0 | | a12 | - | 20 (20/0/0) → **24 (24/0/0)** | 20/0/0 → **24/0/0** | 20 → **24** | 20 → **24** | – | 0 | 0 | | a13 | - | 57 (19/18/20) → **60 (20/20/20)** | 5/13/6 | 24 | 57 → **60** | – | 0 | 0 | | a14 | - | 60 (20/20/20) | 5/13/6 | 24 | 60 | 60 | 0 | 0 | | a15 | kategori | 24 (4/5/15) | 4/5/15 | 24 | 5 | 24 | 0 | 0 | | a16 | kategori → **-** | 60 (20/20/20) → **33 (8/5/20)** | 5/13/6 → **8/5/11** | 24 | 1 → **33** | – | 0 | 0 | | a17 | - | 20 (20/0/0) → **24 (24/0/0)** | 20/0/0 → **24/0/0** | 20 → **24** | 20 → **24** | 20 → **24** | 0 | 1 → **0** | | b01 | - | 60 (20/20/20) | 5/13/6 | 24 | 60 | – | 0 | 0 | | b02 | - | 60 (20/20/20) | 5/13/6 | 24 | 60 | 60 | 0 | 0 | | b03 | profil | 60 (20/20/20) | 5/13/6 | 24 | 60 | – | 0 | 0 | | b04 | - | 25 (20/2/3) | 19/2/3 | 24 | 25 | 25 | 0 | 0 | | b05 | - | 20 (20/0/0) → **24 (24/0/0)** | 20/0/0 → **24/0/0** | 20 → **24** | 20 → **24** | 20 → **24** | 0 | 0 | | b06 | profil>il | 60 (20/20/20) | 5/13/6 | 24 | 60 | 2 → **10** | 0 | 0 | | b07 | profil>il>kategori → **profil>il** | 60 (20/20/20) → **52 (20/12/20)** | 5/13/6 → **5/12/7** | 24 | 5 → **52** | 1 → **3** | 1 → **0** | 0 | | b08 | - | 60 (20/20/20) | 5/13/6 | 24 | 60 | 60 | 0 | 0 | **Gerileme denetimi.** Listesi kısalan profil yok. Havuzu küçülen altı profil ve nedeni: - p02 (54 → 53), a10 (56 → 55): özel kontenjan satırları çıktı (B8); kalanların hepsi seçime uyuyor. - p09 (60 → 57): eskiden alan gevşemiş 60 programın 4'ü mühendislikti; şimdi 57'nin 57'si mühendislik. - a16 (60 → 33): eskiden 60'ın 1'i turizmdi; şimdi 33'ün 33'ü turizm. Dengeli dilimde 5 turizm programı olduğu için hedef 5/13/6 yerine 8/5/11. - a05, b07 (60 → 52): alan artık gevşemiyor; 52'nin 52'si hukuk/siyasal. Dengeli dilimde 12 program olduğu için hedef 5/12/7. ### `beklenen` değeri değişen profiller (eval mühendisine) `havuzGevsetmeBasamagi` · `minAday` · `hedef`; yalnız değişen alanlar. | id | havuzGevsetmeBasamagi | minAday | hedef | |---|---|---|---| | p02 | – | 54 → 53 | – | | p03 | ["kategori"] → [] | – | – | | p08 | – | 48 → 60 | 5/12/7 → 5/13/6 | | p09 | ["kategori"] → [] | 60 → 57 | – | | p10 | – | 43 → 51 | – | | p11 | – | 59 → 60 | – | | p13 | – | 25 → 27 | – | | a01 | ["kategori"] → [] | 21 → 24 | 0/1/20 → 0/1/23 | | a02 | – | 22 → 24 | 1/1/20 → 1/1/22 | | a04 | – | 44 → 60 | – | | a05 | ["il","kategori"] → ["il"] | 60 → 52 | 5/13/6 → 5/12/7 | | a06 | – | 29 → 60 | 9/7/8 → 5/13/6 | | a08 | ["kategori"] → [] | – | – | | a09 | – | 27 → 41 | 11/5/8 → 7/8/9 | | a10 | – | 56 → 55 | – | | a11 | – | 20 → 24 | 20/0/0 → 24/0/0 | | a12 | – | 20 → 24 | 20/0/0 → 24/0/0 | | a13 | – | 57 → 60 | – | | a16 | ["kategori"] → [] | 60 → 33 | 5/13/6 → 8/5/11 | | a17 | – | 20 → 24 | 20/0/0 → 24/0/0 | | b05 | – | 20 → 24 | 20/0/0 → 24/0/0 | | b07 | ["profil","il","kategori"] → ["profil","il"] | 60 → 52 | 5/13/6 → 5/12/7 | Ayrıca `senaryoEtiketleri` ve `supheli` alanları eskidi: "liste-24-alti" artık hiçbir profilde yok; "gevsetme-kategori" p03, p09, a01, a08, a16'da, "gevsetme-il-kategori" a05'te, "gevsetme-profil-il-kategori" b07'de geçersiz; "ozel-kontenjan-satiri" ve "baraj-disi" profillerinde havuzda artık o satırlar yok. a07'de etiket aynı ("gevsetme-kategori") ama sebep değişti (baraj). `minAday` yorumundaki "dilim başına 20'ye kırpılmış" ifadesi de artık tam doğru değil (tek dilime yığılan havuz 24'e tamamlanır). ## 4. Doğrulama - `pnpm exec next typegen` ✔ · `pnpm lint` ✔ (eslint temiz; tasarım denetimi 0 hata, 12 uyarı — hepsi `meraklisina-demo.tsx`'te, bu işten önce de vardı). - `pnpm exec tsc --noEmit`: 3 hata, hepsi `scripts/eval/sohbet.ts` (eval mühendisinin commit'lenmemiş dosyası; satır 320, 329). Benim dosyalarımda hata yok. - `pnpm build` alınmadı (görev gereği). - `/meraklisina` şeması tarayıcıda açılmadı. **Koddan çıkarım:** değişiklik yalnız düğüm metinleri; yeni düğüm, kenar ya da sınıf yok, metinlerde noktalı virgül/çift tırnak yok. Aday havuzu düğümü dört satıra çıktı; 375 px'te okunurluğu gözle bakılmalı. ## 5. Şartnameden sapmalar ve başkasının dosyası için öneriler Sapmalar: - B5 yalnız il için istendi; aynı yardımcı alan ve danışman profili gevşediğinde de uyanları öne alıyor (aynı kök neden, tek kod yolu). - `dilimAra`'ya `barajDisiHaric` seçeneği eklendi (havuz sorgusunun parçası; varsayılan kapalı). Dokunmadığım dosyalar için öneriler: - `src/lib/ai/araclar.ts` (`program_ara`): `ozelKontenjanSatiriMi` ve baraj süzgeci burada da uygulanmalı; bugün danışman, listenin önermediği baraj dışı/özel kontenjan satırını "Dengeli" diye sayabiliyor. - `src/lib/ai/rapor.ts:268-272`: alan baraj yüzünden gevşediyse (a07) not bunu söylemeli. - `rankWindowFacets` (sihirbaz sayıları) ve `/sonuc` ücretsiz tablosu (`siraylaProgramAra`) baraj dışı ve özel kontenjan satırlarını hâlâ sayıyor/gösteriyor. Sihirbaz "24+" deyip havuzun gevşediği durum bu yüzden hâlâ mümkün (taramada 1/308). - B12 (`route.ts` "kalan 21 tercih"): liste artık 40 profilin hepsinde 24, sabit büyük ölçüde doğru çıkıyor; yine de gerçek uzunluktan türetilmeli. - Dokunulmayanlar (görev gereği): B6, B7, B9, B10–B16. ## 6. Merge sonrası doğrulanması gerekenler - `/meraklisina` şemasının çizimi (375 / 1280 px): aday havuzu ve gevşetme düğümleri uzadı. - Gerçek modelle bir liste üretimi: 24/0/0 (tamamı hayal) havuzda ve il gevşemiş havuzda (p12) modelin hedefi tutturduğu. - Eval `beklenen` güncellemesi sonrası 40/40 eşleşme. ## Bilal'den istenen 1. **[BİLAL] Gevşetme sırası hangisi olmalı: önce alan mı (bugünkü kod), önce il mi (eski anlatım)?** Örnek p01: Eskişehir + tıp isteyen adaya bugün Eskişehir korunup 8 sağlık + 32 başka alan veriliyor; Türkiye genelinde aynı alanda 615 program var. Tek cümlelik karar (5 dk). 2. **[BİLAL] M.T.O.K. kontenjanları herkesten gizlendi; meslek lisesi mezunu aday (p15 Deniz) bunları yazabilir.** Sihirbaza "meslek lisesi mezunuyum" sorusu eklensin mi, yoksa böyle kalsın mı (3 dk). 3. **[BİLAL]/veri işi: baraj kolonundaki boşluklar** (16 tıp, 11 hukuk satırı; mühendislikte muafiyet/eksik ayrımı) veri mühendisine verilsin mi; baraj değerleri 2027 kılavuzu çıkınca yeniden çekilmeli (2 dk).