# Nerede kaldık — handoff

*07.08.2026 akşamı · dal `main` · son commit `850488e` · **CI build #928 yeşil (1.966 test)** · `origin/main` ile eşit*

Bu dosya bir sonraki oturumun **tek giriş noktasıdır**. Önce bunu oku, sonra `CLAUDE.md`, sonra `proje-haritasi.md`.

⛔ **CI adımı değişti:** `migrate` → `migrate:fresh` + hedef koruması. Sebep ve gerekçe `proje-haritasi.md` "Test izolasyonu varsayılan oldu" bölümünde.

⚠ **Tetiklemeden önce `git log origin/main..HEAD` bak.** 06.08'de ilk tetiklenen build eski kodu test etmişti.

⛔ **CI makinesine ADA bağlanılır, adrese değil** *(07.08.2026)*. `mbproframe.local` DHCP ile `10.31.1.240` → `10.31.1.12` kaydı ve tetikleme `ssh: Operation timed out` verdi — makine ayaktaydı, script kapalı sanıyordu. Düzeltildi (`TEAMCITY_MBPRO_HOST`), ama hata mesajı hâlâ *"CI kapalı"* gibi okunur.

---

## 0. Otuz saniyelik özet

Uçtan uca denetimin (`docs/reviews/uctan-uca-denetim-2026-08-03.md`) **kod işi olan tüm kalemleri kapandı.** 07.08 akşam turunda **beş ticket birden kapandı**: EGT-74 (müşteri portalı ve teklif dikeyi), EGT-83 (tablo borcu + tasarım `31`/`22`/`37`), EGT-84 (ofis passkey akışı), EGT-71 (tasarım `61`/`25`/`63`/`40`), EGT-37 (chunk 7 — bildirim altyapısı). CI altı kez üst üste yeşil (#922–#927).

⛔ **Ticket temizliği başladı** *(Sets, 07.08.2026)*: *"ticket'ların çoğu güncel değil, tamamlanan işler işlenmediği için açık duruyor."* Yöntem: **tek tek** — ticket açıklanır, kriterleri koda karşı ölçülür, bulgular paylaşılır, **kapatma kararını Sets verir.** İlk ölçülen EGT-37 oldu ve 18 kriterin 12'si zaten karşılanıyordu.

⛔ **Günün tekrar eden dersi — üç kez ayrı ayrı çıktı:** *kriterler ✓ iken ekran çalışmayabilir.* EGT-74'ün 48/48 kriteri işaretliydi ve portalın sürüm karşılaştırması **hiç çalışmamıştı**; tablo borcunun "bitti" hatırası yanlıştı (14 sayfa açıktı); EGT-71'in dört ekranından üçü *grep düzeyinde* tamam görünürken dördüncüsünde dört boşluk vardı. Üçünü de **tasarım dosyasını açmak ve tarayıcıda gezmek** buldu, hiçbirini test bulmadı.

⛔ **Ticket tipleri düzeltildi:** EGT-50'den sonra her iş `Bug` açılmış. 27 ticket yeniden sınıflandırıldı (Bug 33 → 4). Kural: iş **teslim ediyorsa** Feature, karar/spec/altyapıysa Task, mevcut davranıştaki **kusursa** Bug.

Kalan öbeklerin biri Sets'in kapsam kararını bekliyor, biri sözleşmeler dikeyi, biri katalog tamamlama.

⚠ **Lokal veritabanı 06.08.2026'da sıfırdan kuruldu**; 07.08 akşamı **`DemoDataSeeder` Sets'in izniyle koşuldu** — demo ofis/müşteri hesapları, eğitmenler, tedarikçiler, teklifler ve **çok sürümlü bir teklif** artık var. Tarayıcı suite'i bunlar olmadan **sessizce atlıyordu**.

---

## 1. Bu oturumda kapananlar (06–07.08.2026)

### 07.08 AKŞAM turunda kapananlar — dört ticket

| Kalem | Sonuç |
|---|---|
| **EGT-83** — tablo borcu | Arch listesindeki `$awaiting` **boş**. 11 sayfa `DetailTable`'a, 5 matris gerekçeli kalıcı istisna, son üçü **kompozisyon farkıydı** |
| **EGT-74** — müşteri portalı ve teklif dikeyi | Dikey **gezilerek** doğrulandı (`portal-vertical.spec.js` 5/5): 11 ekran, personel araması, onay kapısının üç mandalı, boş talep reddi, satışçı teklif ekranı |
| **EGT-84** — ofis passkey akışı | Şifre modalı → **cihaz adı modalı** → cihaz promptu; backoffice'in kendi metinleriyle. Ceremony `lib/passkey-enrolment.js`'e çıkarıldı |
| **EGT-71** — tasarım `61`/`25`/`63`/`40` | Dördü ölçüldü; `25`/`63`/`40` karşılıyordu, `61`'de **dört boşluk** kapatıldı (avatar · noktalı çip · `⋮` · sayaçlı dilim satırı) |
| **⛔ Portal sürüm karşılaştırması hiç çalışmamış** | İki hata üst üste: controller sürümü **blok yerine sayı** sanıyordu (PHP'de dizi > sayı), ayrıştırıcı belgenin **hiç yazmadığı** biçimi arıyordu |
| **⛔ `DemoPricingSeeder` 06.08'den beri kırık** | Fiyat listesi sürümlemesi `UNIQUE(kind, version)` getirdi, seeder sürüm atamıyordu → **temiz kurulum + demo veri yolu** çalışmıyordu |
| **Reverb ayakta değildi** | `launchd` işi yüklüydü, koşmuyordu → ofisin **her ekranında** konsolda WebSocket 502 |
| **Backoffice tur envanteri bayattı** | Silinmiş iki kaynağa gidip 404 topluyor, paneli "sağlıksız" raporluyordu |
| **CI makinesi "kapalı" sanıldı** | IP DHCP ile kaymıştı; script artık **ada** bağlanıyor |
| **`DataTable` — sayaçlı dilim satırı** | Yeni yetenek: koşul çipinden **ayrı** kontrol; eğitmen, kullanıcı, tedarikçi listelerinde |
| **Doküman bakımı (Kuşak 6)** | 5/5 çelişki kaynağından düzeltildi |

### 07.08 SABAH turunda kapananlar

| Kalem | Sonuç |
|---|---|
| **EGT-74 kapsama matrisi** | 48/48 ✓. M-43 (kapsam eğitime yazılıp üç listede süzülüyor) ve M-37 (hash bağı testlendi) kapandı |
| **Fiyat listesi sürümleme** | Tek liste, numaralı sürüm · "Yeni sürüm oluştur" (kopya taslak) · "Yayınla" · Taslak/Yayında/Arşiv · matris gerçek tablo |
| **⛔ Fiyat düzenleme hiç kaydetmiyormuş** | Alanlar `data.matrix`'e, kaydetme `$this->matrix`'e bakıyordu. Testler eylemi sürdüğü için görmemiş |
| **Test izolasyonu (EGT-75)** | `RefreshDatabase` varsayılan; 99 dosya izolasyonsuzmuş. CI `migrate:fresh` |
| **EGT-58, EGT-60** | İlki zaten yapılmış (ticket bayat), ikincisi düzeltildi (token'da rakam avlamak yerine decode ölçümü) |
| **Bildirim ayarları ekranı** | Kart = olay, 32 olay, tek satır kural, yeşil/kırmızı, arama, sticky kaydet, kapalı süre listesi |
| **dev@subicon.net** | Üç panelde tam yetkili geliştirme kimliği + `passkey:remember` |
| **Stop hook** | Tutulan sözü kusur sayıyordu; transcript gecikmesini de yakalamıyordu. İkisi de düzeltildi |
| **Ticket tipleri** | 27 ticket yeniden sınıflandırıldı |

### 06.08 turunda kapananlar

| Kalem | Sonuç |
|---|---|
| **Bildirim yüzeyi** | Sidebar sayacı + yanıp sönen nokta + toast + bildirim merkezi + **kayda gidiş**. §2.0 |
| **Migration konsolidasyonu** | 42 saf alter dosyası ana dosyalara katlandı; 145 → 102 migration. Şema birebir aynı doğrulandı |
| **Lokal veritabanı** | `migrate:fresh` + seed (Sets'in izniyle), konsolidasyon öncesi dökümüne karşı doğrulandı |
| **Ticket'lar** | EGT-76 (D-6), EGT-77 (D-13), EGT-78 (D-15), EGT-79 (D-16); D-14 EGT-42'ye bağlandı |

### ⛔ Tarayıcının bulduğu üç hata (hiçbiri yeni koddan değildi)

1. **`translate()` her noktadan bölüyordu** — kendi tanımlayıcısı altında dosyalanmış anahtar (`events['training.ministry_deadline']`) hiç çözülmüyordu. Bildirim listesindeki her satır ve tercihler sekmesindeki her anahtar **kendi iç kodunu yazıyordu**.
2. **Toast etiketi yalnız bildirim ekranında yüklenen grupta** — başka sayfada gelen toast çeviri anahtarını bastı. Kabuk sözlüğüne taşındı.
3. **`BottomNav` var olmayan `item.badge` alanını çiziyordu** — telefonda rail sayaçlarının **hepsi** görünmezdi.

### ⛔ Adres disiplini tekdüze değil — bunu bilerek yaz

Eğitim, müşteri ve eğitmen ekranları `OpaqueId` token'ı çözüyor; teklif ve fatura Laravel'in model binding'iyle **ham id** alıyor. `getKey()` ile kurulan bağlantı ilk grupta **404** verir (ölçüldü: `/egitimler/5`). Ayrıca `OpaqueId` anahtarını **oturumdan** türetiyor — kuyruk worker'ında üretilen token kimse için çözülmez, bu yüzden toast kayda değil listeye götürüyor.

---

## 1b. Önceki oturumda kapananlar (05.08.2026)

Ayrıntı denetim dosyasında; burada yalnız başlıklar ve **çıkan sürprizler**.

| Kalem | Sonuç |
|---|---|
| **N-10** — `StaffCompliance` sayfalaması | SQL'e indi; sonuç kaç satır olursa olsun **sabit 6 sorgu**. Kuşak 5 kapandı |
| **§12.2** — 11 yarım kalan | Dördü zaten kapalıydı, **ikisi yanlış teşhis edilmişti**, beşi yapıldı |
| **D-20** — onay kuyruğu | Tasarım `66`'nın *"ona hatırlatma gönderebilirsiniz"* yarısı yoktu. ⛔ Denetimin istediği "sekme ayrımı" **yapılmadı**: tasarım onu başka türlü çözüyor, sekme icat etmek sapma olurdu |
| **D-17** — müşteri devri | Kişiye / gruba / havuza; kapanış isteğinin **içinde** |
| **D-19** — evrak türü sürümleme | Sürüm + etki analizi + değişiklik kilidi (dolu alanı kaldırmak **reddedilir**) |
| **D-7** — Reverb | **Yalnız ofis** (Sets kararı). Kanal, yayın, oturum kapatma dört katmanı, launchd servisleri |

### ⛔ Bu oturumda ortaya çıkan **canlı** hatalar (hiçbiri yeni koddan değildi)

1. **Route model binding, tenant scope'tan ÖNCE koşuyordu** → bağlı her portal adresi **500**. Tasarım `11`'in yetki matrisi **hiç çalışmıyordu**.
2. **`PermissionRows` müşteri config'inin iç içe şeklini yanlış okuyordu** → *"Array to string conversion"*. Aynı matrisi ikinci kez kırıyordu.
3. **`panel.egitim.dev.sets.fyi` DNS kaydı hiç açılmamıştı** → müşteri paneli **haftalardır tarayıcıda hiç açılmamıştı**. (Host eklemek üç adımdır: nginx · sertifika · **DNS**.)
4. **nginx WS bloğu h2 ile 500 dönüyordu** — tarayıcılar 1.1'e düştüğü için "çalışıyor" görünüyordu.
5. **`Workload.vue`'da prop/binding çakışması** (`page`) → ekranda **NaN**. Arch testi kondu.
6. **Bildirimden sonra katılımcı eklenen eğitim asla başlatılamıyordu** (`needs_kums_update` temizlenemiyordu).
7. **`RecordCertificate`** ilk sınavı kaybedip ikincisini kazanana **belge vermiyordu** (sınav tekrarı açılınca).

---

## 2. ⏭ KALAN İŞLER

### 2.0 · ✓ Bildirim yüzeyi — KAPANDI (06.08.2026)

Yüzey **sidebar'daki "Bildirimlerim"** kalemi oldu; zil yazılmadı (Sets kararı — topbar 28.07.2026'da bilinçli kaldırılmıştı, **K-3 böylece kapandı**).

- `RailCounts` bir `notifications` anahtarı üretiyor; bekleyenlerden biri kritikse rozet kırmızı
- Yeni bildirim gelince rozet **yanıp sönüyor**, okuyucu ekranı açınca duruyor
- Toast (`04 Geri Bildirim`) yığın, glif, giriş+ayrıntı ve devam bağlantısıyla tamamlandı; kritik olan zamanlayıcı taşımıyor
- `NotificationCentre.vue` bildirim ekranında kullanılıyor — hiyerarşi kuralı orada yaşıyor (kritik satır "okundu" ile kapatılamaz)
- **Satır kayda götürüyor:** `subject_type`/`subject_id` okunuyor; görev bildirimi görevin bağlı olduğu eğitime/teklife gidiyor
- ⚠ `Task` ve `TrainingRequest` için tekil ekran yok; o bildirimler listelerine düşüyor

### 2.1 · Ticket açıldı, sırası gelmedi — 5 kalem

*(Sets, 05.08.2026: hepsi gündemde dursun, şimdi yapılmayacak.)* D-15 ve D-16'nın ticket'ları koddan doğrulanarak daraltıldı — zeminin çoğu zaten var.

| # | Ne | Bugünkü hâli · risk |
|---|---|---|
| **D-6** (EGT-76) | İYS / ticari ileti onayı + SMS | Config var (`notifications.php:28-30`), `app/Integrations/` altında yok. ⚠ Bugün promosyonel gönderim olmadığı için patlamıyor; **duyuru maile açılırsa 6563 ihlali** |
| **D-13** (EGT-77) | 3E'nin **kendi** yetki belgesi geçerlilik takibi | Kurum belgesi kaydı hiç yok. Çatı §222, Y-2016 md.12 |
| **D-14** (EGT-42) | e-Fatura adaptörü + **bağımsız katılımcıya fatura** | `invoices.customer_id` NOT NULL; `IssueInvoice.php:63` `Customer` şart — şema bugün firmasız faturaya izin vermiyor. ⛔ Entegratör seçilmeden alan adları **yazılamaz** (kırmızı çizgi 3) |
| **D-15** (EGT-78) | Katılımcı muafiyet motoru | Mühendislik/denizcilik mezuniyeti → eğitim şartı aranmaz. Kural motoru yok. Çatı §37-38 |
| **D-16** (EGT-79) | IMDG müşteri ön koşulu (gözetim yetki belgesi) | grep sonuçsuz. Çatı §45 |

### 2.1b · Yeni açılan / hâlâ açık — 07.08 durumu

| Ticket | Ne | Durum |
|---|---|---|
| **EGT-74** | Müşteri portalı ve teklif dikeyi | ✅ **`Fixed` (07.08.2026)** — 48/48 kriter, CI #924 yeşil, dikey **gezilerek** doğrulandı (`portal-vertical.spec.js`, 5/5) |
| **EGT-83** | Tablo borcu + tasarım `31`/`22`/`37` hizalaması | ✅ **`Fixed`** — CI #922, #923 yeşil |
| **EGT-84** | Ofis passkey ekleme akışı backoffice ile aynı şekle getirildi (modal) | ✅ **`Fixed`** — CI #925 yeşil. ⛔ Müşteri paneli **kapsam dışı**: orada passkey hiç yok (`HasPasskeys` yalnız ofis kimliğinde), modale çevrilecek akış değil yeni yetenek olurdu |
| **EGT-71** | Tasarım hizalamaları — `61`, `23`, `63`, `40` | ✅ **`Fixed`** — dördü de koda karşı ölçüldü, kapsama matrisi ticket'ta. `25`/`63`/`40` zaten karşılıyordu; `61`'de dört boşluk kapatıldı. CI #926 yeşil |
| **EGT-35** | Chunk 8 — realtime ve kullanım analitiği | ✅ **`Fixed`** (CI #928) — `last_active_at` + çalışıyor göstergesi + üç test. ⛔ Müşteri kanalı **kapsam dışı** (Reverb yalnız ofis) |
| **EGT-37** | Chunk 7 — bildirim altyapısı | ✅ **`Fixed`** (CI #927) — 18 kriterin 12'si zaten karşılanıyordu; mesaj sınıfı + stream, Discord, SMS adaptörü yazıldı. ⛔ Discord **hata beslemesi değil**, süreç takibi |
| **EGT-72** | Finans ve onay veri katmanı | `In Progress` — ⚠ ölçüldü: beş kalemin **üçü zaten var** (kategori tarifesi, onay kuyruğu, ödeme+dağıtım). Kalan: pakete masraf, eğitmen belgesi onayının gerekliliği kapatması |
| **EGT-81** | Satışçının imzalı nüsha yükleme ekranı | Tasarımcıda |
| **EGT-80** | Sözleşme yönetimi — `legal_*`, dört kitle, önce müşteri portalı | `Submitted` *(06.08 açıldı, tasarım `18`)* |
| **EGT-82** | Ticari sözleşmeler — çerçeve, NDA | `Submitted` · ⛔ EGT-80'den **fiziksel olarak ayrı** (Sets: rıza ≠ sözleşme) |

⚠ **Bir sistemik konu açık:** `RefreshDatabase` artık varsayılan ama **global sayıma dayanan** başka test kalmış olabilir. Bugün kırılan bir tanesiydi (`ApprovalQueueTest`). Taranmadı.

⚠ **YouTrack smart commit — teşhis düzeltildi (07.08.2026).** İlk okumam yanlıştı: entegrasyon commit'i **alıyor** ve yazarı doğru eşliyor. Uygulanmayan şey **komutlardı**, çünkü EGT projesinde **zaman takibi kapalıydı** — `work 20m` yazacak alan yok, komut dizisi bütün olarak işlendiği için yanındaki `Fixed` de düşüyordu. Ölçüm: EGT'de 82 ticket'ta 0 süre; puanbenim'de (ayrı sunucu, aynı biçim) 60'ta 34.

⚠ Biçim doğruymuş: komut satırı yalnız komut taşır (`#EGT-60 Fixed work 20m`), açıklama üçüncü satırda. puanbenim komutu açıklamayla aynı satıra koyuyor ve o daha kirli.

✓ **Sets üç projede de (EGT · GZT · TMGD) zaman takibini açtı.** Bundan sonraki commit'ler hem süreyi yazar hem durumu çeker. ⛔ Geçmiş ~100 commit **geriye dönük işlenmez**; elle çekilen durumlar (EGT-58, EGT-60, EGT-75) yerinde.

---

### 2.2 · ✓ Doküman bakımı (Kuşak 6) — KAPANDI (07.08.2026)

Beş çelişkinin beşi kaynağından düzeltildi: KamuSM RFC 3161 (çatı §192 + AD-21 damga kolonu), dayatma dili (`mevzuat-kurallari.md` §1/§12 **ve `RegulationSeeder`'ın iki uyarı metni** — zararlı olan sonuncusuydu, formu dolduran onu okuyor), `PK` → `PR` (spec bölümü + iki diyagram + P-48 + tasarım brief'i), duyuru kanalı (çatı §67 artık "yalnız uygulama içi", gerekçesiyle), kişi eşiği (omurga §8 + kriter 9 → `business.usage.minimum_people`).

### 2.2b · ✓ Tarayıcı doğrulaması yapıldı — ve dört şey buldu *(07.08.2026)*

Demo veri Sets'in izniyle yüklendi (`DemoDataSeeder`), `detail-tables.spec.js` yazıldı, taşınan ekranlar 1024/1440'ta ve 375'te açıldı. **10/10 geçti.**

⛔ **Yolda çıkan dört şey — hiçbiri bugünkü koddan değil:**

1. **`DemoPricingSeeder` kırıktı ve kimse görmemişti.** Fiyat listesi sürümlemesi 06.08'de `version` kolonunu ve `UNIQUE (kind, version)` kısıtını getirdi; seeder güncellenmedi, ikinci `daily` listesini varsayılan `version=1` ile yazmaya çalışıp **patlıyordu**. Yani *"temiz kurulum + demo veri"* yolu 06.08'den beri çalışmıyordu. Düzeltildi (kind içinde en yüksek + 1 — üretim yolu `OpenNextPriceListVersion` bunu baştan doğru yapıyor).
2. **Reverb ayakta değildi** (`launchd` işi yüklüydü ama koşmuyordu) → ofis panelinin **her ekranında** konsola WebSocket 502 düşüyordu. `launchctl kickstart` ile kaldırıldı. ⚠ Prod çıkışında `REVERB_APP_ID/KEY/SECRET` hâlâ boş — kurulmayacaksa `BROADCAST_CONNECTION=log`.
3. **Program detayına geri dönüş yok.** `/paketler/{package}` ekranı yalnız **planlama sonrası yönlendirmeyle** açılıyor; bir programa bağlı eğitimin ekranında programa giden bağlantı yok ve eğitim payload'ı programı taşımıyor. Ekran var, yolu tek yönlü.
4. **Liste satırları bağlantı değil, düğme.** Teklif, tedarikçi ve eğitmen listelerinde satır `<button @click="router.get(...)">` ile açılıyor. Orta tıklanamaz, kopyalanamaz, ekran okuyucuya hedef olarak okunmaz — 05.08'de yazılan *"satırın adı kaydı açar (bağlantı)"* kuralıyla çelişiyor.

⛔ **5 · Portal sürüm karşılaştırması hiç çalışmıyormuş — iki hata üst üste.** Demo sette çok sürümlü teklif olmadığı için blok hiç çizilmemişti; seeder'a gerçek yoldan revizyonlu teklif eklendi ve altından ikisi çıktı: (a) controller sürümü **blok** yerine **sayı** sanıyordu ve PHP'de dizi her sayıdan büyük olduğu için karşılaştırma hep `null` dönüyordu; (b) `QuoteVersionDiff` belgenin hiç yazmadığı bir biçimi (`Kalem · ₺1.234`) ayrıştırıyordu — gerçek biçim `1) Görev 3 — 8 × 2.400,00 ₺ = 19.200,00 ₺`. İkisi de düzeltildi, tarayıcıda doğrulandı.

⚠ **Testler neden yakalamamış:** iki mevcut test gövdeyi kendisi uyduruyordu, üstelik ayrıştırıcının beklediği biçimde — test ve kod birbirini doğruluyor, ikisi gerçekle çelişiyordu. Yeni test gövdeyi `QuoteDocument`'ten alıyor.

⚠ **Tarayıcıda hâlâ doğrulanmayan tek kalem:** program detayı (`/paketler/{package}` — adres `OpaqueId` taşıyor, listesi yok, yalnız planlama sonrası yönlendirmeyle açılıyor).

### 2.2c · Doküman bakımı — özgün liste (kapandı, kayıt olarak duruyor)

⚠ **Ucuz ama birikirse pahalı.** Bu turda `regulation_fallbacks`'i *"tablo var"* diye arayıp **hiç olmadığını** bulmam tam olarak bayat dokümanın maliyetiydi.

1. **AD-06 revize edildi, AD-21 ve çatı §192 güncellenmedi** — KamuSM RFC 3161 kaldırıldı, iki yerde hâlâ yazıyor. Kod güncel.
2. **`mevzuat-kurallari.md` §1 ve §12 hâlâ dayatma dilinde** (*"alt sınır 70 zorunlu doğrulama"*) — AD-27'nin 27/31.07 revizyonlarıyla çelişiyor. `RegulationSeeder.php:75` metni de öyle.
3. **Program ön eki:** `planlama-spec.md` P-48 `PK`, AD-19 `PR`, kod `PR`.
4. **Açık eğitim duyurusu kanalı:** çatı §67 "bilgilendirme maili" diyor; kod bilinçli olarak yalnız uygulama içi (Sets, 03.08.2026). Çatıya işlenmemiş.
5. **`omurga-spec.md` kriter 9** "2 kişiden az" sabit sayı diyor; AD-21 bunu admin ayarı yaptı.

*(6 numara — `proje-haritasi.md` §2 — kapandı.)*

### 2.3 · Tasarım tamamlama (Kuşak 4) — süregelen

✓ **Tablo borcu KAPANDI (07.08.2026, EGT-83).** Arch testindeki `$awaiting` listesi boş; on bir sayfa `DetailTable`'a taşındı, beş matris gerekçesiyle kalıcı istisna oldu, son üçü **kompozisyon farkıydı** (teklif ekranı tek tabloya + başlığa, öneri satırları aynı ızgaraya, portal sürüm farkı `v1 · v2 · FARK` başlığına). Ayrıntı `proje-haritasi.md` "Tablo borcu kapandı" bölümünde, tam kayıt EGT-83'te.

⚠ **Bu iş gün içinde EGT-71'e commit'lendi** (sekiz commit `#EGT-71` etiketi taşıyor, süre oraya işlendi). EGT-83 07.08 akşamı açıldı ve kayıt oraya taşındı; **zaman kayıtlarının taşınması YouTrack arayüzünden yapılmalı.**

✓ **EGT-71 de kapandı (07.08.2026 akşamı).** Dört ekran koda karşı ölçüldü — kapsama matrisi ticket'ta. `25` tedarikçi, `63` kullanıcı ve `40` eğitmen kokpiti tasarımlarını karşılıyordu; **`61` eğitmen listesinde dört boşluk** vardı ve kapandı: ad hücresinde avatar, evrak durumu tek noktalı çip, satır aksiyonu `⋮`, ve **sayaçlı dilim satırı**.

⛔ **Dördüncüsü bir bileşen yeteneğiydi ve üç ekranı birden ilgilendirdi.** Üç liste tasarımının üçü de tabloyu sayaçlı bir dilim satırıyla açıyor ve bu, kataloğun standartlaştırdığı **koşul çipi değil** — koşul çipi *"şu an neye göre süzüyorum"* (eklediğinde belirir), dilim *"bu liste nasıl bölünüyor, hangisinde kaç tane"* (sen dokunmadan ekranda). Tasarımlar ikisini birden çiziyor. `DataTable` `slices` prop'unu kazandı; eğitmen, kullanıcı ve tedarikçi listeleri kullanıyor. ⚠ **Yeni bir liste ekranında ikisini karıştırma.**

⚠ Ticket'ın verdiği tasarım numaraları dosya adlarıyla örtüşmüyordu: **61** = `61 Yonetici Tanimlar`, ve "23 Tedarikçi listesi" için asıl dosya **`25 Planlamaci Tedarikciler`**. Bir sonraki turda numara görünce dosya adına değil `<h1>`'ine bak.

Kalanlar:

- **21 sayfa** → `DescriptionList`, **9 sayfa** → `ProgressBar`
- §13.2 organizma çıkarma
- **Tasarım `18 Sözleşmeler`** — hiç ele alınmadı; ticket'ları açıldı (**EGT-80** site sözleşmeleri/`legal_*`, **EGT-82** ticari sözleşmeler — fiziksel olarak ayrı)

### 2.4 · Katalog boşlukları

| # | Ne | Kaynak |
|---|---|---|
| B-1 | Collapsible satır (uzun içerik / e-posta) yok; öneri kartı · görev satırı · kalem kartı ortak bileşen değil, sayfalara gömülü | `06 Desen Ekleri` |
| B-2 | Çoklu seçim + **bulk bar** yalnız sorgulama ekranında | `02 Veri Gosterimi` |
| B-3 | **Genel arama ve bildirim zili hiçbir yerde yok** | `05 Navigasyon` · topbar kararı 28.07.2026 → **§2.0 ile birlikte ele alınmalı** |

### 2.5 · Küçük uçlar

| # | Ne | Nerede |
|---|---|---|
| U-1 | Takvimden görüşme ekleme / sürükleme | `Office/Sales/Calendar.vue` (30-b) |
| U-2 | Ay özetinde "müşteri eğitim günü" sayacı | `SalesCalendar::summary()` (30-c) |
| U-3 | Müşteri kartında "tüm eğitimler" bağlantısı | `Office/Customers/Show.vue` (32-f) |

### 2.6 · Karar bekleyenler

| # | Ne | Not |
|---|---|---|
| K-1 | `/portal/bildirimler` ve `/portal/guvenlik` için **tasarım yok** | Ofis kompozisyonu taşındı. Tasarımcıdan brief isteyelim mi? |
| K-2 | **Feature branch'e geçiş** | *(05.08.2026 Sets: **main'de kalıyoruz**.)* Kapandı |
| K-3 | **Topbar / bildirim zili** | *(05.08.2026 Sets: **zil yok**, sidebar kalemi yüzey.)* Kapandı |
| K-4 | `training_definitions.instructor_requirement` **ölü kolonu** | ⚠ **Hâlâ duruyor.** 32 satırın hiçbirinde veri yok, okuyan/yazan kod yok — yalnız `$fillable`'da atıl. Konsolidasyonla birlikte düşürülmesi planlandı, o turda **yapılmadı**: karar Sets'te |
| K-5 | `InstructorWorkload` hâlâ PHP'de sayfalıyor | Kümesi 3E'nin kendi kadrosu (onlarca satır). SQL'e indirmek doğruluk yüzeyi olan bir yeniden yazım; **bilinçli bırakıldı** |
| K-6 | Reverb **müşteri tarafı** | Bugün yalnız ofis. İleride ucuz kalıyor: yayın tek yerde, layout'lar zaten ayrı |

### 2.7 · Kapsam dışı (sebebiyle)

| Ne | Neden |
|---|---|
| `21` planlama sihirbazı | Sets kararı: planlamacı bütünü kaybediyordu, tek sayfa planlama yazıldı |
| Duyurunun e-posta ile gitmesi | Sets kararı: yalnız uygulama içi. İstenirse D-6 ile birlikte gelir |
| Telefon doğrulama (SMS) | Sets: "şimdinin işi değil" |
| Tenant anahtar rotasyonu | AD-05; `key_version` duruyor, yol kapalı değil |
| `analytics_usage_daily` | Bilinçli atıl — eşik ayara indiği için rollup gereksiz (`UsageAnalytics:31-38`) |

---

## 3. Ortam — bu oturumda değişenler

### 07.08 · yeni

- **`dev@subicon.net`** — backoffice / ofis / müşteri panellerinde tam yetkili. Şifre `Passw0rd`, TOTP `config('security.local_developer_totp_secret')`. Kod: `(new PragmaRX\Google2FA\Google2FA())->getCurrentOtp(...)`
- **`sets@subicon.net` müşteri hesabı** — firma **3E Geliştirme A.Ş.**, şifre ofis şifresiyle aynı
- **`php artisan passkey:remember`** — passkey'i `migrate:fresh` sonrasına taşır (dosya depoda değil)
- **CI adımı** `migrate:fresh` + hedef koruması
- ⚠ Playwright'ta Filament/Livewire alanları: `pressSequentially` çoğu kez **düşmüyor**; native value setter + `input` olayı çalışıyor. Buton tıklaması submit'i tetiklemeyebilir — `form.dispatchEvent(new Event('submit', {bubbles:true}))`



- **Reverb ve Horizon artık launchd servisi:** `deployment/launchd/fyi.sets.3eegitim.{reverb,horizon}.plist`, `~/Library/LaunchAgents/`'a symlink. Durdurma: `launchctl bootout gui/$(id -u)/fyi.sets.3eegitim.reverb`.
  - ⛔ **Horizon opsiyonel değil:** mail gönderimi ve ofis yayınları kuyruktan geçer. İşçi yoksa **mail gitmez, panel sessizce yayın almaz**.
- **DNS:** `panel.egitim.dev.sets.fyi` A kaydı açıldı (Cloudflare, gri bulut, 10.31.1.25). Token `~/.zshrc` → `CF_API_TOKEN`; zone `ebd3424a991795748e3deefdb77d37a0`.
- **`.env`:** `REVERB_APP_ID/KEY/SECRET` lokalde üretildi. ⚠ **Production'da hâlâ boş** — `.env.production.example`'a *"boş bırakılamaz, kurmayacaksan `BROADCAST_CONNECTION=log`"* notu düşüldü.
- **nginx:** WS bloğunda `http2` kapatıldı (h2 → 500, 1.1 → 101).

---

## 4. Süreç hatırlatmaları

- **Commit:** `#EGT-xx In Progress work 1h` **ilk satırda**, ikinci satırda conventional commit. ⚠ Gövdede `Fixed`/`Done`/`In Progress` **kelimesi bile** hook'u tetikler (*"half-done"* takıldı). AI attribution yasak.
- **Ticket kapanışı:** TeamCity `trigger` → `wait` → **yeşil** olmadan `Fixed` yok.
- **Test kadansı:** geliştirmede yalnız dokunulan grup; commit öncesi `pint --dirty` → `composer analyse` → gruplar **sırayla**. ⚠ Lokal tam koşu güvenilmez (`omurga-rls` bağlantı yuvasından düşer).
- **⛔ `migrate:fresh` ve veri silen hiçbir komut sorulmadan koşulmaz.** Lokal db Sets'in üzerinde çalıştığı db.
- **Tasarım protokolü:** kod yazmadan önce `design/*.dc.html` **baştan sona** okunur; teslimden sonra kapsama matrisi (öğe | ✓/⚠/❌ | kanıt). **Sapma yalnız Sets söylediğinde.** ⚠ Bu oturumda bir kez doğru uygulandı: denetim D-20 için sekme istiyordu, tasarım başka türlü çözüyordu — sekme **yazılmadı**, gerekçe kayda geçti.
- **⚠ Yorumlama yasak, sor.** Bu projenin en pahalı hatası buydu.
- **⚠ İki yerde tutulan bilgi = sessiz hata.**
- **Heyet çağrısı kullanıcıya aittir.**

---

## 5. İlk on dakikada

1. Bu dosyayı, `CLAUDE.md`'yi ve `proje-haritasi.md`'nin §2'sini oku
2. `docs/reviews/uctan-uca-denetim-2026-08-03.md` — §12.1/§12.2 tabloları neyin ölçülmüş olduğunu satır satır yazar
3. §2.3 tasarım tamamlama ya da §2.2 doküman bakımı — §2.0 ve §2.1 kapandı
4. YouTrack'te ticket `In Progress` (`./deployment/scripts/youtrack.sh`)
5. Kod yazmadan önce ilgili tasarım dosyasını aç — ⚠ ilgili görünen bölüm değil, **dosyanın tamamı**
6. ⚠ **Bir bulguyu kapatmadan önce koda sor.** Denetim bir anlık görüntüdür: bu turda 11 kalemden dördü zaten kapalıydı, ikisi yanlış teşhis edilmişti
