# Kontrol Turu 1 — Hata Avı Raporu

**Tarih:** 2026-07-05
**Kapsam:** Bugün ~15 ajan dalgasıyla eklenen değişiklik seti (cam/parca/gsd/kutuk/render motorları + fikocad pencereleri + main.cpp dispatch)
**Yöntem:** Sadece okuma. Build 11/11 doğrulanmış; insa.ps1 çalıştırılmadı.
**Doğrulama:** main.cpp dispatch + olay enum + CAM sim wiring baş denetçi tarafından bizzat okundu; motor/parca-gsd-kutuk ve CAM pencere iç mantığı 2 paralel ajanla tarandı, kritik iddialar dosyada teyit edildi.

---

## KRİTİK (çökme / yanlış davranış)

### K1. CAM Simülasyon penceresi hiç çizilmiyor — "▶ Replay" hiçbir şey açmıyor
- **Yer:** `uygulama/fikocad/main.cpp` (çizim döngüsü ~3578-3583) + `cam_operasyon_penceresi.cpp:576` + `cam_simulasyon_penceresi.cpp`
- **Sorun:** `cam_operasyon_penceresi.cpp:576` "▶ Replay" düğmesi `camSimPencereAc(op.kimlik)` çağırıp `g_simAcik[kimlik]=true` yapıyor. Ancak `camSimPenceresiCiz(...)` **main.cpp'de hiçbir yerde çağrılmıyor** (yalnızca `#include` var, satır 21). Dosya derleniyor (CMakeLists.txt:5) ama ölü. Kullanıcı Replay'e basınca hiçbir pencere açılmıyor.
- **Düzeltme:** `camParcaOpPencereleriCiz`/`camTakimPencereleriCiz` yanına (main.cpp ~3583) `camSimPenceresiCiz(cekirdek, sahne, camSis);` ekle.

### K2. Boş-mesh gövde → geçersiz `yerelSinir` → NaN kamera fit (bilinen GOTCHA nüksü)
- **Yer:** `motor/sahne/src/sahne.cpp:127` (`if (veri.vertexler.empty()) return;`)
- **Sorun:** Mesh boşsa erken dönüş; `d.yerelSinir` hiç atanmıyor, varsayılan `Aabbf{}` (muhtemelen inf/NaN) kalıyor. Bu düğüm fit döngüsüne girerse NaN kamera matrisi → viewport kaybolur. Bugünkü yeni düğümler (Tel/Yuzey/GSD/feature sonucu) bu yoldan geçebilir. Hafızadaki hiyerarşik-import GOTCHA'sının aynısı.
- **Düzeltme:** Boş mesh dalında güvenli varsayılan bbox ata (ör. küçük sentinel `{{-0.01..},{0.01..}}`) VEYA tüm kamera-fit döngüleri `gecerliMi()` olmayan bbox'ı atlasın (merkezi guard tercih edilir).

### K3. GSD wireframe düğümü: kenar+nokta ikisi de boşsa `yerelSinir` güncellenmiyor
- **Yer:** `motor/sahne/src/sahne.cpp:~370-400` (`Aabbf sinir; bool sinirVar=false;` … `if (sinirVar) d->yerelSinir = sinir;`)
- **Sorun:** Dejenerе wireframe (hem kenar hem nokta vertex listesi boş) → `sinirVar=false` → `d->yerelSinir` önceki/tanımsız değerinde kalır. K2 ile aynı NaN-fit kaskadını besler. Bu tam olarak satır ~350'deki yorumun uyardığı GOTCHA.
- **Düzeltme:** `sinir`'i güvenli sentinel ile başlat ve/veya `sinirVar` false ise sentinel bbox ata (asla atamasız bırakma).

### K4. Dexel3 GPU: dispatch grup sayısında unsigned underflow
- **Yer:** `motor/kutuk/src/dexel3_gpu_motor.cpp:~192-193` (`gx=(iu1-iu0+8)/8`, `gy=(iv1-iv0+8)/8`)
- **Sorun:** Alt-bölge kırpma sonrası `iu0>iu1` olursa `iu1-iu0` unsigned sarar → devasa grup sayısı → sıfır-boyutlu bölgeye binlerce workgroup dispatch (fence timeout riski). Shader içi sınır kontrolü çökmeyi önler ama kaynak israfı + donma riski var (Vulkan donma fix'iyle çelişir).
- **Düzeltme:** Dispatch hesabından ÖNCE `if (iu0>iu1 || iv0>iv1) continue;` (satır ~157'deki guard'ı buraya taşı) veya signed fark kullan.

### K5. CAM simülasyon: feedrate bölmesinde sıfır/negatif koruması eksik sırada
- **Yer:** `uygulama/fikocad/cam_simulasyon_penceresi.cpp:~113-115` (`hizMmDk` bölmesi)
- **Sorun:** `hizMmDk < 1.0 → 5000` guard'ı bölmeden SONRA/atama sonrası mantığa dayanıyor; bozuk G-code'da `ilerleme` çok küçük (>0, <1) veya negatifse `sureBirikim += mesafe / hizMmDk` Inf/NaN üretebilir → timeline/süre NaN.
- **Düzeltme:** Bölmeden hemen önce `hizMmDk = std::max(1.0, hizMmDk);`.

### K6. CATIA CAM op yolu: ara/son hamle koordinatlarında NaN guard'ı eksik
- **Yer:** `motor/cam/.../cam_op_hesap.cpp:~279-290` (`makroylaCevrele`, clearance Z)
- **Sorun:** Yalnız ilk clearance Z için `isfinite` kontrolü var; ara hamleler veya `hamleler.back().z` NaN olursa yol geçersiz kalıp fit/simülasyona NaN taşır.
- **Düzeltme:** Döngüde her hamlenin `nokta` bileşenlerini `isfinite` doğrula; NaN içeren yolu reddet (boş yol + hata mesajı).

> **Lambda yaşam-süresi (ajan iddiası — DÜŞÜRÜLDÜ):** cam_operasyon_penceresi.cpp:579-587 sil-düğmesi `kimlik`'i değerle yakalayıp `opSil` sonrası HEMEN `return` ediyor; `op`'a tekrar dokunmuyor → güvenli. cam_operasyon_penceresi.cpp:600-612 döngüsü de op'u her iterasyonda taze `opBul` + null-check ile alıyor. `camAgacTopla` sağlayıcısı `&camSis`'i yakalıyor ama camSis main() ömrü boyunca yaşıyor → güvenli. Bu üç nokta çökme riski DEĞİL. (Kalıcılık için: op vektörü push_back'te realloc ederse pencere içinde tutulan `CamOperasyon&` referansı aynı kare içinde geçersizleşebilir — teorik; op ekleme render sırasında olmadığı sürece sorun yok. İzlenmeli, kritik değil.)

---

## ORTA (UX / tutarlılık)

### O1. Pick filtresi modlar arası sızıyor — kullanıcının 1/2/3/4 seçimi kalıcı bozuluyor
- **Yer:** `main.cpp:3755-3780` (refSecim → camSecim → olcum filtre zorlaması)
- **Sorun:** refSecim/camSecim/olcum aktifken `secimSis.fYuz/fKenar/fNokta/fGovde` zorla ezilir ama mod bitince **geri yüklenmez** (zincirde `else` yok, kayıt/restore yok — grep ile teyit). Kullanıcının klavye 1/2/3/4 (main.cpp:1166-1169) ile kurduğu filtre durumu sessizce kaybolur; moddan çıkınca modun bıraktığı filtrede takılı kalır.
- **Düzeltme:** Mod girişinde filtre dörtlüsünü yedekle, çıkışında geri yükle (ör. `struct FiltreYedek` + moda-girer/moddan-çıkar geçiş algılama). Merkezi tut.

### O2. CAM HUD ile RefSecim HUD aynı ekran konumunda — aynı anda aktifse üst üste biner
- **Yer:** `main.cpp:1451-1462` (CAM HUD) ve `1465-1476` (RefSecim HUD)
- **Sorun:** İki HUD de aynı `cx = vpRectMinX + avail.x*0.5`, `y = vpRectMinY + 14.0f` konumuna çiziliyor. İki mod aynı anda aktif olabiliyorsa (aktivasyonda karşılıklı-dışlama enforce edilmiyor — tık dispatch'te `else if` var ama başlatmada yok) yeşil ve cyan kutu üst üste biner.
- **Düzeltme:** Ya mod başlatırken diğerini `bitir()` ile kapat (karşılıklı dışlama), ya da HUD'lardan birini dikey ofsetle (ör. refSecim `y += ts.y + 16`). Karşılıklı dışlama tercih edilir (iki mod eşzamanlı mantıksız).

### O3. "Yön Seç" (hizliYonSecim) modu ESC ile iptal edilemiyor — ESC tutarsızlığı
- **Yer:** `main.cpp:1188-1199` (ESC zinciri) vs. `main.cpp:2307` (tık dispatch'te hizliYonSecim en üstte)
- **Sorun:** hizliYonSecim tık önceliğinde refSecim/camSecim'in ÜSTÜNDE ama ESC zincirinde hiç dalı yok. Yön seçerken ESC → mod kapanmaz, `sahne.secimTemizle`'ye düşer. Diğer tüm pick-modları ESC ile iptal edilebilirken bu edilemiyor (yalnız düğmeye tekrar tıklayarak).
- **Düzeltme:** ESC zincirine `else if (hizliYonSecim>0) hizliYonSecim=0;` ekle (camSecim'den önce, tık önceliğiyle aynı sıraya oturt).

### O4. Placeholder'lar — kullanıcı kuralı gereği yasak (defterle kısmen örtüşüyor)
- `cam_paneli.cpp:335-338` — `BeginDisabled(true)` "▶ Replay" + "Simülasyon penceresi (yakında)". **Çelişki:** sim penceresi bugün YAZILDI (K1); bu düğme wire edilmeli, "yakında" kaldırılmalı.
- `cam_paneli.cpp:369-371` — `BeginDisabled(true)` "Simüle Et" menü öğesi. Aynı çelişki.
- `cam_urun_agaci.cpp:152-154` — `BeginDisabled(true)` "Hesapla" (yorum: "yol hesabı sonraki faz"). Ama `cam.opHesapla` mevcut → wire edilebilir.
- `cam_paneli.cpp:326` — yorum "Simule (yakinda)".
- `cam_takim_penceresi.cpp:101` — yorum "(ileride) 3D revolve" (bilinçli ertelenen — kabul edilebilir).
- **Not:** `cam_paneli.cpp` eski panel; hafıza blueprint'i (cam_blueprint.md) bunun KALDIRILIP ağaç-tabanlı yapıya geçmesini söylüyor. Yeni `cam_operasyon_penceresi.cpp` zaten Replay'i doğru wire ediyor (satır 576). **Öneri:** cam_paneli.cpp'yi tamamen kaldır (main.cpp:3579 `camPaneliCiz` çağrısı + include) → placeholder'lar da gider, mükerrerlik de. Kaldırılamıyorsa disabled bloklar wire edilmeli.
- **Düzeltme:** Yukarıdaki disabled blokları ya wire et (sim/hesapla mevcut) ya da cam_paneli.cpp'yi emekliye ayır.

---

## DÜŞÜK (temizlik)

### D1. Mükerrer CYAN/SOLUK/HATA_RENK renk sabitleri (5+ dosya)
- `cam_paneli.cpp:29-30`, `cam_operasyon_penceresi.cpp:34-38`, `cam_parca_op_penceresi.cpp:29-32`, `cam_simulasyon_penceresi.cpp:29-31`, `cam_takim_penceresi.cpp:25-28` — aynı `CYAN/SOLUK/HATA_RENK/KIRMIZI/YESIL` yerel tanımlı.
- **Düzeltme:** `pencere_util.hpp` yanına `cam_ui_tema.hpp` (veya `cam_renkler.hpp`) — tek kaynak. Final faz PencereTaban envanterine gir.

### D2. Mükerrer `surukleF64` sürükleme yardımcısı (5 dosya)
- `cam_paneli.cpp`, `cam_operasyon_penceresi.cpp`, `cam_parca_op_penceresi.cpp`, `cam_takim_penceresi.cpp` içinde tekrar tanımlı.
- **Düzeltme:** `cam_ui_yardimci.hpp`'ye çıkar, bir kez linkle.

### D3. Mükerrer pin-map kalıbı (`g_*Acik` / `g_*Pin` + kapan-erase döngüsü)
- `g_opAcik/g_opPin` (cam_operasyon), `g_parcaOpAcik/g_parcaOpPin` (cam_parca_op), `g_tkAcik/g_tkPin` (cam_takim), `g_featAcik/g_featPin` (feature), `g_gsdAcik/g_gsdPin` (gsd). Beşi de `unordered_map<key,bool>` + kapanınca/silinince erase eden aynı döngü.
- **İyi haber:** Temizlik VAR — her `*PencereleriCiz` döngüsü kapalı/silinmiş kimlikleri erase ediyor (op silinince map şişmez; cam_operasyon:600-612, cam_takim:445-448, feature:249-257 vb.). Yani Audit C'deki "map şişer mi" endişesi karşılanmış.
- **Düzeltme:** Final faz için `PencereTaban<Key>` şablonu (map+pin+üstte-tut+kapan-erase tek yerde). Fonksiyonel değil, sadeleştirme.

### D4. `pencere_util.hpp` merkezi pin/üstte-tut — DOĞRU kullanım
- `ustteTutSinif`/`ustteTutDugmesi` merkezi; tüm pencereler bunu kullanıyor. Bu kalıp mükerrer DEĞİL, referans. Final PencereTaban bunu sarmalamalı.

---

## Defter Kıyası — Bilinçli Ertelenen vs. Sessiz Düşen

| Placeholder/no-op | Defterde bilinçli mi? | Değerlendirme |
|---|---|---|
| `cam_takim:101` "(ileride) 3D revolve" | Evet (takım penceresi 2D profil, revolve sonraki) | Kabul — bilinçli |
| `dexel3_gpu:245` GPU hacim=0 | Kısmen (kutuk GPU "ILK SURUM" notu) | Kabul ama DÖKÜMANTE et; kullanıcıya yanlış hacim gösterir |
| `dexel3_gpu:250` nokta-sorgu GPU gecikmeli | Kısmen ("SONRAKI DALGA") | Kabul — dokümante |
| `cam_paneli` Replay/Simüle "yakında" | **HAYIR — çelişki** | Sim penceresi bugün yazıldı (K1). Sessizce düşmüş: sim yazıldı ama ne main'e wire edildi ne eski panel güncellendi |
| `cam_urun_agaci:152` "Hesapla sonraki faz" | **HAYIR — çelişki** | `opHesapla` mevcut; disabled tutmak gereksiz |

**Sessizce düşen iş (en kritik):** `cam_simulasyon_penceresi.cpp` tamamen yazıldı, "▶ Replay" düğmesine (yeni op penceresi) wire edildi, CMakeLists'e eklendi — **ama çizim fonksiyonu main döngüsüne bağlanmadı** (K1). Ajan dalgaları arası entegrasyon boşluğu: bir ajan pencereyi yazdı, çağrıyı ekleyecek ajan eklemedi. Tek satırlık düzeltme ama kullanıcıya "buton çalışmıyor" olarak yansır.

---

## Düzeltme Ajanı İçin Öncelik Özeti
1. **K1** (1 satır: main'e `camSimPenceresiCiz` ekle) — en yüksek etki/maliyet oranı.
2. **K2/K3** (boş-mesh/wireframe bbox guard'ı) — viewport kaybolma; merkezi bbox-fit guard'ı ile ikisi birden.
3. **K4** (dexel dispatch underflow guard).
4. **K5/K6** (feedrate + hamle NaN clamp).
5. **O1** (filtre yedek/restore) + **O2** (HUD çakışma/karşılıklı dışlama) + **O3** (ESC hizliYonSecim).
6. **O4** (placeholder wire veya cam_paneli emekli).
7. **D1-D3** (final PencereTaban fazına — sadeleştirme).
