- ilAdiNormalize harf katlayarak eşler: IZMIR / izmir / İzmir → İZMİR (program_ara,
il_ozeti, profil evIl). il_ozeti "Afyon"u da bulur.
- program_ara bölüm ve üniversite aramasını katlanmış adla yapar ("isletme",
"bogazici", "ODTÜ"); LIKE jokerleri (%/_) artık her şeyi eşlemez.
- Tek harf / boş girdi ilk kaydı (Abaza Dili, Abdullah Gül) döndürmez; "en az 3
harf" hatası döner.
- Kısaltma tablosunda bozuk satır: dtu → deu (Dokuz Eylül).
- Akış hata logu tam hata nesnesi yerine mesajı basar; cagri.ts kullanılmayan import.
- (8'in devamı) dil seçenekleri veride olan dillerle eşitlendi; doğrulama
"Almanca" süzgecini reddetmesin.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- sayiParse: birim eki (km, TL) sayının parçası değil; "300 km" artık 300.000 değil 300.
- aracCalistirici argümanı ARACLAR şemasına göre denetler (bilinmeyen alan, yanlış
tip, geçersiz seçenek, alt sınır, eksik zorunlu alan) ve modele hangi alanın neden
reddedildiğini söyler; geçersiz dilim / negatif ucret_ust sessizce süzmez.
- Şema, gövdelerin zaten kabul ettiğini söyler: program id'si ve profil değeri sayı
da olabilir; ucret_ust en az 1.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sunucu, istemci kopsa da cevabı üretip kaydeder ve kredi harcanmış kalır
(bilerek: kopmada iade, cevabı okuyup bağlantıyı kesene bedava cevap olurdu).
İstemci metni buna göre düzeltildi; görsel değişiklik yok.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
SDK akış ortası abort'u hata fırlatmadan "abort" parçasıyla bitiriyordu;
döngü bunu tamamlanma sayıp yarım metni kaydediyor, krediyi iade etmiyordu.
Döngüden sonra sinyale bakılır: kesildiyse onYarim (iade + yarım kayıt) çalışır,
istemciye hata parçası gider. Süre zamanAsimiMs ile verilebilir (varsayılan 120 sn).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Cevapsız kalmış (iade edilmiş) sorular art arda user mesajı olarak, sayıyla
kesilen pencere de danışman mesajıyla başlayarak gidiyordu. modelPenceresi
baştaki danışman mesajlarını atar, art arda aynı rolü tek mesajda birleştirir.
Pencere sorgusuna rowid sıralaması eklendi (created_at saniye çözünürlüklü).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
sohbetGecmisiGetir yeniden eskiye sıralayıp 100 alır, sonra çevirir; aynı
saniyedeki soru-cevap sırası rowid ile korunur. GET /api/soru da aynı
sorguyu kullanır (iki kopya vardı).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
profilAlanYaz oku → değiştir → yaz yerine tek SQL ifadesiyle yazar
(json_set / json_remove); eşzamanlı iki alan yazımı artık ikisini de tutar.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Metin ve davranış aynı; yeni yol src/lib/ai/danisman-prompt.ts
(sistemPromptu, PROFIL_ONAY_SOR). Route dosyasından dışa aktarım
Next'te yapılamadığı için ayrı dosya.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Sunucu: elle yazılmış araç döngüsü yerine streamText + UI mesaj akışı
(src/lib/ai/sohbet-akisi.ts). Kredi düşme/iade, bedelsiz profil onayı,
mesaj kaydı ve Jev çıktı denetimi aynı davranışla korunur.
- İstemci: sohbet-client useChat kullanır; araç çalışırken balonun altında
durum satırı görünür. Kayıtlı geçmiş düz metin kalır.
- Sağlayıcı aynı tek kapı (AI_BASE_URL / AI_API_KEY), openai-compatible.
- Yeni araçlar: bolum_ozeti, il_ozeti, rehber_ara, tercih_takvimi.
- Kalkan davranış: sağlayıcı araç çağrısını reddedince düz sohbete düşme.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Danışman: program_netleri, program_karsilastir ve bolum_istihdam araçları;
program_ara'ya devlet/vakıf, öğretim türü ve sıralama parametreleri;
program_detay'a trend cümlesi; bozuk araç argümanı modele hata döner.
- TÜİK Yükseköğretim İstihdam Göstergeleri 2025: bölüm bazında istihdam
oranı, ilk işi bulma süresi ve kazanç grubu (src/lib/bolum-istihdam.ts,
üretici scripts/tuik-istihdam-uret.py, kaynak Excel'ler data/kaynak/).
- Bölüm sayfasında "Mezun istihdamı" ayrıntı satırı ve alt sayfası;
AkademikAyrinti başlık/ikon alır.
- Jev (TypeSafe AI) ile danışman cevabında garanti/olasılık dili denetimi;
ihlalde cevabın sonuna düzeltme notu. Anahtar yoksa denetim atlanır.
- /gizlilik: TypeSafe AI (ABD) sağlayıcı satırı. KARARLAR.md: 5 Ekim kaydı.
- Üç katalog dosyasındaki bg-white → bg-card değişiklikleri de bu commit'te.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Kareler önce logonun üç karesi gibi belirir, sonra yerlerine büyür;
içerik satır satır netleşir. Hareketi azalt'ta yalnız kısa belirme.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Footer: "Rabbi'şrah lî sadrî ve yessir lî emrî" (Tâhâ 25–26) Arapça +
Diyanet İşleri meali; Arapça Amiri Quran ile (önceden yüklenmez, ~45 KB).
Altında PixelMark'lı kaynak satırı.
- Konsol: ConsoleAsr artık kök layout'ta. Logodaki renklerle dot-matrix kum
saati, Asr Sûresi (Diyanet mushafı + Diyanet meali, kaynakla bayt bayt
aynı), İmam Şâfiî'nin sûfîlerden aktardığı vakit sözü, /meraklisina linki.
Tarayıcı boşa çıkınca bir kez basar.
- DESIGN.md §3: Arapça yazı tipinin tek işi (yalnız Kur'an metni) yazıldı.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Bilal kararı (26 Eyl 2026): 'kaydedeyim mi?' sorusuna kısa evet/hayır
cevabı bedelsiz. Sunucu son danışman mesajında onay ibaresini arar,
mesaj ≤40 karakter ve evet/hayır kalıbıyla başlıyorsa kredi düşmez,
ledger'a yazılmaz, iade yolu atlanır; X-Kredi-Dusuldu başlığıyla istemci
bakiyeyi buna göre günceller. Gerçek soru içeren 'evet ama …' bedava geçmez.
- Bilal kararı: model Türkiye'de barındırılacak. client.ts baseURL ve
anahtar AI_BASE_URL/AI_API_KEY'den okunur (OPENROUTER_* geriye uyumlu);
sağlayıcı değişince kod değil .env değişir, /gizlilik aynı commit'te.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- db.ts OzellikSuzgeci (dil, yalnız örgün, yalnız burslu, ücret üst sınırı)
program_ozellik alt sorgusuyla; tablo yoksa süzgeç yok.
- rapor-havuzu: profilSuzgeci (ev ili + km → il listesi; sihirbazda il
seçiliyse km uygulanmaz); havuz 24'ün altına düşerse gevşetme sırası
profil → il → kategori. rapor.ts prompt'a 'danışmana söylediği tercihler'
ve profil gevşetme notu; rapor-actions profili okuyup geçirir.
- /meraklisina şeması (huni-semasi SEMA + aria-label + figcaption) ve 4.
bölüm metni yeni adım ve gevşetme sırasıyla eşitlendi (AGENTS.md kuralı).
- /api/soru: profil kaydı öncesi 'kaydedeyim mi?' onayı (PROFIL_ONAY_SOR).
- Gizlilik metni kodla eşitlendi: OpenRouter→DeepSeek (Anthropic değil),
profil satırı, amaç+hukuki sebep, saklama süreleri, md. 11 hakları,
18 yaş altı notu; unvan/adres ve aktarım dayanağı TODO. Giriş kartı:
koşullar 'kabul', gizlilik 'okudum'. Sohbet girişine kişisel bilgi uyarısı.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Üniversite sayfasındaki 'Örgün öğrenci' karesine '%54 kadın · %46 erkek'
satırı eklendi; kaynak notu üniversite düzeyi olduğunu ve bölüm bazında
veri olmadığını söyler. Filtre ya da öncelik değil, bilgi satırı.
Üretim betiği E/K sütunlarını okur; kadinYuzdesi() yardımcı eklendi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Telefonda dik kutu haritadan uzun olunca ülke haritasının altı kesiliyor,
şehir işareti metnin arkasına kayıyordu (Lefkoşa, 375 px). Kutu haritadan
küçükse harita içinde kalır, büyükse harita kutunun içinde kalır.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sitedeki SSS ve /kosullar ifadelerinin toplamı, yeni vaat yok; yapay zekâ
cevap motorları gövde metnini önceliklediği için tanım meta'dan gövdeye de
taşındı. Rybbit AI referrer başlangıç değeri yayın kuyruğu tablosuna yazıldı.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
İki kök neden: rakamlı başlıklarda karışık flex span satır kaydıramıyordu
(başlık artık kelime kelime kutulanıyor); Satori aynı aile adıyla kaydedilen
latin/latin-ext dosyalarından yalnızca birini kullanıyordu (ext alt-kümeleri
'<ad> Ext' adıyla kayıtlı, şablonlar OG_AILE virgüllü aile listesini veriyor).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- /universiteler/devlet ve /universiteler/vakif: şehir sayfası iskeleti,
haritada bu türden üniversitesi olan her il turuncu (yakınlaşma yok), üç
özet kartı, şehir çipleri (sayfa içi çapa), şehir şehir §4.15 satırları,
öteki türe geçiş hapı; metadata + sitemap.
- TurCipi tek kaynak: devlet/vakıf çipi tür sayfasına link (sonuç, listem,
tadımlık, bölüm, şehir/tür satırları); üniversite sayfası tür hapı ve
/universiteler başlıkları da link. UniSatirlari ortak dosyada: ad, tür ve
il ayrı linkler.
- Kompakt profilli satır (DESIGN.md §10.9): iri kupa kutusu + text-3xl/4xl
sıra, text-xl/2xl başlık, 48 px buton; telefonda alt alta, lg'de tek satır.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- UniSatirlari: kenarlıklı liste, satırın tamamı üniversite sayfasına link,
SATIR_AD_DUZ ad (hover mavi, §2.1 istisnası), SATIR_META içinde tür çipi +
program sayısı (+ ana il farklıysa il), sağda kayan ok, active:scale-[0.99].
İki sütunlu kompakt UniLinkleri /universiteler dizininde kaldı.
- DESIGN.md §4.17 güncellendi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Özet ızgarası relative isolate; konum haritası absolute katman (-inset-x-4
-inset-y-8) olarak ızgaranın tamamını kaplar, üçüncü sütun yalnız yer tutar.
lg'de sağdan sola, telefonda üst satırdan aşağı uzun rampalı mask.
- Yakınlaşma ease-out yerine spring bounce 0 (0,6 s gecikme, 1,6 s): sert
başlangıç gitti. Şehir yüzeyi mask'ları da uzatıldı.
- DESIGN.md §4.17 güncellendi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Izgara 72 → 56 sütun, serpinti kaldırıldı (Bilal: "piksel detaylarını azalt").
- Harita `doldur` (slice) ile SehirYuzeyi kartını kaplar, metin üstünde; iki
katlı mask ile hiçbir kenarda kesik kare kalmaz (Bilal: "canvas net bir
şekilde kesiliyor"). Telefonda altta, lg'de sağ yarıda belirir.
- Yakınlaşma kutusu kabın oranında kurulur, il `odakHiza` ile kabın istenen
noktasına gelir (şehir sayfası: lg sağ orta, telefon alt orta; konum kartı orta).
- usePixelHeat meet/slice + ortalama ofsetini hesaba katar.
- Üniversite konum kartı: kartı doldurur, radyal erime.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- viewBox 0,7 s gecikmeyle 1,1 s güçlü ease-out ile ilin çevresindeki kutuya
kayar (en çok 2,4 kat; ülke haritasında şehir işaretine 1,8 kat); kutu SVG
oranında ve harita dışına taşmaz. Hareketi azalt: doğrudan odak.
- usePixelHeat viewBox'ı her taramada canlı okur; yakınlaşmış haritada da
imleç doğru kareyi ısıtır (hero davranışı değişmez).
- DESIGN.md §4.17 yakınlaşma notu.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- scripts/il-izgara-uret.ts → src/lib/il-izgara-verisi.ts: 81 il ve 7 ülke
kontürü hero'nun dot-matrix ızgarasına (72×31) rasterize; küçük iller 2×2 garanti.
- SehirPikselHaritasi: iri kareler, altı opaklık, kıyı serpintisi, usePixelHeat
ısı fırçası; bulunulan il iri turuncu karelerle sırayla belirir (kt-piksel-belir)
ve nabız atar; KKTC/yurt dışında şehir merkezinde 2×2 iri kare.
- Şehir sayfası başlığı beyaz piksel dokulu yüzeyde (SehirYuzeyi), harita sağda/altta.
- UniversiteKonumHaritasi düz SVG yerine aynı piksel haritayı kullanır.
- DESIGN.md §4.12/§4.17/§10.8 güncellendi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>