Files
kolaytercih/docs/gece-vardiyasi/2026-09-22/34-yazilimci-g3.md
bilalgursen 2b350d0c5d content(rehber): gece vardiyasının 14 yeni yazısı + 2 düzeltme, ekip raporları ve kurallar
14 yeni rehber yazısı (hepsi editör denetiminden geçti, 46 yazıda 829 iç link
tarandı, 0 kırık hedef; 180+ DB rakamı yazıların kendi filtreleriyle yeniden
koşuldu):

  taban-siralamalari-alti-yilda-nasil-degisti · kac-net-ile-hangi-bolum ·
  siralama-bandlari-hangi-kapilar-acilir · ayni-bolum-farkli-universite-siralama-farki ·
  hangi-bolumlerin-kontenjani-azaldi · yeni-acilan-bolumler-nasil-degerlendirilir ·
  bilgisayar-mi-yazilim-muhendisligi-mi · kktc-universiteleri-okunur-mu ·
  yapay-zekaya-tercih-sordum-guvenilir-mi · ek-madde-1-puanim-yetiyor-mu ·
  universitede-ilk-hafta-ders-kaydi-muafiyet-kayit-dondurma · yks-2027-takvimi ·
  rehber-ogretmenler-icin-veri-kaynaklari · bolumumu-sevmedim-hangi-kapilar-var

İki canlı yazı düzeltildi:
- veliler-icin-tercih-rehberi: veli diliyle kapanış; altındaki "sıralamanı gir"
  kutusu artık veliye ölü uç değil
- bos-kontenjanlar-ne-anlatiyor: "birkaç yüz kişilik fark" aslında ~9 bin
  (ÖSYM 265.356 ↔ bizim 256.532); payda açıklaması tersti — ek kontenjan
  paydaya girseydi oran düşerdi. guncelleme alanı eklendi (sitemap lastmod).

Kurallar (AGENTS.md):
- Yayın sonrası arama motoru bildirimi: URL denetimi yalnız canlıda 200 dönen
  adrese; kota sayacı; mülk/hesap notu; sitemap grep kuralı
- Yıkıcı git komutları yasak: reset/checkout --/restore/clean/stash
- Tarayıcı açma: tasarımcı ve UX gerekli gördüğünde açabilir (yetenek için
  .claude/agents/tasarimci.md'ye tarayıcı araçları eklendi)

docs/gece-vardiyasi/2026-09-22/ — 34 rapor: CEO kararları ve kapanış turu,
marka/ödeme analizi, sıfır ödeme teşhisi, SEO konu planı, veri kalitesi,
editör denetimi, CTO şartnamesi, yazılımcı ve güvenlik raporları, SABAH-OZETI.

docs/ekip/YAYIN-KUYRUGU.md — Search Console bildirim kuyruğu.

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

122 lines
11 KiB
Markdown
Raw Permalink 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.
# 34 — Yazılımcı G3 · `odeme/paket-vaadi` (paketliden liste/revizyon kredisi düşmez)
> Rol: `yazilimci` · Gece vardiyası, 22 Eylül 2026 sabah turu · Şartname: `28-cto-sartname.md` §G3 + `31-guvenlik-satici-kimligi.md` §2
> Dal: **`odeme/paket-vaadi`** · Taban: **`9bd448b`** (`main`) · Çalışma yeri: ana çalışma ağacı (`/Users/bilalgursen/Desktop/kolaytercih`)
> İşaret: **[D]** komut çalıştırılarak doğrulandı · **[Ç]** koddan çıkarım (koşturulmadı)
---
## Özet (5 madde)
1. **Tek `maliyet = user.hasPaket ? 0 : RAPOR_KREDI` değişkeni CTO'nun saydığı altı satırı birden kapattı** — iki harcama (`amount`), iki iade (`delta`), iki dönen bakiye (`kredi:`). `spendCredits`/`grantCredits` çağrılarının hiçbiri kaldırılmadı. [D]
2. **İade dalı koşullandı** — güvenlik ajanının "sızıntı garanti" dediği yol (`listeRevize` `hasPaket` kapısının arkasında + `revisionCount` yalnız başarıda artıyor + taze `requestId`) kapandı: paketlinin başarısız denemesi artık `delta: 0` yazıyor, bedava kredi üretmiyor.
3. **Arayüz sunucuyla aynı şeyi söylüyor** — `raporKredi` paketliye 0 iner, modal tek `ucretsiz` bayrağıyla üç kredi cümlesini değiştirir; `krediYeter`/`KrediYetersiz` mantığına dokunulmadı.
4. **Doğrulama üçlüsü temiz:** `next typegen` ✓, `tsc --noEmit` çıkış 0 ve **hiç çıktı yok**, `pnpm lint` çıkış 0 ve **hiç bulgu yok**. Şartnamedeki 6 kabul grep'i tek tek koşuldu, hepsi beklenen değeri verdi. [D]
5. **Kapsam tam olarak 3 dosya.** `git diff --name-only HEAD~2 HEAD` yalnız G3'ün üç dosyasını listeliyor; `credits.ts`, `liste-uretici.tsx`, `huni-semasi.tsx` ve çalışma ağacındaki başkalarına ait commit'lenmemiş dosyalar (`AGENTS.md`, `docs/ekip/KARARLAR.md`, `content/rehber/**`) **el değmemiş** — hâlâ `M`/`??` durumunda duruyorlar. [D]
---
## Dal ve commit'ler
`git checkout -b odeme/paket-vaadi main` ile `9bd448b` tabanından açıldı (önceki dal `funnel/sonuc-ilk-ekran` — G1'in dalı; ona dokunulmadı, commit alınmadı).
| SHA | Mesaj | Dosya |
|---|---|---|
| `4acfd27` | `fix(kredi): paketliden liste ve revizyon kredisi düşmez` | `src/features/rapor/rapor-actions.ts` |
| `43b6cec` | `fix(listem): fark modalı paketliye kredi bedeli göstermez` | `src/features/rapor/components/listem-icerik.tsx`, `src/features/rapor/components/tercih-degisti-modali.tsx` |
`[Bilal]` commit'i yok (şartname öyle diyor: paket içeriği kararı CEO'da verilmişti).
Push yok, merge yok, `main`'e commit yok. Yıkıcı git komutu (`reset`/`checkout --`/`restore`/`clean`/`stash`) **hiç çalıştırılmadı**; dosyalar yola tek tek verilerek eklendi (`git add -A` kullanılmadı).
### Dokunulan satırlar
**`rapor-actions.ts`** (satır numaraları değişiklik sonrası):
- `:158` yeni `const maliyet = user.hasPaket ? 0 : RAPOR_KREDI;` (+ 6 satırlık gerekçe yorumu) — `listeOlusturKilitli`
- `:163` `amount: maliyet` · `:225` `delta: maliyet` (iade) · `:254` `kredi: user.creditBalance - maliyet`
- `:300` ikinci `const maliyet = …` (+ yorum: kapı yüzünden burada daima 0, kapı gevşerse davranış bozulmasın) — `listeRevize`
- `:304` `amount: maliyet` · `:360` `delta: maliyet` · `:382` `kredi: user.creditBalance - maliyet`
- **Değişmeyen:** `:173` ve `:314` hata metinlerindeki `${RAPOR_KREDI} kredi gerekli` (bu dallara yalnız `maliyet > 0` iken erişilir), `krediBittiIsaretle`, `uretimKilidiAl/Birak`, `reports` yazımı, maskeleme dalları, `refId` zinciri.
**`listem-icerik.tsx:167`** — `raporKredi={RAPOR_KREDI}` → `raporKredi={/* yorum */ user.hasPaket ? 0 : RAPOR_KREDI}`. (`=== true` **yazılmadı**; SQLite 0/1 temsili ile de doğru çalışır — şartname Risk #1.)
**`tercih-degisti-modali.tsx`** — `:135` `const ucretsiz = raporKredi === 0;`; `:193` açıklama ("…güncelleme paketine dâhil, kredi düşmez."); `:263` "Güncelleme N kredi; bakiyen …" satırına `!ucretsiz` koşulu; `:290` buton metni ücretsizken "Listemi güncelle" (ok ikonu deseni aynen: metin sonunda `<ArrowRight className="size-4" aria-hidden />`). Ayrıca dosyanın tepesindeki "3 kredi" diyen eskimiş davranış yorumu güncellendi — o yorum dosyanın davranış belgesi.
---
## Doğrulama komutları ve çıktıları
```
$ pnpm exec next typegen
Generating route types...
✓ Types generated successfully
$ pnpm exec tsc --noEmit
(çıktı yok) TSC_EXIT=0
$ pnpm lint
> kolaytercih@0.1.0 lint
> eslint
(bulgu yok) LINT_EXIT=0
```
`pnpm install` ve `pnpm build` **koşulmadı** (disk kısıtı, orkestratör talimatı). Dev sunucusu açılmadı, tarayıcıda doğrulama yapılmadı.
---
## Kabul kriterleri (şartname §G3)
| # | Kriter | Sonuç | Nasıl doğrulandı |
|---|---|:--:|---|
| 1 | `grep -c "spendCredits(" rapor-actions.ts` = 2 | ✔ | **2** [D] |
| 1 | `grep -c "grantCredits(" rapor-actions.ts` = 2 | ✔ | **2** [D] |
| 2 | `grep -c "hasPaket ? 0 : RAPOR_KREDI"` = 2 | ✔ | **2** [D] |
| 2 | `amount: maliyet\|delta: maliyet` → 4 satır | ✔ | `163, 225, 304, 360` [D] |
| 2 | `delta: RAPOR_KREDI\|amount: RAPOR_KREDI` = 0 | ✔ | **0** [D] |
| 2 | `creditBalance - RAPOR_KREDI` = 0 | ✔ | **0** [D] |
| 3 | `refId: requestId\|refId: input.requestId` → 4 satır | ✔ | `165, 227, 306, 362` — zincir değişmedi [D] |
| 4 | `listem-icerik.tsx` `raporKredi={…}` koşullu | ✔ | `:167` `user.hasPaket ? 0 : RAPOR_KREDI` [D] |
| 4 | `grep -c "ucretsiz"` ≥ 3 | ✔ | **4** (`135, 193, 263, 290`) [D] |
| 5 | `grep -rn "danışman sorusu" src/` — hardcoded 60 yok | ✔ | Arayüzdeki üç sonuç (`app/page.tsx:201`, `listem-govde.tsx:345`, `paket-satinal.tsx:40`) **hâlâ `URUNLER.paket.credits` / `paketKredi` interpolasyonu**; sayı hiçbirinde sabit değil. Toplam eşleşme 5'e çıktı çünkü iki yeni eşleşme benim yazdığım **kod yorumu** (`rapor-actions.ts:153`, `tercih-degisti-modali.tsx:14`) — metin değil [D] |
| 6 | Kapsam dışı dosyalar el değmemiş | ✔ | `git diff --name-only HEAD~2 HEAD` = tam olarak 3 dosya; `credits.ts` / `liste-uretici.tsx` / `huni-semasi.tsx` **yok** [D] |
| — | `typegen && tsc --noEmit && lint` | ✔ | Yukarıdaki çıktılar [D] |
**Not — kriter 6'nın yazımı:** şartnamedeki `git diff --name-only HEAD~2` (HEAD yazılmadan) çalışma ağacını da kapsadığı için başkalarının commit'lenmemiş dosyalarını (`AGENTS.md`, `KARARLAR.md`, veli yazısı) listeliyor. Commit kapsamını gösteren doğru biçim `git diff --name-only HEAD~2 HEAD`; ikisi de koşuldu, ikinci biçim 3 dosya veriyor.
---
## Güvenlik ajanının üç koşulu — kodda nerede karşılandı
| Koşul (`31-guvenlik-satici-kimligi.md` §2) | Karşılandığı yer |
|---|---|
| **1.** İade dalı aynı koşula bağlansın; `grantCredits` çağrısı ve `refund` satırı **kaldırılmasın** | `rapor-actions.ts:223-228` (`listeOlustur` iadesi, `delta: maliyet`) ve `:358-363` (`listeRevize` iadesi, `delta: maliyet`). İki çağrı da yerinde, `refId` aynı; DUPLICATE dalındaki "önceki deneme iade edilmişti" sorgusu (`:179-192` ve `:320-333`) değişmedi |
| **2.** Dönen bakiye de koşullansın (`:243`, `:363`) | `rapor-actions.ts:254` ve `:382` → `kredi: user.creditBalance - maliyet` |
| **3.** `hasPaket` **tek yerden**, zaten okunmuş `user` nesnesinden okunsun; ikinci DB okuması eklenmesin | `rapor-actions.ts:158` (`listeOlusturKilitli`'ye parametre olarak gelen `user`) ve `:300` (`listeRevize`'de `getCurrentUser()` ile bir kez okunan `user`). Yeni sorgu/okuma eklenmedi; harcama ile iade aynı fonksiyon kapsamındaki **aynı** `maliyet` sabitini kullanıyor |
Ek olarak şartnamenin "çağrı kaldırılmaz" kısıtı korundu: `credit_ledger`'daki `uniqueIndex("ledger_reason_ref").on(reason, refId)` (`src/lib/appdb/schema.ts:133`) çapası aynen yerinde, paketliye `delta = 0` satır yazılıyor ve aynı `requestId` ikinci kez `DUPLICATE` dönüyor [Ç — DB ile koşturulmadı, QA'nın duman testine kaldı].
---
## Şartnameden sapmalar
1. **`tercih-degisti-modali.tsx`'in dosya başı yorumu da güncellendi** (şartname 129/188/250/275 satırlarını sayıyordu). Gerekçe: o yorum "yeniden kurulum … 3 kredi" diyerek artık yanlış olan bir davranışı belgeliyordu; AGENTS.md'nin "belge dekor değildir" prensibiyle aynı commit'te düzeltildi. Davranışa etkisi yok.
2. **`:250` satırına `!ucretsiz` koşulu eklendi.** Şartname "ücretsizse bu satır gösterilmez" diyordu; `raporKredi = 0` iken `krediYeter` zaten daima doğru olduğu için satır teknik olarak **zaten** render edilmiyordu [Ç]. Koşul niyeti açık etmek ve `krediYeter` hesabı ileride değişirse cümlenin sızmaması için yine de yazıldı.
3. **`:129 krediYeter` değiştirilmedi** (şartname de dokunulmamasını istiyordu) — yalnız altına türetilmiş `ucretsiz` bayrağı eklendi.
4. Başka sapma yok; `huni-semasi.tsx`'e dokunulmadı (CTO doğrulaması: G3 sihirbaz/liste mimarisini değiştirmiyor), paket adına (A2) dokunulmadı, `credits.ts`/`liste-uretici.tsx` açılmadı bile.
---
## Merge sonrası doğrulanması gerekenler (QA / `guvenlik-uyum`)
1. **Oturumlu duman testi (paketli kullanıcı):** liste üretimi sonrası `user.credit_balance` **değişmiyor**, `credit_ledger`'a `reason='report_generate', delta=0` satırı yazılıyor; ekranda görünen bakiye de düşmüyor. Aynısı revizyonda (`reason='report_revision'`).
2. **Başarısız üretim (paketli):** yapay zekâ hatası tetiklenince `reason='refund', delta=0` satırı yazılıyor ve bakiye **artmıyor** — güvenlik ajanının B2 sızıntısının kapandığının tek gerçek kanıtı budur.
3. **Idempotency:** aynı `requestId` ile ikinci üretim `DUPLICATE` yoluna giriyor; iade satırı varsa "tekrar dener misin", yoksa `SURUYOR`. `spendCredits`'in `amount: 0` ile `rowsAffected = 1` döndürmesi (yani `INSUFFICIENT` **dönmemesi**) SQLite'ta fiilen teyit edilmeli — şartnamede de [Ç] işaretliydi, ben de koşturmadım.
4. **Paketsiz kullanıcıda davranış bit-bit aynı:** 3 kredi düşer, yetersizse `KREDI` + `krediBittiIsaretle`, modal eski metinleri gösterir.
5. **Bilinen ve kapsam dışı bırakılan tutarsızlıklar:** `liste-uretici.tsx:263-285`'teki `hasPaket` "kredi yetersiz/+30 kredi yükle" dalı liste üretimi için artık ölü kod (Bilal'in dosyası → dokunulmadı, backlog #B2); `kredi-hatirlatma.ts:36` + `eposta.ts:188` paketliye yanlış metin gönderebilir (G3 öncesinden var, backlog #B3).
6. Para yüzeyine dokunuldu → **`guvenlik-uyum` denetimi merge öncesi zorunlu** (şartname de öyle diyor; bu dal için §2'deki üç koşul karşılandı, denetimin işi doğrulamak).
---
## Bilal'den istenen
1. **Yok** — G3 tamamlandı, `[Bilal]` kararı gerektiren bir satır çıkmadı. Merge kararı sabahki entegrasyon turunda.