# Review — EGT-225 implementasyon, ikinci tur (`f34c3693` + `b4aaa394` + `403e35e3`) — 2026-10-21

> **Review type:** impl-re-review
> **Previous review:** `docs/reviews/review-egitim-belgesi-impl-2026-10-21.md` (heyet 841, REJECTED, 6 bulgu)
> **Upstream document(s) read:** `docs/plans/egitim-belgesi-plan.md` v1.2 (tamamı), `design/52 Egitim Belgesi.dc.html` (tamamı — önceki turda baştan sona okundu, bu turda yalnız değişen satırlar yeniden doğrulandı)
> **Other cross-referenced documents:** `proje-haritasi.md` EGT-225 durum satırı (güncel), `docs/reviews/tasarim-52-kapsama.md` (güncel karar tablosu), `docs/infra/ortamlar.md`; üç commit'in tam diff'i
> **Stage locks in effect:** Spec + Plan locked; tasarım 52 bağlayıcı

**Bağımsız doğrulama (bu turda, kendim çalıştırdım):**
- `pest --group=backoffice --filter="CertificateTemplateTest"` → **9/9 geçti**.
- `pest --group=omurga-rls --filter="CertificateNumberRaceTest"` → **2/2 geçti**.
- `npx playwright test training-certificate.spec.js --project=375 --project=1440` → **4/4 geçti**.
- TeamCity full run bu incelemede tetiklendi: **Build #1837 SUCCESS — 2797 test** (önceki yeşil #1836'dan +3; tam olarak bu turda eklenen üç testle örtüşüyor — kanıt tutarlı).

---

## Upstream Coverage Matrix (sıfırdan üretildi)

| Upstream madde / önceki bulgu | Durum | Kanıt |
|---|---|---|
| F-1 (a,b,d,e,g) — plan sapmaları | ✓ | `proje-haritasi.md` EGT-225 satırı: «Sets 21.10.2026'da (a), (b), (d), (e), (g)'yi onayladı (heyet 841 F-1)» — metin doğrulandı, sapmaların teknik içeriği bu turda değişmedi (önceki turda kodda zaten doğrulanmıştı) |
| F-2 — tasarım 52 kapsama 4 ⚠ satırı | ✓ | `tasarim-52-kapsama.md` diff: «Kapanmamış satırlar» tablosu kaldırıldı, yerine «Hepsi kapandı — Sets, 21.10.2026 («böyle kalsın»)» + 10/12/32/38 için gerekçeli karar satırları |
| F-3 — eşzamanlı numara testi | ✓ | `tests/Feature/OmurgaRls/CertificateNumberRaceTest.php` (yeni, 66 satır): ikinci bağlantı `lock_timeout` ile satır kilidine çarpıp hata veriyor, ilk commit olunca sıradaki numarayı alıyor; `DB::transactionLevel()===0` reddi de ayrıca test ediliyor; grup `OmurgaRls` dizin konvansiyonuyla `omurga-rls` etiketleniyor (`tests/Pest.php:44`) — **bu turda yerelde 2/2 çalıştırıldı** |
| F-4 — poppler yok dalı testi | ✓ | `CertificateTemplateTest.php:123-137`: `PdfRasterizer`'ın anonim alt sınıfı `available()`'ı `false` döndürüyor, `requireTools()` üzerinden gerçek `pdf_tools_missing` yoluna giriyor (stub değil, gerçek kod yolu); PNG yüklemenin etkilenmediği ayrıca assert ediliyor — **bu turda yerelde 9/9 çalıştırıldı** |
| F-5 — canlı poppler-utils | ✓ | `docs/infra/ortamlar.md` satırı: «**22.12.0** canlıda (Debian 12 paketi, 21.10.2026 kuruldu)» — altyapı ön koşulu tamam; kod deploy'u bu incelemeden sonra (süreç gereği, ticket kapanışı sırası) |
| F-6 — tarayıcıda ofis belgesi | ✓ | `training-certificate.spec.js` düzeltmesi (rota linkinin tam adres taşıdığı, path değil — küçük ve doğru düzeltme); dev'e Sets onayıyla eklenen örnek veri (tanım 33, eğitim 11, CEVA, belge `WNX2026000000001`) sayesinde `test.skip` dalına düşmüyor — **bu turda yerelde 4/4 çalıştırıldı** (375 + 1440 × 2 test) |
| Üç commit'in dışında yeni risk | ✓ | Diff'ler yalnız: `PdfRasterizer` sınıfının `final` işaretinin kaldırılması (test çift kalıtımı için, zararsız), iki test dosyası, iki döküman dosyası; üretim mantığında başka değişiklik yok — kırmızı çizgi taraması tekrarlandı, yeni ihlal yok |
| Daha önce ✓ olan B-1…B-14, veri modeli, görevler 1-5 | ✓ | Değişmedi — bu üç commit yalnız F-3/F-4/F-5/F-6 ve dökümantasyonu hedefledi, üretim kodunda regresyon yok |

Matriste ⚠/❌ satır yok.

---

## ✅ What works

- **Altı bulgunun hepsi gerçek ve iddia edilen kanıtlarla birebir örtüşüyor.** Üç testi de bizzat çalıştırdım (yerelde) — hepsi iddia edilen sayılarla geçti; TeamCity full run'ını bağımsız tetikledim, sayı artışı (2794→2797) beklenen üç yeni testle tam uyumlu, bu da raporun gerçek koşudan geldiğini doğruluyor.
- **F-4'ün test deseni gerçek kod yolunu sınıyor**, sahte bir stub değil: `requireTools()` zaten `available()`'a bakıyor, anonim alt sınıf yalnız onu değiştiriyor — `pages()`/`firstPageAsPng()`'a dokunmadan gerçek `PdfToolsMissing` istisnasını tetikliyor.
- **F-6'nın tarayıcı düzeltmesi küçük ve doğru:** satırın tuttuğu bağlantının `route()` ile üretilmiş tam adres olduğunu (yol parçası değil) fark edip `page.goto` çağrısını buna göre düzeltmiş.
- **Sets'in iki karar kaydı** (plan sapmaları ve tasarım kapsama satırları) doğru dosyalara, gerekçeli ve iz sürülebilir şekilde işlenmiş.

## ⚠️ Findings & Risks

Yok.

## ❓ Open Questions (bloklayıcı değil, taşınıyor)

1. Dev'e eklenen örnek sertifika verisi (tanım 33, eğitim 11, belge `WNX2026000000001`) repo'da izlenebilir bir seeder/migration üzerinden değil, doğrudan dev veritabanına eklenmiş. Bu, `test.skip` güvenlik ağı zaten var olduğu için bloklayıcı değil (veri bir sonraki `migrate:fresh --seed`'de kaybolursa test sessizce atlanır, kırmızı vermez) — ama ofis belgesinin tarayıcıda **sürekli** doğrulanması isteniyorsa bu verinin bir seeder'a taşınması düşünülebilir.
2. `company.certificate_contact_email` varsayılanı hâlâ boş; canlıda doldurulması rollout notlarına girmedi (önceki turdan taşınan soru, hâlâ cevapsız ama blocker değil).
3. Yardım ekran görüntüleri yenilenmedi (önceki turdan taşınan soru).

## Previous Findings Status

- F-1: ✅ Resolved (Sets onayı)
- F-2: ✅ Resolved (Sets onayı)
- F-3: ✅ Resolved (test yazıldı, yerelde doğrulandı)
- F-4: ✅ Resolved (test yazıldı, yerelde doğrulandı)
- F-5: ✅ Resolved (canlıya kuruldu)
- F-6: ✅ Resolved (tarayıcıda yerelde doğrulandı)

## Verdict: ✅ APPROVED

Upstream Coverage Matrix'te ⚠/❌ satır yok. Önceki turun altı bulgusunun hepsi gerçek düzeltmelerle kapandı ve bu turda bağımsız olarak (üç hedefli test koşusu + bir tam TeamCity koşusu, #1837 SUCCESS 2797 test) doğrulandı. Kırmızı çizgi ihlali yok, plan ve tasarımdan kalan sapmalar Sets tarafından kayıtlı şekilde onaylandı. Deploy ve ticket teslimi (In Review + Tayfun) süreç gereği bu incelemeden sonraki adım.
