# Review — Omurga Plan Chunk 1 İmplementasyonu (re-review) — 2026-07-26

> **Review type:** impl-review (re-review)
> **Previous review:** `docs/reviews/review-omurga-chunk1-impl-2026-07-26.md` — REJECTED, 3 bulgu (F-1, F-2, F-3)
> **Upstream document(s) read:** `docs/plans/omurga-plan_chunk1.md` (§1.11), önceki review dosyası
> **Other cross-referenced documents:** `CLAUDE.md`, `docs/issues.md` (güncel hali)
> **Stage locks in effect:** Spec v1.7 + Plan v2.3 locked

**İncelenen artifact:** commit `1eb5d4d` (`fix(omurga): heyet chunk1 impl review bulgulari kapatildi`), `main` branch, working tree temiz.

**Bağımsız doğrulama (bu review'da bizzat koşuldu):**
- `pest --group=omurga`: **61 test, 103 assertion, yeşil** (önceki 51 + 10 yeni)
- `phpstan analyse` level 6: **0 hata** · `pint --test`: **temiz**
- **Üç düzeltme de kasıtlı ihlalle yeniden kanıtlandı** (aşağıda, probe A/B/C)
- TeamCity `Egitim_Egitim` build id **#694** (build no 8, branch **main**): **SUCCESS, "Tests passed: 61"**, 26.07.2026 00:23 — API'den doğrulandı
- commit-msg hook düzeltmesi 4 senaryoyla sınandı (aşağıda)

---

## Bulgu kapanış matrisi

| Önceki bulgu | Durum | Kanıt |
|---|---|---|
| **F-1** — Dil zinciri backoffice host'unda koşmuyordu | ✓ KAPANDI | `BackofficePanelProvider.php:57-61` `SetLocale::class` panel middleware'inde, gerekçe yorumla; `route:list`: `filament.backoffice.pages.dashboard` middleware'inde görünüyor. Test: `HostRoutingTest:50-61` (`gatherMiddleware()` üzerinden) + `:63-68` (public/ofis için `web` grubu). **Probe A:** `SetLocale` panelden silindi → `HostRoutingTest` satır 59'da kırıldı ("Failed asserting that an array contains 'App\Http\Middleware\SetLocale'"); geri alındı → temiz |
| **F-2** — Paket rotaları host ayrımının dışındaydı | ✓ KAPANDI | Yeni `app/Http/Middleware/EnsureBackofficeHost.php` (yanlış host'ta **404** — 403 yüzeyin varlığını doğrulardı, gerekçe :20-21'de). Horizon: `config/horizon.php:93` `[EnsureBackofficeHost::class, 'web']`, guard ilk sırada. Filament: `AppServiceProvider:61` `prependMiddlewareToGroup('filament.actions', ...)`. Livewire update: `AppServiceProvider:65` `setUpdateRoute(...)->domain($backoffice)` — `route:list` doğruluyor: `livewire.update` domain=backoffice **ve `web` middleware'i korunmuş**. `PackageRouteHostTest` 8 test: fonksiyonel 404'ler (public+ofis), backoffice'te 404 olmadığı, prepend sırası (`array_search === 0`), **istisna listesi katalog testi** (:79-126) — domain'siz + guard'sız yeni bir rota çıkarsa kırılır |
| **F-3** — `pgcrypto` migration'sız kuruluyordu | ✓ KAPANDI | `setup-test-database.sh:84-89`: `pgcrypto` satırı silindi, yerine "yalnız migration'ı olan extension kurulur" ilkesi + `unaccent`'in neden orada da bulunduğu (paralel worker DB'leri) yorumu. Depoda `pgcrypto` referansı kalmadı (grep temiz) |

### Probe kayıtları (kasıtlı ihlal — bu review'da koşuldu)

- **Probe A** (F-1): `SetLocale::class` panel listesinden silindi → suite kırıldı; geri alındı → yeşil.
- **Probe B** (F-2, prepend): `prependMiddlewareToGroup` çağrısı kaldırıldı → **3 test** kırıldı; en değerlisi: public host'tan export indirme isteği **veritabanına kadar gitti** (`PDOException: relation "exports" does not exist`) — geliştiricinin "append yetmiyordu, `web` grubu route model binding çözüyor" gerekçesini probe'un kendisi kanıtladı.
- **Probe C** (F-2, Livewire): `->domain($backoffice)` kaldırıldı → **2 test** kırıldı: doğrudan test + istisna katalog testi (`livewire-*/update` "unaccounted" listesine düştü) — "yeni domain'siz rota çıkarsa test kırılır" iddiası da böylece kanıtlandı.

Üç probe sonrası working tree `git status` temiz.

## Bilinçli kısıtlanmayanlar — değerlendirme

`PackageRouteHostTest:83-103` istisna listesi tek tek gerekçeli: `up` (health), `storage/{path}` (local disk, dev), Livewire statik asset'leri (durum/veri yok), `upload-file` + `preview-file` (paket domain hook'u vermiyor; ikisi de imza doğrulaması istiyor — `route:list`'te `upload-file` ayrıca throttle taşıyor). Liste kapalı küme: katalog testi + `docs/issues.md`'ye düşülen "paket yükseltmelerinde gözden geçir" notu. Bu sınır kabul edilebilir ve **görünür** kılınmış — sessiz istisna yok.

## Ek işler

- Önceki review'ın notu kapatıldı: `app/Support/{Audit,Crypto,Files,Http,Masking}` `.gitkeep` ile commit'te.
- Q-1 (chunk2 kanonik listeleri + drift testi), Q-2 (tablo sahibi `3eegitim_test` ↔ AD-26 owner kuralı, **chunk2 öncesi karar**), Q-3 (`.env` yorum dili, Sets kararı) `docs/issues.md`'ye açık kalem olarak işlendi ✓.
- commit-msg hook kelime sınırı: bu review'da 4 senaryo koşuldu — "doner" ve "isfixed" artık yanlış alarm üretmiyor (ACCEPT), ikinci satırda gerçek `Fixed` ve `assignee` komutları hâlâ reddediliyor (REJECT). Hook sıkılığı korunmuş.
- Yeni kod dil kuralına uygun (sınıf/yorum/test adları İngilizce); `EnsureBackofficeHost` env() kullanmıyor, host'u config'ten okuyor; yeni public symbol'ün caller'ı var (AppServiceProvider + horizon config — orphan yok); `PackageRouteHostTest` `omurga` grubunda.
- `config/horizon.php` publish edildi: env() yalnız config içinde (izinli), gömülü secret yok.

## ❓ Open Questions

Yeni soru yok. Q-1/Q-2/Q-3 issues.md'de takipte; Q-2 chunk2 implementasyonu başlamadan karara bağlanmalı (issues.md bunu açıkça söylüyor).

## Verdict: ✅ APPROVED

Üç bulgu da artifact düzeyinde kapandı ve her biri bu review'da kasıtlı ihlalle bağımsız olarak yeniden kanıtlandı; 61 test + PHPStan L6 + Pint yerelde yeşil, TeamCity `main` #694 SUCCESS (61 test) API'den doğrulandı. Chunk1, plan §1.11'in 15 kriteriyle birlikte önceki review'ın bulgularını da karşılıyor. Son karar kullanıcınındır; chunk2'ye geçilmeden önce issues.md'deki Q-2 kararının verilmesi beklenmelidir.
