All checks were successful
Deploy / deploy (push) Successful in 7m18s
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.
160 lines
32 KiB
Markdown
160 lines
32 KiB
Markdown
# 11 — CEO kararları, 2. tur — 2026-09-21 gece vardiyası
|
||
|
||
Hazırlayan: CEO ajanı · Girdi: `07`, `08`, `09`, `10` + kod okuması (worktree'ler, salt-okunur) · Kod/içerik değiştirilmedi, yalnızca bu dosya yazıldı.
|
||
İşaretler ilk turla aynı: **[KARAR]** ajan yetkisinde, bu gece `gece/*` dalında uygulanır (push/merge yok) · **[BİLAL]** Bilal onayı bekler; ayrı commit/dal, ben yalnız tavsiye veririm.
|
||
Saat ~05:15 → plan: 05:30 başla · 06:15 yazılımcılar biter · 06:15–07:00 denetim + entegrasyon build'i (tek build, RAM) · 07:00–07:30 sabah özeti.
|
||
|
||
## 1. Özet — ilk tura göre stratejik resim nasıl değişti? (5 madde)
|
||
|
||
1. **En büyük sızıntı sandığımız yerde değil, ilk dokunuşta.** İlk turda "veri yok, katalog köprüsüne dokunma, önce paydayı ölç" demiştim. Payda zaten verideymiş; yanlış okumuşuz: `program_eklendi` eklemeyi değil + tıklamasını ölçüyor. Katalogdan +'ya basan 83 oturumun 82'si 5 ekranlık profil kapısına çarpıyor, 77'si (%94) vazgeçiyor, programı listeye **girmiyor**. "Katalog ziyaretçisi eklemeyi seviyor" okumam niyet için doğru, davranış için yanlıştı; kaydet banner'ı (eşik 3) profilsiz ziyaretçi için fiilen ulaşılamaz. Erteleme kararımı geri alıyorum: ölçüm düzeltmesi bu gece **[KARAR]**, davranış prototipi ayrı dalda **[BİLAL]**.
|
||
2. **Sezon dışında yön okunabilecek tek huni bu.** P2'nin hunilerine oran olarak 11 Ocak 2027'den (CTA formu) / 2027 tercih dönemi bitmeden (/sonuc→giriş) önce bakılamaz. +→sıra hunisinde ise taban %6 o kadar düşük ki büyük bir değişiklik 3–5 haftada (≈37 oturum) görünür: 28 Eylül'de canlıya çıkarsa en erken **2 Kasım**. Her haftalık gecikme bu tarihi bir hafta iter. Diğer her şeyde oran değil adet + tek tek oturum okunacak.
|
||
3. **Büyüme motoru rehber değil katalog.** Trafiğin %97'si Google→katalog, %93'ü mobil; + niyeti iniş sayfasında ilk 29 saniyede doğuyor. İlk turda "Search Console verisi gelmeden sayfalama kararı riskli" diye ertelemiştim; o risk canonical değişikliğine aitti. Yeni öneri canonical/robots'a dokunmuyor (programların ~%53'ü yalnız `sayfa/2+`'da, 667 derin URL'nin başlığı yalnız sayfa numarasıyla ayrışıyor) → indeks riski yok, bu gece yapılır. Blogda tersine frene basıyorum: 2 slot hakkım var, **1** yazı yazdırıyorum.
|
||
4. **Bu gecenin 5 dalı sağlıklı, ama P3 amacını tam kapatmadı ve bir commit alınmamalı.** Kritik bulgu yok. `52520ac` (Armut atıflı fiyat) teyitsiz → merge edilmez; yerine **hiç doğrulama gerektirmeyen rakamsız alternatifi** hazırlatıyorum. Tadımlık satırında `gerekce`/`trendOzeti` hâlâ LLM metni (lokal DB: 13/514 satırda olasılık dili, 126/514'te "Son 4 yıl") → girişsiz ziyaretçinin gördüğü ilk yapay zekâ metni vaadimizi deliyor; P3b ile kapatılıyor.
|
||
5. **Garanti→Güvenli ~10 değil ~35 dosya** ve etiket beş ayrı yerde yaşıyor. Hazırlık refaktörünü bu gece yaptırmıyorum (P3/P3b ile dosya çakışması + "Güvenli · Güvenli" gösterim kararı Bilal'in). Bilal'in bu hafta vereceği "evet/hayır", işin tüm dallar merge edildikten sonra tek PR'da (iki commit) yapılmasını mümkün kılar. Bu gecenin yeni metinleri karardan bağımsız yazılıyor (dilim adı geçmeyen cümleler).
|
||
|
||
### Bu turda koddan doğruladıklarım
|
||
|
||
| İddia / varsayım | Sonuç |
|
||
|---|---|
|
||
| `program_eklendi` kapı açıldığında da atılıyor (09) | **Doğru.** `program-ekle-butonu.tsx` `handleClick`: `doldu`/`zatenVar` dışındaki her sonuç (`kapiAcildi: true` dahil) `else`'e düşüp olayı atıyor. Kapı tamamlanınca eklenen bekleyen program için (`use-tercih-profili.ts` `profilTamamlandi`) olay **yok**. |
|
||
| Profilsiz ekleme teknik olarak mümkün mü? | **Evet, depo zaten destekliyor.** `liste-store.ts` `ekle()` profil yoksa `tercih.risk`'i (null) korur; `programdanManuelTercih` sıra `null` kabul eder; `riskleriYenile(profil)` profil gelince tüm listeyi yeniden hesaplar; UI null riski zaten karşılıyor (`liste-cekmecesi.tsx:398`, `secimlerim-paneli.tsx:224`). Prototip tip/şema değişikliği gerektirmez. |
|
||
| Kapı tanıtım ekranını atlayabiliyor mu? | **Evet.** `profilToplamaAc(hedef, dogrudanSira)` mevcut; adımlar `"giris" \| "sira" \| "sihirbaz"` (`tercih-profili-kapisi.tsx:51`). |
|
||
| + kapısı `/meraklisina` şemasında (`SEMA`) var mı? | **Yok.** `huni-semasi.tsx` `SEMA` yalnız sihirbaz adımları → havuz → gevşetme → 24'lük iskeleti anlatıyor. + davranışı değişse de AGENTS.md şema senkron kuralı tetiklenmez (sihirbaz adımları, havuz, iskelet, gevşetme sırası, havuz-dışı kuralı aynı kalır). |
|
||
| Marka ajanının 3 köprü cümlesi ürünün yaptığı şeyi mi söylüyor? | **Hayır — üçü de olmayan özelliği vaat ediyor.** V1 "satır satır gör", V3 "bu programların … risk seviyesini gösterelim", V2 "bu üniversite içinde sana en yakın olanları öne alalım" diyor; katalog tablolarında satır bazlı risk **yok** (`universite-program-tablosu.tsx` / `bolum-program-listesi.tsx`'te `risk`/`profil` geçmiyor) ve CTA akışı sıra → sihirbaz → genel `/sonuc`'a gidiyor (`cta-sira-form.tsx` `secimleriTamamla`). İlk turdaki ilkem ("olmayan özelliği satma") gereği V1'i **uyarlayarak** seçtim (§2-K3). |
|
||
| `/sonuc` ücretsiz tablosu risk "etiketi" gösteriyor mu? | **Kısmen.** Dilim sekmeleri + satırda renkli nokta (`program-tablosu.tsx:307`, `aria-hidden`), metin etiketi yok. Köprü cümlesi bu yüzden "etiketlerle" demiyor, "risk seviyesine göre ayrılmış" diyor. (Yan not → §5: nokta tek başına renk; risk dili kuralı açısından Bilal baksın.) |
|
||
| P2'nin [BİLAL] commit'i (`c055e82`) `analitik.ts`'e dokunuyor mu? | **Hayır** (yalnız `rybbit-identify.tsx`, `user-nav.tsx`). Yeni ölçüm dalı `e1bb482`'den açılabilir; Bilal'in identify kararı bağımsız kalır. |
|
||
| Tadımlıkta trend deterministik üretilebilir mi? | **Evet.** `rapor.ts:144` `trendOzetiUret` saf fonksiyon (şu an private); tadımlık program kaydında `siraGecmisi?: (number\|null)[]` var (`features/rapor/types/rapor.ts:47`). |
|
||
| `/bolum/[slug]`'da CTA yok (10) | **Doğru.** `CtaSiraForm` 5 yerde kullanılıyor (`rehber/page`, `rehber-makale`, `bolum-listesi`, `universite-listesi`, `universite-icerik`); `bolum-icerik.tsx`'te yok. |
|
||
|
||
---
|
||
|
||
## 2. Tur 2 iş paketleri (4 kod paketi + 1 blog yazısı), öncelik sıralı
|
||
|
||
Ortak kurallar (ilk turla aynı): kendi worktree + belirtilen dal; AGENTS.md geçerli (kod yazmadan önce `node_modules/next/dist/docs/`; tarayıcı/dev sunucusu yok); `data/app.db`, `docker-compose.yml`, `docs/geo/geo-raporu.md` dokunulmaz; şema/DB migrasyonu yok; **`pnpm build` koşma** (RAM — tek build entegrasyonda), her commit'te `next typegen` + `tsc --noEmit` + `pnpm lint` temiz olmalı; rapor `07-yazilimci-raporlari.md`'ye kendi başlığıyla eklenir. "Sahip olduğu dosyalar" dışına çıkılmaz.
|
||
|
||
**Paralellik:** Yazılımcı A = K1 sonra K4 (aynı dosyalar → sıralı, aynı kişi) · Yazılımcı B = K2 · Yazılımcı C = K3 · Yazar D = B1. Zaman daralırsa ilk düşecek iş K4'tür (ölçüm asla düşmez).
|
||
|
||
### K1 · `+` kapısı ölçüm düzeltmesi — **[KARAR]**
|
||
- **Dayandığı bulgu:** 09 özet m.1, m.4 ve "CTO'ya ölçüm notu"; 08 #6 (`kullaniciTanit` kuyruğu).
|
||
- **Dal:** YENİ `gece/p5-kapi-olcum`, taban **`e1bb482`** (= `gece/p2-olcum~1`; P2'nin `analitik.ts` ve `tercih-profili-kapisi.tsx` değişikliklerini içerir, [BİLAL] identify commit'ini içermez). Mevcut P2 dalının üstüne **eklenmez** (tepedeki [BİLAL] commit'inin "`~1`'i merge et" talimatı bozulmasın).
|
||
- **Sahip olduğu dosyalar:** `src/lib/analitik.ts`, `src/features/liste/components/program-ekle-butonu.tsx`, `src/features/liste/hooks/use-tercih-profili.ts`, `src/features/liste/components/tercih-profili-kapisi.tsx`.
|
||
- **Kabul kriterleri:**
|
||
1. **Commit 1:** `program_eklendi` yalnız gerçek eklemede atılır: (a) butonda yalnız `sonuc.eklendi === true` iken, `{kaynak, yol: "dogrudan"}`; (b) kapı tamamlanıp bekleyen program listeye girdiğinde (`profilTamamlandi` içinde `ekle()` `true` döndüyse), `{kaynak: bekleyen.kaynak, yol: "kapi"}`. `kapiAcildi` dalında **atılmaz**.
|
||
2. **Commit 2:** iki yeni olay, adlar kalıcı sözleşme — `kapi_acildi {tetik}` (`tetik`: `arti` \| `sonuc` \| `sihirbaz` \| `duzenle` \| `diger`; depoya `tetik` alanı eklenir, her açıcı kendi değerini yazar, `profilToplamaAc`'a isteğe bağlı 3. parametre) ve `kapi_kapatildi {adim, tetik}` (`adim`: `giris` \| `sira` \| `sihirbaz`). `kapi_kapatildi` yalnız **tamamlanmadan** kapanışta atılır (X, dışarı tıklama, geri→kapat); tamamlanan kapıda atılmaz (kod incelemesiyle göster). Olay, kapı bileşeninde tek noktadan atılır; ham sıra/e-posta özelliğe girmez.
|
||
3. **Commit 3 (küçük):** `kullaniciTanit()` script yokken sessiz no-op olmasın — tek "son değer" slotu, `olay()` kuyruğunun boşaltıldığı yerde **olaylardan önce** uygulanır; `kullaniciTemizle()` slotu siler. `rybbit-identify.tsx`'e **dokunulmaz**.
|
||
4. `OlayAdi` birliğine yalnız `kapi_acildi`, `kapi_kapatildi` eklenir; `program_eklendi` yorumuna "bu commit'in canlıya çıktığı tarihten önce = + tıklaması, sonrası = gerçek ekleme; seriler karşılaştırılamaz" notu düşülür.
|
||
5. Davranış **değişmez**: profilsiz + hâlâ kapıyı açar. `grep -rn "program_eklendi" src` → yalnız bu iki atış noktası + tip.
|
||
- **Kapsam dışı:** kapının tasarımı/metni, `dogrudanSira` varsayılanı, kaydet banner eşiği, `cta_form_goruntulendi` hydration koruması (08 #5 — OLASI, tarayıcısız körlemesine düzeltilmez), `sihirbaz_adim` özellikleri.
|
||
- **Bilal onayı:** gerekmez (saf ölçüm). Bilal'in işi: canlıya çıkış **tarihini not etmek** (seri kırılması) — §4.
|
||
|
||
### K2 · Tadımlık metin sızıntısı + rakamsız fiyat alternatifi
|
||
- **Dayandığı bulgu:** 08 #2 (orta) ve #1 (yüksek); 07-P3 "kalan ifadeler".
|
||
- **Dal:** YENİ `gece/p3b-tadimlik-dili`, taban **`cae2aaa`** (P3'ün iki [KARAR] commit'i; Armut ve logo commit'leri yok). Mevcut P3 dalının üstüne eklenmez (tepesinde alınmaması gereken `52520ac` var).
|
||
- **Sahip olduğu dosyalar:** commit 1 → `src/lib/tadimlik-havuzu.ts`, `src/lib/ai/rapor.ts` (yalnız `trendOzetiUret`'in taşınması/import'u), yeni `src/lib/trend.ts` (saf fonksiyon) · commit 2 → `src/app/page.tsx` (yalnız 3 fiyat cümlesi), `src/app/paket/page.tsx`, `src/app/layout.tsx` (yalnız `description`).
|
||
- **Kabul kriterleri:**
|
||
1. **Commit 1 [KARAR]:** `tadimlikSec()` DB'deki `trendOzeti`'ni servis etmez; trend, rapordakiyle **aynı saf fonksiyondan** `program.siraGecmisi`'nden okuma anında üretilir (önce `siraGecmisi`'nin yıl sırasını `scripts/tadimlik-uret.ts`'ten doğrula; alan yoksa "yeterli geçmiş veri yok" cümlesi). `gerekce` için okuma anı filtresi: `/olasılı|ihtimal|garanti|kesin|yüzde/i` eşleşen satır **atlanır** (önce `genel` kategoriye düşer, o da eşleşirse `null` → tadımlık gizlenir; PRD kuralı "generic tadımlık gösterilmez" ile uyumlu). `tadimlik-havuzu.ts:84-93` yorumu gerçeği söyleyecek biçimde düzeltilir.
|
||
2. Trend cümlelerindeki tahmin dili de düzelir (tek kaynak olduğu için rapor + tadımlık birlikte): "bölüm zorlaşıyor" → "taban sıkılaştı"; "yerleşmek görece kolaylaşıyor" → "taban gevşedi". Eşikler (±%10), ilk–son yıl mantığı, 5/13/6 şeması, LLM prompt'u **değişmez**.
|
||
3. Lokal `data/app.db`'ye karşı **salt-okunur** betik (scratchpad, commit'lenmez): 514 satırın kaçının filtreye takıldığı ve kaç anahtarın `null`'a düştüğü rapora yazılır. `grep -niE "olasılı|ihtimal|Son 4 yıl"` servis edilen alanlarda 0.
|
||
4. **Commit 2 [BİLAL], en tepede, `52520ac`'nin alternatifi (ikisi birlikte alınmaz):** üçüncü tarafa atıf ve TL aralığı **yok**. "İyi bir tercih danışmanı 2.000–10.000 TL istiyor." → "İyi bir tercih danışmanının ücreti birkaç bin lirayı bulabiliyor."; kıyas tablosu hücresi → "Danışmana göre değişir"; "İnsan danışmanın 2.000–10.000 TL aldığı işi…" → "İnsan danışmanın birkaç bin liraya yaptığı işi…"; "onda bir fiyatına" → "çok daha düşük fiyata" (`paket/page.tsx`, `layout.tsx` — P3 sapma #3'teki "danışman**dan**" düzeltmesiyle). Yorum içindeki ölü `<p>` bloğuna **dokunma** (logo commit'iyle çakışmasın).
|
||
5. `git merge-tree` ile kanıtla: `9d450c5` (YÖK logosu) bu dalın tepesine çakışmasız cherry-pick ediliyor.
|
||
- **Kapsam dışı:** trend hesabının ilk–son yıl duyarlılığı (Ege Tıp örneği — davranış değişikliği, §5), `tadimlik_havuzu` şeması, prod'da yeniden üretim (Bilal), SSS'deki "boşta kalma ihtimali" cümlesi, Garanti→Güvenli.
|
||
- **Bilal onayı:** commit 1 gerekmez; commit 2 ayrı ve en tepede → reddedilirse `git merge gece/p3b-tadimlik-dili~1`.
|
||
|
||
### K3 · Katalog: derin sayfa başlıkları + vaatsiz köprü + `/bolum`'a CTA — **[KARAR]** (metni Bilal okur)
|
||
- **Dayandığı bulgu:** 10 §B (sayfalama), 10 özet m.5 + §A9 (vaat dili, CTA eksikliği); 09 m.2 (148 giriş oturumu `/bolum/*`'a düşüyor, CTA yok); 07-P3 "en görünür kalan vaat cümlesi".
|
||
- **Dal:** YENİ `gece/p7-katalog`, taban **`e1bb482`** (`cta-sira-form.tsx` P2'de değişti; aynı tabandan açılan K1 ile dosya kesişimi **yok**).
|
||
- **Sahip olduğu dosyalar:** `src/features/katalog/components/bolum-icerik.tsx`, `src/features/katalog/components/universite-icerik.tsx`, `src/features/sihirbaz/components/cta-sira-form.tsx`, (isteğe bağlı) `src/features/katalog/components/sayfalama.tsx` içine dilim yardımcı fonksiyonu.
|
||
- **Kabul kriterleri:**
|
||
1. **Commit 1 — sayfalama (10 §B3 aynen):** `sayfa > 1` iken bölüm sayfasının `title` + `description` + H1'i o sayfanın **taban sırası aralığını** taşır (dilimdeki min–max `efektifSira`; null'lar hariç; tümü null ise "taban verisi olmayan programlar"; lisans/önlisans karışan dilimde aralık yine min–max). Üniversite sayfasında `description` + giriş paragrafı o sayfadaki **fakülte adlarını** sayar (ilk 2 + "ve N birim daha"); `<title>` ~60 karakteri aşmasın diye farklılaştırıcı öncelikle description + H1 altı. Bölüm derin sayfasının görünür breadcrumb'ı üniversite sayfasındaki desenle birebir (üst bölüm linki). **Canonical kendine, `robots` `index, follow`, sitemap ve iki `sayfa/[no]/page.tsx` DEĞİŞMEZ.** Metadata ve gövde aynı dilim hesabını tek yardımcıdan alır.
|
||
2. **Commit 2 — vaat dili + köprü:** `CtaSiraForm`'a isteğe bağlı `aciklama?: string` prop'u (yalnız profilsiz karttaki paragrafın yerine geçer; varsayılan paragraflar **aynen** kalır — içlerindeki "garanti dilimleri" H2 kararına ait). Başlıklar:
|
||
- varsayılan (4 yer): iki kart başlığında **"Sıralamana yakın programlar hangileri? Saniyede gör."**; çekmecenin `DrawerTitle`'ı ve H2'sinde **"Sıralamana yakın programlar hangileri?"**
|
||
- üniversite: **`Sıralaman ${uni.ad} tabanlarının neresinde?`** · bölüm: **`Sıralaman ${bolum.ad} tabanlarının neresinde?`**
|
||
- katalog `aciklama`'sı (seçilen varyant: **10 §A9-V1, ürünün gerçekten yaptığına uyarlanmış**): **"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."**
|
||
- `bolum-icerik.tsx`'e `CtaSiraForm` eklenir — üniversite sayfasıyla **aynı konumda** (liste + sayfalama altı, `mt-10`). Buton metni/ikon deseni değişmez (metin + sonda `ArrowRight`).
|
||
3. `grep -rniE "yerleşir misin|yerleşirsin" src` → 0 (LLM prompt'ları hariç). Yeni badge/pill/modal yok; mevcut `SectionEyebrow` aynen.
|
||
- **Kapsam dışı:** CTA'nın tablonun **üstüne** taşınması, satır içi tek soruluk köprü, katalog tablosuna satır bazlı risk (asıl çözüm bu — §3 #16), kart gövdesindeki dilim adları, `cta_form_goruntulendi` koruması, `SAYFA_BOYU`, `noindex`, canonical.
|
||
- **Bilal onayı:** iki commit bağımsız; metni beğenmezse `git merge gece/p7-katalog~1` yalnız sayfalamayı alır. Görsel risk düşük (yeni eleman yok; bölüm sayfasına mevcut kart geliyor, derin sayfa H1'i uzuyor → mobilde bir bakış).
|
||
|
||
### K4 · Prototip: ilk `+` anında eklesin, sıra sorusu sonra gelsin — **[BİLAL]**
|
||
- **Dayandığı bulgu:** 09 "Tasarımcıya 5 çıkarım" #1 ve #5; Huni C eşiği.
|
||
- **Neden tavsiyeyle yetinmeyip prototip:** değişiklik küçük ve geri alınabilir (depo profilsiz eklemeyi zaten destekliyor), marka/hukuk kararı değil, ve hazır dal Bilal'in kararını "telefonda 10 dk bak → evet/hayır"a indirir. İlk turdaki "ucuz olanı ayrı commit'te hazırlat" ilkesiyle aynı. Pahalı/tasarım gerektiren her şey (alt sayfa, satır içi soru, mini çubuk) **kapsam dışı**.
|
||
- **Dal:** YENİ `gece/p6-arti-aninda-ekle`, taban **`gece/p5-kapi-olcum`'un tepesi** (K1 bitince, aynı yazılımcı). Tek commit.
|
||
- **Sahip olduğu dosyalar:** `src/features/liste/hooks/use-tercih-profili.ts` (`programEkleIste`), `src/features/liste/components/program-ekle-butonu.tsx`. Başka dosya **yok**.
|
||
- **Kabul kriterleri:**
|
||
1. Profil yokken `programEkleIste` programı **hemen** listeye ekler (risk `null`), kapıyı **açmaz**; dönüşe `profilsiz: true` eklenir. `program_eklendi {kaynak, yol: "dogrudan", profilli: "hayir"}` (profilli dalda `"evet"`).
|
||
2. Buton profilsiz eklemede sonner toast gösterir (sabit `id` → üst üste yığılmaz, süre ~8 sn): başlık "Seçtiklerine eklendi", açıklama "Sıralamanı girersen bu programın risk seviyesini de gösteririz.", aksiyon "Sıralamamı gir" → `profilToplamaAc(null, true, "arti_toast")` (tanıtım ekranı atlanır). Sonner `label` ReactNode kabul ediyorsa sonda `ArrowRight className="size-4"`; etmiyorsa düz metin + rapora not. Metnin başında ikon yok, `Sparkles` yok.
|
||
3. Profil sonradan girilince mevcut `riskleriYenile` null riskleri doldurur (kod incelemesiyle göster; yeni kod yazma).
|
||
4. **Tüketici envanteri (rapora tablo):** profilsiz + dolu liste durumunda şu yüzeyler ne gösteriyor — çekmece (`liste-cekmecesi`), `secimlerim-paneli`, `/listem` (`listem-govde`), `kaydet-banner`, `manuel-harita` (null riski `az-riskli` sayıyor — `:33`, yanlış renk riski). Kırılan/yanıltan yer varsa **düzeltme, raporla** (Bilal kararı).
|
||
5. `SEMA`, `meraklisina-icerik.tsx`, kapı bileşeni, sihirbaz adımları **değişmez** (§1 tablosu: + kapısı şemada yok → senkron kuralı tetiklenmez; rapora bu cümle yazılır).
|
||
- **Kapsam dışı:** alt sayfa/satır içi genişleme, "Listende 1 program" mini çubuğu, kaydet banner eşiği, "Neden vazgeçtin?" sorusu, iOS + görünürlüğü, giriş duvarının yeri.
|
||
- **Risk:** tarayıcıda doğrulanamıyor; %93 mobilde toast'ın görünürlüğü ve profilsiz `/listem` Bilal'in gözüne kalıyor. K1'den ayrı dal olduğu için K1'in merge'ünü **bekletmez**.
|
||
|
||
### B1 · Blog: `universite-okurken-tekrar-yks` (tek yazı; 2. slot bilinçli boş)
|
||
- **Neden bu:** Dalga B'de ürün bağı en güçlü (okurken yeniden deneyen = 2027'nin ödeyen adayı) ve **kaynaklarının tamamı bu gece zaten açılıp okundu** (mezuna yazarının teyit tablosu): 2026-YKS Kılavuzu §4.2/§10 (kayıtlı olmak YKS'ye engel değil; aynı anda iki örgün program olmaz), ÖSYM SSS 49–52 (OBP), Kontenjan Kılavuzu §1.3, YÖK Ek Madde-1 uygulama ilkeleri, kayıt dondurmanın üniversite yönetmeliğine bağlı olduğu. "Bu gece teyit edilemeyecek konu seçme" kuralımı geçen tek aday.
|
||
- **Dal:** MEVCUT `gece/rehber-yazilari`'nın üstüne; yalnız `content/rehber/*.md`. **İki commit, sırası önemli:** (1) küçük düzeltmeler, (2) yeni yazı + ona verilen iç linkler **aynı commit'te ve en tepede** (`dynamicParams=false` → Bilal yazıyı almazsa `~1` ile linkler de gitmiş olur, 404 kalmaz).
|
||
- **Commit 1 (düzeltmeler):** `hedef-siralama-nasil-belirlenir.md:83` "üründe dilimin adı da böyle geçer" yan cümlesi silinir (H2 kararından bağımsız doğru kalsın) · `taban-siralamalar-nasil-degisir.md` şema + `%% aria` + gövdede ürün verisine atıf yapan "dört yıl / son 4 yıl" → "beş yıl (2021–2025)" (genel okuma tavsiyesi olan "son 3–4 yıla bak" cümleleri kalır).
|
||
- **Commit 2 (yazı):** ilk turdaki ortak yazar kuralları aynen (1 `flowchart TD` + `%% aria` + `%% altyazi`, ≥1 tablo, ilk paragraf tek başına cevap, soru biçimli H2'ler, "Kaynaklar" + erişim tarihi; doğrulanamayan cümle **çıkarılır**; 2027'ye dair tarih yok; askerlik/tecil yok; harç/ücret rakamı yok; dilim adı ilk geçişte "güvenli (halk arasında 'garanti tercih')"). Tablo: kayıt dondurma · devam ederek hazırlanma · kayıt sildirme (hak / bedel / geri dönüş) — kayıt dondurma satırı "üniversitenin yönetmeliğine bak" der, genelleme yapmaz. **Kanibalizasyon sınırı:** `mezuna-kalmak-mi-kayit-olmak-mi` yeni yerleşenin kararını anlatıyor; bu yazı **hâlihazırda okuyan** öğrencinin sürecini (sınava giriş, tercih, yeni kayıt/ilişik kesme, Ek Madde-1 ve yatay geçiş alternatifleri) anlatır; OBP kuralını yeniden açıklamaz, `obp-nedir…` ve `mezuna-kalmak…`'a link verir. İç link alan yazılar (en fazla 3): `mezuna-kalmak…`, `yatay-gecis-cap-yandal`, `yerlesemedim-ne-yapmaliyim`. `tarih: 2026-09-22`.
|
||
- **Bilal onayı:** YMYL'ye yakın → "Kaynaklar"daki linkleri açıp kural cümlelerini teyit etmeden yayımlamasın; ÖSYM'deki asıl kılavuz PDF'i (10 MB sınırı yüzünden MEB kopyasından okunmuştu) §4.2 ve §10 gözle kontrol.
|
||
|
||
---
|
||
|
||
## 3. Bilal'in karar tablosu — EKLENENLER / DEĞİŞENLER (ilk turdaki 11 karara ek)
|
||
|
||
| # | Karar | Tavsiyem | Gerekçe | Gecikmenin maliyeti |
|
||
|---|---|---|---|---|
|
||
| **4 (DEĞİŞTİ)** | Danışman fiyat kıyası | **`52520ac`'yi alma.** İki yol: (a) Armut sayfasını 5 dk aç; aralık tutuyorsa `52520ac` + kaynak satırına URL ve erişim tarihi; (b) açmayacaksan/tutmuyorsa K2'nin **rakamsız** commit'ini al. Varsayılan tavsiyem **(b)** | Canlıdaki "2.000–10.000 TL / onda bir" de teyitsiz; (b) hiçbir doğrulama istemeden riski sıfırlar. Gerçek bir şirkete atıflı teyitsiz rakam, atıfsız olandan daha kötü | Düşük trafik ama site geneli meta description'da duruyor; her gün Google snippet'inde |
|
||
| **2 (GÜNCELLENDİ)** | Garanti→Güvenli | Hâlâ **evet**; ama kapsam ~35 dosya (src 13 + sözlük 2 + rehber 19 + `AGENTS.md`). Onay gelirse: tüm `gece/*` dalları merge edildikten **sonra** tek PR, iki commit (src+AGENTS.md / content). Onayla birlikte iki küçük karar daha ver: **(i)** satır başlığı "Güvenli · Güvenli" olmasın → risk etiketi yalnız dilimin varsayılanından farklıysa görünsün; **(ii)** sihirbaz çipi "İş garantisi" → "İş bulma kolaylığı" | 10 §A: etiket 5 ayrı yerde; LLM'e ham `garanti` anahtarı gidiyor, serbest metne geri sızıyor (prompt sözlüğü aynı PR'da) | Şimdi düşük; bu gece yazılan her metin karardan bağımsız yazıldı ama her yeni içerik eski sözlükle birikiyor |
|
||
| 12 | İlk + profilsiz ziyaretçide **anında eklesin mi?** (K4 prototipi) | **Evet** — telefonda 10 dk bak: bir üniversite sayfasında + → toast görünüyor mu, çekmece/`/listem` profilsiz listeyle düzgün mü, "Sıralamamı gir" doğrudan sıra adımını açıyor mu. Düzgünse K1 ile **aynı gün** canlıya | 77/82 kapıdan dönüyor; önce-iste-sonra-ver düzeni %6 ile ölçülmüş durumda. Sezon dışında etkisi okunabilecek tek değişiklik | **Hafta bazında:** 28 Eyl'de çıkarsa Huni C en erken 2 Kasım'da okunur; her hafta gecikme o tarihi bir hafta iter |
|
||
| 13 | K1 canlıya çıkış tarihinin kaydı | Deploy gününü `SABAH-OZETI`/not defterine yaz; Rybbit'te o tarihten önceki `program_eklendi` = "+ tıklaması", sonrası = "gerçek ekleme" | Seriler karşılaştırılamaz; tarih yazılmazsa 2027'de kimse hatırlamaz | Sıfır efor, unutulursa kalıcı veri kirliliği |
|
||
| 14 | Katalog CTA'sı tablonun **üstüne** (ilk ekrana) taşınsın mı? | **Şimdi hayır.** Büyük kart mobilde Google'dan gelinen tabloyu aşağı iter. Önce K4'ün sonucunu gör; asıl çözüm profil varken katalog satırında risk seviyesini göstermek ("bu programa sıralamam yeter mi?"nin dürüst cevabı) — tasarımını sen yap, sonraki vardiya uygular | Form kaynaklı sıra girişi 6, kapı kaynaklı 18: kullanıcı forma değil satıra dokunuyor | Düşük; K4 sonucundan önce karar vermek kör atış |
|
||
| 15 | "son 5 yıl" mı "son 5 yıla kadar" mı? (08 #10) | **"son 5 yıl" kalsın** | Programların ~%45'inde 5'ten az yıl var ama trend cümlesi her programda gerçek yıl aralığını ("2023-2025 arasında…") zaten yazıyor; eski "4 yıl" da aynı ölçüde yaklaşıktı | ~0 |
|
||
| 16 | Nitel araştırma: haftalık oturum okuması + 5 kişilik mobil kullanılabilirlik testi; session replay | Oturum okuması **evet** (haftada 30 dk, ~8 + oturumu tek tek okunabilir). 5 kişilik test **evet**, Ekim'de, K4 canlıdayken. Session replay **hayır** — Ekim'deki hukuki gözden geçirmeye (karar #10) ekle | Oranlar Ocak 2027'ye kadar okunamıyor; %6'nın *nedeni* analitikten çıkmaz | Düşük; ama tek öğrenme kanalımız bu |
|
||
| 17 | Deploy sonrası prod'da `pnpm tadimlik` (+ yeni prompt'la `--force`) | **Evet, ama artık acil değil** — K2 okuma anında filtrelediği için sızıntı kod tarafında kapanıyor; yeniden üretim filtreye takılıp gizlenen tadımlıkları geri getirir | Bellek notundaki bekleyen prod koşusuyla aynı iş | Filtreye takılan anahtarlarda tadımlık görünmez (K2 raporu kaçını söyleyecek) |
|
||
|
||
Diğer ilk tur kararları (#1, #3, #5–#11) **değişmedi**; #1'in yerini §4 alıyor.
|
||
|
||
---
|
||
|
||
## 4. Bilal için güncel merge sırası
|
||
|
||
Denetçinin sırasını **kabul ediyorum**, üç değişiklikle: (i) P3 artık `cae2aaa` değil **P3b** üzerinden alınır, (ii) P2'den hemen sonra **P5** gelir, (iii) P7 ve P6 eklenir. Yeni dallar Tur 2 denetiminden geçmeden bu liste geçerli sayılmaz.
|
||
|
||
1. **`gece/rehber-yazilari` + `gece/p1-rehber-altyapi`** birlikte. Önce osym.gov.tr'de ek yerleştirme sonuç tarihine bak (açıklandıysa yazıyı güncelle). B1'i henüz teyit etmediysen `gece/rehber-yazilari~1`. `tarih`/`guncelleme` alanlarını gerçek yayın gününe çek (`grep -l "^guncelleme:" content/rehber/*.md`). **Takvime bağlı tek iş bu — Çarşamba'yı geçmesin.**
|
||
2. **`gece/p2-olcum`** ilk üç commit (`git merge gece/p2-olcum~1`); `c055e82` karar #8'e göre.
|
||
3. **`gece/p5-kapi-olcum`** (P2~1'i zaten içerir). Karar #12 "evet" ise onun yerine doğrudan **`gece/p6-arti-aninda-ekle`** (P5'i içerir) — ikisi aynı deploy'da çıksın, seri bir kez kırılsın. P6'yı bekleyip P5'i **geciktirme**. Deploy tarihini yaz (karar #13).
|
||
4. **`gece/p3b-tadimlik-dili~1`** (= `16c4508` + `cae2aaa` + tadımlık düzeltmesi) → istenirse `git cherry-pick 9d450c5` (YÖK logosu) → fiyat için **ya** P3b'nin tepe commit'i (rakamsız) **ya** teyit edilmiş `52520ac`; ikisi birlikte değil. `gece/p3-vaat-dili` dalını doğrudan merge **etme**.
|
||
5. **`gece/p7-katalog`** (P2~1 gerekir; metni beğenmezsen `~1` = yalnız sayfalama). Deploy sonrası Search Console'da 2–3 derin sayfa için "dizine ekleme iste".
|
||
6. **`gece/p4-eposta`** en son: P2 merge edilmiş olmalı (60 sn sayaç), lokal docker testi (07-P4 adımları), Gitea'da `RESEND_API_KEY` + `EMAIL_FROM` secret'larının **dolu** olduğunun teyidi; `ea3ba5f` + `RYBBIT_*` secret'ları karar sonrası.
|
||
7. Her push öncesi AGENTS.md kuralı: birleşik HEAD **temiz worktree'de** `pnpm build` (VPS'te ~2 GB boş RAM — bellek notu).
|
||
|
||
---
|
||
|
||
## 5. Reddedilen / ertelenenler
|
||
|
||
| Öneri | Karar | Neden |
|
||
|---|---|---|
|
||
| (f) Tek `DILIM_ETIKET` sözlüğü refaktörü | Ertele → H2 PR'ının ilk adımı | `rapor.ts` ve `risk.ts`'te P3/K2 ile çakışır; "Güvenli · Güvenli" gösterim kararı olmadan yarım kalır; etiket değişmeden kullanıcıya görünen faydası sıfır. Karar gelirse tüm dallar merge edildikten sonra tek PR |
|
||
| Sayfalamada canonical → 1. sayfa / `noindex` | **Kalıcı ret** (erteleme değil) | Derin sayfanın 50 satırı 1. sayfada yok; program detay sayfası yok; programların ~%53'ü için tek keşif yolu. İlk turdaki "GSC verisini bekle" şartım K3 için geçersiz (canonical'a dokunmuyor); GSC yalnız etkiyi ölçmek için |
|
||
| Marka V1/V2/V3 köprü cümleleri **olduğu gibi** | Ret; V1 uyarlanarak alındı | Üçü de katalog tablosunda olmayan satır bazlı risk/sıralama özelliğini vaat ediyor (§1 tablosu) |
|
||
| Blog `kyk-burs-kredi-basvurusu` | Ertele → en geç 29 Eylül haftasındaki vardiya, **koşullu** | Ürün bağı zayıf; 2026-27 tarih ve tutarı açıklanmamış; tarih sorgusuna haber siteleri hâkim. Evergreen "burs mu kredi mi" kısmı GSB/mevzuat kaynağından teyit edilebilirse o vardiyada yazılır; Bilal'in bu hafta zaten 4 YMYL yazı teyit edecek |
|
||
| Blog `ikinci-universite-acikogretim` | Ret (bu sezon) | "Açıköğretim OBP istisnası" 2026 belgelerinin hiçbirinde bulunamadı (07); yazının en çok aranan sorusuna resmî dayanakla cevap veremiyoruz; ürün bağı zayıf |
|
||
| P1 düşükleri: `<figcaption>` konumu (08 #9), takvim geçerlilik kontrolü (08 #11) | Backlog (4 paket sınırı) | Merge'i engellemiyor; düzeltme belli: `<details>`'i figcaption'dan önce al; `TARIH_BICIMI`'ne `Date.UTC` gün-ay kontrolü. Sonraki vardiyada `gece/p1-rehber-altyapi` üstüne tek commit |
|
||
| `cta_form_goruntulendi` hydration koruması (08 #5) | İzle | OLASI ve nadir; tarayıcısız körlemesine düzeltme çalışan hook'u bozabilir; Huni A zaten Ocak 2027'ye kadar okunmayacak |
|
||
| CTA'yı tablonun üstüne taşıma, alt sayfa (bottom sheet), satır içi tek soruluk köprü, "Listende 1 program" mini çubuğu, kaydet teklifini 1. programa çekme, "Neden vazgeçtin?" sorusu | Ertele → K4 sonucu + Bilal'in tasarım gözü | Hepsi yeni UI elemanı; AGENTS.md tek-kaynak kuralları ve mobil görünüm tarayıcısız doğrulanamaz. K4 en dar ve en büyük etkili dilim |
|
||
| iOS Safari'de + oranının Android'in yarısı olması | İzle | Kanıt yalnız oran farkı; neden bilinmiyor → 5 kişilik testte bir iOS kullanıcısı |
|
||
| Trend cümlesinin ilk–son yıl kıyası (Ege Tıp: 4 yıl düz, cümle "çıktı" diyor) | Backlog, ürün kararı | Deterministik rapor davranışını değiştirir; `/meraklisina` "gerçek sıralama geçmişinden hesaplanır" cümlesi doğru kalır ama yöntem tartışılmalı (ör. son 3 yıl medyanı). K2 yalnız dili düzeltiyor |
|
||
| `/sonuc` tablosunda risk yalnız renkli nokta (`aria-hidden`, metin yok) | Bilal'e not | Ürünün "renk tek başına anlam taşımaz" kuralıyla gergin; dilim sekmesi bağlam veriyor ama satırda metin yok. Garanti→Güvenli PR'ında birlikte ele alınabilir |
|
||
| Eski kayıtlarda `isim`'de "(İngilizce)"/kampüs ekinin kayıp olması (07 blog-3 yan bulgu) | Sonraki vardiya: önce **say** | Katalog trafiğin %97'si; aynı üniversitede ayırt edilemeyen satır kaç tane, bilinmiyor. Salt-okunur sorguyla boyutu çıkar, sonra karar |
|
||
| `giris_basarili` sunucu olayının UA/IP'si (08 #7), Gmail `+etiket` soğuma deliği (08 #8) | Bilal deploy sonrası bakar / kabul | Denetçinin önerisiyle aynı |
|
||
| İlk turda ertelenen her şey (T4 küme alanı, FAQPage, llms.txt, IndexNow, `/hakkinda`, anket, sosyal kanal, disposable filtre, ChunkLoadError…) | Değişmedi | Yeni kanıt yok |
|
||
|
||
---
|
||
|
||
## 6. Bilal'in bu haftası (22–28 Eylül) — 5 öncelik
|
||
|
||
1. **Pazartesi–Çarşamba: `ek-yerlestirme-sonuclari-ve-kayit` + P1'i yayına al** (§4-1). ÖSYM sonucu açıkladıktan sonra yayımlanırsa yazının varlık nedeni biter. Aynı oturumda diğer yazıların "Kaynaklar" linklerini aç, kural cümlelerini teyit et; yayımladıklarını Search Console'dan elle gönder.
|
||
2. **+ kapısı: telefonda 10 dk K4'e bak, karar ver (#12); P2 → P5/P6'yı aynı gün canlıya al, tarihi yaz (#13).** Takvime "2 Kasım: Huni C'ye bak (≥37 + oturumu biriktiyse)" ve "11 Ocak 2027'den önce CTA formu oranına bakma" notlarını koy. Bu haftadan itibaren haftada 30 dk + oturumlarını tek tek oku.
|
||
3. **Vaat dili paketini kapat:** P3b'yi al, fiyat için (a)/(b)'den birini seç (#4), YÖK logosu kararını ver (#3), P7'yi al; deploy sonrası prod'da `pnpm tadimlik` (#17).
|
||
4. **1 saatlik elle işler + P4:** DMARC/SPF, magic link tıklama testi, Gitea secret'larının varlığı (`RESEND_API_KEY`, `EMAIL_FROM`; yeni `RYBBIT_*`, `EMAIL_REPLY_TO`), `destek@` kutusunun açık olduğu, şema fontu lisansı → sonra lokal docker testiyle P4'ü merge et.
|
||
5. **Ajanların önünü açan iki şey (ilk turdan beri en büyük kilit):** ÖSYM 2026 yerleştirme tablolarını `data/kaynak/2026/`'ya indir + Search Console dışa aktarımları; ve **Garanti→Güvenli'ye evet/hayır** (#2, iki alt kararla) — evet ise sonraki vardiya 35 dosyalık PR'ı, merge edilmiş `main` üstünde tek seferde yapar.
|