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>
11 KiB
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)
- Tek
maliyet = user.hasPaket ? 0 : RAPOR_KREDIdeğ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] - İade dalı koşullandı — güvenlik ajanının "sızıntı garanti" dediği yol (
listeRevizehasPaketkapısının arkasında +revisionCountyalnız başarıda artıyor + tazerequestId) kapandı: paketlinin başarısız denemesi artıkdelta: 0yazıyor, bedava kredi üretmiyor. - Arayüz sunucuyla aynı şeyi söylüyor —
raporKredipaketliye 0 iner, modal tekucretsizbayrağıyla üç kredi cümlesini değiştirir;krediYeter/KrediYetersizmantığına dokunulmadı. - 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] - Kapsam tam olarak 3 dosya.
git diff --name-only HEAD~2 HEADyalnız G3'ün üç dosyasını listeliyor;credits.ts,liste-uretici.tsx,huni-semasi.tsxve ç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ı):
:158yeniconst maliyet = user.hasPaket ? 0 : RAPOR_KREDI;(+ 6 satırlık gerekçe yorumu) —listeOlusturKilitli:163amount: maliyet·:225delta: maliyet(iade) ·:254kredi: user.creditBalance - maliyet:300ikinciconst maliyet = …(+ yorum: kapı yüzünden burada daima 0, kapı gevşerse davranış bozulmasın) —listeRevize:304amount: maliyet·:360delta: maliyet·:382kredi: user.creditBalance - maliyet- Değişmeyen:
:173ve:314hata metinlerindeki${RAPOR_KREDI} kredi gerekli(bu dallara yalnızmaliyet > 0iken erişilir),krediBittiIsaretle,uretimKilidiAl/Birak,reportsyazımı, maskeleme dalları,refIdzinciri.
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
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.:250satırına!ucretsizkoşulu eklendi. Şartname "ücretsizse bu satır gösterilmez" diyordu;raporKredi = 0ikenkrediYeterzaten daima doğru olduğu için satır teknik olarak zaten render edilmiyordu [Ç]. Koşul niyeti açık etmek vekrediYeterhesabı ileride değişirse cümlenin sızmaması için yine de yazıldı.:129 krediYeterdeğiştirilmedi (şartname de dokunulmamasını istiyordu) — yalnız altına türetilmişucretsizbayrağı eklendi.- 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.tsxaçılmadı bile.
Merge sonrası doğrulanması gerekenler (QA / guvenlik-uyum)
- Oturumlu duman testi (paketli kullanıcı): liste üretimi sonrası
user.credit_balancedeğişmiyor,credit_ledger'areason='report_generate', delta=0satırı yazılıyor; ekranda görünen bakiye de düşmüyor. Aynısı revizyonda (reason='report_revision'). - Başarısız üretim (paketli): yapay zekâ hatası tetiklenince
reason='refund', delta=0satı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. - Idempotency: aynı
requestIdile ikinci üretimDUPLICATEyoluna giriyor; iade satırı varsa "tekrar dener misin", yoksaSURUYOR.spendCredits'inamount: 0ilerowsAffected = 1döndürmesi (yaniINSUFFICIENTdönmemesi) SQLite'ta fiilen teyit edilmeli — şartnamede de [Ç] işaretliydi, ben de koşturmadım. - Paketsiz kullanıcıda davranış bit-bit aynı: 3 kredi düşer, yetersizse
KREDI+krediBittiIsaretle, modal eski metinleri gösterir. - Bilinen ve kapsam dışı bırakılan tutarsızlıklar:
liste-uretici.tsx:263-285'tekihasPaket"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:188paketliye yanlış metin gönderebilir (G3 öncesinden var, backlog #B3). - Para yüzeyine dokunuldu →
guvenlik-uyumdenetimi 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
- Yok — G3 tamamlandı,
[Bilal]kararı gerektiren bir satır çıkmadı. Merge kararı sabahki entegrasyon turunda.