# Review — Müşteri portalı ve teklif dikeyi spec (round 3) — 2026-07-31

> **Review type:** spec-review (dar teyit turu)
> **Previous review:** `review-musteri-portali-spec-2026-07-31-r2.md` (REJECTED, 2 bulgu)
> **Upstream document(s) read:** `docs/design/musteri-portali-brainstorm.md` (bu oturumda doğrulanmış)
> **Other cross-referenced documents:** `app/Support/Accounts/AccountStatus.php` (**kaynak kod, satır satır okundu**) · `docs/specs/omurga-spec.md` A-5 · AD-06, AD-11, AD-23
> **Stage locks in effect:** Brainstorm kararları kilitli.

---

## Kapanış doğrulaması

**R2-1 · Kapandı — ve gerekçe düzeltmesi kabul edilir.** `AccountStatus.php` okundu: dört durum (`invited/active/suspended/closed`) gerçekten 27.07.2026'dan beri tanımlı ve docblock, spec'in §3.3.1'de yazdığının **birebir kaynağı**:

| §3.3.1 iddiası | Kod karşılığı |
|---|---|
| `suspended` → hiçbir şey yapılmaz, işler bekler | docblock: *"NOTHING is taken off them… stay exactly where they are, waiting"* ✓ |
| geri dönülebilir; izin/hastalık/soruşturma | *"reversible and expects the person back — leave, long sickness, an investigation"* ✓ |
| `closed` → devir **önce**, sonrasında devredecek kimse kalmaz | *"handed to somebody else BEFORE it happens, because after it there is nobody to hand it from"* ✓ |
| dönen kişi yeni hesap alır, denetim izi istihdam bazında konuşur | *"a person who comes back gets a new account, so the audit trail keeps saying which employment did what"* ✓ |
| kapatma geri alınamaz ve **şifreyle doğrulanır**; sürtünme bilinçli | `isReversible()` yalnız `Suspended`; docblock: *"confirmed with a password precisely because it cannot be taken back"* ✓ |
| ikisi de kaydı silmez | *"Neither deletes the row (AD-11)"* ✓ |

Round 2 bulgusunun **"hiçbir belgede tanımlı değil" iddiası yanlıştı** — durum kodda tanımlıydı ve bu review'un yazarı kodu grep'lemeden "yok" dedi. Bulgunun ayakta kalan kısmı doğruydu: spec terimleri o döngüye bağlamıyordu ve M-45'in tetikleyicisi adsızdı; §3.3.1 tam bunu kapatıyor.

**M-45 artık test edilebilir:** tetikleyici enum değeriyle adlandırılmış (*"`closed`'a geçmeden önce"*), davranış kapı olarak tanımlı (devir ön koşul), `suspended` dalı ve uyarı ayrı ayrı sınanabilir.

**R2-2 · Kapandı:** kabul kriterleri **§13**, tek `## 12` kaldı; U-2'nin adresi tekil.

## ⚠️ Findings & Risks

Yok.

## Notlar (blocker değil)

- §2.3 (müşteri onaylayanı) ve §9.2/M-34 hâlâ genel "pasifleştirme" dilini kullanıyor — davranışları net olduğu için bulgu değil; istenirse §3.3.1'deki bağlama tek atıfla ("aktif olmayan her durum" = `isActive()` false) iliştirilebilir.
- **Süreç kabulü:** bu oturumda iki bulgu (round 1 F-7 → `customers.legal_type`, round 2 R2-1 gerekçesi → `AccountStatus`) var olan bir şeyi kod okunmadan "yok" diye raporladı. İkisi de teşhis/çözüm tarafında isabetliydi ama iddia tarafında CLAUDE.md "Varsayımla Kod Yazmak Yasak" kuralının review karşılığını ihlal etti: **"yok" iddiası da bir varsayımdır ve Grep/Read ile doğrulanmadan yazılamaz.** Kural bu review'dan itibaren bellek kaydına alındı.

## Verdict: ✅ APPROVED

İki bulgu da bağımsız kanıtla kapandı: §3.3.1, `AccountStatus`'un docblock'uyla satır satır birebir; M-45 enum değerleriyle test edilebilir; bölüm numaralandırması düzeltildi. Round 1'den bu yana açılan 10 bulgu, 2 açık soru ve 1 upstream bulgunun tamamı kapalı; U-2/U-3 upstream kayıtları adresli. 45 kabul kriterli spec, 31 upstream kararın tamamını davranışa çevirmiş durumda ve plan aşamasına hazır — son karar Sets'indir.
