# Review — Ofis T1 Uygulama Planı v1.3 — 2026-07-28 (r4)

> **Review type:** plan-review (re-review, 4. tur)
> **Previous review:** `docs/reviews/review-ofis-t1-plan-2026-07-28-r3.md` (REJECTED — R3-1, R3-2, R3-3 + 1 nit)
> **Upstream document(s) read:** `docs/specs/ofis-onyuz-spec.md` v1.4 (APPROVED) · `docs/specs/omurga-spec.md` (A-1, B-5, A-4, §5.2 v1.16) · `CLAUDE.md`
> **Other cross-referenced / kod doğrulamaları:** `app/Actions/Auth/RequestMagicLink.php` — **büyüme iddiası bağımsız doğrulandı**: eşik `password_reset_throttle`'dan (3/60dk, :53-58), tek `$max` iki anahtara; sınırda **sessiz `return 0`** (:60-62) ve ziyaretçi "gönderildi" cevabını alıyor (:29 tasarımı gereği) · `docs/issues.md` yeni kayıt · plan v1.3 değişen bölümleri (`ThrottlesSignIn` docblock, görev 6 adım 7, görev 10 adım 1/3, revizyon geçmişi)
> **Stage locks:** spec v1.4 APPROVED — bu turda spec'e dokunulmadı. Önceki turlarda kapanan kalemler yeniden açılmadı.

---

## R3-1…R3-3 kapanış doğrulaması

| Bulgu | Durum | Kanıt |
|---|---|---|
| **R3-1** — sınıf salonu riski kayıtsız | **Kapandı — ve büyümesi doğru** | Büyüme bağımsız doğrulandı: `RequestMagicLink` eşiği gerçekten `password_reset_throttle`'dan okuyor (3/60dk) ve sınıra çarpınca **sessizce** `return 0` yapıyor — anonimlik cevabı ("gönderildi") tıkanmayı da yutuyor; bulgunun tarifinden bir kademe kötü tespiti yerinde. `docs/issues.md` kaydı eksiksiz: senaryo, sessizlik, `budgets()` desenine geçirilme ihtiyacı, IP eşiğinin sınıf mevcudunu (mevzuat azamisi 30) karşılaması gereği, çift adres (katılımcı turu `EGT-27`/`EGT-38` + prod kapısı `EGT-51`). Plandaki gerekçe kapsam-bazlıya çevrildi; eski "aynı ağırlıkta değil" ifadesi plandan silindi (yalnız revizyon arşivinde anılıyor — doğru yer) |
| **R3-2** — izin kapsamı yazılmamış | **Kapandı** | Görev 6 adım 7 (:2272-2274): `password_confirmed:<action>`, yalnız o işlem tüketir, 5 dk TTL; "kullanıcı bir şeyi onaylar, başka bir şey olur" gerekçesi ve backoffice/Inertia yapısal farkı yazılı. Görev 10 (:2481) atıf aldı: *"aynı kapı aynı mekanizma demektir, aynı izin değil"* — iki nokta birbirine kilitli |
| **R3-3** — görev 10 test listesi | **Kapandı** | Adım 1'e dört test: izinsiz **ve yanlış işleme yazılmış izinle** ret (R3-2'nin kapsam kuralını da ölçüyor — kapanış kendi regresyon korumasını taşıyor) · audit aynı transaction + bildirim (A-4) · diğer oturumlar kapanır, mevcut ayakta · `Password::defaults()` hatası `FormField`'da ve şifre değişmiyor |
| **Nit** — docblock | **Kapandı** | *"like AnonymousRequestLimiter"* → *"Deliberately NOT the shape of AnonymousRequestLimiter"* (:1631-1636); iki sınıfın farkı (tek eşik ↔ bütçeler) ve iki kırılma yeri (NAT, salon wifi'si) `docs/issues.md` referansıyla belgelendi |

**Sonuç: 4/4 kapandı.** R3-1'in büyümesi doğru teşhis edilmiş ve doğru yere (kayıt + adres) yazılmış; hiçbir kapanış yeni bulgu doğurmadı.

---

## Upstream Coverage Matrix (bu turda değişen satırlar + kilit satırlar)

| Upstream maddesi | Durum | Kanıt (plan v1.3) |
|---|---|---|
| Omurga A-1 — hız sınırı | ✓ | Görev 5 adım 2b (`budgets()`, iki ayrı eşik) + görev 6 adım 5(a); müşteri/limiter boşlukları adresli kayıtta |
| Omurga B-5 — her deneme audit | ✓ | Görev 6 adım 5(b); değişmedi |
| Omurga A-4 — şifre değişimi hassas işlem | ✓ | Görev 10 adım 3 + adım 1'in yeni testleri (audit aynı transaction + bildirim) |
| Omurga §5.2 v1.16 / ofis spec §5.3 — ayrı modal, kapı sunucuda, buton gizlemek kapı değil | ✓ | Görev 6 adım 7'nin kapsamlı izni tam bu dersin Inertia karşılığı; görev 10 uyumlu |
| Ofis spec §4.6 — hata sayfaları | ✓ | Değişmedi (r3'te ✓) |
| Ofis spec karar 9 — sapma yok | ✓ | Bu turun değişiklikleri metin/sözleşme düzeltmesi; yeni ekran/bileşen doğmadı |
| Ofis spec §9 kriter eşlemesi (1,2,3,4,6,7,8) | ✓ | Değişmedi; görev bağımlılıkları tutarlı (5→6, 6→10) |
| CLAUDE.md — adressiz erteleme yasağı | ✓ | Dört erteleme de adresli: Ziggy · Playwright CI adresi · müşteri girişi (EGT-24+EGT-51) · limiter IP bacağı (EGT-27/EGT-38+EGT-51) |
| Plan disiplini — her görev kendi test döngüsünü taşır | ✓ | R3-3 kapanışıyla görev 10 da eksiksiz |

---

## ⚠️ Findings & Risks (in-scope for this review type)

Yok. Bu turda bulgu açılmadı.

## ❓ Open Questions

Yok.

## 📎 Typos & Nits (non-blocking)

Yok. (Tool özetinin "0 bulgu" köprüsüne güvenilmeyip dosyanın okunması ve bunun kayda geçirilmesi doğru pratik — verdict metni esastır; bu review'da da öyledir.)

## Verdict: ✅ APPROVED

Dört kalemin dördü kanıtla kapandı. R3-1'in büyümesi bağımsız doğrulandı (`RequestMagicLink`'in sessiz `return 0`'ı dahil) ve doğru yere yazıldı: bu planın işi olmayan kusur, senaryosu, sessizliği ve çözüm deseniyle birlikte çift adresli kayıtta — prod kapısı bağı da kurulu. R3-2'nin kapsam sözleşmesi görev 6 ile görev 10'u birbirine kilitliyor ve R3-3'ün test listesi o sözleşmeyi ölçüyor — kapanışlar birbirinin regresyon koruması. Dört tur boyunca plan yapısal olarak hiç bozulmadı; her tur daraldı ve bu turda açık kalem kalmadı. Plan, `EGT-54` implementasyonuna girmeye hazırdır; son karar Sets'indir.
