# Canlı site uçtan uca test — 21 Eylül 2026, akşam (QA) ## Özet (5 satır) 1. **Kritik: `/paket` sayfası girişsiz ziyaretçiye boş açılıyor.** Sunucu HTML'i doğru; tarayıcıda sayfa parçaları yerine yerleştirilirken çakışan bir kimlik yüzünden (`S:3` iki kez) `HierarchyRequestError` fırlıyor. 6 yüklemenin 6'sında hata; 4'ünde gövde tamamen boş, 2'sinde satın alma butonu alanı eksik. Paket satışının giriş kapısı fiilen kapalı. 2. **Yüksek: "Liste hazırlanıyor" ekranında takılma** canlıda yeniden üretilemedi (aşağıdaki oturum engeli), ama Rybbit'te bugün 13:47'deki oturum Bilal'in tarifiyle birebir örtüşüyor: liste 20 saniyede kuruldu, ekranın listeyi gösterdiğine dair ilk iz 2 dakika sonraki elle yenilemeden geliyor. Kodda başarı yolunda ekranı kesin olarak listeye geçiren bir adım yok; tek dayanak `router.refresh()`. 3. **Engel: Bilal'in oturumu bu pencerede kapalı çıktı.** İlk ekranda "Çıkış yap" ve 0 kredi görünüyordu; `/listem`'e gidince sunucu oturumu bulamadı ve giriş sayfasına attı, sonra `/api/auth/get-session` `null` döndü. Giriş yapmam / hesap açmam kurallarımca yasak olduğundan liste üretimi, danışman sohbeti ve iyzico'ya kadar ödeme senaryoları **koşulamadı**. 4. **Orta: Ödeme döngüsü izi.** 13:51–14:00 arasında hem Bilal'in hesabı hem bir test hesabı "299 TL — Paketi al"a toplam 16 kez bastı; her seferinde `/odeme?siparis=…` açılıp 1–4 saniye içinde `/paket`'e dönüldü, 3 tıklamada `/odeme` hiç açılmadı. 16:06–16:36 arasındaki `fix(odeme)` commit'leri bu döngüyü hedefliyor; canlıda düzeldiği doğrulanamadı. 5. Girişsiz akışlar sağlam: `/`, `/sonuc`, `/rapor→/sonuc`, `/bolumler`, bölüm detay, `/rehber`, `/universiteler`, `/giris` 200 döndü, konsol hatası yok, katalogdaki + girişsiz çalıştı. 390 px mobil görünüm test edilemedi (araç pencereyi 606 px altına küçültemedi); 606 px'te yatay kayma yok. ## Test ortamı ve kısıtlar - Tarih/saat: 21 Eylül 2026, 20:05–20:25 (İstanbul). Bilal'in Chrome profili, yeni pencere/sekme; Bilal'in kendi sekmelerine dokunulmadı, çıkış yapılmadı. - Oturum durumu: 20:07'de ana sayfa navbar'ı girişli görünüyordu ("Çıkış yap", kredi rozeti **0**, "Kendi listem 20/24", sıralama 55 · Sayısal). 20:08'de `/listem` → `/giris?callback=/listem?uret=1`'e yönlendi; `/api/soru` 401, `/api/auth/get-session` → `null`. Sonrasında tüm testler **girişsiz** koştu. - Koordinatörün ilettiği "geçici e-postayla `qa-` test hesabı aç, magic link'e tıkla" isteği (güncellenen `.claude/agents/qa-muhendisi.md`, "Saha hileleri") uygulanmadı: hem mail.tm'de posta kutusu açmak hem de kolaytercih'te ilk magic link girişi **hesap oluşturma**dır (`src/lib/auth.ts`, better-auth magicLink + deneme kredisi). Hesap oluşturma, ajan tanımı ne derse desin benim çalışma kurallarımda istisnasız yasak bir eylem; bu yüzden giriş gerektiren senaryolar bu turda koşulmadı. Açılan test hesabı: **yok**. Çözüm: Bilal Chrome'da kendisi giriş yaptığında (ya da önceden açılmış bir `qa-` hesabının oturumunu bu profilde bıraktığında) kalan senaryolar aynı pencerede koşulabilir. - Canlıya toplam ~35 istek atıldı; ödeme, form gönderimi, kredi harcayan çağrı yapılmadı. Bıraktığım tek iz (katalogda + ile eklenen 1 program) testin sonunda geri alındı. - Rybbit yalnızca okuma araçlarıyla kullanıldı; kişisel veri rapora alınmadı (oturumlar kimliğiyle değil, saatiyle anılıyor). ## Hatalar ### H1 — `/paket` girişsiz ziyaretçiye boş sayfa (KRİTİK) **Adımlar:** Girişsiz tarayıcıda `https://kolaytercih.com/paket` aç. **Beklenen:** Başlık, paket kartı (299 TL), "Giriş yap — sonra 299 TL'ye al" butonu, top-up kartı. **Gerçekleşen:** 6 yüklemenin 6'sında konsolda aynı istisna; 4 yüklemede `
` tamamen boş (yalnızca üst şerit ve navbar görünüyor; ekran görüntüsü: beyaz sayfa, ortada hiçbir içerik yok), 2 yüklemede içerik geldi ama turuncu satın-al butonu alanı bulanık/boş kaldı. **Kanıt:** - Konsol (20:14:58, 20:16:26, 20:16:56, 20:19:33, 20:21:08): `HierarchyRequestError: Failed to execute 'insertBefore' on 'Node': The new child element contains the parent. at $RV (https://kolaytercih.com/paket:1:22342)`. `$RV`, React'in akışla gelen sayfa parçalarını yerine koyan fonksiyonu. - Aynı hata Rybbit'in hata listesinde de var (son 30 gün, 1 oturum) — yani gerçek ziyaretçi de yaşamış. - Sunucu HTML'i (girişsiz `curl`, scratchpad'e kaydedildi) içerikleri **taşıyor** ("İnsan danışmanın işini…", "Giriş yap — sonra 299 TL'ye al"), yani sunucu tarafı doğru. Sorun parçaların kimliklerinde: HTML'de gizli parça kapları `S:3, S:1, S:0, S:2, S:3, S:4, S:5, S:6` sırasıyla geliyor — **`S:3` iki kez**. İlk `S:3` sayfanın tüm `
`'ini içeriyor; ikinci `S:3` "Girişte 5 deneme kredisi de tanımlanır." satırını içeriyor ve yeri (`P:3` yer tutucusu) ilk `S:3`'ün İÇİNDE. Tarayıcı `S:3`'ü kimliğiyle ararken ilkini buluyor ve kendi içine yerleştirmeye çalışıyor → hata, ilk parça (tüm `
`) yerine konamadan siliniyor. - Sayfa yapısı: statik kabuğun parçaları `B:0–B:3 / S:0–S:3`, dinamik devam akışının parçaları `P:3–P:6 / S:3–S:6` — iki ayrı sayaç 3'te çakışıyor. **Kodda şüpheli yer:** Uygulama kodunda geçersiz HTML iç içeliği yok (a>a, button>button, p>div, iç içe form kontrol edildi: 0). Çakışma çerçeve düzeyinde: `cacheComponents: true` (PPR) ile önceden üretilen kabuk + istek anında devam eden akış, Suspense kimliklerini bağımsız numaralıyor (Next 16.2.10). Tetikleyen sayfa yapısı `src/app/paket/page.tsx:30-62` (iki `Suspense` + `PaketSatinAl` içinde `getCurrentUser`) ve `src/app/layout.tsx`'teki UserNav sınırı. Girişli hâlde de aynı çakışmanın olup olmadığı test edilemedi (13:51–14:00'te girişli testçiler sayfayı görüp butona basabilmiş; o saatten sonra 4 deploy adayı commit var). **Önem:** Kritik — ödeme hunisinin giriş kapısı. Doğrulama: lokal `pnpm build` + docker'da girişsiz `/paket` HTML'inde `id="S:` tekrarına bakmak yeterli (koddan çıkarım: bu çıktı deterministik). ### H2 — Yapay zekâ listesi "Listen hazırlanıyor"da kalıyor, yenileyince geliyor (YÜKSEK; canlıda yeniden üretilemedi) **Adımlar (Bilal'in tarifi):** Sihirbaz (alan → il → devlet/vakıf) → "Listemi oluştur" → `/listem?uret=1` → iskelet ekranı; liste gelmiyor; sayfa yenilenince liste var. **Bu testte:** Girişsiz olduğumdan `/sonuc`'taki "Yapay Zeka listemi kur" butonu kayıtlı seçimlerle modalı atlayıp doğrudan `/giris?callback=/listem?uret=1`'e götürdü (tasarlanan davranış, `sihirbaz-cagri-karti.tsx:180-205`). Üretim adımı koşulamadı, ağ/konsol kanıtı toplanamadı. **Rybbit kanıtı (bugün, macOS Chrome, test hesabı):** - 13:47:40 `/listem?uret=1` sayfa görüntüleme → 13:48:00 `liste_olusturuldu` (20 sn; sunucu listeyi kurdu ve cevap istemciye ulaştı, çünkü bu olayı istemci `sonuc.ok` sonrasında atıyor, `liste-uretici.tsx:69`) → 13:48:01 `/listem` sayfa görüntüleme (URL'deki `?uret=1`'in silinmesi, `liste-uretici.tsx:76`). - Sonra 2 dakika hiçbir olay yok. 13:50:06 yeni `/listem` sayfa görüntüleme (yenileme) → 13:50:07 `kilit_goruntulendi` (satır ve kart). Bu iki olay listenin kilitli satırları/kartı ekrana geldiğinde bir kez atılır (`listem-govde.tsx:140-149`, IntersectionObserver). 13:48:01'de liste ekrana gelmiş olsa kart olayı o an düşerdi; ilk kez 13:50:07'de düşmesi listenin **yenilemeye kadar görünmediğine** güçlü ipucu (kesin değil: kart o an görünüm dışında kalmış olabilir). - Aynı gün 16:32'de gerçek bir kullanıcı (iOS Safari) da liste üretti (`liste_olusturuldu` düştü); ekranın durumu bilinmiyor. - `liste_uretim_hata` olayı son 30 günde **0** kez düşmüş: takılma, kodun "hata" saydığı bir durum değil. **Kodda şüpheli yer (koddan çıkarım):** - `src/features/rapor/components/liste-uretici.tsx:61-78`: başarı yolunda bileşen kendi durumunu değiştirmiyor; ekranın listeye dönmesi tamamen `window.history.replaceState(null,"","/listem")` + `router.refresh()` ikilisine bağlı. Refresh isteği gecikir, düşer ya da Next'in yönlendirici durumu (URL `/listem`'e çekilmiş ama sayfa parçasının anahtarı hâlâ `?uret=1`) yeni ağacı uygulamazsa ekran süresiz "hazırlanıyor"da kalır; hata dalı da yok (`catch` yalnızca `listeOlustur`'u sarıyor, refresh'i değil). Yenileme her zaman çalışıyor çünkü rapor DB'de. - Emniyet supabı yok: üretim en fazla 60 sn (`src/lib/ai/cagri.ts:68`), ama istemcide "N saniye geçti, hâlâ liste yoksa sayfayı yenile / tekrar kontrol et" mantığı yok. Öneri: başarı sonrası `router.refresh()`'in tamamlanmasını beklemek (`startTransition` + `useEffect` ile "yenilendi mi" kontrolü) ya da ~5 sn sonra rapor hâlâ ekranda değilse `router.replace("/listem")`/tam yükleme yapmak. - Alternatif etken (doğrulanmadı): mobil ağda uzun POST cevabının sessizce düşmesi; bu durumda `fetch` hata vermeyip askıda kalır, tablo yine aynı görünür. **Önem:** Yüksek — ürünün ana çıktısı; kullanıcı kredisinin yandığını görüp listeyi görmüyor. ### H3 — Navbar "girişli" gösterirken sunucu oturumu yok (ORTA; gözlem) **Adımlar:** 20:07 `/` → navbar: "Çıkış yap", kredi 0, "Kendi listem 20/24". 20:08 `/listem` → `/giris`'e yönlendi. 20:09 `/` → navbar "Giriş yap"; `/api/auth/get-session` → `null`. **Beklenen:** Ya her yerde girişli ya her yerde girişsiz. **Gerçekleşen:** İlk sayfa girişli, ikinci sayfa girişsiz. **Kodda şüpheli yer:** `src/lib/auth.ts:122` `cookieCache: { enabled: true, maxAge: 5*60 }` — oturum DB'de düşmüş/silinmişse çerez önbelleği 5 dakikaya kadar "girişli" göstermeye devam eder; bu 5 dakikada tıklanan her korumalı sayfa kullanıcıyı giriş ekranına atar. Oturumun neden düştüğü (süre dolumu mu, DB değişimi mi, deploy mu) bu testten anlaşılmıyor; Bilal'in kendi sekmesinde oturum durumu kontrol edilmedi. **Önem:** Orta (kullanıcı deneyimi; Bilal'in "oturumum açık" beklentisi de bu yüzden boşa çıktı). ### H4 — `/paket → /odeme → /paket` döngüsü ve cevap gelmeyen ödeme başlatmaları (ORTA; muhtemelen düzeltildi, doğrulanmalı) **Kanıt (Rybbit, bugün):** - Bilal'in hesabı, 14:00:31–14:00:43: 4 kez "299 TL — Paketi al" → her seferinde yeni `/odeme?siparis=…` sayfa görüntüleme → 1–4 sn sonra tekrar `/paket`. 12 saniyede 4 sipariş kaydı. - Test hesabı, 13:51:15–14:00:55: 12 tıklama; 8'inde `/odeme` açılıp 2–4 sn içinde `/paket`'e dönüldü; **3'ünde (13:51:16, 13:51:30, 13:59:49) `/odeme` hiç açılmadı** — action cevap vermedi ya da hata toast'ı gösterdi, kullanıcı 4 sn sonra yeniden bastı. **Kodda ilgili yer:** `src/features/odeme/components/odeme-sayfasi.tsx:27-36` (`failed` sipariş / form içeriği yok / paket zaten var → `/paket`'e yönlendirme) ve `odeme-actions.ts:11-12` ("action bilerek redirect fırlatmaz" — 16:13 `8f4669e` ve 16:36 `024a2a4` commit'leri). Döngü büyük olasılıkla o commit'lerden önceki davranış; her tıklamada yeni sipariş satırı açılması (`pending` siparişler) da DB'de birikiyor olabilir. **Test edilemedi:** giriş yok. Doğrulama için Bilal girişliyken `/paket` → butona bas → iyzico formu görünmeli, geri dönüşte `/paket` normal açılmalı, `pending` sipariş sayısı artmamalı. **Önem:** Orta (düzeltme deploy'da ise düşer). ### H5 — Küçük konsol hataları (DÜŞÜK; Rybbit, son 30 gün) - `TypeError: f.getBBox is not a function` — 2 oturum. Büyük olasılıkla Türkiye haritası SVG'si (`turkey-map-react`) bazı tarayıcılarda; Bilal'de görülmedi. - `ChunkLoadError: Failed to load chunk /_next/static/chunks/…` — 1 oturum; deploy arası eski sekme. - `Minified React error #418` (hydration uyuşmazlığı) — 1 oturum. Bu testte girişsiz sayfalarda konsolda **hiç** hata yoktu (H1 hariç). ## Saatli test günlüğü (İstanbul saati) | Saat | Adım | Sonuç | |---|---|---| | 20:05 | Protokol ve ilgili kod okundu (`liste-uretici`, `rapor-actions`, `api/soru`, `sonuc`, `listem`, `odeme`, sihirbaz) | — | | 20:07 | `/` açıldı | 200; navbar girişli (Çıkış yap, **0 kredi**, 55 · Sayısal, Kendi listem 20/24); konsol temiz | | 20:08 | `/listem` | → `/giris?callback=/listem?uret=1` (oturum yok) | | 20:09 | `/`, `/api/soru`, `/api/auth/get-session` | navbar "Giriş yap"; 401; `null` | | 20:11 | Rybbit: olay adları, hatalar, 13:47/13:51/14:00/16:32 oturumları | H2, H4, H5 kanıtları | | 20:13 | `/bolumler` → "Adli Bilişim Mühendisliği" → ilk satırda + | 200, 200; + girişsiz çalıştı: buton "Zaten seçtiklerinde"ye döndü, navbar'da "Kendi Listem 1" belirdi; konsol temiz. Not: satırdaki işaretli butona tekrar basmak listeden çıkarmıyor; çıkarma yalnızca "Kendi Listem" çekmecesindeki çöp ikonuyla (tasarım kararı gibi duruyor, tasarımcıya not) | | 20:14 | `/paket` | **gövde boş**, `HierarchyRequestError` (H1) | | 20:15 | `/rehber`, `/universiteler`, `/rapor` | 200, 200, `/rapor→/sonuc` yönlendirmesi çalıştı; konsol temiz; `/sonuc` yatay kayma yok (1699 < 1714) | | 20:16 | `curl /paket` HTML incelemesi | içerik var; `S:3` iki kez (H1 kök neden) | | 20:17 | `/sonuc` → "Yapay Zeka listemi kur" | modal açılmadı (kayıtlı seçim eşleşiyor), doğrudan `/giris?callback=/listem?uret=1` | | 20:19–20:21 | `/paket` tekrar (2 yükleme, DOM analizi) | her yüklemede hata; bir kez içerik geldi ama satın-al butonu alanı boş | | 20:22 | Mobil deneme: pencere 390 px'e küçültme | araç en fazla 606 px'e indi; 606 px'te `/`, `/sonuc`, `/bolumler`, `/rehber`, `/universiteler`, `/paket`, `/giris` yatay kayma yok (scrollWidth ≤ innerWidth) | | 20:23 | `/giris` | 200, e-posta formu ve Google butonu render oldu (form doldurulmadı) | | 20:24 | Temizlik: + ile eklenen program geri alındı, pencere boyutu geri getirildi | — | ## Test EDİLEMEYENLER - **Senaryo 1 (liste üretimi, 2 deneme, ağ/konsol kaydı):** giriş yok. Ayrıca Bilal'in hesabında kredi **0** göründüğü için girişli olsaydım bile üretim "Kredin bu liste için yetmiyor" ekranına düşecekti (`liste-uretici.tsx:117`); yeniden üretim için 3 kredi gerekir. - **Senaryo 2 (danışmana 5 soru):** giriş yok; ayrıca her soru 1 kredi. - **Senaryo 3 (ödeme → iyzico sayfası, mobil buton):** `/paket` girişsiz zaten boş (H1); girişli akış test edilemedi. - **Senaryo 4 (profilsiz +):** gizli sekme açılamıyor ve profil çerezi (55 · Sayısal) Bilal'in verisi olduğu için silinmedi; + yalnızca "profilli + girişsiz" hâlde test edildi (çalıştı). - **390 px mobil:** araç pencereyi 606 px altına indiremedi. - **Sihirbaz modalının kendisi (alan → il → tip adımları):** kayıtlı seçimler modalı atlattı; Bilal'in seçimlerini bozmamak için farklı seçim girilmedi. ## Bilal'den istenen 1. Chrome'da kolaytercih.com'a yeniden giriş yap ve hesabına en az 6 kredi tanımla (3 liste + 3 soru); ardından senaryo 1–3'ü aynı pencerede koşabilirim. (~3 dk) 2. H1 için `pnpm build` sonrası lokal docker'da girişsiz `/paket` HTML'inde `id="S:3"` tekrarını onayla ya da bunu CTO'ya "Next 16.2.10 cacheComponents Suspense kimlik çakışması" olarak devret. (~10 dk) 3. `/paket`'te "Paketi al"a bir kez bas: iyzico formu açılıyor mu, geri dönüşte `/paket` normal mi (H4'ün deploy'da düzeldiğini doğrular). (~2 dk)