Files
kolaytercih/docs/gece-vardiyasi/2026-09-26/00-gece-raporu.md

80 lines
9.5 KiB
Markdown
Raw 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.
# 25→26 Eylül gecesi: kişiselleştirme v1 + v2
> Bilal'in "founder ve ürünün en yetkilisi olarak çalış, sabah okuyacağım" talimatıyla. Sesli özet: `~/Desktop/kolaytercih-gece-raporu-2026-09-26.m4a` (Yelda sesi, ~4 dk).
## Özet (5 madde)
1. **v1 (main) bitti:** üniversite sayfasındaki "Örgün öğrenci" karesine "%44 kadın · %56 erkek" satırı geldi (YÖK İstatistik 2025-26, örgün ön lisans+lisans, üniversite geneli). Commit `05402f9`. Push edilmedi.
2. **v2 dalı açıldı ve dört commit'le doldu** (`../kolaytercih-v2` worktree'si): YÖK Atlas'ın atıp saklamadığımız alanları DB'ye alındı (ücret, burs, dil, öğretim türü, akreditasyon, kadro, baraj, ilçe, 194 koşul metni; 21.493 program); danışmana dört araç geldi (program ara, program detay, üniversite künyesi, profil kaydet); kapalı listeli profil "Kaydettiklerim" çipleriyle görünür ve silinebilir; bir sonraki liste bu profille süzülür. `pnpm build` v2'de temiz geçti.
3. **Hukuk araştırması sürpriz çıkardı:** gizlilik metni "Anthropic" diyor, kod OpenRouter → DeepSeek kullanıyor (Çin'de saklama). Bu tek başına aydınlatma ihlali. Daha önemlisi: sürekli sohbet aktarımı için "açık rıza" yolu 2024'ten beri kapalı; ya Türkiye'de model ya Kurul standart sözleşmesi gerekiyor. v2'de metin koda eşitlendi; dayanak kararı sende.
4. **Denenemeyen tek şey:** gerçek modelle araç çağrısı. Yerelde OpenRouter anahtarı yok; araç gövdeleri ve döngü sahte istemciyle test edildi, DeepSeek'in araç çağrısını gerçekten nasıl yürüttüğü canlıda ilk soruda görülecek. Reddederse kod düz sohbete düşüyor, kullanıcı hata görmüyor.
5. **Bilal'den istenen (aşağıda 3 madde):** v2'yi inceleyip merge kararı; sağlayıcı/aktarım kararı; profil onay sorusunun bedeli.
## 1. Ne yapıldı, nerede
### main (3 commit, push edilmedi)
| Commit | İş |
|---|---|
| `05402f9` | Kadın/erkek oranı üniversite sayfasında; `scripts/yok-istatistik-uret.py` E/K sütunlarını okur, `kadinYuzdesi()` yardımcısı |
| `f5e8e4f`, `ddf3505` | Araştırma belgesi (`docs/arastirma/2026-09-25-kisisellestirme/README.md`) + hukuk ve rakip araştırması (`hukuk-ve-rakipler.md`, 31 kaynak, 22 rakip adresi) |
| `da554c5` | KARARLAR.md: gecenin kararları |
### v2 (dal `v2`, 4 commit, worktree `/Users/bilalgursen/Desktop/kolaytercih-v2`)
| Commit | İş |
|---|---|
| `c23910c` | **Dalga 1 — veri.** `pnpm ozellik --yil 2026 --db …` betiği (`scripts/program-ozellik.ts`) API'den `program_ozellik` + `kosul` tablolarını doldurur; ham döküm `data/ham/` (gitignore). `src/lib/program-ozellik.ts` okuyucu. DB commit'te (yokatlas.db 17→21 MB). |
| `aa20517` | **Dalga 2 — araçlar + profil.** `src/lib/ai/araclar.ts` (4 araç), `cagri.ts` `sohbetAkisiAraclarla` (stream'de tool_calls biriktirme, en fazla 4 tur, sağlayıcı reddederse düz sohbet), `danisman-profil.ts` (kapalı liste, zod), drizzle `0005` `danisman_profil` tablosu, `/api/soru/profil` GET+DELETE, sohbet başlığında çipler, analitiğe yalnız alan adı. |
| `5a04db7` | **Havuz + KVKK metni.** Profil havuzu süzer (dil, örgün, burs, ücret, ev ili + km); havuz 24'ün altına düşerse gevşetme sırası profil → il → kategori; `/meraklisina` şeması ve metni aynı commit'te eşitlendi (AGENTS.md kuralı). Gizlilik metni yeniden yazıldı, giriş kartı "okudum/kabul" ayrımı, sohbet girişine "kişisel bilgi yazma" uyarısı. |
### Öğrenci gözüyle ne değişti (v2)
Öğrenci danışmana "İzmir'de kalmak istiyorum, vakıfta 400 bin üstü olmaz, İngilizce olsun" yazar. Danışman sorar: "Bunu profiline kaydedeyim mi?" Evet derse üç çip belirir: *Yaşadığı il: İzmir*, *Yıllık ücret en fazla 400.000 TL*, *Öğretim dili: İngilizce*. Sonra "Ege'de bilgisayar mühendisliği kaç sırayla alıyor?" diye sorunca danışman uydurmaz, `program_ara` ile DB'den okur ve profildeki süzgeçleri kendiliğinden uygular; sonuç sıfırsa profilsiz tekrar deneyip "profilinin dışında şunlar var" der. Listeyi yeniden ürettiğinde havuz bu üç tercihle süzülür; havuz dar kalırsa önce profil gevşetilir ve yapay zekâ uyarılarda bunu söyler. Çipteki çarpı alanı siler; bir sonraki liste onsuz kurulur.
## 2. Doğrulama (çalıştırıldı)
- `pnpm exec tsc --noEmit` ve `pnpm lint` (eslint + tasarım denetimi): main ve v2'de temiz; tasarım denetimi 0 hata, 12 eski uyarı (meraklisina-demo, bu geceyle ilgisiz).
- `pnpm build` v2'de: çıkış kodu 0, 1.935 statik sayfa. `.next` silindi (disk).
- Araç gövdeleri gerçek DB'de koştu: `program_ara` (profil: Ankara 300 km, İngilizce, ≤600 bin → 29 eşleşme, 8 gösterilen; Eskişehir Teknik 53.950 dengeli), `program_detay` (MÜDEK, kadro 2/2/10/10, baraj 300.000, evden 200 km, koşul metinleri), `universite_profili` (ODTÜ: URAP 3/198, 30.055 öğrenci, hoca başına 40, %40 kadın; Boğaziçi %44 kadın), bilinmeyen alan reddi ("din" → hata).
- Araç döngüsü sahte istemciyle: parçalı gelen iki tool_call birleşti, ikisi de çalıştı, ikinci turda mesaj sırası `system, user, assistant(tool_calls), tool, tool` doğru.
- Havuz: profilsiz 60 program; İzmir 250 km + İngilizce + ≤400 bin → 58 program, 6 il; Kars 60 km + burslu + İngilizce → dar, profil gevşetildi; sihirbazda Ankara seçiliyken km uygulanmadı (tasarım gereği).
- **Koddan çıkarım (çalıştırılmadı):** gerçek DeepSeek araç çağrısı; tarayıcıda çip görünümü (AGENTS.md: tarayıcı açma); `danisman_profil` göçü konteyner açılışında `db-goc.mjs` ile uygulanır (mevcut 0000-0004 ile aynı yol).
## 3. Hukuk: ne bulundu, ne yapıldı, ne bekliyor
Tam belge: `docs/arastirma/2026-09-25-kisisellestirme/hukuk-ve-rakipler.md` (A resmî durum, B rakip tablosu, C 24 maddelik sıralı liste).
**Bulgular (kısa):**
- Gizlilik metni kodla çelişiyordu (Anthropic ≠ OpenRouter/DeepSeek). 2026 cezası 85 bin–1,7 milyon TL aralığında. **v2'de düzeltildi.**
- Sürekli aktarım için açık rıza yolu kapalı (KVKK md. 9/6, Ocak 2025 rehberi). Seçenek: Türkiye'de model **ya da** Kurul standart sözleşmesi + 5 iş günü içinde bildirim. OpenRouter/DeepSeek'in bunu imzalaması belirsiz. Resend (İrlanda) için de aynı soru. **Karar sende + avukat.**
- Profil için açık rıza şart görünmüyor; Kurul rehberi kişiselleştirmeyi ayrı faaliyet sayıyor, önerilen kurgu "kaydedeyim mi?" onayı. **v2'de uygulandı** (`PROFIL_ONAY_SOR`); bedeli: "evet" bir kredi.
- VERBİS: <50 çalışan ve <100 milyon TL bilanço → muaf (büyük olasılıkla biz). VERBİS-dışı veri sorumlusu, şartı kalkan veriyi 3 ay içinde imha etmeli → **imha betiği yazılmadı**, süreler avukat onayı bekliyor.
- 18 yaş altı: ayrı madde yok; veliyle okuma notu ve "ödemeyi velin yapmalı" **metne eklendi**; 17 yaşındakine ücretli paket satışı avukata.
- Cinsiyet özel nitelikli değil; sağlık/engel öyle → sormuyoruz. Giriş/ödeme e-postası işlem iletisidir, İYS gerekmez; içine kampanya cümlesi eklenmez.
- Rakipler: çoğu (YÖK Atlas'ın resmî robotu dâhil) aydınlatma koymuyor; yurt dışı aktarımı standart sözleşmeyle açıklayan tek örnek Doping Hafıza.
**Gizlilik metninde açık bırakılanlar (kodda TODO):** veri sorumlusu unvanı ve adresi; yurt dışı aktarımın hukuki dayanağı cümlesi; saklama süresi sayıları (yazdım: sohbet+profil 12 ay, hesap silme 30 gün, imha 3 ay, fatura 10 yıl — avukat onaylamalı).
## 4. Bilinen sınırlar ve riskler
- **Model desteği:** OpenRouter üzerinden DeepSeek'in stream'de tool_calls üretmesi varsayımı. Üretmezse ya da 400 dönerse kod düz sohbete düşer; ilk canlı soruda `[soru] araç:` log satırına bak.
- **Onay sorusu maliyeti:** "kaydedeyim mi? → evet" akışı öğrenciye bir kredi yazar. Alternatifler: (a) onay mesajını ücretsiz say, (b) `PROFIL_ONAY_SOR=false` ile doğrudan kaydet ve çipteki çarpıya güven (avukat "gri alan" dedi), (c) cevabın altında "Kaydet" düğmesi (ek iş, ~yarım gün).
- **Sohbet bütçesi:** araç sonuçları JSON olarak geçmişe giriyor; bir soruda en fazla 2-3 araç isteniyor, `max_tokens` 1024 aynı kaldı. Uzun koşul metinleri 240 karaktere kırpılıyor.
- **Ham döküm tarihi:** `data/ham/ozellik-2026-2026-09-24.jsonl.gz` UTC tarihiyle adlandı (gerçek çekim 25 Eyl gece). Kozmetik.
- **app.db:** ana checkout'ta `data/app.db` senin değiştirdiğin hâliyle duruyor, dokunmadım; v2'de de değişmedi (göç deploy'da uygulanır).
- **DGS/yatay geçiş:** kod yazılmadı (karar: ayrı sayfa, sonraki dalga).
## 5. Sıradaki adımlar (öneri)
1. v2'yi merge etmeden önce: canlıda ya da anahtarlı bir ortamda danışmana üç soru sor (biri tercih cümlesi içeren), araç loglarını ve çipleri gör.
2. Dalga 3: öncelik çiplerini veriye bağlama ("İş bulma", "Yüksek maaş" kalkar; "Akreditasyonlu", "Evden yakın" eklenir), uyum puanı ve satır başına "neden bu program" cümlesi.
3. Ek Madde-1 sayfası (veri DB'de, SEO değeri var); DGS Tablo-2 ayrı tur.
4. İmha betiği (sohbet/profil 12 ay) — süreler onaylanınca.
## Bilal'den istenen
1. **v2 dalını incele, merge/push kararı ver** — `git log main..v2` dört commit; okuma ~30 dk, canlı araç testi ~10 dk.
2. **Yurt dışı aktarım kararı:** Türkiye'de model mi, OpenRouter/DeepSeek ile standart sözleşme mi (avukata tek soru); kararla birlikte gizlilik metnindeki iki TODO'yu (unvan/adres, dayanak cümlesi) doldur — ~1 saat + avukat.
3. **Profil onay sorusu:** "evet"in bir krediye mal olması kabul mü, yoksa (a)/(b)/(c) seçeneklerinden biri mi — tek cümlelik karar, ~2 dk.