9–10 Ekim oturumlarının commit'lenmemiş işi tek parça alındı
(raporlar: docs/ekip-raporlari/2026-10-09, 2026-10-10):
- Landing deneyim dili 1. dalga: sayfa geçişi (ViewTransition), piksel morf/şerit,
sorun sahneleri, adım akışı, sayan sayı, mobil menü, adım göstergesi, logoya tepki;
DESIGN.md §11 ve AGENTS.md kuralları, tasarım denetimine yeni kurallar
- Tema: tema ikonu, D kısayolu, tema geçişi
- PWA: manifest.ts ve ikonlar
- Danışman: revizyon niyet modeli (OPENROUTER_NIYET_MODEL), sohbet geçmişi, soru API'si
- /listem ve /sonuc tadımlığı bileşen denetimi düzeltmeleri
- eslint: .venv-tts/ yok sayılır
tsc, eslint ve tasarım denetimi sıfır hata.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Revizyon sohbet modelinin gönüllü liste_revize araç seçimine bağlıydı
(8 Eki eval: 8 istekte 5 çağrı, 3 sahte beyan; tool_choice required
OpenRouter'da 80-112 sn). Şimdi:
- Niyet kodda: revizyonNiyetiVar (regex) + paketli → lib/ai/revizyon-niyeti.ts
yapılandırılmış çıkarım (yapilandirilmisUret, json_schema; eski liste_revize
parametre şeması ve revizyonKuraliKur aynen yeniden kullanılır, kopya yok).
Model niyetModeli() (OPENROUTER_NIYET_MODEL, yoksa rapor modeli), 20 sn,
OpenInference bu çağrıda atlanır (11-12,5 sn ölçüldü).
- Dallanma kodda: kural geçerli → listeRevizeKoddan (paket/kilit/kredi kapıları
aynı); kural eksik → soru formu koddan (modelin formu kod doğrular, yoksa
varsayılan form); niyet soru/diger → normal sohbet; çıkarım başarısız →
koddan "okuyamadım" cevabı + kredi iadesi (normal sohbete düşünce model
uydurma adlarla "kurdum" yazıyordu).
- Cevap da kodda: revizyon/form turunda model hiç çağrılmaz; sayı ve program
adları sunucu sonucundan şablonla (sabitCevap). Model sonuç önündeyken
dağılımı 8'de 2 yanlış yazdı. Ekrana eski araç parçaları (tool-liste_revize /
tool-soru_sor) aynen gider; istemci ve kayıt değişmez. Başarısız revizyon
artık ekranda "kuramadım" hapı (output-error).
- liste_revize modelin araç listesinden çıktı; prompt revizyon bölümü
"kurdum deme, net istek iste ya da soru_sor" diye sadeleşti.
- Güvenlik ağı: beyan regex'i kaldı; beyan var + revizyon yok → not + mesajın
sohbet kredisi iade (grantCredits refund, refId=mesajId, idempotent), not
bunu söyler. liste-revizyon iade refId'si "<mesajId>:revizyon" oldu:
(reason, refId) tekilliği sohbet iadesiyle çakışıyordu.
- Geçmiş penceresi: "[Araç kaydı: …]" etiketi modelce kopyalanıyordu;
yerine doğal tek cümle.
- Kaldırıldı: ilkAdimAracZorunlu / SOHBET_REVIZYON_ARAC_ZORUNLU.
Ölçüm (deepseek-v4-flash @ openrouter, pnpm eval:revizyon): koddan revizyon
8/8, kural doğru 8/8, sahte beyan 0, 10/10; revizyon turu 1 küçük çağrı
(ort. 1-3 sn, 0,00005 $) + liste üretimi; sohbet çağrısı yok.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Kök neden (B1): chat_messages yalnız metin tutar; başarılı revizyonun kaydı
("revize ediyorum… Liste yenilendi… 1-5") araçsız cevapla aynı görünüyordu ve
model sonraki turda bu kalıbı taklit edip liste_revize çağırmadan "yenilendi"
yazıyor, program adlarını eski cevaptan kopyalıyordu (eval: 8 revizyon
isteğinde 1 çağrı, 5 sahte beyan). Metnin altına "[araç çağrıldı]" işareti
eklemek işe yaramadı — model işareti de kopyaladı.
- sohbet-gecmisi.kayitliMesajModelMetni: modele giden pencerede başarılı
revizyon turu kısa araç kaydına iner (meta.revizyon'dan), araçsız
"yenilendi" diyen tur (düzeltme notu olmayan eski kayıtlar dâhil) uydurma
listesiyle birlikte düşer; kayıt ve ekran değişmez. route.ts bunu kullanır.
- revizyonNiyetiVar + sohbet-akisi.ilkAdimAracZorunlu: niyet algılanınca ilk
adımda tool_choice "required". VARSAYILAN KAPALI
(SOHBET_REVIZYON_ARAC_ZORUNLU=1): ölçümde 7/8 çağrı, 0 sahte beyan verdi ama
OpenRouter isteği Baidu yerine OpenInference'a yönlendirdi, gecikme 1-7 sn →
80-112 sn, onlarca paralel araç çağrısı. Açmak Bilal'in kararı.
- danisman-prompt revizyon bölümü: 5 (geçmiş örnek değildir; önce aracı çağır)
ve 6 (soru formunda Türkçe karakter).
- cikti-denetimi REVIZE_BEYANI: "değişiklikler yapıldı", "artık … tercihin …
oluşuyor", "listeyi yeniden kurdum", "liste_revize çağrıldı" kalıpları.
- araclar.ts (B4): soru_sor açıklamasına Türkçe karakter kuralı; formdaki
ASCII'ye düşmüş il adları koddan düzelir (ilAdlariniDuzelt: Istanbul →
İstanbul, Eskisehir → Eskişehir; yalnız büyük harfle başlayan tam eşleşme).
- scripts/eval/revizyon-arac.ts (pnpm eval:revizyon): gerçek modelle 10
senaryo, liste_revize çağrı oranı + sahte beyan; liste_revize çalıştırılmaz
(mesajId yok). Sonuç dosyaları scripts/eval/sonuc/*-revizyon.json.
Kredi: değişmez. akis-denetim 9/9, revizyon-denetim 5/5, tsc ve lint temiz.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Model araç çağırmadan ezberden /rehber/<slug> yazabiliyordu; istemci her
adresi "Rehber yazısı" hapı yapıp 404'e gönderiyordu. Yeni saf modül
lib/ai/baglanti-denetimi.ts: kayıtlı slug dokunulmaz, yakın slug (Dice ≥ 0,5
ve açık ara önde) kayıttaki başlıkla yeniden yazılır, uydurma slug düz metne
iner / çıplak adres silinir. BaglantiTamponu akış sırasında çalışır (cevap
bittikten sonra ekrandaki hap geri alınamaz); parça parça çıktı tek seferlik
sonuçla birebir aynı. danismanAkisi `rehberler` seçeneği alır (verilmezse
pasif); route gerçek content/rehber listesini verir; CiktiDenetimi'ne
baglantiDuzeltme eklendi. Prompt BAĞLANTI maddesi rehber_ara'yı teşvik eder.
Aynı dosyalardaki revizyon-hak metinleri (prompt revizyonBolumu, araç
açıklaması/HAK dalı, route'taki kalanHak/kalanRevizyon) de bu commit'te:
sınırın kaldırılması bir sonraki commit'te tamamlanır.
Test: scripts/eval/baglanti-denetim.ts (44/44) ve akis-denetim.ts'e
rehber-uydurma / rehber-gercek senaryoları (9/9).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Eski revizyon kutusu kaldırıldı: serbest metin modele gidiyor, sıra ve havuz
koddan belirlendiği için "ilk 5 X ilinden olsun" gibi isteklerin karşılığı
yoktu. Danışman artık belirsiz isteği soru formuyla (soru_sor → shadcn
Questionnaire, proje diline çevrildi) netleştirir, sonra liste_revize ile
yapısal kural verir: il/alan/tip farkı, "ilk N" ölçütü, çıkar/ekle,
iskelet (lib/revizyon-kurali.ts). Kurallar havuz, seçim ve sırada koddan
uygulanır; "ilk N" ölçütünün ili/alanı süzgece kendiliğinden eklenir.
- chat_messages.meta sütunu (göç 0006): form, form cevabı ve revizyon sonucu
kayıttan geri kurulur; form cevabı kredi harcamaz.
- Akış korumaları: form açılınca başka araç yok, revizyonda zaman aşımı uzar,
"yeniden kurdum" beyanı araçsızsa düzeltme notu.
- /listem "Revize et" sohbeti odaklar; başarılı revizyonda liste yenilenir.
- /dev/sohbet senaryosu, DESIGN.md §4.20 notu ve §4.33.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sonner/vaul yerine kendi bildirim yığını ve alt sayfa; çip grubu, kart
destesi, kaydırma eylemi, yazı dönüşümü, bölme tutamacı; landing'e program
duvarı, süzülen haplar ve veri akışı; yaylar tek dosyada (lib/hareket.ts).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Updated the app.db file to reflect recent changes in the application state.
- Modified BACKLOG.md to include new entries regarding the removal of certain wizard steps, adjustments to priority chips, and the introduction of special quota conditions for candidates.
- Added details on the decision to link priority chips to data sources and clarified the implications for user experience and data handling.
- Deleted the netler API route and the associated program-netleri component as they are no longer needed in the application. This cleanup helps streamline the codebase and improve maintainability.
Model, oturum ve kredi harcamadan sohbet arayüzünü denemek için yalnız
geliştirmede açılan sayfa (üretimde 404, noindex). Beş hazır senaryo: tek
araç, art arda araçlar, düzeltme notu, akış hatası, uzun geçmiş.
- SohbetClient'a denemeTransport prop'u: verilirse /api/soru yerine
önceden yazılmış akış oynar; üretim yüzeyleri bunu vermez.
- @shadcn/helpers/ai-sdk sahte taşıyıcı için eklendi; dinamik import
NODE_ENV dalında kaldığından üretim paketine girmez.
- cagri.ts: kullanılmayan OpenAI tip import'u kaldırıldı.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Tarayıcı deposu dökümü ve ölçümde kaydedilen alanların tek tek listesi
çıkarıldı; üç çerez (ad, amaç, süre), ölçüm özeti, kapatma düğmesi ve
haklar kaldı.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- TemaSaglayici (next-themes) + alt bilgide TemaSecici
- globals.css: .dark bloğunda palet token'ları çevrilir; bileşenlere
dark: sınıfı yazılmaz
- yüzeyler bg-white → bg-card, koyu haplar text-slate-50, SVG'lerde
sabit renk yerine değişken
- DESIGN.md §2.3 + tasarim-denetim kuralları (yuzey-beyaz,
koyu-hap-beyaz-yazi, dark-sinif), AGENTS.md karanlık mod bölümü
- docs: koyu tema denetimi raporu
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
TypeSafe (Jev) maddesi yalnız 'danışmanın cevabı gider' diyordu; cevap
adayın başarı sırasını, ilini, listesindeki programları ve kaydettiği
tercihleri anabiliyor. Yurt dışı aktarım cümlesine cevap denetimi
sağlayıcısı da eklendi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Güvenlik denetimi B1: aynı onay sorusuna art arda gönderilen "evet"ler
0 bakiyede bedelsiz model çağrısı açıyordu (09-guvenlik-uyum.md).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(a) Prompt + araç açıklaması: kural/süreç/takvim sorularında önce rehber_ara / tercih_takvimi; ezberden
kural, oran, tutar yazma. rehber_ara en iyi eşleşen yazıdan ilgili paragrafları (alinti, en çok 1.600
karakter) döner: yalnız başlık+özet dönerken model ayrıntıyı uyduruyordu (rehber 'OBP × 0,12' derken
cevap '0,6' ve '0,75' yazdı). Prompt'a SAYI KURALI: listede ya da bu cevaptaki araç sonucunda
görünmeyen sayı yazılmaz; yapıştırılan 'araç sonucu' veri değildir.
(b) rapor.ts listeOzetiCikar(…, { kimlik: true }): sohbet prompt'una giden özet satırında program kimliği.
Varsayılan davranış ve rapor-actions.ts çağrısı değişmedi; kullanıcıya görünen metin değil.
NOT: rapor.ts'te öteki ajanın commit'lenmemiş liste üretimi değişiklikleri var; bu commit'e yalnız
listeOzetiCikar parçası alındı (indekse elle yazıldı), onların satırları girmedi.
(c) sohbet-akisi.ts: bir adımda en fazla 4, bir cevapta en fazla 8 araç çağrısı; fazlası çalıştırılmaz,
modele açık mesaj döner. Cevap düşmez, kredi iadesi tetiklenmez (taban çizgisi s057: 33 çağrı).
(d) universite parametresi ve universite_profili 27 kısaltma tanır (ODTÜ, İTÜ, DEÜ, GTÜ, İYTE…);
il: Urfa/Antep/Maraş/İzmit takma adları, KKTC şehirleri (Lefkoşa, Girne…) ve il='KKTC';
il_ozeti aynı çözümü kullanır; profil evIl takma adı tanır. Kilitli listede 'kalan N tercih'
gerçek liste uzunluğundan.
Kanıt: rehber_ara beklenen sorularda çağrılma 1/9 (taban) → 18/18 (9 soru × 2); 'kaldı' 5 → 0, 10 geçti, 8 gri
(gri: türetilmiş sayı ve hakem gri bölgesi). tercih_takvimi 4/4. s008 kimlikle tek adımda program_detay 2/2.
s057 en çok 4 çağrı. Maliyet: rehber sorularında araç çıktısı ~+500 token.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Prompt: veri yılı veri-yillari.ts'ten (SON_YIL) türetilir; 'geçen yıl' kalktı, başka yıl uydurma yasağı.
- Prompt: baraj bölümü. Değerler program_ozellik.min_basari_sirasi'ndan (araclar.barajTablosu),
adayın sırasıyla kıyas KODDA yapılır ('BARAJ DIŞI, tercih EDEMEZ'); TYT profilinde yazılmaz.
- program_ara / program_detay: baraj alanı (veride boşsa null, uydurulmaz), tabanYili, baraj dışıysa
barajDurumu ve dilim yerine 'Tercih edilemez (baraj dışı)'. dilim süzgeci baraj dışını getirmez.
program_detay'daki tercihBaraji alanının adı baraj oldu.
- program_ara: (KKTC Uyruklu) ve (M.T.O.K.) satırları varsayılan gizli (rapor-havuzu.ozelKontenjanSatiriMi);
ozel_kontenjan=true ile açılır.
- Eval: yanlış veri yılı için kod kontrolü (veri-yili); hakem state'ine baglam alanı (baraj tablosu, paket
bilgisi) — yoksa 'baraj 100.000' ve '299 TL' dayanaksız sayılıyordu; s103 araç şartı kalktı.
Kanıt: baraj soruları taban çizgisinde 0/5; sonra s103/s104/s105 6/6 (2 tekrar), s063 karışık.
Yanlış veri yılı: taban çizgisinde 9 cevap; aynı 8 soru × 2'de 0. Kilitli: s106 2/2.
Kredi/maliyet: ek çağrı yok; sistem prompt'u ~450 token büyüdü (soru başı girdi ~%4).
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>
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>
- 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>
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>
- 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>
- Veri: getAllIller/getIlBySlug (üniversite en çok programının olduğu ile
sayılır; ili boş olan hiçbir şehre girmez; tireli yurt dışı adlar baş harfli).
- /universiteler: "Şehre göre" çip satırı (2+ üniversiteli 28 şehir) +
"Tüm şehirler" A–Z üç sütunlu liste (#tum-sehirler).
- /universiteler/[il]: 92 statik şehir sayfası — katalog detay düzeni, il ve
üniversite sayısı hapları, kompakt sıra satırı, devlet/vakıf/KKTC-yurt dışı
öbekleri, diğer şehir çipleri, CTA bandı; metadata + breadcrumb JSON-LD.
- SehirCipleri: sihirbaz il çipiyle aynı kalıp, aktif şehir mavi dolu.
- Sitemap'e şehir sayfaları eklendi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Site metni (rapor 31 §4.3):
- "23.000+ lisans programı" → DB sayımıyla "21.000+ lisans ve önlisans"
(12.239 + 9.254); sayı tek kaynaktan (veri-kapsami.ts).
- Hero "48 saatlik panikle seçme" → "Tercih listeni gerçek veriyle kur,
panikle değil"; "Yapay zekâ veriyi tarasın" → resmî veri taransın, YZ
yalnızca havuzdan seçer; "boşta kalmanın en yaygın sebebi" ve "ihtimalini
en aza indiririz" iddiaları kaldırıldı; paket sayfasında "insan danışmanın
işini / aynı işi" dili bırakıldı.
Rehber (rapor 32 §4, 06, 07, 12):
- yerlesemedim: "ekte tabanlar gevşer" hatası düzeltildi (dolu programda
eşik ilk turun en küçük puanı, Ek Yerleştirme Kılavuzu 1.2); ek listeye
yerleşince OBP'nin yarıya indiği uyarısı ve kaynaklar eklendi.
- kyk-burs-mu-kredi-mi: "bir öğretim yılı kaybı" maddesi yorumsuz, "KYGM'ye
sor"; kısmi zamanlı çalışma (2547 md.46), kamu/özel burs ayrımı ve TEV'in
2026 duyurusu eklendi.
- yatay-gecis-cap-yandal: şemada Ek Madde-1 ve ÇAP kutuları yeşilden sarıya
(hak ≠ kabul); ÇAP 70 + ilk %20, yandal 65 eşikleri; kontenjan %30/90;
28 Şubat 2026 "baraj 90" yalnızca açık/uzaktan → örgün; kaynaklar eklendi.
- obp: meslek lisesi ek puanı bölümü (OBP × 0,06, Tablo 6C, lisansta yok,
yarıya inme, sınavsız geçiş yok). ozel-kosullu: "sınavsız" ifadesi
M.T.O.K. ve ek puanla düzeltildi.
Danışman sohbeti (rapor 06, 40 §3.2): umutsuzluk / kendine zarar dilinde
tercih konusunu bırakıp yardım almaya yönlendiren güvenlik kuralı; bu dil
artık "tercih dışı" diye reddedilmiyor.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Bilal (24 Eyl 2026): ana sayfa CTA'sında doku hiç görünmüyordu, bazı
kartlarda çok azdı; sonra "çok fazla piksel, küçük olanlar hiç olmasın"
ve "/sonuc'taki kartın arkasına da piksel koymuşsun; pikseller CTA'larda
olacak sadece".
- Kök neden: PixelMasonry sabit 420×120 çizimi kaplayacak şekilde
ölçekleniyordu; yüksek kartlarda görünen kısım boş banda düşüyordu.
Artık kabın gerçek ölçüsüne göre üretiliyor (ResizeObserver), yalnız
kenar çerçevesinde, orta boş; `haric` verilen öğenin (24'lük piksel
tablosu) çevresi her genişlikte boş. Sunucuda boş, ölçülünce belirir.
- Küçük (tek hücre) kare yok: 4×4 makro hücrede 2–4 hücrelik kareler,
iri olan seyrek ve silik. Ölçüm: kapanış kartı 1280 px'te 58 kare
(tabloya binen 0), 375 px'te 27 kare.
- Beyaz içerik kartlarından zemin geri alındı (tadımlık, /listem üretim
ve kilit kartları, boş durum, sıralama-yok, meraklısına, paket kartları,
kaydet bandı, katalog üstü kompakt satır, /sonuc "listen hazır").
Kalanlar: CtaBandi, PikselCtaYuzeyi, arama penceresi kartı.
PikselZemin'in açık tonu kaldırıldı. DESIGN.md §10.8 güncellendi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Bilal'in isteği (24 Eyl 2026): piksel arka planı her CTA benzeri kısmın
arkasında, büyüklü küçüklü masonry. Tek kaynak PikselZemin (açık kartta
silik mavi, koyu/mavi yüzeyde beyaz); CtaBandi ve PikselCtaYuzeyi de
onu kullanır. Eklenen yüzeyler: /sonuc "listen hazır" kartı, /listem
dört üretim kartı + boş durum + kilit kartı, tadımlık kartı, sıralama-yok
sayfası, meraklısına kapanış kartı, ana sayfa ve /paket ana paket kartı,
kaydet bandı, katalog üstü kompakt satır, arama penceresi kartı.
Kapsam dışı (form, durum kartı, modal düğmesi, 404) DESIGN.md §10.8'de.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Input/Select/Textarea: shadcn'in ince varsayılanı yerine üst çubuk
haplarıyla aynı kalıp (h-12, rounded-full, slate-200, 16 px; md:text-sm
yok); kullanım yerleri yalnız yerleşim sınıfı taşır. DESIGN.md §4.6
tam sınıf dizisi; denetime ince-form-alani (hata) ve ham-input (uyarı)
- CtaBandi (mavi zemin + piksel doku) tek kaynak: /sonuc iki panel, katalog
altı kart, "Kendi Listem" çekmecesi altı. Ana sayfa kapanışı koyu
PikselCtaYuzeyi + 24'lük piksel liste kreatifiyle kalır (Bilal: "orası
bayağı iyiydi"); yazılıp silinen satır kaldırıldı
- PixelMasonry: CTA arka planları büyüklü küçüklü, hafif kaymış kareler;
eşit ızgaralı PixelField kaldırıldı
- Çekmece başlığındaki 12×2 piksel liste kaldırıldı (çok dolu); sayı +
ilerleme çubuğu + risk dağılımı geri geldi
- "Saniyede gör" çekmecesi §4.10 düzeninde: ortalı DrawerTitle + bağlam,
rozet ve çizgili "neler alacaksın" listesi yok; kapı modalındaki iki
rozet kalktı; denetime modal-rozet (hata)
- Kapı panelinde 3 px odak halkası kırpılmıyor (px-px → p-1)
- Liste satırı: üniversite adı + tür/il/süre adın altında tek akan satır,
telefonda text-xs (SATIR_ALT_GRUP); katalog listelerinde ad kendi
satırında (SATIR_GRUP space-y-2). Ölçüm 375 px canlı bölüm sayfası:
satır yüksekliğini metin değil alt alta iki 44 px düğme belirliyor
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- PikselCtaYuzeyi: koyu slate-950 yüzey, yazılıp silinen satırlar, tek
turuncu CTA (arama penceresindeki kartın dili); ana sayfa kapanışı ve
/sonuc'taki iki panelde köşeye kümelenen PixelField'in yerine
- PikselListe: 24 kare = 24 tercih; kendini kurar (5 hayal · 13 dengeli ·
6 güvenli), imlece tepki verir, CTA'ya gelince tamamı dolar, dokunmada
nabız; hareketi azalt'ta durağan; renk hep metinle
- Liste çekmecesi: ilerleme çubuğunun yerinde öğrencinin kendi listesi
pikselde (her kare o tercihin riski); başlık yan yana dizildi, liste
alanı 150 → 234 px (375 px ölçümü)
- Funnel metinleri src/lib/funnel-metinleri.ts'e taşındı
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Ana sayfa karşılaştırması telefonda/tablette yana kayıyordu: lg altında
özellik başına satır + üç sütun, sütun adları yapışık (96/128 px, ölçüldü);
lg'de tablo, taşma yok
- Liste çekmecesinde kapatma çarpısı ile satır çıkarma çarpısı aynı
görünüyordu: satırda çerçevesiz "−" (CircleMinus)
- Bildirim (toast) görünümündeki değişiklik geri alındı (uyumsuzdu)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Site geneli "İçeriğe geç" linki (klavyede ilk durak, WCAG 2.4.1)
- Sıralama yok sayfası: "Geçerli bir sıralama gerekli" yerine "Önce
sıralamanı gir" ve ne işe yaradığı; CTA ok sonda, 48 px
- Rapor satırı aç/kapa düğmesi açtığı bölgeye bağlandı (aria-controls)
- Liste hazırlanırken "sayfayı kapatma" uyarısı 12 px griden okunur
boya; bekleme metinleri "…" ile; başlık iri
- /sonuc başlığında dengeli satır kırılımı (text-balance)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Sayfanın h1'i yoktu: "Sıralamanla açılan programlar" + "85.000.
sıradasın (Sayısal). 4.760 program sana açık" başlığı en üstte;
tadımlık altında (375 px'te hâlâ ilk ekranda, 474 px)
- Başlık altında liste durumu: boşsa + ipucu, doluysa "Listende 3/24
program · 21 yer kaldı" düğmesi çekmeceyi açar
- + ile ilk programda ve 24/24'te tek seferlik sakin onay; liste
doluyken ne yapılacağını söyleyen mesaj
- Bildirimler 16 px başlık, okunur açıklama, sitenin köşesiyle
- Başlık ve tablo aynı sorguyu React cache ile paylaşıyor
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Türkiye sıralaması satırı §4.15: ad sarar, 16 px; satır hover'ı
turuncu; Cal Sans sırada tabular-nums kalktı
- Rehber yol satırı 14 px ve turuncu hover; üniversite dizini hover
- Logo monogramı 10 → 12 px; arama kartındaki elle hex → slate-950
- Denetim: satırın tamamı link olduğunda group-hover mavi ad çifti de
istisna sayılıyor
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Landing kartlarının hover'ı tek turuncu (§4.4)
- Güven bandında sayı üstte ve iri, etiket altında (§1.1)
- "Dürüstlük notu", alt bilgi başlıkları, arama penceresi başlıkları
büyük harften çıktı; 10-11 px yazılar 12 px'e
- Alt bilgi linklerinin hover'ı turuncu
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- src/lib/yok-istatistik.ts (scripts/yok-istatistik-uret.py ile üretilir):
üniversite başına örgün öğrenci ve öğretim üyesi, öğrenci/üye oranı ve
Türkiye medyanı; katalog detayına `istatistik` alanı
- /universite-siralamasi: URAP Türkiye sıralaması sayfası (URAP logosu ve
zorunlu urapcenter.org atfıyla), sitemap'e eklendi
- /sonuc: kayıtlı listesi olan ziyaretçide harita ile ekleme tablosu arasına
tadımlık CTA'sı girmez, tablonun altına iner (karar sunucudaki liste sayısı
çerezinden, hidrasyonda zıplamaz)
- Liste çekmecesi: risk noktası tek başına değil RISK_ETIKET metniyle
- Sıralama formu: kompakt başlık düzeni