# Review — Ofis Ön Yüzü ve Kimlik Yüzeyi Spec v1.3 — 2026-07-28 (r3)

> **Review type:** spec-review (re-review, 3. tur)
> **Previous review:** `docs/reviews/review-ofis-onyuz-spec-2026-07-28-r2.md` (REJECTED — R2-1, R2-2 + 1 açık soru + 2 nit)
> **Upstream document(s) read:** `docs/specs/omurga-spec.md` (§3.0.2, §5.2, §5.3, §5.5, §14) · `docs/arch/mimari-kararlar.md` (AD-25) · `docs/arch/kod-yerlesimi.md` (§3, §4) · `design/HANDOFF.md` · `CLAUDE.md`
> **Other cross-referenced:** `config/security.php` · `app/Support/Authorization/PermissionFamilies.php` · `docs/issues.md` · önceki iki review (147, 148)
> **Stage locks:** omurga spec + plan APPROVED; §7 revizyon talepleri açıkça listeli, kilit ihlali yok. Önceki iki turda kapanan kalemler (F-1…F-10, açık sorular 1–3) yeniden açılmadı; yeni kanıt çıkmadı.

---

## R2 bulgularının kapanış doğrulaması

| Kalem | Durum | Kanıt |
|---|---|---|
| **R2-1** — kriter 13'teki *"etkin yetki"* | **Kapandı** | Koşul üç yerde de aynı kelimeyle değişti: §5.5 tablosu (:264), T2 satırı (:290 *"hiç yetki tanımlanmamış"*), kriter 13 (:380). Kriter 13 bulgunun senaryosunu **açıkça** kapsıyor: *"yetki verilince düşüyor — verilen yetki MFA nedeniyle etkisiz olsa bile"* — R2-1'in çelişki senaryosu artık testin kendisinde. Upstream hizası doğru: §3.0.2 P-2'nin kelimesi *"tanımlanmadıysa"*. §5.5'in ⚠ paragrafı eski kelimenin neden yanlış olduğunu gerekçesiyle arşivliyor — karar kaybolmaz |
| **R2-2** — kriter 4 attribute/prop kanalı | **Kapandı** | Kriter 4 iki kanallı yazıldı: (a) template metin düğümleri `t()`/boş; (b) kullanıcıya görünen attribute ve prop'lar (`label`, `placeholder`, `title`, `alt`, `aria-label`, `aria-description`, `…Label`/`…Text`/`…Message`) **bağlı** olmak zorunda, düz literal reddedilir, liste config'te (:364-366). Script literal kanalı **bilinen sınır** olarak dürüstçe kaydedildi ve genişletme yolu yazıldı (:370) — r2'nin sunduğu iki seçenekten ("tarama genişlet" attribute'lar için, "bilinen sınır yaz" script için) ikisi birden, doğru kanala doğru seçenek uygulanmış |
| **Açık soru 1** — AD-25 sayımı landing'i dışarıda bırakıyor | **Kapandı** | Sayım → dışlama: *"Filament dışındaki tüm ön yüzlere"* (karar 8 :98-100, §7 :316); gerekçe yazılı — kuralın gerçek sınırı Filament'tir, dışlama yarın doğacak yüzeyi de kapsar |
| **Nit** — §8 tarih notu | **Kapandı** | :325 — iki tarih ayrıştırıldı |
| **Nit** — §5.2 "issues.md #3" | **Kapandı** | :228 — başlıkla anılıyor |

---

## Sorulan dört noktanın değerlendirmesi

**1. §5.5'in ayrımı tam mı, üçüncü aralık kalıyor mu?** Tam. Durum uzayı taranınca:

| Durum | Sonuç | Doğru mu |
|---|---|---|
| Aktif, hiç yetki tanımlanmamış | "Yetki bekliyor" → yöneticiye | ✓ P-2'nin tarif ettiği durum |
| Aktif, yetki tanımlı, MFA'lı olanlar 2FA'sızlıktan etkisiz | İkinci faktör bandı → kullanıcıya | ✓ R2-1'in senaryosu; "yetki bekliyor" ÇIKMAZ |
| Aktif, yetki tanımlı, MFA'lı izni yok, 2FA'sız | Yalnız karar 6'nın kurulum **teklifi** (ilk girişte) | ✓ bekleyen iş yok, uyarı da yok |
| Aktif, yetki tanımlı, 2FA kurulu | Uyarı yok | ✓ |
| Dondurulmuş/kapatılmış | Uyarı yok — koşulun *"aktif hesap"* ön şartı bunu dışarıda tutuyor; durum zaten rozette | ✓ dondurulmuş hesaba "yetki bekliyor" demek yanlış işi tetiklerdi; bandı da göremez, giriş yapamaz (A-5) |

Sorulan örnek (yetki tanımlı + dondurulmuş) her iki koşulun da dışında kalıyor ve doğru şekilde uyarısız. Üçüncü bir "hangi uyarı?" aralığı yok; iki uyarının kesişimi boş (kriter 13'ün son cümlesi bunu ayrıca sabitliyor).

**2. Kriter 4'ün bilinen sınırı dürüst mü?** Dürüst — *"sınıf adı, anahtar ve kullanıcı metni aynı biçimde görünür"* tespiti doğru; script bloğunda tam mekanik ölçüm bu belgenin araçlarıyla yok. Atlanmış **tam** bir yol yok; atlanmış **kısmi** bir sezgisel var: script bloklarında diakritikli dizge taraması. F-8'in gösterdiği gibi kanıt olarak yetersizdir (diakritiksiz metni kaçırır) ama yakaladığı her şey gerçek ihlaldir ve yanlış alarmı düşüktür — bilinen sınırın yanına ucuz bir emniyet ağı olarak eklenebilir. **Bulgu değildir:** kanıt yükü zaten "bilinen sınır" olarak doğru sınıflandırılmış; ek ağ kanıtı tamamlamaz, yalnız daraltır. Karar Sets'in.

**3. AD-25'in dışlama ifadesi başka bir yeri kırıyor mu?** Kırmıyor. Bugünkü ve planlı tüm web yüzeyleri (ofis, portal, katılımcı, landing) kapsama giriyor — HANDOFF'un "dış portallar bu tasarımdan üretilir" kuralıyla ve karar 5'in giriş listesiyle (`office · portal · participant · ileride landing`) hizalı. "Ön yüz" kelimesi e-posta şablonu ve PDF çıktısı gibi web-dışı görselleri doğal olarak dışarıda bırakır; onların stil kararı kendi spec'lerinindir (chunk 7, evrak motoru) — sorun üretmez. Tek pürüz aşağıda nit olarak: **aynı kuralın kod-yerlesimi §4 revizyon satırı hâlâ sayım ifadesinde.**

**4. 13 kriter tutarlı mı?** Evet. Çapraz kontrol edilen çiftler: 9 ↔ 10 (§5.4 adım 2/3'ün iki yolu, kesişmiyor) · 5 ↔ 13 (kilitli atama ↔ uyarı mantığı; kriter 13'ün son cümlesi ikisinin aynı anda konuşmadığını sabitliyor) · 4'ün iddiası ↔ ölçümü (bilinen sınır kayıtlı) · 7-8 ↔ karar 10 (Playwright dar kapsam) · 12 ↔ §8.4 · 11 ↔ proje kaydı. Çelişen çift yok.

---

## Upstream Coverage Matrix (v1.3'te değişen içerik + kilit satırlar)

| Upstream § / madde | Durum | Kanıt |
|---|---|---|
| omurga-spec §3.0.2 P-1/P-2 — uyarı statü/tanım bazlı, gürültüsüz | ✓ | §5.5 + T2 :290 + kriter 13; koşul upstream'in kendi kelimesinde (*"tanımlanmadıysa"*); P-1'in gürültü ilkesi korunuyor — MFA-kilitli senaryo yanlış uyarı üretmiyor |
| omurga-spec §5.2 / karar 6 — MFA'lı izinler etkisiz, kurulum teklif | ✓ | §5.5 ikinci satır karar 6'nın bandına bağlanıyor; teklif ↔ uyarı ayrımı korunmuş, karar 6 metni değişmedi |
| omurga-spec §5.3 — ofis niteleyicileri (iki madde) | ✓ | §7 :309-310; değişmedi (r2'de ✓) |
| omurga-spec §5.5 + §14 kriter 25 | ✓ | §7 :311-312; değişmedi (r2'de ✓) |
| AD-25 (:373) — token kaynağı ifadesi | ✓ | Dışlama biçimi (:98-100, :316); politika değişmiyor, ifade kuralın gerçek sınırını söylüyor; kırdığı yer yok (yukarıda soru 3) |
| kod-yerlesimi §4 — gerçek revizyon | ✓ | §7 :315; **nit:** satır hâlâ sayım ifadesinde — aşağıda |
| CLAUDE.md dil kuralı — gömülü kullanıcı metni yasak | ✓ | Kriter 4 iki kanal + bilinen sınır; iddia–ölçüm ilişkisi artık açık |
| HANDOFF bağlayıcı kural 10 / §8.4 | ✓ | Değişmedi (r2'de ✓) |
| docs/issues.md — passkey kayıtları | ✓ | §5.2 başlıkla anıyor; kriter 11 değişmedi |
| Onay kuralı 6 — örtük revizyon yok | ✓ | §7'nin 11 satırı; v1.3'ün tüm değişiklikleri ya spec içi ya listeli |

---

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

Yok. Bu turda blocker bulgu açılmadı.

## ❓ Open Questions

Yok.

## 📎 Typos & Nits (non-blocking)

1. **§7 kod-yerlesimi §4 satırı (:315) ve karar 8'in ilk paragrafı (:96) hâlâ sayım ifadesinde** (*"ofis ve müşteri yüzeylerine daralır"*), AD-25 satırı ise dışlama ifadesine geçti. Revizyonlar bu haliyle uygulanırsa aynı kural iki belgede iki farklı sınırla yazılmış olur ve landing turu geldiğinde kod-yerlesimi tarafında aynı soru yeniden doğar. İki yerin de AD-25'le aynı dışlama ifadesine (*"Filament dışındaki tüm ön yüzler"*) çekilmesi drift'i baştan kapatır. Bugün çelişki üretmiyor (dar ifade, genişin alt kümesi) — bu yüzden nit.
2. §5.2'de aynı `docs/issues.md` kaydı iki cümlede art arda anılıyor (:228 ve :230) — biri yeter.
3. İsteğe bağlı emniyet ağı: script bloklarında diakritikli dizge taraması (soru 2'nin cevabındaki kısmi sezgisel) bilinen sınırın yanına eklenebilir; kanıt yükünü değiştirmez, karar Sets'in.

## Verdict: ✅ APPROVED

R2-1 ve R2-2 birebir, önerilen çözüm yollarına uygun ve upstream'in kendi kelimeleriyle kapatıldı; açık soru dışlama ifadesiyle, iki nit metin düzeltmesiyle kapandı. §5.5'in durum uzayı boşluksuz, 13 kriterlik küme çelişkisiz, AD-25'in yeni ifadesi hiçbir yeri kırmıyor. Kalan üç kalem nit sınıfındadır ve uygulamayı bloklamaz — birincisi (kod-yerlesimi satırının dışlama ifadesine çekilmesi) revizyonlar üst belgelere işlenirken düzeltilirse aynı sorunun landing turunda geri dönüşü de kapanır. Spec, T1 (EGT-54) implementasyonuna girmeye hazırdır; son karar Sets'indir.
