Files
kolaytercih/docs/gece-vardiyasi/2026-09-22/08-p4-olcum.md
bilalgursen 26893ce7cf feat(olcum): sihirbazın 1. adımı ve kaynaksız /paket linkleri ölçülür
(a) `sihirbaz_adim{adim:1}` artık sihirbaz modalı açıldığında atılıyor.
Bugüne kadar olay yalnız `adimaGit`in ileri geçişinde atılıyordu; modal
zaten 1. adımda açıldığı için 1. adım hiç "geçilmiyor", dolayısıyla hiç
sayılmıyordu ve huninin paydası `sira_girildi`den türetilmek zorunda
kalıyordu. Mount effect'i + `olayBirKez` ile tam bir kez düşüyor:
1→2→1→2 gezinmesi bileşeni unmount etmediği için tekrar tetiklemiyor,
sessionStorage tekilleştirmesi de aynı sekmede ikinci açılışı sayıyor.

SERİ KIRILMASI: bu değişikliğin canlıya çıktığı tarihten ÖNCEKİ
`sihirbaz_adim` serisinin paydası farklıdır — o dönemde `adim:1` hiç
atılmadı, seri yalnız 2 ve 3'ten oluşuyor. Öncesi ve sonrası
karşılaştırılamaz; huni okumalarında kırılma tarihi dipnot edilmeli.
Aynı desen `program_eklendi` için 21 Eylül'de uygulanmıştı.

(b) Kaynaksız 10 `/paket` linkine tekil `?kaynak=` eklendi; sitedeki 14
`/paket` linkinin 14'ünde artık kaynak var. Değerler mevcut şemayla
(`kilit`, `kredi_bitti`, `nav`) aynı dilde: fiyat_paket, fiyat_kredi,
kosullar, tercih_degisti, tercih_degisti_yetersiz, danisman_rozet,
danisman_kredi_bitti, danisman_kredi_az, odeme_geri, odeme_hata.

`paket-gorunum-olayi.tsx`'teki `KAYNAKLAR` allowlist'i de genişletildi:
listede olmayan her değer `"diger"`e düştüğü için, genişletilmeseydi 10
yeni kaynağın tamamı tek kovada toplanır ve ölçüm deliği kapanmazdı
(bağımlılık kapanışı — dosya şartnamenin listesinde yoktu, raporda
sapma olarak yazıldı).

Görsel değişiklik yok; yeni olay adı ya da yeni ölçüm yüzeyi eklenmedi.
Doğrulama: `next typegen` + `tsc --noEmit` + `lint` temiz.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:17:21 +03:00

73 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P4 — İki ölçüm deliği · `gece/0922-olcum`
**Tur 3 · yazılımcı raporu · 2026-09-23**
## Özet (5 madde)
1. `sihirbaz_adim{adim:1}` artık sihirbaz modalı açıldığında (bileşenin mount'unda) bir kez atılıyor; huninin paydası `sira_girildi`den türetilmek zorunda değil.
2. Tekrar sayma koruması iki katmanlı: bileşen 1↔2 gezinmesinde unmount olmuyor (mount effect tekrar koşmuyor) **ve** `olayBirKez` oturum başına tekilleştiriyor.
3. Kaynaksız 10 `/paket` linkinin hepsine tekil `?kaynak=` eklendi; sitedeki 14 `/paket` linkinin 14'ünde artık kaynak var.
4. **Şartname dışı zorunlu dosya:** `paket-gorunum-olayi.tsx`'teki `KAYNAKLAR` allowlist'i genişletildi — genişletilmeseydi 10 yeni değerin tamamı Rybbit'e `"diger"` olarak düşerdi, yani iş ölçüm açısından işlevsiz kalırdı.
5. Görsel değişiklik yok: tüm diff ya yorum, ya `href` query string'i, ya da görünmez bir `useEffect`. `tsc --noEmit` ve `lint` temiz.
## Değişen dosyalar
| Dosya | Ne |
|---|---|
| `src/features/sihirbaz/components/sihirbaz-adimlar.tsx` | Mount'ta `olayBirKez("sihirbaz_adim", { adim: 1 }, "adim1")`; `adimaGit` yorumu güncellendi (adım 1 artık oradan geçmiyor) |
| `src/app/page.tsx` | 2 link |
| `src/app/kosullar/page.tsx` | 1 link |
| `src/features/rapor/components/tercih-degisti-modali.tsx` | 2 link |
| `src/features/rapor/components/sohbet-client.tsx` | 3 link |
| `src/features/odeme/components/odeme-kromu.tsx` | 1 link |
| `src/features/odeme/components/odeme-sonuc-karti.tsx` | 1 link |
| `src/features/odeme/components/paket-gorunum-olayi.tsx` | **(şartname dışı)** `KAYNAKLAR` allowlist'i 3 → 13 değer |
## Link → kaynak adı tablosu
| # | Dosya:satır | Yüzey (kullanıcı ne görüyor) | `?kaynak=` |
|---|---|---|---|
| 1 | `src/app/page.tsx:543` | Ana sayfa fiyat bölümü, paket kartının CTA'sı ("… TL — Paketi incele") | `fiyat_paket` |
| 2 | `src/app/page.tsx:573` | Ana sayfa fiyat bölümü, "Kredi bitti mi?" topup kartı | `fiyat_kredi` |
| 3 | `src/app/kosullar/page.tsx:55` | Koşullar · Ücretlendirme paragrafındaki "paket sayfasında" linki | `kosullar` |
| 4 | `tercih-degisti-modali.tsx:283` | "Tercihlerin değişmiş" modalı, aksiyon satırı (kredi baştan yetmiyor) | `tercih_degisti` |
| 5 | `tercih-degisti-modali.tsx:335` | Aynı modal, `durum.ad === "kredi-yetersiz"` satırı (güncelleme denendi, kredi yetmedi) | `tercih_degisti_yetersiz` |
| 6 | `sohbet-client.tsx:351` | Danışman başlığındaki "N kredi" rozeti | `danisman_rozet` |
| 7 | `sohbet-client.tsx:538` | Danışman, kredi bitti bandındaki "Kredi yükle" butonu | `danisman_kredi_bitti` |
| 8 | `sohbet-client.tsx:546` | Danışman, "son N kredin" uyarısındaki "kredi yükleyip" linki | `danisman_kredi_az` |
| 9 | `odeme-kromu.tsx:45` | `/odeme` üst şeridi, "Paket sayfasına dön" | `odeme_geri` |
| 10 | `odeme-sonuc-karti.tsx:141` | Ödeme başarısız kartı, "Tekrar dene" | `odeme_hata` |
Adlandırma dili mevcut şemadan alındı (`kilit`, `kredi_bitti`, `nav`): küçük harf, `snake_case`, yüzeyi/tetiği söyleyen kısa ad. Yeni kavram icat edilmedi; `fiyat_*` ve `danisman_*` önekleri aynı bölümdeki iki linki ayırmak için.
## Kabul kriterleri
| # | Kriter | Durum | Nasıl doğrulandı |
|---|---|---|---|
| 1 | Sihirbaz açılışında `sihirbaz_adim{adim:1}` tam bir kez düşer; 1→2→1→2'de tekrar düşmez | ✔ (koddan çıkarım) | Modal `Dialog`/`DialogContent` içinde, `forceMount` yok → kapanınca `SihirbazAdimlar` unmount oluyor; `adim` bileşenin iç state'i, adım değişimi unmount etmiyor → boş bağımlılıklı `useEffect` bir kez koşuyor. Ek olarak `olayBirKez` sessionStorage anahtarıyla (`kolaytercih.olay.sihirbaz_adim.adim1`) oturum başına tekilleştiriyor; bu aynı zamanda dev StrictMode'un çift effect'ini ve `hero-form`daki `key={sira-tur}` remount'unu da kapatıyor. **Tarayıcıda çalıştırılarak doğrulanmadı** (vardiya kuralı: dev sunucusu/tarayıcı yok). |
| 2 | 14 `/paket` linkinin 14'ünde `?kaynak=` var ve değerler tekil | ✔ | `grep -rn 'href="/paket' src \| grep -v 'kaynak='` → boş. 10 yeni değerin hepsi birbirinden ve mevcut 3 değerden farklı. **Uyarı:** `listem-govde.tsx:288` ve `:369` ikisi de eskiden beri `kaynak=kilit` (iki ayrı kilit yüzeyi, tek değer) — bu benim paketimde değil, aşağıda not olarak duruyor. |
| 3 | Hiçbir görsel değişiklik yok | ✔ | `git diff`: dokunulan satırlar yalnız yorum, `href` string'i ve `null` döndürmeyen hiçbir JSX eklemeyen bir `useEffect`. Hiçbir `className`, metin, ikon, düzen değişmedi. |
| 4 | Commit mesajında seri kırılması notu | ✔ | Commit gövdesinde; ayrıca `sihirbaz-adimlar.tsx` içindeki yorumda da duruyor (analist koda bakınca da görsün). |
| 5 | `tsc --noEmit` + `lint` temiz | ✔ | `pnpm exec next typegen && pnpm exec tsc --noEmit` → çıktı yok; `pnpm lint` → çıktı yok. `pnpm build` iş tanımında istenmediği için koşulmadı. |
## Şartnameden sapmalar
**1 sapma — `src/features/odeme/components/paket-gorunum-olayi.tsx` (şartnamedeki dosya listesinde yok).**
`/paket` görüntülenmesini ölçen bileşen `?kaynak=` değerini bir allowlist'ten süzüyor; listede olmayan her değer `"diger"`e düşüyor (serbest metnin analitiğe sızmaması için, doğru bir koruma). Allowlist bugün `["kilit", "kredi_bitti", "nav"]` idi. Genişletilmeseydi eklediğim 10 kaynağın **onu da** panelde tek bir `"diger"` kovasında toplanacaktı — yani iş görünüşte biter, ölçüm deliği kapanmazdı. Bağımlılık kapanışı gereği aynı commit'e alındı. Dosya P1/P2/P3 paketlerinin kapsamında değil (CEO §3 kontrol edildi), bu yüzden çakışma beklemiyorum.
Başka sapma yok. Yeni olay adı eklenmedi (`OlayAdi` birliğine dokunulmadı), yeni ölçüm yüzeyi eklenmedi, rehber sayfalarına ölçüm eklenmedi.
## Merge sonrası doğrulanması gerekenler
1. **Canlıda bir kez elle dene:** sihirbazı aç → Rybbit'te `sihirbaz_adim{adim:1}` düşüyor mu; 2. adıma geç, geri dön, tekrar ilerle → `adim:1` ikinci kez düşmemeli. (Lokal dev'de Rybbit script'i yüklenmiyor, bu yüzden burada doğrulanamadı.)
2. **Seri kırılması tarihi:** `analitik` ajanı bu değişikliğin **canlıya çıktığı** tarihi sabit dipnot yapsın (CEO §6'daki istek). Merge tarihi değil, deploy tarihi.
3. **`?kaynak=` değerleri panelde göründü mü:** `paket_goruntulendi` olayında `"diger"` kovası bir süre sonra da kalabalıksa allowlist'te unutulmuş bir yüzey var demektir.
4. `/paket` statik bir sayfa; query string eklenmesi ISR/önbellek davranışını değiştirmiyor (`?kaynak=nav` ve `?hata=token` zaten vardı), ama yayın sonrası ilk `/paket?kaynak=fiyat_paket` isteğinde 200 dönüyor mu diye bakılabilir.
## Bilal'den istenen
1. **Dalı incele ve merge et** — `gece/0922-olcum`, 1 commit, 8 dosya, tamamı görünmez ölçüm; ~5 dk.
2. **`paket-gorunum-olayi.tsx` sapmasını onayla** — şartnamede adı geçmiyordu ama onsuz iş işlevsiz kalıyordu; kabul edilmezse o dosyayı geri alıp 10 kaynağın "diger"e düşmesini kabul etmek gerekir; ~2 dk.
3. **Deploy tarihini not et** — `sihirbaz_adim` serisinin kıyaslanamaz hale geldiği gün; ~1 dk.