content(rehber): gece vardiyasının 14 yeni yazısı + 2 düzeltme, ekip raporları ve kurallar
14 yeni rehber yazısı (hepsi editör denetiminden geçti, 46 yazıda 829 iç link tarandı, 0 kırık hedef; 180+ DB rakamı yazıların kendi filtreleriyle yeniden koşuldu): taban-siralamalari-alti-yilda-nasil-degisti · kac-net-ile-hangi-bolum · siralama-bandlari-hangi-kapilar-acilir · ayni-bolum-farkli-universite-siralama-farki · hangi-bolumlerin-kontenjani-azaldi · yeni-acilan-bolumler-nasil-degerlendirilir · bilgisayar-mi-yazilim-muhendisligi-mi · kktc-universiteleri-okunur-mu · yapay-zekaya-tercih-sordum-guvenilir-mi · ek-madde-1-puanim-yetiyor-mu · universitede-ilk-hafta-ders-kaydi-muafiyet-kayit-dondurma · yks-2027-takvimi · rehber-ogretmenler-icin-veri-kaynaklari · bolumumu-sevmedim-hangi-kapilar-var İki canlı yazı düzeltildi: - veliler-icin-tercih-rehberi: veli diliyle kapanış; altındaki "sıralamanı gir" kutusu artık veliye ölü uç değil - bos-kontenjanlar-ne-anlatiyor: "birkaç yüz kişilik fark" aslında ~9 bin (ÖSYM 265.356 ↔ bizim 256.532); payda açıklaması tersti — ek kontenjan paydaya girseydi oran düşerdi. guncelleme alanı eklendi (sitemap lastmod). Kurallar (AGENTS.md): - Yayın sonrası arama motoru bildirimi: URL denetimi yalnız canlıda 200 dönen adrese; kota sayacı; mülk/hesap notu; sitemap grep kuralı - Yıkıcı git komutları yasak: reset/checkout --/restore/clean/stash - Tarayıcı açma: tasarımcı ve UX gerekli gördüğünde açabilir (yetenek için .claude/agents/tasarimci.md'ye tarayıcı araçları eklendi) docs/gece-vardiyasi/2026-09-22/ — 34 rapor: CEO kararları ve kapanış turu, marka/ödeme analizi, sıfır ödeme teşhisi, SEO konu planı, veri kalitesi, editör denetimi, CTO şartnamesi, yazılımcı ve güvenlik raporları, SABAH-OZETI. docs/ekip/YAYIN-KUYRUGU.md — Search Console bildirim kuyruğu. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
366
docs/ekip-raporlari/2026-09-22/01-ai-listesi-hunisi.md
Normal file
366
docs/ekip-raporlari/2026-09-22/01-ai-listesi-hunisi.md
Normal file
@@ -0,0 +1,366 @@
|
||||
# 01 — Yapay zekâ listesi hunisi: ziyaretten `liste_olusturuldu`'ya
|
||||
|
||||
Hazırlayan: Analitik ajanı · 22 Eyl 2026 gündüz vardiyası · Saat dilimi Europe/Istanbul
|
||||
|
||||
**Bu oturumda Rybbit MCP bağlı değil** (`.mcp.json` yalnız shadcn içeriyor, `.env` yok) — canlı sorgu çekilmedi, denenmedi. Bu rapor iki kaynağın üstüne kuruldu:
|
||||
|
||||
- **Dünkü ham Rybbit sonuçları** (yeniden sorgulanmadı, yalnız yeniden hesaplandı): `docs/ekip-raporlari/2026-09-21/03-donusum.md`, `docs/gece-vardiyasi/2026-09-21/01-analitik-bulgular.md`, `docs/gece-vardiyasi/2026-09-21/09-analitik-tur2.md`. Her rakamın yanında kaynağı **(dosya § bölüm)** biçiminde.
|
||||
- **Koddan ölçüm denetimi** (bu vardiyada yapıldı): "koddan çıkarım (dosya:satır)" diye işaretlendi. Kod değiştirilmedi, yalnız okundu.
|
||||
|
||||
Ana pencere: **30g = 23 Ağu – 21 Eyl 2026**, iç trafik (13 cihaz + 9 hesap) ve bot dışlanmış, **621 gerçek ziyaret** (03-donusum §0).
|
||||
|
||||
---
|
||||
|
||||
## Yönetici özeti (5 madde)
|
||||
|
||||
1. **Sorun tek bir "sevk" sorunu değil, iki ayrı sorun.** 30g'de 621 gerçek ziyaretin 3'ü liste üretti (**%0,48**, %95 GA 0,2–1,4). Kayıp iki yerde toplanıyor: **593 kişi sıralamayı hiç girmiyor** (%95,5) ve **sihirbazı bitiren 22 kişinin 19'u listeye ulaşmıyor** (tamamlandı → liste **3/22 = %13,6**, GA 5–33). Hunininin üst yarısı trafik sorunu, alt yarısı ürün sorunu — ve alt yarı daha ucuz.
|
||||
2. **Aritmetik, önce alt yarıyı düzeltmeyi söylüyor.** Bugünkü oranlarla: ziyaret→sıra iki katına çıkarsa (4,5→%9) aylık liste **3 → 6**; tamamlandı→liste %50'ye çıkarsa **3 → 11**. Yukarıya trafik pompalamak, aşağıdaki %86'lık deliğe daha fazla insan dökmek demek.
|
||||
3. **Girişin maliyeti giriş kapısında bitmiyor — asıl kayıp girişten SONRA.** Girişli 14 oturumun 7'si `/listem`'i hiç görmedi (**7/14**, GA 27–73). Koddan kök neden: **navbar'da `/listem`'e giden hiçbir bağlantı yok** (`src/components/site-header.tsx:8-36` + `src/features/kullanici/components/user-nav.tsx:45-63` — girişli kullanıcı yalnız kredi pill'i, çıkış ve manuel liste çekmecesini görüyor) ve varsayılan giriş callback'i `"/"` (`src/features/kullanici/components/giris-karti.tsx:19-20`). Navbar'dan giriş yapan kullanıcı ana sayfaya düşüyor ve listeye dönecek kalıcı yol bulamıyor.
|
||||
4. **"Butona basıp liste alamayan" kullanıcıyı bugünkü ölçümle GÖREMİYORUZ.** `liste_olusturuldu` yalnız başarı anında atılıyor (`src/features/rapor/components/liste-uretici.tsx:127`); denemenin kendisi hiç ölçülmüyor. Üç dal tamamen sessiz: profil bulunamadı (`:205-213`), oturum düşmüş → girişe sekme (`:145-146`), kullanıcı 20–60 sn'lik üretim sırasında sekmeyi kapattı (hiçbir olay yok). Üstelik `liste_uretim_hata` kodu **21 Eyl'de eklendi** (commit `cf19903`), yani 30 günlük pencerede hata ölçümü hiç yoktu. **Eklenecek tek olay: `liste_uretim_basladi`** (§2.4).
|
||||
5. **Yapay zekâ listesine götüren 19 giriş noktası var; 11'i tamamen ölçüsüz.** En kritik körler: `/sonuc`'taki ana CTA "Yapay Zeka listemi kur" (`sihirbaz-cagri-karti.tsx:328-335` — tıklama olayı yok), o CTA'nın açtığı sihirbaz modalının açılış/kapanışı (katalog kapısında `kapi_acildi`/`kapi_kapatildi` var, `/sonuc` modalında **yok**), `/listem` boş durum CTA'sı (`listem-bos-cta.tsx:30`) ve çekmecedeki "Listemde aç" (`liste-cekmecesi.tsx:300-308`). Navbar'da ise hiç giriş noktası yok.
|
||||
|
||||
---
|
||||
|
||||
## Veri güvenilirliği — önce bunu oku
|
||||
|
||||
- **Canlı sorgu yok.** Rybbit MCP bağlı değil; bu raporda **tek bir yeni ölçüm yok**. Tüm sayılar dünkü raporlardan alındı, üzerine yalnız güven aralığı ve örneklem hesabı yapıldı (yerel Python; Wilson aralığı, n = z²p(1−p)/h², iki oran için n = (z_α+z_β)²·[p₁q₁+p₂q₂]/Δ²).
|
||||
- **Örneklem küçük — huninin alt yarısında n = 3–28.** Aşağıdaki **her** oran "yön gösterir, kesin değil" kategorisindedir; **paydası 40'ın altındaki hiçbir yüzde karar için tek başına kullanılmamalı**. Ham kesirler ve GA'lar her satırda verildi.
|
||||
- **Huni sıralı değil, kesişimli.** Rybbit'te oturum içi bayraklarla kurulmuş bir huni bu; `/sonuc` bazı oturumlarda `sihirbaz_tamamlandi`'dan önce görülüyor (katalog kapısı akışı) ve `girisli oturum` sayısı `sihirbaz_tamamlandi`'nın alt kümesi değil (önceden giriş yapmış kullanıcılar da var). Bu yüzden adımlar arası oranlar "şu adımı yapanların şu kadarı diğerini de yaptı" diye okunmalı, "şu kadarı ilerledi" diye değil.
|
||||
- **Google OAuth dönüşü oturumu bölüyor** (01-analitik §2, madde "Ölçüm hatası"). Bu yüzden huni hem oturum hem cihaz bazında verildi; ikisi de aynı yönü gösteriyor.
|
||||
- **21 Eyl 15:20'den sonra 7 yeni olay canlıya çıktı** (`kapi_acildi`, `kapi_kapatildi`, `sonuc_goruntulendi`, `cta_form_goruntulendi`, `paket_goruntulendi`, `giris_basarili`, `liste_uretim_hata`) (03-donusum §7). 30 günlük seri bunlardan **önce** — bu rapordaki huni eski ölçüm setiyle kurulmuştur ve yeni olaylarla karşılaştırılamaz.
|
||||
- **21 Eyl 23:34 commit'leri (`ea3310a`, `992a01a`) canlıda mı bilinmiyor.** Katalogdaki kompakt sıra satırı (`universite-icerik.tsx:180`, `bolum-icerik.tsx:267`) ve üretim sonrası geçiş düzeltmesi bu commit'lerde; deploy Bilal'in kararı. **Doğrulanmalı.**
|
||||
- **7 günlük rakamlar şüpheli** (03-donusum §1a notu): 7g'de sıra girme oranının %12,6'ya çıkması iç filtrenin yakalamadığı QA/tarayıcı-ajanı trafiğiyle açıklanabilir. 7g sütunu bu raporda yalnız referans için var.
|
||||
- Bu raporda kişisel veri yok; iç hesaplar sayılmadı, kimlikler yazılmadı.
|
||||
|
||||
---
|
||||
|
||||
## 1. Huni — varış noktası `liste_olusturuldu`
|
||||
|
||||
### 1a. Oturum zinciri (30g, iç + bot hariç)
|
||||
|
||||
Kaynak: 03-donusum **§1a** (tüm ham sayılar). Oranlar ve GA'lar bu raporda hesaplandı.
|
||||
|
||||
| # | Adım | Kalan | Önceki adıma göre | %95 GA | Bu adımda kaybedilen | Ziyaretin %'si |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 0 | Ziyaret (gerçek oturum) | **621** | — | — | — | %100 |
|
||||
| 1 | `sira_girildi` | **28** | 28/621 = **%4,5** | 3–6 | **593** | %4,51 |
|
||||
| 2 | `sihirbaz_adim` adım=2 | 25 | 25/28 = %89 | 73–96 | 3 | %4,03 |
|
||||
| 3 | `sihirbaz_adim` adım=3 | 24 | 24/25 = %96 | 80–99 | 1 | %3,86 |
|
||||
| 4 | `sihirbaz_tamamlandi` | **22** | 22/24 = %92 | 74–98 | 2 | %3,54 |
|
||||
| 5 | `/sonuc` görüldü | 23 | *kesişim, alt küme değil* | — | — | %3,70 |
|
||||
| 6 | Oturumda giriş yapılmış ("tanımlı") | **14** | 14/22 = **%64** | 43–80 | 8 | %2,25 |
|
||||
| 7 | `/listem` görüldü | **7** | 7/14 = **%50** | 27–73 | **7** | %1,13 |
|
||||
| 8 | **`liste_olusturuldu`** | **3** | 3/7 = %43 | 16–75 | 4 | **%0,48** |
|
||||
| 9 | `kilit_goruntulendi` | 2 | 2/3 | — | 1 | %0,32 |
|
||||
| 10 | `/paket` | 1 | 1/2 | — | 1 | %0,16 |
|
||||
| 11 | `odeme_baslatildi` | **0** | — | — | 1 | %0 |
|
||||
|
||||
**Uçtan uca:** ziyaret → liste **3/621 = %0,48** (GA 0,2–1,4) · sıra → liste **3/28 = %10,7** (GA 4–27) · sihirbaz tamam → liste **3/22 = %13,6** (GA 5–33).
|
||||
|
||||
**En çok kaybeden adım, mutlak sayıyla:** adım 1 (ziyaret → sıra girişi), **593 kişi**.
|
||||
**En çok kaybeden adım, orandan sonra kalan hacme göre:** adım 6–8 zinciri — sihirbazı bitiren 22 kişinin **19'u** (%86) listeye hiç ulaşmıyor.
|
||||
|
||||
### 1b. Cihaz zinciri (30g, 576 cihaz) — OAuth'un oturum bölmesini aşmak için
|
||||
|
||||
Kaynak: 03-donusum **§1b**.
|
||||
|
||||
| Adım | Cihaz | Önceki adıma göre | %95 GA |
|
||||
|---|---|---|---|
|
||||
| Cihaz | 576 | — | — |
|
||||
| `sira_girildi` | 27 | %4,7 | 3–7 |
|
||||
| `sihirbaz_tamamlandi` | 22 | 22/27 = %81 | 63–92 |
|
||||
| `/sonuc` | 21 | 21/22 = %95 | 78–99 |
|
||||
| Tanımlı (girişli) | **8** | 8/21 = **%38** | 21–59 |
|
||||
| `/listem` | **4** | 4/8 = **%50** | 22–78 |
|
||||
| **`liste_olusturuldu`** | **3** | 3/4 = %75 | 30–95 |
|
||||
| `/paket` | 1 | — | — |
|
||||
| `odeme_baslatildi` | 0 | — | — |
|
||||
|
||||
Cihaz bazında da aynı iki delik: **/sonuc → giriş %38** ve **giriş → /listem %50**. Cihaz görünümünde üretimin kendisi (4 → 3) sorunsuz duruyor — yani liste üretimi teknik olarak çalışıyor, insan oraya varmıyor.
|
||||
|
||||
### 1c. Mobil / masaüstü
|
||||
|
||||
Kaynak: 03-donusum **§1a** mobil ve masaüstü sütunları.
|
||||
|
||||
| Adım | Mobil | Masaüstü |
|
||||
|---|---|---|
|
||||
| Ziyaret | 492 | 129 |
|
||||
| Tek sayfada çıkan | 362 (%74) | 78 (%60) |
|
||||
| `sira_girildi` | 20 (%4,1) | 8 (%6,2) |
|
||||
| `sihirbaz_tamamlandi` | 15 | 7 |
|
||||
| `/sonuc` | 15 | 8 |
|
||||
| `/giris` (botsuz) | ~10 | ~1 |
|
||||
| Girişli oturum | 12 | 2 |
|
||||
| `/listem` | 5 | 2 |
|
||||
| **`liste_olusturuldu`** | **2** (492'nin %0,41'i) | **1** (129'un %0,78'i) |
|
||||
|
||||
n = 2 ve n = 1. **Mobil–masaüstü farkı bu huniden okunamaz**; tek söylenebilir şey trafiğin %79'unun mobil olduğu ve sıra girişinin mobilde %4,1'e karşı masaüstünde %6,2 olduğu (ikisi de GA'ları çakışıyor). Tek istatistiksel olarak ayrışan mobil sinyal, dünkü raporlarda ölçülmüş olan **+ tıklama oranı**: mobil %11,9 (GA 9,7–14,4) vs masaüstü %3,8 (GA 1,7–7,9) (09-analitik-tur2 §Soru 1e).
|
||||
|
||||
### 1d. Giriş sayfası tipine göre
|
||||
|
||||
Kaynak: 03-donusum **§2 / Sızıntı 1** tablosu.
|
||||
|
||||
| Giriş sayfası | Oturum | Tek sayfa | `sira_girildi` | Oran | %95 GA |
|
||||
|---|---|---|---|---|---|
|
||||
| Ana sayfa `/` | 67 | 42 (%63) | **11** | **%16,4** | 9–27 |
|
||||
| `/rehber/*` | 73 | 63 (%86) | 5 | %6,8 | 3–15 |
|
||||
| `/universite/*` (1. sayfa) | 296 | 205 (%69) | 9 | %3,0 | 1,6–5,6 |
|
||||
| `/bolum/*` | 112 | 80 (%71) | 3 | %2,7 | 0,9–7,6 |
|
||||
| `/universite/*/sayfa/N` | 56 | 40 (%71) | **0** | %0 | 0–6,4 |
|
||||
| Diğer | 17 | 10 | 0 | — | — |
|
||||
|
||||
Giriş yapan 6 kişinin iniş sayfaları: ana sayfa 3, `/universite` 1, `/rehber` 1, `/bolum` 1 (03-donusum §5).
|
||||
|
||||
**`liste_olusturuldu`'nun giriş sayfası kırılımı dünkü raporlarda yok — ölçülemedi.** 3 listenin hangi iniş sayfasından geldiği bu verilerden çıkarılamıyor. Sıra girişi kaynağına göre kırılım var (03-donusum §3, olay sayısı): **kapı (katalogdaki +) 14 · ana sayfa hero 12 · düzenle 5 · katalog CTA formu 3**.
|
||||
|
||||
### 1e. 7 günlük (15–21 Eyl, 95 gerçek ziyaret) — yalnız referans
|
||||
|
||||
Ziyaret 95 → sıra 12 → tamam 9 → `/sonuc` 9 → `/giris` 6 → denendi 3 → girişli 9 → `/listem` 4 → **liste 2**. (03-donusum §1a.) Payda 4–12 arası; bu sütundan **hiçbir yön okunmamalı** (raporun kendi uyarısı: iç filtrenin yakalamadığı QA trafiği olabilir).
|
||||
|
||||
---
|
||||
|
||||
## 2. Koddan ölçüm deliği envanteri
|
||||
|
||||
### 2.1 `liste_olusturuldu` gerçekte nerede atılıyor
|
||||
|
||||
`src/features/rapor/components/liste-uretici.tsx:126-130` — **yalnızca** server action `listeOlustur()` `ok: true` döndüğünde:
|
||||
|
||||
```
|
||||
if (sonuc.ok) {
|
||||
olay("liste_olusturuldu", {
|
||||
tur: profil.tur,
|
||||
sira_kovasi: siraKovasi(profil.sira),
|
||||
});
|
||||
```
|
||||
|
||||
Bu bileşen `/listem?uret=1` ile gelindiğinde **mount'ta kendiliğinden** üretime başlıyor (`:162-176`); ayrı bir "üret" butonu yok. Yani `liste_olusturuldu` gerçekten "yapay zekâ listesi kuruldu" demek — adının söylediği şeyi ölçüyor. (Karşıt örnek: `program_eklendi` 21 Eyl öncesinde "+'ya basıldı" ölçüyordu — 09-analitik-tur2 §Soru 1.)
|
||||
|
||||
Olay 2 Ağu'dan beri kodda (commit `0b92f99`), yani 30 günlük pencerenin tamamını kapsıyor. **Rybbit'teki 3 kayıt gerçek.**
|
||||
|
||||
### 2.2 Ondan önceki adımlar ölçülüyor mu?
|
||||
|
||||
| Adım | Ölçülüyor mu | Kanıt (dosya:satır) |
|
||||
|---|---|---|
|
||||
| Sıralama girildi | ✅ `sira_girildi{kaynak, tur, sira_kovasi}` | `hero-form.tsx:82`, `cta-sira-form.tsx:149`, `tercih-profili-kapisi.tsx:197` |
|
||||
| Sıra formu hatası | ✅ `sira_form_hata{kaynak}` | `hero-form.tsx:88`, `cta-sira-form.tsx:156`, `tercih-profili-kapisi.tsx:203` |
|
||||
| Sihirbaz adım 1 | ❌ **ölçülmüyor** — `sihirbaz_adim` yalnız ileri geçişte ve adım 2'den itibaren atılıyor | `sihirbaz-adimlar.tsx:205` (`if (yeniAdim > adim)`) |
|
||||
| Sihirbaz adım 2–3 | ✅ `sihirbaz_adim{adim}` | `sihirbaz-adimlar.tsx:205` |
|
||||
| Sihirbaz tamamlandı | ✅ `sihirbaz_tamamlandi{...}` | `sihirbaz-adimlar.tsx:520` |
|
||||
| `/sonuc` görüntülemesi | ✅ `sonuc_goruntulendi{girisli, sira_kovasi}` — **21 Eyl'den beri** | `sihirbaz-cagri-karti.tsx:89-99` |
|
||||
| **`/sonuc` ana CTA tıklaması** | ❌ **ölçülmüyor** | `sihirbaz-cagri-karti.tsx:328-335` — `onClick={sihirbaziBaslat}`, hiç `olay()` yok |
|
||||
| **`/sonuc` sihirbaz modalı açıldı/kapandı** | ❌ **ölçülmüyor** | `sihirbaz-modal.tsx` içinde hiç `olay()` yok (katalog kapısında karşılığı var: `use-tercih-profili.ts:174` + `tercih-profili-kapisi.tsx:79`) |
|
||||
| Giriş denendi / başarılı / hata | ✅ `giris_denendi`, `giris_hata` (istemci) + `giris_basarili` (sunucu, 21 Eyl'den beri) | `giris-form.tsx:68,74,97,108`; `analitik-sunucu.ts:19` |
|
||||
| **`/listem` görüntülemesi** | ⚠️ **yalnız pageview** — özel olay yok | `src/app/listem/page.tsx` — sayfada hiç `olay()` yok |
|
||||
| **"Listemi oluştur" butonu tıklaması** | ❌ **ölçülmüyor** (bkz. §2.3 — aslında böyle bir buton yok) | — |
|
||||
| **Üretim denemesi başladı** | ❌ **ölçülmüyor** — `liste_uretim_basladi` yok | `liste-uretici.tsx:79-93` |
|
||||
| Kredi yetersiz | ✅ `kredi_bitti` (30g: **0 kayıt**) | `liste-uretici.tsx:143`, `tercih-degisti-modali.tsx:114` |
|
||||
| Üretim hatası | ⚠️ `liste_uretim_hata{kod}` — kod **21 Eyl'de** eklendi (`cf19903`); 30g penceresinde yoktu | `liste-uretici.tsx:117, 148, 171, 179` |
|
||||
| Kilit (ücretli içerik) görüldü | ✅ `kilit_goruntulendi` | `listem-govde.tsx:139,144` |
|
||||
| Rapor yazdırıldı (değerin tüketimi) | ❌ **ölçülmüyor** | `rapor-yazdir.tsx` / `yazdir-butonu.tsx`'te `olay()` yok |
|
||||
|
||||
### 2.3 Butona basıp liste alamayan kullanıcıyı görebiliyor muyuz? **Hayır.**
|
||||
|
||||
Önce bir yanlış anlamayı düzeltmek gerekiyor: **"listemi oluştur" diye basılan bir buton yok.** Üretim, kullanıcı `/listem?uret=1`'e vardığı anda otomatik başlıyor (`liste-uretici.tsx:204-215`). "Buton" dediğimiz şey aslında bu URL'ye götüren 4 ayrı yol:
|
||||
|
||||
1. `/sonuc`'ta sihirbazı tamamlama → `ilerle()` → `router.push("/listem?uret=1")` (`sihirbaz-cagri-karti.tsx:180-189`)
|
||||
2. `/sonuc`'ta hazır seçimlerle ana CTA'ya basma → aynı `ilerle()` (`:197-205`)
|
||||
3. `/listem` boş durumundaki CTA → `<Link href="/listem?uret=1">` (`listem-bos-cta.tsx:30`)
|
||||
4. Girişten dönüş → `callback=/listem?uret=1` (`sihirbaz-cagri-karti.tsx:185`)
|
||||
|
||||
Hiçbirinde tıklama olayı yok. Ve vardıktan sonra **dört sessiz dal** var:
|
||||
|
||||
| Dal | Kod | Kullanıcı ne görüyor | Olay |
|
||||
|---|---|---|---|
|
||||
| **Girişsiz geldi** | `listem-icerik.tsx:43` `verifySession(geriYol)` sunucuda `/giris`'e yönlendiriyor | Giriş sayfası | ❌ hiçbir şey — **`/listem` pageview'ı bile oluşmuyor** (sunucu yönlendirmesi HTML'den önce) |
|
||||
| **Profil bulunamadı** | `liste-uretici.tsx:205-213` — `tercihProfiliOku() ?? sunucuProfil` null | "Henüz Yapay Zeka listen yok" boş durumu | ❌ hiçbir şey |
|
||||
| **Oturum düşmüş (AUTH)** | `liste-uretici.tsx:145-146` — `router.push("/giris?callback=...")` | Giriş sayfası | ❌ hiçbir şey |
|
||||
| **Üretim sırasında terk** | 20–60 sn süren `await listeOlustur(...)` (`:110-115`); 90 sn sonra "uzun sürdü" ekranı (`:195-201`) | İskelet + "Listen hazırlanıyor" | ❌ hiçbir şey — sekme kapanırsa ne başarı ne hata düşer |
|
||||
|
||||
**22 Eyl notu — beşinci dal, bu rapor yazılırken bulundu.** Çalışma ağacında (commit'lenmemiş, başka bir ajanın/Bilal'in işi) `liste-uretici.tsx`'e yeni bir `sunucu-yok` durumu ve `liste_uretim_hata { kod: "SUNUCUYA_ULASILAMIYOR" }` olayı eklenmiş (`:165-180`, `/api/saglik` yoklaması). Kod yorumuna göre neden: liste DB'ye yazıldıktan sonra konteyner ölürse ters vekilin düz metin "Bad Gateway" cevabı geliyor ve WebKit bunu sayfa yerine **dosya olarak indiriyor** (iPad + Chrome raporu) — yani kullanıcı kredisini harcıyor, listesi kuruluyor ve ekranda bir `.txt` buluyor. Bu, "butona bastı, liste alamadı" dalının canlıda gerçekten yaşandığının ilk somut kanıtı ve §2.4'teki `liste_uretim_basladi` ihtiyacını güçlendiriyor: bugün bu vakanın **kaç kez yaşandığı** bilinmiyor, çünkü payda yok. Bu dosyaya dokunulmadı; satır numaraları çalışma ağacındaki hâle göredir.
|
||||
|
||||
Yani bugün Rybbit'te `liste_olusturuldu` = 3 görüyoruz ama **bunun paydası yok**. 22 sihirbaz tamamlayandan 19'unun hangi duvara çarptığı — giriş mi, profil kaybı mı, yavaşlık mı, hata mı, yoksa hiç oraya gitmemek mi — ölçümle ayrılamaz.
|
||||
|
||||
### 2.4 Eklenecek **tek** olay
|
||||
|
||||
```
|
||||
liste_uretim_basladi {
|
||||
kaynak: "sihirbaz" | "hazir_cta" | "bos_durum" | "giris_donusu",
|
||||
girisli: "evet" | "hayir",
|
||||
yeniden_deneme: "evet" | "hayir"
|
||||
}
|
||||
```
|
||||
|
||||
**Çağrı yeri:** `src/features/rapor/components/liste-uretici.tsx`, `uret()` fonksiyonunun ilk satırı (`:101-103`, `setDurum({ ad: "uretiliyor" })`'un yanına) — `olay()`, `olayBirKez()` değil; "Tekrar dene" (`:261`) de sayılmalı, `yeniden_deneme: "evet"` ile.
|
||||
|
||||
Bu tek olay huninin alt yarısının **paydasını** yaratır: `liste_uretim_basladi` sayısından `liste_olusturuldu` + `liste_uretim_hata` + `kredi_bitti` çıkarıldığında geriye kalan = **terk edilen üretim** (sekme kapatıldı / çok uzun sürdü). Bugün bu fark hesaplanamıyor.
|
||||
|
||||
`liste-uretici.tsx:101`'deki `uret()` çağrılmadan dönen iki dala ayrıca olay gerekir; ama `OlayAdi` birliğini büyütmemek için aynı olayın özelliğine sıkıştırılabilir:
|
||||
- `:212` profil-yok dalı → `liste_uretim_basladi { kaynak, sonuc: "profil_yok" }` (üretim başlamadı ama deneme sayılır)
|
||||
- Girişsiz sunucu yönlendirmesi (`listem-icerik.tsx:43`) istemci tarafında hiç mount olmadığı için **ancak sunucu olayıyla** (`analitik-sunucu.ts`, `giris_basarili` deseni) görülebilir — ikinci öncelik.
|
||||
|
||||
**Ek olarak (ikinci tur, tek satırlık işler):**
|
||||
- `sihirbaz_acildi {kaynak}` / `sihirbaz_kapatildi {adim}` → `sihirbaz-cagri-karti.tsx:197-205` ve `sihirbaz-modal.tsx` `onOpenChange`. Katalog kapısında karşılığı zaten var (`kapi_acildi`/`kapi_kapatildi`) — `/sonuc` modalı bu simetriyi kaçırıyor ve `/sonuc`'un asıl dönüşüm yüzeyi orası.
|
||||
- `listem_goruntulendi {rapor_var, girisli}` → `/listem` sayfasında; pageview yerine olay, çünkü OAuth dönüşü ve `?uret=1` varyantları pageview'ı bölüyor.
|
||||
|
||||
---
|
||||
|
||||
## 3. Girişin maliyeti
|
||||
|
||||
### 3.1 `/sonuc` → giriş → `/listem` zinciri (30g)
|
||||
|
||||
| Geçiş | Kesir | Oran | %95 GA | Kaynak |
|
||||
|---|---|---|---|---|
|
||||
| `/sonuc` → `/giris` görüldü (botsuz) | 11/23 | %48 | 29–67 | 03-donusum §1a |
|
||||
| `/giris` → `giris_denendi` | 6/11 | %55 | 28–79 | 03-donusum §1a, §6 |
|
||||
| `giris_denendi` → başarılı | **6/6** | **%100** | 61–100 | 03-donusum §6 (hepsi Google; `giris_hata` 0) |
|
||||
| `sihirbaz_tamamlandi` → girişli oturum | 14/22 | %64 | 43–80 | 03-donusum §1a |
|
||||
| **Girişli oturum → `/listem`** | **7/14** | **%50** | **27–73** | 03-donusum §1a |
|
||||
| `/listem` → `liste_olusturuldu` | 3/7 | %43 | 16–75 | 03-donusum §1a |
|
||||
| Cihaz bazında: `/sonuc` → tanımlı | 8/21 | %38 | 21–59 | 03-donusum §1b |
|
||||
| Cihaz bazında: tanımlı → `/listem` | 4/8 | %50 | 22–78 | 03-donusum §1b |
|
||||
|
||||
**Giriş mekanizması sorun değil: deneyen 6 kişinin 6'sı başardı.** Sorun (a) `/sonuc`'tan giriş sayfasına yalnız 11 kişinin gitmesi, (b) giden 11'in 5'inin butona bile basmaması, ve (c) **giriş yapanın yarısının listeye ulaşamaması**.
|
||||
|
||||
### 3.2 Giriş yapmış ama liste üretmemiş kullanıcı — davranış
|
||||
|
||||
Dünkü verilerden çıkarılabilenler (03-donusum §2/Sızıntı 3, §6):
|
||||
|
||||
- **Girişli ama `/listem`'i hiç görmeyen 7 oturum:** dünkü raporlarda bu 7 oturumun dizisi **yok** — sonraki davranışları **ölçülemedi**. Bu, Rybbit bağlanınca ilk sorulacak soru (§"Bilal'den istenen").
|
||||
- **`/listem`'i görüp liste üretmeyen 4 oturum:** yine dizi yok. Ancak ürettiklerinin dizisi var (03-donusum §2/Sızıntı 3, S9):
|
||||
- 28 Ağu mobil: rehber → sihirbaz → `/sonuc` → 7 program ekledi → `/listem` → **liste üretti** → kilit gördü → katalogda gezmeye devam (24 dk)
|
||||
- 17 Eyl masaüstü: **liste üretti** → kilit ×2 → danışmana 1 soru → çıktı (93 sn)
|
||||
- 21 Eyl mobil: sihirbaz → `/sonuc` → giriş CTA → Google → `/listem`
|
||||
- **Girişten sonra `/sonuc`'ta bekleyenler:** girişli 6 `/sonuc` oturumunun `/sonuc`'tan çıkışa medyan süresi 696 sn (mobil) ve 308 sn (masaüstü) — anonim kullanıcıların 33 sn'siyle kıyaslanınca giriş yapan kullanıcı **siteyi kullanıyor**, sadece yapay zekâ listesine gitmiyor (03-donusum §2/Sızıntı 2 tablosu).
|
||||
- **`kredi_bitti` 30g: 0.** Yani kimse "kredim yetmedi" duvarına çarpmadı; giriş yapan herkesin 5 deneme kredisi duruyordu. Liste üretmemenin nedeni kredi **değil**.
|
||||
|
||||
**Koddan en güçlü açıklama (koddan çıkarım):** girişten sonra listeye götüren yol kalıcı değil.
|
||||
- Navbar'da `/listem` linki yok: `src/components/site-header.tsx:8-36` (logo + katalog araması + `UserNav`) ve `src/features/kullanici/components/user-nav.tsx:45-63` (kredi pill'i → `/paket?kaynak=nav`, çıkış, `ListemButonu`).
|
||||
- `ListemButonu` "Kendi Listem" çekmecesidir, `/listem` değil — üstelik manuel liste boşken **hiç render edilmiyor** (`listem-butonu.tsx:24`: `if (liste.length === 0) return null;`). Kendi kod yorumu da bunu söylüyor: *"'Listem' adı Yapay Zeka raporunun yaşadığı /listem sayfasına aittir — isim çakışmasın"* (`:4-5`).
|
||||
- Varsayılan giriş callback'i `"/"`: `giris-karti.tsx:19-20`. Navbar'daki "Giriş yap" butonundan (`user-nav.tsx:39`) giren kullanıcı ana sayfaya düşer.
|
||||
- `/listem`'e giden tek kalıcı bağlantı manuel liste çekmecesinin dibindeki "Listemde aç" (`liste-cekmecesi.tsx:300-308`) — çekmece ise ancak manuel listede program varsa açılabiliyor.
|
||||
|
||||
Bu, "girişli 14 oturumun 7'si `/listem`'i hiç görmedi" bulgusunun en basit açıklaması: **kullanıcı listeye giden kapıyı bulamıyor.** n = 14 olduğu için bu bir hipotez, kanıt değil — ama düzeltmesi bir navbar linki kadar ucuz.
|
||||
|
||||
---
|
||||
|
||||
## 4. Sevk noktası envanteri (koddan çıkarım)
|
||||
|
||||
"Yapay zekâ listesi" hedefine götüren tüm giriş noktaları. **Kör nokta** = tıklandığı ölçülmüyor.
|
||||
|
||||
| # | Giriş noktası | Dosya:satır | Nerede görünür | Ölçüm |
|
||||
|---|---|---|---|---|
|
||||
| 1 | Ana sayfa hero sıra formu | `hero-form.tsx:82` | `/` ilk ekran | ✅ `sira_girildi{hero}` — ama **formun görüntülendiği ölçülmüyor** (hero'da `cta_form_goruntulendi` yok) |
|
||||
| 2 | Ana sayfa kapanış CTA ("Ücretsiz dene" / "Üniversitelere göz at") | `hero-focus-button.tsx:20-29, 46-57` | `/` en alt | ❌ **kör** |
|
||||
| 3 | Katalog/rehber sıra formu — alt kart | `cta-sira-form.tsx:112, 149` | `/universite/*`, `/bolum/*`, `/rehber/*`, `/rehber` (tablonun altında) | ✅ `cta_form_goruntulendi{konum}` + `sira_girildi{cta}` (21 Eyl'den beri) |
|
||||
| 4 | Katalog kompakt sıra satırı — başlık altı | `universite-icerik.tsx:180`, `bolum-icerik.tsx:267` | katalog ilk ekran | ✅ aynı olaylar, `konum:"ust"` — **ama commit `992a01a` 21 Eyl 23:34; canlıda mı doğrulanmalı** |
|
||||
| 5 | Katalog + butonu → tercih profili kapısı | `program-ekle-butonu.tsx:60`, `use-tercih-profili.ts:174` | katalog tabloları + `/sonuc` | ✅ `kapi_acildi{tetik}`, `kapi_kapatildi{adim}`, `sira_girildi{kapi}` |
|
||||
| 6 | Katalog arama modalındaki funnel kartı | `arama-funnel-karti.tsx:82-99` | **her sayfa** (header araması) | ❌ **kör** — üstelik sitedeki tek "her sayfada var" sevk noktası |
|
||||
| 7 | **`/sonuc` ana CTA "Yapay Zeka listemi kur"** | `sihirbaz-cagri-karti.tsx:328-335` | `/sonuc` tablo altı | ❌ **kör** — huninin en kritik butonu |
|
||||
| 8 | `/sonuc` sihirbaz modalı (7'nin açtığı) | `sihirbaz-modal.tsx` | `/sonuc` | ❌ **kör** — açılış/kapanış olayı yok; adım 1'de terk eden hiç görünmez |
|
||||
| 9 | `/sonuc` hazır panel (girişsiz, `?hazir=1`) | `sihirbaz-cagri-karti.tsx:272-306` | `/sonuc` tablo altı | ✅ `hazir_panel_goruntulendi` + `giris_cta_tiklandi{hazir_panel}` |
|
||||
| 10 | `/sonuc` tadımlık satırı CTA | `tadimlik-satiri.tsx:100, 184` | `/sonuc` | ⚠️ `tadimlik_goruntulendi` 30g'de **0 kayıt**; hook 21 Eyl'de düzeltildi, **hâlâ doğrulanmadı** (03-donusum §7) |
|
||||
| 11 | `/sonuc` "Listeni gör" (raporu olan kullanıcı) | `sihirbaz-cagri-karti.tsx:264-270` | `/sonuc` | ❌ **kör** |
|
||||
| 12 | Manuel liste çekmecesi — "Listemde aç" → `/listem` | `liste-cekmecesi.tsx:300-308` | çekmece (manuel listede ≥1 program varsa) | ❌ **kör** |
|
||||
| 13 | Manuel liste çekmecesi — "Giriş yap, kaydet" | `liste-cekmecesi.tsx:255-263` | çekmece | ✅ `giris_cta_tiklandi{liste_cekmecesi}` |
|
||||
| 14 | Kaydet banner | `kaydet-banner.tsx:43, 86` | liste ≥3 programda | ✅ `kaydet_banner_goruntulendi` + `giris_cta_tiklandi` (21 Eyl'den beri) |
|
||||
| 15 | `/listem` boş durum CTA "Yapay Zeka listeni kur" | `listem-bos-cta.tsx:30` | `/listem` (rapor yokken) | ❌ **kör** — üstelik profil yoksa CTA `/`'a gönderiyor, kullanıcı en baştan başlıyor |
|
||||
| 16 | `/paket` içindeki `/listem?uret=1` linki | `paket-satinal.tsx:157` | `/paket` | ❌ **kör** |
|
||||
| 17 | `/odeme/sonuc` "Listeni gör" | `odeme-sonuc-karti.tsx:64` | ödeme sonrası | ❌ **kör** |
|
||||
| 18 | `/odeme/sonuc` "24'lük listeni oluştur" (rapor yokken) | `rapor-yok-cta.tsx:24` | ödeme sonrası | ❌ **kör** |
|
||||
| 19 | `/meraklisina` demo kapanış CTA | `meraklisina-demo.tsx:244` | `/meraklisina` | ❌ **kör** |
|
||||
| — | **Navbar** | `site-header.tsx:8-36`, `user-nav.tsx:25-64` | **her sayfa** | ⛔ **hiç giriş noktası yok** — ne "listeni kur" ne `/listem` linki |
|
||||
|
||||
**Sayı:** 19 giriş noktası, **11'i kör** (2, 6, 7, 8, 11, 12, 15, 16, 17, 18, 19). Kalıcı/her sayfada görünen sevk noktası sayısı: **1** (#6, arama modalı içindeki funnel kartı) — ve o da kör.
|
||||
|
||||
**Ölü kod notu:** `src/features/liste/components/secimlerim-paneli.tsx` kendi CTA'sını taşıyor ama hiçbir yerden import edilmiyor (`grep -rn "SecimlerimPaneli" src/` yalnız kendi export satırını buluyor). Envantere dahil edilmedi; ayrı bir temizlik işi olarak işaretlendi.
|
||||
|
||||
---
|
||||
|
||||
## 5. Kaç veriye ihtiyacımız var
|
||||
|
||||
Varsayımlar: sezon dışı hız = son 7 günün gerçeği, **~95 ziyaret/hafta** (03-donusum §1a). 30 günlük hızlar bu orana ölçeklendi. Wilson %95 GA; önce/sonra karşılaştırmalarında güç %80, tek yönlü α = 0,10 (yön okumak için) ve parantezde çift yönlü α = 0,05.
|
||||
|
||||
### 5.1 Haftalık payda (sezon dışı tahmin)
|
||||
|
||||
| Adım | 30g toplam | 30g/hafta | Sezon dışı tahmin (95 ziyaret/hafta) |
|
||||
|---|---|---|---|
|
||||
| Ziyaret | 621 | 145 | **95** |
|
||||
| `sira_girildi` | 28 | 6,5 | **4,3** |
|
||||
| `sihirbaz_tamamlandi` | 22 | 5,1 | **3,4** |
|
||||
| Girişli oturum | 14 | 3,3 | **2,1** |
|
||||
| `/listem` | 7 | 1,6 | **1,1** |
|
||||
| `liste_olusturuldu` | 3 | 0,7 | **0,5** |
|
||||
|
||||
### 5.2 Bir iyileştirmenin işe yaradığını anlamak için gereken süre
|
||||
|
||||
| Ölçülecek şey | Gereken n | Payda/hafta | Hafta/kol | Toplam süre |
|
||||
|---|---|---|---|---|
|
||||
| Ziyaret → liste tek oranı ±0,5 puanla okumak (p≈%0,5) | 734 ziyaret | 95 | — | **~8 hafta** |
|
||||
| Ziyaret → liste **3×'e** çıktı mı (%0,48 → %1,44) | 928/kol | 95 | 10 | **~20 hafta** (çift yönlü 34) |
|
||||
| Ziyaret → sıra **2×** (%4,5 → %9) | 278/kol | 95 | 3 | **~6 hafta** (çift yönlü 10) |
|
||||
| Tamamlandı → liste %14 → %40 | 24/kol | 3,4 | 7 | **~14 hafta** |
|
||||
| Girişli oturum → `/listem` %50 → %80 | 21/kol | 2,1 | 10 | **~19 hafta** |
|
||||
| `/listem` → liste %43 → %75 | 19/kol | 1,1 | 18 | **~36 hafta** |
|
||||
| Tamamlandı → liste oranını ±10 puanla okumak | 46 | 3,4 | — | **~14 hafta** |
|
||||
|
||||
**Okuma:** sezon dışında **hiçbir oran** makul sürede okunamıyor. Tek makul aday "ziyaret → sıra girişi"nin ikiye katlanması (~6 hafta/önce-sonra toplamı). `liste_olusturuldu`'nun kendisini oran olarak izlemek **2027 tercih sezonuna kadar anlamsız** — bu, dünkü 09-analitik-tur2 §Soru 2'nin sonucuyla birebir aynı yöne çıkıyor.
|
||||
|
||||
### 5.3 O hâlde ne yapılmalı
|
||||
|
||||
1. **Oran değil, adet izleyin.** Haftada ~0,5 liste, ~2 girişli oturum, ~3,4 sihirbaz tamamlama var — bunların **hepsi tek tek okunabilir**. Rybbit bağlanınca haftada 30 dakikalık sabit bir ritüel: `liste_uretim_basladi` atan her oturumun zaman çizelgesini tek tek oku.
|
||||
2. **A/B testi yapmayın.** Trafiği ikiye bölmek her kolu 47 ziyaret/haftaya düşürür; yukarıdaki sürelerin hepsi ikiye katlanır. Tek varyant yayınlayıp önce/sonra bakın, ve yalnız **≥3× fark beklenen** değişiklikleri deneyin (dünkü 09-analitik-tur2 §"Düşük trafikte A/B yerine ne yapılmalı" ile aynı tavsiye).
|
||||
3. **Sağlık kontrolü ≠ oran.** Yeni `liste_uretim_basladi` canlıya çıktıktan sonraki ilk 2 hafta tek soru: olay düşüyor mu, ve `liste_uretim_basladi − (liste_olusturuldu + liste_uretim_hata + kredi_bitti)` farkı kaç? O fark "sessiz terk"in ilk ölçümüdür.
|
||||
|
||||
### 5.4 Kaldıraç — hangi adımı düzeltmek kaç liste getirir
|
||||
|
||||
Bugünkü ölçülmüş oranlarla basit aritmetik (n küçük, **yön gösterir**):
|
||||
|
||||
| Senaryo | 621 ziyaret → | Aylık liste |
|
||||
|---|---|---|
|
||||
| **Bugün** | 28 sıra → 22 tamam → 3 liste | **3** |
|
||||
| Üst huni 2× (ziyaret→sıra %9), alt huni aynı | 56 → 44 → 6 | **6** |
|
||||
| Alt huni düzelir (tamam→liste %50), üst aynı | 28 → 22 → 11 | **11** |
|
||||
| İkisi birden | 56 → 44 → 22 | **22** |
|
||||
|
||||
Alt huni bugün ziyaretin **%86'sını çöpe atıyor** ve düzeltmeleri (navbar linki, üretim ölçümü, giriş dönüşü) kod olarak üst huniden çok daha ucuz. **Trafik işine yatırım yapmadan önce alt huni kapatılmalı.**
|
||||
|
||||
---
|
||||
|
||||
## 6. Öncelik tablosu
|
||||
|
||||
| # | Bulgu | Kanıt | Önerilen iş (backlog önerisi) | Beklenen etki | Kesinlik |
|
||||
|---|---|---|---|---|---|
|
||||
| 1 | Üretim denemesinin paydası hiç ölçülmüyor; butona basıp liste alamayan görünmez | `liste-uretici.tsx:101-151, 205-213` (koddan) | `liste_uretim_basladi {kaynak, girisli, yeniden_deneme}` — `uret()`'in ilk satırı (§2.4) | Huninin alt yarısını ilk kez ölçülebilir kılar; başka hiçbir iş bu olmadan doğrulanamaz | **Yüksek** (kod kesin) |
|
||||
| 2 | Girişli 14 oturumun 7'si `/listem`'i hiç görmedi; navbar'da `/listem` linki yok, giriş callback'i `"/"` | 03-donusum §1a; `site-header.tsx:8-36`, `user-nav.tsx:45-63`, `giris-karti.tsx:19-20` (koddan) | Girişli kullanıcıya navbar'da kalıcı "Listem" girişi (rapor varsa "Listeni gör", yoksa "Listeni kur"); navbar girişinde callback `/listem` | Girişli → `/listem` %50'den yukarı; kayıtlı kullanıcı = geri dönüş kancası | Orta (n=14, yön kuvvetli; kök neden koddan kesin) |
|
||||
| 3 | `/sonuc`'un ana CTA'sı ve sihirbaz modalı tamamen kör | `sihirbaz-cagri-karti.tsx:328-335`, `sihirbaz-modal.tsx` (koddan) | `sihirbaz_acildi{kaynak}` / `sihirbaz_kapatildi{adim}` — katalog kapısındaki desenin aynısı | `/sonuc`'taki terkin hangi adımda olduğunu ilk kez gösterir | **Yüksek** (kod kesin) |
|
||||
| 4 | Sihirbazı bitiren 22 kişiden 19'u listeye ulaşmıyor; kredi sebep değil (`kredi_bitti`=0) | 03-donusum §1a, §2/Sızıntı 3 | Girişten dönüşte üretimin gerçekten başladığını QA ile uçtan uca doğrula (Google OAuth → `/listem?uret=1` → liste) | Tek satışa giden yolun çalıştığından emin olmak | Orta (n=22) |
|
||||
| 5 | 11 sevk noktası kör; kalıcı (her sayfada) sevk noktası yok | §4 tablosu (koddan) | Kör noktalara tek ortak olay: `sevk_tiklandi {yuzey}`; ve ürün kararı — her sayfada kalıcı bir sevk yüzeyi olmalı mı | Sevk noktalarının hangisinin çalıştığı bilinmiyor; ölçmeden yüzey eklemek kör | Orta |
|
||||
| 6 | `tadimlik_goruntulendi` 30g'de 0; hook düzeltmesi sonrası hâlâ doğrulanmadı | 03-donusum §7 | Rybbit bağlanınca ilk bakılacak: 21 Eyl sonrası kaç kayıt var | Ölçüm | Yüksek |
|
||||
| 7 | `rapor_yazdirildi` yok — ücretli değerin tüketildiği hiç ölçülmüyor | `rapor-yazdir.tsx`, `yazdir-butonu.tsx` (koddan) | Yeni olay (düşük öncelik; önce hacim) | Ödeme sonrası değer sinyali | Yüksek (kod kesin), düşük öncelik |
|
||||
| 8 | Katalogdaki kompakt sıra satırı ve üretim geçiş düzeltmesi canlıda mı bilinmiyor | commit `992a01a`, `ea3310a` (21 Eyl 23:34) | Deploy durumunu doğrula; deploy tarihini ölçüm serisine not düş | Seri kırılması yönetimi | Yüksek |
|
||||
| 9 | Liste kurulduktan sonra sunucu ölünce kullanıcı ekrana `.txt` indiriyor (iPad/WebKit) — kredi yandı, liste teslim edilmedi | çalışma ağacındaki `liste-uretici.tsx:159-180` yorumu + yeni `SUNUCUYA_ULASILAMIYOR` kodu (koddan) | Düzeltme zaten yazılmış; **canlıda kaç kez yaşandığı ölçülemedi** — `liste_uretim_basladi` (#1) olmadan geriye dönük sayılamaz | Ödenen/harcanan kredinin teslim edilmemesi — güven maliyeti | Yüksek (kod kesin), sıklık bilinmiyor |
|
||||
|
||||
---
|
||||
|
||||
## 7. Tek cümlelik teşhis
|
||||
|
||||
> **Bu ürünün büyümesini kesen tek adım, sihirbazı bitirmiş kullanıcıyı yapay zekâ listesine taşıyan adımdır: 30 günde 22 kişi sihirbazı tamamladı, 3'ü liste aldı (%13,6) — ve o 19 kişinin nerede kaybolduğunu bugünkü ölçümle söylemek imkânsız, çünkü üretim denemesinin kendisi hiç ölçülmüyor.**
|
||||
|
||||
(Mutlak sayıyla en büyük kayıp hâlâ ziyaret → sıra girişi, 593 kişi; ama alt huni %86 sızdırırken üst huniye trafik eklemek o trafiği çöpe atmak demek — §5.4.)
|
||||
|
||||
---
|
||||
|
||||
## 8. Bu vardiyada yapılamayanlar
|
||||
|
||||
- Canlı Rybbit sorgusu (MCP bağlı değil). `liste_olusturuldu`'nun giriş sayfası kırılımı, girişli ama `/listem`'i görmeyen 7 oturumun dizisi, 21 Eyl sonrası yeni olayların durumu — hepsi **ölçülemedi**.
|
||||
- `liste_uretim_hata`'nın canlıda hiç düşüp düşmediği (kod 21 Eyl'de eklendi, dünkü raporda 0) — **doğrulanmalı**.
|
||||
- Mobil/masaüstü liste üretim farkı: n = 2 ve 1, **ölçülemez**.
|
||||
- Analitik verisinde bana yönelik talimat içeren içerik görülmedi (dünkü raporlardaki bozuk URL parçaları HTML kırıntısı, komut değil).
|
||||
|
||||
---
|
||||
|
||||
## Bilal'den istenen
|
||||
|
||||
1. **Rybbit MCP'yi bu projeye bağla** (`.mcp.json` + `.env`); bağlanınca ilk üç sorgu hazır: (a) girişli ama `/listem` görmeyen 7 oturumun zaman çizelgesi, (b) 21 Eyl sonrası `tadimlik_goruntulendi` / `liste_uretim_hata` sayısı, (c) `/listem?uret=1` pageview sayısı (bugünkü en iyi üretim-denemesi vekili) — **10 dk**.
|
||||
2. **21 Eyl 23:34 commit'lerinin (`992a01a` kompakt sıra satırı, `ea3310a` üretim geçişi) canlıda olup olmadığını söyle**; ölçüm serisinin kırılma tarihi buna bağlı — **5 dk**.
|
||||
3. **Karar:** girişli kullanıcıya navbar'da kalıcı "Listem" girişi eklensin mi (öneri #2)? Ölçüm işi (#1, #3) ajan yetkisinde ama bu bir UI/bilgi mimarisi kararı — **5 dk**.
|
||||
94
docs/ekip-raporlari/2026-09-22/01-tarayici-isleri.md
Normal file
94
docs/ekip-raporlari/2026-09-22/01-tarayici-isleri.md
Normal file
@@ -0,0 +1,94 @@
|
||||
# Tarayıcı işleri — 22 Eylül 2026
|
||||
|
||||
Bilal'in Chrome oturumu üzerinden yapıldı. Hesap açma, şifre/kart girme, dosya indirme ve
|
||||
e-posta gönderme yapılmadı; bunlar aşağıda "sende kalanlar" başlığında.
|
||||
|
||||
## 1. Rybbit — yapıldı
|
||||
|
||||
Sürüm **v2.8.0** (panel "v2.9.1 mevcut" diyor), site `kolaytercih.com` (siteId 1).
|
||||
|
||||
| İş | Durum | Nasıl |
|
||||
|---|---|---|
|
||||
| Web Vitals aç | ✅ `webVitals: true` | Panelde **toggle yok**: v2.8.0 arayüzünde Web Vitals anahtarı `IS_CLOUD` koşuluna bağlı (bundle'da `...IS_CLOUD && !mobile ? [{id:"webVitals" …, badge:"Pro"}] : []`) → self-hosted kurulumda hiç çizilmiyor. Alan sunucuda var; panelin kendi uç noktasıyla açıldı: `PUT /api/sites/1/config`. Doğrulama: `GET /api/sites/1` → `webVitals: true`, ve betiğin okuduğu genel uç `GET /api/site/tracking-config/1` → `webVitals: true`. |
|
||||
| İç trafik filtresi | ✅ kısmen | Site Settings → Exclusions → IP Exclusions: **94.54.157.194** (bu oturumun çıkış IP'si) eklendi ve kaydedildi (`excludedIPs: ["94.54.157.194"]`). |
|
||||
|
||||
**Değişmeyenler (elle kontrol edildi):** `blockBots: true`, `trackIp: true`, `saltUserIds: false`,
|
||||
`public: false`, `firstPartyProxy: false`, `sessionReplay` kapalı, tüm `track*` bayrakları eskisi gibi.
|
||||
|
||||
**Uyarılar:**
|
||||
- `data-web-vitals="true"` betik özniteliği bu işi **çözmezdi**: betik `y.webVitals ?? f.enableWebVitals`
|
||||
diyor, sunucu `false` (null değil) döndüğü için öznitelik hiç devreye girmiyordu. Doğru yer sunucu alanıydı.
|
||||
- Veri ancak canlı sayfa betiği yeni yapılandırmayı çektikten **sonra** birikir; geçmişe dönük LCP/INP/CLS yok.
|
||||
- IP dışlaması yalnız **bundan sonrasını** etkiler; geçmiş kirli veri temizlenmez.
|
||||
- Ev/ofis IP'si dinamikse değişir; ayrıca trafiğin %79'u mobil ve mobil testler **hücresel IP'den** geldiği
|
||||
için IP filtresi kendi telefon testlerini yakalamaz. Kalıcı çözüm: test cihazlarında
|
||||
`localStorage` tabanlı bir opt-out ya da ayrı bir `tag`/`user_id` ile filtre.
|
||||
- Rybbit v2.8.0'da **Google Search Console entegrasyonu uçları var** (`/api/sites/1/gsc/connect`);
|
||||
panelde görünmüyorsa sürüm yükseltmesiyle gelebilir — Search Console verisini Rybbit'e bağlamak
|
||||
ayrı bir iş olarak değerlendirilebilir.
|
||||
|
||||
## 2. Google Search Console — okundu (değişiklik yapılmadı)
|
||||
|
||||
Mülk `bilalgursen777@gmail.com` hesabında **değil**; oturumdaki ikinci Google hesabında
|
||||
(`authuser=1`). SEO planının istediği dört başlık:
|
||||
|
||||
1. **Mülk türü: Alan adı** (`sc-domain:kolaytercih.com`) → www ve http varyantları zaten kapsanıyor,
|
||||
yeni mülk eklemeye gerek yok.
|
||||
2. **Sitemap:** `https://kolaytercih.com/sitemap.xml` — gönderim 21 Eyl 2026, son okuma 21 Eyl 2026,
|
||||
durum **Başarılı**, keşfedilen sayfa **897** (raporun beklentisi 903'tü; 6 fark incelenebilir).
|
||||
3. **Dizine ekleme (son güncelleme 18.09.2026):** dizinde **947**, dizin dışı **93**, 4 neden —
|
||||
*Tarandı, şu anda dizine eklenmiş değil* 62 · *Keşfedildi, şu anda dizine eklenmiş değil* 23 ·
|
||||
*Kullanıcı tarafından seçilen standart sayfa olmadan kopya* 4 · *Yönlendirmeli sayfa* 4.
|
||||
**"Bulunamadı (404)" ve "Yumuşak 404" satırı yok.** T1'in (soft 404) taban çizgisi budur:
|
||||
bugün sıfır; arşive taşınan 25 slug Google'a henüz yumuşak 404 olarak yansımamış.
|
||||
4. **Üretken yapay zekâ raporu:** 28 gün → **3,8 B gösterim**; 3 ay (20 Haz–19 Eyl) → **5,63 B gösterim**,
|
||||
427 sayfa. 28 günün ilk sayfaları: `rehber/siralama-sartlari-2026` 250 ·
|
||||
`universite/mimar-sinan-guzel-sanatlar-universitesi` 219. 3 ayın ilk üçü:
|
||||
`rehber/kac-siralama-ile-hangi-bolume-girebilirim` 328 · `rehber/siralama-sartlari-2026` 309 ·
|
||||
`universite/mimar-sinan-guzel-sanatlar-universitesi` 231.
|
||||
Web araması: 3 ayda 825 tıklama, 75,3 B gösterim, TO %1,1, ortalama konum 15,2.
|
||||
|
||||
Not: `universite/*/sayfa/N` sayfaları AI gösterimi de alıyor (Selçuk/sayfa/5 153, KTÜ/sayfa/2 96,
|
||||
Uşak/sayfa/3 62) — T4'ün (sayfalama URL'lerini sitemap'e alma) gerekçesini güçlendiriyor.
|
||||
|
||||
## 3. Yandex Webmaster — ✅ doğrulandı
|
||||
|
||||
- Yandex hesabına giriş Bilal tarafından yapıldı (ajan hesap açamaz/şifre giremez).
|
||||
- `https://kolaytercih.com` Webmaster'a eklendi.
|
||||
- Cloudflare'da (`kolaytercih.com` zone) TXT kaydı eklendi: ad `@`, içerik
|
||||
`yandex-verification: bbd3b26245d9d086`, TTL Auto. Kayıt sayısı 10 → 11.
|
||||
Yayılım doğrulandı: `dig +short TXT kolaytercih.com` hem 1.1.1.1 hem 8.8.8.8'de kaydı döndürüyor
|
||||
(mevcut iki `google-site-verification` kaydı bozulmadı).
|
||||
- Webmaster → "Verify" → **Owner** rolü verildi (yöntem: DNS record, kod `bbd3b26245d9d086`).
|
||||
- Site haritası gönderildi: `https://kolaytercih.com/sitemap.xml`, 22.09.2026, durum
|
||||
**işleme kuyruğunda** (Yandex'te işlenmesi 1–2 hafta sürebilir).
|
||||
- Meta etiketi alternatifi hâlâ geçerli ve T3 ile birlikte sigorta olarak eklenebilir:
|
||||
`<meta name="yandex-verification" content="bbd3b26245d9d086" />`.
|
||||
- Yapılmadı: "Yandex Turbo" vb. teklifler (gelmedi; gelirse reddedilecek).
|
||||
|
||||
## 4. YÖK İstatistik Excel'leri — indirildi
|
||||
|
||||
İzninle indirildi ve repoya kondu (`data/kaynak/`):
|
||||
|
||||
| Dosya | Kaynak | Boyut | İçerik |
|
||||
|---|---|---|---|
|
||||
| `yok-istatistik-ogrenci-sayilari-2025-2026.xls` | istatistik.yok.gov.tr → Öğrenci İstatistikleri → Öğrenci Sayıları → *Üniversite Bazında Öğrenci Sayıları*, öğretim yılı 2025-2026 | 251 KB | 717 satır × 20 sütun. Başlıklar: Üniversite Adı · Tür · İl · Öğrenim Türü · Okuyan Önlisans/Lisans/Yükseklisans/Doktora · Genel Toplam (her biri 3 alt sütun) |
|
||||
| `yok-istatistik-ogretim-elemani-sayilari-2025-2026.xls` | aynı site → Öğretim Elemanı İstatistikleri → Öğretim Elemanı Sayıları → *Üniversite Bazında Öğretim Elemanı Sayıları*, 2025-2026 | 94 KB | 224 satır × 22 sütun (206 üniversite). Başlıklar: Üniversite Adı · Üniversite Türü · İl Adı · Profesör · Doçent · Doktor Öğretim Üyesi · Öğretim Görevlisi · Araştırma Görevlisi · Genel Toplam (her biri 3 alt sütun) |
|
||||
|
||||
Biçim: JasperReports üretimi gerçek BIFF8 `.xls` (pandas `read_excel` ile açılıyor; `xlrd` gerekiyor).
|
||||
Başlık iki satıra yayıldığı ve her ölçü 3 birleştirilmiş alt sütuna bölündüğü için ayrıştırıcı
|
||||
**satır 0–2'yi atlayıp** sütunları elle eşlemeli. Bu, `06-uni-veri.md` §4'teki 1. ve 2. alanların
|
||||
(öğrenci sayısı, öğretim elemanı sayısı ve öğrenci/öğretim üyesi oranı) ön koşuluydu — kalktı.
|
||||
|
||||
## 5. URAP izin e-postası — taslak hazır, gönderilmedi
|
||||
|
||||
Adres **info@urapcenter.org** (urapcenter.org iletişim sayfası). Taslak:
|
||||
`docs/ekip-raporlari/2026-09-22/urap-izin-eposta-taslagi.md`. Ajan senin adına e-posta göndermez;
|
||||
metni olduğu gibi kopyalayıp gönderebilirsin.
|
||||
|
||||
## 6. Sende kalanlar
|
||||
|
||||
- **Yandex:** 1–2 hafta sonra sitemap işlendi mi ve "Site tanılama"da uyarı var mı bak.
|
||||
- **URAP:** taslağı gönder.
|
||||
- **Rybbit:** kendi telefonun/test cihazların için IP dışında bir dışlama yöntemi kararı
|
||||
(mobil hücresel IP'ler filtreye takılmıyor).
|
||||
214
docs/ekip-raporlari/2026-09-22/02-sevk-yollari-ux.md
Normal file
214
docs/ekip-raporlari/2026-09-22/02-sevk-yollari-ux.md
Normal file
@@ -0,0 +1,214 @@
|
||||
# 02 — Sevk yolları: ziyaretçiyi yapay zekâ listesine götüren yol haritası ve eleştirisi
|
||||
|
||||
Hazırlayan: Tasarımcı · 22 Eyl 2026 gündüz · Yöntem: **koddan denetim** (tarayıcı açılmadı, ekran ölçülmedi).
|
||||
Sayısal kaynak: `docs/ekip-raporlari/2026-09-21/03-donusum.md` (Rybbit, 30g, iç trafik hariç).
|
||||
Piksel/ekran tahminleri "koddan çıkarım" olarak işaretlendi; doğrulaması Bilal'de.
|
||||
|
||||
## Sade özet (5 satır)
|
||||
|
||||
1. **"Yapay zekâ" kelimesi, ziyaretçinin ilk gördüğü ekranların hiçbirinde geçmiyor.** Organik trafiğin indiği katalog sayfalarında funnel'ın tamamı (`cta-sira-form.tsx` kompakt satır → çekmece → sihirbaz) ürünü "Programları gör" / "Ücretsiz tablonu gör" diye satıyor; 24'lük yapay zekâ listesinden ilk kez `/sonuc`'un ~3. ekranında söz ediliyor. Ziyaretçi kapılardan geçerken ardında ne olduğunu **bilmiyor**.
|
||||
2. **En büyük sıra kaynağı hiçbir yere gitmiyor.** `sira_girildi{kaynak:kapi}` 30 günde 14 olayla en büyük kaynak (03-donusum §3); bu yol (`+` toast'ı → profil kapısı) sihirbazın 3 adımını da doldurtuyor, sonra `profilTamamlandi` `null` döndürüyor (`use-tercih-profili.ts:346`) ve kullanıcı "Tercihlerin kaydedildi." toast'ıyla kataloğda kalıyor. **Liste için gereken her şey toplandı, liste teklif edilmedi.**
|
||||
3. **Ürünün tek gerçek değer önizlemesi ölü bölgede.** `TadimlikSatiri` (gerçek LLM gerekçesi + risk + trend) yalnızca `/sonuc`'ta, 60 satırlık tablonun altında render ediliyor (`sonuc/page.tsx:117`); `tadimlik_goruntulendi` 30 günde **0**. Ana sayfada, katalogda, rehberde listenin çıktısı hiç gösterilmiyor — 3 kutu metin ve bir karşılaştırma tablosu var.
|
||||
4. **`/sonuc` ödül sayfası olarak kurulmamış.** Sihirbazı bitiren kullanıcının gördüğü ilk şey, hiç kullanmadığı manuel listenin **boş gri placeholder'ı** (`manuel-harita.tsx:71-79`); yapay zekâ paneli ~3–4 ekran aşağıda (koddan çıkarım). Ölçüm bunu doğruluyor: panel 17 anonimin 6'sına göründü, 0 tık.
|
||||
5. **Kapı sayısı fazla değil, kapıların sırası ve sessizliği sorun.** Girişsiz kullanıcı için listeye giden en kısa yol 4 kapı / 7 ekran / ~9 tık; kapılardan ikisi (sihirbaz, giriş) meşru, ama ikisi de **ne kazandıracağı söylenmeden** açılıyor.
|
||||
|
||||
---
|
||||
|
||||
## 1. Yol envanteri — listeye ulaşan her yol
|
||||
|
||||
Ortak kısaltma: **S** = sihirbaz (3 adım: alan → il → devlet/vakıf, `sihirbaz-adimlar.tsx:276, 296, 434`).
|
||||
Kapılar: **K1** sıra girme · **K2** sihirbaz · **K3** Google girişi · **K4** kredi (üretim 3 kredi, yeni hesapta 5 deneme kredisi).
|
||||
|
||||
### Yol A — Ana sayfa (30g: 67 oturum → 11 sıra, %16,4; en iyi dönüşen yol)
|
||||
|
||||
| # | Ekran | Ne yapılıyor | Dosya |
|
||||
|---|---|---|---|
|
||||
| 1 | `/` hero | puan türü çipi + sıralama + "Yapay Zeka listemi kur" | `app/page.tsx:244` → `hero-form.tsx:188-196` |
|
||||
| 2–4 | Dialog (S) | 3 adım, son buton girişsizde **"Ücretsiz tablonu gör"** | `hero-form.tsx:209-228`, etiket `:222` |
|
||||
| 5 | `/sonuc?hazir=1` | harita placeholder → tablo → tadımlık → hazır panel | `hero-form.tsx:104`, `sonuc/page.tsx:102-126` |
|
||||
| 6 | `/giris?callback=/listem?uret=1` | Google | `sihirbaz-cagri-karti.tsx:245` |
|
||||
| 7 | `/listem?uret=1` | üretim (~20 sn tipik, 60 sn sunucu sınırı) | `liste-uretici.tsx:42-45` |
|
||||
|
||||
**7 ekran · ~9 tık · 4 kapı.** Girişli kullanıcıda 5. ekran boşa gider: `/sonuc` tam tabloyu render eder, sonra `router.replace("/listem?uret=1")` ile sekilir (`sihirbaz-cagri-karti.tsx:209-219`).
|
||||
|
||||
### Yol B — `/universite/[slug]` ve `/bolum/[slug]` üst kompakt satır (30g: 464 oturum → 12 sıra, %2,6)
|
||||
|
||||
1. Kompakt satır: başlık + özet paragrafının altında, tablo/istatistik ızgarasının üstünde (`universite-icerik.tsx:180, 290, 352`; `bolum-icerik.tsx:267`). CTA: **"Programları gör"** (`cta-sira-form.tsx:254`).
|
||||
2. Gönderince çekmece **doğrudan sihirbaz adımıyla** açılır (`cta-sira-form.tsx:145-148`); kompakt varyantta çekmecenin tanıtım/kanıt ekranı (`SectionEyebrow "Saniyede gör"` + "24 tercihlik plan / Risk analizi / YÖK Atlas verisi" üçlüsü) **hiç render edilmez** — koşul `!kompakt && adim === "sira"` (`:296`).
|
||||
3. S 3 adım → "Ücretsiz tablonu gör" (`:334`) → `/sonuc?hazir=1` (`:172`) → Yol A'nın 5–7. adımları.
|
||||
|
||||
**8 ekran · ~9 tık · 4 kapı.** Bu yolda ziyaretçi "yapay zekâ", "24 tercih", "risk analizi" ifadelerinin **hiçbirini** görmez (grep: `src/features/katalog/components/*.tsx` + kompakt dal → 0 eşleşme).
|
||||
|
||||
### Yol C — Katalog alt kartı (tablonun ve sayfalamanın altı)
|
||||
|
||||
`universite-icerik.tsx:381`, `bolum-icerik.tsx:297`. Kart varyantı: başlık + `KATALOG_CTA_ACIKLAMA` (`sayfalama.tsx:40`) + "Sıralamanı gir, programları gör" → çekmecenin **sıra adımı** açılır (kanıt üçlüsü burada görünür) → S → `/sonuc`. **9 ekran**, üstteki satırdan 1 tık fazla. 30g'de 20 satır/dilim × 3 dilim tablonun altında; mobilde ~1.500 px aşağıda (koddan çıkarım).
|
||||
|
||||
### Yol D — `+` (tabloya program ekleme) kapısı — **30g'deki en büyük sıra kaynağı: 14 olay**
|
||||
|
||||
1. Tablodaki `+` (`program-ekle-butonu.tsx:105`, `size-11` — dokunma hedefi doğru).
|
||||
2. Profilsiz eklemede toast: "Seçtiklerine eklendi · Sıralamanı girersen bu programın risk seviyesini de gösteririz." + aksiyon "Sıralamamı gir" (`:69-83`).
|
||||
3. Aksiyon `profilToplamaAc(null, true, "arti_toast")` → kapı **sıra adımıyla** açılır → S 3 adım.
|
||||
4. **`hedef = null` → `profilTamamlandi` `null` döndürür → yönlendirme yok** (`use-tercih-profili.ts:327-346`). Kullanıcı "Tercihlerin kaydedildi." toast'ıyla (`tercih-profili-kapisi.tsx:238`) kataloğa geri düşer.
|
||||
|
||||
**Sonuç: 4 ekran, 2 kapı geçildi, liste teklif edilmedi.** Aynı ölü uç manuel liste çekmecesindeki "Sıralamamı gir" butonunda da var (`liste-cekmecesi.tsx:296-298`, aynı çağrı).
|
||||
|
||||
### Yol E — Navbar "Sıralama gir" (mobilde kalıcı, sticky 2. satır)
|
||||
|
||||
`katalog-arama.tsx:366` (mobil) / `:302` (lg+) → `sonucaGitIste({dogrudanSira:true})` → kapı (tanıtım adımı atlanır, doğru) → S → `hedef="sonuc"` → `sonucHref()` **parametresiz**. `/sonuc`'ta `hazir=1` olmadığı için hazır panel yerine genel panel ("24 tercihi tek tek elemek yerine, yapay zekâ kursun", `sihirbaz-cagri-karti.tsx:312-336`) çıkar — o da sayfanın en altında. **6 ekran · 3 kapı.**
|
||||
|
||||
### Yol F — Arama modalındaki funnel kartı
|
||||
|
||||
`arama-funnel-karti.tsx:132-139` → "Yapay Zeka listemi kur" → `profilToplamaAc("sihirbaz")` → kapı → S → `/sonuc?hazir=1` (girişsiz) / `?sihirbaz=1` (girişli). **Niyeti doğru taşıyan tek kısayol** — ama arama modalının arkasında, mobilde `size-9` ikon butonla açılıyor (`katalog-arama.tsx:379-386`).
|
||||
|
||||
### Yol G — Rehber (30g: 73 oturum → 5 sıra; %86 tek sayfa)
|
||||
|
||||
`rehber-makale.tsx:115` — CTA kartı **makalenin tamamının altında** (`mt-12`), `rehber/page.tsx:45` liste sayfasının altında. Yazı içinde funnel girişi yok.
|
||||
|
||||
### Yol H — `/listem` doğrudan (boş durum)
|
||||
|
||||
`/listem` giriş duvarlı (`listem-icerik.tsx:43` `verifySession`). Girişli + raporsuz kullanıcı: `Sparkles` + "Henüz Yapay Zeka listen yok" + profil yoksa CTA **ana sayfaya** atar (`listem-bos-cta.tsx:30`, `href="/"`) → kullanıcı Yol A'nın 1. adımına döner. Profil varsa doğrudan `?uret=1` — bu dal doğru.
|
||||
|
||||
### Yol I — `/universite/*/sayfa/N` (30g: 56 oturum → **0** sıra)
|
||||
|
||||
Üst satır burada da var (`universite-icerik.tsx:352`), ama sayfa metni "tablonun N. sayfası" bağlam cümlesi; listeye dair hiçbir vaat yok.
|
||||
|
||||
---
|
||||
|
||||
## 2. Her kapının hesabı
|
||||
|
||||
| Kapı | Şu anda gerekli mi? | Ardında ne olduğu ekranda söyleniyor mu? | Karar |
|
||||
|---|---|---|---|
|
||||
| **K1 · Sıra girme** | Evet — tablo da, havuz da sıralamayla hesaplanıyor (`liste-queries.ts`). Doğru kapı, doğru yerde. | Kısmen. Kompakt satır "Sıralaman {X} tabanlarının neresinde? Ücretsiz, üyelik gerekmez." diyor (`cta-sira-form.tsx:354-362`) — **tabloyu** vaat ediyor, listeyi değil. | Kalsın, **vaadi büyüt**. |
|
||||
| **K2 · Sihirbaz (3 adım)** | Evet — havuzu kuran girdi (bkz. `/meraklisina` şeması, `huni-semasi.tsx:16-19`). Adım başına kayıp 1–3 kişi; sihirbazın kendisi sağlıklı. | **Hayır.** Girişsizde son buton "Ücretsiz tablonu gör" (`cta-sira-form.tsx:334`, `hero-form.tsx:222`). Kullanıcı 3 adım doldurup "tablo" vaat ediliyor; yapay zekâ listesinden söz eden tek yer girişlilere gösterilen "(3 kredi)" etiketi. | Kalsın, **etiket vaadi söylesin**. |
|
||||
| **K3 · Google girişi** | Evet (liste kullanıcıya bağlı, kredi sayacı hesapta). 6/6 deneme başarılı — mekanizma sorunu yok. | Evet, iyi: `/giris` funnel dalında "Seçimlerin hazır — giriş yap, 5 deneme kredinle listen hemen üretilsin" (`giris-karti.tsx:52-58`). Kapının **kendisi** iyi; sorun oraya davet eden panelin görünmemesi. | Kalsın. |
|
||||
| **K4 · Kredi (3/5)** | Evet ve zararsız: yeni hesapta 5 kredi var, ilk liste ücretsiz. | Kısmen — "5 deneme kredin hazır" yalnızca `/sonuc` panelinde ve `/giris`'te. Katalog yolunda hiç geçmiyor. | Kalsın. |
|
||||
| **K0 · Profil kapısının tanıtım adımı** | **Hayır.** `+` dışındaki tüm girişler `dogrudanSira` ile bu adımı zaten atlıyor. Kalan dalda ekran şu: "Tercihine ışık tutabilmemiz için önce ne istediğini öğrenelim" + 4 satır paragraf + Vazgeç / Tercihlerimi belirle (`tercih-profili-kapisi.tsx:297-338`). Hiçbir girdi toplamıyor. | — | **Kaldırılabilir** (bkz. Öneri 1 notu). |
|
||||
|
||||
**Özet:** Gereksiz kapı yok; **gerekçesiz kapı** var. Kullanıcı K1 ve K2'yi "tablo görmek için" geçiyor, K3'e geldiğinde ilk kez yapay zekâ listesini duyuyor — ve o an sayfanın 3. ekranında.
|
||||
|
||||
---
|
||||
|
||||
## 3. Katalog köprüsü — 992a01a sonrası hâl yeterli mi?
|
||||
|
||||
**Yetersiz, üç sebeple.**
|
||||
|
||||
1. **Konum.** Satır, h1'in değil, 8–9 satırlık SEO özet paragrafının altında (`universite-icerik.tsx:287-290`). 375 px'te üst uç ≈ 570 px, gönder butonu ≈ 840 px (koddan çıkarım: sticky başlık ~96 px + breadcrumb ~36 + logo/h1 bloğu ~144 + paragraf 8×28 ≈ 224 + `mt-6`). Yani **buton ikinci ekranda**. `/bolum` tarafında paragraf kısa (2 satır), satır ilk ekranda (`bolum-icerik.tsx:265-268`) — iki sayfa aynı davranmıyor.
|
||||
2. **"Kompakt" yalnızca `lg`'de kompakt.** `flex-col gap-3 lg:flex-row` (`cta-sira-form.tsx:195`) ve input/buton `flex-col sm:flex-row` (`:227`). 375 px'te: 5 puan türü çipi 2 satıra sarar (~66 px) + input 48 + buton 48 + başlık 2–3 satır → **~270 px**, yani mobilde tek satır değil, bir blok. Mobilin %74'ü tek sayfada çıkıyor; bu blok tek ekrana sığmıyor.
|
||||
3. **Vaat eksik.** Kompakt dal kanıt üçlüsünü ve "Saniyede gör" eyebrow'unu render etmiyor (`:296` koşulu). Ziyaretçiye "tabloda nerede olduğunu göster" deniyor; ürünün kendisi (24'lük liste) anlatılmıyor. `docs/tasarim/cta-cekmece-tasarimi.md` §1'deki "kart vaat eder → çekmece tahsil eder" algısı kompakt varyantta **vaat kısmı düşerek** uygulanmış.
|
||||
|
||||
---
|
||||
|
||||
## 4. `/sonuc` ve `/listem` — sihirbazı bitiren ne görüyor?
|
||||
|
||||
**`/sonuc` sırası (`sonuc/page.tsx:102-126`):** ManuelHarita → SonucProgramTablosu → TadimlikBolumu → SonucSihirbazi → dipnot.
|
||||
|
||||
- **İlk ekran boş bir kutu.** Manuel liste boşken (yeni gelen herkeste boş) `aspect-[1050/447]` gri alan + "Tablodan + ile ekledikçe üniversiteler haritada belirir." (`manuel-harita.tsx:71-79`). 375 px'te ~143 px. Ödül sayfasının en üstünde, kullanıcının hiç kullanmadığı bir özelliğin boş durumu duruyor.
|
||||
- **Tablo uzun.** Dilim başına 20 satır (`liste-queries.ts:43`), satır ~64 px → ~1.280 px (koddan çıkarım).
|
||||
- **Tadımlık ~1.500 px'te**, yapay zekâ paneli **~2.200 px'te** (≈ 3,5 ekran). Ölçümle tutarlı: panel 17 anonimin 6'sına göründü, `tadimlik_goruntulendi` = 0.
|
||||
- **"Kaç saniyede geliyor" hiçbir yerde yazmıyor.** Süre bilgisi yalnızca üretim başladıktan sonra, `/listem`'de görünüyor: "Bu işlem yarım dakika kadar sürebilir, sayfayı kapatma." (`liste-uretici.tsx:271`). Karar anında (panel, sihirbaz son butonu) süre vaadi yok.
|
||||
- **Panel metni uzun.** 3 cümlelik tek paragraf + parantez içi kredi açıklaması (`sihirbaz-cagri-karti.tsx:286-291`); 375 px'te ~8 satır.
|
||||
|
||||
**`/listem` boş ekranı bir ilk kullanıcıya:** giriş duvarının arkasında olduğu için ilk kullanıcı buraya ancak giriş yaptıktan sonra düşer. Gördüğü: `Sparkles` + "Henüz Yapay Zeka listen yok" + tek paragraf + tek buton. Profil yoksa buton **ana sayfaya** atıyor (`listem-bos-cta.tsx:30`) — kullanıcı sıfır noktasına döner. Ekranda ne alacağını gösteren hiçbir görsel yok (örnek satır, iskelet, ekran görüntüsü).
|
||||
|
||||
---
|
||||
|
||||
## 5. Değer önizlemesi — üretmeden önce ne gösteriliyor?
|
||||
|
||||
| Yüzey | Önizleme var mı? |
|
||||
|---|---|
|
||||
| Ana sayfa | **Yok.** Bölümler: Sorun / Nasıl çalışır (3 metin kartı) / Karşılaştırma tablosu / Fiyat / SSS / final CTA (`app/page.tsx:267-660`). Listenin çıktısından tek bir satır bile gösterilmiyor. |
|
||||
| Katalog (`/bolum`, `/universite`) | **Yok.** |
|
||||
| Rehber | **Yok.** |
|
||||
| `/meraklisina` | Kurallar + mermaid şeması + kendi sıralamasına göre güncellenen sayılar (`meraklisina-demo.tsx:105-130`) — süreç anlatımı, çıktı değil. |
|
||||
| `/sonuc` | **Var ama görülmüyor:** `TadimlikSatiri` gerçek rapor formatında tek satır (gerekçe + risk rozeti + trend, `tadimlik-satiri.tsx:113-191`). `tadimlik_goruntulendi` 30g = **0**. |
|
||||
|
||||
**Önemli teknik imkân:** `tadimlikSec(sira, tur, kategoriSlug?, tip?)` (`lib/tadimlik-havuzu.ts:107`) kovaya göre çalışıyor ve her kovanın `temsiliSira` değeri sabit (`:24-32`). Yani **ziyaretçinin sıralamasını bilmeden de** ("örnek bir aday için" etiketiyle) gerçek bir tadımlık satırı render edilebilir; havuz canlıda dolu (522 satır). Yeni içerik üretimi, yeni LLM çağrısı, yeni bileşen gerekmiyor — mevcut `TadimlikSatiri` başka yüzeylere taşınabilir.
|
||||
|
||||
---
|
||||
|
||||
## 6. Tasarım önerileri (6)
|
||||
|
||||
> Ortak kural: hiçbir öneri yeni rozet/pill/çarpı/buton varyantı icat etmez. Rozet gerekirse `SectionEyebrow` (`pixel-decor.tsx`), CTA'da metin önce + sonda `<ArrowRight className="size-4" aria-hidden />`, çekmece/modal kapatma çarpısı `dialog.tsx` kanonik seti. `/meraklisina` şeması (`huni-semasi.tsx:16-30`) sihirbaz adım sayısını/sırasını ve havuz kurallarını belgeler; aşağıdaki önerilerin **hiçbiri** adım sayısını, sırasını, havuz kurallarını veya 24'lük dağılımı değiştirmiyor → şema senkronu gerekmiyor (Öneri 1'de yalnızca sihirbaz **sonrası** yönlendirme değişiyor, şemada o yok).
|
||||
|
||||
### Ö1 — Kapı azaltma: sihirbazı bitiren herkes listeye çıksın (ölü uçları kapat)
|
||||
|
||||
**(a) Ne değişiyor:** `+` toast'ındaki "Sıralamamı gir" (`program-ekle-butonu.tsx:82`) ve liste çekmecesindeki eşi (`liste-cekmecesi.tsx:298`) `profilToplamaAc(null, …)` yerine `profilToplamaAc("sihirbaz", …)` çağırsın; navbar girişi (`katalog-arama.tsx:115`, `sonucaGitIste` → `hedef:"sonuc"`) de `"sihirbaz"` hedefine geçsin. Ayrıca `profilTamamlandi`'nin `hedef == null` dalı (`use-tercih-profili.ts:346`) `sonucHref({ hazir: "1" })` döndürsün — sihirbazı bitirmiş hiç kimse "kaydedildi" toast'ıyla yerinde bırakılmasın. `tercih-profili-kapisi.tsx:238`'deki başarı toast'ı bu dalda gereksizleşir (akış devam ediyor, bitmiyor).
|
||||
**(b) Neden:** 30g'de en büyük sıra kaynağı `kapi` (14 olay) ve `duzenle` (5) bu ölü uçta bitiyor; ikisi birlikte tüm sıra girişlerinin ~%55'i. Kullanıcı K1 ve K2'yi geçmiş, tek eksik ona listeyi teklif etmek. Bu, **liste yolunu 3 ekran kısaltır** (kataloğa dönüp tekrar funnel'a girmek yerine doğrudan ödül ekranı).
|
||||
**(c) Büyüklük:** S (davranış; `src/` içinde 4–5 satır).
|
||||
**(d) Kural uyumu:** görsel değişiklik yok; şema etkilenmez. Ölçüm: `sira_girildi{kaynak:kapi}` → `sonuc_goruntulendi` zinciri ilk kez kurulur.
|
||||
|
||||
*Not (ayrı, opsiyonel):* profil kapısının tanıtım adımı (`tercih-profili-kapisi.tsx:297-338`) hiçbir girdi toplamıyor ve `dogrudanSira` ile zaten çoğu yolda atlanıyor. `ilkAdim`'ı her zaman `"sira"` yapmak bir ekran daha siler. **S.**
|
||||
|
||||
### Ö2 — Mobil tek ekran: katalog üst satırı başlığın altına, gerçekten tek satıra
|
||||
|
||||
**(a) Ne değişiyor:** `/universite/[slug]`'da `ustSiraSatiri` SEO özet paragrafının **üstüne**, `h1`'in hemen altına alınsın (`universite-icerik.tsx:287-290` → `:285` öncesi; `/bolum` zaten böyle). Kompakt varyantın mobil düzeni: (i) puan türü çipleri varsayılan "Sayısal" seçili tek satırda yatay kaydırmalı şeride (`flex-nowrap overflow-x-auto` + `-mx-4 px-4`) alınsın ya da başlangıçta gizlenip "Puan türü: Sayısal · değiştir" satırıyla açılsın; (ii) input + buton mobilde de yan yana (`flex-row`, buton `shrink-0`, yalnız ikon değil kısa metin: "Gör"→**hayır**, metin "Programları gör" kalsın, gerekirse buton alt satırda tam genişlik kalsın ama çipler tek satıra insin). Hedef: bloğun toplam yüksekliği ~270 px'ten ~150 px'e insin ve üst uç ~380 px'e çıksın → **375×667'de input + buton ilk ekranda**.
|
||||
**(b) Neden:** Katalog 464 oturum → 12 sıra (%2,6); mobil bounce %74. 992a01a satırı yukarı taşıdı ama `/universite`'de paragrafın altında ve mobilde tek satır değil (bkz. §3).
|
||||
**(c) Büyüklük:** M.
|
||||
**(d) Kural uyumu:** mevcut çip class seti (hero formuyla birebir) korunur; CTA deseni değişmez; yeni pill yok. Yatay kaydırmalı şeride geçilirse kaydırma göstergesi metinle desteklenmeli, çipler `role="radio"` kalmalı.
|
||||
|
||||
### Ö3 — Değer önizlemesi kapıdan önce: tadımlık satırını kataloğa ve ana sayfaya taşı
|
||||
|
||||
**(a) Ne değişiyor:** Mevcut `TadimlikSatiri` bileşeni (yeni bileşen değil) iki yeni yerde render edilsin:
|
||||
· **Katalog:** üst sıra satırının hemen altında, `SectionEyebrow`'u "Yapay zekâdan örnek satır" olarak, üstünde tek cümle: "Sıralamanı girince listendeki 24 satır böyle görünür." Sıra bilinmiyorsa `kovaBul().temsiliSira` ile "örnek bir aday için" etiketli hâli (`tadimlik-havuzu.ts:24-32, 107`); bölüm sayfasında bölümün kategorisi `kategoriSlug` olarak verilebilir.
|
||||
· **Ana sayfa:** "Nasıl çalışır?" bölümünün 3 kartının altına, `steps` metinlerinin karşılığı olarak tek gerçek satır (`app/page.tsx:340-358` sonrası).
|
||||
Çekmecenin sıra adımındaki kanıt üçlüsü kompakt dalda da gösterilsin (`cta-sira-form.tsx:296` koşulunun kompakt dalı).
|
||||
**(b) Neden:** Ürünün çıktısı hiçbir yerde üretilmeden önce gösterilmiyor (§5); tek örnek `/sonuc`'un dibinde ve 30 günde 0 kez görüldü. "Bu kapının ardında ne var?" sorusunun cevabı budur.
|
||||
**(c) Büyüklük:** M (yerleştirme + sırasız/kova varyantı; içerik hattı hazır).
|
||||
**(d) Kural uyumu:** `SectionEyebrow` kanonik rozet; risk rozeti zaten metin etiketli (`RISK_ETIKET`, `lib/risk.ts:9`) — renk tek başına anlam taşımıyor. Tadımlık CTA'sı mevcut ok desenini kullanıyor (`tadimlik-satiri.tsx:186-188`).
|
||||
|
||||
### Ö4 — `/sonuc`'u ödül sayfası yap: sıralamayı tersine çevir
|
||||
|
||||
**(a) Ne değişiyor:** `sonuc/page.tsx:102-126` sırası şu olsun: **(1)** kısa ödül başlığı + yapay zekâ paneli (hazır panel / genel panel) → **(2)** tadımlık (girişsizde) → **(3)** program tablosu → **(4)** manuel harita, ve harita **boşken hiç render edilmesin** (`manuel-harita.tsx:69-80` boş dalı `null` dönsün; CLS riski yok çünkü tablonun üstünde değil altında). Panel metni 3 cümleden 1 cümleye insin: başlık "Seçimlerin hazır — listen bir adım uzakta", gövde "Google ile 5 saniyede giriş yap; 5 deneme kredinle 24 tercihlik listen ~30 saniyede kurulur." (süre ilk kez karar anında söylenir, kaynak `liste-uretici.tsx:42-44`).
|
||||
**(b) Neden:** Anonim kullanıcı `/sonuc`'ta medyan 33 sn kalıyor ve panele inmiyor; panel 6/17 gösterim, 0 tık. Ödül sayfasının ilk ekranı şu an kullanılmamış bir özelliğin boş durumu.
|
||||
**(c) Büyüklük:** M.
|
||||
**(d) Kural uyumu:** panel bileşeni ve CTA deseni aynen kalır; yalnız sıra ve metin değişir. "Ücretsiz tablo her zaman açık" güvencesi panelde tek cümleyle korunmalı (vaatsizlik).
|
||||
|
||||
### Ö5 — `/sonuc` mobil sabit alt çubuk (anonim + seçimleri hazır)
|
||||
|
||||
**(a) Ne değişiyor:** Yeni bileşen değil: `sihirbaz-cagri-karti.tsx`'in `girisBekliyor` dalına, yalnız `max-sm`'de görünen sticky bir satır. İçerik: "Listeni kaybetme — Google ile kaydet" + `<ArrowRight className="size-4" aria-hidden />`, hedef `girisUrl`, olay `giris_cta_tiklandi{kaynak:"sonuc_cubuk"}`. Teknik gereklilikler: `position: sticky; bottom: 0` (fixed değil — klavye açılınca zıplamasın), yükseklik ≥ 56 px, `pb-[max(0.75rem,env(safe-area-inset-bottom))]`, sayfa altına eşdeğer `scroll-padding`/boşluk ki dipnot çubuğun altında kalmasın, `prefers-reduced-motion`'da giriş animasyonu yok.
|
||||
**(b) Neden:** Panel mobilde 3,5 ekran aşağıda; anonim mobil oturumların medyan kalış süresi 33 sn. Çubuk görünürlüğü %100'e çıkarır.
|
||||
**(c) Büyüklük:** S–M.
|
||||
**(d) Kural uyumu:** CTA deseni (metin önce, sonda ok) birebir; yeni renk/pill yok; layout'taki `pb-28` (`app/layout.tsx:95`) ile çakışma kontrol edilmeli.
|
||||
|
||||
### Ö6 — Dil birliği: kapının ardındaki ödülü her etikette söyle
|
||||
|
||||
**(a) Ne değişiyor:** Üç etiket:
|
||||
· Sihirbaz son butonu, girişsiz: "Ücretsiz tablonu gör" → **"Listeme geç — ücretsiz tablon + yapay zekâ listen"** ya da kısa hâli **"Devam et — listeni gör"** (`cta-sira-form.tsx:334`, `hero-form.tsx:222`, `sihirbaz-cagri-karti.tsx:348`).
|
||||
· Kompakt satır başlığı: "Sıralaman {X} tabanlarının neresinde?" + **"Ücretsiz, üyelik gerekmez"** cümlesine ikinci cümle: "Sıralamanı girince yapay zekâ 24 tercihlik listeni de kurabilir." (`cta-sira-form.tsx:354-362`).
|
||||
· `/listem` boş durumda profil yokken CTA ana sayfaya atmasın; aynı sayfada profil kapısını açsın (`profilToplamaAc("sihirbaz")`) — `listem-bos-cta.tsx:30`.
|
||||
**(b) Neden:** Kullanıcı "tablo" vaadiyle 3 kapı geçiyor, ürünü `/sonuc`'un dibinde öğreniyor (§2). Boş `/listem` CTA'sı kullanıcıyı huninin başına geri atıyor.
|
||||
**(c) Büyüklük:** S.
|
||||
**(d) Kural uyumu:** yalnız metin + bir `href`; CTA ok deseni korunur. Yeni metinler vaat içermez ("kurabilir", "gör" — "yerleşirsin" değil).
|
||||
|
||||
---
|
||||
|
||||
## 7. Yan bulgular — tek kaynak / erişilebilirlik ihlalleri (öneri dışı, ucuz)
|
||||
|
||||
| Dosya:satır | Kural / sorun | Kullanıcıya etkisi | Düzeltme | Büyüklük |
|
||||
|---|---|---|---|---|
|
||||
| `sihirbaz-cagri-karti.tsx:269` | AGENTS.md CTA deseni: `<Link href="/listem">Listeni gör</Link>` — sondaki `ArrowRight` **yok** | Raporu olan kullanıcının gördüğü tek CTA sitedeki diğerlerinden farklı duruyor | `Listeni gör<ArrowRight className="size-4" aria-hidden />` | S |
|
||||
| `sira-gerekli.tsx:61-62` | CTA deseni: `Trophy` ikonu **metnin başında** ("başta ikon yok") | Aynı eylem iki farklı biçimde | İkonu kaldır, sonda `ArrowRight` | S |
|
||||
| `liste-uretici.tsx:220-221` | CTA deseni: `RefreshCcw` metnin başında ("Tekrar dene") | Hata ekranındaki tek buton desen dışı | İkon sona ya da kaldırılsın | S |
|
||||
| `liste-cekmecesi.tsx:297, 307` | `<ArrowRight data-icon="inline-end" />` — `aria-hidden` yok, kanonik `className="size-4" aria-hidden` değil (`listem-govde.tsx:290,371` aynı yazım ama `aria-hidden`'lı) | Aynı ok üç farklı yazımda | Tek yazıma indir | S |
|
||||
| `tercih-profili-kapisi.tsx:393-398` | Aynı eleman iki stilde: puan türü burada `Select`, hero/CTA formunda `role="radiogroup"` çipler (`hero-form.tsx:143-164`, `cta-sira-form.tsx:199-220`) | Kullanıcı aynı soruyu iki farklı arayüzle cevaplıyor | Çip radiogroup'a birle (tek kaynak) | M |
|
||||
| `katalog-arama.tsx:343, 366, 379` | Mobilde funnel'ın kalıcı girişi `h-9` / `size-9` = **36 px** dokunma hedefi (< 44 px) | Trafiğin %90'ı mobil; ana funnel girişi ve arama küçük | `h-11`/`size-11`'e çıkar (ya da dokunma alanını `::before` ile büyüt) | S |
|
||||
| `arama-funnel-karti.tsx:28, 42` | Vaat/korku dili: "Doğru strateji, doğru yerleşme.", "Boş kalan tercih, kaçan fırsattır." — ürünün "yerleşme garantisi vermiyoruz" duruşuyla (`app/page.tsx:393`) çelişiyor | Güven mesajını zayıflatıyor | İki satırı çıkar ya da yeniden yaz | S |
|
||||
| `arama-funnel-karti.tsx:105, 125` | Palet dışı yüzey: `bg-[#0b1f3a]` + `text-cyan-300`; sitenin funnel yüzeyi `bg-primary` + `PixelField` (`sihirbaz-cagri-karti.tsx:275`, `liste-cekmecesi.tsx:269`) | Aynı işlevli panel iki ayrı marka dilinde | **[BİLAL]** — renk paleti kararı | S |
|
||||
| `arama-funnel-karti.tsx:63` vs `cta-sira-form.tsx:49` | Aynı kanıt üçlüsü iki farklı etiketle ("24 tercih" / "24 tercihlik plan") ve iki renkte | Küçük ama ölçülebilir tutarsızlık | Tek sabit hâline getir | S |
|
||||
|
||||
---
|
||||
|
||||
## 8. Bilal'in gözle kontrol etmesi gereken ekranlar (375 px, mobil)
|
||||
|
||||
1. `/universite/<uzun-adli-bir-üniversite>` — kompakt sıra satırının üst ucu ilk ekranda mı, gönder butonu görünüyor mu; çipler kaç satıra sarıyor.
|
||||
2. `/bolum/hemsirelik` — aynı satır (burada paragraf kısa; iki sayfa arasındaki fark ne kadar büyük).
|
||||
3. `/sonuc` (sıralama girmiş, girişsiz) — ilk ekranda boş gri harita kutusu görünüyor mu; yapay zekâ paneline kaç kaydırma gerekiyor; tadımlık görünüyor mu.
|
||||
4. Katalog tablosunda `+` → toast → "Sıralamamı gir" → sihirbazı sonuna kadar doldur — **ekran nerede kalıyor** (Ö1'in kanıtı).
|
||||
5. Navbar'daki "Sıralama gir" pill'i — parmakla ilk denemede isabet ediyor mu (36 px).
|
||||
6. `/listem` (girişli, listesiz) — boş ekran ve CTA'nın gittiği yer.
|
||||
|
||||
## 9. Bilal'den istenen (en fazla 3)
|
||||
|
||||
1. Yukarıdaki 6 ekranı telefonda sırayla aç, 3 ve 4 numaralıların ekran görüntüsünü ekibe bırak — **10 dk**.
|
||||
2. Ö1'i (sihirbazı bitiren herkes `/sonuc`'a çıksın) onayla ya da reddet; en büyük sıra kaynağını huniye bağlayan tek değişiklik bu — **2 dk**.
|
||||
3. Arama funnel kartının koyu lacivert/cyan yüzeyi kalsın mı, `bg-primary` funnel diline mi dönsün — marka kararı — **2 dk**.
|
||||
299
docs/ekip-raporlari/2026-09-22/03-vaat-envanteri.md
Normal file
299
docs/ekip-raporlari/2026-09-22/03-vaat-envanteri.md
Normal file
@@ -0,0 +1,299 @@
|
||||
# 03 — Vaat envanteri ve ilk-5-saniye teşhisi
|
||||
|
||||
> Rol: Marka/pazarlama stratejisti · 22 Eylül 2026 (gündüz, Bilal başında) · Okuyucu: CEO (karar), CTO/ürün yöneticisi (iş tanımı)
|
||||
> Yöntem: yalnızca okuma — `src/`, `content/`, `docs/`, `data/app.db` (salt sorgu) + 3 web araması/2 sayfa açıldı. Kod ve içerik **değiştirilmedi**.
|
||||
> İşaretler: **[K]** koddan doğrulandı · **[W]** web sayfası açılıp okundu · **[A]** yalnızca arama özeti · **[V]** varsayım · **doğrulanmalı**
|
||||
|
||||
---
|
||||
|
||||
## Özet (5 madde)
|
||||
|
||||
1. **Ziyaretçi ürünün ana çıktısını ilk 5 saniyede öğrenmiyor — çünkü fold'da tek kelimeyle anlatılmıyor.** Ana sayfanın H1'i bir *sorun* cümlesi ("Dört yıllık geleceğini 48 saatlik panikle seçme", `src/features/pazarlama/components/hero-baslik.tsx:24-28`) ve **altında alt başlık yok**: `src/app/page.tsx:239` → `240` arası doğrudan sıralama formuna giriyor. Çıktının ne olduğu (24 program, hayal/dengeli/güvenli, gerekçe, taban trendi) ilk kez **fold'un çok altında**, "Üç adımda listen hazır" bölümünde geçiyor (`src/app/page.tsx:105-117`). Vaadi tam ifade eden tek yüzey OG görseli (`src/app/opengraph-image.tsx:4-5,71,85`) — yani sayfayı *açmayan* kişi vaadi, açan kişi görmüyor. [K]
|
||||
2. **Trafiğin geldiği yerde (katalog + rehber) vaat hiç geçmiyor.** 464 kişinin indiği bölüm/üniversite sayfalarındaki tek dönüşüm bileşeni `CtaSiraForm`; görünen metinleri "Sıralaman … tabanlarının neresinde?" + "Sıralamanı gir, programları gör" + "Ücretsiz, üyelik gerekmez" (`src/features/sihirbaz/components/cta-sira-form.tsx:356-362, 411-437`, `src/features/katalog/components/sayfalama.tsx:40-41`, `bolum-icerik.tsx:179`, `universite-icerik.tsx:174`). **"24"** ve **"yapay zekâ"** kelimeleri bu kartların görünen yüzünde hiç geçmiyor; "24 tercihlik plan" rozeti yalnızca çekmece açıldıktan sonra görünüyor (`cta-sira-form.tsx:48-51` → yalnız `:312-325`). 27 rehber yazısının hiçbirinde ürünün 24'lük listesi tanıtılmıyor (`content/rehber/` grep). [K]
|
||||
3. **Sitenin en üstünde, her sayfada, ürünün bugün işe yaramadığını söyleyen bir bant var.** `src/components/site-top-banner.tsx:7-8,64` bugün (22 Eyl 2026) "2026 YKS tercih dönemi · 29 Temmuz – 10 Ağustos 2026 · **Tercih dönemi sona erdi**" basıyor; ek yerleştirme tercihleri de 21 Eyl 23.59'da kapandı (`content/rehber/ek-yerlestirme-2026.md:12`). Buna rağmen kapanış CTA'sı hâlâ "**Tercih dönemi bitmeden yerini al**" diyor (`hero-focus-button.tsx:44-46, 63-66`). Ziyaretçiye önce "geç kaldın", sonra "acele et" deniyor. Veri tarafı ise 2027 kohortuna hazır (`src/lib/veri-yillari.ts:11,21` → `SON_YIL=2026`, `TERCIH_YILI=2027`). **Bu tek çelişki, 621 → 3 hunisinin en ucuz ve en büyük açıklaması.** [K]
|
||||
4. **"Yapay Zeka listesi" ifadesi bugünkü hâliyle bir çıktı değil, bir teknoloji adı.** Kullanıcıya görünen 11 CTA'da "Yapay Zeka listemi kur" yazıyor (`hero-form.tsx:194`, `sihirbaz-cagri-karti.tsx:333`, `arama-funnel-karti.tsx:137`, `listem-bos-cta.tsx:31`, `tercih-profili-kapisi.tsx:463` vb.) ama butonun yanında *listede ne olduğu* yazmıyor. Üstelik yazım tek kaynaktan gelmiyor: kodda 59 "Yapay Zeka", 24 "yapay zekâ", 2 "Yapay Zekâ", 1 "yapay zeka" — **tek bir sözlük/sabit yok**, terim değişikliği ~30 dosyada elle arama-değiştirme demek. [K]
|
||||
5. **Güven cümlelerimiz var ama satış anında görünmüyor.** En güçlü farklılaştırıcımız — "yapay zekâ yalnızca sıralamanla açılan gerçek programlardan seçer, havuz dışına çıkamaz" — yalnızca SSS'de (`src/app/page.tsx:127`) ve `/meraklisina`'da (`huni-semasi.tsx:47,52`, `meraklisina-icerik.tsx:119-127`) yaşıyor; `/sonuc`'taki giriş panelinde, `/giris` kartında, `/paket`'te **hiç geçmiyor**. `/meraklisina`'ya site içinden yalnızca 2 giriş var (ana sayfa rozeti `page.tsx:321`, footer `site-footer.tsx:77`). Buna karşılık footer ürünü **"YKS Tercih Robotu 2026"** diye adlandırıyor (`site-footer.tsx:49`) — `docs/urun/vizyon.md:22`'nin açıkça reddettiği kategori. [K]
|
||||
|
||||
---
|
||||
|
||||
## 1. Vaat envanteri — birebir alıntılar, dosya:satır
|
||||
|
||||
### 1.1 İlk ekran (ana sayfa fold, mobil) — sırayla ne görülüyor
|
||||
|
||||
| # | Yüzey | Birebir metin | Çıktıyı anlatıyor mu? | Kaynak |
|
||||
|---|---|---|---|---|
|
||||
| 1 | Üst bant | "2026 YKS tercih dönemi · 29 Temmuz – 10 Ağustos 2026" + "**Tercih dönemi sona erdi**" | Hayır — tersini söylüyor | `src/components/site-top-banner.tsx:7-8,64` [K] |
|
||||
| 2 | Navbar | Logo · katalog arama · "Giriş yap" | Hayır — üründen hiç söz etmiyor | `src/components/site-header.tsx:13-34`, `user-nav.tsx:35-40` [K] |
|
||||
| 3 | H1 | "Dört yıllık geleceğini **48 saatlik panikle** seçme" | Hayır — sorun cümlesi | `hero-baslik.tsx:24-28` [K] |
|
||||
| 4 | *(alt başlık)* | **YOK** | — | `src/app/page.tsx:239→240` [K] |
|
||||
| 5 | Puan türü çipleri | "Sayısal / Eşit Ağırlık / Sözel / Dil / TYT" | Hayır | `hero-form.tsx:31-37,148-163` [K] |
|
||||
| 6 | Input | "YKS başarı sıralaman (ör. 85.000)" | Hayır — karşılıksız istek | `hero-form.tsx:177` [K] |
|
||||
| 7 | Buton | "**Yapay Zeka listemi kur**" | Kısmen — "liste" ne, belirsiz | `hero-form.tsx:194` [K] |
|
||||
| 8 | Güven rozeti | "Veri: YÖK Atlas · son güncelleme 21 Eylül 2026" | Hayır (ama iyi bir sinyal) | `src/app/page.tsx:247-256`, `src/lib/seo.tsx:24` [K] |
|
||||
|
||||
**Cevap: Hayır.** İlk 5 saniyede ziyaretçi yalnızca "bir sıralama isteniyor" ve "bir şey kurulacak" bilgisini alıyor. "24 program", "hayal/dengeli/güvenli", "her satırda gerekçe", "2026 taban sıralaması" kelimelerinin hiçbiri fold'da yok.
|
||||
|
||||
### 1.2 Vaadin geçtiği tüm yerler (kullanıcıya görünen metinler)
|
||||
|
||||
| Yüzey | Birebir alıntı | Dosya:satır | Huni aşaması |
|
||||
|---|---|---|---|
|
||||
| Metadata/title | "KolayTercih — Yapay Zekâ Destekli YKS Tercih Danışmanı" | `src/app/layout.tsx:50,61` | SERP |
|
||||
| Meta description | "YKS sıralamana göre gerçek YÖK Atlas verisiyle dengeli 24 tercihlik liste. İnsan danışmandan çok daha düşük fiyata, yapay zekâ destekli tercih danışmanlığı." | `layout.tsx:53-54,62-63` | SERP |
|
||||
| OG görseli | "YKS tercihin, gerçek YÖK Atlas verisiyle" / "Sıralamanı gir · Dengeli 24 tercihlik listeni al" | `src/app/opengraph-image.tsx:4-5,71,85` | Paylaşım |
|
||||
| Ana sayfa adım 3 | "Hayal, dengeli ve güvenli dilimlerine dağıtılmış, **her satırı gerekçeli** tercih listeni indir; aklına takılanı listen üzerinden yapay zekâya sor." | `src/app/page.tsx:112-115` | Fold altı |
|
||||
| Ana sayfa SSS | "Yapay zekâ **yalnızca sıralamanla açılan gerçek programlardan seçer; bu havuzun dışına çıkamaz.**" | `src/app/page.tsx:127` | Fold altı (akordeon **kapalı**) |
|
||||
| Ana sayfa dürüstlük notu | "**Yerleşme garantisi vermiyoruz — çünkü kimse veremez.**" | `src/app/page.tsx:383-392` | Fold altı |
|
||||
| Ana sayfa paket listesi | "Sıralamana özel, gerekçeli 24 tercihlik dengeli liste" / "60 yapay zekâ danışman sorusu" | `src/app/page.tsx:190-203` | Fiyat bölümü |
|
||||
| Kapanış CTA | "Sıralamanı gir, yapay zekâ danışmanın veriyle konuşsun. **Tercih dönemi bitmeden yerini al.**" | `hero-focus-button.tsx:63-66` | Sayfa sonu |
|
||||
| Katalog CTA (üst, kompakt) | "Sıralaman \<Bölüm\> tabanlarının neresinde?" + "Ücretsiz, üyelik gerekmez." | `bolum-icerik.tsx:179,267`, `cta-sira-form.tsx:356-362` | **Ana giriş noktası — vaat yok** |
|
||||
| Katalog CTA (alt) | "Bu tablodaki tabanlar geçmiş yerleştirmelerin sonucu; bu yıl değişebilir. Sıralamanı gir, tabanı sıralamana yakın programları risk seviyesine göre ayrılmış hâlde listeleyelim. Ücretsiz, üyelik gerekmez." | `sayfalama.tsx:40-41` | **Vaat yok** |
|
||||
| Katalog/rehber CTA butonu | "Sıralamanı gir, programları gör" / "Programları gör" | `cta-sira-form.tsx:254,427` | **Vaat yok** |
|
||||
| Sihirbaz son buton (girişsiz) | "**Ücretsiz tablonu gör**" | `hero-form.tsx:222`, `cta-sira-form.tsx:334` | Vaadin düştüğü an |
|
||||
| Sihirbaz son buton (girişli) | "Yapay Zeka listemi kur (3 kredi)" | `hero-form.tsx:222`, `sihirbaz-cagri-karti.tsx:348` | — |
|
||||
| `/sonuc` başlık | **H1 YOK** (harita + ham tablo ile açılıyor) | `src/app/sonuc/page.tsx:96-117`; `program-tablosu.tsx:176` yalnız `aria-label` | Vaat kopuyor |
|
||||
| `/sonuc` tadımlık | "Yapay zekâ listendeki her satırı böyle anlatır" / "Bu, 24 satırlık Yapay Zeka listenden yalnızca bir örnek." / "24 satırın tamamı için giriş yap — 5 deneme kredin hazır" | `tadimlik-satiri.tsx:116-123,173,186` | **En iyi vaat yüzeyi — ama tablonun altında** |
|
||||
| `/sonuc` sihirbaz kartı | "24 tercihi tek tek elemek yerine, yapay zekâ kursun" / "…yapay zekâ hayal, dengeli ve güvenli dilimlerine dağıtılmış 24 tercihi — her satırı yerleşme riski ve gerekçesiyle — senin yerine dizer." | `sihirbaz-cagri-karti.tsx:319-327` | Sayfa sonu |
|
||||
| `/sonuc` hazır panel | "Seçimlerin hazır — Yapay Zeka listen bir adım uzakta" / "5 deneme kredinle Yapay Zeka listeni kur — giriş yap" / "Kredi kartı gerekmez · Google ya da e-posta ile 30 saniyede" | `sihirbaz-cagri-karti.tsx:284-309` | Giriş kapısı |
|
||||
| `/giris` başlık | "Giriş yap**, çünkü listen seni bekliyor / …kaçırmak istemezsin**" (6 varyant, döngüsel yazıcı) | `giris-baslik.tsx:6-13` | Kapı |
|
||||
| `/giris` alt metin | "Seçimlerin hazır — giriş yap, **5 deneme kredinle** listen hemen üretilsin." | `giris-karti.tsx:52-58` | Kapı |
|
||||
| `/listem` boş durum | "Henüz Yapay Zeka listen yok" / "…24 tercihlik risk analizli listeni kur; sonra burada görüntüleyip Yapay Zeka danışmanla üzerinde konuşabilirsin." | `listem-icerik.tsx:59`, `listem-bos-cta.tsx:19-31` | Ürün içi |
|
||||
| `/paket` | "Tek seferlik Tercih Dönemi Paketi: yapay zekâ destekli kişisel 24 tercihlik liste, risk analizi, liste revizyonları ve soru hakkı." / H1: "İnsan danışmanın işini, çok daha düşük fiyata" | `src/app/paket/page.tsx:12-13,44-51` | Satış |
|
||||
| `/meraklisina` | "Sihir yok, kara kutu yok…" / "4. Sihirbaz süzer, yapay zekâ kurar" / "ona boş bir sayfa değil, bu havuz verilir" / "5. Dürüst olalım: bu bir tahmin aracıdır" | `src/app/meraklisina/page.tsx:25-33`, `meraklisina-icerik.tsx:105-127,138+` | **Güvenin tamamı burada, trafik yok** |
|
||||
| Arama modalı kartı | 30 döngüsel cümle; ör. "Üç adımda sana özel 24 tercih." ama ayrıca "**Doğru strateji, doğru yerleşme.**", "Uzman işi bir liste" | `arama-funnel-karti.tsx:19-50,137` | Her sayfa |
|
||||
| E-posta | "Listen seni bekliyor" / "Yapay zekânın senin sıralamana göre kurduğu tercih listesi hesabında" | `src/lib/eposta.ts:175-209` | Geri kazanım |
|
||||
| Footer | "**YKS Tercih Robotu 2026**" (ürün linki) · "KolayTercih bir karar destek aracıdır, yerleşme garantisi vermez." | `site-footer.tsx:49,130,133` | Her sayfa |
|
||||
|
||||
### 1.3 Teşhis — "ziyaretçi bu listenin var olduğunu öğreniyor mu?"
|
||||
|
||||
**Hayır, üç kırılma noktasında öğrenemiyor:**
|
||||
|
||||
- **Giriş anında (katalog/rehber, 464/621 ziyaret):** Vaat sıfır. CTA yalnızca "programları gör" diyor — bu, ücretsiz rakiplerin (YÖK Atlas, Kariyer.net, Canlıkoç) zaten verdiği şey. Ziyaretçi burada KolayTercih'in bir *liste kurduğunu* öğrenmiyor.
|
||||
- **Sihirbaz sonunda:** Ziyaretçi "Yapay Zeka listemi kur" diyen butona basıp 3 adım tamamlıyor; son butonda metin **"Ücretsiz tablonu gör"**e düşüyor (`hero-form.tsx:222`). Vaat, yerine getirilmeden önce sessizce küçülüyor.
|
||||
- **`/sonuc`'ta:** Sayfanın H1'i yok; ziyaretçi ham tabloya düşüyor. Vaadi tekrar duyduğu yer, tablonun *altındaki* tadımlık (`tadimlik-satiri.tsx:116`). Analitik raporu bunu ölçmüş: 17 anonim oturumun yalnız 6'sı paneli gördü, **0 tık** (`docs/ekip-raporlari/2026-09-21/03-donusum.md` §Özet-3).
|
||||
- Ek risk: tadımlık, havuzda satır yoksa **hiç çizilmiyor** (`tadimlik-bolumu.tsx:19-21`). Havuz bugün 522 satır (`data/app.db` sorgusu, `tadimlik_havuzu` — 6 kova × 5 tür × kategori × tip) [K]; kapsam dışı kombinasyonda ziyaretçi vaadi hiç görmüyor. **Kapsam ölçülmeli.**
|
||||
|
||||
---
|
||||
|
||||
## 2. Vaadin netliği — "yapay zekâ listesi" öğrenciye ne diyor?
|
||||
|
||||
**Bugünkü hâli soyut.** CTA'daki "Yapay Zeka listemi kur" üç soruyu cevapsız bırakıyor: *kaç satır? neye göre? veri nereden?* Çıktının somut hâli kodda var ve doğrulanabilir — ama CTA'nın yanında değil:
|
||||
|
||||
| Somut unsur | Kod kanıtı | CTA'nın yanında görünüyor mu? |
|
||||
|---|---|---|
|
||||
| 24 satır | `huni-semasi.tsx:26+`, `page.tsx:113` | Hayır |
|
||||
| Hayal / Dengeli / **Güvenli** dilimleri (tek etiket kaynağı) | `src/lib/risk.ts:21-25` | Hayır |
|
||||
| Her satırda gerekçe + risk notu + trend özeti | `src/lib/tadimlik-havuzu.ts:44-51`, `rapor-listesi.tsx:294-316` | Hayır |
|
||||
| En güncel taban sıralaması (2026; o yıl veri yoksa 2025) | `src/lib/veri-yillari.ts:11,13,38` | Hayır |
|
||||
| 6 yıllık taban serisi (2021–2026) | `veri-yillari.ts:9-11,29` | Hayır |
|
||||
| Havuz kısıtı: uydurma program yok | `huni-semasi.tsx:47`, `page.tsx:127` | Hayır |
|
||||
|
||||
### Somutlaştıracak 3 alternatif söz (vaatsiz, doğrulanabilir — kullanıma hazır)
|
||||
|
||||
**A — Hero alt başlığı (yeni `<p>`; hedef: `src/app/page.tsx:239` ile `240` arası, `HeroBaslik` ile `#hero-form` arasına):**
|
||||
> "Başarı sıralamanı gir; sana açık olan gerçek programlardan 24 satırlık bir tercih listesi kuralım — her satırda hayal/dengeli/güvenli etiketi, en güncel YÖK Atlas taban sıralaması ve o satırın neden orada olduğunun gerekçesi."
|
||||
|
||||
**B — Katalog/rehber CTA açıklaması (hedef: `src/features/katalog/components/sayfalama.tsx:40-41`, `KATALOG_CTA_ACIKLAMA`):**
|
||||
> "Bu tablodaki tabanlar geçmiş yerleştirmelerin sonucu; bu yıl değişebilir. Sıralamanı gir: hangi programların sana açık olduğunu ücretsiz gör, istersen aynı verinin üzerine kurulan 24 satırlık gerekçeli tercih listeni de kur. Ücretsiz, üyelik gerekmez."
|
||||
|
||||
**C — CTA butonu metni (hedef: `hero-form.tsx:194`, `sihirbaz-cagri-karti.tsx:333`, `arama-funnel-karti.tsx:137`, `listem-bos-cta.tsx:31`, `tercih-profili-kapisi.tsx:463` — 11 yer):**
|
||||
> "24 tercihlik listemi kur"
|
||||
> `[BİLAL]` — "Yapay Zeka" ibaresinin CTA'dan çıkarılması bir **terim kararı**. Bugün 11 görünür CTA + 84 kod içi geçiş var ve **tek bir sözlük sabiti yok**; değişiklik ~30 dosyada elle yapılır. Alternatif (daha ucuz, geri dönüşü kolay): buton kalsın, yanına B'deki cümle konsun. Geri dönüş maliyeti: metin-only, 1 commit revert.
|
||||
|
||||
**Ek kural önerisi [KARAR]:** "yapay zekâ" yazımı tek kaynaktan gelsin (ör. `src/lib/marka.ts` içinde `YZ_ETIKET = "yapay zekâ"`). Bugünkü 4 farklı yazım hem markayı dağıtıyor hem gelecekteki terim kararını pahalılaştırıyor.
|
||||
|
||||
---
|
||||
|
||||
## 3. Güven engeli — öğrenci/veli neden "yapay zekâ listesi"ne mesafeli?
|
||||
|
||||
### 3.1 Dışarıda ne konuşuluyor
|
||||
|
||||
- Prof. Dr. Gamze Sart (İÜ-Cerrahpaşa, Rehberlik ve Psikolojik Danışmanlık ABD Başkanı), 9 Ağu 2026: "yapay zekânın **yanlış veya güncel olmayan bilgiler sunabilmesi** ve adayın kişisel özelliklerini yeterince değerlendirmeden önerilerde bulunabilmesi… tercih sürecinde risk oluşturabiliyor." [W] — https://www.milliyet.com.tr/egitim/yapay-zeka-sizi-yaniltmasin-7637863
|
||||
- Koçluk blogları tercih robotlarını "sonuç değil başlangıç noktası" diye konumluyor; ana eleştiri "arka planda oldukça **sınırlı bir veri seti** ve genel geçer kalıplar var", "bir algoritma senin hikâyeni bilmiyor". [W] — https://www.hocamkocluk.com/blog/tercih-robotlarina-ne-kadar-guvenilmeli
|
||||
- Rakip tarafında iki zıt uç var (dünkü rapordan, tekrar edilmedi): TercihSepeti ve tercih-robotu.com **"yerleşme olasılığı/ihtimali"** vaat ediyor; Unikazan ise "robot seni tanımaz, karar verici yapma" diyor (`docs/ekip-raporlari/2026-09-21/04-rakip-analizi.md` §1.2). [W, dünkü rapordan]
|
||||
|
||||
**Okuma:** Piyasadaki mesafe iki gerekçeye dayanıyor — **(a) uydurma/eski veri**, **(b) seni tanımıyor**. İkisinin de kodda hazır cevabı var, hiçbiri satış anında söylenmiyor.
|
||||
|
||||
### 3.2 Sitenin söylediği / söylemediği
|
||||
|
||||
| Güven iddiası | Söyleniyor mu? | Nerede | Satış anında görünüyor mu? |
|
||||
|---|---|---|---|
|
||||
| Veri kaynağı resmî YÖK Atlas | Evet | `page.tsx:121,361`, hero rozeti `page.tsx:247-256`, `veri-kaynagi.tsx:29` | **Evet** (tek iyi örnek) |
|
||||
| Veri tazeliği (21 Eyl 2026) | Evet | `src/lib/seo.tsx:24`, hero rozeti | Evet |
|
||||
| Havuz kısıtı — "uydurma program yok" | Evet ama gömülü | `page.tsx:127` (kapalı akordeon), `huni-semasi.tsx:47,52`, `meraklisina-icerik.tsx:119-127` | **Hayır** |
|
||||
| Yerleşme garantisi yok | Evet, iyi | `page.tsx:132,383-392`, `sonuc/page.tsx:128-132`, `paket/page.tsx:61-63`, `giris-karti.tsx:88`, `site-footer.tsx:133` | Evet |
|
||||
| Yöntem şeffaf / kara kutu değil | Evet | `/meraklisina` tamamı | **Hayır** — site içi 2 link |
|
||||
| "Bu bir tahmin aracıdır" | Evet | `meraklisina-icerik.tsx:138+` | Hayır |
|
||||
| Olasılık dili yasağı sistemsel | Evet (kodda zorlanıyor) | `src/lib/tadimlik-havuzu.ts:55-63` (`YASAK_GEREKCE_DILI`) | Hayır — kullanıcı bunu bilmiyor |
|
||||
| **Üniversitelerden para almıyoruz** | **Hayır** | grep = 0 | Hayır |
|
||||
| **Kim yaptı / kurucu kim** | **Hayır** | grep = 0 | Hayır |
|
||||
| "Seni tanımıyor" itirazına cevap (öncelik çipleri) | Yarım | `sihirbaz-adimlar.tsx:487-490`: "Öncelikler yapay zekânın gerekçelerine ve program seçimine yön verir; listeyi daraltmaz." | Yalnız sihirbaz 3. adımda |
|
||||
|
||||
### 3.3 Güven açığı üreten kendi metinlerimiz
|
||||
|
||||
| Sorun | Birebir metin | Dosya:satır | Neden riskli |
|
||||
|---|---|---|---|
|
||||
| Yerleşme imâsı | "**Doğru strateji, doğru yerleşme.**" | `arama-funnel-karti.tsx:28` | "Garanti dili yasak" kuralımızla (`vizyon.md:88`) çelişiyor; ürün yerleşme hesaplamıyor |
|
||||
| Kaynaksız yetkinlik iddiası | "**Uzman işi bir liste**, senin onayınla." | `arama-funnel-karti.tsx:42` | "Uzman" kimdir — doğrulanamaz. `[BİLAL]` |
|
||||
| Aciliyet dili boş | "Boş kalan tercih, kaçan fırsattır." | `arama-funnel-karti.tsx:41` | Tercih dönemi kapalıyken anlamsız |
|
||||
| İçeriksiz kanca | "Giriş yap**, çünkü kaçırmak istemezsin**" | `giris-baslik.tsx:11` | Karşılık söylemiyor; kapıda güven düşürüyor |
|
||||
| Kategori çelişkisi | "**YKS Tercih Robotu 2026**" | `site-footer.tsx:49` | `vizyon.md:22`: "'Puanına göre bölüm listeleyen robot' DEĞİL". `[BİLAL]` — SEO değeri olabilir, tek başıma karar vermem |
|
||||
| Takvim çelişkisi | Bant: "Tercih dönemi sona erdi" ↔ CTA: "Tercih dönemi bitmeden yerini al" | `site-top-banner.tsx:64` ↔ `hero-focus-button.tsx:45,65` | Aynı ekranda iki zıt mesaj |
|
||||
| Rakip kıyası | "Sohbet botlarında belirsiz" / "Genelde yok" | `page.tsx:160-175` | Dünkü raporda düzeltildi, bugün **temiz** — genelleme yok [K] |
|
||||
|
||||
### 3.4 Kullanıma hazır güven cümleleri
|
||||
|
||||
**D — `/sonuc` tadımlık altına, giriş CTA'sının hemen üstüne (hedef: `tadimlik-satiri.tsx:172` içindeki `<p>`'ye ikinci satır):**
|
||||
> "Yapay zekâ yalnızca sıralamanla açılan gerçek programlar arasından seçer; kılavuzda olmayan bir bölüm ya da üniversite öneremez."
|
||||
> [K] doğrulandı: `huni-semasi.tsx:47,52`, `meraklisina-icerik.tsx:119-127`.
|
||||
|
||||
**E — `/paket` alt bilgisine ekleme (hedef: `src/app/paket/page.tsx:61-63`):**
|
||||
> "Listendeki her satır resmî YÖK Atlas kaydına dayanır; yöntemin tamamı Meraklısına sayfasında adım adım yazılıdır."
|
||||
> `/meraklisina` linkiyle. [K]
|
||||
|
||||
**F — Kim olduğumuz (hedef: yeni, `src/components/site-footer.tsx:128-135` bloğu):**
|
||||
> "KolayTercih'i tek kişilik bir ekip geliştiriyor; hiçbir üniversiteden ücret ya da yönlendirme bedeli almıyoruz."
|
||||
> `[BİLAL]` — hem kurucu kimliğini açma kararı hem de doğrulanması gereken bir ticari beyan. Doğruysa rakiplerin hiçbirinde olmayan bir ayrışma (`04-rakip-analizi.md` §1.6: Üsküdar asistanı kendi programlarını öne çıkarıyor [W]).
|
||||
|
||||
---
|
||||
|
||||
## 4. Sırayı isteme anı — çerçeve ve alternatifler
|
||||
|
||||
### 4.1 Bugünkü çerçeve
|
||||
|
||||
İstek **karşılıksız** yapılıyor. Hero'da sıralama input'unun etrafında (`hero-form.tsx:142-197`) *ne alacağını* söyleyen tek kelime yok; tek bağlam butonun kendisi. Katalog kartında ise karşılık **"programları gör"** — yani ziyaretçinin zaten baktığı tablonun filtrelenmiş hâli (`cta-sira-form.tsx:254,427`). Kapıda (`tercih-profili-kapisi.tsx:355-362`) gerekçe teknik: "Risk ve erişilebilir programlar sıralamana göre hesaplanır."
|
||||
|
||||
**Karşılık aynı ekranda görünmüyor.** Analitik: 621 → 28 (%4,5); katalogdan gelen 464 kişiden 12 (`03-donusum.md` §Özet-2).
|
||||
|
||||
Bir de örtülü maliyet var: öğrenci sıralamasını yazmak için **sıralamasını bilmek** zorunda; bilmeyen ya da utanan için çıkış yolu sunulmuyor.
|
||||
|
||||
### 4.2 İki alternatif çerçeve (kullanıma hazır)
|
||||
|
||||
**G — "Karşılık önde" (hedef: `hero-form.tsx:197` altına yeni `<p className="text-sm text-slate-600">`; ayrıca `cta-sira-form.tsx:362`'deki "Ücretsiz, üyelik gerekmez." yerine):**
|
||||
> "Sıralamanı yazınca iki şey açılır: sana açık olan programların tam listesi — ücretsiz, üyeliksiz — ve istersen bu programlardan kurulmuş 24 satırlık gerekçeli tercih listen."
|
||||
|
||||
**H — "Maliyeti düşür" (hedef: `hero-form.tsx:177` ve `cta-sira-form.tsx:240` placeholder'ının altına yeni yardım satırı):**
|
||||
> "Tek istediğimiz başarı sıralaman — ad, e-posta veya telefon sormuyoruz. Sıralamanı sonradan istediğin zaman değiştirebilirsin."
|
||||
> [K] doğrulandı: form yalnızca `sira` + `tur` alıyor (`hero-form.tsx:60-93`), profil `tercihProfiliYaz` ile saklanıp `Farklı sıralama gir` ile değiştirilebiliyor (`hero-form.tsx:127-133`).
|
||||
> Not: "verilerin bizde kalmaz" gibi bir cümle **kurulmamalı** — profil çereze de yazılıyor (`sihirbaz-profil.ts`, `sonuc/page.tsx:63-64`) ve her `/sonuc` isteğinde sunucuya gidiyor.
|
||||
|
||||
**Ek (sıralamasını bilmeyene çıkış):** `cta-sira-form.tsx:269` altına
|
||||
> "Sıralamanı bilmiyorsan yanındaki puan türünü seçip tahmini bir sayı yazabilirsin; sonucu istediğin kadar değiştirebilirsin."
|
||||
|
||||
---
|
||||
|
||||
## 5. Giriş kapısı çerçevesi
|
||||
|
||||
### 5.1 Bugünkü metinler
|
||||
|
||||
| Nokta | Birebir metin | Dosya:satır |
|
||||
|---|---|---|
|
||||
| `/sonuc` hazır panel başlığı | "Seçimlerin hazır — Yapay Zeka listen bir adım uzakta" | `sihirbaz-cagri-karti.tsx:284` |
|
||||
| Panel gövdesi | "Yukarıdaki tablo her zaman ücretsiz. 5 deneme kredinle 24 tercihlik Yapay Zeka listeni de kurabilirsin: ücretsiz giriş yap, seçimlerin kayıtlı — listen otomatik kurulsun (üretim 3 kredi, kalan 2 kredinle danışmana soru sorarsın)." | `sihirbaz-cagri-karti.tsx:286-291` |
|
||||
| Panel butonu | "5 deneme kredinle Yapay Zeka listeni kur — giriş yap" + "Kredi kartı gerekmez · Google ya da e-posta ile 30 saniyede" | `sihirbaz-cagri-karti.tsx:303,308` |
|
||||
| `/giris` H1 | "Giriş yap, çünkü listen seni bekliyor / …tercihine 1 adım kaldı / …kaçırmak istemezsin" (döngü) | `giris-baslik.tsx:6-13` |
|
||||
| `/giris` alt metin | "Seçimlerin hazır — giriş yap, **5 deneme kredinle** listen hemen üretilsin." | `giris-karti.tsx:52-58` |
|
||||
|
||||
**Değerlendirme:** `/sonuc` paneli aslında iyi yazılmış — ürünün ücretsiz denenebildiğini, kredi kartı istenmediğini söylüyor. Ama üç sorun var:
|
||||
1. Panel sayfanın en altında; 17 anonim oturumdan 6'sı gördü, 0 tık (`03-donusum.md`).
|
||||
2. **Kapıya varınca vaat inceliyor:** `/giris`'te "kredi kartı gerekmez" cümlesi **yok**, 24 sayısı **yok**, listenin ne olduğu **yok** — yalnız "5 deneme kredisi" var, ki kullanıcı kredinin ne olduğunu bilmiyor.
|
||||
3. `/giris` başlığı 6 varyantlı animasyon; ikisi içeriksiz ("kaçırmak istemezsin"). Kapıda güven değil aciliyet satıyor.
|
||||
4. Sonuç: 30 günde /giris gören ~11 kişi, giriş deneyen 6 (`03-donusum.md` §1a).
|
||||
|
||||
### 5.2 Kullanıma hazır alternatifler
|
||||
|
||||
**I — `/giris` alt metni (hedef: `giris-karti.tsx:53-58`, `funnel` dalı):**
|
||||
> "Seçimlerin hazır. Giriş yapınca hesabına 5 deneme kredisi tanımlanır: 3'ü 24 satırlık listeni kurar, kalan 2'siyle danışmana soru sorarsın. Kredi kartı istemiyoruz; listenin ilk 3 satırı ücretsiz açık gelir."
|
||||
> [K] doğrulandı: `src/lib/credits.ts:11,14` (`DENEME_KREDISI=5`, `RAPOR_KREDI=3`), `src/lib/rapor-maske.ts:12` (`ACIK_SATIR=3`).
|
||||
|
||||
**J — `/giris` H1 (hedef: `giris-baslik.tsx:6-13`, döngü dizisi):**
|
||||
Animasyonu koruyup içeriksiz varyantları değiştir:
|
||||
> ", çünkü 24 satırlık listen üretilmeyi bekliyor" · ", çünkü 5 deneme kredin hazır" · ", çünkü seçimlerin kayıtlı" · ", çünkü kredi kartı istemiyoruz"
|
||||
> ("çünkü kaçırmak istemezsin" ve "çünkü tercihine 1 adım kaldı" çıkarılır.)
|
||||
|
||||
**K — `/sonuc` H1 (hedef: `src/app/sonuc/page.tsx:98` ile `102` arası, `<ManuelHarita />` üstü — bugün sayfada hiç `<h1>` yok):**
|
||||
> "\<sıra\>. sıralamanla açılan programlar"
|
||||
> alt satır: "Aşağıdaki tablo ücretsiz ve üyeliksiz. Aynı programlardan 24 satırlık, her satırı gerekçeli bir tercih listesi kurmak istersen sayfanın altındaki adımı tamamla."
|
||||
|
||||
**L — Sihirbaz son butonu, girişsiz dal (hedef: `hero-form.tsx:222`, `cta-sira-form.tsx:334`):**
|
||||
> "Ücretsiz tablonu gör — 24'lük liste bir sonraki adımda"
|
||||
> (Bugün yalnız "Ücretsiz tablonu gör" — vaadin sessizce küçüldüğü tek nokta.)
|
||||
|
||||
---
|
||||
|
||||
## 6. Girişimler — hemen / yakın / sezon
|
||||
|
||||
Kurucu kapasitesi günde 1–2 saat (`docs/urun/vizyon.md:93`). Az ama bileşik iş seçildi. Hedef kitle ayrımı: **öğrenci = kullanan**, **veli = ödeyen**, **rehber öğretmen = dağıtım**.
|
||||
|
||||
### Hemen (bu hafta, ≤ 2 saat toplam, hepsi metin)
|
||||
|
||||
| # | İş | Dosya:satır | Kitle | Neden bileşik |
|
||||
|---|---|---|---|---|
|
||||
| H1 | Üst bandın sezon dışı metni + "tercih dönemi bitmeden" CTA'sını düzelt | `site-top-banner.tsx:60-65`, `hero-focus-button.tsx:44-46,63-66` | Hepsi | Her sayfada, her ziyaretçide; bugün doğrudan "buradan gitme" diyor |
|
||||
| H2 | Hero alt başlığı ekle (öneri **A**) | `src/app/page.tsx:239→240` | Öğrenci | Ana sayfa 25/95 ziyaretin girişi ve en çok dönüştüren kanal |
|
||||
| H3 | Katalog CTA açıklamasına vaadi koy (öneri **B** + **G**) | `sayfalama.tsx:40-41`, `cta-sira-form.tsx:362` | Öğrenci | 464/621 ziyaretin tek dönüşüm yüzeyi |
|
||||
| H4 | `/sonuc`'a H1 + alt satır (öneri **K**) | `src/app/sonuc/page.tsx:98-102` | Öğrenci | Vaadin koptuğu yer; SEO'ya da yarar |
|
||||
| H5 | `/giris` metinleri (öneri **I**, **J**) | `giris-karti.tsx:53-58`, `giris-baslik.tsx:6-13` | Öğrenci | Kapıdaki 6/11 oranı |
|
||||
| H6 | Riskli 3 cümleyi çıkar | `arama-funnel-karti.tsx:28,41,42` | Hepsi | Marka tutarlılığı; "garanti dili yasak" kuralımız |
|
||||
| H7 | "Havuz dışına çıkamaz" cümlesini satış anına taşı (öneri **D**, **E**) | `tadimlik-satiri.tsx:172`, `paket/page.tsx:61-63` | Veli | Tek gerçek farklılaştırıcı |
|
||||
|
||||
### Yakın (2–4 hafta)
|
||||
|
||||
| # | İş | Kitle | Not |
|
||||
|---|---|---|---|
|
||||
| Y1 | Rehber yazılarının sonundaki CTA'ya ürünün çıktısını yaz (27 yazı, tek bileşen: `rehber-makale.tsx:115`) | Öğrenci | Tek dosya değişikliğiyle 27 sayfa |
|
||||
| Y2 | `/meraklisina`'ya site içi giriş sayısını 2'den artır: `/sonuc` dipnotu, `/paket` alt bilgisi, katalog CTA'sı | Veli | Veli "yöntem" arar; bu sayfa velinin sayfası |
|
||||
| Y3 | Tadımlık havuzu kapsam denetimi — hangi kova×tür×kategori×tip kombinasyonlarında satır **yok**? Boşta vaat hiç görünmüyor | Öğrenci | `tadimlik-bolumu.tsx:19-21`, `data/app.db` = 522 satır |
|
||||
| Y4 | Terim sözlüğü sabiti (`YZ_ETIKET`) — gelecekteki terim kararını ucuzlat | İç | Bugün 4 farklı yazım, ~30 dosya |
|
||||
| Y5 | Veli sayfası taslağı: "Çocuğunuz ne aldı?" — 24 satır, PDF, kaynak, garanti yok | **Veli (ödeyen)** | Ödeme başlatan 0; ödeyen kişiye hitap eden tek yüzey yok |
|
||||
|
||||
### Sezon (Haziran–Ağustos 2027 hazırlığı)
|
||||
|
||||
| # | İş | Kitle |
|
||||
|---|---|---|
|
||||
| S1 | Rehber öğretmene yönelik tek sayfalık "sınıfta kullanılabilir çıktı" konumu (PDF + yöntem sayfası); rakiplerin hiçbiri öğretmene alet vermiyor (`04-rakip-analizi.md` §Özet-6) | **Rehber öğretmen (dağıtım)** |
|
||||
| S2 | Sezon takvimine bağlı bant/CTA metin şeması: "hazırlık / sonuç bekleme / tercih / ek yerleştirme" dört durum | Hepsi |
|
||||
| S3 | Kategori kararının uygulanması (aşağıda CEO-1) | Hepsi |
|
||||
|
||||
---
|
||||
|
||||
## 7. CEO karar listesi
|
||||
|
||||
| # | Karar | Tavsiyem | Geri dönüş maliyeti |
|
||||
|---|---|---|---|
|
||||
| 1 | **Sezon dışı çerçeve:** bant + CTA'lar "tercih dönemi" yerine "2027'ye hazırlık / 2026 verisi yüklendi" mi demeli? | **Evet, hemen.** Bugün her sayfanın en üstünde ürünün işe yaramadığını söylüyoruz | Düşük — metin + iki sabit; 1 commit revert |
|
||||
| 2 | **CTA'dan "Yapay Zeka" çıkıp "24 tercihlik liste" gelsin mi?** (öneri C) | **Kısmi evet:** buton kalsın, yanına somut cümle gelsin. Tam değişimi ölçümden sonra yap | Orta — 11 görünür yer, tek sözlük yok; `[BİLAL]` |
|
||||
| 3 | **Footer'daki "YKS Tercih Robotu 2026" adlandırması kalsın mı?** | Kalsın ama link metni "YKS Tercih Robotu 2026 — 24'lük liste kurucu" olsun; SEO'yu kaybetmeden kategori çelişkisi kapanır | Düşük; `[BİLAL]` (SEO etkisi ölçülmeli) |
|
||||
| 4 | **"Üniversitelerden para almıyoruz" + kurucu kimliği sitede açılsın mı?** (öneri F) | **Evet** — rakiplerde yok, ölçeklenmiyor, ucuz | Geri dönüşü zor (kimlik açma); `[BİLAL]` |
|
||||
| 5 | **`/sonuc`'a H1 eklensin mi?** (öneri K) | Evet — hem vaat sürekliliği hem erişilebilirlik | Çok düşük |
|
||||
| 6 | **Veli için ayrı sayfa açılsın mı?** (Y5) | Hazırlık başlasın, yayın sezon öncesi | Orta — yeni sayfa; `[BİLAL]` (fiyat/konum dili içerir) |
|
||||
| 7 | **Riskli 3 cümle ("Doğru strateji, doğru yerleşme", "Uzman işi bir liste", "Boş kalan tercih, kaçan fırsattır") çıkarılsın mı?** | **Evet** — kendi "garanti dili yasak" kuralımızı deliyorlar | Sıfır |
|
||||
|
||||
---
|
||||
|
||||
## Bilal'den istenen (3 madde)
|
||||
|
||||
1. **Karar-1'i onayla:** üst banttaki "Tercih dönemi sona erdi" ve "Tercih dönemi bitmeden yerini al" cümlelerinin sezon dışı karşılıklarını belirle — bugün her ziyaretçiye "geç kaldın" diyoruz. *(~10 dk)*
|
||||
2. **Karar-2 ve Karar-4'ü işaretle:** CTA'da "Yapay Zeka" ibaresi kalsın mı, ve "üniversitelerden para almıyoruz / kurucu kimliği" sitede açılsın mı — ikisi de geri dönüşü pahalı marka kararı. *(~15 dk)*
|
||||
3. **Tek doğrulama:** `tadimlik_havuzu`'nun (522 satır) hangi kova×tür×kategori kombinasyonlarını kapsamadığını çıkartmamı istiyor musun — kapsam dışı ziyaretçi vaadi `/sonuc`'ta hiç görmüyor. *(senden ~2 dk onay, bende ~30 dk)*
|
||||
|
||||
---
|
||||
|
||||
### Kanıt dosyaları (tam yollar)
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/app/page.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/features/pazarlama/components/hero-baslik.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/features/sihirbaz/components/hero-form.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/features/sihirbaz/components/cta-sira-form.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/features/sihirbaz/components/sihirbaz-cagri-karti.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/features/rapor/components/tadimlik-satiri.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/features/kullanici/components/giris-karti.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/features/kullanici/components/giris-baslik.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/components/site-top-banner.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/components/site-footer.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/components/arama-funnel-karti.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/features/katalog/components/sayfalama.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/app/sonuc/page.tsx`
|
||||
- `/Users/bilalgursen/Desktop/kolaytercih/src/lib/veri-yillari.ts`, `src/lib/credits.ts`, `src/lib/rapor-maske.ts`, `src/lib/risk.ts`
|
||||
|
||||
### Web kaynakları
|
||||
- https://www.milliyet.com.tr/egitim/yapay-zeka-sizi-yaniltmasin-7637863 [W]
|
||||
- https://www.hocamkocluk.com/blog/tercih-robotlarina-ne-kadar-guvenilmeli [W]
|
||||
276
docs/ekip-raporlari/2026-09-22/04-uretim-engelleri.md
Normal file
276
docs/ekip-raporlari/2026-09-22/04-uretim-engelleri.md
Normal file
@@ -0,0 +1,276 @@
|
||||
# 04 — Üretim engelleri: liste ve üretim anı dönüşüme ne kadar zarar veriyor?
|
||||
|
||||
Hazırlayan: Yapay zekâ mühendisi · 22 Eyl 2026 gündüz · Kod değiştirilmedi, commit atılmadı.
|
||||
Kanıt türleri: **[ölçüldü]** = bu oturumda koşturularak (LLM çağrısı YOK, maliyet 0 TL), **[koddan çıkarım]** = yalnızca kod okunarak. Gerçek modelle hiçbir koşu yapılmadı.
|
||||
|
||||
> **Satır numaraları `main @ bda4d07` referanslıdır.** Çalışma ağacında Bilal'e ait commit'lenmemiş değişiklikler var (`Dockerfile`, `globals.css`, `layout.tsx`, `liste-uretici.tsx`, yeni `src/app/api/saglik/`) — dokunulmadı. `liste-uretici.tsx`'teki satır numaraları o değişikliklerle kayar.
|
||||
>
|
||||
> **O devam eden iş bu raporun 5. maddesiyle doğrudan ilgili:** yeni `sunucuAyaktaMi()` + `kod:"SUNUCUYA_ULASILAMIYOR"` yaması, üretim bittikten hemen sonra konteyner ölünce (ters vekil 502) WebKit'in sayfayı `listem.txt` olarak indirdiği 22 Eyl vakasını kapatıyor. **Bu dalda liste DB'ye yazılmış, kredi harcanmış ve kullanıcı listeyi hiç görmemiş oluyor** — yani "3 liste oluşturuldu" sayısının bir kısmı ekrana hiç ulaşmamış olabilir. Aşağıdaki §5 tablosu bu dalı (g)'nin bir varyantı olarak okumalı.
|
||||
|
||||
---
|
||||
|
||||
## 5 maddelik karar özeti
|
||||
|
||||
1. **Bekleme süresi tek başına 3 listeyi açıklamıyor.** Tipik üretim ~10–20 sn (kod yorumu, `src/lib/ai/cagri.ts:66-67`), havuz SQL'i 2–72 ms [ölçüldü]. Ama **bekleme ekranı 28 saniyede donuyor**: 4 aşama mesajı 7 sn arayla akıyor (`uretim-mesaji.ts:16`), sonra "neredeyse hazır" yazısında kalıyor; "uzun sürdü" uyarısı ise **90 sn**'de geliyor (`liste-uretici.tsx:45`) — yani 28–90 sn arası kullanıcı ilerleme sinyali olmadan bekliyor. En kötü hâl 126 sn (2 deneme × 60 sn + 6 sn geçiş supabı).
|
||||
2. **Asıl kapı kredi değil, maskedir.** Yeni kullanıcı 5 kredi alıyor (`credits.ts:11`), liste 3 kredi (`credits.ts:14`) — ama paketsiz kullanıcının listesinde **24 satırın 21'inin yapay zekâ metni kilitli** (`rapor-maske.ts:13`, `listem-icerik.tsx:144`). Deneme, kredinin %60'ını harcayıp %87,5'i kilitli bir çıktı üretiyor. Danışman da kilitli 21 satırı görmüyor (`api/soru/route.ts` "kilitli" dalı), yani kalan 2 kredi de yarım değerde. **"Denemeden önce ödeme" hissinin kaynağı burası.**
|
||||
3. **Bir metin fiilen yanlış vaat veriyor.** `/sonuc`'taki tadımlık CTA'sı: *"24 satırın tamamı için giriş yap — 5 deneme kredin hazır"* (`tadimlik-satiri.tsx`). Giriş yapan kullanıcı 24 satırın tamamını almıyor; 3 açık + 21 kilitli alıyor. Aynı CTA giriş dönüşünde kullanıcıyı `/listem?uret=1`'e değil **düz `/sonuc`'a** bırakıyor (`callback=${sonucHref()}` → `"/sonuc"`), yani üretim başlamıyor, bir tık daha gerekiyor. Yanındaki hazır panel doğru yere (`LISTEM_URET_HREF`) gidiyor — iki CTA aynı sayfada farklı davranıyor.
|
||||
4. **"Üretmeden gösterme" için elimizde hazır ve bedava bir yol var.** 24'lük iskeletin **gerekçe dışındaki her şeyi zaten deterministik**: program seçimi, dilim, risk notu ve trend cümlesi LLM'siz kuruluyor — **24 satır 2–72 ms'de, 0 LLM çağrısıyla** [ölçüldü]. Üstüne 522 satırlık tadımlık havuzu (`app.db/tadimlik_havuzu`, kova×tür×kategori×tip) duruyor [ölçüldü: 522 satır]. Bugün bu varlığın tamamı **yalnızca `/sonuc`'ta, yalnızca tek satır** olarak kullanılıyor — 30 günde 23 kişinin gördüğü sayfada. Trafiğin %75'i olan katalog sayfaları yapay zekâ çıktısını hiç görmüyor.
|
||||
5. **3 listenin yanında kaç başarısız deneme olduğu Rybbit'ten ölçülemiyor** — `liste_uretim_hata` olayı 21 Eyl 04:49'da eklendi (`cf19903`) ve prod'a 21 Eyl öğleden sonra çıktı; 23 Ağu–21 Eyl penceresinin tamamında hata dalı ölçüsüzdü. **Ama prod DB'den bugün, kod değişmeden çıkarılabiliyor:** `credit_ledger`'da `report_generate` satırı = deneme, aynı `ref_id`'li `refund` satırı = başarısızlık. Sorgu §5'te.
|
||||
|
||||
---
|
||||
|
||||
## 1. Üretim anının maliyeti
|
||||
|
||||
### Kullanıcı ne yaşıyor (akış, dosya:satır)
|
||||
|
||||
| # | Adım | Nerede | Süre |
|
||||
|---|---|---|---|
|
||||
| 1 | "Listemi oluştur" → seçimler storage'a yazılır, `/listem?uret=1`'e gidilir | `sihirbaz-cagri-karti.tsx:179-188` | anlık |
|
||||
| 2 | Girişsizse araya `/giris` girer (Google OAuth tur) | `sihirbaz-cagri-karti.tsx:185` | ~5–15 sn (ölçülmedi) |
|
||||
| 3 | `ListeUretici` mount → localStorage/çerez profili okunur → server action | `liste-uretici.tsx:162-176` | anlık |
|
||||
| 4 | **3 kredi düşülür** (LLM'den ÖNCE) | `rapor-actions.ts:119-124` | anlık |
|
||||
| 5 | Aday havuzu SQL + filtre/gevşetme | `rapor-havuzu.ts:93` | **2–72 ms** [ölçüldü] |
|
||||
| 6 | LLM çağrısı (`reasoning_effort:"none"`, `max_tokens:4000`) | `rapor.ts:304-315`, `cagri.ts:90-115` | tipik ~10–20 sn [kod yorumu, `cagri.ts:66`], üst sınır 60 sn |
|
||||
| 7 | Şema/adet tutmazsa **2. deneme** (yeni 60 sn bütçesi) | `rapor.ts:303-332` | +0–60 sn |
|
||||
| 8 | Rapor DB'ye yazılır, `router.replace("/listem")` | `rapor-actions.ts:181-195`, `liste-uretici.tsx:114` | anlık |
|
||||
| 9 | Geçiş olmazsa emniyet supabı tam sayfa yükler | `liste-uretici.tsx:41,136-150` | +6 sn |
|
||||
|
||||
**Toplam:** tipik **15–30 sn**, gerçekçi kötü hâl **60–70 sn**, teorik en kötü **~126 sn**.
|
||||
|
||||
### Ekranda ne görüyor
|
||||
|
||||
- İki kolonlu iskelet (8 satır skeleton + danışman paneli) + shimmer'lı aşama metni (`liste-uretici.tsx:239-341`).
|
||||
- Metinler: 4 aşama, 7000 ms arayla, **sonuncuda duruyor** (`uretim-mesaji.ts:11-17,19`). → **28 sn sonra ilerleme sinyali yok.**
|
||||
- Altta: *"Bu işlem yarım dakika kadar sürebilir, sayfayı kapatma."* (`liste-uretici.tsx:271`).
|
||||
- "Beklenenden uzun sürdü" mesajı **90 sn**'de (`liste-uretici.tsx:45`). 60 sn'de ilk deneme abort olup ikinci deneme sessizce başlıyorsa kullanıcı 60–90 sn arası hiçbir şey öğrenmiyor.
|
||||
|
||||
**Bir ilk kullanıcıyı kaçırır mı?** Ortalama (15–30 sn) için hayır; bu ekran iyi tasarlanmış. Kaçırdığı yer **kuyruk**: girişsiz kullanıcı için tıklama → OAuth → yeniden yükleme → 15–30 sn bekleme zinciri, ödül 3 açık satırsa orantısız. Mobilde `/sonuc`'tan çıkışa medyan 33 sn (03 raporu §2) — bu sabırla, girişten sonra 30 sn daha bekleme talep ediliyor.
|
||||
|
||||
### "Sayfayı kapatma" gerçek bir tehdit
|
||||
|
||||
`cagri.ts:63-67` kendi notunda söylüyor: *"fonksiyon dışarıdan öldürülürse harcanan kredi iade edilemiyor."* Kredi LLM'den önce düşüyor (`rapor-actions.ts:119`), iade yalnızca `catch` bloğu koşarsa oluyor (`rapor-actions.ts:169-178`). Kullanıcı sekmeyi 20. saniyede kapatırsa **5 deneme kredisinin 3'ünü hiçbir şey görmeden kaybetme riski var** ve bu dal hiçbir yerde sayılmıyor. [koddan çıkarım]
|
||||
|
||||
### Maliyet (token; TL yazılmadı — fiyat OpenRouter panelinden okunmalı)
|
||||
|
||||
Model: `deepseek/deepseek-v4-flash` varsayılan (`client.ts:6`); env ile değişebilir.
|
||||
|
||||
| Profil | Havuz | Hedef (h/d/g) | Gevşetildi | Havuz JSON | ~token |
|
||||
|---|---|---|---|---|---|
|
||||
| 5.000 / say / müh + İstanbul | 40 | **8/6/10** | **il** | 9.606 char | ~2.9k |
|
||||
| 30.000 / say / müh | 51 | 5/13/6 | — | 12.350 | ~3,7k |
|
||||
| 75.000 / ea / hukuk (devlet) | 60 | 5/13/6 | kategori | 14.185 | ~4,3k |
|
||||
| 175.000 / söz / seçimsiz | 60 | 5/13/6 | — | 14.324 | ~4,3k |
|
||||
| 375.000 / tyt / sağlık | 60 | 5/13/6 | kategori | 14.477 | ~4,4k |
|
||||
| 750.000 / tyt / seçimsiz | 60 | 5/13/6 | — | 14.749 | ~4,5k |
|
||||
|
||||
[ölçüldü] — `havuzOlustur` + `havuzuKompaktJson`, LLM'e gidilmedi. Token ≈ char/3.3 (Türkçe+JSON için kaba katsayı, doğrulanmadı).
|
||||
|
||||
- **Girdi/çağrı:** havuz (~2,9–4,5k) + sistem prompt'u (~600) + kullanıcı sarmalayıcı (~200) ≈ **3,7–5,3k token**.
|
||||
- **Çıktı/çağrı:** 24 × (id + ~15 kelimelik gerekçe) + genel + uyarılar ≈ **~1,1–1,5k token** (tavan `max_tokens: 4000`).
|
||||
- **Başarılı üretim = 1 çağrı.** En kötü hâl **6 çağrı**: dış döngü 2 deneme (`rapor.ts:303`) × iç geçici-hata tekrarı 3 (`cagri.ts:43`).
|
||||
- Revizyon aynı maliyet + önceki liste özeti (24 satır ≈ +1k token).
|
||||
|
||||
---
|
||||
|
||||
## 2. Kredi kapısı
|
||||
|
||||
| Soru | Cevap | Kanıt |
|
||||
|---|---|---|
|
||||
| Liste kaç kredi? | **3** | `credits.ts:14` |
|
||||
| Yeni kullanıcıda kaç kredi? | **5**, kayıt anında otomatik | `credits.ts:11`, `auth.ts:148-157` |
|
||||
| Ücretsiz deneme var mı? | Evet ama **maskeli**: 24 satırın ilk 3'ü açık | `rapor-maske.ts:13`, `listem-icerik.tsx:144` |
|
||||
| Revizyon deneme kredisiyle yapılabilir mi? | **Hayır** — paket şartı var | `rapor-actions.ts:215` |
|
||||
| Sohbet? | 1 kredi/mesaj → kalan 2 kredi = 2 soru | `credits.ts:88-120` |
|
||||
| Kredi bitince ne görüyor? | "Kredin bu liste için yetmiyor" + paket CTA (299 TL) ya da top-up (129 TL) | `liste-uretici.tsx:180-206` |
|
||||
| `kredi_bitti` ölçülüyor mu? | Evet, istemcide; ayrıca `krediBittiIsaretle` 48 saatlik e-posta zamanlayıcısını kuruyor | `liste-uretici.tsx:121`, `credits.ts:206-225` |
|
||||
|
||||
### "Denemeden önce ödeme" hissi nerede
|
||||
|
||||
1. **Maske.** Deneme kullanıcısının aldığı yapay zekâ metni toplamda ~5 cümle: 3 gerekçe (her biri ≤15 kelime) + kırpılmış genel değerlendirme (ilk 2 cümle, `rapor-maske.ts:26-30`) + 1 uyarı. Kalan 21 satırda "Bu tercih için kişisel gerekçe paketle açılır." yazıyor. Yani **deneme, ürünü göstermiyor; paywall'u gösteriyor**.
|
||||
2. **Sayfa başlığı.** Paketsiz kullanıcının liste sayfasının H1'i: *"Veriyi ücretsiz incele. Kararı Yapay Zeka ile netleştir."* (`listem-govde.tsx:186-188`) — kullanıcı az önce 3 kredisini yaktı, karşılandığı cümle bir satış cümlesi.
|
||||
3. **Danışman kısıtı.** Kilitli satırları danışman da görmüyor ve sorulursa 299 TL'yi söylüyor (`api/soru/route.ts` kilitli dalı). Kalan 2 kredi yarım değerde.
|
||||
4. **Yanlış vaat.** `/sonuc` tadımlık CTA'sı "24 satırın tamamı için giriş yap" diyor; teslim edilen 3/24. Bu hem dönüşüm hem güven sorunu.
|
||||
|
||||
---
|
||||
|
||||
## 3. Değeri üretmeden gösterme — **en önemli madde**
|
||||
|
||||
### Bugün elimizde ne var
|
||||
|
||||
| Varlık | Durum | Nerede gösteriliyor |
|
||||
|---|---|---|
|
||||
| **Tadımlık havuzu** — 522 satır, kova×tür×kategori×tip; genel 178 / devlet 170 / vakıf 174 [ölçüldü] | Dolu, **elle yazılmış** (LLM değil; KARARLAR 21 Eyl) | Yalnız `/sonuc`, **tek satır**, yalnız girişsize (`tadimlik-bolumu.tsx:12-13`) |
|
||||
| **Deterministik 24'lük iskelet** — seçim + dilim + risk notu + trend cümlesi | Kod hazır, LLM gerekmiyor | **Hiçbir yerde** ürün öncesi gösterilmiyor |
|
||||
| Ham dilim tablosu (hayal/dengeli/garanti) | Çalışıyor | `/sonuc`, `/universite/*`, `/bolum/*` |
|
||||
| Ana sayfada örnek liste | **Yok** | — |
|
||||
| `/meraklisina` demo | Var ama sayı/şema anlatımı, liste değil | `meraklisina-demo.tsx` |
|
||||
|
||||
**Sorun:** tadımlık, huninin en dar kapısının **arkasında**. 30 günde `/sonuc`'u 23 kişi gördü; katalogdan gelen 464 oturum yapay zekâ çıktısını hiç görmedi. `tadimlik_goruntulendi` 30 günde 0 (03 raporu §2) — gösterildiğine dair kanıt da yok.
|
||||
|
||||
### Öneri: "Senin 24'lük iskeletin" — 0 LLM çağrısı, 0 ek veri
|
||||
|
||||
Ölçüm [ölçüldü]: `havuzOlustur` + `dilimHedefiHesapla` + `riskNotuMetni` + `trendOzetiMetni` ile **24 satırın tamamı 2,1–72 ms'de, hiç LLM çağrısı yapmadan** kuruluyor. Örnek çıktı (750k/tyt):
|
||||
|
||||
```
|
||||
1. [hayal] İnşaat Teknolojisi
|
||||
risk : Son taban sıralaması senin sıranın üstünde kapandı; hayal tercihi olarak düşün.
|
||||
trend: 2021-2026 arasında taban 1,1M düzeyinden 746B düzeyine indi; taban sıkılaştı.
|
||||
```
|
||||
|
||||
Bunlar **kullanıcının kendi sıralamasına göre hesaplanmış gerçek cümleler** — jenerik örnek değil. Eksik olan tek şey `gerekce` (LLM'in tek cümlesi).
|
||||
|
||||
**Teknik yol:**
|
||||
- **Veri kaynağı:** mevcut `yokatlas.db` + `rapor-havuzu.ts`. Yeni tablo, yeni betik, yeni env yok.
|
||||
- **Üretim zamanı:** istek anında, sunucuda (RSC). SQL 2–72 ms.
|
||||
- **Maliyet:** **0** — LLM'e hiç gidilmiyor, anonim istek zaten LLM'e gitmiyor (`tadimlik-havuzu.ts:1-4` kuralı korunur).
|
||||
- **Ekran:** `/sonuc`'ta bugünkü tek tadımlık satırının yerine 24 satırlık gerçek iskelet; 1–3. satırların gerekçesi **tadımlık havuzundan** (kova×tür×kategori×tip anahtarıyla zaten eşleşiyor), 4–24 arası gerekçe alanı bulanık + "Giriş yap, yapay zekâ 24 gerekçeyi senin için yazsın". Yani bugünkü kilit deneyiminin **ücretsiz, dürüst ve kredi harcamayan** prova hâli.
|
||||
- **Katalog sayfalarına taşınabilir hâli:** `/universite/*` ve `/bolum/*`'da sıra girildikten sonra aynı iskeletin ilk 5 satırı — 464 oturumluk trafiğe yapay zekâ çıktısının ne olduğunu ilk kez gösterir.
|
||||
|
||||
**Neden bu, LLM'li bir "örnek liste"den iyi:** kişiselleştirilmiş (kendi sırası, kendi illeri), bayatlamaz (canlı veriden), 0 TL, ve KARARLAR 21 Eyl'deki "tadımlık için LLM koşusu varsayılan yol değildir" kararıyla çelişmez.
|
||||
|
||||
**Alternatif (daha pahalı, önerilmez):** 6 kova × 5 tür = 30 hazır örnek listeyi batch üretmek ≈ 30 çağrı, ~135k girdi + ~45k çıktı token, tek seferlik. Prod veriye yazdığı için `[BİLAL]`. Elle yazım yolu (522 satırda yapıldığı gibi) bundan da ucuz.
|
||||
|
||||
---
|
||||
|
||||
## 4. Kalite ve güven
|
||||
|
||||
### Havuz-dışına çıkamama — **sağlam**
|
||||
|
||||
`normalizeEt` (`rapor.ts:120-137`) modelin döndürdüğü her id'yi `havuzMap`'te doğruluyor; havuzda olmayan ve tekrar eden id'ler **sessizce atılıyor**, dilim ise havuzdaki gerçek değerden **yeniden atanıyor**. Kurtarma dalı (`rapor.ts:349-385`) eksik dilimleri yine havuzdan deterministik dolduruyor. Modelin uydurduğu bir program kullanıcıya **ulaşamaz**. Bu korumaya dokunulmamalı.
|
||||
|
||||
### 24'lük iskelet — garanti edilen şey "24" değil
|
||||
|
||||
`dilimHedefiHesapla` ideal 5/13/6'dan sapabiliyor ve sapma sessiz:
|
||||
- **5.000 / say / Mühendislik + İstanbul → 8 hayal / 6 dengeli / 10 garanti** [ölçüldü]. Bu listeye "dengeli ağırlıklı" demek mümkün değil.
|
||||
- Aynı profilde **il filtresi tamamen düşürüldü** (`gevsetildi: ["il"]`): kullanıcı İstanbul seçti, havuz Türkiye geneline açıldı. `havuzOlustur` bunu `gevsetildi` olarak döndürüyor ama `raporUret` bunu yalnızca prompt'a not düşüyor (`rapor.ts:255-264`) — **`RaporKapsam`'a konmuyor** (`rapor.ts:105-111`), yani kullanıcı hiç öğrenmiyor. `uyarlandi` bayrağı yalnızca sayıların kaydığını söylüyor, **hangi seçiminin feda edildiğini söylemiyor.**
|
||||
|
||||
### "Bu bana özel" hissini taşıyan tek alan: `gerekce`
|
||||
|
||||
- `gerekce`: tek cümle, ≤15 kelime, sistem prompt'unda "METİN DİYETİ" olarak sıkıştırılmış (`rapor.ts:79-81`).
|
||||
- `riskNotu` ve `trendOzeti` **deterministik** — aynı sıra bandındaki herkeste birebir aynı cümle. Kişisel okunmuyor.
|
||||
- Kullanıcının sihirbazda girdiği **iller ve öncelikler çıktıda hiçbir yerde geri yansımıyor**; prompt'a giriyor ama satır düzeyinde görünür karşılığı yok.
|
||||
- Paketsizde bu yüzeyin %87,5'i maskeli.
|
||||
|
||||
### Vaat dili denetimi — **prompt var, çıktı denetimi yok**
|
||||
|
||||
Prompt "garanti / kesin / yüzde yüz" diyor (`rapor.ts:80-86`), sohbet prompt'u da yasaklıyor (`api/soru/route.ts`). Ama **çıktı tarafında hiçbir denetim yok**: `gerekceServisEdilebilir` / `YASAK_GEREKCE_DILI` yalnızca tadımlıkta kullanılıyor (`tadimlik-havuzu.ts:62,91,126`). Rapor metinleri DB'ye yazılıyor (`rapor-actions.ts:181-195`) ve her `/listem` açılışında yeniden servis ediliyor — bir kez sızan "yüksek ihtimalle" cümlesi kalıcı. PROTOKOL/ilke 3'e aykırı ("prompt tek başına yetmez").
|
||||
|
||||
### İki iyileştirme önerisi (prompt/şema seviyesi)
|
||||
|
||||
**İ1 — Şemaya doğrulanabilir kişiselleştirme alanı ekle.** `AiTercihSchema`'ya `esles: z.enum([...kullanıcının gerçek kategorileri, illeri, öncelikleri, "genel"])` ekle. Enum kullanıcının kendi girdisinden üretildiği için model **uyduramaz**, kod çapraz doğrulayabilir ve UI satırın yanında bir çip basabilir ("İstanbul" / "Burs önceliğin" / "Mühendislik"). Maliyet: satır başına ~10 token (+~240 token/liste). Kazanç: kişiselleştirme **görünür** ve **denetlenebilir** hâle gelir. `[KARAR]` — ama iskelet değişikliği olduğu için `/meraklisina` şeması aynı commit'te güncellenmeli (AGENTS.md).
|
||||
|
||||
**İ2 — Çıktı denetimi + gevşetme dürüstlüğü.** (a) `gerekceServisEdilebilir`'i `lib/risk.ts` ya da ortak bir modüle taşıyıp rapor `gerekce` / `genelDegerlendirme` / `uyarilar` alanlarına da uygula; takılan satırın gerekçesi deterministik şablona düşsün ve sayaç tutulsun (§5'teki tek olay). (b) `gevsetildi`'yi `RaporKapsam`'a ekleyip UI'da tek cümle: "İstanbul'da 24 program çıkmadı; listeye yakın illerden de eklendi." Bu hem dürüstlük hem "beni gerçekten dinlemiş" sinyali. `[KARAR]`.
|
||||
|
||||
---
|
||||
|
||||
## 5. Sessiz hatalar
|
||||
|
||||
### Dallar ve ölçüm durumu
|
||||
|
||||
| # | Dal | Kod | Kredi | Ölçülüyor mu |
|
||||
|---|---|---|---|---|
|
||||
| a | Şema iki denemede de tutmadı | `rapor.ts:334-348` | iade | `liste_uretim_hata{kod:"HATA"}` — **yalnız 21 Eyl'den beri** |
|
||||
| b | 429/5xx, 3 tekrar tükendi | `cagri.ts:41-59` | iade | aynı |
|
||||
| c | 60 sn zaman aşımı | `cagri.ts:68,90` | iade | aynı |
|
||||
| d | `AI_KEY_MISSING` | `client.ts:34` | iade | aynı (kullanıcıya altyapı sızmıyor — doğru) |
|
||||
| e | Havuz < 3 program | `rapor.ts:236-240` | iade | aynı |
|
||||
| f | **Kurtarma dalı: liste kuruldu ama satırlar şablon** | `rapor.ts:349-385` | harcandı | **HAYIR** — yalnız `console.warn`. `liste_olusturuldu` atılıyor, başarı sayılıyor |
|
||||
| g | **Kullanıcı sekmeyi üretim sırasında kapattı** | `cagri.ts:63-67` notu | **iade edilemeyebilir** | **HAYIR** — hiç olay yok |
|
||||
| h | İstemci tarafı istisna | `liste-uretici.tsx:95` | belirsiz | `kod:"ISTISNA"` |
|
||||
| i | Kredi yetersiz | `liste-uretici.tsx:121` | harcanmadı | `kredi_bitti` |
|
||||
| j | Oturum düşmüş (AUTH) | `liste-uretici.tsx:123-124` | harcanmadı | **HAYIR** — sessizce `/giris`'e atıyor |
|
||||
|
||||
### 3 listenin yanında kaç başarısız deneme var?
|
||||
|
||||
**Rybbit'ten ölçülemiyor.** `liste_uretim_hata` olayı `cf19903` (21 Eyl 2026 04:49) ile eklendi ve 03 raporu §0'a göre prod'a 21 Eyl ~15:20'de çıktı. 23 Ağu–21 Eyl penceresinin tamamı ölçüsüz.
|
||||
|
||||
**Ama prod DB'den bugün, kod değişmeden çıkarılabilir** — `credit_ledger`'da her deneme bir `report_generate` satırı, her başarısızlık aynı `ref_id`'li bir `refund` satırı bırakıyor (`rapor-actions.ts:119-124`, `171-176`). Salt okuma, Bilal koşar:
|
||||
|
||||
```sql
|
||||
-- 30 günde liste üretim denemesi / başarısız (iade edilmiş) oranı
|
||||
SELECT date(g.created_at,'unixepoch','localtime') AS gun,
|
||||
COUNT(*) AS deneme,
|
||||
SUM(CASE WHEN r.id IS NULL THEN 0 ELSE 1 END) AS basarisiz_iade
|
||||
FROM credit_ledger g
|
||||
LEFT JOIN credit_ledger r ON r.reason='refund' AND r.ref_id = g.ref_id
|
||||
WHERE g.reason='report_generate'
|
||||
AND g.created_at >= strftime('%s','now','-30 days')
|
||||
GROUP BY 1 ORDER BY 1;
|
||||
```
|
||||
|
||||
```sql
|
||||
-- Kurtarma dalına düşmüş (şablon gerekçeli) liste sayısı
|
||||
SELECT COUNT(*) FROM reports
|
||||
WHERE result LIKE '%Sıralamana ve seçimlerine uygun olduğu için listene eklendi.%';
|
||||
```
|
||||
|
||||
`deneme − basarisiz_iade` sayısı Rybbit'teki `liste_olusturuldu` = 3 ile de çapraz doğrulanır; aradaki fark sekme kapatan kullanıcıları (dal g) gösterir.
|
||||
|
||||
### Eklenecek tek olay
|
||||
|
||||
**`liste_uretim_kalite`** — üretim başarıyla bittiğinde sunucudan değil, mevcut `liste_olusturuldu` olayına **iki özellik ekleyerek** (yeni olay adı gerektirmez, `OlayAdi` birliği büyümez):
|
||||
|
||||
```
|
||||
liste_olusturuldu { tur, sira_kovasi,
|
||||
kurtarma: 0|1, // rapor.ts:349 dalına düşüldü mü
|
||||
ai_satir: <sayı> } // AI'nın verdiği, havuzda doğrulanan satır sayısı
|
||||
```
|
||||
|
||||
Bu tek ek, (f) dalını görünür kılar: "liste kuruldu" ile "yapay zekâ gerçekten 24 gerekçe yazdı" arasındaki farkı ölçer. `ListeSonuc`'a iki alan eklemek yeterli; prompt/model değişmez.
|
||||
|
||||
---
|
||||
|
||||
## Eval seti — bugün yok, kurulması öneriliyor
|
||||
|
||||
Repoda eval yok. Bu turda yalnız **iki maliyetsiz ölçüm** koşuldu (havuz boyutu; deterministik iskelet süresi). Gerçek modelle hiçbir koşu yapılmadı.
|
||||
|
||||
Önerilen: `scripts/eval-liste.ts` (`tsx`), girdi 12 temsilî profil (6 kova × say/ea/söz/tyt karışık, il-filtreli ve filtresiz, seçimsiz dahil). Ölçülecekler:
|
||||
|
||||
| Metrik | Hedef | Bugün nasıl ölçülür |
|
||||
|---|---|---|
|
||||
| Şema geçerliliği (1. denemede) | %100 | `yapilandirilmisUret` null dönüşü |
|
||||
| Havuz-dışı program sayısı | **0** | `normalizeEt` öncesi/sonrası fark |
|
||||
| Kurtarma dalına düşme oranı | 0 | `rapor.ts:353` warn'ı sayaca çevrilir |
|
||||
| Yasak ifade sayısı (gerekce/genel/uyarılar) | **0** | `gerekceServisEdilebilir` |
|
||||
| Dilim dağılımı ideale uzaklık | raporlanır | `dilimHedefiHesapla` vs `IDEAL_HEDEF` |
|
||||
| p50/p95 gecikme | p95 < 30 sn | çağrı süresi |
|
||||
| Girdi/çıktı token | raporlanır | API yanıtı `usage` |
|
||||
|
||||
`anahtarVar()` yoksa mock yolu koşar ve rapora "gerçek modelle koşulmadı" yazılır. Gerçek modelle bir tam koşu = **12 çağrı** (retry'la en kötü 24) — 50 çağrı sınırının altında, ayrı onay gerekmez; prod DB'ye yazmaz.
|
||||
|
||||
---
|
||||
|
||||
## Maliyet ve gecikme etkisi (önerilerin)
|
||||
|
||||
| Öneri | LLM çağrısı | Gecikme | Not |
|
||||
|---|---|---|---|
|
||||
| §3 "Senin iskeletin" önizlemesi | **0** | +2–72 ms SSR | Yeni tablo/betik yok |
|
||||
| İ1 `esles` alanı | değişmez (1) | ihmal | +~240 token/liste (~%5 çıktı) |
|
||||
| İ2 çıktı denetimi + `gevsetildi` | **0** | <1 ms (regex) | Saf fonksiyon |
|
||||
| §5 iki olay özelliği | 0 | 0 | Yalnız ölçüm |
|
||||
| Aşama mesajı + 90 sn eşiği | 0 | 0 | Metin/sabit |
|
||||
|
||||
Hiçbir öneri model, sağlayıcı ya da env değiştirmiyor; kredi başına maliyet aynı kalıyor.
|
||||
|
||||
---
|
||||
|
||||
## Önerilen değişiklikler
|
||||
|
||||
| # | Değişiklik | Dosya | Yetki |
|
||||
|---|---|---|---|
|
||||
| 1 | **Tadımlık CTA'sının vaadini ve hedefini düzelt:** metin "24 satırın tamamı" demesin (maske 3/24); `callback` `sonucHref()` yerine `LISTEM_URET_HREF` olsun | `tadimlik-satiri.tsx` | `[KARAR]` — metin marka/vaat içerdiği için son hâli Bilal onaylamalı |
|
||||
| 2 | **§3 "Senin 24'lük iskeletin" önizlemesi** — 0 LLM, kendi sırasıyla, gerekçe bulanık | yeni bileşen + `sonuc/page.tsx` | `[KARAR]` (uygulama `cto`/`yazilimci` şartnamesiyle); `/meraklisina` şeması aynı commit'te |
|
||||
| 3 | **İ2 çıktı denetimi:** yasak dil filtresi rapor metinlerine de | `rapor.ts`, `tadimlik-havuzu.ts`→ortak modül | `[KARAR]` |
|
||||
| 4 | **`gevsetildi`'yi `RaporKapsam`'a ekle** ve UI'da tek cümle söyle | `rapor.ts:105`, `listem-govde.tsx` | `[KARAR]` |
|
||||
| 5 | **Aşama mesajları 28 sn'de donmasın; "uzun sürdü" eşiği 90→55 sn** (ilk abort'tan önce) | `uretim-mesaji.ts`, `liste-uretici.tsx:45` | `[KARAR]` |
|
||||
| 6 | **İ1 `esles` alanı** — şema + `/meraklisina` senkronu | `rapor.ts`, `huni-semasi.tsx` | `[KARAR]`, önce eval |
|
||||
| 7 | **Deneme maskesini gevşet** (ör. ilk 3 yerine ilk 8 satır açık, ya da deneme listesinin tamamı açık + revizyon/PDF ücretli) | `rapor-maske.ts:13` | **`[BİLAL]`** — doğrudan gelir modeli kararı |
|
||||
| 8 | Prod DB'de §5 sorgularını koş | — | **`[BİLAL]`** |
|
||||
|
||||
---
|
||||
|
||||
## Bilal'den istenen
|
||||
|
||||
1. **§5'teki iki SQL'i prod'da koş** (salt okuma) ve sonucu paylaş — "3 liste"nin yanında kaç deneme ve kaç şablon-gerekçeli liste olduğunu ancak bu söyler. (~5 dk)
|
||||
2. **Karar ver: deneme kullanıcısı 24 satırın kaçını görecek?** Bugün 3; bu, denemenin ürünü değil paywall'u göstermesine yol açıyor ve `/sonuc`'taki CTA metnini fiilen yanlış kılıyor. (~10 dk, gelir modeli kararı)
|
||||
3. **§3 önizlemesini (0 maliyet, 0 LLM) sıraya al mı?** Katalogdaki 464 oturuma yapay zekâ çıktısının ne olduğunu ilk kez gösterecek tek ucuz hamle bu. (~5 dk onay)
|
||||
137
docs/ekip-raporlari/2026-09-22/05-ceo-karari.md
Normal file
137
docs/ekip-raporlari/2026-09-22/05-ceo-karari.md
Normal file
@@ -0,0 +1,137 @@
|
||||
# 05 — CEO kararı: yapay zekâ listesine sevk
|
||||
|
||||
Hazırlayan: CEO ajanı · 22 Eyl 2026 gündüz · Kaynak: bugünün 01/02/03/04 raporları + kendi kod doğrulamam
|
||||
**Rybbit bu oturumda bağlı değil** — bu raporda tek bir yeni ölçüm yok; rakamlar 21 Eyl raporlarından, kod iddiaları bugün tek tek açılıp doğrulandı.
|
||||
|
||||
---
|
||||
|
||||
## Tek cümlelik teşhis
|
||||
|
||||
> **Sevk sorunu bir "yeterince davet etmiyoruz" sorunu değil; kullanıcıyı listeye götüren yolda üç kırık halka var — + kapısı sihirbazı doldurtup kullanıcıyı yerinde bırakıyor, girişten sonra listeye dönecek kalıcı bir link yok, ve sitenin en üstünde her sayfada "tercih dönemi sona erdi" yazarken aynı sayfanın altında "bitmeden yerini al" yazıyor. Üçü de deney değil, kusur; üçünün toplam maliyeti bir saatlik kod.**
|
||||
|
||||
## Bu hafta yapılacak 5 iş
|
||||
|
||||
| # | İş | Neden (kanıt) | Boy | Yetki | Dal | Sezon dışı kabul ölçüsü (**adet**) |
|
||||
|---|---|---|---|---|---|---|
|
||||
| **P1** | Sezon çelişkisini kaldır: banda sezon-dışı durumu, kapanış CTA'sından yanlış aciliyeti çıkar | `site-top-banner.tsx:64` "Tercih dönemi sona erdi" ↔ `hero-focus-button.tsx:45,65` "Tercih dönemi bitmeden yerini al" (03 §3, benim doğrulamam) | S | [KARAR] (yanlış cümlenin kaldırılması) · **[BİLAL]** (bandın yeni metni) | `icerik/sezon-celiskisi` | Ölçüm konusu değil: Bilal'in 1 dakikalık göz kontrolü. Yayından sonra ana sayfa oturum sayısında düşüş **olmaması** izlenir |
|
||||
| **P2** | `liste_uretim_basladi {kaynak, girisli, yeniden_deneme}` olayı — `uret()`'in ilk satırı | Üretim denemesinin **paydası yok**; 4 sessiz dal var (`liste-uretici.tsx:101-103, 143-148, 205-213`; 01 §2.3-2.4) | S | [KARAR] | `olcum/liste-uretim-basladi` | İlk 2 hafta: olay hiç düşüyor mu (beklenen 1–3/hafta); `basladi − (olusturuldu + hata + kredi_bitti)` farkı **kaç adet** |
|
||||
| **P3** | + ölü ucunu bağla: `profilToplamaAc(null, …)` → `"sihirbaz"` | `program-ekle-butonu.tsx:82` ve `liste-cekmecesi.tsx:293` → `use-tercih-profili.ts:346` `null` → "Tercihlerin kaydedildi." toast'ı (`tercih-profili-kapisi.tsx:238`). Bu yol 30g'nin **en büyük sıra kaynağı**: 14/28 olay (01 §1d) | S | [KARAR] | `funnel/arti-olu-ucu` | 2 hafta: `sira_girildi{kaynak:"kapi"}` atan oturumların kaçında `sonuc_goruntulendi` de var (bugün **0 adet**, beklenen ≥1/hafta) |
|
||||
| **P4** | Girişli kullanıcıya kalıcı `/listem` girişi + giriş callback'i + boş durum CTA'sı | Navbar'da `/listem` linki yok (`site-header.tsx:8-38`, `user-nav.tsx:45-64`); varsayılan callback `"/"` (`giris-karti.tsx:18-19`); `/listem` boş durumda profil yoksa CTA `"/"`'a atıyor (`listem-bos-cta.tsx:30`). Girişli 14 oturumun 7'si `/listem`'i hiç görmedi | S | [KARAR] | `funnel/listem-girisi` | 2 hafta: girişli oturumlarda `/listem` görüntülemesi **adedi** (bugün 30g'de 7); navbar linki tıklanır mı |
|
||||
| **P5** | Tadımlık CTA'sının yanlış vaadi ve yanlış hedefi | "24 satırın tamamı için giriş yap" (`tadimlik-satiri.tsx:186`) ama maske 3 satır açıyor (`rapor-maske.ts:12`); callback `sonucHref()` = `/sonuc`, üretim başlamıyor (`tadimlik-satiri.tsx:111`) | S | [KARAR] (hedef + yanlış iddianın kaldırılması) · **[BİLAL]** (yeni cümle) | `icerik/tadimlik-vaat` | `tadimlik_goruntulendi` bugün 30g'de **0**; yayından sonra 2 hafta içinde ≥1 adet görülmeli (görülmezse sorun metin değil, konum) |
|
||||
|
||||
Toplam: 5 paket, hepsi S, toplam inceleme yükü ~1 saat. **Bu tur başka iş onaylanmadı** — yeni rehber yazısı da dahil (backlog #2 KYK yazısı 6 Ekim tarih kilidiyle zaten sırada, ona dokunulmadı).
|
||||
|
||||
---
|
||||
|
||||
## 1. İddiaların kod doğrulaması
|
||||
|
||||
| # | İddia | Sahibi | Hüküm | Kanıt (dosya:satır) |
|
||||
|---|---|---|---|---|
|
||||
| 1 | Navbar'da `/listem`'e giden hiçbir link yok; varsayılan giriş callback'i `"/"` | Analitik | **Doğru** | `site-header.tsx:8-38` (logo + `KatalogArama` + `UserNav`, başka link yok); `user-nav.tsx:45-64` (girişlide: kredi pill'i → `/paket?kaynak=nav`, `ListemButonu`, `SignOutButton`); `listem-butonu.tsx:24` (`if (liste.length === 0) return null;` — manuel liste boşken çekmece butonu **hiç render edilmiyor**); `giris-karti.tsx:18-19` (`callback && /^\/(?![/\\])/.test(callback) ? callback : "/"`); `user-nav.tsx:39` (`<Link href="/giris">` — callback **verilmiyor**) |
|
||||
| 2 | + kapısı 3 adımı doldurtup toast'la katalogda bırakıyor; liste teklif edilmiyor | Tasarımcı | **Doğru** | `program-ekle-butonu.tsx:82` `profilToplamaAc(null, true, "arti_toast")`; `liste-cekmecesi.tsx:293` aynısı; `use-tercih-profili.ts:327-346` — `hedef==null` ve `duzenle==false` → `return null`; `tercih-profili-kapisi.tsx:234-249` — `yonlendir` null olduğu için `router.push` hiç çağrılmıyor, "Tercihlerin kaydedildi." toast'ı basılıyor |
|
||||
| 3 | 24 satırın tamamı LLM'siz, milisaniyelerde kurulabilir; LLM yalnız gerekçe metinleri için gerekli | Yapay zekâ | **Doğru ama eksik** | Doğru olan: havuz saf SQL+JS (`rapor-havuzu.ts:97-157`), `riskNotu`/`trendOzeti` deterministik (`rapor.ts:143-150`), LLM'in şemadaki payı yalnız `gerekce` + `genelDegerlendirme` + `uyarilar` (`rapor.ts:304-326`). **Eksik olan:** üretimde 24 satırın **hangi** programlar olacağını LLM seçiyor; deterministik seçim yalnız kurtarma dalında var (`rapor.ts:349-385`, `efektifSira`'ya göre sıralama). **Rapor ayrıca şunu kaçırmış: deterministik 24'lük iskelet zaten kodda yazılı** — `mockRapor` (`rapor.ts:178-215`) tam olarak bunu yapıyor (dilim başına `efektifSira` sıralı `slice`). Önizleme işi düşünüldüğünden de ucuz; yeni algoritma değil, dev-only bir fonksiyonun prod yoluna açılması |
|
||||
| 4 | Üst bant "Tercih dönemi sona erdi" basarken aynı sayfada CTA "Tercih dönemi bitmeden yerini al" diyor | Marka | **Doğru — ve rapordan biraz daha kötü** | `site-top-banner.tsx:7-8` (`TERCIH_BITISI = 2026-08-10`), `:60-65` (`asama === "sona-erdi"` → "Tercih dönemi sona erdi"), `layout.tsx:92` (her sayfada); `hero-focus-button.tsx:44-46` **ve** `:63-66` — cümle **her iki dalda da** var (profilli ve profilsiz), yani hiçbir ziyaretçi kaçmıyor; `page.tsx:651` `<KapanisCta />` |
|
||||
|
||||
### Raporların kaçırdığı / eklediğim bulgular
|
||||
|
||||
1. **`mockRapor` = hazır deterministik iskelet** (yukarıda #3). Yapay zekâ raporunun §3 önerisi "yeni bileşen + yeni yol" diye tarif edilmiş; aslında seçim mantığı `rapor.ts:178-215`'te duruyor.
|
||||
2. **Sihirbazın son buton etiketi `/sonuc`'ta zaten doğru.** Marka ve tasarımcı "girişsizde etiket 'Ücretsiz tablonu gör'e düşüyor" derken üç yerden ikisini yakalamış: `hero-form.tsx:222` ve `cta-sira-form.tsx:334` gerçekten öyle, ama `/sonuc` modalında etiket **"Giriş yap ve listeni gör"** (`sihirbaz-cagri-karti.tsx:348`). Yani metin düzeltmesi 3 değil 2 yer + `tercih-profili-kapisi.tsx:463`.
|
||||
3. **`ListemButonu` çifte gizli.** Yalnız "çekmece, `/listem` değil" değil — manuel liste boşken navbar'dan **tamamen kayboluyor** (`listem-butonu.tsx:24`). Yani ilk kez giriş yapan kullanıcının navbar'ında liste ile ilgili hiçbir şey yok. P4'ün gerekçesi analitiğin yazdığından güçlü.
|
||||
4. **`/sonuc`'ta `<h1>` gerçekten yok** (`sonuc/page.tsx:95-130` — `ManuelHarita` → tablo → tadımlık → sihirbaz → dipnot). Marka §K doğru; bu hem erişilebilirlik hem SEO borcu.
|
||||
5. **Footer ürünü "YKS Tercih Robotu 2026" diye adlandırıyor** (`site-footer.tsx:48`) — `docs/urun/vizyon.md` konumlandırmasının açıkça reddettiği kategori. Doğrulandı, ama bu tur kapsam dışı.
|
||||
6. **Çalışma ağacındaki `liste-uretici.tsx` + `src/api/saglik/` işi canlıya çıkmamış.** `liste_uretim_hata {kod:"SUNUCUYA_ULASILAMIYOR"}` (`:171`) ve `GECIS_ZORLANDI` (`:179`) commit'lenmemiş durumda (`git diff --stat`: 97 satır). Bu, "kredi yandı, kullanıcı `.txt` indirdi" vakasının düzeltmesi — **bekleyen en yüksek öncelikli teslimat P1–P5'ten bile önce Bilal'de.**
|
||||
|
||||
---
|
||||
|
||||
## 2. Çelişki çözümü — neden bu sıra?
|
||||
|
||||
Dört ajanın dördü de kendi alanından bakarak haklı, ama aynı ağırlıkta değil, çünkü hacim küçük ve sezon kapalı. Sırayı belirleyen tek ilke şu: **kanıtın kesinliği × maliyetin düşüklüğü, beklenen dönüşüm artışından önce gelir.** Markanın çelişkisi (P1) ve tasarımcının ölü ucu (P3) "bunu yaparsak dönüşüm artar" iddiası değil, koddan birebir gösterilmiş **kusur** — ölçüme ihtiyaçları yok, çünkü aynı ekranda iki zıt cümle ya da 2 kapı geçip teklif almayan kullanıcı her hacimde yanlıştır. Analitiğin ölçüm işi (P2) bundan önce değil, **aynı yayında** gelir: tek satırlık bir olay için ayrı bir inceleme turu harcamak, 4 satırlık bir kusur düzeltmesini rehin tutmak olurdu; ama huni davranışı P3/P4 ile değişeceği için payda o değişiklikle **aynı anda** canlıda olmalı, yoksa "önce–sonra" diye bakacağımız hiçbir seri olmaz. Yapay zekânın `/sonuc` iskelet önizlemesi ise tek gerçek **yeniden tasarım**tır: haftada ~95 ziyaret ve ~0,5 liste ile (01 §5.1) etkisi 2027 sezonuna kadar okunamaz (01 §5.2: `/listem`→liste oranı için ~36 hafta), bu yüzden ertelendi — ama reddedilmedi, çünkü gerekçesi dönüşüm değil dürüstlük: bugün ücretsiz deneme ürünü değil paywall'u gösteriyor. Analitiğin "alt huni %86 sızdırırken üste trafik pompalamak boşa" tespitini aynen kabul ediyorum: bu turda hiçbir trafik/SEO işi onaylanmadı, beş işin beşi de alt huninin kırık halkaları.
|
||||
|
||||
---
|
||||
|
||||
## 3. İş paketleri (kapsam ve kabul kriteri)
|
||||
|
||||
Her paket ayrı dal, tek amaç, push/merge yok. Satır numaraları `main @ bda4d07` referanslı; `liste-uretici.tsx` için çalışma ağacındaki hâl geçerli.
|
||||
|
||||
### P1 · `icerik/sezon-celiskisi` — S
|
||||
- **Amaç:** Aynı sayfada duran "geç kaldın" ↔ "acele et" çelişkisini kaldırmak.
|
||||
- **Kapsam:** (a) `hero-focus-button.tsx:44-46` ve `:63-66` — "Tercih dönemi bitmeden yerini al." cümlesi **çıkar** (yerine sezona bağlı olmayan bir cümle). (b) `site-top-banner.tsx:60-65` — `sona-erdi` durumunda bandın yeni metni **ayrı `[Bilal]` commit'i** olarak hazırlanır, ana commit'e girmez. Kapsam dışı: hero başlığı, katalog CTA metni, footer adlandırması.
|
||||
- **Kabul:** `grep -rn "Tercih dönemi bitmeden" src/` → 0 sonuç. `sona-erdi` dalında ekranda çelişkili iki cümle kalmaz. `[Bilal]` commit'i cherry-pick edilmeden de dal derlenir ve tutarlıdır.
|
||||
|
||||
### P2 · `olcum/liste-uretim-basladi` — S
|
||||
- **Amaç:** Üretim denemesine payda yaratmak.
|
||||
- **Kapsam:** `liste-uretici.tsx` `uret()` içinde `setDurum({ ad: "uretiliyor" })` yanına `olay("liste_uretim_basladi", { kaynak, girisli, yeniden_deneme })`; `olayBirKez` **değil**. "Tekrar dene" butonu `yeniden_deneme: "evet"` ile sayılır. Profil-yok dalı (`:205-213`) aynı olayı `sonuc: "profil_yok"` ile atar. `OlayAdi` birliğine tek ad eklenir. Kapsam dışı: `sihirbaz_acildi/kapatildi`, `sevk_tiklandi{yuzey}`, `rapor_yazdirildi`, sunucu tarafı olaylar — sonraki tura.
|
||||
- **Kabul:** Dört yoldan (`sihirbaz`, `hazir_cta`, `bos_durum`, `giris_donusu`) gelindiğinde olay bir kez düşer; `kaynak` doğru dolar; mevcut `liste_olusturuldu` / `liste_uretim_hata` / `kredi_bitti` davranışı değişmez; tip kontrolü ve build temiz.
|
||||
|
||||
### P3 · `funnel/arti-olu-ucu` — S
|
||||
- **Amaç:** Sihirbazı bitiren hiç kimse "kaydedildi" toast'ıyla yerinde kalmasın.
|
||||
- **Kapsam:** `program-ekle-butonu.tsx:82` ve `liste-cekmecesi.tsx:293` → `profilToplamaAc("sihirbaz", true, "arti_toast")`. Gerekirse `use-tercih-profili.ts:346` `null` dalının davranışı buna göre sadeleşir. `tercih-profili-kapisi.tsx:237-240` toast koşulu zaten `hedef !== "sihirbaz"` kontrol ediyor; ek değişiklik gerekmez ama doğrulanır. Kapsam dışı: navbar "Sıralama gir" yolunun hedefi (`katalog-arama.tsx`), kapının tanıtım adımının kaldırılması, Ö2/Ö4/Ö5.
|
||||
- **Kabul:** Katalogda + → toast → "Sıralamamı gir" → 3 adım → kullanıcı `/sonuc?hazir=1`'e (girişsiz) veya `/sonuc?sihirbaz=1`'e (girişli) **çıkar**; "Tercihlerin kaydedildi." toast'ı bu yolda görünmez; `/meraklisina` şeması etkilenmez (adım sayısı/sırası/havuz kuralları değişmiyor) ve bu rapora yazılır.
|
||||
|
||||
### P4 · `funnel/listem-girisi` — S
|
||||
- **Amaç:** Giriş yapan kullanıcının listeye dönecek kalıcı bir yolu olsun.
|
||||
- **Kapsam:** (a) `user-nav.tsx` girişli dalına `/listem` girişi (raporu varsa "Listem", yoksa "Listeni kur"); stil `ListemButonu`/kredi pill'iyle **birebir aynı** class setinden alınır, yeni pill tasarlanmaz (AGENTS.md). (b) `user-nav.tsx:39` "Giriş yap" linki `callback=/listem`. (c) `listem-bos-cta.tsx:30` profil yokken `"/"` yerine aynı sayfada profil kapısını açar. Kapsam dışı: `SectionEyebrow`/rozet değişikliği, mobil navbar yeniden düzeni, `ListemButonu`'nun boşken gizlenmesi kuralı.
|
||||
- **Kabul:** Girişli kullanıcı her sayfadan tek tıkla `/listem`'e gidebilir; girişsiz görünüm değişmez; navbar mobilde (375 px) satır sarmaz; boş `/listem` CTA'sı kullanıcıyı ana sayfaya atmaz.
|
||||
|
||||
### P5 · `icerik/tadimlik-vaat` — S
|
||||
- **Amaç:** Tek bir ekranın hem yanlış vaat vermesini hem yanlış yere göndermesini kesmek.
|
||||
- **Kapsam:** `tadimlik-satiri.tsx:111` → callback `LISTEM_URET_HREF` (`/listem?uret=1`); `:186` metninden "24 satırın tamamı" iddiası **çıkar** (maske 3 satır açıyor, `rapor-maske.ts:12`). Yeni cümle **ayrı `[Bilal]` commit'i**; ana commit yalnız yanlış iddiayı kaldırır ve hedefi düzeltir. Kapsam dışı: maskenin kaç satır açtığı (gelir kararı), tadımlığın başka yüzeylere taşınması.
|
||||
- **Kabul:** Girişten dönüşte üretim **başlar** (kullanıcı ek tık yapmaz); ekranda teslim edilmeyen bir sayı vaat edilmez; `giris_cta_tiklandi` davranışı korunur.
|
||||
|
||||
### Onaylanan rehber yazıları
|
||||
**Yok.** Bu tur içerik değil kusur turu; Bilal'in inceleme kuyruğu 5 kod paketiyle dolu. Backlog #2 (KYK burs mu kredi mi, 6 Ekim tarih kilidi) ve #3 kendi sırasında kalır.
|
||||
|
||||
---
|
||||
|
||||
## 4. Bilal'e bırakılan kararlar
|
||||
|
||||
| Karar | Tavsiyem | Geri dönüş maliyeti |
|
||||
|---|---|---|
|
||||
| **Bandın sezon-dışı metni** — "Tercih dönemi sona erdi" yerine ne yazsın? | "2027 tercihine hazırlık · 2026 yerleştirme verisi yüklü" yönünde bir çerçeve. Geri sayım bileşeni kalsın, hedef 2027 takvimi açıklanınca tanımlanır. Bant her sayfada; bugün ürünün işe yaramadığını söylüyor | Düşük — metin + 2 sabit, 1 commit revert |
|
||||
| **Tadımlık CTA'sının yeni cümlesi** — teslim edilenle uyumlu tek cümle | "Listenin ilk 3 satırı ücretsiz açılır" dürüst çerçevesi; "24 satırın tamamı" iddiası hiçbir hâlde kalmasın | Sıfır — metin |
|
||||
| **Deneme maskesi 3 → kaç satır?** (`rapor-maske.ts:12`) | Bu hafta **değiştirme**. Gelir modeli kararı, ve hangi sayının doğru olduğunu söyleyecek veri yok (ödeme başlatan 30g'de 0). Sezon öncesi, ödeme hunisi çalıştığı doğrulandıktan sonra | Orta — fiyat/değer algısını değiştirir, geri alması müşteride kötü görünür |
|
||||
| **CTA'da "Yapay Zeka" ibaresi kalsın mı?** (marka C) | Kalsın. 11 görünür yer + 84 kod içi geçiş ve tek sözlük sabiti yok; bugün ödeyeceğimiz bedel, alacağımız belirsiz faydadan büyük | Orta-yüksek — ~30 dosya |
|
||||
| **Footer'daki "YKS Tercih Robotu 2026"** | Bu tur dokunma. SEO değeri ölçülmedi; kategori çelişkisi gerçek ama acil değil | Düşük ama SEO etkisi bilinmiyor |
|
||||
| **Kurucu kimliği / "üniversitelerden para almıyoruz"** (marka F) | 21 Eyl'de `/hakkinda` zaten ertelendi; yeni kanıt yok, açmıyorum | Geri dönüşü zor (kimlik açma) |
|
||||
|
||||
---
|
||||
|
||||
## 5. Reddedilenler / ertelenenler — "şimdi değil, gerekçe"
|
||||
|
||||
| Öneri | Sahibi | Hüküm |
|
||||
|---|---|---|
|
||||
| `/sonuc`'ta LLM'siz 24 satırlık iskelet önizlemesi | Yapay zekâ §3 | **Ertelendi (sonraki tur, CTO şartnamesiyle).** En iyi fikir ama tek gerçek yeniden tasarım; sezon dışı hacimde etkisi okunamaz. Ucuzladı: `mockRapor` (`rapor.ts:178-215`) hazır |
|
||||
| Aynı iskeletin katalog sayfalarına taşınması | Yapay zekâ §3 | **Reddedildi (bu tur).** Üst huniye yatırım; alt huni %86 sızdırırken sıra yanlış |
|
||||
| `/sonuc` sıralamasının tersine çevrilmesi + boş haritanın gizlenmesi | Tasarımcı Ö4 | **Ertelendi.** M boy, CLS ve SSR etkisi var; P1–P5'ten sonra tek başına ele alınır |
|
||||
| Mobil katalog satırının yeniden düzeni | Tasarımcı Ö2 | **Ertelendi.** M boy; ayrıca 992a01a'nın canlıda olup olmadığı bilinmiyor — önce o doğrulanmalı |
|
||||
| `/sonuc` mobil sabit alt çubuk | Tasarımcı Ö5 | **Ertelendi.** Backlog #4'te duruyor; P3 + ölü ucunu bağladıktan sonra `/sonuc`'a gelen hacim değişecek, ondan sonra bakılır |
|
||||
| Hero alt başlığı, katalog CTA açıklaması, `/giris` metinleri | Marka H2/H3/H5 | **Ertelendi.** Hepsi makul, ama bu tur 5 iş sınırı dolu; sırada ilk bunlar |
|
||||
| `/sonuc`'a `<h1>` | Marka K | **Ertelendi — sonraki turun ilk işi.** Doğrulandı: bugün sayfada `<h1>` yok. Ucuz, a11y + SEO |
|
||||
| `sihirbaz_acildi/kapatildi`, `sevk_tiklandi{yuzey}`, `rapor_yazdirildi` | Analitik #3/#5/#7 | **Ertelendi.** 11 kör nokta gerçek, ama bu hafta tek olay eklenir; ölçüm borcunu tek turda kapatmak inceleme kuyruğunu şişirir |
|
||||
| Arama funnel kartının koyu lacivert/cyan yüzeyi | Tasarımcı §7 | **Ertelendi.** Marka kararı, dönüşümle ilgisi yok |
|
||||
| CTA ikon/ok tutarsızlıkları, 36 px dokunma hedefleri, `secimlerim-paneli.tsx` ölü kodu | Tasarımcı §7 | **Ertelendi.** Tek "tutarlılık temizliği" paketi olarak sonraki tura; tek tek inceleme harcamayalım |
|
||||
| `esles` alanı, çıktı dil denetimi, `gevsetildi`'nin UI'a çıkması, eval seti | Yapay zekâ İ1/İ2/§Eval | **Ertelendi.** Bu turda model/prompt/şema değişikliği onaylanmadı; eval işi onlarla birlikte gelir |
|
||||
| Aşama mesajı + "uzun sürdü" eşiği 90→55 sn | Yapay zekâ #5 | **Ertelendi.** Haklı bir gözlem; ama çalışma ağacındaki `SUNUCUYA_ULASILAMIYOR` işi canlıya çıkmadan aynı dosyaya ikinci el değmesin |
|
||||
| A/B testi, trafik artırma, yeni SEO yazısı | — | **Reddedildi.** Sezon dışı; her kol 47 ziyaret/haftaya düşer (01 §5.2-5.3) |
|
||||
|
||||
---
|
||||
|
||||
## 6. Diğer ajanlara açık sorular (sonraki tur)
|
||||
|
||||
- **CTO:** `/sonuc` iskelet önizlemesi için şartname — `mockRapor`'un seçim mantığını (`rapor.ts:178-215`) prod yoluna açmanın en küçük yolu nedir; 1–3. satırın gerekçesi tadımlık havuzundan gelirken 4–24 bulanık kalacaksa maske mantığıyla (`rapor-maske.ts`) çakışır mı? Ayrıca P2–P4'ün tek yayına nasıl paketleneceği.
|
||||
- **Analitik:** Rybbit bağlandığında ilk üç sorgu sabit: (a) 21 Eyl sonrası `tadimlik_goruntulendi` ve `liste_uretim_hata` **adedi**, (b) girişli olup `/listem` görmeyen oturumların dizisi, (c) `/listem?uret=1` pageview adedi. Ek soru: P1–P5 yayınından sonra hangi **adetleri** haftalık sabit ritüelde okuyacağız — tek sayfalık bir "haftalık adet kartı" tanımla.
|
||||
- **Yapay zekâ mühendisi:** `credit_ledger` sorgularının sonucu geldiğinde — `deneme − basarisiz_iade` ile Rybbit'teki `liste_olusturuldu`=3 arasındaki fark kaç, ve `reports` tablosunda kurtarma dalına düşmüş kaç liste var? Bu iki sayı "3 listenin yanında ne oldu" sorusunu Rybbit olmadan kapatır.
|
||||
- **Tasarımcı:** P4'ün navbar girişi 375 px'te mevcut üç elemanla (kredi pill'i, `ListemButonu`, çıkış) aynı satıra sığıyor mu; sığmıyorsa hangisi gizlenir? Ayrıca `ListemButonu`'nun boşken tamamen kaybolması (`listem-butonu.tsx:24`) P4'ten sonra hâlâ doğru mu?
|
||||
- **Marka:** Bandın sezon-dışı metni Bilal'den geldiğinde, 4 sezon durumu (hazırlık / sonuç bekleme / tercih / ek yerleştirme) için tek bir metin şeması yaz — her sezonda elle metin değiştirmeyelim.
|
||||
- **QA:** P3 ve P4 dallarında tek senaryo: katalogda + → toast → sihirbaz → nereye çıkıyor; girişten dönüşte `/listem?uret=1` üretimi gerçekten başlıyor mu.
|
||||
- **Ürün yöneticisi:** P1–P5 backlog'a "onaylı" olarak işlenir; ertelenenler tablosu (§5) backlog'a "aday" olarak geçer, `mockRapor` notu #önizleme işine iliştirilir.
|
||||
|
||||
---
|
||||
|
||||
## Bilal'den istenen (3 madde)
|
||||
|
||||
1. **Çalışma ağacındaki `liste-uretici.tsx` + `src/app/api/saglik/` işini bitir ve yayınla** — bugün bu düzeltme olmadan bir kullanıcı kredisini harcayıp ekranda `.txt` bulabiliyor; P1–P5'in hepsinden önce gelir. Aynı cevapta: 21 Eyl 23:34 commit'leri (`992a01a`, `ea3310a`) canlıda mı? — **~15 dk**
|
||||
2. **Prod'da iki salt-okuma SQL'ini koş** (`04-uretim-engelleri.md` §5): `credit_ledger`'da 30 günlük `report_generate` / `refund` kırılımı ve `reports`'ta kurtarma dalı sayısı. "3 listenin yanında kaç başarısız deneme var" sorusunu Rybbit olmadan yanıtlayan tek yol bu — **~5 dk**
|
||||
3. **İki metin kararı ver:** (a) üst bandın sezon-dışı hâli ne yazsın, (b) tadımlık CTA'sı "24 satırın tamamı" yerine ne desin. İkisi de her ziyaretçiyi gören cümleler; kalanı ajan yetkisinde — **~10 dk**
|
||||
|
||||
*(Listeden düşürdüklerim: Rybbit MCP bağlama — haftada ~0,5 listede bu hafta yeni bilgi vermez, madde 2 daha çok söyler; mobil ekran görüntüleri — + ölü ucu koddan kesin doğrulandı, fotoğraf gerekmiyor; tadımlık havuzu kapsam denetimi — marka ajanı salt okuma ile kendi koşabilir, onayı verildi; terim/footer/kurucu kararları — ertelendi.)*
|
||||
88
docs/ekip-raporlari/2026-09-22/06-cto-sartnamesi.md
Normal file
88
docs/ekip-raporlari/2026-09-22/06-cto-sartnamesi.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# 06 — CTO şartnamesi: P0-ek + P1–P4
|
||||
|
||||
Hazırlayan: CTO ajanı · 22 Eyl 2026 · Taban commit: `main @ bda4d07`
|
||||
Kaynak kararlar: `05-ceo-karari.md`, `docs/ekip/KARARLAR.md` (22 Eyl iki kayıt)
|
||||
Doğrulama koşusu (CTO): `next typegen` → `tsc --noEmit` → `pnpm lint`, baseline **yeşil** (Bilal'in kirli ağacı dâhil).
|
||||
|
||||
## Özet
|
||||
|
||||
1. `.txt` açığı gerçekten duruyordu: birincil yol (`uret()` içindeki `router.replace`) ölü sunucuda Next'in kendi kodunda tam-sayfa gezinmeye düşüyor. **P0-ek olarak 22 Eyl'de orkestratör tarafından uygulandı** (aşağıda).
|
||||
2. `liste-uretici.tsx` çakışması (a) ile çözüldü: P2 o dosyaya hiç dokunmuyor, olay `listem-icerik.tsx`'e monte edilen yeni bir istemci bileşeninden atılıyor. Bedeli: `yeniden_deneme` bu turda ölçülmüyor.
|
||||
3. `src/lib/analitik.ts` yalnız P2'nin. P3/P4 yeni olay adı eklemiyor → dört paketin dosya kümesi kesişimi **sıfır**, dördü paralel.
|
||||
4. İki itiraz: (İ1) P3'te Ö1'in ikinci yarısı yapılmamalı — ölü kod olur ve `hedef` sözleşmesini bozar. (İ4) P4'te giriş callback'i `/listem` olmamalı — bağlam kaybı, ve `?uret=1` taşırsa rızasız 3 kredi yakar; callback **bulunulan sayfa** olmalı.
|
||||
5. `/meraklisina` şeması etkilenmiyor (doğrulandı): `SEMA` adım/havuz/iskelet/gevşetme kurallarını belgeliyor, P3 yalnız kapı kapandıktan sonraki gezinme hedefini değiştiriyor.
|
||||
|
||||
## P0-ek — birincil yol koruması (UYGULANDI, 22 Eyl)
|
||||
|
||||
**Bulgu (Next 16.2.10 kaynağından doğrulandı):**
|
||||
- `fetch-server-response.js` — cevap flight değilse ya da `!res.ok` ise `doMpaNavigation(url)` → string döner (bağlantı hiç kurulamazsa catch dalı da aynısını yapar ve konsola `Failed to fetch RSC payload for … Falling back to browser navigation.` basar).
|
||||
- `segment-cache/navigation.js` — `typeof result === "string"` → `completeHardNavigation` → `pushRef.mpaNavigation = true`.
|
||||
- `app-router.js` — `mpaNavigation` dalında `location.replace(canonicalUrl)`.
|
||||
|
||||
Yani `router.replace` ölü sunucuda tam olarak kaçınılmak istenen tam-sayfa gezinmeyi yapıyordu; ters vekilin düz metin 502 gövdesi tarayıcıya iniyor, WebKit `listem.txt` olarak indiriyordu. Üstelik iki yol birbirini eziyordu: RSC fetch'i 6 sn'den uzun asılırsa önce supap `SunucuYokEkrani`'nı basıyor, sonra MPA dalı o ekranı üstünden siliyordu.
|
||||
|
||||
**Uygulanan düzeltme** (`src/features/rapor/components/liste-uretici.tsx`):
|
||||
- `sunucuAyaktaMi()` yoklaması `setDurum({ad:"geciliyor"})` ve `router.replace` **öncesine** taşındı; sunucu ölüyse `liste_uretim_hata {kod:"SUNUCUYA_ULASILAMIYOR"}` atılıp `sunucu-yok` ekranı basılıyor, gezinme hiç başlamıyor.
|
||||
- Yoklama bilerek `"geciliyor"`dan önce: o durum 6 sn'lik supap zamanlayıcısını kuruyor; sonrasına konsa iki yol yarışıp aynı ekranı iki kez yazardı.
|
||||
- `sunucuAyaktaMi` zamanaşımı sertleştirildi: `AbortSignal.timeout` yoksa (eski Safari) `Promise.race` ile 5 sn'lik yedek zamanaşımı; kaybeden fetch'in sonradan reddetmesi `.catch` ile yutuluyor (sahipsiz reddetme olmasın). Yoklama artık mutlu yolda koştuğu için asılması her başarılı üretimi kilitlerdi.
|
||||
- Emniyet supabındaki mevcut yoklama **kaldı** (ikinci kalkan).
|
||||
|
||||
**Dürüst sınır:** ön-yoklama pencereyi saniyelerden milisaniyelere indirir, **kapatmaz** — konteyner yoklamadan sonra, `/listem` render'ı sırasında ölürse yine 502 gelir. Kalıcı çözüm `Dockerfile`'daki heap tavanıdır (`NODE_OPTIONS=--max-old-space-size=768`); bu ek, "kredisi yanan kullanıcı ekranda `.txt` bulmasın" garantisidir.
|
||||
|
||||
**Durum:** Bilal'in commit'lenmemiş işinin üstüne, çalışma ağacında uygulandı. `typegen + tsc + lint` temiz. Bilal'in kendi commit'iyle birlikte `main`'e girer.
|
||||
**Denetim:** `guvenlik-uyum` — "listen kaydedildi, kredin yanmaz" iddiasının doğruluğu.
|
||||
|
||||
## Dosya sahipliği (kesişim: sıfır)
|
||||
|
||||
| Paket | Dal | Dosyalar (**Y** = yeni) |
|
||||
|---|---|---|
|
||||
| P1 | `icerik/sezon-celiskisi` | `src/lib/sezon.ts` **Y** · `src/components/site-top-banner.tsx` · `src/features/pazarlama/components/hero-focus-button.tsx` |
|
||||
| P2 | `olcum/liste-uretim-basladi` | `src/lib/analitik.ts` · `src/features/rapor/components/uretim-basladi-olayi.tsx` **Y** · `src/features/rapor/components/listem-icerik.tsx` · `src/app/listem/page.tsx` · `src/features/sihirbaz/components/sihirbaz-cagri-karti.tsx` · `src/features/odeme/components/paket-satinal.tsx` |
|
||||
| P3 | `funnel/arti-olu-ucu` | `src/features/liste/components/program-ekle-butonu.tsx` · `src/features/liste/components/liste-cekmecesi.tsx` |
|
||||
| P4 | `funnel/listem-girisi` | `src/features/kullanici/components/user-nav.tsx` · `src/features/kullanici/components/giris-linki.tsx` **Y** · `src/features/rapor/components/listem-bos-cta.tsx` |
|
||||
|
||||
**Hiçbir paketin dokunmayacağı (Bilal'in kirli ağacı — PROTOKOL kural 3):**
|
||||
`Dockerfile`, `src/app/globals.css`, `src/app/layout.tsx`, `src/features/rapor/components/liste-uretici.tsx`, `src/app/api/saglik/`, `docs/`, `content/rehber/*.md`.
|
||||
`git add -A` / `git add .` **yasak** — yalnız kendi paketinin yollarını tek tek ekle.
|
||||
|
||||
## Ortak kurallar
|
||||
|
||||
1. Yalnız verilen worktree + dalda **lokal** commit. Push/merge/deploy yok, `main`'e commit yok.
|
||||
2. Commit öncesi `git status --porcelain` ile Bilal'in kirli dosyalarının stage'e sızmadığını doğrula.
|
||||
3. Doğrulama: `pnpm exec next typegen && pnpm exec tsc --noEmit && pnpm lint`. (Depoda `typecheck` script'i yok; `pnpm lint` = `eslint`.)
|
||||
4. **typegen'i atlama** — `PageProps` global tipi `.next/types`'tan gelir, taze worktree'de `tsc` onsuz baseline'da bile kırıktır.
|
||||
5. `pnpm build`'i **yalnız P2** koşar (paralel build'ler belleği tüketir).
|
||||
6. Worktree'de `node_modules` **symlink'i Turbopack'te patlar** — klon kullan: `cp -Rc <repo>/node_modules <worktree>/node_modules`.
|
||||
7. Next bu sürümde farklı (16.2.10) — API'ye dokunmadan önce `node_modules/next/dist/docs/` altındaki ilgili sayfayı oku. Bu depoda `cacheComponents: true` (`next.config.ts:28`).
|
||||
8. AGENTS.md bağlayıcı: rozet gerekirse `SectionEyebrow`; CTA'da `Sparkles` yok, metin **sonunda** `<ArrowRight className="size-4" aria-hidden />`; yeni modalda `DialogContent` varsayılan kapatma çarpısı.
|
||||
9. Bu turda hiçbir paket `huni-semasi.tsx` / `meraklisina-icerik.tsx`'e dokunmaz.
|
||||
10. Dev sunucusu yok, tarayıcı yok — UI'ı Bilal kontrol ediyor.
|
||||
11. Uydurma veri yok: ÖSYM 2027 takvimi açıklanmadığı için P1'de tarih **uydurulmaz**, `null` bırakılır.
|
||||
|
||||
## Merge sırası ve denetim
|
||||
|
||||
Dördü paralel geliştirilir. Merge sırası **P2 → P3 → P4 → P1** (CEO'nun "payda önce" kuralı).
|
||||
`guvenlik-uyum` denetimi merge koşulu: **P3** (kapı → `/sonuc?sihirbaz=1` → otomatik 3 kredi harcama yolu), **P4** (giriş callback'i / açık yönlendirme yüzeyi), **P0-ek**.
|
||||
`tasarimci`: P4 navbar'ın 375 px davranışı ve "Yapay Zeka Listem" ↔ "Kendi Listem" ayrımı.
|
||||
`qa-muhendisi`: P3/P4 dallarında + → toast → sihirbaz → nereye çıkıyor; boş `/listem` CTA'sı kapıyı açıyor mu.
|
||||
|
||||
## İtirazlar
|
||||
|
||||
| # | İtiraz | Düzeltilmiş kapsam |
|
||||
|---|---|---|
|
||||
| İ1 | P3'te `use-tercih-profili.ts:346` `null` dalının değiştirilmesi ölü kod olur ve `hedef` sözleşmesini bozar | Yalnız iki çağrı yeri değişir; `use-tercih-profili.ts` kapsam dışı |
|
||||
| İ2 | P3 girişli kullanıcıda ek tık olmadan 3 kredi harcatıyor | Kapsam aynı, `guvenlik-uyum` denetimi merge koşulu |
|
||||
| İ3 | P3, + toast'ının vaat ettiği risk rozetini göstermeden kullanıcıyı taşıyor | Bu tur uygulanmıyor; backlog |
|
||||
| İ4 | P4'te `callback=/listem` bağlam kaybı + `?uret=1` ile rızasız kredi | Callback = **bulunulan sayfa**; yeni `giris-linki.tsx` |
|
||||
| İ5 | P2'de `girisli` özelliği sabit (`/listem` auth kapılı) | `girisli` yerine `paketli` + `profil` |
|
||||
| İ6 | P2'de `yeniden_deneme` kirli dosya olmadan ölçülemez | Bu turda çıkarıldı; `liste-uretici.tsx` açıldığında eklenir |
|
||||
|
||||
## Backlog önerileri
|
||||
|
||||
1. + kapısının ödülü yerinde teslim edilsin (İ3) — M, tasarımcı girdisi gerekir.
|
||||
2. `liste_uretim_basladi`'nın gerçek çağrı yerine taşınması + `yeniden_deneme`.
|
||||
3. `ListemButonu` boşken gizlenmesi kuralı yeniden değerlendirilsin (`listem-butonu.tsx:24`).
|
||||
4. En küçük duman testi altyapısı (`vitest`): `sonucHref`, `sihirbazDogrula`, `sezonAsamasi`, `raporMaskele`, `siraKovasi`.
|
||||
5. Kalan CTA ok/ikon tutarsızlıkları — tek temizlik paketi.
|
||||
6. `secimlerim-paneli.tsx` ölü kod (grep ile doğrulanıp silinmeli).
|
||||
7. Footer "YKS Tercih Robotu 2026" — vizyonla çelişiyor, yıl sabiti elle gömülü.
|
||||
73
docs/ekip-raporlari/2026-09-22/07-guvenlik-denetimi.md
Normal file
73
docs/ekip-raporlari/2026-09-22/07-guvenlik-denetimi.md
Normal file
@@ -0,0 +1,73 @@
|
||||
# 07 — Güvenlik ve uyum denetimi: üç merge adayı dal + çalışma ağacı
|
||||
|
||||
Denetleyen: `guvenlik-uyum` · 22 Eyl 2026 · `main` = `e21cda4`
|
||||
Kapsam: `funnel/arti-olu-ucu` (22c139a), `funnel/listem-girisi` (cb22faf, 7dc47ee, 419b617), `olcum/liste-uretim-basladi` (f60fbd1, e6fbc62) ve commit'lenmemiş `src/features/rapor/components/liste-uretici.tsx`.
|
||||
Kod değiştirilmedi, commit atılmadı, canlıya dokunulmadı.
|
||||
|
||||
## Özet (5 madde)
|
||||
|
||||
1. **Kritik bulgu yok.** Üç dalın hiçbiri yetkilendirme, ödeme bütünlüğü ya da açık yönlendirme açığı açmıyor. Üçü de — aşağıdaki düzeltmelerle — merge edilebilir.
|
||||
2. **P4 açık yönlendirme iddiası doğrulandı: açık yok.** `giris-karti.tsx:18-19` kalkanı `//evil.com`, `/\evil.com`, mutlak URL ve `javascript:`'i düşürüyor; better-auth 1.6.23 ayrıca hem POST hem magic-link GET yolunda kendi göreli-yol kalkanını koşuyor. **Ama** aynı kalkan `/rehber/ösym` gibi ASCII dışı ya da yüzde-kodlu her yolu better-auth'a 403 olarak gönderiyor → `GirisLinki` bu yolda girişi tamamen kırıyor (yeni regresyon, orta).
|
||||
3. **P3 rıza iddiası doğrulandı ama yarım.** Ödeme anındaki buton gerçekten "Yapay Zeka listemi kur (3 kredi)" diyor (`tercih-profili-kapisi.tsx:462`) ve `raporVar`/`bekleyen.eslesir` korumaları tutuyor; çift üretim yolu açılmıyor. Kırık olan **girişteki vaat**: + toast'ı ve çekmece paneli hâlâ yalnız "sıralamanı gir → riskini gösterelim" diyor, oysa akış artık 3 kredilik bir satın almayla bitiyor (orta).
|
||||
4. **P2'de allowlist iki yerde delik.** (a) `kaynak` ham hâliyle URL'de kaldığı için Rybbit'in `trackUrlParams` açık pageview'ına allowlist'ten bağımsız giriyor (`/listem` maskesiz); (b) otomatik üretim yolu **her zaman** `giris_donusu` etiketi atıyor, oysa o yol tam olarak giriş dönüşü *olmayan* yol — hero/arama/+/ödeme-sonrası hepsi bu tek yanlış etikete düşüyor, yani P2'nin ölçmek istediği şey ölçülmüyor (orta, ölçüm doğruluğu).
|
||||
5. **Çalışma ağacındaki "kredin yeniden harcanmaz" iddiası DOĞRU.** `SunucuYokEkrani` yalnızca `listeOlustur` `ok:true` döndükten sonra görünür; o noktada `reports` satırı yazılmış ve kredi `spendCredits` ile bir kez düşmüştür, "Listemi aç" `?uret=1` taşımadığı için ikinci üretim başlatmaz. `/api/saglik` sabit gövdeli, DB'ye/oturuma dokunmuyor — bilgi sızdırmıyor, rate limit gerektirmiyor (zaten `main`'de, d41120c).
|
||||
|
||||
---
|
||||
|
||||
## Bulgu tablosu
|
||||
|
||||
| # | Dosya:satır | Sorun | Somut istismar / ihlal senaryosu | Önem | Düzeltme | Kesinlik |
|
||||
|---|---|---|---|---|---|---|
|
||||
| G1 | `src/features/kullanici/components/giris-linki.tsx:25-30` (+ `giris-karti.tsx:18-19`) | Callback'e konan `usePathname()` değeri ASCII dışı ya da `%` içerebiliyor; better-auth'un göreli-yol regex'i `[\w\-.+/@]` dışına çıkan her şeyi 403 `INVALID_CALLBACK_URL` ile reddediyor. Site içi kalkan geçiyor, auth katmanı geçmiyor. | Ziyaretçi `/{herhangi}/ösym-nedir` ya da `/bolum/t%C4%B1p` gibi bir adrese geliyor (yanlış/dış link, soft-404 sayfası da navbar'ı render ediyor — bkz. BACKLOG #5). Navbar'daki "Giriş yap" `/giris?callback=%2Fbolum%2Ft%25C4%25B1p` üretiyor; kullanıcı e-posta ya da Google'a basıyor, better-auth 403 dönüyor, `giris-form.tsx:99-103` "Bağlantı gönderilemedi" diyor. Kullanıcı o sayfadan **hiç giriş yapamıyor**, tekrar denemek de çözmüyor. `main`'de callback hep `/` olduğu için bu yol yoktu. | **orta** | `giris-linki.tsx`'te href kurmadan önce yolu süz: `/^\/[\w\-./+@]*$/.test(pathname)` değilse sade `/giris`. (Alternatif: `giris-karti.tsx` kalkanını aynı beyaz listeye daraltmak — iki yer yerine tek yer.) | DOĞRULANDI (better-auth 1.6.23 `auth/trusted-origins.mjs` regex'i lokalde payload setiyle koşturuldu; `/rehber/ösym`, `/rehber/%C3%B6sym` → `false`) |
|
||||
| G2 | `src/features/liste/components/program-ekle-butonu.tsx:73,77,84` · `liste-cekmecesi.tsx:279,283,296` | Kapının **girişindeki** vaat ile **çıkışındaki** bedel uyuşmuyor. Toast: "Sıralamanı girersen bu programın risk seviyesini de gösteririz" + buton "Sıralamamı gir". Çekmece: "Sıralamanı girince her seçimin riskini gösteririz" + "Sıralamamı gir". Dal bu iki kapıyı `hedef="sihirbaz"`e çevirdiği için akışın sonu artık ücretsiz risk rozeti değil, 3 kredilik LLM üretimi. | 17 yaşındaki kullanıcı katalogda + ile program ekliyor, "Sıralamamı gir"e basıyor (beklenti: rozet). Sıra + 3 sihirbaz adımını dolduruyor, son butonda "(3 kredi)" ilk kez görünüyor; basınca `/sonuc?sihirbaz=1` → otomatik `/listem?uret=1` → 5 deneme kredisinin 3'ü yanıyor, kullanıcı baktığı katalog sayfasından koparılıyor. "Vazgeç" derse profil hiç kaydedilmediği için **istediği risk rozetini de alamıyor**. | **orta** | İki seçenek: (a) toast/çekmece metnini akışın gerçek sonucuna eşitle ("…sıralamanı girip birkaç seçim yaparsan 24'lük listeni de 3 krediyle kurarız") — metin `[BİLAL]`; ya da (b) bu iki yüzeyi `hedef=null` bırakıp AI'yı ayrı, adı konmuş bir CTA'ya taşı. Kod tarafı `[KARAR]`, cümle `[BİLAL]`. | DOĞRULANDI (koddan; buton etiketi zinciri `tercih-profili-kapisi.tsx:456-466` ile eşleştirildi) |
|
||||
| G3 | `src/features/sihirbaz/components/sihirbaz-cagri-karti.tsx:225` (olcum dalı) | Otomatik üretim `kaynak="giris_donusu"` atıyor. Oysa `?sihirbaz=1` üreten **hiçbir** yer giriş dönüşü değil: `hero-form.tsx:104`, `cta-sira-form.tsx:172`, `use-tercih-profili.ts:331` (+ kapısı ve boş durum), `rapor-yok-cta.tsx:24`, `arama-funnel-karti.tsx:94`. Gerçek giriş dönüşü `/giris?callback=/listem?uret=1&kaynak=hazir_cta\|sihirbaz` ile **doğrudan** `/listem`'e iner, `/sonuc`'a uğramaz. | Saldırı değil, ölçüm ihlali: P2'nin tek amacı "üretimi hangi yüzey başlattı" sorusu. Merge edilirse hero (ana huni), katalog araması, + kapısı ve ödeme-sonrası CTA'sının hepsi tek bir `giris_donusu` kovasında toplanıyor; `sihirbaz` ve `hazir_cta` değerleri ise yalnız giriş dönüşünde düşüyor. Etiketler fiilen ters. | **orta** | `?sihirbaz=1`'i üreten taraf kaynağını URL'de taşısın (`sonucHref({sihirbaz:"1", kaynak:"hero"\|"arama"\|"arti"\|"bos_durum"\|"odeme_sonrasi"})`), `otomatikGonder` onu geçirsin; `IZINLI_KAYNAKLAR`'a `hero`, `arama`, `arti` eklensin. `giris_donusu` yalnız `/giris` callback'inden gelen yolda kalsın. | DOĞRULANDI (koddan; `?sihirbaz=1` üreticilerinin tamamı grep'lendi) |
|
||||
| G4 | `src/features/rapor/components/uretim-basladi-olayi.tsx:25-32,54` · `src/app/layout.tsx:118` | Allowlist yalnız **özel olay özelliğini** koruyor. `kaynak` ham hâliyle adres çubuğunda kalıyor ve Rybbit `trackUrlParams: true` ile çalışıyor (`docs/gece-vardiyasi/2026-09-21/01-analitik-bulgular.md:181`); `data-mask-patterns` yalnız `/sonuc` ve `/odeme/sonuc`'u kapsıyor, `/listem` kapsam dışı. | Ücretsiz hesap açan biri `/listem?uret=1&kaynak=<istediği 200 karakter>` ile geziniyor. `liste_uretim_basladi.kaynak` doğru şekilde `bilinmiyor`a düşüyor **ama** aynı isteğin pageview'ı querystring'i olduğu gibi Rybbit'e yazıyor: panelde keyfi metin + `/listem` için kardinalite şişmesi. Giriş round-trip'i üzerinden de taşınabiliyor (`listem-icerik.tsx:51-53` → better-auth query karakter seti `%` ve `&`'a izin veriyor, yani `%3Cscript%3E` geçiyor; `<`/`>` ham hâli 403'e takılıyor). | **düşük** | `/listem`'i `data-mask-patterns`'a ekle **ya da** `listem/page.tsx`'te `kaynak`ı `ListemIcerik`'e vermeden önce allowlist'ten geçir (tek doğrulama noktası, hem URL hem olay için). İkincisi G3 düzeltmesiyle aynı yere düşüyor. | OLASI (`trackUrlParams: true` ekip raporundan alındı; canlı Rybbit'e sorgu atılmadı) |
|
||||
| G5 | `src/features/rapor/rapor-actions.ts:118-124` + `liste-uretici.tsx:104,120-126` | Eşzamanlı ikinci üretim kilidi yok: iki paralel `ListeUretici` mount'u iki ayrı `requestId` üretir, `spendCredits` ikisini de geçirir → 6 kredi, 2 LLM çağrısı, tek rapor. | Üretim sürerken (20–60 sn) kullanıcı geri→ileri basıyor ya da `/listem?uret=1`'i ikinci sekmede açıyor: `raporVar` hâlâ `false` olduğu için `listem-icerik.tsx:73` ikinci kez `ListeUretici` render ediyor. **Not:** bu `main`'de de var; `funnel/arti-olu-ucu` yalnızca bu URL'e varan yolu bir tık kısaltarak maruziyeti artırıyor. | **yüksek** (mevcut, dalların doğurduğu değil) | BACKLOG #1 ("dalda") ile aynı iş: `SURUYOR` kodu + kullanıcı başına üretim kilidi. P3/P4'ün merge'i bunu beklemek zorunda değil, ama **aynı yayında** çıkmalı. | DOĞRULANDI (koddan; BACKLOG #1 ile örtüşüyor) |
|
||||
| G6 | `src/features/rapor/components/listem-bos-cta.tsx:35-36` (listem-girisi) · `src/features/odeme/components/paket-satinal.tsx:157` (olcum) · `rapor-yok-cta.tsx:24-27` · `sihirbaz-cagri-karti.tsx:199-201,333` | Bedeli **hiç** yazmayan tek tık → 3 kredi yolları. "Yapay Zeka listeni kur", "listeni oluştur", "24'lük listeni oluştur", `/sonuc`'un büyük "Yapay Zeka listemi kur" butonu (kayıtlı eşleşen seçim varsa modal hiç açılmaz, `ilerle()` doğrudan koşar). | `rapor-yok-cta.tsx:31` ayrıca yanlış söylüyor: "sonuç sayfasındaki sihirbazla listeni kur" — oysa sihirbaz açılmıyor, `otomatikGonder` üretimi anında başlatıyor. Ödemesini yeni yapmış kullanıcı için zarar düşük (60 kredi), ama deneme kredisiyle gezen öğrenci `/listem` boş durumundan tek tıkla 3 kredisini yakıyor. | **düşük** | Bu dört yüzeyin etiketine "(3 kredi)" ekle — kanonik metin zaten `tercih-profili-kapisi.tsx:462`'de var. `rapor-yok-cta.tsx:31`'in yanlış cümlesi düzeltilsin. Metin `[BİLAL]`. | DOĞRULANDI (koddan) |
|
||||
| G7 | `src/features/rapor/components/liste-uretici.tsx:56-72,159` (çalışma ağacı) | Sağlık yoklaması artık **mutlu yolda** ve fail-closed: `fetch("/api/saglik")` herhangi bir nedenle başarısız olursa (kurumsal proxy, 5 sn'yi aşan yavaş mobil bağlantı, geçici 503) liste gerçekten hazırken kullanıcıya "sunucuya ulaşamıyoruz" ekranı gösteriliyor. | Zarar sınırlı: liste DB'de, kredi tek düşmüş, "Listemi aç" ikinci yoklamada geçince listeye götürüyor. Yani **para riski yok**, yanlış alarm riski var. `SAGLIK_YOKLAMA_MS = 5000` yavaş 3G'de gerçek bir eşik. | **düşük** | Bulunduğu hâliyle kabul edilebilir. İstenirse: yoklama bir kez başarısız olunca 1 kez daha denensin (toplam ~2 sn ek), ya da eşik 8 sn'ye çıksın. | DOĞRULANDI (koddan; ağ koşulu simüle edilmedi) |
|
||||
| G8 | `package.json` → `next@16.2.10` | `pnpm audit --prod`: 2 kritik + 12 yüksek. Ulaşılabilirlik denetlendi — **2 kritik ulaşılamıyor**: AVIF RCE için `images.remotePatterns` gerekiyor, `next.config.ts`'te tanımlı değil (optimizer yalnız yerel dosya); Windows RCE'nin karşılığı yok (Linux/Docker). Ulaşılabilir olan: "DoS in App Router using Server Actions" — bu uygulama server action ağırlıklı (`listeOlustur`, `odeme-actions`). | Kimliksiz saldırgan server action uçlarına biçimsiz yük göndererek süreci tüketebiliyor (advisory GHSA detayına bakılmalı). Dallarla ilgisi yok, mevcut durum. | **orta** | `next` 16.2.10 → **16.2.11** (yama sürümü, 9 advisory kapanıyor; 2 kritik için 16.3.3 gerekiyor ama minor atlama ayrı bir iş). | DOĞRULANDI (`pnpm audit --prod`, salt okuma) |
|
||||
|
||||
### Bulunamadı (arandı, yok)
|
||||
|
||||
- **Açık yönlendirme:** `//evil.com`, `/\evil.com`, `/%2fevil.com`, `/%5cevil.com`, `%2f%2f…`, `https://evil.com`, `javascript:` payload'larının hiçbiri `giris-karti.tsx:18-19` kalkanından geçip dış hedefe çıkmıyor; `/%2f…` kalkanı geçiyor ama tarayıcı `%2f`'i yolda çözmediği için aynı köken içinde 404 oluyor ve better-auth zaten reddediyor. `dogrula-karti.tsx:9-11`'in kalkanı zayıf (`/\evil.com`'u geçiriyor) **ama** better-auth `magic-link/verify` ucunda `originCheck` ile `(?!\/|\\|%2f|%5c)` uyguluyor → sömürülebilir değil. Yine de iki kalkanın farklı olması ileride kırılgan; birleştirilmesi önerilir (düşük, mevcut).
|
||||
- **Çift üretim / çifte kredi (dalların açtığı):** yok. Otoritatif koruma sunucuda: `listem-icerik.tsx:52,54` raporu her istekte taze okuyor, rapor varsa `ListeUretici` hiç render edilmiyor. `/sonuc`'taki `raporVar` bayatlasa bile sonucu değiştirmiyor. Geri tuşu yolu kapalı (`otomatikGonder` `router.replace` kullanıyor, `ListeUretici` başarıda `router.replace("/listem")`).
|
||||
- **Kredi iadesi gereken yeni dal:** yok. Üretim hatasında iade `rapor-actions.ts:163-170`'te duruyor; dallar bu yolu değiştirmiyor. `SunucuYokEkrani` iade gerektirmiyor (rapor yazılmış).
|
||||
- **`/api/saglik` bilgi sızıntısı:** yok. Gövde sabit `{ok:true}`, sürüm/uptime/DB durumu yok, `Cache-Control: no-store`. Kimliksiz erişim sorun değil (Docker HEALTHCHECK zaten kullanıyor); rate limit gerektirmiyor — istek başına DB/AI maliyeti sıfır.
|
||||
- **`?kaynak=` üzerinden LLM prompt enjeksiyonu / SQL:** yok. `kaynak` yalnız analitik etiketi ve URL olarak dolaşıyor; `raporUret(params)`'a giren tek şey `sihirbazDogrula`'dan geçmiş seçimler ve `siraTurGecerli`'den geçmiş sayı (`rapor-actions.ts:99-110`).
|
||||
- **Yeni yetkilendirme açığı:** yok. Üç dal da yeni route/action eklemiyor; `kullanicininRaporu(session.user.id)` ve `spendCredits({userId: user.id})` sahiplik kapsamını koruyor. Id tahminiyle başkasının raporuna erişilen yeni yüzey yok.
|
||||
- **İstemci paketine sızan sır:** yok. Dalların dokunduğu dosyalarda `process.env` okuması yok; `RYBBIT_API_KEY` yalnız `analitik-sunucu.ts`'te ve dosya `server-only`.
|
||||
|
||||
---
|
||||
|
||||
## Metin × kod uyumsuzlukları
|
||||
|
||||
1. **`gizlilik/page.tsx:97-98` — "Yalnızca oturumunu açık tutmak için zorunlu çerezler kullanılır."** Kod ayrıca `PROFIL_CEREZ_ADI` çerezini yazıyor: `max-age=31536000` (1 yıl), içeriği öğrencinin **başarı sıralaması + puan türü + ilgi alanları + iller** (`sihirbaz-profil.ts:51-57`). Reklam/izleme çerezi değil, işlevsel — ama "yalnızca oturum" ifadesi yanlış ve süresi bir yıl. KVKK aydınlatma yükümlülüğü açısından metin genişletilmeli: hangi çerez, ne tutuyor, ne kadar duruyor. **Taslak cümle önerisi ([BİLAL], avukat teyidi gerekir):** "Oturum çerezinin yanında, girdiğin başarı sıralamasını ve tercih seçimlerini cihazında saklayan işlevsel bir çerez kullanılır (1 yıl); bunu tarayıcı ayarlarından silebilirsin." — Mevcut, dalların doğurduğu değil.
|
||||
2. **`rapor-yok-cta.tsx:31` — "sonuç sayfasındaki sihirbazla listeni kur."** Kod sihirbazı açmıyor; `/sonuc?sihirbaz=1` `otomatikGonder`'i tetikleyip üretimi doğrudan başlatıyor (`sihirbaz-cagri-karti.tsx:218-228`). Yanlış vaat + bedel bildirilmeden harcama. Bkz. G6.
|
||||
3. **`program-ekle-butonu.tsx:73` / `liste-cekmecesi.tsx:283`** — bkz. G2: "riskini gösteririz" vaadi 3 kredilik üretimle bitiyor.
|
||||
4. **Uyum — 18 yaş altı:** bu üç dal yeni bir veri toplama noktası açmıyor, ama P3 ile ücretli aksiyona ulaşan tık sayısı azalıyor. Mesafeli satış/cayma hakkı metinlerinde değişiklik gerekmiyor (kredi harcaması satın alma değil, satın alınmış kredinin kullanımı) — yine de G2'nin çözümü bedel şeffaflığının tek gerçek koruması.
|
||||
|
||||
## KVKK — yeni kişisel veri akışı
|
||||
|
||||
- **Üç dalın doğurduğu yeni akış: yok.** `kaynak` kişisel veri değil; `liste_uretim_basladi` özellikleri (`kaynak`, `paketli`, `profil: var|yok`) kişisel veri taşımıyor ve `src/lib/analitik.ts:10-11` ham sıralama kuralına uyuyor — sıralama hiçbir yeni yerde gönderilmiyor. `GirisLinki` bilinçli olarak yalnız pathname taşıyor, query taşımıyor (doğru tercih).
|
||||
- **Mevcut, dikkat çekmek istediğim iki akış (dalların dışı):**
|
||||
- `liste-giris-url.ts:15-17` pathname **+ query**'yi callback'e koyuyor. Eski tip `/sonuc?sira=123456&tur=say` adresinde bu, öğrencinin **ham başarı sıralamasını** `/giris?callback=…` üzerinden better-auth'a, oradan magic-link doğrulama URL'ine ve **Resend ile gönderilen e-postanın gövdesine** taşıyor (`auth.ts:19-24` `hedef.search = kaynak.search`). Gizlilik metninin "ham sıralama analitiğe gönderilmez" sözü analitik için doğru, ama e-posta sağlayıcısı için böyle bir söz yok ve akış var. **orta**, mevcut.
|
||||
- `rybbit-identify.tsx:29-30` e-posta adresini ve adı Rybbit trait'i olarak gönderiyor. Gizlilik metni bunu **açıkça yazıyor** (`gizlilik/page.tsx:102-105`) ve Rybbit kendi sunucumuzda → uyumlu, aksiyon gerekmiyor.
|
||||
|
||||
---
|
||||
|
||||
## Dal dal merge hükmü
|
||||
|
||||
| Dal | Hüküm | Koşul |
|
||||
|---|---|---|
|
||||
| `olcum/liste-uretim-basladi` (P2) | **Şu düzeltmeden sonra merge edilebilir** | **G3 zorunlu** (`giris_donusu` etiketi yanlış — düzeltilmezse dalın tek amacı olan ölçüm yanlış veri üretir, üstelik seri kırılması yaratır). **G4 önerilir** (aynı düzeltmeyle tek noktada çözülüyor: `kaynak`ı `listem/page.tsx`'te allowlist'ten geçirip `ListemIcerik`'e temiz ver). Güvenlik açısından merge engeli yok. |
|
||||
| `funnel/arti-olu-ucu` (P3) | **Şu düzeltmeden sonra merge edilebilir** | **G2**: + toast'ı ve çekmece panelinin metni akışın gerçek sonucuna eşitlenmeli (cümle `[BİLAL]`). Kod olduğu gibi kalabilir — rıza anı (`(3 kredi)` butonu) ve `raporVar`/`eslesir` korumaları sağlam, çifte harcama yolu açmıyor. Metin düzeltilmeden merge edilirse 17–19 yaş kullanıcıya yanlış vaatle kredi harcatmış oluruz. |
|
||||
| `funnel/listem-girisi` (P4) | **Şu düzeltmeden sonra merge edilebilir** | **G1 zorunlu**: `giris-linki.tsx`'e yol beyaz listesi eklenmeli, yoksa ASCII dışı/yüzde-kodlu adreslerde giriş tamamen kırılıyor (açık yönlendirme değil ama daha kötü: kullanıcı kaybı). Navbar `/listem` linki ve boş durum CTA'sı güvenlik açısından temiz. Sıra notu: `listem-bos-cta.tsx:35` `kaynak=bos_durum` kullanıyor, bu değer `olcum` dalında tanımlı — CEO'nun "P2 önce merge edilir" kararı korunmalı (aksi hâlde zararsız ama ölçülmeyen bir parametre kalır). |
|
||||
| Çalışma ağacı — `liste-uretici.tsx` | **Merge edilebilir (düzeltme koşulu yok)** | "Listen oluşturuldu ve hesabına kaydedildi — kredin yeniden harcanmaz" iddiası doğrulandı. G7 (fail-closed yanlış alarm) isteğe bağlı iyileştirme. |
|
||||
|
||||
---
|
||||
|
||||
## Bilal'den istenen
|
||||
|
||||
1. **G2'nin cümlesi** — + toast'ı ve çekmece panelindeki "sıralamanı gir → riskini gösterelim" metni, akış 3 kredilik listeyle bittiği için değişmeli; yeni cümleyi sen yazmalısın (**~10 dk**).
|
||||
2. **`next` 16.2.10 → 16.2.11 yama yükseltmesi onayı** — 9 advisory kapanıyor, biri gerçekten ulaşılabilir (server action DoS); yama sürümü olduğu için build riski düşük (**~20 dk, build dahil**).
|
||||
3. **Gizlilik metnindeki çerez cümlesi** — "yalnızca oturum çerezi" ifadesi 1 yıllık tercih profili çerezini kapsamıyor; önerdiğim taslak cümle için avukat teyidi gerekir (**~5 dk karar, teyit ayrı**).
|
||||
47
docs/ekip-raporlari/2026-09-22/urap-izin-eposta-taslagi.md
Normal file
47
docs/ekip-raporlari/2026-09-22/urap-izin-eposta-taslagi.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# URAP izin e-postası — taslak (gönderilmedi)
|
||||
|
||||
**Kime:** info@urapcenter.org
|
||||
**Konu:** URAP Türkiye sıralaması verisinin kaynak gösterilerek yayımlanması hakkında izin talebi
|
||||
|
||||
---
|
||||
|
||||
Merhabalar,
|
||||
|
||||
Ben Bilal Gürşen. kolaytercih.com adresinde, YKS'ye giren öğrencilerin tercih listesi
|
||||
hazırlamasına yardımcı olan bir web uygulaması yürütüyorum. Site, ÖSYM ve YÖK Atlas'ın açık
|
||||
verilerine dayanarak 229 üniversite ve 21 binden fazla program için taban sıralama, kontenjan ve
|
||||
yerleşen bilgisi sunuyor.
|
||||
|
||||
Üniversite sayfalarını zenginleştirmek için, öğrencilerin "bu üniversite akademik olarak nerede
|
||||
duruyor" sorusuna Türkiye kaynaklı, yöntemi açık bir cevap vermek istiyoruz. Bu nedenle **URAP
|
||||
Türkiye Sıralaması**'nı kullanmayı planlıyoruz. Somut olarak:
|
||||
|
||||
- Her üniversite sayfasında yalnız **URAP Türkiye genel sırası, toplam puanı ve bir önceki yıla
|
||||
göre değişimi** gösterilecek (basın bülteninizdeki Tablo 10–11'deki değerler).
|
||||
- Her değerin yanında **"Kaynak: URAP Türkiye 2025-2026"** ibaresi ve urapcenter.org'a bağlantı
|
||||
yer alacak; veri dönemi tarihiyle birlikte yazılacak.
|
||||
- Alt göstergeleriniz (makale, atıf, doktora, öğretim üyesi/öğrenci oranı vb.) ayrı ayrı
|
||||
yayımlanmayacak; sıralamanın tamamı bir liste olarak kopyalanmayacak.
|
||||
- Veri yılda bir, siz yeni sıralamayı yayımladığınızda güncellenecek.
|
||||
|
||||
Site ücretli bir paket de sunduğu için ticari bir kullanım söz konusu. Sitenizde açık bir lisans
|
||||
metni göremediğim için, bu kullanımın sizce uygun olup olmadığını ve varsa uymamızı istediğiniz
|
||||
atıf biçimi / koşulları sormak istedim.
|
||||
|
||||
Uygun görmezseniz ya da farklı bir kullanım biçimi önerirseniz ona göre hareket ederiz; yanıtınızı
|
||||
beklerken veriyi yayımlamayacağız.
|
||||
|
||||
İlginiz için şimdiden teşekkür ederim.
|
||||
|
||||
Saygılarımla,
|
||||
Bilal Gürşen
|
||||
kolaytercih.com
|
||||
|
||||
---
|
||||
|
||||
## Gönderdikten sonra
|
||||
|
||||
- Yanıt gelince `docs/ekip-raporlari/2026-09-21/06-uni-veri.md` §2'deki URAP satırının lisans
|
||||
hücresi güncellensin ("[BİLAL] kısa e-posta ile izin teyidi önerilir" → gerçek durum).
|
||||
- Olumsuz/yanıtsız kalırsa 8 alanlık ilk sürümün **6. maddesi (URAP sırası)** çıkarılır; diğer
|
||||
7 alan (YÖK İstatistik, OpenAlex, TÜBİTAK, ROR, kendi verimiz) izne bağlı değil.
|
||||
Reference in New Issue
Block a user