/universite/[slug] metrik ızgarasında takas: URAP listesinde olan
üniversitede "Tür" kartının yerini "URAP TÜRKİYE · 18 / 198 ·
2025-2026" alır, olmayan 31 kurumda "Tür" yerinde kalır. Kart sayısı
4'te kalıyor, lg ızgara şablonu değişmiyor, yeni bileşen yok, hiçbir
sayfada "—" ya da delik yok. Payda kartın içinde: "18." tek başına
yanıltır.
Tablonun altına AYRI ikinci kaynak satırı eklendi; VeriKaynagi
kullanılmadı ve kopyalanmadı, çünkü o satır YÖK Atlas'ın yerleştirme
yılına ve son güncelleme tarihine bağlı — URAP'ın dönemi başka.
Satırda metodoloji uyarısı da var: URAP akademik yayın ve araştırma
performansını ölçer, eğitim kalitesini ya da iş bulma oranını ölçmez.
URAP listesinde olmayan üniversitede eksiklik gizlenmiyor, nedeni tek
cümleyle yazılıyor (KKTC/yurt dışı ile MYO/yeni için ayrı cümle).
URAP'ın yayımlama izni "urapcenter.org adresine aktif bağlantı/atıf
vermek" şartına bağlıdır. Kaynak satırındaki bağlantı bu yüzden gerçek
bir <a href>: adres URAP_KAYNAK_URL sabitinden, target="_blank",
rel="noopener", nofollow YOK. Sıranın göründüğü ekran ile atıfın
göründüğü ekran aynı sayfadır; URAP sayısı yalnız ilk sayfada
gösterildiği için kaynak satırı da yalnız ilk sayfada çiziliyor.
Renk yok, rozet yok; URAP risk dili değildir. /universiteler hub'ında
URAP'a göre sıralama/filtre eklenmedi. URAP 24'lük listeye, /sonuc
tablosuna ve LLM prompt'una girmiyor — dokunulan dosya kümesi bunu
zaten dışlıyor.
veri-kalite.ts'e 5 URAP kontrolü (dosyanın en sonunda, tek satırlık
çağrıyla): (1) her URAP slug'ı bir üniversite sayfasına bağlı —
eşleşmeyen sessizce düşmüyor, adıyla listeleniyor; (2) kayıt sayısı =
URAP_TOPLAM; (3) sıralar 1..N tekrarsız ve boşluksuz; (4) puanlar
sıraya göre azalan; (5) kapsama boşluğu — URAP dışında kalan 150+
programlı bir Türkiye üniversitesi varsa UYARI (ad değişikliği
işareti). Beşi de geçiyor, boşluk 31 kurum.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
198 üniversitenin genel sıralaması, /universite/[slug] sayfa slug'ına
anahtarlanmış tek seferlik sabit (uni-koordinatlar.ts deseni). Yeni DB
dosyası, tablo, göç, cron ya da çekme betiği yok: 198 satır × 2 alan
için SQLite'ın hiçbir faydası olmazdı.
Eşleşme 198/198; URAP'ın yazımı bizim DB yazımımızla birebir aynı,
takma ad tablosu gerekmedi. Sıralar 1..198 kesintisiz ve tekrarsız,
puanlar sıraya göre azalan (veri-kalite kontrolleriyle doğrulanıyor).
URAP'ın yayımlama izni "urapcenter.org adresine aktif bağlantı/atıf
vermek" şartına bağlıdır: URAP sayısının göründüğü her yüzeyde, aynı
ekranda, URAP_KAYNAK_URL'ye çıkan gerçek bir <a href> (rel="noopener",
yeni sekme, nofollow YOK) bulunmak zorundadır. Link konulamayan bir
yüzeyde (ör. OG görseli) URAP sayısı hiç gösterilmez. Şart dosyanın
başındaki yorumda da yazılıdır.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
credit_ledger.ref_id benzersizliği yalnız AYNI denemenin tekrarını koruyordu
(ağda kaybolan cevap → aynı requestId ile retry). requestId istemcide her
mount'ta yeniden üretildiği için "aynı kullanıcı üretimi iki kez başlattı"
durumu hiç yakalanmıyordu: üretim sürerken (20-60 sn) ikinci sekmede açılan
/listem?uret=1 ya da geri→ileri ikinci bir ListeUretici monte edip 3 krediyi
ikinci kez yakıyordu. Karşılığında tek rapor çıkıyordu, çünkü reports.user_id
benzersiz ve ikinci üretim birincinin üstüne yazıyor. Bakiyesi yetmeyen
deneme kullanıcısı ise akışın ortasında "kredi yetersiz" ekranı görüyordu.
- report_locks (user_id birincil anahtar): ikinci INSERT benzersizlik
ihlaliyle düşer, bu da "üretim sürüyor" demektir. Kilit kredi
harcamasından ÖNCE alınır, finally'de bırakılır.
- Bayat kilit (süreç OOM'la öldü, deploy) 180 sn sonra devralınabilir;
devir koşullu UPDATE olduğu için iki eşzamanlı devralmadan yalnız biri
kazanır. Salım requestId koşullu: geç uyanan eski sahip devralanın
kilidini silemez.
- Yeni SURUYOR kodu: istemci bunu "hata" sayıp taze requestId ile yeniden
denerse çifte harcama kapısı yeniden açılırdı. Ekranda "Tekrar dene"
bilerek yok; kullanıcı listeye yönlendiriliyor, kredi harcanmadı.
- DUPLICATE dalının "İstek tekrarlandı" HATA'sı da SURUYOR'a çevrildi
(BACKLOG #1'deki ikinci çifte harcama yolu). Revizyon dalı değişmedi.
BACKLOG #1 · güvenlik denetimi G5
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
/sonuc'taki otomatik üretim kaynağı sabit "giris_donusu" yazıyordu; oysa
?sihirbaz=1 üreten hiçbir yer giriş dönüşü değil — gerçek giriş dönüşü
/listem'e doğrudan iniyor, /sonuc'a uğramıyor. Hero, CTA formu, arama kartı,
+ kapısı, boş liste ekranı ve rapor-yok CTA'sı tek yanlış kovada
toplanıyordu, yani P2'nin ölçmek istediği soru ölçülmüyordu.
Etiket artık ?sihirbaz=1'i üreten tarafta kuruluyor ve /sonuc üzerinden
geçiriliyor; kapıdan gelenler tetikten türetiliyor. giris_donusu yalnız
gerçek callback yolunda kalıyor.
Güvenlik denetimi G3 · docs/ekip-raporlari/2026-09-22/07-guvenlik-denetimi.md
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bu iki kapı hedef=sihirbaz'a çevrildiği için akış artık ücretsiz risk
rozetiyle bitmiyor; girişli kullanıcıda 3 kredilik üretime kadar gidiyor.
Vaat kapının girişinde bedeli de söylüyor (son butonda '(3 kredi)' ikinci
kez görünüyor).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
better-auth 1.6.23 callback'i kendi göreli-yol kalkanından geçiriyor ve \w
ASCII olduğu için /rehber/ösym ya da /bolum/t%C4%B1p gibi yolları 403
INVALID_CALLBACK_URL ile reddediyordu: kullanıcı o sayfalardan hiç giriş
yapamıyordu. Callback artık yalnız auth'un da kabul edeceği yollarda
takılıyor, gerisinde sade /giris'e düşülüyor.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bu kapı huninin en sonunda açılıyor (giriş yaptı, listesi yok, profili de
yok). "diger" ile sayılınca arama kartı gibi genel yüzeylerle aynı kovaya
düşüyordu; ayrı değer bu dilimi görünür kılar.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Yalnız `BANT_METNI["takvim-belirsiz"]` değişir. İki seçenek yan yana:
A (dalda duran, ana commit'te):
"2027 tercihine hazırlık · 2026 yerleştirme verisi yüklü"
Kısa, bant şeridine tek satırda sığar; ne beklendiğini söylemez.
B (bu commit):
"2026 yerleştirme verileri yüklendi — 2027 tercih takvimi açıklanınca
geri sayım burada başlar"
Sayacın neden boş olduğunu açıklar ve geri döneceğini vaat eder;
~95 karakter, 375 px'te saat ikonunun yanında alt satıra taşar.
Cherry-pick edilmezse dal A ile tutarlı çalışır.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Profil yokken CTA kullanıcıyı "/"'a gönderiyordu: /listem'e kadar gelmiş
adayı ana sayfaya geri atmak huninin ortasında bağlam kaybı. Artık kapı
aynı sayfada açılıyor (hedef "sihirbaz", tanıtım adımı atlanıyor);
tamamlanınca mevcut yol işliyor — /sonuc?sihirbaz=1 → /listem?uret=1.
Profilli dalda hedefe kaynak etiketi eklendi (uret=1 ilk parametre kalır).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Navbar'daki "Giriş yap" callback vermiyordu; giris-karti.tsx callback'siz
isteği "/"'a düşürdüğü için rehber ya da katalog okuyan ziyaretçi girişten
sonra ana sayfada uyanıyordu.
Yeni GirisLinki bileşeni usePathname ile bulunulan yolu callback yapıyor.
Callback bilerek sabit bir hedef (ör. /listem) değil: buton her sayfada
duruyor, sabit hedef bağlam kaybı olur; /listem?uret=1 yazılsaydı girişten
dönüşte üretim kendiliğinden başlar, kullanıcının ayrı onayı olmadan 3
kredi yanardı. Sorgu dizesi taşınmıyor — sorgu okuyan kanca tüm navbar'ı
Suspense zorunluluğuna sokardı.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Girişli kullanıcının /listem'e navbar'dan ulaşacak yolu yoktu: çekmece
butonu (Kendi Listem) manuel liste boşken tamamen gizleniyor, kredi pill'i
de /paket'e gidiyor. Girişli 14 oturumun 7'si /listem'i hiç görmedi.
Kredi pill'iyle birebir aynı sınıf setinde bir /listem girişi eklendi;
ikon ClipboardList (çekmecenin ListChecks'i ve kredinin Coins'i ile
karışmasın). Rapor var mı diye ek DB sorgusu yok — navbar'ın TTFB'si
bozulmasın, boş sayfada ListemBosCta karşılıyor.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
"Tercih dönemi bitmeden yerini al." cümlesi her iki daldan da silindi:
üst bantta "tercih dönemi kapalı" yazarken aynı ekranda acele ettiren
bir çağrı duruyordu.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2027 takvimi açıklanmadığı için bant artık "takvim-belirsiz" aşamasında:
geri sayım ve `role="timer"` hiç render edilmiyor (boş "--" sayaçları yok),
metin `BANT_METNI` üzerinden "2027 tercihine hazırlık · 2026 yerleştirme
verisi yüklü" oluyor. Yıl ve aralık `TERCIH_YILI`/`VERI_ARALIGI`'ndan
geliyor; takvim bilinmiyorsa `<time>` aralığı yerine veri penceresini
söyleyen düz satır duruyor.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Üretim denemesinin hangi yüzeyden başladığı ölçülebilsin diye dört yol
`&kaynak=` taşır: sihirbazın tamamlanması ve girişsiz callback'i
(sihirbaz), giriş dönüşündeki otomatik yönlendirme (giris_donusu), hazır
seçimler panelinin giriş CTA'sı (hazir_cta) ve paketi aktif kullanıcının
kartı (odeme_sonrasi).
Sabit href yerine listemUretHref(kaynak): `uret=1` her zaman ilk parametre
kalmalı, çünkü giris-karti.tsx:31 funnel metnini
callbackURL.startsWith("/listem?uret=1") ile seçiyor.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Üst banttaki elle gömülü 2026 başlangıç/bitiş damgaları `src/lib/sezon.ts`
içindeki `SEZON_TAKVIMI`ye taşındı. Aşama hesabı (`sezonAsamasi`) ve geri
sayım hedefi (`sezonHedefi`) artık oradan geliyor; `devam-ediyor` dalının
davranışı birebir aynı. 2027 takvimi ÖSYM tarafından açıklanmadığı için
`null` bırakıldı — tarih uydurulmadı.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bugüne kadar yalnız başarı (liste_olusturuldu) ölçülüyordu; kaç kişinin
üretimi denediği bilinmiyordu. /listem?uret=1 ile üretim gövdesi mount
olduğunda yeni bileşen `liste_uretim_basladi` atar.
Olay bilerek liste-uretici.tsx'e değil, listem-icerik.tsx'te ona kardeş
mount edilen yeni bir istemci bileşenine kondu (o dosya bu turda başka bir
işin altında). İkisi aynı `uret` dalında render edildiği için koşulları
birebir aynı.
`kaynak` URL'den, yani kullanıcı denetiminden geldiği için allowlist'ten
geçirilir; listede olmayan değer "bilinmiyor" raporlanır. Giriş
round-trip'inde değerin kaybolmaması için geriYol da kaynağı taşır —
`uret=1` her zaman ilk parametre kalır (giris-karti.tsx:31 sözleşmesi).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Profilsiz + eklemesinin toast aksiyonu ve çekmecedeki "Sıralamamı gir"
butonu kapıyı hedefsiz açıyordu: üç adımı dolduran kullanıcı
profilTamamlandi'den null alıp "Tercihlerin kaydedildi." toast'ıyla
yerinde kalıyordu. İki çağrı yerinde hedef "sihirbaz" oldu — akış
/sonuc'ta devam ediyor (girişliyse üretim, girişsizse ücretsiz tablo).
tetik "arti_toast" olarak korundu; kapi_acildi serisi kırılmıyor.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Backlog #2 ve #3'ün Dalga 1'i (SEO planı 05-seo-plan.md §4):
- bos-kontenjanlar-ne-anlatiyor: ÖSYM Tablo 1'den teyitli boşluk rakamları +
DB'den bölüm bazlı tablo. Veriden çıkan ana bulgu: 2026 tabanı yayımlanan
hiçbir lisans programında boş kontenjan yok; boş kontenjanlı 2.314 lisans
programının 2.054'ünde 2025 tabanı da yok — yani bu programlar efektif sıra
kuralı gereği dilimlere hiç girmiyor.
- en-cok-ogrenci-alan-devlet-universiteleri: açıköğretim ayrımı `fakulte`
alanından (Anadolu ham 48.868 → örgün lisans 2.132); açık/uzaktan toplamı
tek başına ilk 15 örgün üniversitenin toplamından büyük.
- en-secici-devlet-universiteleri: "en iyi" yerine ölçülebilir ölçüt (medyan
taban başarı sırası), eşik altı seçici okullar ayrı tabloda, tablonun
neyi ölçmediği ayrı bölümde.
- kyk-burs-mu-kredi-mi: KYGM SSS + Resmî Gazete yönetmelikleri. 2026-27
başvuru tarihi ve aylık tutar resmî kaynakta olmadığı için yazılmadı;
mekanizma ve karar şeması anlatıldı, tarih açıklanınca tek cümle güncellenir.
İki üniversite yazısının medyan tanımı tek kaynağa çekildi: aynı üniversite
için iki yazıda farklı medyan çıkmıyor, ikisi karşılıklı linkli.
Doğrulama: dört şemanın mermaid dilbilgisiyle ayrıştırıldığı, tüm
/bolum, /universite, /rehber linklerinin DB'den türeyen slug kümesinde olduğu
ve kapanan slug listesiyle kesişmediği kontrol edildi.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
iPad raporu: liste üretildikten sonra ekran "Bad Gateway" gösterdi ve
tarayıcı `listem.txt` indirdi. Sıra şu: liste DB'ye yazıldı → `router.replace`
→ Next'in RSC isteği ters vekilden 502 aldı → Next tam-sayfa gezinmeye düştü
(WebKit düz metin cevabı dosya olarak kaydetti) → 6 sn'lik emniyet supabı
`window.location.replace` ile aynı 502'yi ekrana getirdi.
Üç değişiklik:
- Dockerfile runner katmanına `--max-old-space-size=768`. V8 cgroup sınırını
görmez, heap üst sınırını host RAM'ine göre seçer; `mem_limit: 1g` ile
birleşince V8 daha GC yapmadan konteyner OOM ile ölüyor ve açık istek 502'ye
düşüyor. Sınır builder katmanında vardı, runner'a miras kalmıyordu.
- `/api/saglik`: DB/oturum/AI'ya dokunmayan en ucuz uç. Dockerfile HEALTHCHECK
bunu yokluyor — süreç ölüp açılırken `docker ps` "unhealthy" gösterir, bir
sonraki 502'nin kaynağı tahmine kalmaz.
- Emniyet supabı tam-sayfa gezinmeden önce sunucuyu yokluyor. Sunucu yoksa
ekranda kalınıp "listen oluşturuldu ve kaydedildi, kredin yeniden harcanmaz"
ekranı + sunucuyu yeniden yoklayan buton gösteriliyor; `liste_uretim_hata
{kod:"SUNUCUYA_ULASILAMIYOR"}` olayı düşüyor. Sunucu yokken `router.refresh`
de aynı tuzağa düştüğü için o dalda atlanıyor.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Site geneli üst/alt blur katmanları `position: fixed` + `backdrop-filter`
taşıyordu. iOS/iPadOS WebKit (iPad'de Chrome da WebKit) bu birleşimde
bulanıklığı ayrı kompozit katmana alıp scroll sırasında bayat kaydırma
konumuyla çiziyor; katman ekranın ortasında şerit gibi görünüyordu.
Katmanların stili skiper-ui bileşeninin inline stilinden globals.css'teki
`.kt-sayfa-blur`a taşındı (inline stil `@supports` ile ezilemiyordu).
`@supports (-webkit-touch-callout: none)` yalnızca iOS/iPadOS'ta eşleşir —
masaüstü Safari dahil başka hiçbir tarayıcıda desteklenmez — ve orada
bulanıklık + maske düşer, degrade fade korunur. Geometri (112px, z-40,
print:hidden) ve diğer tarayıcılardaki görüntü değişmedi.
Katalogdaki ProgressiveBlur kullanımları `absolute` olduğu için bu hatadan
etkilenmiyor; bileşen onlar için olduğu gibi kaldı.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Arşivlenen slug'lar 200 + 'sayfa yok' dönüyordu (soft 404). Eşlemenin tek kaynağı
src/lib/kapanan-sluglar.ts; alt yollar (/sayfa/N) hedefin köküne gider; zincir ya da
çift kaynak build'i durdurur. Yıllık güncelleme kılavuzuna 5b adımı eklendi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Katalog 464 oturum → 12 sıra girişi; kart tablonun altında kalıyordu. CtaSiraForm'a
varyant="kompakt" + konum prop'u; olay adları aynı, konum: ust|alt özelliği eklendi;
alan kimlikleri useId ile (aynı sayfada iki form).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Bazı ücretsiz robotlar artık yapay zekâ sohbeti/dengeli liste sunuyor; ✗ yerine
"Bazılarında" / "Danışmana göre". İki ayırt edici satır eklendi (resmî kayda
dayanma, yöntemin açık olması). Sorun kartı ve SSS cevabı aynı çizgiye çekildi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Added a new router and middleware for handling www to apex domain redirection, ensuring that Let's Encrypt certificates are obtained for both domains. Updated the docker-compose.yml file to include necessary rules and middleware for proper redirection and TLS handling.
Also, updated the CEO agent description to remove redundant details and clarified the QA engineer's responsibilities regarding testing critical flows and error reporting. Adjusted the CTO agent's section for consistency in expert guidance and clarified the designer's tools to include 'Skill' for better design resource management.
The devops.md and kod-denetcisi.md files have been removed as they are no longer needed. These files contained guidelines and responsibilities for the DevOps/SRE engineer and the independent code reviewer roles, respectively.
Kılavuz kodu başka programa devredildiğinde (ör. 209210292: Diş Hekimliği SAY
lisans → İlk ve Acil Yardım TYT önlisans) refresh yalnız koda bakıp yıl
kolonlarını yazıyordu; satır eski adıyla yeni programın sırasını gösteriyordu.
- scripts/kimlik.ts (yeni): kimlik = puan türü + önlisans + baz ad slug'ı.
Devir yılı kanıt zinciriyle bulunur (API …1/…2/…3 sıra/puanı DB ile eşleşen
ardışık yıllar + netler.puanTuru); API geçmişi kod bazlı ve kirli olduğu
için (gk2, bazı basariSirasi3) zincirsiz güvenilmez. Yalnız adı değişen ve
API penceresinin tamamında sürekliliği olan satır "ad değişimi"dir, geçmişi
korunur.
- refresh: uyumsuz satır varsa listeler ve HİÇBİR ŞEY yazmadan durur;
--kimlik-onar ile isim/tur/onlisans/fakulte/sure API'den yazılır, devir
öncesi tüm yıl kolonları NULL'lanır, eski kimlik + geçmişi programs_arsiv'e
<kod>~<yıl> id'siyle kopyalanır, eski yılların netleri oraya taşınır,
veri_meta'ya kimlik_onar:<kod> kaydı düşer. Önceki-yıl sağlaması onarılanlar
dışındaki satırlar için aynen geçerli. --isim-esitle (varsayılan kapalı):
kimliği aynı, yalnız burs/dil eki farklı satırlarda isim API'den.
- gecmis-doldur: onarılmış satırda devir öncesi yılları hiçbir kaynaktan
doldurmaz (yoksa API'nin kod bazlı …N alanları eski programı geri yazar).
- veri-kalite: --ham ile ZORUNLU kimlik kontrolü (0 uyumsuz beklenir);
--onceki karşılaştırmasında onarılanlar ayrı doğrulanır.
- docs/veri/yillik-guncelleme.md: kimlik kilidi adımı.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Yayın sonrası denetim (2026-09-21):
- tadımlık havuzu snapshot'ı 2025 tabanını taşıyordu: örnek satır 'Tıp ~5.118,
az riskli' derken aynı sayfadaki tablo 4.481 gösteriyordu. Taban ve sıra
geçmişi artık okuma anında canlı DB'den; güncel kılavuzdan çıkmış program
örnek gösterilmez (sıradaki kategoriye düşülür)
- sunucuylaBirlestir riskleri her zaman yeniler: sunucu kaydı taze taban +
başka cihazın bayat riskini taşıyabiliyordu
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Denetim bulgusu (2026-09-21): ManuelTercih.efektifSira ekleme anının
snapshot'ıydı; 2026 verisi yüklenince /listem 2025 tabanıyla renk verirken
/sonuc tablosu 2026 gösteriyordu ve hiçbir yol yenilemiyordu.
- db.ts: efektifSiralarGetir(ids) — güncel COALESCE(sira2026, sira2025).
- liste-actions: listeTabanlariniTazele (oturumsuz, ≤24 id); sunucu kaydı
(listeSenkronla/listeyiKaydet) tazelenmiş yazılır.
- liste-store: tabanlariGuncelle — efektif sıra + profil varsa risk yenilenir,
arşivlenmiş program eski değerini korur, değişiklik yoksa yayın yok.
- liste-senkron: girişli/girişsiz herkes için sekme oturumu başına bir kez
(anahtar SON_YIL taşır).
- meraklisina-icerik: "son beş yılın" → VERI_YIL_SAYISI.
- rehber (4 yazı): katalog sayfalarını anlatan "2021–2025 / son 5 yıl"
ifadeleri 2021–2026 / son yıllar; yazıların kendi örnek tabloları
2021–2025 olarak etiketli kaldı.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Yıl sözleşmesi (veri-yillari.ts, EFEKTIF_SIRA_SQL), P-A veri betikleri ve
yıllık güncelleme runbook'u, yokatlas.db 2026 verisi (arşivli), okuyan taraf
yılsız Program tipi, metinler + meraklısına şeması, yazdırma dipnotu.
Denetim: kod-denetcisi 2026-09-21 — koşullu merge; yayın sonrası prod'da
pnpm tadimlik --force, kayıtlı liste tabanı yenileme takip işi.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- odemeyiSonuclandir fonksiyonu, kredi ve paid damgalarını doğru sırayla işleyerek sipariş durumunu günceller.
- iade akışında, paket tek seferlik kontrolü ve eski siparişlerin onarımı sağlandı.
- UNIQUE hatası için DrizzleQueryError mesajı güncellendi; callback geçici DB hatalarında yönlendirme yapıldı.
- krediKaydiVarMi indeksi ile haftalık mutabakat sorgusu optimize edildi.
YÖK Atlas tercih-kilavuz API'si, çekim 2026-09-21: 21.493 program (18.251'inde
2026 sırası). Son kılavuzda olmayan 3.706 satır programs_arsiv'e taşındı.
2025 ve önceki dolu değerler değişmedi (veri-kalite: 0 fark).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- yokatlas-goc: idempotent şema göçü (yıl kolonları, son_kilavuz_yili, eski_kod,
programs_arsiv, veri_meta) + betiklerin ortak yardımcıları
- refresh: --yil/--db zorunlu, YIL KİLİDİ (…1 = DB sira<yil-1> ≥%95 ve eksiz ≠),
yıl asla r.yil'den türetilmez; ham veri data/ham/*.jsonl.gz, --ham ile API'siz
tekrar; benzersiz kod = totalElements; tek transaction + önceki yıl sağlaması;
yeni programda …1/2/3 → üç önceki yıl; efektif indeks EFEKTIF_SIRA_SQL ile
- gecmis-doldur: yalnız NULL alan; API …1/2/3 → eski_kod → kanıtlı 1:1 ad eşleşmesi
- eski-arsivle: güncel kılavuzda olmayanlar → programs_arsiv, netler yeni koda; --kuru
- detay: netler bağımsız + yıl sağlaması; kırılım yalnız --kirilim, alan yoksa durur,
mevcut değerin üstüne NULL yazılmaz; `yil - 1` varsayımı kalktı
- veri-kalite: salt okunur kalite kapısı, zorunlu kontrol kalırsa çıkış kodu 1
- docs/veri/yillik-guncelleme.md: adım adım runbook + geri alma
DB commit'lenmedi (arşivleme kararı [Bilal]).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Prompt ve mock metni "son ${VERI_YIL_SAYISI} yıl" der; program seçimi
yerlesenSon'a göre; snapshot rapor.ts programBilgisi ile aynı şekilde
siraGecmisi + ilkYil yazar.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>