# Review — Müşteri portalı ve teklif dikeyi spec v1.0 — 2026-07-31

> **Review type:** spec-review
> **Previous review:** brainstorm zinciri (167→170, APPROVED)
> **Upstream document(s) read:** `docs/design/musteri-portali-brainstorm.md` (31 karar — bu oturumda dört tur boyunca okundu ve doğrulandı)
> **Other cross-referenced documents:** `cati-dokumani.md` §129, §143, §148–154, §184, §190–191 · `docs/specs/fiyatlama-spec.md` §2.3, §4.1–4.2, §5 · `docs/arch/mimari-kararlar.md` AD-08, AD-09, AD-11, AD-14, AD-15, AD-20, AD-21, AD-27 · `docs/specs/omurga-spec.md` §3, §3.1, §3.2 · `docs/specs/planlama-spec.md` P-37
> **Stage locks in effect:** Brainstorm kararları kilitli — K-n yeniden tartışılmaz; bu review da tartışmıyor.

---

## Upstream Coverage Matrix (31 karar → spec; bağımsız üretildi)

| Karar | ✓/⚠ | Kanıt (spec) |
|---|---|---|
| K-1 birim ağacı | ✓ | §2.1, M-1 |
| K-2 iç onay opsiyonel | ✓ | §2.3, §9.3 |
| K-3 planlanmış eğitim | ✓ | §5.1 |
| K-4 3E iç onay zinciri | ✓ | §5.4 |
| K-5 onay panelden + delil | ✓ | §5.5, M-15 |
| K-6 mail kabul ≠ onay | ✓ | §5.5, §7.2, M-16 |
| K-7 fiyat matrisi, iki liste | ✓ | §5.2 |
| K-8 maliyet salt-okunur | ✓ | §5.2, M-12 |
| K-9 üç sayı + satışçı anonim | ⚠ | §5.3 — **sayacın kapsam-dışı okunması düşmüş** → S-F6 |
| K-10 slot + yedek liste | ⚠ | §5.3, M-33 — **çatı §153 boşalma ayrımı düşmüş** → S-F3 |
| K-11 pasifleştirme + şifre/HMAC | ✓ | §9.2, M-34 |
| K-12 fatura iki yol | ✓ | §6.2 |
| K-13 fiyat tipleri karışır | ✓ | §5.2, M-11 |
| K-14 N eğitim | ✓ | §5.1, M-11 |
| K-15 tek onaylayan | ✓ | §2.3, M-2 |
| K-16 muhasebeye bildir | ✓ | §6.4, M-20 |
| K-17 revizyon süreci | ✓ | §5.6, M-17 |
| K-18 satışçı eğitim yaratamaz | ✓ | §4.1, M-4 |
| K-19 talep açar | ✓ | §4.1–4.2, M-5 |
| K-20 tahsis eğitim bazlı | ⚠ | §5.3, M-13 — **çatı §151 onay-öncesi uyarı metni düşmüş** → S-F2 |
| K-21 üretici uçlar sonraki tur | ✓ | §11 (kapanış adresli) |
| K-22 teklif ofiste yaşar | ✓ | §5.4, §10.1, M-14/M-29 |
| K-22b fatura/yazışma aynı desen | ⚠ | §10.1 — **alan düzeyi yalnız teklif için yazılı** → S-F5 |
| K-23 bağımsız katılımcı | ✓ | §6.2 |
| K-24 mail görünürlük+bildirim | ✓ | §7.2, M-21 — AD-20 §1 ile tutarlı, iki cümle doğru sırada |
| K-25 onay = faturalanabilir | ✓ | §6.1, M-18 |
| K-26 açık = satışçı görünürlüğü | ✓ | §4.3, §11, kapsam dışı bloğu |
| K-27 iki ekran | ✓ | §4.2 (`34` atfı) |
| K-28 son hamle | ✓ | §4.5, M-8 |
| K-29 bütün fatura + iptal | ✓ | §6.1, §6.3, M-19 |
| K-30 görünürlük kapsamı | ⚠ | §4.3/§4.4/§4.7, M-6/M-7/M-10 — **kapsamın eğitim listesinde uygulanması kritersiz** → S-F8 |

M-1…M-34 tam (34/34, sıra kozmetik olarak karışık — nota bakınız). İstenen altı kontrolün cevapları bulguların içinde; özet verdict'te.

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

**S-F1 · §5.2 indirim paragrafı üç yönden bozuk — finansal davranış çelişkisi.** (a) **M-12 "indirim satışçının tavanını aşamaz" fiyatlama-spec §4.2 ile çelişiyor:** oradaki karar (Sets, 28.07.2026) aşımın **engellenmediği**, teklifin **onaya gittiğidir** — çatı §184'ün "limit aşımı engellenmez, onaya gider" önerisinin kabul edilmiş hali. Blok ile eskalasyon farklı sistemlerdir; spec'in hali satışçının yöneticiden onay alarak istisna verme yolunu kapatır. (b) **Çift seviyeli kontrol düşmüş:** fiyatlama-spec §4.2 limiti **hem kalemde hem teklif toplamında** kontrol eder ve gerekçesi yazılıdır (tek seviye her iki yönden oynanabilir); spec yalnız "tavanla sınırlı" diyor. (c) **"(AD-09)" atfı yanlış:** AD-09 panel kararıdır (Filament/Inertia), indirimle ilgisi yok. "Tavan globalden daraltılır, genişletilemez" cümlesinin kaynağı da doğrulanamadı — çatı §184 "satışçı-özel **override**" der (yön belirtmez), fiyatlama-spec yön belirtmez. Bu cümle ya kaynaksız yeni kuraldır (varsayımla yazılamaz — sorulmalı) ya da atfı düzeltilmelidir.

**S-F2 · Çatı §151'in onay-öncesi uyarısı düşmüş — K-20 × AD-14 kesişimi.** Kontenjan yetmiyorsa müşteri onay ekranında **onaydan önce** şu yazılır: *"Bu eğitimde N yer kalmıştır; onayınız kontenjan teyidine tabidir"* — ve metin hash'lendiği için sonradan itiraz doğmaz. Spec §5.3 teyit durumunu, §5.5 delili tanımlıyor; ikisini bağlayan bu uyarı davranışı (uyarının hash'lenen metne dahil olması) yok. Uyarısız teyide düşen onay, tam da AD-14'ün önlemeye kurulduğu itirazı üretir. Çok-eğitimli teklifte (K-14) uyarının kalem bazında verilmesi gerektiği de ancak bu davranış yazılırsa görünür.

**S-F3 · Çatı §153'ün boşalma ayrımı düşmüş — K-10'un ikinci yarısı.** Eğitim öncesi **iptal** slot boşaltır ve yedekten çağırma açılır; eğitim günü **no-show** devamsızlık kaydıdır ve **yedek terfi akışını tetiklemez**. M-33 yedek listeyi kurdu ama bu ayrım olmadan no-show'da yedekten çağıran bir implementasyon M-33'ü geçer — tam da "kararın yarısı girdi, yarısı düştü" sınıfı.

**S-F4 · Tamamlama kapısı muğlak; beyan-imza çelişkisi davranışı hiç yok.** Çatı §143 kapıyı dört unsurla tanımlar: imzalı yoklama + sınav sonuçları + **beyan/imza çelişkisinin çözümü** + **KUMS işlem kanıtı**. Spec §8.4 "devam, sınav ve evrak koşulları" diyor — dört unsurun ikisi adsız. Çatı §190'ın "beyan-imza çelişkisinde uyarı" davranışı (katılımcı 'katıldım' dedi, imzalı listede yok — ya da tersi) spec'te geçmiyor; oysa §8.2 beyanı ikincil kanıt olarak kuruyor, çelişki hâli ikincil kanıtın tek işe yaradığı andır.

**S-F5 · §10.1 "kendi kaydı kadar" — fatura ve yazışma için alan düzeyi yazılmamış (soru 3'ün cevabı).** Satır 303 "her ortak yüzeyde hangi alanın kime açık olduğu yazılıdır (§5.4)" diyor ama §5.4 yalnız **teklifi** kapatıyor. Açık kalanlar: müşteri, faturasının **bildirim durumunu** (muhasebeye bildirildi/bildirilmedi) görür mü? Muhasebe cevabının düştüğü thread müşterinin faturasına bağlı — müşteri o **iç yazışmayı** görür mü? Thread'ler müşteri-satışçı ve 3E-muhasebe konuşmalarını aynı kayda bağlıyor; parça düzeyinde kim-neyi-görür tanımsız. Tenant-leak değil (kayıt zaten müşterinin kendi kaydı) ama kırmızı çizgi 1'in komşusu: 3E'nin iç yazışması müşteriye sızarsa ticari zarardır ve bugünkü metin bunu engelleyen cümleyi taşımıyor.

**S-F6 · K-9'un sayaç yarısı düşmüş.** Çatı §149: sayaç **kapsam dışı okunur** — satışçı yalnız kendi müşterilerini gördüğü için satır bazlı sorgudan sayılan "teklif bekleyen" yanlış çıkar. Spec üç sayıyı tanımlıyor ama sayıların **tüm satışçıların tekliflerini** kapsadığını söylemiyor; kapsamlı sorgudan sayan bir implementasyon bugünkü kriterlerin hepsini geçer ve yanlış sayı gösterir. (DB kilidi planın işi — buraya değil; sayacın anlamı davranıştır ve buraya ait.)

**S-F7 · Fiyat dondurma davranışı anılmıyor.** Fiyatlama-spec §5 (Sets, 28.07.2026): teklif kalemi fiyatı **dondurur** (kaleme kopyalanır) ve liste **sürümlenir**, kalem hangi sürümden geldiğini kaydeder — imzalı teklifin sonradan değişmemesinin mekanizması. Spec §5.2/§5.6 bunu ne tekrarlıyor ne atıfla bağlıyor; sürüm-hash delili (§5.5) metni korur ama **kalemlerin fiyat kaynağını** korumaz. Tek cümlelik atıf yeterlidir; yokluğu plan aşamasında "fiyat lookup'ı canlı listeden" yazılmasına açık kapı bırakır.

**S-F8 · Kapsamın uygulanması kritersiz.** §4.7 kapsamı eğitime yazdırıyor (M-10 ✓) ama eğitimin satışçı listelerinde (`31`, takvim, sorgulama) **kapsama göre süzüldüğünü** söyleyen davranış cümlesi ve kabul kriteri yok — M-10 yazmayı ölçüyor, uygulamayı değil. Kapsamı yazan ama hiç okumayan bir implementasyon tüm kriterleri geçer; K-30'un gerekçesi ("İzmit'i ilgilendirmeyen satışçı meşgul olmasın") tam olarak okuma tarafındadır.

## ❓ Open Questions (to be answered before next stage)

1. **Satışçı ataması değişirse** (müşteri başka satışçıya devredilir, satışçı pasifleşir): açık teklifleri, talepleri ve thread sahipliği kime geçer, eski satışçı neyi görmeye devam eder? (§6 soru setinin "adı konmamış uç durumu" — brainstorm'da da yok, karar gerektirir.)
2. S-F1(c): "tavan globalden daraltılır, genişletilemez" bir Sets kararı mı, spec yazımında mı doğdu? Kararsa kaynağı yazılmalı, değilse fiyatlama-spec §4.2'nin çift-seviye + onaya-gider modeli esastır.

## ⚠️ Upstream Findings

- **Çatı kendi içinde çelişiyor — §129 vs §161–163:** §129 (25.07) *"mevzuat kaydı alt sınırı dayatır; eğitim tanımı yalnız daha sıkı değer girebilir"* derken §161–163 (29.07 revizyonu, AD-27) *"mevzuattaki sayı referanstır, kısıt değil; tek istisna azami katılımcı"* diyor. Spec §8.4 **doğru tarafı** (AD-27, geç tarihli karar) seçmiş; çatı §129'un eski cümlesi güncellenmeli, yoksa bir sonraki okuyucu sınav eşiğine hard-block yazar.

## Notlar (blocker değil)

- M kriterlerinin sırası M-30'dan sonra M-33, M-34, M-31, M-32 diye gidiyor — 34/34 tam, sıra kozmetik.
- §4.6 *"Ret gerekçesizdir olamaz"* → "gerekçesiz olamaz" (dilbilgisi).
- KDV davranışı (fiyat KDV hariçtir, teklifte hesaplanır — fiyatlama-spec §2.3) teklif bölümünde anılmıyor; fiyatlama-spec tek kaynak olarak yaşadığı için not düzeyinde, ama S-F7 düzeltilirken tek cümleyle bağlanabilir.
- §2.3'ün pasifleşen-onaylayan çözümü, §5.5'in sürüm yarışı reddi ve §5.3'ün teyit durumu — üçü de iyi tanımlanmış uç durumlar (soru 6'nın ilk yarısının cevabı olumlu).

## Verdict: ❌ REJECTED

Upstream kapsama gerçekte güçlü: 31 kararın 31'i spec'te temsil ediliyor, M-33/M-34 eklemeleri doğru ve K-24/K-29/K-30 gibi en son kararlar dahil hiçbir karar tersine çevrilmemiş. Verdict'i düşüren, tam da talep edilen birinci kontrolün bulduğu sınıf: **beş kararın yarısı girmiş, yarısı düşmüş** (K-9 sayaç kapsamı, K-10/çatı §153 boşalma ayrımı, K-20/çatı §151 onay-öncesi uyarı, çatı §143/§190 tamamlama kapısı ve beyan-imza çelişkisi, K-22b'nin alan düzeyi) — ve **bir yerde spec upstream'inden farklı davranış yazıyor**: M-12'nin "aşamaz"ı, fiyatlama-spec §4.2'nin "aşılırsa onaya gider" kararıyla çelişiyor ve atfı (AD-09) yanlış. S-F1 finansal davranışı değiştirdiği için tek başına REJECTED sebebidir; kalanlar tek turda kapanacak metin işleridir. Mevzuat bölümleri (§8.3–8.6) çatı ve AD'lerle tutarlı; §10.1 tablosu doğru kurulmuş, tek eksiği S-F5'in parça düzeyi. Bulgular kapanınca spec plan aşamasına hazırdır.
