Added a new router and middleware for handling www to apex domain redirection, ensuring that Let's Encrypt certificates are obtained for both domains. Updated the docker-compose.yml file to include necessary rules and middleware for proper redirection and TLS handling. Also, updated the CEO agent description to remove redundant details and clarified the QA engineer's responsibilities regarding testing critical flows and error reporting. Adjusted the CTO agent's section for consistency in expert guidance and clarified the designer's tools to include 'Skill' for better design resource management.
15 KiB
Canlı site uçtan uca test — 21 Eylül 2026, akşam (QA)
Özet (5 satır)
- Kritik:
/paketsayfası 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:3iki kez)HierarchyRequestErrorfı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ı. - 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(). - 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-sessionnulldöndü. Giriş yapmam / hesap açmam kurallarımca yasak olduğundan liste üretimi, danışman sohbeti ve iyzico'ya kadar ödeme senaryoları koşulamadı. - 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/odemehiç açılmadı. 16:06–16:36 arasındakifix(odeme)commit'leri bu döngüyü hedefliyor; canlıda düzeldiği doğrulanamadı. - Girişsiz akışlar sağlam:
/,/sonuc,/rapor→/sonuc,/bolumler, bölüm detay,/rehber,/universiteler,/giris200 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/soru401,/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şturmadı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ış birqa-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 <main> 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:6sırasıyla geliyor —S:3iki kez. İlkS:3sayfanın tüm<main>'ini içeriyor; ikinciS:3"Girişte 5 deneme kredisi de tanımlanır." satırını içeriyor ve yeri (P:3yer tutucusu) ilkS: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<main>) 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=1sayfa görüntüleme → 13:48:00liste_olusturuldu(20 sn; sunucu listeyi kurdu ve cevap istemciye ulaştı, çünkü bu olayı istemcisonuc.oksonrasında atıyor,liste-uretici.tsx:69) → 13:48:01/listemsayfa 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
/listemsayfa görüntüleme (yenileme) → 13:50:07kilit_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_olusturuldudüştü); ekranın durumu bilinmiyor. liste_uretim_hataolayı 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 tamamenwindow.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 (catchyalnızcalisteOlustur'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+useEffectile "yenilendi mi" kontrolü) ya da ~5 sn sonra rapor hâlâ ekranda değilserouter.replace("/listem")/tam yükleme yapmak. - Alternatif etken (doğrulanmadı): mobil ağda uzun POST cevabının sessizce düşmesi; bu durumda
fetchhata 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
/odemeaçılıp 2–4 sn içinde/paket'e dönüldü; 3'ünde (13:51:16, 13:51:30, 13:59:49)/odemehiç 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(failedsipariş / form içeriği yok / paket zaten var →/paket'e yönlendirme) veodeme-actions.ts:11-12("action bilerek redirect fırlatmaz" — 16:138f4669eve 16:36024a2a4commit'leri). Döngü büyük olasılıkla o commit'lerden önceki davranış; her tıklamada yeni sipariş satırı açılması (pendingsipariş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/paketnormal açılmalı,pendingsipariş 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):
/paketgiriş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
- 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)
- H1 için
pnpm buildsonrası lokal docker'da girişsiz/paketHTML'indeid="S:3"tekrarını onayla ya da bunu CTO'ya "Next 16.2.10 cacheComponents Suspense kimlik çakışması" olarak devret. (~10 dk) /paket'te "Paketi al"a bir kez bas: iyzico formu açılıyor mu, geri dönüşte/paketnormal mi (H4'ün deploy'da düzeldiğini doğrular). (~2 dk)