Files
kolaytercih/docs/gece-vardiyasi/2026-09-22/12-kod-denetimi.md
bilalgursen a42a1a9920
All checks were successful
Deploy / deploy (push) Successful in 17s
docs(ekip): 22-23 Eylül vardiya raporları, BACKLOG/KARARLAR/PROTOKOL güncellemeleri
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 11:43:11 +03:00

20 KiB
Raw Blame History

12 — Bağımsız kod denetimi (Tur 5)

Dal: gece/0922-entegrasyon @ 9e1506d · Taban: main @ 9bd448b · Denetçi: cto (kodu yazmadı) Kapsam: git diff 9bd448b..HEAD — 20 dosya, +948/−38, data/yokatlas.db binary dahil. Salt okuma; hiçbir dosya değiştirilmedi, commit atılmadı, git status entegrasyon worktree'sinde temiz.


HÜKÜM

İncelemeye çıkabilir. Kritik bulgu yok; veri bütünlüğü bağımsız olarak doğrulandı ve iddia edildiği gibi çıktı. Ancak dalı Bilal'in önüne koymadan önce iki tek-satırlık düzeltme yapılmasını öneriyorum (Y1 ve O2 aynı dosyayı ilgilendirmiyor, ikisi birlikte ~10 dk): biri P4'ün tek çıktısını okunabilir kılıyor, diğeri yanlış bir doğrulama rakamını kayda geçiriyor. Bunlar yapılmazsa da dal çalışır ve kullanıcıya zarar vermez — yalnız 2 Kasım'daki ölçüm okuması bozuk olur.

Özet (5 madde)

  1. Veri commit'i temiz. data/yokatlas.db'nin iki sürümünü ayrı kopyalara çıkarıp 45 kolonu tek tek kıyasladım: değişen yalnız unitur (100 satır) ve il (26 satır). id kümesi aynı, programs_arsiv/netler/veri_meta sıfır fark, 2021–2026 puan/sıra/kontenjan/yerleşen kolonlarında 0 satır değişti. P2'nin iddiası birebir doğru.
  2. Paketler birleşince doğru davranıyor. P3'ün boş durum varyantı P2'nin yeni unitur değerleriyle üç kurumun üçünde de doğru cümleyi veriyor — kod okumasıyla değil, dalın kendi ürettiği statik HTML'den doğrulandı (Kıbrıs Amerikan, Balkan, Saraybosna → "URAP yalnız Türkiye'deki üniversiteleri sıralıyor"). Hub'da üçü de "KKTC ve Yurt Dışı" bölümüne geçmiş.
  3. P4'ün tek çıktısı ölçüm olarak kullanılamaz durumda. sihirbaz_adim{1} oturum başına tekil (olayBirKez), {2}/{3} ise geçiş başına atılıyor. Paydayla pay farklı birimde olduğu için huni oranı %100'ü aşabilir. Kodun kendi yazılı kuralı (analitik.ts:23) bu tercihe karşı. Tek kelimelik düzeltme.
  4. P2'nin rapor/commit rakamlarından biri yanlış: "/universiteler hub'ında Devlet listesi 170 → 166". Gerçek sayı üretilmiş HTML'de 129 (öncesi 132). Kriterin kendisi karşılanıyor, yalnız kanıt rakamı ham DB adlarını sayıyor ve yanındaki "iki yazım iki ayrı slug" gerekçesi de yanlış.
  5. P1'in mobil iddiası doğru, P3'ün atıf şartı sağlam. TableCell/TableHead varsayılanı whitespace-nowrap + kap overflow-x-auto + program hücresi truncate → etiket kesilmez, satır taşmaz. URAP sayısı 198 sayfada, hepsinde aynı ekranda rel="noopener" link, nofollow yok; sayı derin sayfalarda hiç çizilmiyor, dolayısıyla "linksiz sayı" hiçbir yerde oluşmuyor.

Bulgular (şiddet sırasına göre)

KRİTİK — yok

YÜKSEK

Y1 · Huninin paydası ile payı farklı birimde; oran %100'ü aşabilir

Dosya: src/features/sihirbaz/components/sihirbaz-adimlar.tsx:154-156 (yeni) ile :220 (mevcut)

// :154-156  — oturum başına EN FAZLA BİR KEZ
useEffect(() => { olayBirKez("sihirbaz_adim", { adim: 1 }, "adim1"); }, []);
// :220      — her ileri geçişte, sınırsız
if (yeniAdim > adim) olay("sihirbaz_adim", { adim: yeniAdim + 1 });

olayBirKez sessionStorage anahtarıyla tekilleştiriyor (src/lib/analitik.ts:169-184), olay tekilleştirmiyor.

Somut senaryo (tek sekme, tek oturum): Öğrenci ana sayfadaki hero formundan sıralamasını girer, sihirbazı 1→2→3 tamamlar → adim:1 ×1, adim:2 ×1, adim:3 ×1. /sonuc'a düşer, "Tercihlerini güncelle" ile tercih kapısını açar → SihirbazAdimlar yeniden mount olur ama sessionStorage'da kolaytercih.olay.sihirbaz_adim.adim1 zaten yazılı, adim:1 atılmaz; öğrenci yine 1→2→3 gider → adim:2 ×2, adim:3 ×2. Panelde adım 1→2 geçiş oranı %200 görünür. Aynı şey /bolum ve /universite sayfalarında iki ayrı CtaSiraForm (üst ve alt) bulunduğu için tek sayfada da olur.

Neden bu bir tasarım tercihi değil: src/lib/analitik.ts:22-24 aynı sorunu daha önce yaşayıp yazıya dökmüş:

liste_uretim_basladi … Bilerek olayBirKez KULLANILMAZ: aynı oturumdaki ikinci deneme de sayılmalı, yoksa payda başarıdan (liste_olusturuldu) küçük kalır.

P4 tam tersini yapmış ve bunu raporunda tartışmamış (08-p4-olcum.md, kabul kriteri 1 yalnız "iki kez düşmesin"e bakıyor — kriter karşılanıyor, ölçüm bozuluyor).

Önerim (tek kelime, mevcut serileri bozmaz): olayBirKez → olay. Mount zaten "sihirbaz bir kez açıldı"ya eşit; 1→2→1→2 gezinmesi unmount etmediği için CEO'nun "tekrar düşmesin" kriteri korunur, ikinci açılış ise adim:2/{3} ile aynı mantıkla yeniden sayılır. Alternatif (2 ve 3'ü de oturum-tekil yapmak) doğru ama sihirbaz_adim{2,3} serisinde ikinci bir kırılma yaratır — o yüzden önermiyorum.

ORTA

O1 · P2'nin hub rakamı yanlış; yanındaki gerekçe de yanlış

Dosya: 1df86cf commit gövdesi ("/universiteler hub'ında Devlet listesi 170 → 166 kurum") ve docs/gece-vardiyasi/2026-09-22/09-p2-unitur.md:107,110

Dalın kendi build'inin ürettiği HTML (.next/server/app/universiteler.html):

Devlet Üniversiteleri …>129      Vakıf Üniversiteleri …>78      (üçüncü bölüm: "KKTC ve Yurt Dışı")

Düzeltme öncesi DB üzerinde getAllUniversitelerin algoritmasını birebir koşturduğumda 132 çıkıyor. Yani gerçek değişim 132 → 129 (3 kurum); raporun yazdığı 170 → 166 ham programs.universite ad sayısıdır (eski DB'de DEVLET etiketli 170 farklı ad, yenide 166), hub satırı değil.

Rapordaki gerekçe de yanlış: "Kıbrıs Amerikan'ın iki yazımı bugün iki ayrı slug". uniAdiNormalize (src/lib/harita.ts:32-34) sondaki parantezli eki atıyor, uniSayfaSlug (src/lib/slug.ts:41-43) da aynı kuralı uyguluyor → iki yazım tek slug (kibris-amerikan-universitesi, 42 program, tek sayfa). Buna bağlanan BACKLOG #10 atfı da bu satır için geçersiz.

Etkisi: Davranış doğru — üç kurumun üçü de "Devlet" listesinden çıkmış, "KKTC ve Yurt Dışı" bölümüne geçmiş (HTML'de konumları doğrulandı). Yalnız kanıt rakamı yanlış. Bu commit [BİLAL] onayına gidiyor ve onay mesajdaki fark raporuna dayanıyor; rakam düzeltilmeden gitmemeli.

O2 · P4 ikinci bir seri kırılması yaratıyor, commit'te yazmıyor

Dosya: src/features/odeme/components/paket-gorunum-olayi.tsx:16-38 (allowlist 3 → 13) ile :45-47

const kaynak = KAYNAKLAR.find((k) => k === ham) ?? "diger";
olayBirKez("paket_goruntulendi", { kaynak }, kaynak);   // tekilleştirme anahtarı = kaynak

Tekilleştirme anahtarı kaynak olduğu için allowlist genişleyince olayın oturum başına atılabilme sayısı 4'ten 14'e çıkıyor.

Somut senaryo: Bir oturumda kullanıcı ana sayfanın fiyat bölümünden /paket'e gidiyor, geri dönüyor, sonra danışman ekranındaki kredi rozetinden tekrar gidiyor. Önce: iki gidişte de kaynak="diger" → tek paket_goruntulendi. Sonra: fiyat_paket ve danisman_rozet → iki ayrı olay. Yani paket_goruntulendi toplamı trafikten bağımsız olarak yükselecek ve diger kovasının anlamı tamamen değişecek (eskiden "10 bilinen yüzey + gerçekten bilinmeyen", şimdi yalnız "gerçekten bilinmeyen"). Deploy tarihinden önceki/sonraki paket_goruntulendi karşılaştırılamaz.

Commit gövdesi (26893ce) seri kırılması notunu yalnız sihirbaz_adim için yazıyor. program_eklendi için 21 Eylül'de konan kuralın gereği: bu da yazılmalı.

O3 · P2 + P3 birleşince üç üniversite sayfasında bozuk Türkçe etiket

Dosya: src/features/katalog/components/universite-icerik.tsx:381-385 → trBaslikDuzeni (src/lib/slug.ts:56-62)

trBaslikDuzeni toLocaleLowerCase("tr-TR") kullanıyor; tr-TR'de I → ı, dolayısıyla "YURTDISI KAMU" → "Yurtdısı Kamu". (Orkestratör günlüğü bunu "Yurtdisi Kamu" diye kaydetmiş; üretilen HTML'deki gerçek çıktı "Yurtdısı Kamu" — Türkçede var olmayan bir kelime.)

Hangi paket yaptı: ikisi birden. P2 unitur'ü DEVLET → YURTDISI KAMU/KKTC yaptı; P3 "Tür" kartını yalnız URAP dışındaki 31 kurumda bıraktığı için bu değerler o sayfaların tek metrik kartı hâline geldi. Ayrı ayrı iki dal da sorunsuz görünüyordu.

Kanıt (dalın ürettiği HTML):

uluslararasi-balkan-universitesi.html      : <dd …>Yurtdısı Kamu</dd>   (dün: "Devlet")
uluslararasi-saraybosna-universitesi.html  : <dd …>Yurtdısı Kamu</dd>   (dün: "Devlet")
kibris-amerikan-universitesi.html          : <dd …>Kktc</dd>            (dün: "Devlet")

"Yurtdısı" içeren sayfa: 6 · ">Kktc<" içeren sayfa: 16 · "Tür" kartı olan toplam sayfa: 31.

Not: doğruluk arttı (KKTC kurumuna "Devlet" demekten iyidir), görünürlük kalitesi düştü. Düzeltme unitur → görünen etiket için 5 satırlık bir harita; trBaslikDuzeni'ye dokunmaya gerek yok. Bilerek yapılmadığı günlükte yazılı, itiraz etmiyorum — ama sabah incelemesinde gözle görülecek ilk şey bu.

O4 · 198 üniversite sayfasında "devlet mi, vakıf mı" bilgisi tamamen kayboldu

Dosya: src/features/katalog/components/universite-icerik.tsx:363-397 (kart takası)

CEO kararı bunu açıkça "takas" diye tanımlamış (§3/P3), yani şartname ihlali değil. Ama karar kaydında "bilgi yerine başka bir yerde kalıyor" demiyor; kalmıyor:

.next/server/app/universite/bogazici-universitesi.html  → "Devlet" kelimesi 0 kez
.next/server/app/universite/koc-universitesi.html       → "Vakıf"  kelimesi 0 kez

H1'de yok, giriş paragrafında yok (:310-330), uniSayfaMetadata açıklamasında yok (:180-183), breadcrumb'da yok, program tablosunda yok (UniDetay.stats.devletMi üretiliyor ama katalog.ts:409'dan sonra hiç okunmuyor). Sitenin en kalabalık yüzeyinde (/universite/*) bir öğrencinin ilk sorduğu ikili bilgi ekrandan çıktı.

Ucuz telafi (ızgaraya dokunmadan): giriş paragrafındaki cümleye tek sıfat — "… bir devlet üniversitesi olarak 2026 YKS yerleştirme sonuçlarına göre N programda öğrenci aldı." Kart sayısı 4'te kalır, yeni kutu açılmaz. Bu bir [BİLAL] kararı; ben yalnız kaybın gerçek olduğunu belgeliyorum.

DÜŞÜK

  • D1 · /listem risk sütunu artık kendi içinde tutarsız. Kilitli satır rapor-listesi.tsx:259 hâlâ sr-only sm:not-sr-only "Pakette", kilitsiz satır :267 görünür etiket. Paketsiz kullanıcıda 24 satırın 21'i kilitli, yani P1'in mobil kazancı o kullanıcı için 3 satır. Sütun genişliğini zaten "Az riskli" belirlediği için "Pakette"yi görünür yapmanın ek genişlik maliyeti yok. (P1 raporu ve orkestratör günlüğü bunu zaten not etmiş.)
  • D2 · AGENTS.md renk kuralının açık kaldığı üçüncü yüzey. src/features/liste/components/liste-cekmecesi.tsx:424-428 — risk yalnız renkli nokta + aria-label; görünür metin yok. Kapsam dışı bırakılması bilinçliydi; kural hâlâ ihlal.
  • D3 · URAP sabitinde denetimsiz tek alan: URAP_KAYNAK_URL. URAP_DONEM/URAP_TOPLAM/URAP_SIRA birbirine veri-kalite kontrolleriyle bağlı (scripts/veri-kalite.ts:191-266), URL hiçbirine bağlı değil. Gelecek Ekim'de dönem 2026-2027 olup URL unutulursa sayfa "URAP Türkiye Sıralaması 2026-2027 … Kaynak: urapcenter.org" der ve 2025-2026 sayfasına link verir — izin şartı biçimsel olarak ihlal edilir, pnpm veri-kalite sessiz kalır. Tek satır kapatır: zorunlu("URAP: kaynak URL dönemi tutuyor", URAP_KAYNAK_URL.includes(URAP_DONEM), URAP_KAYNAK_URL). (URL'nin kendisi doğru: URAP'ın izin e-postasındaki adres — 00-brief.md:8; veri mühendisi 22 Eyl'de tarayıcı paneliyle okumuş — 05-urap.md:17. Bu oturumda tarayıcı açmadım.)
  • D4 · Yeni veri-kalite kontrolünün bilgi kolu hiçbir zaman uyarı üretmiyor. scripts/veri-kalite.ts:318 bilgi(..., false, ...) — sabit false. Bugün iki kurum bu kolda: Kırgızistan-Türkiye Manas ve Hoca Ahmet Yesevi, iki yazımı YURTDISI KAMU + YURTDISI VAKIF. Kullanıcıya yansımıyor (devlet/vakıf ayrımını bölmüyor, sayfa tek slug'da birleşiyor), ama P2'nin kapattığı hata sınıfı iki kurumda hâlâ açık ve sayaca girmiyor.
  • D5 · URAP dışı 9 Türkiye kurumunda gerekçesiz olumsuz cümle. "Bu üniversite URAP Türkiye Sıralaması 2025-2026 listesinde yer almıyor." — dördü MYO, üçü yeni devlet üniversitesi (Sivas Bilim ve Teknoloji, Türk-Japon, Ankara Müzik ve Güzel Sanatlar), biri de üniversite bile değil (icisleri-bakanligi-ve-milli-savunma-bakanligi-adina-…). Sabitin kendi yorumu ("kötü demek değildir; MYO'lar ve yeni üniversiteler listeye girmiyor" — src/lib/urap-siralama.ts:13-16) kullanıcıya ulaşmıyor. CEO'nun yazdığı kanonik cümle birebir uygulandığı için şartname ihlali değil.
  • D6 · data/yokatlas.db-shm / -wal git'te izleniyor. Veri commit'i ana dosyayı değiştirdi, yan dosyalar commit'e girmedi. Bugün zararsız (-wal 0 bayt) ama repoda tutulmaları ileride tutarsız çift üretebilir. P2 raporu da not etmiş; backlog.
  • D7 · Tür rozeti hâlâ ikili. program-tablosu.tsx:311 ve rapor-listesi.tsx:225-233: unitur === "DEVLET" ? "Devlet" : "Vakıf". P2'den sonra düzeltilen 27 program artık "Vakıf" rozetiyle görünüyor. "Devlet"ten doğru, gerçekten doğru değil; aynı durumda ~1.350 KKTC/yurt dışı satırı zaten vardı. Backlog.

Temiz çıkanlar (denetlendi, bulgu yok)

Veri (P2) — bağımsız SQL doğrulaması. git show ile iki sürüm ayrı kopyalara çıkarıldı, sqlite3 "file:…?immutable=1" ile ATTACH edilip 45 kolon tek tek kıyaslandı:

  • programs: 21.493 → 21.493, id kümesi farkı 0/0. Değişen kolon yalnız unitur (100) ve il (26); diğer 43 kolonda değişen satır 0.
  • programs_arsiv 3.735 → 3.735 (unitur/il/universite farkı 0) · netler 62.975 → 62.975 (fark 0) · veri_meta 37 → 37 (fark 0).
  • Değişimler: Kıbrıs Amerikan (iki yazım, 36+6) DEVLET→KKTC; Balkan (34) ve Saraybosna (24) DEVLET→YURTDISI KAMU; Balkan'ın 26 satırında il SARAYBOSNA - BOSNA - HERSEK→ÜSKÜP-MAKEDONYA. Başka kuruma dokunulmamış.
  • Havuz etkisi bağımsız sayıldı: unitur='DEVLET' + efektif sırası dolu bu dört adda 27 → 0.
  • Düzeltme sonrası programs'ta unitur IS NULL satır yok ve aynı ham adın iki farklı unitur'ü yok.

P2 + P3 birleşik davranışı (denetim sorusu #1). UrapKaynakSatiri (universite-icerik.tsx:129-133) unitur === "KKTC" || unitur?.startsWith("YURTDISI") bakıyor. DB'deki 229 slug'ın tamamını uniSayfaSlug ile üretip URAP sabitiyle kesiştirdim: URAP dışı 31 slug'ın 22'si KKTC/YURTDISI * → yurt dışı cümlesi, 9'u Türkiye → liste cümlesi. Üç düzeltilen kurumun üçü de yurt dışı kolunda. Dalın ürettiği HTML de aynı sonucu veriyor. Ek kod gerekmemiş, iddia doğru.

olayBirKez dayanıklılığı (denetim sorusu #3). src/lib/analitik.ts:169-184: SSR'da typeof window === "undefined" ile çıkıyor; window.sessionStorage'a erişimin kendisi try bloğunun içinde, dolayısıyla storage kapalı/engelli ortamda SecurityError yutuluyor ve olay tekilleştirmesiz yine atılıyor — patlamıyor, sessizce düşmüyor. Gizli sekmede sessionStorage normal çalışır. Dev StrictMode'un çift effect'i ilk koşuda yazılan anahtarla yutulur (ve Rybbit script'i zaten yalnız prod build'de yükleniyor). Sihirbaz dynamic(..., { ssr: false }) ile yükleniyor (sihirbaz-adimlar-lazy.tsx:46-53), sunucuda hiç koşmuyor.

"Mount = 1. adım görüldü" varsayımı. SihirbazAdimlar'ın beş mount noktasının beşi de koşullu: sihirbaz-modal.tsx:47 (Radix Dialog, kapalıyken unmount), hero-form.tsx:216 (facetler && sira), cta-sira-form.tsx:328 (facetler && sira != null, form dalıyla ayrık ternary), tercih-profili-kapisi.tsx:450 (facetler yalnız facetYukle sonrası doluyor). Sayfa yüklenirken kendiliğinden mount olan bir yüzey yok. Varsayım tutuyor; sorun yalnızca Y1'deki birim uyuşmazlığı.

P1'in mobil taşma iddiası (denetim sorusu #2). src/components/ui/table.tsx:86 TableCell varsayılanı whitespace-nowrap, :73 TableHead aynı, :11 tablo kabı overflow-x-auto; program hücresi program-tablosu.tsx:324 max-w-0 w-full + içeride truncate. Yani etiket sarmalanamaz/kesilemez, artan genişliği program adı sütunu yutar, en kötü durumda tablo yatay kayar — sayfa taşmaz. İddia doğru. "Az riskli" en uzun etiket (src/lib/risk.ts:8-12); kalan genişlik Bilal'in gözle bakacağı bir tasarım kararı, hata değil.

P4 link envanteri. grep -rn '"/paket' src/ → gezinme amaçlı 14 <Link>'in 14'ünde ?kaynak= var, 13 tekil değerin 13'ü de KAYNAKLAR allowlist'inde (fazlası/eksiği yok). Kalan /paket geçişleri redirect() ve giriş callback'leri — kullanıcı tıklaması değil, CEO'nun listesinde de yoklar.

P3 sızıntı denetimi. src/lib/urap-siralama.ts'i içe aktaran yalnız src/lib/katalog.ts:13, universite-icerik.tsx:33-37 ve scripts/veri-kalite.ts:129. LLM prompt'una (src/lib/ai/rapor.ts), /sonuc tablosuna, OG görsellerine, hub'a girmiyor. universite-icerik.tsx sunucu bileşeni ("use client" yok) → 14 KB'lık sabit tarayıcıya inmiyor, standalone/bellek etkisi yok.

Atıf şartı. Metrik ızgarası ilkSayfa koşulunun içinde (:308 açılıyor, :400 kapanıyor), kaynak satırı da :441'de aynı koşulla. Yani URAP sayısının göründüğü tek yüzeyde link her zaman aynı ekranda. Üretilen HTML: 198 sayfada URAP Türkiye</dt>, 31 sayfada Tür</dt>, toplam 229 — delik yok, "—" yok.

veri-kalite #14'ün sezgisi veriyle tutuyor. Türkiye ili sezgisi "tire yok + KKTC_ILLERI'nde değil". DB'deki tireli il değerleri yalnız 5 yurt dışı değer (BAKÜ-AZERBAYCAN, BİŞKEK-KIRGIZİSTAN, SARAYBOSNA - BOSNA - HERSEK, TÜRKİSTAN-KAZAKİSTAN, ÜSKÜP-MAKEDONYA); KKTC il değerlerinin hepsi sabitte (GİRNE, LEFKOŞA, GAZİMAĞUSA, LEFKE, GÜZELYURT, KIBRIS); ili NULL olan kurumlar HAVING SUM(il IS NOT NULL) > 0 ile eleniyor. Yanlış pozitif/negatif üretecek bir boşluk bulamadım.

AGENTS.md (denetim sorusu #6). Yeni badge/eyebrow yok (SectionEyebrow dışı pill eklenmemiş), yeni modal/kapatma çarpısı yok, yeni CTA butonu yok — dokunulan CTA'ların ArrowRight deseni korunmuş. /meraklisina şeması doğru olarak güncellenmedi: sihirbaz adımlarının sayısı-sırası-içeriği, aday havuzu kuralları, 24'lük iskelet, gevşetme sırası ve havuz-dışı kuralı değişmedi; P2 havuzun içeriğini düzeltti, mimarisini değil. Risk renk dili P1 ile güçlendi (tek kalan ihlal D2).


Backlog önerileri (kapsam dışı, kayda değer)

  1. unitur → görünen etiket haritası (Devlet / Vakıf / KKTC / Yurt dışı — kamu / Yurt dışı — vakıf), tek kaynak; trBaslikDuzeni ham DB değerlerine uygulanmasın (O3, D7 aynı kökten).
  2. /sonuc ve /listem satır rozetinde üçüncü değer (KKTC/yurt dışı) — bugün ~1.350 satır "Vakıf" diye etiketleniyor.
  3. veri-kalite'ye URAP_KAYNAK_URL ⊃ URAP_DONEM kontrolü (D3) ve #13'ün bilgi kolunun gerçekten uyarı sayması (D4).
  4. data/yokatlas.db-shm / -wal git izlemesinden çıksın (D6).
  5. listem-govde.tsx:288 ve :369 iki ayrı kilit yüzeyi, ikisi de kaynak=kilit — P4'ün kendi raporunda not edilmiş, ayrılmalı.

Bilal'den istenen (3 madde)

  1. Y1'i merge öncesi düzelttir — sihirbaz-adimlar.tsx:155'te olayBirKez → olay; yoksa 2 Kasım'daki huni okuması payda/pay uyuşmazlığı yüzünden şişik çıkar. ~5 dk.
  2. O1'i kayda geçir — veri commit'inin gövdesindeki "170 → 166" gerçek hub sayısı değil; doğrusu 132 → 129, düzeltme mesajı onayla birlikte girsin. ~3 dk.
  3. O4'e karar ver — üniversite sayfalarında "devlet mi vakıf mı" bilgisi tamamen kayboldu; giriş cümlesine tek sıfat ekleyelim mi, yoksa takas bu hâliyle mi kalsın? ~2 dk.