# 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ü `

` 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"); `` ~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.