CtaSiraForm'a isteğe bağlı `aciklama` prop'u (yalnız profilsiz karttaki
paragrafın yerine geçer; varsayılan paragraflar aynen kaldı). "Sıralamanla
nereye yerleşirsin?" / "…programlarına yerleşir misin?" başlıkları kalktı:
varsayılan "Sıralamana yakın programlar hangileri?", katalogda
"Sıralaman {ad} tabanlarının neresinde?".
Üniversite ve bölüm sayfaları aynı köprü cümlesini tek sabitten
(KATALOG_CTA_ACIKLAMA) alır; kart /bolum/[slug] sayfasına üniversite
sayfasıyla aynı konumda (liste + sayfalama altı, mt-10) eklendi.
cta_form_goruntulendi ölçümü ve buton deseni değişmedi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
/bolum/*/sayfa/N: title + description + H1 o sayfanın taban sırası aralığını
taşır (dilimdeki min–max efektif sıra; veri yoksa "taban verisi olmayan
programlar"). Görünür breadcrumb üniversite sayfasındaki desenle eşitlendi
(üst bölüm linki + "Sayfa N").
/universite/*/sayfa/N: description + giriş paragrafı o sayfadaki birim adlarını
sayar (ilk 2 + "ve N birim daha"); dilim tek birimden ibaretse birim içi taban
sırası aralığı eklenir. <title> uzunluk nedeniyle değişmedi.
Dilim hesabı tek yardımcıda (sayfaDilimi); metadata ve gövde aynı hesabı
kullanır. Canonical, robots, sitemap, rota dosyaları ve 1. sayfaların
başlık/açıklaması değişmedi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
cae2aaa yalnız riskNotu'yu deterministik yapmıştı; aynı satırın gerekce ve
trendOzeti alanları DB'deki eski LLM metni olarak servis ediliyordu (lokal
havuzda 89 satır "Son 4 yıl…", 13+ satır "yerleşme olasılığı/ihtimali").
Oradaki "olasılık dili sızamaz" yorumu yanlıştı; düzeltildi.
- yeni src/lib/trend.ts: trendOzetiMetni() saf fonksiyonu — rapor.ts'teki
trendOzetiUret gövdesi buraya taşındı, rapor ve tadımlık aynı kaynaktan
okur. Yıl aralığı serideki dolu yıllardan gelir ("2021-2025 arasında…")
- trend cümlesinden tahmin yargısı çıktı: "bölüm zorlaşıyor" → "taban
sıkılaştı", "yerleşmek görece kolaylaşıyor" → "taban gevşedi". ±%10
eşiği, ilk–son yıl mantığı, 5/13/6 ve LLM şeması/prompt'u aynı
- tadimlikSec(): DB'deki trendOzeti servis edilmez; program.siraGecmisi'nden
okuma anında üretilir (alan yoksa "yeterli geçmiş yıl verisi yok")
- tadimlikSec(): gerekce olasılık/ihtimal/şans/garanti/kesin/yüzde/
"yerleşirsin"/"son 4 yıl" içeriyorsa satır yok sayılır → "genel"
kategoriye düşer, o da takılırsa null (tadımlık gizlenir). Eşleşme
Türkçe küçük harfle yapılır (İ/ı)
DB satırları, şema ve script'ler değişmedi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Erken olay kuyruğu yalnız olay() içindi; sert yüklemede (OAuth / e-posta
linki dönüşü) RybbitIdentify effect'i de script'ten önce koşuyor, identify
kayboluyor ve kuyruktan boşalan olaylar anonim profile yazılıyordu
(08-kod-denetimi #6).
- Tek "son değer" slotu (bekleyenKimlik): kuyruk değil, yalnız en son
kimlik anlamlı. Yoklama zamanlayıcısı olay kuyruğuyla ortak
(zamanlayiciyiBaslat); script 10 sn'de gelmezse slot da atılır.
- kuyruguBosalt kimliği olaylardan ÖNCE uygular.
- kullaniciTemizle slotu siler.
rybbit-identify.tsx'e dokunulmadı.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Profil kapısının açılışı ve tamamlanmadan kapanışı doğrudan ölçülmüyordu;
"82 oturum kapıyı gördü" kod davranışından çıkarımdı (09-analitik-tur2).
İki yeni olay (adlar kalıcı sözleşme):
- kapi_acildi {tetik: arti|sonuc|sihirbaz|duzenle|diger}: depoda tek
açılış noktası (kapiyiAc). Her açıcı kendi tetik'ini yazar:
programEkleIste → arti, profilDuzenlemeyiAc → duzenle, profilToplamaAc →
isteğe bağlı 3. parametre, verilmezse hedeften (sonuc/sihirbaz), o da
yoksa diger. Depoya `tetik` alanı eklendi.
- kapi_kapatildi {adim: giris|sira|sihirbaz, tetik}: yalnız TAMAMLANMADAN
kapanışta; kapı bileşeninde tek noktadan (vazgec) — X, dışarı tıklama,
Esc ve "Vazgeç" butonları. Tamamlanan kapı profilTamamlandi ile depodan
kapanır, bu noktaya uğramaz.
Ham sıra/e-posta olaylara girmez. Davranış değişmez.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- taban-siralamalar-nasil-degisir: şema, %% aria ve gövdede "dört yıl / son 4 yıl" -> 5 yıl
(yokatlas.db programs tablosunda sira2021..sira2025 kolonları dolu; ürün satırı "Son 5 yıl" gösteriyor).
Genel okuma tavsiyesi olan "en az 3-4 yıla bak" altyazısı yerinde.
- hedef-siralama-nasil-belirlenir: "üründe dilimin adı da böyle geçer" yan cümlesi silindi
(dilim etiketi kararı bekliyor).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Sunucu tarafı Rybbit olayları (odeme_tamamlandi, giris_basarili) üç env
ister: RYBBIT_HOST, RYBBIT_SITE_ID, RYBBIT_API_KEY. CI'ın yazdığı
.env.production'da bunlar yoktu → prod'da sunucuOlayi hep no-op.
EMAIL_REPLY_TO isteğe bağlı (yoksa destek@kolaytercih.com).
Yalnızca secret ADI referansı eklenir; değerler Gitea secret'larına Bilal
tarafından girilmeli. Secret tanımlı değilse satır boş gelir: Rybbit
gönderimi no-op kalır, Reply-To varsayılana düşer — zararsız.
Deploy hattına dokunur: Bilal onaylamadan merge edilmez. Reddedilirse bu
commit tek başına atılabilir (önceki dört commit'e bağımlılığı yok).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Oturum oluşturulduğunda (databaseHooks.session.create.after) Rybbit'e
sunucudan giris_basarili düşer; yontem = eposta | google | diger
(better-auth uç yolundan türetilir). Huninin "link istendi → giriş yapıldı"
adımı bugüne dek ölçülemiyordu.
- await yok: Rybbit'in 3 sn'lik timeout'u girişi geciktirmez; sunucuOlayi
hata fırlatmaz. E-posta adresi olaya girmez, yalnızca kullanıcı ID.
- RYBBIT_HOST/SITE_ID/API_KEY yoksa no-op — prod .env.production'da bu
üçü bugün yok (bkz. ayrı ci.yaml commit'i), eklenene dek olay düşmez.
Giriş akışının davranışını değiştirmez (yalnızca yan etki ekler).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Aynı e-posta adresine 60 sn içinde ikinci giriş linki gönderilmez: istek
yine 200 döner (form "gönderildi" gösterir), mail çıkmaz. Üçüncü kişiye
mail bombardımanını ve Resend kotasının yakılmasını engeller; bugüne dek
tek sınır better-auth'un IP limitiydi (5 istek/60 sn).
- Kaynak süreç içi Map (globalThis.__girisEpostaSon), anahtar
trim+lowercase adres. verification tablosundan türetilmez: orada
identifier token'dır ve satır sendMagicLink'ten önce yazılır.
- Pencere kaymaz (düşen istek süreyi uzatmaz); her çağrıda eski kayıtlar
budanır. Gönderim hata verirse kayıt silinir, kullanıcı hemen yeniden
deneyebilir.
- Yalnızca NODE_ENV=production: dev paneli "anında giriş" art arda istek
atıyor. Konsol modunda da işler (lokal docker testi).
Canlı giriş yolunu değiştirir; merge öncesi lokal docker testi şart.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Hız sınırına takılan kullanıcı "Tekrar dener misin?" görüp sınırı
uzatıyordu; 429'da "Çok sık denedin, bir dakika sonra tekrar dene" denir.
"Yeniden gönder" geri sayımı 30 → 60 sn: sunucu tarafındaki adres başına
60 sn soğumayla hizalı (o değişiklik gelmese de zararsız).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Resend gönderimine replyTo eklendi (EMAIL_REPLY_TO, yoksa
destek@kolaytercih.com) — mail.kolaytercih.com'un MX'i olmadığı için
yanıtlar bounce oluyordu.
- epostaKonsolModu(): konsola yazma yalnızca anahtar yokken VE (dev'de ya
da EPOSTA_KONSOL_FALLBACK=1 ile) geçerli. Production'da anahtar yoksa
artık "gönderildi" dönmüyor, token'lı link loga yazılmıyor; gönderim
anında net hata fırlatılıyor (better-auth 500 → formda hata toast'ı).
- Production'da EMAIL_FROM yoksa sessizce onboarding@resend.dev'e düşmek
yerine hata. Env okumaları çağrı anında — next build etkilenmez.
Canlı giriş yolunu değiştirir; merge öncesi lokal docker testi şart.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Girişsiz /sonuc tadımlığının riskNotu'su LLM üretimiydi ve DB'den olduğu
gibi servis ediliyordu; prompt'u da açıkça "yüksek/orta/düşük ihtimal dili
kullan" diyordu. Rozet ise aynı satırda canlı hesaplanıyor → metinle rozet
çelişebiliyordu.
- tadimlikSec(): riskNotu okuma anında riskNotuMetni(riskHesapla(...) ??
dilimdenRisk(...)) ile üretilir (rozetle aynı formül). DB satırları ve
şema değişmez; prod'da havuzu yeniden üretmek gerekmez, /api/tadimlik de
kapsanır
- tadimlik-uret prompt'u + mock metinleri: ihtimal dili yasaklandı,
"son 4 yıl" → "son 5 yıl" (çıktı şeması aynı; script koşulmadı)
- danışman sohbeti sistem prompt'u: "ihtimal dili kullan" → olasılık/yüzde/
ihtimal yasak, risk etiketleri + taban sıralarıyla konuş
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Şemanın metin karşılığı yalnızca SVG çizilince `aria-label` olarak
basılıyordu; JS çalıştırmayan botlar iskeletten başka bir şey görmüyordu.
Artık aynı `ariaLabel` metni figure içinde bir `<details>` olarak sunucu
HTML'ine girer. mermaid import/render hatası yakalanır: iskelet kalkar,
metin açık gelir, mermaid'in body'de bıraktığı geçici div temizlenir.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- <head>'deki Google Fonts preconnect/stylesheet <link>'leri kaldırıldı
(çoğu istemci yok sayıyor, bazı spam filtrelerinde eksi puan).
- HTML footer'a ve düz metin gövdelerin sonuna kolaytercih.com +
destek@kolaytercih.com satırı eklendi. Satış dili yok.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Frontmatter'a isteğe bağlı `guncelleme` alanı geldi ve uçtan uca akıyor:
sitemap lastmod (yazı + /rehber dizini), Article JSON-LD dateModified,
og:article modified_time ve makale başlığının altındaki görünür tarih
satırı. `tarih`/`guncelleme` YYYY-AA-GG değilse ya da güncelleme yayından
önceyse build kırılır. Tarih metni saat diliminden bağımsız `trTarih` ile
üretilir.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
useGorunumOlayi useRef + [ad, anahtarEki] deps'li effect kullanıyordu:
eleman ilk commit'te yoksa (kaydet-banner: mount sonrası açılır, portal
içinde) ya da sökülüp yeni düğümle geri geliyorsa (tadımlık satırı) gözlem
hiç kurulmuyordu → kaydet_banner_goruntulendi / tadimlik_goruntulendi = 0.
Hook artık callback ref döner; gözlem düğüm bağlanınca kurulur, sökülünce
React 19 ref temizliğiyle bırakılır. Çağıranlar yalnız ref={…} verdiği
için kullanım yerleri değişmedi.
olay(): Rybbit script'i afterInteractive; sert yüklemede mount anında
atılan olaylar window.rybbit henüz yokken sessizce düşüyordu. Artık en çok
20 olay, 500 ms aralıkla en çok 20 deneme (10 sn) kuyrukta bekler; script
gelmezse (reklam engelleyici, dev) kuyruk atılır.
olayBirKez(): hook'taki sessionStorage tekilleştirmesinin effect'ten
çağrılabilir hâli (anahtar biçimi aynı: kolaytercih.olay.<ad>[.<ek>]).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Frontmatter değerinin iki ucundaki tırnak bağımsız siliniyordu; "Alıntı"
diye başlayan açıklamalar baştaki tırnağını kaybediyordu. Artık yalnızca
tamamı aynı tırnakla sarılı değer soyulur. Makale tabloları yatay kayan,
klavyeyle odaklanabilir bir bölgeye sarılır (mobilde sayfa taşması).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- ek-yerlestirme-sonuclari-ve-kayit (ÖSYM kaynaklarıyla teyitli; açıklanmamış tarihler 'açıklanmadı')
- mezuna-kalmak-mi-kayit-olmak-mi (OBP kuralı ve Ek Madde-1 resmî metinlerden)
- hedef-siralama-nasil-belirlenir (tüm rakamlar yokatlas.db, 1,4x kuralı risk.ts)
- ek-yerlestirme-2026: geçmiş zamana çekildi, yeni yazıya iç link
Gece vardiyası 2026-09-21; yayın öncesi kontrol listesi docs/gece-vardiyasi/2026-09-21/07-yazilimci-raporlari.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
outputFileTracingIncludes yalnızca eşleşen dosyaları kopyalar, trace etmez:
resources/*.js imaja girdi ama IyzipayResource'un require ettiği
postman-request ve bağımlılıkları girmedi — initialize prod'da
"Cannot find module 'postman-request'" ile düşüyordu. IyzipayResource'u
statik import etmek nft trace'inin tüm zinciri doğru pnpm yerleşimiyle
kopyalamasını sağlar.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
iyzipay, lib/resources'ı runtime'da readdirSync ile dinamik yüklediği için
nft trace klasörü göremiyor; standalone imaja yalnızca Iyzipay.js düşüyor
ve checkout initialize ENOENT ile patlıyordu (canlıdaki ödeme toast'ının
kök nedeni). outputFileTracingIncludes ile tüm lib/ imaja alınır.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Replaced the static logo in the SiteHeader with an animated component for enhanced visual feedback. Updated the PaketSatinAl component to include a dynamic link based on user context. Enhanced the ListeUretici and ListemGovde components with improved layout and messaging features, including the addition of a new initial preference comment display in the SohbetClient. Adjusted styling for consistency across components and improved loading states with skeleton screens.
Replaced `NEXT_PUBLIC_APP_URL` with `APP_URL` in the payment processing logic to ensure proper runtime access. Updated related documentation to clarify the distinction between build-time and runtime environment variables, emphasizing the importance of using `APP_URL` for callback and webhook URLs. Adjusted references in the codebase to reflect this change, enhancing clarity and functionality in the payment flow.
Tıklamada buton içeriği "Ödeme sayfasına yönlendiriliyorsun…" ile
değişiyordu; dar top-up kartında metin taşıyordu. Çift gönderim zaten
`disabled` ile engelleniyor.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
iyzico bundle'ı `iyziInit`i global `var` ile tanımlıyor; property
non-configurable olduğu için `delete window.iyziInit` strict mode'da
TypeError fırlatıyordu. Önce delete denenir, olmazsa undefined atanır —
script'in aradığı `typeof ... == 'undefined'` koşulu iki yolla da sağlanır.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ödeme adımında ekranda ~20 kaçış yolu vardı (SEO footer kolonları, katalog
arama, user nav) ve geri sayım banner'ı kart formunun üstünde duruyordu.
Ayrıca layout'un alt progressive blur katmanı iyzico iframe'inin son
satırlarını bulanıklaştırıyordu.
- kromGizliMi: /odeme kroma kapatıldı, /odeme/sonuc istisna tutuldu
(orada kullanıcıyı ürüne döndürmek istiyoruz)
- OdemeUstSerit: SiteHeader'ın tasarım dilinde daraltılmış şerit — logo
bilerek link değil, tek çıkış "Paket sayfasına dön"
- Sipariş özeti kartı kaldırıldı: ürün ve tutar /paket'te seçiliyor,
iyzico da ödeme butonunda tutarı gösteriyor
- Yasal linkler + iyzico logo bandı ayrı footer yerine doğrudan formun
altında; bant sayfada artık tek kez görünüyor
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Enhanced the iyzico payment processing logic by updating the handling of checkout form content. Modified the order schema to include a new field for storing the checkout form content, ensuring it persists across page refreshes. Updated related functions to reflect these changes, improving the overall payment experience. Additionally, updated the app database to incorporate the latest changes.
Refactored the iyzico payment integration to improve the handling of payment callbacks and order status updates. Added signature validation for responses to ensure data integrity. Enhanced the `initializeCheckoutForm` function to include buyer's name and surname, and updated the order schema to enforce unique constraints on iyzico tokens. Improved error handling and logging for payment processing, ensuring better tracking of payment states and issues. Updated the app database to reflect these changes.
Refined the styling of badge and eyebrow elements to ensure uniformity across the site, aligning them with the main section headers. Updated the `PixelMark` component to enhance its animation behavior, introducing new keyframes for smoother transitions. Adjusted CSS properties for better visual consistency and removed unnecessary uppercase text styling. Improved the `SectionEyebrow` component to reflect these changes.
Updated the app database and several binary assets including the apple icon, favicon, and additional icons. These changes ensure that the latest versions of the assets are in use, improving the overall appearance and functionality of the application.
Added a new DELETE endpoint to allow users to clear their chat history. This functionality ensures that while the chat messages are removed, any credits spent remain intact. Additionally, updated the ListemGovde component to reflect changes in user preferences and integrated a modal for notifying users about preference changes. Enhanced the SohbetClient component to include a button for clearing chat history, improving user experience and interface clarity.
Deleted the TercihDegistiUyarisi component from the project. This component was responsible for notifying users about changes in their preferences and suggesting a list update. The removal is part of a broader effort to streamline the codebase and improve maintainability.
Enhanced the handling of user profiles and callback URLs in various components. Updated the `GirisKarti` to support multiple callback scenarios, ensuring seamless user experience. Improved the `ListeUretici` and `ListemIcerik` components to manage profile data more effectively, including handling cases where the profile is stored in cookies. Additionally, refined the logic for redirecting users based on their profile status, ensuring they are directed to the appropriate pages without losing context. Updated the database file to reflect these changes.
Removed unnecessary elements and optimized styles in the AramaFunnelKarti component for improved layout. Updated the city data structure in harita-ulkeler.ts to include coordinates, enhancing geographical data handling. Additionally, refactored risk color definitions in risk.ts for better clarity and maintainability.
Introduced a new "pill" variant for the Tabs component, allowing for a rounded, active tab style that aligns with the design of the "Giriş yap" button. Enhanced the ProgramTablosu component by integrating motion effects for active tab indicators, improving user experience with smooth transitions. Updated color handling for active states to ensure better visibility and consistency across the UI.
Profil çerezinin SSR'da kullanılmasını sağlayarak, sonuç sayfasındaki yönlendirmeleri güncelledik. Artık profil bilgileri URL parametreleri yerine çerezden alınarak işleniyor. Ayrıca, profil çerezi olmayan kullanıcılar için yönlendirme mantığı iyileştirildi. Çeşitli bileşenlerdeki URL oluşturma fonksiyonları güncellenerek, profil bilgileri çerezden okunacak şekilde düzenlendi. Bu değişiklikler, kullanıcı deneyimini artırmayı ve daha tutarlı bir veri akışı sağlamayı hedefliyor.
pnpm tadimlik koşuları: 166 devlet + 174 vakıf varyantı üretildi, 213
"genel" satır da yeni kategori eşlemesi + unitur backfill'li veriyle ve
gerçek LLM metniyle yenilendi (öncekiler dev mock kalıntısıydı). Yeni
eşlemede havuzu boş çıkan 39 bayat mock satır silindi — satırı olmayan
kombinasyonda tadımlık bileşeni gizlenir, yanlış/mock içerik gösterilmez.
Tip sızıntısı 0: vakıf satırlarının tamamı DEVLET-dışı, devlet satırları
DEVLET programı içeriyor.
Not: prod app.db volume'de — aynı üretim prod'a karşı ayrıca koşulmalı.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Reduced NODE_OPTIONS max-old-space-size from 1536 to 1024 MB in Dockerfile.
- Adjusted turbopackMemoryLimit in next.config.ts from 1.5 GB to 1 GB to prevent OOM-kills during build on VPS with limited memory.
- Added a search input for filtering Turkish provinces in the SihirbazAdimlar component, improving user experience with real-time search functionality.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Tadımlık satırı batch üretildiği için sihirbazdaki devlet/vakıf seçimini
bilmiyor, vakıf seçen kullanıcıya devlet örneği gösteriyordu. Havuz
anahtarı kova×tür×kategori×tip'e genişledi (migration 0001; mevcut
satırlar tip='genel'). Üretim scripti tip varyantlarını uniturGrubu
filtresiyle seçer; tadimlikSec tip verildiğinde kategori→genel fallback'i
korur ama tip fallback'i YAPMAZ — uygun satır yoksa bileşen gizlenir,
yanlış tipte örnek asla gösterilmez. Client profildeki tipi de gönderir ve
SSR "genel" satırı tipe uymuyorsa fetch bitene kadar gizler.
Not: prod app.db volume'de — `pnpm tadimlik` prod DB'ye karşı ayrıca
koşulmalı.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vakıf seçen kullanıcı sonuç tablosunda devlet üniversiteleri görüyordu:
tablo sihirbaz seçimlerini hiç kullanmıyordu. sonucHref artık profildeki
seçimlerden il (tekrarlı) ve tip paramlarını URL'e yazar; tablo SSR'da bu
paramlarla filtrelenir, "daha fazla göster" sayfalaması aynı filtreleri
taşır. Sekmelerin üstünde kaldırılabilir filtre çipleri görünür — çip
kaldırmak yalnızca URL'i günceller, localStorage profiline dokunmaz.
Kategori tabloya bilinçli uygulanmaz (DB'de kategori kolonu yok, JS
filtresi offset/toplam semantiğini bozar); kategori AI listesi ve
tadımlıkta uygulanır.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>