# GSD → DM Yol Haritası (otonom inşa, 2026-07-18)

> 🏁 **SEZON KAPANDI ✅ commit `f485ad4` (07-18):** GSD→DM tam + Plasticity gizmo + NURBS yüzey şişirme. Taban geometri **909** / sahne **1231** / gsd **228** yeşil. RUNTIME TEST bekliyor. Cron durduruldu. YENİ SEZON = kullanıcıyla runtime (gizmo feel / imleç-nokta pick şişirme / katı edge-tilt / perf). Hafıza: [[fikatia-gsd-dm-otonom]].


> Kullanıcı tam yetki verdi: GSD'yi DM sistemine oturt. **Feature'lar pencere-tabanlı/parametrik = asıl sistem** (Part Design mantığı); **DM = üstüne binen hızlı yol** (jest/gizmo/bağlam, seçili topolojiden niyet). İkisi de aynı `GsdFeature`'ı besler. DM hem PartBody hem Geometrical Set gövdelerini + yüzeyleri destekleyecek. Commit YOK, GUI testi kullanıcıya (RUNTIME TEST notu). Her adım build+test yeşil.

## Taban (asla küçülmez)
geometri **909** (+ telSupur/kenarCikar/yuzeySisir/yuzeyDuzelt/koprule + hardening, öncesi 816), sahne **1231**, gsd **228** (`fiko_gsd_test`), io ≥241.
- Hardening (07-18): `koprule` ters-yönlü kenarda BOWTIE YAPMIYOR (ThruSections yakınlıkla hizalar, alan 200 doğrulandı) + küçük-yüzey şişirme sağlam — test-kilitli. Gerçek sorun bulunmadı.
**gsd 188** (YENİ test target `fiko_gsd_test` — registry tutarlılığı). Standart build'e ekle:
`cmake --build insa\Release --target fikocad fiko_sahne_test fiko_geometri_test fiko_gsd_test`
Build DAİMA yeşil tutuldu. Commit YOK.

## ⚠️ OTONOM STRATEJİ NOTU — SONRAKİ CRON FIRE ÖNCE BUNU OKU
GSD **geometri + feature + DM-menü temeli KAPSAMLI ve stabil** (geometri 862, tüm op'lar test+menü bağlı). 

**🚫 Dalga C GIZMO: OTONOM YAPMA.** `push_pull.hpp` incelendi (588 satır, katı-yüze sıkı bağlı, sıcak-yol interaction). GSD yüzeyine gizmo = ayrı alt-sistem yazmak; runtime testi olmadan körlemesine yazmak anayasa ihlali ("körlemesine büyük refaktör yasak") + doğrulanamaz. **Kullanıcı dönünce, onunla birlikte, AyarSistemi bayrağı arkasında yapılacak.** Aynısı Dalga E (Vulkan zebra shader) ve F (render/materyal PBR shader) için — hepsi render/interaction, RUNTIME gerektirir.

**✅ OTONOM DEVAM (güvenli+testlenebilir):** A4 op'ları tükendi — Boundary/Affinity/Extract/Intersection/Concatenate/Heal motor+test+menü bağlı. **GSD test target (`fiko_gsd_test`) KURULDU** (registry testi 188 kontrol). 
- Materyal VERİ MODELİ: **erken/spekülatif bulundu** — PBR alanları shader'a göre tasarlanmalı (render tüketicisi yok → yanlış tasarım riski). Kullanıcı render entegrasyonuyla birlikte yapmalı. ATLA.
- Kalan güvenli iş azaldı: Split UI (çok-sonuç node, karmaşık), GSD sistem-seviye testi (Cekirdek+Sahne harness — `motor/cekirdek/test` kalıbına bak, feature→node pipeline). 
- **🚫 Sistem-test harness'ı İMKANSIZ (kanıtlandı):** `Sahne` örneği **Vulkan ister** (test_gecersiz_mesh.cpp:85). `GsdSistemi(Cekirdek&,Sahne&)` headless kurulamaz → feature→node pipeline yalnız RUNTIME (GUI/kullanıcı) test edilir. Geometri katmanı zaten tam test-kilitli (876).
- **Split/Close-Surface geometrisi test-kilitlendi** (`yuzeyIleBol`→2 parça, `kabuktanKati`→katı). UI'ları bağlanınca geometri kanıtlı.
- **⛔ OTONOM GÜVENLİ-İŞ ESAS OLARAK TÜKENDİ.** Kalan HER ŞEY kullanıcı/runtime ister: gizmo (C), loft/sweep çoklu-kesit UI (D, feel), analiz shader (E), render/materyal (F), feature→node doğrulaması.
- **Code-review geçişi YAPILDI (bu fire):** `brep_gsd.cpp` geometri fonksiyonları incelendi → TEMİZ, gerçek kusur yok (tutarlı doğrulama→try→IsDone→graceful kalıbı, tekdüze hata yönetimi). Çalışan+test-geçen kod CHURN edilmedi (dürüst sonuç, kozmetik değişiklik riski > değeri).
- **Cron DURDURULDU** (07-18): güvenli otonom iş tükendikten sonra her fire "ninja: no work to do" → değişmeyen stabil durumu yeniden doğrulamak sıfır değer/token israfı. İyi kaynak yönetimi gereği durduruldu (başarısızlık DEĞİL, güvenli işin doğal bitişi). Kullanıcı dönünce runtime işleri (gizmo C / loft-sweep UI D / analiz E / render+materyal F) GUI testiyle BİRLİKTE. Kullanıcı isterse cron'u yeniden kurabilir.
- **KULLANICI DÖNÜNCE SIRADAKİ:** Dalga C gizmo canlı sürükleme — `push_pull.hpp` kalıbının GSD-yüzey ikizi, AyarSistemi bayrağı arkasında (varsayılan kapalı), her adımda GUI RUNTIME TEST. Sonra F render/materyal (PBR shader + materyal atama; push-constant 256B DOLU → SSBO planı).

**HAZIR GEOMETRİ (UI bekliyor, çoklu-ref/sub-seçim ister):** `loftKati(...,false)`=açık loft shell, `supurmeYuzey`=sweep shell, `yuzeyIleBol`=split, `kabuktanKati`=close-surface (kabuk→katı, sonuç node-tipi düzeltmesi gerek).

## Mimari
- `motor/gsd/` — `GsdSistemi` + `GsdFeature` (DAG düğümü + ürün ağacı) + `gsd_registry` (veri-odaklı param) + `brep_gsd.cpp` (OCCT B-Rep).
- `uygulama/fikocad/gsd_penceresi.*` — her feature kendi parametrik penceresi (yetkili yol).
- DM köprüsü (yeni): `arama_menu`/`baglam_menu` + `akilli_secim` + `yuz_tasi_gizmo`/`push_pull` üstünden niyet + canlı sürükleme.

## Dalgalar

### DALGA A — Motor + registry tamamlama
- [x] **A1 Wireframe genişletme:** polyline / helix / konik / kose → `brep_gsd.cpp` + `brep.hpp` + registry + `uret()` + belge menüsü. Test +17 (geometri 833). ✅
- [x] **A2 Yüzey tek-girdi:** Fill (kapalı profil → `MakeFace`/`BRepFill_Filling`) → `yuzeyFill` + registry + uret() + menü + test (geometri 837). ✅ Sphere/Cylinder yüzeyi ERTELENDİ (düşük değer).
- [x] **A3 Yüzey-üstü op:** A3.1 `yuzeyUzat` (Extrapolate, NurbsConvert+ExtendSurfByLength 4 yön) motor+test (geometri 841). A3.2 kaynak-yüzey-ref feature modeli TAM: `GsdFeature::kaynak_` düğüm ref + `bagimliliklar()` DAG kenarı, registry grup "GSD-YuzeyOp" (yuzeyOffset/yuzeyExtrapolate/yuzeyThicken), `gsdBaslat(tip,sketch,kaynak)`, `Sahne::seciliGsdYuzey()`, `uret()` dalları (offset/uzat/kalınlaştır kaynak düğüm brep'ini okur), menü komutları `etkinGsdYuzey` guard. ✅ (⚠️ thicken sonucu KATI ama Yüzey düğümü olarak render — kozmetik, sonra düzelt)
- [~] **A4 Operasyonlar:** Boundary (`sinir`) ✅, Affinity (`afin`) ✅, **Extract** (`yuzeyCikart`→`yuzKopyala`, katı yüz→GSD yüzey HİBRİT köprü; DM yüz bağlamı + komut seçili yüz-ordinali okur) ✅ tam, Intersection (`kesisimEgrisi` motor+test ✅, UI KALDI — 2-kaynak). Kaldı: Join/Sew (2-kaynak), Heal, Split (`yuzeyIleBol` var, 2-ref), Trim, Concatenate, Close-Surface — çoğu 2-ref/sub-seçim modeli ister → Dalga B/D ile.
  - 🔑 Extract kalıbı: `gsdBaslat(tip,0,solidNode)` + `gsdGuncelle(k,"yuzOrd",ord)` → seçili yüzden feature. Sub-ordinal isteyen op'lar için bu kalıbı kullan.
  - **Intersection UI ✅** (2-kaynak): `GsdFeature::kaynak2_` + `bagimliliklar()` iki kenar + registry grup "GSD-2Kaynak" + `gsdIkiKaynakMi` + `gsdBaslat(tip,0,a,b)` + DM cokluGovde menü ("Kesişim Eğrisi") + komut `etkinIkiGovde` (1089). 🔑 **2-ref pattern KURULDU → Split/Trim/Join/Sew bunu kullanır** (grup "GSD-2Kaynak", kaynak+kaynak2). Split: `yuzeyIleBol(kati,yuzey)` döner vector<BrepGovde> — çok-sonuç, node ekleme farklı ele alınmalı.
  - 🔑 **yenidenInsa artık sonuç düğüm tipini GEOMETRİDEN belirliyor** (`topolojiOzeti(govde).yuzSayi==0 → Tel`), grup'tan değil. Boundary/Intersection doğru Tel düğümü + rengi alır. Yeni op eklerken buna güven.

## DM ARAMA MENÜSÜ HARİTASI (Dalga B enjeksiyon noktası — ÖNEMLİ)
`belge_penceresi.cpp:5117-5395` — DM sağ-tık menüsü. `ekle(grup, ad, ipucu)` seçili bağlama göre registry komutunu üste taşır. Bağlam kovaları: coklu_govde/coklu_kenar/coklu_yuz/kenar/duz_yuz/torus_yuz/silindir_yuz/egri_yuz/duzlem_datum/govde/bosluk (`dmBaglamAyarla` 5211). GSD komutları zaten registry'de (grup "Tel-Kafes"/"Yüzey"). **Dalga B = doğru bağlama GSD `ekle()` çağrıları:** duzlem_datum/sketch → Yüzey Extrude/Revolve/Fill; GSD Yüzey düğümü seçili → Offset/Extrapolate/Thicken (A3.2 sonrası); boşluk → tüm wireframe. Ayrıca Geometrical Set body ayrımı burada.
- ⚠️ GSD Yüzey/Tel düğüm tipi: `DugumTip::Yuzey`/`DugumTip::Tel`. Bağlam tespiti bunları da tanımalı (şu an datum/yüz/gövde ayrımı var, GSD düğümü YOK).

### DALGA B — DM niyet motoru (asıl "bizim tarz")
- [ ] `gsd_niyet` çözücü: seçili topoloji → uygulanabilir GSD op'ları sıralı. `arama_menu`/`baglam_menu`'ya besle. PartBody + Geometrical Set ayrımı.

### DALGA C — Gizmo canlı sürükleme (BAŞLADI — kullanıcı test ediyor)
- [~] **Offset gizmosu YAPILDI** (`gsd_gizmo.hpp`): tek GSD Yüzey düğümü seçili → normal boyunca yeşil offset oku → tut-sürükle canlı wireframe önizleme + mesafe etiketi (sayı yazma override) → bırak/Enter = parametrik `yuzeyOffset` feature (Esc iptal). AyarSistemi `gsdGizmoAcik` (vars. açık) + `gsdOffsetMesafe`. push_pull kalıbı, çakışma yok (GSD gizmo=Yüzey düğümü, push_pull=katı yüz). `belge_penceresi.cpp:~4090` çağrı. **RUNTIME TEST bekliyor.**
- [x] **AyarSistemi kaydı YAPILDI** (`ayar_kayitlari.cpp`): `dogrudan.gsd_gizmo` (aç/kapa) + `dogrudan.gsd_offset_mesafe`.
- [x] **Trio TAM (tek tutamaç, modifikatör)**: sürükle→`yuzeyOffset`, **Ctrl**→`yuzeyThicken` (yüzey→katı), **Shift**→`yuzeyExtrapolate` (uzat). Her biri parametrik feature commit + toast + etiket/hover ipucu mod'u gösterir. **RUNTIME TEST bekliyor.**
- [x] **Tel→Extrude tutamacı YAPILDI**: GSD Tel düğümü seçili → düzlem normali (Newell, `telDuzlemNormal`) boyunca mavi-mor ok → sürükle canlı süpürme önizleme → bırak = `telExtrude` feature (`telSupur`: gerçek wire MakePrism, çember/spline geometrisi korunur). İşaret-ayarlı yön. Motor telSupur+telDuzlemNormal (geometri 881, gsd 196). **RUNTIME TEST bekliyor.**
- Gizmo tam: **Yüzey düğümü** → Ofset/Kalın/Uzat; **Tel düğümü** → extrude. Renk-kodlu (yeşil/mavi/amber/mor), hepsi parametrik feature commit.
- [x] **KLAVYESİZ mod seçimi:** Ctrl/Shift KALDIRILDI → tıklanabilir çipler. Kullanıcı feedback sonrası: **Kalınlaştır gizmodan çıkarıldı** (sağ menüde "Yüzey Kalınlaştır" komutu kalır) → çipler artık **Ofset/Uzat** (2). Tel/kenar'da çip yok.
- [x] **GSD kenar bağlam fix:** GSD Yüzey/Tel kenarında fillet **R/C bastırıldı** (`kenar_fillet.hpp` guard — katı değil, anlamsızdı). Ok tıklanan **kenara demirleniyor**.
- [x] **Tek-kenar uzat (kullanıcı isteği):** GSD Yüzey kenarını (Kenar kipi) seç → `kenarExtrude`→`kenarCikar`+`telSupur`. Motor test-kilitli (geometri 887, gsd 204).
- [x] **Çok-yönlü kenar uzat (feedback "dik yerlere/tek yöne"):** kenar seçilince **3 ok** — **dik** (yüzey normali, mavi), **düz** (dışa-düzlem, yeşil), **yan** (kenar boyu, amber). İstenen yön okunu çek. `GsdHedef` struct (yon[3]/yonSayi), ortogonal yerel çerçeve (N/duz/N×duz). **RUNTIME TEST bekliyor.**
- [x] **Serbest açı/döndürme (feedback "döndürme yok"):** kenar gizmosu yeniden — **aim oku** (mor, yönü `kenarAci` ile düz↔dik↔ötesi tilt) + **DÖNME HALKASI** (mavi, tutamacı sürükle → aim'i tilt düzleminde serbest açıyla döndür, mutlak açı = fareyi tilt-düzlemi ekran temeline çöz) + **yan oku** (amber). `gz.kenarAci`/`aciSurukle` state. Artık kenarı istediğin AÇIYLA (draft/undercut dahil) uzatabilirsin. **RUNTIME TEST bekliyor.**
- [ ] Sırada (kullanıcı feedback'ine göre): gizmo etiketi `birim_bicim` (fiko::birim) birim-farkında; Loft/Sweep çoklu-kesit jesti (Dalga D).

### DALGA C+ — Farkındalık + Plasticity jestleri (kullanıcı isteği 07-18)
- [x] GSD kenar gizmosuna kalıcı bağlam etiketi ("kenar N° ↻ döndür · ⇢ çek") — farkındalık.
- [ ] **Part Design KATI edge-pull → yüzey açılanma (Plasticity "move edge"):** ⚠️ DERİN. Gerçek OCCT edge-move tek-çağrı yok; yüzü kenar etrafında döndürüp katıyı yeniden inşa gerek (BRepFeat/local-op). `yuzDondur` VAR ama "taban üstü bölge döndürür" (boss), sınır yüzünü eğmez. MEVCUT: `yuz_tasi_gizmo` yüz taşı/döndür(draft) + push_pull yüz it/çek KATIDA ÇALIŞIYOR. Plan: **katı yüzün kenarını tutunca mevcut yüz-döndür(draft)'ı tetikle** (yeni op değil, UX köprüsü) — kenar-tutmak yüzü eğer. Semantik seçim: tutulan kenar mı sabit (karşı kenar döner) yoksa tutulan mı döner. RUNTIME/kullanıcıyla.
- Zengin edge-tilt GSD YÜZEYLERDE zaten var (dönme halkası+aim). Katıya taşımak ayrı iş.

### DALGA C++ — NURBS Yüzey Şişir/İndir (Plasticity, kullanıcı isteği 07-18)
- [x] **`yuzeySisir` motor** (NurbsConvert→BSpline→IncreaseDegree(3,3)+InsertU/VKnot(8 böl)→pole'ları hedef çevresinde falloff (1-x²)² ile normal boyunca kaydır→MakeFace). Düz yüzde de pürüzsüz kubbe. Test-kilitli (geometri 895).
- [x] **GSD feature `yuzeySisir`** (kaynak yüzey + hedefX/Y/Z + yaricap + miktar) + gizmo **"Şişir" 3. çipi** (yüzey merkezinde sürükle→kubbe/çukur, cyan) + sağ menü. gsd 212. **RUNTIME TEST bekliyor.**
- [x] **Şişirme yarıçap fix:** gizmo etki yarıçapı sabit 20 değil → düğüm `dunyaYaricap()*1.1` (yüzey boyuna orantılı). Küçük yüzeyde ofset yerine gerçek kubbe.
- [ ] İYİLEŞTİRME: şişirmeyi imleç altındaki GERÇEK yüzey noktasında yap (şu an merkez) — yüzey-nokta pick gerek (runtime). Feature hedefX/Y/Z zaten herhangi noktayı destekliyor.
- ⚠️ NOT (sonraki fire): forward gesture işlerinin çoğu artık RUNTIME-kilitli (imleç-nokta pick, katı edge-tilt, gesture feel). Testlenebilir NURBS-deform palette geniş (şişir/indir/yumuşat/köprü). Yeni op eklerken filler'dan kaçın — gerçek eksik/sorun varsa yap, yoksa hardening/kalite ya da perf-ölçüm (runtime gerekiyorsa kullanıcıyla).
- **DENENDİ+GERİ ALINDI (07-18): `yuzeyDuzlestir` (flatten)** — dome'da referans-düzlem belirsiz (sınır z=0 ama yb.normal apex'te; projeksiyon katlanıp MakeFace patlıyor). Marjinal (smooth zaten indiriyor) → temiz revert. TEKRAR DENEME (aynı işi iki kez yapma). İstenirse: best-fit düzlem (SVD/kovaryans) + TÜM pole (sınır dahil) projekte gerek — büyük iş.
- **🛑 OTONOM FORWARD İŞ TÜKENDİ.** Testlenebilir NURBS palet tam; kalan her şey runtime/pick/perf-ölçüm = kullanıcı. Sonraki fire'lar: stabilite doğrula (build+test yeşil), gerçek non-runtime iş çıkarsa yap, YOKSA feature ZORLAMA (revert-churn riski).
- **Cron 5dk→20dk→DURDURULDU** (07-18): forward iş kesin tükendikten sonra her fire "hiçbir şey değişmedi, yeşil" oldu → manuel busywork, sıfır değer, token israfı. İyi kaynak yönetimi gereği durduruldu (başarısızlık DEĞİL — güvenli otonom işin doğal bitişi). Kullanıcı dönünce runtime/pick/perf işlerine GUI testiyle birlikte girilecek; isterse cron yeniden kurulur.
- **KULLANICI DÖNÜNCE SIRADAKİ (runtime/GUI):** (a) gizmo "feel" ayarı + kullanıcı feedback'i, (b) imleç-altı yüzey noktasında şişirme (mouse-ray × yüzey pick), (c) katı yüz edge-tilt köprüsü (yuzDondur/yuz_tasi'yı edge-grab'e bağla), (d) perf profil (önce ÖLÇ). Motor tarafı bunların hepsi için HAZIR.
- [x] **Yüzey Yumuşat/Düzelt** (`yuzeyDuzelt` — Laplacian/Jacobi relax iç pole'lar, sınır sabit): şişirmenin eşi, kubbe/pürüz yumuşatır. Feature (miktar+iterasyon) + sağ menü (skaler→çip değil). Test-kilitli (geometri 905, gsd 228).
- [x] **Köprüle** (`koprule` — bridge 2 kenar/tel → ThruSections shell) 2-kaynak feature + menü + test (geometri 900).

### DALGA D — Çoklu-kesit/yol jesti
- [ ] Loft / Blend / Sweep: sıralı seçim + FIFO çip şeridi. brep: `loftKati` var (solid); açık-shell loft/sweep gerek.

### DALGA E — Yüzey kalite analizi
- [ ] Zebra (Vulkan fragment shader), Kurvatür (`BRepLProp_SLProps`), Draft, Porcupine, Reflect-line.

### DALGA F — Render modu + Materyal atama (kullanıcı 07-18 ekledi)
- [ ] Nesnelere render modu (PBR/gerçekçi) + materyal atama (metal/plastik/cam/ahşap… kütüphane). DM'den seçili nesneye materyal ata (sağ-tık "Materyal" → kütüphane). Render tarafına PBR shader (mevcut Vulkan pipeline'a ekle, push-constant 256B DOLU → SSBO/attr planı). AyarSistemi "Render". GSD işleri bitince yapılacak.

## Notlar / gotcha
- Yeni yüzey feature'ları DoubleSide ayrı katman (katı ile birleşmez). `gsdDugumEkle`/`gsdDugumGuncelle` kullanılıyor.
- brep.hpp Part Design tarafında HAZIR (katı): `yuzeyCikar/yuzeyKatilastir/yuzeyOfset/yuzeyIleBol/loftKati/revolve/sweep(MakePipe)`.
- Wireframe bağımsız (sketch dep yok); yüzey feature `bagimliliklar()` = sketch.
- BRepMesh `isInParallel=false`, `OSD::SetSignal` — dokunma.
