Files
citrus/scratch/detailed_intern_analysis.json

1552 lines
992 KiB
JSON
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"18": {
"name": "Emre Satıl",
"email": "emresatil72@gmail.com",
"repo": "https:\/\/github.com\/Emresatil\/Recycle-Rush-VR\/commits\/release\/v1.0-final-integration-and-bugs",
"github_username": "Emresatil",
"start_date": "2026-07-01",
"end_date": "2026-08-30",
"total_days": 43,
"filled_days": 42,
"entries_sample": {
"first": {
"day": 1,
"date": "2026-07-01",
"content": "1. Gün (01.07.2026) Çalışma RaporuBugün staj sürecimin ilk günüydü ve projemizin teknik altyapısını kurarak işe koyuldum. \"Recycle-Rush-VR\" isimli VR tabanlı geri dönüşüm projemiz için ilk adımları attım.Repository Kurulumu: GitHub üzerinde projemizin tüm kodlarını barındıracak olan Recycle-Rush-VR deposunu (repository) oluşturdum. Projenin versiyon kontrolünü sağlıklı bir şekilde yönetmek için gerekli ayarları yaptım.Proje Planlaması (GDD ve Roadmap): Projenin anayasası niteliğinde olan implementation_plan.md dosyasını hazırladım. Projenin teknik mimarisini, oyun döngüsünü ve 20 günlük çalışma planını bu dokümana işledim. Çalışmamı ana dala (main) dahil etmek için \"Pull Request\" sürecini başlattım, bu sayede hocalarımızın onayına sunmuş oldum.İş Yönetimi (Kanban): Proje yönetimini disiplinli sürdürmek için GitHub Projects üzerinde bir Kanban panosu hazırladım. \"To Do\", \"In Progress\", \"Review\" ve \"Done\" sütunlarını oluşturarak işlerimi bu sistem üzerinden takip etmeye başladım.Proje Fikri ve Hedef: Projenin odağını belirledim: insanların geri dönüşüm alışkanlığı kazandıran, hızlı ve eğlenceli bir VR simülasyonu yapacağız. 3D modelleme yerine hazır varlıklar (asset) kullanarak tamamen oyun mekaniklerine, VR etkileşimlerine ve kod mimarisine odaklanmayı hedefledim.Kazanım: Bugün, bir yazılım projesinde kod yazmaktan çok, o projenin nasıl disiplinli bir şekilde yönetileceğini öğrendim. Branch ve Pull Request mantığını kullanarak ana kodu korumayı ve işlerimi planlı bir şekilde Kanban panosunda takip etmeyi pratik ettim."
},
"middle": {
"day": 22,
"date": "2026-07-31",
"content": "22. Gün (31.07.2026) Çalışma RaporuBugün, stajımızın ilk 20 günlük periyodunu başarıyla tamamlayıp Recycle Rush projesinin MVP sürümünü Meta Store Alpha kanalına yüklememizin ardından, takım arkadaşımla birlikte ikinci ayın planlamasını ve yol haritasını oluşturmaya odaklandım. Sıfırdan yeni bir projeye başlamak ile mevcut projeyi geliştirmek arasındaki zaman\/maliyet (Time-to-Market) analizini detaylıca tartıştık. Yeni bir projeye başlamanın; sıfırdan uyumlu 3D modeller aramak, arayüz (UI) tasarlamak ve Obje Havuzu (Object Pooling) gibi temel mimarileri baştan kurmak açısından kısıtlı zamanımızı verimsiz kullanmamıza neden olacağına karar verdim. Bunun yerine, çalışan ve test edilmiş hazır kod mimarimizin üzerine kat çıkarak projeyi ölçeklendirme (scaling) stratejisini seçtim.Bu strateji doğrultusunda oyunumuzun vizyonunu tamamen değiştirecek kritik bir mimari karar aldım. İlk ay konveyör bandı üzerinde yaşanan ve çözümü saatler süren kompleks fizik kilitlenmelerini (deadlock) ve sürtünme hatalarını tamamen ortadan kaldırmak amacıyla projeyi Sanal Gerçeklikten (VR), Meta'nın Passthrough (Dış Kamera) teknolojisini kullanan bir Karma Gerçeklik (AR - Mixed Reality) deneyimine geçirmeye karar verdim. Konveyör bandı mekaniğini iptal edip, bunun yerine Spatial Anchors (Uzamsal Çapalar) kullanarak geri dönüşüm kutularını doğrudan oyuncunun fiziksel odasına yerleştiren, çok daha stabil ve performansı yüksek bir oyun döngüsü kodlamayı planladım.Gün sonunda, aldığımız bu mimari kararları projenin ana dizininde `STAJ_2_AY_PLAN.md` isimli bir dokümantasyon dosyasına dökerek GitHub'a işlemeye geçtim. Ancak, dün gönderdiğim sürüm adayı (Release) Pull Request'i staj sorumlumuz tarafından henüz onaylanıp (Merge) ana dala (main) katılmamıştı. Kod çakışmalarını önlemek ve ana dalı kirletmemek adına staj sorumlumuzun tavsiyesi üzerine \"Bağımlı Değişiklikler (Stacked Pull Requests)\" yöntemini uyguladım. Yeni AR planlama dalımı `main` yerine dünkü bekleyen dalımın (branch) üzerinden filizlendirdim. GitHub Desktop üzerinden resmi \"Start a pull request stack\" özelliğini kullanarak, dünkü kodların üzerine binen zincirleme ve bağımlı bir PR açarak versiyon kontrol sürecini kusursuz bir şekilde tamamladım.Git Commit Mesajları:[19:31] (84438c9) docs: add phase 2 architectural transition plan to AR Documented the team's decision to pivot the project from VR to AR (Mixed Reality) for the second month of development. Outlined the architectural shift from complex conveyor belt mechanics to spatial anchors (Passthrough technology) to ensure zero physics deadlocks, higher stability, and better scalability."
},
"last": {
"day": 42,
"date": "2026-08-28",
"content": "Konu: Kritik Sürüm Çakışmalarının (Merge Conflict) Çözümü, Kod Refactoring ve Teknik Dokümantasyonİş Takibi ve PlanlamaMesaiye başladığımda, versiyon kontrol sisteminde (GitHub) gerçekleştirilen son birleştirmeler (merge) sonrasında projeyi derlenemez (compile error) duruma getiren ciddi kod çakışmalarını tespit ettim. Bu kritik derleme hatalarını kayıt altına almak ve planlı ilerlemek için GitHub üzerinde detaylı bir \"Issue\" oluşturdum. Hata çözüm sürecini ana projeden bağımsız yürütebilmek amacıyla `fix\/core-systems-recovery-and-refactor` isminde yeni bir çalışma dalı (branch) açarak kodlamaya geçtim.Kritik Çakışmaların (Merge Conflict) GiderilmesiProjeyi kitleyen ana sorunların `GameManager.cs` ve `UIManager.cs` dosyalarındaki çakışmalardan kaynaklandığını belirledim. Birleştirme (merge) işlemi sırasında bozulan parantez (scope) hiyerarşisini, hatalı erişim belirleyicilerini (invalid modifiers) ve mükerrer (çift) yazılan metodları tek tek temizleyerek scriptleri stabil ve hatasız hallerine geri getirdim.Ayrıca, kum saati (Hourglass) güçlendirmesinin çalışmasını sağlayan ancak çakışma esnasında kazara silinmiş olan `AddTime` metodunu `GameManager` sınıfına yeniden entegre ettim. VR donanım ayarlarını barındıran `OpenXRPackageSettings.asset` dosyasında meydana gelen endeks çakışmasını da güncel konfigürasyonu koruyarak çözdüm.Kod Temizliği ve Optimizasyon (Refactoring)Çevre etkileşimlerini yöneten scriptlerde kod incelemesi (Code Review) yaptım. `BinTrigger.cs` içerisinde `ProcessedWasteType` gibi çift tanımlanmış struct değişkenlerini ve `WasteSpawner.cs` dosyasındaki mükerrer prefab referanslarını koddann arındırdım. Bu temizlik sayesinde gereksiz bellek kullanımını ve olası mantıksal (logic) hataları engelledim.Teknik Dokümantasyon ve Mağaza HazırlığıGeliştirme sürecinin son aşamalarına gelirken, kurduğumuz yazılım mimarisini (State Machine, Object Pooling, Event-Driven Architecture) ve seviye matematiklerini detaylıca anlatan profesyonel bir `README.md` belgesi hazırlayıp projeye ekledim. Buna ek olarak, uygulamanın Meta Horizon (App Lab) mağazasına yüklenebilmesi için MR mekaniklerini ve güvenlik uyarılarını içeren mağaza metnini hazırlayarak `docs\/store\/meta_store_description.md` dizinine yerleştirdim.Sürüm Kontrolü ve KapanışGün boyunca çözülen çakışmaları, yapılan kod temizliklerini ve eklenen dokümanları birbirine karıştırmadan, mantıksal parçalara bölerek (Atomic Commit) GitHub Desktop üzerinden commitledim. Mesai bitiminde, onarılan ve derlenebilir duruma gelen bu dalı ana (main) projeye güvenli bir şekilde aktarmak üzere tüm süreci özetleyen bir Pull Request (PR) açarak günlük çalışmalarımı tamamladım.Git Commit Mesajları:[01:26] (d3980e6) fix(core): resolve catastrophic merge conflicts in game and ui managers - Reconstructed corrupted methods and resolved duplicated logic blocks introduced during recent PR merges. - Fixed mismatched brackets and invalid access modifiers that caused severe compilation failures. - Restored the missing 'AddTime' method in GameManager for the hourglass power-up functionality. - Ensured a pristine and stable state for UI and Game lifecycle events.[01:27] (5174a91) fix(environment): clean up duplicated variable declarations - Removed duplicated 'ProcessedWasteType' field in the SortResultData struct. - Cleaned up redundant event and method declarations at the bottom of BinTrigger. - Consolidated duplicated power-up prefab declarations (hourglass and magnet) in WasteSpawner.[16:10] (709ddd3) docs: update project README and add Meta Horizon store description - Rewrote the main README.md to comprehensively document the software architecture (FSM, Object Pooling, JSON Save System), level balancing metrics, and MR integration. - Created the official store description file for the Meta Horizon (App Lab) release, including MR safety disclaimers and gameplay features. - Structured documentation following professional standards to prepare the repository for final evaluation and store submission."
}
},
"full_text_length": 183652,
"all_entries": [
{
"day": 1,
"date": "2026-07-01",
"content": "1. Gün (01.07.2026) Çalışma RaporuBugün staj sürecimin ilk günüydü ve projemizin teknik altyapısını kurarak işe koyuldum. \"Recycle-Rush-VR\" isimli VR tabanlı geri dönüşüm projemiz için ilk adımları attım.Repository Kurulumu: GitHub üzerinde projemizin tüm kodlarını barındıracak olan Recycle-Rush-VR deposunu (repository) oluşturdum. Projenin versiyon kontrolünü sağlıklı bir şekilde yönetmek için gerekli ayarları yaptım.Proje Planlaması (GDD ve Roadmap): Projenin anayasası niteliğinde olan implementation_plan.md dosyasını hazırladım. Projenin teknik mimarisini, oyun döngüsünü ve 20 günlük çalışma planını bu dokümana işledim. Çalışmamı ana dala (main) dahil etmek için \"Pull Request\" sürecini başlattım, bu sayede hocalarımızın onayına sunmuş oldum.İş Yönetimi (Kanban): Proje yönetimini disiplinli sürdürmek için GitHub Projects üzerinde bir Kanban panosu hazırladım. \"To Do\", \"In Progress\", \"Review\" ve \"Done\" sütunlarını oluşturarak işlerimi bu sistem üzerinden takip etmeye başladım.Proje Fikri ve Hedef: Projenin odağını belirledim: insanların geri dönüşüm alışkanlığı kazandıran, hızlı ve eğlenceli bir VR simülasyonu yapacağız. 3D modelleme yerine hazır varlıklar (asset) kullanarak tamamen oyun mekaniklerine, VR etkileşimlerine ve kod mimarisine odaklanmayı hedefledim.Kazanım: Bugün, bir yazılım projesinde kod yazmaktan çok, o projenin nasıl disiplinli bir şekilde yönetileceğini öğrendim. Branch ve Pull Request mantığını kullanarak ana kodu korumayı ve işlerimi planlı bir şekilde Kanban panosunda takip etmeyi pratik ettim."
},
{
"day": 2,
"date": "2026-07-02",
"content": "2. Gün (02.07.2026) Çalışma RaporuBugün proje için Meta Quest Android build ayarlarını yaptım. Unity projesini Android platformuna geçirerek gerekli yapılandırmaları kontrol ettim. Android Build Support, OpenJDK ve Android SDK\/NDK kurulumlarını doğruladım. Daha sonra Player Settings bölümünde Package Name, API Level, IL2CPP ve ARM64 ayarlarını Meta Quest'e uygun şekilde düzenledim.OpenXR ve Meta Quest XR ayarlarını kontrol ederek gerekli özelliklerin aktif olduğunu doğruladım. Quality ve Graphics ayarlarını inceleyip Android platformu için uygun yapılandırmayı kullandım.Ayrıca proje dokümantasyonunu düzenledim. docs klasörü içerisindeki implementation plan dosyasını kontrol ettim. docs\/assets klasörüne proje için hazırlanan logo, katmanlı uygulama ikonu (Layered App Icon), VR arayüz görselleri ve uygulama mockuplarını ekledim. README dosyasını bu görselleri gösterecek şekilde güncelleyerek proje tanıtımını daha düzenli hale getirdim.Yaptığım değişiklikleri Git üzerinde yeni bir branch oluşturarak kaydettim. Değişiklikleri commit ettikten sonra GitHub'a gönderip Pull Request oluşturarak kod incelemesine sundum."
},
{
"day": 3,
"date": "2026-07-03",
"content": "3. Gün (03.07.2026) Çalışma RaporuBugün proje için kullanılacak Low-Poly modelleri araştırdım ve projeye uygun ücretsiz kaynaklardan indirdim. İndirdiğim modelleri Unity projesine eklemeden önce düzenli bir klasör yapısı oluşturdum. Bu kapsamda Assets\/ThirdParty\/Models dizini altında Environment, Props ve Waste klasörlerini oluşturarak modelleri kullanım alanlarına göre kategorilere ayırdım.Environment klasörüne fabrika ortamında kullanılacak çevre, zemin, platform ve konveyör bant modellerini, Props klasörüne varil, palet, koli ve benzeri yardımcı nesneleri, Waste klasörüne ise geri dönüştürülebilir atık modellerini yerleştirdim. Bu sayede proje içerisindeki üçüncü taraf varlıkları daha düzenli ve yönetilebilir bir yapıda topladım.Daha sonra modelleri Unity projesine import ederek sahne içerisinde kontrollerini yaptım. Model ve materyalleri inceleyerek karşılaştığım uyumluluk sorunlarını gidermeye çalıştım ve gerekli materyal ayarlarını proje ile uyumlu hale getirmek için düzenledim.Ayrıca GitHub üzerinde bu çalışma için ayrı bir görev (Issue) oluşturdum. Oluşturduğum görev üzerinden yeni bir branch açarak çalışmaya başladım ve Git akışına uygun şekilde commit ve Pull Request süreci için hazırlık yaptım.Git Commit Mesajları:[02:49] (29347e7) Merge pull request #7 from Emresatil\/feature\/meta-quest-build-settings Configure Meta Quest Android build settings[10:25] (a9567a7) Merge branch 'main' into feature\/unity-setup[10:38] (35dc9db) Merge pull request #6 from Emresatil\/feature\/unity-setup feat(core): configure XR Interaction Toolkit and OpenXR"
},
{
"day": 4,
"date": "2026-07-06",
"content": "4. Gün (04.07.2026) Çalışma RaporuBugün oyunun ana sahnesi olan MainGame üzerinde blockout çalışmasını gerçekleştirdim. İlk olarak oyun alanının temel yapısını oluşturmak için zemin, duvarlar, taşıma bandı ve geri dönüşüm kutularının yerleşimini planlayarak sahneye ekledim. Oyuncunun hareket edeceği alanı daha rahat görebilmek amacıyla nesnelerin konumlarını ve ölçeklerini düzenledim. Ayrıca oyuncunun oyuna başlayacağı SpawnArea, atıkların oluşacağı WasteSpawner ve geri dönüşüm işleminin gerçekleştirileceği DropZone nesnelerini oluşturarak sahnede uygun konumlara yerleştirdim.Daha sonra VR altyapısını hazırlamak amacıyla XR Interaction Toolkit paketi içerisindeki Starter Assets paketini projeye kurdum. Kurulum tamamlandıktan sonra XR Origin bileşenini sahneye ekleyerek oyuncu kamerası ve kontrolcü yapısını oluşturdum. XR Origin hiyerarşisini inceleyerek kamera, sol ve sağ kontrolcü nesnelerinin doğru şekilde oluşturulduğunu kontrol ettim. Kurulum sırasında gerekli ayarları gözden geçirerek XR bileşenlerinin sorunsuz çalışmasını sağladım.Son olarak oluşturduğum sahneyi Unity üzerinde test ederek nesnelerin yerleşimini, oyuncunun başlangıç konumunu ve XR Origin yapısının doğru çalışıp çalışmadığını kontrol ettim. Yapılan çalışmalar sonucunda ana oyun sahnesinin temel yapısını ve VR geliştirme altyapısını bir sonraki geliştirme aşamasına hazır hale getirdim.Git Commit Mesajları:[12:59] (26cda63) Setup XR Interaction Toolkit Starter Assets - Imported XR Interaction Toolkit Starter Assets package - Added and configured XR Origin (XR Rig) - Set up camera, controllers and locomotion components - Prepared the MainGame scene for initial VR development and device testing"
},
{
"day": 5,
"date": "2026-07-07",
"content": "5. Gün (07.07.2026) Çalışma RaporuBugün, Recycle Rush VR projesinin temel oyun döngüsünün (core loop) ilk adımı olan taşıma bandı sistemi üzerine çalıştım. Oyuncunun etkileşime gireceği atıkların sahneye sürekli ve düzenli bir şekilde akmasını sağlayacak bu sistemin pürüzsüz çalışması çok önemliydi. Özellikle VR projelerinde objelerin takılarak hareket etmesi deneyimi çok bozduğu için optimizasyona dikkat etmem gerekiyordu.Geliştirmeye başlarken öncelikle proje hiyerarşisini düzenli tutmak adına Assets\/_App\/Scripts\/Environment dizini altında BeltMovement.cs adında yeni bir script oluşturdum. Başlangıçta objeleri sadece Update döngüsü içinde transform.position değiştirerek kaydırmayı denedim. Fakat XR Device Simulator ile yaptığım ilk testlerde, objelerin bant üzerinde ilerlerken ciddi şekilde titrediğini (jittering) ve takılmalar yaşadığını fark ettim.Bu titreme sorununu çözmek için hareketi tamamen Unity'nin fizik motoruna devretmeye karar verdim. Sahnedeki taşıma bandı objesine bir Rigidbody komponenti ekledim ve yerçekiminden etkilenmemesi için isKinematic özelliğini aktif ettim. Kod tarafında ise hareketi Update yerine fizik hesaplamalarının yapıldığı FixedUpdate fonksiyonuna taşıdım. Bandı kod ile çok küçük bir miktar ileri hareket ettirip, hemen ardından Rigidbody.MovePosition komutuyla tekrar eski konumuna çeken bir mantık kurdum. Bu sayede bant görsel olarak sabit kalsa da, fizik motoru üzerinde bir hareket algıladığı için bandın üzerine düşen atık objeleri sürtünme kuvvetiyle pürüzsüzce ileriye doğru kaydırmaya başladı.Scriptin yazımını tamamladıktan sonra sahnede ilgili objeye atamasını yaptım ve hız değişkenlerini (speed) Unity Inspector üzerinden ayarlanabilir hale getirdim. Son olarak VR başlığını sürekli tak-çıkar yapıp zaman kaybetmemek adına XR Device Simulator kullanarak simülasyonu çalıştırdım. Yaptığım testler sonucunda objelerin bant üzerinde hiçbir titreme yapmadan, akıcı bir şekilde oyuncuya doğru aktığını doğruladım.Günün ikinci yarısında, projenin sadece koddan ibaret olmaması ve sürdürülebilir olması adına dokümantasyon çalışmalarına ağırlık verdim. GitHub repomuzda Wiki sekmesini aktif ederek oyunun \"Kurulum\", \"Kullanılan Teknolojiler\", \"Proje Yapısı\" ve \"Proje Hakkında\" gibi temel sayfalarını oluşturdum. Geliştirdiğimiz mimariyi ve sistem gereksinimlerini buraya detaylıca işledim.Son olarak süreç yönetimimizi daha da profesyonelleştirmek için GitHub Discussions sekmesini kullanmaya başladım. Burada \"Sprint 1 Retrospective\" (1. Sprint Değerlendirmesi) adında bir tartışma başlığı açtım. Geride bıraktığımız ilk sprintte neleri iyi yaptığımızı, nerelerde zorlandığımızı (örneğin fizikteki titreme sorunu) ve bir sonraki sprintte nasıl daha hızlı ilerleyebileceğimizi değerlendirdik. Gerek Kanban board kullanımı, gerekse PR (Pull Request) ve Issue eşleştirmeleriyle proje yönetimi açısından oldukça verimli ve disiplinli bir günü geride bırakmış olduk.Git Commit Mesajları:[12:12] (93a797a) feat: Add BeltMovement script and update MainGame scene - Created BeltMovement.cs to enable smooth sliding of physical objects on the X-axis over the conveyor belt. - Integrated the script into the relevant conveyor belt object in the MainGame scene. - Completed Day 5 task requirements."
},
{
"day": 6,
"date": "2026-07-08",
"content": "6. Gün (08.07.2026) Çalışma RaporuBugün, Recycle Rush VR projesinde oyuncunun taşıma bandından alıp geri dönüşüm kutularına atacağı temel atık objelerinin oyun motoruna entegrasyonunu gerçekleştirdim. Takım içi görev dağılımımız kapsamında ben Plastik ve Kağıt atıkların kurulumunu üstlenirken, takım arkadaşım Cam ve Metal atıklar üzerinde çalıştı. Paralel çalışarak hem süreci hızlandırdık hem de GitHub üzerinde aynı dosyalara müdahale etmekten kaynaklanabilecek \"merge conflict\" (çakışma) durumlarının önüne geçtik.Çalışmalarıma başlamadan önce staj hocamın verdiği çok değerli bir tavsiyeyi iş akışıma dahil ettim: Gün sonu devasa tek bir commit atmak yerine, yapılan her anlamlı değişikliği küçük ve takip edilebilir parçalar halinde (Atomic Commits) versiyon kontrol sistemine göndermek. Bu prensiple bugünkü görevimi iki mantıksal aşamaya böldüm.İlk aşamada oyunun atık ayrıştırma (sorting) algoritmasının altyapısını kurdum. Oyuncunun elindeki objeyi doğru kutuya attığını kod üzerinden algılayabilmemiz için Unity Project Settings üzerinden Plastic, Paper, Glass ve Metal etiketlerini (Tag) sisteme tanımladım. Ardından Plastik atıklara odaklandım. Sahip olduğumuz 3D FBX modellerini (su şişesi, şampuan kutusu vb.) doğrudan prefab yapmanın ileride model güncellemelerinde referans sorunlarına (Missing Prefab) yol açabileceğini biliyordum. Bu yüzden modelleri önce sahneye alıp Prefab > Unpack Completely komutuyla orijinal model bağlarını tamamen kopardım. Ardından her birine, plastiğin hafifliğini simüle edecek şekilde kütlesi (mass) 0.5 olan bir Rigidbody ekledim. VR'da performans kaybı yaşamamak ve objeyi tutma (grab) etkileşimlerini pürüzsüz kılmak adına, objelerin tam şeklini saran Mesh Collider bileşeni ekleyip Convex özelliğini aktif ettim. Bu 5 farklı plastik modeli kendi klasörümüzde bağımsız \"Original Prefab\" haline getirdikten sonra, bu değişiklikleri daha önce oluşturduğum Tag tanımlamalarıyla birlikte aynı commit içerisinde kayıt altına aldım.Son aşamada ise aynı işlemleri Kağıt objeleri (karton kutu, defter, parşömen vb.) için uyguladım. Kağıdın plastiğe göre daha hafif olması gerektiğinden kütle değerlerini 0.2 olarak ayarladım. Bu çalışmayı ayrı bir commit ile kayıt altına aldım. Günün sonunda, temiz ve okunabilir bir Git geçmişiyle (history) kodlarımı uzak sunucuya (origin) Push ettim ve takım arkadaşımın incelemesi için bir Pull Request (PR) açtım.Bugünkü çalışmalarım sayesinde hem Unity'de \"Nested Prefab\" (içe içe şablon) mantığının risklerini öğrenip doğru şablonlamayı (Solid Blue Box) kavradım, hem de versiyon kontrol sistemini sadece bir yedekleme aracı olarak değil, geliştirme sürecinin detaylı bir günlüğü olarak kullanma alışkanlığı kazandım.Git Commit Mesajları:[12:05] (3f6a5c3) feat: add core sorting tags and create Plastic waste prefabs - Added 'Plastic', 'Paper', 'Glass', and 'Metal' tags to Project Settings for the sorting mechanic. - Created 5 distinct Plastic waste Original Prefabs (Water bottle, Soda, Shampoo, Container, Bottle). - Unpacked original FBX models and added Rigidbody (mass: 0.5) and Convex Mesh Collider to each prefab. - Assigned 'Plastic' tag to all plastic objects.[12:26] (137c54f) feat(prefabs): create Paper waste prefabs with physics - Created 5 distinct Paper waste Original Prefabs (Book, Cardboard Box, Notebook, Papers, Scroll). - Unpacked original FBX models to create clean prefab assets. - Added Rigidbody (mass: 0.2) and Convex Mesh Collider to each prefab for accurate VR physics interactions. - Assigned 'Paper' tag to all objects for the waste sorting system."
},
{
"day": 7,
"date": "2026-07-09",
"content": "7. Gün (09.07.2026) Çalışma RaporuBugün, Recycle Rush VR projesinin temel oynanış hissini (Game Feel) doğrudan etkileyecek olan en önemli VR mekaniğini, yani atıkları banttan alıp fırlatma sistemini geliştirdim. Dün temel fizik ayarlarını (Rigidbody, Collider) tamamladığımız Plastik ve Kağıt atık prefab'larını, bugün oyuncunun sanal elleriyle etkileşime girebileceği hale getirdim.İlk aşamada kendi branch'im üzerinden çalışarak tüm plastik ve kağıt objelere Unity XR Interaction Toolkit'in temel bileşeni olan XR Grab Interactable scriptini entegre ettim. VR'da objeleri tuttuğumuzda ağırlık hissini doğru verebilmek ve objelerin diğer fiziksel yüzeylerin içinden geçmesini engellemek için bileşen içerisindeki Movement Type ayarını Velocity Tracking olarak yapılandırdım. Ayrıca objenin aniden oyuncunun eline ışınlanmasının (snapping) yarattığı yapay hissiyatı kırmak için Smooth Position ve Smooth Rotation algoritmalarını aktif ettim.İkinci aşamada, tutuş ergonomisini iyileştirmeye karar verdim. Örneğin bir kitabın veya büyük bir şişenin rasgele bir köşesinden tutulması VR deneyiminin inandırıcılığını bozuyordu. Bu sorunu çözmek için prefab'ların içine görünmez birer `GrabPoint` (Tutma Noktası) alt objesi (Child GameObject) oluşturarak, objelerin tam ağırlık merkezlerine yerleştirdim. Sonrasında bu objeleri XR Grab bileşenindeki Attach Transform özelliğine bağlayarak, oyuncunun atıkları kusursuz ve anatomik olarak doğal bir şekilde kavramasını sağladım. Çalışmalarımı XR Device Simulator ile test edip tüm işlemleri atomik commit'ler halinde uzak sunucuya Push ederek PR açtım.Ancak bugünün bana kattığı en büyük tecrübe, staj hocamdan aldığımız Kod İncelemesi (Code Review) geri bildirimi oldu. Hocamız, ana oyun döngüsünü kontrol eden 2000 satırlık `MainGame.cs` dosyasının yazılım mimarisindeki meşhur \"God Object\" (Tanrı Nesne) anti-pattern'ine dönüştüğü uyarısını yaptı. Oyunun puanlamasını, atık üretimini ve bant hareketini tek bir dosyada yürütmenin \"Single Responsibility\" (Tek Sorumluluk) prensibini ihlal ettiğini teorik olarak kavramış olduk. Takım halinde projelerde yaşadığımız entegrasyon sıkıntılarının temel sebebinin de bu spagetti kod yapısı olduğunu fark ettik. Hocamızın tavsiyesi üzerine takım arkadaşımla toplantı yaparak, bir sonraki aşamanın ilk işi olarak bu devasa yapıyı `ScoreManager`, `WasteSpawner` gibi tek bir görevden sorumlu bağımsız modüllere parçalama (Refactoring) kararını aldık.Git Commit Mesajları:[11:02] (c39b363) feat(vr): implement XR Grab Interactable for Plastic prefabs - Configured 5 distinct Plastic waste prefabs for VR hand interactions. - Added 'XR Grab Interactable' component to enable core mechanics (grab, hold, and throw). - Set 'Movement Type' to 'Velocity Tracking' to simulate realistic mass and ensure accurate physics collisions while the object is held by the player.[15:36] (85fa834) feat(vr): implement XR Grab Interactable for Paper prefabs - Configured 5 distinct Paper waste prefabs for VR hand interactions. - Added 'XR Grab Interactable' component to establish consistent picking and throwing mechanics. - Set 'Movement Type' to 'Velocity Tracking' to maintain physical integrity and prevent objects from clipping through the environment during grabs.[17:08] (1fc017c) feat(vr): implement XR Grab Interactables for Paper and refine Plastic attach points - Configured 5 distinct Paper waste prefabs with XR Grab Interactable, setting Movement Type to Velocity Tracking for realistic VR physics. - Added 'GrabPoint' child objects to all Paper prefabs and assigned them as Attach Transforms for accurate hand placement. - Updated existing Plastic prefabs by adding 'GrabPoint' Attach Transforms to improve grab ergonomics and game feel across all waste items. - Applied Smooth Position\/Rotation to all interactables for premium interaction quality."
},
{
"day": 8,
"date": "2026-07-10",
"content": "8. Gün (10.07.2026) Çalışma RaporuBugün staj planımızdaki Spawner görevine ek olarak, oyunun mekaniklerini daha akıcı ve eğlenceli hale getirmek için çeşitli denemeler ve kodlamalar yaptım. İlk olarak taşıma bandının başlangıcında rastgele atıklar üretecek olan `WasteSpawner.cs` scriptini yazdım. Spawner'ı basit bir sayaç yerine `Coroutine` kullanarak dinamik bir yapıya kavuşturdum; böylece ileride oyun hızlandığında üretim aralıklarını rahatça değiştirebileceğimiz bir altyapı kurmuş oldum. Testler sırasında çöplerin hep aynı saniyede ve bandın tam ortasına düştüğünü fark ettim. Oyunun bu robotik hissiyatını kırmak için üretim sürelerine `Random.Range` ile rastgelelik kattım ve çöplerin pozisyonlarına ufak bir sapma (offset) değeri ekledim. Bu noktada bazı fiziksel problemlerle karşılaştım. Offset değerini başta 0.4f gibi yüksek tuttuğumda, büyük karton kutular bandı aşıp doğrudan yere düşüyordu; değeri 0.1f'e indirerek bu taşma problemini çözdüm. Ayrıca çöplerin farklı açılarla düşmesi için verdiğim 3D rotasyon yüzünden şişeler yan düşüp bantta yuvarlanıyordu. Rotasyonu `Quaternion.Euler` komutuyla sadece Y ekseninde (kendi etrafında) dönecek şekilde kısıtlayarak şişelerin bantta dik bir şekilde ilerlemesini sağladım. Spawner kısmını, aynı çöpün üst üste gelmesini engelleyen ufak bir anti-tekrar kontrolü yazarak tamamladım.Günün ikinci yarısında, VR oyun hissiyatını (Game Feel) artırıp artıramayacağımızı test etmek için alternatif bir mekanik üzerine Ar-Ge yaptım. Çöplerin banttan düşmesi yerine uzay boşluğunda süzülmesini sağlayan `AntigravityItem.cs` adında yepyeni bir script yazdım. Bu kod ile objelerin yerçekimini kapatıp yukarı yönlü hafif bir süzülme kuvveti uyguladım. Objelerin oyuncu tarafından tutulduğunda veya fırlatıldığında normal fiziğine (gerçek dünya yerçekimine) dönmesi gerekiyordu. Bunun için Unity'nin XR Interaction Toolkit kütüphanesini araştırdım ve etkileşim event'lerini (`selectEntered` ve `selectExited`) koda bağlayarak objenin tutulma ve bırakılma durumlarını başarıyla kontrol ettim. Bugün yazdığım kodları ve yaptığım fizik düzeltmelerini detaylı İngilizce açıklamalarla commit'leyip GitHub reposuna Push ettim ve günün görevini başarıyla tamamladım.Git Commit Mesajları:[11:03] (9ca67ef) feat(core): create standalone WasteSpawner script Implemented a modular WasteSpawner.cs script using InvokeRepeating to instantiate random prefabs at set intervals. Separated spawning logic from MainGame to respect Single Responsibility Principle.[14:18] (4c15f26) feat(core): implement antigravity physics and object pooling spawner - Refactored 'WasteSpawner' to utilize Object Pooling, pre-allocating prefabs in Awake to eliminate runtime Instantiate calls and prevent GC spikes. - Transitioned spawner timing to a dynamic Coroutine structure, establishing the architecture for event-driven difficulty scaling. - Introduced 'AntigravityItem' for all waste prefabs, replacing standard gravity with upward force and randomized torque for a zero-gravity effect. - Integrated XR Interaction hooks (selectEntered\/selectExited) to seamlessly toggle between antigravity and standard Rigidbody physics during grab\/throw actions. - Enforced strict naming conventions (PascalCase \/ _camelCase) across all new scripts.[14:53] (e54341e) feat(core): implement organic waste spawner with dynamic intervals - Replaced static spawn timing with a dynamic Coroutine loop (min\/max interval) to increase player engagement and fluidity. - Added 'spawnWidthOffset' to drop items at randomized points across the conveyor belt width for natural physics simulation. - Implemented an anti-repeat algorithm to prevent spawning the exact same waste item consecutively. - Fully aligned with Day 8 implementation plan while preparing the architecture for future dynamic difficulty scaling.[16:50] (c159a09) feat(core): implement organic waste spawner with physics fixes - Replaced static spawn timing with a dynamic Coroutine loop (min\/max intervals) to increase gameplay fluidity. - Added 'spawnWidthOffset' (0.1f) to drop items at randomized points across the conveyor belt width without overshooting. - Replaced 3D random rotation with strictly Y-axis rotation (Quaternion.Euler) to ensure objects like bottles spawn upright and maintain proper physics stability. - Implemented an anti-repeat algorithm to prevent spawning the exact same waste item consecutively."
},
{
"day": 9,
"date": "2026-07-13",
"content": "9. Gün (13.07.2026) Çalışma RaporuBugün, takım arkadaşımla paylaştığımız görev dağılımı doğrultusunda oyunun Puan Sistemi (Score System) altyapısını kurmaya odaklandım. İlk olarak, puanı evrensel olarak yönetecek olan `ScoreManager.cs` sınıfını Singleton tasarım deseniyle oluşturdum. Sistemin işlemciyi yormaması (optimizasyon) adına `Update()` döngüleri kullanmak yerine olay güdümlü (Event-driven) bir mimari tercih ettim ve `Action<int>` (OnScoreChanged) event'ini yazdım.Bu puanı ekranda göstermek için yazdığım `ScoreUI.cs` kodunu test ederken çok ilginç bir Unity hatasıyla karşılaştım. Puan arka planda artmasına rağmen arayüz (UI) güncellenmiyordu. Yaptığım debug testleri sonucunda bunun Unity'nin rastgele çalışma sırasından (Execution Order) kaynaklanan bir yarış durumu (Race Condition) olduğunu fark ettim. Dinleme (Subscribe) işlemini `OnEnable` metodundan `Start()` metoduna taşıyarak bu sorunu profesyonelce çözdüm.Ardından dün yazılan `BinTrigger.cs` (Kutu Tetikleyicisi) kodu ile benim `ScoreManager` kodumu birbirine bağladım. Bunu yaparken kodların birbirine bağımlı (tight coupling) olmaması için sadece event'ler üzerinden iletişim kurmalarını sağladım. Doğru kutuda puan ekleme, yanlış kutuda ise matematiksel mutlak değer (`Mathf.Abs`) kullanarak puan düşürme mantığını kurguladım.Test aşamasında VR projelerinin klasik bir sorunuyla yüzleştim: Çöplerin (Prefab) ana gövdesinde (Root) etiket (Tag) bulunmasına rağmen, çarpışma kutuları (Collider) alt objelerde (Child) olduğu için sistem çöpleri \"Untagged\" olarak görüyordu. `BinTrigger` kodunu güncelleyerek, çarpan objenin en üst atasına (`transform.root`) kadar çıkıp Tag aramasını sağladım ve sorun çözüldü. Ayrıca silinme (Destroy) işleminde havada boş obje (Memory Leak) kalmaması için her zaman Root objenin silinmesini zorunlu kıldım.Son olarak, sahnede bulunan 20'den fazla çöp prefab'ına ilgili Tag'leri (Plastic, Glass, Metal, Paper) ekledim. Taşıma bandı ve spawner koordinatlarını düzelterek fiziksel patlamaların (Physics Explosion) önüne geçtim. Yaptığım tüm bu düzeltmeleri GitHub üzerinden iki ayrı \"Atomic Commit\" halinde paketleyip, ana projeye birleştirilmesi için Pull Request (PR) açarak bugünkü görevimi başarıyla tamamladım.Git Commit Mesajları:[11:33] (6efd77a) feat(core): implement ScoreManager and event-driven UI framework - Created `ScoreManager.cs` utilizing a Singleton pattern to globally manage gameplay scoring logic. - Implemented C# Action events (OnScoreChanged) to establish a decoupled, event-driven architecture for score broadcasts. - Added AddScore and SubtractScore methods with mathematical safety checks to prevent invalid negative values. - Created `ScoreUI.cs` to dynamically update the TextMeshPro UI by listening to score events, completely eliminating the need for expensive Update() loops. - Successfully completed the first atomic sub-task for the score system implementation.[17:43] (7970e85) fix(core): resolve physics triggers and score system integration bugs - Fixed an execution order race condition in `ScoreUI.cs` by moving the event subscription to `Start()`, ensuring the UI properly initializes and tracks score changes. - Refactored `BinTrigger.cs` to recursively check the `transform.root` for tags, resolving collision detection failures caused by deeply nested VR prefabs. - Improved memory management in `BinTrigger.cs` by enforcing destruction of the root prefab instead of orphaned child colliders. - Integrated `ScoreManager.cs` to listen to `BinTrigger.OnWasteProcessed` events, fully automating positive and negative scoring logic based on accurate tag validation."
},
{
"day": 10,
"date": "2026-07-14",
"content": "10. Gün (14.07.2026) Çalışma RaporuBugün, projenin en kritik aşamalarından biri olan kullanıcı arayüzü (UI) sistemlerini VR standartlarına uygun hale getirmek üzerine yoğunlaştım. Geliştirme sürecimde fark ettim ki, geleneksel 2 boyutlu ve kameraya sabitlenmiş (Screen Space) menüler, sanal gerçeklik ortamında oyuncunun derinlik algısını bozuyor ve gerçeklik hissiyatını (immersion) ciddi şekilde zedeliyor. Bu problemi aşmak için oyun endüstrisinde standart bir pratik olan 'Diegetic UI' (oyun dünyasına fiziksel olarak entegre edilmiş arayüz) mimarisine geçiş yapmaya karar verdim. Bunun için sahneye fabrika temasına uygun, düşük poligonlu (low-poly) bir monitör modeli entegre ettim. Unity’nin arayüz sistemindeki Canvas bileşenini 'World Space' moduna alarak ve ölçeklendirme (scale) değerlerini optimize ederek, geri sayım sayacını ve oyunun anlık durumunu (Ana Menü, Oyun Başladı, Süre Bitti vb.) doğrudan bu fiziksel monitörün camına yansıttım.Bu görsel sistemi arka planda verimli bir şekilde yönetebilmek için, mimariyi modüler tutmaya özen gösterdim. Tüm kodları tek bir dosyaya yığmak (spaghetti code) yerine, Tek Sorumluluk Prensibi'ne (Single Responsibility Principle) bağlı kalarak sadece arayüzü yönetecek bağımsız bir `UIManager.cs` sınıfı kodladım. Bu sınıf, her saniye kontrol döngüsü (Update) çalıştırmak yerine, `GameManager` üzerindeki olaylara (Event) abone (subscribe) olarak çalışıyor. Böylece gereksiz işlemci (CPU) kullanımının önüne geçerek projede önemli bir optimizasyon sağlamış oldum.Test süreçlerim sırasında oyunun temel mekaniğini etkileyen kritik bir hata (bug) tespit ettim. Oyuncu atığı doğru kutuya atsa bile, sistem bazen atığı tanımıyor ve puan vermiyordu. Hiyerarşiyi incelediğimde, VR etkileşimleri (Grab Interactable) için hazırlanan prefab nesnelerinin iç içe geçmiş (nested) yapılardan oluştuğunu; etiketlerin (Tag) ana objede kalırken, çarpışmayı algılayan Collider'ların alt objelere kaydığını fark ettim. Bu kopukluğu gidermek için `BinTrigger.cs` sınıfındaki çarpışma algılama algoritmasını tamamen yeniden yazdım. String karşılaştırmaları yerine `GetComponentsInChildren` fonksiyonunu entegre ederek, çarpışan objenin tüm alt hiyerarşisini tarayan ve doğru etiketi her koşulda bulabilen hatasız (foolproof) bir sistem geliştirdim.Günün son bölümünde, oyunun hissiyatını (game feel\/juice) artırmak için görsel geri bildirimler üzerine çalıştım. Oyuncu bir atığı kutuya attığında, puanın aniden değişmesinin yeterince tatmin edici olmadığını gözlemledim. Bu nedenle `ScoreUI.cs` dosyasına müdahale ettim. Unity'de sıkça kullanılan ancak performansı olumsuz etkileyebilen Coroutine yapıları yerine, matematiksel interpolasyon (`Vector3.Lerp` ve `Color.Lerp`) fonksiyonlarını kullandım. Yeni yazdığım bu sistem sayesinde, oyuncu doğru bir atış yaptığında puan yazısı pürüzsüzce büyüyüp yeşil renkte parlarken; hatalı bir atışta (ceza aldığında) kırmızıya dönerek küçülüyor. Yaptığım tüm bu geliştirmeler, projenin basit bir prototipten çıkıp profesyonel bir VR oyununa dönüşmesinde büyük rol oynadı.Git Commit Mesajları:[11:31] (e04cba5) feat(core): overhaul waste detection and implement dynamic UI feedback - Refactored BinTrigger to recursively search nested prefab hierarchies for valid tags, ensuring 100% accurate waste detection. - Upgraded ScoreUI to use smooth Lerp interpolations instead of Coroutines for AAA-style visual feedback. - Added dynamic color shifting (Red\/Green) and scale punch animations to the score text for immediate penalty\/reward juice.[15:08] (b147259) chore(assets): import flat screen TV 3D model Added low-poly flat screen TV model to the project for diegetic UI implementation. This model will serve as the physical world-space canvas for displaying game states, scores, and time.[17:38] (051740b) feat(ui): implement UIManager to handle diegetic text updates Created UIManager system to manage world-space UI text components. The manager subscribes to GameManager events to dynamically update the remaining time and game status (MainMenu, Playing, GameOver) on the TV monitor."
},
{
"day": 11,
"date": "2026-07-16",
"content": "11. Gün (16.07.2026) Çalışma RaporuBugün stajımda projemizin hem arayüz altyapısını hazırladığım hem de oyun hissiyatını (Juice) büyük ölçüde artırdığım, benim için oldukça verimli bir gün oldu. Güne öncelikle oyun içi menülerimizde ve bilgi ekranlarında kullanacağımız kullanıcı arayüzü (UI) ikonlarını ve panel tasarımlarını projeye aktararak (import) başladım. Bu varlıkları klasörleyerek projenin içine dahil ettim. Böylece sadece düz yazılardan oluşan basit bir sistem yerine, daha profesyonel ve oyuncunun gözüne hitap eden bir menü altyapısının temelini atmış oldum.Günün büyük bir kısmında ise projemizin en eğlenceli ve yaratıcı alanlarından biri olan Görsel Efektler (Particle System) üzerine yoğunlaştım. Atık ayrıştırma mekaniğinde oyuncuya daha iyi bir geri bildirim verebilmek için, doğru atık atıldığında kutunun içinden havai fişek gibi patlayan ve eriyerek kaybolan doğa temalı yeşil \"Başarı\" efektleri tasarladım. Ardından, oyuncu yanlış atık attığında gerçekten hata yaptığını hissetmesi için daha ağır olan (yerçekimi etkisi fazla), yere çakılan ve etrafa yayılan agresif kırmızı bloklardan oluşan \"Hata\" efektleri hazırladım.Bu efektleri sadece Unity arayüzünde tasarlamakla kalmadım; kod tarafında (`BinTrigger.cs`) bunların atığın doğru veya yanlış olma durumuna göre nasıl dinamik olarak çağrılacağını (Instantiate) ve sahnede performansı düşürmemeleri için işleri bitince bellekten nasıl otomatik olarak silineceklerini (Destroy) kodladım. Geliştirme sırasında ufak tefek pürüzleri de aştım. Örneğin efektler ilk başta kutunun görünmeyen en alt kısmında patlıyordu. Araştırarak çarpışma kutusunun (Collider) tam tepe noktasını bulmayı başardım ve efekti VR'da tam olması gerektiği yere getirdim. Ayrıca Unity'de oyun çalışırken (Play modundayken) yapılan kod değişikliklerinin kaydedilmediğini de hataları çözerken bizzat yaşayarak tecrübe etmiş oldum.Önceden bir oyun oynarken arayüz tasarımlarının veya o patlamaların arkasındaki mantığı hiç düşünmezdim. Bugün arayüz ikonlarını projeye dahil edip, üzerine kendi efektlerimi tasarlayarak oyuncuya o tatmin hissini verebilmenin ne kadar önemli olduğunu anladım. Gün geçtikçe Unity'nin yapısına ve yazılım geliştirme süreçlerine daha da hakim oluyorum.Git Commit Mesajları:[11:48] (da68b39) chore(assets): import UI icons and menu panels Imported 2D icon assets and UI panels into the project. Configured texture import settings to Sprite (2D and UI) for proper Canvas rendering. Established a professional folder structure under Assets\/_App\/Art\/UI.[15:33] (cf90af1) feat(vfx): implement dynamic particle effects for waste sorting feedback - Created highly polished Particle System prefabs (SuccessParticles & FailParticles) utilizing Unity's Shuriken system to enhance game feel (juice). - Implemented advanced VFX techniques including world collision, rotation over lifetime, and mesh rendering to match the low-poly VR aesthetic. - Refactrefactored `BinTrigger.cs` to dynamically instantiate and automatically clean up (destroy) particle effects based on the player's sorting accuracy. - Calculated the precise upper bound of the bin colliders to spawn the effects at optimal eye level for VR users. - Assigned the new VFX prefabs to all recycling bins within the MainGame scene.[16:49] (754e499) feat(vfx): add aggressive fail particle effects for incorrect waste sorting - Created the `FailParticles` prefab to provide immediate, visceral negative feedback when a player sorts waste incorrectly. - Configured heavy gravity modifiers, large emission sizes, and vibrant neon red\/orange gradients to simulate a punchy, arcade-style error state. - Implemented world collision mechanics allowing error particles to physically interact and bounce off the factory environment. - Updated all recycling bins in the MainGame scene to trigger this new fail state VFX upon incorrect sorting.[17:40] (4ba8253) Delete assets\/_App\/Scenes\/MainGame.unity @umitunc Modüler Sahne Yönetimi ve Prefab Tabanlı Geliştirme ile ilgili eleştirel geri bildiriminiz için teşekkür ederim. Ekip arkadaşım şu anda MainGame sahnesini prefab'lara dönüştürmek üzerinde çalışıyor. Onun Pull Request'i bu mimari düzeltmeleri içerecektir.[17:44] (5d2376b) Merge pull request #69 from Emresatil\/Emresatil-patch-1 Delete assets\/_App\/Scenes\/MainGame.unity[23:08] (8db3fd3) feat(scene): integrate success and fail particles into MainGame scene[23:17] (6e85f0f) Revert \"feat(scene): integrate success and fail particles into MainGame scene\" This reverts commit 8db3fd33a2fcd60659dbf3af2576a1777388e1d3.[23:32] (a257ecf) fix(scene): resolve conflict by keeping main branch's MainGame.unity"
},
{
"day": 12,
"date": "2026-07-17",
"content": "12. Gün (17.07.2026) Çalışma RaporuBugün oyunun en önemli hissiyat (Game Feel) unsurlarından biri olan \"Ses Sistemini\" kurmaya odaklandım. Projedeki tüm arka plan müziklerini (BGM) ve etkileşim ses efektlerini (SFX) tek bir merkezden, düzenli bir şekilde yönetebilmek için Singleton tasarım deseniyle `AudioManager.cs` betiğini yazdım. İlk testlerim sırasında, Unity'nin varsayılan 3 boyutlu ses oynatma fonksiyonu yüzünden (`PlayClipAtPoint`), VR ortamında oyuncu bir objeyi eline aldığında kollarının kameraya olan fiziksel uzaklığı sebebiyle seslerin sönümlenip oyuncuya çok kısık geldiğini fark ettim. Oyunun o tatmin edici ve duyarlı \"Arcade\" hissiyatını korumak için, etkileşim seslerinin tamamını doğrudan kulaklığın içine duyulan 2 boyutlu `PlayOneShot` komutuna çevirerek bu problemi başarıyla çözdüm.Çalışmalarımamakine kolu (`MachineLever`) mekaniğini ses sistemime entegre ederek devam ettim. Spagetti koda sebep olmamak adına `MachineLever.cs` içerisine `OnLeverPulledAction` adında statik bir Event (sinyal) ekledim ve `AudioManager`'ın sadece bu sinyali dinleyerek kol çekilme sesini oynatmasını sağladım. Aynı zamanda oyun başladığında sürekli çalışacak bant motoru sesini (Engine Hum), doğrudan `GameManager`'ın durumlarına (`OnGameStateChanged`) abone yaparak dinamik hale getirdim. Bu süreçte Unity 6'nın yenilenmiş AudioSource Inspector arayüzündeki bazı atama problemleriyle ve kısıtlamalarla karşılaştım; bu sorunu ses dosyası atamalarını doğrudan script içerisinden `[SerializeField]` ile koda gömerek pratik bir şekilde aştım.Günün son bölümünde, projenin uluslararası standartlara uygun olması için Türkçe olan \"ses\" klasörünün adını \"Sounds\" olarak refactor ettim ve televizyon panellerindeki tüm UI metinlerini İngilizceye yerelleştirdim. Ancak bu sırada dijital ekrandaki geri sayım sayacının bazen güncellenmediği şeklinde kritik bir hata keşfettim. Kodları incelediğimde bunun bir çalışma sırası (Script Execution Order) hatası olduğunu; `UIManager`'ın, `GameManager` ayağa kalkmadan önce null dönen event'lere abone olmaya çalıştığını fark edip kodun statik abonelik mantığını düzelterek bu yarışı (race condition) sonlandırdım. Buna ek olarak, VR ortamında objeleri tutarken oyuncunun sanal ellerinin görünmez olması gibi oyun deneyimini baltalayan bir sorunu, `XR Origin` bileşenindeki `Hide Controller On Select` özelliğini devre dışı bırakarak çözdüm. Bugün yaptığım tüm mimari geliştirmeleri ve bulduğum hata çözümlerini birbirine karıştırmadan 5 farklı \"Atomic Commit\" olacak şekilde GitHub'a Push ettim ve detaylı bir Pull Request açarak günün görevini başarıyla tamamladım.Git Commit Mesajları:[11:38] (9487e71) chore(audio): import interaction and feedback sound effects - Imported AI-generated sound effects (MP3) for core game interactions to enhance game feel (juice). - Added grab and release\/drop sounds for realistic physics interactions. - Added success (ding) and fail (buzzer) feedback sounds for the waste sorting mechanics.[15:31] (de21d1d) feat(audio): implement AudioManager system and 2D interaction SFX - Created Singleton AudioManager architecture to handle BGM, UI sounds, and SFX centrally. - Modified audio system to use 2D spatial blend (PlayOneShot) to ensure interaction sounds are clearly audible in VR regardless of distance. - Updated AntigravityItem.cs to trigger audio cues upon grab and release events. - Imported additional UI and throw sound assets. - Configured AudioManager GameObject and AudioSources within the MainGame scene.[17:17] (e83db4b) feat(ui): translate UI texts to english and fix timer race condition - Translated status and score texts to English for internationalization. - Refactored UIManager event subscriptions to prevent race conditions during scene initialization.[17:59] (3925a97) chore(audio): rename audio folder to english and add background music track - Renamed 'ses' directory to 'Sounds' to strictly adhere to English naming conventions in the project architecture. - Imported new Lo-Fi background music track ('oyun sahne muzigi.mp3') for the main game loop. - Updated all related audio asset paths and metadata files.[21:07] (3c48c86) feat(audio): integrate machine lever and engine hum audio events - Added OnLeverPulledAction event to MachineLever script. - Subscribed AudioManager to GameManager states for dynamic engine hum playback. - Subscribed to MachineLever events for mechanical lever sounds. - Implemented script-based AudioClip assignment to bypass Unity 6 AudioSource inspector limitations."
},
{
"day": 13,
"date": "2026-07-20",
"content": "13. Gün (20.07.2026) Çalışma RaporuBugün, geliştirmekte olduğumuz VR projesinin \"Game Feel\" (Oyun Hissiyatı) dinamiklerini ve görsel kalitesini artırmaya odaklandım. Arcade türündeki bir oyunda oyuncunun eylemlerine verilen anlık tepkilerin tatmin edici olması gerektiği için güne öncelikle bir Titreşim (Haptic Feedback) sistemi kurarak başladım. Düşük gecikme süresi (low latency) elde etmek amacıyla Unity'nin yerel (native) XR API'sini kullanarak merkezi bir `HapticManager` (Singleton) sistemi tasarladım. Bu sayede oyuncu hareketli banttan bir obje tuttuğunda (Grab) kontrolcüde hafif bir \"pop\" hissi; çöpü doğru kutuya attığında tok bir onay titreşimi, yanlış kutuya attığında ise rahatsız edici uzun bir uyarı (buzzer) titreşimi almasını sağladım. Bu sistemi başarıyla projenin ana modülüne (CoreSystems_Module) entegre ettim.İkinci aşamada görsel geri bildirimleri (Juice) güçlendirmek için projeye çeşitli görsel efekt (VFX) paketleri dahil ettim. Çöp kutularına isabet ve hata durumları için ayrı ayrı partikül efektleri atadım. Ayrıca bandın sonuna giden kaçırılmış çöpleri yok eden \"Öğütücü\" (DestroyZone) mekaniği için bir hava patlaması efekti ekledim. Bu süreçte efektin zemin (mesh) altında kalıp görünmez olmasını önlemek adına ilgili C# koduna müdahale ederek patlama lokasyonuna +0.5 metrelik bir yükseklik ofseti (Y-axis offset) uyguladım.Görsel efektleri entegre ederken önemli bir render problemiyle karşılaştım: Projeye dahil ettiğim dış kaynaklı bazı efektler sahnede şeffaf (görünmez) olarak renderlanıyordu. İlgili paketlerin dokümantasyonlarını inceleyip detaylı bir hata ayıklama (debugging) yaptıktan sonra sorunun URP (Universal Render Pipeline) ayarlarından kaynaklandığını tespit ettim. Mobil VR cihazı olan Meta Quest'te performans tasarrufu yapmak amacıyla daha önce \"Depth Texture\" (Derinlik Dokusu) ayarını devre dışı bırakmıştık, bu da yumuşak partiküllerin (Soft Particles) hesaplanmasını engelliyormuş. URP Config dosyalarına müdahale edip bu ayarı aktifleştirdim ve Android Preset ayarlarını donanım bütçesine uyacak şekilde yeniden dengeledim. Performans kaybı yaşamadan `DefaultVolumeProfile` üzerinden Bloom (Parlama) ve ACES Tonemapping ayarlarını da yaparak oyunun renk paletini Arcade standartlarına çıkardım.Günün sonunda yaptığım tüm bu geliştirmeleri versiyon kontrol sistemine (Git) \"Atomic Commit\" prensiplerine uygun olarak aktardım. Hazır alınan materyalleri (chore), yazdığım yeni özellikleri (feat) ve grafik iyileştirmelerini (perf) ayrı ayrı paketleyerek anlamlı bir Pull Request (PR) hazırladım. Ayrıca takım arkadaşımla Unity sahne (Scene) dosyası üzerinde çakışma (Merge Conflict) yaşamamak adına görev dağılımı yaptım ve `.gitignore` kural yönetimindeki hataları (tüm Assets klasörünün yanlışlıkla ignore edilmesi gibi) tespit edip düzelterek versiyon kontrol konusundaki tecrübemi pekiştirdim.Git Commit Mesajları:[11:10] (7c3f0e4) feat(haptic): implement centralized HapticManager and XR feedback - Developed a Singleton HapticManager to centralize XR controller haptic impulses. - Integrated event listeners to BinTrigger for global vibration feedback upon correct\/incorrect waste sorting. - Updated AntigravityItem to trigger localized haptic pulses on SelectEnter grab interactions. - Resolved XRBaseInputInteractor API namespace constraints for seamless Unity 6 compatibility.[12:51] (6379f33) chore(haptic): update CoreSystems_Module prefab with HapticManager - Applied HapticManager GameObject to the CoreSystems_Module prefab. - Ensures native XR haptic feedback system is persistent across all scenes.[14:41] (bc9d46c) refactor(haptic): upgrade HapticManager to use native XR hardware API - Refactored HapticManager to directly interface with UnityEngine.XR.InputDevice for 100% reliable hardware-level global haptics. - Increased impulse intensity for correct (0.6) and incorrect (1.0) sorting feedback. - Updated AntigravityItem grab haptics (0.5 intensity) and fixed XRI Interactors namespace references. - Added comprehensive debug logging for haptic capability detection.[17:35] (20d0fdf) perf(graphics): Optimize URP and post-processing for Meta Quest - Enabled HDR and Depth Texture rendering in URP Configuration files. - Revised Android Preset settings to fit mobile VR (Meta Quest) performance constraints. - Adjusted Bloom and ACES Tonemapping via DefaultVolumeProfile to enhance the arcade aesthetic. - Updated UI Font (SDF) settings to ensure sharper text rendering in VR.[18:16] (fc12602) feat(vfx): add vertical offset to crusher visual effect spawn position Updated DestroyZone.cs to instantiate the crusher VFX with a 0.5m Y-axis offset, preventing the particle effect from clipping through the ground mesh."
},
{
"day": 14,
"date": "2026-07-21",
"content": "14. Gün (21.07.2026) Çalışma RaporuBugün, VR projemizin performans optimizasyonları, bellek yönetimi ve varlık (asset) entegrasyon süreçleri üzerine detaylı çalışmalar yürüttüm. VR projelerinde saniye başına düşen kare hızının (FPS) stabil kalması, oyuncuda \"motion sickness\" (hareket hastalığı) oluşmaması için kritik öneme sahip olduğundan güne performans iyileştirmeleriyle başladım.Bu kapsamda ilk olarak, belleği (RAM) optimize etmek için **Object Pooling (Nesne Havuzu)** mimarisini projeye dahil ettim. Oyun sırasında banttan akan çöplerin sürekli olarak `Instantiate` (yaratma) ve `Destroy` (yok etme) komutlarıyla işlenmesi, Garbage Collector (Çöp Toplayıcı) üzerinde ani yüklenmelere (spike) sebep oluyordu. Geliştirdiğim `ObjectPoolManager` sistemi sayesinde, objeleri oyunun başında bir havuzda oluşturup, kullanıldıkça aktif hale getirerek ve işi bittiğinde tekrar havuza geri göndererek bu işlem yükünü tamamen ortadan kaldırdım.Daha sonra grafik performansı üzerinde çalışarak render maliyetlerini düşürmeyi hedefledim. Sahnede sabit duran modülleri (ConveyorSystem vb.) \"Static\" olarak işaretledim ve Universal Render Pipeline (URP) ayarlarından **Mixed Lighting (Karma Işıklandırma)** modunu yapılandırdım. Gerçek zamanlı ışık ve gölge hesaplamalarının VR başlığındaki işlemci maliyetini azaltmak için statik objelerin ışık haritalarını fırınladım (Lightmap Baking). Böylece görsel kaliteden ödün vermeden render performansında ciddi bir artış elde ettik.Arayüz (UI) altyapısı için, VR ortamında oyuncunun fiziksel olarak etkileşime girebileceği, `CoreSystems_Module` ile haberleşecek yeni UI Button prefab'lerinin (taslak objelerinin) hiyerarşik yapılarını ve collider (çarpışma) ayarlarını kurgulayıp projeye entegre ettim.Günün son görevi olarak, fabrikada \"Kalite Kontrol Yöneticisi\" (Overseer) rolünü üstlenecek olan yapay zeka dronunun 3D model optimizasyonlarını gerçekleştirdim. Modelin VR için polygon sınırlarını ve pivot noktalarını ayarladıktan sonra, hem materyal verilerini tek bir dosyada tutması hem de projeye hızlı yüklenmesi (fast-loading) avantajlarından dolayı modeli **.glb (glTF Binary)** formatında dışa aktardım (export) ve Unity projemizin Asset klasörüne sorunsuz bir şekilde aktarımını sağladım.Git Commit Mesajları:[07:47] (9c273a7) perf(graphics): bake static lighting and optimize URP mixed mode Optimized rendering performance for Meta Quest by marking environment objects (walls, floor, bins) as static and generating lightmaps. Configured Directional Light to Mixed mode to bake static shadows while preserving real-time illumination for dynamic objects. This significantly reduces draw calls and GPU shadow calculation overhead in VR.[11:26] (5324fd3) perf: Implement Object Pooling architecture for memory optimization - Created queue-based `ObjectPoolManager` to handle object lifecycle and reuse efficiently. - Refactored `WasteSpawner` to utilize `SpawnFromPool` instead of heavy `Instantiate` calls, preventing GC spikes. - Updated `BinTrigger`, `DestroyZone`, and `FloorZone` to use `ReturnToPool` instead of `Destroy`. - Ensured rigidbodies' physical properties (linear\/angular velocity) are properly reset upon respawn to maintain consistent VR physics.[17:19] (54b9167) feat: Add UI Button prefabs and update CoreSystems module Imported and configured new UI Button prefabs (Play, Pause, Ok, Retry, Setting). Updated CoreSystems_Module prefab.[18:57] (80d2986) chore(assets): Add QC Drone 3D model (.glb) - Imported the QC_Drone.glb 3D model and its associated .meta files into the project. - This asset will be used for the Overseer\/Quality Control drone in the factory environment."
},
{
"day": 15,
"date": "2026-07-22",
"content": "15. Gün (22.07.2026) Çalışma RaporuBugün, geliştirmekte olduğum \"Recycle Rush VR\" projesinin çekirdek döngüsünü (core loop) ve oyuncu hissiyatını (game feel) profesyonel bir seviyeye taşımak üzerine yoğunlaştım. Gün içinde tasarım, yapay zeka, fizik sorunlarının çözümü ve ses yönetimi olmak üzere dört ana başlıkta çalışmalar gerçekleştirdim.İlk olarak, oyun alanına canlılık katması amacıyla bir Kalite Kontrol (QC) Dronu entegre ettim. Dronun oyuncunun performansına anlık tepki verebilmesi için yazılım mimarisinde **Finite State Machine (FSM - Sonlu Durum Makinesi)** tasarım desenini kullandım. Dron için `Idle`, `Happy`, `Angry` ve `Sad` durumları oluşturdum. Bu yapay zeka; `ScoreManager` ve `DestroyZone` gibi sistemlerden gelen event'leri (olayları) dinleyerek, doğru atışlarda mutlu, yanlış atışlarda sinirli olacak şekilde yüz ifadelerini (materyal\/renk bazlı) dinamik olarak değiştiriyor.Oyunun başlangıcını daha etkileyici kılmak için `UIManager` üzerinden bir başlangıç sekansı (Countdown) yazdım. Coroutine ve Lerp matematik fonksiyonlarını kullanarak 3-2-1-GO şeklinde büyüyüp küçülen (Pop animasyonlu) bir geri sayım sistemi geliştirdim.Oynanış testleri sırasında, atılan çöplerin geri dönüşüm kutularının ağzından sektiğini ve içine düşmediğini tespit ettim. VR fizik çarpışmalarını (Collision) detaylıca incelediğimde, sorunun kutuların üzerindeki \"Convex Mesh Collider\" bileşenlerinden kaynaklandığını buldum. Bu karmaşık collider'ları silip, algılama alanlarını (Trigger Bounds) sadece basit bir Box Collider ile yeniden boyutlandırarak objelerin kutulara pürüzsüzce işlenmesini sağladım.Oyuncu hissiyatını (Immersion) maksimuma çıkarmak için Ses (Audio) ve Dokunsal (Haptic) sistemlerini baştan yapılandırdım. `XRGrabInteractable` bileşeninin event'lerini dinleyen ve fiziği bozmadan çalışan `WasteAudioFeedback` adında yeni bir script yazarak bunu tüm atık prefablarına entegre ettim. Böylece objeyi tutma (Grab) ve fırlatma (Release) anlarında anlık ses efektleri ve VR kontrolcülerinde titreşim (Haptic) çalmasını sağladım. Ek olarak `AudioManager` sistemini genişleterek, yere düşüp zaman aşımına uğrayan çöpler için özel bir ceza sesi (Floor Penalty) ekledim.Günün sonunda, VR donanımlarında yaşanan FPS düşüşlerini analiz ettim. Optimizasyon sağlamak amacıyla Post-Processing profilindeki Bloom efektinin \"High Quality Filtering\" seçeneğini kapattım ve `MainGame` sahnesindeki Ambient Lighting (Ortam Işıklandırması) ile Skybox ayarlarını performansı artıracak şekilde güncelledim. Tüm bu geliştirmeleri temiz kod (Clean Code) prensiplerine uygun olarak tamamlayıp, Git üzerinden parçalı (atomic) commitler ile versiyonlayarak projeye başarılı bir Pull Request (PR) attım.Git Commit Mesajları:[06:12] (edb59bf) feat: implement QC Drone AI with Finite State Machine - Added FSM architecture for QC Drone (Idle, Happy, Angry, Sad states). - Integrated color changing and rotation mechanics for visual feedback. - Subscribed drone events to ScoreManager and DestroyZone. - Extracted QC_Drone from ConveyorSystem_Module to prevent static batching issues. - Exposed spawn offset for easier positioning in the Editor.[10:19] (6ae108d) feat: implement animated start countdown sequence - Added new GameState.Countdown to GameManager. - Bypassed incomplete tutorial flow temporarily. - Implemented 3-2-1-GO animation coroutine in UIManager. - Fixed softlock issue when UI text is missing.[14:07] (c2ab6f6) perf: optimize VR post-processing and update QC Drone prefab - Disabled 'High Quality Filtering' in the PostProcessingManager Profile (Bloom) to significantly improve VR performance and maintain stable frame rates. - Updated QC_Drone prefab settings to ensure proper visual state management and alignment within the scene.[15:48] (a7d088d) chore: update core systems, recycling bins, and waste prefabs - Updated CoreSystems_Module prefab. - Updated all recycling bin prefabs (Blue, Green, Red, Yellow). - Updated various waste prefabs across Glass, Metal, Paper, and Plastic categories.[16:21] (9b6ecf9) feat: implement waste interaction audio and floor penalty sound system - Created 'WasteAudioFeedback' script to trigger grab\/release SFX and haptics independently of physics. - Updated 'AudioManager' to support and play a dedicated floor penalty audio clip. - Modified 'FloorZone' to trigger the penalty sound when uncollected waste is destroyed.[16:27] (f95f037) style: update MainGame scene lighting and environment settings - Changed ambient lighting mode and removed the default skybox material. - Adjusted ambient sky color and subtractive shadow colors for better scene visibility and mood. - Updated lighting data asset references within the MainGame scene."
},
{
"day": 16,
"date": "2026-07-23",
"content": "16. Gün (23.07.2026) Çalışma RaporuYapılan Çalışmalar:Bugün, VR projemizin ana oynanış döngüsünü (Core Gameplay Loop) daha rekabetçi ve oyuncu açısından tatmin edici bir hale getirmek üzerine yoğunlaştım. Bu kapsamda veri yönetimi, arayüz güncellemeleri ve ses geri bildirim sistemleri üzerinde geliştirmeler yaptım.Top 3 Sıralama (Ranking) Sisteminin Geliştirilmesi:Oyunun tekrar oynanabilirliğini artırmak amacıyla, `ScoreManager` sınıfındaki tekli yüksek skor (High Score) yapısını iptal ederek yerine dinamik bir \"Top 3\" listesi entegre ettim. Sistem, her oyun sonunda güncel skoru alıp `PlayerPrefs` üzerindeki mevcut skorlarla karşılaştırıyor, büyükten küçüğe sıralama (Array.Sort ve Array.Reverse) yaparak en iyi 3 skoru hafızaya kaydediyor. Eski oyuncuların verilerinin kaybolmaması adına geriye dönük uyumluluk (backward compatibility) sağlayan bir taşıma (migration) bloğu yazdım.Dinamik Fiziksel Skor Tabelası (UI):Oyun evrenindeki fiziksel skor tabelasını yöneten `RankingBoard.cs` scriptini güncelledim. Tablo artık gereksiz buton veya paneller barındırmayan minimalist bir tasarımla, hafızadaki Top 3 skoru TextMeshPro üzerinden altın sarısı renk vurgularıyla dinamik olarak listeliyor.Olay Güdümlü (Event-Driven) Kombo Ses Sistemi:Oyuncu başarısını ödüllendirmek (Juice) amacıyla `AudioManager` sınıfına özel kombo sesleri eklendi. `ScoreManager`'dan gelen Action event'leri dinlenerek, oyuncunun ardışık doğru atışlarında belirli çarpan eşiklerine (x2 ve x3 multiplier) ulaşması durumunda \"Combo!\" ses efektinin otomatik olarak tetiklenmesini sağlayan yapı kuruldu.Fizik Düzenlemeleri ve Versiyon Kontrolü:Gün içinde prefablar (Cam ve Metal atıklar) üzerinde meydana gelen XR fizik hatalarını ve obje spawner'daki eşzamanlı çalışma (reentrancy) bug'ını tespit edip düzelttim. Ayrıca projenin Git geçmişini düzenli tutmak adına; kod güncellemeleri, ses eklemeleri ve `MainGame` sahnesi\/`Editor.meta` dosyalarındaki senkronizasyon işlemlerini profesyonel bir şekilde \"Atomic Commit\" mantığıyla ayrı ayrı repoya pushladım. Gün sonunda `Assets`, `ProjectSettings` ve `Packages` klasörlerini izole ederek standartlara uygun temiz bir proje yedeği aldım.Git Commit Mesajları:[08:27] (3bf350d) feat: implement high score tracking and PlayerPrefs saving - Added HighScore property to ScoreManager. - Integrated PlayerPrefs to load and save the all-time high score. - Subscribed to GameManager's GameState changes to automatically save the high score upon GameOver.[09:33] (0ab22f0) feat(ui): implement dynamic ranking board and fix spawner reentrancy bug - Added RankingBoard.cs to automatically fetch and display the high score with golden text styling. - Imported scoreboard.glb 3D model to act as the physical Arcade Ranking TV. - Created RankingSetupTool.cs Editor script to forcefully unpack GLB prefabs and fix infinite scale import issues. - Fixed a critical event reentrancy bug in UIManager.cs where skipping the countdown caused WasteSpawner to receive conflicting state changes and permanently freeze. - Added state-tracking debug logs to WasteSpawner.cs for better lifecycle visibility.[13:34] (29e3cd2) Fix: Update Glass and Metal waste prefabs with working XR physics - Imported correctly configured Glass and Metal waste prefabs from teammate. - Resolved previous physics and interaction bugs where items would disappear or could not be thrown. - Ensured XRGrabInteractable and colliders are properly set up for flawless VR grabbing.[17:15] (5f9f8f8) chore: remove obsolete RankingSetupTool script - Deleted unused RankingSetupTool.cs and its associated .meta file from the Editor folder. - Cleaned up the codebase by removing unnecessary custom editor extensions to improve project maintainability and reduce clutter.[17:17] (bdcf3bb) feat(audio): add combo sound effect asset - Added combo.mp3 and its associated .meta file to the Sounds directory. - This audio asset will be utilized by the AudioManager to provide auditory feedback when players reach specific combo multipliers.[17:33] (22900b7) feat(audio): implement combo sound effect logic - Updated AudioManager.cs to support a dedicated combo sound clip and playback method. - Modified ScoreManager.cs to automatically trigger the combo audio feedback when players hit multiplier thresholds (e.g., 3 and 5 consecutive correct hits).[17:42] (912f5c0) feat(ui): implement top 3 high scores ranking system - Upgraded ScoreManager to track, sort, and persist the top 3 highest scores using PlayerPrefs instead of a single score. - Updated RankingBoard UI script to dynamically display the top 3 rankings on the physical board in the game environment.[17:44] (206a45a) chore(scene): update MainGame scene and sync metadata - Saved recent inspector changes and object property updates in the MainGame scene (e.g., audio clip assignments). - Tracked newly generated Editor.meta file to keep the project folder structure properly synchronized."
},
{
"day": 17,
"date": "2026-07-24",
"content": "17. Gün (24.07.2026) Çalışma RaporuBugün, Recycle Rush VR projemizin performansını artırmak ve oyun döngüsünün stabilizasyonunu sağlamak amacıyla mimari tarafta oluşan bazı kritik hataları (bug) tespit edip çözümledim. Ağırlıklı olarak nesne üretim sistemi (Spawner), fizik motoru ve durum makinesi (State Machine) üzerine yoğunlaştım.1. \"Phantom Effect\" (Hayalet Etkisi) ve Object Pool Optimizasyonu:Projenin performansını artırmak (Garbage Collector yükünü azaltmak) amacıyla kurduğum Nesne Havuzu (Object Pool) sisteminde kritik bir çökme (Exception) tespit ettim. Havuza gönderilen bazı atık objeleri, oyun içindeki başka tetikleyiciler (örneğin `FloorZone` adlı yere düşme ceza sistemi) tarafından hafızadan tamamen siliniyordu (Destroy). `ObjectPoolManager` kuyruktan (queue) yeni obje çekmeye çalıştığında, bu silinmiş ölü referanslara denk geldiği için sistem tıkanıyordu.Çözüm: Kuyruktan eleman çekerken katı bir Null kontrolü (Null Validation) algoritmaya dahil ettim. Ayrıca havuzlama indeksini etiketler (tag) yerine doğrudan `prefab.name` üzerinden yapılandırarak yanlış obje doğma sorununu kalıcı olarak çözdüm.2. \"Dirty State\" ve Fiziksel Çarpışma Hatalarının Çözümü:Oyunun ileri safhalarında atık nesneleri birbirlerinin içine geçip uzay boşluğuna fırlamaya (Physics Explosion) başlamıştı. Bu sorunun kök nedenini (root cause) iki aşamalı bir yaklaşımla tespit ettim:Fiziksel Çakışma:`WasteSpawner` kodunda objelerin doğma koordinatlarına eklediğim rastgele sapma (random offset) bandın akış yönü olan X eksenindeydi. Bu sapmayı bandın genişliği olan Z eksenine kaydırarak objelerin iç içe doğmasını (collider intersection) tamamen engelledim.Kirli Durum (Dirty State):Havuzdan geri çağrılan objelerin, önceki yaşamlarındaki hız ve dönüş momentlerini koruduğunu fark ettim. Nesneler havuzdan çıktığı an `Rigidbody` bileşenlerindeki doğrusal ve açısal hızları (linear\/angular velocity) zorunlu olarak `Vector3.zero` değerine çekerek objelere bir nevi \"fabrika ayarlarına dönüş\" uyguladım. Ayrıca süzülme (Antigravity) özelliği kapalı olan objeler için `useGravity = true` atamasını zorunlu kılarak bant yerçekimine doğru tepki vermelerini sağladım.3. Oyun Mantığı ve VR Arayüz Entegrasyonu:Arka plandaki fizik sorunlarını çözdükten sonra, oyuncunun etkileşime girdiği UI (Arayüz) sistemlerini güncelledim.* `GameManager` içindeki State Machine (Durum Makinesi) yapısına `Countdown` (Geri Sayım) durumunu geri kazandırarak UI panelleriyle senkronize çalışmasını sağladım.* Oyuncunun VR kontrolcüsüyle fiziksel butonlara bastığı an oyunun fiziğinin bozulmadan duraklatılıp başlatılabilmesi için `TogglePauseGame` ve `FinishCountdown` köprü (endpoint) metotlarını entegre ettim.Sonuç:Yapılan bu mimari iyileştirmeler ve hata ayıklamaları sonucunda, oyunun bellek yönetimi stabil hale getirildi ve VR ortamında hareket hastalığına (motion sickness) sebep olabilecek ani fiziksel hatalar tamamen ortadan kaldırıldı.Git Commit Mesajları:[10:25] (0df97d4) fix(audio): resolve syntax error in AudioManager - Fixed a compilation error caused by missing closing braces in AudioManager.cs. - Ensured the script compiles successfully without breaking the combo sound logic.[16:24] (e7151c0) fix(game-manager): restore countdown state and UI control methods - Restored missing 'Countdown' state to the GameState enum for UIManager compatibility. - Added 'FinishCountdown' and 'TogglePauseGame' helper methods for UI transitions and VR menu handling.[17:26] (d10e2d0) chore(scene): update MainGame scene assignments and meta sync - Saved latest scene Inspector assignments and physical setup in MainGame.unity. - Synchronized MainGame scene meta files with version control.[17:43] (a0c0bf8) fix(core): resolve object pool phantom effect and spawner physics glitches - Refactored ObjectPoolManager to index pools by prefab.name instead of tags, preventing incorrect object instantiation. - Implemented robust null-checks in the pool queue to resolve the \"Phantom Effect\" caused by externally destroyed references. - Corrected the random offset axis in WasteSpawner from X to Z to eliminate longitudinal overlapping and physics explosion bugs. - Disabled default zero-G forces in AntigravityItem to ensure spawned items properly adhere to conveyor belt gravity."
},
{
"day": 18,
"date": "2026-07-27",
"content": "18. Gün (27.07.2026) Çalışma RaporuBugün, projemizin ana oynanış döngüsündeki kritik fizik hatalarını çözmeye ve oyun alanımızı görsel olarak tamamlamaya odaklandık.Oyun testleri sırasında atık nesnelerinin zaman zaman uzaya fırladığını (physics explosion) veya banttan düştükten sonra yerde devrilmeden, doğal olmayan bir şekilde tamamen dik durduğunu fark ettim. Sorunun kaynağını bulmak için projedeki fizik scriptlerini detaylıca inceledim.İlk olarak `BeltMovement.cs` (Konveyör Bant) scriptini refactor ettim. Önceki yapıda bant her `FixedUpdate` karesinde geriye ışınlanarak (teleportation) nesneleri ileri sürüklüyordu; bu da anlık fiziksel titremelere ve çakışmalara sebep oluyordu. Bu yapıyı tamamen silerek, bandın üzerindeki nesnelere `OnCollisionStay` metodu ile pürüzsüz bir `linearVelocity` (gerçek fiziksel hız) uygulayacak şekilde güncelledim. Ayrıca, nesnelerin banttan düştüklerinde dik kalma sorununun rotasyon kilitlerinden kaynaklandığını tespit ettim ve `OnCollisionExit` anında bu kilitleri (`RigidbodyConstraints.None`) kaldırarak nesnelerin doğal şekilde devrilmesini sağladım.Doğma (Spawn) anında yaşanan patlamaları engellemek için `WasteSpawner.cs` içerisindeki güvenlik kontrolünü güncelledim. `OverlapSphere` yarıçapını 0.35m'ye çıkardım ve nesnelerin üst üste binip fırlamasını kesin olarak önlemek amacıyla `ObjectPoolManager` içerisindeki `maxDepenetrationVelocity` değerini 0.8f'e düşürdüm. Ek olarak, `Paper` prefabında tespit ettiğim devasa iç pozisyon kaymasını (offset) sıfırlayarak kağıt atıkların havada veya bant dışında doğmasını engelledim.Günün ikinci yarısında takım arkadaşımın hazırladığı Pano ve TV Askılığı (TV Holder) modellerini projeye entegre ettik. `Buttons_Module` prefabına Exit (Çıkış) butonunu ekleyip bozulan Animator ayarlarını düzelttik ve oyun adını ile LinkedIn hesaplarımızı panoya ekleyerek `MainGame` sahnesini güncelledik.Günün sonunda, yaptığımız tüm bu mimari iyileştirmeleri (Object Pooling, Event-Driven Architecture, Physics Optimizations) detaylıca anlatan profesyonel bir `README.md` dokümantasyonu hazırladım. Yapılan tüm işlemleri Atomic Commit'ler halinde gruplayıp, takım çalışmamızı özetleyen detaylı bir Pull Request ve Issue oluşturarak bugünkü mesaimi tamamladım.Git Commit Mesajları:[12:49] (b68ee26) Fix: Resolve physics anomalies, spawn overlaps, and false floor penalties - ObjectPoolManager: Added maxDepenetrationVelocity to prevent objects from exploding due to physics collisions upon spawning. - WasteSpawner: Added OverlapSphere check to prevent spawning new items inside existing ones. Removed organic Z-axis randomization for consistent, centered spawning on the belt. - FloorZone: Added IsOnConveyorBelt logic using Raycast and OverlapSphere to prevent items traveling on the belt from receiving false \"long time on floor\" penalties. - BeltMovement, WasteAudioFeedback, AudioManager: Fixed missing tag errors and stabilized audio feedbacks for grabbing and dropping interactions.[14:55] (1d7fb04) Fix: Prevent physics explosions by correcting OverlapSphere check Removed the incorrect AntigravityItem check in WasteSpawner and replaced it with a generic Rigidbody check to ensure objects don't spawn inside each other and fly out of bounds.[17:58] (d299cb4) Fix: Reset Paper prefab local position to ensure correct spawning Reset massive local position offsets (X, Y, Z) to (0,0,0) in Paper.prefab to guarantee it spawns precisely at the target spawner point rather than mid-air.[18:11] (493faa0) Fix: Overhaul conveyor physics and spawn safety systems - Refactored BeltMovement to use continuous linearVelocity instead of FixedUpdate teleportation, eliminating physics jitter. - Added constraints unlock in OnCollisionExit to allow items to tumble naturally. - Expanded WasteSpawner clearance overlap sphere and increased Y-offset for larger items. - Lowered maxDepenetrationVelocity to 0.8f in ObjectPoolManager to completely prevent physics explosions.[18:52] (bb24f44) Chore: Apply physics parameters and update object pool thresholds in scene - Updated MainGame scene configurations to reflect new physics boundaries. - Applied new Kill-Z limits and optimized spawn settings for the Object Pool Manager."
},
{
"day": 19,
"date": "2026-07-28",
"content": "19. Gün (28.07.2026) Çalışma RaporuBugünkü mesaimde, \"Recycle Rush VR\" projemizin temel geliştirme (Development) sürecinden çıkıp, piyasaya sürülme (Release) ve Kalite Kontrol (QA) aşamasına geçişini yönettim. Takım arkadaşımla çakışmaları (Merge Conflict) önlemek adına GitHub üzerinde Agile metodolojisine uygun olarak esnek bir dal stratejisi (Branching Strategy) kurduk ve kendi çalışma alanıma (`release-prep\/emre`) geçtim.İlk görevim, oyunumuzun Meta Quest (App Lab) mağazası için gerekli olan pazarlama ve vitrin materyallerini hazırlamaktı. Oyunun içinden aldığımız 5 dakikalık ham ve uzun VR görüntülerini analiz ettim. Bu ham görüntüleri manuel olarak saatlerce editlemek yerine, Microsoft Clipchamp'in Yapay Zeka (AI) \"Auto Beat Sync\" özelliğini kullanarak iş akışımı hızlandırdım. Oyunun aksiyonlu anlarını, komboları ve yapay zeka drone'umuzun tepkilerini müziğin ritmine tam oturacak şekilde 16:9 (Yatay) formatta ve 1080p kalitesinde 56 saniyelik dinamik bir fragmana (Gameplay Trailer) dönüştürdüm.Ardından bu videoyu YouTube'a yükleyerek COPPA (Çocukların Çevrimiçi Gizliliğini Koruma) ayarlarını yapılandırdım ve liste dışı linkini doğrudan projemizin `README.md` dosyasına entegre ettim. Bu sayede projemizi inceleyecek olan yöneticilerin veya oyuncuların oyunu indirmeden önce doğrudan mekanikleri (VR Interaction, Haptics, AI Scaling) izleyebilmelerini sağladım.Günün ikinci yarısında, mağaza için gerekli olan teknik metinleri ve etiketleri (Konfor seviyesi, tür, oynanış biçimi) içeren `META_QUEST_STORE.md` adında yepyeni bir dokümantasyon dosyası oluşturdum. Bu dosyanın içerisine yapay, pazarlamacı bir dil yerine; fizik motoru optimizasyonlarında yaşadığımız zorlukları ve başarıları anlatan şeffaf, samimi ve \"bağımsız geliştirici (indie developer)\" ruhuna uygun açıklama metinleri yazdım.Mesaimin sonunda, hazırladığım fragman entegrasyonlarını ve mağaza metinlerini mantıksal parçalara (Atomic Commits) bölerek GitHub'a gönderdim. Tüm bu süreci, projenin piyasaya sürülmeye teknik ve görsel olarak hazır olduğunu anlatan çok detaylı bir Pull Request (PR) metni ile taçlandırarak bugünkü görevlerimi başarıyla tamamladım.Git Commit Mesajları:[13:28] (c280184) Docs: Add Gameplay Trailer placeholder and enhance presentation - Added a dedicated \"Gameplay Trailer\" section to the README.md. - Prepared the documentation for the upcoming promotional video integration. - Further polished the structure to highlight the professional presentation and marketing assets of the project.[19:01] (a36c51f) Docs: Integrate official gameplay trailer into README Docs: Integrate official gameplay trailer into README[19:02] (e03f00d) Docs: Add Meta Quest Store metadata and promotional copy - Created a comprehensive store listing document (META_QUEST_STORE.md) for the App Lab release. - Added localized descriptions, genre tags, and comfort level requirements. - Humanized the promotional text to reflect authentic indie developer insights, discussing physics optimization challenges and engineering achievements."
},
{
"day": 20,
"date": "2026-07-29",
"content": "20. Gün (29.07.2026) Çalışma RaporuBugün, \"Recycle Rush VR\" projemizin final teslimatı (final-delivery) öncesi en kritik optimizasyon ve hata ayıklama (bug-fixing) süreçlerine odaklandığım, oldukça yoğun ama bir o kadar da verimli bir gündü. Temel oyun döngüsündeki fizik hatalarını, arayüz etkileşimlerini ve obje üretim (spawn) sistemini kusursuz hale getirmek için çalıştım.Güne ilk olarak VR arayüz (UI) sorunlarıyla başladım. Oyuncunun Game Over panelindeki butonlara lazerle tıklayamaması (ışının kırmızı yanarak etkileşime girmemesi) sorununu tespit ettim. İncelemelerim sonucunda XR Ray Interactor bileşeninin arayüz ile etkileşime kapalı olduğunu ve Canvas üzerinde gerekli Event Camera referanslarının eksik olduğunu belirledim. Unity Inspector üzerinden bu yapılandırmaları düzelterek VR menü etkileşimini stabil hale getirdim.Ardından, oyunun temel mekaniği olan yürüyen bant (conveyor belt) ve çöp objeleriyle (Waste) ilgili ciddi fizik bug'larıyla karşılaştım. Objeleri elimizle tutup bant dışına veya havaya bıraktığımızda yere düşmek yerine uzay boşluğundaymış gibi havada donup kalıyorlardı. Bunun nedenini araştırdığımda, XR Interaction Toolkit'in objeyi elden bıraktığımız anda eski \"Kinematic\" durumuna zorla geri döndürdüğünü fark ettim. Kod içerisinde `BeltItem.cs` scriptine güvenli bir gecikme (0.1 saniye) ekleyerek Unity'nin bu müdahalesini aştım.Bu süreçte bir başka ilginç bug daha yakaladım: Bazı objeler (örneğin şişeler) sorunsuz düşerken, cam kadeh gibi spesifik objeler havada kalmaya devam ediyordu. Sorunun kaynağının, kadeh prefab'ının fizik motorunun (Rigidbody) ana objede değil, alt objede (child) bulunması olduğunu tespit ettim. `GetComponentInChildren<Rigidbody>()` metodunu kullanarak kodu daha dinamik hale getirdim ve `Physics.SyncTransforms()` fonksiyonu ile modellerin görsel kaymalarını (offset bozulmalarını) engelleyerek fizik sorununu kökten çözdüm.Günün ilerleyen saatlerinde, objelerin yürüyen banta geliş aralıklarının bozuk olduğunu (bazen üst üste, bazen de çok geç geldiklerini) fark ettim. `WasteSpawner.cs` içerisindeki çakışma önleyici `OverlapSphere` fonksiyonunun yarıçapının çok büyük (0.5m) bırakıldığını tespit ettim. Bu yarıçapı 0.15m'ye düşürerek banttaki çöplerin tamamen kusursuz ve eşit zaman aralıklarıyla doğmasını sağladım. Ek olarak Kill-Z (yok olma sınırı) hatalarını temizledim ve yürüyen banta oturan objelerin Y-ekseni hizalamalarını mükemmelleştirdim.Günün sonunda, yaptığım tüm bu kritik mekanik, fizik, UI düzeltmelerini ve yeni eklenen çevre tasarımlarını (Drone prefab vb.) Git üzerinde birbirine karışmayacak şekilde \"Atomic Commit\" mantığıyla 4 ayrı parçaya böldüm. Hazırladığım bu temiz commit'leri profesyonel bir Pull Request (PR) başlığı ve açıklaması altında toplayarak ana branch'e gönderdim. Bolca hata çözdüğüm, çok çalıştığım ama sistemin kusursuz aktığını gördüğümde tüm yorgunluğuma değen harika bir mesai oldu.Git Commit Mesajları:[13:52] (64a00bf) Docs: Integrate finalized gameplay screenshots and store assets - Replaced all placeholder imagery in docs\/assets with high-fidelity, finalized in-game screenshots. - Added layered logo components (foreground\/background) required for the Meta Quest App Lab submission. - Visually completed the README.md to accurately reflect the final aesthetic, UI, and gameplay mechanics of the project.[19:26] (51f2068) fix: resolve conveyor belt object alignment and Kill-Z destruction issues - BeltItem.cs: Implemented dynamic surface alignment using Collider.bounds and Physics.SyncTransforms(). Spawned objects now precisely calculate the height difference and snap perfectly to the belt's top surface, eliminating all floating and sinking visual bugs. - ObjectPoolManager.cs: Removed the strict maxDistance threshold from the Kill-Z logic. This prevents false-positive destruction of objects (like bottles and cans) that spawn far from the scene origin and roll slightly. - AntigravityItem.cs: Refined physics state handling and interaction logic for antigravity-affected items to ensure stable movement.[19:54] (b6e42c5) fix: refine waste spawner intervals, belt physics, and adjust difficulty curve - BeltMovement.cs: Refactored internal variables and exposed the BeltCollider property to allow items to calculate precise surface alignment dynamically. - WasteSpawner.cs: Fixed inconsistent spawn gaps by replacing random intervals with a fixed average, and added a quick 0.2s retry logic for blocked spawn points instead of skipping a full spawn cycle. - DifficultyManager.cs: Adjusted the difficulty multipliers (reduced from 1.2\/1.5\/2.0 to 1.15\/1.3\/1.45) to create a smoother, more balanced gameplay progression.[22:43] (2167aeb) feat(environment): integrate new Drone prefab into the project Added and configured the Drone prefab along with its associated meta file for use in the game environment.[22:50] (9b1f8ea) fix(gameplay): resolve object floating physics and stabilize spawn intervals Fixed an issue in BeltItem.cs where prefabs with Rigidbody components on child objects would float above the conveyor belt. Implemented Physics.SyncTransforms() to correctly update physics positions without disrupting local child offsets. Added a 0.1s safe delay to the physics release routine to guarantee the XR Interaction Toolkit completes its state restoration, preventing items from freezing mid-air when dropped. Decreased the OverlapSphere collision radius in WasteSpawner.cs from 0.5m to 0.15m. This eliminates false blockage detections and ensures objects spawn at perfectly consistent time intervals."
},
{
"day": 21,
"date": "2026-07-30",
"content": "21. Gün (30.07.2026) Çalışma RaporuBugün, projenin final aşamasına yaklaşırken test süreçlerinde tespit ettiğimiz kritik uç durum (edge-case) hatalarını çözmeye ve oyunu Meta Quest Store için derlemeye (Build) odaklandım. İlk olarak, oyuncu oyun bitmeden uygulamayı aniden kapattığında veya yeniden başlat butonuna bastığında en yüksek skorların kaydedilmediği veri kaybı problemini ele aldım. Bu sorunu çözmek için `ScoreManager.cs` scriptinde refactoring yaparak Unity'nin `OnApplicationQuit` metodunu ezdim (override). Böylece oyun kapanırken veya skor sıfırlanırken verilerin `PlayerPrefs` üzerine güvenli bir şekilde yazılması sağlandı ve veri kaybı ihtimali tamamen ortadan kaldırıldı.Ardından projenin çekirdeğini oluşturan fizik motoru ve bellek yönetimi (Object Pooling) üzerindeki kronik sorunları çözmeye yoğunlaştım. Konveyör bandı üzerinde çöplerin üst üste binmesinden kaynaklanan fizik kilitlenmelerini (deadlock) ve mesh kaymalarını engellemek için mesafe ölçüm (sqrMagnitude) kontrolleri ekledim. Hızlı fırlatılan objelerin yerçekiminden kaçıp banttan düşmesi (object tunneling) ve `FloorZone` üzerindeki 3 saniyelik silinme hatalarını (despawn bug) giderdim. Ayrıca Unity 6'nın verdiği fizik uyarılarını susturmak ve RAM şişmesini önlemek adına, obje yaratma ve yok etme döngülerini (lifecycle) tamamen Object Pool (Obje Havuzu) sistemiyle senkronize ettim.Fizik sorunları çözüldükten sonra, oyunun yaşam döngüsü ve kullanıcı arayüzü (UI) tarafındaki görsel hatalara yöneldim. Oyun ilk açıldığında, henüz ana menüdeyken öğretici (tutorial) sistemine ait yönlendirme okunun erkenden ekranda belirmesi hiyerarşiyi bozuyordu. Bu sorunu çözmek için `TutorialManager` içerisindeki durum yönetimini optimize ettim ve göstergenin aktif olma şartını sadece oyunun başlamaya hazır olduğu `GameState.ReadyToStart` durumuna bağladım. Buna ek olarak, XR Interaction Toolkit örnek prefab'larını güncelledim ve \"Oyun Bitti\" ile \"Duraklat\" panellerindeki çıkış butonlarının dinamik bağlanma (Auto-binding) işlemlerini koda dökerek sahneler arası geçişlerde butonların sorunsuz çalışmasını sağladım.Oyun içi hatalar temizlendikten sonra, projeyi Meta Store standartlarına uygun olarak derlemek için `Player Settings` üzerinden ciddi optimizasyonlar gerçekleştirdim. VR performansı için doku sıkıştırmasını `ASTC` olarak ayarladım. Meta'nın zorunlu tuttuğu 64-bit mimari gereksinimini karşılamak adına Scripting Backend yapısını `Mono`'dan `IL2CPP`'ye, hedef mimariyi ise `ARM64`'e güncelledim. Yayınlama güvenliği için özel bir dijital imza (Keystore) oluşturup projeye tanımladım ve günün sonunda hata almadan, yüksek performanslı `RecycleRushVR.apk` dosyasını başarıyla oluşturdum.Günün son aşamasında ise sürüm kontrol ve dokümantasyon süreçlerini tamamladım. Projenin GitHub reposundaki `README.md` dosyasını güncelleyerek kullanılmayan eski görsel taslakları projeden temizledim. Gün boyu yaptığım tüm fizik, UI, kodlama ve dokümantasyon güncellemelerini parçalara bölerek profesyonel commit başlıklarıyla GitHub'a işledim. Son olarak `v1.0.0 Release Candidate` başlığıyla ana projeye yönelik kapsamlı bir Pull Request (PR) açarak geliştirmeleri ana dala entegre ettim ve projenin aktif geliştirme fazını başarıyla noktaladım.Git Commit Mesajları:[09:59] (71bf643) fix(ui): activate exit button and support editor play mode termination - Auto-Binding: Implemented logic in UIManager to automatically find and bind the 'QuitApplication' method to the Exit button within the Game Over panel, preventing missing reference issues. - Editor Support: Added preprocessor directives (#if UNITY_EDITOR) to gracefully stop Play Mode when the Exit button is triggered during Editor testing.[10:16] (2dfd05b) fix(ui): implement auto-binding for exit buttons in pause and game over panels - Dynamic UI Binding: Added logic to UIManager to automatically search, find, and bind the 'QuitApplication' method to the Exit\/Quit buttons inside both the Game Over and Pause panels, eliminating the need for manual Inspector assignments. - Editor Testing Support: Added preprocessor directives (#if UNITY_EDITOR) to correctly terminate Play Mode when an Exit button is pressed within the Unity Editor.[13:38] (f19569a) chore: Auto-update XR Interaction Toolkit sample prefabs Commit automatic Unity editor changes and serialization updates to the XR Origin and Teleport Interactor prefabs. These are standard under-the-hood updates made by the engine.[13:45] (a95cf35) fix: Resolve object tunneling and FloorZone 3-second despawn bug Created a massive dynamic BoxCollider trigger for FloorZone to replace flat MeshColliders, ensuring the 3-second grace period always triggers. Added a 1m thick physical SafetyFloor at Y=-0.5 to prevent high-velocity objects from tunneling through the map.[13:46] (8c9bccb) fix: Object pooling lifecycle alignment and Unity 6 physics warnings Fixed spawn alignment by setting transform positions before SetActive(true). Silenced Unity 6 kinematic linearVelocity console warnings by safely toggling isKinematic states during rigidibody factory reset.[13:48] (7034e9d) fix: Conveyor belt traffic jams, mesh sliding, and edge fall physics Overhauled BeltMovement to track root transforms. Fixed edge stalling by calculating true geometric bounds. Switched to ForceMode.VelocityChange to guarantee mass-independent falling speeds (fixed Scroll shooting and Paper stalling). Added DetachFromBelt logic and prefab initial transform caching to prevent mesh offset sliding.[13:57] (56a9a27) fix: Prevent overlapping waste spawns and improve game state handling Added OverlapSphere checks to WasteSpawner to prevent objects from spawning inside each other. Optimized spawn intervals and updated GameManager state listener logic.[16:21] (88dd4f0) fix: prevent physics deadlock on conveyor belt Resolved a physical deadlock issue on the conveyor belt caused by simultaneously spawned waste objects overlapping. Added a distance check (sqrMagnitude) to prevent objects from continuously pushing each other when their positions are virtually identical. The belt flow is now perfectly smooth.[16:22] (b42923b) refactor: optimize tutorial lifecycle and fix UI pointer timing Overhauled the tutorial lifecycle. Switched from raw Instantiate to ObjectPoolManager to prevent physics glitches. Resolved the double-spawn bug by introducing an _isSpawning flag and restored the retry mechanic to work flawlessly with object pooling logic (activeInHierarchy). Additionally, delayed the yellow UI pointer appearance until the ReadyToStart state, preventing it from floating in the void during MainMenu.[16:22] (ff06b4f) fix: ensure high scores are saved on restart and application quit Prevented data loss in the save system, which previously only triggered upon timer expiration (GameOver). Integrated save triggers into ResetScore() (for restarts) and OnApplicationQuit() (for abrupt exits). High scores are now reliably recorded and displayed on the TV board even if the player restarts or exits before the game ends.[17:45] (0ec3a67) docs: clean up unused image placeholders from README Removed unfinished concept art and placeholder image sections (VR Mockups, UI Concepts, Controller Interactions) from the README.md to maintain a clean, professional, and up-to-date documentation structure.[20:18] (3db2f0b) chore: apply latest hierarchy and component updates to main scene` Saved the latest hierarchy and component state to reflect recent script and reference updates (TutorialManager and ScoreManager changes)."
},
{
"day": 22,
"date": "2026-07-31",
"content": "22. Gün (31.07.2026) Çalışma RaporuBugün, stajımızın ilk 20 günlük periyodunu başarıyla tamamlayıp Recycle Rush projesinin MVP sürümünü Meta Store Alpha kanalına yüklememizin ardından, takım arkadaşımla birlikte ikinci ayın planlamasını ve yol haritasını oluşturmaya odaklandım. Sıfırdan yeni bir projeye başlamak ile mevcut projeyi geliştirmek arasındaki zaman\/maliyet (Time-to-Market) analizini detaylıca tartıştık. Yeni bir projeye başlamanın; sıfırdan uyumlu 3D modeller aramak, arayüz (UI) tasarlamak ve Obje Havuzu (Object Pooling) gibi temel mimarileri baştan kurmak açısından kısıtlı zamanımızı verimsiz kullanmamıza neden olacağına karar verdim. Bunun yerine, çalışan ve test edilmiş hazır kod mimarimizin üzerine kat çıkarak projeyi ölçeklendirme (scaling) stratejisini seçtim.Bu strateji doğrultusunda oyunumuzun vizyonunu tamamen değiştirecek kritik bir mimari karar aldım. İlk ay konveyör bandı üzerinde yaşanan ve çözümü saatler süren kompleks fizik kilitlenmelerini (deadlock) ve sürtünme hatalarını tamamen ortadan kaldırmak amacıyla projeyi Sanal Gerçeklikten (VR), Meta'nın Passthrough (Dış Kamera) teknolojisini kullanan bir Karma Gerçeklik (AR - Mixed Reality) deneyimine geçirmeye karar verdim. Konveyör bandı mekaniğini iptal edip, bunun yerine Spatial Anchors (Uzamsal Çapalar) kullanarak geri dönüşüm kutularını doğrudan oyuncunun fiziksel odasına yerleştiren, çok daha stabil ve performansı yüksek bir oyun döngüsü kodlamayı planladım.Gün sonunda, aldığımız bu mimari kararları projenin ana dizininde `STAJ_2_AY_PLAN.md` isimli bir dokümantasyon dosyasına dökerek GitHub'a işlemeye geçtim. Ancak, dün gönderdiğim sürüm adayı (Release) Pull Request'i staj sorumlumuz tarafından henüz onaylanıp (Merge) ana dala (main) katılmamıştı. Kod çakışmalarını önlemek ve ana dalı kirletmemek adına staj sorumlumuzun tavsiyesi üzerine \"Bağımlı Değişiklikler (Stacked Pull Requests)\" yöntemini uyguladım. Yeni AR planlama dalımı `main` yerine dünkü bekleyen dalımın (branch) üzerinden filizlendirdim. GitHub Desktop üzerinden resmi \"Start a pull request stack\" özelliğini kullanarak, dünkü kodların üzerine binen zincirleme ve bağımlı bir PR açarak versiyon kontrol sürecini kusursuz bir şekilde tamamladım.Git Commit Mesajları:[19:31] (84438c9) docs: add phase 2 architectural transition plan to AR Documented the team's decision to pivot the project from VR to AR (Mixed Reality) for the second month of development. Outlined the architectural shift from complex conveyor belt mechanics to spatial anchors (Passthrough technology) to ensure zero physics deadlocks, higher stability, and better scalability."
},
{
"day": 23,
"date": "2026-08-03",
"content": "23. Gün (03.08.2026) Çalışma RaporuKonu:Projenin Karma Gerçeklik (MR) Mimarisine Taşınması ve Passthrough EntegrasyonuBugün, projenin vizyonu doğrultusunda \"Recycle Rush\" oyununu tamamen kapalı bir Sanal Gerçeklik (VR) deneyiminden, gerçek dünya ile etkileşime giren Karma Gerçeklik (MR) yapısına geçirmeye başladım.Güne, yapılacak tüm teknik işleri planlayarak GitHub üzerinde **\"[Phase 0] AR Scene Foundation and Passthrough Integration\"** başlıklı detaylı bir Issue oluşturarak başladım. Hataları izole edebilmek adına doğrudan ana kod üzerinde çalışmak yerine `feature\/ar-setup-and-passthrough` isminde yeni bir çalışma dalı (branch) açtım.İlk adım olarak, ilerleyen süreçlerde farklı bilgisayarlarda veya ortamlarda sürüm\/ayar farklılığı yaşanmaması için VS Code (IDE) ve Unity Package Manager konfigürasyon dosyalarını standart hale getirip projeye dahil ettim `[chore(config)]`. Ardından projenin Android platformunda dış kamera desteği verebilmesi için gerekli olan OpenXR başlangıç ayarlarını (Settings Initializer) kurdum `[chore(xr)]`.Altyapı hazırlandıktan sonra asıl görev olan AR sahnesinin inşasına geçtim. Eski VR projemin ana sahnesini bozmamak adına kopyalayarak `MainGame_AR` adında tamamen bağımsız yeni bir sahne oluşturdum. Odak noktam artık oyuncunun gerçek odası olacağı için; eski sahnede bulunan kapalı depo duvarlarını, tavanı ve sahte zemin kaplamalarını (blockout modelleri) tamamen temizledim. Bu sayede gereksiz obje çizimlerini (draw calls) engelleyerek projede ciddi bir performans optimizasyonu sağladım.Gerçek dünyayı (Passthrough) gözlükte görebilmek için Universal Render Pipeline (URP) kamerasının Skybox ayarını iptal ettim ve arka planı tamamen saydam (Alpha 0) olacak şekilde Solid Color formatına geçirdim. Teknik entegrasyon aşamasında eski nesil ağır SDK'lar kullanmak yerine, projenin mevcut yapısına en uygun ve modern standart olan **AR Foundation** paketini (AR Session, AR Camera Manager ve AR Camera Background bileşenleri) kullanarak dış kamera akışını başarılı bir şekilde oyuna bağladım. Yeni sahneyi derleme (Editor Build Settings) listesine ekledim `[feat(core)]`.Günün sonunda, yaptığım tüm bu işleri birbirine karıştırmadan 3 ayrı \"Atomic Commit\" (parçalı gönderim) halinde GitHub'a yükledim. Kodların ana projeye dahil edilmesi için İngilizce açıklamalı ve standartlara uygun detaylı bir **Pull Request (PR)** oluşturdum. Yaptığım son kontrollerin ardından PR'ı `main` dalına (branch) başarıyla birleştirdim (merge) ve günün başında açtığım Issue'yu kapattım.Git Commit Mesajları:[13:33] (553cc34) chore(config): update IDE and project configuration files - Added VS Code configuration files (extensions, launch, settings) for debugging and IDE integration. - Updated Unity Package Manager local settings.[15:23] (52f3cb5) chore(xr): initialize Android XR settings - Initialized Android XR settings for OpenXR passthrough support. - Updated OpenXR feature sets and configurations.[18:48] (f471745) feat(core): setup AR scene skeleton and passthrough integration - Duplicated main VR scene to create new MainGame_AR scene. - Removed legacy VR environment and blockout models. - Configured Main Camera for passthrough (Solid Color, Alpha 0). - Integrated AR Foundation components (AR Session, Camera Manager, Camera Background)."
},
{
"day": 24,
"date": "2026-08-04",
"content": "24. Gün (04.08.2026) Çalışma RaporuKonu: Karma Gerçeklik (MR) Donanım İzinlerinin Yapılandırılması ve Uzamsal Çapa (Spatial Anchor) ile Obje Yerleştirme Sisteminin GeliştirilmesiYapılan İşler ve Açıklaması:Bugün, projenin geleneksel sanal gerçeklik (VR) altyapısından karma gerçeklik (MR) altyapısına geçişinin en kritik adımlarından biri olan cihaz donanım izinleri ve uzamsal sabitleme (Anchor) mekanikleri üzerine çalıştım. Süreci profesyonel bir şekilde yönetmek adına güne GitHub üzerinde bir Issue oluşturarak başladım ve geliştirmelerimi yapmak üzere `feature\/ar-spatial-anchors-and-permissions` adlı yeni bir branch (dal) açtım.İlk aşamada projenin Unity tarafındaki Android derleme ayarlarını güncelleyerek \"Android XR\" doğrulama hatalarını (validation errors) giderdim. Meta Quest cihazının dış kameralarını ve fiziksel ortam algılama yeteneklerini kullanabilmesi için \"Custom Main Manifest\" dosyası oluşturdum ve projeye `CAMERA`, `USE_ANCHOR_API` ile `PASSTHROUGH` donanım izinlerini manuel olarak koda enjekte ettim. Olası bir veri kaybını veya sahne bozulmasını önlemek adına, projenin AR çekirdeğini oluşturan `XR Origin`, `AR Session` ve `AnchorManager` objelerini `AR_Core` adlı klasör altında Prefab (şablon) haline getirerek mimariyi güvence altına aldım.İkinci aşamada, sanal oyun objelerinin (çöp kutuları ve taşıma bandı) oyuncunun gerçek odasındaki fiziksel koordinatlara kilitlenmesini ve kaymamasını sağlamak amacıyla C# dili ile `SpatialAnchorManager` sınıfını kodladım. Bu sınıf, AR Foundation API'sini kullanarak belirlenen pozisyonlara kalıcı uzamsal çapalar atılmasını yönetmektedir.Günün son görevi olarak, oyuncunun oyun başında eşyaları kendi odasına kendi ergonomisine göre dizebilmesi için interaktif bir \"Oda Kurulum Sihirbazı\" (Setup Wizard) geliştirdim. `ARPlacementManager` adını verdiğim bu yeni yönetici script sayesinde, oyuncunun kontrolcüsünden (kumanda) çıkan sanal lazeri, zemin algılama (Plane Detection) sistemiyle senkronize ettim. Oyuncunun tetiğe basarak sahnede gizli olarak bekleyen objeleri sırayla yanına çağırmasını ve bu objeleri bulunduğu fiziksel konuma kalıcı olarak sabitlemesini sağladım.Tüm bu geliştirmeleri, bağımlılıkları birbirine karıştırmadan modüler (atomic) yapıya uygun olarak 4 farklı commit paketi halinde GitHub'a gönderdim. Günün sonunda geliştirdiğim sistemin testlerini tamamlayarak tüm değişiklikleri detaylı bir Pull Request (PR) üzerinden projenin `main` (ana) branch'ine başarıyla merge ettim (birleştirdim).Git Commit Mesajları:[07:59] (ef8e68e) chore(config): resolve Android XR validation errors - Disabled HDR and Post Processing for Android XR compliance. - Updated core ProjectSettings.[12:42] (4600c6d) feat(android): generate custom manifest with MR permissions - Generated Android directory structure in Plugins. - Injected CAMERA and USE_ANCHOR_API permissions. - Enforced PASSTHROUGH feature requirement.[12:55] (3ee8d54) chore(ar): secure core AR systems as prefabs and add spatial anchor logic - Created AR_Core prefab directory. - Converted AR Session, XR Origin, and AnchorManager to prefabs for data safety. - Added SpatialAnchorManager script to handle runtime anchoring.[15:49] (6454916) feat(ar): implement sequential object placement and room setup - Created ARPlacementManager to handle sequential placing of existing scene objects. - Configured AR Raycast and Plane Managers on XR Origin. - Bound XR right controller trigger to the placement action for intuitive setup.[16:26] (669349e) chore(scene): configure AR placement manager and controller inputs - Bound existing scene objects (Conveyor, Bins) to ARPlacementManager. - Integrated AR Raycast Manager and AR Plane Manager into XR Origin. - Linked right controller Activate action to the placement sequence."
},
{
"day": 25,
"date": "2026-08-05",
"content": "25. Gün (05.08.2026) Çalışma RaporuAR Mimari Geçişi ve VFX EntegrasyonuBugün, projemizin 2. ay \"Karma Gerçeklik (MR) Planlaması\" doğrultusunda, oyunumuzun temelini VR'dan (Sanal Gerçeklik) AR'a (Karma Gerçeklik) taşımak için kritik mimari değişiklikler ve görsel efekt (VFX) entegrasyonları gerçekleştirdim.1. Proje Yönetimi ve Branch (Dal) YapılandırmasıGüne her zamanki standartlarımıza uyarak başladım. Öncelikle GitHub Projects (Kanban) panosu üzerinde bugünün görevleri için yeni bir \"Issue\" oluşturdum. Ardından `main` dalını korumak adına doğrudan `main` üzerinde çalışmak yerine `feature\/virtual-portal-vfx` adında yeni bir çalışma dalı (branch) açarak kodlama sürecine güvenli bir başlangıç yaptım.2. Prosedürel Animasyon ve PortalAnimator GeliştirmesiÇöplerin oyuncunun gerçek odasına düşeceği \"Sanal Portal\" mekaniğinin kodlamasını yaptım. Performans kaybı (FPS Drop) yaşatmamak adına Unity'nin ağır Animator bileşeni yerine, matematiksel `Mathf.Sin` dalgalarını kullanan `PortalAnimator.cs` kodunu yazdım. Bu sayede portalın kendi etrafında dönmesi ve organik bir şekilde \"nefes alması (pulsing)\" sıfır performans kaybıyla sağlandı. İleriye dönük (future-proof) olarak bu koda Particle System (Kıvılcım) ve Audio Source (Ses) eklentilerini destekleyecek AAA standartlarında altyapılar ekledim.3. Görsel Efekt (VFX) EntegrasyonuPortalın görselliğini profesyonel seviyeye taşımak için \"TwirlDistortion\" adlı 2 boyutlu (Sprite) uzay-zaman sarmalı efektini projeye dahil ettim. Testlerim sırasında 2D resmin 3D uzayda dönerken kaybolması (Perspective Culling) sorunuyla karşılaştım. Bu sorunu çözmek için ebeveyn-çocuk (parent-child) hiyerarşisini yeniden yapılandırdım ve yerel Rotation (dönüş) değerlerini sıfırlayarak (0,0,0) hatasız bir yörünge dönüşü sağladım.4. Mimari Yeniden Yapılandırma (Scene Refactoring) ve Prefab OptimizasyonuOyunumuzu tamamen MR oda-ölçeğine (room-scale) geçirmek adına devasa bir temizlik yaptım. Önceki fazda fiziksel sürtünme hatalarına (Deadlock) sebep olan tüm konveyör bant sistemini (`ConveyorSystem_Module`) sahnemizden kalıcı olarak sildim. Çöp üretim merkezimizi (`WasteSpawner.cs`) doğrudan Sanal Portal'ın içine taşıdım. Böylece çöplerin bandın ucundan değil, doğrudan oyuncunun odasının tavanından halıya düşmesini sağlayacak yeni oyun döngüsünü oturttum. Taşıma ve yeniden kullanılabilirliği (Modularity) artırmak için bu portalı ve içindeki spawner'ı tek bir `VirtualPortal.prefab` paketi haline getirdim.5. Pull Request (PR) Açılışı ve İnceleme SüreciGünün sonunda yaptığım bu 4 farklı işlemi, GitHub üzerinde \"Atomic Commit\" prensibine uyarak parça parça commit'ledim (Sırasıyla: *feat, style, build, refactor*). Tüm bu mimari geçişi ve kodlamaları, proje yöneticilerinin ve danışman hocalarımın incelemesi için tek başıma bir Pull Request (PR) haline getirdim. Kodların nasıl çalıştığını görsel olarak kanıtlamak amacıyla Unity Recorder üzerinden 720p HD kalitesinde optimize edilmiş bir oynanış (Gameplay) videosu çekerek PR açıklamasına ekledim ve günü başarıyla tamamladım.Git Commit Mesajları:[11:00] (abd0a7e) feat(vfx): implement animated virtual portal for waste spawning - Created PortalAnimator.cs for idle rotation and pulsing scale effects. - Added a visual green energy portal (Cylinder + PortalMat) to the AR scene. - Applied emission material to simulate a sci-fi wormhole effect.[13:24] (06218fe) style(vfx): integrate TwirlDistortion asset for virtual portal - Replaced the basic prototype cylinder with the high-quality TwirlDistortion sprite. - Adjusted parent-child hierarchy to ensure correct orbital pivot around the spawn point. - Zeroed out local rotations to fix perspective culling issues during animation.[14:52] (10c9723) feat(vfx): implement portal animator and spawner logic - Created PortalAnimator script with procedural rotation and scaling. - Added AAA polish support (Audio & Particles) for future use. - Updated WasteSpawner to trigger the portal burst effect on spawn.[17:33] (70ecf87) build(vfx): create modular VirtualPortal prefab with integrated spawner - Packaged TwirlDistortion VFX and WasteSpawner into a single reusable VirtualPortal prefab. - Configured parent-child hierarchy to ensure correct orbital rotation and zeroed local offsets. - Designed as an independent module to allow easy placement on AR surfaces (ceilings) without breaking spawner logic.[17:40] (dd30e33) refactor(scene): remove conveyor system for true MR room-scale transition - Deleted legacy ConveyorSystem_Module to eliminate physics deadlocks and friction bugs. - Transitioned game design to drop waste directly onto the player's physical floor. - Placed the new VirtualPortal prefab at the ceiling level to act as the primary waste source. - Cleaned up hierarchy to enforce the new AR-first architecture described in the Phase 1 plan."
},
{
"day": 26,
"date": "2026-08-06",
"content": "26. Gün (06.08.2026) Çalışma Raporu**Konu:** AR Fizik Optimizasyonu, Kapsamlı \"Tunneling\" (İçinden Geçme) Çözümü ve Prefab Mimari TemizliğiBugünkü mesaime, dünkü testlerde gözlemlediğim AR fizik hatalarını ve objelerin zeminden geçme problemlerini çözmek amacıyla GitHub üzerinde **\"AR Physics Stability and Tunneling Bug\"** adında kapsamlı bir Issue (Görev) oluşturarak başladım.İlk olarak Unity AR Foundation'ın ürettiği zeminlerin (Plane) varsayılan olarak kağıt inceliğinde bir `MeshCollider` ile geldiğini ve bu durumun yüksek hızda düşen objelerde \"Tunneling\" (objenin zemini delip geçmesi) sorununa yol açtığını tespit ettim. Bu sorunu kökten çözmek için `ARSurfaceConfigurator.cs` adında yeni bir yönetici (Manager) script yazdım. Bu script sayesinde, ortamda tespit edilen AR zeminlerinin ince MeshCollider'larını dinamik olarak devre dışı bırakıp, yerlerine 5 cm kalınlığında (0.05f) etli bir `BoxCollider` ördüm. Ayrıca zemin tipine (Halı veya Masa) göre dinamik sürtünme katsayıları tanımlayarak AR fizik kalitesini AAA oyun standartlarına çektim.İkinci büyük aşamada, sahnede yere düşen ancak garip fiziksel tepkiler veren çöp objelerinin (Waste) mimarilerini analiz ettim. Yaptığım analiz sonucunda, 12 farklı prefab'ın (şişe, yay, defter vb.) alt (Child) objelerinde hatalı ve mükerrer şekilde `Rigidbody` ile `XRGrabInteractable` bileşenlerinin unutulduğunu fark ettim. Unity'nin fizik motoru kurallarına aykırı olan bu durumu düzeltmek için tüm prefab'ların içine girerek bu fazlalıkları manuel olarak sildim ve objeleri \"Compound Collider\" (Tek merkezli fizik) standartlarına uygun hale getirdim.Fizik motorunu daha da stabil kılmak için `BeltItem.cs` içerisindeki objelerin serbest düşüşe geçtiği anlardaki çarpışma modunu `ContinuousDynamic` olarak zorlayarak olası son hataların da önüne geçtim. Ek olarak, VR gözlük olmadan editör üzerinden hızlı fizik testleri yapabilmek adına sınırları ve merkezi (Center Y: -0.5) görsel zeminle kusursuz hizalanmış bir `EditorTestFloor` prefab'ı hazırladım.Son olarak oyun akışında (Game Flow) tasarımsal bir iyileştirmeye gittim. Sahnedeki fiziksel başlatma kolu (Lever) kaldırıldığı için, `GameManager` üzerindeki state machine (durum makinesi) mantığını güncelledim ve `ReadyToStart` adımını pas geçip oyunun doğrudan `Countdown` (Geri sayım) evresiyle başlamasını sağladım.Gün sonunda, tüm bu köklü değişiklikleri tek bir yığın halinde atmak yerine \"Best Practice\" kurallarına uygun olarak 4 farklı atomik (parçalara ayrılmış) commit halinde GitHub'a push'ladım ve günün başında açtığım Issue'yu referans göstererek başarılı bir **Pull Request (PR)** oluşturdum. Benim açımdan hem fizik motorunun derinliklerini kavradığım hem de yazılım mimarisi hatalarını analiz edip çözdüğüm çok verimli bir mühendislik günü oldu.Git Commit Mesajları:[11:41] (c81c63d) feat(ar-physics): add ARWastePhysicsTuner for automatic grab\/throw calibration Created a centralized script to automatically configure Rigidbody mass, angular damping, and XR throw velocity for optimal AR room-scale interactions.[12:01] (924840e) refactor(ar-physics): apply physics tuner to all waste prefabs Attached the new ARWastePhysicsTuner component to all waste prefabs to ensure unified physics and throw mechanics across the AR environment.[13:41] (32c74e6) refactor(game-manager): bypass ReadyToStart state and jump directly to Countdown - Updated the state machine in GameManager to skip the `ReadyToStart` state and transition directly into the `Countdown` state. - This change is required because the physical start lever was removed along with the conveyor belt, making manual starts impossible. - Added `GameState.Countdown` to the UI animation conditions to ensure buttons and visual elements transition correctly during the countdown phase.[14:41] (0701b6e) fix(physics): remove duplicate Rigidbodies from child objects in waste prefabs - Removed accidental duplicate `Rigidbody` and `XRGrabInteractable` components from child mesh objects across 12 waste prefabs. - This resolves a critical physics bug where the parent object would detach from its colliders and fall infinitely through the floor upon instantiation. - Prefabs now correctly rely on a single Rigidbody on the parent object, forming a stable Compound Collider with the child mesh.[14:42] (4c63ca2) feat(ar): implement thick BoxColliders for AR planes to prevent physics tunneling - Replaced the default 0-thickness `MeshCollider` on AR planes with a dynamic 5cm thick `BoxCollider`. - This permanently solves the physics tunneling (ghosting) issue where thin objects would fall through real-world floors. - Automatically assigns high-friction PhysicsMaterials based on AR plane classification (Floor vs Table).[15:51] (f3a8eae) fix(physics): force ContinuousDynamic collision on dropped items - Added logic to explicitly set `CollisionDetectionMode.ContinuousDynamic` when an item is dropped from the conveyor belt (`isKinematic = false`). - Prevents high-velocity falling objects from clipping through the floor due to Unity's default Discrete detection mode resetting.[15:58] (a4b00c9) chore(editor): add EditorTestFloor prefab for physics testing - Added the `EditorTestFloor` prefab to simulate AR physical planes in the Unity Editor. - This enables testing of object spawning and collision physics without requiring a physical AR device. - Calibrated the BoxCollider Center Y to -0.5 to perfectly align the physical collision bounds with the visual floor, preventing the floating object bug.[17:25] (1e87ac1) refactor(physics): tune AR waste physics properties - Fine-tuned the rigid body physics parameters for waste objects to improve realism in the AR environment. - Optimized collision detection and physics material assignments to prevent clipping and jittering on real-world surfaces.[17:30] (3268f62) chore(scene): calibrate VirtualPortal height and test floor in AR scene - Adjusted the VirtualPortal spawn height to prevent waste objects from spawning directly inside the floor colliders. - Applied Center Y (-0.5) calibration to the EditorTestFloor to ensure physical boundaries perfectly match the visual plane."
},
{
"day": 27,
"date": "2026-08-07",
"content": "27. Gün (07.08.2026) Çalışma RaporuKonu:AAA Standartlarında Kayıt Mimarisi (SaveManager), Golden Waste Joker Mekaniği ve Dokunsal Geri Bildirim (Haptic) SistemleriBugünkü mesaime, projenin eksik olan temel yapı taşlarını (Core Systems) belirleyip inşa etmek amacıyla GitHub üzerinde **\"Core Systems & Mechanics: Haptics, Save Architecture, and Joker Logic\"** adında kapsamlı bir Issue (Görev) oluşturarak başladım.İlk olarak oyunun durumunu (Level, XP, Jeton) cihazın yerel hafızasına güvenli bir şekilde kaydetmek için JSON tabanlı, global erişime açık (Singleton) bir `SaveManager` mimarisi geliştirdim. Sadece veriyi yazıp geçmek yerine endüstri standartlarını (AAA) uygulayarak, oyunun kaydedilmesi sırasında yaşanabilecek elektrik kesintisi veya çökme anlarında verinin bozulmasını engellemek için üç aşamalı bir kalkan kurdum. Bu sistem sayesinde veriler önce geçici bir dosyaya (`.tmp`) yazılıyor, ardından mevcut kaydın otomatik bir yedeği (`.bak`) alınıyor ve işlem hatasız biterse asıl dosyanın üzerine yazılıyor. Ayrıca bu okuma\/yazma işlemlerine `Try-Catch` blokları ekleyerek, işletim sistemi bazlı erişim hatalarında uygulamanın donmasını kesin olarak engelledim.İkinci büyük aşamada, oyunun tekrar oynanabilirlik (Replayability) değerini artırmak için nadir çıkan \"Golden Waste (Altın Çöp)\" joker mekaniğini tasarladım. `WasteSpawner` içerisindeki havuzlama sistemine entegre ettiğim bir RNG (Rastgele Sayı Üretimi) algoritması ile Altın Çöp'ün %5 şansla sahneye çıkmasını sağladım. Ardından çöp kutularının karar mekanizmasını barındıran `BinTrigger` sınıfını güncelleyerek, bu altın çöpün doğası ne olursa olsun tüm kutular tarafından \"Evrensel Doğru\" olarak kabul edilmesini ve kazanılan puanı anlık olarak 5'e katlamasını (Multiplier) sağladım. Bu aşamada, dışarıdan projeye dahil ettiğim `.glb` uzantılı altın şişe 3D modelinin varsayılan olarak gelen ağır ve hatalı `MeshCollider` bileşenini silip, yerine performansı çok daha yüksek olan ve objelerin zeminden geçme (Tunneling) sorununu önleyen `CapsuleCollider` entegrasyonunu yaptım.Üçüncü aşamada, VR atmosferini ve oyuncu hissiyatını güçlendirmek için merkezi bir `HapticManager` sınıfı kodladım. Nesnelerin etkileşim kodları içerisine (`ARWastePhysicsTuner`) girerek, Unity'nin `XRGrabInteractable` (Tutma) event'lerine dinamik bir şekilde abone (Subscribe) oldum. Bu yapı sayesinde normal çöpler tutulduğunda kısa bir tıklama hissi gelirken, Altın Çöp tutulduğunda özel bir ritmik kalp atışı titreşimi verilmesini sağladım.Gün sonunda, tüm bu köklü değişiklikleri tek bir yığın halinde atmak yerine \"Best Practice\" kurallarına uygun olarak 6 farklı atomik (parçalara ayrılmış) commit halinde GitHub'a push'ladım ve günün başında açtığım Issue'yu referans göstererek başarılı bir **Pull Request (PR)** oluşturdum. Benim açımdan hem veri güvenliği (Data Persistence) mimarilerini hem de RNG tabanlı oyun içi dengeleme algoritmalarını başarıyla tasarlayıp birleştirdiğim, çok verimli bir mühendislik günü oldu.Git Commit Mesajları:[10:34] (c881f01) feat(core): implement robust SaveManager with JSON serialization - Created a Singleton `SaveManager` to handle data persistence securely. - Defined a scalable `SaveData` structure including Level, XP, and Coin properties. - Implemented `SaveGame` and `LoadGame` routines utilizing `JsonUtility` and `Application.persistentDataPath` for reliable cross-platform local storage.[11:29] (5324282) feat(haptics): implement grab and golden waste haptic patterns - Added `TriggerGrabHaptic` to deliver a short, satisfying click feedback. - Developed `TriggerGoldenWasteHaptic` coroutine to simulate a rhythmic, heartbeat-like pulse for premium items. - Added Debug.Log support for haptic events to enable testing directly within the Unity Editor.[11:30] (3137b8a) feat(interaction): hook xr grab events to haptic manager - Subscribed to `XRGrabInteractable.selectEntered` event via code to automate haptic feedback on grab. - Ensured the grab haptics dynamically apply to all waste prefabs without manual inspector configurations.[15:15] (9e947b4) feat(assets): add golden waste 3d model and optimized prefab - Imported 'Bottle Musterd' .glb 3D model for the Golden Waste item. - Created `GoldenWaste` prefab with proper folder structure. - Replaced the default Mesh Collider with a Capsule Collider to prevent tunneling issues and optimize AR physics performance.[16:44] (3331757) feat(gameplay): implement golden waste rare spawn and joker mechanic - ARWastePhysicsTuner: Added `isGoldenWaste` flag to trigger unique rhythmic haptic feedback upon grabbing. - WasteSpawner: Added RNG logic for a rare chance to spawn the Golden Waste prefab instead of normal waste. - BinTrigger: Updated matching logic to recognize Golden Waste as a universal joker (isCorrect = true) and applied a 5x score multiplier.[18:21] (4ef2104) refactor(core): upgrade save manager to secure AAA architecture - Refactored SaveManager to use temporary files (.tmp) during the save process to prevent data corruption in case of unexpected crashes or battery failure. - Implemented automatic backup generation (.bak) for save data. - Added Try-Catch blocks to handle file I\/O exceptions securely without freezing the application. - Developed an automatic recovery system that restores data from the backup file if the main save file is missing or corrupted.[18:26] (1a209d0) chore(scene): assign golden waste prefab to ar spawner - Updated `WasteSpawner` component in MainGame_AR scene. - Linked the new `GoldenWaste` prefab to the Golden Waste Settings slot to enable spawning during gameplay."
},
{
"day": 28,
"date": "2026-08-10",
"content": "28. Gün (10.08.2026) Çalışma RaporuGün 6: Çekirdek Mimari (Core) Revizyonu, State Machine ve Ölçeklenebilir Analytics Altyapısının KurulmasıBugün mesaiye başladığımda projenin \"GameManager\" (Oyun Yöneticisi) sınıfının giderek karmaşıklaşmaya başladığını fark ettim. İleride oyuna dalga (wave) sistemleri veya zorluk ayarları eklediğimde kodların spagettiye dönüşmemesi için çekirdek mimariyi baştan yazmaya karar verdim. Bu doğrultuda sabah ilk iş olarak GitHub üzerinde **\"#136 - GameManager Revizyonu ve Analytics Altyapısı\"** başlıklı bir Issue açarak günün hedeflerini ve mimari planımı listeledim.Günün ilk yarısında `GameManager` sınıfını, tamamen **Event-Driven (Olay Güdümlü) bir Finite State Machine (Durum Makinesi)** yapısına çevirdim. State geçişleri için `OnStateEnter` ve `OnStateExit` fonksiyonları yazarak, diğer modüllerin (UI, Ses, Spawner vb.) oyunun ana döngüsüne müdahale etmeden sadece bu sinyalleri dinlemesini (Observer Pattern) sağladım. Bu sayede kodlarımı Single Responsibility (Tek Sorumluluk - SRP) prensibine uygun hale getirdim. Ayrıca VR oyunlarında sıkça karşılaşılan \"Oyuncu gözlüğü aniden çıkarırsa ne olur?\" senaryosu için `OnApplicationPause` ve `OnApplicationFocus` kontrollerini entegre ettim. Böylece sistem kesintiye uğradığında oyun otomatik olarak `GameState.Paused` durumuna geçip zamanı (`Time.timeScale = 0`) durduruyor.Günün ikinci yarısında, projenin sadece çalışan bir uygulama olmaktan çıkıp \"veri odaklı\" (Data-Driven) bir projeye dönüşmesi için `AnalyticsManager` adında yepyeni bir Telemetri sınıfı kodladım. Oyuncuların oyun içi davranışlarını ölçmek amacıyla; tepki sürelerini (Reaction Time), isabet oranlarını (Accuracy) ve oyunu hangi menüde sıkılıp terk ettiklerini (Funnel Analysis \/ QuitState) ölçen bir sistem geliştirdim.Çözülen Kritik Bir Sorun (JSON Serialization):Verileri lokal olarak cihazda tutmak için JSON yapısını kullanıyordum. Huni (Funnel) analizinde oyuncunun hangi State'e kaç kere girdiğini tutmak için başlangıçta `Dictionary<GameState, int>` kullanmayı planlamıştım. Ancak Unity'nin yerleşik `JsonUtility` sınıfının Dictionary yapılarını serileştiremediğini (serialize) ve verilerin kaybolduğunu tespit ettim. Bu sorunu çözmek için Dictionary yerine `[Serializable]` bir C# Struct'ı (`StateReachData`) oluşturdum ve bu Struct'ı bir Liste (`List<StateReachData>`) içinde tutarak Unity'nin JSON motorunu sorunsuz bir şekilde baypas ettim. Ayrıca disk yorulmasını (File I\/O) engellemek için verileri her atışta değil, yalnızca oyun bittiğinde (GameOver) veya uygulama kapandığında RAM'den diske yazdıracak şekilde optimize ettim.Günün Özeti:Günün sonunda açtığım tüm Task'leri başarıyla tamamladım ve yazdığım tüm bu yeni sistemleri **\"Feature: Core Architecture Overhaul & Scalable Data-Driven Telemetry Integration\"** başlıklı detaylı bir Pull Request (PR) ile ana projeye Merge edip sabah açtığım Issue'yu kapattım.Git Commit Mesajları:[10:48] (830d411) feat(core): refactor GameManager into a robust Event-Driven State Machine - Implemented robust State Transition Validation to prevent invalid state changes (compliant with SRP & OCP). - Integrated `GameSessionData` struct to accurately track in-game analytics (caught\/missed wastes, max combos, XP). - Added `PreviousState` tracking and reliable `Time.timeScale` pause\/resume management. - Implemented `RestartGame` logic for instant session resets (clears timer, session stats, and prepares countdown). - Scaffolded Wave System (`StartWave`, `EndWave`) for future difficulty scaling.[11:05] (0d7eb74) refactor(modules): align dependent systems with the new GameManager architecture - Replaced deprecated `GameState.ReadyToStart` references with the new `GameState.Placement` standard across all interactive modules. - Updated `PhysicalVRButton` and `UIManager` to trigger the new `RestartGame()` pipeline instead of the obsolete `PrepareToStart()` method. - Adjusted `MachineLever` and `TutorialManager` condition checks to ensure seamless integration with the newly implemented Finite State Machine (FSM). - Ensured zero reference errors and maintained loose coupling principles between UI\/Environment modules and the core GameManager.[14:12] (1fb360a) feat(analytics): implement event-driven data mining system for player behavior - Created a robust, thread-safe Singleton `AnalyticsManager` to mine and store player behavior data locally as JSON (`AnalyticsData.json`). - Utilized Observer Pattern to passively track average playtime, level completion rate, and max combo frequencies by listening to `GameManager` and `ScoreManager` events. - Extended the `SortResultData` struct in `BinTrigger` to explicitly track exactly which recycling bins players struggle with the most (e.g., Plastic vs Glass errors). - Added `OnGoldenWasteSpawned` event to `WasteSpawner` to calculate the precise ratio of spawned golden wastes versus successfully caught ones. - Guaranteed complete adherence to Single Responsibility (SRP) and Open\/Closed (OCP) principles by decoupling data tracking from core gameplay logic.[15:20] (1859006) refactor(core): implement FSM lifecycle hooks and VR headset removal protection - Upgraded the State Machine architecture by introducing `OnStateEnter` and `OnStateExit` lifecycle hooks for cleaner state transitions. - Implemented robust VR protection using `OnApplicationPause` and `OnApplicationFocus` to automatically pause the game (`GameState.Paused`) if the player removes the Quest headset or the OS interrupts the application. - Hardened the `RestartGame` logic to explicitly reset `Time.timeScale` to 1, preventing frozen state bugs when restarting from a paused context. - Added professional debug logging during state transitions for easier runtime tracking.[16:01] (7d11d7a) chore(core): apply prefab overrides for AnalyticsManager and SaveManager - Applied pending instance overrides to the `CoreSystems_Module` prefab. - Permanently embedded `AnalyticsManager` and `SaveManager` as native child GameObjects within the core systems architecture. - Prevented potential reference loss during scene transitions and ensured modular consistency across all scenes using this prefab.[16:14] (6192f8f) feat(scene): integrate AnalyticsManager into the main AR scene - Added the `AnalyticsManager` GameObject to the `MainGame_AR` scene hierarchy. - Successfully hooked the analytics telemetry system into the core gameplay loop. - Ensured the manager initializes correctly at runtime to track player behavior, funnel metrics, and accuracy without impacting performance.[17:46] (0870478) feat(analytics): implement advanced telemetry, reaction time and funnel analysis - Created the core `AnalyticsManager` singleton to passively mine player behavior data via an Event-Driven Observer pattern. - Upgraded `ARWastePhysicsTuner` to capture object `SpawnTime` and modified `BinTrigger` to calculate precise `ReactionTime` for advanced difficulty balancing. - Expanded `AnalyticsData` to track highly requested commercial metrics: Player Accuracy (Total Correct vs Incorrect), Max Wave Reached, and Quit State logic. - Implemented Funnel Analysis by tracking State Reach frequencies using `StateReachData` struct lists, cleanly bypassing Unity's JsonUtility dictionary serialization limitations. - Maintained strict adherence to Single Responsibility (SRP) and Open-Closed Principle (OCP); core gameplay loops remain completely isolated from data collection. - Cleaned up the `MainGame_AR` scene file by stripping loose instance data, officially delegating `AnalyticsManager` and `SaveManager` to the `CoreSystems_Module` prefab architecture."
},
{
"day": 29,
"date": "2026-08-11",
"content": "29. Gün (11.08.2026) Çalışma RaporuKonu:Kombo Mekaniği Revizyonu, Başarım Sistemi (Achievement) Geliştirmesi ve Code Review SüreciYapılan İşler:Bugün mesaiye başlar başlamaz kod yazmaya girişmek yerine, kurumsal yazılım geliştirme süreçlerine (Agile\/Scrum) uygun olarak ilk iş proje yönetim aracımız üzerinden günlük hedeflerim için detaylı bir \"Issue\" açtım. Görev tanımlarımı belirledikten sonra, Git Flow standartlarına harfiyen uyarak ana projeyi bozmamak adına `feature\/combo-and-achievement-system` adında yeni bir Branch (Dal) oluşturdum ve tüm geliştirme ortamımı bu izole yapıya taşıdım.Geliştirmeye başladığımda ilk ele aldığım şey, sabahın ilk görevi olan `ComboManager` sisteminin revizyonuydu. VR ortamında oyuncuların hareket kabiliyetini göz önüne alarak kombo süresini (Combo Window) yeniden dengeledim. Ayrıca oyuncuyu fazla cezalandırmamak adına \"Grace (Kombo Affı)\" mekaniğini baştan yazdım; hata yapıldığında kombo tamamen sıfırlanmak yerine artık kademeli olarak (örn: x5'ten x4'e) düşüyor ve bu af hakkı bir kombo zincirinde sadece bir kez kullanılabiliyor.Bu dengelemeyi bitirdikten sonra ana göreve, yani oyuncunun motivasyonunu artıracak olan kapsamlı Başarım (Achievement) sistemine geçtim. `AchievementManager` adında merkezi bir sistem tasarladım. Kodu yazarken SOLID prensiplerinden \"Gevşek Bağlılık (Loose Coupling)\" kuralına sadık kalarak, sistemi sadece oyun içindeki event'leri (olayları) dinleyecek şekilde kurguladım. Başarım açıldığında `GameManager` ile `AnalyticsManager` tetiklenerek XP\/Coin dağıtma ve veri kaydetme işlemlerini kendi içlerinde hallediyorlar. Kullanıcı ilerlemelerinin kalıcılığı için ise veri bozulmalarına karşı korumalı (try\/catch), yerel bir JSON (`Achievements.json`) kayıt sistemi inşa ettim.Arayüz (UI) tarafında karşılaştığım en büyük problem olan \"aynı anda kazanılan başarımların ekranda üst üste binmesi\" sorununu, `UIManager` içerisine `Queue<AchievementData>` (Kuyruk) veri yapısı ve C# Coroutine'leri entegre ederek çözdüm. Ayrıca 50 veya 100 hedefli uzun başarımlar için %50, %75 ve %90 eşiklerinde çalışan ara bildirimler yazdım ve bildirim tekrarı olmaması için `HashSet` ile bir kontrol mekanizması ekledim. Son olarak tüm arayüz metinlerini İngilizceye çevirdim.Günün sonunda yaptığım tüm bu geliştirmeleri koca bir yığın halinde göndermek yerine; kombo dengelemesi, başarım altyapısı, UI\/sahne düzenlemeleri ve İngilizce yerelleştirme olarak parçalara böldüm ve oluşturduğum branch'e toplam 4 adet temiz commit attım.Mesai bitiminde kodlarımı ana projeye dahil edebilmek için detaylı açıklamalar içeren profesyonel bir **Pull Request (PR) oluşturdum**. Şu anda staj hocam açtığım bu PR üzerinde \"Code Review (Kod İncelemesi)\" yapıyor. Hocamın vereceği onay veya geri bildirimler doğrultusunda varsa son düzenlemeleri yapıp, kodlarımı güvenle ana branch'e merge edeceğiz. Bir iş (issue) oluşturmaktan başlayıp PR açmaya kadar giden tam teşekküllü bir yazılım geliştirme döngüsünü başarıyla tamamladığım harika bir gün oldu.Git Commit Mesajları:[10:26] (cd27952) feat(core): initialize ComboManager skeleton for multiplier tracking - Created the foundational skeleton class for `ComboManager`. - Configured a thread-safe Singleton pattern with `DontDestroyOnLoad` to persist across scene changes. - Prepared global `Action` events (`OnComboChanged`, `OnComboBroken`) for future Observer Pattern integration, laying the groundwork to decouple multiplier logic from the ScoreManager.[13:17] (20a30ba) feat(core): implement decoupled ComboManager with Grace Period and advanced analytics - Architectural Refactor: Decoupled combo mechanics from ScoreManager into a dedicated ComboManager to enforce Single Responsibility Principle (SRP). - Combo Ranks & Multipliers: Implemented a dynamic scaling system (x2, x3, x4, x5 multipliers) for Score, XP, and Coins based on consecutive correct throws. - Combo Window: Added a physical timeout mechanic (default 12s for VR) that breaks the combo if the player remains inactive. - Grace Period System: Implemented a balanced forgiveness mechanic. At x4+ multipliers, players earn 1 Grace per chain. Instead of dropping to 0 on a mistake, the combo steps down (e.g., x5 -> x4), preventing abuse. - Event-Driven UI & Audio: UIManager and AudioManager now subscribe to OnComboChanged, OnComboBroken, and OnComboGrace events (Loose Coupling). - Analytics Integration: Connected ComboManager to AnalyticsManager and GameSessionData to track MaxComboEverReached, TotalCombosReached, TotalGraceEarned, and TotalGraceUsed. - Bugfix: Resolved an invisible UI bug where the 'COMBO BROKEN' text was not reactivated correctly by the animation coroutine.[18:02] (dec0303) feat(ui): integrate achievement notification panel and scene layout Created and configured AchievementPanel in the MainGame_AR scene canvas. Added TitleText and DescText using TextMeshPro for achievement popups. Applied Vertical Layout Group to ensure proper text alignment and prevent overlapping. Assigned the new UI references to the UIManager via the Inspector. Registered the AchievementManager script to the CoreSystems_Module in the hierarchy.[18:03] (12e20a5) feat(core): implement complete achievement system with progress tracking Created AchievementManager to track 12 unique achievements (including hidden ones) via event-driven architecture. Implemented persistent JSON save system with data corruption protection and versioning. Added progress threshold logic (50%, 75%, 90%) for partial completion notifications. Localized all achievement titles, descriptions, and UI notifications to English. Updated UIManager to support a queued toast notification system. Integrated GameManager for automatic XP\/Coin rewards and AnalyticsManager for data tracking.[21:12] (86fef8f) Merge branch 'main' into feature\/combo-and-achievement-system"
},
{
"day": 30,
"date": "2026-08-12",
"content": "30. Gün (12.08.2026) Çalışma RaporuGünün Konusu:High Score Sistemi ve Oyun Sonu İstatistik Algoritmasının GeliştirilmesiGüne, proje yönetim (Agile) sistemimiz üzerinden bugünün ana iş paketini tanımlayan *\"High Score Sistemi ve Oyun Sonu İstatistik Algoritmasının Geliştirilmesi\"* başlıklı yeni bir Issue açarak başladım. Geliştirmelerimi mevcut kod tabanını (main branch) etkilemeden, güvenli ve izole bir ortamda yürütebilmek adına bu Issue'ya istinaden `feature\/endgame-stats` isimli yeni bir branch oluşturdum.Günün ilk yarısında, oyun sonu istatistiklerinin (Endgame Stats) matematiksel altyapısını kodlamaya odaklandım. İlk olarak, oyuncunun oyun içerisindeki genel isabet oranını (Accuracy) tutan bir algoritma yazdım. Bu algoritma, başarılı atışların toplam fırlatma sayısına oranını dinamik olarak yüzdelik bir veriye çeviriyor. Akabinde, bu metrikleri baz alarak çalışan kapsamlı bir performans değerlendirme (Performance Grading) sistemi geliştirdim. Bu sistem; elde edilen toplam skor, isabet oranı ve maksimum kombo sayısı gibi değişkenleri belirli matematiksel ağırlıklara göre harmanlayıp oyuncuya oyun sonunda (S, A, B, C veya D) şeklinde adil bir harf notu veriyor. Bu verilerin uçucu olmasını engellemek ve oyuncunun rekorlarını takip edebilmek için High Score (En Yüksek Skor) ve Match History (Maç Geçmişi) modüllerini de altyapıya entegre ettim; böylece kırılan rekorların JSON tabanlı kalıcı belleğe kaydedilmesi sağlandı.Günün ikinci yarısında, arka planda hesaplanan bu verileri oyuncuya görsel bir şölenle sunacak arayüz mimarisine geçiş yaptım ve `EndgamePanelController` UI modülünü geliştirdim. Yazılım mimarisi standartlarına (Single Responsibility - Tek Sorumluluk Prensibi) sadık kalmak adına, arayüz sınıfını hesaplama işlerine hiç bulaştırmadım. Bunun yerine kontrolcüyü tamamen Event-Driven (olay güdümlü) kurguladım. Kontrolcü, yalnızca `GameManager`'dan gelen \"GameOver\" (Oyun Bitti) event'ini dinliyor; oyun bittiği an arka planda oluşturulan ve dondurulan *FinalSessionReport* (Final Veri Paketi) isimli objeyi alıp içerisindeki skoru, rekor bilgisini, madalyaları ve harf notunu dinamik olarak TextMeshPro bileşenlerine aktarıyor.Gün sonunda, yazdığım High Score algoritmalarını, notlandırma (grading) mantığını ve UI yansımasını test edip sorunsuz çalıştıklarını onayladım. Yaptığım geliştirmeleri anlamsal bütünlüğüne göre bölerek *\"add endgame stats foundation and accuracy calculation\"* ve *\"implement endgame stats, performance grading and match history\"* başlıklarıyla commit'ledim. Son olarak, ilgili Issue'yu kapatmak ve kodlarımı takımın ana kod tabanına dahil etmek üzere detaylı bir Pull Request (PR) açarak bugünkü mesaimi tamamladım.Git Commit Mesajları:[10:28] (e7ab070) feat(core): add endgame stats foundation and accuracy calculation - Added 'AccuracyPercentage' to GameSessionData struct. - Created 'CompileEndgameStats()' method in GameManager to dynamically calculate hit accuracy based on correct\/incorrect throws. - Triggered stats compilation at Game Over state. - Laid the groundwork for upcoming XP and Coin reward algorithms.[15:21] (eb6c30d) feat(core): implement endgame stats, performance grading and match history - Replaced basic game session with a comprehensive GameSessionData struct (immutable snapshot). - Implemented S-D performance grading algorithm based on accuracy, combo, and golden waste tracking. - Added detailed score breakdown (base, combo, penalty) and dynamic XP\/Coin economy clamping. - Integrated Performance Medals, Session Highlights, and an intelligent Next Goal generator. - Expanded SaveManager to include a MatchHistory array tracking the last 10 sessions persistently. - Updated ScoreManager to accurately track TotalCorrect\/Incorrect throws for precise accuracy calculation.[17:58] (0d0411d) feat(ui): implement dynamic endgame panel controller Added the EndgamePanelController to handle the end-of-session UI. It listens to GameManager state changes and grabs the frozen FinalSessionReport snapshot when the game is over. It now successfully displays the final score, accuracy, performance grade, earned medals, and economy rewards on the screen."
},
{
"day": 31,
"date": "2026-08-13",
"content": "31. Gün (13.08.2026) Çalışma RaporuGünün Konusu:Hassasiyet Motoru (Precision Engine) Entegrasyonu ve Tematik Oyun Sonu Arayüzünün YenilenmesiGüne, proje yönetim ve görev takip sistemimiz üzerinden \"Precision Engine Geliştirmesi ve Oyun Sonu Arayüzünün (UI) Yenilenmesi\" başlıklı yeni bir Issue açarak başladım. Geliştirmelerimi mevcut kod tabanından izole ve güvenli bir şekilde yürütebilmek adına, açtığım bu Issue numarasına istinaden `feature\/precision-accuracy-engine` isimli yeni bir branch oluşturdum.Günün ilk yarısında, oyunun temel fırlatma mekaniğini baştan aşağı yenileyerek matematiksel bir \"Hassasiyet Motoru\" kurmaya odaklandım. Çöplerin hedef kutunun merkezine ne kadar yakın atıldığını (isabetini) milimetrik olarak ölçebilmek için, kutunun duruş açısından bağımsız çalışan `InverseTransformPoint` metodunu kullanarak lokal uzayda mesafe hesaplama algoritmaları yazdım. Sistemin zorluk barajlarını (Perfect, Great, Good) kod içine gömmek yerine, SOLID (Open\/Closed) prensiplerine sadık kalarak `ScriptableObject` mimarisine taşıdım ve dışarıdan anında güncellenebilir bir yapı kurdum. Ek olarak, Welford Varyans Algoritmasını sisteme entegre ederek oyuncunun atış istikrarını (Consistency) ölçen matematiksel bir altyapı hazırladım. Bu sürecin canlı test edilebilmesi için ise (F3 tuşuyla kontrol edilen) OnGUI tabanlı bir geliştirici test paneli kodladım.Günün ikinci yarısında, Kullanıcı Deneyimi (UX) ve Arayüz (UI) iyileştirmelerine geçtim. İlk olarak, başarılı atışlarda kutu üzerinde beliren dinamik 3D yazıların (Floating Text) VR ortamında daha rahat okunabilmesi için font boyutlarını büyüttüm ve Zengin Metin (Rich Text) formatlamaları ile kalınlaştırdım. Ardından Oyun Sonu (Endgame) ekranını yeniden tasarladım. Klasik harf notu sisteminin (S, A, B, C vb.) oyuncu motivasyonuna katkı sağlamadığını analiz ederek, bu sistemi \"Eco Legend, Master Recycler\" gibi çevre temalı özel rütbelerle değiştirdim. Paneldeki tüm metinleri global standartlara uygun olarak İngilizceye çevirdim, rütbelerin altına kazanılma şartlarını alt yazı olarak ekledim ve ödül\/madalya kısımlarını madde işaretli, renkli ve modern bir görünüme kavuşturdum.Gün sonunda, yazdığım tüm yeni yöneticileri (Managers) ve güncellenen arayüz panellerini ana oyun sahnesine (MainGame_AR) bağlayıp son testlerimi gerçekleştirdim. Kod kalite kültürümüze uygun olarak, tüm bu devasa işlemleri tek bir parça halinde yollamak yerine mantıksal bütünlüklerine göre (Altyapı, Motor, Arayüz, Sahne) ayırarak sırasıyla \"atomik commit\"ler halinde kaydettim. Mesaimin en sonunda, sabah açtığım Issue'yu kapatmak ve kodlarımı takımın ana kod tabanına dahil etmek (merge) üzere detaylı açıklamalar içeren bir Pull Request (PR) açarak bugünkü görevimi başarıyla tamamladım.Git Commit Mesajları:[07:24] (467da1e) feat(core): create precision data types and scriptable object settings Implemented foundational data structures (PrecisionResult, PrecisionTier) and ScriptableObject settings architecture to decouple precision balancing from core logic. Created the default MainPrecisionSettings asset.[17:48] (ac33667) feat(core): implement precision math and consistency tracking algorithm Developed the core precision engine using InverseTransformPoint for accurate, rotation-invariant distance calculation. Integrated Welford's algorithm to calculate real-time throwing consistency and implemented streak tracking.[17:48] (46f9122) feat(ui): add 3d floating text feedback and debug overlay Added dynamic 3D floating text generation to provide immediate visual feedback (e.g., PERFECT +100) based on precision tiers. Included an OnGUI debug overlay with a keyboard toggle (F3) for live testing.[17:51] (99bf3b6) feat(core): implement thematic performance grading and match history logic Replaced legacy letter grades with thematic ranks (Eco Legend, etc.) in the core evaluation logic. Integrated match history tracking and updated score hooks across the main managers.[17:51] (f543ac8) feat(ui): overhaul endgame panel with thematic ranks and rich text formatting Refactored the endgame panel UI to display thematic ranks with descriptive subtitles. Translated all texts to English, applied bullet point styling for medals, and formatted the economy display using rich text.[17:54] (2dd78f0) chore(scene): update main game scene for endgame ui and precision settings Saved the latest scene modifications including Endgame UI container references, text mesh pro alignments, and precision engine component links."
},
{
"day": 32,
"date": "2026-08-14",
"content": "32. Gün (14.08.2026) Çalışma RaporuKonu:Unity Karma Gerçeklik (MR) Projesinde Ses Mimarisi Geliştirmesi, Hafıza Yönetimi (Memory Management) ve Sürüm Kontrol (Git) SüreçleriBugünkü staj çalışmama, \"Recycle Rush AR\" projesinin mevcut mimarisindeki eksiklikleri ve potansiyel performans sorunlarını analiz ederek başladım. Yapılacak işleri Agile ve sürüm kontrol (Version Control) prensiplerine uygun şekilde yönetmek amacıyla ilk olarak GitHub üzerinde \"Audio System Entegrasyonu ve Memory Management Optimizasyonu\" adında bir **Issue (Görev\/Sorun Kaydı)** oluşturdum. Ardından, projeyi etkilemeden izole bir ortamda çalışabilmek için bu Issue'ya bağlı olarak `feature\/spatial-audio-sfx` isminde uygun bir **Branch (Geliştirme Dalı)** açarak kodlama sürecine geçtim.Gün içindeki teknik geliştirmelerim şu başlıklarda gerçekleşmiştir:1. Mimari Optimizasyon ve Hafıza Sızıntısı (Memory Leak) Çözümleri:Proje genelinde kullanılan `UIManager` ve `AnalyticsManager` sınıflarında, oyun sahneleri değiştiğinde veya objeler yok edildiğinde arkada çalışmaya devam eden \"Static Event\" kaynaklı hafıza sızıntıları (Memory Leak) tespit ettim. Nesne yönelimli programlama standartlarına uygun olarak, `OnDisable` metotlarındaki gereksiz \"Instance kontrolü (Null check)\" yapılarını kaldırarak static event aboneliklerinin doğru şekilde iptal edilmesini sağladım. Ayrıca, karmaşıklık yaratan deneysel ScriptableObject ses sistemini iptal ederek, daha stabil çalışan Singleton tabanlı monolotik `AudioManager` mimarisine geri dönüş (Refactor) işlemini gerçekleştirdim.2. Mekansal Ses (Spatial Audio) Altyapısı ve Asset Entegrasyonu:Oyunun mekaniklerine (Kombo artışı, Hatalı Kutu, İsabetlilik - Precision atışları ve Yere Düşme Cezası) uygun yüksek kaliteli ses efektleri (SFX) projeye dâhil edildi. 3 Boyutlu ses (Spatial Audio) mimarisi kurularak çöplerin düştüğü konuma göre sesin yönünün ayarlanması sağlandı. Ayrıca ses kanallarının birbirine girmemesi için Unity `MainMixer` yapılandırılarak BGM, SFX ve UI kanalları izole edildi.3. Prefab Entegrasyonu ve Sahne Yönetimi:Yazılan kodların ve eklenen ses dosyalarının Unity Editor içerisinde ilgili Inspector yuvalarına referans bağlantıları yapıldı. Hiyerarşide sonradan eklenmiş olan `PrecisionManager` ve `AudioManager` nesneleri, \"Apply All\" yöntemi ile `CoreSystems_Module` ana Prefab'ına (Kalıp nesneye) resmi olarak işlendi (Prefab Overrides).4. Atomic Commit ve Pull Request (PR) Süreci:Günün sonunda yapılan tüm geliştirmeleri, takım arkadaşlarımın rahatça inceleyebilmesi adına tek bir yığın halinde göndermek yerine \"Atomic Commit\" (Mantıksal parçalara bölünmüş) prensibiyle 3 aşamaya böldüm:1. Ses assetleri ve mikser kurulumu (`feat`).2. Hafıza sızıntısı (Memory Leak) ve mimari düzeltmeleri (`refactor`).3. Sahne ve Prefab entegrasyonları (`chore`).Bu düzenli commit yapısını oluşturduktan sonra branch'imi GitHub'a yolladım (Push) ve staj hocamızın kodları incelemesi (Code Review) ile ana projeye dâhil edilmesi için bir Pull Request (PR) açarak bugünkü geliştirme döngümü tamamladım.Git Commit Mesajları:[10:32] (192fa97) feat(audio): setup spatial audio architecture in AudioManager Expanded the existing AudioManager to support Spatial Audio (3D) requests without memory leaks. Added dynamic AudioSource generation for position-based sounds (Golden Waste, Coin Collect) and prepared new SFX slots for future integration.[18:30] (7435850) feat(audio): add core sfx assets and main audio mixer - Added high-quality SFX files for gameplay events (Combo, Precision, Penalties). - Configured MainMixer for BGM, SFX, UI, and Spatial audio routing.[18:31] (e1fb06f) refactor(core): fix memory leaks and revert to monolithic audio manager - Fixed static event unsubscription memory leaks in UIManager and AnalyticsManager (OnDisable). - Reverted audio system from ScriptableObjects back to Singleton AudioManager for stable scene transitions. - Updated EndgamePanelController to support direct AudioManager calls.[18:34] (0f20785) chore(scene): wire audio manager and apply prefab overrides - Applied PrecisionManager and AudioManager overrides to CoreSystems_Module prefab. - Assigned default SFX clips to AudioManager slots in the main AR scene."
},
{
"day": 33,
"date": "2026-08-17",
"content": "33. Gün (17.08.2026) Çalışma RaporuKonu: VR Etkileşim Mekanikleri ve Materyal Bazlı Fizik Geliştirmeleri1. Görev Planlaması ve Branch YönetimiGüne, projedeki \"Game Feel\" (Oyun Hissi) eksikliklerini ve temel oynanış etkileşimlerini iyileştirmek amacıyla GitHub üzerinde bir Issue açarak başladım. Yapılacak geliştirmeleri planladıktan sonra, ana projeyi riske atmamak ve izole bir ortamda çalışmak adına `feature\/gravity-grab-and-portal-vfx` adında uygun isimlendirmeye sahip yeni bir Git branch'i (dalı) oluşturdum ve çalışmalarıma bu dal üzerinden devam ettim.2. Gravity Grab (Uzaktan Çekim) Sisteminin GeliştirilmesiOyuncunun uzaktaki objelerle etkileşimini akıcı hale getirmek için \"Gravity Grab\" mekaniğini tasarladım. Bu kapsamda `GravityPullController` ve `GravityPullMotion` scriptlerini kodladım. Objelerin hedefe düz bir çizgi halinde gelmesi yerine, S-Curve (kavisli) ve pürüzsüz bir yörünge izlemesini sağlayan matematiksel bir algoritma entegre ederek VR deneyimindeki tatmin hissini maksimize ettim.3. Materyale Özgü Düşüş Fiziğinin (Material-Based Physics) TasarlanmasıSahnede üretilen farklı çöp türlerinin (Kağıt, Cam, Plastik, Metal) aynı fiziksel tepkileri vermesinin gerçekçiliği bozduğunu tespit ettim. Bunu çözmek için `ARWastePhysicsTuner` adında merkezi bir fizik yönetim scripti yazdım. Kağıt objeler için rüzgarda süzülme (Leaf Sway algoritması) ve yüksek hava sürtünmesi uygularken; cam ve metal objelerin daha tok ve ağır hissettirmesi adına kütle ve düşüş hızlarını dinamik olarak optimize ettim.4. Veri Entegrasyonu ve Test SüreçleriYazdığım yeni fizik sistemini, projenin `Prefabs\/Waste` klasöründe bulunan tüm çöp prefablarına Inspector üzerinden manuel olarak uygulayıp kategorize ettim. Yapılan değişikliklerin sahnede sorunsuz çalıştığından emin olmak için `MainGame_AR` ana sahnesinde test simülasyonları gerçekleştirdim.5. Pull Request (PR) Oluşturulması ve Sürecin TamamlanmasıGeliştirme ve test süreçlerini başarıyla tamamladıktan sonra, yaptığım değişiklikleri atomik (parçalı) commitler halinde paketledim. Son olarak, kodların ana projeye (main branch) dahil edilebilmesi için GitHub üzerinden İngilizce açıklamaları barındıran detaylı bir Pull Request (PR) açarak bugünkü geliştirme döngümü profesyonel standartlara uygun bir şekilde sonlandırdım.Git Commit Mesajları:[10:36] (c536c8a) feat(interaction): initialize GravityGrab skeleton architecture Created the base script for the Half-Life: Alyx style Gravity Grab mechanic. Established XRRayInteractor event listeners and the state machine structure for distant pulling. Mathematics for the Bezier curve pull will be implemented next. Follows SRP by decoupling pull logic from base interactions.[18:05] (3ddcbeb) feat: Implement Gravity Grab mechanic with S-Curve motion Created GravityPullController and GravityPullMotion scripts. Implemented smooth S-Curve trajectory for pulling remote objects to the hand. Removed maximum pull distance limitation to improve fast-paced gameplay flow.[18:07] (6995c4f) feat: Implement material-based physics system Added WasteMaterialType enum to the physics tuner. Implemented leaf-sway algorithm and high drag for paper objects. Defined mass and linear damping values for glass, plastic, and metal.[18:09] (bca0384) chore: Apply material types to waste prefabs Updated all waste prefabs via Unity Inspector to assign their correct WasteMaterialType in the ARWastePhysicsTuner component.[18:21] (1243fe8) chore: Update scene configurations Saved and updated the MainGame_AR scene to retain recent prefab and physics system references."
},
{
"day": 34,
"date": "2026-08-18",
"content": "34. Gün (18.08.2026) Çalışma RaporuKonu: Gelişmiş Atık Etkileşimleri (Kirli Çöp & Yapışık Çöp) ve VR Fizik İyileştirmeleriYapılan Çalışmalar:Bugün, geliştirmekte olduğumuz VR Geri Dönüşüm Simülasyonu projesinin oynanış derinliğini artırmak ve fizik motorunda yaşanan stabilite (titreme) sorunlarını çözmek amacıyla kapsamlı bir görev üstlendim. Geliştirme sürecine başlamadan önce, projenin GitHub deposunda süreçleri takip edebilmek adına \"Gelişmiş Çöp Etkileşimleri ve Fizik İyileştirmeleri\" başlıklı bir **Issue** oluşturdum ve yapılacak görevleri (Task) listeledim. Mevcut yapıyı bozmamak ve izole bir geliştirme ortamı sağlamak için `feature\/advanced-waste-interactions` adında uygun bir **Branch (Dal)** oluşturarak çalışmalara başladım.Gün içerisindeki geliştirmelerimi üç ana aşamada gerçekleştirdim:1. Kirli Çöp ve Su Tabancası (Washing Mechanic) Entegrasyonu:Oyunun zorluk seviyesine bağlı olarak çöplerin belirli oranlarda \"kirli\" (çamurlu) doğmasını sağlayan bir algoritma geliştirdim. Oyuncuların bu çöpleri ayrıştırmadan önce temizleyebilmesi için projeye bir \"Su Tabancası\" 3D modeli (.glb) dahil ettim. Bu araç için `WaterGunController` sınıfını yazarak XR etkileşimlerini (tutma noktaları, tetikleyici olayları) ve Raycast mantığı ile çamur görselini (DirtVisual) dinamik olarak temizleme sistemini kodladım.2. Yapışık Çöp (Composite Waste) Titreme (Jitter) Sorununun Giderilmesi:Testler sırasında, birbirine bantla yapışık çöplerin VR içerisinde tek elle tutulması durumunda Unity fizik motoru (Joints) ile XR el takibinin çakıştığını ve şiddetli titremelere (Jitter) yol açtığını tespit ettim. Bu sorunu kökten çözmek için `WasteGlue.cs` mimarisini tamamen baştan yazdım. Kararsız fiziksel yaylar (SpringJoint) kullanmak yerine; çöp tek bir ucundan tutulduğunda diğer parçanın fiziğini donduran (isKinematic = true) ve onu matematiksel offset (konum\/rotasyon) hesaplamalarıyla tutulan parçaya sabitleyen \"Sıfır-Titreme (Zero-Jitter)\" kinematik bir sistem inşa ettim. Artık objeler sadece oyuncu iki eliyle belirli bir mesafenin ötesine çektiğinde (0.85m) kopuyor.3. Çöp Kutusu (BinTrigger) Güvenlik ve Ret Algoritması:Oyuncuların kirli çöpleri veya koparılmamış yapışık çöpleri doğrudan kutuya atarak puan kazanmasını (hile yapmasını) engellemek için kutu mantığını güncelledim. `BinTrigger` sınıfına eklediğim yeni hiyerarşi tarama (Root Scan) algoritması sayesinde, kutu artık giren objenin kirli olup olmadığını veya bir banta bağlı olup olmadığını kontrol ediyor. Hatalı bir atık durumunda sistem; XR etkileşimini kod üzerinden keserek objeyi oyuncunun elinden zorla düşürtüyor ve fiziksel bir tepki kuvvetiyle (AddForce) objeyi kutudan dışarı fırlatıyor.Sonuç ve Kapanış:Geliştirmeleri tamamladıktan sonra XR Device Simulator üzerinden doğma (spawn) oranlarını, su tabancası mekaniğini ve yeni sıfır-titremeli fizikleri başarıyla test ettim. Her mekaniğin kodlarını atomik (parça parça ve anlamlı) olacak şekilde ayırarak ilgili branch'ime **Commit**'ledim. Günün sonunda çalışmamı tamamlamak için detaylı İngilizce ve Türkçe açıklamalar (özellikler, test adımları, fizik değişiklikleri) içeren profesyonel bir **Pull Request (PR)** oluşturdum ve kod incelemesi (Code Review) için ekibin onayına sundum.Git Commit Mesajları:[10:16] (da93f45) feat: Add core systems for Composite Waste mechanic Created TapeMaterial to visually link glued waste objects. Implemented WasteGlue script to handle physical and logical connections. Added CompositeWasteController to detect bimanual separation (0.35m distance threshold). (Note: System is currently in initial implementation phase. Physical separation bugs will be fixed in upcoming commits.)[18:29] (ddc8f05) Refactor: Overhaul composite waste physics for zero-jitter VR interaction Replaced unstable physics joints in WasteGlue with a custom kinematic positioning system to eliminate VR jitter. Updated CompositeWasteController and GravityPullMotion to prevent accidental auto-tearing during single-handed or distance grabs.[18:30] (634fda3) Feat: Introduce dirty waste mechanic and water gun tool Added DirtyWasteController to manage wash states and visual scaling. Created WaterGunController to handle XR grab events and spherical raycast washing. Imported and configured necessary 3D models and materials for dirt visuals.[18:40] (6e72728) Chore: Update AR scene configuration and import tool assets Imported the water gun 3D model (.glb). Extensively updated the MainGame_AR scene: configured tool placement, adjusted colliders, set up XR interaction anchors (Attach Transforms) for perfect grip, and assigned newly created mechanics (e.g., DirtVisual prefabs) to environment managers.[19:02] (eeea9e8) Feat: Integrate advanced waste rejection and spawning systems Updated BinTrigger to deeply scan hierarchies for glued\/dirty waste parts, aggressively rejecting invalid items by physically bouncing them out and forcing players to drop them. Overhauled WasteSpawner to handle level-based difficulty scaling for dirty wastes and ensure mutually exclusive spawning logic for composite wastes."
},
{
"day": 35,
"date": "2026-08-19",
"content": "35. Gün (19.08.2026) Çalışma RaporuKonu:Bağımlılıkların Tersine Çevrilmesi (Dependency Inversion) ve AR Yüzey Soyutlama MimarisiYapılan Çalışmalar:Bugün, geliştirmekte olduğumuz VR\/AR Geri Dönüşüm Simülasyonunda hem bellek yönetimi hatalarını (Memory Safety) gidermek hem de oyunun donanım bağımlılığını ortadan kaldırmak için kapsamlı mimari değişiklikler gerçekleştirdim. Çalışmalarıma GitHub üzerinde `feature\/ar-surface-abstraction` adında yeni bir branch (dal) oluşturarak başladım.Gün içerisindeki geliştirmelerimi şu aşamalarda tamamladım:1. Bellek Güvenliği (Memory Safety) ve Fizik İyileştirmeleri:Testler sırasında konsolda beliren `MissingReferenceException` hatalarını analiz ettim. Bu hatanın `WasteGlue.cs` sınıfında Unity objeleri üzerinde C# özel operatörü (`?.`) kullanılmasından kaynaklandığını tespit ettim. İlgili kısımları standart Unity null kontrolleriyle değiştirerek oyun motorunun bellek yönetimini (Garbage Collection) güvenceye aldım. Ayrıca `BinTrigger.cs` içindeki kutu reddetme fiziklerinde (AddForce) optimizasyona giderek, atıkların aşırı hızla fırlaması yerine kutunun dibine doğal bir yerçekimiyle düşmesini (Impulse softening) sağladım.2. AR Yüzey Soyutlaması (AR Surface Abstraction) ve Interface Tasarımı:Oyunun test aşamalarında sürekli AR (Meta Quest) gözlüğüne bağımlı kalınması geliştirme sürecini yavaşlatıyordu. Buna çözüm olarak, \"Dependency Inversion\" (Bağımlılığı Tersine Çevirme) prensibini uygulayarak `ISurfaceProvider` adında yeni bir arayüz (Interface) tasarladım. `WasteSpawner` (üretici) sınıfını güncelleyerek, sabit (hardcoded) koordinatlar yerine doğrudan bu arayüzden \"Masa (Table)\" veya \"Zemin (Floor)\" gibi dinamik yüzey verileri talep etmesini sağladım.3. Sanal Test Ortamı (Editor-Mocking) Geliştirmesi:Bilgisayar (PC) üzerinde donanımsız test yapabilmek adına `MockSurfaceProvider` sınıfını yazdım. Unity Editor içerisine yerleştirdiğim sanal küp ve zeminleri bu sınıfla etiketleyerek, Spawner'ın gözlük olmadan da gerçekçi bir simülasyon yapabilmesini ve atıkları başarıyla sanal masaların üzerinde üretebilmesini sağladım.4. Gerçek Dünya (AR Foundation) Entegrasyonu:Mimarinin donanım ayağını tamamlamak için `ARFoundationSurfaceProvider` sınıfını geliştirdim. Unity'nin `ARPlaneManager` sistemini kullanarak, oyuncu gözlüğü taktığında odasındaki gerçek masa ve zeminlerin kameralar aracılığıyla algılanmasını ve `WasteSpawner`'a aktarılmasını sağladım. Atıkların masadan düşmemesi için algılanan yüzeylerin sınır (Bounds) verilerini %80 oranında daraltarak güvenli doğma (Safe Spawn) mantığını koda entegre ettim.Sonuç ve Kapanış:Uyguladığım bu Interface tabanlı mimari sayesinde Spawner sınıfı; karşısındakinin gerçek bir masa mı yoksa PC'deki sanal bir küp mü olduğuyla ilgilenmeden, tamamen donanımdan bağımsız ve ölçeklenebilir (Scalable) bir yapıya kavuştu. Çalışmalarımı gün sonunda \"Atomic Commit\" prensibiyle 4 parçaya bölerek depoya gönderdim ve tüm bu değişiklikleri detaylıca açıklayan bir Pull Request (PR) açarak kod incelemesi (Code Review) için ekibe sundum.Git Commit Mesajları:[11:06] (3c5170f) Arch: Define ISurfaceProvider interface for AR surface abstraction Created the foundational `ISurfaceProvider` interface and related data structures (`SurfaceType`, `SurfaceData`). This establishes the core contract for decoupling the WasteSpawner from hardware-dependent AR Plane managers, paving the way for Editor-based mock surface testing.[19:41] (2c489dc) Fix: Resolve MissingReferenceException in WasteGlue and soften bin rejection Replaced C# null-conditional operators with proper Unity null checks in WasteGlue.cs to prevent errors during object destruction. Significantly reduced the physical impulse force in BinTrigger.cs so rejected items gently drop at the base of the bin instead of flying away.[19:43] (eec30b7) Feat: Implement MockSurfaceProvider and update WasteSpawner logic Created MockSurface and MockSurfaceProvider to simulate AR planes in the Unity Editor for PC testing. Updated WasteSpawner to dynamically request spawn points from the active ISurfaceProvider instead of a fixed point. Added detective debug logs for fallback scenarios.[19:44] (5a8839b) Feat: Integrate ARFoundation tracking and configure AR scene Implemented ARFoundationSurfaceProvider to fetch real-world planes (Tables, Floors) tracked by the headset. Configured the MainGame_AR scene with mock surfaces for PC testing and properly attached the AR managers to the XR Origin."
},
{
"day": 36,
"date": "2026-08-20",
"content": "36. Gün (20.08.2026) Çalışma RaporuYapılan İş: AR Tabanlı Oda Kirlilik (Hayatta Kalma) Sisteminin Tasarımı ve Entegrasyonu1. Problem Tespiti ve İhtiyaç AnaliziBugünkü mesaime, Recycle Rush VR projesinin temel oyun döngüsünü (Core Game Loop) analiz ederek başladım. Yaptığım testler sonucunda, oyuncunun çöpleri yere düşürmesinin yalnızca puan\/kombo kaybına yol açtığını ve oyunda net bir \"Kaybetme (Game Over)\" koşulu bulunmadığını tespit ettim. Bu durum oyuncudaki meydan okuma (challenge) hissini zayıflatıyordu. Çözüm olarak, oyuna bir nevi \"Can Barı\" işlevi görecek \"Oda Kirlilik Sistemi (Room Pollution System)\" eklemeye karar verdim.2. Planlama ve Git İş Akışı (Issue & Branch)Geliştirme sürecine profesyonel yazılım standartlarına uygun olarak başladım. İlk adım olarak, GitHub üzerinde sistemin gereksinimlerini, mimari kurallarını ve yapılacakları adım adım belirleyen detaylı bir Issue oluşturdum. Ardından, ana projeyi güvende tutmak ve izole çalışmak adına `feature\/pollution-health-system` isimli yeni bir branch (dal) açarak kodlama aşamasına geçtim.3. Çekirdek Mimarinin Kurulması (SRP ve Event-Driven)Sistemin kalbini oluşturması için `RoomPollutionManager` adında merkezi bir yönetici sınıf (Manager) yazdım. Bu sınıfı tasarlarken Tek Sorumluluk Prensibi'ne (SRP) katı bir şekilde bağlı kaldım; yönetici sadece kirlilik oranını (%0 - %100) hesaplamakla ve eşik değerleri aşıldığında diğer sistemlere haber veren statik olaylar (Event: `Action<float>`, vb.) yayınlamakla görevlendirildi.4. Oynanış ve Ceza\/Ödül MekanikleriOyun mekaniği tarafında çöplere eklenecek `FloorPollutionDetector` betiğini geliştirdim. Çöp yere değdiği an 3 saniyelik bir geri sayım başlatarak oyuncuya çöpü havada kapması (Gravity Grab) için bir refleks süresi tanıdım. Oyuncu başarısız olursa kirliliğin artmasını (+5), doğru kutuya atışlarda ise odanın temizlenmesini (-2) sağlayan mekaniği kodladım.5. AR Uyumlu Geri Bildirim ve Holografik ArayüzAR (Artırılmış Gerçeklik) deneyimini bozmamak adına, klasik tam ekran 2D UI panelleri kullanmaktan kaçındım. Bunun yerine:* Kirlilik belirli eşikleri geçtiğinde ortama uçuşan toz partikülleri ve uyarı sesleri ekleyen `PollutionAmbienceController` sistemini yazdım. * Kirlilik durumunu net göstermek için odanın içine havada süzülen ve dinamik renk değiştiren (Yeşil-Sarı-Kırmızı) holografik bir `PollutionUIController`tasarladım.6. Analitik Entegrasyonu ve Sürecin Tamamlanması (Atomic Commit & PR)Günün sonunda sistemi, kirlilik %100 olduğunda devreye giren `GameManager` (Game Over) ve oyuncu verilerini (yenilen cezalar, temizlenen çöpler) toplayan `AnalyticsManager` ile başarılı bir şekilde entegre ettim. Tüm geliştirmeleri bitirdikten sonra, kod geçmişinin (version history) temiz ve profesyonel kalması için değişiklikleri devasa tek bir paket yapmak yerine; mantıksal parçalara bölerek Atomic Commit'ler (Örn: Çekirdek sistem, Ambiyans, Holografik UI olarak ayrı ayrı) halinde repoya gönderdim. Mesaimi, hazırladığım bu yeni branch'i ana projeye dahil etmek üzere detaylı bir Pull Request (PR) oluşturarak sonlandırdım.Git Commit Mesajları:[10:12] (d2ca7f5) chore: Add missing meta file for ISurfaceProvider Added the missing .meta file for ISurfaceProvider.cs to ensure Unity properly tracks the script's GUID and import settings in version control.[17:49] (bf0f878) feat(pollution): implement core room pollution manager` Added central RoomPollutionManager to track room dirtiness percentage (0-100%). It follows SRP by only calculating thresholds and broadcasting static events (OnPollutionChanged, OnPollutionStateChanged, OnGameOverTriggered). It also listens to BinTrigger to reduce pollution by 2 on correct throws.[17:50] (1f5e7df) feat(pollution): add floor drop penalty and 3-second recovery Implemented FloorPollutionDetector and attached it to all waste prefabs. When a waste hits a surface, a 3-second recovery timer starts. If the player doesn't use Gravity Grab to recover it in time, it adds +5 pollution to the room.[17:51] (358cc37) feat(pollution): integrate ambience VFX and game over triggers Added PollutionAmbienceController to trigger particle effects and warning sounds when pollution reaches 50% and 75%. Updated GameManager to subscribe to the 100% pollution event and trigger the Game Over state.[19:45] (3ac9cf5) feat(ui): add holographic AR pollution health bar Created a World Space Canvas UI to display the current pollution percentage. The PollutionUIController dynamically updates the slider and changes colors (Green -> Yellow -> Red). Added managers and the holographic bar to the MainGame_AR scene.[19:46] (b47ac7a) feat(analytics): track room pollution metrics Updated AnalyticsManager and AnalyticsData to record total pollution added\/reduced, peak pollution reached, wastes recovered before the penalty, and total game overs caused by pollution."
},
{
"day": 37,
"date": "2026-08-21",
"content": "37. Gün (21.08.2026) Çalışma RaporuKonu: Sürpriz Kutu (Mystery Package) Mekaniği, Ambiyans Efektleri (VFX) ve Süreç YönetimiYapılan Çalışmalar:Bugün, projeye yeni bir oyun mekaniği kazandırmak ve görsel geri bildirimleri (VFX) artırarak oyuncu deneyimini iyileştirmek üzerine çalıştım. Süreci tamamen profesyonel yazılım geliştirme döngüsüne uygun olarak yürüttüm.Güne, yapılacak geliştirmeleri planlayıp proje yönetim aracımız üzerinden (GitHub\/Jira) yeni bir Issue (Görev\/Sorun Kaydı) açarak başladım. Görevin detaylarını ve kabul kriterlerini belirledikten sonra, ana projeyi korumak adına bu Issue'ya uygun olarak `feature\/mystery-waste-package` adında yeni bir branch (dal) oluşturdum ve geliştirmelerime bu branch üzerinden devam ettim.1. Sürpriz Kutu Mekaniğinin Geliştirilmesi (Core Mechanics):Oyuna rastgele zamanlarda düşecek bir \"Sürpriz Kutu\" mekaniği ekledim. Oyuncu kutuyu eline aldığında patlayarak içinden 3 adet rastgele çöp çıkmasını sağlayan `WastePackageController.cs` sınıfını yazdım.Bu kutudan çıkan çöplerin durumunu takip etmek için Single Responsibility Principle (SRP) kuralına uygun olarak `PackageChallengeTracker.cs` (Hakem) ve `PackageRewardManager.cs` (Ödül Dağıtıcı) adında iki ayrı yönetici sınıf geliştirdim.Eğer oyuncu kutudan çıkan 3 çöpü de yere düşürmeden doğru kutulara atarsa, sistemin otomatik olarak ekstra bonus puan (+25) ve kirlilik düşüşü (-3) vermesini sağladım.2. Görsel Efektlerin (VFX) Entegrasyonu:Kirlilik Ambiyansı:Odanın kirlilik seviyesine göre dinamik değişen partikül sistemleri kurdum. Kirlilik %50'ye ulaştığında havada uçuşan tozlar (`MildDustVFX`), %75'e ulaştığında ise zeminden yükselen zehirli yeşil dumanlar (`DangerSmoke`) aktif olacak şekilde `PollutionAmbienceController` entegrasyonunu tamamladım.Portal Yenilemesi: Çöplerin doğduğu (Spawn) noktada duran eski statik portalı sildim. Yerine aşağı doğru ışınlar fırlatan, rotasyonu ve hızı ayarlanmış animasyonlu bir büyü çemberi (Magic Circle) efekti ekledim.Patlama Efektleri: Hediye paketinin açılışı için konfeti efekti, yanlış çöp atıldığında ise kutunun üstünde beliren elektrik\/patlama efekti (Reddedilme) atamalarını gerçekleştirdim.3. Versiyon Kontrolü ve PR (Pull Request) Süreci:Geliştirmelerimi bitirdikten sonra, Git geçmişini temiz tutmak ve kod incelemesini kolaylaştırmak adına değişiklikleri GitHub Desktop üzerinden Atomic Commits (Mantıksal parçalara bölünmüş commitler) halinde kaydettim (Örn: Görsel efektler ayrı, ana oyun kodları ayrı commitlendi).Günün sonunda geliştirmelerimi uzak sunucuya (origin) pushlayarak detaylı bir Pull Request (PR) açtım. PR açıklamasında İngilizce olarak projenin özetini, \"Nasıl Test Edilir?\" adımlarını yazdım ve kodun çalıştığını kanıtlayan ekran görüntülerini ekleyerek projeyi kod incelemesine (Code Review) hazır hale getirdim.Git Commit Mesajları:[10:38] (4fe0a9d) feat(package): implement mystery package challenge tracker and reward manager Implemented the core logic for the Mystery Waste Package mini-event. - Created PackageChallengeTracker to track spawned wastes and listen to BinTrigger events. It acts purely as a state machine (SRP) and emits OnPackageCompleted\/Failed. - Created PackageRewardManager to listen to tracker events and distribute balanced rewards (+25 Score, +10 XP, -3 Pollution). - Updated BinTrigger SortResultData to pass the ProcessedWaste GameObject reference for accurate tracking.[16:30] (fabeb01) Add particle effects for pollution and mystery package Added ambient dust, toxic smoke, explosion, and teleport portal VFX prefabs. Updated .gitignore to exclude 3rd party asset source folders.[18:52] (41ea7db) Feat: Implement Mystery Waste Package mechanic Added Mystery Package event containing 3 wastes. Implemented Challenge Tracker and Reward Manager to distribute bonus score\/pollution reduction for flawless sorting.[19:06] (66c754d) Update AR scene with package system and new portal VFX Integrated PackageSystem managers into the main AR scene. Replaced the old spawn portal with a downward-facing magic circle VFX in VirtualPortal."
},
{
"day": 38,
"date": "2026-08-24",
"content": "38. Gün (24.08.2026) Çalışma RaporuBugün, daha önceden bağımsız modüller halinde geliştirilen karmaşık arayüz (UI) sistemlerinin, görsel efektlerin (VFX) ve oyuncu ilerleme mekaniklerinin projenin ana sahnesi olan `MainGame_AR` içerisine entegrasyonu görevine odaklandım. Sürece profesyonel bir yazılım geliştirme döngüsü (SDLC) ile başlamak adına, öncelikle GitHub üzerinde entegrasyon adımlarını ve çözülecek çakışmaları tanımlayan detaylı bir Issue açtım. Hemen ardından, ana projeyi güvende tutmak ve izole bir ortamda çalışabilmek için bu Issue'ya bağlı `fix\/scene-and-prefab-references` adlı yeni bir branch (dal) oluşturdum.Entegrasyon sürecindeki en büyük zorluk, oyunun belkemiği durumundaki `GameManager` ve `WasteSpawner` gibi çekirdek sistemler ile yeni eklenen özelliklerin birleştirilmesiydi. Oyuna yeni dahil olan Mıknatıs (Magnet) ve Kum Saati (Hourglass) gibi güçlendirme (power-up) mekaniklerinin dinamik çöp üretme döngüsüyle haberleşebilmesi için kod altyapısında düzenlemeler (refactoring) yaptım. Ayrıca `BinTrigger` (çöp kutusu algılama) sınıfını, mevcut sistemi bozmadan yeni çöp türlerini algılayacak ve `ComboManager` ile haberleşecek şekilde güncelledim. Sahneler arası arayüz ve referans taşıma işlemlerini manuel yapmanın hata riskini artıracağını öngördüğüm için, Unity Editor üzerinde çalışan `UltimateMerger` adında özel bir script kodladım. Bu sayede arkadaşımın deneme sahnelerindeki Görev Paneli (Mission Panel), XP Bar ve diğer Canvas bileşenlerinin ana sahneye tüm Inspector (arayüz) ayarları korunarak otomatik ve güvenli bir şekilde aktarılmasını sağladım.Tüm bu kapsamlı entegrasyonu GitHub'a aktarırken, takım çalışması ve versiyon kontrol standartlarına uymak adına değişiklikleri dört ayrı \"Atomic Commit\" halinde gruplandırdım:1. İlk olarak sadece yeni UI bileşenlerini ve menü güncellemelerini,2. Ardından bellek optimizasyonu sağlayan Obje Havuzu (Object Pool), Ekonomi ve 30 aşamalı Seviye yöneticilerini,3. Üçüncü adımda oyun içi etkileşimleri ve güçlendirme mekaniklerini,4. Son olarak da 3D modeller, prefabrikler ve sahne referans güncellemelerini projeye kaydettim.Günün sonunda, Unity Editor üzerinde tüm sistemlerin (State Machine geçişleri, arayüz güncellemeleri ve bellek yönetimi) birbiriyle kusursuz ve çakışmasız çalıştığını test edip doğruladım. Son adım olarak, entegre ettiğim bu yapıyı takımın incelemesine (Code Review) sunmak üzere, yapılan her bir commit'in ve teknik değişikliğin açıklandığı bir Pull Request (PR) açarak bugünkü geliştirme döngümü başarıyla tamamladım.Git Commit Mesajları:[11:24] (3c354fc) chore(xr): Refresh OpenXR and AndroidXR initialization settings - Auto-updated OpenXR package settings and AndroidXR settings initializer. - Re-serialized XR configuration assets to ensure compatibility and stability after project re-import and Safe Mode recovery.[13:10] (b91a7e5) fix: add missing RecycleRush.Managers namespace in PortalSpawner Added the missing `RecycleRush.Managers` using directive to PortalSpawner.cs. This resolves the CS0103 compilation error (Safe Mode) caused by an unrecognized LevelManager reference.[20:49] (fbc07c2) feat(ui): add mission panel, level cards, and update UIManager Added new UI components including Mission Panel, Level Cards, Combo UI, and XP Bar. Updated UIManager to dynamically handle new HUD overlays and event notifications.[20:51] (813f316) feat(core): integrate level progression, object pooling and economy systems Implemented core gameplay managers. Introduced Object Pooling for memory optimization, a 30-stage level progression system, and an in-game economy\/mission tracking architecture. Resolved GameManager conflicts.[20:54] (bd202fd) chore(assets): merge friend's UI\/VFX prefabs into MainGame_AR scene Merged the complete UI canvas, portal spawners, and visual effect prefabs into the main AR scene. Added 3D models for powerups. Created Editor utilities (UltimateMerger) to automate scene integration.[20:57] (454741e) feat(gameplay): implement magnet\/hourglass powerups and refactor sorting logic Added interactable mechanics for Magnet and Hourglass powerups. Refactored BinTrigger and WasteSpawner for dynamic waste sorting, supporting new waste types without breaking existing core logic."
},
{
"day": 39,
"date": "2026-08-25",
"content": "39. Gün (25.08.2026) Çalışma RaporuKonu \/ Topic: Oyun Dengesi (Game Balancing), Fizik Hata Çözümleri (Bug Fixes), Kayıt Sistemi ve Takım EntegrasyonuBugün, takım arkadaşımla yürüttüğümüz VR\/AR geri dönüşüm simülasyonu projesinde hem oyun tasarımını dengelemek hem de projeyi teknik açıdan daha stabil hale getirmek için yoğun bir mesai harcadım. Güne, çöp üretim sistemindeki (`WasteSpawner`) bir hatayı ayıklayarak (debugging) başladım. Yaptığım testlerde, objelerin üst üste binmesini engellemek için yazılmış \"OverlapSphere\" kontrolünün, zaman zaman üretim sürecini tamamen kilitlediğini fark ettim. Bu kısıtlayıcı bloğu kodu inceleyerek kaldırdım. Ardından bu sistemi Seviye Yöneticisi (`LevelManager`) ile haberleştirerek projeye bir \"Dinamik Zorluk\" (Dynamic Difficulty Scaling) altyapısı entegre ettim. Böylece oyuncunun seviyesi arttıkça çöplerin geliş hızı ve Mıknatıs\/Kum Saati gibi güçlendirmelerin çıkma ihtimali organik olarak artmaya başladı.Oynanış testleri (Edge-case testing) sırasında ciddi bir açık (exploit) keşfettim: Oyuncular çöpleri harita dışına (Kill-Z sınırına) fırlatarak ceza almaktan kaçabiliyorlardı. Bu sınır çizgisine gerekli kodları ekleyerek harita dışı atışların da eksi puan yazmasını ve komboyu kırmasını sağladım. Ayrıca \"Oyun Hissiyatı\" (Game Feel) üzerine düşünerek, oyuncuyu ufak bir hatada çok fazla cezalandırmamak adına, yanlış atışlarda kombonun anında sıfırlanması yerine yarıya düşmesi mantığını koda döktüm.Günün ilerleyen saatlerinde, veri kalıcılığını (Data Persistence) sağlamak için `SaveManager` modülünü Ekonomi ve Seviye yöneticileriyle köprüledim. VR cihazlarının doğası gereği kafadan çıkarıldığında aniden uyku moduna geçebildiklerini göz önüne alarak, `OnApplicationPause` event'ini dinleyen bir Otomatik Kayıt (Auto-Save) mekanizması geliştirdim ve oyuncu verilerini güvence altına aldım.Son olarak, takım arkadaşımın geliştirdiği XR Origin ve etkileşim modüllerini, ana AR sahnemize (`AR_GameScene`) Unity'nin Additive Load (Eklemeli Yükleme) tekniğiyle sorunsuzca entegre ettim. Tüm bu geliştirmeleri \"Atomic Commit\" prensibine uygun şekilde parçalara bölerek bir Pull Request (PR) ile ana projeye dâhil ettim. Benim için inisiyatif aldığım, problem çözme odaklı ve çok verimli bir gündü.Git Commit Mesajları:[10:44] (ef30ad4) feat(gameplay): balance organic spawn rates and fix integration compile errors - Overhauled WasteSpawner with an organic spawn rhythm instead of robotic fixed intervals. - Dynamically scaled Magnet and Hourglass power-up drop rates based on the player's current level. - Lowered the hard limits for minimum spawn intervals (0.6s -> 0.4s) to increase late-game challenge. - Fixed a compilation error in UltimateMerger caused by a deprecated script reference (PackageChallengeTracker).[19:24] (fb3c4a4) fix(gameplay): resolve spawn blockage and add dynamic difficulty scaling Removed restrictive OverlapSphere check that was blocking waste generation. Integrated LevelManager to dynamically scale spawn intervals and powerup drop chances based on player progression.[19:25] (0703777) fix(physics): patch out-of-bounds exploit and soften combo penalty Implemented score penalty and combo break for throwing wastes out of bounds (Kill-Z exploit). Adjusted combo logic to halve the streak instead of a full reset on mistake to improve game feel.[19:26] (02fe2d2) feat(save): integrate economy and level progression persistence Hooked SaveManager into EconomyManager and LevelManager to ensure persistent player progression across sessions. Added auto-save triggers for VR sleep (OnApplicationPause) and quit states.[19:29] (9feff45) chore(scene): merge XR Origins and finalize AR environment setup Additively merged XR Origin components and interaction modules into the primary AR scene. Synchronized UI canvases and interaction layers for the final playable mixed reality build."
},
{
"day": 40,
"date": "2026-08-26",
"content": "40. Gün (26.08.2026) Çalışma RaporuGüne Başlangıç: Hata Tespiti ve Issue AçılmasıBugün mesaiye başladığımda, önceki günlerde sahneleri birleştirirken ortaya çıkan mimari hataları ve çökme sorunlarını listeledim. Çalışmalarımı düzenli takip edebilmek için GitHub üzerinde bu sorunları barındıran kapsamlı bir \"Issue\" oluşturdum. Ardından kod tarafındaki çalışmalara başlamak için ana projeden `fix\/core-systems-stability-and-bugfixes` adında yeni bir branch (dal) açtım.Singleton Çakışmalarının ve Performans Hatalarının Çözülmesiİlk olarak projenin belkemiği olan yönetici (Manager) scriptlerindeki çakışmaları inceledim. Sahneler arası geçişte objelerin birbirini yok etmesi sorununu, scriptlerdeki `Destroy(gameObject)` komutlarını `Destroy(this)` olarak değiştirerek çözdüm.Ardından VR simülatörü için yazılan `AutoFixXRSimulator` scriptinin her karede (Update) çalıştığını ve cihazlarda gereksiz performans harcadığını fark ettim. Bu yapıyı değiştirerek, sadece oyunun başında sınırlı sayıda kontrol yapan bir döngüye (Coroutine) dönüştürdüm. Ayrıca `ARPlacementManager` içindeki boş obje hatalarını (null reference) engellemek için gerekli güvenlik kontrollerini ekledim.Kayıt (Save) Sisteminin Senkronize EdilmesiOyunun kayıt sıfırlama özelliğini test ederken büyük bir mantık hatası fark ettim. Oyuncu verilerini sıfırlamak istediğinde sadece ana dosyalar siliniyor; seviye haritası, analiz verileri ve kazanılan başarımlar silinmiyordu. Bu sorunu çözmek için `AnalyticsManager` ve `AchievementManager` içerisine sıfırlama fonksiyonları yazdım. Tüm bu sistemleri `SaveManager` içindeki tek bir silme komutuna bağlayarak, verilerin senkronize bir şekilde, tamamen temizlenmesini sağladım.Oynanış Dinamikleri ve Arayüz (UI) GeliştirmeleriÇöp üretme mekaniğini (`WasteSpawner`) oyunun etkinlik sistemine entegre ettim. Mıknatıs (Magnet) gücü alındığında veya \"Frenzy\" etkinliği başladığında çöplerin daha hızlı ve çok sayıda düşmesini sağlayarak oyunun temposunu artırdım.Günün son teknik geliştirmesi olarak başarım sisteminin (Achievement) arayüzünü güncelledim. Arka planda çalışan başarımların oyuncuya gösterilmediğini fark ettiğim için `UIManager` içerisine yeni bir metot yazdım. Artık bir başarım açıldığında ekranda anlık bir bildirim penceresi beliriyor ve konfeti efekti çalışıyor.Kapanış ve Pull Request (PR)Gün boyunca yaptığım tüm bu geliştirmeleri ve hata çözümlerini, GitHub Desktop üzerinden adım adım \"Atomic Commit\" mantığıyla kaydettim. Mesai bitimine doğru, üzerinde çalıştığım branch'teki kodları ana projeye (main) aktarmak üzere başlıkları ve açıklamaları detaylandırılmış bir Pull Request (PR) açarak günlük görevlerimi tamamladım.Git Commit Mesajları:[10:55] (2e23524) fix: resolve singleton conflicts and prevent root object destruction in core managers Fixed a critical architectural bug where duplicated singleton instances were destroying their parent root object (`Core_Managers`) after scene merges. Replaced `Destroy(gameObject)` with `Destroy(this)` across all core managers (e.g., `GameManager`, `ScoreManager`, `ComboManager`). This ensures that only the redundant script component removes itself, keeping the game loop and core systems stable.[18:49] (347feba) fix(core): resolve infinite loop performance drop in XR simulator Converted the heavy reflection loop in Update() into a constrained Start() Coroutine. Prevents severe FPS degradation and resource exhaustion when playing on standalone Android\/VR headsets without an active simulator.[18:49] (876c8c1) feat(gameplay): integrate event and power-up multipliers to spawner Hooked WasteSpawner into EventManager (Speed\/Frenzy modes) and Magnet power-up states. Spawning speed now dynamically multiplies up to 4x\/5x during active events, significantly enhancing game feel and combo pacing.[18:51] (90c9dbf) fix(data): synchronize global data wipe across all core managers Fixed a critical logic flaw where DeleteSaveData only wiped basic progression. It now correctly triggers hard resets for PlayerPrefs (Level Selection), AnalyticsManager, and AchievementManager to ensure a clean slate upon account reset.[18:51] (d96d4d9) feat(ui): implement dynamic achievement unlock notifications Added immediate on-screen UI feedback for the backend achievement system. Unlocking an achievement now triggers a formatted pop-up text and invokes a confetti VFX to improve player retention and overall game feel.[18:53] (3d34a73) fix(ar): resolve unassigned reference crash in placement manager Added robust null-checks and skip logic for empty list elements in ARPlacementManager to prevent critical UnassignedReferenceException crashes during Start and Update loops. Restored UI debug test button functionality for GameManager integration."
},
{
"day": 41,
"date": "2026-08-27",
"content": "41. Gün (27.08.2026) Çalışma RaporuKonu: Oyun Hissiyatı (Game Feel) Geliştirmeleri, Aim Assist ve Dinamik Ses SistemleriBugün mesaiye oyunun temel fırlatma mekaniklerini ve oyuncuya verilen geri bildirimleri (game feel) iyileştirmek üzere planlama yaparak başladım. Proje yönetim paneli üzerinde \"Gameplay Polish: Aim Assist & Audio Tension\" adında bir Issue açarak bugünün hedeflerini belirledim. Ardından Git üzerinden çalışmamı izole etmek adına `feat\/game-feel-aim-assist-and-swallow-vfx` isminde yeni bir branch oluşturdum ve kodlamaya geçtim.1. Çöp Kutuları İçin \"Aim Assist\" (Nişan Desteği) GeliştirmesiVR\/AR ortamında fiziksel bir objeyi hedefe fırlatmanın bazen oyuncular için zorlayıcı olabildiğini testlerde fark etmiştim. Bunu çözmek için `BinTrigger.cs` içerisine `FixedUpdate` metodu ile çalışan bir \"Manyetik Çekim\" (Aim Assist) algoritması yazdım. `Physics.OverlapSphereNonAlloc` kullanarak çöp kutusunun etrafındaki objeleri tarayan ve sadece doğru renkteki çöp kutusuna yaklaşan hızlı objelere ufak bir merkeze çekme kuvveti (`ForceMode.Acceleration`) uygulayan bir sistem geliştirdim. Bu sayede oyuncu ucu ucuna kaçan atışlarda bile isabet ettirmiş gibi hissediyor.2. \"Swallow\" (Yutulma) Görsel EfektiDaha önce çöpler kutuya temas ettiği an aniden sahnede kayboluyordu (Destroy\/Disable). Bu durum görsel kaliteyi düşürdüğü için yeni bir Coroutine yazdım. Artık çöp objesi trigger alanına girdiğinde kinetik hale geçip çarpışmaları kapatılıyor ve 0.18 saniye içerisinde `Vector3.Lerp` ile küçülerek (Scale to 0) kutunun merkezine doğru çekiliyor. Animasyon bittikten sonra obje güvenli bir şekilde `ObjectPoolManager`'a iade ediliyor.3. Adaptif Müzik Gerilimi (BGM Pitch Shifting)Oyunun son saniyelerinde heyecanı artırmak için `AudioManager.cs` üzerinde bir güncelleme yaptım. GameManager'daki zamanlayıcıyı dinleyen bir mantık kurdum. Oyunun bitmesine son 30 saniye kaldığında, arka plan müziğinin hızı (Pitch değeri) `Mathf.Lerp` fonksiyonu kullanılarak 1.0'dan 1.35'e doğru kademeli olarak artmaya başlıyor. Bu sayede süre daraldıkça oyuncuda doğal bir acele etme ve rekabet hissi uyandırılmış oldu.Sonuç ve PR AşamasıGeliştirdiğim bu üç yeni mekaniği Unity Editor üzerinden başarıyla test ettikten sonra yaptığım değişiklikleri GitHub Desktop üzerinden commit'ledim. Mesai bitimine doğru remote depoya push işlemini gerçekleştirip detaylı bir açıklama ile Pull Request (PR) açtım ve kodlarımı ana projeye entegre edilmek üzere incelemeye sundum.Git Commit Mesajları:[11:02] (78c2925) feat(gameplay): implement aim assist and swallow vfx for bins - Added FixedUpdate OverlapSphere for Aim Assist: Thrown wastes now experience a slight magnetic pull towards the correct bin if they are close enough, improving VR\/AR throwing accuracy and game feel. - Replaced sudden Destroy\/Disable with SwallowRoutine: Wastes now dynamically scale down to zero while being vacuumed into the bin center over 0.18s before returning to the Object Pool. - Fully restored and safely integrated with the Precision System and Analytics tracking.[20:41] (acf9010) feat(audio): implement adaptive bgm pitch based on remaining time - Added dynamic pitch shifting to the Background Music (BGM). - When the game timer drops below 30 seconds, the BGM pitch gradually increases from 1.0 to 1.35 using Lerp. - Greatly enhances player tension and game feel during the final moments of a game session."
},
{
"day": 42,
"date": "2026-08-28",
"content": "Konu: Kritik Sürüm Çakışmalarının (Merge Conflict) Çözümü, Kod Refactoring ve Teknik Dokümantasyonİş Takibi ve PlanlamaMesaiye başladığımda, versiyon kontrol sisteminde (GitHub) gerçekleştirilen son birleştirmeler (merge) sonrasında projeyi derlenemez (compile error) duruma getiren ciddi kod çakışmalarını tespit ettim. Bu kritik derleme hatalarını kayıt altına almak ve planlı ilerlemek için GitHub üzerinde detaylı bir \"Issue\" oluşturdum. Hata çözüm sürecini ana projeden bağımsız yürütebilmek amacıyla `fix\/core-systems-recovery-and-refactor` isminde yeni bir çalışma dalı (branch) açarak kodlamaya geçtim.Kritik Çakışmaların (Merge Conflict) GiderilmesiProjeyi kitleyen ana sorunların `GameManager.cs` ve `UIManager.cs` dosyalarındaki çakışmalardan kaynaklandığını belirledim. Birleştirme (merge) işlemi sırasında bozulan parantez (scope) hiyerarşisini, hatalı erişim belirleyicilerini (invalid modifiers) ve mükerrer (çift) yazılan metodları tek tek temizleyerek scriptleri stabil ve hatasız hallerine geri getirdim.Ayrıca, kum saati (Hourglass) güçlendirmesinin çalışmasını sağlayan ancak çakışma esnasında kazara silinmiş olan `AddTime` metodunu `GameManager` sınıfına yeniden entegre ettim. VR donanım ayarlarını barındıran `OpenXRPackageSettings.asset` dosyasında meydana gelen endeks çakışmasını da güncel konfigürasyonu koruyarak çözdüm.Kod Temizliği ve Optimizasyon (Refactoring)Çevre etkileşimlerini yöneten scriptlerde kod incelemesi (Code Review) yaptım. `BinTrigger.cs` içerisinde `ProcessedWasteType` gibi çift tanımlanmış struct değişkenlerini ve `WasteSpawner.cs` dosyasındaki mükerrer prefab referanslarını koddann arındırdım. Bu temizlik sayesinde gereksiz bellek kullanımını ve olası mantıksal (logic) hataları engelledim.Teknik Dokümantasyon ve Mağaza HazırlığıGeliştirme sürecinin son aşamalarına gelirken, kurduğumuz yazılım mimarisini (State Machine, Object Pooling, Event-Driven Architecture) ve seviye matematiklerini detaylıca anlatan profesyonel bir `README.md` belgesi hazırlayıp projeye ekledim. Buna ek olarak, uygulamanın Meta Horizon (App Lab) mağazasına yüklenebilmesi için MR mekaniklerini ve güvenlik uyarılarını içeren mağaza metnini hazırlayarak `docs\/store\/meta_store_description.md` dizinine yerleştirdim.Sürüm Kontrolü ve KapanışGün boyunca çözülen çakışmaları, yapılan kod temizliklerini ve eklenen dokümanları birbirine karıştırmadan, mantıksal parçalara bölerek (Atomic Commit) GitHub Desktop üzerinden commitledim. Mesai bitiminde, onarılan ve derlenebilir duruma gelen bu dalı ana (main) projeye güvenli bir şekilde aktarmak üzere tüm süreci özetleyen bir Pull Request (PR) açarak günlük çalışmalarımı tamamladım.Git Commit Mesajları:[01:26] (d3980e6) fix(core): resolve catastrophic merge conflicts in game and ui managers - Reconstructed corrupted methods and resolved duplicated logic blocks introduced during recent PR merges. - Fixed mismatched brackets and invalid access modifiers that caused severe compilation failures. - Restored the missing 'AddTime' method in GameManager for the hourglass power-up functionality. - Ensured a pristine and stable state for UI and Game lifecycle events.[01:27] (5174a91) fix(environment): clean up duplicated variable declarations - Removed duplicated 'ProcessedWasteType' field in the SortResultData struct. - Cleaned up redundant event and method declarations at the bottom of BinTrigger. - Consolidated duplicated power-up prefab declarations (hourglass and magnet) in WasteSpawner.[16:10] (709ddd3) docs: update project README and add Meta Horizon store description - Rewrote the main README.md to comprehensively document the software architecture (FSM, Object Pooling, JSON Save System), level balancing metrics, and MR integration. - Created the official store description file for the Meta Horizon (App Lab) release, including MR safety disclaimers and gameplay features. - Structured documentation following professional standards to prepare the repository for final evaluation and store submission."
}
]
},
"19": {
"name": "Ayşenur Ebrar Gündüz",
"email": "aysenurebrargunduzz@gmail.com",
"repo": "https:\/\/github.com\/AysenurGunduz\/vantage-ai",
"github_username": "AysenurGunduz",
"start_date": "2026-07-20",
"end_date": "2026-08-14",
"total_days": 20,
"filled_days": 20,
"entries_sample": {
"first": {
"day": 1,
"date": "2026-07-20",
"content": "Stajımın ilk gününe ekip arkadaşlarımla gerçekleştirdiğimiz daily toplantısı ile başladım. Toplantıda ekip arkadaşlarım işleyiş hakkında bilgilendirmelerde bulundu. Kısaca tanıştıktan sonra, bugün yapılacak çalışmaları ve geçen hafta tamamlanan işleri dinledim. Her gün, bir önceki gün gerçekleştirilen çalışmaların değerlendirildiğini ve ardından o günün planlamasına geçildiğini belirttiler.Toplantının ardından geliştireceğim projeyi Ümit Bey'e sundum. Projemin onaylanmasının ardından geliştirme sürecine başladım. İlk olarak projenin mimari yapısını, kullanılacak teknolojileri, dört haftalık geliştirme fazlarını ve günlük görev planını içeren detaylı bir implementasyon planı hazırladım. Frontend tarafında React, TypeScript ve Vite; backend tarafında ise Node.js, Express ve TypeScript kullanılmasına karar verdim. Veritabanı, kimlik doğrulama (authentication) ve gerçek zamanlı (realtime) işlemler için Supabase kullanmayı planladım.Projede yer alacak yapay zekâ özellikleri kapsamında görev bölme, önceliklendirme, ekip üyelerinin çalışma tarzını analiz etme ve otomatik ilerleme özeti oluşturma işlemleri için bilgisayarımda yerel olarak çalışacak bir LLM kullanmaya karar verdim. Bu doğrultuda bilgisayarımın donanım özelliklerini inceleyerek çalıştırabileceği uygun model boyutlarını belirledim.Daha sonra projenin README dosyasını hazırlayarak proje hakkında temel bilgileri ve kurulum adımlarını dokümante ettim. GitHub reposunu ekip çalışma düzenine uygun şekilde yapılandırdım. Main branch'e doğrudan kod gönderilmemesi, her gün yeni bir branch oluşturularak geliştirme yapılması ve gün sonunda açılan Pull Request'in Ümit Bey tarafından incelenip birleştirilmesi (merge edilmesi) gerektiği belirtildi. Ben de bu çalışma düzenine uygun şekilde repomu düzenledim.Ardından GitHub Issues ve GitHub Projects yapılarını oluşturarak ilk gün yapılacak çalışmaları içeren ilk issue'yu açtım. Projenin klasör yapısını oluşturdum ve veritabanı şemasını netleştirerek buna ait görsel bir diyagram hazırladım. Ayrıca proje için bir logo tasarımı üzerinde çalıştım. Birkaç farklı tasarım denemesinin ardından son hâline karar vererek logoyu README dosyasına ekledim. Son olarak Supabase üzerinde projemi oluşturarak gerekli başlangıç yapılandırmalarını tamamladım.Gün boyunca yaptığım çalışmaları düzenli aralıklarla GitHub'a commit ettim. Gün sonunda ise o gün tamamladığım tüm geliştirmeleri içeren bir Pull Request oluşturarak incelemeye gönderdim.Git Commit Mesajları:[10:50] (f6af153) Initial commit[11:15] (674bc32) Add implementation plan and README for Vantage Outlines architecture decisions (React\/Vite frontend, Node\/Express backend, Supabase, local LLM via Ollama), DB schema draft, folder structure, and the 20-day (4-week) development schedule. Co-Authored-By: Claude Sonnet 5[11:21] (35301f9) Clarify git workflow: no direct pushes to main Document the branch-only workflow: all changes go through feature branches, main is only updated via PR, and PRs are opened once a chunk of work is complete rather than per commit. Co-Authored-By: Claude Sonnet 5[11:50] (de9f2a2) Rename docs to lowercase and polish plan\/readme content - Rename IMPLEMENTATION_PLAN.md -> implementation_plan.md and README.md -> readme.md - Add a table of contents to the implementation plan - Fix a malformed table in the local LLM strategy section - Remove assistant-voice phrasing so the docs read as first-party project documentation - Drop an emoji from the day-by-day schedule - Add a placeholder comment in the readme for the project logo - Update cross-file links to the renamed files Co-Authored-By: Claude Sonnet 5[13:06] (9447609) Remove internship duration and advisor from docs Remove incorrect sections from implementation_plan.md and readme.md and clean up project documentation.[13:28] (a50b8e4) Scaffold frontend\/backend folder structure for Day 1 Add the frontend and backend directory tree from implementation_plan.md section 5 (empty leaf folders tracked via .gitkeep), plus docs\/adr and .github\/workflows placeholders and a root .gitignore. Actual app bootstrapping (Vite, Express, package.json, tsconfig) is intentionally left for Day 2, to be generated by the real scaffolding tools instead of hand-written now. Co-Authored-By: Claude Sonnet 5[13:48] (5a059a1) Add env variable templates for frontend and backend Document the expected Supabase and Ollama configuration variables ahead of Day 2's actual app bootstrap, without any real secret values. Co-Authored-By: Claude Sonnet 5[14:03] (b0725a7) Liven up the readme Add tech-stack\/status badges, a \"Neden Vantage?\" highlights section, and tighten the overall flow. Co-Authored-By: Claude Sonnet 5[15:35] (4cc7954) Add Vantage logo to the readme Co-Authored-By: Claude Sonnet 5[15:37] (9ed52a9) Finalize the database ERD and SQL schema Add a Mermaid entity-relationship diagram (docs\/erd.md) and a runnable Postgres schema (backend\/src\/db\/schema.sql) implementing the tables drafted in implementation_plan.md section 4, with enums, foreign keys, and indexes. Link both from the plan. Co-Authored-By: Claude Sonnet 5[15:56] (c216cc2) Switch logo to transparent SVG and expand the readme Replace docs\/logo.png with the transparent-background docs\/logo.svg. Add an architecture diagram (Mermaid) and a roadmap table summarizing the 4-week plan to give the readme more substance.[16:22] (98df7e8) Replace logo with the transparent PNG version[17:41] (50a5f4e) Address PR review: rename to README.md, add API endpoints section[17:56] (1649ec4) Make the API endpoints section explanatory and drop the stale Next Step section[18:46] (4e3d393) Add UI mockups to docs[18:58] (c0b0b45) Add remaining mockups and Deliverables section to the plan"
},
"middle": {
"day": 11,
"date": "2026-08-03",
"content": "Güne, her zamanki gibi Daily toplantısında cuma gününün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım. Ardından bir önceki günün akşamında açtığımız Ollama entegrasyonu ve tasarım sistemi çalışmasının üzerine, yeni bir branch açarak başladım. Cuma günkü işin PR'ı henüz onaylanmamıştı, bu yüzden bugünkü çalışmayı da onun üzerine zincirleyerek ilerledim.Günün asıl hedefi, yapay zekanın bir proje açıklamasını okuyup bunu otomatik olarak alt görevlere bölmesiydi. Bunun için backend tarafında, kurduğumuz yerel yapay zeka modelini çağıran ve ondan görev listesi öneren yeni bir uç nokta (endpoint) yazdım. Kullanıcı bir görev açıklaması girdiğinde model bunu anlamlı alt görevlere bölüyor, bu öneriler veritabanına \"bekliyor\" durumunda kaydediliyor. Ardından bu öneriyi onaylayıp gerçek görevlere çevirebilen ya da reddedebilen ikinci bir uç nokta ekledim. Her iki uç nokta için de üye olmayan birinin erişememesi, geçersiz verilerin reddedilmesi gibi durumları kapsayan testler yaptım.Backend tarafı bittikten sonra, aslında bir sonraki güne planlanmış olan arayüz kısmına da bugünden başladım. Kullanıcının görev açıklamasını yazıp öneri isteyebildiği, gelen alt görevleri düzenleyip onaylayabildiği ya da reddedebildiği bir pencere tasarladım ve bunu çalışma alanı sayfasına bağladım.Bunların yanında, günün ortasında sayfanın genel görünümüyle ilgili bir fikrim oldu: koyu lacivert temanın çok kurumsal durmadığını düşünüp açık tonlu bir tema denemek istedim. Önce sadece çalışma alanı sayfasında deneme yaptım, beğenilince aynı temayı giriş\/kayıt ekranlarından açılış sayfasına kadar uygulamanın tüm sayfalarına yaydım. Arka plan rengini de rastgele seçmek yerine, logomuzun kendi renginden türeterek daha bütünlüklü bir görünüm elde etmeye çalıştım.Bu değişiklikleri test ederken profil ikonuna tıklayınca menünün hiç açılmadığını fark ettim. İncelediğimde, kullandığımız arayüz kütüphanesinin zorunlu tuttuğu bir sarmalayıcı eksik olduğu için menünün her seferinde sessizce hata verip çöktüğünü buldum; bunu düzelttim ve profil menüsü artık düzgün açılıyor.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip GitHub'a gönderdim. Tüm bu değişiklikleri test ederek doğruladıktan sonra günün pull request'ini açtım.Git Commit Mesajları:[11:21] (1586129) Add the backend for AI-assisted task splitting Adds a prompt that asks the interactive local model to break a task or project description into subtasks as strict JSON, a POST endpoint that generates and stores the suggestion as pending, and a PATCH endpoint that creates the real tasks (flagged ai_generated) on accept or just updates the status on reject. Edited subtask lists are re-validated against the schema before anything is created. The suggest\/review\/edit\/approve UX that consumes these endpoints is tomorrow's work — today only covers the backend half.[14:52] (6d173d0) Start the AI task-split suggest\/review\/approve UI Adds a \"Yeni görev başlığı\" adjacent \"AI ile Öner\" button that opens a dialog: describe the work, get a suggested subtask list back from the backend, edit titles\/hours or add\/remove rows, then accept (creates the real tasks, picked up by the existing Kanban realtime subscription) or reject. Wires the AITaskSuggestion type through. This is a head start on tomorrow's planned frontend work; polish continues then.[17:26] (fea8e01) Trial a light theme on the Workspace page Adds a .light-theme token set alongside the existing dark one and converts Workspace and everything it renders (Kanban board\/cards, task detail modal, project\/AI-suggestion dialogs, empty states, breadcrumb, profile menu, skeletons, logo) off hardcoded white\/black opacity utilities onto the shared CSS variables, so they follow whichever theme class wraps them. Portaled dialog\/dropdown content gets the theme applied explicitly since portals sit outside the page's own wrapper in the DOM. Scoped to Workspace only, to gauge the direction before touching the rest of the app.[18:05] (502cc5f) Tint the light theme's background from the logo's own color Softens the logo for light backgrounds (brightness-150 saturate-75 instead of the dark-theme brightness-200 saturate-150) so it doesn't read as too heavy against a pale surface, and changes the light theme's page background from a neutral gray to a very pale tint of the logo's teal, with white cards on top — the same relationship Jira's own light theme has to its blue mark.[18:20] (c3caa0b) Extend the light theme to every remaining page Auth screens, Home, Overview, Team Members, Activity, invite-accept, and the public landing page now use the same light-theme tokens and Logo\/ProfileMenu light variants as the Workspace trial page, instead of the dark navy gradient background.[18:37] (a0f0204) Fix profile menu not opening due to missing Menu.Group wrapper Base UI's Menu.GroupLabel throws when rendered without a Menu.Group ancestor, which silently crashed the whole dropdown (and its parent tree) every time the profile avatar was clicked. Wrapping the email label in DropdownMenuGroup fixes it."
},
"last": {
"day": 20,
"date": "2026-08-14",
"content": "Güne, her zamanki gibi Daily toplantısında başladım. Önceki günün özetini paylaştım. Bugünün hedeflerini belirledim. Ayrıca staj arkadaşlarımla da vedalaştım. Bugünün planı final dokümantasyon, demo senaryosu, sunum hazırlığı ve retrospektifti. Yeni bir çalışma dalı açtım. Bunu dünküne zincirleme yöntemiyle bağladım. Çünkü dünkü iş henüz ana dala kavuşmamıştı.İlk iş final dokümantasyondu. README'yi baştan geçirdim. İçinde hiç doldurulmamış bir kurulum bölümü vardı, onu gerçek adımlarla yazdım. Özellik listesini güncel haliyle genişlettim. Canlı demo linkini ekledim. Veritabanı diyagramına da, zaman içinde eklenip hiç işlenmemiş tabloları ekledim.Sonra dünkü canlı testte bulduğum bir hataya döndüm. Kayıt olan kullanıcılara giden onay e-postası, canlı ortamda bile localhost'a yönlendiriyordu. Kodda bir eksik vardı, düzelttim. Bu arada demo adresini daha düzgün bir isme taşıdım. Bunu yaparken yeni bir sorun çıktı, adrese girenler bir giriş ekranına takılıyordu. Bunun sebebi bir erişim ayarıymış, onu da düzelttim.Bir de kalıcı bir sorunu çözdüm. Yapay zeka özellikleri canlıda çalışmıyordu. Sebebi, bilgisayarımı dışarıya açan tünelin ölmüş olmasıydı. Tüneli yeniden başlattım ama asıl sorun şuydu, her yeniden başlatmada adresi değişiyor ve sunucuyu elle güncellemem gerekiyordu. Bunun için küçük bir script yazdım. Tek bir komutla hem tüneli başlatıyor hem sunucudaki adresi otomatik güncelliyor. Böylece bir daha panel üzerinden elle bir şey yapmama gerek kalmıyor. Planın geri kalanında kapanış sunumu için bir taslak hazırladım.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip pushladım. Gün sonunda bugünü özetleyen PR'ı açtım. Bunu da dünkü tamamlanmamış PR'ın üzerine kurdum. O PR merge olunca, bugünkü PR'ın hedefi otomatik olarak ana dala dönecek.Bugünle birlikte 20 günlük stajımın sonuna geldim.Git Commit Mesajları:[11:05] (aca9685) Bring the README and ERD up to date with the finished product The README's setup section was a placeholder left over from Day 2, and the feature list, status badge, and tech stack table hadn't kept pace with everything shipped since. Adds a live demo link, real install\/run\/test steps, and documents time tracking, task dependencies, email invitations, and assignment suggestions. The ERD gains the tables that were added along the way but never diagrammed: organization invitations, project members, time entries, and task dependencies.[13:49] (b9eaec2) Fix signup confirmation links and update the demo domain signUp() didn't pass an emailRedirectTo, so Supabase built confirmation links from its dashboard Site URL setting - which was still pointing at localhost, sending confirmed users there instead of the live site. Now it redirects to wherever the app is actually running. Also updates the README's demo link to a cleaner vantage-proje.vercel.app alias instead of the auto-generated one.[14:44] (e1cc30d) Add a step-by-step demo scenario document Adds a timed, step-by-step walkthrough for presenting Vantage live, covering the full flow from the landing page through AI task splitting, the Kanban board, delay risk scoring, team invitations, work-style-based assignment, and progress summaries. Linked from the README.[14:53] (8b333ea) Add a closing presentation outline, drop the demo scenario doc Adds a 14-slide outline covering the problem, solution, architecture, the rule-based-scoring-plus-AI-explanation principle, testing, deployment, and lessons learned, for the closing internship presentation. Removes the separate demo scenario document added earlier today - it duplicated ground the presenter already knows the product well enough to cover without a script.[18:27] (c59e7c7) Add a script to sync the Ollama tunnel URL to Render automatically Every time the Cloudflare quick tunnel restarts it gets a new random URL, which previously meant manually editing OLLAMA_HOST in Render's dashboard each time. This script starts the tunnel, waits for it to become reachable, and pushes the new URL to Render via its API, so bringing the live demo's AI features online is a single `npm run tunnel` instead of a dashboard trip. Requires a local, gitignored .env with RENDER_API_KEY and RENDER_SERVICE_ID.[19:01] (24c2438) Stop the README from calling the project finished Swaps the \"Tamamlandı\" status badge and closing line for wording that reflects an ongoing, improvable project instead of a closed one."
}
},
"full_text_length": 94772,
"all_entries": [
{
"day": 1,
"date": "2026-07-20",
"content": "Stajımın ilk gününe ekip arkadaşlarımla gerçekleştirdiğimiz daily toplantısı ile başladım. Toplantıda ekip arkadaşlarım işleyiş hakkında bilgilendirmelerde bulundu. Kısaca tanıştıktan sonra, bugün yapılacak çalışmaları ve geçen hafta tamamlanan işleri dinledim. Her gün, bir önceki gün gerçekleştirilen çalışmaların değerlendirildiğini ve ardından o günün planlamasına geçildiğini belirttiler.Toplantının ardından geliştireceğim projeyi Ümit Bey'e sundum. Projemin onaylanmasının ardından geliştirme sürecine başladım. İlk olarak projenin mimari yapısını, kullanılacak teknolojileri, dört haftalık geliştirme fazlarını ve günlük görev planını içeren detaylı bir implementasyon planı hazırladım. Frontend tarafında React, TypeScript ve Vite; backend tarafında ise Node.js, Express ve TypeScript kullanılmasına karar verdim. Veritabanı, kimlik doğrulama (authentication) ve gerçek zamanlı (realtime) işlemler için Supabase kullanmayı planladım.Projede yer alacak yapay zekâ özellikleri kapsamında görev bölme, önceliklendirme, ekip üyelerinin çalışma tarzını analiz etme ve otomatik ilerleme özeti oluşturma işlemleri için bilgisayarımda yerel olarak çalışacak bir LLM kullanmaya karar verdim. Bu doğrultuda bilgisayarımın donanım özelliklerini inceleyerek çalıştırabileceği uygun model boyutlarını belirledim.Daha sonra projenin README dosyasını hazırlayarak proje hakkında temel bilgileri ve kurulum adımlarını dokümante ettim. GitHub reposunu ekip çalışma düzenine uygun şekilde yapılandırdım. Main branch'e doğrudan kod gönderilmemesi, her gün yeni bir branch oluşturularak geliştirme yapılması ve gün sonunda açılan Pull Request'in Ümit Bey tarafından incelenip birleştirilmesi (merge edilmesi) gerektiği belirtildi. Ben de bu çalışma düzenine uygun şekilde repomu düzenledim.Ardından GitHub Issues ve GitHub Projects yapılarını oluşturarak ilk gün yapılacak çalışmaları içeren ilk issue'yu açtım. Projenin klasör yapısını oluşturdum ve veritabanı şemasını netleştirerek buna ait görsel bir diyagram hazırladım. Ayrıca proje için bir logo tasarımı üzerinde çalıştım. Birkaç farklı tasarım denemesinin ardından son hâline karar vererek logoyu README dosyasına ekledim. Son olarak Supabase üzerinde projemi oluşturarak gerekli başlangıç yapılandırmalarını tamamladım.Gün boyunca yaptığım çalışmaları düzenli aralıklarla GitHub'a commit ettim. Gün sonunda ise o gün tamamladığım tüm geliştirmeleri içeren bir Pull Request oluşturarak incelemeye gönderdim.Git Commit Mesajları:[10:50] (f6af153) Initial commit[11:15] (674bc32) Add implementation plan and README for Vantage Outlines architecture decisions (React\/Vite frontend, Node\/Express backend, Supabase, local LLM via Ollama), DB schema draft, folder structure, and the 20-day (4-week) development schedule. Co-Authored-By: Claude Sonnet 5[11:21] (35301f9) Clarify git workflow: no direct pushes to main Document the branch-only workflow: all changes go through feature branches, main is only updated via PR, and PRs are opened once a chunk of work is complete rather than per commit. Co-Authored-By: Claude Sonnet 5[11:50] (de9f2a2) Rename docs to lowercase and polish plan\/readme content - Rename IMPLEMENTATION_PLAN.md -> implementation_plan.md and README.md -> readme.md - Add a table of contents to the implementation plan - Fix a malformed table in the local LLM strategy section - Remove assistant-voice phrasing so the docs read as first-party project documentation - Drop an emoji from the day-by-day schedule - Add a placeholder comment in the readme for the project logo - Update cross-file links to the renamed files Co-Authored-By: Claude Sonnet 5[13:06] (9447609) Remove internship duration and advisor from docs Remove incorrect sections from implementation_plan.md and readme.md and clean up project documentation.[13:28] (a50b8e4) Scaffold frontend\/backend folder structure for Day 1 Add the frontend and backend directory tree from implementation_plan.md section 5 (empty leaf folders tracked via .gitkeep), plus docs\/adr and .github\/workflows placeholders and a root .gitignore. Actual app bootstrapping (Vite, Express, package.json, tsconfig) is intentionally left for Day 2, to be generated by the real scaffolding tools instead of hand-written now. Co-Authored-By: Claude Sonnet 5[13:48] (5a059a1) Add env variable templates for frontend and backend Document the expected Supabase and Ollama configuration variables ahead of Day 2's actual app bootstrap, without any real secret values. Co-Authored-By: Claude Sonnet 5[14:03] (b0725a7) Liven up the readme Add tech-stack\/status badges, a \"Neden Vantage?\" highlights section, and tighten the overall flow. Co-Authored-By: Claude Sonnet 5[15:35] (4cc7954) Add Vantage logo to the readme Co-Authored-By: Claude Sonnet 5[15:37] (9ed52a9) Finalize the database ERD and SQL schema Add a Mermaid entity-relationship diagram (docs\/erd.md) and a runnable Postgres schema (backend\/src\/db\/schema.sql) implementing the tables drafted in implementation_plan.md section 4, with enums, foreign keys, and indexes. Link both from the plan. Co-Authored-By: Claude Sonnet 5[15:56] (c216cc2) Switch logo to transparent SVG and expand the readme Replace docs\/logo.png with the transparent-background docs\/logo.svg. Add an architecture diagram (Mermaid) and a roadmap table summarizing the 4-week plan to give the readme more substance.[16:22] (98df7e8) Replace logo with the transparent PNG version[17:41] (50a5f4e) Address PR review: rename to README.md, add API endpoints section[17:56] (1649ec4) Make the API endpoints section explanatory and drop the stale Next Step section[18:46] (4e3d393) Add UI mockups to docs[18:58] (c0b0b45) Add remaining mockups and Deliverables section to the plan"
},
{
"day": 2,
"date": "2026-07-21",
"content": "Güne ekip arkadaşlarımla gerçekleştirdiğimiz daily toplantısı ile başladık. Toplantıda bir önceki gün tamamladığımız çalışmaları değerlendirdik ve bugün üzerinde çalışacağımız görevleri paylaştık.İlk olarak, ikinci gün çalışmaları için yeni bir branch oluşturdum. Ardından backend tarafında Express ve TypeScript kullanarak proje iskeletini kurdum. Uygulamanın çalıştığını doğrulamak amacıyla bir health-check endpoint'i geliştirdim ve başarılı bir şekilde test ettim.Frontend tarafında ise Vite, React, TypeScript ve Tailwind CSS v4 kullanarak proje iskeletini oluşturdum.Projenin README dosyasını güncelleyerek, uygulamanın uçtan uca kullanıcı akışını gösteren bir diyagram ile yapay zekâ tarafında neden Ollama tercih edildiğini açıklayan yeni bir bölüm ekledim.Daha sonra frontend ve backend için ayrı ayrı Supabase bağlantılarını yapılandırdım. Oluşturduğum veritabanı şemasını Supabase projesine uyguladım. Bu süreçte karşılaştığım erişim izni sorununu analiz ederek gerekli düzenlemeleri yaptım ve problemi çözdüm.Gün içerisinde GitHub üzerindeki Issue kayıtlarını güncelleyerek tamamladığım ve plan dışı gerçekleştirdiğim ek çalışmaları da ilgili kayıtlara ekledim.Yaptığım geliştirmeleri belirli aralıklarla GitHub reposuna push ettim. Gün sonunda ise gerçekleştirilen tüm çalışmaları özetleyen bir Pull Request (PR) oluşturarak günü tamamladım.Git Commit Mesajları:[10:27] (3927b15) Scaffold Express + TypeScript backend with a health-check endpoint Set up the backend package with express, cors, dotenv, and @supabase\/supabase-js, plus TypeScript tooling (tsx for dev, strict tsconfig). Adds a GET \/api\/health endpoint, verified locally.[12:22] (3a2d763) Scaffold React + Vite frontend with Tailwind v4 Bootstrap the client app (React 19, TypeScript, Vite) and wire up Tailwind through its Vite plugin, replacing the default template content with a minimal placeholder page. Also adds @supabase\/supabase-js ahead of the client-wiring task. Verified the dev server renders and Tailwind classes compile correctly.[13:28] (d33f4d7) Add User Flow and Why Ollama sections to the readme Add a Mermaid diagram walking through a project's lifecycle end to end, highlighting exactly where the AI layer participates, plus a short explanation of the technical reasoning behind choosing a local LLM over a cloud API.[15:40] (982584f) Wire up Supabase clients for frontend and backend Add a browser-side client (anon key) for the frontend and a server-side client (service_role key, no session persistence) for the backend. Extend \/api\/health to report Supabase connectivity as a quick smoke test.[17:16] (85569c2) Add a Vitest test for the health-check endpoint Split the Express app definition out of index.ts into app.ts so it can be imported in tests without binding a real port. Add a test for GET \/api\/health that mocks the Supabase client, keeping the test fast and independent of network\/environment state."
},
{
"day": 3,
"date": "2026-07-22",
"content": "Güne ekip arkadaşlarımla gerçekleştirdiğimiz daily toplantısı ile başladık. Toplantıda bir önceki gün tamamladığımız çalışmaları değerlendirdik ve bugün üzerinde çalışacağımız görevleri paylaştık.Ardından günün branch'ini açtım ve bu sefer branch'i GitHub Issue'suna da düzgünce bağladım, bir önceki gün yarım kalan bu adımı da tamamlamış oldum.Bugünün ana hedefi kullanıcı girişini gerçek anlamda çalışır hale getirmekti. İlk olarak baştan sona bir giriş sistemi kurdum.Bunu tarayıcıda test ettim ve gerçek bir hesapla giriş\/çıkış yapabildiğimi doğruladım.Sonrasında sayfaları koruma altına aldım. Buradaki amacım giriş yapmamış biri korumalı bir sayfaya gitmeye çalışırsa otomatik olarak giriş ekranına yönlendirilmesi, tam tersi durumda da giriş yapmış biri tekrar giriş ekranına gidememesini sağlamaktı.Ardından da görev organizasyon ve proje oluşturma akışlarıyla ilgilendim. Bunun için veritabanında küçük bir eksik fark ettim; yeni kullanıcılar için otomatik profil kaydı oluşmuyordu, bunu düzelttim. Sonrasında organizasyon ve proje oluşturma işlemlerini yazdım ve testlerin gerçekleştirilmesine katkıda bulundum.Bunların yanında bugün ekstra olarak ön yüz tasarımına da epey zaman ayırdım: giriş\/kayıt ekranlarını ve projeyi tanıtan yeni bir tanıtım sayfasını baştan tasarladım, logo dosyasını güncelledim. Tasarım üzerinde birkaç kez revizyon yaptım, tanıtım sayfasının görsel tarafı henüz tam oturmadı, ilerleyen günlerde tekrar ele alacağım.Yaptığım geliştirmeleri belirli aralıklarla GitHub reposuna push ettim. Gün sonunda ise gerçekleştirilen tüm çalışmaları özetleyen bir Pull Request (PR) oluşturarak günü tamamladım.Git Commit Mesajları:[10:31] (e4da299) Add end-to-end auth flow with Supabase (sign up, login, logout) Introduces an AuthContext that tracks the Supabase session and exposes signUp\/signIn\/signOut, plus Login\/Signup\/Home pages wired together with react-router-dom.[11:09] (85f19d3) Redesign auth screens with shadcn\/ui and a split-screen layout Sets up shadcn\/ui (Button, Input, Label, Card) with a path alias, and rebuilds the Login\/Signup pages as a split layout: a gradient brand panel highlighting core features on one side, and the form on the other.[13:01] (9a732f8) Add protected routes and backend JWT verification middleware Wraps app routes with ProtectedRoute\/GuestRoute on the frontend so signed-out users are redirected to \/login and signed-in users skip the auth pages. Adds a requireAuth Express middleware that validates a Supabase-issued bearer token, ready to guard upcoming API routes.[13:54] (9c38809) Restyle auth screens with an editorial paper-and-serif theme Reworks Login\/Signup to a paper-tone palette, self-hosted Source Serif 4 type, and a CSS-only CMYK misregistered-print effect on the hero headline, scoped to these two pages via an .auth-editorial class.[15:01] (ad02eba) Add organization and project creation endpoints Adds POST\/GET \/api\/organizations and POST\/GET \/api\/organizations\/:orgId\/projects, guarded by requireAuth and organization membership checks. Includes a database trigger that backfills a profiles row for every new auth user, since organizations and projects both reference profiles via foreign keys.[16:21] (52e88e3) Add a landing page and restyle the brand logo Introduces a public landing page at \"\/\" built in the same editorial theme as the auth screens, with a sticky nav and an expandable \"Neden Vantage\" section. Moves the authenticated home view to \/dashboard, swaps in a tightly-cropped logo file, and enlarges it across the auth and landing layouts.[17:47] (537a976) Refine landing page layout and button styling Makes section dividers full-bleed, drops the top-nav anchor links in favor of scrolling, enlarges nav\/kicker text, and switches CTAs to an outlined button style with colored secondary links."
},
{
"day": 4,
"date": "2026-07-23",
"content": "Güne ekip arkadaşlarım ile gerçekleştirdiğimiz toplantı ile başladık. Toplantıda bir önceki gün tamamladığımız çalışmaları değerlendirdik ve bugün üzerinde çalışacağımız görevleri paylaştık.Ardından günün branch'ini açtım ve GitHub Issue'suna bağladım.Bugünün ana hedefi görev tarafını hayata geçirmekti. Veritabanında görevler için gerekli alanlar önceki günlerde zaten hazırlanmıştı, ben de bunun üzerine görevleri oluşturma, listeleme, güncelleme ve silme işlemlerini yazdım ve bunlara ait testleri gerçekleştirdim.Sonrasında dashboard'a bu işlemleri gerçekten kullanabileceğim bir ekran ekledim. Buradaki amacım önce bir organizasyon oluşturulmasını, ardından organizasyon içine bir proje eklenmesini, son olarak da o projeye görevlerin eklenip silinebilmesini sağlamaktı. Bunu tarayıcıda test ederek doğru çalıştığını gördüm.Bunların yanında bugün ekstra olarak yine tasarım tarafına epey zaman ayırdım. Girişten hemen sonra kullanıcının ne yapmak istediğini seçtiği ayrı bir karşılama ekranı ekledim. Ardından uygulamanın tamamını koyu, lacivert tonlarında yeni bir tasarıma geçirdim, yeni bir vurgu rengi ve yeni bir kod tabanlı logo kullandım.Yaptığım geliştirmeleri belirli aralıklarla GitHub reposuna push ettim. Gün sonunda ise gerçekleştirilen tüm çalışmaları özetleyen bir Pull Request oluşturarak günü tamamladım.Git Commit Mesajları:[10:25] (ed152ce) Add Task type definition The tasks table schema was already in place from Day 1\/2; this adds the matching TypeScript type for use in upcoming task endpoints.[12:10] (ac04a9e) Add task CRUD endpoints Adds GET\/POST \/api\/projects\/:projectId\/tasks and GET\/PATCH\/DELETE \/api\/tasks\/:taskId, guarded by requireAuth and project membership checks, with Vitest coverage for each route.[14:54] (e3c43de) Add organization\/project\/task flow to the dashboard Introduces an authenticated API client and wires the dashboard to the existing backend: create\/select an organization, create\/select a project within it, and view\/create\/delete tasks in that project.[15:45] (3462027) Add a post-login welcome screen and move workspace to its own route The dashboard now shows a welcome hub (matching the welcome mockup) where the user chooses what to do next, instead of landing directly in the organization\/project\/task management view. That view moves to \/dashboard\/workspace.[17:17] (51648ba) Redesign the app with a dark theme and a code-based logo mark Replaces the paper-and-serif editorial theme across every screen (Landing, Login, Signup, welcome hub, workspace) with a dark navy background, coral accent, and Poppins type, inspired by a reference site the user shared. Introduces a small Logo component (icon + wordmark) built in code instead of an image asset, since the existing logo file wouldn't read against a dark background. Adds a decorative wave-bar visual to the landing hero.[18:02] (b44f28e) Shift the dark theme background toward navy instead of near-black The background was reading as almost black; swaps it for a clearer dark blue (#0d1b3a) across every screen using the dark theme."
},
{
"day": 5,
"date": "2026-07-24",
"content": "Toplantının ardından güne, her gün olduğu gibi yeni bir branch açarak ve bunu ilgili GitHub görevine bağlayarak başladım. İlk olarak görevler için sürükle-bırak yapılabilen bir Kanban panosu kurdum; görevler artık beş durum arasında (yapılacaklar, sırada, devam ediyor, incelemede, tamamlandı) fare ile sürüklenerek taşınabiliyor ve bu değişiklik anında sunucuya kaydedilip veritabanına yansıyor. Bunu bir kart sürükleyip sayfayı yeniledikten sonra kartın hâlâ doğru yerde durduğunu görerek doğruladım.Bu işin ardından, günün planı biraz hafif kaldığı için ekip üyelerinin organizasyon içindeki rollerinin (sahip\/yönetici\/üye) yönetilmesi işini, aslında ileride yapılması planlanan bir günden bugüne aldım. Bir organizasyonun sahibi artık üyelerin rolünü değiştirebiliyor, bu işlem sadece sahip yetkisine sahip kişiler tarafından yapılabiliyor ve bu kısım için ayrıca test gerçekleştirdim.Daha sonra haftanın ilk demosunu gerçekleştirdim; kayıt olma, giriş yapma, organizasyon\/proje\/görev oluşturma ve Kanban panosunda sürükle-bırak adımlarının hepsini baştan sona deneyerek her adımın sorunsuz çalıştığını doğruladım.Günün geri kalanında ise uygulamanın görünümü üzerinde çalıştım. Çalışma alanı sayfasını, organizasyon ve projelerin sol tarafta bir menüde, görevlerin ise sağda ana alanda gösterildiği daha düzenli bir yapıya kavuşturdum. Görev kartlarına son tarih bilgisi ve daha belirgin bir görünüm ekledim; bir karta tıklandığında açıklama, son tarih ve öncelik gibi bilgilerin düzenlenebildiği bir detay penceresi oluşturdum. Ayrıca veriler yüklenirken sayfanın boş görünmesi yerine hafif bir yükleniyor animasyonu gösterilmesini sağladım.Son olarak, giriş sayfasının genel görünümünü daha profesyonel bir hale getirmeye çalıştım. Sayfa kaydırıldıkça bölümlerin yumuşakça belirmesini sağladım, özellik listelerine simgeler ekledim ve önceden yer alan soyut bir görsel süslemenin yerine uygulamanın kendisini andıran küçük bir Kanban önizlemesi koydum. Arka plan rengini de sabit bir lacivert yerine yavaşça hareket eden bir gradyan haline getirdim. Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip GitHub'a gönderdim ve günün sonunda tüm bu çalışmaları özetleyen bir pull request açtım.Git Commit Mesajları:[10:54] (dcf93a9) Add a drag-and-drop Kanban board for tasks Replaces the plain task list in the workspace with a dnd-kit board (Backlog\/Todo\/In Progress\/Review\/Done). Dropping a card into another column calls PATCH \/api\/tasks\/:taskId to persist the new status, with an optimistic update that rolls back on failure.[12:24] (3883b26) Add organization member role management endpoints Adds GET \/api\/organizations\/:orgId\/members to list members and PATCH \/api\/organizations\/:orgId\/members\/:userId to change a member's role, restricted to organization owners. Pulled forward from Day 6 since it doesn't depend on the invite flow.[15:19] (2d2eae3) Redesign workspace page with sidebar layout and icons Split organizations\/projects into a left sidebar and moved tasks\/kanban into a main content area with a breadcrumb, replacing the previous stacked full-width sections for a more app-like layout.[16:49] (b4ef19e) Polish kanban cards, add task detail modal, loading states, and page fade-in Adds hover\/drag styling and status color dots to kanban cards and columns, a click-to-edit task detail modal for description\/due date\/priority, skeleton placeholders while org\/project\/task data loads, and a lightweight fade-in animation applied across pages.[17:24] (563005e) Give the landing page a more premium, marketing-site feel Adds a scroll-triggered reveal animation, an accent-colored headline and eyebrow badge, icon-led feature lists and why-cards, a browser-chrome framed product screenshot, and a spotlight-style closing CTA section.[17:52] (a266520) Replace hero wave decoration and add animated gradient background Swaps the abstract wave-bar decoration for a mini kanban board preview that previews the product itself, fixes the workspace header so the back link sits on its own line under the logo, and replaces the flat navy background with a slow-moving gradient across all dark-theme pages."
},
{
"day": 6,
"date": "2026-07-27",
"content": "Bugüne yine ekip içi günlük toplantıda Cuma günkü ilerlemeyi paylaşarak başladım.Bugün için hedefim, organizasyona yeni kişileri e-posta ile davet edebilmek ve kimin neyi yapabileceğini belirleyen yetki kurallarını netleştirmekti.Toplantının ardından güne, her zamanki gibi yeni bir branch açarak ve bunu ilgili göreve bağlayarak başladım. İlk olarak davet sistemini kurdum: bir organizasyonun sahibi ya da yöneticisi artık bir e-posta adresine davet gönderebiliyor, bu davetler listelenebiliyor ve gerekirse iptal edilebiliyor. Bunun için veritabanına yeni bir tablo eklemem gerekti, bu tabloyu oluşturan komutu birlikte veritabanı yönetim panelinden çalıştırdım.Sonrasında davet edilen kişinin bu daveti nasıl kullanacağını kurdum: davet linkine tıklayan kişi, giriş yapmamışsa önce giriş ekranına yönlendiriliyor, giriş yaptıktan sonra otomatik olarak davet sayfasına geri dönüyor ve orada hangi organizasyona hangi rolle katılacağını görüp kabul edebiliyor.Ardından yetkilendirme kurallarını sıkılaştırdım: artık bir organizasyondan üye çıkarma işlemini sadece sahip ya da yöneticiler yapabiliyor, bir yönetici başka bir yöneticiyi çıkaramıyor ve organizasyonun asıl sahibi hiçbir şekilde çıkarılamıyor. Benzer şekilde, bir görevi artık sadece projenin yöneticisi, sahibi ya da o görevi oluşturan kişi silebiliyor.Günün geri kalanında bu özellikleri kullanabileceğimiz bir ekip üyeleri sayfası tasarladım: davet göndermek için bir form, mevcut üyelerin listelendiği ve rollerinin değiştirilip çıkarılabildiği bir tablo, ve bekleyen davetlerin görüldüğü ayrı bir bölüm. Kullanıcı geri bildirimleri doğrultusunda davet formunu daha dikkat çekici hale getirdim, sayfa düzenini genişleterek boş kalan kenar boşluklarını azalttım ve üst kısımdaki e-posta yazısını daha sade bir görünüm için tek harfli bir rozetle değiştirdim.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip GitHub'a gönderdim. PR'a incelemesi için ekip arkadaşlarımı ekleyip günün sonunda bir pull request açtım.Git Commit Mesajları:[10:38] (1bd4d36) Add organization invitation creation, listing, and acceptance flow Adds an organization_invitations table plus endpoints for owners\/admins to create, list, and revoke invitations, and a token-based lookup and accept endpoint that validates the invitation, matches it against the authenticated user's email, and creates the organization membership.[12:18] (b06223a) Add the invite acceptance page and post-login redirect Adds an \/invite\/:token page that shows the invitation's organization and role and lets the signed-in user accept it, preserves the original destination through ProtectedRoute and Login so an unauthenticated visitor returns to the invite after signing in, and adds a typed ApiError with the response status so the UI can show status-specific messages for expired, mismatched, or already-used invitations.[13:06] (6a0054d) Add role-based authorization for member removal and task deletion Adds a DELETE endpoint for removing organization members, restricted so only owners\/admins can remove members, admins can't remove other admins, and the organization owner can't be removed or remove themselves. Restricts task deletion to a project's admin\/owner or the task's creator instead of any project member.[15:06] (9757ba6) Add the team members page for inviting and managing organization members Adds a \/dashboard\/organizations\/:orgId\/team page with an invite form (email + role, with a copyable invite link since there's no email service yet), a members table with role changes and removal for owners\/admins, and a pending invitations list with revoke. Enriches the members list endpoint with each member's name and email instead of just their user id.[16:13] (f788c7b) Make the invite panel and team members link more prominent Gives the invite form a coral-tinted highlighted panel with an icon badge and glow instead of blending in with the other neutral sections, and turns the small \"Ekip\" text link in the workspace sidebar into a full-width standalone button so it's not overlooked.[18:07] (8cdb68b) Widen page layout and swap header email for an avatar initial Widens the workspace and team members containers so less horizontal space goes unused on larger screens, and replaces the raw email text in the workspace header with a single-letter avatar badge (full email still available on hover) to match the member list styling."
},
{
"day": 7,
"date": "2026-07-28",
"content": "Bugüne daily toplantıyla başladıktan hemen sonra günün branch'ini açıp ilgili göreve bağlayarak asıl işe başladım: bugünün hedefi görevlere son teslim tarihi, öncelik ve etiket eklemek, ardından bunlara göre filtreleme ve sıralama yapabilmekti.İlk olarak görev oluşturma formuna öncelik seviyesi ve son teslim tarihi seçme alanları ekledim. Bu sırada tarayıcının kendi açılır menülerinde seçeneklerin beyaz bir arka planla göründüğünü fark ettim, bunu da düzelttim. Sonrasında görevlere etiket ekleme özelliğini kurdum: veritabanına yeni bir alan ekledim, sunucu tarafında bu alanı kaydedip güncelleyebilecek şekilde düzenleme yaptım. Arayüzde hem görev oluştururken hem de bir görevi açıp düzenlerken etiket ekleyip çıkarabilecek hale getirdim. Bunun üzerine Kanban panosuna önceliğe ve etikete göre filtreleme, son tarihe ve önceliğe göre sıralama, bir de hızlı arama kutusu ekledim.Teknik kısmın ardından uygulamanın görünümüne yoğunlaştım. Giriş ve üye ol sayfalarının çok sade durduğunu düşünüp buralara hareketli giriş animasyonları ekledim; ilk denemede bu animasyonlar dar ekranlarda görünmüyordu, kaynağını bulup düzelttim. Sonrasında karşılama sayfasının arka planına yapay zekayı çağrıştıran, noktalardan oluşan hareketli bir ağ animasyonu tasarladım. Bunu beğenince aynısını giriş\/üye ol sayfalarına ve ana karşılama ekranına da taşıdım. Bu sırada ana ekrandaki \"Çalışma Alanına Git\" yazısını da daha doğal bir profil menüsüne çevirdim.Günün geri kalanında çalışma alanı sayfasını baştan tasarladım. Önce kapsamlı bir tasarım değerlendirmesi yaptım: renk paleti, sayfa düzeni, kart ve panel görünümleri, kenar yuvarlaklıkları gibi başlıklarda neyin değişebileceğini belirledim. Ardından bunların hepsini uyguladım. Kenar çubuğunu tek bir açılır-kapanır ağaç yapısına indirdim, görev kartlarındaki silme ikonunu üzerine gelince beliren bir hale getirdim. Panonun sabit bir yatay kaydırma çubuğu olmadan ekranı doldurmasını sağladım ve son olarak bu sayfaya da aynı ağ animasyonunu ekleyip \"Çıkış Yap\" butonunun üzerine gelince metninin görünmez olduğu küçük bir hatayı giderdim.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip GitHub'a gönderdim ve günün sonunda tüm bu çalışmaları özetleyen ve demo videosu içeren bir pull request açtım.Git Commit Mesajları:[11:50] (787532e) Add priority and due date to task creation, fix dropdown option colors Lets a priority and due date be set when creating a task instead of only after the fact through the detail modal. Also gives native elements explicit dark colors, since Tailwind's opacity-based background utilities don't render correctly in the browser's native select dropdown popup.[13:12] (c6bb695) Add task tags and kanban filtering\/sorting Adds a tags column to tasks, lets tags be set at creation and edited in the task detail modal, and displays them on kanban cards. Adds a filter\/sort bar above the kanban board to filter by priority or tag and sort by due date or priority.[15:24] (52b551b) Add animated network background and staggered entrance animations Adds a lightweight canvas-based particle network (moving, connected dots) behind the landing page hero, floating glow blobs across the auth pages, and staggered fade-in-up entrances for the login\/signup form fields and the auth layout's feature list. Extends Reveal with a delay option and an \"as\" prop so it can render as a list item.[16:54] (492176b) Add network background to auth\/home pages and redesign home CTA Adds the animated particle network to the login\/signup layout and the welcome hub. Replaces the awkwardly-worded \"Çalışma Alanına Git\" button and its adjacent sign-out button with a single prominent \"Hemen Başla\" CTA plus a profile avatar menu (top-right) that holds sign-out instead.[17:25] (9136af4) Overhaul the kanban\/workspace UI: palette, layout, and usability Introduces CSS custom properties for a higher-contrast dark palette (solid surface colors instead of stacked opacity backgrounds), raises border-radius across the app from 3-4px to 6-8px, and gives urgent priority its own distinct color instead of sharing coral with high. Reworks the kanban board to a flexible grid so columns fill the available width without a persistent horizontal scrollbar, collapses the workspace sidebar's three separate organization\/team\/project panels into a single expandable tree, moves the task delete button to a hover-revealed overlay so it no longer competes with the title, and adds a quick search box that filters the board by task title.[18:12] (9d13b24) Add network background to workspace, fix outline button hover text Brings the workspace page in line with the rest of the app by adding the animated particle-network background used elsewhere. Also fixes a bug where outline-variant buttons (sign out, cancel) lost their text on hover: the base variant's hover:text-foreground rule outranked our plain text-white by CSS specificity, rendering the label almost invisible against the dark surface."
},
{
"day": 8,
"date": "2026-07-29",
"content": "Güne, her zamanki gibi Daily toplantısında bir önceki günün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım. Bugün dashboard'da görev istatistiklerinin gösterilmesi, Recharts ile grafiklerin eklenmesi ve geciken görevlerin vurgulanması planlanmıştı. Günün branch'ini açtıktan hemen sonra, önceki günün pull request'i henüz onaylanmadığı için yeni branch'i bağımsız değil, dünkü branch'in üzerine kurdum; böylece bir gün önce eklediğim animasyon ve tasarım bileşenlerini yeniden yazmak zorunda kalmadan kullanabildim.İlk olarak sunucu tarafında; bir kullanıcının üye olduğu tüm projelerdeki görevleri toplayıp duruma ve önceliğe göre sayan, geciken görevleri ayrıca işaretleyen bir istatistik uç noktası kurdum. Bunun üzerine yeni bir Genel Bakış sayfası tasarladım: özet kutuları, iki farklı çubuk grafik ve geciken görevlerin öne çıktığı bir liste. Grafiklerin renklerini rastgele seçmek yerine, renk körlüğüne uygun olup olmadığını da ayrıca kontrol ettim.Günün ortasında, yapılan işlerin bir gün için az kaldığını düşünüp daha neler ekleyebileceğimi değerlendirdim. Sonucunda; önümüzdeki birkaç gün içinde son tarihi gelecek görevlerin ayrıca vurgulanmasına ve görevlerin proje bazında nasıl dağıldığının gösterilmesine karar verip ikisini de aynı gün içinde tamamladım.Ardından, normalde daha sonraki bir güne planlanmış olan görev geçmişi özelliğini de öne çekmeye karar verdim: Artık bir görev oluşturulduğunda ya da durumu, önceliği, son tarihi, atanan kişisi veya etiketleri değiştiğinde bu durum otomatik olarak kaydediliyor ve ayrı bir listede görüntülenebiliyor.Sayfanın son hâline karar verirken birkaç kez fikir değiştirdim: Önce aktivite listesini sayfanın kenarında sabit bir panel yapmayı denedim; beğenilmeyince eski düzene döndüm ve bu listeyi tamamen ayrı bir sayfaya taşıdım. Sayfanın geri kalanını da tek uzun bir liste yerine iki sekmeli bir yapıya böldüm. Sekme sayısını ve isimlerini birkaç kez sadeleştirdikten sonra son hâline ulaştırdım.Gün sonunda tüm bu çalışmaları özetleyen bir pull request açtım, ekran görüntülerini ekledim, incelemeleri için ekip arkadaşlarımı etiketledim ve görevi kendime atadım.Ayrıca artık her gün staj içerisindeki arkadaşlarımızla da birbirimizin PR'larını approve ediyoruz. Bu şekilde hem birlikte bir çalışma yapmış oluyor hem de kod okumayı öğreniyoruz.Git Commit Mesajları:[10:43] (5204157) Add dashboard stats and charts with an overdue task highlight Adds a \/api\/dashboard\/stats endpoint that aggregates a user's tasks across every project they belong to, breaking them down by status and priority and flagging anything past its due date and not done. Adds a new Overview page (recharts bar charts for the status\/priority breakdowns, stat tiles, and a highlighted overdue list) linked from the Home and Workspace pages. Chart colors are picked from a validated categorical palette rather than the app's existing priority colors, which fail a colorblind-safety check when placed side by side as bars.[11:54] (fa1b6fc) Add due-soon highlighting and per-project breakdown to the dashboard Extends the dashboard stats endpoint to also flag tasks due within the next 3 days (separate from already-overdue) and to group task counts by project, so users can see which project is carrying the load. Adds matching sections to the Overview page: a due-soon list beside the overdue one, and a proportional bar list of tasks per project.[14:26] (3f47195) Add task activity logging and a recent-activity feed Pulls the activity-log piece of Day 9 forward: every task creation and every change to status, priority, due date, assignee, or tags now writes a row to task_activity_log (already in the schema, unused until now), tagged with who made the change and what it was. Adds a \/api\/dashboard\/activity endpoint that returns the 15 most recent entries across a user's projects with the task title attached, and a matching \"Son Aktiviteler\" section on the Overview page.[16:10] (0b7306c) Fix truncation and header wrapping on the Overview page The task-alert and activity list rows were flex children with no min-width, so the truncate class never actually kicked in on long titles — the row overflowed instead of ellipsizing. Also lets the header wrap instead of squeezing on narrow viewports.[17:58] (6125993) Move the activity feed into a sticky sidebar on the Overview page Son Aktiviteler was the last section in a single vertical stack, so it sat below several rows of charts and lists and needed a lot of scrolling to reach. Splits the page into a two-column layout on large screens: stats\/charts\/breakdowns on the left, the activity feed pinned in a sticky right column so it stays visible while scrolling. Falls back to a normal single-column stack below the lg breakpoint.[18:22] (498f54c) Split recent activity into its own page and tab the Overview page Reverts the sticky-sidebar layout in favor of the original single- column stack, then moves the activity feed out entirely: it's now its own \/dashboard\/activity page reached via a button, instead of competing for space at the bottom of Overview. Also splits Overview into two tabs (Genel \/ Detaylar) so the charts and the overdue\/due-soon\/per-project breakdowns don't all have to be scrolled through in one long stack."
},
{
"day": 9,
"date": "2026-07-30",
"content": "Güne, her zamanki gibi Daily toplantısında bir önceki günün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım. Bugünün hedefi Kanban panosuna canlı senkronizasyon ve aktivite günlüğü kazandırmak. Bir önceki günün pull request'i henüz onaylanmadığı için, dünkü gibi bugünün branch'ini de o branch'in üzerine kurarak başladım.İlk olarak Realtime senkronizasyonu kurdum: bir kullanıcı bir görevi taşıdığında ya da düzenlediğinde, aynı projeye bakan başka kullanıcıların ekranı sayfa yenilenmeden güncellensin diye Supabase'in canlı veri akışı özelliğini açtım. Bunu güvenli yapabilmek için önce veritabanına, bir kullanıcının sadece kendi üyesi olduğu projenin görevlerini görebilmesini sağlayan bir yetkilendirme kuralı eklemem gerekti; aksi halde bu özellik herkesin birbirinin verisini görebilmesine yol açabilirdi. Ardından, iki kişinin aynı görev üzerinde aynı anda değişiklik yapması durumunda birinin işleminin diğerini silmemesi için küçük bir düzeltme yaptım. Son olarak, görev detayına o görevin geçmişini gösteren bir liste ekledim. Ve bu sırada kayıt formunun zaten kayıtlı bir e-postayla sessizce \"başarılı\" görünmesi gibi ayrı bir hatayı da fark edip düzelttim.Günün planlanan işleri erken bitince, ileriki bir güne ait olan test geçişi ve hata ayıklama çalışmasını öne çektim. Kod tabanını baştan sona tarayıp dört gerçek hata buldum ve hepsini düzelttim: bunlardan biri; geciken görev hesabının saat dilimine göre yanlış sonuç verebilmesiydi.Günün geri kalanında arayüz tarafına döndüm: uygulamanın her yerinde kullanılan jenerik bir ikon yerine, daha önceden hazırlanmış ama hiç kullanılmayan gerçek Vantage logosunu devreye aldım. Ayrıca çalışma alanı, genel bakış, aktiviteler ve ekip sayfalarının hepsine, hangi sayfada olduğunu net gösteren ortak bir menü ekledim.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip GitHub'a gönderdim ve günün sonunda tüm bu çalışmaları özetleyen bir pull request açtım.Git Commit Mesajları:[11:08] (11476f9) Add realtime kanban sync and per-task activity history Enables Supabase Realtime on the tasks table so the kanban board reflects other users' changes without a refresh. Realtime broadcasts every row change to every connected client on a table with no RLS, so this required adding a row-level security policy scoping reads to a task's project members before turning it on. Also scopes the optimistic-update rollback in handleStatusChange to the single task being changed instead of the whole list, so a failed update from one user can no longer wipe out a concurrent change from another user that arrived via realtime in the meantime. Adds a per-task activity endpoint and surfaces it as a small history list in the task detail modal.[11:09] (b439ec0) Fix signup silently succeeding for an already-registered email Supabase returns no error from signUp() for an existing, confirmed email (an anti-enumeration measure) — instead the returned user has an empty identities array. Check for that and surface a real error instead of showing the \"check your email\" success screen.[13:39] (0bb9a76) Fix four correctness bugs found in a bug-fix pass - Task activity log recorded a spurious \"tags changed\" entry on every edit, even when tags were untouched: the comparison used !== on two distinct array references instead of comparing contents. - A newly created task could render twice on the kanban board if the realtime INSERT event for it arrived before the POST response did; the create handler now dedupes by id like the realtime handler does. - Overdue highlighting on the task card mixed a UTC-parsed due_date with a locally-parsed \"today\", misclassifying today-due tasks as overdue in timezones behind UTC and disagreeing with the (UTC-based) overdue calculation on the Overview dashboard. Both now compare plain date strings the same way. - Switching organizations\/projects quickly could let a slower, stale fetch response overwrite the correct one that already rendered; the org->projects and project->tasks effects now ignore their result if a newer selection has since superseded them.[15:05] (d9cb672) Use the real Vantage logo asset instead of a placeholder icon public\/logo.png has an actual designed wordmark (the V-into-arrow mark, \"Vantage\" lettering) that was sitting unused while every page rendered a generic lucide icon + plain text instead. Swaps the Logo component over to it, inverted to white for the dark theme.[16:39] (c782dfa) Add a shared page nav so Overview is easy to find Each inner page (Workspace, Overview, Activity, Team Members) had its own inconsistent, faint text link or two for getting around, and several didn't link to Overview at all. Adds a small PageNav component - a segmented menu highlighting the current page - and places it in the header of all four.[18:22] (07277c9) Tighten the logo crop and nudge it flush left The source PNG had asymmetric transparent padding (more at the bottom and left) that made the mark look inset from the page's left edge compared to the heading\/pill below it. Trims the image to its visible bounding box and pulls it left a bit further to sit flush with the rest of the header content."
},
{
"day": 10,
"date": "2026-07-31",
"content": "Güne, her zamanki gibi Daily toplantısında bir önceki günün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım. Hedefler konuşulduktan sonra günün branch’ini açtım. Bir önceki günün pull request'i henüz onaylanmadığı için, dünkü gibi bugünün branch'ini de o branch'in üzerine kurarak başladım. Ardından önceki günden kalan test geçişi ve bug fix işleriyle ilgilendim ve MVP checkpoint'i tamamladım. Uygulamayı uçtan uca deneyerek çekirdek proje yönetimi özelliklerinin sorunsuz çalıştığını doğruladım ve Hafta 2'yi resmen kapatmış oldum.Ardından Hafta 3'ün konusu olan yapay zeka katmanına erken başladım. Bilgisayarıma Ollama'yı kurup iki aday local dil modelini (qwen2.5:3b-instruct ve llama3.2:3b) indirdim. Bu iki modeli gerçek senaryolara yakın promptlarla (görev bölme çıktısının JSON şemasına uyup uymadığı, yanıt süresi, Türkçe kalitesi) karşılaştırdım. llama3.2:3b'nin daha hızlı yüklendiğini ve verilen bilgiyi yanlış yorumlamadığını gördüğüm için bu modeli seçtim ve kararı .env üzerinden değiştirilebilecek şekilde yapılandırdım.Günün geri kalanında frontend tarafında bir dizi iyileştirme yaptım. Logonun koyu tema üzerinde okunaklı görünmesini sağladıktan sonra yeni bir logo tasarımına geçtim. Ardından hem uygulama içinde hem README'de logoyu güncelledim. Landing sayfasının giriş bölümünü daha kurumsal bir B2B SaaS görünümüne kavuşturdum: iki sütunlu bir düzen, yapay zeka görev önerisini gösteren bir ürün görseli, sosyal kanıt bölümü ve üst menüye bölüm linkleri ekledim. Ayrıca aktivite geçmişi listesinin okunabilirliğini artırdım. Projeye Badge, Dialog, Dropdown Menu gibi tekrar kullanılabilir arayüz bileşenleri kazandırmaya çalıştım. Bunların yanında bir breadcrumb, profil menüsü, boş durum bileşeni ve doğrulamalı bir \"yeni proje oluştur\" penceresi ekleyip dört sayfanın üst kısmına entegre ettim.Günün sonuna doğru, bir yöneticinin bir görevi birine atarken not bırakabilmesi gerektiğini fark ettim ve bunun için hem arka planda hem arayüzde yeni ve kullanışlı bir özellik geliştirmeye çalıştım. Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip GitHub'a gönderdim. Tüm bu değişiklikleri test ederek doğruladıktan sonra günün pull request'ini açtım.Git Commit Mesajları:[11:57] (592b763) Revert to the code-based logo mark The PNG asset's proportions weren't landing right after several adjustments; reverting to the icon+text mark until a new logo design is ready.[14:18] (18e5ebe) Add AIProvider abstraction and pick the interactive local LLM Benchmarked qwen2.5:3b-instruct-q4_K_M and llama3.2:3b on the target 4GB VRAM hardware with representative prompts (task-splitting JSON output, Turkish delay-risk explanation). llama3.2:3b wins on cold-load time and didn't misstate the input data the way qwen did, with comparable warm inference latency and JSON schema compliance. Wires the choice through OLLAMA_MODEL_INTERACTIVE and introduces a thin AIProvider interface over Ollama so upcoming AI features aren't coupled to a specific model or to Ollama itself.[16:04] (a51b833) Switch to the new network-mark logo Replaces the code-based icon with the new logo asset, boosted with a brightness\/saturate filter so its teal tone reads clearly against the app's dark navy header instead of blending into it. Also swaps the README's logo for the same design.[17:13] (104e4ab) Redesign the landing hero into a premium two-column B2B layout Replaces the single-column hero with a two-column layout: refined copy and CTAs on the left, a glassmorphism task-card mockup showing the AI task-suggestion feature on the right instead of empty network space. Adds nav links to the existing sections, switches the primary CTA to a solid button, and adds a social-proof strip below the hero.[17:49] (6f1dd96) Improve the activity log's readability Rows were flat single lines that all looked the same, making the list hard to scan. Adds a per-action icon, promotes the task title to its own bold line, renders status changes as colored dots matching the Kanban column colors, and separates rows with dividers instead of plain spacing.[18:55] (dbbcc3a) Add a design-system component set and let managers note a task assignment Adds Badge\/Dialog\/DropdownMenu (via shadcn), reskinned to Vantage's dark surface tokens since the generated defaults render as light-mode popups, plus new Breadcrumb, ProfileMenu, EmptyState, and a Zod + React Hook Form validated project-creation dialog. Wires breadcrumb and profile menu into the Workspace\/Overview\/Activity\/TeamMembers headers and replaces the inline sidebar quick-add with the new dialog. Also adds an assignee picker to the task detail modal (there was no way to actually assign a task to someone before this) and lets a manager attach a note when reassigning. The note is stored on the relevant activity-log entry and surfaces in both the task's own activity history and the global Activity page."
},
{
"day": 11,
"date": "2026-08-03",
"content": "Güne, her zamanki gibi Daily toplantısında cuma gününün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım. Ardından bir önceki günün akşamında açtığımız Ollama entegrasyonu ve tasarım sistemi çalışmasının üzerine, yeni bir branch açarak başladım. Cuma günkü işin PR'ı henüz onaylanmamıştı, bu yüzden bugünkü çalışmayı da onun üzerine zincirleyerek ilerledim.Günün asıl hedefi, yapay zekanın bir proje açıklamasını okuyup bunu otomatik olarak alt görevlere bölmesiydi. Bunun için backend tarafında, kurduğumuz yerel yapay zeka modelini çağıran ve ondan görev listesi öneren yeni bir uç nokta (endpoint) yazdım. Kullanıcı bir görev açıklaması girdiğinde model bunu anlamlı alt görevlere bölüyor, bu öneriler veritabanına \"bekliyor\" durumunda kaydediliyor. Ardından bu öneriyi onaylayıp gerçek görevlere çevirebilen ya da reddedebilen ikinci bir uç nokta ekledim. Her iki uç nokta için de üye olmayan birinin erişememesi, geçersiz verilerin reddedilmesi gibi durumları kapsayan testler yaptım.Backend tarafı bittikten sonra, aslında bir sonraki güne planlanmış olan arayüz kısmına da bugünden başladım. Kullanıcının görev açıklamasını yazıp öneri isteyebildiği, gelen alt görevleri düzenleyip onaylayabildiği ya da reddedebildiği bir pencere tasarladım ve bunu çalışma alanı sayfasına bağladım.Bunların yanında, günün ortasında sayfanın genel görünümüyle ilgili bir fikrim oldu: koyu lacivert temanın çok kurumsal durmadığını düşünüp açık tonlu bir tema denemek istedim. Önce sadece çalışma alanı sayfasında deneme yaptım, beğenilince aynı temayı giriş\/kayıt ekranlarından açılış sayfasına kadar uygulamanın tüm sayfalarına yaydım. Arka plan rengini de rastgele seçmek yerine, logomuzun kendi renginden türeterek daha bütünlüklü bir görünüm elde etmeye çalıştım.Bu değişiklikleri test ederken profil ikonuna tıklayınca menünün hiç açılmadığını fark ettim. İncelediğimde, kullandığımız arayüz kütüphanesinin zorunlu tuttuğu bir sarmalayıcı eksik olduğu için menünün her seferinde sessizce hata verip çöktüğünü buldum; bunu düzelttim ve profil menüsü artık düzgün açılıyor.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip GitHub'a gönderdim. Tüm bu değişiklikleri test ederek doğruladıktan sonra günün pull request'ini açtım.Git Commit Mesajları:[11:21] (1586129) Add the backend for AI-assisted task splitting Adds a prompt that asks the interactive local model to break a task or project description into subtasks as strict JSON, a POST endpoint that generates and stores the suggestion as pending, and a PATCH endpoint that creates the real tasks (flagged ai_generated) on accept or just updates the status on reject. Edited subtask lists are re-validated against the schema before anything is created. The suggest\/review\/edit\/approve UX that consumes these endpoints is tomorrow's work — today only covers the backend half.[14:52] (6d173d0) Start the AI task-split suggest\/review\/approve UI Adds a \"Yeni görev başlığı\" adjacent \"AI ile Öner\" button that opens a dialog: describe the work, get a suggested subtask list back from the backend, edit titles\/hours or add\/remove rows, then accept (creates the real tasks, picked up by the existing Kanban realtime subscription) or reject. Wires the AITaskSuggestion type through. This is a head start on tomorrow's planned frontend work; polish continues then.[17:26] (fea8e01) Trial a light theme on the Workspace page Adds a .light-theme token set alongside the existing dark one and converts Workspace and everything it renders (Kanban board\/cards, task detail modal, project\/AI-suggestion dialogs, empty states, breadcrumb, profile menu, skeletons, logo) off hardcoded white\/black opacity utilities onto the shared CSS variables, so they follow whichever theme class wraps them. Portaled dialog\/dropdown content gets the theme applied explicitly since portals sit outside the page's own wrapper in the DOM. Scoped to Workspace only, to gauge the direction before touching the rest of the app.[18:05] (502cc5f) Tint the light theme's background from the logo's own color Softens the logo for light backgrounds (brightness-150 saturate-75 instead of the dark-theme brightness-200 saturate-150) so it doesn't read as too heavy against a pale surface, and changes the light theme's page background from a neutral gray to a very pale tint of the logo's teal, with white cards on top — the same relationship Jira's own light theme has to its blue mark.[18:20] (c3caa0b) Extend the light theme to every remaining page Auth screens, Home, Overview, Team Members, Activity, invite-accept, and the public landing page now use the same light-theme tokens and Logo\/ProfileMenu light variants as the Workspace trial page, instead of the dark navy gradient background.[18:37] (a0f0204) Fix profile menu not opening due to missing Menu.Group wrapper Base UI's Menu.GroupLabel throws when rendered without a Menu.Group ancestor, which silently crashed the whole dropdown (and its parent tree) every time the profile avatar was clicked. Wrapping the email label in DropdownMenuGroup fixes it."
},
{
"day": 12,
"date": "2026-08-04",
"content": "Güne, her zamanki gibi Daily toplantısında bir önceki günün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım.Ardından önce dünün üzerine zincirlediğim yeni dalı açtım, ama bu sırada beklenmedik bir şey fark ettim: son iki günün onaylanan işleri aslında ana koda hiç ulaşmamış, her biri bir önceki günün dalına birleşmiş kalmıştı. Bunu netleştirip bugünkü çalışmayı yine zincirleyerek sürdürmeye, ama gün sonunda açacağım pull request'i doğrudan ana kola yönlendirmeye karar verdim, böylece üç günün birikmiş işi tek seferde ana koda taşınmış olacaktı.İlk iş olarak artık kullanılmayan eski bir logo dosyasını temizledim. Ardından açılış sayfasında iki sorunu düzelttim: üst kısımda gereksiz büyük bir boşluk vardı, bunun sebebinin içerik hizalamasından kaynaklandığını bulup düzelttim. Ayrıca sayfada duran Kanban görseli çok eski ve uygulamanın güncel görünümüyle uyuşmuyordu, onu kaldırıp uygulamanın kendi renkleriyle kodla çizilmiş bir önizlemeyle değiştirdim.Sonra yapay zeka özelliklerimiz üzerine araştırmalar yaptım, hangi özelliğin ne zaman geleceğini gözden geçirdim. Bu sırada planda olmayan yeni bir fikir düşündüm: tamamlanan görevlerden tek tıkla, paylaşılabilir bir sprint özeti üreten bir özellik. Bunu ileri bir güne ertelemek yerine bugüne, mevcut günün kapsamına ek olarak ekledim. Backend tarafında görevleri toplayıp yapay zekaya özetleten bir uç nokta, arayüzde de bunu tetikleyip sonucu kopyalanabilir şekilde gösteren bir pencere yaptım.Bu özelliği test ederken, daha önce kurduğumuz görev bölme özelliğinin bazen bozuk Türkçe kelimeler ürettiğini fark ettim. Araştırınca, kullandığımız küçük modelin Türkçe karakterlerde zorlandığını gördüm. Hem modeli daha güçlü Türkçe üreten bir alternatifle değiştirdim hem de üretimdeki rastgeleliği azalttım, bu ikisi birlikte sorunu gerçek anlamda çözdü.Bir ara sistemin yavaşladığını fark ettim. İlk başta yapay zeka modelinden şüphelendim ama araştırınca asıl sebebin, gün içinde birkaç kez yeniden başlattığım sunucuların düzgün kapanmayıp arka planda birikmesi olduğunu gördüm; gereksiz olanları kapatınca sorun çözüldü.Günün sonlarına doğru, sayfanın kurumsal görünümünü daha da geliştirmek için karanlık ve aydınlık tema arasında geçiş yapabilen bir anahtar ekledim. Kullanıcının tercihi tarayıcıda hatırlanıyor. İlk denemede koyu tema fazla siyaha kaçmıştı, geri bildirim üzerine daha doygun, gerçek bir lacivert tonuna çevirdim.Gün sonunda, son üç günün tüm işini kapsayan pull request'i ana kola karşı açtım, çakışma olmadığını da kontrol edip teyit ettim.Git Commit Mesajları:[10:36] (01346d6) Remove the unused old logo asset frontend\/public\/logo.png was the previous arrow-wordmark logo; the app now uses logo2.png everywhere, so this file was dead weight.[12:57] (26c7e56) Fix landing page hero spacing and replace the stale Kanban mockup The hero's two-column grid was vertically centering both columns, which pushed the headline down to match the taller product mockup's height and left a large empty gap above it. Switched to top-aligned columns instead. Also swapped the static kanban-board.png (an old mockup that didn't match the app's current branding) for a hand-coded preview built with the same tokens as the rest of the light theme.[14:12] (afb0469) Add a one-click AI sprint summary feature Generates a short, copyable release-notes-style summary from tasks completed in the last 7 days for a project. Unlike task splitting, this is read-only (no suggest\/approve step) since it doesn't create or modify any data.[15:26] (a0b53d7) Fix garbled Turkish output from the interactive AI model llama3.2:3b was hallucinating malformed Turkish words and non-Turkish characters in generated task titles (e.g. \"işlevelleri\", \"Yapă\"). Switched the interactive model to qwen2.5:3b-instruct-q4_K_M, which produces grammatically correct Turkish, and lowered the generation temperature to 0.3 to further reduce hallucinated wording.[18:05] (d3a4371) Remove the unused old Kanban mockup image The landing page now renders its Kanban preview with real components instead of this static screenshot.[18:32] (3ce88c0) Add a dark\/light theme toggle and richen the dark palette Adds a ThemeProvider (persisted to localStorage) and a toggle in the profile menu across the dashboard pages and the Home welcome screen. Also reworked the dark theme's background\/surface colors into a richer navy instead of the previous near-black gray."
},
{
"day": 13,
"date": "2026-08-05",
"content": "Güne, her zamanki gibi Daily toplantısında bir önceki günün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım.Bugünün hedefi, plana göre gecikme riski skorlaması olduğu için önce yeni bir çalışma dalı açtım. Bu branch’i dünküne zincirleme yöntemiyle bağlayarak açtım çünkü dünden kullanmam gereken özellikler vardı.Asıl işe, gecikme riskini hesaplayan bir motor yazarak başladım. Risk skorunu yapay zekaya hesaplattırmak yerine, sayısal ve kural tabanlı bir mantıkla hesapladım. Bir görevin son tarihine ne kadar kaldığına, beklenen ilerlemeye göre ne kadar geride olduğuna ve o projede geçmişte görevlerin ortalama ne kadar sürede tamamlandığına bakarak 0 ile 100 arasında bir risk puanı üretiyor. Yapay zekanın rolünü ise bu puanı kullanıcıya doğal, anlaşılır bir Türkçe cümleyle açıklamakla sınırlı tuttum. Çünkü sayısal tahminlerde yapay zekaya güvenmek yerine kesin kurallara dayanmak daha sağlıklı.Bu skoru hesapladıktan sonra, panel ekranına seviyesi en yüksek görevleri listeleyen bir bölüm ekledim. Her görevin yanına, tıklanınca yapay zekadan \"bu görev neden riskli\" açıklamasını isteyen bir buton koydum.Gün planındaki asıl hedefi bitirdikten sonra, aklıma gelen bir fikri yapmaya karar verdim : Görevlere harcanan zamanı takip etme özelliği. Bunun için veritabanına yeni bir tablo eklemem gerekti ve görev detay ekranına hem manuel süre girişi hem de başlat-durdur şeklinde çalışan bir kronometre ekledim. Böylece bir görev için \"tahmini 4 saat, şu ana kadar harcanan 6 saat\" gibi bir karşılaştırma görülebiliyor. Bu veriyi de boşa harcamayıp risk motoruna bağladım. Bir görevde harcanan süre tahmini aşıyorsa risk puanı da buna göre yükseliyor, ama henüz hiç süre girilmemiş görevlerde eski hesaplama aynen çalışmaya devam ediyor.Son olarak da birden fazla projesi olan kullanıcılar için risk panelini proje bazında filtreleyebilme imkânı ekledim. Panelin kullanılabilirliğini artırmayı amaçladım.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip pushladım. Gün sonunda bugün yapılan her şeyi özetleyen PR'ı açtım. Bu PR'ı da, aynı zincirleme mantığıyla, dünkü tamamlanmamış PR'ın üzerine kurdum; o PR merge olduğunda bugünkü PR'ın hedefi otomatik olarak ana dala dönecek.Git Commit Mesajları:[10:39] (622523a) Add a rule-based delay risk scoring engine Scores tasks 0-100 for delay risk using deadline proximity, progress lag against the expected pace, and the project's historical completion velocity. Pure function, no LLM involved.[12:11] (d6a1443) Add an AI-generated natural-language explanation for task delay risk New POST \/api\/tasks\/:taskId\/risk-explanation endpoint: computes the rule-based risk score for a task, then has the interactive LLM turn it into a short Turkish explanation of why the task is (or isn't) at risk.[15:09] (7929638) Surface delay risk scores on the dashboard New GET \/api\/dashboard\/risk endpoint lists the current user's tasks sorted by delay risk score. Added a panel to the Overview page's Detaylar tab showing that list, with a per-task button to request an AI explanation on demand.[15:59] (ebca1df) Add task time tracking and factor logged effort into delay risk Adds a task_time_entries table plus GET\/POST \/api\/tasks\/:taskId\/time-entries for manual effort entries and a stop\/start timer in the task detail modal, alongside an estimated vs. spent hours comparison. The delay risk engine now takes an optional effort factor: time logged beyond a task's estimate raises its risk score. The factor is excluded entirely (not just zeroed) when no time-tracking data exists yet, so the existing risk scores are unaffected until someone starts logging time. The AI risk explanation prompt also surfaces the estimated vs. spent comparison when available.[17:20] (54626b9) Let the delay risk panel be filtered by project GET \/api\/dashboard\/risk now accepts an optional projectId query param, filtered server-side before the top-N cutoff so a risky task in one project can't get crowded out by another project's tasks. The Overview page's risk panel gains a project dropdown, shown only when the user belongs to more than one project."
},
{
"day": 14,
"date": "2026-08-06",
"content": "Güne, her zamanki gibi Daily toplantısında bir önceki günün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım. Bugünün hedefi, yapay zeka tarafındaki hata yönetimini güçlendirmek olduğu için önce yeni bir çalışma dalı açtım. Bu branch'i de dünküne zincirleme yöntemiyle bağlayarak açtım, çünkü dünkü PR henüz onaylanmamıştı ve bugünkü işler onun üzerine kurulu olacaktı.Asıl işe, modele gönderdiğim talimatları tek tek gözden geçirerek başladım. Görev bölme, sprint özeti ve risk açıklaması gibi özelliklerde modelin bazen cevabına yanlışlıkla sayı ya da İngilizce kelime karıştırdığını fark etmiştim. Bunu önlemek için talimatlara daha net sınırlar koydum; örneğin modele ham sayılar yerine \"yüksek\", \"orta\", \"düşük\" gibi sözel ifadeler vererek, sayıları kendi cümlesine karıştırmasının önüne geçtim.Sonra modelden gelen cevapların beklediğim formatta olup olmadığını kontrol etme şeklimi değiştirdim. Daha önce bunu elle yazdığım kontrollerle yapıyordum, ama bu yöntem hem bakımı zor hem de hata mesajları belirsizdi. Bunun yerine, gelen her cevabı ortak bir şablona göre doğrulayan hazır bir kütüphaneye geçtim. Böylece hem kod sadeleşti hem de bir cevap şablona uymadığında tam olarak hangi alanın neden hatalı olduğunu görebiliyorum.Bu doğrulamayı kurduktan sonra, model şablona uymayan bir cevap verdiğinde sistemin sadece hata verip durmasını istemedim. Bunun yerine, hata oluştuğunda modele kendi hatasını gösterip bir kez daha deneme fırsatı veren bir düzeltme mekanizması ekledim. Böylece küçük bir format hatası yüzünden kullanıcının elle tekrar denemesi gerekmiyor. Ayrıca yerel modele giden isteklere bir zaman sınırı koydum; model bir sebeple çok uzun süre cevap vermezse sistem sonsuza kadar beklemek yerine belirli bir süre sonra hatayı bildirip devam ediyor.Gün planındaki asıl hedefi bitirdikten sonra, kullanım sırasında fark ettiğim iki küçük arayüz sorununu da düzeltmeye karar verdim. Görev detay penceresi dikeyde çok uzamıştı, onu daha yatay ve ferah bir iki sütunlu görünüme kavuşturdum. Ayrıca giriş yaptıktan sonra karşılaşılan karşılama ekranından ana sayfaya geri dönebilecek bir yol olmadığını fark ettim, oraya da bir bağlantı ekledim.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip pushladım. Gün sonunda bugün yapılan her şeyi özetleyen PR'ı açtım. Bu PR'ı da, aynı zincirleme mantığıyla, dünkü tamamlanmamış PR'ın üzerine kurdum; o PR merge olduğunda bugünkü PR'ın hedefi otomatik olarak ana dala dönecek.Git Commit Mesajları:[11:34] (a822ea7) Improve prompts for task splitting, sprint summaries, and risk explanations Task split: bound subtask count to 2-6, require Turkish, forbid vague \"description is unclear\" non-answers, and disallow prose outside the JSON payload. Sprint summary: forbid preamble sentences, cap bullet count, and forbid inventing tasks not in the completed list. Risk explanation: the model was echoing raw scores and English level names (e.g. \"75\/100\", \"high\") back into its Turkish explanation. Feed it qualitative Turkish labels instead of numbers and tell it explicitly not to use digits, percentages, or English words. Verified against the live Ollama model.[12:49] (30d6274) Validate AI JSON responses against a shared Zod schema Replaces the hand-rolled isValidSuggestion type guard in the task split route with a Zod schema (ai\/schemas.ts) and a small parseAIResponse helper (ai\/parseAIResponse.ts) that both the AI's raw suggestion and a user's edited version are checked against. The main win is error quality: failures used to collapse into a generic \"doesn't match the expected schema\" message, now they name the exact field and reason (e.g. \"subtasks.0.title: Too small: expected string to have >=1 characters\").[14:14] (7321345) Add request timeouts and a schema-correction retry for AI calls OllamaProvider now aborts a request after 45s instead of letting it hang indefinitely if the local model stalls. The task split endpoint retries once with a correction prompt (the Zod validation error fed back to the model) when the AI's JSON fails schema validation, instead of failing immediately. Transient errors (network, timeout) skip the retry since a correction prompt wouldn't help there.[16:47] (63918e6) Widen the task detail modal into a two-column layout The modal had grown tall as fields (estimated hours, time tracking) were added, and the time-tracking row's note input was getting truncated. Split it into two columns (main content vs. metadata sidebar) and widened it (max-w-lg -> max-w-2xl), which trades the height for width and gives the time-tracking row enough room. Also capped the modal at 90vh with scroll as a safety net.[17:35] (070d966) Trim landing nav and add a way back from the welcome screen Drop the pricing link from the landing navbar and move Solutions before Features. Make the logo on the post-login welcome page a link back to the landing page, since there was previously no way to navigate back to it."
},
{
"day": 15,
"date": "2026-08-07",
"content": "Güne, her zamanki gibi Daily toplantısında bir önceki günün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım. Bugünün hedefi yeni bir özellik eklemek değil, önceki üç günde yazdığım yapay zekâ özelliklerini gerçek senaryolarla test etmek ve demoya hazırlamaktı. Bu yüzden yeni branch'imi dünkü branch'in üzerine zincirleyerek açtım, çünkü test edeceğim şeylerin çoğu tam olarak dünkü değişikliklere dayanıyordu.İlk olarak görev bölme akışını baştan sona hem API üzerinden hem de tarayıcıda gerçek yapay zekâ modeliyle denedim. Ardından gecikme riski skorunu farklı senaryolarla test ettim: vadesi geçmiş görevler, efor aşımı olan görevler, vadesi olmayan görevler gibi. Bu testler sırasında bir görevin harcanan süresinin tahmini aştığı durumda, yapay zekanın açıklamasına ham sayıların sızdığını fark ettim; oysa bu sayıları modele hiç göstermeyip sözel bir ifadeyle anlatmam gerekiyordu, onu düzelttim. Sonra boş, çok kısa ve çok uzun açıklama gibi uç durumları denedim; kısa açıklamalarda modelin, promptta örnek olarak verdiğim bir başlığı gerçek öneriymiş gibi kopyaladığını gördüm, o örneği kaldırıp modelin açıklamaya özgü kalmasını istedim. En sonunda hata ve yedek mekanizmalarını gerçek model çağrılarıyla tek tek doğruladım.Bunların arasında sprint özeti özelliğini de tarayıcıda test ederken daha ciddi bir sorunla karşılaştım: tek bir görev tamamlanmışken yapay zekâ üç görev listelemiş, ikisini uydurmuştu. Bunu, modele listede kaç görev olduğunu açıkça söyleyip fazladan görev icat etmemesini isteyerek düzelttim ve gerçek modelle tekrar test ederek doğruladım.Planlı testleri bitirdikten sonra iki küçük ekstra özellik daha yaptım. Birincisi, uygulamanın her yerinden Ctrl +K ile açılabilen bir komut paleti; sayfalar arası hızlı geçiş, tema değiştirme ve çıkış yapma gibi işlemleri klavyeden yapabiliyorsun artık. İkincisi, görevleri birbirine \"bekliyor\", \"ilgili\" ya da \"kopyası\" olarak bağlayabildiğim bir özellik; bir görevde eklenen bağlantı, karşı görevde de otomatik olarak ters yönden görünüyor, böylece bir görevin başka bir görevi engellediğini her iki taraftan da görebiliyorsun.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip pushladım. Gün sonunda bugün yapılan her şeyi özetleyen PR'ı açtım.Git Commit Mesajları:[12:13] (b5511eb) Stop two AI prompts from leaking raw content into their output Found via live end-to-end testing with real Ollama: - The risk explanation prompt fed raw estimated\/spent hours to the model while also telling it not to use any numbers; the model often echoed the raw hours anyway. Replaced them with the same qualitative labels used for the other risk factors. - The task-split prompt's example subtask title (\"Giriş formunu tasarla\") sometimes got copied verbatim into real suggestions, especially for vague or short descriptions. Replaced the example with an instruction to stay specific to the given description.[14:36] (7aa6753) Stop the sprint summary prompt from inventing completed tasks Live testing surfaced two issues in the same call: the model sometimes prefixed its answer with the exact intro sentence the prompt named as forbidden (\"İşte özet:\"), and with a single real completed task it fabricated two more that never happened. Reworked the rules to avoid quoting the banned phrase (naming it seems to invite the model to echo it, as seen in today's other prompt fixes) and to state the exact number of tasks the output must cover.[16:07] (60b93aa) Add a Ctrl\/Cmd+K command palette for quick navigation Available on every authenticated page: jump to a section, toggle theme, or sign out without leaving the keyboard.[17:32] (aca73b3) Add a backend for linking tasks to each other New task_dependencies table plus GET\/POST\/DELETE routes for blocked_by, relates_to, and duplicates relations between two tasks in the same project. A task's dependency list includes both directions (what it depends on and what depends on it) so a blocking relationship shows up on both tasks.[18:19] (a06a8a1) Show task dependencies in the task detail modal Lets a task be linked to another as blocked-by, related, or a duplicate, from the same modal used for everything else on a task. A dependency shows on both linked tasks (e.g. \"blocked by\" on one side, \"blocking\" on the other), so the relationship is visible either way it's opened."
},
{
"day": 16,
"date": "2026-08-10",
"content": "Güne, her zamanki gibi Daily toplantısında bir önceki günün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım. Bugünün hedefi çalışma tarzı\/karakter analiziydi. Bu sefer branch'imi önceki günün üzerine değil, doğrudan main'den açtım, çünkü bugünkü iş önceki üç günün eklediği şeylere bağımlı değildi.Asıl işe, bir kullanıcının tamamladığı görevlerden çalışma tarzını çıkaracak veri modelini tasarlayarak başladım. Zamanında teslim oranı, ortalama tamamlama hızı, efor tahmini isabeti, en sık çalıştığı konular ve üstlendiği öncelik seviyeleri gibi ölçülebilir özellikleri hesaplayan, yapay zeka içermeyen saf bir fonksiyon yazmaya çalıştım. Sonra bu özellikleri yapay zekaya gönderip kısa bir doğal dil özeti üretmesini sağlayan bir prompt ve uç nokta ekledim. Bu sefer gerçek zamanlı olmadığı için daha büyük bir modeli (7B) kullandım. Bunu test ederken o modelin bilgisayarımda hiç yüklü olmadığını fark edip indirdim.Demoda gösterebilmek için sentetik bir görev geçmişi oluşturan bir script de yazdım. İlk denememde script'teki tarih hesaplamasında bir hata vardı, zamanında tamamlanması gereken görevler yanlışlıkla geç hesaplanıyordu; gerçek veriyle test edince fark edip düzelttim.Planlı işi bitirdikten sonra, kullanıcı siteyi gezerken landing sayfasındaki \"Kayıt ol\" kutusuna yazılan e-postanın hiçbir yere gitmediğini fark ettim. Onu da düzeltip kayıt sayfasına otomatik taşınacak hale getirdim. Ardından küçük ek özellikler daha ekledim. Veritabanında baştan beri duran ama hiç kullanılmayan bir tabloyu değerlendirip görevlere yorum yazma özelliği ekledim, sonra bir kullanıcının tüm projelerdeki kendine atanmış açık görevlerini tek sayfada gösteren Görevlerim görünümünü ekledim.Gün boyunca yaptığım her değişikliği küçük parçalar halinde, ayrı ayrı commit'leyip pushladım. Gün sonunda PR'ımı doğrudan main'i hedefleyecek şekilde açtım, çünkü bugünkü iş önceki günlerin zincirinden bağımsızdı.Git Commit Mesajları:[12:14] (e08a087) Design the data model for work-style trait analysis A pure function that turns a user's completed task history into measurable traits: on-time delivery rate, average completion speed, effort-estimate accuracy, most-worked-on tags, and priority mix. No AI involved here — this is the rule-based groundwork the analysis prompt will run on.[12:18] (c07cee0) Add the work-style analysis prompt and endpoints GET\/POST \/api\/users\/:userId\/work-style: computes traits from a user's completed tasks, turns them into qualitative descriptions (no raw numbers or English words fed to the model, same lesson as yesterday's prompt fixes), and asks the background model for a short natural- language summary. Viewing is limited to the user themself or someone who shares an organization with them.[14:10] (333bbb1) Seed synthetic task history for a work-style analysis demo A runnable script (npm run seed:work-style) that gives a demo user a believable batch of completed tasks spread over the last ~40 days, so the work-style analysis has something meaningful to show without waiting on weeks of real usage.[15:51] (e7acf41) Carry the landing page's CTA email into the signup form The email field in the \"Ekibinizle hemen başlayın\" section wasn't wired to anything; typing an address there and clicking \"Kayıt ol\" silently discarded it. Now it's passed through as a query param and pre-fills the signup page's email field.[17:54] (2c85344) Add task comments GET\/POST\/DELETE \/api\/tasks\/:taskId\/comments, using the task_comments table that's existed in the schema since day one but never had an endpoint. Any project member can comment; a comment can be deleted by its author or a project admin\/owner. Surfaced in the task detail modal alongside the activity log.[18:35] (74789e8) Add a My Tasks view across all projects GET \/api\/dashboard\/my-tasks returns a user's open (not-done) tasks across every project they're a member of, sorted so the most overdue or soonest-due work leads. Surfaced as a new \"Görevlerim\" page, reachable from the same nav used on Workspace\/Overview\/Activity."
},
{
"day": 17,
"date": "2026-08-11",
"content": "Güne, her zamanki gibi Daily toplantısında bir önceki günün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım. Bugünün hedefi, dün oluşturduğum çalışma tarzı analizini gerçek bir özelliğe bağlamak olduğu için önce yeni bir çalışma dalı açtım. Bu dalı dünkünün üzerine zincirleme yöntemiyle bağladım, çünkü bugünkü işin temeli tamamen dünkü koda dayanıyordu ve o kod henüz ana dala ulaşmamıştı.İlk olarak, görev atama ekranındaki \"atanan kişi\" seçiminde, seçilen kişinin en güncel çalışma tarzı özetini gösterecek şekilde küçük bir ekleme yaptım. Böylece bir görevi kime atayacağına karar verirken, o kişinin genel çalışma alışkanlıkları hakkında ekstra bir yere tıklamadan bilgi sahibi olunabiliyor.Asıl işe, görevin gereksinimleriyle ekip üyelerinin çalışma tarzını eşleştiren bir motor yazarak devam ettim. Bir görevin etiketlerine, önceliğine ve son tarihine bakarak; her aday için o konularda ne kadar deneyimli olduğunu, zamanında teslim geçmişini ve tamamlama hızını karşılaştırıp bir uyum puanı üretiyor. Bu puanı da, tıpkı daha önceki gecikme riski hesaplamasında olduğu gibi, yapay zekaya değil kesin kurallara dayandırdım; çünkü sayısal bir tahmini yapay zekanın hesaplamasına güvenmek yerine, nedeni açıkça bilinen bir kurala dayandırmak daha sağlıklı ve tutarlı sonuç veriyor. Bu motoru çağıran bir uç nokta ekleyip, görev detay ekranına \"önerilen atamalar\" adında bir bölüm yerleştirdim; burada her aday için hem uyum yüzdesi hem de bu puanın arkasındaki gerekçe düz bir Türkçe cümleyle gösteriliyor.Sonrasında bu öneriyi kullanılabilir hale getirdim. Önerilen bir kişiyi tek tıkla atayabilme, ya da uygun görmezse listeden kaldırabilme imkânı ekledim. Atama butonunu da doğrudan görevin gerçek atama mekanizmasına bağladım, yani tıklandığı anda atama kalıcı olarak kaydediliyor ve aktivite geçmişine işleniyor; ayrı bir kaydetme adımına gerek kalmıyor.Gün planındaki asıl hedefi bitirdikten sonra, aklıma gelen bir fikri de hayata geçirdim: çalışma tarzını sadece geçmiş görevlerden çıkarmak yerine, kişilerin kendi beyanını da almak. Bunun için kayıt olduktan sonra kullanıcıya kısa bir \"bu platformu ne için kullanacaksın\" sorusu sormaya başladım, ayrıca profil sayfasına ekip içindeki çalışma tarzına dair üç kısa soruluk bir öz-değerlendirme ekledim. Bu cevaplar öznel olduğu için, hesaplanan analizle karıştırılmıyor; atama ekranında ayrı ve \"kendi beyanı\" olarak etiketlenmiş şekilde gösteriliyor.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip pushladım. Gün sonunda bugün yapılan her şeyi özetleyen PR'ı açtım. Bu PR'ı da, aynı zincirleme mantığıyla, dünkü tamamlanmamış PR'ın üzerine kurdum; o PR merge olduğunda bugünkü PR'ın hedefi otomatik olarak ana dala dönecek.Git Commit Mesajları:[11:10] (bbbe061) Show assignee's work-style summary in the task assignment screen Fetches the selected assignee's latest work-style profile and displays the summary below the assignee dropdown, with a fallback message when no profile has been generated yet.[12:44] (f99daf6) Add rule-based logic to match tasks with well-suited assignees Scores each candidate against a task's tags, priority, and due date using their work-style traits (topic overlap, on-time reliability, completion speed), with plain-language reasons behind each score.[14:11] (c9db49d) Add a suggested-assignees panel to the task detail screen Adds a GET endpoint that scores a task's project members against the task's tags, priority, and due date using their work-style traits, and surfaces the top candidates in the task modal with a match percentage and plain-language reasons.[15:22] (b8ce4c2) Let the user accept or dismiss a suggested assignee The Ata button pre-fills the assignee dropdown with that candidate; Reddet removes the card from the suggestion list.[16:32] (68f27a9) Wire the suggested-assignee action to the task assignment endpoint Clicking Ata now saves the assignment immediately through the task PATCH endpoint instead of only pre-filling the dropdown, and logs it as an activity entry.[19:12] (aa4d3c5) Add a self-reported work-style survey alongside the computed analysis Adds a short \"what will you use this for\" onboarding step after signup and a profile page with a few multiple-choice questions about collaboration, problem-solving, and deadline pressure. The answers are kept separate from the task-history-based work-style analysis and shown labeled as \"Kendi Beyanı\" in the assignment screen, since self-reported and measured behavior shouldn't be blended into one score."
},
{
"day": 18,
"date": "2026-08-12",
"content": "Güne, her zamanki gibi Daily toplantısında bir önceki günün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım. Bugünün planı otomatik ilerleme özeti sistemiydi, bu yüzden yeni bir çalışma dalı açtım; bu sefer bir önceki güne zincirleme bağlamadım çünkü bugünkü iş, henüz ana dala kavuşmamış eski bir günün koduna bağımlı değildi, doğrudan ana daldan bağımsız ilerleyebilirdi.İlk iş olarak, arka planda belirli aralıklarla otomatik çalışabilen genel bir zamanlayıcı altyapısı kurdum. Sonrasında asıl mantığa geçtim: her proje için bir haftalık dönemi baz alan, tamamlanan görev sayısı, geciken görev sayısı ve tamamlanma oranı gibi somut verileri toplayan bir yapı yazdım. Buradaki mantığım yine geçmiş günlerdeki gibiydi; sayısal ve karşılaştırılabilir veriyi kurallara dayanarak kendim hesaplıyorum, yapay zekaya sadece bu hazır veriyi alıp akıcı ve anlaşılır bir Türkçe özet cümlesine dönüştürme görevini veriyorum. Böylece özetin içeriği güvenilir kalıyor, yapay zeka sadece anlatım tarafında devreye giriyor.Bu mantığı gerçek bir arka plan işine bağladım. Belirli aralıklarla tüm projeler için otomatik olarak özet üretilip veritabanına kaydediliyor. Ardından bu özetlerin kullanıcıya nasıl ulaşacağını düşündüm ve panele bir bildirim zili ekledim; kullanıcı zile tıklayınca, üyesi olduğu projelerin en güncel ilerleme özetlerini bir liste halinde görebiliyor. Aynı veriyi panonun ana ekranına da bir bölüm olarak ekleyerek, kullanıcı bildirim zilini hiç açmasa bile en güncel özetleri doğrudan karşısında bulmasını sağladım.Planlanan işi bitirdikten sonra, gerçek kullanıcı testinden çıkan bir gözlemi değerlendirdim. İki farklı hesapla denediğimde, bir hesaptan diğerine gönderilen ekip daveti, davet edilen hesapta hiçbir şekilde görünmüyordu. İnceleyince bunun bir hata değil, mevcut tasarımın eksik bir noktası olduğunu fark ettim; davet sadece bir link üretiyordu ve bu linkin elle kopyalanıp karşı tarafa iletilmesi gerekiyordu. Bunu bugüne ek bir görev olarak eklemeye karar verdim ve davet edilen kullanıcının kendi hesabına giriş yaptığında bekleyen davetlerini otomatik olarak görüp tek tıkla kabul edebileceği bir yapı kurdum.Bu geliştirmeyi tamamlayınca, projeye daha profesyonel bir dokunuş katmak için neler yapabileceğimi düşündüm ve davet sisteminin gerçek bir e-posta servisiyle çalışmasına karar verdim. Bunun üzerine bir e-posta gönderim servisi entegre ettim. Artık bir davet oluşturulduğunda, davet edilen kişiye içinde davet linki olan gerçek bir e-posta otomatik olarak gidiyor. Servise ait bir bağlantı anahtarı tanımlı değilse sistem hata vermeden sessizce bu adımı atlıyor, böylece bu ayar yapılmadan da geliştirme ortamı sorunsuz çalışmaya devam ediyor.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip pushladım. Gün sonunda bugün yapılanların tamamını özetleyen PR'ı açtım. Bu PR'ı, bugünkü iş önceki günün koduna bağımlı olmadığı için doğrudan ana dal üzerinden açtım.Git Commit Mesajları:[11:11] (f2ba82f) Add cron scheduling infrastructure for background jobs A generic scheduler that runs an async job on a cron expression (defaults to daily), catching and logging failures instead of crashing the process. Will drive the progress-summary job.[13:09] (90b63ed) Add progress summary data collection and prompt building Computes a project's completed\/in-progress\/overdue task counts and completion rate for a given period, and builds a prompt that grounds the AI's summary in those exact numbers rather than letting it guess.[13:47] (b33511d) Generate and persist project progress summaries Adds the job that walks every project, builds a summary from its task data, and saves it to progress_summaries, plus endpoints to read the latest saved summary and trigger generation on demand. Wires the scheduler into server startup.[15:58] (d4f9daf) Add a notification feed for generated progress summaries A bell icon in the header lists each project's latest progress summary across the user's projects, backed by a new dashboard endpoint that joins progress_summaries with project names.[16:50] (ba910cc) Show the latest progress summaries on the dashboard Adds a panel at the top of the Genel Bakış tab listing each project's most recent AI-generated progress summary, reusing the dashboard progress-feed endpoint already backing the notification bell.[17:36] (e564b9d) Show pending invitations to the invited user on login Adds GET \/api\/invitations to list the current user's own pending organization invitations, and a banner on the Workspace page so an invited user sees the invite and can accept it in one click instead of needing the shared link.[18:31] (c2acfeb) Send real invitation emails via Resend Adds a Resend-backed email service and wires it into invitation creation so the invited user receives an actual email with the invite link, instead of relying solely on the inviter copying and sharing the link manually. Falls back to a no-op with a warning when RESEND_API_KEY isn't configured, so local dev keeps working without an API key."
},
{
"day": 19,
"date": "2026-08-13",
"content": "Güne, her zamanki gibi Daily toplantısında bir önceki günün özetini paylaşarak ve bugünün hedeflerini belirleyerek başladım. Bugünün planı uçtan uca test, performans\/arayüz cilası ve bug fix'lerdi; bunun için yeni bir çalışma dalı açtım ve bunu dünkü güne zincirleme yöntemiyle bağladım, çünkü dünkü iş henüz ana dala kavuşmamıştı ve bugünkü testlerin gerçek anlamı olması için dünkü özellikleri de kapsaması gerekiyordu.İlk iş olarak, projenin en kritik iki akışını gerçek bir tarayıcıda uçtan uca test eden bir altyapı kurdum. Organizasyon oluşturma, proje ve görev açma, görevi Kanban panosunda sürükleyerek taşıma; ve ayrı bir senaryo olarak, iki farklı hesap arasındaki davet akışının baştan sona çalışması. Bu testler kendi test kullanıcılarını oluşturup işi bitince temizliyor, yani istediğim zaman tekrar tekrar güvenle çalıştırabiliyorum.Sonra performans ve arayüz cilasına geçtim. Bunu yaparken beklemediğim bir şey buldum: projenin gerçek production derlemesi aslında sessizce bozukmuş, daha önce kullandığım kontrol komutu bunu yakalamıyormuş çünkü ayarlardaki bir detay yüzünden aslında hiçbir şeyi gerçekten denetlemiyormuş. Bunu düzelttim ve bundan sonra gerçek derleme komutuyla doğrulamaya başladım. Ayrıca uygulamanın tüm sayfalarını tek seferde değil, kullanıcı o sayfaya gittiğinde yüklenecek şekilde ayırdım; böylece ilk açılan sayfa çok daha hafif hale geldi.Bug fix kısmında tahmin yürütmek yerine, dünden bugüne eklenen tüm koda çok yönlü bir kod incelemesi yaptırdım. Buradan çıkan gerçek sorunlardan beşini düzelttim: bir görevin risk açıklamasıyla risk puanının birbirini yalanladığı bir durum, bir hata sonrası bir daha hiç geri gelmeyen \"tekrar dene\" butonu, proje filtresini hızlı değiştirince eski bir sonucun ekranda kalması, süre kaydında bir doğrulama açığı, ve aktivite akışında bazı işlemlerin kullanıcıya ham kod adıyla görünmesi.Planlanan işi bitirince projeyi gerçekten canlıya almaya karar verdim. Arayüzü Vercel'e, sunucu tarafını Render'a deploy ettim. Yerel bilgisayarımda çalışan yapay zeka modelini de bir tünel aracıyla dışarıya açarak canlı ortamın da yapay zeka özelliklerini kullanabilmesini sağladım. Bu sırada canlı ortama özgü bir sorun daha çıktı: tarayıcıda bir sayfaya doğrudan gidildiğinde sayfa bulunamıyordu, bunu da bir yönlendirme kuralı ekleyerek çözdüm. Sonunda tüm sistemi canlı ortamda uçtan uca test ederek çalıştığından emin oldum.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip pushladım. Gün sonunda bugün yapılanların tamamını özetleyen PR'ı açtım. Bu PR'ı da, aynı zincirleme mantığıyla, dünkü tamamlanmamış PR'ın üzerine kurdum; o PR merge olduğunda bugünkü PR'ın hedefi otomatik olarak ana dala dönecek. PR açıklamasına canlı demo linkini de ekledim.Git Commit Mesajları:[11:17] (6ef893d) Add Playwright end-to-end tests for the core workflow and invitations Adds a root-level Playwright test suite covering the two most critical user journeys - creating an org\/project\/task and moving it across the Kanban board, and the full invitation flow between two accounts. Tests create and tear down their own Supabase test users so they're safe to re-run.[13:43] (d8c5969) Fix a broken production build and code-split routes for performance Fixes a type error in the Landing page mockup data that was silently breaking npm run build (the plain tsc --noEmit check used earlier wasn't actually validating anything due to the root tsconfig's project-reference setup). Also switches every route in App.tsx to React.lazy, cutting the single 1.2MB bundle down to per-page chunks - the landing page alone now ships ~17KB instead of the whole app.[15:20] (0093f1a) Fix risk-explanation consistency, a stuck retry button, and other edge cases - Align the risk-explanation route's effort-data guard with the scoring engine's (require estimatedHours > 0), fixing a case where a 0-hour estimate made the AI text claim effort was \"severely exceeded\" while the score showed no effort risk at all. - Let the \"why is this risky\" button reappear as a retry after a failed AI call instead of disappearing for good. - Guard the dashboard risk-task fetch against out-of-order responses when the project filter changes quickly. - Validate the rounded minutes value when logging time, so an amount that rounds down to zero is rejected with a 400 instead of hitting the database's check constraint. - Add Turkish descriptions for the time_logged and dependency_added activity types in both the activity feed and the task detail modal. - Rename a landing page section's stale \"fiyatlandirma\" id now that it's a generic sign-up CTA, not a pricing section.[16:34] (a15f466) Add a Render blueprint for backend deployment Defines the backend as a Render web service (build\/start commands, required env vars as unsynced secrets) so the repo can be connected directly from the Render dashboard via Blueprints.[17:59] (3c20938) Add a Vercel SPA rewrite so client-side routes don't 404 Direct navigation to a client-side route like \/login was returning a 404 on Vercel because there was no fallback rewrite to index.html. Also adds the .gitignore Vercel's CLI generates for its local project-link metadata and env files."
},
{
"day": 20,
"date": "2026-08-14",
"content": "Güne, her zamanki gibi Daily toplantısında başladım. Önceki günün özetini paylaştım. Bugünün hedeflerini belirledim. Ayrıca staj arkadaşlarımla da vedalaştım. Bugünün planı final dokümantasyon, demo senaryosu, sunum hazırlığı ve retrospektifti. Yeni bir çalışma dalı açtım. Bunu dünküne zincirleme yöntemiyle bağladım. Çünkü dünkü iş henüz ana dala kavuşmamıştı.İlk iş final dokümantasyondu. README'yi baştan geçirdim. İçinde hiç doldurulmamış bir kurulum bölümü vardı, onu gerçek adımlarla yazdım. Özellik listesini güncel haliyle genişlettim. Canlı demo linkini ekledim. Veritabanı diyagramına da, zaman içinde eklenip hiç işlenmemiş tabloları ekledim.Sonra dünkü canlı testte bulduğum bir hataya döndüm. Kayıt olan kullanıcılara giden onay e-postası, canlı ortamda bile localhost'a yönlendiriyordu. Kodda bir eksik vardı, düzelttim. Bu arada demo adresini daha düzgün bir isme taşıdım. Bunu yaparken yeni bir sorun çıktı, adrese girenler bir giriş ekranına takılıyordu. Bunun sebebi bir erişim ayarıymış, onu da düzelttim.Bir de kalıcı bir sorunu çözdüm. Yapay zeka özellikleri canlıda çalışmıyordu. Sebebi, bilgisayarımı dışarıya açan tünelin ölmüş olmasıydı. Tüneli yeniden başlattım ama asıl sorun şuydu, her yeniden başlatmada adresi değişiyor ve sunucuyu elle güncellemem gerekiyordu. Bunun için küçük bir script yazdım. Tek bir komutla hem tüneli başlatıyor hem sunucudaki adresi otomatik güncelliyor. Böylece bir daha panel üzerinden elle bir şey yapmama gerek kalmıyor. Planın geri kalanında kapanış sunumu için bir taslak hazırladım.Gün boyunca yaptığım her değişikliği küçük parçalar halinde commit'leyip pushladım. Gün sonunda bugünü özetleyen PR'ı açtım. Bunu da dünkü tamamlanmamış PR'ın üzerine kurdum. O PR merge olunca, bugünkü PR'ın hedefi otomatik olarak ana dala dönecek.Bugünle birlikte 20 günlük stajımın sonuna geldim.Git Commit Mesajları:[11:05] (aca9685) Bring the README and ERD up to date with the finished product The README's setup section was a placeholder left over from Day 2, and the feature list, status badge, and tech stack table hadn't kept pace with everything shipped since. Adds a live demo link, real install\/run\/test steps, and documents time tracking, task dependencies, email invitations, and assignment suggestions. The ERD gains the tables that were added along the way but never diagrammed: organization invitations, project members, time entries, and task dependencies.[13:49] (b9eaec2) Fix signup confirmation links and update the demo domain signUp() didn't pass an emailRedirectTo, so Supabase built confirmation links from its dashboard Site URL setting - which was still pointing at localhost, sending confirmed users there instead of the live site. Now it redirects to wherever the app is actually running. Also updates the README's demo link to a cleaner vantage-proje.vercel.app alias instead of the auto-generated one.[14:44] (e1cc30d) Add a step-by-step demo scenario document Adds a timed, step-by-step walkthrough for presenting Vantage live, covering the full flow from the landing page through AI task splitting, the Kanban board, delay risk scoring, team invitations, work-style-based assignment, and progress summaries. Linked from the README.[14:53] (8b333ea) Add a closing presentation outline, drop the demo scenario doc Adds a 14-slide outline covering the problem, solution, architecture, the rule-based-scoring-plus-AI-explanation principle, testing, deployment, and lessons learned, for the closing internship presentation. Removes the separate demo scenario document added earlier today - it duplicated ground the presenter already knows the product well enough to cover without a script.[18:27] (c59e7c7) Add a script to sync the Ollama tunnel URL to Render automatically Every time the Cloudflare quick tunnel restarts it gets a new random URL, which previously meant manually editing OLLAMA_HOST in Render's dashboard each time. This script starts the tunnel, waits for it to become reachable, and pushes the new URL to Render via its API, so bringing the live demo's AI features online is a single `npm run tunnel` instead of a dashboard trip. Requires a local, gitignored .env with RENDER_API_KEY and RENDER_SERVICE_ID.[19:01] (24c2438) Stop the README from calling the project finished Swaps the \"Tamamlandı\" status badge and closing line for wording that reflects an ongoing, improvable project instead of a closed one."
}
]
},
"20": {
"name": "Hakan Üzer",
"email": "hakanuzer1@gmail.com",
"repo": "https:\/\/github.com\/Emresatil\/Recycle-Rush-VR\/tree\/release\/final-integration-and-bugs",
"github_username": "Hakan460",
"start_date": "2026-07-01",
"end_date": "2026-08-30",
"total_days": 43,
"filled_days": 42,
"entries_sample": {
"first": {
"day": 1,
"date": "2026-07-01",
"content": "Konu: Unity VR Proje İskeletinin Oluşturulması ve Versiyon Kontrol (Git) AyarlarıYapılan Çalışmalar:Recycle Rush VR projemizin geliştirme süreçlerine başlamak adına, performans ve stabilite göz önünde bulundurularak projenin ana iskeleti Unity 3D (LTS) sürümü üzerinden başarıyla oluşturuldu.Ekip içi versiyon kontrol süreçlerinin (Git & GitHub) sorunsuz ve temiz ilerlemesi amacıyla projeye Unity mimarisine uygun standart .gitignore dosyası eklendi.Bu sayede; Unity'nin otomatik olarak oluşturduğu ve cihazlara özel olan \"Library\", \"Temp\", \"Logs\", \"Obj\" gibi gereksiz ve yüksek boyutlu geçici klasörlerin Git deposuna gönderilmesi (commit edilmesi) engellendi.Proje dizin yapısı (Assets klasör düzeni vb.), \"Faz 0\" mimari planlama kurallarımıza uygun olarak geliştirilmeye hazır ve temiz bir hale getirildi.Git Commit Mesajları:[19:18] (8ce8e8b) Initial commit[21:15] (b324d33) build(core): initialize Unity VR project and add .gitignore Initialized the base Unity 3D (LTS) project for Recycle Rush VR and added the standard Unity .gitignore file to ensure temporary files (Library, Temp, Logs, etc.) are excluded from version control."
},
"middle": {
"day": 22,
"date": "2026-07-31",
"content": "2. Ay Proje Yol Haritası ve Stratejik Planlamaİlk staj ayında başarıyla tamamlanan ve stabilize edilen Recycle Rush VR projesinin ardından, ikinci staj ayında izlenecek teknik yol haritasını ve proje vizyonunu belirlemek üzere takım içi bir değerlendirme ve beyin fırtınası (brainstorming) çalışması gerçekleştirilmiştir. Yapılan analizler doğrultusunda projenin gelişimi için en verimli strateji belirlenmiş ve bu kararlar teknik dokümantasyon (2.AY_PLAN.md) haline getirilerek versiyon kontrol sistemine dâhil edilmiştir.Risk ve Zaman Maliyeti Değerlendirmesi: İkinci ayda sıfırdan tamamen yeni bir oyuna başlamak ile mevcut projeyi geliştirmek alternatifleri kıyaslanmıştır. Sıfırdan bir projeye başlamanın;Uyumlu 3D model arayışı ve optimizasyonu,Sıfırdan ses tasarımı (SFX\/BGM) ve haptic entegrasyonları,Yeni arayüz (UI\/UX) mimarisi inşasıgibi süreçler nedeniyle kısıtlı staj süresini verimsiz kullanmaya yol açacağı tespit edilmiştir.AR Dönüşüm Hedefi: Oyunun Sanal Gerçeklik (VR) ortamından çıkarılarak, oyuncunun gerçek dünyadaki fiziksel çevresiyle entegre çalışan modern bir Artırılmış Gerçeklik (AR - Augmented Reality) deneyimine dönüştürülmesi hedeflenmiştir. Bu sayede projenin mimari kalitesi artırılırken, mevcut kod tabanı en yüksek verimle yeniden kullanılabilir (reusable) kılınmıştır.Git Commit Mesajları:[19:27] (691c009) docs: outline UX and environmental roadmap for AR transition"
},
"last": {
"day": 42,
"date": "2026-08-28",
"content": "AR Recycle Rush Projesinde Son Entegrasyonlar, Hata Çözümleri, Kirlilik & Oynanış Mekaniklerinin Tamamlanması ve Staj Dönemi Genel DeğerlendirmesiStajımızın son gününde; Recycle Rush projesinde oynanış akışını doğrudan etkileyen fizik ve nişan alma asistanı (Aim Assist), XR kontrolcü lazer ışını (Ray Interactor) ile UI buton etkileşimleri, holografik eğitim sisteminin görsel ve tipografik iyileştirmeleri ile gerçek zamanlı dinamik kirlilik (Room Pollution) mekanizmaları başarıyla tamamlanmış ve sürüme hazır hale getirilmiştir.🛠️ 2. Yapılan Teknik Çalışmalar ve GeliştirmelerA. Oynanış, Fizik & Ses GeliştirmeleriManyetik Nişan Desteği & Yutulma Animasyonu: Atılan çöplerin doğru kutu ağzına manyetik olarak yönlendirilmesi ve kutuya giren nesnelerin merkezde küçülerek kaybolduğu estetik animasyon rutini entegre edildi.PhysX Kinematik Uyarılarının Giderilmesi: Unity 6 fizik motorunda isKinematic hız atamalarından kaynaklanan uyarılar, objelerin ObjectPoolManager ve BinTrigger içinde CancelInteractableSelection ile bağlarının koparılmasıyla kalıcı olarak çözüldü.Gerilim Müzik Sistemi: Oyunun son 15 saniyesinde arkaplan müziğinin tempo ve perdesinin (pitch) kademeli yükselmesi sağlandı.B. XR UI & Etkileşim OptimizasyonuKontrolcü Işını (Ray Interactor) Çakışma Çözümü: AR sahnesinde kontrolcü lazeriyle butonlara tıklanamama sorunu, EventSystem üzerindeki InputSystemUIInputModule ile XRUIInputModule modül çakışması giderilerek çözüldü.Otomatik Raycaster Ataması: UIManager bünyesinde EnsureXRUIInputSetup() fonksiyonu ile tüm World Space arayüz panellerine TrackedDeviceGraphicRaycaster ve aktif kamera referansı dinamik olarak bağlandı.C. Holografik Eğitim (Tutorial) & Tipografi StandardıProje genelindeki yazı tipi bütünlüğü sağlanarak tüm öğretici kartları, yönlendirme okları ve el rehberleri ChakraPetch-Medium SDF fontuna geçirildi; eksik geometrik karakterler için LiberationSans SDF fallback fontu eklendi.HoloBinPointer boyutu ve dikey salınım animasyonu uzaktan net seçilebilecek şekilde büyütüldü.D. Dinamik Kirlilik (Room Pollution) & Görev DengelemesiRoomPollutionManager yeniden yapılandırılarak sahnede aktif spawn olan atık sayısı arttıkça kirlilik yüzdesinin anlık yükselmesi, atıklar toplandıkça veya temizlendikçe anında düşmesi sağlandı.Kirlilik %100 olduğunda tetiklenen Game Over ekranına durumu açıklayan İngilizce bilgilendirme metinleri eklendi.Görev zorlukları (CollectWaste, EarnXP) ve kazanılan ödül oranları seviyelere göre dengelendi.Bugün itibarıyla Trunçgil Teknoloji bünyesinde gerçekleştirdiğim staj dönemimi başarıyla tamamlamış bulunmaktayım.Stajım boyunca; Unity ile sanal ve artırılmış gerçeklik (VR\/AR) teknolojileri, XR Interaction Toolkit mimarisi, fizik motoru optimizasyonları, SOLID prensiplerine uygun modüler yazılım geliştirme ve Git sürüm kontrol süreçlerinde yoğun ve son derece verimli bir tecrübe kazandım. Teorik bilgilerimi doğrudan sektörel standartlarda bir projede uygulama fırsatı bulmak mesleki gelişimime çok büyük katkı sağladı.Staj sürem boyunca bizlere her daim yol gösteren, bilgi ve tecrübelerini esirgemeden zamanını ve emeğini ayıran bize destek olan başta Ümit Bey olmak üzere tüm staj arkadaşlarıma en içten teşekkürlerimi sunarım. Burada geçirdiğim süre boyunca hem teknik anlamda hem de profesyonel iş disiplini açısından çok değerli kazanımlar edindim. Her şey için çok teşekkür ederim.Git Commit Mesajları:[01:51] (9a9a811) feat(gameplay): add aim assist, swallow visual effect and adaptive music tension - Implemented magnetic aim assist on bins to guide thrown matching waste into the target aperture - Added smooth scaling\/translating swallow routine before returning sorted waste to object pool - Introduced adaptive BGM pitch escalation during the final 15 seconds of gameplay in AudioManager - Resolved prefab duplicate declarations in WasteSpawner and aligned lever trigger state[01:51] (dd3ea6a) fix(managers): resolve merge conflicts and synchronize game lifecycle states - Cleaned up duplicated fields and methods in GameManager and GameSessionData - Streamlined combo break and kill-Z handling in ComboManager and ObjectPoolManager - Removed duplicate lifecycle hooks in SaveManager and aligned tutorial placement triggers[01:51] (1735bd7) fix(ui): resolve switch case fallthrough, integrate safety panel and update fonts - Fixed switch-case fallthrough and duplicate playing\/countdown states in UIManager - Restored AR EnvironmentSafetyManager integration and safetyWarningPanel field - Corrected local variable scope issues in countdown and pop animations - Updated TextMeshPro font asset configuration[01:52] (9ace1d1) chore(scene): update AR test scene and OpenXR package settings - Updated AR_SceneUnderstanding_Test test scene hierarchy and components - Refreshed OpenXR package runtime configuration[12:23] (a846a7e) feat(tutorial): enhance AR hologram tutorial visuals and typography - Assigned ChakraPetch-Medium SDF font dynamically across all tutorial hologram cards, pointers, and hand guides. - Added LiberationSans SDF as fallback font asset in TMP Settings to resolve missing Unicode symbols (e.g. geometric arrows). - Enlarged HoloBinPointer scale, bounce amplitude, and height offset for better long-range visibility over recycling bins. - Refined bin target auto-discovery via BinTrigger and cleaned gesture text formatting. - Updated AR test scene with proper XRUIInputModule configuration and font assignments.[12:23] (4aac4d1) feat(ui): add automated XR UI input setup and tutorial state filtering - Implemented EnsureXRUIInputSetup() in UIManager to automatically configure XRUIInputModule and TrackedDeviceGraphicRaycaster on all World Space canvases. - Resolved controller ray pointer button clicks by disabling conflicting InputSystemUIInputModule in favor of XRUIInputModule. - Hidden monitor statusText (SYSTEM ONLINE \/ PRESS PLAY BUTTON) during tutorial steps until completion. - Fixed button callbacks and game state synchronization.[12:23] (3d0b6cf) fix(core): resolve PhysX kinematic warnings, obsolete APIs and event lifecycle - Fixed kinematic rigidbody velocity modification warnings in ObjectPoolManager, BinTrigger, and MagnetResponder by canceling grab selection before kinematic changes. - Updated GravityPullController to use XRBaseControllerInteractor, resolving CS0618 deprecation warnings. - Switched AchievementManager event subscriptions to OnEnable\/OnDisable lifecycle and added scene auto-discovery in UIManager\/UltimateMerger. - Wired XP reward logic in PackageRewardManager and cleaned unused local variables across managers.[12:24] (81cf323) chore(settings): update URP rendering configs and project XR settings - Synchronized URP performance and quality pipeline asset configurations. - Updated project XR settings and global render pipeline settings for Android XR build targets.[16:24] (e417b26) feat(pollution): dynamic waste pollution tracking and game over notifications - Updated RoomPollutionManager to track active spawned wastes dynamically via ObjectPoolManager. - Synced real-time pollution percentage (increases on spawn, decreases on recycle\/despawn). - Added GameOverReason tracking in GameManager and display custom pollution failure messages on GameOverPanel and monitor. - Switched pollution UI labels and scene serialized prefixes to English (Pollution: %).[16:24] (3525c66) feat(gameplay): rebalance mission difficulty scaling and localize combo UI - Increased mission difficulty by one notch across CollectWaste and EarnXP types with scaled XP and coin rewards. - Localized ComboUI text to English (Combo x{count}!). - Updated ChakraPetch font asset metadata."
}
},
"full_text_length": 165719,
"all_entries": [
{
"day": 1,
"date": "2026-07-01",
"content": "Konu: Unity VR Proje İskeletinin Oluşturulması ve Versiyon Kontrol (Git) AyarlarıYapılan Çalışmalar:Recycle Rush VR projemizin geliştirme süreçlerine başlamak adına, performans ve stabilite göz önünde bulundurularak projenin ana iskeleti Unity 3D (LTS) sürümü üzerinden başarıyla oluşturuldu.Ekip içi versiyon kontrol süreçlerinin (Git & GitHub) sorunsuz ve temiz ilerlemesi amacıyla projeye Unity mimarisine uygun standart .gitignore dosyası eklendi.Bu sayede; Unity'nin otomatik olarak oluşturduğu ve cihazlara özel olan \"Library\", \"Temp\", \"Logs\", \"Obj\" gibi gereksiz ve yüksek boyutlu geçici klasörlerin Git deposuna gönderilmesi (commit edilmesi) engellendi.Proje dizin yapısı (Assets klasör düzeni vb.), \"Faz 0\" mimari planlama kurallarımıza uygun olarak geliştirilmeye hazır ve temiz bir hale getirildi.Git Commit Mesajları:[19:18] (8ce8e8b) Initial commit[21:15] (b324d33) build(core): initialize Unity VR project and add .gitignore Initialized the base Unity 3D (LTS) project for Recycle Rush VR and added the standard Unity .gitignore file to ensure temporary files (Library, Temp, Logs, etc.) are excluded from version control."
},
{
"day": 2,
"date": "2026-07-02",
"content": "Konu: Unity VR Projenin Sadeleştirlmesi ve XR Altyapısının YapılandırılmasıYapılan Çalışmalar:Proje İskeletinin Temizlenmesi ve Kurulumu: Recycle Rush VR projesinin geliştirme süreçlerinin temiz ve optimize ilerlemesi amacıyla, başlangıçta kullanılan VR şablonunun (VR Template) getirdiği ve kullanılmayacak olan ağır örnek sahneler, öğretici dosyalar (Tutorial) ve gereksiz bileşenler (VRTemplateAssets, CompositionLayers vb.) projeden tamamen temizlendi.Mimari Yapının Kurulması: implementation_plan.md dökümanında (Tek Doğruluk Kaynağı - SSOT) belirlenen katı klasör mimarisine sadık kalınarak Assets\/_App\/ dizini altındaki çekirdek klasör yapıları (Scenes, Scripts, Prefabs vb.) oluşturuldu.Versiyon Kontrol Optimizasyonu: GitHub üzerindeki gereksiz dosya kalabalığını önlemek amacıyla, Unity standartlarına uygun .gitignore dosyası eklendi; böylelikle yalnızca proje ayarları (ProjectSettings) ve kütüphane bağımlılıkları (manifest.json) Git takibine alındı.VR Altyapısının (XR) Yapılandırılması: Projenin Meta Quest (Android) ortamında çalışabilmesi için XR Plug-in Management üzerinden \"OpenXR\" aktif edildi. Etkileşim profillerine \"Oculus Touch Controller Profile\" eklenerek gözlük ve kontrolcü destekleri sağlandı.Ana Sahne (MainGame) Düzenlemeleri: Oyunun temel sahnesine sanal gerçeklik oyuncusunu temsil eden XR Origin (VR) ve etkileşimleri yönetecek olan XR Interaction Manager objeleri eklendi. Görüntü çakışmalarını (Rendering Conflict) önlemek amacıyla Unity'nin varsayılan \"Main Camera\" objesi sahneden kaldırıldı ve URP performans ayarları optimize edildi.Git Commit Mesajları:[12:51] (15c5bfb) build(core): initialize clean Unity VR project and set proper .gitignore Initialized the base Unity 3D (LTS) project for Recycle Rush VR. To address the previous review feedback and maintain a clean repository: - Removed all bloated VR Template sample files (`VRTemplateAssets`, `CompositionLayers`, etc.). - Set up the strict directory structure exactly as defined in the `implementation_plan.md`. - Added standard Unity `.gitignore` to prevent tracking `Library\/`, `Temp\/`, and `Logs\/`. - Only essential configurations (`ProjectSettings`, `manifest.json`) and the base folder structures are committed.[15:57] (80816c8) feat(core): configure XR Interaction Toolkit and OpenXR Configured the XR Plugin Management and OpenXR settings for Meta Quest development. - Ensured OpenXR is selected as the active plugin for the Android build target. - Added 'Oculus Touch Controller Profile' to the Interaction Profiles. - Enabled 'Meta Quest Support' in OpenXR Feature Groups. - Set up the foundational VR environment in `MainGame` scene: - Added `XR Origin (VR)` to handle the headset and controllers. - Added `XR Interaction Manager` to handle future grab\/throw events. - Removed the default `Main Camera` to prevent rendering conflicts."
},
{
"day": 3,
"date": "2026-07-03",
"content": "Versiyon Kontrol (Git) Çakışmalarının Çözümlenmesi ve 3D Çevre\/Obje Tasarımlarının Projeye Entegre EdilmesiGit Çakışmalarının (Merge Conflict) Çözümü: Ekip arkadaşımla eş zamanlı yürütülen çalışmalar sonucunda ProjectSettings.asset dosyasında (OpenXR ve build ayarları kaynaklı) oluşan \"Merge Conflict\" sorunu tespit edildi. Çakışan kod satırları GitHub Web arayüzü üzerinden manuel olarak incelendi ve doğru ayarların üzerine yazılması engellenerek sorunsuz bir şekilde main dalı ile feature\/unity-setup dalı birleştirildi (Merge işlemi).3D Sanat Yönetimi ve Optimizasyon: Proje dokümanında (Faz 0, Gün 3) belirtilen hedef doğrultusunda, cihazda yüksek FPS (akıcılık) sağlayacak olan Low-Poly (düşük poligonlu) 3D modeller araştırıldı ve projeye dâhil edildi.Sahne Materyallerinin Yüklenmesi:Oyuncunun içinde bulunacağı depo\/fabrika (Environment) çevre modelleri projeye eklendi.Oyunun temel \"Core Loop\" mekaniğini oluşturacak olan 4 farklı renkteki (Mavi, Yeşil, Kırmızı, Sarı) geri dönüşüm kutuları projeye dâhil edildi.Üretim bandından (Spawner) akacak olan farklı tipteki atıkları temsil etmesi amacıyla cam ve metal atık modelleri eklendi.Klasör Hiyerarşisi: İndirilen tüm bu 3D hazır varlıkların (Assets), projenin kendi kodlarından izole kalması adına Assets\/ThirdParty\/ dizinine yerleştirilmesi sağlandı. Böylece projenin temiz mimarisi korundu.Git Commit Mesajları:[10:25] (a9567a7) Merge branch 'main' into feature\/unity-setup[18:03] (1d62a76) design(env): import low-poly environment and waste assets Imported essential 3D assets to build the core visual environment for Recycle Rush VR. All models are optimized (Low-Poly) for standalone VR performance and comply with the SSOT implementation plan structure. - **Environment:** Imported the main place layout to serve as the player's surroundings. - **Recycling Bins:** Added 4 colored recycle bins (Blue, Green, Red, Yellow) which will act as the target trigger zones for the core gameplay loop. - **Waste Items:** Imported glass and metal waste models to be used by the spawner system. - **Folder Structure:** Ensured all external downloaded assets are strictly placed inside the `Assets\/ThirdParty` directory to keep our core `_App` folder clean."
},
{
"day": 4,
"date": "2026-07-06",
"content": "VR Sahne Tasarımı (Blockout) ve Editor-İçi Cihaz Simülasyonu (XR Device Simulator) Kurulumu1. Temel Sahne Düzenlemesi (Scene Blockout): Projenin \"Faz 0\" planlaması doğrultusunda, daha önce içeri aktardığımız (import) Low-Poly 3D modeller kullanılarak MainGame isimli ana sahnemizin mekânsal tasarımı (Blockout) gerçekleştirildi. Bu aşamada sanal gerçeklik (VR) ergonomisi göz önünde bulundurularak:Oyuncunun sabit duracağı merkez noktası belirlendi.Atıkların akacağı taşıma bandı (conveyor belt) oyuncunun rahatça erişebileceği (kol mesafesi) bir konuma yerleştirildi.Oyunun ana mekaniğini oluşturacak olan Mavi, Yeşil, Kırmızı ve Sarı geri dönüşüm kutuları, oyuncunun atıkları rahat fırlatabileceği açılar hesaplanarak sahneye dizildi. Bu sayede projenin kodlanabilir temel fiziksel iskeleti kurulmuş oldu.2. XR Device Simulator Entegrasyonu: Sanal gerçeklik projelerinde her bir kod değişikliğini test etmek için fiziksel gözlüğü (Meta Quest) kafaya takıp çıkarmak ve cihaza APK derlemek (build almak) ciddi bir zaman kaybı yaratmaktadır. Geliştirme hızını (Development Cycle) artırmak amacıyla:Unity XR Interaction Toolkit paketi içerisinden \"XR Device Simulator\" modülü projeye entegre edildi ve yapılandırmaları yapıldı.Bu simülatör sayesinde, oyun motorunun içindeyken (Play Mode) klavye (Shift ve Space tuşları) ve fare yardımıyla Meta Quest'in sağ ve sol kontrolcülerinin (ellerin) pozisyonu, rotasyonu ve tetik tuşları (Trigger\/Grip) simüle edilebilir hale getirildi.3. Doğrulama ve Test İşlemleri: Kurulan simülatör sistemi Unity Editor içerisinde başarılı bir şekilde test edildi. Sanal ellerin kameraya göre doğru açıda çalıştığı, hareket yeteneklerinin aktif olduğu doğrulandı.Sonuç ve Kazanımlar: Bugünkü çalışmalar neticesinde, oyunun görsel çevre düzenlemesi tamamlanmış ve projenin \"Faz 0 - Kurulum ve Proje İskeleti\" aşaması resmi olarak bitirilmiştir. Özellikle XR Device Simulator'ın projeye dâhil edilmesiyle birlikte, yarın başlanacak olan \"Faz 1 - Çekirdek Mekanikler\" sürecinde atıkların tutulması (Grab) ve fırlatılması (Throw) gibi mekaniklerin gözlüğe ihtiyaç duyulmadan çok daha hızlı bir şekilde kodlanıp test edilebilmesi için harika bir altyapı sağlanmıştır.Git Commit Mesajları:[13:09] (6ef5039) design(env): setup scene blockout and xr device simulator Completed the Day 4 objectives by finalizing the initial scene blockout and setting up the in-editor testing environment for Recycle Rush VR. - **Scene Blockout:** Placed the imported low-poly environment, conveyor belt, and colored recycling bins into the `MainGame` scene to establish the core spatial layout. - **Testing Setup:** Imported and configured the `XR Device Simulator` from the XR Interaction Toolkit package. - **Verification:** Successfully tested and verified the simulation of Meta Quest controllers (using Shift\/Space keys and mouse) directly within the Unity Editor, ensuring we can test interactions without always needing the physical headset."
},
{
"day": 5,
"date": "2026-07-07",
"content": "Taşıma Bandı (Conveyor Belt) Fizik Sisteminin İyileştirilmesi ve Hata Ayıklama (Debugging)Yapılan Çalışmalar ve Teknik Detaylar:Bugün, \"Faz 1 - Çekirdek Mekanikler\" aşamasına giriş yapılarak oyunun ana döngüsünü (Core Loop) oluşturacak taşıma bandı sistemi üzerinde çalışılmıştır. Ekip arkadaşım Sabri tarafından BeltMovement.cs scripti kullanılarak bandın temel itme mekaniği (Treadmill tekniği) kaba hatlarıyla kurgulanmıştı. Ancak VR ortamındaki testler sırasında, bandın üzerine düşen cam şişe gibi yüksek ağırlık merkezine sahip dar\/uzun objelerde \"sekme (bouncing)\", \"titreme (jittering)\" ve \"yüzeyin içinden geçme (micro-clipping)\" gibi ciddi fiziksel stabilite sorunları tespit edilmiştir.Mekaniklerin VR standartlarında pürüzsüz çalışabilmesi için kodu devralarak aşağıdaki spesifik fizik iyileştirmelerini (Refactoring) gerçekleştirdim:1. Çarpışma ve Sekme Kontrolü (Anti-Bounce & Clipping Fix): Objelerin banda yukarıdan düştüğü ilk anda (OnCollisionEnter) meydana gelen düzensiz sekmeleri engellemek adına, objenin dikeydeki düşüş hızı (Y ekseni) koda müdahale edilerek anında sıfırlandı. Ayrıca Unity'nin varsayılan \"Discrete\" çarpışma algılaması, obje banda temas ettiği an \"Continuous\" (Sürekli) moda çekildi. Bu sayede objelerin bandın ince yüzeyinden aşağıya sızması (clipping) engellendi.2. Titreme ve Devrilme (Anti-Jitter) Optimizasyonu: Bandın hareket tekniği sürtünme kuvvetine dayandığı için objelerin alt tabanı çekilirken üst kısımları geride kalarak devrilmelerine sebep oluyordu. Bu sorunu çözmek için Unity'nin RigidbodyConstraints yapısı koda entegre edildi. Objeler banda değdiği saniye rotasyonları sıfırlanıp kod üzerinden otomatik olarak kilitlendi (FreezeRotation). Böylece manuel bir Inspector ayarına gerek kalmadan, spawner'dan üretilecek onlarca farklı atığın bant üzerinde dimdik ve sıfır titreme ile akması garanti altına alındı.3. VR Etkileşim Uyumluluğu: Objelerin rotasyonlarının kilitlenmesi, oyuncunun onları eline aldığında (Grab) veya fırlattığında doğal hareket etmelerini engelleyecekti. Bu durumu aşmak için OnCollisionExit metodu yazılarak, obje bandın üzerinden ayrıldığı anda (oyuncu eline aldığında veya banttan düştüğünde) konulan tüm rotasyon kilitlerinin otomatik olarak kaldırılması sağlandı.Sonuç: Başlangıç seviyesindeki taşıma bandı kodu, VR fizikleriyle %100 uyumlu, pürüzsüz ve stabil çalışan dinamik bir sisteme dönüştürüldü. Atıkların üretim bandında kusursuzca akması sağlandı ve bir sonraki aşama olan \"Atık Üretim Sistemi (Waste Spawner)\" için sağlam bir zemin hazırlandı.Git Commit Mesajları:[14:05] (d6171b0) feat(env): implement physics-based conveyor belt movement Implemented the core conveyor belt logic (`BeltMovement.cs`) to transport physical objects smoothly along the X-axis for Recycle Rush VR. - **Treadmill Movement:** Utilized Rigidbody `MovePosition` within `FixedUpdate` for reliable surface friction dragging without moving the actual belt GameObject. - **Stability Fixes (Anti-Jitter & Anti-Bounce):** - Added `OnCollisionEnter` to zero out vertical velocity upon landing, preventing objects from bouncing off the belt. - Automatically applied `RigidbodyConstraints.FreezeRotation` on impact to completely eliminate top-heavy object tipping and jittering. - Enforced `CollisionDetectionMode.Continuous` to prevent micro-clipping through the belt surface. - **VR Grabbing Compatibility:** - Added `OnCollisionExit` to automatically release the rotation constraints when the player grabs the object or when it falls off the belt, allowing natural physical interactions in VR."
},
{
"day": 6,
"date": "2026-07-08",
"content": "Geri Dönüşüm Atıkları İçin VR Prefab Kurulumu, Fiziksel Etkileşim Ayarları ve Versiyon KontrolüYapılan Çalışmalar ve Teknik Detaylar:Bugün, Recycle Rush VR projesinin en temel oyun mekaniğini (Core Gameplay) oluşturacak \"Atık ve Sınıflandırma Sistemi\"nin altyapısına başlanmıştır. Geliştirme sürecini hızlandırmak adına takım arkadaşım Sabri ile iş bölümüne gidilmiş; Plastik ve Kağıt atıkların entegrasyonunu o üstlenirken, ben projedeki Cam (Glass) ve Metal atık modellerinin oyuna entegre edilip VR fizikleriyle uyumlu hale getirilmesi görevini yürüttüm.Çalışmalarım üç ana başlık altında gerçekleştirilmiştir:1. 3D Modellerin Prefab Mimarisinde Yeniden Yapılandırılması: Daha önceden projeye eklenmiş olan (Import) ham 3D Cam ve Metal modelleri, oyun içerisinde \"Spawner\" (üretici) sistemi tarafından sürekli olarak yaratılıp (Instantiate) yok edileceği (Destroy) için standart birer Unity Prefab dosyasına dönüştürüldü. Bu mimari yaklaşım sayesinde, atıkların oyunun her sahnesinde aynı özellikleri koruyarak tekrar kullanılabilmesi sağlandı.2. VR Etkileşimleri ve Fiziksel Çarpışma Kurulumları (Physics Setup): Atıkların dünkü görevde tamamlanan taşıma bandıyla (Conveyor Belt) doğru bir şekilde etkileşime girebilmesi ve oyuncu tarafından VR el kontrolcüleriyle (XR Controllers) sorunsuz şekilde tutulup (Grab) fırlatılabilmesi için gerekli bileşenler atandı.Her iki prefab'a da nesnenin uzaysal şekline tam oturan uygun Collider (çarpışma sınırları) bileşenleri eklendi.Atıkların yerçekimi, sürtünme ve taşıma bandının uyguladığı itme kuvvetine doğru tepki vermesi için Rigidbody bileşenleri eklenerek, kütle (mass) ve sürüklenme (drag) ayarları VR standartlarına göre optimize edildi.3. Sınıflandırma (Sorting) Sistemi İçin Tag Entegrasyonu: Oyunun temel mantığı olan \"doğru çöpü doğru kutuya atma\" sisteminin çalışabilmesi için, Unity'nin etiketleme altyapısı kullanıldı. Çöp kutularına yazılacak olan algılama algoritmalarının, gelen objeyi tanıyabilmesi adına prefab'lara özel olarak Glass (Cam) ve Metal etiketleri (Tag) tanımlanıp atandı.4. Versiyon Kontrol (Git) Yönetimi ve Kriz Çözümü: Kendi branch'imde (feature\/glass-metal-prefabs) yaptığım bu geliştirmeleri ana projeye (main) birleştirmek (Merge) istediğimde bir Git çakışması (Merge Conflict) meydana geldi. Yapılan analizde, Sabri ile eş zamanlı olarak kendi bilgisayarlarımızda oluşturduğumuz Waste klasörlerinin Unity tarafından atanan gizli kimliklerinin (.meta GUID) çakıştığı tespit edildi. Sahnedeki prefab referanslarının bozulmasını engellemek adına, main dalındaki GUID korunarak (Accept Incoming Change) bu kriz profesyonel bir şekilde çözüldü ve projenin bütünlüğü sağlandı.Sonuç: Oyunun Spawner ve Ayrıştırma sistemlerinin üzerine inşa edileceği \"Etkileşimli Atık Modelleri\"nin (Cam ve Metal) altyapısı tamamen bitirildi ve ana projeye sorunsuz bir şekilde birleştirildi.Git Commit Mesajları:[12:19] (c47babe) feat(waste): setup glass waste prefab and physics Configured the Glass waste model for the VR recycling system. - **Prefab Creation:** Converted the imported 3D glass model into a reusable Unity Prefab. - **Physics Setup:** Added Rigidbody and Collider components to enable physical interactions with the environment (e.g., the conveyor belt) and the player's VR hands. - **Tagging:** Created and assigned the `Glass` tag to the prefab to ensure compatibility with the upcoming sorting bin logic.[14:26] (e64bdd1) Merge branch 'main' into feature\/glass-metal-prefabs[15:43] (cfb0c2a) feat(waste): setup metal waste prefab and physics Configured the Metal waste model for the VR recycling system. - **Prefab Creation:** Converted the imported 3D metal model into a reusable Unity Prefab. - **Physics Setup:** Added Rigidbody and Collider components to enable physical interactions with the environment and VR grabbing mechanics. - **Tagging:** Assigned the `Metal` tag to the prefab to ensure proper detection by the upcoming sorting bin system."
},
{
"day": 7,
"date": "2026-07-09",
"content": "VR Etkileşim Mekaniklerinin (XR Grab Interactable) Kurulumu ve \"Oyun Hissi\" (Game Feel) OptimizasyonlarıYapılan Çalışmalar ve Teknik Detaylar:Bugün, Recycle Rush VR projesindeki en temel oyuncu etkileşimi olan \"nesne tutma ve fırlatma\" (Grab & Throw) mekaniklerinin geliştirilmesine odaklanılmıştır. Takım içi görev dağılımı kapsamında, projedeki ağır siklet (Heavy Waste) atıklar olarak sınıflandırılan Cam (Glass) ve Metal atık modellerinin VR etkileşim altyapıları kurulmuş ve fiziksel gerçekçilikleri optimize edilmiştir.Çalışmalarım üç ana başlık altında tamamlanmıştır:1. Etkileşim Bileşenlerinin (XR Grab Interactable) Entegrasyonu: Oyuncunun hareketli taşıma bandı (Conveyor Belt) üzerinden akan atıkları sanal elleriyle alabilmesi için, tüm Cam ve Metal prefab'larına Unity XR Interaction Toolkit mimarisinin XR Grab Interactable bileşeni entegre edilmiştir. Bu entegrasyon aşamasında, her iki materyalin hacimsel farklılıkları göz önünde bulundurularak çarpışma sınırları (collider bounds) kontrol edilmiş ve objelerin elden kaymadan temiz bir şekilde tutulabilmesi sağlanmıştır.2. Ağırlık Simülasyonu ve Fırlatma Fiziği (Physics & Throw Tuning): Cam ve metal objelerin, kağıt veya plastik gibi hafif objelerden farklı hissettirmesi VR deneyiminin gerçekçiliği (Immersion) için kritik bir unsurdur.Bu gerçekçiliği sağlamak adına etkileşim bileşenindeki hareket tipi (Movement Type), anında kilitlenme (Kinematic) yerine \"Velocity Tracking\" (Hız Takibi) olarak ayarlanmıştır. Bu sayede objeyi tutarken ve savururken sanal bir ağırlık ve eylemsizlik (Inertia) hissi yaratılmıştır.Oyuncunun atıkları hedef geri dönüşüm kutularına isabetli atabilmesi için fırlatma yumuşatması (Throw Smoothing) değerleri kalibre edilmiş; objenin elden çıktığı andaki açı ve hız vektörlerinin doğru hesaplanması sağlanmıştır.3. Doğal Tutuş Noktalarının (Attach Transform) Ayarlanması: 3D modellerin merkez noktaları (Pivot) genellikle objelerin en alt tabanında bulunur. Eğer özel bir ayar yapılmazsa, VR eli objeyi bu taban noktasından kavrar ve bu da son derece yapay bir görüntü oluşturur. Bu ergonomik sorunu çözmek amacıyla, her bir Cam ve Metal prefab'ının içine özel \"Tutunma Noktaları\" (Attach Transform) tanımlanmış ve konumlandırılmıştır. Böylece oyuncunun objeyi tam ağırlık merkezinden (örneğin şişenin gövdesinden) doğal bir şekilde kavraması garanti altına alınmıştır.Sonuç: Cam ve Metal atıkların VR etkileşim mekanikleri, hem hareketli zeminle (taşıma bandı) hem de oyuncuyla tam uyumlu, fiziksel olarak gerçekçi bir seviyeye getirilmiştir. Simülatör (XR Device Simulator) üzerinden yapılan testlerde objelerin sorunsuz bir şekilde alınıp fırlatılabildiği doğrulanmış ve kodlar ana projeye birleştirilmeye (Merge) hazır hale getirilmiştir.Git Commit Mesajları:[11:23] (509763a) feat(vr): add XR Grab Interactable to Glass waste prefabs Enabled VR interaction for Glass waste models. - Added XR Grab Interactable component to all glass prefabs. - Configured basic grab settings to allow players to pick up glass objects directly from the moving conveyor belt.[11:57] (273294c) feat(vr): add XR Grab Interactable to Metal waste prefabs Enabled VR interaction for Metal waste models. - Added XR Grab Interactable component to all metal prefabs. - Ensured grab configuration matches the physical volume of metallic objects for a natural feel when held by VR hands.[17:07] (ec02cc3) feat(vr): configure grab mechanics for glass and metal waste Configured XR Grab Interactable settings for Glass and Metal prefabs to enhance VR game feel. - **Grab Physics:** Set Movement Type to Velocity Tracking to simulate realistic weight and inertia. - **Throw Tuning:** Configured throw smoothing to ensure accurate and natural trajectories when tossing objects. - **Grip Position:** Defined custom Attach Transforms to ensure players hold the objects naturally from their center points rather than the base."
},
{
"day": 8,
"date": "2026-07-10",
"content": "Proje Dizin Optimizasyonu, Prefab Hata Çözümü ve Geri Dönüşüm Kutusu Algılama Mantığının (BinTrigger.cs) GeliştirilmesiYapılan Çalışmalar ve Teknik Detaylar:Bugün, projenin sürdürülebilirliği için önemli olan temiz dosya düzeni (Refactoring & Clean Code) çalışmaları yürütülmüş, ardından oyunun temel mekaniklerinden biri olan atık ayrıştırma ve geri dönüşüm algılama sistemi sisteme dahil edilmiştir. Yapılan çalışmalar mantıksal sıraya göre aşağıda detaylandırılmıştır:1. Proje Klasör Hiyerarşisi ve Sahne Optimizasyonu (Refactoring):Proje dosya düzenini standartlaştırmak adına, dağınık durumda bulunan geri dönüşüm kutusu (Recycling Bins) prefab'ları projenin ana prefab klasörü olan Assets\/_App\/Prefabs\/ dizini altına taşınmıştır.Proje içinde yanlışlıkla Scripts klasörü altına kaydedilmiş olan mükerrer (kopya) MainGame.unity sahne dosyası silinerek versiyon kontrol sisteminde oluşabilecek kafa karışıklıkları önlenmiştir.MainGame ana oyun sahnesindeki kullanılmayan, atıl kalmış ve sahne boyutunu artıran gereksiz GameObject'ler hiyerarşiden silinerek sahne optimize edilmiştir.2. Prefab Çarpışma ve Etiket Algılama Hatasının Çözülmesi (Debugging):Cam ve Metal atık prefab'ları test edilirken, geri dönüşüm kutusuna atılan nesnelerin yok olmadığı (algılanmadığı) gözlemlenmiştir. Yapılan hata analizinde (Debugging), Glass ve Metal etiketlerinin (Tag) prefab'ın ana objesine (Parent) tanımlandığı, fakat fiziksel çarpışmayı gerçekleştiren Collider bileşenlerinin alt objelerde (Child) yer aldığı tespit edilmiştir.Bu durum, kutu tetikleyicisinin çarpışma anında alt objenin etiketini okumaya çalışıp \"Etiketsiz\" (Untagged) olarak algılamasına yol açmaktaydı. Sorunu çözmek için ilgili etiketler doğrudan Collider bileşeninin olduğu alt objelere tanımlanarak hata giderilmiş ve çarpışma algılaması aktif edilmiştir.3. Geri Dönüşüm Kutusu Algılama Mantığının (BinTrigger.cs) Yazılması:Atıkların doğru\/yanlış kutulara atıldığını denetleyecek BinTrigger.cs sınıfı kodlanmıştır. Bu sınıf, Unity'nin OnTriggerEnter metodunu kullanarak kutu alanına giren objeleri yakalar.Loose Coupling (Gevşek Bağlılık): Yazılım mimarisinde spagetti kodlamayı önlemek adına; puan ekleme, ses çalma veya titreşim tetikleme işlemleri doğrudan bu script içinden yapılmamıştır. Bunun yerine statik bir C# Action (OnWasteProcessed) tanımlanmış ve tetiklenme anında tüm parametreler (isCorrect, ScoreChange, HapticParameters vb.) paketlenerek (Struct) bir olay (Event Broadcast) olarak yayınlanmıştır. Diğer yönetici sınıflar (Manager'lar) bu olayı dinleyerek kendi görevlerini yerine getirecektir.Bellek Sızıntısı (Memory Leak) Önlemi: Çarpışma gerçekleştiğinde sadece çarpışan alt objenin (child) silinip ana objenin sahnede asılı kalmasını (ve zamanla oyunda kasma yapmasını) önlemek adına, other.attachedRigidbody.gameObject yapısı kullanılarak atık objesinin bağlı olduğu ana prefab'ın tamamı sahneden güvenli bir şekilde silinmiştir (Destroy).Sahnedeki tüm geri dönüşüm kutularına BinTrigger.cs atanmış, tetikleyici alanları (IsTrigger aktif BoxCollider) kurulmuş ve her kutunun hangi atığı kabul edeceği (Enum üzerinden) Inspector'dan belirlenmiştir.Sonuç: Haftanın bu son gününde, hem sahne ve dosya temizliği tamamlanmış hem de fiziksel olarak kutuya atılan nesnelerin doğru etiketlerle algılanarak başarıyla yok edilmesi ve puan\/efekt sistemlerine olay (event) fırlatılması sağlanmıştır. Proje, bir sonraki aşama olan Spawner (Atık Üretici) ve Manager (Puan\/Ses\/Haptic Yönetim) sistemlerinin kodlanmasına tamamen hazır hale getirilmiştir.Git Commit Mesajları:[11:17] (dc62fd7) chore(scene): clean up redundant objects in MainGame.unity Optimized the MainGame scene hierarchy by removing unnecessary GameObjects. This cleanup improves scene readability and removes unused clutter before integrating the new sorting bin mechanics.[11:42] (d919d02) chore(project): organize bin prefabs and remove duplicate scene Organized project assets by restructuring prefab paths and removing redundant files. - **Asset Relocation:** Moved recycling bin prefabs to the correct `_App\/Prefabs\/` directory to ensure clean project hierarchy. - **Cleanup:** Deleted the duplicate `MainGame.unity` scene file mistakenly saved inside the `Scripts\/` folder.[12:24] (0230021) fix(waste): assign correct tags to child colliders of glass and metal prefabs Fixed waste detection by moving tag assignments to the child GameObjects that contain the Collider components. - **Prefab Tagging:** Transferred the `Glass` and `Metal` tags from the parent prefabs to their respective child colliders to ensure collision detection reads them correctly. - **Verification:** Confirmed that `BinTrigger` now successfully detects the incoming tags and resolves the recycling logic.[16:52] (376ca0b) feat(sorting): implement recycling bin detection and sorting logic Implemented recycling bin collision and sorting detection. - Created `BinTrigger.cs` to identify incoming waste tags using trigger colliders. - Configured a C# event to broadcast correct\/incorrect sorting results to other scripts. - Ensured full prefab destruction by targeting the object's Rigidbody. - Set up trigger colliders and scripts on all recycling bins in the scene."
},
{
"day": 9,
"date": "2026-07-13",
"content": "GameManager Sınıfının Geliştirilmesi, Atık Üretici Sistemiyle Entegrasyon, Sahne Düzenlemesi ve Hata Ayıklama (Debugging) ÇalışmalarıYapılan Çalışmalar ve Teknik Detaylar:Bugün, projenin ana döngüsünü yönetecek olan durum makinesinin kurulması, sahne elemanlarının birleştirilmesi ve bir önceki çalışmadan kalan prefab hatalarının temizlenmesi üzerine odaklanılmıştır. Yapılan teknik çalışmalar sırasıyla şu şekildedir:1. Atık Üretici Sisteminin Sahneye Entegrasyonu:-Cuma günü ekip arkadaşım Sabri tarafından geliştirilen atık üretim sistemi elemanları (WasteSpawnerManager ve SpawnPoint objeleri), aktif olarak üzerinde çalıştığımız MainGame.unity sahnesine başarılı bir şekilde entegre edilmiştir.-Atıkların bandın başlangıcından düzgün bir şekilde akışa katılması için SpawnPoint objesi taşıma bandının giriş koordinatlarına tam oturacak şekilde yerleştirilmiştir.2. Kağıt ve Plastik Atık Prefab'larındaki Algılama Hatasının Çözülmesi:-Cam ve Metal atıklarında daha önce karşılaştığımız tag algılama hatasının, Kağıt (Paper) ve Plastik (Plastic) prefab'larında da mevcut olduğu tespit edilmiştir. Çarpışmayı algılayan Collider bileşenlerinin alt nesnelerde (child) yer almasına karşın, tag atamasının ana nesneye (parent) yapılmış olmasından ötürü geri dönüşüm kutuları bu atıkları yok etmemekteydi.-İlgili Paper ve Plastic etiketleri doğrudan Collider bileşenini taşıyan alt nesnelere atanarak hata giderilmiş, yapılan simülasyon testlerinde kutuya giren atıkların anında ve pürüzsüzce yok edildiği doğrulanmıştır.3. GameManager Mimarisi ve Event Tabanlı Durum Kontrolü:-Oyunun anlık durumlarını (Başlangıç, Oynanış, Duraklatma, Oyun Sonu) kontrol edecek olan merkezi GameManager.cs sınıfı kodlanarak projenin Managers dizinine eklenmiştir.-Kod mimarisinde spagetti bağımlılıkları engellemek ve \"God Object\" anti-pattern'inden kaçınmak adına Singleton Tasarım Deseni uygulanmıştır. Sınıf içinde Initialization, MainMenu, Playing, Paused, GameOver durumlarını içeren bir durum makinesi (State Machine) kurulmuş ve durum değişikliklerini sisteme duyuran statik C# Action Event'leri (OnGameStateChanged) tanımlanmıştır.-Oyunun aktif oynanış süresini kontrol etmek için geriye sayan bir zamanlayıcı (Countdown Timer) entegre edilmiştir. Süre bittiğinde (RemainingTime <= 0) oyun durumu otomatik olarak GameOver durumuna geçmektedir.4. GameManager - Spawner Entegrasyonu:-GameManager ile WasteSpawner arasındaki loose-coupling (gevşek bağlılık) bağıını kurmak adına WasteSpawner.cs scripti güncellenmiştir.-Spawner scriptinin GameManager'ın durum değişiklik olayına abone olması (Subscribe) sağlanmıştır. Bu sayede oyun bittiğinde (GameOver) veya duraklatıldığında (Paused), spawner scripti çöp üretmeyi otomatik olarak durdurmakta (StopCoroutine); oyun tekrar aktif olduğunda ise üretime kaldığı yerden devam etmektedir.Sonuç: Oyunun genel akışını yöneten GameManager sistemi kurulmuş, sahne elemanları entegre edilmiş, tüm atık prefab'larındaki çarpışma hataları giderilmiş ve atık üretim sistemi oyun süresiyle senkronize çalışacak hale getirilmiştir. Proje, puanlama ve görsel\/işitsel geri bildirim sistemlerinin (Managers) entegrasyonuna hazır hale getirilerek ana projeye (main) Pull Request açılmıştır.Git Commit Mesajları:[11:42] (3b842dd) chore(scene): integrate waste spawner manager and spawn point Integrated the WasteSpawnerManager and SpawnPoint components into the MainGame scene. - Positioned the SpawnPoint GameObject at the start of the conveyor belt. - Linked the WasteSpawnerManager to the active scene to enable automated prefab spawning.[14:40] (1b489e2) fix(waste): assign correct tags to paper and plastic colliders Fixed paper and plastic waste detection by moving tags to child colliders. - Transferred `Plastic` and `Paper` tags to the child GameObjects containing the Collider components. - Confirmed that the recycling bins now successfully detect and destroy these objects.[17:49] (8b55e76) feat(gameplay): implement game manager and integrate with spawner Implemented the core GameManager and integrated it with the waste spawning system. - Created `GameManager.cs` to manage states (Playing, Paused, GameOver) and countdown timer. - Added C# action events to broadcast game state changes to other systems. - Updated `WasteSpawner.cs` to listen to state events and stop spawning on GameOver."
},
{
"day": 10,
"date": "2026-07-14",
"content": "Hatalı Atık Modellerinin Yenilenmesi, Taşıma Bandı Sonu İmha Alanının (DestroyZone) Sahne Kurulumu ve Ceza Mekaniğinin KodlanmasıYapılan Çalışmalar ve Teknik Detaylar:Bugün, VR oyunumuzun hem kararlılığını (fizik optimizasyonu) hem de oynanış mekaniklerini (ceza puanı) doğrudan etkileyen önemli geliştirme ve hata ayıklama süreçleri yürütülmüştür. Gerçekleştirilen çalışmalar üç ana başlık altında aşağıda detaylandırılmıştır:1. Hatalı Atık Modellerinin Yenilenmesi ve Fizik Ayarları:-Proje testleri sırasında düzgün çalışmadığı ve fiziksel hatalara (sapmalar, titremeler) yol açtığı tespit edilen iki adet atık modeli tamamen silinmiş ve yerlerine kararlı çalışan yeni 3D modeller eklenmiştir.-Yeni eklenen atık modellerinin oyuna entegre edilebilmesi için sıfırdan Unity prefab yapıları hazırlanmıştır. Bu kapsamda nesnelere yerçekimi ve çarpışma özelliklerini kazandıran Rigidbody ve Collider bileşenleri eklenmiştir.-Oyuncunun bu nesneleri elleriyle tutabilmesini (Grab) sağlamak amacıyla XR Grab Interactable bileşeni entegre edilmiş, doğru tutuş açısı için Attach Transform ayarları yapılmıştır.-Son olarak, bu yeni prefablar sahnedeki WasteSpawner (Atık Üretici) bileşeninin listesine (Array) dahil edilerek üretim döngüsüne katılmış ve sorunsuz çalıştıkları simülatör ile test edilmiştir.2. Sahne Üzerinde Atık İmha Alanının (DestroyZone) Yapılandırılması:-Taşıma bandından düşen ve oyuncu tarafından yakalanamayan çöplerin sonsuz boşluğa düşerek oyun motorunu (fizik hesaplamalarını) yormasını engellemek adına bandın sonuna görünmez bir bariyer kurulmuştur.-Sahneye eklenen bir Cube nesnesinin üzerindeki Mesh Renderer silinerek oyuncu için tamamen görünmez hale getirilmiştir.-Nesnenin Box Collider bileşeni aktif edilerek \"Is Trigger\" seçeneği işaretlenmiş ve bandın sonundan düşebilecek tüm atıkların içinden geçeceği büyüklükte (genişlikte) ölçeklendirilmiştir.3. Atık İmha Mantığı ve Ceza Mekanizması Kodlaması (DestroyZone.cs):-İmha alanına çarpan nesneleri algılayıp yönetecek olan DestroyZone.cs sınıfı yazılmıştır.-GC Dostu Algılama: Tetikleyici alana çarpan objelerin etiketleri (Tag), Unity'nin arka planda çöp bellek (Garbage) üretmeyen en optimize tag kontrol metodu olan CompareTag ile taranarak nesnenin bir atık olup olmadığı denetlenmiştir. --Böylece el veya bant gibi çevre nesnelerin imha edilmesi önlenmiştir.-Loose Coupling (Gevşek Bağlılık): İmha alanına düşen her atık için oyuncudan eksi puan düşülmesi hedeflenmiştir. Bu işlem, ScoreManager sınıfını doğrudan çağırmak yerine, statik bir C# Action olan OnWasteMissed olayı (Event) fırlatılarak gerçekleştirilmiştir. Sistem bu olay tetiklendiğinde dinleyici sınıflara otomatik olarak -5 ceza puanı bilgisini yayınlamaktadır.-Bellek Sızıntısı ve Kök Temizliği: Çarpan atığın alt objelerinin (child) yok edilip ana nesnenin sahnede hayalet obje olarak kalmasını önlemek adına, other.transform.root.gameObject kodu kullanılarak ilgili prefabın tamamı sahneden silinmiştir (Destroy).Sonuç: Hatalı atıkların değiştirilmesiyle başlayan süreç, bandın sonuna kurulan imha sistemiyle tamamlanmıştır. Bu sayede hem oyuna kaçırılan çöpler için bir ceza puanı mekanizması (oyun zorluğu) eklenmiş hem de sahneden düşen çöpler anında silinerek oyunun VR cihazlardaki performansı (FPS kararlılığı) güvence altına alınmıştır.Git Commit Mesajları:[07:41] (2e8add4) refactor(waste): replace broken waste models and update spawner Replaced two malfunctioning waste models with new functional assets. - Configured tags, colliders, rigidbodies, and XR Grab Interactable components on the new prefabs. - Added the new waste prefabs to the WasteSpawner array in the scene. - Verified physical interactions and spawning behavior.[12:45] (ea791f3) chore(scene): setup destroy zone at the end of conveyor belt Created and configured the DestroyZone GameObject in the MainGame scene. - Positioned a trigger BoxCollider at the end of the conveyor belt to catch missed waste. - Expanded the collider bounds to ensure all falling waste items are captured. - Removed the Mesh Renderer to keep the zone invisible to the player.[17:31] (28c181b) feat(gameplay): implement destroy zone logic and score penalty Implemented the DestroyZone script and attached it to the scene trigger. - Created `DestroyZone.cs` to handle out-of-bounds waste cleanup and prevent memory leaks. - Setup a static C# Action `OnWasteMissed` to broadcast a customizable penalty score (-5 by default). - Attached the script as a component to the DestroyZone GameObject in the scene."
},
{
"day": 11,
"date": "2026-07-16",
"content": "UI Modeli Entegrasyonu, Atık Kaçırma Ceza Puanı Düzeltmesi, Makine Kolu VR Etkileşimi\/Animasyon Kurulumu, Dinamik Zorluk Algoritmasının Geliştirilmesi ve Sahnelerin Modüler Prefab Yapısına DönüştürülmesiYapılan Çalışmalar ve Teknik Detaylar:Bugün, VR oyununun görsel geri bildirim kalitesini artıran, oynanışı dinamik hale getiren ve projenin takım çalışmasına uygunluğunu (sahne kararlılığı) artıran çok yönlü geliştirmeler yapılmıştır:1. TV Monitörü ve UI Arayüz Entegrasyonu:Oyuncunun skor ve oyun durumu bilgilerini takip edebilmesi için tasarlanan 3D TV monitör modeli oyun alanına konumlandırılmıştır.Unity'nin World Space Canvas arayüz yapısı kullanılarak hazırlanan arayüz ekranları, TV monitörünün ekran alanıyla hizalanmış ve arayüzü kontrol eden UIManager sahneye entegre edilmiştir.2. Atık Kaçırma Puanlama Hatasının Giderilmesi (Bug Fix):Banttan düşen atıklar fiziksel olarak yok edilmesine rağmen skor ekranına yansımamaktaydı. Bu hatayı gidermek için ScoreManager.cs çekirdek sınıfı güncellenmiştir.ScoreManager, imha alanından fırlatılan DestroyZone.OnWasteMissed olayına (Event) abone edilmiştir. Atık kaçırıldığında tetiklenen bu olay sayesinde, oyuncudan -5 ceza puanı düşülmesi ve bu bilginin anında güncellenerek dijital ekrana yansıtılması sağlanmıştır.Bellek yönetimini korumak için OnEnable ve OnDisable metotlarında aboneliklerin temizlenmesi (unsubscription) sağlanarak olası bellek sızıntıları (memory leak) önlenmiştir.3. Makine Kolu (Lever) VR Etkileşimi ve Animasyon Tasarımı:Hazır makine modelinin üzerinde bulunan kırmızı kolun kontrolsüzce sürekli oynamasını engellemek için Animator Controller (Machn_1_UpDown) yeniden yapılandırılmıştır.Giriş durumunun (Entry) hemen ardına boş bir Idle durumu tanımlanarak varsayılan yapılmış ve oyun başında kolun sabit kalması sağlanmıştır. Kolun aşağı-yukarı hareketi için tek seferlik (non-looping) oynatma koşulu ve Pull trigger parametresi kurulmuştur.Kod tarafında MachineLever.cs yazılmış, kol objesine XRSimpleInteractable (VR buton etkileşimi) ve fiziksel algılama için Collider eklenmiştir. Oyuncu VR kontrolcüsüyle bu kolu lazerle seçip tetik tuşuna bastığında kodun Animator üzerindeki Pull tetikleyicisini ateşlemesi sağlanarak etkileşim tamamlanmıştır.4. Dinamik Zorluk Algoritmasının Entegre Edilmesi:Oyunun ilerleyen dakikalarında tempo artışı sağlamak amacıyla DifficultyManager.cs adında bağımsız bir yönetici sınıf kodlanmıştır. Bu sınıf, ScoreManager'dan gelen skor değişimlerini dinleyerek 50, 100 ve 200 puan eşiklerinde zorluk katsayısını (1.2x, 1.5x, 2.0x) artırır ve OnDifficultyLevelChanged event'ini fırlatır.WasteSpawner.cs güncellenerek bu zorluk katsayısına göre atık doğma aralıklarını daraltması (daha sık atık üretmesi) sağlanmıştır.BeltMovement.cs güncellenerek zorluk katsayısı yükseldikçe bandın kayma hızını doğrusal olarak artırması sağlanmıştır. Böylece oyun içi zorluk oyuncunun performansına göre organik olarak ölçeklenmektedir.5. Sahne Modülerleştirme Refaktörü (Okunabilirlik & Git Optimizasyonu):MainGame.unity sahnesinde bağımsız duran onlarca oyun objesi, projenin büyümesiyle oluşabilecek karmaşayı ve Git sürüm kontrol çakışmalarını (Merge Conflict) engellemek adına mantıksal gruplara ayrılmıştır.Sahnede dağınık duran tüm objeler; ConveyorSystem_Module (Bant ve Spawner), CoreSystems_Module (Yöneticiler), Environment_Module (Bina ve Çevre) ve RecyclingArea_Module (Kutular ve TV) adı altında 4 ana Prefab Modülüne dönüştürülmüştür. Sahne hiyerarşisi sadeleştirilerek sadece bu modüllerin referanslarını tutan hafif bir yapıya kavuşturulmuştur.Sonuç: Bugünkü geliştirmeler sonucunda VR oyunumuzun arayüz geri bildirimleri tamamlanmış, puanlama mekanizmasındaki kritik bir hata giderilmiş, VR etkileşimli makine kolu çalışır hale getirilmiş ve oyun temposunu belirleyen dinamik zorluk eğrisi kurulmuştur. Sahnenin tamamen prefab modüllerine ayrılmasıyla projenin mimari altyapısı profesyonel seviyeye taşınmıştır.Git Commit Mesajları:[11:25] (be57a80) chore(scene): integrate TV monitor model and UIManager components Integrated the TV monitor model and UIManager components into the scene. - Positioned the TV monitor model for the score display. - Integrated the UIManager and UI Canvas into the MainGame scene.[12:50] (3533eac) fix(score): apply score penalty when waste falls off conveyor belt Subscribed ScoreManager to the DestroyZone event to handle missed waste items. - Subscribed ScoreManager to `DestroyZone.OnWasteMissed` inside OnEnable\/OnDisable. - Implemented `HandleWasteMissed` to subtract penalty points when a waste item is missed. - Ensured clean event unsubscription to prevent memory leaks.[15:05] (8619aef) chore(animation): setup animator controller and states for machine lever Configured the Animator Controller and states for the red machine lever. - Created an Idle state as the default state to prevent autoplay on startup. - Setup transitions between the Idle and Lever Pull animation states. - Configured the 'Pull' trigger parameter and transition condition. - Disabled looping on the lever pull animation clip to ensure it plays only once per click.[15:07] (40aed75) feat(interaction): implement MachineLever script for VR interaction Created the MachineLever script to bridge VR interactions with Animator triggers. - Implemented `MachineLever.cs` to listen to VR controller selection inputs. - Subscribed to `XRSimpleInteractable`'s `selectEntered` event to trigger the Animator. - Used a customizable trigger parameter name ('Pull' by default) for the animation state transition.[17:08] (489dd62) feat(core): implement DifficultyManager for score-based scaling Created the DifficultyManager class to control game speed and progression. - Implemented `DifficultyManager.cs` to monitor score updates from `ScoreManager`. - Defined score-based thresholds (50, 100, 200 points) to step through 4 difficulty levels. - Added a static C# Action `OnDifficultyLevelChanged` to broadcast difficulty multipliers.[17:13] (3d511eb) refactor(spawner): scale waste spawn intervals based on difficulty level[17:14] (ee11a5a) refactor(belt): scale conveyor belt speed based on difficulty level[22:38] (6e67976) refactor(scene): modularize scene hierarchy into system prefabs Grouped scene objects into modular prefabs to simplify the hierarchy and prevent Git conflicts. - Created ConveyorSystem, CoreSystems, Environment, and RecyclingArea module prefabs. - Cleaned up MainGame.unity scene by replacing loose GameObjects with their modular prefabs."
},
{
"day": 12,
"date": "2026-07-17",
"content": "UI Font Güncellemesi, Ses Varlıklarının Entegrasyonu ve Makine Kolu ile Tetiklenen Oyun Başlangıç Akışının KodlanmasıYapılan Çalışmalar ve Teknik Detaylar:Bugün, VR oyunumuzun arayüz estetiğini ve oyun akış kalitesini artıracak üç ana başlık üzerinde çalışılmış ve projenin başlangıç mekanikleri daha profesyonel bir yapıya kavuşturulmuştur:1. Arayüz Yazı Tipi (Typography) Güncellemesi:VR (Sanal Gerçeklik) ortamında ekran piksellerinin yakınlığı nedeniyle standart yazı tiplerinin okunabilirliği düşebilmektedir. Bunu engellemek adına endüstri standardı olan ve uzaktan okunabilirliği yüksek, kalın hatlara sahip ChakraPetch-Medium yazı tipi projeye dahil edilmiştir.İndirilen yazı tipi dosyası Assets\/_App\/UI\/Fonts\/ dizinine yerleştirilmiş ve Unity TextMesh Pro (TMP) sistemi kullanılarak bir SDF (Signed Distance Field) Font Asset'ine dönüştürülmüştür.Hazırlanan bu yeni font, arayüzü oluşturan ana prefablarımıza (CoreSystems_Module ve RecyclingArea_Module) uygulanarak skor ekranı ve metinlerin VR ortamında daha net ve keskin görünmesi sağlanmıştır.2. Ses Varlıkları (Audio Assets) ve Versiyon Yönetimi:Oyunda makine etkileşimi sırasında kullanılacak olan işitsel geri bildirim varlıkları projeye kazandırılmıştır. Bu kapsamda, kol çekildiğinde çalacak mekanik klik sesi ile makine çalışırken arka planda kesintisiz dönecek olan motor\/bant gürültüsü (Engine Loop) ses dosyaları ilgili ses dizinine (Assets\/_App\/Audio\/) eklenmiştir.Yükleme sırasında oluşan ufak bir sürüm kontrol hatası, ilgili commit geri alınarak (revert) ve dosyalar en temiz haliyle tekrar commit edilerek çözülmüş; Git geçmişinin temiz kalması sağlanmıştır.3. Makine Kolu ile Başlayan Oyun Akışı (Gameplay Flow):Oyunun açıldığı anda otomatik olarak başlamasını engelleyen ve oyuncuyu fiziksel bir kol etkileşimiyle oyunu başlatmaya teşvik eden oyun başlangıç akışı kodlanmıştır.GameManager.cs sınıfı güncellenerek oyunun ilk aşamada otomatik olarak StartGame() metodunu çağırması iptal edilmiş ve oyunun bir bekleme durumunda (GameState.MainMenu) kalması sağlanmıştır.MachineLever.cs scripti güncellenmiştir. VR kontrolcüyle kola ilk tıklandığında GameManager.Instance.StartGame() çağrısı yapılarak zamanlayıcı, spawner ve taşıma bandı aktif hale getirilmiştir.Oyun başladıktan sonra kolun tekrar çekilmesi durumu optimize edilmiştir. Kol tekrar çekildiğinde oyuna duraklatma (Pause) gibi oyun akışını kesintiye uğratacak bir müdahalede bulunulmamakta; sadece kolun çalışma animasyonu tetiklenmekte ve işitsel geri bildirim üretilmektedir.AudioManager ile haberleşmeyi sağlamak amacıyla MachineLever.cs içerisine OnLeverPulledAction C# Event yapısı eklenmiştir. Böylece kol her çekildiğinde fırlatılan bu sinyal sayesinde arayüz ve ses sistemlerinin eşzamanlı çalışması garanti altına alınmıştır.Sonuç: Bugün yapılan geliştirmelerle oyunun açılışındaki otomatik başlama hatası giderilmiş, oyun döngüsünün başlama kararı oyuncunun fiziksel etkileşimine bağlanmıştır. UI fontlarının güncellenmesi ve ses altyapısının kurulmasıyla kullanıcı deneyimi (UX) güçlendirilmiştir.Git Commit Mesajları:[11:35] (9157bd9) design(ui): import ChakraPetch font and apply it to UI prefabs[18:06] (f1b2962) chore(audio): import lever click and machine engine loop sound assets[18:08] (87f3a7e) Revert \"chore(audio): import lever click and machine engine loop sound assets\" This reverts commit f1b2962e54e2df37da181f4fb28eec1782fea724.[18:09] (5b9a3a9) chore(audio): import lever click and machine engine loop sound assets[18:14] (78725e8) feat(gameplay): implement lever-activated game start flow Updated GameManager and MachineLever to wait for user interaction before starting the game. - Modified `GameManager.cs` to start in the MainMenu state instead of starting automatically. - Updated `MachineLever.cs` to trigger `GameManager.Instance.StartGame()` upon the first lever pull. - Added the `OnLeverPulledAction` C# event to notify the AudioManager when the lever is clicked. - Subsequent lever pulls trigger the animation and event but do not pause or restart the running game."
},
{
"day": 13,
"date": "2026-07-20",
"content": "Derleme Hatası Giderme, Kombo ve Katlayıcı (Combo & Multiplier) Mantığının Kodlanması, Arayüz Lerp Pop Animasyon Entegrasyonu ve İki Aşamalı Anti-Cheat (Hile Koruması) Sisteminin GeliştirilmesiYapılan Çalışmalar ve Teknik Detaylar:Bugün, VR projemizin eğlence katsayısını artıracak oyun içi kombo sistemleri kurulmuş ve oyuncuların oyundaki mekanik açıkları (exploit) kullanmasını engelleyecek güvenlik çözümleri geliştirilmiştir:1. Hata Giderme ve Kod Temizliği:Önceki geliştirme aşamasından kalan ve derleme aşamasında kırmızı hata veren MachineLever.cs içerisindeki mükerrer OnLeverPulledAction event tanımı temizlenmiş (CS0102 derleyici hatası giderilmiş), kod tabanının stabil şekilde çalışması sağlanmıştır.2. Kombo ve Katlayıcı (Combo & Multiplier) Sisteminin Kodlanması:Oyunda peş peşe yapılan doğru eşleştirmeleri ödüllendirmek amacıyla ScoreManager.cs sınıfı güncellenmiştir. Sınıfa ComboCount ve CurrentMultiplier özellikleri eklenmiştir.Skor Katlama Mantığı: Peş peşe yapılan doğru atışlarda kombo sayacı artmakta; 3 doğru atışta puanlar 2x, 5 ve üzeri doğru atışlarda 3x çarpanı ile eklenmektedir. Yanlış kutuya atış yapıldığında veya atık kaçırıldığında kombo anında 0'a sıfırlanmaktadır.Sistemler arası gevşek bağlılığı (Loose Coupling) korumak adına kombo durumundaki değişimleri duyuran OnComboChanged Action event'i fırlatılmıştır.3. Görsel Arayüz (UI Pop) Animasyon Entegrasyonu:RecyclingArea_Module prefabı içerisine ScreenSpace Overlay modunda çalışan yeni bir ComboText TextMeshPro bileşeni eklenmiştir.UIManager.cs scripti OnComboChanged olayını dinleyecek şekilde güncellenmiştir. Katlayıcı aktifleştiğinde (x2, x3) ekranda altın sarısı (#FFD700) renkte metin belirmekte ve \"Lerp\" matematiği kullanılarak 0.15 saniyede %50 büyüyüp (Scale Up) 0.25 saniyede yavaşça normal boyutuna küçülen (Scale Down) bir \"Pop\" (patlama) animasyonuyla oyuncuya dinamik bir görsel geri bildirim sunulmaktadır.4. İki Aşamalı Anti-Cheat (Hile Koruması) Mimarisi:Zemin Bölgesi Koruması (FloorZone.cs): Oyuncuların atıkları bandın sonuna düşürmeyip yere atarak süreyi geçirmelerini engellemek amacıyla yeni bir FloorZone.cs sınıfı yazılmıştır. Zemindeki objelerin Collider'ı Is Trigger yapılarak bu script Environment_Module.prefab zeminine atanmıştır. Yere düşen atıklar için 3 saniyelik bir hoşgörü süresi tanımlanmıştır. VR oyuncusu çöpü 3 saniye içinde tekrar eline almazsa (XRGrabInteractable.isSelected kontrolü), çöp yok edilerek oyuncudan ceza puanı (-5) düşülmüş ve kombosu sıfırlanmıştır.Süre Sonu Puanlama Engeli (BinTrigger.cs): Oyuncuların süre bittikten sonra yerdeki veya ellerindeki atıkları kutulara atarak puan kazanmasını engellemek amacıyla BinTrigger.cs içerisine güvenlik duvarı eklenmiştir. Oyun durumu GameState.Playing olmadığı sürece kutulara giren atıklar yoksayılmaktadır.5. Dal Birleştirme ve Çakışma Yönetimi:Yapılan geliştirmeler sonucunda main dalındaki son değişiklikler feature\/haptic-feedback-system dalı ile sorunsuz şekilde birleştirilmiş (Merge), prefab YAML çakışmaları başarıyla çözülmüştür.Sonuç: Bugün tamamlanan geliştirmelerle oyun tekdüzelikten çıkarılarak heyecanlı bir \"Arcade\" yapısına kavuşturulmuş; görsellik dinamik animasyonlarla desteklenmiş ve oyun dengesini bozabilecek tüm suistimal yolları tamamen kapatılmıştır.Git Commit Mesajları:[11:01] (abd4074) fix(lever): remove duplicate event definition to resolve CS0102 compiler error[13:23] (3ebaf6a) feat(ui): add combo text display and Lerp pop animation in UIManager[13:27] (e07c1c3) feat(ui): add ComboText UI element and bind reference to UIManager[14:54] (a975b36) feat(score): implement combo counter and score multiplier logic Updated ScoreManager to track consecutive successful sorts and scale score rewards. - Added `ComboCount` and `CurrentMultiplier` properties to calculate score multipliers. - Implemented multiplier scaling thresholds (3 consecutive = 2x, 5+ consecutive = 3x). - Added the `OnComboChanged` C# Action event to broadcast combo updates to UI components. - Added combo reset logic when an incorrect bin is targeted or waste is missed.[18:24] (602526d) fix(gameplay): ignore waste sorting in BinTrigger when game is not active[18:25] (974fd97) feat(environment): implement FloorZone anti-cheat script and setup floor prefab collider Created FloorZone script and configured Environment_Module prefab to prevent waste hoarding exploits. - Implemented `FloorZone.cs` to track waste items dropped onto the floor. - Added a 3-second grace period before destroying dropped waste and invoking `OnWasteMissedFloor` penalty event. - Added logic to ignore waste items currently held (`isSelected`) by the VR player. - Set floor collider `isTrigger` to true and attached the `FloorZone` component in `Environment_Module.prefab`.[21:31] (4d3954f) Merge branch 'main' into feature\/haptic-feedback-system"
},
{
"day": 14,
"date": "2026-07-21",
"content": "Faz 3 - Gün 14: İnteraktif Öğretici (Tutorial) Sistemi, Ses\/Animasyon Senkronizasyonu ve UI Cilalama🛠️ Yapılan Teknik Çalışmalar ve Adımlar1. UI ve Kullanıcı Deneyimi (UX) BiçimlendirmeleriZamanlayıcı Formatı: TV ekranında yer alan geri sayım sayacının başına \"Time: \" ön eki eklenerek oyuncunun kalan süreyi daha net anlaması sağlandı (Time: 60).Kombo Yazısı Zamanlayıcısı: Ekranda beliren 2x COMBO! metninin ölçeklenme (Lerp Pop) animasyonu bittikten sonra ekranda takılı kalmaması için UIManager içerisine 1 saniyelik otomatik gizleme zamanlayıcısı eklendi.2. Ses Asset Yönetimi ve SenkronizasyonKayıp Seslerin İçe Aktarılması: Önceki birleştirme (merge) sürecinde ezilerek kaybolan motor döngüsü (engine loop) ve kol klik ses dosyaları projeye tekrar dahil edildi.Ses Senkronizasyonu (AudioManager): Oyun ilk açıldığında arka planda zamansız çalışan motor sesi kontrol altına alındı. Motor sesinin yalnızca oyuncu kolu çekip Playing veya Tutorial durumuna geçtiğinde çalması, GameOver veya MainMenu durumlarında ise otomatik durması sağlandı.3. Görsel Animasyon ve Çark Kontrolü (MachineRotator)Makine üzerindeki dönen çarkların\/pervanelerin oyun başlamadan çalışmasını engellemek amacıyla MachineRotator.cs bileşeni yazıldı. Dönme hareketi GameManager durumuna bağlandı.4. İnteraktif Öğretici (Tutorial) Sisteminin KurulmasıDurum Entegrasyonu (GameManager): GameState enum yapısına Tutorial evresi eklendi. Öğretici esnasında genel geri sayım sayacı donduruldu ve rastgele atık üretimi durduruldu.Yönlendirici Mantık (TutorialManager): Oyuncuyu sırasıyla \"Kolu Çek\", \"Banttaki Atığı Al\" ve \"Doğru Kutuya At\" adımlarıyla yönlendiren modül geliştirildi. İlk tamamlama sonrasında verinin PlayerPrefs ile kaydedilerek tekrar gösterilmemesi sağlandı.Dinamik 3D İşaretçi (Pointer): Oyuncunun etkileşime geçeceği objelerin (Kol, Atık, Kutu) üzerinde süzülen 3D ok işareti (\"▼\") kodsal olarak oluşturuldu. Objenin fiziki sınırları (Collider.bounds) taranarak ok işaretinin objelerin içine saplanması önlendi ve her açıdan görünmesi için kameraya bakma (Billboard) mantığı entegre edildi.Güvenlik Esnetmesi (BinTrigger): Öğretici modundayken atılan atıkların yok olması ve sürecin ilerlemesi için atık kontrol duvarı Tutorial durumunu kapsayacak şekilde güncellendi.5. Sahne Entegrasyonu ve TestlerHazırlanan TutorialManager ve MachineRotator scriptleri MainGame sahnesi ve ilgili modül prefab'larına (CoreSystems_Module, ConveyorSystem_Module) bağlandı.XR Simulator ve VR cihazı ile öğretici akışı, ses tetikleyicileri ve ok işaretlerinin takibi başarıyla test edilerek gün tamamlandı.Git Commit Mesajları:[11:04] (239deb3) style(ui): format countdown display with 'Time:' prefix and integrate TV UI components[15:04] (118833e) chore(audio): re-import missing sound files overwritten during merge[15:59] (2b65724) feat(audio\/environment): synchronize machine engine audio and rotation with game state - Created MachineRotator script to restrict gear rotation to active game states. - Updated AudioManager engine loop to play only when lever is pulled and stop on GameOver\/MainMenu.[16:09] (d6b9cde) fix(ui): update tutorial status prompts and add auto-hide timer to combo display - Added 1-second auto-hide delay to ComboPopAnimation in UIManager after pop animation completes. - Updated main menu status display to guide first-time players to pull the lever.[17:47] (e314ded) feat(tutorial): implement interactive step-by-step tutorial manager and state integration - Added Tutorial state to GameState enum and updated GameManager start flow. - Implemented TutorialManager to guide players step-by-step with dynamic 3D visual pointers. - Updated BinTrigger to allow waste processing during Tutorial state.[18:15] (81216db) chore(scene): bind tutorial components and update module prefabs in main scene - Wired TutorialManager, MachineRotator, and UI references in MainGame scene and module prefabs. - Saved updated scene and prefab state for end-of-day checkpoint."
},
{
"day": 15,
"date": "2026-07-22",
"content": "Faz 3 - Gün 15: Fiziksel VR Buton Modülü, Zincirleme Oyun Akışı ve Çevresel VFX\/Model EntegrasyonuÖzetBugünkü çalışmanın temel amacı; VR projemizde oyuncunun oyunu başlatması, ayarları yönetmesi ve duraklatması için sahnede yer alan fiziksel 3D butonları XR etkileşimli hale getirmektir. Ayrıca oyuna giriş akışını daha doğrusal ve profesyonel bir zincire (Play Butonu -> Kol Çekme -> Vardiya Başlangıcı) bağlamak ve çevreye yönelik görsel geri bildirim (VFX\/İkon) kalitesini artırmak hedeflenmiştir.💻 Yapılan Teknik Çalışmalar1. Zincirleme Oyun Başlangıcı ve Durum Yönetimi (State Machine)GameState durum yapısına ReadyToStart adında yeni bir durum entegre edildi.Oyunun doğrudan kırmızı kolla (Lever) başlaması engellendi. MachineLever.cs güncellenerek kolun çekilme tetikleyicisi sadece oyun ReadyToStart durumundayken çalışacak şekilde kilitlendi.GameManager.cs üzerinde PrepareToStart() metodu yazılarak, Play butonuna basıldığında sistemin kol çekme aşamasına geçişi sağlandı.UIManager.cs güncellenerek TV ekranlarındaki durum bildirimleri (\"PRESS PLAY BUTTON\" ve \"PULL THE LEVER\") bu doğrusal akışa göre düzenlendi.2. Fiziksel VR Buton Altyapısı, Animasyon ve Geri BildirimlerPhysicalVRButton.cs scripti; otomatik GameManager aksiyonlarını (Play, Pause, Retry) gerçekleştirecek, uzaktan XR Raycast ve yakından fiziksel Poke (dokunma) etkileşimlerini destekleyecek şekilde genişletildi.Butona basıldığı an sahne üzerinden otomatik olarak silinmek yerine, buton panelinin (Buttons_Module) kendi yerel taban ekseni etrafında geriye doğru domino tarzı (1 saniye içinde ivmelenerek) devrilmesini sağlayan matematiksel bir Coroutine animasyon motoru yazıldı.Butona basılma hissiyatını artırmak amacıyla HapticManager aracılığıyla VR kontrolcülerine anlık dokunsal titreşim (Haptic Impulse) gönderildi.Butonların basılma anında yoktan var edilip (Instantiate) süresi dolunca otomatik silinen (Destroy) duman ve toz partikül sistemleri (VFX Prefab) bağlandı.3. Çevre Tasarımı ve Prefab ModifikasyonlarıAtıkların banttan düştüğü bölgeye (Destroy Zone) havada kaybolmayı önlemek amacıyla endüstriyel bir 3D atık borusu (Disposal Chute) modeli entegre edildi.Geri dönüşüm kutusu prefab'larına (TrashbinBlue\/Green\/Red\/Yellow) oyuncunun atıkları doğru ayırmasını kolaylaştırmak amacıyla 3D kategori sembolleri (ikonlar) yerleştirildi.Sahne üzerindeki Buttons_Module bileşeni GameManager'a referans olarak atandı ve hiyerarşideki tüm BoxCollider \/ XRSimpleInteractable katman çakışmaları çözülerek sahne kaydedildi.💡 Öğrenilen \/ Pekiştirilen Kavramlar ve TeknolojilerQuaternion ve RotateAround Matematiksel Rotasyonu: Pivot noktası sıfırda olan objeleri kendi görsel merkezleri etrafında bozmadan döndürebilmek için kod tabanlı dinamik pivot hesaplama yöntemleri.Git Commit Mesajları:[11:11] (e3a9a9e) feat(environment): add waste category icons to recycling bins[11:13] (06bca14) Revert \"feat(environment): add waste category icons to recycling bins\" This reverts commit e3a9a9ebc6f54b6e95351d8189aaa67ae5088297.[11:18] (bfb73f9) feat(environment): add waste category icons to recycling bins[12:53] (9ba206d) feat(environment): add disposal pipe model and modularize VR buttons prefab - Added Pipe 3D model at the end of the conveyor belt for realistic waste disposal. - Created Buttons_Module prefab to modularize physical VR button setup.[18:11] (b2a9e10) feat(environment\/vfx): add bin category icons and import custom feedback VFX - Attached 3D category icons to Trashbin Blue\/Green\/Red\/Yellow prefabs for visual bin clarity. - Imported and configured yellow star and hit feedback particle prefab assets.[18:15] (67616d7) feat(core\/interaction): implement modular VR button logic and sequential start flow - Updated PhysicalVRButton to support ButtonType actions, auto-instantiating VFX prefabs, and triggering global haptics. - Updated GameManager with a new ReadyToStart state to bridge the Play Button press with the Lever pull. - Implemented a procedural domino-style falling animation for the buttons module. - Locked MachineLever trigger to only fire when game state is ReadyToStart. - Updated UIManager to display step-by-step guidance on TV screens.[18:17] (19ee77d) chore(scene\/prefabs): integrate physical VR buttons and update main game layout - Configured BoxCollider and XRSimpleInteractable settings on Button_Play and Button_Setting prefabs. - Saved main scene layout modifications including the conveyor disposal pipe. - Assigned Buttons_Module reference to GameManager in the MainGame scene."
},
{
"day": 16,
"date": "2026-07-23",
"content": "Faz 3 - Gün 16: VR World Space UI Entegrasyonu, Ses Yönetimi, Girdi (Input) Kontrolleri ve Atık Nesne Fizik OptimizasyonlarıÖzetBugünkü çalışmanın temel amacı; VR projemizde kullanıcı deneyimini (UX) ve oyun içi kontrolü üst seviyeye çıkarmak adına 3D World Space Ayarlar (Settings) ve Duraklatma (Pause) panellerini oluşturmak, ses seviyelerini canlı olarak yönetebilecek bir ses altyapısı kurmak, VR menü tuşu (Input System) entegrasyonunu sağlamak ve fiziksel nesnelerde yaşanan etkileşim hatalarını gidermektir.1. VR 3D World Space Arayüz (UI) ve Panel MimarisiKlasik 2D arayüz sistemleri VR dünyasında derinlik algısını bozduğu için sahnede oluşturulan Ayarlar ve Duraklatma panelleri World Space moduna geçirilmiştir.Arayüzün VR kontrolcülerinden çıkan lazer ışınları (XR Ray Interactor) ile etkileşime girebilmesi için varsayılan tıklayıcı bileşeni kaldırılmış, yerine TrackedDeviceGraphicRaycaster bileşeni entegre edilmiştir.Hierarchy üzerindeki EventSystem bileşeni VR odaklı XR UI Input Module yapısına dönüştürülmüş; panel ölçekleri (Scale: 0.001) VR ergonomisine uygun olarak göz hizasına konumlandırılmıştır.2. Ses Yöneticisi (AudioManager) ve Canlı Ayar ÇubuklarıAudioManager.cs sınıfı genişletilerek SetBGMVolume (Müzik) ve SetSFXVolume (Ses Efektleri) metotları yazılmıştır.Ayarlar panelinde yer alan müzik ve ses ikonları eklenmiş, UI Slider'ların OnValueChanged olayları doğrudan ses yöneticisine bağlanmıştır. Böylece oyuncunun VR içinden ses seviyelerini canlı olarak kısıp açabilmesi sağlanmıştır.3. VR Menü Tuşu, Duraklatma ve Fiziksel Buton Yaylanma MantığıGameManager.cs içerisinde oyun akışını donduran (Time.timeScale = 0f) ve tekrar başlatan TogglePauseGame() fonksiyonu yazılmıştır.Sol veya sağ VR kontrolcüsündeki menü tuşuna basıldığında (ve PC testlerinde ESC tuşuna basıldığında) duraklatma panelinin otomatik açılması için Unity InputSystem (InputActionReference) altyapısı kurulmuştur.Fiziksel taş butonlara lazer pointer ile tıklandığında butonların çöktükten sonra aşağıda takılı kalmasını önlemek amacıyla PhysicalVRButton.cs içerisine 0.2 saniyelik Otomatik Yaylanma (Auto-Release) coroutine mekanizması eklenmiştir.4. Atık Nesne Fizik Düzeltmeleri ve Sahne TemizliğiCam (Şişe, Kadeh vb.) ve Metal (Kutu, Metal Çubuk vb.) atık prefablari elle tutulduğunda (Grab) nesnelerin aniden ortadan kaybolması (clipping\/disappearance) hatası tespit edilmiştir. İlgili prefablardaki XR Grab Interactable, Rigidbody ve Collider çakışma katmanları yeniden yapılandırılarak sorun çözülmüştür.Sahnede mükerrer oluşturulmuş ve referans hatalarına (NullReferenceException) sebep olan ikinci UIManager bileşeni temizlenerek kod mimarisi stabil hale getirilmiştir.NotWorld Space Canvas & Tracked Graphic Raycaster: VR gözlük içinde 3D arayüz oluşturma ve lazer ışınlarıyla buton\/slider etkileşimi sağlama tecrübesi.Git Commit Mesajları:[13:26] (4634269) fix(interaction\/prefabs): fix glass and metal waste items disappearing when grabbed - Resolved clipping\/disappearance issue when grabbing Glass and Metal waste prefabs in VR hands. - Updated XR Grab Interactable, Rigidbody, and Collider settings across Glass (Bottle, Hurricane, Wine Glass, etc.) and Metal (Soda Can, Metal Bars, Cat Food, etc.) item prefabs. - Updated Button_Setting prefab settings for menu interaction integration.[17:21] (65d1882) feat(assets\/ui): add music\/sound icons and button feedback particle FX - Added UI icons for BGM and SFX volume sliders in the Settings panel. - Imported Hit_04 particle prefab asset for physical button visual feedback.[17:23] (e99efe7) feat(scene\/prefabs): integrate Settings\/Pause panels and update MainGameH layout - Integrated 3D World Space Settings and Pause UI panels into MainGameH scene. - Cleaned up duplicate UIManager component from RecyclingArea_Module prefab. - Configured Tracked Device Graphic Raycaster and EventSystem for VR laser UI interaction.[17:35] (cf6661b) feat(ui\/logic): implement Settings & Pause panel logic, audio volume controls, and VR auto-release buttons - Added SetBGMVolume and SetSFXVolume handlers in AudioManager. - Implemented TogglePauseGame state management in GameManager. - Expanded UIManager to manage Settings\/Pause panel visibilities, UI Pause button, and VR menu input action. - Added auto-release spring mechanics in PhysicalVRButton for raycast\/pointer clicks."
},
{
"day": 17,
"date": "2026-07-24",
"content": "Faz 3 - Gün 17: GameOverPanel Arayüzü, Skor Sıfırlama Mekanizması, Fiziksel 3D Çıkış Butonu ve Lider Tablosu EntegrasyonuÖzetBugünkü çalışmanın temel amacı; VR projemizde oyun döngüsünün (Game Loop) son aşaması olan GameOverPanel arayüzünün yapılması, oyun bittiğinde elde edilen nihai skorun dinamik olarak oyuncuya sunulması, oyunu ve skorları sıfırlayan yeniden başlatma (Restart) altyapısının kurulması, fiziksel 3D Çıkış (Exit) butonunun sahneye entegrasyonu ve takım arkadaşıyla ortaklaşa nesne havuzu (ObjectPoolManager) iyileştirmelerinin gerçekleştirilmesidir.1. GameOverPanel Arayüzü ve Dinamik Skor GösterimiOyun süresi bittiğinde (GameState.GameOver) otomatik olarak tetiklenen 3D World Space GameOverPanel arayüzü UIManager.cs mimarisine entegre edilmiştir.Vardiya sonunda oyuncunun topladığı puan ScoreManager.Instance.CurrentScore verisinden çekilerek panel üzerindeki gameOverFinalScoreText bileşenine dinamik olarak (FINAL SCORE: X) yazdırılmıştır.Oyuncunun yeniden oynama isteğini karşılamak amacıyla RestartGameUI() metodu tanımlanmış; bu buton tetiklendiğinde GameManager.PrepareToStart() çağrılarak oyun süresi yeniden 60 saniyeye ayarlanmış ve arayüz ReadyToStart durumuna geçirilmiştir.2. Skor Sıfırlama ve Oyun Mantığı İyileştirmeleriScoreManager.cs sınıfına ResetScore() metodu eklenerek yeni tura başlandığında mevcut puanın ve kombo katlayıcılarının sıfırlanması sağlanmıştır.GameManager.cs içerisindeki PrepareToStart() metodu güncellenerek oyun süresinin (RemainingTime = 60f) ve ekrandaki zamanlayıcı yayınlarının (OnGameTimeUpdated) anında ilk haline döndürülmesi garantilenmiştir.3. Fiziksel 3D Çıkış (Exit) Butonu ve Çoklu Platform Çıkış MantığıProjeye closeBtn.glb 3D modeli aktarılarak Button_Close adında yeni bir fiziksel buton prefab'ı oluşturulmuş ve sahnedeki Buttons_Module grubuna dahil edilmiştir.PhysicalVRButton.cs scriptindeki ButtonType enum yapısına Exit seçeneği eklenmiştir.Çıkış butonuna basıldığında uygulamanın VR gözlükte\/Build sürümünde kapanması (Application.Quit()), Unity Editor testlerinde ise oynamayı durdurması (EditorApplication.isPlaying = false) amacıyla önkoşullu derleme (#if UNITY_EDITOR) altyapısı yazılmıştır.4. Ses (SFX), Lider Tablosu ve Takım ÇalışmasıCoreSystems_Module içerisindeki AudioManager bileşenine kombo eşiklerine ulaşıldığında tetiklenen ses efekti (comboClip) tanımlanmıştır.Takım arkadaşımın geliştirdiği en yüksek ilk 3 skoru listeleyen Lider Tablosu (scoreboard) MainGameH.unity sahnesine başarıyla entegre edilmiştir.Ekran paylaşımı üzerinden takım arkadaşıyla eş zamanlı çalışılarak nesne havuzundan (ObjectPoolManager) doğan atıkların taşıma bandından kontrolsüzce fırlamasına sebep olan Rigidbody hız sıfırlama sorunu giderilmiştir.Git Commit Mesajları:[10:52] (5b02af0) feat(audio\/ui): integrate combo SFX to AudioManager and add ranking leaderboard to main scene[18:07] (825beee) feat(assets\/prefabs): add physical Exit button 3D model and update Buttons_Module - Imported 3D close\/exit button model (closeBtn.glb). - Created Button_Close prefab for physical exit interaction. - Updated Buttons_Module prefab to include the physical Exit button.[18:08] (aca626c) feat(ui\/logic): implement GameOver panel, score resetting, and physical Exit button type - Added ResetScore method in ScoreManager to reset score and combos on game restart. - Added ButtonType.Exit support in PhysicalVRButton with Editor\/Application quit handling. - Extended GameManager.PrepareToStart to reset score and game timer to 60. - Expanded UIManager to handle GameOverPanel visibility, final score display, and restart triggers.[18:09] (7e8c761) feat(scene): integrate GameOverPanel UI and physical Exit button in MainGameH scene"
},
{
"day": 18,
"date": "2026-07-27",
"content": "Faz 3 - Gün 18: Sahne Çevre Modelleri (TV Askısı & Pano Entegrasyonu), Domino Animasyonu Pivot Düzeltmesi ve Spawner Fizik İyileştirmeleriÖzetBugünkü çalışmanın temel amacı; VR fabrikamızın görsel kalitesini ve atmosferini artırmak amacıyla yeni 3D modellerin (tvholder, pano) projeye kazandırılması, fiziksel buton modülüne 3. buton (Button_Exit) eklendiğinde bozulan devrilme animasyonu matematiksel hesabının düzeltilmesi, taşıma bandı atık üreticisindeki (WasteSpawner) kayma payının (offset) kaldırılarak fizik kararlılığının sağlanması ve oyun içi geliştirici künyesi ile 3D başlık yazılarının sahneye entegre edilmesidir.1. Domino Devrilme Animasyonu Pivot Hesabı Düzeltmesi (GameManager.cs)Buttons_Module grubuna 3. bir fiziksel buton (Button_Exit) dahil edildiğinde, HideButtonsRoutine içerisindeki geometrik merkez ortalaması (center) kaydığı için butonların havaya doğru savrulma bug'ı tespit edilmiştir.GameManager.cs içerisindeki matematiksel pivot hesaplama algoritması refactor edilmiştir. Merkez hesabı strictly sadece \"Play\" ve \"Setting\" butonlarının pozisyonlarını baz alacak şekilde güncellenmiştir.Bu sayede modüle 3. bir buton eklense dahi devrilme aksı (rotationAxis) korunmuş ve butonların geriye doğru domino taşı gibi kusursuzca yere devrilmesi sağlanmıştır. Ayrıca Button_Close prefab adı standartlara uygun olarak Button_Exit şeklinde yeniden adlandırılmıştır.2. Çevre 3D Modelleri ve Prefab YapılandırmalarıTV Askı Aparatı (tvholder.fbx): Fabrika ortamındaki TV monitörünün havada asılı durma illüzyonunu gidermek için 3D TV askı aparatı projeye aktarılmıştır. RecyclingArea_Module prefab'ı güncellenerek TV'nin tavana sağlam bir şekilde monte edilmesi sağlanmıştır.Geliştirici Bilgi Pano Modeli (pano.fbx): Sahneye 3D pano modeli eklenmiş; üzerine projenin geliştiricileri olarak şahsım ve takım arkadaşımın LinkedIn kullanıcı isimleri (hakanuzer & emresatil) künye olarak işlenmiştir.3D Oyun Başlığı: Buttons_Module prefab'ının üzerine oyunun ismi olan 3D \"RECYCLE RUSH\" başlık yazısı yerleştirilmiştir.3.Sahne (Scene) Entegrasyonları ve MizanpajYapılan tüm yeni prefab ve model değişiklikleri MainGameH.unity ana sahnesine yansıtılmıştır.TV askısının tavan yüksekliği, 3D başlık yazılarının açıları ve Çıkış butonunun sahne mizanpajı VR gözlük bakış açısına (User Perspective) göre optimize edilmiştir.Git Commit Mesajları:[11:41] (94f2cb1) fix(ui\/animation): resolve buttons module pivot offset - Renamed Button_Close prefab to Button_Exit for better naming consistency. - Repositioned Button_Exit within the MainGameH scene layout. - Fixed the domino fall animation bug in GameManager.cs (HideButtonsRoutine). The center pivot calculation now strictly uses only the \"Play\" and \"Setting\" buttons, preventing the newly added 3rd button from shifting the rotation axis and causing the module to rotate incorrectly.[18:32] (8655915) feat(assets\/prefabs): add 3D board\/TV holder models and update main menu module styling - Imported 3D models for the info board (pano.fbx) and ceiling TV mount (tvholder.fbx). - Updated RecyclingArea_Module prefab to mount the TV monitor from the ceiling using tvholder model. - Updated Buttons_Module prefab with 3D \"Recycle Rush\" title text and LinkedIn developer credits (hakanuzer & emresatil). - Integrated the physical Exit button into Buttons_Module layout.[18:32] (1a26d07) feat(scene): update MainGameH layout with TV mount, info board, and menu title branding"
},
{
"day": 19,
"date": "2026-07-28",
"content": "VR Projesinde Sahne Senkronizasyonu, Görsel Post-Processing Entegrasyonu, Fizik\/Nesne Havuzu Optimizasyonları ve Çevre Düzenlemeleri1. Sahne Senkronizasyonu ve Oyun Sonu (UI) Akışının TamamlanmasıGeliştirme sürecinde test amacıyla kullanılan MainGameH sahnesinde uygulanan güncel çevre düzenlemeleri ve arayüz geliştirmeleri, projenin ana sahnesi olan MainGame sahnesine aktarılarak senkronize edilmiştir. Bu kapsamda:Oyun bittiğinde beliren GameOverPanel arayüzü ana sahneye entegre edilmiştir.Oyuncunun tur sonunda ulaştığı nihai puanın (Final Score) doğru biçimde ekrana yansıtılması sağlanmıştır.Oyun bitiminde kullanıcının yeniden başlatma yapabilmesine olanak tanıyan fiziki\/arayüzlü Restart buton tetikleyicileri (event trigger) işlevsel hale getirilmiştir.2. Görsel Kalite ve Grafik İyileştirmeleri (Post-Processing)Projenin görsel kalitesini ve oyun içi Arcade atmosferini artırmak amacıyla Universal Render Pipeline (URP) altyapısında post-processing düzenlemeleri yapılmıştır:Projenin QualitySettings ve GlobalVolumeProfile konfigürasyonları güncellenerek ACES Tonemapping renk paleti entegre edilmiştir. Bu sayede renk doygunlukları ve ışık dengesi daha gerçekçi bir form kazanmıştır.Işık kaynağı olan ve parlaması gereken objelerin görünürlüğünü desteklemek için Bloom efekti optimize edilmiş, VR başlıklarında performans kaybı yaratmayacak ideal parametre değerleri tanımlanmıştır.3. Nesne Havuzu (Object Pooling) ve Fizik Hata ÇözümleriOyun esnasında sürekli olarak üretilip silinen atık objelerinin performanslı yönetimi için kullanılan ObjectPoolManager ve zemin ceza mekanizması olan FloorZone üzerinde karşılaşılan fiziksel hatalar giderilmiştir:İç içe veya çocuk (child) Rigidbody bileşenine sahip kompleks atık prefab'larının havuza girip çıkarken fiziki olarak donması (havada asılı kalması) engellenmiştir. ObjectPoolManager fonksiyonu, objenin tüm alt bileşenlerindeki Rigidbody'leri kapsayacak şekilde güncellenerek fiziksel hızlar (linear\/angular velocity) doğru biçimde sıfırlanmıştır.FloorZone (zemin algılayıcı) kodunda yapılan düzenleme ile, havuza geri gönderilip deaktif edilmiş objelerin yanlışlıkla zemin cezası tetiklemesi önlenmiş; sadece aktif olarak yere düşen atıkların tespiti garanti altına alınmıştır.4. Taşıma Bandı Modifikasyonu ve Çevre DüzenlemeleriFiziksel simülasyon sırasında boyutça büyük atıkların (örneğin pizza kutusu veya büyük şişeler) taşıma bandı üzerinde sıkışmasını ve tıkanıklık yaratmasını önlemek amacıyla konsept boyutlandırmalara gidilmiştir:ConveyorSystem_Module ve Conveyor_Long prefab'larının bant genişlikleri artırılarak atıkların bant üzerinde daha rahat akması sağlanmıştır.Genişletilen yeni bant prefab'ları MainGame sahnesine yerleştirilmiş, çevre objelerinin pozisyonları yeni bant boyutlarına göre tekrar hizalanmıştır.Git Commit Mesajları:[13:53] (6177580) feat(scene): sync MainGame scene layout and features with MainGameH - Synchronized all recent environment and UI updates from MainGameH into the primary MainGame scene. - Integrated GameOverPanel UI, final score display, and restart button triggers.[19:10] (8ce4d19) feat(graphics): configure post-processing profile with ACES tonemapping and bloom -[19:11] (669b93e) fix(environment\/pool): resolve child rigidbody pooling and floor penalty detection - Fixed ObjectPoolManager to reset physics for all child Rigidbody components, preventing prefabs with child colliders from freezing in mid-air upon spawn. - Resolved FloorZone waste penalty logic by ignoring deactivated pooled items while ensuring dropped wastes on the floor are correctly detected and penalized.[19:12] (0695735) feat(environment\/scene): expand conveyor belt width and update MainGame scene layout - Increased conveyor belt width in ConveyorSystem_Module and Conveyor_Long prefabs for improved waste transport. - Updated MainGame scene layout to integrate widened conveyor prefabs and latest scene adjustments."
},
{
"day": 20,
"date": "2026-07-29",
"content": "Oyun Durum Yönetimi (GameState) Optimizasyonu, Dinamik Çevre Belirme Animasyonu (Pop-Up Reveal), Spawner\/Trigger Bug Çözümleri ve APK Hazırlık Süreci1. Ana Menü Tasarımı ve Dinamik Çevre Belirme Animasyonu (Clean Start & Pop-Up Reveal)Oyun ilk açıldığında oyuncuyu karmaşık bir nesne kalabalığı yerine sade bir ana menü atmosferiyle karşılamak amacıyla \"Clean Start\" mimarisi kurgulanmış ve kodlanmıştır:Oyun başlangıcında (MainMenu durumunda), oyun alanına ait temel modüller (ConveyorSystem_Module, RecyclingArea_Module, scoreboard ve QC_Drone) görünmez kılınarak (Scale 0) sadece oda duvarları ve ana menü butonları görünür durumda tutulmuştur.Oyuncu fiziksel Play butonuna bastığında, gizlenen bu oyun modüllerinin sahneye sıçrayarak\/büyüyerek belirmesini sağlayan Arcade tarzı Ease-Out-Back (Elastic Bounce) matematiksel animasyonu geliştirilmiştir (GameManager.cs).2. Oyun Durum Akışının (GameState Flow) ve Restart Mantığının İyileştirilmesiOyun sonu (GameOver) ve yeniden başlatma (Restart) süreçlerinde yaşanan kullanıcı deneyimi kusurları ve görsel çakışmalar giderilmiştir:Süre bittiğinde çıkan GameOver ekranında, oyunun en başında beliren ana menü butonlarının (Buttons_Module) tekrar sahneye gelmesi engellenmiştir.Oyuncu GameOver panelindeki Restart butonuna bastığında, çevredeki makinelerin sıfırdan büyüyerek gelme animasyonu veya butonların devrilme süreçleri atlanmış; oyun alanı kurulu vaziyette direkt hazır duruma (ReadyToStart) geçirilerek oyuncunun kolları çekmesi beklenmiştir.3. Algılayıcı (BinTrigger) ve Üretim (WasteSpawner) Bug ÇözümleriGeliştirme sürecinde tespit edilen ve konsolu kirleten\/fiziksel çakışmalara yol açan hatalar üzerinde çalışılmıştır:BinTrigger Hatalı Log Çözümü: Çevre objelerinin boyutu sıfırdan büyürken tetiklenen kutu algılayıcılarının oyun aktif değilken yanlışlıkla kırmızı uyarı log'u vermesi engellenmiştir. OnTriggerEnter içerisindeki kontrol sırası değiştirilerek; temas eden nesnenin atık olup olmadığı durumundan önce oyun durumunun kontrol edilmesi sağlanmıştır.WasteSpawner Duvar Çakışma Önlemesi: Makineden çıkan atıkların tam rastgele (0-360°) açıyla doğması, Pizza Kutusu gibi geniş atıkların makine iç duvarlarına saplanmasına veya dışarı fırlamasına sebep oluyordu. Doğum açısı +-20° bandına çekilerek atıkların makine çıkış tüneline uygun hizada doğması garanti altına alınmıştır.4. Proje Temizliği ve Mağaza (Meta App Lab) HazırlıklarıYapılan APK çıktıları sonrası oluşan ve Git üzerinde 600'den fazla gereksiz değişiklik olarak görünen .utmp, BurstDebugInformation ve yedek klasörler .gitignore dosyasına eklenerek repository temiz tutulmuştur.Oyunun Meta App Lab (Meta Quest Mağazası) Developer Paneline yüklenebilmesi için ilk APK test çıktıları alınmış ve mağaza panel işlemleri için ekip çalışması yürütülmüştür.Git Commit Mesajları:[15:26] (2e0014c) feat(gameplay): add popup environment reveal and refine gameover\/restart state flow - Added an Arcade-style pop-up (EaseOutBack bounce scale) reveal animation for gameplay modules (ConveyorSystem_Module, RecyclingArea_Module, scoreboard, QC_Drone) after pressing Play. - Kept environment modules hidden (scale 0) during MainMenu for a clean initial menu view, leaving surrounding room walls visible. - Prevented physical menu buttons (Buttons_Module) from reappearing on GameOver screen. - Streamlined Restart flow: restarting from GameOver bypasses both the button domino animation and environment reveal, leaving the environment active and prompting the player to pull the lever.[19:30] (b482158) Merge remote-tracking branch 'origin\/final-delivery\/emre' into final-delivery\/hakan"
},
{
"day": 21,
"date": "2026-07-30",
"content": "Sinematik Tanıtım Medyalarının Hazırlanması, Kod Tabanı Entegrasyonu (Git Merge Conflict Çözümü) ve Yayın Öncesi Proje StabilizasyonuA. Resmi Sinematik Tanıtım Fragmanı Entegrasyonu ve Dokümantasyon (docs: add official cinematic gameplay trailer)Medya Hazırlığı ve Entegrasyon: Oyunun temel mekaniklerini, yüksek tempolu atık ayrıştırma süreçlerini ve Sanal Gerçeklik (VR) etkileşimlerini sergileyen resmi sinematik tanıtım videosu hazırlanmış ve proje dokümantasyonuna eklenmiştir.Görsel ve İşitsel Düzenlemeler: Fragmanda arcade temasına uygun olarak dinamik CRT ve Glitch efektleri kullanılmış, sahne geçişleri oyunun ritmine uygun şekilde senkronize edilmiştir.Ses ve Haptic (Dokunsal) İyileştirmeler: Oyuncunun yüksek temposunu ve rekabetçi atmosferini doğru bir şekilde yansıtabilmek adına retro arcade ses efektleri (SFX) eklenmiş ve bas frekanslı dokunsal geri bildirimlerle ses yapısı desteklenmiştir.B. Kod Tabanı Birleştirme ve Çakışma Yönetimi (Merge branch 'main' into release\/hakan-prelaunch-fixes)Projenin ana dalındaki son güncellemeler ile yayın öncesi hata düzeltmelerinin yapıldığı dal birleştirilirken meydana gelen karmaşık Git çakışmaları (merge conflicts) çözümlenmiştir. Çözüm sürecinde incelenen ve optimize edilen temel kod blokları şunlardır:BeltItem.cs (Bant Objesi Kontrolü):Nesnelerin taşıma bandı üzerindeki fiziksel durumları (Kinematic ve Dynamic geçişleri) kontrol altına alınmıştır.Alt Rigidbody'ye (child transform) sahip karmaşık objelerin (örneğin pizza kutusu gibi çoklu parçalı modeller) tutulduktan sonra havuzdan tekrar çıkarken konum\/rotasyon kayması yaşamaması için fabrika ayarlarına sıfırlama mekanizması korunmuştur.BeltMovement.cs (Taşıma Bandı Hareketi):Taşıma bandı üzerindeki objelerin geometrik merkezlerini (itemCol.bounds.center) baz alan kontrol mekanizması doğrulanmıştır. Bu sayede uzun objelerin bant kenarından zamanından önce düşmesi engellenmiştir.Önündeki diğer objelerle çakışmasını engelleyen mesafe tarama (Physics.OverlapSphere) ve hareket güncellemeleri (Physics.SyncTransforms) entegre edilmiştir.ObjectPoolManager.cs (Nesne Havuzlama Yönetimi):Havuzdan yeni obje aktifleştirilmeden önce (SetActive(true) öncesinde) alt objelerdeki Rigidbody bileşenlerinin hızlarının sıfırlanması (linearVelocity, angularVelocity) ve varsayılan fizik kilitlerinin ayarlanması sağlanmıştır.Bu düzenleme ile nesnelerin havuzdan spawn olduğu an havada süzülme veya fırlama bug'ları engellenmiştir.Git Commit Mesajları:[19:32] (6f7944f) docs: add official cinematic gameplay trailer Added the official cinematic gameplay trailer for Recycle Rush VR. The trailer highlights core mechanics, high-speed sorting, and immersive VR interactions using dynamic CRT\/Glitch effects and beat-synced transitions. Audio enhancements include arcade-style SFX and haptic-driven bass drops to accurately reflect the game's fast-paced, competitive atmosphere.[20:12] (2ffa895) Merge branch 'main' into release\/hakan-prelaunch-fixes"
},
{
"day": 22,
"date": "2026-07-31",
"content": "2. Ay Proje Yol Haritası ve Stratejik Planlamaİlk staj ayında başarıyla tamamlanan ve stabilize edilen Recycle Rush VR projesinin ardından, ikinci staj ayında izlenecek teknik yol haritasını ve proje vizyonunu belirlemek üzere takım içi bir değerlendirme ve beyin fırtınası (brainstorming) çalışması gerçekleştirilmiştir. Yapılan analizler doğrultusunda projenin gelişimi için en verimli strateji belirlenmiş ve bu kararlar teknik dokümantasyon (2.AY_PLAN.md) haline getirilerek versiyon kontrol sistemine dâhil edilmiştir.Risk ve Zaman Maliyeti Değerlendirmesi: İkinci ayda sıfırdan tamamen yeni bir oyuna başlamak ile mevcut projeyi geliştirmek alternatifleri kıyaslanmıştır. Sıfırdan bir projeye başlamanın;Uyumlu 3D model arayışı ve optimizasyonu,Sıfırdan ses tasarımı (SFX\/BGM) ve haptic entegrasyonları,Yeni arayüz (UI\/UX) mimarisi inşasıgibi süreçler nedeniyle kısıtlı staj süresini verimsiz kullanmaya yol açacağı tespit edilmiştir.AR Dönüşüm Hedefi: Oyunun Sanal Gerçeklik (VR) ortamından çıkarılarak, oyuncunun gerçek dünyadaki fiziksel çevresiyle entegre çalışan modern bir Artırılmış Gerçeklik (AR - Augmented Reality) deneyimine dönüştürülmesi hedeflenmiştir. Bu sayede projenin mimari kalitesi artırılırken, mevcut kod tabanı en yüksek verimle yeniden kullanılabilir (reusable) kılınmıştır.Git Commit Mesajları:[19:27] (691c009) docs: outline UX and environmental roadmap for AR transition"
},
{
"day": 23,
"date": "2026-08-03",
"content": "Recycle Rush AR Projesi 20 Günlük Uygulama Planı ve Bağımsız AR Dokümantasyonu (README_AR.md) Oluşturmaİkinci staj ayının ilk gününde, Recycle Rush projesinin Sanal Gerçeklik (VR) ortamından çıkarılıp oyuncunun kendi fiziksel odasında oynayabileceği bir Karma Gerçeklik (MR \/ AR - Passthrough) deneyimine dönüştürülmesi için mimari altyapı ve planlama çalışmaları yürütülmüştür. Gün boyunca projenin \"Tek Doğruluk Kaynağı\" (Single Source of Truth) olacak Uygulama Planı (Implementation Plan v8.0) güncellenmiş ve AR versiyonuna özel teknik kılavuz olan README_AR.md dosyası oluşturularak versiyon kontrol sistemine (Git) aktarılmıştır.A. AR Dönüşümü Uygulama Planı ve Sistem MimarisiProjeyi 20 iş günü içerisinde hatasız ve ölçeklenebilir şekilde tamamlayabilmek adına implementation_plan.md dosyası aşağıdaki teknik detaylarla donatılmıştır:20 İş Günlük Detaylı Yol Haritası: 4 ana spint (Faz 0: Altyapı, Faz 1: Ekonomi\/Spawner, Faz 2: Seviyeler\/Görevler, Faz 3: Cila\/VFX, Faz 4: Store\/Test) altında iki geliştiriciye (Task 1 & Task 2) eşit bölüştürülmüş günlük görev planı kurgulanmıştır.MoSCoW Önceliklendirme Matrisi: Zaman baskısını yönetebilmek amacıyla özellikler Must-Have (Passthrough, Spatial Anchors, AR Grab\/Throw), Should-Have (15 Level, XP\/Coin, JSON Save), Could-Have (Görevler, Altın Çöp, 6 Etkinlik) ve Nice-to-Have (Spatial Audio, Konfeti) olarak seviyelendirilmiştir.Durum Makinesi (GameManager State Machine): Oyunun yaşam döngüsü MainMenu ➔ PlacementState (Kutu sabitleme) ➔ CountdownState (3-2-1) ➔ PlayingState ➔ PausedState \/ GameOverState akışıyla durum makinesi mimarisine oturtulmuştur.Matematiksel Dengeleme ve Ekonomi Formülleri:15 seviyelik zorluk matrisi hazırlanmış; seviye ilerledikçe düşme süreleri hızlandırılmış ve sürpriz Altın Çöp (Golden Waste) çıkma oranı %5'ten %25'e yükseltilmiştir.Toplanan Coin'lerin kilit açma, kozmetik skin ve rozet satın alımlarında kullanımı tanımlanmıştır.JSON Serialization Saklama Mimarisi: Oyuncu profil verilerinin (CurrentLevel, TotalXP, TotalCoin, HighScore, UnlockedAchievements) Application.persistentDataPath altında esnek JSON dosyası olarak kaydedilmesi tasarlanmıştır.B. Bağımsız AR Dokümantasyonu ve Kurulum KılavuzuMevcut VR versiyonuna ait README.md dosyasına dokunulmadan, AR versiyonu için sıfırdan README_AR.md dosyası kaleme alınmıştır:Uzamsal Etkileşim ve Oyun Kuralları: Meta Quest Passthrough kameraları ile tavandan açılan portallardan oyuncunun gerçek odasına atık düşme mekaniği dokümante edilmiştir.Mimari Akış Şeması: Atığın portaldan düşüşünden BinTrigger tetiklenmesine, ScoreManager, ComboManager ve EconomyManager servislerinin Action Event'ler ile haberleşmesine kadar olan veri akışı ASCII diyagramları ile şemalaştırılmıştır.Teknoloji Yığını ve Kurulum: Unity 6 LTS, Meta XR SDK, Android Manifest yapılandırmaları ve kablosuz build alma adımları teknik kılavuz olarak eklenmiştir.Git Commit Mesajları:[13:38] (969deb1) docs(ar): update implementation plan for AR transition - Detailed the 20-day Mixed Reality (Passthrough) development roadmap and MoSCoW feature hierarchy. - Integrated 15-level balancing matrix, XP\/Coin economy formulas, and JSON save data architecture. - Outlined GameManager state machine flow, Haptic\/Audio feedback matrices, and performance targets.[18:59] (0f8ce42) docs(ar): add dedicated README_AR documentation - Created README_AR.md specifically for the Mixed Reality (Passthrough) version of Recycle Rush. - Documented physical room mechanics, spatial anchors, level progression, and JSON profile saving. - Added project architecture diagrams, setup prerequisites, and team information."
},
{
"day": 24,
"date": "2026-08-04",
"content": "OpenXR Konfigürasyonu, Scene Understanding Entegrasyonu ve AR Varlık (Asset) Optimizasyonları1. OpenXR Paket ve Özellik Ayarlarının SenkronizasyonuGünün ilk aşamasında, projenin Sanal Gerçeklikten (VR) Karma Gerçekliğe (MR - Passthrough) geçişi kapsamında OpenXR ve Meta XR SDK bağımlılıkları gözden geçirilmiştir. Proje gereksinimlerine uygun olarak OpenXR paket ayarları (OpenXRPackageSettings.asset) güncellenmiş ve el takibi (Hand Tracking), ortam tespiti (Passthrough Feature Layer) gibi kritik alt kütüphanelerin motor düzeyindeki senkronizasyonu sağlanmıştır. Yapılan bu konfigürasyon, sonraki aşamalarda kurulacak olan Scene Understanding API’sinin cihaz üzerinde kararlı çalışabilmesi için gerekli altyapıyı oluşturmuştur.2. AR Setup Tool Geliştirilmesi ve Scene Understanding EntegrasyonuMR mimarisinin en kritik adımlarından biri olan gerçek dünya düzlemlerinin (Zemin ve Duvar) tespiti için entegrasyon çalışmalarına başlanmıştır. Sahnelerin elle kurulması esnasında oluşabilecek insan hatalarını ve karmaşıklığı engellemek amacıyla Tek Sorumluluk Prensibi (Single Responsibility Principle) uyarınca ARSetupTool.cs adında özel bir Editor betiği (C# Script) geliştirilmiştir.Geliştirilen bu otomasyon aracı ile programmatic (kodsal) olarak AR_SceneUnderstanding_Test sahnesi oluşturulmuş ve sahneye şu çekirdek bileşenler eklenmiştir:XR Origin & AR Session: Cihaz konumlandırması ve uzamsal girdi yönetimi.AR Plane Manager: Gerçek ortamdaki yatay (zemin) ve dikey (duvar) yüzeylerin algılanmasını sağlayan mekanizma.AR Point Cloud Manager: Derinlik verilerini nokta bulutları halinde işleyen altyapı.Camera Passthrough Setup: Ana kameranın arka plan temizleme bayrakları (Clear Flags) şeffaf renge çekilerek dış dünya kamera görüntüsünün (Passthrough) doğrudan ekrana basılması sağlanmıştır.3. Geri Dönüşüm Kutusu Prefablarının AR Işıklandırması ve Gölge OptimizasyonuGünün son aşamasında, projedeki görsellerin Karma Gerçeklik ortamına uyumu ve performansı üzerine çalışılmıştır. VR ortamından kalan 3D geri dönüşüm kutusu (Kağıt, Cam, Plastik) prefablarının AR ortamında daha doğal ve performanslı görünmesi amacıyla materyal ve gölge revizyonları gerçekleştirilmiştir.URP Simple Lit Shader Dönüşümü: Gerçek ışık koşullarıyla çakışmayan, mobil cihazlarda gereksiz GPU yükü yaratmayan ve sabit 72+ FPS hedefine katkı sağlayan URP Simple Lit shader’ına geçilmiştir. Dönüşüm sırasında objelerin orijinal renk ve doku (Texture\/Albedo) haritaları korunmuştur. Ayrıca Unity'nin salt-okunur iç paket (Packages\/) materyallerinin bozulmaması için dinamik filtreleme mantığı koda dahil edilmiştir.AR Blob Shadow (Yapay Gölge) Entegrasyonu: Karma gerçeklikte 3D objelerin odanın içinde havada süzülüyormuş gibi görünmesi (Floating Effect) problemini çözmek amacıyla prefabların tabanına PrefabUtility mimarisi kullanılarak şeffaf, çarpışmasız (no-collider) \"Blob Shadow\" düzlemleri eklenmiştir. Yapılan bu görsel dokunuş sayesinde sanal kutuların oyuncunun gerçek odasındaki zeminle fiziksel olarak temas ettiği hissi güçlendirilmiştir.Git Commit Mesajları:[10:29] (7762624) chore(xr): sync OpenXR package feature settings[13:37] (0155268) feat(ar): integrate Scene Understanding API and create test scene - Created ARSetupTool (Editor Script) with Clean Code principles for automated AR setup. - Generated AR_SceneUnderstanding_Test scene programmatically. - Configured XR Origin, AR Session, AR Plane Manager, and AR Point Cloud Manager for room tracking. - Set up main camera clear flags for AR Passthrough support.[17:40] (68e390a) design(prefabs): optimize recycling bins for AR lighting and add blob shadows - Updated ARSetupTool to include automated material and shadow injection tools using PrefabUtility. - Switched Paper, Glass, and Plastic bin materials to URP Simple Lit shader for stable AR lighting. - Added AR Blob Shadows (no-collider, transparent quads) under bin prefabs to prevent floating effect in Mixed Reality. - Ensured immutable Unity package materials (Packages\/) are safely ignored during optimization."
},
{
"day": 25,
"date": "2026-08-05",
"content": "Bugünkü çalışmalar kapsamında, projemizin VR (Sanal Gerçeklik) ortamından AR (Artırılmış Gerçeklik) ve Karma Gerçeklik (MR) ortamına geçiş sürecinin teknik altyapısı oluşturulmuş, cihaz derleme ayarları yapılandırılmış ve nesne havuzlama ile spawner mimarisi AR ortamına uygun hale getirilmiştir.XR Build Ayarları ve Passthrough Entegrasyonu:Meta Quest cihazlarında çalışacak ilk AR yapısının (Build) hazırlanması amacıyla Unity OpenXR ve AR Foundation paket yapılandırmaları gerçekleştirilmiştir.Gerçek dünya görüntüsünün gözlüğe aktarılmasını sağlayan Meta Passthrough teknolojisinin kararlı çalışabilmesi adına XRGeneralSettings ve OpenXRPackageSettings yapılandırmaları güncellenmiştir.Cihaz üzerindeki derinlik tespiti ve zemin algılama (Scene Understanding) mekanizmaları için AR Default Plane prefab yapısı projeye eklenmiş ve fiziksel ortam çarpışmaları (Collisions) için hazırlanmıştır. Fiziksel cihaz testleri öncesinde kullanılmak üzere AR_SceneUnderstanding_Test adında özel bir test sahnesi kurulmuştur.AR Nesne Havuzlaması (Object Pool) ve Portal Spawner Mimarisi:Eski VR mekaniğinde bulunan sabit konveyör bant (Conveyor Belt) bağımlılıkları temizlenmiş; ObjectPoolManager.cs sınıfı AR dünyasına uygun olarak yeniden refaktör edilmiştir.Bellek performansını korumak (Garbage Collector yükünü azaltmak) amacıyla atıkların yeniden kullanılmasını sağlayan havuzlama altyapısı, serbest düşüş (Free-fall gravity) fizikleri ile uyumlu hale getirilmiştir.AR ortamında oyuncunun etrafında dinamik olarak atık objeleri (Kağıt, Cam, Plastik) üreten PortalSpawner.cs sınıfı yazılmıştır. Bu sınıf, oyuncunun kamerasını (XR Origin \/ Main Camera) merkez alarak belirlenen yarıçap ve yükseklikten rastgele koordinatlarda obje doğurma (Spawn) mantığını yürütmektedir.Sonuç:Proje, standart VR ortamından Meta Quest Passthrough destekli AR mimarisine başarıyla taşınmıştır.Bellek yönetimini optimize eden nesne havuzlama sistemi (Object Pool) AR fizikleriyle entegre edilmiştir.Fiziksel ortamda zemin tespiti ve dinamik obje doğurma süreçlerinin teknik temelleri atılmıştır.Git Commit Mesajları:[13:32] (4270d30) chore(xr): configure build settings and prepare AR test scene - Enabled OpenXR and AR Foundation configurations for Meta Quest build. - Updated XRGeneralSettings and OpenXRPackageSettings for Passthrough support. - Added AR Default Plane prefab for physical environment collisions. - Prepared AR_SceneUnderstanding_Test scene for Sabri Emre's physical device testing.[18:12] (777cdd1) feat(ar): implement portal spawner and refactor object pool - Created PortalSpawner.cs to handle randomized waste dropping in AR space. - Implemented radius-based spawning logic around the player's camera. - Refactored ObjectPoolManager.cs to remove legacy VR conveyor belt dependencies. - Updated physics logic to allow free-fall gravity for spawned AR objects."
},
{
"day": 26,
"date": "2026-08-06",
"content": "Bugünkü çalışmalar kapsamında, AR oyunumuzun atık üretim mekanizmasına seviyeye bağlı nadir obje (Golden Waste) üretim algoritması entegre edilmiş, 3D model ve fizik yapılandırmaları tamamlanmış ve geri dönüşüm kutularının (Bin) oyuncuya skor, Coin ve XP kazandıran event tabanlı ödül sistemi geliştirilmiştir.Golden Waste (Altın Çöp) Mimarisi ve Dinamik RNG Algoritması:PortalSpawner.cs sınıfı üzerinde nadir atık üretimi için gerekli konfigürasyon alanları (goldenWastePrefab ve goldenWasteChance) tanımlanmış ve sınıf içerisindeki geçici test kodları temizlenmiştir.Projeye aktarılan Recycle_Coin 3D modeli için merkez (Pivot) noktası düzeltmeleri yapılmış; Rigidbody, Convex MeshCollider ve XR Grab Interactable bileşenleri eklenerek fiziksel etkileşimlere uygun bir Prefab yapısına dönüştürülmüştür.PortalSpawner.cs içerisinde oyunun mevcut zorluk seviyesine (Difficulty Level) bağlı olarak nadir obje düşme ihtimalini %5'ten başlatan ve seviye arttıkça %25'e kadar kademeli yükselten dinamik bir şans (RNG) algoritması yazılmıştır. Şansın yaver gitmediği durumlarda sistemin varsayılan standart atıklara (Kağıt, Cam, Plastik) güvenli şekilde dönmesi (Fallback) sağlanmıştır.Geri Dönüşüm Kutuları (BinTrigger) ve Ödül Event Sistemi:Nesne yönelimli tasarım ilkeleri (Encapsulation ve Loose Coupling) doğrultusunda, çöp kutusu eşleşme sonuçlarını diğer yöneticilere (ScoreManager, EconomyManager vb.) ileten SortResultData paket veri yapısı (struct) genişletilerek CoinChange ve XpChange alanları eklenmiştir.BinTrigger.cs betiği güncellenerek, atılan objenin türü ile kutu türü doğru eşleştiğinde veya yanlış eşleştiğinde tetiklenen C# Action Event mekanizması kurulmuştur.AR test sahnesindeki (AR_SceneUnderstanding_Test.unity) çöp kutularının doğru ve yanlış atış parametreleri (kazandırılacak Puan, Coin ve XP miktarları) yapılandırılmış ve testleri gerçekleştirilmiştir.Sonuç:Seviyeye bağlı dinamik olasılık (RNG) mantığı kurularak oyun içi çeşitlilik ve oyuncu motivasyonu artırılmıştır.Dışarıdan aktarılan 3D modellerin AR\/VR fizik standartlarına uygun hale getirilmesi (Pivot ve Collider optimizasyonu) deneyimi kazanılmıştır.Bağımsız sistemler (Event-Driven Architecture) kullanılarak spagetti koddan uzak, genişletilebilir ve performanslı bir ödül\/skor altyapısı inşa edilmiştir.Git Commit Mesajları:[11:39] (15df05f) chore(spawner): define golden waste configuration fields - Added goldenWastePrefab and goldenWasteChance fields to PortalSpawner.cs. - Cleaned up temporary debug code from Start method.[13:49] (66878f6) feat(spawner): implement dynamic golden waste rng and add coin model - Imported Recycle_Coin 3D model and configured its physics\/collider prefab. - Implemented level-based dynamic probability algorithm (5% to 25%) in PortalSpawner. - Configured safe random chance (RNG) fallback to standard waste items. - Updated UI font assets.[17:13] (f63b847) feat(environment): integrate coin and xp reward events in bin triggers - Expanded SortResultData struct to include CoinChange and XpChange values. - Updated BinTrigger.cs to broadcast detailed reward data upon successful waste matching. - Configured Bin parameters (correct\/incorrect rewards) in AR test scene. - Applied minor OpenXR setting adjustments."
},
{
"day": 27,
"date": "2026-08-07",
"content": "Bugünkü çalışmalar kapsamında, oyunun ana ilerleme ve ekonomi sistemlerini oluşturan LevelManager.cs ve EconomyManager.cs sınıfları yazılmış, spawner mimarisi ile entegre edilmiş ve gelecekteki kayıt (Save\/Load) altyapısına uygun modüler veri yapıları hazırlanmıştır.Seviye İlerleme Sistemi ve Üstel Formül Entegrasyonu:Projenin temel mimarisine uygun olarak LevelManager.cs sınıfı oluşturulmuş ve Singleton tasarım kalıbı (Design Pattern) ile yapılandırılmıştır.Oyuncunun her seviyede daha zor seviye atlamasını sağlayan üstel (exponential) XP artış formülü (TabanXP * (Çarpan ^ (MevcutSeviye - 1))) kodlanmıştır.BinTrigger.cs sınıfından fırlatılan atık ayrıştırma sinyallerine abone olunarak doğru atışlarda XP kazanımı sağlanmış, hedef XP dolduğunda seviye atlama (LevelUp) mekanizması çalıştırılmıştır.Daha önce yazılan PortalSpawner.cs güncellenerek, nadir obje (Golden Waste) düşme ihtimalinin doğrudan oyuncunun gerçek seviyesine (LevelManager.Instance.CurrentLevel) bağlanması sağlanmıştır.Oyun İçi Ekonomi Yönetimi (EconomyManager):Oyuncunun kazandığı para (Coin) bakiyesini güvenli şekilde tutan, güncelleyen ve harcama kontrollerini (SpendCoins) yapan EconomyManager.cs sınıfı geliştirilmiştir.Nesne yönelimli ve gevşek bağlı (Loose Coupling) mimari korunarak, çöp kutularından gelen Coin ödül verileri event'ler üzerinden Ekonomi Yöneticisine aktarılmıştır.Oyun içi seviye atlama dinamikleri üstel matematiksel formüllerle dengelenmiştir.Sorumlulukların Ayrılması (Separation of Concerns) ilkesine sadık kalınarak Ekonomi ve Seviye sistemleri bağımsız yönetilebilir hale getirilmiştir.Git Commit Mesajları:[10:33] (9a59a70) chore(core): initialize manager scripts and sync xr settings - Created initial Singleton skeletons for LevelManager.cs and EconomyManager.cs. - Synced automatically generated Unity OpenXR package settings to keep the workspace clean.[12:21] (2bd0178) feat(core): implement exponential level progression and spawner integration - Developed LevelManager.cs with exponential XP calculation and LevelUp events. - Updated PortalSpawner.cs to fetch player level dynamically from LevelManager for Golden Waste RNG. - Prepared modular LevelSaveData structure for future JSON serialization by teammate.[18:14] (0112bdc) feat(economy): implement economy manager and configure ar test scene - Developed EconomyManager.cs to handle coin accumulation and spending validations. - Subscribed EconomyManager to BinTrigger waste processing events securely. - Added core managers to the AR_SceneUnderstanding_Test scene hierarchy for testing. - Prepared modular EconomySaveData structure for future JSON serialization."
},
{
"day": 28,
"date": "2026-08-10",
"content": "**Yapılan Çalışmalar ve Teknik Detaylar:**Bugünkü çalışmalar kapsamında, AR\/VR ortamında oyuncunun oyunu duraklatabilmesini sağlayan 3D Pause Menüsü ve takip mekanizması kodlanmış, oyuna dinamizm katan 6 farklı rastgele etkinliği yöneten `EventManager.cs` mimarisi geliştirilmiş ve tüm bu yeni sistemler test sahnesine entegre edilerek yapılandırılmıştır.1. **3D World Space Pause Menüsü ve Takip Sistemi (UI):** - VR\/AR ortamlarında kullanıcı konforunu korumak ve derinlik algısını bozmamak amacıyla **World Space Canvas** yapısı tercih edilmiştir. - Menünün oyuncunun baş\/bakış hareketlerini yumuşak bir süzülme (Lerp\/Slerp) efektiyle takip etmesini sağlayan `UIMenuFollower.cs` betiği yazılmıştır. - `GameManager` durumlarını (`GameState.Paused` \/ `Playing`) dinleyen `PauseMenuController.cs` sınıfı geliştirilmiş; Devam Et (Resume), Yeniden Başlat (Restart) ve Çıkış (Quit) buton işlevleri atanmıştır.2. **Rastgele Etkinlik Yönetimi ve Oyun Mekanikleri (Core):** - Belirli bekleme ve aktiflik süreleri dahilinde otomatik olarak rastgele modlar başlatan `EventManager.cs` sınıfı kurulmuştur. - `SlowMotion` modunda zaman ölçeği (`Time.timeScale`) `0.5f` seviyesine çekilerek zaman bükülmesi sağlanmıştır. - `PortalSpawner.cs` güncellenerek `SpeedMode` ve `FrenzyMode` durumlarında atık düşme hızları artırılmış, `LuckyDrop` durumunda ise Altın Çöp (Golden Waste) çıkma ihtimali %80'e yükseltilmiştir. - `LevelManager.cs` ve `EconomyManager.cs` sınıfları güncellenerek `DoubleXP` ve `DoubleCoins` etkinlikleri esnasında kazanılan XP ve Para miktarları 2 katı çarpanla hesaplanmıştır.3. **Sahne Yapılandırması ve XR Ayarları (Scene & Chore):** - Oluşturulan 3D Pause Canvas'ı, takip bileşenleri ve `EventManager` yapısı `AR_SceneUnderstanding_Test.unity` test sahnesindeki ilgili GameObject'lere bileşen olarak eklenmiştir. - World Space Canvas referansları ve takip mesafeleri (Offset) sahne üzerinde ayarlanmıştır. - Otomatik güncellenen OpenXR paket ayarları proje ortamı ile senkronize edilmiştir.Git Commit Mesajları:[07:15] (bf024c9) feat(ui): implement 3d world space pause menu and dynamic follower - Created UIMenuFollower.cs for smooth AR\/VR gaze\/wrist tracking in world space. - Implemented PauseMenuController.cs integrated with GameManager state changes. - Added UI button listeners for Resume, Restart, and Quit actions. - Updated UI font assets.[12:43] (9940d3e) feat(core): implement random event manager and mechanic modifiers - Developed EventManager.cs with a random event cycle (SpeedMode, LuckyDrop, DoubleXP, etc). - Updated PortalSpawner.cs to listen for SpeedMode, FrenzyMode, and LuckyDrop events. - Updated LevelManager.cs to apply 2x multipliers during DoubleXP events. - Updated EconomyManager.cs to apply 2x multipliers during DoubleCoins events. - Implemented time scale manipulation for SlowMotion events.[15:11] (7792512) chore(xr): configure test scene with new managers and pause ui - Added EventManager and PauseMenuController components to the AR test scene. - Configured World Space Canvas references and offsets. - Synced automatically modified OpenXR package settings."
},
{
"day": 29,
"date": "2026-08-11",
"content": "Bugünkü çalışmalar kapsamında, oyundaki görev döngüsünü yöneten MissionManager.cs mimarisi kurulmuş, oyuncunun ardışık doğru atışlarını ödüllendiren Kombo Sistemi geliştirilmiş ve AR\/VR dünyasında süzülen Floating UI (Süzülen Arayüz) bileşenleri projeye entegre edilmiştir.Görev Sistemi (MissionManager) ve Kombo Altyapısı:Projenin temel mimarisine uygun olarak MissionManager.cs sınıfı Singleton tasarım kalıbı ile oluşturulmuş ve MissionType enum yapısı tanımlanmıştır.Her seviye için dinamik görev hedefleri (\"5 Cam Atık At\", \"200 XP Kazan\" vb.) üreten ve tamamlandığında oyuncuya otomatik olarak XP ve Coin ödülleri aktaran görev mantığı kodlanmıştır.BinTrigger.cs güncellenerek SortResultData paketine ProcessedWasteType alanı eklenmiş, böylece atılan atığın türünün doğruluğu görev yöneticisine raporlanmıştır.Yine BinTrigger.cs içerisine ardışık hatasız atışları sayan kombo takip algoritması yerleştirilmiş, hatalı atışlarda komboyu sıfırlayan yapı kurulmuştur.Süzülen Arayüzler (Floating UI) ve Görselleştirme:Aktif Görev Paneli (ActiveMissionUI.cs): Gerçek oda ortamında süzülen World Space Canvas üzerinde aktif görevin ilerlemesini (Örn: \"3 \/ 5 Glass\") anlık olarak güncelleyen ve görev bittiğinde görsel geri bildirim sunan arayüz yazılmıştır.XP İlerleme Barı (XPBarUI.cs): Oyuncunun mevcut seviyesini ve XP ilerlemesini Slider üzerinde pürüzsüz bir animasyonla (Lerp) görselleştiren bileşen kodlanmıştır.Kombo Bildirim Pop-up'ı (ComboUI.cs): Kombo yapıldığında havada beliren, büyüyüp zamanla sönümlenerek (Fade Out & Scale) kaybolan görsel animasyon yapısı geliştirilmiştir.Sahne Yapılandırması ve Entegrasyon:Geliştirilen MissionManager, ActiveMissionUI, XPBarUI ve ComboUI bileşenleri AR_SceneUnderstanding_Test.unity test sahnesindeki ilgili GameObject yapılarına atanmıştır.TextMeshPro varsayılan font yapılandırmaları ve OpenXR paket ayarları proje ile senkronize edilmiştir.Git Commit Mesajları:[10:24] (8bdf3ec) chore(core): initialize mission manager skeleton and enums - Created MissionManager.cs with basic Singleton pattern. - Defined MissionType enum (CollectWaste, EarnXP, PlayTime) for upcoming mission system.[13:15] (0e9582c) feat(core): implement mission manager and combo tracking mechanics - Updated BinTrigger.cs to track consecutive correct throws for Combo system. - Added ProcessedWasteType to SortResultData for accurate mission tracking. - Developed MissionManager.cs to generate and track level-based dynamic missions. - Implemented automatic XP and Coin rewards upon mission completion.[18:11] (60f3aa3) feat(ui): implement floating ui for missions and xp with scene setup - Created ActiveMissionUI.cs to display current mission progress dynamically. - Implemented XPBarUI.cs with smooth lerp animation and level indicator. - Developed ComboUI.cs for transient combo pop-up animations (fade and scale). - Added UI components to AR_SceneUnderstanding_Test hierarchy. - Synced TMP font fallbacks and OpenXR settings."
},
{
"day": 30,
"date": "2026-08-12",
"content": "Bugün proje kapsamında oyundaki bölüm ilerlemesini ve seviye seçimini yönetecek olan 15 Seviyelik Seviye Seçim Haritası (Level Selection Board) ve Yıldız Değerlendirme Sistemi geliştirilmiştir.İskelet Kod Yapılarının Oluşturulması:Proje mimarisine uygun olarak seviye seçim mantığını yönetecek LevelSelectionManager.cs sınıfı Singleton tasarım kalıbı (Singleton Pattern) ile oluşturulmuştur.Her bir bölüm butonunun arayüz davranışını kontrol edecek LevelCardUI.cs sınıfının temelleri atılmıştır.Seviye Seçimi ve Yıldız Mantığının (Core Logic) Kodlanması:15 farklı aşamadan (Stage) oluşan bölüm sistemi kurgulanmış; ilk seviye varsayılan olarak açık, sonraki seviyeler ise bir önceki seviye tamamlandıkça açılacak şekilde dinamik kilit açma (Unlock Mechanism) algoritması yazılmıştır.Oyuncunun başarımını ödüllendirmek amacıyla 3'lü Yıldız Sistemi geliştirilmiştir:1. Yıldız: Aktif bölüm görevinin (MissionManager) başarıyla tamamlanması,2. Yıldız: Bölüm içi belirlenen hedef XP\/Skor puanına ulaşılması,3. Yıldız: Bölüm esnasında hedeflenen maksimum kombo sayısına (≥3≥3 Combo) ulaşılması kriterlerine bağlanmıştır.Arayüz tarafında (LevelCardUI.cs), bölümlerin kilit durumuna göre buton etkileşimlerinin devre dışı bırakılması, kilit kaplamalarının (Lock Overlay) gösterilmesi ve kazanılan yıldız sayısına göre yıldız ikonlarının renklerinin dinamik olarak güncellenmesi sağlanmıştır.İlerleyen süreçte kayıt sistemine (SaveManager) veri aktarabilmek için LevelSelectionSaveData yapısı kurgulanmıştır.Git Commit Mesajları:[10:24] (7465016) chore(ui): initialize level selection board skeletons - Created LevelSelectionManager.cs with basic Singleton pattern. - Created LevelCardUI.cs skeleton for managing individual level buttons. - Prepared script structures for the upcoming 15-level board and star rating system.[18:49] (4eb7b36) feat(core): implement level selection manager and card ui logic - Developed LevelSelectionManager to track 15 levels and handle unlock progression. - Implemented star evaluation logic based on mission completion, score targets, and max combo metrics. - Created LevelCardUI script to dynamically update button interactability, lock overlays, and star visuals.[18:50] (cd321b0) chore(config): update xr plug-in management and package settings - Updated XR Plug-in Management and AndroidXR settings for better editor simulation compatibility. - Synchronized manifest.json and packages-lock.json with the latest XR Interaction Toolkit dependencies."
},
{
"day": 31,
"date": "2026-08-13",
"content": "AR Proje Mimarisi Dönüşümü, UI Durum Yönetimi ve Unity 6 API GüncellemeleriAR Oda Ölçekli (Room-Scale) Oyun Mimarisine Geçiş:Projedeki sabit makine ve taşıma bandı (ConveyorSystem) bağımlılıkları kaldırılarak oyun oda ölçekli (Room-Scale AR) bir deneyime dönüştürüldü.GameManager sınıfı refactor edilerek taşıma bandı ve fiziksel buton mantığı temizlendi.AR Foundation ARPlaneManager event'lerini dinleyen ARBinPlacer adında yeni bir sınıf yazıldı. Bu sınıf, ortam tarandıktan sonra bulunan ilk yatay düzleme (zemin) geri dönüşüm kutularını (RecyclingArea_Module) otomatik olarak yerleştirmektedir.Oyuncunun etrafındaki dinamik bir alanda tavan hizasından rastgele çöpler düşürmek için PortalSpawner sınıfı doğrudan GameManager durum motoruna (State Machine) bağlandı.Dinamik UI Yönetimi ve Editör Hareket (Locomotion) Sistemi:Oyun içi arayüzün karmaşıklığını önlemek için UIManager sınıfı GameState (oyun durumları) yapısına tam entegre edildi. Seviye seçme panosu (LevelSelectionBoard), görev paneli, XP barı ve kombo panellerinin oyun açılışında, geri sayımda ve oyun esnasında otomatik olarak açılıp kapanması sağlandı.VR kaskı takmadan Unity Editör içerisinde hızlı ve kolay test yapabilmek amacıyla Yeni Input Sistemi (UnityEngine.InputSystem) kullanılarak DebugKeyboardMover scripti geliştirildi. Bu sayede WASD tuşlarıyla oyun alanında gezinme imkanı sağlandı.Unity 6 API Modernizasyonu ve Veri Kalıcılığı (Save System):Unity 6.0 standartlarına uyum sağlamak amacıyla tüm yöneticilerdeki eskimiş (obsolete) FindObjectOfType çağrıları FindFirstObjectByType ve FindObjectsByType ile güncellendi.ARSurfaceConfigurator scriptinde meydana gelen CS0200 derleyici hatası trackablesChanged.AddListener() kullanılarak çözüldü.Görev sistemindeki veri kalıcılığını (Data Persistence) sağlamak adına MissionManager içerisine MissionSaveData yapısı eklendi.BinTrigger sınıfındaki kullanılmayan _incorrectXp değişkeni (CS0414 uyarısı) temizlenerek kod mimarisi (Clean Code) standartlarına uygun hale getirildi.XR Interaction Toolkit ve XR Ayarları Yapılandırması:XR Interaction Toolkit paketindeki tek bir GameObject üzerinde tek bir XRBaseInteractor bulunabilme kuralı gereğince, controller prefabs (XR Controller Left\/Right) parent-child yapısına geçirildi. XR Direct Interactor ve XR Ray Interactor bileşenleri ayrıştırılarak çakışmalar giderildi.Editör simülasyonu ve Android XR uyumluluğu için OpenXR ve AndroidXR paket ayarları güncellendi.Sonuç:Bugün yapılan çalışmalar sayesinde projenin teknik borçları (Technical Debt) temizlenmiş, Unity 6 ve XR Interaction Toolkit uyumsuzlukları giderilmiştir. Proje, sabit bir VR simülasyonundan oyuncunun kendi fiziksel odasında oynayabileceği dinamik ve modüler bir AR deneyimine başarıyla dönüştürülmüştür.Git Commit Mesajları:[10:19] (0fa15af) refactor(core): remove unused _incorrectXp variable from BinTrigger - Cleaned up unused _incorrectXp serialized field in BinTrigger.cs to resolve compiler warning CS0414. - Aligned with the design decision where incorrect throws do not deduct player XP.[19:06] (85251aa) feat(ui): implement dynamic panel visibility and editor locomotion - Updated UIManager to handle the visibility of LevelSelectionBoard, MissionPanel, XPPanel, and ComboPanel based on GameState. - Created DebugKeyboardMover using the New Input System to allow WASD movement in the Unity Editor without a headset. - Updated UI font assets.[19:07] (f56954a) refactor(core): update obsolete Unity APIs and implement mission save data - Replaced obsolete FindObjectOfType with FindFirstObjectByType and FindObjectsByType across manager scripts. - Fixed CS0200 error in ARSurfaceConfigurator by using trackablesChanged.AddListener(). - Implemented MissionSaveData struct in MissionManager to prepare for data persistence.[19:24] (8cd9daa) feat(ar): shift to room-scale paradigm with auto bin placement and dynamic spawner - Refactored GameManager to remove conveyor belt and physical button dependencies. - Created ARBinPlacer to automatically instantiate and place recycling bins on detected horizontal planes. - Modified PortalSpawner to integrate directly with GameManager for raining waste around the player. - Updated AR_SceneUnderstanding_Test scene hierarchy to reflect the new room-scale logic.[19:25] (2fb1038) chore(xr): configure separate ray\/direct interactors and update openxr settings - Separated XR Direct Interactor and XR Ray Interactor into parent\/child objects on controller prefabs to fix XRI base interactor conflicts. - Updated OpenXR and AndroidXR package settings for better editor simulation compatibility."
},
{
"day": 32,
"date": "2026-08-14",
"content": "14 Ağustos 2026 (veya defterindeki bugünün tarihi) Konu: AR Oyun Akışı Hata Ayıklama, Singleton Yaşam Döngüsü Optimizasyonu ve VFX Altyapı HazırlığıYapılan Çalışmalar: Bugünkü mesaimde, projenin kullanıcı arayüzü (UI) ve sahne akışı üzerinde meydana gelen kritik bir başlatma hatasını (Initialization Bug) çözmeye ve oyunun görsel kalitesini artıracak VFX (Görsel Efekt) sistemlerinin altyapısını kurmaya odaklandım.Günün ilk yarısında, oyun başlatıldığında UI butonlarının tepki vermemesi sorununu inceledim. Hata ayıklama süreçleri sonucunda, sorunun oyunun temel yöneticilerini barındıran Core_Managers objesinin çalışma zamanında (runtime) kendini yok etmesinden kaynaklandığını tespit ettim. Detaylı StackTrace analizleri yaparak sorunun kök nedenine ulaştım: TutorialManager scripti içerisindeki öğretici (tutorial) atlama mantığında yazılan Destroy(this.gameObject) komutu, sadece ilgili scripti silmek yerine hatalı bir şekilde bağlı bulunduğu ana yönetici objesinin tamamını siliyordu. Bu kodu Destroy(this) olarak güncelleyerek \"Singleton Suicide\" (Singleton İntiharı) olarak bilinen bu kritik bellek\/sahne hatasını kalıcı olarak çözdüm.Ayrıca ileride benzer Singleton erişim hatalarını anında tespit edebilmek amacıyla DebugButtonTest adında bir hata ayıklama altyapısı geliştirdim ve GameManager yaşam döngüsü loglarını iyileştirdim. Bu çözümün ardından, AR ortamı için geliştirilen UIManager yapısını yeni oyun durumu (State Machine) akışına uygun hale getirdim ve AR_SceneUnderstanding_Test sahnesindeki hiyerarşiyi düzenledim.Günün ikinci yarısında, projenin \"Görsel Cila\" (Visual Polish) aşaması için gerekli hazırlıklara başladım. Oyuncu etkileşimlerini ödüllendirmek ve oyun hissini (Game Feel) güçlendirmek amacıyla; konfeti patlaması, ekran parlaması (Flash) ve altın obje parıltısı (Shine) gibi yeni nesil partikül efektlerinin (VFX) projeye entegrasyonunu sağladım. Bu efektlerin kod tabanından merkezi olarak yönetilebilmesi için VFXManager altyapısını kurdum. Son olarak, proje repozitorisinin temiz kalması için .gitignore konfigürasyonlarını güncelleyerek bugünkü görevlerimi tamamladım.Git Commit Mesajları:[10:31] (fd2de1c) feat(vfx): create VFXManager foundation for visual polish effects[18:08] (4643c2f) ix: resolve Core_Managers self-destruction during initialization Fixed a critical singleton bug in TutorialManager where Destroy(this.gameObject) unintentionally destroyed the entire Core_Managers root object instead of just the script component. Improved GameManager lifecycle logging and added DebugButtonTest for robust UI click validation.[18:09] (72811d8) feat(ui): update scene configuration and UI manager for AR flow Updated UIManager to properly handle the new AR state machine flow. Adjusted the AR_SceneUnderstanding_Test scene hierarchy and applied changes to the RecyclingBins prefab for better interaction compatibility.[18:09] (cf3265d) feat(vfx): add particle effects and prefabs for visual polish Imported and configured confetti, flash, and shine VFX prefabs. These assets are prepared for the upcoming visual polish task, which will include gold waste shine and combo visual feedback."
},
{
"day": 33,
"date": "2026-08-17",
"content": "AR Güvenlik Yönetimi Geliştirmeleri, XR Origin Optimizasyonu ve Kod TemizliğiYapılan Çalışmalar: Bugünkü mesaimde, projenin kullanıcı deneyimini (UX) ve temel donanım entegrasyonlarını iyileştirmeye yönelik görevleri tamamladım.Günün ilk bölümünde projenin kod tabanında temizlik (refactoring) çalışmaları yaptım. Geçtiğimiz günlerde hata ayıklama (debugging) süreçleri için GameManager sınıfına eklenen geçici log ve uyarı sistemlerini temizleyerek kodun okunabilirliğini ve performansını artırdım. Buna paralel olarak arayüzde (UI) kullanılan font dosyalarının render kalitesini artırmak için konfigürasyon güncellemeleri gerçekleştirdim.Günün en önemli görevi olarak, Artırılmış Gerçeklik (AR) deneyimini kesintiye uğratabilecek çevresel faktörlere (özellikle düşük ışık) karşı bir güvenlik sistemi tasarladım. Bu amaçla EnvironmentSafetyManager adında yeni bir yönetici sınıfı geliştirdim. Bu sistem, cihazın uzamsal takibini (XR tracking state) saniye saniye dinleyerek, odanın ışığı yetersiz kaldığında veya kafa takibi bozulduğunda oyunu otomatik olarak duraklatmaktadır (Pause). Geliştirdiğim bu altyapıyı UIManager ile entegre ederek, takip kaybolduğunda kullanıcının ekranında \"Odayı Aydınlatın\" uyarısı çıkmasını ve sorun çözüldüğünde oyunun akıcı bir şekilde devam etmesini sağladım.Son olarak, donanım girdi ve takip kapasitesini artırmak amacıyla projede kullanılan standart XR Origin (AR) yapısını, daha güncel ve modüler olan XR Origin (XR Rig) prefabı ile değiştirdim. Yeni sistemin sorunsuz çalışabilmesi için sahnede yer alan otomatik nesne yerleştirme (ARBinPlacer vb.) sistemlerini güncelledim ve OpenXR paket ayarlarını optimize ederek bugünkü görevlerimi başarıyla tamamladım.Git Commit Mesajları:[10:24] (f82e54d) chore: clean up debug logs and update font asset Removed obsolete OnDestroy debug logs from GameManager to maintain a clean codebase. Updated ChakraPetch-Medium SDF font asset for better UI rendering compatibility.[22:43] (34deb30) feat(ux): implement AR tracking safety system and update scene flow Created EnvironmentSafetyManager to monitor XR tracking state and pause the game when tracking is lost (e.g. low light). Integrated the safety warning panel into UIManager. Updated AR_SceneUnderstanding_Test scene and RecyclingBins prefab to support the new XR Origin setup.[22:43] (195bff4) chore: update OpenXR settings and UI font asset Updated OpenXR package settings for better device compatibility and simulator tracking. Refreshed ChakraPetch-Medium SDF font asset to maintain UI rendering quality."
},
{
"day": 34,
"date": "2026-08-18",
"content": "UI\/UX İyileştirmeleri, Fizik Motoru Hata Çözümleri ve Görsel Efekt (VFX) EntegrasyonuYapılan Çalışmalar:Bugünkü mesai kapsamında, Sanal Gerçeklik (VR) projesinin temel oynanış döngüsünü (core loop) etkileyen kritik hatalar (bug) giderilmiş, oyun içi arayüz dinamikleri geliştirilmiş ve yeni görsel efektler projeye entegre edilmiştir. Gerçekleştirilen işlemler şu başlıklarda toplanmıştır:1. Proje Altyapısının Hazırlanması ve Konfigürasyon:Güne proje asetlerinin güncellenmesiyle başlandı. Arayüzde kullanılacak olan \"ChakraPetch SDF\" font dosyaları yenilendi ve OpenXR paket ayarları güncellenerek projenin VFX (Görsel Efekt) entegrasyonu aşamasına stabil bir şekilde geçmesi sağlandı.2. Kayıt Sistemi (Save System) ve UI Senkronizasyonu:Oyuncuların görevleri bitirmesine rağmen bir sonraki seviyenin arayüzde kilitli kalması sorunu tespit edildi. Seviye kilitlerinin kalıcı olarak diske yazılması için LevelSelectionManager içerisine PlayerPrefs tabanlı bir kayıt\/yükleme sistemi entegre edildi.Arayüz paneli (LevelCardUI) her aktif edildiğinde (OnEnable) kendini güncelleyecek şekilde revize edilerek veri asenkronizasyonu engellendi.3. Unity Fizik Patlaması (Physics Explosion) Hatasının Giderilmesi:Geri dönüşüm atıklarının Obje Havuzundan (Object Pool) sahneye çağrılırken eski hızlarını (velocity) korumalarından dolayı aşırı süratle uzağa fırlatılması sorunu (Physics Explosion) analiz edildi.Objeler havuzdan aktif edilmeden önce tüm doğrusal (linear) ve açısal (angular) hız değerleri kod üzerinden sıfırlandı. Ayrıca objelerin doğma yüksekliği artırılarak zemine saplanmaları önlendi.4. Oyun Sonu (Game Over) Paneli Yönlendirmeleri:Oyun bitiş ekranındaki arayüz butonları (Restart ve Next Level) dinamik hale getirildi.Görev tamamlanmadıysa \"Next Level\" butonunun etkileşimi (interactable) kapatılarak mantıksal bir akış sağlandı. \"Restart\" butonuna basıldığında ise mevcut görevdeki ilerleme (progress) sıfırlanarak oyuncuya temiz bir tekrar hakkı tanınması sağlandı.5. \"Golden Waste\" Görsel Efekt (VFX) Entegrasyonu:Oyun içine özel bir obje olarak eklenen \"Altın Çöp\" (Golden Waste) mekaniği için görsel geri bildirim sistemleri geliştirildi.Yeni FX prefab'ları (Flash_round_ellow, Shine_ellow) ve puan sistemi için RecycleCoin prefab'ı oluşturularak ana sahneye (MainGameH) entegre edildi. Bu sayede oyuncu deneyimi (UX) görsel açıdan güçlendirildi.Kazanımlar: Obje Havuzu (Object Pooling) sistemlerinde bellek ve fizik yönetiminin önemi kavrandı; Unity'de UI olaylarının (Event Listener) ve oyun durumu (Game State) yönetiminin birbiriyle nasıl senkronize çalışması gerektiği tecrübe edildi.Git Commit Mesajları:[10:28] (13b2241) chore: refresh font assets and OpenXR config Refreshed ChakraPetch SDF font and OpenXR package settings for today's development session. Preparing project state for the VFX integration phase.[20:26] (42307ed) fix: resolve level unlock UI bug and implement PlayerPrefs save system[20:27] (bcfeb2d) fix: resolve physics explosion on waste spawn[20:30] (a2a7c70) feat: implement GameOver panel routing for Restart and Next Level actions[20:31] (753d4e0) feat: integrate Golden Waste VFX and update core prefabs\/scenes Added new visual effects and scripts for golden waste items. Updated MainGameH scene and core prefabs (bins, coin, fx) to support the new visual feedback systems."
},
{
"day": 35,
"date": "2026-08-19",
"content": "Oyun İçi Seviye Genişletmesi (Level Expansion), Zorluk Matrisinin Dengelenmesi (Balancing Matrix) ve Spawner (Olasılık) Algoritmalarının GeliştirilmesiYapılan Çalışmalar ve Geliştirmeler: Bugünkü mesai kapsamında, geliştirilmekte olan VR\/AR oyun projesinin oynanabilirlik (gameplay) süresinin uzatılması ve oyun mekaniklerinin oyuncu deneyimine daha iyi adapte olması amacıyla geniş çaplı mimari güncellemeler yapılmıştır.1. Seviye (Level) Sisteminin Genişletilmesi ve Zorluk Kalibrasyonu:Oyunun maksimum seviye sınırı (Level Cap) 15'ten 30'a yükseltildi ve LevelSelectionBoard arayüzü bu kapasiteyi destekleyecek şekilde güncellendi.Seviyeler ilerledikçe XP gereksinimlerinin aşırı ve ulaşılamaz seviyelere çıkmasını önlemek amacıyla üstel XP çarpanı değeri kalibre edilerek düşürüldü.GameManager scripti üzerinde yapılan geliştirme ile oyun süresi statik olmaktan çıkarılarak dinamik hale getirildi (Her seviye atlandığında baz süreye +10 saniye eklenmesi sağlandı). Ayrıca görev hedefleme algoritmaları bu yeni sürelere göre senkronize edildi.2. Kayıt Sistemi (Save\/Load) ve QoL (Quality of Life) İyileştirmeleri:Eski 15 bölümlük oyuncu kayıt dosyalarının (Save Data), 30 bölümlük yeni sistemde bozulmalara yol açmaması için veri birleştirme (Data Merging) mantığı kodlandı.Oyuncunun menüde zaman kaybetmesini önlemek amacıyla, oyun başlatıldığında ulaşılan en yüksek seviyenin tespit edilip \"Otomatik Başlatma\" (Auto-start) işlemini gerçekleştirecek algoritma entegre edildi.\"Restart\" (Yeniden Başlat) mekanizmasında yaşanan \"eski objelerin sahnede kalması\" problemi, ObjectPoolManager sınıfına ReturnAllToPool() fonksiyonunun yazılmasıyla çözüldü.3. Görev Odaklı Yapay Zeka \/ Olasılık (Mission-Biased RNG) Sistemi:Oyuncu tecrübesini iyileştirmek için PortalSpawner ve WasteSpawner bileşenleri güncellendi.Temel atık doğurma (spawn) süreleri kısaltıldı ve sistemin DifficultyManager (Zorluk Yöneticisi) ile dinamik haberleşmesi sağlandı.Geliştirilen \"Mission-Biasing\" algoritması sayesinde; oyuncuya aktif olarak atanan görev türündeki atıkların (örn. Cam topla) sahneye düşme ihtimali algoritmik olarak %60 oranında artırılarak oyun akıcılığı optimize edildi.4. VR UI (Arayüz) Hata Çözümleri ve Optimizasyonlar:VR ortamında arayüz elemanlarının hatalı ölçeklenmesi (Overscaling) kaynaklı görüş engelleme problemi çözüldü. Arayüz elemanları cihaz boyutlandırmalarına duyarlı hale getirildi.Dinamik olarak kopyalanan seviye butonlarının, kendi kimlik numaralarını (Level ID) otomatik tanımlamasını sağlayan LevelCardUI güncellemeleri yapıldı.XR altyapısı (XR Interaction Toolkit), Font bağımlılıkları ve görsel efekt (FX) prefabları güncellenerek proje stabilitesi artırıldı.Git Commit Mesajları:[11:06] (55b09ed) chore: expand max level cap to 30 and prepare for difficulty matrix calibration[20:01] (e8ccec0) feat: expand game to 30 levels and rebalance difficulty matrix - Increased total level cap from 15 to 30 and updated the LevelSelectionBoard UI. - Reduced exponential XP multiplier to 1.25f for fair scaling in late game. - Implemented dynamic game duration (+10s per level) in GameManager. - Adjusted mission target formulas to ensure achievability with the new timer. - Added auto-start functionality to automatically select the highest unlocked level on boot. - Fixed LevelSelectionManager save loading to merge data instead of overwriting.[20:01] (c382571) feat: implement mission-biased RNG and speed up waste spawning - Reduced base spawn intervals in both PortalSpawner and WasteSpawner for faster gameplay. - Synced AR PortalSpawner with DifficultyManager to increase spawn speed based on combos. - Implemented intelligent mission-biasing: Spawners now have a 60% probability of dropping the specific waste type required by the active mission.[20:01] (1b6fe8c) fix: resolve UI scaling, level duplication bugs, and restart artifacts - Fixed UI text scaling bug where countdown text overscaled and blocked the VR view. - Added auto-fadeout for the \"RECYCLING STARTED\" status text. - Ensured LevelSelectionBoard automatically hides during countdown and game over states. - Updated LevelCardUI to auto-parse its Level ID from text to support editor duplication. - Implemented ReturnAllToPool() in ObjectPoolManager to clear lingering physics objects upon level restart.[20:02] (d593d68) chore: update XR rig dependencies, font assets, and FX prefabs - Routine updates to XR Interaction Toolkit components and OpenXR settings. - Refreshed TextMeshPro font atlases. - Minor modifications to visual effects prefabs."
},
{
"day": 36,
"date": "2026-08-20",
"content": "Yeni Power-Up (Kum Saati) Sisteminin Entegrasyonu ve Core Fizik\/Obje Havuzu (Object Pooling) Hatalarının GiderilmesiGünün Özeti ve Yapılan Çalışmalar: Bugün, Sanal Gerçeklik (VR) \/ Artırılmış Gerçeklik (AR) geri dönüşüm oyunumuzun geç aşamalarındaki (Level 20-30) zorluk dengesini iyileştirmek amacıyla \"Kum Saati\" (Hourglass) mekaniği sisteme entegre edildi. Bununla birlikte, oyunun stabilitesini doğrudan etkileyen kritik fizik ve bellek yönetimi hataları tespit edilerek kalıcı çözümler üretildi.1. Yeni Oyun Mekaniği (Hourglass Power-Up) Entegrasyonu:Oyunculara ekstra zaman kazandıran Kum Saati (Hourglass) mekaniği için gerekli 3D model, Prefab ve etiket (Tag) tanımlamaları yapıldı.WasteType enum'u güncellenerek Kum Saati yapıya dâhil edildi ve çarpışma (collision) testlerine uygun hale getirildi.WasteSpawner ve PortalSpawner yöneticilerine %10 ihtimalle spawn olma (düşme) mantığı kodlandı.Zamanın artırılması için GameManager sınıfına AddTime fonksiyonu yazılarak sistemler arası entegrasyon tamamlandı.2. Karşılaşılan Problemler ve Çözümleri (Debugging):Object Pool Silinme Hatası (Double-Trigger Bug): Geri dönüşüm kutularına giren çoklu yüzeye (multi-collider) sahip objelerin, OnTriggerEnter metodunu aynı saniyede iki kez tetiklemesi sonucu havuz deposunun (ObjectPool_Container) yanlışlıkla kendini yok etmesi sorunu tespit edildi. Çözüm olarak, transform.root kullanmak yerine daha güvenli olan attachedRigidbody üzerinden ana obje tespiti yapıldı ve activeInHierarchy kontrolü eklenerek sorun çözüldü.Sonsuz Kayma ve Sahne Dışına Çıkma Hatası: Konveyör banttan (BeltMovement.cs) düşen atıkların, yer sürtünmesi olmaması sebebiyle FloorZone sensörü dışına kayıp listeden silinmesi ve bu sebeple asla imha edilmeyip (despawn) sahne dışında birikmesi sorunu saptandı. Bandın fırlatma gücü azaltıldı ve ARWastePhysicsTuner üzerinden linearDamping (doğrusal sürtünme) eklenerek objelerin stabil bir şekilde yerde kalması sağlandı.Zemine Batma (Tunneling\/Sinking) Hatası: maxDepenetrationVelocity değerinin fizik motorunda çok düşük tutulması sebebiyle, yerçekimi ivmesinin itme gücünü yenerek objeleri harita dışına (Kill-Z sınırına) batırması engellendi. Değer optimum bir seviyeye (5.0f) çekildi.3. Rutin Konfigürasyon ve Optimizasyonlar:Sistem genelinde OpenXR paket ayarları güncellendi ve TextMeshPro (SDF) font dosyaları yenilendi.AR (Artırılmış Gerçeklik) test sahnesindeki (SceneUnderstanding_Test) hiyerarşi ve ortam değişiklikleri kaydedilerek geliştirme ortamı senkronize edildi.Git Commit Mesajları:[10:29] (7093c4f) chore: setup foundation and tag enums for Hourglass power-up - Added Hourglass to WasteType enum in BinTrigger.cs. - Integrated Hourglass tag parsing for future collision logic. - Included routine project scene and font asset updates.[19:50] (95504b6) feat: implement hourglass power-up for extra time - Added Hourglass 3D model, prefab, and custom tag. - Integrated spawning logic in WasteSpawner and PortalSpawner for levels 20-30 with a 10% chance. - Added AddTime method to GameManager to increase remaining time.[19:51] (f1f8353) fix: resolve object pool destruction and physics ghosting bugs - Fixed double-trigger issue causing ObjectPool_Container destruction by using attachedRigidbody instead of transform.root. - Fixed frictionless sliding out of FloorZone by adding linear damping and reducing conveyor belt ejection force. - Fixed objects sinking through the floor by increasing maxDepenetrationVelocity. - Added failsafes to ObjectPoolManager to prevent pooling critical system objects.[19:51] (dee6238) chore: update XR settings, font assets, and AR test scene - Updated OpenXR package settings. - Refreshed TextMeshPro SDF font asset. - Saved minor environment\/hierarchy changes in AR SceneUnderstanding test scene."
},
{
"day": 37,
"date": "2026-08-21",
"content": "Mıknatıs (Magnet) Güçlendirme (Power-up) Mekaniğinin ve Dinamik UI Bildirim Sisteminin EntegrasyonuYapılan Çalışmalar ve Detaylar:Bugün, VR oyun projemizdeki çekirdek oynanış döngüsünü zenginleştirecek olan \"Mıknatıs (Magnet) Güçlendirme\" mekaniğinin sisteme entegrasyonu, ilgili fiziksel objelerin hazırlanması ve arayüz bildirimlerinin kodlanması üzerine çalışılmıştır. Çalışmalar üç ana aşamada gerçekleştirilmiştir:1. 3D Model Entegrasyonu ve Prefab Hazırlıkları:Mıknatıs gücünü temsil edecek olan Magnet.glb 3D modeli projeye dahil edilerek Unity içerisine aktarıldı.Bu model kullanılarak yeni bir Magnet.prefab oluşturuldu. Objenin VR ortamında tutulup fırlatılabilmesi için gerekli olan XRGrabInteractable, Rigidbody ve Collider bileşenleri (component) eklendi.Oyuncunun etkileşime gireceği bu güçlendirme nesnesinin fizik ayarları ve etiket (Tag) konfigürasyonları, otomatik ayrıştırma (auto-sort) algoritmasına uygun şekilde ayarlandı.2. Oynanış (Core Mechanics) Kodlaması:Atıkların otonom ve VR fizikleriyle çakışmayacak (XR-safe) bir şekilde ilgili çöp kutularına doğru uçabilmesini sağlayan MagnetResponder scripti yazıldı.BinTrigger sınıfı güncellenerek sahnedeki çöp kutularının (bin) transform bilgilerinin global olarak kayıt edilmesi ve \"Magnet\" etiketine sahip atıkların doğru ayrıştırılması sağlandı.GameManager üzerine Mıknatıs (Magnet) state'leri, ilgili Coroutine'ler ve Event fırlatıcıları (dispatchers) eklendi.ObjectPoolManager güncellendi; artık atıklar (waste) havuzdan (pool) çekildiğinde MagnetResponder bileşeni objelere dinamik olarak (çalışma zamanında) eklenebilmektedir.3. Arayüz (UI) Geri Bildirimleri ve Üretim (Spawn) Dengelemeleri:UIManager sınıfı güncellenerek oyuncuya güçlendirmelerle ilgili görsel geri bildirimler sunuldu. Aktifleşen Mıknatıs ve Kum Saati (Hourglass) güçlendirmeleri veya oyun içi etkinlikler (Events) için anlık geri sayım bildirimleri arayüze bağlandı. İlgili yazı tipi (font) asset'leri projeye eklendi.Güçlendirme eşyalarının üretim (spawn) mantığı dengelendi. Mıknatıs güçlendirmesinin sadece Seviye 20 ile Seviye 30 arasında ve %8 ihtimalle spawn olması (WasteSpawner ve PortalSpawner üzerinden) ayarlandı.Son olarak, Altın Atık (Golden Waste) objesinin ortaya çıkma ihtimalindeki tutarsızlıklar giderildi; dış etkinliklerden bağımsız, sabit %5'lik bir çıkma olasılığı olacak şekilde PortalSpawner içerisinde düzenlendi.Git Commit Mesajları:[10:34] (bcce0c3) chore: add magnet 3D model and prefab assets - Imported Magnet.glb 3D model into the project. - Created Magnet.prefab with required XRGrabInteractable, Rigidbody, and Collider components. - Configured prefab tags and physics settings for the upcoming auto-sort power-up mechanic.[18:45] (30cdcf9) feat: implement magnet auto-sort power-up core mechanics - Created MagnetResponder for XR-safe autonomous object flight to bins. - Updated BinTrigger to register global bin transforms and parse the Magnet tag. - Added Magnet state, coroutines, and event dispatchers to GameManager. - Modified ObjectPoolManager to dynamically attach MagnetResponder to all pooled wastes. - Added \"Magnet\" tag to TagManager.[18:47] (31a5217) feat: integrate UI notifications and balance spawn logic - Updated UIManager to display real-time notifications and countdowns for active power-ups (Magnet, Hourglass) and events. - Integrated Magnet power-up into WasteSpawner and PortalSpawner (level 20-30, 8% chance). - Fixed Golden Waste spawn rate to a strict 5% probability in PortalSpawner, removing event overrides. - Updated related UI font assets."
},
{
"day": 38,
"date": "2026-08-24",
"content": "Proje genelinde hafta sonu yapılan toplu kod birleştirme (merge) işlemleri sonrasında bozulan sahnelerin onarılması, kopan referansların giderilmesi ve yeni eklenen altyapı sistemleri (Ekonomi ve Seviye Yöneticileri) ile mevcut AR (Artırılmış Gerçeklik) güçlendirici yeteneklerinin (Mıknatıs ve Kum Saati) çakışmasız bir şekilde entegre edilmesi.Merge Krizinin Çözümü ve Stabilizasyon: Hafta sonu main branch'ine (dalına) yapılan eklemeler sonucunda bozulan AR sahne ve prefab (RecyclingBins, Magnet, Hourglass) referansları onarıldı. feat\/magnet-powerup-system dalı ile ana proje arasındaki karmaşık Git çakışmaları (conflict) manuel olarak dikkatlice çözüldü (Commit: c2f563a).Kod Tabanının Birleştirilmesi (Code Unification):BinTrigger.cs dosyası üzerinde, diğer geliştirici tarafından eklenen PrecisionSystem (Hassasiyet Sistemi) ve EconomyManager fonksiyonları ile benim geliştirdiğim \"Mıknatıs (Magnet)\" nesne yakalama mantığı hiçbir kod kaybı yaşanmadan senkronize edildi.WasteSpawner.cs içerisinde mevcut LevelManager mantığı korunarak, AR Power-up (güçlendirici) objelerinin oyuna dahil olma (spawn) algoritmaları başarıyla sisteme entegre edildi.Hata Ayıklama ve Temizlik (Bug Fixing & Refactoring):PortalSpawner.cs içerisinde namespace eksikliğinden kaynaklanan LevelManager missing reference hatası tespit edilerek düzeltildi (Commit: e835949).GameManager sınıfı içerisine birleştirme (post-merge) sonrası süreçte takip edilmesi gereken teknik \"TODO\" notları eklendi (Commit: 83ad3f3).Birleştirme esnasında proje içerisine sızan veya çakışan eski VR kod kalıntıları temizlendi. Bu sayede projede oluşan çoklu derleme (syntax\/compile) hataları bütünüyle giderilerek projenin yeniden hatasız (error-free) çalışması sağlandı.Git Commit Mesajları:[10:57] (83ad3f3) chore(core): add post-merge stabilization TODOs to GameManager[11:23] (e835949) fix(spawner): resolve LevelManager missing reference in PortalSpawner[16:55] (c2f563a) Merge branch 'feat\/magnet-powerup-system' into fix\/post-merge-stabilization"
},
{
"day": 39,
"date": "2026-08-25",
"content": "AR Oyun Durum Yönetimi (State Machine), Arayüz (UI) Yaşam Döngüsü Optimizasyonu ve Spawn Sisteminin İyileştirilmesi1. Oyun Çekirdeği ve Durum Yönetimi (Core & State Machine)GameManager FSM (Finite State Machine) İyileştirmesi: Oyunun farklı durumlarından (GameOver, Paused, MainMenu) tekrar başlatılabilmesi (Restart) için PrepareToStart metodu genişletildi; durum geçiş validasyonu savunmacı programlama (defensive programming) prensipleriyle optimize edildi.Power-Up ve Olay Mimarisi: Kum saati (Hourglass) ve mıknatıs (Magnet) güçlendirmelerinin oyun döngüsüne güvenle dahil edilmesi sağlandı. OnHourglassUsed event'i ile süre ekleme geri bildirimleri decoupled (gevşek bağlı) yapıya kavuşturuldu ve kod okunabilirliği için #region blokları altında düzenlendi.Eski Sistemlerin Temizlenmesi: Projenin AR yapısına geçişi doğrultusunda, AnalyticsManager içerisindeki eski dalga (wave) takip referansları temizlenerek kod tabanı sadeleştirildi.2. Atık Üretim (Spawn) ve Mekânsal Çakışma DüzeltmeleriPortalSpawner Engel Tespiti: Mekânsal ortam taramasından (Spatial Mesh) kaynaklanan ve atıkların doğmasını engelleyen Physics.OverlapSphere kontrolü revize edildi. Çevre mesh'lerinin engel olarak algılanması önlenerek atıkların sahnede kararlı bir şekilde üretilmesi sağlandı.3. Kullanıcı Arayüzü (UI) Yaşam Döngüsü ve Dinamik BağlamaWorld Space UI Ölçekleme Bug'ının Çözümü: StatusText ve ComboText bileşenlerinin dünya uzayındaki (World Space) ölçeklerinin bozulup ekranı kaplaması sorunu, Awake aşamasında _originalScale değerlerinin önbelleğe (cache) alınması ve geçişlerde korunmasıyla çözüldü.Dinamik Buton Olayı Bağlama (Auto-Binding): GameOver ve Pause panellerindeki butonlar (Restart, Next Level, Resume, Quit) için kod üzerinden dinamik bağlama mekanizması geliştirildi.Görev Durumu Kontrolü: Next Level butonunun tıklanabilirliği (interactable), aktif seviye görevinin tamamlanma durumuna (MissionManager.ActiveMission.IsCompleted) bağlandı; tamamlanmamış seviyelerde butonun yanlışlıkla açılması engellendi.HUD Görünürlük Yönetimi: Ana menü (MainMenu) durumundayken oyun içi HUD panellerinin CanvasGroup.alpha yönetimiyle pürüzsüzce gizlenmesi sağlandı.4. Sahne ve Görsel Varlık (Asset) EntegrasyonuAR_SceneUnderstanding_Test sahnesinde UIManager bileşenleri, metin font ayarları (SDF) ve oyun içi animasyon\/efekt (Flash Round FX) prefab referansları güncellenerek sahne hiyerarşisi stabilize edildi.Git Commit Mesajları:[10:23] (68e67f1) chore: organize AR power-up injections into regions in GameManager[20:12] (539bdd0) fix(core): resolve waste spawning obstacles and stabilize game state transitions - Fix OverlapSphere obstacle check in PortalSpawner preventing waste spawning on spatial mesh - Allow GameManager.PrepareToStart from GameOver, Paused, and MainMenu states - Trigger OnHourglassUsed event when adding time via powerups - Remove deprecated wave tracking references in AnalyticsManager[20:12] (b3c89dc) fix(ui): overhaul UI lifecycle, button auto-binding and scale caching - Cache original localScale in UIManager to prevent StatusText and ComboText oversized scaling - Implement dynamic auto-binding for GameOver and Pause panel buttons (Restart, Next Level, Exit) - Filter Next Level button interactability based on active mission completion - Implement CanvasGroup alpha hiding for gameplay HUDs during MainMenu state - Reconnect event and power-up notification listeners (Frenzy, Magnet, Hourglass)[20:12] (0644115) chore(scene): update scene wiring, font asset and FX prefabs - Update inspector bindings for UIManager and gameplay panels in AR_SceneUnderstanding_Test scene - Update font asset settings and flash round effect prefab"
},
{
"day": 40,
"date": "2026-08-26",
"content": "Git Dal Entegrasyonu, Fizik & Spawner Kalibrasyonu, Görev Sistemi Dengelemesi ve UI Yaşam Döngüsü Optimizasyonu1. Git Sürüm Kontrolü ve Çakışma Yönetimi (Merge Conflict Resolution)Ana geliştirme dalı (main) ile aktif çalışma dalı senkronize edildi.Ortaya çıkan Git birleştirme çakışmaları (merge conflicts) kod bütünlüğü ve mimari prensipler (Single Responsibility) korunarak başarıyla çözümlendi ve proje temiz bir temel üzerine oturtuldu (6912d91).2. Atık Doğma Algoritması (Spawn Trajectory) ve Fizik Motoru KalibrasyonuDoğma Noktası Optimizasyonu: Atıkların kutuların tam üzerine düşüp aralarına sıkışmasını veya doğrudan kutuların içine girerek haksız puan\/ceza üretmesini engellemek için WasteSpawner ve PortalSpawner algoritmaları güncellendi.Dinamik Ön Alan Hesabı: Geri dönüşüm kutularının merkezi ile oyuncu kamerası arasındaki yön vektörü (frontDir) dinamik olarak hesaplanarak, atıkların kutuların 2.4 metre önündeki açık alana ve göğüs hizasına düşmesi sağlandı. İlgili mesafe parametreleri Inspector üzerinden yönetilebilir hale getirildi.Fizik Dengesi (Physics Tuning): Kağıt ve hafif objelerin süzülme fiziğindeki aşırı yatay ivme (swayForce) ve hava sürtünmesi (linearDamping) değerleri dengelendi; objelerin fırlayarak sahne dışına çıkması engellendi.Object Pooling ve Depenetration Güvenliği: Nesnelerin çarpışma anındaki ani fırlamalarını önlemek için maxDepenetrationVelocity sınırlandırıldı. ObjectPoolManager konteyner objesinin yanlışlıkla tetikleyiciler tarafından havuza geri atılması engellendi ve inaktif objeler üzerinden Coroutine başlatılması önlendi (3c81826).3. Görev Sistemi Dengelemesi ve Dil Yerelleştirmesi (Localization)Hedef Sayılarının Dengelenmesi: Seviyeler ilerledikçe atık toplama (CollectWaste) ve XP kazanma (EarnXP) görevlerinin hedefleri seviye süresi ve düşen obje sayısı göz önüne alınarak yeniden formüle edildi (Örn: Seviye 30'da 63 atık yerine dengeli 17 atık; XP hedefleri 1850'den 800 XP'ye çekildi).İngilizce Yerelleştirme: Görev panelleri ve bildirim metinleri global oyun standartlarına uygun olarak İngilizceye çevrildi (bb78231).4. UI Yaşam Döngüsü ve Durum Makinesi GüvenliğiPause Paneli Revizyonu: Kullanıcı deneyimi gereksinimleri doğrultusunda Pause panelindeki \"Restart\" butonu tamamen devre dışı bırakılıp kaldırıldı.Geri Sayım ve Null-Safety Kontrolleri: Seviye yeniden başlatıldığında (Restart) oluşan metin referans hataları (MissingReferenceException) ve HUD çakışmaları giderildi; geri sayım animasyonlarına Coroutine kontrolü ve kare bazlı null-safety korumaları eklendi (bb78231).Git Commit Mesajları:[11:05] (6912d91) chore: resolve merge conflicts with main[21:06] (3c81826) fix(core, physics): resolve waste spawn trajectory, balance physics and stabilize state machine - Dynamically calculate spawn area in front of recycling bins facing the player to prevent wastes from falling directly onto\/between bins - Expose configurable spawnDistanceFromBins and spawnHorizontalSpread in WasteSpawner and PortalSpawner - Tame paper sway force and damping in ARWastePhysicsTuner to prevent lateral launching - Clamp maxDepenetrationVelocity in ObjectPoolManager to avoid sudden physics pop\/ejection - Prevent ObjectPool_Container return bug in BinTrigger and handle inactive coroutine guard in FloorPollutionDetector - Preserve level-scaled game duration in GameManager and smooth Paused to Countdown state transition[21:06] (bb78231) feat(mission, ui): rebalance level objectives, localize texts and overhaul panel lifecycle - Rebalance and lower CollectWaste and EarnXP mission target amounts across all levels (1 to 30) - Translate mission descriptions and completion UI feedback from Turkish to English - Remove and deactivate Restart button from PausePanel - Add coroutine cancellation and frame-by-frame null checks in UIManager countdown animation - Fix HUD countdown visibility and ensure proper panel hiding on scene reset[21:07] (9e9b37a) chore(settings): update OpenXR package settings and TextMeshPro font configurations - Update OpenXR package settings for VR\/AR runtime - Refresh TextMesh Pro font asset fallbacks and material references"
},
{
"day": 41,
"date": "2026-08-27",
"content": "Artırılmış Gerçeklik Holografik Öğretici Sisteminin Geliştirilmesi, Spatial UI ve Durum Yönetimi EntegrasyonuBugünkü mesai kapsamında, projeye ilk kez giriş yapan kullanıcıların artırılmış gerçeklik (AR \/ Passthrough) ortamında temel geri dönüşüm mekaniklerini ve VR etkileşim kontrollerini zorunlu, interaktif ve 3D holografik kılavuzlar eşliğinde öğrenebilmelerini sağlayan AR Holo-Tutorial Sistemi sıfırdan mimarilendirilmiş, geliştirilmiş ve ana oyun döngüsüne entegre edilmiştir.A. Holografik Durum Makinesi Mimarisi (ARHoloTutorialManager.cs)Öğretici akışını yönetmek üzere 5 aşamalı bir durum makinesi (State Machine) kurgulandı:Placement: Kullanıcının istasyon ve geri dönüşüm kutularına odaklanması,Grab & Drop: Önüne düşen atığı fiziksel etkileşimle tutup doğru geri dönüşüm kutusuna atması,Remote Gravity Pull: Uzakta havada asılı duran atığa lazer doğrultup eline çekme hareketini icra etmesi,Composite Waste: İki parçalı yapışık kompozit atığı iki elle zıt yönlere çekerek banttan ayırması,Completed: Tebrik ekranı, kalıcı PlayerPrefs kaydı (TutorialDone = 1) ve ana menüye güvenli geçiş.Hatalı kutuya atış yapılması durumunda atığı ve yönlendirmeyi otomatik tazeleyen hata yakalama döngüleri (Retry Routine) kodlandı.B. 3D Hologram Yönlendirme ve Uzaysal HUD BileşenleriARHoloPointer.cs: Hedef objelerin veya kutuların Collider.bounds değerlerini hesaplayarak tepe noktasında dikey eksende sinüs dalgasıyla salınan (sine-wave bounce), parıldayan ve kameraya dönen (billboard) 3D holografik yönlendirme okları geliştirildi.ARHoloStepCard.cs: Kullanıcının görüş alanını (Field of View) yumuşakça takip eden (World-Space Floating HUD), dinamik metin saran ve [ ● ● ○ ○ ] ilerleme göstergeleri sunan adımlı bilgi kartı oluşturuldu. Inspector üzerinden tüm ölçek ve mesafe parametreleri konfigüre edilebilir kılındı.ARHoloHandGuide.cs: VR kontrolcülerindeki tek el tutma (GRIP), uzaktan çekme (PULL) ve çift elle ayırma (Bimanual Tear) hareketlerini görsel olarak anlatan animasyonlu hareket rehberi modellendi.C. Oyun Yöneticisi (GameManager) ve Durum Kalkanları (State Guards)GameManager.cs durum makinesine GameState.Tutorial durumu eklendi. Oyun açılışında GameManager.Start() döngüsünün öğreticiyi ezmesini engelleyen savunmacı durum kalkanları (Defensive State Guards) entegre edildi.UIManager.cs içerisinde öğretici adımları aktifken arka plandaki Seviye Seçim Panosu (LevelSelectionBoard), 3D butonlar ve oyun içi görev\/XP HUD panelleri gizlendi; öğretici bittiğinde ana menünün otomatik ve temiz şekilde açılması sağlandı.D. Fizik, Havuzlama (Object Pool) ve Fallback MekanizmalarıStep 3'te uzaktan çekilecek nesnelerin yere düşüp kaybolmaması için isKinematic ile havada asılı kalma mekaniği eklendi; nesneye lazer doğrultulup çekildiği anda yerçekimi fiziği dinamik olarak aktifleştirildi.Sahnedeki WasteSpawner ve ObjectPoolManager sistemleriyle otomatik eşleşen dinamik atık çekme ve prefab atanmasa bile iki parçayı birbirine WasteGlue ile bağlayan akıllı Composite Fallback algoritması geliştirildi.E. Git Versiyon Kontrolü, Merge Çakışmaları ve PR YönetimiGeliştirme süresince oluşan GameManager.cs ve UIManager.cs üzerindeki merge çakışmaları (merge conflicts) çözüldü.Geliştirmeler mantıksal olarak Core Kodlar \/ Yöneticiler ve Sahne \/ Font Asset'leri şeklinde 2 modüler Conventional Commit altında paketlendi.feat\/ar-holo-tutorial-system dalı uzak sunucuya (origin) pushlanarak GitHub üzerinde PR #189 açıldı ve çakışma çözümleri başarıyla tamamlandı.Git Commit Mesajları:[11:10] (5b2c776) feat(tutorial): initiate AR Holo-Tutorial state machine skeleton - Created ARHoloTutorialManager to handle step-by-step tutorial progression - Defined TutorialStep enum (Placement, GrabAndDrop, GravityPull, CompositeWaste)[11:24] (556c2b2) fix(gameplay): resolve merge conflicts with main[11:59] (35c7c7a) fix(tutorial): resolve string quote escape syntax errors in ARHoloTutorialManager[12:19] (390aa69) feat(tutorial): implement full AR Holo-Tutorial state machine, 3D hologram pointers and hand guides - Implemented ARHoloTutorialManager coordinating 5 mandatory steps (Placement, GrabAndDrop, GravityPull, CompositeWaste, Completed) - Created ARHoloPointer for dynamic bouncing 3D holographic indicators with collider-bounds centering - Created ARHoloStepCard for floating HUD world-space step card following player view - Created ARHoloHandGuide for animated VR\/AR gesture visual indicators (Grab, Pull, Bimanual Tear) - Added automatic bin finder, waste retry loop on wrong bin, and PlayerPrefs completion persistence[13:24] (a658b6a) fix(tutorial): resolve ObjectPoolManager namespace reference in ARHoloTutorialManager[19:49] (f7cb716) feat(tutorial, core): implement AR Holo-Tutorial system, 3D holographic guides and manager state guards - Implement 5-step mandatory AR Holo-Tutorial state machine in ARHoloTutorialManager (Placement, GrabAndDrop, GravityPull, CompositeWaste, Completed) - Create ARHoloPointer for dynamic bouncing 3D holographic guidance arrows above targets - Create ARHoloStepCard for floating world-space HUD step instructions following player FOV - Create ARHoloHandGuide for animated VR\/AR gesture visual indicators (Grab, Remote Pull, Bimanual Tear) - Add state transition validation guards in GameManager to smoothly handle Tutorial state and prevent invalid resets - Hide LevelSelectionBoard, 3D buttons, and in-game HUD panels during tutorial in UIManager - Provide automatic bin detection, mid-air waste hovering for remote pull, and composite waste fallback[19:50] (1b93dc4) feat(scene, asset): integrate AR Holo-Tutorial components into test scene and update font assets - Add ARHoloTutorialManager component setup to Core_Managers in AR_SceneUnderstanding_Test scene - Update TextMesh Pro and Chakra Petch SDF font atlas asset references for holographic 3D text rendering - Persist OpenXR project and package settings[20:33] (9db84bf) Merge branch 'fix\/spawner-system-and-gameplay-bugfixes' into feat\/ar-holo-tutorial-system"
},
{
"day": 42,
"date": "2026-08-28",
"content": "AR Recycle Rush Projesinde Son Entegrasyonlar, Hata Çözümleri, Kirlilik & Oynanış Mekaniklerinin Tamamlanması ve Staj Dönemi Genel DeğerlendirmesiStajımızın son gününde; Recycle Rush projesinde oynanış akışını doğrudan etkileyen fizik ve nişan alma asistanı (Aim Assist), XR kontrolcü lazer ışını (Ray Interactor) ile UI buton etkileşimleri, holografik eğitim sisteminin görsel ve tipografik iyileştirmeleri ile gerçek zamanlı dinamik kirlilik (Room Pollution) mekanizmaları başarıyla tamamlanmış ve sürüme hazır hale getirilmiştir.🛠️ 2. Yapılan Teknik Çalışmalar ve GeliştirmelerA. Oynanış, Fizik & Ses GeliştirmeleriManyetik Nişan Desteği & Yutulma Animasyonu: Atılan çöplerin doğru kutu ağzına manyetik olarak yönlendirilmesi ve kutuya giren nesnelerin merkezde küçülerek kaybolduğu estetik animasyon rutini entegre edildi.PhysX Kinematik Uyarılarının Giderilmesi: Unity 6 fizik motorunda isKinematic hız atamalarından kaynaklanan uyarılar, objelerin ObjectPoolManager ve BinTrigger içinde CancelInteractableSelection ile bağlarının koparılmasıyla kalıcı olarak çözüldü.Gerilim Müzik Sistemi: Oyunun son 15 saniyesinde arkaplan müziğinin tempo ve perdesinin (pitch) kademeli yükselmesi sağlandı.B. XR UI & Etkileşim OptimizasyonuKontrolcü Işını (Ray Interactor) Çakışma Çözümü: AR sahnesinde kontrolcü lazeriyle butonlara tıklanamama sorunu, EventSystem üzerindeki InputSystemUIInputModule ile XRUIInputModule modül çakışması giderilerek çözüldü.Otomatik Raycaster Ataması: UIManager bünyesinde EnsureXRUIInputSetup() fonksiyonu ile tüm World Space arayüz panellerine TrackedDeviceGraphicRaycaster ve aktif kamera referansı dinamik olarak bağlandı.C. Holografik Eğitim (Tutorial) & Tipografi StandardıProje genelindeki yazı tipi bütünlüğü sağlanarak tüm öğretici kartları, yönlendirme okları ve el rehberleri ChakraPetch-Medium SDF fontuna geçirildi; eksik geometrik karakterler için LiberationSans SDF fallback fontu eklendi.HoloBinPointer boyutu ve dikey salınım animasyonu uzaktan net seçilebilecek şekilde büyütüldü.D. Dinamik Kirlilik (Room Pollution) & Görev DengelemesiRoomPollutionManager yeniden yapılandırılarak sahnede aktif spawn olan atık sayısı arttıkça kirlilik yüzdesinin anlık yükselmesi, atıklar toplandıkça veya temizlendikçe anında düşmesi sağlandı.Kirlilik %100 olduğunda tetiklenen Game Over ekranına durumu açıklayan İngilizce bilgilendirme metinleri eklendi.Görev zorlukları (CollectWaste, EarnXP) ve kazanılan ödül oranları seviyelere göre dengelendi.Bugün itibarıyla Trunçgil Teknoloji bünyesinde gerçekleştirdiğim staj dönemimi başarıyla tamamlamış bulunmaktayım.Stajım boyunca; Unity ile sanal ve artırılmış gerçeklik (VR\/AR) teknolojileri, XR Interaction Toolkit mimarisi, fizik motoru optimizasyonları, SOLID prensiplerine uygun modüler yazılım geliştirme ve Git sürüm kontrol süreçlerinde yoğun ve son derece verimli bir tecrübe kazandım. Teorik bilgilerimi doğrudan sektörel standartlarda bir projede uygulama fırsatı bulmak mesleki gelişimime çok büyük katkı sağladı.Staj sürem boyunca bizlere her daim yol gösteren, bilgi ve tecrübelerini esirgemeden zamanını ve emeğini ayıran bize destek olan başta Ümit Bey olmak üzere tüm staj arkadaşlarıma en içten teşekkürlerimi sunarım. Burada geçirdiğim süre boyunca hem teknik anlamda hem de profesyonel iş disiplini açısından çok değerli kazanımlar edindim. Her şey için çok teşekkür ederim.Git Commit Mesajları:[01:51] (9a9a811) feat(gameplay): add aim assist, swallow visual effect and adaptive music tension - Implemented magnetic aim assist on bins to guide thrown matching waste into the target aperture - Added smooth scaling\/translating swallow routine before returning sorted waste to object pool - Introduced adaptive BGM pitch escalation during the final 15 seconds of gameplay in AudioManager - Resolved prefab duplicate declarations in WasteSpawner and aligned lever trigger state[01:51] (dd3ea6a) fix(managers): resolve merge conflicts and synchronize game lifecycle states - Cleaned up duplicated fields and methods in GameManager and GameSessionData - Streamlined combo break and kill-Z handling in ComboManager and ObjectPoolManager - Removed duplicate lifecycle hooks in SaveManager and aligned tutorial placement triggers[01:51] (1735bd7) fix(ui): resolve switch case fallthrough, integrate safety panel and update fonts - Fixed switch-case fallthrough and duplicate playing\/countdown states in UIManager - Restored AR EnvironmentSafetyManager integration and safetyWarningPanel field - Corrected local variable scope issues in countdown and pop animations - Updated TextMeshPro font asset configuration[01:52] (9ace1d1) chore(scene): update AR test scene and OpenXR package settings - Updated AR_SceneUnderstanding_Test test scene hierarchy and components - Refreshed OpenXR package runtime configuration[12:23] (a846a7e) feat(tutorial): enhance AR hologram tutorial visuals and typography - Assigned ChakraPetch-Medium SDF font dynamically across all tutorial hologram cards, pointers, and hand guides. - Added LiberationSans SDF as fallback font asset in TMP Settings to resolve missing Unicode symbols (e.g. geometric arrows). - Enlarged HoloBinPointer scale, bounce amplitude, and height offset for better long-range visibility over recycling bins. - Refined bin target auto-discovery via BinTrigger and cleaned gesture text formatting. - Updated AR test scene with proper XRUIInputModule configuration and font assignments.[12:23] (4aac4d1) feat(ui): add automated XR UI input setup and tutorial state filtering - Implemented EnsureXRUIInputSetup() in UIManager to automatically configure XRUIInputModule and TrackedDeviceGraphicRaycaster on all World Space canvases. - Resolved controller ray pointer button clicks by disabling conflicting InputSystemUIInputModule in favor of XRUIInputModule. - Hidden monitor statusText (SYSTEM ONLINE \/ PRESS PLAY BUTTON) during tutorial steps until completion. - Fixed button callbacks and game state synchronization.[12:23] (3d0b6cf) fix(core): resolve PhysX kinematic warnings, obsolete APIs and event lifecycle - Fixed kinematic rigidbody velocity modification warnings in ObjectPoolManager, BinTrigger, and MagnetResponder by canceling grab selection before kinematic changes. - Updated GravityPullController to use XRBaseControllerInteractor, resolving CS0618 deprecation warnings. - Switched AchievementManager event subscriptions to OnEnable\/OnDisable lifecycle and added scene auto-discovery in UIManager\/UltimateMerger. - Wired XP reward logic in PackageRewardManager and cleaned unused local variables across managers.[12:24] (81cf323) chore(settings): update URP rendering configs and project XR settings - Synchronized URP performance and quality pipeline asset configurations. - Updated project XR settings and global render pipeline settings for Android XR build targets.[16:24] (e417b26) feat(pollution): dynamic waste pollution tracking and game over notifications - Updated RoomPollutionManager to track active spawned wastes dynamically via ObjectPoolManager. - Synced real-time pollution percentage (increases on spawn, decreases on recycle\/despawn). - Added GameOverReason tracking in GameManager and display custom pollution failure messages on GameOverPanel and monitor. - Switched pollution UI labels and scene serialized prefixes to English (Pollution: %).[16:24] (3525c66) feat(gameplay): rebalance mission difficulty scaling and localize combo UI - Increased mission difficulty by one notch across CollectWaste and EarnXP types with scaled XP and coin rewards. - Localized ComboUI text to English (Combo x{count}!). - Updated ChakraPetch font asset metadata."
}
]
},
"22": {
"name": "Mustafa emre kaplan",
"email": "mustafaemre027@gmail.com",
"repo": "https:\/\/github.com\/mustafaemre027\/securewatch-ai",
"github_username": "mustafaemre027",
"start_date": "2026-07-13",
"end_date": "2026-08-10",
"total_days": 21,
"filled_days": 19,
"entries_sample": {
"first": {
"day": 1,
"date": "2026-07-13",
"content": "1. Gün – Proje Planlama ve GitHub AltyapısıProje Tanımı ve Planlama: Stajın ilk gününde çalışma düzeni, proje geliştirme süreci ve teslim beklentileri hakkında bilgilendirme yapıldı. SecureWatch AI projesinin amacı, kapsamı ve kullanılacak teknolojiler belirlendi. Proje; ağ trafiği verilerini makine öğrenmesi yöntemleriyle analiz ederek normal ve şüpheli bağlantıları sınıflandıran web tabanlı bir karar destek platformu olarak planlandı.GitHub İş Akışı: Projenin 20 günlük geliştirme planı hazırlanarak çalışmalar fazlara ve günlük görevlere ayrıldı. GitHub üzerinde EPIC ve alt görev Issue’ları oluşturuldu. Görevlerin To Do, In Progress, Review ve Done durumlarında izlenebilmesi için Project Board yapılandırıldı. Branch, commit ve Pull Request standartları belirlenerek Issue ve PR şablonları hazırlandı.Dokümantasyon Çalışmaları: Projenin tanıtımı ve kullanım bilgileri README.md dosyasında düzenlendi. Geliştirme aşamaları, MVP kapsamı, risk eşikleri ve tamamlanma kriterleri implementation_plan.md dosyasında toplandı. Danışman geri bildirimi doğrultusunda iki dokümanın kullanım amaçları ayrıştırıldı.Görsel Varlıklar ve Teslim: Logo, renk paleti, UI ekran taslakları ve proje ekran görüntülerinin düzenli saklanması için docs\/assets dizin yapısı oluşturuldu. Çalışmalar küçük ve anlamlı commitlere ayrılarak ayrı bir branch üzerinde yürütüldü. Değişiklikler Pull Request üzerinden danışman incelemesine sunuldu ve onay sonrasında main branch’ine birleştirildi.Git Commit Mesajları:[01:47] (8e6ce9b) docs(assets): add visual asset directory structure[01:47] (70769f2) docs(plan): document asset and mockup integration[02:02] (fcd557a) docs(assets): fix implementation plan link[02:03] (543f758) docs(plan): fix phase heading structure[02:03] (3a52d84) docs(readme): clarify license status[12:02] (19abdc4) docs(brand): add SecureWatch AI visual identity[12:03] (dbad75f) docs(mockups): add initial SecureWatch AI UI mockups[12:03] (28cc59d) docs(assets): update visual asset index[12:18] (b0e7ed3) docs(screenshots): add day 01 GitHub evidence"
},
"middle": {
"day": 10,
"date": "2026-07-27",
"content": "Gün 10 – Model Değerlendirme ve Nihai Model SeçimiGelişmiş Değerlendirme MetrikleriBugün SecureWatch AI projesinde Lojistik Regresyon ve Random Forest modellerini daha ayrıntılı değerlendirmek için olasılık tabanlı metrik altyapısını geliştirdim. Modellerden saldırı sınıfına ait olasılık değerlerini güvenli biçimde alarak ROC-AUC, PR-AUC, Precision-Recall eğrisi ve yanlış pozitif oranı hesaplamalarını ekledim. Ham verilerin, olasılık dizilerinin ve model nesnelerinin değerlendirme raporlarına eklenmesini engelledim.Validation Tabanlı Karar EşiğiKarar eşiğinin test verisi üzerinden belirlenmesinin veri sızıntısına neden olacağını dikkate alarak yalnızca eğitim verisi üzerinde 5-Fold Cross-Validation kullandım. Farklı karar eşiklerini doğrulama sonuçları üzerinden değerlendirdim. Duyarlılığın en az 0.95, yanlış pozitif oranının ise en fazla 0.05 olması şartını uyguladım. Bu şartları sağlayan eşik bulunmadığında sistemin kontrolsüz biçimde varsayılan bir eşik seçmesini engelledim.Model Seçimi ve Güvenli RaporlamaLojistik Regresyon ile dört Random Forest varyantını ortak bir değerlendirme sürecine dahil ettim. Modellerin yalnızca validation sonuçlarına göre seçilmesini ve test sonuçlarının seçim kararını etkilememesini sağladım. Eğitim süresinin farklı çalıştırmalarda değişebilmesi nedeniyle bu değeri seçim kararından çıkararak yalnızca raporlama amacıyla korudum. Saldırı olasılıklarını LOW, MEDIUM, HIGH ve CRITICAL seviyelerine ayırdım. Komut satırı aracına nihai model seçimi seçeneğini ekledim ve sonuçların güvenli JSON biçiminde alınmasını sağladım.Test ve SonuçGeliştirilen olasılık çıkarımı, metrik hesaplama, karar eşiği belirleme, model seçimi, risk sınıflandırması ve komut satırı işlemleri otomatik testlerle doğrulandı. Toplam 304 test sıfır hata ve sıfır uyarıyla başarıyla tamamlandı. Teknik dokümantasyon, model değerlendirme raporu ve Model Card hazırlandı. Bu aşamada gerçek veri üzerinden üretim modeli seçilmedi, model dosyası kaydedilmedi ve inference servisi geliştirilmedi.Git Commit Mesajları:[11:18] 1839bc0 feat(ml): implement probability extraction and advanced ROC\/PR metrics[12:24] 5e378b7 feat(ml): add validation-based decision threshold selection[13:22] c9cb2dd feat(ml): add deterministic final model selection[14:37] 36ce544 feat(ml): integrate final model selection into training cli[15:35] f5428bc fix(ml): remove runtime timing from model selection tie-break[16:21] 70b11d7 docs(ml): document model evaluation and selection[16:25] 016a889 docs(diary): add day 10 internship entry"
},
"last": {
"day": 19,
"date": "2026-08-07",
"content": "Docker Ortamı ve Backend KonteynerizasyonuBugün SecureWatch AI projesinin Docker tabanlı çalışma ortamını hazırladım. Docker Desktop ve WSL 2 kurulumlarını doğruladıktan sonra backend servisi için Python 3.12 tabanlı Docker image oluşturdum. FastAPI uygulamasının Uvicorn üzerinden container içinde çalışmasını sağladım ve .dockerignore ile gereksiz ve hassas dosyaların image içerisine alınmasını engelledim.Frontend ve NginxFrontend tarafında React ve Vite uygulaması için multi-stage Docker build yapısı hazırladım. Derlenen uygulamayı Nginx üzerinden yayınladım ve SPA yönlendirmelerini yapılandırdım. \/api isteklerini backend servisine yönlendiren reverse proxy ayarlarını ekleyerek login, dashboard, analiz ve olay sayfalarının container ortamında çalıştığını doğruladım.Docker Compose ve Kalıcı VerilerPostgreSQL, backend ve frontend servislerini Docker Compose altında birleştirdim. PostgreSQL ve backend servislerini dışarıya açmadan yalnızca frontend uygulamasını 8080 portundan erişilebilir hâle getirdim. Veritabanı ve yüklenen CSV dosyalarının korunması için kalıcı volume yapıları oluşturdum. Migration ve healthcheck kontrolleriyle servislerin doğru sırada çalışmasını sağladım.Güvenlik ve Uçtan Uca TestlerADMIN ve ANALYST kullanıcılarını güvenli biçimde oluşturmak için environment değişkenlerini kullanan demo kullanıcı scripti hazırladım. Authentication ve RBAC senaryolarını test ederek 401, 403 ve 200 yanıtlarını doğruladım. Örnek CSV dosyasıyla analiz sürecini çalıştırdım ve 5 kayıttan 1 normal, 4 saldırı sonucu üretildiğini gördüm. Aynı dosyanın tekrar yüklenmesi engellendi ve container yeniden başlatıldığında verilerin korunduğunu doğruladım.Testler ve SonuçBackend tarafında 499, kritik güvenlik kapsamında 194 ve frontend tarafında 791 test başarıyla geçti. TypeScript, ESLint, production build ve npm audit kontrolleri başarılı tamamlandı. Böylece SecureWatch AI projesinin PostgreSQL, backend ve frontend katmanlarını Docker üzerinde birlikte çalışan güvenli ve bütünleşik bir yapıya dönüştürdüm.Git Commit Mesajları:[11:46] (37c633a) feat(docker): containerize backend service [11:51] (5fdf4f9) feat(docker): containerize frontend with nginx [12:01] (bf8f8d0) feat(docker): orchestrate application services [12:13] (06d7136) feat(docker): add secure demo user bootstrap [13:19] (a739b27) docs(diary): add day 19 internship entry"
}
},
"full_text_length": 58196,
"all_entries": [
{
"day": 1,
"date": "2026-07-13",
"content": "1. Gün – Proje Planlama ve GitHub AltyapısıProje Tanımı ve Planlama: Stajın ilk gününde çalışma düzeni, proje geliştirme süreci ve teslim beklentileri hakkında bilgilendirme yapıldı. SecureWatch AI projesinin amacı, kapsamı ve kullanılacak teknolojiler belirlendi. Proje; ağ trafiği verilerini makine öğrenmesi yöntemleriyle analiz ederek normal ve şüpheli bağlantıları sınıflandıran web tabanlı bir karar destek platformu olarak planlandı.GitHub İş Akışı: Projenin 20 günlük geliştirme planı hazırlanarak çalışmalar fazlara ve günlük görevlere ayrıldı. GitHub üzerinde EPIC ve alt görev Issue’ları oluşturuldu. Görevlerin To Do, In Progress, Review ve Done durumlarında izlenebilmesi için Project Board yapılandırıldı. Branch, commit ve Pull Request standartları belirlenerek Issue ve PR şablonları hazırlandı.Dokümantasyon Çalışmaları: Projenin tanıtımı ve kullanım bilgileri README.md dosyasında düzenlendi. Geliştirme aşamaları, MVP kapsamı, risk eşikleri ve tamamlanma kriterleri implementation_plan.md dosyasında toplandı. Danışman geri bildirimi doğrultusunda iki dokümanın kullanım amaçları ayrıştırıldı.Görsel Varlıklar ve Teslim: Logo, renk paleti, UI ekran taslakları ve proje ekran görüntülerinin düzenli saklanması için docs\/assets dizin yapısı oluşturuldu. Çalışmalar küçük ve anlamlı commitlere ayrılarak ayrı bir branch üzerinde yürütüldü. Değişiklikler Pull Request üzerinden danışman incelemesine sunuldu ve onay sonrasında main branch’ine birleştirildi.Git Commit Mesajları:[01:47] (8e6ce9b) docs(assets): add visual asset directory structure[01:47] (70769f2) docs(plan): document asset and mockup integration[02:02] (fcd557a) docs(assets): fix implementation plan link[02:03] (543f758) docs(plan): fix phase heading structure[02:03] (3a52d84) docs(readme): clarify license status[12:02] (19abdc4) docs(brand): add SecureWatch AI visual identity[12:03] (dbad75f) docs(mockups): add initial SecureWatch AI UI mockups[12:03] (28cc59d) docs(assets): update visual asset index[12:18] (b0e7ed3) docs(screenshots): add day 01 GitHub evidence"
},
{
"day": 2,
"date": "2026-07-14",
"content": "2. Gün – CIC-IDS2017 Veri Seti AnaliziVeri Seti Seçimi ve HazırlıkStajın ikinci gününde SecureWatch AI projesinde kullanılacak ağ trafiği veri seti üzerinde çalışıldı. Başlangıçta planlanan UNSW-NB15 veri setinde yaşanan erişim sorunları nedeniyle proje kapsamı korunarak CIC-IDS2017 veri setine geçildi. Veri seti resmî kaynaktan temin edildi ve MachineLearningCSV paketinde bulunan sekiz CSV dosyası kullanıldı.Ham veri dosyalarının büyük boyutlu olması nedeniyle CSV ve PCAP dosyalarının GitHub reposuna eklenmesini engelleyen .gitignore kuralları düzenlendi. Ham ve işlenmiş verilerin ayrı tutulması amacıyla data\/raw ve data\/processed klasörleri oluşturuldu.Veri Analizi ÇalışmalarıVeri setini belleği verimli kullanarak incelemek için CSV dosyalarını parçalar hâlinde okuyan bir Python analiz scripti geliştirildi. Sekiz dosyada toplam 2.830.743 kayıt ve 79 sütun analiz edildi. Sütun adları, veri tipleri, sınıf dağılımları, eksik değerler, sonsuz değerler ve tekrarlanan kayıtlar incelendi.Analiz sonucunda 2.273.097 normal trafik kaydı ve 557.646 saldırı kaydı bulundu. Veri setinin %80,30’unun normal, %19,70’inin saldırı trafiğinden oluştuğu belirlendi. Ayrıca 1.358 NaN, 4.376 Infinity ve dosya bazında toplam 256.479 tekrarlanan kayıt tespit edildi. Label sütununda eksik değer bulunmadı.Etiketleme ve Dokümantasyonİlk modelleme aşaması için BENIGN kayıtları 0, diğer saldırı türleri ise 1 olarak tanımlandı. Son olarak gerçek analiz sonuçlarını içeren veri seti analiz raporu ve 79 sütunluk veri sözlüğü hazırlandı.Git Commit Mesajları:[18:31] (6955612) chore(data): configure dataset directories[18:32] (9ddf1cc) feat(data): add CIC-IDS2017 analysis script[18:32] (d9e3fd4) docs(data): document CIC-IDS2017 analysis"
},
{
"day": 3,
"date": "2026-07-16",
"content": "3. Gün – Sistem Mimarisi TasarımıFonksiyonel Gereksinimler ve Kullanıcı SenaryolarıStajın üçüncü gününde SecureWatch AI projesinin sistem mimarisi ve teknik dokümantasyonu hazırlandı. Kullanıcı yönetimi, CSV yükleme, model eğitimi, saldırı tespiti, risk skorlama, güvenlik olayı yönetimi, dashboard ve audit log işlemlerine ait fonksiyonel gereksinimler belirlendi.Yönetici ve Güvenlik Analisti rolleri için kullanıcı senaryoları oluşturuldu. Yöneticinin kullanıcı oluşturma, audit log inceleme ve olayları analistlere atama yetkileri; analistin ise CSV yükleme, analiz başlatma, tespit sonuçlarını inceleme ve güvenlik olaylarını yönetme işlemleri tanımlandı.Veritabanı ve Durum MakineleriPostgreSQL üzerinde kullanılacak users, analysis_jobs, detection_results, incidents, incident_comments ve audit_logs tablolarını içeren ER diyagramı hazırlandı. Tablolar arasındaki yabancı anahtarlar ile CASCADE, RESTRICT ve SET NULL bütünlük kuralları belirlendi.Veritabanı tasarımı CIC-IDS2017 veri yapısıyla karşılaştırıldı. Veri setinde bulunmayan IP, kaynak port ve protokol alanları zorunlu alanlardan çıkarılırken destination_port korundu.Analiz işlemleri için PENDING, PROCESSING, COMPLETED ve FAILED; güvenlik olayları için OPEN, IN_PROGRESS, RESOLVED ve FALSE_POSITIVE durumları tanımlandı. İzin verilen geçişler Mermaid durum diyagramlarıyla gösterildi.Katmanlı Mimari, API ve Makine Öğrenmesi AkışıReact ve TypeScript tabanlı frontend, FastAPI backend, servis katmanı, scikit-learn makine öğrenmesi bileşeni ve PostgreSQL veritabanı arasındaki iletişimi gösteren katmanlı mimari hazırlandı.Kimlik doğrulama, kullanıcı, analiz, tespit sonucu, güvenlik olayı, yorum, audit log ve dashboard işlemleri için temel REST API endpointleri tasarlandı. Endpointlerin HTTP yanıt kodları, istek ve yanıt gövdeleri, sahiplik kontrolleri ve rol tabanlı erişim kuralları belgelendi.CIC-IDS2017 verilerinin temizlenmesi, stratified olarak eğitim ve test kümelerine ayrılması, modellerin eğitilmesi ve CSV tabanlı batch tahmin yapılması süreçleri dokümante edildi. Veri sızıntısını önlemek amacıyla imputer ve scaler işlemlerinin yalnızca eğitim verisinde fit edilmesi kararlaştırıldı.Çalışma tamamen mimari dokümantasyon kapsamında gerçekleştirildi; backend, frontend, veritabanı migration veya model uygulama kodu yazılmadı.Git Commit Mesajları:[15:27] (e197c33) docs(data): remove stale UNSW-NB15 references[15:27] (81a96b3) docs(roadmap): use MachineLearningCSV terminology[15:28] (c4f4f36) docs(workflow): clarify advisor-controlled merge process[15:31] (219aed9) docs(requirements): define functional requirements[15:31] (54c6342) docs(use-cases): document admin and analyst scenarios[15:31] (ebb4397) docs(database): add ER model and data dictionary[15:32] (2aa3572) docs(workflow): define analysis and incident state machines[15:32] (9886831) docs(architecture): document layered system design[15:32] (b7a6158) docs(api): draft core API endpoints[15:33] (2327a50) docs(ml): document training and batch inference flows[15:33] (5f56c84) docs(diary): add missing day 02 internship entry[15:34] (729afbd) docs(diary): add day 03 internship entry[15:59] (905a8a8) docs(requirements): align upload schema and dashboard scope[15:59] (ee44738) docs(database): fix nullable relationships and dataset fields[16:03] (edb6648) docs(workflow): correct MVP state transitions[20:06] (48e2714) docs(architecture): correct layered component dependencies[20:06] (8eef0ae) docs(api): correct endpoint semantics and RBAC coverage[20:08] (6b3ae40) docs(ml): fix training diagram and risk boundaries[20:09] (96af059) docs(data): align preprocessing decisions and roadmap claims[20:09] (96ec6d7) docs(diary): refine day 02 technical statements[20:11] (96ad2e6) docs(diary): update day 03 review record[20:13] (b3b3329) docs(api): fix user created status code"
},
{
"day": 4,
"date": "2026-07-17",
"content": "4. Gün – Backend Temeli ve PostgreSQL EntegrasyonuPostgreSQL Kurulumu ve HazırlıkStajın dördüncü gününde SecureWatch AI projesinin backend altyapısı üzerinde çalışıldı. İlk olarak PostgreSQL 18 kurulumu gerçekleştirildi. Kurulum sırasında Türkçe yerel ayar adındaki karakterler nedeniyle veritabanı kümesi oluşturulamadı. Kurulum logları incelenerek sorun tespit edildi ve veritabanı kümesi UTF-8 karakter kodlaması ile C yerel ayarı kullanılarak yeniden oluşturuldu.PostgreSQL servisi başlatıldı ve 5432 portunun çalıştığı doğrulandı. Uygulamanın kullanacağı securewatch_user kullanıcısı ile securewatch_db veritabanı oluşturuldu. Bağlantı bilgileri yerel .env dosyasında saklandı ve bu dosyanın GitHub’a yüklenmesi engellendi.Backend ve Veritabanı AltyapısıFastAPI için modüler backend klasör yapısı oluşturuldu. Uygulama ayarlarının ortam değişkenlerinden alınması için Pydantic Settings kullanıldı. Python sanal ortamı hazırlanarak gerekli paketler sürümleriyle birlikte yüklendi.SQLAlchemy kullanılarak veritabanı bağlantısı, oturum yönetimi ve temel model altyapısı hazırlandı. PostgreSQL bağlantısı SELECT 1 sorgusuyla test edildi. Gelecekte oluşturulacak veritabanı tablolarının değişikliklerini yönetmek amacıyla Alembic migration altyapısı kuruldu. Bu aşamada henüz tablo modeli veya migration dosyası oluşturulmadı.API ve Test ÇalışmalarıAPI hatalarının standart JSON biçiminde döndürülmesi için merkezi hata yönetimi hazırlandı. Uygulama ve veritabanı durumunu kontrol etmek amacıyla \/api\/v1\/health endpointi oluşturuldu. Endpointin çalışan PostgreSQL bağlantısında HTTP 200, bağlantı hatasında ise HTTP 503 döndürdüğü doğrulandı.Backend başlangıcı, OpenAPI şeması, health endpointi ve hata yönetimi için toplam yedi otomatik test yazıldı. Test sürecinde görülen eski HTTPX bağımlılığı uyarısı araştırılarak HTTPX2’ye geçildi. Son durumda yedi testin tamamı sıfır hata ve sıfır uyarıyla geçti. Uvicorn sunucusu çalıştırılarak uygulamanın gerçek PostgreSQL bağlantısıyla doğru yanıt verdiği kontrol edildi.Kullanıcı modeli, JWT kimlik doğrulaması ve rol tabanlı yetkilendirme çalışmaları bir sonraki güne bırakıldı.Git Commit Mesajları:[20:11] (16f285e) chore(backend): scaffold FastAPI application[20:21] (96dddc0) feat(database): configure PostgreSQL connection[20:25] (de51fc1) chore(database): configure Alembic migrations[20:30] (599b9b3) feat(api): add centralized error handling[20:34] (63fcbc1) feat(api): add database health endpoint[20:38] (c648813) test(backend): add startup and health checks[20:47] (83ede03) fix(test): replace deprecated HTTPX dependency[20:50] (049e5b2) docs(backend): document local setup[20:53] (267cdb2) docs(diary): add day 04 internship entry[21:13] (88e739c) Merge pull request #37 from mustafaemre027\/feature\/15-backend-foundation feat(backend): establish FastAPI backend foundation"
},
{
"day": 5,
"date": "2026-07-20",
"content": "5. Gün – Kimlik Doğrulama, RBAC ve Audit LogKullanıcı ve Veritabanı AltyapısıKullanıcı ve audit log bilgilerini tutmak için SQLAlchemy modelleri oluşturuldu. ADMIN ve ANALYST rolleri tanımlandı ve Alembic migration ile tablolar PostgreSQL veritabanına aktarıldı.Kimlik Doğrulama ve YetkilendirmeParolaların güvenli saklanması için bcrypt, access token işlemleri için PyJWT kullanıldı. Login, kullanıcı oluşturma, kullanıcı listeleme ve audit log görüntüleme endpointleri geliştirildi. Kimliği doğrulanmamış isteklerde 401, yetkisi olmayan kullanıcılarda 403 yanıtı döndürüldü.Audit Log ve GüvenlikBaşarılı girişler ve kullanıcı oluşturma işlemleri audit log tablosuna kaydedildi. Kullanıcı ile audit kaydının tek transaction içinde oluşturulması sağlandı. JWT anahtarı ortam değişkenine taşındı ve hassas bilgilerin loglara yazılması engellendi.Test ve SonuçKimlik doğrulama, RBAC ve audit log işlemleri için toplam 61 test çalıştırıldı. Tüm testler sıfır hata ve sıfır uyarıyla tamamlandı. Gün sonunda hazırlanan PR #38 danışman onayından sonra merge edildi.Git Commit Mesajları:[11:26] (5b7b9ff) chore(deps): add authentication dependencies[11:30] (65f3df3) feat(auth): add password hashing and JWT helpers[11:37] (07ee831) feat(models): define user and audit log models[14:40] (a3565da) chore(database): add users and audit logs migration[15:07] (100e7d4) chore(deps): add email validation dependency[15:10] (25f72e5) feat(schemas): add authentication user and audit schemas[16:17] (e63f7ca) feat(services): add user and audit log services[16:18] (bacc116) feat(auth): add authentication and RBAC services[17:08] (27c1ae1) feat(api): add login user and audit log endpoints[17:30] (fab0b77) test(auth): cover authentication RBAC and audit logging[17:51] (8b70847) fix(config): require secure JWT secret configuration[17:52] (3945c2c) fix(auth): make user creation and audit logging atomic[18:06] (f5d6a2a) refactor(api): centralize client IP extraction[18:06] (33eb74c) fix(api): align endpoint paths with API contract[18:07] (a718106) docs(api): align error response documentation[18:07] (54be54d) style: clean whitespace in modified files[18:17] (ec6aa8e) docs(auth): document authentication and RBAC setup[18:29] (4ab9b1d) docs(diary): add day 05 internship entry"
},
{
"day": 6,
"date": "2026-07-21",
"content": "Gün 6 – CSV Yükleme ve DoğrulamaYükleme Ayarları ve AnalysisJob ModeliBugün SecureWatch AI projesinde CIC-IDS2017 veri seti için güvenli CSV yükleme ve doğrulama altyapısını geliştirdim. İlk olarak dosyaların kaydedileceği dizini ve 50 MB maksimum yükleme sınırını yapılandırdım. Yüklenen dosyaların durumunu takip edebilmek için AnalysisJob modelini oluşturdum ve veritabanı değişikliklerini Alembic migration ile uyguladım.Güvenli Dosya DepolamaDosyaların tamamını belleğe almadan parçalar hâlinde okunmasını sağlayan güvenli bir depolama servisi geliştirdim. Bu servis dosya boyutunu kontrol etmekte, SHA-256 özeti hesaplamakta ve güvenli dosya isimleri kullanmaktadır. Path traversal saldırılarına karşı dosya adlarını temizleyen ve hata durumunda geçici dosyaları silen mekanizmalar da ekledim. Aynı dosyanın tekrar yüklenmesini SHA-256 değeri üzerinden engelledim.CSV Şema DoğrulamasıCSV doğrulama aşamasında dosya uzantısı, MIME türü, UTF-8 kodlaması ve başlık satırı kontrol edildi. CIC-IDS2017 veri yapısındaki 78 özellik sütununun bulunması zorunlu tutulurken Label sütunu opsiyonel olarak kabul edildi. Eksik, fazla, boş veya tekrarlanan sütun adları için açıklayıcı hata yanıtları oluşturuldu.API, Yetkilendirme ve TestlerSon olarak CSV yükleme, analizleri listeleme ve analiz detayını görüntüleme endpointlerini geliştirdim. Yükleme işlemini ANALYST rolüyle sınırlandırdım; ADMIN kullanıcılarının bütün analizleri, ANALYST kullanıcılarının ise yalnızca kendi analizlerini görüntülemesini sağladım. Başarılı yüklemeler PENDING durumunda kaydedildi ve audit log oluşturuldu. Geliştirilen özellikleri birim ve entegrasyon testleriyle doğruladım. Gün sonunda toplam 90 test hatasız ve uyarısız şekilde başarıyla geçti.Git Commit Mesajları:[11:03] 7d90e82 feat(config): add CSV upload settings[12:00] c9f92fe feat(model): add AnalysisJob model[12:04] 9fcd8bd fix(model): align analysis job status length[12:43] 9d59aa2 chore(database): add analysis jobs migration[12:51] 658e1ff feat(storage): add secure CSV file storage[13:08] c7f550d feat(validation): validate CIC-IDS2017 CSV uploads[14:43] c40676b feat(api): add analysis upload and status endpoints[15:24] 5cb75be fix(api): inject upload settings per request[15:24] 3224528 test(upload): cover CSV upload and validation[15:33] 1bc225a docs(upload): document CSV upload workflow[15:43] 6b5508c docs(diary): add day 06 internship entry"
},
{
"day": 7,
"date": "2026-07-22",
"content": "7. Gün – Ön İşleme Pipeline’ı ve Veri Sızıntısını ÖnlemeEğitim Verisinin HazırlanmasıBugün CIC-IDS2017 veri seti için eğitim verisi hazırlama servisini geliştirdim. Veri setindeki 78 özellik doğrulandıktan sonra tekrar eden Fwd Header Length.1 sütununu kaldırarak 77 sayısal model özelliği elde ettim. Label sütununu hedef değişken olarak ayırdım. Sonsuz değerleri NaN değerine dönüştürdüm ve tekrarlanan satırları temizledim.Ön İşleme Pipeline’ıEksik sayısal değerleri medyanla doldurmak için SimpleImputer, değerleri ölçeklendirmek için StandardScaler kullandım. Bu adımları ColumnTransformer ile birleştirdim. Ayrıca ihtiyaç durumunda kullanılmak üzere bilinmeyen değerleri destekleyen opsiyonel OneHotEncoder yapısı ekledim.Veri Sızıntısının ÖnlenmesiVeriyi yüzde 80 eğitim ve yüzde 20 test olarak stratified biçimde ayırdım. Ön işleme bileşenlerinin yalnızca eğitim verisinde öğrenilmesini, test verisinin ise sadece dönüştürülmesini sağladım. Defensive copy kullanarak kaynak, eğitim ve test verilerinin birbirini değiştirmesini engelledim.Test ve SonuçGeliştirilen işlemleri otomatik testlerle doğruladım. Toplam 116 test sıfır hata ve sıfır uyarıyla tamamlandı. Dokümantasyonu güncelleyerek PR #40’ı danışman incelemesine gönderdim.Git Commit Mesajları:[11:12] 923cbd1 chore(deps): add ML preprocessing dependencies[11:32] d7a86c8 feat(preprocessing): prepare CIC-IDS2017 training data[12:07] b5ae87c feat(preprocessing): build sklearn preprocessing pipeline[12:50] 5c1637b feat(preprocessing): add leakage-safe train test split[14:22] f7e07b3 fix(preprocessing): isolate mutable split data[15:08] aa7be0b docs(preprocessing): document leakage-safe pipeline[17:13] 9a18681 docs(diary): add day 07 internship entry"
},
{
"day": 8,
"date": "2026-07-23",
"content": "8. Gün – Baseline Modeller ve İlk Model Değerlendirmesiİkili Etiketleme ve Performans MetrikleriCIC-IDS2017 veri setindeki etiketleri ikili sınıflandırmaya uygun hâle getirdim. Normal trafik olan BENIGN değerini 0, diğer saldırı türlerini ise 1 olarak kodladım. Modelleri değerlendirmek için accuracy, precision, recall, F1-score ve confusion matrix metriklerini oluşturdum.Baseline ModellerEn temel karşılaştırma modelini oluşturmak amacıyla Dami Klasifayır modelini geliştirdim. Ardından sınıf dengesizliğini dikkate alan Lojistik Regreşın modelini eğittim. Modellerin yalnızca eğitim verisiyle öğrenmesini, tahmin ve değerlendirme işlemlerinin test verisi üzerinde yapılmasını sağladım.Eğitim İş AkışıGün 7’de hazırladığım ön işleme pipeline’ını model eğitim sürecine entegre ettim. Veriler 77 sayısal özellik kullanılarak eğitim ve test kümelerine ayrıldı. Veri sızıntısını önlemek için ön işleme bileşenleri yalnızca eğitim verisinde öğrenildi. CSV dosyasından eğitim yapabilen bir komut satırı aracı geliştirildi ve sonuçların güvenli JSON raporu olarak sunulması sağlandı.Test ve SonuçModel servisleri, eğitim akışı, performans metrikleri ve hata durumları otomatik testlerle doğrulandı. Toplam 213 test sıfır hata ve sıfır uyarıyla tamamlandı. Teknik dokümantasyon ve ilk model değerlendirme raporu güncellendi. Gün 8 çalışmaları uzak repoya gönderilerek Pull Request ve proje kartları danışman incelemesine hazırlandı.Git Commit Mesajları:[11:24] 96af05a feat(ml): implement binary label encoding service[12:19] c92632f feat(ml): add binary classification metrics[13:24] b0b0a06 feat(ml): add dummy classifier baseline training[14:18] 1aaf6b9 feat(ml): add logistic regression training with balanced class weight[17:52] 0650272 feat(ml): add baseline training workflow[18:00] 22a11c5 docs(ml): document baseline model evaluation[18:04] 3060bf7 docs(diary): add day 08 internship entry[18:11] 5987316 fix(docs): remove trailing whitespace from baseline report"
},
{
"day": 9,
"date": "2026-07-24",
"content": "Gün 9 – Random Forest Eğitimi ve Model KarşılaştırmasıRandom Forest Eğitim ServisiBugün SecureWatch AI projesinde saldırı trafiğini tespit etmek için Random Forest sınıflandırma altyapısını geliştirdim. Modelin yalnızca eğitim verileri üzerinde öğrenmesini, test verilerinin ise sadece tahmin ve değerlendirme amacıyla kullanılmasını sağladım. Eğitim süresini ölçen ve modelde kullanılan 77 özelliğin önem değerlerini hesaplayan yapıları ekledim. Özellik önemlerini büyükten küçüğe sıralayarak en etkili özelliklerin raporlanmasını sağladım.Kontrollü Parametre DeneyleriRandom Forest modelinin farklı ayarlardaki davranışını incelemek için dört kontrollü deney hazırladım. Standart modelin yanında daha derin ağaçlara sahip, sınıf ağırlığı kullanılmayan ve daha az ağaçtan oluşan küçük bir model yapılandırdım. Bütün deneylerin aynı eğitim-test ayrımı üzerinde ve sabit ayarlarla çalışmasını sağlayarak sonuçların tekrarlanabilir olmasına dikkat ettim.Model Karşılaştırması ve RaporlamaGün 8’de geliştirilen Lojistik Regresyon modeli ile dört Random Forest varyantını ortak bir karşılaştırma servisi üzerinden değerlendirdim. Modeller için doğruluk, hassasiyet, duyarlılık, F1-skoru, karmaşıklık matrisi ve eğitim süresi bilgilerini raporladım. Komut satırı aracına Random Forest karşılaştırma seçeneği ekledim ve sonuçların güvenli JSON biçiminde alınmasını sağladım. Ham verilerin, tahmin dizilerinin ve model nesnelerinin çıktıya eklenmesini engelledim. Bu aşamada herhangi bir modeli nihai model olarak seçmedim.Test ve SonuçGeliştirilen servisler, kontrollü deneyler, veri sızıntısı önlemleri, karşılaştırma yapıları ve komut satırı işlemleri otomatik testlerle doğrulandı. Toplam 237 test sıfır hata ve sıfır uyarıyla başarıyla tamamlandı. Teknik dokümantasyon ve model değerlendirme raporu güncellendi. ROC-AUC, yanlış pozitif oranı analizi ve nihai model seçimi sonraki çalışma gününün kapsamına bırakıldı.Git Commit Mesajları:[11:47] (1aa6980) feat(ml): implement random forest classifier training service[12:15] (0af7af8) feat(ml): add controlled random forest experiments[13:22] (3b3352e) feat(ml): compare random forest and logistic regression[15:37] (e8c1723) feat(ml): add random forest evaluation to training cli[15:45] (56c9cf0) docs(ml): document random forest evaluation and comparison[16:08] (2504f5b) docs(diary): add day 09 internship entry"
},
{
"day": 10,
"date": "2026-07-27",
"content": "Gün 10 – Model Değerlendirme ve Nihai Model SeçimiGelişmiş Değerlendirme MetrikleriBugün SecureWatch AI projesinde Lojistik Regresyon ve Random Forest modellerini daha ayrıntılı değerlendirmek için olasılık tabanlı metrik altyapısını geliştirdim. Modellerden saldırı sınıfına ait olasılık değerlerini güvenli biçimde alarak ROC-AUC, PR-AUC, Precision-Recall eğrisi ve yanlış pozitif oranı hesaplamalarını ekledim. Ham verilerin, olasılık dizilerinin ve model nesnelerinin değerlendirme raporlarına eklenmesini engelledim.Validation Tabanlı Karar EşiğiKarar eşiğinin test verisi üzerinden belirlenmesinin veri sızıntısına neden olacağını dikkate alarak yalnızca eğitim verisi üzerinde 5-Fold Cross-Validation kullandım. Farklı karar eşiklerini doğrulama sonuçları üzerinden değerlendirdim. Duyarlılığın en az 0.95, yanlış pozitif oranının ise en fazla 0.05 olması şartını uyguladım. Bu şartları sağlayan eşik bulunmadığında sistemin kontrolsüz biçimde varsayılan bir eşik seçmesini engelledim.Model Seçimi ve Güvenli RaporlamaLojistik Regresyon ile dört Random Forest varyantını ortak bir değerlendirme sürecine dahil ettim. Modellerin yalnızca validation sonuçlarına göre seçilmesini ve test sonuçlarının seçim kararını etkilememesini sağladım. Eğitim süresinin farklı çalıştırmalarda değişebilmesi nedeniyle bu değeri seçim kararından çıkararak yalnızca raporlama amacıyla korudum. Saldırı olasılıklarını LOW, MEDIUM, HIGH ve CRITICAL seviyelerine ayırdım. Komut satırı aracına nihai model seçimi seçeneğini ekledim ve sonuçların güvenli JSON biçiminde alınmasını sağladım.Test ve SonuçGeliştirilen olasılık çıkarımı, metrik hesaplama, karar eşiği belirleme, model seçimi, risk sınıflandırması ve komut satırı işlemleri otomatik testlerle doğrulandı. Toplam 304 test sıfır hata ve sıfır uyarıyla başarıyla tamamlandı. Teknik dokümantasyon, model değerlendirme raporu ve Model Card hazırlandı. Bu aşamada gerçek veri üzerinden üretim modeli seçilmedi, model dosyası kaydedilmedi ve inference servisi geliştirilmedi.Git Commit Mesajları:[11:18] 1839bc0 feat(ml): implement probability extraction and advanced ROC\/PR metrics[12:24] 5e378b7 feat(ml): add validation-based decision threshold selection[13:22] c9cb2dd feat(ml): add deterministic final model selection[14:37] 36ce544 feat(ml): integrate final model selection into training cli[15:35] f5428bc fix(ml): remove runtime timing from model selection tie-break[16:21] 70b11d7 docs(ml): document model evaluation and selection[16:25] 016a889 docs(diary): add day 10 internship entry"
},
{
"day": 11,
"date": "2026-07-28",
"content": "Gün 11 – Güvenli Model Tahmini ve Analiz API’siGüvenli Model Paketi ve Tahmin ServisiBugün SecureWatch AI projesinde hazırlanan model paketini güvenli biçimde yükleyen tahmin altyapısını geliştirdim. Model paketinin yalnızca sunucu tarafından kontrol edilen dizinden okunmasını sağladım ve kullanıcıların dışarıdan model dosyası yüklemesini engelledim. CSV verilerini 77 özellik üzerinden model girdisine hazırladım. Ön işleme yapısını yeniden eğitmeden mevcut dönüştürme kurallarını uyguladım. Her trafik kaydı için saldırı olasılığı, saldırı kararı ve düşük, orta, yüksek veya kritik risk seviyesi üretilmesini sağladım.Analiz Süreci ve Sonuçların SaklanmasıModelin oluşturduğu tahminleri satır bazında saklamak için DetectionResult veri modelini ve gerekli veritabanı güncellemesini hazırladım. Analiz işlerinin bekliyor, işleniyor, tamamlandı ve başarısız durumlarıyla takip edilmesini sağladım. İşlem sırasında hata oluşması hâlinde yarım kalan sonuçların veritabanına kaydedilmesini engelledim. Aynı analiz işinin eş zamanlı iki farklı istek tarafından çalıştırılmasına karşı koruma ekledim. Sonuçların CSV dosyasındaki satır sırasını korumasını sağladım.API, Yetkilendirme ve Güvenlik KontrolleriAnalizi başlatmak, tahmin sonuçlarını sayfalayarak listelemek ve analiz özetini görüntülemek için üç API uç noktası geliştirdim. Sonuçların saldırı durumu ve risk seviyesine göre filtrelenmesini sağladım. Güvenlik analistlerinin yalnızca kendi analizlerine, yöneticilerin ise bütün analizlere erişebilmesi için rol tabanlı yetkilendirme uyguladım. Ham CSV verilerinin, model nesnelerinin, dosya yollarının ve hata ayrıntılarının API cevaplarına eklenmesini engelledim.Test ve SonuçModel yükleme, tahmin üretme, veritabanı kayıtları, işlem geri alma, eş zamanlı istek koruması, filtreleme ve erişim kontrolleri otomatik testlerle doğrulandı. Toplam 354 test sıfır hata, sıfır uyarı ve sıfır atlama ile başarıyla tamamlandı. Teknik dokümantasyon güncellendi. Olay oluşturma, analiste atama, durum yönetimi ve olay notları Gün 12 kapsamına bırakıldı.Git Commit Mesajları:[01:27] (d0f8f99) feat(inference): implement secure model loading and inference prediction pipeline[01:39] (aae2fc5) feat(analysis): add DetectionResult model, migration, and job processing service[01:51] (b881f44) feat(api): add inference execution, result, and summary endpoints[10:46] (9a2f561) fix(inference): restore API services and harden job processing[10:59] (1d3e918) docs(inference): document secure inference and analysis API[11:02] (4e6004e) docs(diary): add day 11 internship entry[11:14] (532d4aa) chore: remove trailing whitespace from day 11 changes"
},
{
"day": 12,
"date": "2026-07-29",
"content": "Gün 12 – Olay Yönetimi ve Güvenlik Olayı API’siIncident ve IncidentComment ModelleriBugün SecureWatch AI projesinde, tespit edilen güvenlik tehditlerini yönetilebilir olay kayıtlarına dönüştüren altyapıyı geliştirdim. Bu kapsamda Incident ve IncidentComment veritabanı modellerini oluşturdum. Incident modelini DetectionResult tablosuyla bire bir ilişkili olacak şekilde yapılandırarak aynı tespit sonucundan birden fazla olay oluşturulmasını engelledim. Olayların durumu, önem seviyesi, atanan analist, açıklama ve oluşturulma zamanı gibi bilgilerin saklanmasını sağladım. Olaylara eklenen analist yorumları için ayrı bir ilişki tanımladım ve gerekli Alembic veritabanı güncellemesini hazırladım.Olay Yönetimi ve YetkilendirmeOlay yönetimi işlemlerinde rol tabanlı erişim kontrolü ve kayıt sahipliği kuralları uyguladım. Güvenlik analistlerinin yalnızca kendi analiz işlerine ait saldırı tespitlerinden olay oluşturabilmesini sağladım. Analistler, henüz kimseye atanmamış bir olayı kendilerine alabilirken yalnızca kendilerine atanmış olayların durumunu değiştirebilmekte ve bu olaylara yorum ekleyebilmektedir. Yönetici kullanıcıların ise bütün olayları görüntüleyebilmesini ve olayları geçerli analist hesaplarına atayabilmesini sağladım. Yetkisiz erişimlerde kayıtların varlığını açığa çıkarmayan güvenli hata yanıtları kullandım.Durum Geçişleri, Yarış Koruması ve AuditOlayların OPEN, IN_PROGRESS, RESOLVED ve FALSE_POSITIVE durumları arasında yalnızca izin verilen geçişlerle ilerlemesini sağlayan bir durum geçiş yapısı geliştirdim. Geçersiz geçişleri sistem tarafından reddettim. Aynı olayın iki analist tarafından eş zamanlı olarak sahiplenilmeye çalışılması durumunda oluşabilecek yarış koşulunu önlemek için veritabanı satır kilidi kullandım. Böylece ilk işlemin başarılı olmasını, ikinci işlemin ise kontrollü bir çakışma yanıtı almasını sağladım. Olay oluşturma, atama, durum değiştirme ve yorum ekleme işlemlerini audit kayıtlarıyla izlenebilir hâle getirdim. Hassas yorum ve dosya içeriklerinin audit kayıtlarına yazılmasını engelledim.API, Test ve SonuçOlay oluşturma, olayları filtreleyerek listeleme, detay görüntüleme, güncelleme ve yorum ekleme API uç noktalarını geliştirdim. Olay ve yorum silme işlemlerini güvenlik ve veri bütünlüğü nedeniyle kapsam dışında bıraktım. README ile veritabanı, API ve makine öğrenmesi mimari belgelerini gerçek uygulamayla uyumlu şekilde güncelledim. Model, servis, API, yetkilendirme ve eş zamanlı işlem senaryolarını kapsayan toplam 417 otomatik test sıfır hata ve sıfır uyarıyla başarıyla tamamlandı.Git Commit Mesajları:[12:54] (09c57b3) feat(incidents): add incident models and migration[13:15] (87d4d6b) feat(incidents): implement incident management services[13:27] (ff37dfd) fix(incidents): return conflict for competing incident claims[13:49] (1a6e676) feat(api): add incident management endpoints[14:03] (c98cac3) chore(incidents): remove trailing whitespace[14:24] (9ba72dd) docs(incidents): document incident management workflow[16:21] (f9b01143) docs(diary): add day 12 internship entry"
},
{
"day": 13,
"date": "2026-07-30",
"content": "Gün 13 – Frontend Temeli, Güvenli Kimlik Doğrulama ve Uygulama KabuğuReact, TypeScript ve Frontend AltyapısıBugün SecureWatch AI projesinin frontend altyapısını oluşturdum. React, TypeScript ve Vite kullanarak temel proje yapısını hazırladım. Tailwind CSS’i projeye ekleyerek responsive tasarım için kullanılacak stil altyapısını kurdum. TypeScript type-check, ESLint, Vitest ve React Testing Library yapılandırmalarını tamamladım. Geliştirme, test, lint, type-check ve production build işlemleri için gerekli npm komutlarını hazırladım. Derleme çıktıları, bağımlılık klasörleri, test kapsamı dosyaları ve ortam dosyalarının Git tarafından takip edilmesini engelleyen kuralları ekledim.Marka Tasarımı ve Responsive LoginSecureWatch AI için daha önce hazırlanan logo ve marka varlıklarını frontend projesine aktardım. Koyu lacivert, mavi, turkuaz ve açık renklerden oluşan tasarım sistemini Tailwind CSS tema değişkenleriyle tanımladım. Bu tasarım yapısını kullanarak masaüstü, tablet ve mobil ekranlarda çalışan responsive bir giriş sayfası geliştirdim. Kullanıcı adı ve parola alanlarını erişilebilir etiketler, doğru autocomplete özellikleri ve klavye kullanımına uygun odak sırasıyla hazırladım. Form gönderilirken butonun yüklenme durumuna geçmesini ve tekrarlanan giriş isteklerinin engellenmesini sağladım. Parola alanındaki içeriğin ekranda maskeli biçimde gösterilmesini korudum.API Client, Authentication ve Güvenli YönlendirmeBackend ile iletişim kurmak için native Fetch API kullanan tip güvenli bir API istemcisi geliştirdim. Başarılı yanıtları ve backend’in iç içe hata yapısını güvenli biçimde işleyen özel bir hata modeli hazırladım. Kullanıcıya teknik bağlantı ayrıntıları yerine anlaşılır Türkçe hata mesajları gösterilmesini sağladım. Authentication bilgilerini yöneten AuthProvider yapısını oluşturdum. Access token yalnızca React belleğinde tutuldu; localStorage, sessionStorage veya cookie kullanılmadı. React Router ile giriş sayfası, korumalı ana sayfa ve bilinmeyen adresler için güvenli yönlendirmeler hazırladım. Giriş yapmayan kullanıcıların korumalı sayfalara erişmesini, dış adreslere yönlendirme yapılmasını ve güvenli olmayan dönüş adreslerinin kullanılmasını engelledim.Test, Tarayıcı Doğrulaması ve SonuçAPI istemcisi, authentication durumu, giriş ekranı, route korumaları, güvenli yönlendirmeler ve marka bileşenleri için otomatik testler geliştirdim. Toplam 9 test dosyasında 69 test sıfır hata ve sıfır atlama ile başarıyla tamamlandı. TypeScript, ESLint, production build ve npm güvenlik kontrolleri hatasız sonuçlandı. Giriş ekranını masaüstü, tablet ve mobil çözünürlüklerde gerçek tarayıcı üzerinden kontrol ettim. Yatay taşma, bileşen çakışması veya klavye erişilebilirliği problemi görülmedi. README ve frontend dokümantasyonunu güncel uygulama yapısıyla uyumlu hâle getirdim. Analiz ekranları, tespit sonuçları, olay yönetimi arayüzü ve dashboard çalışmalarını sonraki günlerin kapsamına bıraktım.Git Commit Mesajları:[11:58] (1ff4120) chore(frontend): scaffold React TypeScript application[12:34] (010e4db) chore(frontend): configure ESLint validation[12:48] (e7c29fb) feat(frontend): add SecureWatch design foundation[12:57] (4fb65c6) chore(frontend): narrow SVG whitespace exception[13:05] (e933c90) feat(frontend): add api client and auth state[13:14] (110ba48) fix(auth): complete frontend authentication infrastructure[13:41] (bd7f217) feat(auth): implement responsive login page[14:21] (bf023ed) feat(routing): add protected application shell[16:18] (9446b74) fix(frontend): resolve visual validation issues[16:29] (0f29889) docs(frontend): document frontend foundation[16:29] (0853dd8) docs(diary): add day 13 internship entry[17:07] (102fe27) docs(frontend): correct Node.js requirement[17:18] (5c6249e) chore(sync): merge latest main into frontend branch"
},
{
"day": 14,
"date": "2026-07-31",
"content": "Gün 14 – Analiz Ekranları ve Güvenli CSV İş AkışıAnaliz API İstemcisi ve Tip TanımlarıBugün SecureWatch AI projesinde analiz iş akışını frontend tarafına taşıdım. Backend’de bulunan CSV yükleme, analiz başlatma, analiz geçmişini listeleme ve analiz detayını görüntüleme uç noktalarını inceleyerek bunlarla uyumlu TypeScript tiplerini oluşturdum. Native fetch tabanlı API istemcisini FormData desteğiyle genişlettim. CSV yükleme isteklerinde tarayıcının multipart sınırını güvenli biçimde oluşturmasını sağladım. Kimlik doğrulama tokenının yalnızca Authorization başlığında gönderilmesini ve hata yanıtlarının güvenli ApiError yapısına dönüştürülmesini korudum.Güvenli CSV Yükleme EkranıYalnızca ANALYST rolündeki kullanıcıların kullanabildiği, sürükle-bırak ve dosya seçme yöntemlerini destekleyen CSV yükleme formunu geliştirdim. Dosya uzantısı, boş dosya ve 50 MB boyut sınırı kontrollerini istemci tarafında uyguladım. Tekrarlı gönderimleri eş zamanlı kilitle engelledim ve bileşen kapandığında devam eden istekleri AbortController ile iptal ettim. ADMIN kullanıcıları için yükleme alanını gizleyerek yalnızca analiz geçmişinin görüntülenmesini sağladım. Böylece arayüzdeki rol davranışlarını backend yetkilendirme kurallarıyla uyumlu hâle getirdim.Analiz Yürütme ve Geçmiş TakibiYüklenen AnalysisJob kaydını PENDING, PROCESSING, COMPLETED ve FAILED durumlarıyla izleyen analiz yürütme panelini hazırladım. Kullanıcının analizi manuel olarak başlatabilmesini ve işlem tamamlandığında işlenen kayıt sayısını güvenli biçimde görüntüleyebilmesini sağladım. Polling kullanmadan backend’in senkron yanıtına göre arayüz durumunu güncelledim. Durum filtresi, yenileme ve skip\/limit tabanlı sayfalama içeren analiz geçmişi bileşenini ekledim. Eski yanıtların yeni ekran durumunu bozmasını önlemek amacıyla stale-response ve unmount korumaları uyguladım.Routing, Erişilebilirlik ve Güvenli Hata YönetimiAnaliz ekranını \/analysis rotasında ProtectedRoute ve mevcut uygulama kabuğuna bağladım. Oturum bilgilerini tarayıcı depolamasına yazmadan yalnızca React belleğinde tutan yapı korundu. Sayfayı 320 piksel genişliğe kadar responsive hazırladım. Semantik HTML, focus-visible, role=\"status\", role=\"alert\" ve aria-live bölgeleri kullandım. Backend’den gelen MODEL_NOT_FOUND ve DUPLICATE_FILE hatalarını teknik kod, dosya yolu, hash veya stack trace göstermeden anlaşılır Türkçe mesajlara dönüştürdüm.Test ve SonuçAPI istemcisi, CSV doğrulama, rol davranışları, analiz başlatma, geçmiş yenileme ve hata maskeleme işlemleri için testler yazdım. Toplam 14 test dosyasında 141 frontend testi ve 354 backend regresyon testi başarıyla tamamlandı. Type-check ve ESLint sıfır hatayla geçti, production build başarıyla oluşturuldu ve npm audit sonucunda yüksek veya kritik güvenlik açığı bulunmadı. Gerçek Chrome tarayıcısında ANALYST ve ADMIN görünümlerini, responsive düzeni ve duplicate dosya mesajını doğruladım. Kalıcı model, gerçek veri seti, dashboard, incident arayüzü veya bildirim sistemi eklemedim.Git Commit Mesajları:[15:09] (a4b1243) feat(analysis): implement AnalysisJob types and API client functions[15:20] (3ae406c) feat(analysis): add secure CSV upload form and file validation[15:34] (249953f) fix(analysis): harden CSV upload lifecycle and test coverage[15:44] (917f944) feat(analysis): implement analysis execution and status tracking[16:01] (3a416ea) fix(analysis): resolve execution panel audit findings[16:14] (7a9a63e) feat(analysis): implement analysis history list component with secure status tracking and pagination[17:14] (e742921) fix(analysis): resolve history list audit findings[17:25] (5af1ac3) feat(routing): integrate analysis screens into application shell[17:42] (35a1a0e) fix(ui): address analysis integration audit findings[19:36] (0ffef61) fix(analysis): map model availability errors safely[20:05] (3abc740) fix(analysis): map duplicate upload errors safely[12:50] (8b98686) docs(frontend): document analysis screens workflow[12:51] (2f64d8f) docs(diary): add day 14 internship entry[12:58] (56c6d39) docs(diary): refine day 14 internship entry"
},
{
"day": 15,
"date": "2026-08-03",
"content": "Gün 15 – Tespit Sonuçları, Oturum Kalıcılığı ve Son DoğrulamalarTespit Sonuçları ve Model Yolu DüzenlemeleriBugün SecureWatch AI projesinde tamamlanan analizlerin sonuçlarını kullanıcıya sunan tespit sonuçları ekranı üzerinde çalıştım. Backend’den gelen analiz verilerini tip güvenli API istemcisiyle alarak özet kartları, sonuç listesi, saldırı olasılığı ve risk seviyesi bilgilerini arayüzde gösterdim. Normal ve saldırı olarak sınıflandırılan kayıtların anlaşılır biçimde ayrılmasını sağladım. Kullanıcıların tahmin ve risk seviyesine göre filtreleme yapabilmesi, sonuçlar arasında önceki ve sonraki sayfa düğmeleriyle gezinebilmesi için gerekli yapıları tamamladım. Ayrıca model paketinin çalışma dizinine bağlı olmadan doğru şekilde backend\/app\/ml_models klasöründen yüklenmesini sağlayan yol düzenlemelerini ve ilgili testleri gerçekleştirdim.Metin Kontrastı ve Kullanıcı DeneyimiChrome kontrollerinde koyu arka plan üzerindeki bazı açıklamaların, filtre etiketlerinin ve sonuç kartı metinlerinin yeterince okunaklı olmadığı görüldü. Sayfa başlığı, açıklama metni, özet kartı etiketleri, filtre başlıkları, CSV satırı, tahmin, saldırı olasılığı, risk seviyesi ve oluşturulma zamanı alanlarında kullanılan renkleri mevcut tasarım sistemiyle uyumlu daha açık tonlarla güncelledim. Kart yapısını, filtreleme mantığını ve sayfalama davranışını değiştirmedim. Normal, saldırı ve risk renklerinin anlamlarını korudum. Ardından metinlerin okunabilirliğini, düğmelerin aktif-pasif durumlarını ve klavye odak göstergelerini gerçek tarayıcıda doğruladım.Oturum Kalıcılığı ve Güvenli YönlendirmeAccess token ve kullanıcı bilgileri yalnızca React belleğinde tutulduğu için sayfa yenilendiğinde oturum kayboluyordu. Bu sorunu çözmek amacıyla authentication bilgilerini aynı tarayıcı sekmesi boyunca sessionStorage içerisinde saklayacak şekilde AuthProvider yapısını güncelledim. Sayfa yenilendiğinde veya sonuç bağlantısı doğrudan açıldığında oturum bilgilerinin ilk render sırasında geri yüklenmesini sağladım. Eksik veya bozuk oturum verilerinin uygulamayı çökertmeden temizlenmesini ve bilgilerden yalnızca biri varsa kullanıcının giriş yapmış kabul edilmemesini sağladım. Çıkış yapıldığında React state ve sessionStorage içindeki bütün oturum bilgilerinin temizlenmesini korudum.Test, Tarayıcı Doğrulaması ve SonuçFrontend tarafında type-check, ESLint, production build ve güvenlik denetimleri başarıyla tamamlandı. Toplam 18 frontend test dosyasında 251 test sıfır hata, uyarı ve atlama ile geçti. Backend tarafında model yolu testlerinin yanında tam test paketi çalıştırıldı ve 359 test başarıyla tamamlandı. Gerçek analiz sonuç sayfasında yenileme, doğrudan URL erişimi, sonuçların yeniden yüklenmesi, geçersiz analiz kimliği ve çıkış sonrası korumalı rotaya erişim senaryolarını Chrome üzerinden doğruladım. Manuel kontrollerde oturum kaybı, gereksiz giriş yönlendirmesi, ekran bozulması veya metin kontrastı problemi görülmedi. Gün sonunda tespit sonuçları ve oturum kalıcılığı çalışmaları incelemeye hazır hâle getirildi.Git Commit Mesajları:[11:15] (346b957) feat(detections): add typed results API client[11:28] (16739a0) feat(detections): add accessible analysis summary panel[11:39] (c9e1e2f) feat(detections): add filterable results list[11:51] (586d125) fix(detections): remove trailing whitespace[11:58] (7351915) test(detections): eliminate async act warnings[12:11] (6eb1032) fix(detections): remove summary panel trailing whitespace[12:46] (e229f75) test(analysis): eliminate history list act warning[12:53] (9221074) test(analysis): eliminate upload form act warnings[13:03] (f02f25a) test(analysis): eliminate execution panel act warnings[13:12] (80d54db) feat(detections): compose detection results page[13:19] (6b1772e) feat(routing): add protected detection results route[13:27] (8cc2d6d) feat(analysis): link completed jobs to detection results[13:34] (88e2c0d) feat(analysis): link completed execution to detection results[15:41] (96ce516) chore(security): ignore local model artifacts[16:05] (4748b28) fix(config): resolve model package path from backend root[16:41] (c4ed630) test(training): isolate model artifact side-effect assertion[17:27] (1e2f1a0) fix(detections): improve results text contrast[18:40] (a091b89) fix(auth): preserve session across page reloads[19:12] (3dcd187) style(tests): remove baseline test trailing whitespace"
},
{
"day": 16,
"date": "2026-08-04",
"content": "Gün 16 – Güvenli Olay Yönetimi Arayüzü ve İş AkışıOlay Yönetimi Backend ve Frontend EntegrasyonuBugün SecureWatch AI projesinde güvenlik tespitlerinin olay kaydına dönüştürülmesini ve oluşturulan olayların yönetilmesini sağlayan olay yönetimi modülü üzerinde çalıştım. Öncelikle güncel ana dalda eksik olan olay yönetimi backend yapısını projeye yeniden entegre ettim. Olay modelleri, yorum modeli, veritabanı migration dosyası, şemalar, servis katmanı ve API endpointlerini mevcut sistemle uyumlu hâle getirdim. Frontend tarafında olay verileri için TypeScript tipleri, çalışma zamanı doğrulayıcıları ve güvenli API istemcileri oluşturdum.Analiz sonucunda saldırı olarak belirlenen kayıtların kullanıcı tarafından olaya dönüştürülebilmesini sağladım. Olay başlığı, açıklaması ve önem seviyesi bilgilerinin girilebildiği formu geliştirdim. Aynı tespit kaydından tekrar olay oluşturulmasını engelleyen kontroller ekledim. Olayların durum, önem seviyesi ve atanan analist bilgilerine göre filtrelenmesini ve sayfalar arasında güvenli şekilde gezilebilmesini sağladım.Olay Detayı, Analist İşlemleri ve Yorum SistemiOlay detay sayfasında olay başlığı, açıklaması, durumu, önem seviyesi, oluşturulma zamanı, atanan analist ve yorum geçmişi bilgilerinin görüntülenmesini sağladım. Güvenlik analistinin atanmamış bir olayı üzerine alabilmesi, incelemeyi başlatabilmesi, yorum ekleyebilmesi ve olayı çözüldü veya yanlış pozitif olarak kapatabilmesi için gerekli işlem alanlarını geliştirdim.Geri alınamayacak durum değişikliklerinde kullanıcıya sayfa içerisinde erişilebilir bir onay alanı gösterilmesini sağladım. Yorum formunda boş veri gönderimi, tekrar gönderim, eski API yanıtı ve istek iptali gibi durumlara karşı güvenlik kontrolleri ekledim. Yönetici kullanıcıların olayları yalnızca analist rolündeki kullanıcılara atayabilmesi için ayrı bir analist atama arayüzü hazırladım.Yönlendirme, Yetkilendirme ve Manuel KontrollerOlay listesi ve olay detay sayfalarını korumalı rotalara bağladım. Giriş yapmamış kullanıcıların olay bilgileri gösterilmeden giriş ekranına yönlendirilmesini sağladım. Analist ve yönetici rollerinin yalnızca yetkili oldukları işlem alanlarını görebilmesini korudum.Chrome üzerinden saldırı tespitinin olaya dönüştürülmesi, olayın analist tarafından üzerine alınması, incelemenin başlatılması, yorum eklenmesi, olayın çözüldü olarak kapatılması ve filtrelenmesi senaryolarını doğruladım. Ayrıca çıkış sonrasında korumalı olay sayfalarına erişimin engellendiğini kontrol ettim.Test, Kalite Kontrolleri ve SonuçFrontend tarafında toplam 28 test dosyasında 518 test başarıyla geçti. TypeScript type-check, ESLint, production build ve güvenlik denetimleri sıfır hata ve uyarıyla tamamlandı. React testlerinde görülen asenkron act uyarılarını giderdim. Backend tarafında 422 test başarıyla geçti; Python derleme, bağımlılık ve migration kontrolleri tamamlandı.Git Commit Mesajları:[11:48] (1a106dd) fix(incidents): restore missing backend workflow[12:13] (39d3b8c) fix(deps): resolve brace-expansion vulnerability[12:18] (8ccdbc4) feat(incidents): add typed frontend API client[13:24] (ad2a562) feat(incidents): add detection conversion form[13:39] (66b110f) feat(incidents): add filterable incident list[13:52] (e379f12) feat(incidents): add incident detail view[14:22] (d071b52) test(incidents): remove explicit any from detail test[14:38] (66d7545) feat(incidents): add claim and status controls[16:05] (01aab83) refactor(incidents): tighten action control typing[16:22] (7899dd7) feat(incidents): add secure comment form[16:41] (6e7c8f0) test(incidents): fix comment form test typing[16:52] (fe07c91) refactor(incidents): remove state updates from effects[23:30] (4e31468) feat(incidents): add admin analyst assignment[23:44] (730dd62) feat(routing): integrate incident management workflow[23:54] (37608cf) refactor(incidents): fix assignment panel lifecycle[00:23] (ee83918) test(incidents): cover comment textarea rerender[13:14] (423b56a) test(incidents): eliminate async act warnings"
},
{
"day": 17,
"date": "2026-08-05",
"content": "Gün 17 – Güvenli Dashboard ve RaporlamaDashboard Backend Servisi ve API EntegrasyonuBugün SecureWatch AI projesinde analiz, güvenlik tespiti ve olay verilerini tek ekranda özetleyen dashboard modülü üzerinde çalıştım. Gerçek veritabanı kayıtlarından analiz durumlarını, tespit sayılarını, risk seviyelerini ve olay bilgilerini hesaplayan backend servisini geliştirdim. Sayım ve gruplandırma işlemlerini SQLAlchemy sorgularıyla veritabanı seviyesinde gerçekleştirdim.Dashboard verilerini frontend’e aktarmak için \/api\/v1\/dashboard\/summary endpointini oluşturdum. Endpointi kimlik doğrulama ve rol tabanlı yetkilendirme sistemine bağlayarak yalnızca yönetici ve güvenlik analistlerinin erişebilmesini sağladım. API yanıtlarında hassas kullanıcı bilgilerine yer vermedim ve veritabanında bulunmayan bilgiler için sahte veri üretmedim.Tip Güvenli Frontend ve Dashboard ArayüzüFrontend tarafında TypeScript tiplerini, veri doğrulayıcılarını ve güvenli API istemcisini geliştirdim. Eksik veya hatalı verilerin arayüze ulaşmasını engelledim. İptal edilen isteklerin ve eski API yanıtlarının sayfa durumunu bozmasını önleyen kontroller ekledim.Dashboard ekranında toplam analiz, tespit, saldırı ve olay sayılarını gösteren özet kartları hazırladım. Recharts kullanarak tespit dağılımı, risk seviyesi, olay durumu, önem seviyesi ve son yedi günlük eğilim grafiklerini oluşturdum. Veri bulunmayan bölümler için anlaşılır boş durum mesajları ekledim.Son Güvenlik Etkinlikleri ve Responsive TasarımSon tespitleri ve olayları gösteren güvenlik etkinlikleri alanını geliştirdim. Kartları ilgili analiz sonucu ve olay detay sayfalarına bağladım. Dashboard sayfasını korumalı \/dashboard rotasına ekledim ve üst menüye Panel bağlantısını yerleştirdim. Giriş yapmamış kullanıcıların giriş ekranına yönlendirilmesini sağladım.Mobil testlerde tespit edilen yatay taşma problemini giderdim. Panel, Analiz, Olaylar, kullanıcı bilgisi ve Çıkış alanlarının 320 piksel genişlikte kullanılabilir kalmasını sağladım. Kartların, grafiklerin ve listelerin mobil ekranlarda taşmadığını doğruladım.Test, Manuel Kontroller ve SonuçBackend tarafında 499, frontend tarafında 783 test başarıyla geçti. TypeScript kontrolü, ESLint, production build ve güvenlik denetimleri hatasız tamamlandı. Testlerdeki tip problemlerini ve asenkron uyarıları giderdim.Chrome üzerinden yönetici ve güvenlik analisti hesaplarıyla masaüstü, mobil, klavye kullanımı, sayfa yenileme, navigasyon ve çıkış senaryolarını kontrol ettim. Gün sonunda dashboard ve raporlama modülünü gerçek verilerle çalışan, güvenli, erişilebilir ve responsive bir yapıda incelemeye hazır hâle getirdim.Git Commit Mesajları:[14:22] (b2930e8) feat(dashboard): add aggregation service and schemas[14:27] (4f65df0) test(dashboard): expand aggregation service coverage[14:36] (1970dc3) feat(dashboard): expose authenticated summary endpoint[14:44] (7dbabb5) feat(dashboard): add typed frontend API client[15:00] (f963aa2) chore(frontend): add recharts dashboard dependency[15:02] (7fd8e88) feat(dashboard): add summary page foundation[15:13] (ac77fe9) fix(dashboard): add empty state and component coverage[15:24] (45b429d) feat(dashboard): add responsive security charts[15:33] (624352e) feat(dashboard): add recent security activity[15:45] (656a592) test(dashboard): complete recent activity coverage[16:05] (a83a7ec) refactor(dashboard): resolve production lint errors[16:15] (b1a4f3c) test(dashboard): remove explicit any from test fixtures[16:29] (9f9dda7) test(dashboard): fix build-time fixture typings[16:34] (cf7049c) feat(dashboard): add protected route and navigation[16:38] (555919a) test(dashboard): complete route navigation coverage[18:23] (551d974) fix(dashboard): resolve mobile navigation overflow[18:39] (7600011) docs(diary): add day 17 internship entry"
},
{
"day": 18,
"date": "2026-08-06",
"content": "Gün 18 – Güvenlik Doğrulamaları, Test Regresyonu ve Marka EntegrasyonuBackend Regresyon Testleri ve Sistem BütünlüğüBugün SecureWatch AI projesinde kimlik doğrulama, analiz, saldırı tespiti, olay yönetimi ve dashboard modüllerinin birlikte güvenli çalıştığını doğruladım. Backend tarafında 499 testin tamamı başarıyla geçti. Kaynak kodu, bağımlılıklar ve Alembic migration yapısı kontrol edildi; veritabanı şemasının güncel ve tek head yapısında olduğu doğrulandı. Güvenlik ve kimlik doğrulama senaryolarını kapsayan 212 kritik test de hatasız tamamlandı.Güvenlik KontrolleriJWT doğrulaması, parola güvenliği ve ADMIN ile ANALYST rollerine ait yetkilendirme kontrollerini yeniden test ettim. Yetkisiz erişimlerin 401 ve 403 yanıtlarıyla engellendiğini doğruladım. CSV yükleme sürecinde dosya türü, kodlama ve sütun yapısı kontrolleri incelendi. Path traversal saldırılarının engellendiği, SHA-256 özetiyle tekrar yüklemenin önlendiği, hata durumlarında rollback çalıştığı ve API yanıtlarında hassas bilgi bulunmadığı doğrulandı.Frontend ve Arayüz İyileştirmeleriFrontend tarafındaki 791 testin tamamı başarıyla geçti. TypeScript ve ESLint kontrolleri sıfır hata ve uyarıyla tamamlandı. Oturum yönetimi, korumalı rotalar, analiz, olay yönetimi ve dashboard özelliklerinin bozulmadığını doğruladım. Büyük logo, navigasyon taşması ve mobil yerleşim sorunlarını giderdim. Login ekranı, header, analiz kartları, olay listesi, yorum formu ve dashboard etkinlik alanlarını daha düzenli ve profesyonel hâle getirdim.Marka Kimliği ve Responsive TasarımSecureWatch AI için hazırlanan açık ve koyu temalı logo setini giriş ekranına, üst menüye ve README dosyasına entegre ettim. Farklı boyutlarda favicon ve Apple Touch Icon dosyaları ekledim. Masaüstü, tablet ve 320 × 568 piksel mobil görünüm kontrollerinde navigasyonun, kullanıcı bilgilerinin, olay detaylarının ve formların yatay taşma oluşturmadan çalıştığını doğruladım.Production Build ve SonuçVite production build işlemi başarıyla tamamlandı. Yalnızca JavaScript paket boyutuyla ilgili bilinen teknik borç uyarısı alındı. npm audit sonucunda herhangi bir güvenlik açığı bulunmadı. Repository içerisinde .env, özel anahtar, JWT secret, veritabanı veya geçici test dosyası bulunmadığını kontrol ettim. Gün sonunda projeyi güvenlik, test, marka kimliği ve responsive tasarım açısından kod incelemesine hazır hâle getirdim.Git Commit Mesajları:[12:08] (1cb181a) feat(brand): integrate final SecureWatch AI identity[14:09] (4393786) docs(readme): add branding and refresh session documentation[16:53] (a621476) fix(ui): correct responsive branding and navigation layout[17:21] (4508d01) style(ui): polish analysis incident and dashboard interfaces[17:59] (7e85858) docs(diary): add day 18 internship entry[18:02] (eefd26e) docs(diary): remove trailing whitespace from day 18 entry"
},
{
"day": 19,
"date": "2026-08-07",
"content": "Docker Ortamı ve Backend KonteynerizasyonuBugün SecureWatch AI projesinin Docker tabanlı çalışma ortamını hazırladım. Docker Desktop ve WSL 2 kurulumlarını doğruladıktan sonra backend servisi için Python 3.12 tabanlı Docker image oluşturdum. FastAPI uygulamasının Uvicorn üzerinden container içinde çalışmasını sağladım ve .dockerignore ile gereksiz ve hassas dosyaların image içerisine alınmasını engelledim.Frontend ve NginxFrontend tarafında React ve Vite uygulaması için multi-stage Docker build yapısı hazırladım. Derlenen uygulamayı Nginx üzerinden yayınladım ve SPA yönlendirmelerini yapılandırdım. \/api isteklerini backend servisine yönlendiren reverse proxy ayarlarını ekleyerek login, dashboard, analiz ve olay sayfalarının container ortamında çalıştığını doğruladım.Docker Compose ve Kalıcı VerilerPostgreSQL, backend ve frontend servislerini Docker Compose altında birleştirdim. PostgreSQL ve backend servislerini dışarıya açmadan yalnızca frontend uygulamasını 8080 portundan erişilebilir hâle getirdim. Veritabanı ve yüklenen CSV dosyalarının korunması için kalıcı volume yapıları oluşturdum. Migration ve healthcheck kontrolleriyle servislerin doğru sırada çalışmasını sağladım.Güvenlik ve Uçtan Uca TestlerADMIN ve ANALYST kullanıcılarını güvenli biçimde oluşturmak için environment değişkenlerini kullanan demo kullanıcı scripti hazırladım. Authentication ve RBAC senaryolarını test ederek 401, 403 ve 200 yanıtlarını doğruladım. Örnek CSV dosyasıyla analiz sürecini çalıştırdım ve 5 kayıttan 1 normal, 4 saldırı sonucu üretildiğini gördüm. Aynı dosyanın tekrar yüklenmesi engellendi ve container yeniden başlatıldığında verilerin korunduğunu doğruladım.Testler ve SonuçBackend tarafında 499, kritik güvenlik kapsamında 194 ve frontend tarafında 791 test başarıyla geçti. TypeScript, ESLint, production build ve npm audit kontrolleri başarılı tamamlandı. Böylece SecureWatch AI projesinin PostgreSQL, backend ve frontend katmanlarını Docker üzerinde birlikte çalışan güvenli ve bütünleşik bir yapıya dönüştürdüm.Git Commit Mesajları:[11:46] (37c633a) feat(docker): containerize backend service [11:51] (5fdf4f9) feat(docker): containerize frontend with nginx [12:01] (bf8f8d0) feat(docker): orchestrate application services [12:13] (06d7136) feat(docker): add secure demo user bootstrap [13:19] (a739b27) docs(diary): add day 19 internship entry"
}
]
},
"23": {
"name": "Doğukan Kalkan",
"email": "kalkandogukan01@gmail.com",
"repo": "https:\/\/github.com\/Dogukan-klkn\/StockRoute",
"github_username": "Dogukan-klkn",
"start_date": "2026-06-29",
"end_date": "2026-07-24",
"total_days": 20,
"filled_days": 20,
"entries_sample": {
"first": {
"day": 1,
"date": "2026-06-29",
"content": "Oryantasyon ve Kurulum Süreçleri: Stajın ilk günü şirket ve departman oryantasyonu ile başladı. Geliştirme ekibiyle tanışıldı ve şirketin genel çalışma kültürü hakkında bilgi alındı. Çalışma ortamının ayarlanması, gerekli geliştirme ortamlarının (IDE vb.) kurulması tamamlandı.Süreç İşleyişi: Ekibin benimsediği yazılım geliştirme metodolojisi ve iş akış süreçleri hakkında bilgilendirme yapıldı. Günlük toplantı (daily stand-up) işleyişi, görev atamalarının nasıl takip edileceği ve versiyon kontrol sisteminin (Git) proje bazlı kullanım standartları (branch yapısı, commit kuralları) aktarıldı.Proje Seçimi ve Gereksinim Analizi: Staj süresince üzerinde çalışacağım ve geliştireceğim projenin seçimi gerçekleştirildi. Danışmanım\/yöneticim ile yapılan toplantıda projenin temel amacı, çözmeyi hedeflediği problem ve beklenen çıktılar detaylıca konuşuldu.Proje Planlaması: Seçilen proje doğrultusunda kullanılacak teknoloji yığını (tech stack) ve sistem mimarisi üzerine fikir alışverişi yapıldı. Projenin modüllere ayrılması, veri tabanı şemasının taslak olarak düşünülmesi ve ilk sprint\/görev planlamasının yapılmasıyla temel proje takvimi (roadmap) oluşturuldu. Gerekli altyapı kararları alınarak gün tamamlandı.Git Commit Mesajları:[15:43] (b55dbdf) Initial commit[15:50] (8f18c00) docs: add implementation plan"
},
"middle": {
"day": 11,
"date": "2026-07-13",
"content": "Bugün, proje planında belirtilen 11. gün hedefleri doğrultusunda sistemin en kritik modüllerinden biri olan \"Şubeler Arası Stok Transfer İş Akışı\" (Stock Movement Workflow) uçtan uca geliştirilmiştir. Gün içerisinde tamamlanan teknik çalışmalar aşağıda detaylandırılmıştır:1. Veri Transfer Nesneleri (DTO) ve ValidasyonAPI'ye gelecek olan stok transfer taleplerini karşılamak ve doğrulamak amacıyla CreateMovementDto ve çoklu ürün (header-line) yapısını destekleyen MovementItemDto sınıfları oluşturulmuştur.Transfer geçmişini listelerken durum (status) veya şube bazlı aramalar yapabilmek için filtreleme kurallarını içeren GetMovementsFilterDto sisteme eklenmiştir.2. Servis Katmanı ve Transfer Durum Makinesi (State Machine)Transfer yaşam döngüsünü yönetmek üzere MovementsService geliştirilmiştir. Bu servis içerisinde transfer süreçleri bir durum makinesi (approve, reject, cancel, ship, receive) mantığıyla katı doğrulama kurallarına bağlanmıştır.\"İptal\" (cancel) işlemi güvenlik gereği yalnızca talebi oluşturan kullanıcıya veya FIRM_ADMIN rolüne kısıtlanmıştır. Aynı şube içerisine transfer yapılması kod seviyesinde engellenmiştir.İşlem Bütünlüğü (Atomicity): ship (sevk) ve receive (teslim) işlemleri sırasında veri tutarsızlığını önlemek için Prisma Transaction yapısı kullanılmıştır. Stok eksiltme ve artırma işlemleri tek bir transaction bloğunda güvene alınmış, sevk sırasında stokların eksiye düşmesi (negative stock) engellenmiştir.İzlenebilirlik (Audit Trail): Sevk ve teslimat anlarında otomatik olarak InventoryLog kayıtlarının (TRANSFER_OUT ve TRANSFER_IN tipleriyle) oluşturulması sağlanmıştır. Ayrıca 13. günde eklenecek olan gerçek zamanlı Socket.io bildirimleri için kod içerisine yer tutucular (TODO marker'ları) eklenmiştir.3. Uç Noktalar (Controller) ve Güvenlik (RBAC)Dış dünyaya açılan rotaları barındıran MovementsController kodlanmıştır. Projenin yetki matrisine uygun olarak uç noktalar JwtAuthGuard ve RolesGuard ile korumaya alınmıştır.Örneğin; transfer talep etme ve görüntüleme tüm rollere açıkken, onaylama\/reddetme işlemleri sadece FIRM_ADMIN ve BRANCH_MANAGER'a, sevk işlemi ise ek olarak WAREHOUSE_STAFF rolüne yetkilendirilmiştir.Güvenlik zafiyeti yaratmamak adına, işlemi yapan userId ve kullanıcının rolü asla istek gövdesinden (request body) alınmamış, @CurrentUser dekoratörü ile doğrudan güvenilir JWT içerisinden okunmuştur. Tüm bu uç noktalar Swagger\/Scalar dokümantasyonuna (ApiTags, ApiOperation, ApiResponse vb. dekoratörlerle) entegre edilmiştir.4. Modül Entegrasyonu ve Kod Kalitesi StandardizasyonuYazılan Controller ve Service sınıfları MovementsModule altında birleştirilmiş ve ana AppModule içerisine dahil edilerek API rotaları aktif hale getirilmiştir.Gün sonunda tüm kod tabanında stil ve formatlama iyileştirmeleri (Prettier) yapılmıştır. Özellikle Windows tabanlı geliştirmelerde sorun yaratan satır sonu karakteri (CRLF\/LF) çakışmalarını kökten çözmek için sisteme .gitattributes dosyası eklenmiş ve tüm metin dosyaları LF formatına zorlanarak ESLint hataları sıfırlanmıştır.Git Commit Mesajları:[09:11] (b3b8ab3) feat(api): add CreateMovementDto and MovementItemDto for stock movement requests[09:11] (9f377df) feat(api): add GetMovementsFilterDto for filtering stock movement requests[11:18] (b3075d0) feat(api): add movements service with state machine and transactional stock updates - Created MovementsService to handle the complete stock transfer lifecycle. - Implemented state machine transitions (approve, reject, cancel, ship, receive) with strict validation. - Secured 'cancel' action to only allow the original requester or a FIRM_ADMIN. - Wrapped 'ship' and 'receive' operations in Prisma transactions for atomic stock deduction\/addition. - Integrated automated Audit Trail (InventoryLog) generation for TRANSFER_OUT and TRANSFER_IN actions. - Prevented cross-branch transfers within the same branch and guarded against negative stock during shipments. - Prepared \/\/ TODO(day13) markers for future Socket.io real-time event emissions.[13:03] (fc431b4) style(api): format CreateMovementDto with prettier - Collapse unnecessary line break in the destinationBranchId description - No behavior change; output of eslint --fix[13:04] (6b81949) style(api): format GetMovementsFilterDto with prettier - Collapse unnecessary line break in the branchId description - No behavior change; output of eslint --fix[13:21] (87449b4) style(api): format MovementsService with prettier - Collapse the OR condition in findAll and the status check in cancel onto single lines - Inline the insufficient-stock error message template literal in ship - No behavior change; output of eslint --fix[14:25] (c077307) feat(api): add MovementsController with transfer workflow endpoints - POST \/movements, GET \/movements, GET \/movements\/:id — open to all roles - POST \/movements\/:id\/approve and \/reject — SUPER_ADMIN, FIRM_ADMIN, BRANCH_MANAGER only - POST \/movements\/:id\/ship — the above plus WAREHOUSE_STAFF - POST \/movements\/:id\/receive and \/cancel — all roles; the real cancel authorization (requester or FIRM_ADMIN) is enforced in the service - Class-level JwtAuthGuard + RolesGuard, full Swagger docs (ApiTags, ApiBearerAuth, ApiOperation, per-status ApiResponse annotations) - userId and role are read from the JWT via @CurrentUser, never from the request body[16:53] (3e51804) feat(api): create MovementsModule wiring controller and service - Register MovementsController and provide MovementsService - Export MovementsService so the day-13 Socket.io gateway can reuse it - No PrismaModule import needed; PrismaService comes from the global PrismaModule, matching the InventoryModule pattern[16:54] (c7c3d42) feat(api): register MovementsModule in AppModule - Add MovementsModule to the domain modules block of the imports array, enabling the \/movements endpoints behind TenantResolverMiddleware[17:06] (0534883) style(api): normalize line endings to LF across the codebase - Add .gitattributes enforcing LF for all text files (CRLF kept for .bat\/.cmd scripts) so Windows checkouts no longer reintroduce carriage returns flagged by prettier - Run eslint --fix over apps\/api\/src to clear all pre-existing \"Delete CR\" warnings and a few related line-wrap fixes - No behavior change; eslint reports zero warnings and nest build passes"
},
"last": {
"day": 20,
"date": "2026-07-27",
"content": "Projenin son geliştirme günü. Bugün iki blok iş yapıldı: mobil uygulamaya gerçek zamanlı senkronizasyon eklendi ve backend tarafında son tutarlılık düzeltmeleri tamamlandı. Ardından tüm sistem sıfırdan uçtan uca doğrulandı.Çalışma SırasıGünü planlarken işleri riskine göre sıraladım. Mobil gerçek zamanlı katman backend'e dokunmuyordu, yani izole bir işti — onu önce yapıp bitirmek güvenliydi. Backend düzeltmeleri ise mevcut testleri kırma ihtimali taşıyordu. Bu yüzden önce mobil tarafı tamamlayıp doğruladım, sonra riskli backend işine geçtim ve her adımdan sonra testleri çalıştırdım.Mobil Gerçek Zamanlı SenkronizasyonWeb tarafında daha önce kurduğum gerçek zamanlı katmanı mobile taşıdım. Uygulama artık sunucudaki stok ve transfer değişikliklerini anlık olarak alıyor.Mobilde web'de olmayan bir sorun vardı: uygulama arka plana alındığında bağlantı kopabiliyor ve o sırada gerçekleşen güncellemeler kaçıyor. Bunu çözmek için uygulama öne geri döndüğünde bağlantıyı yenileyip ilgili verileri baştan çeken bir mekanizma kurdum — böylece arka plandayken kaçırılan olaylar telafi ediliyor.Bildirimler için de mobile özel bir karar verdim: web'deki gibi bir snackbar mobilde yok, o yüzden üstten inip otomatik kapanan bir banner ile kısa bir titreşim kullandım.Gerçek zamanlı çalışmayı iki yönlü olarak canlı doğruladım. Emülatörde giriş yaptım, web panelinden bir transfer sevk ettim ve telefonun ekranına dokunmadan transferin listede belirdiğini gördüm. Ters yönde de test ettim: telefondan bir transferi teslim aldım ve web tarafında durumun anında değiştiğini, hedef şubenin stoğunun arttığını doğruladım.Backend Son RötuşlarıDört düzeltme yaptım. Her birinden sonra test paketini çalıştırdım; 58 testin tamamı baştan sona korundu, tek bir test bile kırılmadı.Standart hata formatı. API'nin döndürdüğü hatalar tutarsızdı. Tüm hataları ortak bir zarfa oturtan bir katman ekledim — artık her hata durum kodu, mesaj, hata tipi, istek yolu ve zaman damgası içeriyor. Beklenmeyen hatalarda sunucu iç detaylarının sızmamasına dikkat ettim.Türkçe doğrulama mesajları. Form doğrulama hataları İngilizce dönüyordu (örneğin \"password must be longer than...\"). Arayüzün geri kalanı Türkçeyken bu tutarsızdı. On adet veri şemasındaki tüm kuralları Türkçeleştirdim.Silme hatası düzeltmesi. İlişkili bir kaydı (örneğin stoğu olan bir ürünü) silmeye çalışmak \"sunucu hatası\" (500) döndürüyordu. Oysa bu öngörülebilir bir kullanıcı durumu. Bunu anlamlı bir \"çakışma\" hatasına (409) çevirdim: \"Bu kayıt başka kayıtlarla ilişkili olduğu için silinemez.\" Kök nedeni araştırırken silme metotlarının hata yakalama bloğu içermediğini, yani hatanın hiç işlenmeden dışarı çıktığını fark ettim; sadece hata eşlemesine ekleme yapmak yetmezdi, silme metotlarını da doğru yerden geçirmem gerekti.Pasif kayıt filtresi. Pasife alınan ürünler operasyonel listelerde görünmeye devam ediyordu. Bu listeleri yalnızca aktif kayıtları döndürecek şekilde filtreledim. Yönetim listelerine dokunmadım — çünkü yöneticinin pasif kayıtları görüp tekrar aktifleştirebilmesi gerekiyor.Uçtan Uca DoğrulamaSon adım, tüm sistemi sıfırdan ayağa kaldırıp gerçek bir kullanım senaryosunu baştan sona işletmekti — teslimde yapılacak gösterimin provası.Veritabanını ve önbelleği tamamen silip tek komutla (docker compose up --build) sistemi kurdum. Ardından tam akışı işlettim: web'den giriş, şube ve ürün oluşturma, stok girişi, transfer oluşturup onaylama ve sevk etme, telefondan teslim alma (ve web'de durumun anlık değişmesi), barkod tarama, son olarak düşük stok tetikleyip hem web hem telefonda bildirimin geldiğini görme. Yedi adımın tamamı sorunsuz çalıştı.Ayrıca bugün eklediğim backend düzeltmelerinin canlı sistemde de çalıştığını doğruladım: boş form gönderince Türkçe hata mesajı ve standart zarf, ilişkili ürünü silmeye çalışınca 409, pasife alınan ürünün listeden düşmesi.Dokümantasyon TutarlılığıDün README'yi, bugün yapılacak beş özelliği de kapsayacak şekilde ileriye dönük güncellemiştim — yani doküman bir an için kodun önündeydi. Bugün bu beş maddenin hepsi gerçekten koda girdi ve canlı doğrulandı. Artık README'de anlatılan her şey kodda birebir karşılığını buluyor.Neler Öğrendimİşleri riske göre sıralamak zaman kazandırıyor. İzole ve güvenli olan mobil işi önce bitirip \"kasaya koymak\", sonra riskli backend işine geçmek, bir şey kırılsaydı bile sebebini daraltmayı sağlardı. Rastgele sırayla çalışsaydım, bir hata çıktığında hangi değişiklikten geldiğini bulmak zorlaşırdı.Bir hatayı düzeltirken kök nedene inmek gerekiyor. Silme hatasında yüzeysel çözüm \"hata eşlemesine bir satır eklemek\" gibi görünüyordu, ama asıl sorun hatanın hiç yakalanmamasıydı. Belirtiyi değil nedeni düzeltmek, sorunun tekrar etmesini önledi.Dokümantasyonun kodla uyumlu kalması bir teslim şartı. Dokümanı geçici olarak kodun önünde bırakmak bilinçli bir tercihti, ama teslimden önce ikisinin buluşması gerekiyordu. \"Yazdım ama yapmadım\" durumu, projenin en başındaki hataların tersi olurdu.Sıfırdan kurulum, en dürüst testtir. Kendi makinemde çalışan sistemi görmek yeterli değil; veritabanını ve önbelleği silip tek komutla her şeyin kalktığını görmek, teslimde karşılaşılacak gerçek durumu bugünden görmemi sağladı.Proje Sonu DurumuYirmi günlük süreç tamamlandı. Ortaya çıkan sistem: çok firmalı bir backend API (firma izolasyonu ve rol bazlı yetkilendirme, otomatik testlerle), bir web yönetim paneli, bir mobil saha uygulaması, ve bunların hepsini birbirine bağlayan gerçek zamanlı bir katman. Tüm sistem tek komutla ayağa kalkıyor ve dokümantasyonu kodla tutarlı.Yapılmayan bazı özellikler bilinçli olarak kapsam dışı bırakıldı ve gerekçeleriyle birlikte belgelendi. Böylece hem tamamlanan işin sınırları net, hem de ileride nereden devam edileceği belli.Git Commit Mesajları:[10:11] (b952043) chore(mobile): add socket.io-client Installed via expo install for SDK 52; lockfile change additive.[10:11] (9988c18) chore(mobile): add EXPO_PUBLIC_SOCKET_URL to env example[10:11] (18fe084) feat(mobile): add socket singleton with auth token Reference-counted with a grace period on teardown, mirroring the web fix so a single connection survives re-mounts.[10:20] (942acc4) feat(mobile): add socket provider with app-wide single connection Reconnects and invalidates inventory\/movements queries when the app returns to foreground, so events missed while backgrounded are recovered. Disconnects on logout.[10:20] (d65b744) feat(mobile): sync realtime events into query cache inventory:updated and movement:* invalidate their query keys; notification surfaces as an auto-dismissing top banner with haptics (no snackbar on mobile).[10:21] (2646cc8) feat(mobile): mount socket provider at the root[16:47] (164ac07) docs: add day 20 stage 1 realtime verification outputs Co-Authored-By: Claude Opus 4.8 [17:34] (4a10990) feat(api): add global exception filter with path and timestamp Standardizes the error envelope: statusCode, message, error, path, timestamp. HttpExceptions pass through with their status; unexpected errors become a generic 500 without leaking stack traces. Matches the README error contract.[17:35] (d2734dd) feat(api): register the global exception filter[17:35] (621075c) feat(api): localize login dto validation messages[17:35] (0c12a59) feat(api): localize register-tenant dto validation messages[17:35] (ddddc6a) feat(api): localize branch dto validation messages[17:35] (32138da) feat(api): localize inventory adjust dto validation messages[17:35] (39d7cf4) feat(api): localize inventory filter dto validation messages[17:36] (305a899) feat(api): localize threshold dto validation messages[17:36] (ab086ac) feat(api): localize movement dto validation messages[17:36] (f21f61d) feat(api): localize movements filter dto validation messages[17:36] (233743d) feat(api): localize product dto validation messages[17:36] (b5dcdae) feat(api): localize user dto validation messages[17:38] (6466507) fix(api): return 409 instead of 500 on foreign key delete remove() lacked a try\/catch, so P2003 never reached the error mapping and surfaced as 500. Routed deletes through the mapping helper; FK violations now return 409 with a clear message.[17:38] (e5c9bc2) fix(api): return 409 on foreign key delete for branches[17:38] (305a596) feat(api): filter inactive products and return 409 on fk delete GET \/products now returns only active records (operational list); P2003 on delete mapped to 409.[17:38] (56c3bfc) feat(api): filter inactive records from inventory list[17:38] (f903c71) test(api): register global exception filter in e2e setup Filter now runs in the real HTTP flow so the standardized envelope is exercised; existing assertions unchanged.[17:38] (e2f40aa) docs: add day 20 backend polish verification output[18:25] (c093703) docs: add day 20 stage 3 end-to-end verification outputs[18:34] (500e25f) docs: add day 20 final verification outputs[19:14] (190b4a3) docs: showcase real app screenshots and add day 20 outputs"
}
},
"full_text_length": 120569,
"all_entries": [
{
"day": 1,
"date": "2026-06-29",
"content": "Oryantasyon ve Kurulum Süreçleri: Stajın ilk günü şirket ve departman oryantasyonu ile başladı. Geliştirme ekibiyle tanışıldı ve şirketin genel çalışma kültürü hakkında bilgi alındı. Çalışma ortamının ayarlanması, gerekli geliştirme ortamlarının (IDE vb.) kurulması tamamlandı.Süreç İşleyişi: Ekibin benimsediği yazılım geliştirme metodolojisi ve iş akış süreçleri hakkında bilgilendirme yapıldı. Günlük toplantı (daily stand-up) işleyişi, görev atamalarının nasıl takip edileceği ve versiyon kontrol sisteminin (Git) proje bazlı kullanım standartları (branch yapısı, commit kuralları) aktarıldı.Proje Seçimi ve Gereksinim Analizi: Staj süresince üzerinde çalışacağım ve geliştireceğim projenin seçimi gerçekleştirildi. Danışmanım\/yöneticim ile yapılan toplantıda projenin temel amacı, çözmeyi hedeflediği problem ve beklenen çıktılar detaylıca konuşuldu.Proje Planlaması: Seçilen proje doğrultusunda kullanılacak teknoloji yığını (tech stack) ve sistem mimarisi üzerine fikir alışverişi yapıldı. Projenin modüllere ayrılması, veri tabanı şemasının taslak olarak düşünülmesi ve ilk sprint\/görev planlamasının yapılmasıyla temel proje takvimi (roadmap) oluşturuldu. Gerekli altyapı kararları alınarak gün tamamlandı.Git Commit Mesajları:[15:43] (b55dbdf) Initial commit[15:50] (8f18c00) docs: add implementation plan"
},
{
"day": 2,
"date": "2026-06-30",
"content": "Tasarım ve Dokümantasyon Yapısının Kurulumu: Proje planlaması doğrultusunda, geliştirilecek uygulamanın görsel kimliğini ve arayüz (UI\/UX) referanslarını sisteme dahil etme çalışmalarına başlandı. Kod tabanında (repository) tasarım ve marka dosyalarını düzenli bir mimaride tutabilmek amacıyla docs\/ klasör yapısı oluşturuldu.Mockup ve Marka Dosyalarının Eklenmesi: Projenin hem web yönetim paneli hem de mobil saha uygulaması ayakları için arayüz taslakları oluşturuldu. Üretken yapay zeka (GenAI) araçları destekli olarak hazırlanan bu ekran mockup'ları, referans olarak kullanılmak üzere sisteme eklendi. Ayrıca proje standartlarına uygun kurumsal kimlik ögeleri olan 1:1 oranındaki uygulama logosu (app icon) ve yatay formattaki tipografik logo (wordmark) dosyaları yapılandırmaya dahil edildi.Teknik Notlar ve Kapsam: Günün sonunda açılan Pull Request (PR) ile tüm bu görsel varlıklar proje deposuna aktarıldı. Bu aşamadaki çalışmalar mimari bir zemin hazırlığı niteliğinde olup, yalnızca .png formatındaki tasarım referanslarının yüklenmesini kapsadı. Henüz frontend tarafında bir bileşen (component) kodlaması veya iş mantığı (business logic) geliştirmesi yapılmadan, UI\/UX standartlarının kod tabanına entegrasyonu başarıyla tamamlandı.Git Commit Mesajları:[10:27] (5459584) docs: revise implementation plan with docker, scalar and branding - dockerize the system (compose: db + api + web, Dockerfiles, deployment topology) - replace swagger ui with scalar for api reference (@scalar\/nestjs-api-reference) - add 1:1 app logo concept and brand assets (gemini-generated, in docs\/brand) - add genai-generated screen mockups workflow (docs\/design\/mockups) - reorganize docs\/ by topic (brand, design, api, architecture) - align project name to StockRoute to match the repository[10:38] (72c3343) Merge pull request #1 from Dogukan-klkn\/feature\/implementation-plan docs: add implementation plan[17:16] (9697edc) design: add web and mobile mockups, brand logos - Created docs\/ folder structure - Added screen mockups for web and mobile - Added 1:1 app logo and horizontal wordmark files"
},
{
"day": 3,
"date": "2026-07-01",
"content": "Projenin daha ölçeklenebilir ve tek merkezden yönetilebilir bir yapıda olması amacıyla monorepo mimarisine geçiş yapıldı. Bu doğrultuda pnpm workspaces ve Turborepo teknolojileri kullanılarak projenin ana bileşenleri olan API (apps\/api), web yönetim paneli (apps\/web) ve mobil uygulamanın (apps\/mobile) temel iskeletleri oluşturuldu.Ortak Paketler ve Tasarım Sisteminin Kurgulanması: Monorepo altındaki uygulamalar arası kod standartlarını korumak ve tip güvenliğini (type safety) sağlamak adına packages\/config ve packages\/shared-types ortak paketleri (shared packages) yaratıldı. Geliştirilecek arayüzlerde görsel tutarlılığı güvence altına almak için renk, tipografi ve boşluk (spacing) kurallarını barındıran @stockroute\/ui-tokens paketi oluşturuldu. Bu kurallar palette.md ve design-system.md dosyaları ile belgelendi. Ek olarak; iptal, transfer gibi durum (status) bildiren renkler, kod tarafında standart UI paletine (Indigo vb.) uyumlu olacak şekilde rafine edildi.Docker Yapılandırması ve API Dokümantasyonu: Projenin veri tabanı altyapısı için PostgreSQL kullanılmak üzere docker-compose.yml yapılandırması projeye dahil edildi. Mevcut proje planı gereğince, Docker yapılandırması şu an için yalnızca \"db\" (veri tabanı) servisini ayağa kaldıracak şekilde ayarlandı. Backend (API) tarafında ise sunucu sağlığını kontrol edebilmek amacıyla \/health uç noktası (endpoint) eklendi ve API dökümantasyonunu interaktif olarak sunabilmek için Scalar entegrasyonu gerçekleştirildi.Git Commit Mesajları:[12:04] (d0f9ee4) chore: scaffold monorepo, docker setup and implement design system - Setup pnpm workspaces and Turborepo with api, web, and mobile app skeletons - Configure docker-compose with postgres and setup Scalar API docs - Create shared packages (@stockroute\/config, @stockroute\/shared-types) - Add 1:1 logos and GenAI screen mockups to docs\/ folder - Create @stockroute\/ui-tokens package for colors, typography, and spacing - Add design system and palette documentation[15:22] (a989618) feat(api): implement core database schema with multi-product movements - Setup Prisma ORM and generate v6.19 client - Define core entities: Tenant, User, Branch, Product, and Inventory - Refactor StockMovement to support header-line architecture (StockMovementItem) - Introduce InventoryLog for robust stock adjustment audit trails - Add shippedBy and receivedBy relations for physical transfer accountability - Update Docker compose DB port to 5433 to resolve local conflicts - Add initial empty seed.ts skeleton"
},
{
"day": 4,
"date": "2026-07-02",
"content": "Kod Standartlarının Düzenlenmesi: Monorepo genelinde ortak standartları güvence altına almak için ana dizine prettier.config.js eklendi. Web projesindeki yapılandırma çakışmaları çözülerek tüm kod tabanında otomatik formatlama (satır sonu ve tırnak stili) yapıldı.Tenant (Kiracı) Bağlam Yönetimi: API isteklerinden tenantId değerini yakalayıp uygulama genelinde güvenle taşımak amacıyla TenantResolverMiddleware ve AsyncLocalStorage tabanlı TenantContextService geliştirildi.Otomatik Veri İzolasyonu (Prisma): Prisma Client Extension entegre edilerek veritabanı okuma ve yazma işlemlerine otomatik satır bazlı (row-level) tenant filtrelemesi eklendi. Sistem mimarisi gereği Tenant ve StockMovementItem modelleri bu global izolasyondan muaf tutuldu.Git Commit Mesajları:[10:53] (ec94615) chore: fix shared eslint and prettier config resolution across workspace - Resolve ESLint shareable config naming and discovery issues - Add root prettier.config.js to enforce a single source of truth - Rename web config to .eslintrc.cjs to resolve ESM\/CommonJS conflict - Apply auto-formatting (CRLF to LF, quote styles) to existing files[10:54] (94a38de) feat(api): implement tenant isolation with prisma extension - Create TenantContextService using AsyncLocalStorage for efficient context passing - Add TenantResolverMiddleware to extract and set tenantId from requests - Implement Prisma Client Extension for automatic row-level tenant filtering - Enforce automatic tenantId assignment on database writes and upserts - Exclude Tenant and StockMovementItem from global tenant isolation"
},
{
"day": 5,
"date": "2026-07-03",
"content": "Kimlik Doğrulama ve Güvenlik Altyapısının Kurulması: Sistem genelinde güvenli, ölçeklenebilir ve durumsuz (stateless) bir kimlik doğrulama mimarisi kurmak amacıyla NestJS altyapısına uygun olarak Passport.js ve JWT (JSON Web Token) stratejileri entegre edildi. Bu sayede oturum yönetimi sunucu tarafında değil, token tabanlı bir yapıda kurgulandı.Firma Kayıt ve Kullanıcı Giriş Akışlarının Geliştirilmesi: Uygulamanın dışa açılan ilk kapısı olan \/auth\/register-tenant ve \/auth\/login API uç noktaları kodlandı. Kayıt uç noktası salt bir kullanıcı oluşturmak yerine, sisteme yeni bir firma eklendiğinde o firmaya ait izole alanı ve ilk yönetici (FIRM_ADMIN) hesabını eşzamanlı yaratacak iş mantığıyla (business logic) tasarlandı. Giriş uç noktasında ise şifre doğrulamalarının ardından istemciye güvenli erişim anahtarının dönülmesi sağlandı.Bağlam Odaklı Token Yapılandırması (Payload Design): Sistemin çekirdeğini oluşturan çoklu kiracı (multi-tenant) mimarisinin kesintisiz çalışması için JWT içerik yükü (payload) özel olarak yapılandırıldı. Üretilen her token'ın içerisine kullanıcının bağlı bulunduğu firmanın kimliği (tenantId) ve sistemdeki yetki seviyesi (role) gömüldü. Bu tasarım sayesinde, gelen her istekte veritabanına tekrar tekrar sorgu atmaya gerek kalmadan, önceki gün kurduğumuz TenantContextService üzerinden veri izolasyonu ve yetki kontrolleri doğrudan token ile çözümlenebilir hale getirildi.Git Commit Mesajları:[13:05] (3cae7d9) feat(api): add jwt authentication with passport - Configure JWT strategy and bcrypt for secure password hashing - Implement \/auth\/register-tenant with Prisma transaction for Tenant and User - Implement \/auth\/login with fail-safe timing attack prevention - Implement \/auth\/me protected endpoint using JwtAuthGuard - Refactor TenantResolverMiddleware to decode and use real JWT tokens - Enable global ValidationPipe and document auth endpoints for Scalar"
},
{
"day": 6,
"date": "2026-07-06",
"content": "Yetki Kontrol Mekanizmasının (Guard) Kurulması: Sistemdeki API uç noktalarının güvenliğini sağlamak ve sadece doğru yetkiye sahip kişilerin işlem yapabilmesini güvence altına almak amacıyla rol tabanlı erişim kontrolü (RBAC) altyapısı geliştirildi. Hangi rotalara hangi rollerin erişebileceğini tanımlamak için özel bir @Roles dekoratörü oluşturuldu. NestJS'in Reflector yapısı kullanılarak bu tanımları denetleyen ve yetkisiz erişim denemelerinde standart \"403 Forbidden\" hatası döndüren RolesGuard mekanizması sisteme entegre edildi.Bağlam (Context) Yakalama Dekoratörleri: İstek yapan kullanıcının JWT içerisindeki çoklu kiracı (tenant) verisini Controller katmanında güvenli ve temiz bir şekilde çıkarabilmek için @CurrentTenant parametre dekoratörü yazıldı.Tüm bu güvenlik ve yetkilendirme katmanları geliştirilirken projenin benimsediği temiz mimari (clean architecture) prensiplerine ve katı tip güvenliği (strict type safety) standartlarına harfiyen uyuldu.Git Commit Mesajları:[09:00] (4e71f91) feat(api): implement role-based authorization guards - Create @Roles decorator to define permitted roles for endpoints - Implement RolesGuard using Reflector to enforce RBAC and handle 403 Forbidden - Add @CurrentTenant parameter decorator to safely extract tenant context from JWT - Refactor \/auth\/me endpoint to utilize @CurrentUser and @CurrentTenant decorators - Ensure compliance with clean architecture and strict type safety"
},
{
"day": 7,
"date": "2026-07-07",
"content": "Başlangıç Verileri (Seed) ve Onboarding: Sistemin ilk kayıt (onboarding) akışını doğrulamak ve geliştirme sürecini hızlandırmak amacıyla veritabanını başlangıç verileriyle dolduran seed.ts dosyası oluşturuldu. Bu script aracılığıyla sisteme örnek demo firmalar (Acme, Globex) ve bu firmaları yönetecek admin kullanıcıları tanımlandı. Ayrıca, script'in birden fazla kez çalıştırıldığında veri çakışması yaratmaması için \"upsert\" (güncelleyerek ekleme) mantığıyla idempotent olarak çalışması sağlandı.Uçtan Uca (E2E) Test Altyapısı: API'nin dış dünyadan gelen isteklere vereceği yanıtları uçtan uca test edebilmek için Jest ve Supertest kütüphaneleri kullanılarak E2E test altyapısı sisteme entegre edildi.Veri İzolasyonunun Test Edilmesi: Sistem mimarisinin en kritik güvenliği olan \"çoklu kiracı (multi-tenant)\" yapısının sorunsuz çalıştığını kanıtlamak adına tenant-isolation.e2e-spec.ts test senaryosu yazıldı. Bu test sayesinde, farklı firmaların (tenant) sistem üzerinden birbirlerinin verilerine kesinlikle erişemediği (strict data isolation) uçtan uca simüle edilerek başarılı bir şekilde doğrulandı.Git Commit Mesajları:[11:05] (d8c670d) feat(api): add tenant onboarding flow and seed data - Add e2e testing infrastructure with Jest and Supertest - Implement tenant-isolation.e2e-spec.ts to verify strict data isolation between tenants - Create seed.ts to populate database with demo tenants (Acme, Globex) and admin users - Ensure duplicate execution of seed script is idempotent (upsert)"
},
{
"day": 8,
"date": "2026-07-08",
"content": "Veri Doğrulama (DTO) ve Dokümantasyon: Şube oluşturma ve güncelleme isteklerini doğrulamak için DTO sınıfları oluşturuldu. Bu verilerin Scalar API dokümantasyonunda doğru sergilenmesi için OpenAPI özellikleri eklendi.Servis Katmanı ve İş Kuralları: Şubeler için tüm temel CRUD (ekleme, listeleme, güncelleme, silme) işlemleri yazıldı. Prisma eklentisi sayesinde otomatik veri izolasyonu (tenant isolation) sağlandı. Mükerrer şube kodları ve bulunamayan kayıtlar için gerekli hata yönetimi (Exception) mekanizmaları kuruldu.Controller ve Yetkilendirme (RBAC): API uç noktaları BranchesController içerisinde toplanarak rol tabanlı yetkilendirme (RBAC) ile güvence altına alındı. İşlemler yalnızca proje planındaki yetki matrisine uygun olarak FIRM_ADMIN ve BRANCH_MANAGER rollerine açıldı. Son olarak, modül ana projeye entegre edilerek PR (Pull Request) süreci tamamlandı.Git Commit Mesajları:[10:27] (3c2540a) feat(api): add branch validation dtos and openapi properties[10:32] (3bd133c) feat(api): add branch service and business logic - Implemented CRUD operations (create, findAll, findOne, update, remove) in BranchesService. - Relied on Prisma Client Extension for automatic tenant isolation (omitted explicit tenantId). - Utilized Omit type utility to bypass Prisma TS strictness for injected tenantId. - Handled P2002 unique constraint errors with ConflictException for branch codes. - Added NotFoundException mapping for missing branch records.[10:35] (34c000d) feat(api): add branches controller with rbac and module integration - Created BranchesController with @UseGuards(JwtAuthGuard, RolesGuard) for secure endpoints. - Implemented role-based access control matching the exact project matrix (FIRM_ADMIN, BRANCH_MANAGER). - Decorated endpoints with @ApiTags, @ApiOperation, and @ApiResponse for Scalar API documentation. - Created BranchesModule to encapsulate controller and service. - Imported BranchesModule into the root AppModule domain group. "
},
{
"day": 9,
"date": "2026-07-09",
"content": "Proje Dokümantasyonu: Projenin genel yapısını, kullanılan teknoloji yığınını ve temel özelliklerini güncel bir şekilde yansıtacak şekilde proje kök dizinindeki README dosyası güncellenmiştir.Veri Modelleri (DTO) ve Servis Katmanı: Ürün oluşturma istekleri için gerekli doğrulama (validation) kurallarını barındıran CreateProductDto, kısmi ürün güncellemeleri için ise UpdateProductDto veri transfer nesneleri tanımlanmıştır. Ürünlere ait temel CRUD operasyonlarını (oluşturma, okuma, güncelleme, silme) ve hata yönetimini (error handling) gerçekleştiren ProductsService katmanı kodlanmıştır.Uç Noktalar ve Barkod Entegrasyonu: API isteklerini karşılayan ProductsController oluşturulmuş ve standart CRUD uç noktaları tanımlanmıştır. Mobil saha uygulamasındaki cihaz kamerasıyla yapılacak tarama işlemlerini desteklemek amacıyla barkod tabanlı özel sorgu rotası (\/products\/barcode\/:barcode) sisteme eklenmiştir. Rota eşleşmelerinde yapısal bir çakışma yaşanmaması için barkod rotası, dinamik ID rotasından önce konumlandırılmıştır.Güvenlik (RBAC) ve API Belgelendirmesi: Oluşturulan tüm rotalar JwtAuthGuard ve RolesGuard mekanizmalarıyla güvence altına alınmıştır. Projedeki rol ve yetki matrisine tam uyumlu olacak şekilde, ürün yönetim uç noktalarına FIRM_ADMIN, BRANCH_MANAGER, WAREHOUSE_STAFF ve FIELD_STAFF rolleri için erişim yetkisi tanımlanmıştır. Ayrıca tüm endpoint'lerin interaktif Scalar\/OpenAPI arayüzünde detaylıca sergilenmesi için @ApiOperation ve @ApiResponse dekoratörleri eklenerek API belgelendirmesi tamamlanmıştır.Modül Entegrasyonu: Geliştirilen bağımsız Controller ve Service yapıları temiz mimari prensiplerine uygun olarak ProductsModule çatısı altında toplanmış ve sistemin ana modülüne entegre edilmiştir.Git Commit Mesajları:[11:03] (47b7886) feat(docs): update README with project overview, technology stack, and features[11:25] (06867a1) feat(api): add CreateProductDto for product creation with validation and properties[11:26] (3aad733) feat(api): add UpdateProductDto for partial product updates with validation[13:42] (0857ce8) feat(api): implement ProductsService with CRUD operations and error handling[14:43] (55b4e97) feat(api): add products controller with rbac and swagger docs - Created ProductsController and added CRUD and barcode endpoints. - Secured all routes using JwtAuthGuard and RolesGuard. - Assigned appropriate roles (FIRM_ADMIN, BRANCH_MANAGER, WAREHOUSE_STAFF, FIELD_STAFF) to endpoints matching the project authorization matrix. - Placed the barcode route before the ID route to prevent route matching conflicts. - Added @ApiOperation and @ApiResponse decorators for Scalar\/OpenAPI documentation.[16:34] (901ecea) feat(api): add ProductsModule with controller and service"
},
{
"day": 10,
"date": "2026-07-10",
"content": "Envanter Listeleme ve Filtreleme: Sistemde yetkili olan rollerin erişebileceği GET \/inventory API uç noktası oluşturulmuştur. Bu uç nokta sayesinde, kullanıcıların spesifik olarak şube bazlı (branchId) filtreleme yapabilmesi ve belirlenen düşük stok eşiğinin (minThreshold) altına düşen ürünleri (lowStock) anlık olarak listeleyebilmesi için gerekli veri tabanı sorguları ve altyapı sağlanmıştır. Manuel Stok Düzeltme İşlemleri: Depolardaki fiziksel sayımlar, hasarlı ürünler veya hatalı veri girişleri sonucunda sistemde oluşabilecek tutarsızlıkları gidermek için manuel stok düzeltme rotası olan POST \/inventory\/adjust kodlanmıştır. Gelen API istekleri sistem tarafından { branchId, productId, quantity, reason } formatında veri transfer nesneleri (DTO) ile karşılanarak doğrulama (validation) işlemlerinden geçirilmiştir. Stok İzlenebilirliği (Audit Trail) ve Loglama: Sistemin kurumsal hesap verilebilirliğini en üst düzeye çıkarmak amacıyla, stok düzeltme işlemlerine gelişmiş bir izlenebilirlik (Audit Trail) mantığı entegre edilmiştir. \/inventory\/adjust uç noktasına yapılan her istek sonucunda ilgili ürünün Inventory.quantity değeri güncellenirken, aynı işlem bloğu içerisinde eşzamanlı olarak InventoryLog tablosuna da bir kayıt atılması zorunlu kılınmıştır. Kayıt Altına Alınan Veriler: Veritabanına yazılan log kayıtlarında; işlem türü (MANUAL_ADJUSTMENT), işlem öncesi stok miktarı (previousQuantity), yeni stok miktarı (newQuantity), net değişim miktarı (quantityChange), düzeltme nedeni (reason) ve bu işlemi gerçekleştiren kullanıcının benzersiz kimliği (userId) detaylı bir şekilde kayıt altına alınarak olası stok uyuşmazlıklarının kaynağının geriye dönük olarak tespit edilmesi garanti edilmiştir. Rol Tabanlı Yetkilendirme (RBAC): Sistemin güvenlik politikaları gereğince, kritik bir işlem olan stok düzeltme (\/inventory\/adjust) işlemi, proje yetki matrisine birebir uygun olacak şekilde yalnızca BRANCH_MANAGER (Şube Yöneticisi) ve WAREHOUSE_STAFF (Depo Sorumlusu) rollerinin erişimine açılmış, yetkisiz roller için kısıtlanmıştır. Git Commit Mesajları:[09:54] (7f3d72f) feat(api): add AdjustInventoryDto for manual stock adjustment requests[09:54] (513c0ab) feat(api): add GetInventoryFilterDto for inventory listing filters[13:35] (afc9ea6) feat(api): implement InventoryService with findAll and adjustInventory methods[13:41] (7fcb83e) feat(api): add InventoryController with endpoints for listing and adjusting inventory[16:07] (575ebe3) feat(api): import InventoryModule in AppModule[16:07] (09ce9ef) feat(api): create InventoryModule with controller and service"
},
{
"day": 11,
"date": "2026-07-13",
"content": "Bugün, proje planında belirtilen 11. gün hedefleri doğrultusunda sistemin en kritik modüllerinden biri olan \"Şubeler Arası Stok Transfer İş Akışı\" (Stock Movement Workflow) uçtan uca geliştirilmiştir. Gün içerisinde tamamlanan teknik çalışmalar aşağıda detaylandırılmıştır:1. Veri Transfer Nesneleri (DTO) ve ValidasyonAPI'ye gelecek olan stok transfer taleplerini karşılamak ve doğrulamak amacıyla CreateMovementDto ve çoklu ürün (header-line) yapısını destekleyen MovementItemDto sınıfları oluşturulmuştur.Transfer geçmişini listelerken durum (status) veya şube bazlı aramalar yapabilmek için filtreleme kurallarını içeren GetMovementsFilterDto sisteme eklenmiştir.2. Servis Katmanı ve Transfer Durum Makinesi (State Machine)Transfer yaşam döngüsünü yönetmek üzere MovementsService geliştirilmiştir. Bu servis içerisinde transfer süreçleri bir durum makinesi (approve, reject, cancel, ship, receive) mantığıyla katı doğrulama kurallarına bağlanmıştır.\"İptal\" (cancel) işlemi güvenlik gereği yalnızca talebi oluşturan kullanıcıya veya FIRM_ADMIN rolüne kısıtlanmıştır. Aynı şube içerisine transfer yapılması kod seviyesinde engellenmiştir.İşlem Bütünlüğü (Atomicity): ship (sevk) ve receive (teslim) işlemleri sırasında veri tutarsızlığını önlemek için Prisma Transaction yapısı kullanılmıştır. Stok eksiltme ve artırma işlemleri tek bir transaction bloğunda güvene alınmış, sevk sırasında stokların eksiye düşmesi (negative stock) engellenmiştir.İzlenebilirlik (Audit Trail): Sevk ve teslimat anlarında otomatik olarak InventoryLog kayıtlarının (TRANSFER_OUT ve TRANSFER_IN tipleriyle) oluşturulması sağlanmıştır. Ayrıca 13. günde eklenecek olan gerçek zamanlı Socket.io bildirimleri için kod içerisine yer tutucular (TODO marker'ları) eklenmiştir.3. Uç Noktalar (Controller) ve Güvenlik (RBAC)Dış dünyaya açılan rotaları barındıran MovementsController kodlanmıştır. Projenin yetki matrisine uygun olarak uç noktalar JwtAuthGuard ve RolesGuard ile korumaya alınmıştır.Örneğin; transfer talep etme ve görüntüleme tüm rollere açıkken, onaylama\/reddetme işlemleri sadece FIRM_ADMIN ve BRANCH_MANAGER'a, sevk işlemi ise ek olarak WAREHOUSE_STAFF rolüne yetkilendirilmiştir.Güvenlik zafiyeti yaratmamak adına, işlemi yapan userId ve kullanıcının rolü asla istek gövdesinden (request body) alınmamış, @CurrentUser dekoratörü ile doğrudan güvenilir JWT içerisinden okunmuştur. Tüm bu uç noktalar Swagger\/Scalar dokümantasyonuna (ApiTags, ApiOperation, ApiResponse vb. dekoratörlerle) entegre edilmiştir.4. Modül Entegrasyonu ve Kod Kalitesi StandardizasyonuYazılan Controller ve Service sınıfları MovementsModule altında birleştirilmiş ve ana AppModule içerisine dahil edilerek API rotaları aktif hale getirilmiştir.Gün sonunda tüm kod tabanında stil ve formatlama iyileştirmeleri (Prettier) yapılmıştır. Özellikle Windows tabanlı geliştirmelerde sorun yaratan satır sonu karakteri (CRLF\/LF) çakışmalarını kökten çözmek için sisteme .gitattributes dosyası eklenmiş ve tüm metin dosyaları LF formatına zorlanarak ESLint hataları sıfırlanmıştır.Git Commit Mesajları:[09:11] (b3b8ab3) feat(api): add CreateMovementDto and MovementItemDto for stock movement requests[09:11] (9f377df) feat(api): add GetMovementsFilterDto for filtering stock movement requests[11:18] (b3075d0) feat(api): add movements service with state machine and transactional stock updates - Created MovementsService to handle the complete stock transfer lifecycle. - Implemented state machine transitions (approve, reject, cancel, ship, receive) with strict validation. - Secured 'cancel' action to only allow the original requester or a FIRM_ADMIN. - Wrapped 'ship' and 'receive' operations in Prisma transactions for atomic stock deduction\/addition. - Integrated automated Audit Trail (InventoryLog) generation for TRANSFER_OUT and TRANSFER_IN actions. - Prevented cross-branch transfers within the same branch and guarded against negative stock during shipments. - Prepared \/\/ TODO(day13) markers for future Socket.io real-time event emissions.[13:03] (fc431b4) style(api): format CreateMovementDto with prettier - Collapse unnecessary line break in the destinationBranchId description - No behavior change; output of eslint --fix[13:04] (6b81949) style(api): format GetMovementsFilterDto with prettier - Collapse unnecessary line break in the branchId description - No behavior change; output of eslint --fix[13:21] (87449b4) style(api): format MovementsService with prettier - Collapse the OR condition in findAll and the status check in cancel onto single lines - Inline the insufficient-stock error message template literal in ship - No behavior change; output of eslint --fix[14:25] (c077307) feat(api): add MovementsController with transfer workflow endpoints - POST \/movements, GET \/movements, GET \/movements\/:id — open to all roles - POST \/movements\/:id\/approve and \/reject — SUPER_ADMIN, FIRM_ADMIN, BRANCH_MANAGER only - POST \/movements\/:id\/ship — the above plus WAREHOUSE_STAFF - POST \/movements\/:id\/receive and \/cancel — all roles; the real cancel authorization (requester or FIRM_ADMIN) is enforced in the service - Class-level JwtAuthGuard + RolesGuard, full Swagger docs (ApiTags, ApiBearerAuth, ApiOperation, per-status ApiResponse annotations) - userId and role are read from the JWT via @CurrentUser, never from the request body[16:53] (3e51804) feat(api): create MovementsModule wiring controller and service - Register MovementsController and provide MovementsService - Export MovementsService so the day-13 Socket.io gateway can reuse it - No PrismaModule import needed; PrismaService comes from the global PrismaModule, matching the InventoryModule pattern[16:54] (c7c3d42) feat(api): register MovementsModule in AppModule - Add MovementsModule to the domain modules block of the imports array, enabling the \/movements endpoints behind TenantResolverMiddleware[17:06] (0534883) style(api): normalize line endings to LF across the codebase - Add .gitattributes enforcing LF for all text files (CRLF kept for .bat\/.cmd scripts) so Windows checkouts no longer reintroduce carriage returns flagged by prettier - Run eslint --fix over apps\/api\/src to clear all pre-existing \"Delete CR\" warnings and a few related line-wrap fixes - No behavior change; eslint reports zero warnings and nest build passes"
},
{
"day": 12,
"date": "2026-07-14",
"content": "Bugün, proje planında belirtilen 12. gün hedefleri doğrultusunda, bir önceki gün geliştirilen \"Şubeler Arası Stok Transfer İş Akışı\" (Stock Movement) modülünün güvenilirliğini kanıtlamak amacıyla kapsamlı bir test süreci yürütülmüştür. Gün içerisinde tamamlanan teknik çalışmalar aşağıda detaylandırılmıştır:1. Birim Test (Unit Test) Altyapısının KurulmasıAPI katmanında birim testleri koşturabilmek için test ortamı bağımlılıkları yapılandırılmış ve ts-jest kullanılarak Jest konfigürasyonu (Jest config) sisteme dahil edilmiştir.Geliştirme sürecini hızlandırmak ve test kapsamını (coverage) takip edebilmek için package.json dosyasına test, test:watch ve test:cov script'leri eklenmiştir. Test süreçlerinde oluşan \"coverage\" çıktılarının repoyu kirletmemesi adına .gitignore dosyası güncellenmiştir.2. Servis Katmanı Birim Testleri (Unit Tests)Transfer iş akışının (durum makinesi) çekirdeğini oluşturan MovementsService için detaylı birim testleri yazılmıştır.Veritabanına gerçekten bağlanıp verileri değiştirmemek adına \"Mock Prisma Client\" kullanılmış, böylece testlerin izole ve hızlı bir şekilde çalışması sağlanmıştır. Transfer onaylama, iptal etme, sevk ve teslim işlemleri için tüm iş kurallarının (örn. yetersiz stok durumu) doğru çalışıp çalışmadığı test edilmiştir.3. Uçtan Uca Testler (E2E) ve Rol Tabanlı Yetkilendirme (RBAC)Sistemin dışarıdan gelen HTTP isteklerine vereceği tepkileri ölçmek için uçtan uca (e2e) test senaryoları yazılmıştır. Bu senaryolar kapsamında transferin baştan sona başarılı gerçekleştiği \"happy path\", rol tabanlı erişim kısıtlamaları (RBAC) ve iş kuralları test edilmiştir.Yetkisi olmayan bir kullanıcının transfer sevk (ship) etmeye çalışması durumunda sistemin doğru bir şekilde 403 Forbidden döndürdüğü doğrulanmıştır.4. Veri İzolasyonu (Tenant Isolation) ve Bug FixYazılan testler sayesinde transfer oluşturma (create) işleminde önemli bir güvenlik detayı fark edilerek anında düzeltilmiştir: Transfer talebi açılırken girilen ürünün (product) ve şubenin (branch) aktif tenant'a ait olup olmadığı kontrolü (fix(api): validate branch and product tenancy) sisteme eklenmiştir.Çoklu kiracı (multi-tenant) mimarisinin en önemli güvenlik adımı olan \"çapraz erişim\" testleri genişletilmiştir. Bir firmanın, başka bir firmaya ait şubeye veya ürüne kesinlikle transfer talebi açamadığı tenant-isolation E2E testleri ile kanıtlanmıştır.5. Sürekli Entegrasyon (CI) Çıktılarının BelgelenmesiGün sonunda test kapsamı (coverage), build süreçleri ve kod standartları denetleyicisi (lint) çıktıları başarılı bir şekilde alınarak docs\/ klasörüne eklenmiş ve modülün prodüksiyona hazır olduğu belgelenmiştir.Git Commit Mesajları:[10:36] (54eff7a) test(api): add Jest config for unit tests with ts-jest[10:36] (5c7d695) test(api): add unit test scripts (test, test:watch, test:cov)[11:04] (6990064) test(api): add MovementsService unit tests with mocked Prisma client[11:05] (22c8f23) chore: ignore jest coverage output[11:19] (d358fa2) test: add unit test output and coverage files[12:17] (39434c2) test(api): add movements e2e covering happy path, RBAC and business rules[12:18] (a8ede20) test(api): add e2e test output for movements[12:37] (0ca591c) fix(api): validate branch and product tenancy on movement create[13:42] (a576e0e) test(api): extend tenant isolation e2e with cross-tenant movements coverage[17:45] (a457792) docs: add day 12 lint output[17:45] (ae380de) docs: add day 12 build output[17:45] (618bbf1) docs: add day 12 full e2e test output"
},
{
"day": 13,
"date": "2026-07-16",
"content": "Bugün, proje planının 13. gün hedefleri doğrultusunda sistemdeki stok ve transfer hareketlerinin anlık olarak istemcilere (web ve mobil) yansımasını sağlayacak gerçek zamanlı altyapı (Real-Time Gateway) başarıyla geliştirilmiştir. Gün içerisinde tamamlanan teknik adımlar aşağıda detaylandırılmıştır:Ortak Tiplerin (Shared Types) ve Altyapının Hazırlanması: Geliştirmelere monorepo içindeki shared-types paketinin derleme çıktılarının (CommonJS) düzeltilmesiyle başlanmıştır. Sistemde yayınlanacak anlık mesajların tip güvenliğini sağlamak için Socket.io olay kataloğu ve veri taşıma yükü (payload) tipleri tanımlanarak ana paketten dışa aktarılmıştır. Ayrıca paket için gerekli lint ve derleme bağımlılık konfigürasyonları güncellenmiştir.​Socket.io Gateway ve Çoklu Kiracı (Tenant) Odalarının Kurulumu: Backend (NestJS) uygulamasına gerekli WebSocket ve Socket.io kütüphaneleri kurularak RealtimeModule ve buna bağlı InventoryGateway inşa edilmiştir. İletişim güvenliğini sağlamak adına bu ağ geçidine (gateway) JWT kimlik doğrulaması zorunluluğu getirilmiştir. Bağlantı kuran her kullanıcı, token üzerinden doğrulandıktan sonra yalnızca kendi firmasına ait (tenant_{id}) izole edilmiş iletişim odalarına (rooms) dahil edilerek veri sızıntısının önüne geçilmiştir.​Transfer İş Akışına (Movements) Anlık Olay Yayınlarının Eklenmesi: Yeni oluşturulan gerçek zamanlı modül, stok hareketleri servisine entegre edilmiştir. Artık sistemde bir transfer oluşturulduğunda (movement:created), durumu güncellendiğinde (movement:statusChanged) veya ürünler sevk\/teslim edildiğinde (inventory:updated) ilgili tüm bilgiler anlık olarak yayınlanmaktadır. Bu olay yayınları (emit), veri tabanı transaction'ı tamamlandıktan sonra güvenli bir şekilde çalıştırılmış ve ağ geçidinde oluşabilecek hataların ana işlem akışını bozmasını engellemek için hata yutma (swallow) özelliğine sahip özel bir yardımcı fonksiyon kullanılmıştır.​Envanter (Inventory) Modülü Entegrasyonu: Gerçek zamanlı bildirim yeteneği, manuel stok düzeltme rotalarına da dahil edilmiştir. Stok ayarlamaları yapıldığında anında inventory:updated olayı tetiklenerek ağdaki diğer istemcilerin (örneğin web paneline bakan bir yöneticinin) ekranının otomatik olarak güncellenmesi sağlanmıştır.​Kapsamlı Test Süreçleri ve Veri İzolasyonunun Doğrulanması: Olay yayınları ve gateway bağlantı yönetimi için kapsamlı birim (unit) testleri yazılmıştır. En kritik aşama olarak, çoklu kiracı mimarisinin WebSocket katmanında da kusursuz çalıştığını ve firmaların birbirlerinin anlık verilerini göremediğini kanıtlayan uçtan uca (cross-tenant isolation e2e) testler sisteme kazandırılmıştır. Gün sonunda lint kontrolleri yapılmış, test kapsam (coverage) raporları ve build çıktıları proje dokümantasyonuna eklenerek süreç tamamlanmıştır.Git Commit Mesajları:[10:31] (009bdb8) fix(shared-types): point package entry to compiled dist output[10:31] (f536548) fix(shared-types): emit CommonJS build to dist[10:31] (c426a01) feat(shared-types): add socket event catalog and payload types[10:32] (0c75354) feat(shared-types): re-export socket events from package index[10:39] (e95e903) feat(api): add socket.io and nestjs websockets dependencies[11:00] (22b36d7) chore: update lockfile for socket.io dependencies[11:12] (f5f3536) feat(api): add inventory gateway with jwt auth and tenant rooms[11:14] (058aa81) feat(api): add realtime module providing inventory gateway[11:17] (c28d546) feat(api): register realtime module in app module[11:35] (3c4612e) feat(config): add optimizeDeps configuration for shared-types[11:39] (c8dfc4d) chore(shared-types): fix lint script and add eslint config[12:02] (9a08bb1) feat(api): wire RealtimeModule into movements module Imported RealtimeModule so MovementsService can inject InventoryGateway for event broadcasting.[12:26] (f9e8607) feat(api): emit movement and inventory events from movements service Broadcasts real-time events per plan §10: movement:created on create, movement:statusChanged on approve\/reject\/cancel\/ship\/receive, and inventory:updated per item on ship\/receive. Emits run outside the Prisma transaction and go through a best-effort emitToTenant helper that swallows gateway failures. Isolation via tenant_{id} room; no tenantId in payloads.[12:53] (490e909) test(api): cover movement event emissions Added 10 tests: emit calls per state transition, per-item inventory events on ship\/receive, no-emit on invalid transitions, and graceful behavior when the gateway throws or tenant context is missing.[12:53] (c0c8ef5) docs: add day 13 stage 1 and 2 test output logs Unit and e2e run outputs after wiring movement event emissions.[15:08] (d384ef7) chore(api): add socket.io-client as dev dependency for realtime e2e[15:09] (9fd2046) feat(api): wire RealtimeModule into inventory module[15:11] (a7b79a7) feat(api): emit inventory:updated on stock adjust[15:11] (7c8a37b) test(api): cover inventory adjust event emission[15:40] (7e8a3c9) test(api): add unit tests for InventoryGateway connection handling and event emissions[15:51] (03c7c06) test(api): add realtime cross-tenant isolation e2e[16:00] (19e54f3) docs: update day 13 unit test output[16:00] (7c7263c) docs: update day 13 e2e test output[16:27] (29ca57e) docs: add day 13 coverage report[16:28] (4f89eeb) docs: add day 13 build output[16:28] (135a99c) docs: add day 13 lint output"
},
{
"day": 14,
"date": "2026-07-17",
"content": "Gün 14 — Web Yönetim Panelinin KuruluşuBugün itibarıyla StockRoute projesi 13 gün boyunca sadece bir backend'ti. Kullanıcıların göreceği hiçbir arayüz yoktu; endpoint'ler Scalar üzerinden test ediliyordu. Gün 14'te bu değişti — projenin web yönetim paneli ayağını hayata geçirdim.Ne yaptım?Sabahın ilk saatlerinde apps\/web altındaki minimal Vite iskeletinin üzerine paketleri kurdum: React Router, Material UI, Zustand (client state), TanStack Query (server state), Axios, React Hook Form ve Zod. Zustand'ı auth token'ı localStorage'da tutmak için, TanStack Query'yi API çağrılarını yönetmek için, React Hook Form + Zod'u ise validasyonu manuel yazmamak için seçtim.Ardından tasarım sistemini kurdum. Plan §11'de belirlenen renk paletini (primary #2563EB, success #16A34A, danger #DC2626 vs.) MUI temasına aktardım — ama değerleri tek tek yazmak yerine daha önce oluşturulmuş @stockroute\/ui-tokens paketinden türetildim. Bu sayede web ve mobil ileride tek görsel dilden beslenecek. Inter fontunu Google Fonts üzerinden yükledim; MUI'nin varsayılan mavisi\/grisi hiçbir yerde kullanılmadı.Marka logolarını (docs\/brand\/ altındaki nihai PNG'ler) entegre ederken bir aksilikle karşılaştım: kaynak PNG'lerin geniş beyaz kenar boşlukları vardı, sidebar'da logo minicik görünüyordu. Görselleri kırptım (yatay logo 1344×768 → 962×170, ikon 1024×1024 → 436×438) ve kırpılmış kopyaları apps\/web\/public\/ altına koydum.Kimlik doğrulama akışıÖğleden sonra auth altyapısına geçtim. Üç dosya kritikti:auth-store.ts — Zustand + persist middleware ile accessToken, user ve tenantSlug localStorage'da tutuluyor. Sayfa yenilendiğinde oturum kaybolmuyor.api-client.ts — Axios instance'ı iki interceptor içeriyor: her isteğe otomatik Bearer token ekleniyor, 401 gelirse oturum düşürülüp \/login'e yönlendiriliyor. Burada bir tuzak vardı: login isteğinin kendi 401'i bu kurala tabi olursa hatalı şifre denemesi sayfayı yeniler. Bu isteği bilinçli olarak interceptor'dan hariç tuttum.LoginPage.tsx — mockup'a birebir uydum: ortalanmış 400px kart, üstte büyük logo, Firma Kodu → E-posta → Şifre alanları, 48px tam genişlik primary buton. Validasyon zod ile, hata mesajları Türkçe.Router, korumalı rota ve layoutAkşama doğru navigasyon iskeletini kurdum. createBrowserRouter ile \/login açık, \/ altındaki tüm sayfalar ProtectedRoute içinde: oturum yoksa otomatik \/login'e yönlendiriliyor.Layout, plan §12.1'deki wireframe'e uygun: solda kalıcı 240px sidebar (6 nav item, aktif olan mavi %10 arka plan + 3px sol border ile vurgulanıyor), üstte beyaz sticky topbar (firma slug'ı solda, kullanıcı avatarı sağda). Dashboard'a 4 KPI kartı (Toplam Şube, Toplam Ürün, Bekleyen Transfer, Düşük Stok) ve altta iki bölüm (Son Transferler tablosu \/ Düşük Stok listesi) ekledim — verileri Gün 15'te bağlanacak, şimdilik placeholder.Yol boyunca yaşadığım iki teknik sorun1. Vite build'i kırıldı. Gün 13'te shared-types paketini CJS'e derlemiştik. Login sayfasında UserRole enum'unu import edince dev sunucusunda her şey çalışıyordu ama pnpm build komutu \"UserRole is not exported\" hatası veriyordu. Sebebini araştırdım: CJS çıktısındaki __exportStar re-export'u Vite'ın Rollup'ı tarafından statik olarak çözülemiyordu. Dev'de esbuild pre-bundle bunu maskeliyordu; production build'de patladı. Çözüm: vite.config.ts'e paketi kaynak TypeScript dosyalarına yönlendiren bir alias ekledim (ui-tokens paketinin zaten kullandığı deseni takip ettim). Böylece Vite kaynağı doğrudan bundle ediyor; API tarafı hâlâ CJS dist'ten okuyor, etkilenmedi.2. UserRole enum'u yanlış yerde duruyordu. Enum yalnızca API tarafında @prisma\/client'ta yaşıyordu, web ise Prisma client'ı import edemez. Planın §5.5'te zaten öngördüğü packages\/shared-types\/src\/enums.ts dosyasını oluşturdum: UserRole, MovementStatus, ProductUnit. Değerler Prisma şemasıyla birebir. Web artık bu tek kaynaktan besleniyor; API kodu değişmedi.Test etme yaklaşımımGünün sonunda Playwright ile gerçek tarayıcıda 6 senaryoyu test ettim: oturumsuz erişim → login yönlendirmesi, login → dashboard, sidebar navigasyonu, F5 sonrası oturum kalıcılığı, çıkış temizliği, boş form validasyonu, yanlış şifre 401 handling'i. Hepsi geçti, konsol hatası sıfır. Web unit testlerini (Vitest + RTL) Gün 15 sonrasına bıraktım — plan §16 bu şekilde ayrılmış.ÖğrendiklerimMonorepo'da paylaşılan paketler CJS\/ESM konusunda tehlikeli olabiliyor. Gün 13'te \"CJS yeterli, Vite'ta gerekirse optimizeDeps ekleriz\" demiştik. Dev sunucusunda çalıştı ama production build'de patladı. Ders: build'i erken çalıştırmak lazım, sadece dev sunucusuyla yetinmemek. Bir sonraki hafta build kontrolünü CI'a ekleyeceğim.Interceptor'lar dikkatli tasarlanmalı. 401 interceptor'ının login isteğini de hedeflemesi klasik bir hata; bunu şans eseri değil, bilinçli olarak düşünüp geçtim. Buna benzer \"her istek için\" mantığı çalışırken hep bir istisna oluyor.Mockup'a bakarak kod yazmak, tahmin yürütmekten çok daha hızlı. Login sayfasını yazarken sürekli docs\/design\/mockups\/web-login.png'e dönüp baktım. Etiketlerin input üstünde mi altında mı olacağı, buton yüksekliği, kart genişliği — hepsi tek tek karar vermek yerine mockup'tan okunuyordu.Gün sonu durumuWeb paneli artık kullanılabilir: kullanıcı http:\/\/localhost:5173'e girip firma kodu + email + şifre ile login olabiliyor, dashboard'u ve boş placeholder sayfaları görüyor, çıkış yapabiliyor. Görsel olarak plan §11.1'deki tasarım sistemine harfiyen uyuyor. Yarın (Gün 15) yönetim ekranlarına (şube, ürün, kullanıcı) gerçek CRUD işlemleri gelecek.Toplam commit: 37 (Conventional Commits formatında, atomik). PR: feat(web): scaffold admin panel with auth flow — reviewer'lara açıldı.Git Commit Mesajları:[10:20] (7b7c16a) chore(web): install router, mui, zustand, tanstack-query and form deps[10:24] (b0d64a6) feat(web): add stockroute meta, favicon and inter font to index.html[10:27] (56fb956) feat(web): add stockroute favicon from plan §11.4 reference svg[10:28] (9eb6769) chore(web): add env example with api and socket url[10:35] (94d1990) feat(web): add mui theme with plan §11 palette and inter typography[10:41] (a197633) feat(web): add app providers with query client and theme[10:49] (7f1abc7) feat(web): add stockroute logo component with small and large variants[11:08] (510247c) feat(web): wire app providers into main entry[11:13] (a30c2f3) feat(web): add temporary skeleton screen for stage 1[11:16] (de62b57) docs: add day 14 stage 1 skeleton screenshot[12:15] (be89553) feat(shared-types): add UserRole, MovementStatus and ProductUnit enums Plan §5.5 already specified this module. Values mirror the Prisma schema so web\/mobile clients can type-check role and status without importing @prisma\/client.[12:16] (68ff4a8) feat(shared-types): re-export enums from index[12:16] (e284954) feat(web): add zustand auth store with localstorage persist Persists accessToken and user under 'stockroute-auth'. Exposes setAuth, logout and isAuthenticated selectors. JWT expiry check deferred to a later day.[12:18] (6310b47) feat(web): add axios api client with bearer token and 401 interceptor Request interceptor attaches the auth store token. Response interceptor logs out and redirects on 401, but skips \/auth\/login itself so a wrong password does not reload the page.[12:26] (b90f406) feat(web): add zod login schema with turkish messages[12:43] (f776ccb) feat(web): add useLogin mutation hook Calls POST \/auth\/login and pipes the response into the auth store on success.[13:10] (69e49ce) feat(web): add login page matching plan §12.1 wireframe - Centered 400px card with large StockRoute logo - Fields: firma kodu, e-posta, şifre with labels above inputs (per mockup) - Full-width 48px primary button with loading state - Turkish zod errors and 401 alert - Small helper text explaining tenant slug[13:13] (86c4c52) chore(web): type VITE_API_URL and VITE_SOCKET_URL env vars[13:17] (c29f95d) feat(web): render login page as temporary stage 2 entry[13:17] (6e77d97) docs: add day 14 stage 2 login screenshot[13:44] (c3df0c6) fix(web): resolve shared-types from source in vite via alias The CJS dist emits __exportStar which vite's rollup cannot statically resolve, so UserRole came through as undefined during build (dev worked because optimizeDeps prebundled it). Switched to a source alias matching the ui-tokens pattern; api still consumes the CJS dist unchanged.[13:47] (e1b1660) feat(web): add tenantSlug to auth store for topbar display \/auth\/me does not yet return tenant.name; store the slug from the login form as an interim label. TODO(day15): extend backend to return tenant.name and swap the topbar source.[13:58] (ac1cb97) feat(web): pass tenantSlug into setAuth on successful login[14:04] (cfca007) refactor(web): align login page with mui v9 slotProps api[14:17] (d0bd92b) feat(web): add protected route guard redirecting unauthenticated users to \/login[14:28] (b1ee5f9) feat(web): add sidebar with 6 nav items and active state matching mockup 240px permanent drawer with small logo, MENÜ label, and nav items for dashboard, branches, products, inventory, movements and users. Active item gets primary 10% background, 3px left border and primary text\/icon. Logout at the bottom.[14:37] (b5d224f) feat(web): add user badge with role-colored label Initials avatar plus full name and turkish role label. Role color follows plan §11.1 (FIRM_ADMIN primary, BRANCH_MANAGER info, WAREHOUSE_STAFF warning, FIELD_STAFF gray).[14:43] (2e8ada4) feat(web): add layout with sidebar, sticky topbar and outlet Follows plan §12.1 wireframe: permanent sidebar on the left, white sticky topbar with tenant identity and user badge, page content via .[14:46] (716c319) feat(web): add dashboard with kpi cards and placeholder sections Four KPI cards (branches, products, pending transfers, low stock) with tinted icon boxes, 8\/4 grid below with empty recent-transfers table and low-stock list. Real data wiring deferred to day 15.[14:46] (407a626) feat(web): add branches page placeholder[14:46] (71fd931) feat(web): add products page placeholder[15:16] (b75c120) feat(web): add Inventory, Movements, and Users pages with placeholders[15:44] (29ef69c) feat(web): add router with protected routes and layout createBrowserRouter with public \/login, protected \/ branch under Layout, and catch-all redirect to \/.[17:03] (f81d27f) chore(web): re-export statusColors for future transfer chips[17:04] (93fe690) feat(web): render router provider as app entry[17:08] (1ecbb93) feat(web): replace reference svg logo with final png brand assets Swapped the plan §11.4 reference SVG for the finalized PNG logo and app icon under public\/. Logo component now renders the PNG in both small and large variants; favicon reference in index.html updated accordingly.[17:12] (a4a63ad) docs: add day 14 stage 3 build and lint outputs[17:13] (c7e0b7c) docs: add day 14 dashboard screenshot"
},
{
"day": 15,
"date": "2026-07-20",
"content": "Gün 14'te web panelinin sadece iskeletini kurmuştum — giriş yapılabiliyordu ama sidebar'daki hiçbir menü gerçek bir şey göstermiyordu. Bugün bu boşlukları doldurdum: Şubeler, Ürünler ve Kullanıcılar ekranlarının üçünü de baştan sona, gerçek API'ye bağlı olarak tamamladım.Nasıl başladım?Kod yazmadan önce docs\/design\/mockups\/ klasöründeki ekran tasarımlarını tek tek inceledim ve gerçek veritabanı şemasıyla karşılaştırdım. Bu, gün içinde çok işime yaradı — hangi alanların formda olacağını, tablo sütunlarının sırasını, buton yerleşimini tahmin etmek yerine doğrudan tasarımdan okuyabildim. Örneğin şube kodu alanının \"SB-KDK\" gibi bir formatta olması, kod alanının firma içinde benzersiz olması gerektiği gibi detaylar hep mockup'tan geldi.Ortak altyapıÜç ekran da benzer ihtiyaçlara sahipti (tablo, form modalı, silme onayı, bildirim), bu yüzden önce paylaşılan bileşenleri yazdım: sayfa başlığı, silme onay dialogu, boş liste görünümü, tablo yükleme iskeleti ve bildirim (snackbar) altyapısı. Bu sayede her ekranda aynı kodu tekrar yazmadım, DRY prensibine uydum.Şubeler ekranıİlk tamamladığım ekran. Tablo halinde şube listesi, sağ üstte \"Yeni Şube\" butonu, tıklanınca açılan modal formda ad\/kod\/şehir\/adres\/telefon alanları ve aktif\/pasif durumu. Sadece firma yöneticisi (FIRM_ADMIN) yeni şube ekleyebiliyor, düzenleyebiliyor veya silebiliyor — diğer roller listeyi görüyor ama aksiyon butonlarını göremiyor.Ürünler ekranıBu ekranda ekstra olarak arama özelliği ekledim. Kullanıcı yazarken sistem 500 milisaniye bekleyip sonra sunucuya sorgu atıyor — böylece her harf tuşuna basıldığında gereksiz istek gitmiyor. Ürün birimi (adet, kilogram, litre, koli, paket) için açılır liste ekledim, bu değerler hem formda hem tabloda tutarlı görünüyor.Kullanıcılar ekranı — günün en karmaşık kısmıBu ekranı yazarken ilginç bir şey fark ettim: backend'de kullanıcı yönetimi için hiçbir endpoint yoktu. Planın 9.3 numaralı bölümünde bu endpoint'ler tanımlıydı ama önceki günlerde modül olarak hiç oluşturulmamış. Web ekranını yazabilmek için önce backend'e bu eksik parçayı ekledim — mevcut şube ve ürün modüllerinin yapısına birebir uyarak, kullanıcı oluşturma\/listeleme\/güncelleme\/silme endpoint'lerini yazdım. Şifreler bcrypt ile şifreleniyor, hiçbir zaman API cevabında görünmüyor.Kullanıcı formunda rol seçimi yapılırken, eğer \"Firma Yöneticisi\" rolü seçilirse şube alanı otomatik gizleniyor çünkü firma yöneticisinin belirli bir şubesi olmuyor. Ayrıca kendi hesabını silme girişimini hem arayüzde hem backend'de engelledim — kullanıcı kendi satırındaki sil butonuna tıklayamıyor, ayrıca sunucu tarafında da bu durum ayrıca kontrol ediliyor.Rol bazlı erişim kontrolüGün 14'te tüm menü öğeleri her role görünüyordu. Bugün bunu düzelttim: sidebar artık kullanıcının rolüne göre menü öğelerini gösteriyor veya gizliyor. Örneğin depo personeli \"Kullanıcılar\" menüsünü hiç görmüyor. Ayrıca birisi doğrudan URL'ye yazarak yetkisi olmayan bir sayfaya gitmeye çalışırsa, otomatik olarak ana sayfaya yönlendiriliyor.Test etmeGerçek tarayıcıda (Playwright ile) 31 farklı senaryoyu test ettim: şube\/ürün\/kullanıcı oluşturma-düzenleme-silme akışları, arama filtreleme, rol bazlı erişim kısıtlamaları, kendi hesabını silememe durumu. Hepsi başarıyla geçti, konsol hatası sıfır.ÖğrendiklerimTasarımı önce incelemek zaman kazandırıyor. Mockup'lara bakmadan kod yazsaydım muhtemelen form alanlarını yanlış sırada koyar, sonra geri dönüp düzeltirdim. Önce inceleyip sonra yazmak çok daha verimli.Eksik bir parçayı fark etmek de işin bir kısmı. Backend'de kullanıcı modülünün hiç olmadığını fark etmek beni şaşırttı ama bu aslında normal bir durum — büyük projelerde planın bir kısmı atlanabiliyor. Önemli olan bunu fark edip, mevcut kod yapısına uyumlu şekilde tamamlamak.Küçük güvenlik detayları önemli. Kendi hesabını silme durumu gibi ince bir senaryoyu hem arayüzde hem sunucuda ayrı ayrı kontrol etmek gerekiyor — sadece arayüzde engellemek yetmiyor, çünkü biri API'yi doğrudan çağırabilir.Gün sonu durumuWeb paneli artık gerçek anlamda kullanılabilir bir yönetim aracı: firma yöneticisi şube açabiliyor, ürün ekleyebiliyor, yeni kullanıcı davet edip rol atayabiliyor. Üç ekran da mockup'lara sadık, API'ye tam bağlı ve test edilmiş durumda. Yarın (Gün 16) envanter ve transfer ekranlarına geçeceğim.Git Commit Mesajları:[10:45] (2f816f2) feat(api): add CreateUserDto for users module email, password (min 8 \/ max 72 for bcrypt), fullName, role, optional branchId and isActive.[10:45] (491bbb1) feat(api): add UpdateUserDto extending PartialType(CreateUserDto) All fields optional so password stays unchanged when omitted; matches the branches\/products dto pattern.[10:46] (86f1d98) feat(api): add UsersService with CRUD, bcrypt hashing and safe user projection Follows branches\/products service pattern. Passwords hashed with bcrypt (10 rounds, same as auth). Prisma extension handles tenant scoping — no manual tenantId. Local toSafeUser helper strips passwordHash. Self-delete protection via currentUserId. P2002 unique conflicts mapped to 409.[10:48] (845cf5c) feat(api): add UsersController with FIRM_ADMIN only routes POST\/GET\/GET(:id)\/PATCH\/DELETE under \/users, all guarded by JwtAuthGuard + RolesGuard with @Roles(FIRM_ADMIN) per plan §9.3. Delete passes @CurrentUser().userId to the service so self-delete returns 400. Documented via @ApiTags, @ApiOperation and @ApiResponse for Scalar.[10:48] (8682bad) feat(api): add UsersModule[10:49] (84faf10) feat(api): register UsersModule in the app module Placed next to BranchesModule and ProductsModule to keep domain modules grouped.[11:13] (1f073af) feat(web): wire snackbar provider into app providers[11:13] (57e85e0) feat(web): add page header component with title and action slot[11:13] (0618645) feat(web): add confirm dialog with loading state for destructive actions[11:16] (e768737) feat(web): add empty state component for empty and error lists[11:16] (ff983b5) feat(web): add data table skeleton for loading states[11:16] (cb42ebc) feat(web): add snackbar provider with useSnackbar hook Exposes showSuccess\/showError for mutation feedback across feature pages.[11:18] (a2f9dd5) feat(web): add helper to extract turkish error messages from api responses[11:24] (f22be93) feat(web): add Branch response type[11:24] (b937eea) feat(web): add zod schema for branch create\/edit form[11:27] (a422712) feat(web): add branches api client functions[11:42] (bcf5654) feat(web): add useBranches query hook[11:50] (987f17a) feat(web): add branch create, update and delete mutation hooks Invalidates the branches query on success and surfaces api errors via snackbar.[12:02] (c06964e) feat(web): add branch form dialog for create and edit City kept as free text since the backend has no fixed city list, diverging from the mockup's select intentionally. Fields match the api dto: name, code, city, address, phone, isActive.[12:04] (d88ac40) feat(web): add branches crud page with table, search-free list and rbac gating Table columns limited to what the api returns (Ad, Kod, Şehir, Durum, Aksiyon) — mockup columns without an api counterpart were dropped. Only FIRM_ADMIN sees create\/edit\/delete actions; other authorized roles get read-only list.[12:04] (52acb29) docs: add branches list and branch form screenshots[12:13] (c4938fa) feat(web): add useDebouncedValue hook for search inputs[12:20] (004472a) feat(web): add Product type and zod schema with unit labels ProductUnit values mapped to Turkish labels (Adet\/Kg\/Litre\/Koli\/Paket) for the form select.[12:24] (e8551d3) feat(web): add products api client and query\/mutation hooks useProducts includes search in the query key with keepPreviousData for smooth debounced filtering. Mutations invalidate ['products'] on success.[12:30] (cfc2eaa) feat(web): add product form dialog with unit select Matches web-yeni_urun mockup: sku\/barcode helper text, unit dropdown. minStockThreshold intentionally excluded — it belongs to Inventory, not Product.[12:31] (c483b85) feat(web): enhance ProductsPage with CRUD functionality and improved UI components[12:54] (93f9e4c) docs: add day 15 products list, search and form screenshots[15:16] (3c2e23b) feat(web): gate users route behind FIRM_ADMIN role guard[15:16] (188f66d) feat(web): add role guard component for role-restricted routes Redirects to \/ when the current user's role is not in the allowed list, for routes protected beyond plain authentication.[15:16] (1e82d2c) feat(web): hide sidebar items the current role cannot access Kullanıcılar limited to FIRM_ADMIN, Ürünler to FIRM_ADMIN\/BRANCH_MANAGER\/WAREHOUSE_STAFF.[15:26] (cf7db36) refactor(web): use shared role labels module in user badge[15:26] (de58f5c) feat(web): add zod schema for user create\/edit form Password required on create, optional on edit so it stays unchanged when left blank.[15:27] (37d7fec) feat(web): add User response type[15:27] (00e1e6d) feat(web): add user form dialog with role and branch assignment Role select with 5 options (SUPER_ADMIN excluded from the picker). Branch field disabled and hidden when role is FIRM_ADMIN.[15:31] (2ed40f5) feat(web): add users crud page restricted to FIRM_ADMIN Table: Ad, E-posta, Rol (colored chip), Şube, Aksiyon.[15:31] (430cd48) feat(web): add users api client functions[15:32] (e2ed8ed) feat(web): add user create, update and delete mutation hooks[15:48] (727519c) feat(web): add useUsers query hook[15:49] (0bb4705) refactor(web): extract role labels and colors to shared module Centralizes the UserRole to Turkish label and color mapping so UserBadge and the users table stay in sync.[15:50] (3848af8) docs: add users list,user form and sidebar admin screenshots[15:50] (ed7059b) docs: add day 15 build output[16:00] (26a03fb) docs: add day 15 lint output"
},
{
"day": 16,
"date": "2026-07-21",
"content": "Gün 16 — Envanter ve Transfer EkranlarıBugün web panelinin iki temel operasyonel ekranı geliştirildi: Envanter ve Transferler. Bu iki ekran, stok takip sisteminin çekirdek işlevini oluşturuyor — hangi şubede ne kadar ürün olduğunun görüntülenmesi ve şubeler arası stok transferinin yönetilmesi.Envanter EkranıŞube bazlı stok görüntüleme ekranı yapıldı. Kullanıcı bir şube seçtiğinde o şubedeki ürünlerin güncel stok miktarları, minimum eşikleri ve durumları tablo halinde listeleniyor. Stoğu minimum eşiğin altındaki ürünler kırmızı ile vurgulanıyor.Stok düzeltme işlevi eklendi. Backend'in mutlak miktar yerine değişim değeri (delta) beklediği için, modal ekranda mevcut miktar ve girilen değere göre hesaplanan yeni miktar canlı olarak gösteriliyor. Negatif sonuç oluşacaksa işlem gönderilmeden önce uyarı veriliyor. Stok düzeltmede \"neden\" alanı zorunlu tutuldu; böylece her düzeltme kayıt altına alınabiliyor (audit trail).Rol bazlı erişim uygulandı: stok düzeltme yalnızca şube müdürü ve depo personeline açık. Şube listesine erişimi olmayan roller (depo\/saha personeli) kendi şubelerini otomatik görüyor.Transfer EkranıTransfer iş akışının tamamı arayüze taşındı. Ekran üç parçadan oluşuyor: transfer listesi, transfer detayı ve transfer oluşturma.Liste: Durum filtreleri (beklemede, onaylandı, yolda, teslim alındı, reddedildi, iptal), arama ve sayfalama eklendi. Durum bilgisi renkli chip'lerle gösteriliyor.Oluşturma: Çoklu ürün destekleyen dinamik form yapıldı — tek transferde birden fazla ürün eklenebiliyor. Kaynak ve hedef şube seçimi, ürün ve miktar alanları mevcut. Kaynak şube seçildiğinde o şubedeki stok miktarı gösteriliyor.Durum makinesi ve aksiyonlar: Onayla, Reddet, Sevk Et, Teslim Al, İptal Et butonları hem transferin durumuna hem kullanıcının rolüne göre görünüyor. Bu kurallar tek bir dosyada toplanarak liste ve detay ekranlarının tutarlı çalışması sağlandı. Stok hareketi oluşturan işlemler (sevk, teslim) onay dialogu ile korunuyor.Backend TamamlamalarıWeb ekranları yazılırken planda eksik veya fazla kısıtlı olan beş uç noktası tespit edilip tamamlandı:\/auth\/me cevabına kullanıcının şube bilgisi eklendi (şube listesine erişemeyen roller kendi şubesini alabilsin diye).PATCH \/inventory\/:id\/threshold eklendi — düşük stok eşiği artık düzenlenebiliyor. Eşik bir ayar olduğundan, stok hareketlerinden farklı olarak audit log'a yazılmıyor.GET \/branches\/selectable eklendi — transfer formunda şube seçimi için tüm rollere açık, yalnızca id\/ad\/kod dönen minimal uç.GET \/products saha personeline açıldı — transfer formunda ürün seçebilmesi için.Düzeltilen HatalarTransfer oluştururken aynı ürün iki kez eklenirse veritabanı kısıtı ihlali 500 hatası veriyordu. Uygulama katmanında erken kontrol eklenerek anlamlı bir 400 mesajına çevrildi.Yetki hatalarında (401\/403\/404) gereksiz yere tekrar deneme yapılması engellendi.TestPlaywright ile 62 senaryo test edildi (envanter, transfer oluşturma, durum geçişleri, rol bazlı yetkiler). Backend değişiklikleri için mevcut API testleri (58 test) tekrar çalıştırıldı; regresyon olmadığı doğrulandı. Web ve API build\/lint çıktıları temiz.Neler ÖğrendimBir sorunu çözerken zincirin tamamını takip etmek gerekiyor. Transfer formunun çalışması için şube erişimi yeterli sandım, ama ürün erişiminin de eksik olduğu sonradan ortaya çıktı. Yarım çözüm, \"çalışıyor\" sanılıp beklenmedik yerde patladığı için bazen hiç çözmemekten daha risklidir.Kavramsal ayrım, kod kalitesini belirliyor. Eşik belirlemek bir \"ayar\", stok düzeltmek bir \"hareket\". Bu ikisini aynı mekanizmaya koymak, audit log'u anlamsız kayıtlarla kirletirdi. Doğru soyutlama baştan yapıldığında ileriki karmaşa önleniyor.HTTP durum kodları kullanıcıya mesaj taşıyor. 500 \"sunucuda beklenmeyen hata\" demek; 400 \"istek hatalı\" demek. Öngörülebilir kullanıcı hatalarını 400'e çevirmek, hem daha doğru geri bildirim veriyor hem de gerçek sunucu hatalarını gürültüden ayırmayı kolaylaştırıyor.Test altyapısı, sonraki günlerde güven sağlıyor. Daha önce yazılan API testleri sayesinde bugün backend'e çekinmeden dokunulabildi; bir şeyin bozulup bozulmadığı anında görülebildi.Git Commit Mesajları:[10:38] (db8ad70) feat(web): add inventory types with low-stock helper[10:38] (1d920e3) feat(web): add zod schema for stock adjustment quantity is a delta (not absolute); reason required in UI (min 3) for audit trail quality though the backend accepts it as optional.[10:39] (b2e4ae6) feat(web): add inventory api client for fetch and adjust[10:45] (9acc82c) feat(web): add stock adjust mutation hook[10:46] (a496b82) feat(web): add enabled option to useBranches hook Lets callers skip the branches fetch for roles without GET \/branches access; defaults to true so existing callers are unaffected.[10:47] (83317b0) feat(web): add stock adjustment dialog with live delta preview Single \"miktar değişimi\" field with helper text; shows current quantity and a live \"new quantity\" preview, flagging negative results before the backend rejects them.[11:01] (6394aa7) feat(web): add inventory page with branch selector, low-stock highlight and rbac Low-stock rows highlighted via theme error alpha. Roles without GET \/branches access (WAREHOUSE_STAFF, FIELD_STAFF) get a branch-less view with an added ŞUBE column instead of a broken selector. Client-side search and pagination.[11:03] (11471a5) feat(web): add useInventory query hook with branch and low-stock filters[11:03] (cf9d018) docs: add day 16 inventory screenshots[11:15] (910c2b9) feat(api): include branch summary in \/auth\/me profile getProfile now includes the user's branch (id, name, code, city) via a new UserProfile type. login\/registerTenant responses keep their existing SafeUser contract untouched — branch is exposed only on \/auth\/me.[11:15] (cdcd2c0) feat(api): document branch field on \/auth\/me response Return type set to UserProfile with branch documented as nullable in the OpenAPI schema.[11:15] (a26eae2) feat(web): add useProfile hook for \/auth\/me Fetches the current user's profile including branch, with 5 min staleTime. Keeps the auth store as a login snapshot and reads live branch info here instead.[11:17] (9bef349) refactor(web): show own-branch inventory for warehouse and field staff Replaces the interim branch-less view: WAREHOUSE_STAFF\/FIELD_STAFF now auto-use their own branch from \/auth\/me (no cross-branch leakage), FIRM_ADMIN\/BRANCH_MANAGER keep the selector. Users with no branch get an informative empty state.[11:17] (8faee6b) docs: add day 16 own-branch and no-branch inventory screenshots[11:32] (31d2c8d) feat(api): add UpdateThresholdDto for inventory threshold[11:33] (34194a8) feat(api): add updateThreshold to inventory service Updates only minThreshold and writes no audit log — a threshold is a setting, not a stock movement. 404 when the record is missing; tenant scoping handled by the prisma extension.[11:33] (ac3c255) feat(api): add PATCH \/inventory\/:id\/threshold endpoint Restricted to FIRM_ADMIN and BRANCH_MANAGER (threshold is a management decision, not stock handling). Named path avoids clashing with POST \/inventory\/adjust and leaves room for a future generic PATCH \/inventory\/:id.[11:43] (31e252a) feat(web): add threshold schema to inventory schemas[11:43] (df627a0) feat(web): add updateThreshold api call[11:43] (ae8fd62) feat(web): add threshold mutation hook[11:54] (60a30e9) feat(web): add threshold edit dialog Shows product name and current stock with a single integer field for the low-stock threshold.[11:54] (144401f) feat(web): make min threshold cell editable for managers MİN EŞİK cell is clickable with an edit icon for FIRM_ADMIN\/BRANCH_MANAGER, plain text for other roles.[11:55] (c3d83e1) docs: add day 16 inventory screenshots including threshold edit[12:29] (090fce4) feat(web): add movement types separating list and detail shapes Movement (list) and MovementDetail differ: items carry the product relation only in the detail response. Separate types make accessing product name in a list row a compile error instead of a runtime undefined.[12:29] (cf8f40e) feat(web): add movement status labels and filter helpers Turkish status labels, filter ordering and a terminal-status helper.[12:29] (8a735fd) feat(web): add movement id and date formatting helpers[12:45] (d475d20) feat(web): add movements api client for list, detail, create and actions runMovementAction wraps the five bodiless state-transition POSTs behind one call.[12:47] (88a2e28) feat(web): add hooks for fetching movement details and list[13:06] (45c250d) feat(web): add single mutation for movement state transitions approve\/reject\/ship\/receive\/cancel share the same shape, so one actionMutation takes the action as a parameter; wired to buttons in the next stage.[13:06] (ce0610b) feat(web): add movement status chip consuming statusColors Dotted soft-background chip with Turkish labels, reusing the shared statusColors from the theme.[13:14] (40fb1ed) feat(web): add movement detail dialog with item table and actions slot Renders header info, the multi-item table and a note. Action buttons are injected via an actions prop so the RBAC + state-machine decision lives on the page, not the dialog.[13:14] (d637a58) feat(web): add movements list page with status filter, search and counts Status filter chips with client-side counts, search and pagination. Multi-item transfers summarized as \"N kalem\"; single-item rows show the quantity. Added a Cancelled filter chip absent from the mockup but present in the state machine.[13:14] (9ebd847) docs: add day 16 movements list, filtered and detail screenshots[13:48] (4a3bfb4) fix(web): skip retry on 401\/403\/404 responses Auth and not-found errors were being retried once unnecessarily; excluded them so permission failures fail fast.[13:54] (366d1cf) feat(web): add movement form schema with multi-item and duplicate guard Requires at least one item, blocks same source\/destination branch and rejects the same product added twice.[13:54] (b82c364) feat(web): add movement action rules as single source of truth Encodes each action's state + role matrix, label and confirm text. Both the row buttons and the detail dialog derive visibility from availableActions() so they can never diverge.[13:55] (46bf1f4) feat(web): add shared movement action buttons for row and dialog stopPropagation keeps row-level action clicks from opening the detail dialog.[13:56] (086bc73) feat(web): add multi-item transfer creation dialog Dynamic product rows via useFieldArray with add\/remove; source branch selection surfaces per-branch stock from inventory. Empty note omitted from the payload.[13:56] (4ba174e) feat(web): add transfer create mutation hook[14:09] (38e8e5c) feat(web): wire transfer creation and workflow actions into movements page New Transfer button, AKSİYON column with state+role gated buttons, and ConfirmDialog for each transition (especially ship\/receive which move stock).[14:10] (a60217b) docs: add day 16 transfer creation and action screenshots[17:26] (bc19190) fix(api): return 400 instead of 500 for duplicate product in transfer items with the same productId twice violated @@unique([movementId, productId]) at the DB layer, surfacing as a 500. Added an early Set-based uniqueness check in create() so this predictable user error returns a 400 with a clear message before hitting the database. Ordered with the cheap same-branch check ahead of the existence queries.[17:26] (50c2eb4) docs(api): document duplicate-product 400 case on movement create[17:42] (f13a436) feat(api): add findSelectable returning minimal branch list[17:42] (69cf61f) feat(api): add GET \/branches\/selectable open to all roles Read-only minimal list (id, name, code) of active branches for transfer\/selection screens, available to every role. Full GET \/branches (management detail) stays limited to FIRM_ADMIN\/BRANCH_MANAGER. Route declared before \/:id to avoid the param catching \"selectable\".[17:42] (e3ef3ed) feat(web): add SelectableBranch type[17:43] (e5269f0) feat(web): add fetchSelectableBranches api call[17:43] (b75f908) feat(web): add useSelectableBranches hook open to all roles[17:43] (5a25c29) feat(web): source transfer branch selectors from selectable endpoint Lets WAREHOUSE_STAFF\/FIELD_STAFF pick branches in the transfer form; removed the \"no branch access\" warning. Inventory screen's useBranches usage untouched.[17:43] (87190af) docs: add day 16 transfer form screenshots for field and warehouse staff[18:06] (389962a) feat(api): allow FIELD_STAFF to list products GET \/products now includes FIELD_STAFF so the role can pick products in the transfer form (plan §9.6 allows all roles to create transfers). Product management (POST\/PATCH\/DELETE) permissions unchanged — FIELD_STAFF still cannot manage products, only list them.[18:06] (d7791e8) docs: refresh day 16 transfer screenshots after field-staff fix[18:10] (bd3e7ed) docs: add day 16 build and lint outputs for web and api Co-Authored-By: Claude Opus 4.8 "
},
{
"day": 17,
"date": "2026-07-22",
"content": "Bugün iki büyük iş tamamlandı: web panelinin gerçek zamanlı hale getirilmesi (real-time) ve dashboard'un canlandırılması. Ayrıca planda normalde son güne (Gün 20) bırakılmış olan Docker yapılandırması, teslim gününün yükünü azaltmak için öne çekilerek bugün bitirildi.Socket.io Client BağlantısıBackend'in socket altyapısı Gün 13'te kurulmuştu; bugün web tarafını buna bağladım. Uygulama genelinde tek bir bağlantı olacak şekilde bir singleton yapısı kurdum — her bileşen kendi bağlantısını açmasın diye. Kullanıcı giriş yaptığında bağlantı kuruluyor, çıkış yaptığında kapanıyor.Burada React'in StrictMode özelliğinden kaynaklanan bir sorun çıktı: geliştirme modunda React efektleri iki kez çalıştırdığı için bağlantı açılıp hemen kapanıyor, sonra tekrar açılıyordu. Bunu 300 milisaniyelik gecikmeli kapatma mantığıyla çözdüm — bağlantı kapatılmadan önce kısa süre bekleniyor, bu sürede yeni bir bağlantı isteği gelirse mevcut bağlantı korunuyor. Gerçek çıkışta ise süre dolup bağlantı kapanıyor.Canlı GüncellemelerÖnceki günlerde bir kullanıcı transfer oluşturduğunda diğerleri ancak sayfayı yenileyince görüyordu. Bugün bunu değiştirdim: artık bir olay geldiğinde ilgili veri sorgusu geçersiz kılınıp otomatik yenileniyor. Böylece transfer oluşturma, durum değişikliği ve stok güncellemeleri açık olan tüm ekranlara anlık yansıyor.Güncelleme stratejisi olarak \"geçersiz kılıp yeniden çekme\" yöntemini seçtim. Alternatif olan \"önbelleği doğrudan güncelleme\" yöntemi daha hızlı olurdu ama gelen olaylar ürün bilgisi taşımadığı için eksik veriyle çalışırdı. Bu yüzden daha basit ve güvenilir olan yeniden çekme yöntemini tercih ettim.Backend Eksiği: Düşük Stok BildirimiReal-time'ı test ederken bir boşluk fark ettim: bildirim (notification) olayı backend'de tanımlıydı ama hiçbir servis onu tetiklemiyordu. Yani web tarafında bildirim dinleyicisi hazırdı ama gönderen taraf yoktu. Bu boşluğu kapattım — bir ürünün stoğu minimum eşiğin altına yeni düştüğünde otomatik bildirim gönderiliyor. Burada dikkat ettiğim nokta, sadece \"yeni düşüş\"te bildirim göndermek oldu; stok zaten düşükken tekrar azalırsa yeni bildirim gitmiyor, böylece kullanıcı gereksiz bildirim yağmuruna maruz kalmıyor.Dashboard'un CanlandırılmasıGün 14'te dashboard'u boş kartlarla (placeholder) bırakmıştım. Bugün gerçek verilerle doldurdum: toplam şube, toplam ürün, bekleyen transfer ve düşük stok sayılarını gösteren kartlar, son transferler listesi ve düşük stok listesi. Önemli bir tasarım tercihi yaptım — dashboard için ayrı bir veri sorgusu açmak yerine, diğer ekranların zaten kullandığı sorguları paylaştırdım. Bunun sonucunda real-time güncelleme dashboard'a \"bedavaya\" geldi; başka bir sekmede transfer oluşturulduğunda dashboard kartları otomatik güncelleniyor.DockerizasyonGünün ikinci büyük işi Docker'dı. Amaç, tüm sistemin (veritabanı + API + web) tek komutla ayağa kalkması: docker compose up --build.API için çok aşamalı bir Docker imajı hazırladım. Burada en kritik sorun Prisma'nın veritabanı motoruydu: yerel makinemde çalışan motor, Docker'ın kullandığı Alpine Linux'ta çalışmıyordu. Prisma yapılandırmasına ikinci bir hedef mimari ekleyerek çözdüm. Ayrıca imaj boyutunu ölçüp gereksiz web paketlerini imajdan çıkararak 1.17 GB'tan 956 MB'a düşürdüm.Web için nginx sunucusuyla servis eden ikinci bir imaj yaptım (94 MB). Burada önemli bir mimari karar verdim: web ve API'nin aynı origin üzerinden konuşması için nginx'i ters vekil (reverse proxy) olarak yapılandırdım. Böylece tarayıcı hem uygulamaya hem API'ye hem de socket bağlantısına tek adres üzerinden (:5173) erişiyor; CORS ayarına gerek kalmıyor.docker-compose dosyasında üç servisi birleştirdim. Veritabanının hazır olmasını bekleyen bir sağlık kontrolü (healthcheck) ekledim — API, veritabanı hazır olmadan başlamayı deneyip hata vermesin diye.Docker'da Yakaladığım Sinsi SorunlarDocker kurulumunda üç zorlu sorunla karşılaştım:Birincisi, paylaşılan tip paketinin (shared-types) container içinde ayrıca derlenmesi gerekiyordu — yerelde çalışan bir kısayol container'da çalışmadı.İkincisi çok sinsiydi: Git Bash terminali, \/api değerini otomatik olarak bir Windows dosya yoluna çeviriyordu. Build \"başarılı\" görünüyordu ama üretilen dosyanın içine yanlış adres gömülmüştü. Ancak çıktının içine bakınca fark edebildim. Bir ortam değişkeni ayarıyla çözdüm.Üçüncüsü, README dosyasındaki veritabanı port numarası yanlıştı (5432 yazıyordu ama gerçekte 5433). Bu, dokümanı takip eden birinin geliştirme modunu kuramamasına yol açacak bir hataydı; üç dosyada düzelttim.Test ve DoğrulamaReal-time'ın gerçekten çalıştığını kanıtlamak için iki sekmeli testler yaptım. Testin kritik tasarımı şuydu: bir sekmenin işlemlerini doğrudan API üzerinden yaptım, arayüzden değil. Böylece diğer sekmedeki güncellemenin yalnızca socket olayından gelebileceğinden emin oldum. Toplam 24 senaryo test edildi.Docker için en önemli test, sistemi tamamen sıfırdan (önbellek silinmiş, veritabanı temizlenmiş) ayağa kaldırmaktı. docker compose up --build tek komutuyla her şey kalktı ve gerçek zamanlı bağlantı dahil çalıştı. Bu, teslim günü hocanın yapacağı senaryonun tam olarak provası oldu.Neler ÖğrendimBir çözümü test ederken alternatiflerini de tartmak önemli. Real-time güncelleme için \"önbelleği doğrudan güncelle\" yöntemi ilk bakışta daha şık görünüyordu ama gelen verinin eksikliği yüzünden çalışmazdı. Basit yöntemi seçmek bazen daha doğrudur.\"Başarılı görünen\" bir çıktı gerçekten başarılı olmayabilir. Git Bash'in dosya yolunu bozması, build başarılı görünürken içeriğin bozuk olmasına yol açtı. Çıktının sadece \"geçti\/kaldı\" durumuna değil, gerçek içeriğine bakmak gerekiyor.Ortam farkları en beklenmedik yerde çıkar. Yerel makinemde çalışan Prisma motoru, Docker'ın Linux dağıtımında çalışmadı. \"Bende çalışıyor\" demek yetmiyor; kodun çalışacağı gerçek ortamı düşünmek gerekiyor.İleriki işleri öne çekmek riski dağıtır. Docker'ı teslim gününe bırakmak yerine bugün bitirmek, son gün panik yaşama ihtimalini büyük ölçüde azalttı. Bağımsız ve öngörülebilir işleri erkenden halletmek, kritik günü rahatlatıyor.Gün Sonu DurumuWeb paneli artık tamamen bitti: tüm CRUD ekranları, gerçek zamanlı güncellemeler ve canlı dashboard çalışıyor. Ayrıca tüm sistem tek komutla ayağa kalkacak şekilde konteynerize edildi. Yarından itibaren (Gün 18) mobil saha uygulamasına başlayacağım; Docker'ı bugün bitirdiğim için teslim günü yalnızca mobil, son testler ve demo hazırlığı kalacak.Git Commit Mesajları:[10:41] (1ab80f2) chore: add playwright for browser-based e2e verification Reusable socket-verify script tracks WebSocket lifecycle across tabs; becomes the base for stage 2 two-tab realtime tests.[10:42] (0cac93a) chore(web): add socket.io-client dependency[10:43] (51bcbb7) feat(web): add socket singleton with strictmode-safe lifecycle Reference-counted singleton with a 300ms grace period on teardown so React StrictMode's mount\/unmount\/mount cycle reuses one connection instead of reconnecting. Double-release guarded.[10:43] (34dbd7f) feat(web): add useSocket hook binding lifecycle to auth token Connects when authenticated, disconnects on logout; exposes connected state.[10:43] (7dcf2fc) feat(web): add socket provider for app-wide single connection[10:44] (46f2b40) feat(web): mount socket provider under snackbar provider Placed below SnackbarProvider so stage 2 notification events can surface as snackbars.[10:44] (5a9ee4a) docs: add day 17 socket connection screenshot[10:57] (a90872a) feat(web): sync realtime events into query cache Listens to movement:created\/statusChanged and inventory:updated, invalidating matching query keys (200ms coalesce absorbs bursts). notification events surface via snackbar. Gün 16 mutation invalidations kept — measured, no duplicate-fetch cost.[10:57] (170a662) feat(web): wire realtime sync into socket provider[10:57] (5f00bf3) test: add two-tab realtime verification script Drives tab A via the API so tab B's updates can only come from socket events — no mutation onSuccess can mask a broken socket.[10:57] (330eed8) docs: add day 17 realtime sync screenshots[11:13] (4586b3e) feat(api): add low-stock threshold-crossing helper crossedBelowThreshold(previous, new, threshold): true only on a new crossing (previous above, new at-or-below), and never when threshold <= 0 (unset). Uses <= to match the findAll(lowStock) filter so the notification boundary and the low-stock list agree.[11:13] (cc119d0) feat(api): emit low-stock notification on manual adjust After adjustInventory, if the new quantity newly crosses minThreshold, emit a LOW_STOCK notification. previousQuantity lifted out of the transaction for the check; reuses the existing best-effort emit try\/catch.[11:13] (d447bea) feat(api): emit low-stock notification on transfer ship Per shipped item, collect source-branch quantities that newly cross the threshold and emit LOW_STOCK after commit via emitToTenant. Added product\/branch include for the message text.[11:13] (c23e756) test: add low-stock notification verification script Verifies new-crossing emits, no re-emit when already low, ship-path emit and tenant isolation. Measures at the socket wire level to avoid MUI Snackbar DOM residue false-positives.[11:14] (bdae743) docs: add day 17 low-stock notification screenshot[11:29] (20fea05) feat(web): add dashboard stats hook deriving kpis from existing queries Consumes the branches\/products\/movements\/inventory query keys so stage 2's invalidation updates the dashboard automatically — no extra socket wiring. KPI sources are role-aware: metrics a role cannot fetch are hidden rather than shown as fake zeros.[11:30] (4a6da41) feat(web): populate dashboard with live kpis and lists Replaces the Gün 14 placeholder: four KPI cards, recent transfers with status chips, and a low-stock list — all real data, live-updating via realtime sync. Low-stock scope follows the inventory screen's own-branch pattern for branch-scoped roles.[11:30] (b1bc64f) feat(web): add dashboard kpi card and list components[11:31] (d6227da) test: add dashboard realtime verification script Confirms KPI counts and recent-transfers\/low-stock lists update live when actions are driven via the API in another context.[11:31] (2957a77) docs: add day 17 live dashboard screenshots[15:03] (901aab1) docs: add day 17 build and lint outputs Co-Authored-By: Claude Opus 4.8 [15:32] (fcea05a) chore(api): add musl binary target for prisma in docker Added linux-musl-openssl-3.0.x alongside native so the Prisma query engine works in Alpine containers. Generator-only change, no migration; native keeps local dev intact.[15:32] (17de433) chore: add dockerignore excluding node_modules, dist, mobile and docs Recursive **\/ patterns so nested workspace node_modules\/dist stay out of the build context; .env.example kept for reference.[15:32] (b29c95f) chore: add multi-stage api dockerfile Builder installs only the api workspace subtree (pnpm --filter @stockroute\/api...) and builds shared-types + api explicitly, keeping web-only packages out. Runner on node:20-alpine with openssl for the musl Prisma engine. CMD runs migrate deploy + seed (idempotent upsert) + start at container boot. Image trimmed 1.17GB → 956MB; ts-node retained for runtime seed (documented tradeoff).[15:44] (2abbcfc) chore(web): add nginx config with spa fallback and api\/socket proxy try_files serves index.html for client-side routes. \/api and \/socket.io reverse-proxy to the api container with WebSocket upgrade headers so socket.io runs over a real WS connection (no polling fallback). proxy_redirect rewrites backend absolute redirects to \/api-relative.[15:44] (9d4d2b8) chore(web): add multi-stage web dockerfile with nginx serve Builder installs only the web workspace subtree and builds shared-types (needed for tsc -b type resolution, not just Vite bundling) before the web build. Vite env baked relative (VITE_API_URL=\/api, empty socket url) for single-origin via the nginx proxy. nginx:alpine runner carries only dist — 94MB image.[15:56] (b2fe2b2) chore: add docker-compose for db, api and web Postgres with pg_isready healthcheck; api waits on condition: service_healthy before migrate deploy + seed + start. Web builds with relative Vite args for single-origin through the nginx proxy. Host db port 5433 avoids clashing with a local Postgres; restart: unless-stopped for demo resilience. Verified from scratch: down -v → build --no-cache → up brings the whole system (including container WebSocket) up in one command.[15:56] (e8b3bba) test: add docker end-to-end verification script and outputs Verifies from-scratch bring-up: healthcheck ordering, migration, idempotent seed, login through the proxy, live dashboard and container WebSocket (101 Switching Protocols on origin :5173).[16:13] (7c8dd28) docs: align readme with docker setup and fix db port Corrected DATABASE_URL from 5432 to 5433 (compose maps the db to host 5433 to avoid clashing with a local Postgres) — the old value broke dev-mode setup. Added demo credentials, auto-seed note, docker single-origin\/reverse-proxy architecture, and a dev-vs-docker env warning. Every documented command verified against a from-scratch bring-up.[16:13] (d20e13f) chore: fix db port to 5433 in root env example Matches the compose host port mapping; note added explaining why.[16:13] (09ca7af) chore(api): fix db port to 5433 in api env example"
},
{
"day": 18,
"date": "2026-07-23",
"content": "Bugün projenin mobil ayağına başladım. Şimdiye kadar sistem yalnızca web tarayıcısından kullanılabiliyordu; bugünden itibaren saha personelinin telefondan erişebileceği bir uygulama iskeleti oluştu.Başlangıç Durumu ve KurulumMobil klasörü projenin ilk günlerinde temel bir Expo iskeleti olarak oluşturulmuştu, ancak içi büyük ölçüde boştu — navigasyon, tema, kimlik doğrulama ve API bağlantısı yoktu. Bugün bu eksikleri tamamladım.İlk iş, mobil uygulamanın paylaşılan paketleri (tip tanımları ve tasarım token'ları) kullanabilmesini sağlamaktı. React Native'in paketleyicisi Metro, projede kullandığımız paket yöneticisinin (pnpm) sembolik bağlantı yapısıyla varsayılan olarak sorun yaşayabiliyor. Yapılandırmayı ayarladıktan sonra bir ayrıntıyı fark ettim: Expo'nun resmi dokümanında önerilen bir ayarı açtığımda paket çözümlemesi bozuluyordu, kapalı bıraktığımda çalışıyordu. Bu ayarı kapalı bırakarak sorunu paket dosyalarına hiç dokunmadan çözdüm.Uygulamanın simgesini (app icon) ve açılış ekranını (splash) marka klasöründeki logodan türettim. Kaynak görselin kenarlarında şeffaf boşluk vardı; içeriği kırpıp marka renginde bir zemine ortalayarak Expo'nun beklediği boyutlarda üç ayrı görsel ürettim.Kimlik DoğrulamaWeb tarafında çözdüğüm giriş akışını mobile uyarladım, ancak iki önemli fark vardı:Token saklama: Web'de tarayıcının yerel deposu (localStorage) kullanılıyordu. Mobilde böyle bir şey yok; bunun yerine cihazın şifreli güvenli deposunu (Keychain\/Keystore) kullandım. Giriş bilgisi hassas olduğu için düz metin saklamak yerine şifreli depo tercih ettim.Eşzamansız veri okuma: Tarayıcıdaki depo anında okunurken, mobildeki depo eşzamansız çalışıyor. Yani uygulama açıldığında \"kullanıcı giriş yapmış mı?\" sorusunun cevabı bir süre bilinmiyor. Bu süre içinde yönlendirme yapılırsa, giriş yapmış kullanıcı bile bir an login ekranını görüyor. Bunu önlemek için depo okuması tamamlanana kadar marka renginde bir yükleme ekranı gösterip, ancak ondan sonra yönlendirme yapan bir yapı kurdum.Ayrıca web'de daha önce karşılaştığım bir hatayı baştan engelledim: yetkisiz istek (401) durumunda kullanıcıyı çıkışa yönlendiren mekanizma, giriş isteğinin kendi hatasını da yakalarsa yanlış şifre girildiğinde sonsuz döngü oluşuyor. Giriş isteğini bu kuralın dışında tuttum.Stok Listesi Ekranı (Plandan Öne Çekildi)İskelet kurulumu beklediğimden sorunsuz geçtiği için, normalde ertesi güne planlanmış olan şube stok listesi ekranını da bugün yaptım. Böylece yarın yalnızca barkod tarama işine odaklanabileceğim.Ekran, tasarım mockup'ına uygun olarak: şube seçimi, ürün arama, üç adet özet istatistik (toplam ürün, düşük stok, kategori sayısı) ve ürün listesi içeriyor. Stoğu minimum eşiğin altındaki ürünler kırmızıyla vurgulanıyor. Mobil kullanıcıların alışkın olduğu \"aşağı çekip yenileme\" hareketini de ekledim.Burada web tarafındaki bir kararı korudum: şube listesini görme yetkisi olmayan roller (depo ve saha personeli) şube seçici görmüyor, doğrudan kendi şubelerinin stoğunu görüyorlar. Böylece iki platform aynı mantıkla çalışıyor.Karşılaştığım SorunlarEksik yardımcı paket: Giriş ekranını yazdıktan sonra uygulama açılmayıp kırmızı hata ekranı verdi. Derleyicinin ihtiyaç duyduğu bir yardımcı paket, paket yöneticisinin iç deposunda kalmış ve erişilemiyordu. Bu paketi açıkça bağımlılık olarak tanımlayarak çözdüm — Expo projelerinde bilinen bir çözüm.Tip tanımı dosyasının silinmesi: Expo, bazı işlemlerde kendi ürettiği bir tip tanımı dosyasını siliyor ve bu, tip kontrolünü kırıyordu. Kendi tanım dosyamı yazarak bu belirsizliği ortadan kaldırdım.Kod denetleyicisi hiç çalışmıyormuş: Mobil klasörünün lint yapılandırması, var olmayan bir dosya yolunu işaret ediyordu. Yani bugüne kadar mobil tarafta kod denetimi hiç yapılmamış. Web ve API tarafındaki yapılandırmayla aynı hale getirerek düzelttim.Günün En Öğretici Kısmı: Beklenmedik Bir RegresyonGünün sonunda her şeyi doğrularken web tarafının derlenmesinin bozulduğunu fark ettim. Mobil için eklediğim paketler, doğrulama kütüphanesinin (zod) sürüm çözümlemesini kaydırmıştı: web sürüm 4'e ihtiyaç duyarken, artık sürüm 3'ü buluyordu.Önce bunun gerçekten benim değişikliğimden mi kaynaklandığını doğruladım — projenin ana dalını ayrı bir kopyada test ettim ve orada derlemenin sorunsuz olduğunu gördüm. Yani sorunu ben tetiklemiştim.Kök nedeni araştırınca ilginç bir durum çıktı: web'in kullandığı bir form kütüphanesi, zod'a ihtiyaç duyduğunu resmi olarak beyan etmiyordu. Beyan olmayınca paket yöneticisi \"ortalıkta ne varsa onu kullan\" moduna geçiyor ve yanlış sürümü veriyordu.Birkaç yaklaşım denedim, sonunda doğru çözümü buldum: paket yöneticisine \"bu kütüphanenin zod'a ihtiyacı var\" bilgisini dışarıdan tanımlattım. Böylece her paket kendi ihtiyaç duyduğu sürümü alıyor, tesadüfe kalmıyor. Uygulama kodlarına hiç dokunmadan, yalnızca proje yapılandırmasıyla çözüldü.DoğrulamaUygulamayı gerçek bir Android emülatöründe çalıştırıp test ettim. API'yi de önceki gün hazırladığım Docker kurulumundan besledim; emülatörden konteynerdeki API'ye bağlantı sorunsuz çalıştı. Giriş, oturumun kalıcılığı (uygulamayı kapatıp açınca giriş korunuyor), stok listesi, arama, çıkış ve hatalı şifre senaryolarını görsel olarak doğruladım.Ayrıca web ve API tarafında bozulma olmadığını da kontrol ettim — regresyon düzeltmesinden sonra ikisi de temiz.Neler ÖğrendimAynı problemin farklı platformlarda farklı çözümü olabiliyor. Giriş akışı kavramsal olarak web'dekiyle aynıydı ama depolama eşzamansız olduğu için tamamen farklı bir yükleme mantığı gerekti. \"Web'de böyle yapmıştım\" demek her zaman yeterli olmuyor.Bir paket eklemek başka bir yeri bozabiliyor. Mobil için eklediğim bağımlılıklar, hiç ilgisi olmayan web tarafının derlenmesini kırdı. Tek bir uygulama üzerinde çalışıyor gibi görünsem de aslında paylaşılan bir bağımlılık ağacına dokunuyorum. Bu yüzden her günün sonunda tüm projeyi doğrulamak gerekiyor.Sorunun kendinden kaynaklandığını kanıtlamak önemli. Hatayı görünce \"belki zaten böyleydi\" diye geçiştirebilirdim. Ana dalı ayrı bir kopyada test ederek regresyonu benim tetiklediğimi kanıtladım; bu, doğru çözümü aramaya odaklanmamı sağladı.Semptomu bastırmak yerine nedeni düzeltmek. Sürüm sorununu geçici hilelerle susturabilirdim, ama eksik olan şey bir paketin bağımlılık beyanıydı. Onu tamamlayınca sorun kökten çözüldü.Gün Sonu DurumuMobil uygulama artık çalışır durumda: saha personeli telefondan firma koduyla giriş yapabiliyor, kendi şubesinin stok durumunu görebiliyor, arama yapabiliyor ve çıkış yapabiliyor. Oturum uygulama kapatılsa bile korunuyor.Stok listesini bugüne çektiğim için yarın (Gün 19) yalnızca barkod tarama özelliğine odaklanacağım. Sonraki gün ise transfer teslim alma ve gerçek zamanlı bildirimler kalacak.Git Commit Mesajları:[10:10] (35e8a10) chore(mobile): add state, form, http and secure storage dependencies ui-tokens, zustand, tanstack-query, axios, react-hook-form, zod, expo-secure-store, vector-icons. RN aligned to 0.76.9 per expo install --check.[10:11] (0924bcb) chore(mobile): add metro and babel config for pnpm monorepo watchFolders + nodeModulesPaths resolve workspace packages. Hierarchical lookup left enabled on purpose — disabling it breaks pnpm's nested .pnpm symlinks (expo-router → @expo\/metro-runtime). Verified: shared-types and ui-tokens both land in the bundle.[10:11] (346bf7c) fix(mobile): resolve shared eslint config correctly Config pointed at a non-existent subpath (@stockroute\/config\/.eslintrc.js), so lint never actually ran in apps\/mobile. Aligned with the web\/api pattern using require.resolve.[10:11] (491b389) chore(mobile): add env example with api url and platform defaults EXPO_PUBLIC_API_URL with notes: Android emulator 10.0.2.2, iOS simulator localhost, physical device LAN IP.[10:15] (e3b44e8) feat(mobile): add theme sourced from ui-tokens Colors, spacing, radius and statusColors derived from @stockroute\/ui-tokens so mobile and web share one visual language. No hardcoded hex.[10:18] (8ad1422) feat(mobile): add app icon, adaptive icon and splash from brand asset Derived from docs\/brand\/stockroute-icon-1x1.png: content cropped and centered on the #2563EB brand background. icon 1024², adaptive foreground with safe-zone padding, splash 1284×2778.[10:26] (3684450) chore(mobile): consume theme and shared-types in stock placeholder Temporarily renders theme colors and UserRole values to prove monorepo package resolution in the Metro bundle; replaced with the real stock list in a later stage.[10:27] (dd4c1bd) docs: add day 18 stage 1 bundle evidence and app screenshots[11:47] (385c146) chore(mobile): add @babel\/runtime as explicit dependency The dev transform for login.tsx resolves @babel\/runtime helpers, which pnpm keeps only in the .pnpm store. Declaring it explicitly is the standard fix for Expo\/RN in pnpm monorepos; no workspace package files touched.[11:50] (f578b81) chore(mobile): add own env type declarations Expo deletes expo-env.d.ts in some flows, breaking process.env typecheck; local declarations make it deterministic.[11:51] (0760921) feat(mobile): add axios api client with bearer token and 401 handling baseURL from EXPO_PUBLIC_API_URL, falling back to platform defaults (Android 10.0.2.2, iOS localhost). Response interceptor logs out on 401 but skips \/auth\/login's own 401 (web Gün 14 lesson — avoids a retry loop on a wrong password). Redirect is left to the route guard.[11:51] (3165fca) feat(mobile): add persisted auth store backed by secure-store Zustand persist with a SecureStore adapter (Keychain\/Keystore-encrypted). Holds accessToken, user (including branch) and tenantSlug. Exposes hasHydrated so the route guard can wait for async rehydration instead of redirecting early; the flag itself is excluded from persistence.[11:51] (9983490) feat(mobile): add zod login schema with turkish messages[11:54] (3af909b) feat(mobile): add useLogin mutation hook Posts to \/auth\/login then fetches \/auth\/me to fill the user's branch; a failing \/me does not invalidate an otherwise successful login.[11:54] (3d60a69) feat(mobile): add logo component[12:00] (a855b8b) feat(mobile): add login screen Follows plan §12.2: logo, firma kodu \/ e-posta \/ şifre, full-width submit with loading state. KeyboardAvoidingView, autoCapitalize=\"none\" on email and slug, secureTextEntry, returnKeyType field traversal. Turkish zod errors and a 401 message. Colors from theme tokens.[12:03] (de04774) feat(mobile): mount query client provider at the root[12:03] (e17aa93) docs: add day 18 login and persistence screenshots[14:41] (83882ba) chore(mobile): add gitignore for expo build output and secrets Excludes .expo\/, dist\/, metro cache, native signing keys and .env files; only .env.example is tracked.[14:42] (ae4257f) chore(mobile): drop generated expo type references from tsconfig expo-env.d.ts and .expo\/types are regenerated (and sometimes deleted) by Expo, which made typecheck non-deterministic. Own declarations in src\/types\/env.d.ts cover process.env instead.[17:59] (5f96f8b) feat(mobile): add auth guard waiting for store hydration useProtectedRoute shows a branded loading state while the persisted store rehydrates, then redirects based on the current segment — no early navigation before auth state is known.[18:00] (f297c0a) feat(mobile): add bottom tab navigation Stok \/ Tara \/ Transferler with Ionicons, active color from theme primary.[18:00] (b385f82) refactor(mobile): move login redirect into the root guard Removed the screen-level Redirect so navigation happens in one place, avoiding a double-redirect race.[18:00] (a5892b2) feat(mobile): add inventory and branch response types[18:00] (df6e28e) feat(mobile): add useDebounce hook for search input[18:00] (83f2de2) feat(mobile): add useInventory query hook[18:01] (0686f0f) feat(mobile): add initials avatar component[18:08] (cea91b8) feat(mobile): add branch stock list screen Follows the mobile-stok mockup minus the barcode button (day 19). Branch source is role-aware, mirroring the web inventory screen: roles that can list branches get a picker, warehouse\/field staff see their own branch fixed. Client-side search over name and SKU (300ms debounce), three summary stats, low-stock rows highlighted at quantity <= minThreshold, pull-to-refresh, and distinct empty states for no-branch \/ no-stock \/ no-search-result.[18:08] (072a60d) chore(mobile): add overlay token to theme Replaces a hardcoded rgba value in the branch picker modal.[18:08] (a8008de) docs: add day 18 stock list, logout and 401 screenshots[18:59] (17503e3) fix(monorepo): declare zod peer for @hookform\/resolvers Adding the mobile dependencies shifted pnpm's fallback zod from 4 to 3 (the api's Scalar packages pull zod@3), which broke the web build: @hookform\/resolvers@5.4.0 requires zod\/v4\/core without declaring zod as a peer, so it fell through to the hoisted zod@3. Declaring the peer via pnpm.packageExtensions makes pnpm inject each importer's own zod (web→4, mobile→3) instead of relying on fallback resolution. Verified against main in a worktree that this was a regression introduced today; no api or web source touched.[18:59] (4ae5480) docs: add day 18 final verification outputs typecheck, lint, expo export, web build and api test results plus the consolidated summary.[18:59] (7b64662) docs: add day 18 app screenshot after the dependency fix"
},
{
"day": 19,
"date": "2026-07-24",
"content": "Bugün mobil uygulamanın iki ana özelliği tamamlandı: barkod tarama ve gelen transferlerin teslim alınması. Barkod işi planlanandan hızlı ilerlediği için, normalde son güne bırakılmış olan transfer teslim ekranı da bugüne çekildi.Barkod TaramaKamera ve izinler. Expo'nun kamera modülü kuruldu. Kamera izni üç ayrı durumda ele alındı: izin henüz istenmemiş, reddedilmiş ama tekrar sorulabilir, kalıcı olarak reddedilmiş. Son durumda kullanıcı doğrudan uygulama ayarlarına yönlendiriliyor.Kamera görünümü, tasarım mockup'ından ölçülerek yapıldı: vizör çerçevesi ekran genişliğinin %63'ü, köşelerde L şeklinde işaretler, ortada dikey olarak hareket eden tarama çizgisi. Fener (torch) desteği de eklendi.Sekme değiştirildiğinde kameranın gerçekten kapandığını işletim sistemi seviyesinde doğruladım — pil tüketimi ve gizlilik açısından önemli bir davranış.Tarama akışı. Barkod okunduğunda ürün sorgulanıyor ve sonuç kartında ürün adı, SKU ve o şubedeki stok miktarı gösteriliyor. Ele alınan durumlar: ürün bulundu, stok düşük (kırmızı vurgu), bu şubede stok kaydı yok, şube seçilmemiş, barkod bulunamadı (404), bağlantı hatası. Başarılı okumada ve hatada farklı titreşim geri bildirimleri verildi.Tekrar tarama koruması. Kamera saniyede onlarca kare işlediği için, koruma olmasa aynı barkod için yüzlerce istek giderdi. Sonuç kartı açıkken kamera dinleyicisi durduruluyor. Bunu veritabanı sorgu logu ile ölçtüm: kart 20 saniye açık kaldı, kamera bu sürede yaklaşık 600 kare işledi, sunucuya yalnızca 1 sorgu gitti.Miktar verisinin kaynağı. Ürün sorgusu stok miktarı döndürmüyor ve envanter endpoint'i ürün bazlı filtreleme kabul etmiyor. Bu yüzden miktar, stok ekranının zaten önbelleğe aldığı envanter listesinden ürün kimliğiyle eşleştiriliyor. Ek fayda: düşük stok eşiği de aynı kayıttan geldiği için renklendirme ekstra istek gerektirmiyor.Gelen Transferler ve Teslim AlmaYolda (IN_TRANSIT) durumundaki, hedefi kullanıcının şubesi olan transferler listeleniyor. Her transferde onaylı bir \"Teslim Al\" akışı var; teslim alınınca hedef şubenin stoğu artıyor.Yakalanan tuzak. Sunucudaki şube filtresi, şubenin kaynak veya hedef olduğu tüm transferleri döndürüyor. Yani bu şubeden çıkan sevkiyatlar da teslim listesinde görünürdü — kullanıcı kendi gönderdiği malı teslim almaya çalışırdı. Bunu servis kodunu okuyarak fark ettim ve istemci tarafında hedef şubeye göre ayrıca filtreledim. Doğruluğunu kanıtlamak için ters yönde bir transfer oluşturdum: sunucu 2 kayıt döndürdü, ekranda 1 kart göründü.Uçtan uca doğrulama. Kısayol kullanmadan gerçek yaşam döngüsünü işlettim: transfer oluştur → onayla → sevk et → mobilden teslim al. Teslim sonrası hedef şubenin stoğu beklendiği gibi arttı (Kahve 65→95, Çay 120→165). Çay'daki artışın beklenenden 5 eksik olmasının sebebi, filtre testi için oluşturduğum ters yön transferinin sevk edilirken aynı stoktan 5 düşürmesiydi — aritmetik doğrulandı.Bağlantı Hatası SüresiUygulamanın HTTP istemcisinde zaman aşımı ayarı yoktu; sunucu erişilemezken hata ekranı yaklaşık 50 saniye sonra çıkıyordu. Mobilde bu, uygulamanın donduğu izlenimi veriyor.10 saniyelik zaman aşımı eklendi ve sorgu tekrar deneme sayısı 1'e indirildi — ikincisi olmasa varsayılan 3 deneme düzeltmeyi boşa çıkarırdı. Bekleme süresi ~50 saniyeden ~12-25 saniyeye indi.Bu iş sırasında ilk yaklaşımımın yanlış olduğunu fark ettim: zaman aşımı hatası için ayrı bir mesaj dalı yazdım ama ekranda hiç görünmedi. Cihazdan gerçek hatayı loglayınca sebebi anladım — React Native'in ağ katmanı, erişilemeyen sunucuyu kendi sayacı dolmadan farklı bir hata koduyla sonlandırıyor. Aynı istek masaüstünde beklediğim kodu veriyordu; yani ortam farkı vardı. Doğrulamasaydım hiç çalışmayacak bir kod dalı bırakmış olacaktım. Üç hata kodunu tek bir bağlantı hatası dalında birleştirdim.Test Verisi OnarımıStok listesinde ürün adları bozuk görünüyordu (�ay 1kg). Ham baytlara baktığımda karakterin bozulmadığını, tamamen yok edildiğini gördüm — geri döndürülemez bir kayıp.Sebep, önceki gün test verisini PowerShell üzerinden göndermemdi: gövde sistem karakter setine düşürülünce Türkçe karakterler kayboluyor. Kayıp gönderim anında olmuş, veritabanı veya API kusuru değil.Dört alan API üzerinden düzeltildi. Tekrarı önlemek için istek gövdesini önce UTF-8 dosyaya yazıp öyle gönderdim; böylece veri hiçbir noktada kabuk kodlamasına maruz kalmadı.DokümantasyonREADME güncellendi; kapsam kararları ve gelecek iyileştirmeler bölümü yeniden düzenlendi.Doğrulanamayan SınırlarKameranın barkodu optik olarak okuması test edilemedi. Emülatörün arka kamerası yapay bir 3B sahne gösteriyor; ekrandaki bir barkodu kameraya göstermek mümkün değil. Okuma sonrasındaki tüm akış gerçek koşullarda doğrulandı, ancak \"barkod okutup test ettim\" demiyorum. Aynı şekilde titreşim ve fener ışığı, emülatörde ilgili donanım bulunmadığı için doğrulanamadı.Neler ÖğrendimÇözümün çalıştığını varsaymak yerine gözlemlemek gerekiyor. Zaman aşımı için yazdığım hata dalı mantıklı görünüyordu ama o platformda hiç tetiklenmiyordu. Cihazdan gerçek hatayı loglamasaydım, ölü kod bırakmış olacaktım.Sapmayı görmezden gelmemek. Stok artışı beklediğimden 5 eksik çıktığında \"yaklaşık doğru\" deyip geçebilirdim. Farkı hesaplayınca sebebi bulundu ve sayı birebir tuttu. Açıklanamayan küçük sapmalar, genelde anlaşılmamış bir davranışın işareti oluyor.Filtre mantığını okumadan kullanmamak. Sunucudaki şube filtresinin \"kaynak veya hedef\" eşleştirdiğini varsaymasaydım, kullanıcılar kendi gönderdikleri malı teslim almaya çalışacaktı. Parametre adının anlamı, davranışını garanti etmiyor.Ölçüm düzeneği de hatalı olabilir. Tekrar tarama korumasını ilk ölçtüğümde beklenenden fazla sorgu göründü. Zaman damgalarına bakınca sorunun kodda değil, test yönteminde olduğunu anladım. Ölçüm sonucunu sorgulamadan kabul etmek yanlış teşhise götürüyor.Gün Sonu DurumuMobil uygulamanın işlevsel kapsamı tamamlandı: giriş, şube stok listesi, barkod tarama ve transfer teslim alma çalışıyor. 20. gün gerçek zamanlı senkronizasyon, son doğrulamalar ve teslim hazırlığı kalıyor.Git Commit Mesajları:[10:18] (7f7a324) chore(mobile): add expo-camera and expo-haptics Installed via expo install for SDK 52 compatibility. Lockfile change is additive only — no other package's resolution shifted (full regression check in the final stage).[10:18] (3dbcffb) chore(mobile): register expo-camera plugin with permission message Writes NSCameraUsageDescription on iOS and the CAMERA permission on Android.[10:18] (c5ea3a2) feat(mobile): add branch store for the selected branch Kept separate from the auth store: auth answers \"who is the user\", this holds a transient UI selection. Avoids ambiguity about what should survive logout.[10:19] (6aa1aaa) feat(mobile): add useEffectiveBranch as single source of truth Resolves which branch the user is looking at, preserving the day 18 role logic: branch-selecting roles read the store, warehouse\/field staff read user.branch.[10:19] (b7949a0) refactor(mobile): read selected branch from the shared store Replaces local useState so the scanner screen can show quantities for the same branch. Behaviour unchanged.[10:19] (9155431) chore(mobile): add scanner tokens to theme Dark scanner surface and frame colors, following the overlay token pattern from day 18 — no hardcoded hex in screens.[10:19] (12c64bf) feat(mobile): add scanner viewfinder frame Corner markers plus a vertically looping scan line on the native driver so the animation does not compete with the camera feed on the JS thread. Dimensions measured from the mockup: 63% width, 47% aspect, positioned slightly above center to leave room for the result card.[10:19] (fba1c47) feat(mobile): add barcode scanner screen with permission flow CameraView with torch toggle and three permission states: undetermined, denied-but-askable, and permanently denied (opens app settings). Camera is released when the tab loses focus — verified at the OS level via active camera clients. Back button from the mockup omitted: in tab navigation there is no stack to pop.[10:20] (81602d0) docs: add day 19 stage 1 permission and camera screenshots[10:58] (cc0e2a5) feat(mobile): add barcode product lookup hook TanStack Query with enabled gating so the request only fires for a scanned barcode.[10:58] (21dbdce) feat(mobile): add scan result card Follows the mockup: scanned badge, product icon with name and monospace SKU, divider, then the branch quantity. Quantity comes from the cached inventory list matched by productId (GET \/inventory has no productId filter). Low stock is red, matching the stock screen. Distinct states for no stock record and no branch selected. Mockup's cropped second button omitted — no target for it in the plan.[10:59] (48442a1) feat(mobile): wire barcode scanning to product lookup Scan handler locks further reads until the result card closes — verified via postgres statement logging: one trigger, card open 20s with the camera running (~600 frames), exactly one query. Haptics signal success and not-found. The dev-only trigger used for verification is stripped from production bundles (confirmed with --no-bytecode export).[10:59] (840d53d) docs: add screenshot after fixing mangled product names Day 18 test data was sent through PowerShell 5.1, which downgraded the body to the system ANSI codepage and replaced Ç\/Ş\/İ\/ı with U+FFFD — unrecoverable, so the records were re-sent via PATCH with a UTF-8 file body.[10:59] (8727fdb) docs: add day 19 stage 2 scan result and error state screenshots[11:55] (f244ceb) feat(mobile): add movement types for the incoming transfers list[11:55] (7c7b2df) feat(mobile): add incoming transfers hook Sends branchId to narrow the server result, then filters client-side by destinationBranchId: the API's branchId matches source OR destination, so outgoing shipments would otherwise appear in the receive list.[11:55] (1a1d7fd) feat(mobile): add incoming transfers screen with receive action Lists IN_TRANSIT movements destined for the effective branch, with confirmation before POST \/movements\/:id\/receive and pull-to-refresh. Field staff only receive here — approve\/ship\/cancel stay on web per plan §12.2. Item rows show count and total quantity rather than product names, since the list response carries only productId.[11:55] (25b3e79) docs: add day 19 stage 3 incoming transfers screenshots and verification[12:30] (7b645d9) fix(mobile): add request timeout and unify connection error handling Without a timeout, requests to an unreachable API hung ~50s. Added a 10s timeout; the error branch handles ECONNABORTED, ETIMEDOUT and ERR_NETWORK together, because React Native's XHR layer aborts unreachable hosts with ERR_NETWORK before axios' own timer fires — a timeout-only branch would have been unreachable code on Android (verified by logging the real error on device).[12:30] (59b4bd0) fix(mobile): add request timeout and unify connection error handling Without a timeout, requests to an unreachable API hung ~50s. Added a 10s timeout; the error branch handles ECONNABORTED, ETIMEDOUT and ERR_NETWORK together, because React Native's XHR layer aborts unreachable hosts with ERR_NETWORK before axios' own timer fires — a timeout-only branch would have been unreachable code on Android (verified by logging the real error on device).[12:32] (cfd1464) refactor(mobile): use shared connection error message across screens[16:41] (1310d3e) docs: add day 19 final verification outputs"
},
{
"day": 20,
"date": "2026-07-27",
"content": "Projenin son geliştirme günü. Bugün iki blok iş yapıldı: mobil uygulamaya gerçek zamanlı senkronizasyon eklendi ve backend tarafında son tutarlılık düzeltmeleri tamamlandı. Ardından tüm sistem sıfırdan uçtan uca doğrulandı.Çalışma SırasıGünü planlarken işleri riskine göre sıraladım. Mobil gerçek zamanlı katman backend'e dokunmuyordu, yani izole bir işti — onu önce yapıp bitirmek güvenliydi. Backend düzeltmeleri ise mevcut testleri kırma ihtimali taşıyordu. Bu yüzden önce mobil tarafı tamamlayıp doğruladım, sonra riskli backend işine geçtim ve her adımdan sonra testleri çalıştırdım.Mobil Gerçek Zamanlı SenkronizasyonWeb tarafında daha önce kurduğum gerçek zamanlı katmanı mobile taşıdım. Uygulama artık sunucudaki stok ve transfer değişikliklerini anlık olarak alıyor.Mobilde web'de olmayan bir sorun vardı: uygulama arka plana alındığında bağlantı kopabiliyor ve o sırada gerçekleşen güncellemeler kaçıyor. Bunu çözmek için uygulama öne geri döndüğünde bağlantıyı yenileyip ilgili verileri baştan çeken bir mekanizma kurdum — böylece arka plandayken kaçırılan olaylar telafi ediliyor.Bildirimler için de mobile özel bir karar verdim: web'deki gibi bir snackbar mobilde yok, o yüzden üstten inip otomatik kapanan bir banner ile kısa bir titreşim kullandım.Gerçek zamanlı çalışmayı iki yönlü olarak canlı doğruladım. Emülatörde giriş yaptım, web panelinden bir transfer sevk ettim ve telefonun ekranına dokunmadan transferin listede belirdiğini gördüm. Ters yönde de test ettim: telefondan bir transferi teslim aldım ve web tarafında durumun anında değiştiğini, hedef şubenin stoğunun arttığını doğruladım.Backend Son RötuşlarıDört düzeltme yaptım. Her birinden sonra test paketini çalıştırdım; 58 testin tamamı baştan sona korundu, tek bir test bile kırılmadı.Standart hata formatı. API'nin döndürdüğü hatalar tutarsızdı. Tüm hataları ortak bir zarfa oturtan bir katman ekledim — artık her hata durum kodu, mesaj, hata tipi, istek yolu ve zaman damgası içeriyor. Beklenmeyen hatalarda sunucu iç detaylarının sızmamasına dikkat ettim.Türkçe doğrulama mesajları. Form doğrulama hataları İngilizce dönüyordu (örneğin \"password must be longer than...\"). Arayüzün geri kalanı Türkçeyken bu tutarsızdı. On adet veri şemasındaki tüm kuralları Türkçeleştirdim.Silme hatası düzeltmesi. İlişkili bir kaydı (örneğin stoğu olan bir ürünü) silmeye çalışmak \"sunucu hatası\" (500) döndürüyordu. Oysa bu öngörülebilir bir kullanıcı durumu. Bunu anlamlı bir \"çakışma\" hatasına (409) çevirdim: \"Bu kayıt başka kayıtlarla ilişkili olduğu için silinemez.\" Kök nedeni araştırırken silme metotlarının hata yakalama bloğu içermediğini, yani hatanın hiç işlenmeden dışarı çıktığını fark ettim; sadece hata eşlemesine ekleme yapmak yetmezdi, silme metotlarını da doğru yerden geçirmem gerekti.Pasif kayıt filtresi. Pasife alınan ürünler operasyonel listelerde görünmeye devam ediyordu. Bu listeleri yalnızca aktif kayıtları döndürecek şekilde filtreledim. Yönetim listelerine dokunmadım — çünkü yöneticinin pasif kayıtları görüp tekrar aktifleştirebilmesi gerekiyor.Uçtan Uca DoğrulamaSon adım, tüm sistemi sıfırdan ayağa kaldırıp gerçek bir kullanım senaryosunu baştan sona işletmekti — teslimde yapılacak gösterimin provası.Veritabanını ve önbelleği tamamen silip tek komutla (docker compose up --build) sistemi kurdum. Ardından tam akışı işlettim: web'den giriş, şube ve ürün oluşturma, stok girişi, transfer oluşturup onaylama ve sevk etme, telefondan teslim alma (ve web'de durumun anlık değişmesi), barkod tarama, son olarak düşük stok tetikleyip hem web hem telefonda bildirimin geldiğini görme. Yedi adımın tamamı sorunsuz çalıştı.Ayrıca bugün eklediğim backend düzeltmelerinin canlı sistemde de çalıştığını doğruladım: boş form gönderince Türkçe hata mesajı ve standart zarf, ilişkili ürünü silmeye çalışınca 409, pasife alınan ürünün listeden düşmesi.Dokümantasyon TutarlılığıDün README'yi, bugün yapılacak beş özelliği de kapsayacak şekilde ileriye dönük güncellemiştim — yani doküman bir an için kodun önündeydi. Bugün bu beş maddenin hepsi gerçekten koda girdi ve canlı doğrulandı. Artık README'de anlatılan her şey kodda birebir karşılığını buluyor.Neler Öğrendimİşleri riske göre sıralamak zaman kazandırıyor. İzole ve güvenli olan mobil işi önce bitirip \"kasaya koymak\", sonra riskli backend işine geçmek, bir şey kırılsaydı bile sebebini daraltmayı sağlardı. Rastgele sırayla çalışsaydım, bir hata çıktığında hangi değişiklikten geldiğini bulmak zorlaşırdı.Bir hatayı düzeltirken kök nedene inmek gerekiyor. Silme hatasında yüzeysel çözüm \"hata eşlemesine bir satır eklemek\" gibi görünüyordu, ama asıl sorun hatanın hiç yakalanmamasıydı. Belirtiyi değil nedeni düzeltmek, sorunun tekrar etmesini önledi.Dokümantasyonun kodla uyumlu kalması bir teslim şartı. Dokümanı geçici olarak kodun önünde bırakmak bilinçli bir tercihti, ama teslimden önce ikisinin buluşması gerekiyordu. \"Yazdım ama yapmadım\" durumu, projenin en başındaki hataların tersi olurdu.Sıfırdan kurulum, en dürüst testtir. Kendi makinemde çalışan sistemi görmek yeterli değil; veritabanını ve önbelleği silip tek komutla her şeyin kalktığını görmek, teslimde karşılaşılacak gerçek durumu bugünden görmemi sağladı.Proje Sonu DurumuYirmi günlük süreç tamamlandı. Ortaya çıkan sistem: çok firmalı bir backend API (firma izolasyonu ve rol bazlı yetkilendirme, otomatik testlerle), bir web yönetim paneli, bir mobil saha uygulaması, ve bunların hepsini birbirine bağlayan gerçek zamanlı bir katman. Tüm sistem tek komutla ayağa kalkıyor ve dokümantasyonu kodla tutarlı.Yapılmayan bazı özellikler bilinçli olarak kapsam dışı bırakıldı ve gerekçeleriyle birlikte belgelendi. Böylece hem tamamlanan işin sınırları net, hem de ileride nereden devam edileceği belli.Git Commit Mesajları:[10:11] (b952043) chore(mobile): add socket.io-client Installed via expo install for SDK 52; lockfile change additive.[10:11] (9988c18) chore(mobile): add EXPO_PUBLIC_SOCKET_URL to env example[10:11] (18fe084) feat(mobile): add socket singleton with auth token Reference-counted with a grace period on teardown, mirroring the web fix so a single connection survives re-mounts.[10:20] (942acc4) feat(mobile): add socket provider with app-wide single connection Reconnects and invalidates inventory\/movements queries when the app returns to foreground, so events missed while backgrounded are recovered. Disconnects on logout.[10:20] (d65b744) feat(mobile): sync realtime events into query cache inventory:updated and movement:* invalidate their query keys; notification surfaces as an auto-dismissing top banner with haptics (no snackbar on mobile).[10:21] (2646cc8) feat(mobile): mount socket provider at the root[16:47] (164ac07) docs: add day 20 stage 1 realtime verification outputs Co-Authored-By: Claude Opus 4.8 [17:34] (4a10990) feat(api): add global exception filter with path and timestamp Standardizes the error envelope: statusCode, message, error, path, timestamp. HttpExceptions pass through with their status; unexpected errors become a generic 500 without leaking stack traces. Matches the README error contract.[17:35] (d2734dd) feat(api): register the global exception filter[17:35] (621075c) feat(api): localize login dto validation messages[17:35] (0c12a59) feat(api): localize register-tenant dto validation messages[17:35] (ddddc6a) feat(api): localize branch dto validation messages[17:35] (32138da) feat(api): localize inventory adjust dto validation messages[17:35] (39d7cf4) feat(api): localize inventory filter dto validation messages[17:36] (305a899) feat(api): localize threshold dto validation messages[17:36] (ab086ac) feat(api): localize movement dto validation messages[17:36] (f21f61d) feat(api): localize movements filter dto validation messages[17:36] (233743d) feat(api): localize product dto validation messages[17:36] (b5dcdae) feat(api): localize user dto validation messages[17:38] (6466507) fix(api): return 409 instead of 500 on foreign key delete remove() lacked a try\/catch, so P2003 never reached the error mapping and surfaced as 500. Routed deletes through the mapping helper; FK violations now return 409 with a clear message.[17:38] (e5c9bc2) fix(api): return 409 on foreign key delete for branches[17:38] (305a596) feat(api): filter inactive products and return 409 on fk delete GET \/products now returns only active records (operational list); P2003 on delete mapped to 409.[17:38] (56c3bfc) feat(api): filter inactive records from inventory list[17:38] (f903c71) test(api): register global exception filter in e2e setup Filter now runs in the real HTTP flow so the standardized envelope is exercised; existing assertions unchanged.[17:38] (e2f40aa) docs: add day 20 backend polish verification output[18:25] (c093703) docs: add day 20 stage 3 end-to-end verification outputs[18:34] (500e25f) docs: add day 20 final verification outputs[19:14] (190b4a3) docs: showcase real app screenshots and add day 20 outputs"
}
]
},
"25": {
"name": "Eren Kara",
"email": "erenkara1549@gmail.com",
"repo": "https:\/\/github.com\/erenkara0\/Smart-E-Commerce-Assistant",
"github_username": "erenkara0",
"start_date": "2026-07-06",
"end_date": "2026-08-15",
"total_days": 30,
"filled_days": 30,
"entries_sample": {
"first": {
"day": 1,
"date": "2026-07-06",
"content": "On the first day of the internship, the topic for the project was determined. A RAG-based smart assistant project, designed to generate responses based on store data for use in micro-export and e-commerce processes, was planned. To ensure the technical scope and development process proceed systematically, an implementation_plan.md file was created. This document broadly outlines the technologies to be utilized, the system architecture, and the upcoming development phases. By the end of the day, the project concept was successfully finalized, and a foundational roadmap for the development process was established.Git Commit Mesajları:[18:05] (7c5751d) Initial commit[21:48] (ab95971) docs: add implementation_plan.md[21:58] (c241da9) docs: add implementation_plan.md[22:20] (f694aba) Merge branch 'main' of https:\/\/github.com\/erenkara0\/Smart-E-Commerce-Assistant"
},
"middle": {
"day": 16,
"date": "2026-07-28",
"content": "I finalized the project’s v1.0.0 release, completed the GitHub release process, and planned the next development phase. I decided to continue the project as an assistant for a single e-commerce store and selected Excel as the main product data source.Git Commit Mesajları:[02:11] (bc1a2e4) Merge pull request #74 from erenkara0\/final-project-delivery docs: prepare final project delivery"
},
"last": {
"day": 30,
"date": "2026-08-17",
"content": "Today I made the app demo-ready. I found the local database had lost its schema, so I reset it, reran migrations, and re-imported the product catalog. I also caught a critical bug: the similarity threshold for search results was too strict for real embeddings, so relevant products were being filtered out and the assistant wrongly said \"no results.\" I lowered the threshold, committed the fix, and verified end to end that real queries now return correct recommendations while out-of-scope questions are handled honestly.Git Commit Mesajları:[19:52] (baca503) fix: lower retrieval score threshold to match real embedding similarity range"
}
},
"full_text_length": 26765,
"all_entries": [
{
"day": 1,
"date": "2026-07-06",
"content": "On the first day of the internship, the topic for the project was determined. A RAG-based smart assistant project, designed to generate responses based on store data for use in micro-export and e-commerce processes, was planned. To ensure the technical scope and development process proceed systematically, an implementation_plan.md file was created. This document broadly outlines the technologies to be utilized, the system architecture, and the upcoming development phases. By the end of the day, the project concept was successfully finalized, and a foundational roadmap for the development process was established.Git Commit Mesajları:[18:05] (7c5751d) Initial commit[21:48] (ab95971) docs: add implementation_plan.md[21:58] (c241da9) docs: add implementation_plan.md[22:20] (f694aba) Merge branch 'main' of https:\/\/github.com\/erenkara0\/Smart-E-Commerce-Assistant"
},
{
"day": 2,
"date": "2026-07-07",
"content": "Today, brand and user interface preparation work was carried out for the project. The logo, app icon, color palette, and foundational design system for the MikroAsistan project were created. Additionally, initial mockup designs were prepared for the web chat interface, observability dashboard, Scalar API interface, and mobile chat screen. Project tasks were divided into phases in accordance with the GitHub Kanban structure, and an issue\/milestone system was planned to track the development process. By the end of the day, the project's visual identity, core design documentation, and workflow tracking structure were fully established.Git Commit Mesajları:[14:50] (9d816f6) docs: plan revize edildi[15:24] (9bdf9d4) docs: implementation plan güncellendi[21:00] (8640ca4) docs: add initial project plan, design system and mockups"
},
{
"day": 3,
"date": "2026-07-08",
"content": "Today, the foundational development environment for the project was successfully set up. The monorepo structure was organized to clearly define and separate the backend and frontend directories. For the backend, the initial application framework was built using FastAPI, while the frontend development environment was established using Next.js, TypeScript, and Tailwind CSS.To ensure project security, a unified .gitignore file was created in the root directory, preventing .env files, virtual environments, node_modules, .next folders, and local databases from being tracked by Git. Furthermore, an .env.example file was added to serve as a template for the required environment variables. Finally, the root README.md file was updated to thoroughly document the project's objectives, technology stack, directory structure, security guidelines, and development phases.Git Commit Mesajları:[14:07] (ee31efb) chore: initialize project setup and environment configuration"
},
{
"day": 4,
"date": "2026-07-09",
"content": "As part of the M2 milestone for the MikroAsistan project, the core chat endpoint was developed. Request and response schemas were mapped for the POST \/chat endpoint, Scalar API documentation was integrated via the \/scalar route, and API error responses were standardized. Following comprehensive testing—which included validations for empty messages, valid inputs, non-existent endpoints, and the \/docs and \/scalar routes—all changes were appended to the existing M2 API vertical slice PR, and the PR description was updated accordingly.Git Commit Mesajları:[11:04] (382f73f) chore: setup api foundation[16:05] (945888c) feat: add health check endpoint[19:37] (68a22bf) feat: add chat request and response schemas[19:58] (dbf92e1) feat: add basic chat endpoint[20:56] (2cdc360) docs: add Scalar API documentation[22:14] (87ae891) feat: standardize API error responses"
},
{
"day": 5,
"date": "2026-07-10",
"content": "Today, I focused on the product data structure for the project. I created the product_loader.py script to parse sample product data from the products.json file, ensuring that the data is correctly validated against the Product model. Following this, I developed the GET \/products endpoint, enabling the API to return the product list along with the total product count. Testing confirmed that 10 products were successfully loaded and the endpoint is functioning exactly as expected. All developments have been pushed to GitHub, and the corresponding issues have been closed.Git Commit Mesajları:[15:52] (eba3588) feat: add product schema and sample data[17:28] (676fc01) feat: add product data loader[18:03] (db4a276) feat: add products listing endpoint"
},
{
"day": 6,
"date": "2026-07-13",
"content": "Today, I continued working on the M3 milestone of the Smart E-Commerce Assistant project. The main focus was preparing product data for future retrieval and RAG workflows.First, I implemented a product document builder service that converts structured product records into readable text documents. These documents include key information such as product ID, name, category, brand, price, stock, rating, description, and features. This structure makes the product data more suitable for future embedding-based search.Then, I developed an initial in-memory vector store service. This service builds an index from the prepared product documents, stores them temporarily, and provides access to them when needed. Although a real vector database has not been integrated yet, this service provides a foundation for future ChromaDB and semantic search integration.I also added a basic product search mechanism and exposed it through the GET \/products\/search endpoint. The endpoint was tested with the query laptop, and it successfully returned matching product documents with score values.Finally, I updated the README.md and implementation_plan.md files to document the completed M3 progress and the next planned steps for the RAG and vector search structure. The changes were committed, pushed to GitHub, and included in the related pull request.Git Commit Mesajları:[14:03] (e7f842a) feat: add product document builder[15:32] (058d717) feat: add vector store service[15:41] (53b3c3e) feat: add product search endpoint[20:01] (3261a25) docs: update M3 documentation[21:58] (71b4c96) Merge pull request #40 from erenkara0\/m3-product-document-builder M3: Add product document search foundation"
},
{
"day": 7,
"date": "2026-07-14",
"content": "Today, as part of the M4 phase, I focused on the RAG-based response generation infrastructure. First, I refactored the configuration setup to centralize the management of OpenAI, retrieval, and RAG settings. Next, I developed the retrieval context builder service, which retrieves relevant product documentation based on the user's message and processes it into a context format suitable for the chat interface. I then integrated the RAG prompt builder to ensure the generation of controlled prompts derived from both the user's query and the product context.Additionally, the OpenAI client service was established, and the POST \/chat endpoint was integrated with these services to generate natural language responses grounded in product data. Standard fallback mechanisms were also implemented to handle scenarios involving missing context or service errors. Testing confirmed that the system successfully generates accurate responses for product-specific queries (such as laptop recommendations), while appropriately returning a controlled \"insufficient product information found\" message for irrelevant inputs. All changes have been committed and pushed to GitHub, and the corresponding PR has been opened.Git Commit Mesajları:[14:39] (9ee23d2) feat: add RAG configuration settings[15:37] (83c38d2) feat: add retrieval context builder[15:43] (80cfcb6) feat: integrate chat endpoint with retrieval context[15:51] (0bd8c4e) feat: add OpenAI client service[16:00] (d473b44) feat: add RAG prompt builder[16:27] (b16aea0) feat: integrate RAG response generation in chat[16:44] (cc474eb) feat: standardize RAG fallback responses[16:46] (530ad3d) chore: update retrieval result limit[16:48] (3b7b106) chore: update default retrieval limit"
},
{
"day": 8,
"date": "2026-07-16",
"content": "Today, I improved the reliability and maintainability of the OpenAI integration in the Smart E-Commerce Assistant project. I added configurable timeout and retry settings to the backend configuration and documented these parameters in the .env.example file. I also strengthened the openai_client.py service by handling different API error scenarios, including authentication failures, rate limits, request timeouts, connection problems, invalid requests, and server-side errors.In addition, I created centralized and user-friendly fallback responses for each error type and updated the chat endpoint to use these responses consistently. I manually tested the normal RAG workflow, unrelated product queries, and multiple error scenarios to ensure that the system continues to work correctly without exposing technical details or sensitive information to the user. Finally, I committed the changes, pushed them to GitHub, and prepared a pull request for review.Git Commit Mesajları:[00:38] (6258b60) Merge pull request #54 from erenkara0\/m4-rag-context-foundation M4: Add RAG context and answer generation foundation"
},
{
"day": 9,
"date": "2026-07-17",
"content": "Today, I implemented session-based chat memory for the Smart E-Commerce Assistant. I added SQLite-backed message storage, automatic session_id generation, and support for maintaining the same session across multiple chat requests. I also integrated recent conversation history into the RAG prompt and retrieval query so that follow-up questions such as “What is its price?” can be answered using previous messages. After resolving merge conflicts and synchronizing the branch with the latest main changes, I tested the full chat flow through Scalar, verified that conversation history persisted after restarting the backend, committed the changes, and pushed the m4-session-memory branch to GitHub.Git Commit Mesajları:[14:23] (e167dff) feat: add SQLite session memory service[16:20] (3191230) feat: add session-based chat memory"
},
{
"day": 10,
"date": "2026-07-20",
"content": "Today, I completed the remaining M4 observability and documentation tasks for the Smart E-Commerce Assistant project. I integrated LangSmith with the OpenAI client by adding conditional tracing support, endpoint configuration, and the required dependency, then verified the integration by generating and reviewing a real trace containing request, response, latency, and token usage information. I also prepared detailed validation notes for the RAG flow, session-based chat memory, SQLite persistence, OpenAI error handling, and LangSmith monitoring. Finally, I updated the README and implementation plan to reflect the completed M0–M4 milestones, current project structure, backend setup steps, environment variables, API endpoints, session management flow, and remaining planned integrations, and committed the changes to the project branch.Git Commit Mesajları:[14:27] (3e9e2da) feat: add LangSmith observability[14:42] (f5d094c) docs: add M4 RAG and session validation notes[16:16] (4bcf6b7) docs: finalize M4 documentation"
},
{
"day": 11,
"date": "2026-07-21",
"content": "Today, I developed the initial interactive chat interface for the MikroAsistan project and connected it to the FastAPI backend through a Next.js API route. I added message sending, suggested questions, loading and error states, session continuity with session_id, automatic scrolling, and a new chat reset feature. I also refactored the frontend using clean code principles by separating the interface into reusable components, moving chat state and API logic into a custom hook, and defining shared TypeScript types. Finally, I validated the implementation with lint, production build, and functional tests, then prepared the changes for a pull request.Git Commit Mesajları:[14:40] (2eb4aac) feat: add frontend API configuration[14:48] (da7e8c6) feat: add initial chat interface[15:13] (cc3c8c2) feat: add interactive chat message flow[15:41] (4b27c64) feat: add frontend chat API proxy[15:42] (1974124) chore: ignore TypeScript build cache[16:39] (d556233) feat: connect chat interface to backend[16:44] (5c3ea8f) feat: add automatic chat scrolling[18:41] (feecbe7) refactor: split chat interface into reusable components"
},
{
"day": 12,
"date": "2026-07-22",
"content": "Today, I improved the MikroAsistan frontend chat interface by adding Enter-to-send, Shift+Enter for new lines, automatic textarea resizing, and input restrictions during loading. I also enhanced the responsive design for mobile, tablet, and desktop screens, improved message wrapping for long texts and URLs, and prevented horizontal overflow. After completing functional tests for chat flow, session continuity, error handling, scrolling, and responsive behavior, I documented the validation results, updated the README and implementation plan, and prepared the changes for a pull request.Git Commit Mesajları:[14:32] (5b73d62) feat: improve chat input interactions[16:02] (b5630dd) feat: improve responsive chat layout[23:14] (2b73b13) docs: document M5 chat interface validation"
},
{
"day": 13,
"date": "2026-07-23",
"content": "Today, I completed the M6 security and Docker infrastructure work for the MikroAsistan project. I added configurable CORS settings to the FastAPI backend, prevented wildcard origins in production, and verified allowed and rejected origin scenarios. I then created Dockerfiles and .dockerignore files for both the backend and frontend, enabled Next.js standalone output, and tested both containers successfully. Finally, I added a Docker Compose configuration with health checks, persistent SQLite storage, service networking, and runtime environment variables, verified frontend–backend communication, updated the README with Docker usage instructions, and prepared the changes for a pull request.Git Commit Mesajları:[15:49] (7430747) feat: configure backend CORS security[17:31] (eec7f95) feat: containerize frontend and backend[20:33] (7eeaed2) feat: add Docker Compose workflow"
},
{
"day": 14,
"date": "2026-07-24",
"content": "Today, I completed the M7 backend testing milestone by setting up the pytest infrastructure, adding an isolated temporary SQLite database, and creating automated tests for health, root, product, and chat endpoints. I also tested session ID generation and reuse, conversation history, validation errors, missing context, empty model responses, and OpenAI rate limit, timeout, and connection error fallbacks without making real API calls. I updated the deprecated HTTP 422 status constant, documented the testing process and coverage in the README, verified that all 15 tests passed successfully, committed the changes, and pushed the m7-backend-tests branch to GitHub.Git Commit Mesajları:[19:09] (c5a3300) test: set up backend test infrastructure[20:09] (8607f8d) test: add automated API endpoint tests[20:39] (c914dfa) test: add chat session and fallback tests[20:44] (d832f87) docs: finalize backend testing documentation"
},
{
"day": 15,
"date": "2026-07-27",
"content": "Today, I prepared the project for final delivery and demonstration. I reviewed the environment configuration, removed unused variables from the .env.example file, and updated the README with clear backend and frontend setup instructions. I also documented the demo workflow, final validation results, and security notes for API keys. After checking the repository for unexpected generated files, I committed the changes, pushed the final-project-delivery branch to GitHub, and prepared a Pull Request for the final documentation updates.Git Commit Mesajları:[17:50] (e13bfbc) docs: prepare final project delivery"
},
{
"day": 16,
"date": "2026-07-28",
"content": "I finalized the project’s v1.0.0 release, completed the GitHub release process, and planned the next development phase. I decided to continue the project as an assistant for a single e-commerce store and selected Excel as the main product data source.Git Commit Mesajları:[02:11] (bc1a2e4) Merge pull request #74 from erenkara0\/final-project-delivery docs: prepare final project delivery"
},
{
"day": 17,
"date": "2026-07-29",
"content": "I started the M8 Excel Product Data Foundation milestone. I created the milestone, issue, and development branch, defined the product Excel data contract, prepared a reusable .xlsx template with validation rules and example products, documented the import structure and expected behavior, verified the files, and committed the changes.Git Commit Mesajları:[16:20] (95c597d) docs: add product Excel contract and template"
},
{
"day": 18,
"date": "2026-07-30",
"content": "Today, I continued the M8 Excel Product Data Foundation milestone by implementing the backend Excel product parser and validation system. I added the openpyxl dependency, created a dedicated product import schema, and developed a parser that reads the Products worksheet, validates required columns and product fields, ignores empty rows, normalizes values, and detects duplicate product IDs and SKUs. I also added structured row-level error reporting and automated tests for valid and invalid Excel files. All 8 new parser tests passed, and the complete backend test suite reached 23 successful tests. Finally, I committed the changes, pushed the m8-excel-product-parser branch, and prepared the Pull Request.Git Commit Mesajları:[15:30] (c6d3223) Merge pull request #76 from erenkara0\/m8-product-excel-template docs: define product Excel contract and template"
},
{
"day": 19,
"date": "2026-07-31",
"content": "Today, I implemented the product database foundation for MikroAsistan. I added SQLAlchemy and Alembic, created the database engine and session management infrastructure, and defined the product ORM model with unique product ID and SKU constraints. I also added validation constraints for price, stock, and rating, JSON-based feature storage, active product indexes, and timestamp fields. Then, I created and tested the initial Alembic migration without modifying the existing chat session table. I added isolated database tests, verified that all 9 new tests passed, and confirmed that the complete backend test suite reached 32 successful tests. Finally, I committed and pushed the changes and opened a stacked Pull Request linked to the Excel parser PR.Git Commit Mesajları:[01.08.2026 00:04] (159a592) Merge pull request #78 from erenkara0\/m8-excel-product-parser feat: add Excel product parser and validation"
},
{
"day": 20,
"date": "2026-08-03",
"content": "Yesterday, I implemented the product import and upsert workflow for the MikroAsistan project. I added schemas for import results and persistence errors, developed a service to create, update, or keep existing products unchanged in the database, and added validation for duplicate product IDs and SKU conflicts. I also integrated the Excel parser with the database import service so that invalid Excel files do not modify the database. Unit and integration tests were added for all scenarios, and the complete backend test suite passed with 45 tests. Finally, I committed the changes, pushed the branch to GitHub, and opened a pull request.Git Commit Mesajları:[22:29] (ec4599e) Merge pull request #80 from erenkara0\/m8-product-database-foundation feat: add product database foundation[17:12] (336f769) feat: add product import and upsert service[17:26] (ffeebdb) feat: integrate Excel parsing with product import[22:29] (9257c2d) Merge pull request #83 from erenkara0\/m8-product-import-upsert M8 product import upsert"
},
{
"day": 21,
"date": "2026-08-04",
"content": "Today, I implemented an Excel product import API endpoint for the MikroAsistan project. I created issue #84 and a dedicated branch, added multipart file upload support, and developed the POST \/products\/import\/excel endpoint. The endpoint validates .xlsx files, rejects unsupported, empty, or corrupted uploads, and connects the Excel parser with the product import and upsert workflow. I also added a standardized response schema, registered the new route in the FastAPI application, and wrote seven endpoint tests using a temporary SQLite database. All backend tests passed successfully with a total of 52 tests. Finally, I committed the changes, pushed the branch to GitHub, and prepared the pull request.Git Commit Mesajları:[15:00] (bac806d) feat: add Excel product import API endpoint"
},
{
"day": 22,
"date": "2026-08-05",
"content": "Today, I migrated the product listing workflow from a JSON-based structure to a database-backed architecture. I created a product repository to retrieve active products from SQLite using SQLAlchemy, added deterministic ordering by product ID, and developed a query service to map database models to the existing API product schema. I updated the GET \/products endpoint to use the database while preserving the current response format and added support for empty database results. I also improved the test setup with isolated temporary databases, added repository and service tests, and created an end-to-end test verifying that products imported from Excel can be listed through the API while inactive products remain hidden. All backend tests passed successfully, reaching a total of 55 tests. Finally, I committed the changes, pushed the branch, and prepared the pull request.Git Commit Mesajları:[15:58] (db83e30) feat: use database products in listing API[16:08] (31a5414) test: verify imported products in listing API"
},
{
"day": 23,
"date": "2026-08-06",
"content": "Today, I migrated the product search workflow from JSON-based indexing to a database-backed vector search architecture. I refactored the in-memory vector store to make it independent from the data source, created a service that retrieves active products from the database, converts them into searchable documents, refreshes the index, and performs product searches. I updated the GET \/products\/search endpoint to use this new workflow, ensured that inactive products are excluded, empty databases are handled safely, and repeated index rebuilds do not create duplicate documents. I also added service tests and an end-to-end test verifying that products imported from Excel can be found through the search API. All backend tests passed successfully, reaching a total of 60 tests.Git Commit Mesajları:[14:29] (afbc1fb) feat: use database products in vector search"
},
{
"day": 24,
"date": "2026-08-07",
"content": "Today, I improved the database-backed RAG system of the MikroAsistan project. I updated the chat retrieval flow to retrieve product information directly from the database and adapted the related tests.I also added tests for database-based retrieval, inactive product filtering, and the complete Excel import-to-chat RAG flow. Finally, I ran the full backend test suite and successfully reached 63 passing tests.Git Commit Mesajları:[15:50] (2dc0be0) feat: use database retrieval in chat RAG"
},
{
"day": 25,
"date": "2026-08-10",
"content": "Today, I migrated the chat session memory from direct SQLite operations to a SQLAlchemy-based database architecture. I implemented the chat message model and repository layer, updated the chat API to use database sessions, and added database persistence and integration tests. All 70 tests passed successfully, and the changes were committed and pushed to the M9 branch.Git Commit Mesajları:[00:42] (4381765) feat: move chat memory to database"
},
{
"day": 26,
"date": "2026-08-11",
"content": "Today, I reviewed milestone M9 (chat memory database migration) before closing it and found that the ChatMessageModel was not tracked by Alembic, meaning the chat_messages table would not be created on a fresh environment. I fixed this by registering the model with Alembic and adding a new migration to create the table correctly. I verified the fix by running alembic upgrade head and the full test suite, confirming both tables were created and all 70 tests passed. The fix was committed, pushed, and merged into the existing pull request for the M9 branch.Git Commit Mesajları:[16:01] (c679093) fix: add missing chat_messages Alembic migration"
},
{
"day": 27,
"date": "2026-08-12",
"content": "Today, I laid the groundwork for true embedded model-based product search. I added an OpenAI embedded model creation service—which mirrors the error-handling mechanism of the existing OpenAI client—along with a ChromaDB client service that manages persistent connections and the product collection. To support both, I updated the configuration settings, the .env template, and the dependencies. During this process, I identified a mismatch between the environment variable names I initially introduced and those already defined in the actual .env file; I corrected this and also resolved a few Git maintenance issues stemming from working on an old local main branch.Git Commit Mesajları:[19:44] (9319022) feat: add ChromaDB client and OpenAI embedding generation service"
},
{
"day": 28,
"date": "2026-08-13",
"content": "Today's coding work built on yesterday's ChromaDB and embedding services by actually wiring them into product search. The vector store service was rewritten to be Chroma-backed: it generates real OpenAI embeddings for products, upserts them into the collection, and queries by cosine similarity instead of keyword matching. Indexing was decoupled from search, so the app no longer re-embeds the entire product catalog on every query, only when products are imported. Along the way we fixed a path-resolution bug so the Chroma database always lands in the right folder regardless of which directory a command is run from, added a similarity threshold so only genuinely relevant results are returned instead of Chroma's default \"nearest N regardless of relevance\" behavior, and updated the search result score field from an integer to a float to reflect real similarity scores. We also rebuilt the test suite's isolation so tests use a temporary Chroma store and deterministic fake embeddings instead of hitting the real OpenAI API or the real development database, after a genuine test failure revealed both problems. All 70 tests pass, and manual testing confirmed the semantic search returns relevant, well-ranked results.Git Commit Mesajları:[22:57] (72c6fb2) feat: replace keyword search with ChromaDB semantic search"
},
{
"day": 29,
"date": "2026-08-14",
"content": "Today's work hardened the semantic search path against real-world failures. The chat endpoint now wraps the retrieval step in proper error handling, catching both OpenAI embedding failures and ChromaDB errors, and returns a clear fallback message instead of crashing with an unhandled server error. The same protection was added to the direct product search endpoint, which now returns a proper \"service unavailable\" response instead of a 500. We also made the product import flow more resilient: if reindexing fails after a successful import, the import itself still succeeds since the products were already saved, and the reindex failure is just logged. A new set of fallback messages was added specifically for search-related errors, separate from the existing chat-generation fallbacks. Empty queries and no-matching-results cases turned out to already be handled correctly, so no changes were needed there. We added tests covering all of these failure scenarios, and the full suite passes at 77 tests.Git Commit Mesajları:[17:07] (aefe64b) feat: add error handling and edge case tests for semantic search"
},
{
"day": 30,
"date": "2026-08-17",
"content": "Today I made the app demo-ready. I found the local database had lost its schema, so I reset it, reran migrations, and re-imported the product catalog. I also caught a critical bug: the similarity threshold for search results was too strict for real embeddings, so relevant products were being filtered out and the assistant wrongly said \"no results.\" I lowered the threshold, committed the fix, and verified end to end that real queries now return correct recommendations while out-of-scope questions are handled honestly.Git Commit Mesajları:[19:52] (baca503) fix: lower retrieval score threshold to match real embedding similarity range"
}
]
},
"27": {
"name": "ismet can sezgin",
"email": "ismet.can.sezgin96@erzurum.edu.tr",
"repo": "https:\/\/github.com\/ismetcansezgin\/EEG-Flow",
"github_username": "ismetcansezgin",
"start_date": "2026-07-13",
"end_date": "2026-08-07",
"total_days": 20,
"filled_days": 20,
"entries_sample": {
"first": {
"day": 1,
"date": "2026-07-13",
"content": "Subject of Work: Project Scope Definition, Roadmap Design, and Git Repository SetupDetailed Description: On the first day of the internship, the scope, technical requirements, and system architecture of the EEGFlow (EEG Signal Processing and Machine Learning Classification Dashboard) project were defined. While working on biomedical signals like EEG, which are highly sensitive and contain significant noise, one of the most critical challenges is subject-level data leakage. To address this issue, research was conducted on the \"Group K-Fold\" cross-validation method for machine learning model training, ensuring models generalize across subjects rather than memorizing individual differences. Subsequently, Git was chosen as the version control system to ensure project maintainability, and a public repository was created on GitHub. A detailed implementation_plan.md file was prepared, outlining the 20-day project roadmap, technical stack (FastAPI, NumPy, SciPy, Pandas, Scikit-Learn, XGBoost, Vanilla JS), and success criteria. This file was committed as the repository's initial commit. Finally, based on feedback from the internship advisors, the development process was structured into three main phases (Phase 1: Pipeline Design, Phase 2: Feature Engineering, Phase 3: Model and Validation) with associated milestones, and the implementation plan was updated accordingly.Associated Git Commits:\t[13.07.2026 15:15] (dda6b06) feat: initial commit with implementation_plan.md"
},
"middle": {
"day": 11,
"date": "2026-07-28",
"content": "Subject of Work: Feature Engineering Phase: Sliding Window EEG Epoch Segmentation Module and Unit Test CoverageDetailed Description: Initiated Phase 2 (Feature Engineering) by implementing the sliding window EEG segmentation module in backend\/utils\/epoching.py. Developed create_epochs() to transform 1D or 2D EEG arrays into (n_epochs, n_channels, n_samples_per_epoch) 3D matrices based on configurable parameters (window_size_sec and overlap_ratio). Developed create_epochs_from_dataframe() to process tabular CSV inputs while maintaining metadata alignment through majority-vote categorical event labeling and subject identification per temporal window. Created a test suite in tests\/test_epoching.py containing 13 automated unit tests to validate output shapes, mathematical epoch counts, array value fidelity, boundary edge cases, and metadata extraction (13\/13 passed in 1.66s, bringing overall test suite to 42 passed). Opened a Pull Request to branch feature\/day11-epoching.Git Commit Mesajları:[13:37] (2f61846) feat(epoching): add sliding window epoch segmentation module Created backend\/utils\/epoching.py with create_epochs() and create_epochs_from_dataframe(). create_epochs(): Segments 1D\/2D NumPy EEG arrays into (n_epochs, n_channels, n_samples) shape using configurable window_size_sec and overlap_ratio parameters. create_epochs_from_dataframe(): Epochs multi-channel DataFrame, aligns majority-vote event labels and subject_id to each epoch. Returns structured dict with epochs, labels, subjects, n_epochs, and epoch_info metadata. Validated 1D, 2D, and DataFrame inputs produce correct shapes and labels.[16:39] (c42c763) test: add unit tests for sliding window epoch segmentation module Created tests\/test_epoching.py with 13 unit tests for backend\/utils\/epoching.py. Tests verify: 1D\/2D epoch shapes, N_epochs formula correctness, 0% and 75% overlap counts. Tests confirm: first epoch data matches original signal slice exactly (array_almost_equal). Tests validate: ValueError on signal shorter than window and invalid overlap_ratio >= 1.0. Tests check: DataFrame shape, event label majority-vote alignment, subject_id alignment. Tests ensure: epoch_info dict contains all required metadata keys (fs, n_channels, etc.). All 13 tests passed in 1.66s.[17:20] (61839fc) refactor(epoching): optimize dataframe slicing and add float rounding safety Updated window_samples and step_samples calculations to use int(round(window_size_sec * fs)) preventing floating-point truncation issues (addressing Faruk-T review). Converted event and subject_id DataFrame columns to NumPy arrays prior to the epoch loop to improve performance (addressing Faruk-T review). Validated all 42 pytest unit & integration tests pass."
},
"last": {
"day": 20,
"date": "2026-08-10",
"content": "Subject of Work: Full System Test Verification, pytest Path Configuration Fix, and Final Project DocumentationDetailed Description: Executed the complete EEGFlow test suite (108 unit and integration tests) to verify end-to-end system stability before project finalization. Identified and resolved a persistent PYTHONPATH dependency issue that required manual environment variable configuration ($env:PYTHONPATH=\".\") on Windows prior to each pytest session. Created conftest.py at the project root, which automatically inserts the project directory into sys.path at collection time, allowing all 108 tests to pass with a plain pytest command without any prior environment configuration. Finalized README.md by adding a full project directory tree covering all backend utility modules, frontend assets, and test files; a technology stack summary (FastAPI, Scikit-learn, Chart.js); step-by-step virtual environment setup and dependency installation instructions; uvicorn server startup and browser access guidance; cross-platform pytest execution commands; a structured API endpoint reference table covering all 6 REST endpoints; and screenshot gallery placeholders for the Day 19 ML Models training and Group K-Fold Cross-Validation dashboards. Opened the final Pull Request targeting day19-model-ui as Milestone 3 project closeout.Git Commit Mesajları:[13:48] (4388c66) test: add conftest.py to auto-configure pytest sys.pathAdded conftest.py at project root to automatically insert the project root into sys.path.Eliminates the need to manually set PYTHONPATH before running pytest on Windows.All 108 tests passing without any environment variable configuration.[16:39] (4e40020) docs(readme): add installation guide, directory structure, api table and ml screenshotsAdded full project directory tree covering backend, frontend, and tests modules.Documented virtual environment setup, dependency installation, and uvicorn server startup steps.Added pytest execution instructions for Windows and Linux\/macOS environments.Added API endpoint reference table covering all 6 REST endpoints.Added screenshot gallery rows for ML Models training and Cross-Validation dashboards."
}
},
"full_text_length": 54944,
"all_entries": [
{
"day": 1,
"date": "2026-07-13",
"content": "Subject of Work: Project Scope Definition, Roadmap Design, and Git Repository SetupDetailed Description: On the first day of the internship, the scope, technical requirements, and system architecture of the EEGFlow (EEG Signal Processing and Machine Learning Classification Dashboard) project were defined. While working on biomedical signals like EEG, which are highly sensitive and contain significant noise, one of the most critical challenges is subject-level data leakage. To address this issue, research was conducted on the \"Group K-Fold\" cross-validation method for machine learning model training, ensuring models generalize across subjects rather than memorizing individual differences. Subsequently, Git was chosen as the version control system to ensure project maintainability, and a public repository was created on GitHub. A detailed implementation_plan.md file was prepared, outlining the 20-day project roadmap, technical stack (FastAPI, NumPy, SciPy, Pandas, Scikit-Learn, XGBoost, Vanilla JS), and success criteria. This file was committed as the repository's initial commit. Finally, based on feedback from the internship advisors, the development process was structured into three main phases (Phase 1: Pipeline Design, Phase 2: Feature Engineering, Phase 3: Model and Validation) with associated milestones, and the implementation plan was updated accordingly.Associated Git Commits:\t[13.07.2026 15:15] (dda6b06) feat: initial commit with implementation_plan.md"
},
{
"day": 2,
"date": "2026-07-14",
"content": "Subject of Work: Directory Structure Setup, Environment Dependencies Definition, and Git Workflow Initialization (Branch\/PR)Detailed Description: On the second day of the internship, the project directory structure and development environment were set up in accordance with modular and clean code principles. To comply with the Git Workflow guidelines, a new feature branch named feature\/day2-setup was created from the main branch (master) to isolate the setup changes. To support the modular architecture of the application, directories were established for backend, frontend, data, tests, and documentation, with .gitkeep placeholder files placed inside them. Furthermore, the backend\/requirements.txt file was created, listing all backend dependencies (FastAPI, Uvicorn, NumPy, SciPy, Pandas, Scikit-Learn, XGBoost, PyTest). A comprehensive .gitignore file was implemented to prevent tracking local virtual environments (.venv), IDE settings (.vscode, .idea), OS cache files, and bulky data files. Finally, a basic README.md introducing the project and its development phases was written and added to the root directory. The changes were split logically and recorded locally as separate commits. Once finalized, the branch was pushed to GitHub, a Pull Request (PR) was opened for the advisor's review, and after receiving approval, the branch was merged back into the master branch.Associated Git Commits:[14.07.2026 16:13] (220d3ed) chore: setup project directory structure - Established the modular directory layout for the EEGFlow application. - Created key folders in the workspace: * backend\/utils: To house FastAPI controllers, signal processing filters, feature extractors, and ML pipeline scripts. * frontend: To contain UI assets (HTML, Vanilla CSS, and JavaScript). * data: Designated directory for raw and synthetic EEG datasets. * tests: Created to hold PyTest unit tests for mathematical correctness. * docs: Created for storing project documentation and system design architecture. - Implemented .gitkeep placeholders to ensure empty directory tracking by Git.[14.07.2026 16:13] (af13b8b) chore: add environment requirements and gitignore - Added backend\/requirements.txt file specifying the core Python libraries: * fastapi & uvicorn: For hosting the REST API server. * numpy, scipy, & pandas: For high-performance matrix calculations and digital signal filtering. * scikit-learn & xgboost: For machine learning classification models. * pytest: For executing automated unit and integration tests. - Implemented a comprehensive .gitignore file to exclude unnecessary assets from the repository: * Python compilation artifacts (__pycache__, *.pyc). * Virtual environments (.venv, env, venv). * Local IDE configuration folders (.vscode, .idea). * OS garbage files (.DS_Store, Thumbs.db). * Local raw data files (*.csv) to prevent repository bloat.[14.07.2026 16:13] (9b37dee) docs: create readme for project introduction - Created the introductory README.md file in the root workspace directory. - Provided a high-level project summary explaining the EEGFlow framework. - Listed the core features of the system, including data loading, Butterworth filtering, epoching, and Group K-Fold cross-validation. - Documented the three development phases and milestones agreed with the advisors (Faz 1: Pipeline Tasarımı, Faz 2: Öznitelik Mühendisliği, Faz 3: Model ve Doğrulama). - Outlined baseline layout structure for installation and setup guides.[14.07.2026 17:07] (98cf906) Merge pull request #3 from from feature\/day2-setup Integrate Day 2 environment setup and project structure: - Establish backend, frontend, data, tests, and docs directories. - Implement requirements.txt with backend dependencies. - Configure .gitignore to exclude temporary files."
},
{
"day": 3,
"date": "2026-07-16",
"content": "Subject of Work: EEG CSV Data Loading, Multi-Channel Validation, and Robust Group-Wise InterpolationDetailed Description: Developed the core data_loader.py module to handle EEG data loading from CSV format. The module automatically identifies channel columns, target labels, participant IDs, and timestamps. It calculates the sampling frequency dynamically from the time difference of samples. In addition, key improvements were implemented to prevent data leakage and artifacts: numeric metadata (like age, session, or trial ID) are filtered out from EEG electrode channels. Missing values (NaNs) are resolved using linear interpolation grouped by subject ID to avoid mixing signal data across different participants. Finally, the sampling rate estimation was made robust by using median calculation of valid positive time differences to prevent issues caused by jitter. Additionally, created the tests\/test_data_loader.py suite to run unit tests verifying the correctness of the validation rules. The tests successfully passed. All changes were committed to feature\/day3-data-loader branch and merged into master via a Pull Request.Git Commit Mesajları:[16.07.2026 10:24] (36a5927) feat: implement csv data loader and validation utility Created backend\/utils\/data_loader.py to load, validate, and clean EEG data in CSV format. Implemented automatic column classification to identify Time, Subject, Event\/Label, and numeric EEG channels.Added missing value (NaN) cleaning using linear interpolation to preserve continuous signal integrity. Added automatic sampling frequency (fs) estimation based on timestamp difference calculation. Designed metadata output dictionary containing channel names, sample counts, and trial states.[16.07.2026 14:31] (51b0549) feat(loader): enhance validation with subject-grouped cleaning and robust sampling rate estimation Added a numeric metadata exclusion list (e.g., age, session, trial) to prevent non-electrode numeric columns from being classified as EEG channels. Implemented subject-grouped linear interpolation and forward\/backward filling to prevent data contamination across different subjects. Set a threshold limit of 5 samples for linear interpolation to avoid generating artificial data over extended signal gaps. Upgraded sampling frequency (fs) estimation to use median-based calculations, filtering out non-finite or invalid time differences. Refined total duration calculation in metadata output to be mathematically exact.[16.07.2026 14:45] (bfd5a95) test: add unit tests for data loader verification - Created tests\/test_data_loader.py to verify data loading, validation, and cleaning. Implemented unit tests for detecting EEG channel columns and excluding metadata. Verified subject-grouped linear interpolation for NaN values on a mock EEG dataset. Verified sampling frequency (fs) auto-estimation using temporal differences. Executed tests using 'python -m pytest tests\/test_data_loader.py': Status: SUCCESS (1 passed in 0.55s) Scenario 1: Channels Fp1 and F3 correctly detected. * Scenario 2: Metadata (time_ms, subject_id, trial_id, label) successfully excluded from channels. Scenario 3: Sampling rate auto-calculated exactly to 250.0 Hz from 4ms time intervals. Scenario 4: Subject-grouped interpolation verified (Subject 1 Fp1 filled with 2.0, Subject 2 Fp1 filled with 12.0).[16.07.2026 18:35] (c081e83) Merge pull request #3 from feature\/day3-data-loader Integrate Day 3 EEG CSV data loader and validation pipeline: Implement EEGDataLoader class for robust loading and multi-channel validation. Implement subject-grouped linear interpolation and ffill\/bfill to prevent cross-subject data leakage. Implement median-based calculations for jitter-resistant sampling frequency estimation. Integrate PyTest unit tests (test_data_loader.py) verifying columns classification and interpolation."
},
{
"day": 4,
"date": "2026-07-17",
"content": "Subject of Work: EEG Synthetic Signal Simulator Development and Data Loader Integration Testing Detailed Description: Developed the generate_sample_data.py script to simulate realistic, multi-subject, multi-state EEG data. The generator models 8 standard EEG channels (Fp1 to O2) with custom frequency band components (Delta, Theta, Alpha, Beta, Gamma) and simulates biological artifacts such as baseline drift, 50 Hz power-line interference, and Gaussian measurement noise. State-dependent neurophysiological changes, specifically the eyes-closed alpha wave synchronization (Alpha blocking effect), were simulated accurately. Sparse NaN missing values (96 total) were injected to test the robustness of the data loading module. Generated the dataset data\/sample_eeg.csv and created a new integration test inside the tests\/test_data_loader.py suite. The test verifies that the EEGDataLoader successfully parses the generated dataset, autodetects the 250 Hz sampling rate, and cleans all 96 NaNs via subject-grouped interpolation. The test passed successfully. All changes were committed to feature\/day4-sample-data branch and merged into master via a Pull Request.Git Commit Mesajları:[17.07.2026 12:07] (dcf8e79) feat: implement realistic synthetic eeg data generator \t- Created data\/generate_sample_data.py to generate multi-subject, multi-state EEG datasets.\t- Simulated 8 channels (Fp1, Fp2, F3, F4, C3, C4, O1, O2) with standard EEG band frequencies (Delta, Theta, Alpha, Beta, Gamma). \t- Modeled eyes-closed (Relaxed) vs. eyes-open (Task) states to simulate alpha blocking, with occipital channels (O1, O2) showing increased alpha power. \t- Integrated Gaussian noise, slow baseline drifts (0.1-0.3Hz), and 50Hz power-line interference.\t- Injected sparse NaN missing values (96 total, 12 per channel) avoiding block boundaries to test preprocessing robustness. [17.07.2026 14:50] (82ccd55) test: generate and add synthetic eeg sample dataset \t- Executed the generator script to create 'data\/sample_eeg.csv'. - Dataset properties: \t\t* Rows: 15,000 samples (250 Hz * 10 seconds * 2 states * 3 subjects).\t\t* Subjects: 3 participants (1, 2, and 3). * Channels: 8 active channels (Fp1 to O2). \t\t* Injected NaNs: 96 missing values (12 per channel) for interpolation testing. [17.07.2026 15:28] (6a54859) test: verify data loader integration with synthetic eeg dataset \t- Appended 'test_data_loader_with_synthetic_dataset' to 'tests\/test_data_loader.py' to run integration tests using the generated 'sample_eeg.csv' file. \t- Verified the following test outcomes (2 passed in 0.50s): \t\t* Channel mapping: Correctly maps 8 EEG channels and excludes metadata.\t\t* Sampling rate: Autodetects 250.0 Hz and 60.0s total duration. \t\t* NaN cleaning: Successfully resolves all 96 missing values with 0 NaNs remaining."
},
{
"day": 5,
"date": "2026-07-20",
"content": "Subject of Work: FastAPI Backend Ingestion API Development, Interactive Dashboard Interface, and Dataset Guidelines DocumentationDetailed Description: Developed the FastAPI web server (backend\/main.py) to provide an ingestion endpoint (\/api\/upload) for EEG CSV datasets. The endpoint validates file structures using EEGDataLoader, performs subject-grouped interpolation, and returns processed metadata. A premium glassmorphic frontend dashboard was designed with HTML5, CSS3, and JavaScript, featuring drag-and-drop file upload, live progress tracking, and dynamic KPI metric cards. Additionally, an interactive Dataset Guidelines documentation page was integrated to guide users on formatting raw EEG datasets and converting files from EDF, MATLAB, or OpenBCI formats. Executed PyTest test suite to verify backend stability (4 passed in 0.71s). Added actual working dashboard screenshots to docs\/screenshots\/ and updated README.md. All changes were committed to feature\/day5-upload-api and merged into master via a Pull Request.Git Commit Mesajları:[20.07.2026 11:41] (678d508) feat(api): add fastapi backend server with upload and static file serving - Implemented FastAPI backend server in backend\/main.py with CORS middleware. - Added POST \/api\/upload endpoint to validate CSV files via EEGDataLoader. - Added static file serving to host frontend index.html directly at root URL. - Verified endpoints via PyTest test suite in tests\/test_upload_api.py.[20.07.2026 15:42] (4b0f6a7) feat(ui): implement glassmorphic eeg dashboard, guidelines, and add ui preview - Designed modern glassmorphic dashboard interface for EEG file ingestion. - Implemented drag-and-drop file upload zone with animated progress indicator. - Connected fetch API to backend \/api\/upload endpoint and displayed KPI metric cards. - Added Dataset Guidelines view with format conversion guide (EDF\/MATLAB\/OpenBCI). - Added UI preview image (docs\/dashboard_preview.png) and updated README.md.[20.07.2026 15:48] (d3d3429) docs(ui): add actual working dashboard screenshots and update readme gallery - Added real working application screenshots of the EEGFlow dashboard to docs\/screenshots\/. - Included upload view, validation results dashboard, and dataset guidelines sections. - Updated README.md with screenshot gallery table and main dashboard preview image."
},
{
"day": 6,
"date": "2026-07-21",
"content": "Subject of Work: Digital Signal Processing (DSP): Butterworth Band-pass Filter Implementation and Zero-Phase Signal VerificationDetailed Description: Developed the core digital signal filtering module (backend\/utils\/filters.py) to attenuate low-frequency baseline drifts (<0.5 Hz) and high-frequency physiological\/electromagnetic artifacts (>45 Hz). Designed the Butterworth Band-pass filter using Second-Order Sections (SOS) format for optimal numerical stability. Applied zero-phase filtering (scipy.signal.sosfiltfilt) to prevent temporal phase shifts in EEG waveforms. Created a batch DataFrame filtering function to process multi-channel signals while preserving non-EEG metadata columns (timestamp, subject ID, event markers). Built a unit test suite (tests\/test_filters.py) to verify pass-band power retention (>90% power retained for 10 Hz sine waves), noise attenuation (<5% power remaining for 60 Hz noise), output length consistency, and error handling for invalid cut-off frequencies (8 passed in 2.37s). Committed changes via two distinct Git commits to feature\/day6-bandpass-filter and submitted a Pull Request.Git Commit Mesajları:[12:52] (1ffe798) feat(dsp): implement butterworth bandpass filter module Created backend\/utils\/filters.py with Butterworth Band-pass filter utilities.Implemented design_bandpass_filter() using SOS format for numerical stability. Implemented apply_bandpass_filter() with zero-phase sosfiltfilt() for single channels.Implemented apply_filter_to_dataframe() to filter all EEG channels preserving metadata.[16:21] (00cfc00) test: add unit tests for butterworth bandpass filter Added tests\/test_filters.py with 8 comprehensive unit tests. Verified SOS array shape, in-band signal preservation (>90% power retained). Verified out-of-band attenuation (60 Hz noise reduced to <5% power). Verified output length consistency, DataFrame metadata preservation. Verified ValueError raised for invalid frequency combinations and short signals. All 8 tests passed in 2.37s.[18:22] (c63a15a) Merge pull request #9 from ismetcansezgin\/day6-bandpass-filter Day 6: Butterworth Band-pass Filter Module & DSP Unit Tests"
},
{
"day": 7,
"date": "2026-07-22",
"content": "Subject of Work: Digital Signal Processing: 50Hz\/60Hz Notch Filtering, Baseline Linear Detrending, and Expanded Unit Test SuiteDetailed Description: Expanded the digital signal processing module (backend\/utils\/filters.py) by adding zero-phase IIR Notch filtering (apply_notch_filter) to eliminate 50 Hz\/60 Hz power-line interference. Implemented linear detrending (apply_linear_detrend) to correct baseline drift caused by electrode impedance changes and motion artifacts. Created DataFrame wrapper functions to apply these filters across multi-channel EEG datasets while preserving non-EEG metadata columns. Expanded the unit test suite (tests\/test_filters.py) to 15 total tests, validating target frequency attenuation (>95% power reduction at 50 Hz), pass-band preservation, linear trend removal (<1% residual RMS), and metadata integrity (15 passed in 4.52s). All changes were committed across 4 logical commits to feature\/day7-notch-detrend and submitted as a Pull Request.Git Commit Mesajları:[22.07.2026 12:36] (59ef7ec) feat(dsp): implement notch filter for 50hz\/60hz power-line interference removal Added apply_notch_filter() using scipy iirnotch with SOS conversion for numerical stability. Applied zero-phase sosfiltfilt() to prevent time-shift in filtered EEG signal. Added apply_notch_to_dataframe() to batch-filter all EEG channels while preserving metadata. Supports configurable quality factor (Q) for narrow or wide notch bandwidth.[22.07.2026 14:05] (ca692b1) feat(dsp): implement linear detrending for eeg baseline drift correction Added apply_linear_detrend() using scipy.signal.detrend to remove slow baseline drift. Removes the best-fit straight line (y = mx + b) from the signal to center it at zero.Added apply_detrend_to_dataframe() to batch-detrend all EEG channels preserving metadata.[22.07.2026 15:00] (8ecafcd) test: add unit tests for notch filter Added test_notch_filter_attenuates_target_frequency(): verifies 50Hz noise reduced to <5% power. Added test_notch_filter_preserves_other_frequencies(): verifies 10Hz signal retains >95% power. Added test_notch_filter_output_length_unchanged(): verifies length consistency. Added test_notch_filter_invalid_frequency_raises(): verifies ValueError above Nyquist. All 12 tests passed in 2.56s.[22.07.2026 16:29] (ce3b8c0) test: add unit tests for linear detrending Added test_linear_detrend_removes_known_slope(): verifies pure ramp reduced to <1% RMS. Added test_linear_detrend_output_length_unchanged(): verifies length consistency. Added test_detrend_dataframe_preserves_metadata(): verifies time\/subject\/event columns unchanged. All 15 tests passed in 4.52s."
},
{
"day": 8,
"date": "2026-07-23",
"content": "Subject of Work: Signal Processing Backend Integration: REST API Filtering Endpoints and Automated Integration TestingDetailed Description: Developed and integrated the multi-stage EEG signal filtering REST API endpoint (POST \/api\/filter) in backend\/main.py. The endpoint ingests raw EEG CSV uploads along with configurable filtering parameters (apply_bandpass, lowcut, highcut, order, apply_notch, notch_freq, quality_factor, apply_detrend). Designed the backend controller to execute the signal processing pipeline in optimal sequence (detrending → band-pass → notch filtering) using the previously validated filters.py module. Constructed JSON response payloads containing raw vs filtered channel statistical metrics (mean, standard deviation, RMS, peak-to-peak) alongside initial sample preview arrays for frontend visualization. Created an automated integration test suite (tests\/test_filter_api.py) leveraging FastAPI TestClient to validate full pipeline execution, single-filter isolation modes, parameter reflection, error handling for non-CSV files, and array lengths (10\/10 passed in 4.20s). Committed changes across two structured Git commits to day8-filter-api and opened a Pull Request.Git Commit Mesajları:[12:56] (5afabe0) feat(api): add \/api\/filter endpoint for multi-stage eeg signal processing Description: Integrated POST \/api\/filter endpoint in backend\/main.py.Accepts CSV file and filter parameters (apply_bandpass, lowcut, highcut, order, apply_notch, notch_freq, quality_factor, apply_detrend). Executes signal processing pipeline sequentially (detrend -> bandpass -> notch). Returns raw vs filtered channel statistics (mean, std, rms, peak-to-peak) and sample preview array.[15:48] (b7f231c) test: add integration tests for \/api\/filter endpoint Created tests\/test_filter_api.py with 10 integration tests for POST \/api\/filter. Tests cover: all filters enabled (200 OK), individual filter modes (bandpass\/notch\/detrend only). Tests verify: all filters disabled returns unchanged stats, non-CSV returns 400. Tests validate: all 8 EEG channels present, filtering changes signal statistics. Tests confirm: pipeline_config reflects sent parameters, sample_preview has 100 samples. All 10 tests passed in 4.20s."
},
{
"day": 9,
"date": "2026-07-24",
"content": "Subject of Work: Frontend Engineering: Interactive EEG Preprocessing Dashboard UI, Filter API Binding, and Visual Metrics VisualizationDetailed Description: Developed the interactive frontend Preprocessing Dashboard (frontend\/index.html, frontend\/style.css, frontend\/app.js) to provide an intuitive browser interface for digital signal processing. Unlocked the navigation route and constructed three glassmorphic filter control cards: Butterworth Band-pass (frequency range sliders from 0.1 to 100 Hz, order selector), IIR Notch (50 Hz\/60 Hz power-line radio toggles, Q-factor slider), and Linear Detrending baseline removal. Styled the controls with custom CSS range sliders, iOS-style toggle switches, responsive KPI summary cards, and per-channel comparison tables. Bound the UI controls to the POST \/api\/filter REST API using FormData and implemented dynamic metric rendering to display Root Mean Square (RMS) and Peak-to-Peak amplitude reductions across all EEG channels. Updated the repository documentation (README.md) with actual working application screenshots (docs\/screenshots\/). Pushed 3 structured commits to day9-preprocessing-ui and created a Pull Request.Git Commit Mesajları:[12:40] (c3f98b5) feat(ui): add eeg preprocessing dashboard section and filter controls html\/css Unlocked Preprocessing navigation item in frontend\/index.html sidebar. Added Preprocessing page view with active dataset banner and 3 filter cards. Implemented controls for Butterworth Band-pass (lowcut\/highcut sliders, order select), IIR Notch (50Hz\/60Hz radio pills, Q-factor slider), and Linear Detrending. Added glassmorphic styling, iOS-style toggle switches, slider badges, KPI summary grid, and per-channel comparison table in frontend\/style.css.[15:49] (c65e510) feat(ui): connect preprocessing controls to \/api\/filter api with dynamic metrics table Updated SPA page router in frontend\/app.js to navigate seamlessly to page-preprocess. Added event listeners for range sliders to dynamically update live value badges. Bound \"Apply Signal Processing Pipeline\" button to submit FormData to POST \/api\/filter. Implemented renderFilterResults() to calculate and display per-channel RMS\/Peak-to-Peak change deltas and populate summary KPI cards. Added sample dataset fallback loader and reset filters handler.[16:20] (a24e1de) docs(ui): add eeg preprocessing dashboard screenshots and update readme gallery Added actual working application screenshots of the EEGFlow Preprocessing Dashboard to docs\/screenshots\/. Included 04_preprocessing_controls.png (filter control cards & sliders) and 05_preprocessing_results.png (filtering metrics & per-channel comparison table). Updated README.md screenshot gallery table to display the new UI views."
},
{
"day": 10,
"date": "2026-07-27",
"content": "Subject of Work: Signal Visualization: Chart.js Interactive Time-Series Waveform Plotting and Phase 1 Pipeline CompletionDetailed Description: Completed Day 10 and Phase 1 (Pipeline Design) by integrating an interactive time-series EEG waveform visualization component into the frontend dashboard (frontend\/index.html, frontend\/style.css, frontend\/app.js). Integrated Chart.js v4 and implemented renderSignalChart() to plot dual-trace signal waveforms comparing Raw EEG (dashed orange trace) against Filtered EEG (solid cyan line with gradient glow) with millisecond-level time precision. Added interactive channel selector buttons (#chartChannelPills) enabling seamless switching between electrode channels (Fp1, Fp2, C3, C4, O1, O2). Configured custom tooltips displaying instantaneous amplitude values in µV. Updated project documentation (README.md) with the new visual component screenshot (06_signal_waveform_chart.png). Verified system integrity across all 29 automated unit and integration tests (29 passed in 3.45s). Submitted final Phase 1 Pull Request to branch day10-signal-visualization.Git Commit Mesajları:[12:08] (7ce78b3) feat(ui): add Chart.js library and signal waveform canvas to index.html Imported Chart.js v4.4.1 CDN library in index.html head. Added live time-series waveform comparison card section in page-preprocess view. Included channel selector pills container (#chartChannelPills) and canvas element (#signalChart). Added custom legend indicators for Raw (coral\/orange) vs Filtered (cyan) signal traces.[14:23] (74bcb08) style(ui): add glassmorphic styles for signal chart canvas and channel pills Added .chart-card, .chart-card-header, and .chart-canvas-wrap CSS classes for Chart.js container. Added custom legend styling for Raw (coral dot) vs Filtered (cyan dot) signals. Added .chart-channel-selector and .chart-pill button styles with active state glow effects. Added responsive media queries for signal chart layout on smaller screens.[17:37] (cb0a5cb) feat(ui): implement Chart.js time-series waveform plot and channel selector Added renderSignalChart() function using Chart.js v4 to draw live time-series EEG waveforms in frontend\/app.js. Plotted raw (dashed coral line) vs filtered (solid cyan line with gradient glow) waveform traces. Added dynamic channel selector pills (#chartChannelPills) allowing real-time switching between electrode signals. Configured custom tooltips, milliseconds X-axis scale, and amplitude µV Y-axis scale.[17:44] (68029b5) docs(ui): add live signal waveform chart screenshot and update readme gallery Added working screenshot 06_signal_waveform_chart.png showing Chart.js time-series waveform comparison to docs\/screenshots\/. Displayed interactive Raw (dashed orange) vs Filtered (cyan glow) waveform plot with active channel pills and tooltips. Updated README.md screenshot gallery table to feature the new live visualization view."
},
{
"day": 11,
"date": "2026-07-28",
"content": "Subject of Work: Feature Engineering Phase: Sliding Window EEG Epoch Segmentation Module and Unit Test CoverageDetailed Description: Initiated Phase 2 (Feature Engineering) by implementing the sliding window EEG segmentation module in backend\/utils\/epoching.py. Developed create_epochs() to transform 1D or 2D EEG arrays into (n_epochs, n_channels, n_samples_per_epoch) 3D matrices based on configurable parameters (window_size_sec and overlap_ratio). Developed create_epochs_from_dataframe() to process tabular CSV inputs while maintaining metadata alignment through majority-vote categorical event labeling and subject identification per temporal window. Created a test suite in tests\/test_epoching.py containing 13 automated unit tests to validate output shapes, mathematical epoch counts, array value fidelity, boundary edge cases, and metadata extraction (13\/13 passed in 1.66s, bringing overall test suite to 42 passed). Opened a Pull Request to branch feature\/day11-epoching.Git Commit Mesajları:[13:37] (2f61846) feat(epoching): add sliding window epoch segmentation module Created backend\/utils\/epoching.py with create_epochs() and create_epochs_from_dataframe(). create_epochs(): Segments 1D\/2D NumPy EEG arrays into (n_epochs, n_channels, n_samples) shape using configurable window_size_sec and overlap_ratio parameters. create_epochs_from_dataframe(): Epochs multi-channel DataFrame, aligns majority-vote event labels and subject_id to each epoch. Returns structured dict with epochs, labels, subjects, n_epochs, and epoch_info metadata. Validated 1D, 2D, and DataFrame inputs produce correct shapes and labels.[16:39] (c42c763) test: add unit tests for sliding window epoch segmentation module Created tests\/test_epoching.py with 13 unit tests for backend\/utils\/epoching.py. Tests verify: 1D\/2D epoch shapes, N_epochs formula correctness, 0% and 75% overlap counts. Tests confirm: first epoch data matches original signal slice exactly (array_almost_equal). Tests validate: ValueError on signal shorter than window and invalid overlap_ratio >= 1.0. Tests check: DataFrame shape, event label majority-vote alignment, subject_id alignment. Tests ensure: epoch_info dict contains all required metadata keys (fs, n_channels, etc.). All 13 tests passed in 1.66s.[17:20] (61839fc) refactor(epoching): optimize dataframe slicing and add float rounding safety Updated window_samples and step_samples calculations to use int(round(window_size_sec * fs)) preventing floating-point truncation issues (addressing Faruk-T review). Converted event and subject_id DataFrame columns to NumPy arrays prior to the epoch loop to improve performance (addressing Faruk-T review). Validated all 42 pytest unit & integration tests pass."
},
{
"day": 12,
"date": "2026-07-29",
"content": "Subject of Work: Feature Engineering REST API: Implementation of POST \/api\/epoch Endpoint and Integration TestingDetailed Description: Developed the POST \/api\/epoch REST API endpoint in backend\/main.py to expose the sliding window EEG segmentation engine to web clients. Designed the endpoint to ingest uploaded CSV files along with configurable form parameters (window_size_sec defaulting to 2.0s and overlap_ratio defaulting to 0.5). Implemented parameter validation rules to reject non-CSV file types, zero\/negative window durations, and out-of-bound overlap ratios (>= 1.0) returning HTTP 400 Bad Request responses. Handled JSON serialization of 3D epoch dimensions (n_epochs, n_channels, n_samples), majority-vote event labels, subject IDs, and initial epoch sample previews. Constructed an integration test suite in tests\/test_epoch_api.py featuring 9 automated tests to validate endpoint functionality across default settings, custom window sizes, 0% non-overlapping windows, and 75% overlap conditions (9\/9 passed in 1.41s, total test suite: 51 passed). Opened a Pull Request on branch day12-epoch-api.Git Commit Mesajları:[15:57] (e0b19f8) feat(api): add \/api\/epoch endpoint for eeg time-window segmentation Integrated POST \/api\/epoch endpoint in backend\/main.py. Accepts raw\/filtered EEG CSV uploads along with window_size_sec (default: 2.0) and overlap_ratio (default: 0.5) form parameters. Validates input parameter ranges (window_size_sec > 0, 0.0 <= overlap_ratio < 1.0). Executes create_epochs_from_dataframe() and returns 3D epoch dimensions (n_epochs, n_channels, n_samples), event labels, subject IDs, epoch_info metadata, and sample preview.[15:58] (b41970c) test: add integration tests for \/api\/epoch endpoint Created tests\/test_epoch_api.py with 9 integration tests for POST \/api\/epoch. Tests cover default parameters (2.0s window, 50% overlap → 200 OK), custom parameters, zero overlap, and 75% overlap. Tests validate 400 Bad Request responses for non-CSV files, invalid overlap_ratio (>= 1.0), and invalid window_size_sec (<= 0). All 51 unit and integration tests passed in 2.19s."
},
{
"day": 13,
"date": "2026-07-30",
"content": "Subject of Work: Phase 2 Feature Engineering: Signal Epoching Dashboard UI Integration and 3D Tensor VisualizationDetailed Description: Completed the frontend integration of the Signal Epoching Dashboard in frontend\/index.html, frontend\/style.css, and frontend\/app.js. Designed glassmorphic control panels allowing users to adjust window duration (window_size_sec) and sliding overlap percentage (overlap_ratio) via interactive range sliders. Developed dynamic JavaScript calculations to update step stride samples and data augmentation multipliers in real-time. Connected the interface to the POST \/api\/epoch REST API endpoint and implemented dynamic rendering for the output 3D tensor shape (N_epochs × N_channels × N_samples_per_epoch), KPI summary grids, event class distribution pills, and subject-wise epoch counts. Captured high-resolution UI screenshots (07_epoching_controls.png and 08_epoching_tensor_results.png) and updated the README.md project gallery. Opened a Pull Request on branch day13-epoching-ui.Git Commit Mesajları:[15:25] (73792d8) feat(ui): add signal epoching dashboard section and controls html\/css Unlocked Signal Epoching navigation item in frontend\/index.html sidebar. Added Signal Epoching page view with active dataset banner and 3 control cards. Implemented sliders for window_size_sec (0.5s–5.0s) and overlap_ratio (0%–80%). Added computed step specs card, 3D tensor shape callout banner, KPI grid, and class\/subject distribution cards in frontend\/style.css.[16:31] (05dc96f) feat(ui): connect epoching controls to \/api\/epoch api with 3d tensor shape display Updated SPA page router in frontend\/app.js to navigate to page-epoching. Implemented updateEpochCalculations() to live-calculate step stride samples and augmentation multiplier on slider input. Bound \"Generate EEG Epochs\" button to submit FormData to POST \/api\/epoch. Implemented renderEpochResults() to calculate and render 3D tensor shape (N_epochs x N_channels x N_samples), KPI summary grid, and event class distribution pills.[16:37] (7ccdd1e) Merge pull request #14 from ismetcansezgin\/day11-epoching Day 11: EEG Signal Epoching (Sliding Window) Module & Unit Tests[16:42] (31c3dc3) docs(ui): add signal epoching dashboard screenshots and update readme gallery Added high-resolution screenshots of the EEGFlow Signal Epoching Dashboard to docs\/screenshots\/. Included 07_epoching_controls.png (window duration\/overlap sliders & step specs calculator) and 08_epoching_tensor_results.png (3D tensor shape (59 x 8 x 500) & event\/subject label distribution). Updated README.md screenshot gallery table to feature the new Phase 2 UI views."
},
{
"day": 14,
"date": "2026-07-31",
"content": "Subject of Work: Feature Engineering Phase: Implementation of Time and Frequency Domain EEG Feature Extraction Engine and Unit TestingDetailed Description: Developed the EEG feature extraction engine in backend\/utils\/features.py to convert 3D epoched signal matrices (n_epochs, n_channels, n_samples) into 2D tabular feature matrices (n_epochs, n_features) for machine learning classification. Implemented extract_time_domain_features() to compute 7 statistical metrics per channel (Mean, Standard Deviation, Variance, Root Mean Square, Peak-to-Peak Amplitude, Skewness, and Kurtosis). Developed extract_frequency_domain_features() utilizing Welch Power Spectral Density (PSD) to compute absolute and relative band powers across standard EEG frequency bands: Delta (0.5–4 Hz), Theta (4–8 Hz), Alpha (8–13 Hz), Beta (13–30 Hz), Gamma (30–45 Hz), and Total Power. Built extract_all_features() to combine time and frequency domain features into a 146-column DataFrame formatted with subject and event metadata. Developed a unit test suite in tests\/test_features.py containing 12 automated tests to verify mathematical accuracy, spectral energy concentration on synthetic sine waves, 2D input handling, and normalization (12\/12 passed in 1.11s, bringing total test suite to 63 passed). Opened a chained Pull Request targeting branch day13-epoching-ui.Git Commit Mesajları:[15:59] (256212a) feat(features): add time and frequency domain eeg feature extraction module Created backend\/utils\/features.py with extract_time_domain_features(), extract_frequency_domain_features(), and extract_all_features(). Time-domain features (7 per channel): Mean, Std, Variance, RMS, Peak-to-Peak, Skewness, Kurtosis. Frequency-domain features via Welch PSD (11 per channel): Absolute & Relative band powers for Delta (0.5-4Hz), Theta (4-8Hz), Alpha (8-13Hz), Beta (13-30Hz), Gamma (30-45Hz), and Total Power. Transforms 3D epoch matrices (n_epochs, n_channels, n_samples) into 2D tabular DataFrames (n_epochs, n_features) with optional event\/subject labels. Validated on 8-channel EEG producing 146 features per epoch window.[16:26] (eee947c) test: add unit tests for time and frequency eeg feature extraction module Created tests\/test_features.py with 12 unit tests for backend\/utils\/features.py. Tests verify: time-domain feature shape (n_epochs, n_channels * 7), precision on constant signals and sine waves. Tests verify: frequency-domain feature shape (n_epochs, n_channels * 11), Welch PSD spectral power distribution (10 Hz alpha sine > 80% rel_alpha, 20 Hz beta sine > 80% rel_beta). Tests confirm: extract_all_features() combines 18 features per channel (144 features for 8 channels) and appends event\/subject_id metadata columns. Tests validate: 2D single epoch input compatibility, absence of NaN\/Inf values, custom channel prefixes, and relative power summation (~1.0). All 63 total unit and integration tests passed in 2.66s."
},
{
"day": 15,
"date": "2026-08-03",
"content": "Subject of Work: Feature Engine REST API Endpoint, Alpha Wave ERD Validation Dashboard, and System Styling IntegrationDetailed Description: Developed the POST \/api\/extract-features REST API endpoint in backend\/main.py to bridge the sliding window epoching and 144-dimensional feature extraction modules. The endpoint processes CSV uploads, validates sliding window parameters (window_size_sec, overlap_ratio), and returns tabular feature shapes, class-specific band powers, and relative alpha suppression ratios. Created the \"Feature Engine & Alpha Wave Validation\" dashboard in frontend\/index.html and frontend\/app.js, incorporating control cards, parameter sliders, KPI grids, and dynamic Chart.js bar plots. Implemented a physiological validation algorithm detecting Event-Related Desynchronization (ERD), triggering an \"Alpha ERD Confirmed \" badge when relative alpha power in \"Relaxed\" states (75.6%) exceeds the \"Task\" state (20.5%) by over 20%. Patched UI visual inconsistencies in frontend\/style.css by defining glassmorphic panel classes (.controls-grid, .control-card, .tensor-banner, and .kpi-grid). Developed 12 integration tests in tests\/test_feature_api.py validating upload verification, parameter ranges, and JSON response models (all 12 passed, verifying 63\/63 total system tests). Opened a chained Pull Request targeting branch day14-feature-extraction.Git Commit Mesajları:[10:43] (9e11bc1) feat(api): add \/api\/extract-features endpoint with alpha wave validation output Added POST \/api\/extract-features REST API endpoint to backend\/main.py. Accepts CSV file, window_size_sec, overlap_ratio, include_time_features, include_freq_features as form params. Performs epoch segmentation + feature extraction pipeline and returns: feature_matrix_shape [59, 144], feature_names list, class_band_summary per event class, and alpha_validation dict for Milestone 2 Alpha wave validation chart. Alpha validation confirmed: Relaxed=0.756 vs Task=0.205 relative alpha power (physiologically correct). Added backend\/utils\/features.py (extracted from day14 branch for chained PR compatibility).[13:47] (c3e5e73) test: add integration tests for \/api\/extract-features endpoint Created tests\/test_feature_api.py with 12 integration tests for POST \/api\/extract-features. Tests verify: 200 OK with valid feature_matrix_shape [59, 144], custom window\/overlap params, time-only and freq-only feature modes. Tests validate: 400 errors for non-CSV files, invalid overlap (>=1.0), invalid window_size (<=0), and both features disabled. Tests check: all required response keys, feature_names length == n_features, alpha_validation floats in [0,1], and class_band_summary contains all 5 EEG bands (delta\/theta\/alpha\/beta\/gamma). All 12 integration tests passed in 6.17s.[16:45] (5ab1302) feat(ui): add feature engine dashboard with alpha wave validation visualization Unlocked and integrated the Feature Engine section in sidebar (nav-features). Added full page-features HTML: window\/overlap sliders, feature domain toggles, feature matrix shape banner, KPI cards, Alpha wave validation bar chart, all-band power table, validation badge, and feature preview table. Connected \"Extract EEG Features\" button to POST \/api\/extract-features API. Implemented dynamic rendering of 2D feature matrix shape (59 × 144), Alpha ERD validation bars (Relaxed=75.6% vs Task=20.5%), 5-band power table (delta\/theta\/alpha\/beta\/gamma), and physiological validation badge. Alpha ERD Confirmed: Relaxed Alpha power is 3.69x higher than Task Alpha power (Milestone 2 validated). Added glassmorphic CSS: alpha-bar-fill animations, band-pill color chips, validation-result badge with green\/red variants. All 63 unit and integration tests passing (63\/63 in 10.75s).[16:56] (e5085ab) fix(ui): add missing control card css and remove internal milestone labels from ui Added missing shared CSS classes: .controls-grid (3-col grid), .control-card (glassmorphic card), .control-card-header, .control-icon-wrap, .control-value-badge, .epoch-slider, .btn-epoch, .btn-reset, .no-dataset-banner, .tensor-banner, .tensor-shape, .kpi-grid, .kpi-card. Removed all internal \"Milestone 2\" references from user-facing UI (page subtitle, alpha section heading, validation badge). Replaced with proper technical\/scientific labels: \"Welch Power Spectral Density\", \"Event-Related Desynchronization (ERD)\"."
},
{
"day": 16,
"date": "2026-08-04",
"content": "Subject of Work: Machine Learning Pipelines (SVM, Random Forest, XGBoost) and \/api\/train-model REST API Endpoint ImplementationDetailed Description: Developed the machine learning classification pipelines in backend\/utils\/models.py using scikit-learn and xgboost. Built three pipeline architectures: Support Vector Machine (SVM with RBF kernel), Random Forest (with entropy criterion), and XGBoost (using soft-max multi-class objective). Embedded StandardScaler as the initial pipeline stage for automatic feature normalization. Implemented the core training (train_model), evaluation (evaluate_model), and joint execution (train_evaluate) functions, adding LabelEncoder to parse categorical event annotations. Created the POST \/api\/train-model REST API endpoint in backend\/main.py to support end-to-end evaluation. The endpoint handles CSV file uploads, partitions dataset splits using a stratified approach based on test_size, performs signal extraction, and trains the selected classifier. Developed 12 unit tests in tests\/test_models.py verifying classification functionality, pipeline stages, and prediction shapes. All 12 tests passed, bringing the total passing suite to 87\/87 tests. Opened a chained Pull Request targeting branch day15-feature-api.Git Commit Mesajları:[13:05] (af5bc13) feat(models): add svm, random forest, and xgboost classification pipelinesCreated backend\/utils\/models.py with 3 sklearn Pipeline classifiers: SVM (RBF kernel), Random Forest (entropy criterion), XGBoost (softmax).Each pipeline includes StandardScaler as first step for automatic feature scaling.Implemented build_*(), train_model(), evaluate_model(), train_evaluate() functions.evaluate_model() returns accuracy, precision\/recall\/f1 (macro+weighted), confusion matrix, classification report.train_evaluate() supports string labels via LabelEncoder and stratified train\/test split.Created tests\/test_models.py with 12 unit tests — all 12 passed.Total: 87\/87 tests passing.[21:22] (28c00e2) feat(api): add \/api\/train-model endpoint for svm, random forest and xgboost classificationAdded POST \/api\/train-model REST API endpoint to backend\/main.py.Accepts CSV file + model_name (svm\/random_forest\/xgboost), window_size_sec, overlap_ratio, test_size, random_state as form params.Full pipeline in one call: CSV upload → epoch segmentation → feature extraction → model training → evaluation.Returns: accuracy, precision\/recall\/f1 (macro+weighted), confusion matrix, classification report, train\/test sample counts, feature matrix shape, epoch metadata.Validated with sample EEG data: SVM=1.0, RF=1.0, XGBoost=1.0 accuracy on 59 epochs \/ 144 features.All 87 tests passing."
},
{
"day": 17,
"date": "2026-08-05",
"content": "Subject of Work: Group K-Fold Cross-Validation, Denek Bağımsız Model Değerlendirme Modülü ve REST API Endpoint EntegrasyonuDetailed Description: Implemented a subject-independent evaluation strategy in backend\/utils\/models.py by integrating GroupKFold cross-validation. This prevents subject-level data leakage by ensuring that data points from the same participant (subject_id) are never shared between training and testing folds. The validation module computes aggregate metrics including mean and standard deviation of accuracy, macro-averaged precision, recall, F1-Score, and returns an accumulated confusion matrix across all validation folds. Implemented auto-capping for n_splits when it exceeds the number of unique subjects in the upload. Developed the POST \/api\/cross-validate endpoint in backend\/main.py to receive datasets, parse subject groupings, perform window segmentation, extract features, and execute Group K-Fold cross-validation. Created tests\/test_model_api.py with 15 integration tests covering both ML endpoints, verifying range constraints, bad inputs, and format validation. All 21 tests passed (15 new integration + 6 new unit tests), verifying 108\/108 total system tests. Opened a chained Pull Request targeting branch day16-classifiers.Git Commit Mesajları:[15:19] (5041a68) feat(models): implement group k-fold cross-validation in ml moduleAdded cross_validate_model() function in backend\/utils\/models.py.Implemented GroupKFold partitioning based on subject_id to guarantee subject-level isolation and prevent data leakage.Returns mean\/std accuracy, mean precision, mean recall, mean macro F1, and an accumulated confusion matrix.Capped n_splits automatically if n_splits exceeds the number of unique subjects.Added 6 new unit tests to tests\/test_models.py validating GroupKFold execution, subject isolation, and split capping.[16:46] (12fd6a2) feat(api): add \/api\/cross-validate endpoint for group k-fold validationCreated POST \/api\/cross-validate endpoint in backend\/main.py.Processes CSV dataset uploads, extracts subject_id groupings, runs epoching and feature extraction, and executes Group K-Fold cross-validation.Validates parameters (n_splits >= 2) and raises 400 Bad Request if subject_id is missing from the dataset.Created tests\/test_model_api.py with 15 integration tests covering \/api\/train-model and \/api\/cross-validate.All 108 tests passing."
},
{
"day": 18,
"date": "2026-08-06",
"content": "Subject of Work: Class-wise ROC-AUC Calculation, Coordinate Downsampling, and Endpoint IntegrationDetailed Description: Updated the model evaluation module in backend\/utils\/models.py to compute class-specific Receiver Operating Characteristic (ROC) metrics. Modified evaluate_model to calculate One-vs-Rest (OVR) multiclass ROC-AUC scores and extract coordinate curves (False Positive Rate, True Positive Rate, and threshold values) per class using sklearn.metrics. Integrated adaptive downsampling (capping coordinate points at 100) to keep the JSON payload size minimal and avoid front-end performance degradation. Updated cross_validate_model to track mean and standard deviation of ROC-AUC across cross-validation splits and return fold-level coordinate metrics. Added try-except fallback wrappers to gracefully handle splits where target classes might be absent. Exposed these metrics in backend\/main.py by modifying both POST \/api\/train-model and POST \/api\/cross-validate endpoints to include ROC curves and coordinate data. Added 6 integration tests in tests\/test_model_api.py and 8 unit assertions in tests\/test_models.py verifying metric ranges and downsampling limits. All tests passed. Opened a chained Pull Request targeting branch feature\/day17-cross-validation.Git Commit Mesajları:[13:03] (ac12b8c) feat(models): integrate class-wise roc-auc and roc curve coordinates in ml moduleUpdated evaluate_model() to calculate overall ROC-AUC and extract One-vs-Rest (OVR) ROC curve coordinates (FPR, TPR, AUC) per class.Added adaptive coordinate downsampling (limit to 100 points) to optimize JSON payload size.Updated cross_validate_model() to compute mean_roc_auc and std_roc_auc across folds, returning fold-level curves.Added Try-Except safety blocks to handle cases with single-class test splits gracefully.Updated tests\/test_models.py key assertions and end-to-end evaluations.[16:22] (17fca7b) feat(api): expose roc-auc metrics and curve coordinates in model endpointsUpdated backend\/main.py model training and cross-validation endpoints to return the calculated ROC-AUC scores and per-class curve coordinates.Added integration assertions in tests\/test_model_api.py validating response structure containing roc_auc and roc_curves datasets.Verified all unit and API integration tests are passing."
},
{
"day": 19,
"date": "2026-08-07",
"content": "Subject of Work: Model Training Dashboard Integration, Pipeline State Management, and Dataset Guidelines UI RedesignDetailed Description: Completed the development of the \"ML Models\" Single Page Application (SPA) dashboard in frontend\/index.html, frontend\/style.css, and frontend\/app.js. Connected the training configuration panel to SVM, Random Forest, and XGBoost backend endpoints. Built a pipeline state-sharing mechanism that caches extracted features in a global state (lastFeatureState), allowing users to run classification models without re-uploading the dataset. Updated backend endpoints with is_feature_csv parameters to support direct feature matrix training. Formatted the ROC curve charts using Chart.js with showLine: true and smooth curves (tension: 0.3). Hid numeric input arrow spinners globally in CSS and corrected the showPage routing logic to hide both .page and .page-view classes. Redesigned the \"Dataset Guidelines\" page to display visual column ordering, requirements grids, and color-coded legend badges. Verified all validation pipeline API calls run successfully with no data leaks. Opened a chained Pull Request targeting branch day18-metrics.Git Commit Mesajları:[13:19] (d2f5fe9) feat(api): add pre-computed feature matrix support to ml endpointsAdded is_feature_csv and label_col parameters to \/api\/train-model and \/api\/cross-validate.Implemented fast-path to read feature matrix CSV directly, skipping redundant epoching and feature extraction.Enabled correct label column resolution and GroupKFold subject grouping for pre-computed feature CSVs.[13:29] (3525428) feat(ui): integrate pipeline state into ml models dashboard and fix routingSaved feature_csv, label_col, and epoch info to global lastFeatureState.Implemented updateMLPageFeatureState to auto-fill file selector and parameters on ML Models page navigation.Fixed showPage router to correctly hide .page elements when switching views.[14:26] (4dd9cd6) fix(ui): smooth roc chart lines and hide input spinnersSet showLine: true and tension: 0.3 for ROC curve scatter charts.Added CSS rules to hide up\/down input spinner arrows globally.[16:34] (b726f6d) feat(ui): redesign dataset guidelines page layoutAdded column order visual pills to Guidelines.Added minimum requirements grid for classes, rows, sampling rate, and channels.Improved sample CSV content with clear color-coded legend description."
},
{
"day": 20,
"date": "2026-08-10",
"content": "Subject of Work: Full System Test Verification, pytest Path Configuration Fix, and Final Project DocumentationDetailed Description: Executed the complete EEGFlow test suite (108 unit and integration tests) to verify end-to-end system stability before project finalization. Identified and resolved a persistent PYTHONPATH dependency issue that required manual environment variable configuration ($env:PYTHONPATH=\".\") on Windows prior to each pytest session. Created conftest.py at the project root, which automatically inserts the project directory into sys.path at collection time, allowing all 108 tests to pass with a plain pytest command without any prior environment configuration. Finalized README.md by adding a full project directory tree covering all backend utility modules, frontend assets, and test files; a technology stack summary (FastAPI, Scikit-learn, Chart.js); step-by-step virtual environment setup and dependency installation instructions; uvicorn server startup and browser access guidance; cross-platform pytest execution commands; a structured API endpoint reference table covering all 6 REST endpoints; and screenshot gallery placeholders for the Day 19 ML Models training and Group K-Fold Cross-Validation dashboards. Opened the final Pull Request targeting day19-model-ui as Milestone 3 project closeout.Git Commit Mesajları:[13:48] (4388c66) test: add conftest.py to auto-configure pytest sys.pathAdded conftest.py at project root to automatically insert the project root into sys.path.Eliminates the need to manually set PYTHONPATH before running pytest on Windows.All 108 tests passing without any environment variable configuration.[16:39] (4e40020) docs(readme): add installation guide, directory structure, api table and ml screenshotsAdded full project directory tree covering backend, frontend, and tests modules.Documented virtual environment setup, dependency installation, and uvicorn server startup steps.Added pytest execution instructions for Windows and Linux\/macOS environments.Added API endpoint reference table covering all 6 REST endpoints.Added screenshot gallery rows for ML Models training and Cross-Validation dashboards."
}
]
},
"28": {
"name": "Alesam Baath",
"email": "isambais15@gmail.com",
"repo": "https:\/\/github.com\/isambais\/SmartHome-EnergyRL",
"github_username": "isambais",
"start_date": "2026-07-13",
"end_date": "2026-08-07",
"total_days": 20,
"filled_days": 19,
"entries_sample": {
"first": {
"day": 1,
"date": "2026-07-13",
"content": "Bugün Ne Yapıldı?Projenin resmi başlangıcı olarak GitHub üzerinde SmartHome-EnergyRL adlı repository oluşturuldu ve staj boyunca izlenecek tüm geliştirme süreci bu repo üzerinden, branch\/PR akışıyla yönetilecek şekilde planlandı. Günün odağı kod yazmaktan çok, kalan 19 günün üzerine sağlam ve gri nokta bırakmayan bir temel inşa etmekti.Hazırlanan Belgelerimplementation_plan.md — Projenin tek doğruluk kaynağı (single source of truth) olarak tasarlandı. İçinde problem tanımı, RL ortam tasarımı (gözlem\/aksiyon\/ödül), sistem mimarisi, veri kaynakları, test stratejisi, 20 günlük yol haritası, git workflow ve risk yönetimi gibi 22 ayrı bölüm yer alıyor.README.md — Projenin ne olduğunu, hangi teknolojileri kullandığını, nasıl kurulup çalıştırılacağını özetleyen tanıtım dosyası yazıldı.requirements.txt — Projede kullanılacak kütüphaneler belirlendi: gymnasium (RL ortam arayüzü), stable-baselines3 ve torch (PPO algoritması), pandas\/numpy (veri işleme), xgboost ve statsmodels (fiyat tahmini), streamlit ve plotly (dashboard), tensorboard (deney takibi), pytest (test)..gitignore — Sanal ortam, önbellek ve ham\/gizli veri dosyalarının (ör. data\/raw\/*) repoya girmemesi için yapılandırıldı.Kararlaştırılan Mimari Yaklaşım — Curriculum LearningMentor geri bildirimiyle projenin en kritik riski netleşti: bir RL ajanını, tüm karmaşıklığı (batarya + güneş + ev talebi + ertelenebilir cihazlar) aynı anda tek seferde öğretmeye çalışmak yakınsama (convergence) sorununa yol açabilir. Bu yüzden ortam üç aşamalı bir \"curriculum\" (aşamalı öğretim) olarak tasarlandı:Aşama 1 — Saf Batarya Arbitrajı: Ajan sadece batarya doluluk seviyesi ve saatlik fiyatı görüp, ucuzken şarj edip pahalıyken deşarj etmeyi öğrenir.Aşama 2 — Pasif Tüketim ve Güneş Entegrasyonu: Ortama ev talebi ve güneş üretimi eklenir; ajan şebekeden çekmeden önce güneşi ve bataryayı kullanmayı (öz-tüketim) öğrenir.Aşama 3 — Ertelenebilir Cihazlar ve Tahmin Dayanıklılığı: Çamaşır makinesi gibi cihazların ne zaman çalıştırılacağı kararı eklenir, gerçek (oracle) fiyat yerine gürültülü tahmin verisiyle çalışılır.Bir sonraki aşamaya, mevcut aşamanın beklenen davranışı doğrulanmadan geçilmeyecek şekilde katı bir kural belirlendi (Gün 8, 11 ve 14 birer \"kalibrasyon checkpoint'i\" olarak planlandı).Proje Dizin YapısıKodun büyüyeceği modüler bir klasör yapısı önceden planlandı: src\/env (RL ortamı), src\/data (veri yükleyiciler), src\/agents (PPO eğitimi), src\/baselines (sezgisel karşılaştırma), src\/forecasting (fiyat tahmini), src\/evaluation (karşılaştırma\/metrikler), src\/dashboard (Streamlit arayüzü), ayrıca data\/, models\/, notebooks\/, tests\/ ve docs\/ klasörleri.Öğrenilenler \/ DeğerlendirmeBir RL projesinde en pahalı hata, kod yazmaya erken başlayıp yarı yolda mimariyi değiştirmektir. Bu yüzden ilk gün tamamen plana ayrıldı; bu sayede sonraki her gün \"ne yapacağım\" sorusuna değil doğrudan uygulamaya odaklanabilecek. Ayrıca reward hacking (ajanın ödül fonksiyonundaki bir açığı sömürmesi, örn. cihazı hiç çalıştırmayarak maliyeti düşürmesi) riski daha ilk günden yol haritasına ve risk tablosuna not edildi."
},
"middle": {
"day": 10,
"date": "2026-07-27",
"content": "Gün 10 — Pazartesi, 27 Temmuz 2026Öz-Tüketim Bonusu, Hiperparametre Optimizasyonu ve Dört Algoritma KarşılaştırmasıBugün projenin en kapsamlı günlerinden birini yaşadım. Ödül fonksiyonuna yeni bir bileşen ekledim, dört farklı algoritma için hiperparametre optimizasyonu çalıştırdım ve tüm modelleri 90 günlük değerlendirme testiyle karşılaştırdım.1. Öz-Tüketim Bonusunun Ödül Fonksiyonuna EklenmesiCurriculum Aşama 2'nin temel hedefi, ajanın güneş enerjisini önce ev ihtiyacı için kullanmayı, şebekeye satmadan önce tüketmeyi öğrenmesidir. Bu davranışı ödüllendirmek için energy_env.py dosyasına self_consumption_coef parametresi ve sc_bonus terimi ekledim.sc_bonus = self.self_consumption_coef * min(solar_kw, demand_kw)reward = revenue - cost - unmet_penalty - cycle_penalty + dr_bonus + sc_bonusBuradaki mantık şudur: güneş üretimi (solar_kw) ile ev talebi (demand_kw) arasındaki minimum değer, o saatte şebekeden bağımsız olarak karşılanabilecek maksimum enerji miktarını verir. Bu miktarın self_consumption_coef = 0.10 TL\/kWh katsayısıyla çarpılması, ajana güneş enerjisini öz-tüketim için2. Optuna ile Hiperparametre OptimizasyonuDört algoritma için varsayılan parametrelerle eğitim yapmak yerine, Optuna kütüphanesini kullanarak her algoritmanın kendi optimal hiperparametre setini aradım. Optuna, TPE (Tree-structured Parzen Estimator) örnekleyicisiyle 30 deneme yaparak en iyi parametre kombinasyonunu buluyor. Her deneme 15.000 adım çalışıp 10 bölümlük değerlendirme yapıyor.Neden Optuna kullandım çünkü Hiperparametreler (öğrenme hızı, indirim faktörü, ağ boyutu gibi) algoritmadan algoritmaya büyük fark yaratır. Elle deneme yanılma yerine sistematik arama yapılması zaman kazandırır3. Dört Algoritmanın Eğitimi (300.000 Adım)Her algoritma 300.000 adım boyunca Phase 2 ortamında eğitildi. PPO ve A2C on-policy algoritmalar olduğundan 4 paralel ortamda çalıştırıldı; SAC ve TD3 off-policy olduğundan tek ortamda replay buffer ile eğitildi.PPO eğitiminde dikkat çekici bir bulgu ortaya çıktı: Optuna'nın 15k adımlık denemelerde önerdiği parametreler (özellikle net_arch=512 ve yüksek gamma=0.986), 300k adımlık tam eğitimde tutarsızlığa yol açtı. clip_fraction=0.628 gibi çok yüksek bir değer gördüm; bu, politikanın her güncellemede çok büyük adımlar attığı ve dengesizleştiği anlamına gelir. Sonuç olarak PPO için daha önce kalibre edilmiş kararlı parametrelere geri döndüm.Bu durumdan önemli şey çıkarttım kısa denemeler için optimize edilmiş parametreler, uzun eğitimlerde her zaman aynı başarıyı göstermiyor. Özellikle büyük ağ boyutlarının (512×512) 300k adımda tam oturması zaman alıyor.4. 90 Günlük Değerlendirme SonuçlarıTüm modeller eğitildikten sonra eval_policy.py --days 90 ile değerlendirme yaptım. 90 farklı gün rastgele seçilip her politikanın o günkü ortalama kazancı ölçüldü.Curriculum Aşama 2 — 90 Günlük Değerlendirme (Varsayılan Parametreler):Politika OrtalamaTLStd Min MaksBekle (hold)-4.6712.27-31.28+23.34Rastgele-27.1119.91-87.19+18.69Eşik (threshold)-3.9415.87-48.87+21.76PPO+4.8413.05-25.40+30.08A2C-1.4313.89-25.40+30.08SAC+8.4314.24-24.83+33.39TD3+7.3913.54-24.87+31.31Phase 2'de \"Bekle\" stratejisi -4.67 TL veriyor. Bunun sebebi, güneş enerjisi tüketilmezse karşılanmayan talep cezasının devreye girmesidir. Yani Phase 2, Phase 1'den çok daha zorlu bir ortam — sadece pil arbitrajını öğrenmek yetmiyor, güneş entegrasyonunu da doğru yönetmek gerekiyor.SAC bu ortamda en başarılı algoritma oldu (+8.43 TL). Off-policy yapısı ve entropi maksimizasyonu sayesinde keşif ve sömürü dengesini iyi kurdu. TD3 de +7.39 TL ile güçlü bir ikinci oldu.5. Git WorkflowBugün yapılan tüm değişiklikler feature\/curriculum-phase2 branch'inde commit edildi ve GitHub'a push edildi.Commit'ler:1c9e0f1 feat: default vs optuna karşılaştırma scriptleri ve güncellenmiş optuna parametreleri90ecdff feat(optuna): SAC ve TD3 için Phase 2 Optuna arama scriptleri eklendiDeğiştirilen\/eklenen dosyalar:src\/env\/energy_env.py → sc_bonus ödül terimiscripts\/train_ppo\/a2c\/sac\/td3_phase2.py → Optuna parametreleriyle güncellendiscripts\/train_a2c\/sac\/td3_phase2_default.py → varsayılan parametre versiyonlarıscripts\/optuna_a2c\/sac\/td3_phase2.py → hiperparametre arama scriptlerinotebooks\/colab_train_phase2.ipynb → Colab eğitim notebook'u6. Yarın için PlanGece boyunca yerel makinede SAC ve TD3 modelleri Optuna ile bulunan hiperparametrelerle yeniden eğitilmeye devam edecek. Yarın sabah eğitimler tamamlandıktan sonra eval_policy.py --days 90 ile değerlendirme yapılacak ve varsayılan parametrelerle Optuna parametrelerinin 90 günlük karşılaştırma tablosu çıkarılacak. Böylece hiperparametre optimizasyonunun gerçek etkisi sayısal olarak ortaya konmuş olacak. Ardından rule_based.py Phase 2 baseline'ı yazılacak ve staj defteri Gün 11 tamamlanacak."
},
"last": {
"day": 19,
"date": "2026-08-07",
"content": "Gün 19 — Uçtan Uca Test (Sıfırdan Kurulum) & Deney Kayıt Defteri1. Bugün Ne Yapıldı?İki hedef vardı: (1) projeyi sıfırdan kurulumla baştan sona çalıştırıp uçtan uca doğrulamak, (2) proje boyunca üretilen tüm değerlendirme sonuçlarını tek bir izlenebilir kayıt dosyasında toplamak — docs\/experiments\/results-log.md.Temiz bir sanal ortam kuruldu, bağımlılıklar yüklenmeye başlandı, test paketinin ve değerlendirme scriptlerinin yapısı incelendi ve tüm faz sonuçları (Faz 1, 2, 3 ve tahmin robustluğu) kaynaklarıyla birlikte tek bir deney defterine işlendi.2. Uçtan Uca Kurulum — AdımlarKurulum, README'deki resmi akış izlenerek yapıldı:python -m venv .venvsource .venv\/bin\/activatepip install -r requirements.txtpytest -qpython scripts\/eval\/eval_policy.py --days 30python scripts\/forecast\/compare.pyKurulum gözlemi. Bağımlılıklar iki kategoride değerlendirildi:Hafif paketler (numpy, pandas, gymnasium, statsmodels, pytest, plotly): sorunsuz kuruldu. Ortam fiziği, veri hizalama ve kural tabanlı politikalar bu paketlerle torch olmadan çalışabiliyor.PyTorch + Stable-Baselines3: güncel torch PyPI tekerleği tek başına ~527 MB, üstüne gigabaytlarca nvidia-* CUDA bağımlılığı çekiyor. CPU-only tekerleğin geldiği download.pytorch.org indeksi kısıtlı ortamda erişime kapalıydı. Bu yüzden RL model yükleme gerektiren eval'lar bu kısıtlı ortamda yeniden koşulmadı; bunun yerine defterdeki sayılar projenin daha önce yerel makinede\/Colab'da üretip repoya işlediği gerçek çıktılardan derlendi ve her tablonun kaynağı açıkça belirtildi.Öğrenim: RL projelerinde \"sıfırdan kurulum\" testinin en kırılgan noktası derin öğrenme kütüphanelerinin (torch) platform\/GPU'ya bağlı devasa ikili bağımlılıklarıdır. Bir E2E test planı, bu ağır adımı ayrı bir \"GPU\/Colab ortamı\" ön koşulu olarak açıkça işaretlemeli; hafif doğrulamalar (ortam, veri, baseline, API katmanı) ise torch'suz koşabilecek şekilde ayrık tutulmalı. Bu, hızlı CI için de doğru mimari.3. Deney Kayıt Defteri — docs\/experiments\/results-log.mdBugüne kadar sonuçlar README, training-notes.md ve günlük staj defterlerine dağılmıştı. Hepsi tek bir izlenebilir dosyada toplandı. Her bölüm şunu içeriyor: hangi komut, hangi veri, hangi ortam parametreleri ve kaynak dosya.Toplanan bölümler:Değerlendirme ortamı — SmartHomeEnergyEnv parametreleri ve veri kapsamı.Faz 1 — 30 günlük net kazanç (SAC +8.98, PPO +7.67, A2C +3.19) ve ilk PPO eğitimi notları.Faz 2 — kural tabanlı baseline'ların Optuna öncesi\/sonrası (ThresholdPolicy −2.57 → +2.53 TL).Faz 3 — 74 günlük test setinde tahmin belirsizliğine robustluk tablosu (TD3 +14.72, SAC +14.38 Oracle) + cihaz çalıştırma oranı (reward-hacking kontrolü).Fiyat tahmin modelleri — LightGBM+Optuna %29.93 sMAPE, Ensemble %32.10.Test paketi — 7 dosya, ~24 test; torch gerektiren\/gerektirmeyen ayrımı.Yeniden üretim — sıfırdan kurulum komutları ve ortam notu.Özet çıkarımlar.4. Sonuçların Kısa YorumuEn iyi ajanlar TD3 ve SAC: 74 günlük test setinde +14–15 TL\/gün ve dört fiyat-bilgisi modunda ±0.2 TL içinde kalarak tahmin belirsizliğine robust.Off-policy > on-policy: SAC\/TD3, sürekli batarya kontrol probleminde PPO\/A2C'yi belirgin geçiyor; A2C bu problemde negatif.Kural tabanlı politikalar Optuna ile pozitife çekilebiliyor ama RL'in dağılımdan bağımsız kararlılığına ulaşamıyor (FcAware modlar arası 9 TL oynuyor).Reward-hacking kontrolü: PPO cihazı her modda tam kapasitede (0.083) çalıştırırken SAC (0.053) seçici davranıyor — ödül değeri tek başına yeterli metrik değil; device_activation_rate şart.5. Teknik Öğrenimlerİzlenebilirlik (reproducibility) bir dosya değil, bir disiplindir. Sonuç tablosuna değeri yazmak yetmiyor; o değeri üreten komut, veri kesiti ve ortam parametreleri olmadan sayı tekrar üretilemez. results-log.md bu üçlüyü her satırda zorunlu kıldı.Ağır bağımlılıkları izole et. Torch gibi platform bağımlı, gigabaytlık bağımlılıklar E2E akışının en kırılgan halkası. Hafif doğrulamaları (env, veri, baseline, API) torch'tan ayırmak hem hızlı geri bildirim hem de dayanıklı CI sağlar.Kaynak dürüstlüğü. Bir ortamda taze koşulamayan sonuçlar \"taze koşuldu\" gibi sunulmamalı. Defterde her tablo, üretildiği koşuma atıfla ve yeniden üretim komutuyla birlikte verildi.6. Git Commits (Gün 19)PR #XX: feat\/i18n-en-ar → main[hash] feat(i18n): TR\/EN\/AR çevirisi — landing + uygulama, RTL desteği         - i18n.jsx sözlük + LangProvider, TopNav dil seçici         - tüm sayfalar + ConfigPanel + Footer t() ile[hash] fix(landing): AnimatePresence dil-değişimi donması + toggle\/hero düzeltmeleri         - showcase kartları key={i} (IntersectionObserver kopması giderildi)         - mode=\"wait\" kilidi kaldırıldı, before\/after toggle CSS, hero AI rozeti[hash] feat(i18n): backend önerileri ve 3D bina HUD etiketi dile göre         - simulate.oneriler_kodlu (kod+parametre), Simulasyon.formatOneri         - threejs.building_html unit_label, backend \/api\/building-html dil[hash] docs: deney kayıt defteri (results-log.md) — tüm faz eval sonuçları[hash] docs: Gün 19 staj defteriNot: #XX ve [hash] yer tutucularını gerçek PR numarası ve commit hash'leriyle değiştir (git log --oneline -5).7. Pazaertesi (Gün 20)Projenin son kontrollerinin tamamlanması ve teslim sürecinin hazırlanması planlanmaktadır."
}
},
"full_text_length": 107245,
"all_entries": [
{
"day": 1,
"date": "2026-07-13",
"content": "Bugün Ne Yapıldı?Projenin resmi başlangıcı olarak GitHub üzerinde SmartHome-EnergyRL adlı repository oluşturuldu ve staj boyunca izlenecek tüm geliştirme süreci bu repo üzerinden, branch\/PR akışıyla yönetilecek şekilde planlandı. Günün odağı kod yazmaktan çok, kalan 19 günün üzerine sağlam ve gri nokta bırakmayan bir temel inşa etmekti.Hazırlanan Belgelerimplementation_plan.md — Projenin tek doğruluk kaynağı (single source of truth) olarak tasarlandı. İçinde problem tanımı, RL ortam tasarımı (gözlem\/aksiyon\/ödül), sistem mimarisi, veri kaynakları, test stratejisi, 20 günlük yol haritası, git workflow ve risk yönetimi gibi 22 ayrı bölüm yer alıyor.README.md — Projenin ne olduğunu, hangi teknolojileri kullandığını, nasıl kurulup çalıştırılacağını özetleyen tanıtım dosyası yazıldı.requirements.txt — Projede kullanılacak kütüphaneler belirlendi: gymnasium (RL ortam arayüzü), stable-baselines3 ve torch (PPO algoritması), pandas\/numpy (veri işleme), xgboost ve statsmodels (fiyat tahmini), streamlit ve plotly (dashboard), tensorboard (deney takibi), pytest (test)..gitignore — Sanal ortam, önbellek ve ham\/gizli veri dosyalarının (ör. data\/raw\/*) repoya girmemesi için yapılandırıldı.Kararlaştırılan Mimari Yaklaşım — Curriculum LearningMentor geri bildirimiyle projenin en kritik riski netleşti: bir RL ajanını, tüm karmaşıklığı (batarya + güneş + ev talebi + ertelenebilir cihazlar) aynı anda tek seferde öğretmeye çalışmak yakınsama (convergence) sorununa yol açabilir. Bu yüzden ortam üç aşamalı bir \"curriculum\" (aşamalı öğretim) olarak tasarlandı:Aşama 1 — Saf Batarya Arbitrajı: Ajan sadece batarya doluluk seviyesi ve saatlik fiyatı görüp, ucuzken şarj edip pahalıyken deşarj etmeyi öğrenir.Aşama 2 — Pasif Tüketim ve Güneş Entegrasyonu: Ortama ev talebi ve güneş üretimi eklenir; ajan şebekeden çekmeden önce güneşi ve bataryayı kullanmayı (öz-tüketim) öğrenir.Aşama 3 — Ertelenebilir Cihazlar ve Tahmin Dayanıklılığı: Çamaşır makinesi gibi cihazların ne zaman çalıştırılacağı kararı eklenir, gerçek (oracle) fiyat yerine gürültülü tahmin verisiyle çalışılır.Bir sonraki aşamaya, mevcut aşamanın beklenen davranışı doğrulanmadan geçilmeyecek şekilde katı bir kural belirlendi (Gün 8, 11 ve 14 birer \"kalibrasyon checkpoint'i\" olarak planlandı).Proje Dizin YapısıKodun büyüyeceği modüler bir klasör yapısı önceden planlandı: src\/env (RL ortamı), src\/data (veri yükleyiciler), src\/agents (PPO eğitimi), src\/baselines (sezgisel karşılaştırma), src\/forecasting (fiyat tahmini), src\/evaluation (karşılaştırma\/metrikler), src\/dashboard (Streamlit arayüzü), ayrıca data\/, models\/, notebooks\/, tests\/ ve docs\/ klasörleri.Öğrenilenler \/ DeğerlendirmeBir RL projesinde en pahalı hata, kod yazmaya erken başlayıp yarı yolda mimariyi değiştirmektir. Bu yüzden ilk gün tamamen plana ayrıldı; bu sayede sonraki her gün \"ne yapacağım\" sorusuna değil doğrudan uygulamaya odaklanabilecek. Ayrıca reward hacking (ajanın ödül fonksiyonundaki bir açığı sömürmesi, örn. cihazı hiç çalıştırmayarak maliyeti düşürmesi) riski daha ilk günden yol haritasına ve risk tablosuna not edildi."
},
{
"day": 2,
"date": "2026-07-14",
"content": "Bugün Ne Yapıldı?Yol haritasındaki Gün 2 hedefi doğrultusunda, projenin ilk gerçek kod modülü olan EpiasLoader yazıldı. Amaç, EPİAŞ Şeffaflık Platformu'ndan (seffaflik.epias.com.tr) indirilen Piyasa Takas Fiyatı (PTF) CSV dosyalarını okuyup, RL ortamının doğrudan kullanabileceği temiz ve standart bir saatlik fiyat serisine dönüştürmekti.Karşılaşılan Teknik Zorluk: Türkçe Sayı FormatıEPİAŞ'ın verdiği CSV dosyaları noktalı virgülle (;) ayrılmış ve fiyatlar Türkçe\/Avrupa sayı formatında geliyor — binlik basamaklar nokta ile, ondalık kısım virgül ile ayrılıyor (örnek: \"3.325,00\" aslında 3325.00 TL\/MWh demek). Python'un standart float() dönüşümü bu formatı doğrudan tanımadığı için, sayıyı önce binlik noktadan arındırıp sonra ondalık virgülü noktaya çeviren özel bir _parse_turkish_number() fonksiyonu yazıldı. Bu, ileride ortamın yanlış fiyat sinyaliyle beslenmesini önleyen kritik bir düzeltme.Yazılan Kod — EpiasLoader Sınıfıload_csv(filename): Tek bir günlük CSV dosyasını okur; Tarih ve Saat kolonlarını birleştirip gerçek bir datetime damgasına çevirir, fiyatı Türkçe formattan float'a çevirir, sonucu timestamp ve price_tl_mwh kolonlarına indirger ve zamana göre sıralar.load_range(filenames): Birden fazla günlük CSV dosyasını art arda okuyup tek, zamana göre sıralanmış bir seri hâlinde birleştirir — ileride ortamın çok günlük\/haftalık bölümler (episode) oluşturabilmesi için gerekli.Test Stratejisi ve DoğrulamaGerçek EPİAŞ dosyasına bağımlı, kırılgan bir test yazmak yerine (o dosya zaten .gitignore'da, repoya girmiyor), pytest'in tmp_path fixture'ı ile test sırasında geçici, küçük bir örnek CSV oluşturulup okundu. Üç birim testi yazıldı: (1) Türkçe sayı formatının doğru parse edildiğinin doğrulanması, (2) sonucun zamana göre sıralı (monotonic increasing) çıktığının doğrulanması, (3) timestamp kolonunun gerçekten datetime tipinde olduğunun doğrulanması.Kod, sadece yazılıp bırakılmadı — hem otomatik testler hem de gerçek bir 24 saatlik örnek PTF dosyasıyla elle çalıştırılarak doğrulandı: pytest çalıştırıldığında 3 test de (PASSED) geçti; gerçek dosyayla yapılan manuel kontrolde 24 satırın tamamı doğru okundu, en düşük fiyat 521,43 TL\/MWh ve en yüksek fiyat 4.009,65 TL\/MWh doğru şekilde ayrıştırıldı, kayıtlar saate göre sıralı çıktı.Git WorkflowDeğişiklikler doğrudan main branch'e değil, planda belirlenen kurala uygun şekilde feature\/epias-loader adlı ayrı bir branch üzerinde yapıldı. Dosyalar src\/data\/epias_loader.py ve tests\/test_epias_loader.py olarak eklendi, commit mesajı proje standardına uygun yazıldı: \"feat(data): EpiasLoader ve PTF veri parse testleri eklendi\". Ardından GitHub'da #7 numaralı Pull Request açıldı, dosya değişiklikleri (5 dosya, +133 satır) tek tek gözden geçirildi, main ile çakışma olmadığı doğrulandı ve PR onaylanıp main branch'e merge edildi.Sonraki Adım (Gün 3)Yol haritasına göre bir sonraki hedef, güneş üretimi ve ev talebi için açık veri kaynaklarının (NREL PVWatts, UK-DALE) araştırılması; bu kaynaklara erişim veya format uygun değilse parametrik sentetik profil üretimine geçiş planının netleştirilmesidir.Öğrenilenler \/ DeğerlendirmeGerçek dünya verisiyle çalışırken \"format varsayımı yapmamak\" gerektiğini somut olarak deneyimledim — EPİAŞ'ın sayı formatı ilk bakışta gözden kaçabilecek, ama sessizce yanlış (10-100 kat büyük\/küçük) fiyat üretebilecek bir hataydı. Ayrıca testleri gerçek harici bir dosyaya bağımlı yazmak yerine küçük, kontrollü bir örnek veriyle yazmanın testleri hem hızlı hem de tekrarlanabilir kıldığını gördüm."
},
{
"day": 3,
"date": "2026-07-16",
"content": "Bugün Ne Yapıldı?Yol haritasındaki Gün 3 hedefi doğrultusunda, güneş üretimi ve ev talebi için açık veri kaynakları araştırıldı. Sadece araştırmayla kalınmadı; her iki kaynak için de gerçek, çalışan ve test edilmiş kod yazıldı — plandaki \"erişilemezse sentetiğe geç\" yedek planına hiç gerek kalmadı, çünkü ikisi de gerçekten erişilebilir çıktı.Güneş Üretimi — NREL\/NLR PVWatts APIPVWatts API'si (ücretsiz, API key veya test için herkese açık DEMO_KEY ile erişilebiliyor) araştırıldı. SolarProfileGenerator sınıfı yazıldı: fetch_hourly_profile() PVWatts'tan TMY (Typical Meteorological Year) tabanlı 8760 saatlik üretim verisini çekiyor; align_to_dates() bu tipik yılı ay-gün-saat eşlemesiyle gerçek hedef tarihlere hizalıyor. Hem sahte (mock) testlerle hem gerçek API çağrısıyla (İstanbul koordinatları, 41.01\/28.98) doğrulandı — gerçek üretim verisi başarıyla alındı.Ev Talebi — UK-DALE Gerçek VeriUK-DALE veri seti (Jack Kelly & William Knottenbelt, Scientific Data 2015) indirildi (3.5 GB, sadece dağıtılmış\/disaggregated CSV kısmı). house_1\/channel_1.dat dosyasının evin \"aggregate\" (toplam güç) kanalı olduğu doğrulandı: 2012-2017 arası 4.3 yıllık, 6 saniyede bir ölçüm (21.8 milyon satır). DemandProfileGenerator sınıfı yazıldı: ham veriyi saatlik ortalamaya indirgiyor, çok yıllık veriden haftanın günü + saat bazında bir \"tipik hafta\" profili (168 değer) çıkarıyor. Gerçek veriyle doğrulandı: ortalama günlük tüketim 9.06 kWh, akşam 18-20 arası tepe (~520-530 W), gece düşük tüketim (~200-250 W) — gerçekçi bir ev paterni.Karşılaşılan Teknik Detay: Gürültü\/Varyans Eksikliğiİlk yazımda align_to_dates() fonksiyonu her hafta aynı saat için birebir aynı (deterministik) değeri döndürüyordu. implementation_plan.md Bölüm 8'in \"ortalama bir konut profiline indirgenir, gürültü eklenir\" talimatı fark edilip düzeltildi: artık her saat için gerçek veriden hesaplanan standart sapmaya göre normal dağılımdan örneklenmiş gerçekçi bir varyans ekleniyor (negatif olmayacak şekilde sıfırda kırpılıyor), tekrarlanabilirlik için sabit seed kullanılıyor.DokümantasyonGün 2 PR'ında bıraktığı \"docs eksik\" geri bildirimine yanıt olarak docs\/data-sources.md dosyası oluşturuldu — EPİAŞ, PVWatts ve UK-DALE kaynaklarının detayları, erişim yöntemleri, ham\/işlenmiş veri örnekleri ile.DoğrulamaSolarProfileGenerator: 4 birim test (mock) + gerçek PVWatts API çağrısıyla doğrulamaDemandProfileGenerator: 7 birim test (gürültü ve tekrarlanabilirlik testleri dahil) + gerçek 328 MB'lık dosyayla uçtan uca çalıştırma (21.8M satır → 37.843 saatlik nokta → 168 değerlik tipik hafta profili)Git Workflowfeature\/solar-profile ve feature\/demand-profile branch'leri açıldı, açıklamaları yazıldı.Commit mesajları:feat(data): PVWatts API ile SolarProfileGenerator eklendifeat(data): UK-DALE gercek veriyle DemandProfileGenerator eklendi, docs\/data-sources.md guncellendiSonraki Adım (Gün 4)implementation_plan.md'ye göre üç veri kaynağının (fiyat, güneş, talep) saatlik takvimde hizalanıp data\/processed\/ altında birleşik bir veri seti oluşturulması.Öğrenilenler \/ DeğerlendirmeGerçek veriyle çalışmak, sentetik veriye göre çok daha fazla \"sürpriz\" teknik detay çıkarıyor (Türkçe sayı formatı, UK-DALE'in kanal yapısı, PVWatts'ın TMY mantığı gibi) — ama bu sürprizleri erken yakalamak, ileride ortamı kurarken yanlış varsayımlarla ilerlemekten çok daha ucuz."
},
{
"day": 4,
"date": "2026-07-17",
"content": "Bugün Ne Yapıldı?implementation_plan.md Bölüm 8'de projedeki en kritik ön işleme adımı olarak işaretlenen hizalama görevi için build_dataset.py modülü yazıldı. Amaç: EpiasLoader'dan gelen fiyat serisini referans takvim olarak alıp, SolarProfileGenerator ve DemandProfileGenerator'ın ürettiği verileri bu takvime hizalayarak tek, ortamın doğrudan kullanabileceği bir CSV dosyasında birleştirmekti.Yazılan Kod — build_aligned_dataset() ve save_processed_dataset()build_aligned_dataset(), price_df'in zaman damgalarını referans alıp solar_generator.align_to_dates() ve demand_generator.align_to_dates() metotlarını çağırarak güneş ve talep verisini aynı saatlere oturtuyor, ardından üçünü timestamp üzerinden birleştiriyor. save_processed_dataset() sonucu data\/processed\/aligned_dataset.csv olarak kaydediyor.Karşılaşılan Teknik Karar: Erken Hata Fırlatma (Fail-Fast)Plan Bölüm 8'in \"bu adım aksarsa ortam yanlış sinyal üretir\" uyarısı ciddiye alınarak üç güvenlik kontrolü eklendi: (1) tekrarlanan zaman damgası varsa ValueError, (2) birleştirme sonrası satır sayısı değiştiyse ValueError, (3) eksik (NaN) değer kalırsa ValueError. Amaç, hizalama hatasının sessizce geçip haftalar sonra RL ortamında anlaşılmaz bir davranış olarak ortaya çıkmasını önlemekti.Doğrulamatests\/test_build_dataset.py: 4 birim testi — birleştirme doğruluğu, tekrarlanan zaman damgasında ValueError, satır sırasının korunması, CSV kaydet\/yeniden oku. Hepsi (PASSED) geçti.Uçtan uca gerçek veriyle çalıştırma: gerçek EPİAŞ tam yıl verisi (8784 saatlik satır) ve gerçek UK-DALE ev talebi verisiyle birleştirildi. Sonuç: 8784 satır, 0 eksik (NaN) değer, ortalama fiyat ≈2208 TL\/MWh, ortalama güneş üretimi ≈1.11 kW, ortalama ev talebi ≈0.385 kW.Not: Sandbox KısıtlamasıBu uçtan uca doğrulama koşusunda PVWatts API'sine sandbox'tan canlı erişim mümkün olmadı; güneş sütunu o tek entegrasyon testinde temsili bir eğriyle dolduruldu. SolarProfileGenerator'ın kendisi Gün 3'te gerçek PVWatts API'siyle ayrıca doğrulanmıştı; production kullanımında gerçek API verisi kullanılacak.Dokümantasyon Güncellemesidocs\/data-sources.md dosyasındaki Hizalama Notu bölümü hâlâ gelecek zamanla yazılmıştı; bölüm tamamlandığını belirtecek ve gerçek doğrulama rakamlarını içerecek şekilde güncellendi.Git Workflowfeature\/build-dataset branch'i açıldı, build_dataset.py ve test_build_dataset.py eklendi, umitunc reviewer olarak eklendi. Kanban board'da Gün 4 kartı (Issue #7) şu anda Review sütununda, onay bekleniyor.Commit mesajı (proje standardına uygun, feat(kategori): açıklama formatında):feat(data): uc veri kaynagini hizalayan build_dataset.py eklendigit log --oneline ile branch geçmişi kontrol edildi; feature\/build-dataset dalı PR #8 ve PR #9 merge edildikten sonraki güncel main üzerine kurulmuş. Tüm önceki commit'ler de standarda uygun, boş olmayan mesajlarla main'e sadece PR\/merge commit'leri üzerinden girmiş.Sonraki Adım (Gün 5)implementation_plan.md'ye göre Faz 1'in başlangıcı: src\/env\/energy_env.py içinde minimal bir SmartHomeEnergyEnv iskeleti — sadece batarya SOC'si ve 24 saatlik fiyat gözlemi, tek boyutlu battery_action ile Curriculum Aşama 1.Öğrenilenler \/ DeğerlendirmeBu gün bana veri hizalamanın neden en kritik ön işleme adımı olarak işaretlendiğini gösterdi: üç farklı veri kaynağı üç farklı takvim mantığına sahip ve bunları birleştirirken sessizce yanlış bir eşleme yapmak kolay olabilirdi. Erken hata fırlatma yaklaşımını burada bilinçli bir tasarım kararı olarak uyguladım."
},
{
"day": 5,
"date": "2026-07-20",
"content": "Bugün Ne Yapıldı?implementation_plan.md Bölüm 15 (Gün 5) ve Bölüm 6 (Curriculum Aşama 1) hedefi doğrultusunda, RL ajanının içinde çalışacağı ilk ve en basit ortam yazıldı: SmartHomeEnergyEnv. Bu ortam, projedeki üç aşamalı curriculum yaklaşımının ilk aşaması — sadece batarya ve elektrik fiyatı var; güneş, ev talebi ve cihazlar bilerek dışarıda bırakıldı.Gözlem ve Aksiyon Uzayı TasarımıGözlem uzayı 25 boyutlu: batarya SOC'si (0-1 arası tek değer) + günün 24 saatlik elektrik fiyatı (oracle, yani gerçek\/bilinen fiyat). Aksiyon uzayı tek boyutlu ve sürekli: battery_action ∈ [-1, 1] — pozitif değer şarj, negatif değer deşarj anlamına geliyor.Batarya Fizik Modelistep() fonksiyonu içine basit ama gerçekçi bir batarya modeli eklendi: round-trip efficiency (varsayılan %90) şarj ve deşarj verimliliği olarak karekök alınıp simetrik bölüştürüldü (charge_efficiency × discharge_efficiency = round_trip_efficiency). Şarj\/deşarj işlemleri her zaman batarya kapasitesine göre sınırlandırılıyor, yani SOC hiçbir zaman 0 ile 1 aralığının dışına çıkamıyor — bu, 200 rastgele adımlık bir testle doğrulandı.Görsel Doğrulama: render() ve pygameGerçek bir gymnasium ortamı gibi, canlı bir pencerede gösterdim. Bunun üzerine SmartHomeEnergyEnv'e gerçek bir render(render_mode='human') metodu eklendi — pygame ile batarya doluluk seviyesini (renk kodlu: kırmızı\/sarı\/yeşil), o anki aksiyonu (şarj\/deşarj\/bekle oku) ve günün fiyat grafiğini (o anki saat vurgulu) çizen bir pencere açılıyor.scripts\/watch_env.pyOrtamı her curriculum aşamasından sonra gözle doğrulamak için scripts\/watch_env.py adında kalıcı bir yardımcı script eklendi. Bu script, mümkünse data\/processed\/aligned_dataset.csv'deki gerçek EPİAŞ verisini kullanıyor; dosya yoksa (henüz üretilmediyse) gömülü gerçek bir güne düşüyor. Klavye ile (yukarı ok=şarj, aşağı ok=deşarj, boşluk=bekle) bataryayı bizzat yönetip günlük kazancı gözlemleyebiliyorum.Kod Standardı Kontrolü: Eksik Bulundu ve Düzeltildiİmplementation_plan.md Bölüm 12'nin \"tüm public fonksiyonlarda type hints\" şartına rağmen step(), reset(), render(), close() metotlarında eksik tip ipuçları vardı — eklendi. (2) Aynı bölümün \"black + ruff ile otomatik formatlama\/lint\" şartı hiç uygulanmamıştı — ilk kez çalıştırıldı: black 3 dosyayı yeniden biçimlendirdi, ruff bir import-sırası hatası buldu, ikisi de düzeltildi. Düzeltmelerden sonra tüm testler tekrar çalıştırılıp hâlâ geçtiği doğrulandıDoğrulamatests\/test_energy_env.py: 10 birim testi — SOC sınırları, şarj\/deşarj ödül işareti, boşken deşarjın no-op olması, bölüm süresi, tekrarlanabilirlik. Hepsi (PASSED) geçti.Gymnasium'un resmi gymnasium.utils.env_checker.check_env() fonksiyonu hatasız geçti (implementation_plan.md Bölüm 13 şartı).Basit bir eşik-tabanlı strateji (ucuzken şarj, pahalıyken deşarj) gerçek EPİAŞ verisiyle test edildi: 1 günde +16 TL kazanç, bataryayı hiç kullanmayan taban strateji ise 0 TL — arbitraj sinyalinin doğru çalıştığı doğrulandı.watch_env.py ile gerçek 15 Temmuz 2025 EPİAŞ verisi üzerinde klavye kontrollü elle test yapıldıGit Workflowfeature\/energy-env branch'i açıldı, src\/env\/energy_env.py, tests\/test_energy_env.py, scripts\/watch_env.py ve düzeltilmiş .gitignore eklendi.Commit mesajı:feat(env): SmartHomeEnergyEnv batarya arbitraji ortami eklendiPR #13 açıldı (\"Feature\/energy env\").Sonraki Adım (Gün 6)implementation_plan.md'ye göre Gün 6 hedefi ilk ödül fonksiyonu, check_env() doğrulaması ve birim testleriydi — bunların büyük kısmı Gün 5 içinde zaten tamamlandı (reward mantığı, check_env, 10 test). Gün 6'da kalan iş: ödül fonksiyonu ağırlıklarının gözden geçirilmesi ve varsa ek kalibrasyon; ardından Gün 7'de Stable-Baselines3 PPO ile ilk eğitim denemesine geçilecek.Öğrenilenler \/ DeğerlendirmeBu gün, projenin gerçek RL kısmına ilk kez dokunduğum gündü — önceki dört gün veri ve altyapıyla ilgiliydi, bugün ise ajanın içinde yaşayacağı ortamı kurdum. Bu bana, soyut bir problemi (batarya ne zaman şarj\/deşarj edilmeli) somut bir yazılım arayüzüne (gözlem\/aksiyon\/ödül) nasıl döktüğümü ilk elden gösterdi. Ayrıca 'kod çalışıyor' ile 'plana ve standartlara tam uyuyor' arasındaki farkın, sadece teoride değil pratikte de önemli olduğunu gördüm — bir özelliği bitirmiş olmak, onu gerçekten bitirmiş olmak anlamına gelmiyor; süreç disiplini (temiz commit geçmişi, kod standartları, dokümantasyon) kadar dikkat gerektiriyor. Bugün ayrıca kendi kodumu daha eleştirel gözle kontrol etmeyi ve küçük görünen bir ayrıntının bile büyük etkisi olabileceğini öğrendim"
},
{
"day": 6,
"date": "2026-07-21",
"content": "Gün 6 — Ödül Fonksiyonu ve Politika DeğerlendiriciGün 5'te SmartHomeEnergyEnv'in step() metoduna gömülü olan ödül hesabı, bağımsız bir _compute_reward() metoduna taşındı. Bu değişiklik yeni bir özellik eklemek değil; projenin ilerleyen aşamalarında (Gün 9, 13) ödül fonksiyonu değiştiğinde sadece tek bir metodun güncellenmesini sağlamak için yapıldı. Aynı gün içinde episode istatistikleri (toplam ödül, maliyet, gelir) info sözlüğüne eklendi; her bölümün sonu artık detaylı bir özet döndürüyor.Bunların yanı sıra üç farklı karar politikasını karşılaştıran scripts\/eval_policy.py scripti yazıldı ve ödül fonksiyonunun tasarım gerekçeleri docs\/reward-design.md dosyasında belgelendi.Teknik Detaylar_compute_reward() MetoduÖdül formülü: reward = revenue_tl - cost_tl. Şarj sırasında şebekeden çekilen enerji × fiyat maliyet olarak hesaplanıyor; deşarj sırasında bataryadan çıkan enerji × deşarj verimliliği × fiyat gelir olarak elde ediliyor. Ceza terimleri henüz yok — bunlar Curriculum Aşama 3'te (Gün 13+) eklenecek.Episode İstatistikleristep() metoduna toplam ödül, maliyet ve gelir sayaçları eklendi. Bölüm bitişinde (terminated=True) bu değerler info['episode'] sözlüğü içinde döndürülüyor. Eğitim sırasında her günün performansını takip etmek için temel altyapı kurulmuş oldu.Politika Karşılaştırması (eval_policy.py)30 gün üzerinde üç politika değerlendirildi:• Bekle (hiçbir şey yapma): 0.00 TL\/gün — alt referans sınırı• Rastgele: -0.32 TL\/gün — verimlilik kaybı nedeniyle zarar• Eşik (ucuza şarj, pahalıya deşarj): +31.52 TL\/gün — insan sezgisiGün 8'deki kalibrasyon checkpoint'inde PPO ajanının en azından eşik politikasını geçmesi bekleniyor.Yeni Birim Testleri (4 adet)• Bekle aksiyonunda ödül sıfır• Şarj edip hemen deşarj edince verimlilik kaybı nedeniyle net zarar• Yüksek fiyatta deşarj düşük fiyattan daha fazla kazandırır• Episode bitişinde info['episode'] anahtarı mevcutDoğrulama• 14 birim testi — hepsi PASSED (10 önceki + 4 yeni)• black + ruff: 3 dosya temiz• eval_policy.py: Bekle=0.00 TL, Rastgele=-0.32 TL, Esik=+31.52 TLGit WorkflowBranch: feature\/reward-functionCommit: feat(reward): _compute_reward metodu, episode istatistikleri, eval_policy scripti ve reward tasarım dokumanıSonraki AdımGün 7 — Stable-Baselines3 PPO ile ilk eğitim denemesi ve TensorBoard entegrasyonu.Öğrenilenler \/ DeğerlendirmeGün 6, projedeki ilk temizlik günüydü — yeni bir özellik eklemek yerine var olanı daha sürdürülebilir hale getirdik. Başta bu tür bir günün değerini anlamak zor; kod zaten çalışıyordu, neden değiştirelim ki? Ama ödül hesabını step() içinden çıkarıp _compute_reward()'a taşımanın gerekçesini kavrayınca bakış açım değişti: bir şeyin bugün çalışması ile yarın kolayca değiştirilebilir olması farklı şeyler. Gerçek bir projede kodu sadece bugünkü ihtiyaç için değil, ilerideki değişiklikleri göz önünde bulundurarak yazmak gerekiyor. Bu, mühendislik düşüncesinin benim için yavaş yavaş oturmaya başladığı bir gündü."
},
{
"day": 7,
"date": "2026-07-22",
"content": "Gün 7 — PPO ile İlk Eitim ve TensorBoardGün 6'da ödül fonksiyonu bağımsız hale getirilmişti ve politika karşılaştırma scripti çalışıyordu. Sıra artık ortama gerçek bir pekiştirmeli öğrenme algoritması bağlamaya gelmişti. Gün 7'de Stable-Baselines3 kütüphanesinin PPO implementasyonu kullanılarak scripts\/train_ppo.py yazıldı; model 50.000 adım boyunca eğitildi. Eğitim sırasında TensorBoard entegrasyonu kuruldu ve ödül eğrisi canlı olarak izlendi. Eğitilen model eval_policy.py'ye eklenerek kural tabanlı politikalarla karşılaştırıldı. Gün sonunda eğitilmiş ajanı pygame penceresiyle görselleştiren enjoy_ppo.py tamamlandı ve eğitim sürecini belgeleyen docs\/training-notes.md oluşturuldu.Teknik Detaylar:PPO Eğitimi (train_ppo.py)Stable-Baselines3'ün PPO implementasyonu kullanıldı. Ortam, eğitim verimliliğini artırmak için 4 paralel kopya olarak sarmalandı (make_vec_env). Hiperparametreler: learning_rate=3e-4, n_steps=512, batch_size=64, n_epochs=10, gamma=0.99, seed=42. Her 2.500 adımda bir EvalCallback devreye girerek o anki politikanın ortalama ödülünü ölçtü ve en iyi modeli models\/ dizinine kaydetti. Eğitim 50.000 adımda tamamlandı; ortalama bölüm ödülü başlangıçta -7.5 TL iken 50.000. adımda +15.3 TL'ye yükseldi.TensorBoard Entegrasyonumodel.learn() çağrısına tensorboard_log parametresi eklendi; eğitim logları logs\/ppo_smarthome dizinine yazıldı. Tarayıcıda python -m tensorboard.main --logdir logs\/ppo_smarthome komutuyla açılan gösterge panelinde ep_rew_mean (ortalama bölüm ödülü) ve train\/value_loss eğrileri izlendi. Ödül eğrisi yaklaşık 35.000. adıma kadar düzenli biçimde yükseldi, ardından düzleşti — bu, ajanın öğrenebileceği kadar öğrendiğinin göstergesi.Kurulum Sorunu ve Çözümüstable-baselines3[extra] kurulumunda pygame bileşeni SSL sertifika hatası verdi. [extra] olmadan yalnızca stable-baselines3 ve tensorboard kurulunca sorun ortadan kalktı. train_ppo.py dosyasında proje kök dizininin Python path'ine eklenmesi gereken satırlar (sys.path.insert, os.chdir) E402 import sırası kuralını ihlal ediyordu; ilgili satırlara # noqa: E402 etiketi eklenerek ruff kontrolü yerel olarak devre dışı bırakıldı.Politika Karşılaştırması (eval_policy.py)Eğitilmiş model ppo_policy olarak eval_policy.py'ye eklendi ve dört politika 30 gün üzerinden değerlendirildi:• Bekle (hiçbir şey yapma): 0.00 TL\/gün — alt referans sınırı• Rastgele: -6.49 TL\/gün — verimlilik kaybı nedeniyle zarar• Eşik (ucuza şarj, pahalıya deşarj): +31.52 TL\/gün — insan sezgisi, tam fiyat bilgisiyle• PPO: +15.32 TL\/gün — öğrenilmiş politika, sadece mevcut gözleme dayanarakPPO'nun eşik politikasının gerisinde kalması beklenen bir sonuçtu: eşik politikası gün içindeki tüm fiyatları önceden biliyor (oracle), PPO ise yalnızca mevcut durumu gözlemleyerek karar alıyor. Tek günlük veri üzerinde eğitilmesine karşın negatif olmayan bir ödül elde etmesi anlamlı.Görselleştirme (enjoy_ppo.py)Eğitilmiş model yüklenerek her adımda model.predict(obs, deterministic=True) ile karar alındı ve SmartHomeEnergyEnv'in render_mode='human' seçeneği üzerinden pygame penceresi açıldı. Pencerede sol tarafta batarya doluluk göstergesi (yeşil\/sarı\/kırmızı), sağ tarafta o günün 24 saatlik fiyat çubuk grafiği (o anki saat turuncu), ortada ajanın son kararı (SARJ \/ DESARJ \/ BEKLE) gösterildi. Mevcut tek günlük veriyle eğitildiğinden ajan yalnızca deşarj yaptı — bu, Gün 8'de gerçek 366 günlük EPIAS verisiyle yeniden eğitimde düzelecek.Yeni Birim Testleri (4 adet — test_train_ppo.py)• PPO eğitimi 500 adımda hatasız tamamlanıyor• Model dosyası kaydediliyor ve yeniden yüklenebiliyor• Eğitilmiş model geçerli aksiyonlar üretiyor (şekil (1,), aralık [-1, 1])• Eğitilmiş model 24 adımlık tam bir bölümü sonlandırabiliyorDoğrulama• 4 birim testi — hepsi PASSED• black + ruff: tüm dosyalar temiz• eval_policy.py: Bekle=0.00 TL, Rastgele=-6.49 TL, Esik=+31.52 TL, PPO=+15.32 TL• TensorBoard: ep_rew_mean eğrisi -7.5'ten +15.3'e yükseldi, 35.000. adımdan sonra düzleşti.Git WorkflowBranch: feature\/ppo-trainingCommit: feat(ppo): PPO egitimi, TensorBoard, enjoy_ppo, politika karsilastirmasi ve egitim notlariPR: #18 — açıldı.Sonraki AdımGün 8 — Kalibrasyon checkpoint'i: PPO gerçek 366 günlük EPIAS verisiyle yeniden eğitilecek ve eşik politikasını geçip geçemediği ölçülecek.Öğrenilenler \/ DeğerlendirmeGün 7, projedeki ilk gerçek eğitim günüydü. Bir algoritmanın 'öğrendiğini' okumak ile terminalde sayıların değiştiğini ve TensorBoard'da eğrinin yükseldiğini canlı olarak görmek arasında büyük bir fark var. ep_rew_mean -7.5'ten başlayıp +15.3'e çıkarken 'bu ajan gerçekten bir şey öğreniyor' duygusu çok somutlaştı.PPO'nun clip mekanizmasının ne işe yaradığını bu süreçte daha iyi kavradım: politikayı çok büyük adımlarla güncellemek yerine eski ve yeni politika arasındaki oranı [0.8, 1.2] bandında tutmak, öğrenmeyi kararlı kılıyor. Aksi hâlde ajan bir anda çok büyük bir güncelleme alıp öğrendiklerini unutabiliyor. tek günlük veriyle eğitimde daha fazla adım ezber anlamına geliyor, yeni bir şey öğretmiyor. Gün 8'de gerçek veriyle bu kısıt ortadan kalkacak."
},
{
"day": 8,
"date": "2026-07-23",
"content": "Gün 8 — Gerçek EPIAS Verisi, VecNormalize ve Çok Algoritmali EğitimGün 7'de PPO tek günlük yapay veriyle eğitilmişti ve eşik politikasının yarısı kadar ödül elde edebilmişti. Gün 8'in hedefi buydu: gerçek piyasa verisiyle yeniden kalibrasyon. Sabah EPIAS'tan indirilen 15.07.2025–15.07.2026 tarihleri arasındaki PTF verisini işleyerek başladım. Ardından Optuna ile en iyi hiperparametreleri buldum, PPO'yu 500.000 adım yeniden eğittim ve projeye iki yeni algoritma ekledim: A2C ve SAC. Günün sonunda altı farklı politikayı gerçek veriye karşı karşılaştıran bir grafik elimde vardı.Teknik DetaylarGerçek EPIAS Verisi (prepare_epias_data.py)Ham veri Türkçe sayı formatındaydı: '3.230,00' gibi binlik ayracı nokta, ondalık ayracı virgüldü. prepare_epias_data.py bu formatı parse ederek 8.784 saatlik temiz bir CSV oluşturdu. Ortalama fiyat 2.207,9 TL\/MWh, minimum 0,0, maksimum 4.500,0 TL\/MWh. Sentetik veri üreten generate_epias_data.py de yedek olarak eklendi.Optuna Hiperparametre Araması (optuna_search.py)20 deneme, her biri 10.000 adım. En iyi sonuç Trial #8'de geldi: 13,69 TL. Bulunan parametreler: learning_rate=3,25e-4, n_steps=256, batch_size=128, gamma=0,953. Bu parametreler tüm PPO eğitimlerinde kullanıldı.Seed Robustness (seed_robustness.py)Aynı hiperparametrelerle 5 farklı random seed (0–4) üzerinde 50.000 adım eğitim yapıldı. Sonuçlar: 13,14 — 11,13 — 11,53 — 11,11 — 12,56 TL. Ortalama 11,89 TL, standart sapma 0,81 TL. Std < 1 TL olduğu için model stabil kabul edildi.PPO Yeniden Eğitimi (train_ppo.py)Optuna parametreleri + 256×256 sinir ağı + VecNormalize + 4 paralel ortam + 500.000 adım. VecNormalize gözlem uzayını normalize ediyor: 300–4.500 TL\/MWh aralığındaki fiyatları [-3, 3] bandına çekiyor. Bu sayede sinir ağı daha hızlı öğreniyor. eval\/mean_reward: 13,0 TL.A2C Eğitimi (train_a2c.py)Advantage Actor-Critic algoritması PPO ile aynı VecNormalize altyapısıyla eğitildi. Temel farklar: n_steps=32 (PPO'nun 256'sına karşı), ent_coef=0,01 (entropi bonusu — keşfi artırır), learning_rate=7e-4. 500.000 adım, 4 paralel ortam. eval\/mean_reward: 12,1 TL. Eğitim süresi ~4 dakika — PPO'nun yarısı kadar.SAC Eğitimi (train_sac.py)Soft Actor-Critic, off-policy bir algoritmadır: geçmiş 200.000 deneyimi replay buffer'da tutar ve her güncellemede bunlardan rastgele örnekler çeker. Sadece anlık deneyimi kullanan PPO\/A2C'ye kıyasla çok daha sample-efficient. Sürekli aksiyon uzayı [-1, 1] için özellikle uygundur. 100.000 adımda PPO\/A2C'nin 500.000 adımdaki performansını yakaladı. eval\/mean_reward: 10,8 TL. Yarın 500.000 adımla yeniden denenecek.Politika Karşılaştırması — 30 GünAltı politika gerçek EPIAS verisi üzerinde 30 günlük değerlendirmeye tabi tutuldu:• Bekle: +0,00 TL — referans alt sınır• Rastgele: -4,56 TL — verimlilik kaybı nedeniyle zarar• Eşik (oracle): +20,99 TL — tüm gün fiyatlarını önceden biliyor• PPO: +12,97 TL — VecNormalize + 500k adım• A2C: +12,97 TL — PPO ile aynı stratejiye yakınsadı• SAC: +12,83 TL — yalnızca 100k adımla PPO seviyesini yakaladıEşik politikasının önde olması beklenen bir sonuç: o politika gün başlamadan 24 saatin tüm fiyatlarını biliyor (oracle). Gerçek dünyada bu bilgi mevcut değil. PPO bu kısıt altında eşiğin %62'sine ulaşıyor; bu anlamlı bir başarı.Doğrulama• eval_policy.py: Bekle=0,00 | Rastgele=-4,56 | Eşik=+20,99 | PPO=+12,97 | A2C=+12,97 | SAC=+12,83 TL• docs\/policy_comparison.png: 6 politika bar chart oluşturuldu• Seed robustness: 5 seed, std=0,81 TL — model stabil• black + ruff: tüm dosyalar temizGit WorkflowBranch 1: feature\/epias-calibration Commit: a98fd72 — feat(epias): gercek EPIAS verisi isleme, PPO yeniden egitimi, Optuna hiperparametre arama, seed robustness testi PR #19: feat(epias): gerçek piyasa verisi işleme, PPO kalibrasyon, Optuna optimizasyonu ve seed robustness testi eklendiBranch 2: feature\/multi-algo-training Commit: bcc0860 — feat(algos): A2C ve SAC egitimi, VecNormalize, eval ve grafik guncelleme PR #20: feat(algos): A2C ve SAC eğitimi, VecNormalize normalizasyonu ve çok algoritmali politika karşılaştırması eklendiSonraki AdımGün 9 iki adımdan oluşacak:• SAC 500.000 adım yeniden eğitilecek ve bugünkü 100.000 adımlık sonuçla karşılaştırılacak. Sample efficiency bulgusunun doğrulanması bekleniyor: SAC'ın daha az adımla ne kadar yaklaştığı net görülecek.• Curriculum Aşama 2 başlıyor: ortama sabit ev talebi (Load) ve güneş üretimi (PV) gözlemleri eklenecek. SolarProfileGenerator ve DemandProfileGenerator src\/data\/ altında zaten mevcut; SmartHomeEnergyEnv'e bağlanacak. Ödül fonksiyonu öz-tüketim önceliğini (önce ev ihtiyacı, sonra şebekeye satış) yansıtacak şekilde güncellenecek.Öğrenilenler \/ DeğerlendirmeGün 8'in en somut anı, VecNormalize'ı ekledikten sonra eğitimin çökmesiyle geldi. Hata mesajı 'eval env VecNormalize değil' diyordu. Eğitim ortamını normalize edince eval ortamının da aynı şekilde sarmalanması gerektiğini — ama training=False modunda — öğrendim. Normalizasyon istatistiklerinin pkl dosyasına kaydedilip yüklenmesi gerektiğini de bu süreçte kavradım.SAC'ın on-policy ve off-policy farkını teoride biliyordum ama replay buffer'ın pratikte ne anlama geldiğini ancak bugün anladım: SAC her güncellemede geçmişe bakıp 'bu deneyimi daha önce yaşamıştım, ne olmuştu?' diye sorabilir. PPO ise her adımda sadece o anki deneyimini kullanır ve atar. Bu yüzden SAC 5 kat daha az adımla aynı performansa ulaşabiliyor.PPO ile A2C'nin aynı sonucu vermesi de ilginç bir bulguydu. İki farklı algoritma, aynı basit ortamda aynı stratejiye yakınsadı. Bu, ortamın çok zor olmadığını gösteriyor — ama aynı zamanda 'doğru stratejiyi öğrenmek için büyük farklılıklar gerekmiyor' da diyebiliriz. Daha karmaşık bir ortamda SAC'ın avantajı daha belirgin çıkardı."
},
{
"day": 9,
"date": "2026-07-24",
"content": "Gün 9 — Gerçek Dünya Ortamı Yeniden Yazımı ve Curriculum Aşama 2Gün 8'in sonunda SAC'ın sample efficiency avantajı net görünmüştü ve Gün 9 için iki hedef belirlenmişti: SAC'ı 500.000 adımla yeniden eğitmek ve Curriculum Aşama 2'yi başlatmak. Ancak Aşama 2'ye geçmeden önce ortamın kendisini köklü biçimde yeniden yazmak gerektiği anlaşıldı. Gün 7–8'de kullanılan SmartHomeEnergyEnv yalnızca pil arbitrajı yapıyordu; sabit verimlilik varsayıyordu, güneş ve talebi gözlemlemiyordu, şebeke kesintilerini modellemiyordu. Gerçek dünya bunu kabul etmez.Teknik DetaylarOrtam Yeniden Yazımı (energy_env.py)SmartHomeEnergyEnv baştan yazıldı. Aşama 1'de gözlem boyutu 56, Aşama 2'de 104. Yapı şu şekilde: obs[0]=SoC, obs[1]=SoH, obs[2:6]=zaman özellikleri (sin\/cos saat ve gün), obs[6]=şebeke durumu, obs[7]=DR sinyali, obs[8:32]=bugünün 24 saatlik fiyatları, obs[32:56]=yarının 24 saatlik fiyat tahmini (±%5 gürültü). Aşama 2'de ek olarak obs[56:80]=güneş profili, obs[80:104]=talep profili.Eklenen gerçek dünya özellikleri: asimetrik fiyatlandırma (satış = alış × 0,60), SoH bozunumu (her döngü kWh başına 5×10⁻⁶ degradasyon), öz-deşarj (saatte %0,05 kayıp), minimum SoC rezervi (%10 altına inemez), değişken verimlilik (eff = 0,98 − 0,10×|aksiyon|, SoC %85 üstü veya %15 altındaysa ek ceza), şebeke kesintisi (%0,2 olasılık\/saat, ada modu — alım\/satım yapılamaz), talep yanıtı sinyali (%5 olasılık\/saat, net ihracat bonusu), stokastik güneş ve talep profilleri (bölüm başı rassal ölçekleme, güneş std=%10, talep std=%15).Phase 2 Eğitim ScriptleriDört algoritma için Aşama 2 eğitim scriptleri oluşturuldu. PPO: lr=3,25e-4, n_steps=256, batch_size=128, gamma=0,953, 300k adım, 4 paralel ortam. A2C: lr=7e-4, n_steps=32, ent_coef=0,01, 300k adım, 4 paralel ortam. SAC: lr=3e-4, buffer_size=200k, batch_size=256, gamma=0,95, 300k adım. TD3: NormalActionNoise(sigma=0,1), policy_delay=2, target_policy_noise=0,2, 300k adım. Tüm modeller VecNormalize ile sarmalandı.Veri Hizalama (build_phase2_dataset.py)EPIAS PTF fiyatı, PVWatts güneş üretimi ve UK-DALE ev talebi aynı saatlik takvimde birleştirilerek data\/processed\/aligned_dataset.csv oluşturuldu. 8.784 satır, NaN yok.Politika KarşılaştırmasıAşama 1 (30 gün, yalnızca fiyat arbitrajı): Bekle=0,00 | Rastgele=-26,72 | Eşik=-3,43 | PPO=+7,67 | A2C=+3,19 | SAC=+8,98 TL.Aşama 2 (50 gün, güneş + talep + pil): Bekle=-2,17 | Rastgele=-25,68 | Eşik=-2,99 | PPO=+7,73 | A2C=+1,29 | SAC=+10,90 | TD3=+10,03 TL.Bekle politikasının Aşama 2'de negatife düşmesi beklenen ve doğru bir sonuç: güneş+talep ortamında hiçbir şey yapmayanın karşılanmayan talep cezası alması gerekiyor. SAC bu karmaşık ortamda da zirveye oturdu; TD3 yakın takipte. A2C'nin zayıf kalması beklenen bir sonuç — on-policy yapısı ve 300k adım bu ortam için yeterli değildi.Doğrulamaeval_policy.py: her iki aşama için 7 politika karşılaştırıldı, sonuçlar tutarlı. docs\/policy_comparison_phase2.png: 7 politika bar chart, hata çubukları dahil. Ortam testleri: Phase1 obs=(56,), Phase2 obs=(104,), min_soc_reserve çalışıyor, sell_ratio=0,60 doğrulandı.Git WorkflowBranch: feature\/curriculum-phase2 Commit: b566230 — feat(env+algos): kapsamlı gerçek dünya ortamı yeniden yazıldı, Curriculum Aşama 2 tüm algoritmalar ve karşılaştırma grafikleri eklendi PR #21: feat(env+algos): Curriculum Aşama 2 — Gerçek Dünya Ortamı + 4 Algoritma (PPO\/A2C\/SAC\/TD3)Sonraki AdımGün 10'da Optuna ile Aşama 2 hiperparametre araması yapılacak (optuna_phase2.py, 30 deneme). En iyi parametrelerle PPO ve SAC yeniden eğitilecek, uzun vadeli karşılaştırma için eval süresi 30'dan 90 güne çıkarılacak.Öğrenilenler \/ DeğerlendirmeGün 9'un en önemli kararı ortamı baştan yazmaktı. Aşama 2'ye geçmek için yalnızca güneş ve talep eklemek yeterli değildi; bunları doğru modellemek için asimetrik fiyat, SoH, öz-deşarj ve şebeke kesintisini de dahil etmek gerekiyordu. Aksi hâlde model gerçek dünyada işe yaramaz.TD3'ün SAC'a bu kadar yakın çıkması beklenmedik ama anlamlı bir bulgu: deterministic policy gradient bazen SAC'ın entropi terimi olmadan da yeterli. Off-policy algoritmaların karmaşık ortamlarda on-policy'ye olan üstünlüğü Aşama 2'de çok daha net görüldü — A2C ile SAC arasındaki fark Aşama 1'de 5,79 TL iken Aşama 2'de 9,61 TL'ye çıktı."
},
{
"day": 10,
"date": "2026-07-27",
"content": "Gün 10 — Pazartesi, 27 Temmuz 2026Öz-Tüketim Bonusu, Hiperparametre Optimizasyonu ve Dört Algoritma KarşılaştırmasıBugün projenin en kapsamlı günlerinden birini yaşadım. Ödül fonksiyonuna yeni bir bileşen ekledim, dört farklı algoritma için hiperparametre optimizasyonu çalıştırdım ve tüm modelleri 90 günlük değerlendirme testiyle karşılaştırdım.1. Öz-Tüketim Bonusunun Ödül Fonksiyonuna EklenmesiCurriculum Aşama 2'nin temel hedefi, ajanın güneş enerjisini önce ev ihtiyacı için kullanmayı, şebekeye satmadan önce tüketmeyi öğrenmesidir. Bu davranışı ödüllendirmek için energy_env.py dosyasına self_consumption_coef parametresi ve sc_bonus terimi ekledim.sc_bonus = self.self_consumption_coef * min(solar_kw, demand_kw)reward = revenue - cost - unmet_penalty - cycle_penalty + dr_bonus + sc_bonusBuradaki mantık şudur: güneş üretimi (solar_kw) ile ev talebi (demand_kw) arasındaki minimum değer, o saatte şebekeden bağımsız olarak karşılanabilecek maksimum enerji miktarını verir. Bu miktarın self_consumption_coef = 0.10 TL\/kWh katsayısıyla çarpılması, ajana güneş enerjisini öz-tüketim için2. Optuna ile Hiperparametre OptimizasyonuDört algoritma için varsayılan parametrelerle eğitim yapmak yerine, Optuna kütüphanesini kullanarak her algoritmanın kendi optimal hiperparametre setini aradım. Optuna, TPE (Tree-structured Parzen Estimator) örnekleyicisiyle 30 deneme yaparak en iyi parametre kombinasyonunu buluyor. Her deneme 15.000 adım çalışıp 10 bölümlük değerlendirme yapıyor.Neden Optuna kullandım çünkü Hiperparametreler (öğrenme hızı, indirim faktörü, ağ boyutu gibi) algoritmadan algoritmaya büyük fark yaratır. Elle deneme yanılma yerine sistematik arama yapılması zaman kazandırır3. Dört Algoritmanın Eğitimi (300.000 Adım)Her algoritma 300.000 adım boyunca Phase 2 ortamında eğitildi. PPO ve A2C on-policy algoritmalar olduğundan 4 paralel ortamda çalıştırıldı; SAC ve TD3 off-policy olduğundan tek ortamda replay buffer ile eğitildi.PPO eğitiminde dikkat çekici bir bulgu ortaya çıktı: Optuna'nın 15k adımlık denemelerde önerdiği parametreler (özellikle net_arch=512 ve yüksek gamma=0.986), 300k adımlık tam eğitimde tutarsızlığa yol açtı. clip_fraction=0.628 gibi çok yüksek bir değer gördüm; bu, politikanın her güncellemede çok büyük adımlar attığı ve dengesizleştiği anlamına gelir. Sonuç olarak PPO için daha önce kalibre edilmiş kararlı parametrelere geri döndüm.Bu durumdan önemli şey çıkarttım kısa denemeler için optimize edilmiş parametreler, uzun eğitimlerde her zaman aynı başarıyı göstermiyor. Özellikle büyük ağ boyutlarının (512×512) 300k adımda tam oturması zaman alıyor.4. 90 Günlük Değerlendirme SonuçlarıTüm modeller eğitildikten sonra eval_policy.py --days 90 ile değerlendirme yaptım. 90 farklı gün rastgele seçilip her politikanın o günkü ortalama kazancı ölçüldü.Curriculum Aşama 2 — 90 Günlük Değerlendirme (Varsayılan Parametreler):Politika OrtalamaTLStd Min MaksBekle (hold)-4.6712.27-31.28+23.34Rastgele-27.1119.91-87.19+18.69Eşik (threshold)-3.9415.87-48.87+21.76PPO+4.8413.05-25.40+30.08A2C-1.4313.89-25.40+30.08SAC+8.4314.24-24.83+33.39TD3+7.3913.54-24.87+31.31Phase 2'de \"Bekle\" stratejisi -4.67 TL veriyor. Bunun sebebi, güneş enerjisi tüketilmezse karşılanmayan talep cezasının devreye girmesidir. Yani Phase 2, Phase 1'den çok daha zorlu bir ortam — sadece pil arbitrajını öğrenmek yetmiyor, güneş entegrasyonunu da doğru yönetmek gerekiyor.SAC bu ortamda en başarılı algoritma oldu (+8.43 TL). Off-policy yapısı ve entropi maksimizasyonu sayesinde keşif ve sömürü dengesini iyi kurdu. TD3 de +7.39 TL ile güçlü bir ikinci oldu.5. Git WorkflowBugün yapılan tüm değişiklikler feature\/curriculum-phase2 branch'inde commit edildi ve GitHub'a push edildi.Commit'ler:1c9e0f1 feat: default vs optuna karşılaştırma scriptleri ve güncellenmiş optuna parametreleri90ecdff feat(optuna): SAC ve TD3 için Phase 2 Optuna arama scriptleri eklendiDeğiştirilen\/eklenen dosyalar:src\/env\/energy_env.py → sc_bonus ödül terimiscripts\/train_ppo\/a2c\/sac\/td3_phase2.py → Optuna parametreleriyle güncellendiscripts\/train_a2c\/sac\/td3_phase2_default.py → varsayılan parametre versiyonlarıscripts\/optuna_a2c\/sac\/td3_phase2.py → hiperparametre arama scriptlerinotebooks\/colab_train_phase2.ipynb → Colab eğitim notebook'u6. Yarın için PlanGece boyunca yerel makinede SAC ve TD3 modelleri Optuna ile bulunan hiperparametrelerle yeniden eğitilmeye devam edecek. Yarın sabah eğitimler tamamlandıktan sonra eval_policy.py --days 90 ile değerlendirme yapılacak ve varsayılan parametrelerle Optuna parametrelerinin 90 günlük karşılaştırma tablosu çıkarılacak. Böylece hiperparametre optimizasyonunun gerçek etkisi sayısal olarak ortaya konmuş olacak. Ardından rule_based.py Phase 2 baseline'ı yazılacak ve staj defteri Gün 11 tamamlanacak."
},
{
"day": 11,
"date": "2026-07-28",
"content": "Gün 11 — Salı, 28 Temmuz 2026Phase 1 → Phase 2 Karşılaştırması, Kural Tabanlı Baseline Politikalar ve Optuna HPOBugün iki hedefi aynı anda tamamladım: implementation planının Gün 11 görevini (Phase 1 politikasıyla karşılaştırma) ve Gün 12 görevini (kural tabanlı baseline'ların kodlanması). Paralel yürütmek, hem kontrol noktasını geçmemi hem de yarınki iş yükünü hafifletmemi sağladı.1. Phase 1 → Phase 2 KarşılaştırmasıGün 11'in asıl sorusu şuydu: Curriculum Aşama 2'de eklenen karmaşıklık (güneş + talep + SoH bozunumu + şebeke kesintisi), Aşama 1'de öğrenilen arbitraj davranışını bozdu mu?Bunu test etmek için Aşama 1 ve Aşama 2 sonuçlarını aynı tabloda karşılaştırdım:AlgoritmaAşama 1 (TL)Aşama 2 Default (TL)Aşama 2 + Optuna (TL)SonuçPPO+7.67+4.84+7.11StabilA2C+3.19−1.43+1.71ZorlandıSAC+8.98+8.43+12.92İyileştiTD3+5.04+7.39+12.46İyileştiKontrol geçti. SAC ve TD3, Aşama 2'de Optuna ile Aşama 1 performansını geçti. A2C, on-policy yapısı ve sınırlı adım sayısı nedeniyle yeni değişkenlerle başa çıkmakta zorlandı; bu beklenen bir sonuçtur. En önemli bulgu şu: off-policy algoritmalar (SAC, TD3) daha karmaşık ortamdan beslendi ve iyileşti; ortam bozulmadı.2. Kural Tabanlı Baseline Politikaların Yazılmasısrc\/baselines\/rule_based.py dosyasına 6 politika sınıfı eklendi. Hepsi aynı (obs, env) → np.ndarray imzasını paylaşır, böylece eval_policy.py tek bir döngüde tüm politikaları çalıştırabilir.ThresholdPolicy — 24 saatlik fiyat dağılımının alt ve üst persantillerine göre şarj\/deşarj kararı. \"Gece ucuzken şarj et, akşam pahalıyken sat\" sezgisel kuralının sayısal ifadesi.SelfConsumptionPolicy — Güneş fazlası varsa önce bataryayı şarj et; akşam fiyat yükselince deşarj et. Aşama 2'nin öz-tüketim hedefini elle kodlanmış kuralla modeller.ToUPolicy — TEDAŞ T2 çok zamanlı tarife yapısını modelleyen saat bloku politikası. Fiyata bakmaz; 17:00–22:00 pik saatte deşarj, 23:00–07:00 gece saatinde şarj.ForecastAwarePolicy — Gözlemdeki yarınki fiyat tahminini (obs[32:56]) de değerlendirerek \"yarın pahalıysa bugün agresif şarj et\" kararı verir. Tesla Powerwall tarzı gün öncesi entegrasyonu modellemektedir.PeakShavingPolicy — Net şebeke çekişi (talep − güneş) belirlenen eşiği aştığında bataryadan karşıla. Ticari binalarda talep bedelini düşürmeye yönelik politika.GridAwarePolicy — obs[6] şebeke kesintisi ve obs[7] talep yanıtı sinyalini izler. Kesintide bataryayı rezerv olarak tutar; DR sinyalinde şebekeden çekmeyi keser.3. Optuna ile Baseline Hiperparametre Optimizasyonuscripts\/hpo\/rule_based_optuna.py ile her politika için 50 deneme, 30 günlük değerlendirme yapıldı. Sinir ağı yok — sadece eşik değerleri, persantiller, saat blokları gibi kural parametreleri arandı.PolitikaVarsayılan (TL)Optuna (TL)İyileşmeThresholdPolicy−3.94+2.53+6.47ForecastAwarePolicy−4.91+1.80+6.71GridAwarePolicy−2.97+1.35+4.32SelfConsumptionPolicy−7.47−2.46+5.01PeakShavingPolicy−9.95−4.85+5.10ToUPolicy−15.95−15.59+0.36En dikkat çekici bulgu: ThresholdPolicy, Optuna ile −3.94 TL'den +2.53 TL'ye taşındı; yani pozitife geçti. Ancak en iyi baseline bile SAC'ın (+12.92 TL) beşte birine ulaşamadı. ToU politikası ise yapısal olarak optimize edilemeyen bir politika — hangi saat bloğunu seçersen seç sonuç değişmiyor.4. Test Suitetests\/test_rule_based.py dosyasına 7 sınıf için 312 satır birim testi yazıldı. DummyEnv ve make_obs() fabrika fonksiyonları oluşturuldu. Sınır koşulları test edildi: SOC=0 ile kesintide GridAwarePolicy, DR sinyalinde boş batarya, güneş talebi aşan PeakShaving gibi durumlar. Tüm testler PASSED.5. Dokümantasyon ve GörsellerREADME tamamen yeniden yazıldı: akış diyagramı, curriculum tablosu, baseline sonuç tablosu eklendi. Dört grafik üretildi:policy_comparison_phase1_vs_phase2.png — Phase 1 ve Phase 2 yan yana gruplu çubuk grafikpolicy_comparison_phase1.png — Aşama 1 tek grafikpolicy_comparison_phase2.png — Aşama 2 default (90 gün)policy_comparison_baseline_optuna.png — Varsayılan vs Optuna baseline karşılaştırması6. Git Workflow6. Git WorkflowBugünkü değişiklikler feat\/phase2-sc-bonus-optuna branch'inde commit edildi.Commit'ler:e1a33e3 docs: README tamamen yeniden yazildi — akis diyagrami, curriculum, baseline tablosu5365010 docs: ASCII diyagram Mermaid flowchart ile degistirildif0c0514 docs: sonuclar tablosu, ortam parametreleri, curriculum tablosuc913ae8 docs: Phase 1\/2 politika karsilastirma grafikleri ve baseline-optuna gorseli eklendiDeğiştirilen \/ eklenen dosyalar: src\/baselines\/rule_based.py, src\/baselines\/__init__.py, scripts\/hpo\/rule_based_optuna.py, tests\/test_rule_based.py, scripts\/train\/td3_phase1.py, README.md, docs\/policy_comparison_phase1_vs_phase2.png, docs\/policy_comparison_baseline_optuna.png7. Yarın için PlanGün 12: src\/forecasting\/price_forecast.py modülü yazılacak — XGBoost veya ARIMA ile 24 saatlik fiyat tahmini. Geçmiş EPİAŞ verisiyle eğitilip MAPE (tahmin hatası) raporlanacak. Ardından aynı eğitilmiş RL ajanı oracle \/ tahmin \/ naive fiyat modlarında test edilecek."
},
{
"day": 12,
"date": "2026-07-29",
"content": "Gün 12 — Aşama 3: Hibrit Aksiyon Uzayı ve Ertelenebilir Yük1. Bugün Ne Yapıldı?Uygulama planının 12. günü kapsamında, src\/env\/energy_env.py dosyasına Aşama 3 desteği eklendi. Mevcut tek boyutlu sürekli aksiyon uzayı (Box(shape=(1,))), batarya + ertelenebilir cihaz kontrolünü birlikte barındıran iki boyutlu bir yapıya (Box(shape=(2,))) dönüştürüldü. Ek olarak gerçekçi multi-step cihaz çalışma modeli, günlük aktivasyon sınırı ve tüm kural tabanlı politikaların Aşama 3 uyumluluğu sağlandı.2. Hibrit Aksiyon Uzayı Tasarımıaction[0] ∈ [-1, 1]  →Batarya kontrolü (sürekli)action[1] ∈ [-1, 1]  →Ertelenebilir yük sinyali (ayrıklaştırılır)> 0 ve saat penceresi içinde →cihazı çalıştır                          ≤ 0 veya pencere dışında     →çalıştırmaGymnasium Tuple veya Dict aksiyon uzayları Stable-Baselines3'ün tüm algoritmalarıyla uyumlu değildir; bu nedenle ayrık sinyali sürekli uzaya gömme (embedding) yöntemi tercih edildi. step() içinde int(action[1] > 0.0 and in_window) ile anlık ayrıklaştırma yapılmaktadır.3. Gözlem Uzayı Güncellemesienable_deferrable=True olduğunda gözlemin sonuna 2 yeni eleman eklendi:İndeksAlanAçıklama[-2]device_used_today0=henüz çalıştırılmadı, 1=bugün en az bir kez çalıştı[-1]device_steps_remaining_normKalan çalışma adımı \/ toplam adım [0,1]AşamaGözlem BoyutuAşama 156Aşama 2104Aşama 3 (Faz 1 üstünde)58Aşama 3 (Faz 2 üstünde)1064. Multi-Step Cihaz Çalışma ModeliGerçekçi cihaz davranışı: çamaşır makinesi gibi cihazlar başlatılınca deferrable_load_hours saat boyunca durdurulamaz biçimde çalışır.# Aktivasyon: sadece cihaz çalışmıyorsa + pencere içi + limit dolmamışsaif action[1] > 0 and in_window and under_limit and not_running:   device_steps_remaining = round(deferrable_load_hours)# Her adımda: çalışıyorsa yük uygula ve geri say (durdurulamaz)if device_steps_remaining > 0:   device_steps_remaining -= 1   demand += deferrable_load_power_kw5. Reward Hacking Cezası ve Aktivasyon LimitiEpisode sonu cezası: Cihaz gün boyunca hiç çalıştırılmazsa -2.0 TL ceza.Günlük aktivasyon limiti (max_activations_per_day=2): Ajan aynı cihazı günde 2'den fazla çalıştıramaz. Cihazı sürekli açıp kapatan politikaları engeller.6. Kural Tabanlı Politikaların Aşama 3 Uyumluluğusrc\/baselines\/rule_based.py modülüne _make_action() yardımcı fonksiyonu eklendi. enable_deferrable=True ortamda tüm 7 politika otomatik olarak (2,) aksiyon döndürür.PolitikaDeferrable StratejisiHoldPolicyHiç çalıştırmaThresholdPolicyUcuz fiyat diliminde çalıştırSelfConsumptionPolicyGüneş fazlasında çalıştırToUPolicyGündüz orta dilimde çalıştır (pik\/gece dışında)ForecastAwarePolicyGünün en ucuz %25'inde çalıştırPeakShavingPolicyNet çekiş düşükken çalıştırGridAwarePolicyKesinti\/DR yoksa ve fiyat ucuzsa çalıştır7. Episode Metrik Takibi\"device_activation_count\": int   # gün içi toplam aktivasyon sayısı\"device_activation_rate\": float  # aktivasyon_sayısı \/ saat_sayısı8. Geriye Dönük Uyumlulukenable_deferrable=False (varsayılan) ile ortam, Aşama 1 ve Aşama 2 davranışını tam olarak korur.9. TestlerDosyaYeni TestToplamtests\/test_energy_env.py+17 (Aşama 3)28tests\/test_rule_based.py+15 (Faz 3 deferrable)54Toplam+3265\/65 pytest tests\/test_energy_env.py tests\/test_rule_based.py -v → 65\/65 geçti.10. PR Review — Feedback ve DüzeltmePR açıldıktan sonra iki teknik yorum geldi:Aksiyon uzayı tasarımı: spaces.Box ile ayrık sinyal gömmek SB3 uyumluluğu açısından doğru tercih. İleride SB3 MultiInputPolicy desteği olgunlaşırsa gymnasium.spaces.Tuple((Box(-1,1), Discrete(2))) yapısına geçiş değerlendirilebilir — şimdilik aksiyon alınmadı.Reward scaling — deferrable_penalty_coef düzeltmesi: Başlangıçta ceza katsayısı 5.0 TL olarak belirlenmişti. Ancak cihazın çalışma maliyeti hesaplandığında (1.5 kW × 1 h × ort. 2 TL\/kWh ≈ 3 TL) cezanın elektrik maliyetinin üzerinde kaldığı görüldü. Bu durumda ajan fiyat sinyalini görmezden gelip her sabah 06:00'da refleks aktivasyon yapan \"hyper-cautious\" bir politika öğrenebilirdi. Katsayı 5.0 → 2.0 TL'ye düşürüldü; testler güncellenerek 65\/65 geçti.11. Git Commits (Gün 12)feat(env): add Phase 3 multi-step deferrable load with run-duration modelfeat(env): add max_activations_per_day limit to prevent reward hackingfeat(baselines): add Phase 3 deferrable support to all rule-based policiestest(env): add 17 Phase 3 tests (multi-step, steps_remaining, re-activation guard)test(baselines): add 15 Phase 3 deferrable action tests (65\/65 passing)fix: reduce deferrable_penalty_coef 5.0->2.0 to prevent hyper-cautious policy12. Teknik ÖğrenimlerHibrit aksiyon uzayı tasarımı, pekiştirmeli öğrenmede sürekli ve ayrık kararların birleştirilmesinde sık karşılaşılan bir sorundur. Gymnasium Tuple\/Dict uzayları teorik olarak doğru yaklaşım olsa da SB3 uyumluluk kısıtları nedeniyle \"embedding\" yöntemi tercih edildi.Multi-step device execution, tek adım enerji uygulamasından çok daha gerçekçidir. Cihaz başlatılınca deferrable_load_hours kadar adım boyunca çalışır ve ajan bu süreçte müdahale edemez. Bu, zamansal planlama yeteneklerini test eden daha zengin bir karar ortamı oluşturur.Reward shaping konusunda önemli bir pratik ders: RL ajanları çok boyutlu ödül fonksiyonlarında kısmi hedefleri optimize edip diğerlerini ihmal edebilir. Episode sonu cezası + günlük aktivasyon limiti birlikte \"constraint as penalty\" yaklaşımının katmanlı uygulamasını örneklemektedir. Ceza katsayısının cihaz elektrik maliyetiyle orantılı tutulması, ajanın fiyat-duyarlı davranış sergilemesini sağlar.Yarın (Gün 13)Aşama 3 ortamıyla PPO, A2C, SAC ve TD3 algoritmalarının yeniden eğitimi yapılacak. device_activation_rate metriği TensorBoard'da izlenecek. Deferrable ceza katsayısının ajan davranışına etkisi raporlanacak."
},
{
"day": 13,
"date": "2026-07-30",
"content": "Gün 13 — Aşama 3: Değerlendirme ve Üç Aşama Karşılaştırması1. Bugün Ne Yapıldı?Faz 3'ün ilk değerlendirme günü. Dün Aşama 3 ortamıyla PPO, A2C, SAC ve TD3 eğitimlerini bitirdiğimiz için bugün eval_policy.py'ye Aşama 3 desteği ekleyip 90 günlük karşılaştırmalı değerlendirme çalıştırdım. Üç aşamanın (sadece batarya → güneş+talep → ertelenebilir cihaz) sonuçlarını aynı anda görmek ilginçti; karmaşıklık arttıkça hem ödüllerin hem de belirsizliğin nasıl değiştiği netleşti.2. eval_policy.py — Aşama 3 EntegrasyonuYeni bir dosya açmak yerine mevcut scripts\/eval\/eval_policy.py'ye üç yardımcı fonksiyon eklendi, ardından main() içine Aşama 3 karşılaştırma bloğu yerleştirildi.Eklenen fonksiyonlar:def make_phase3_env(price, solar, demand):    return SmartHomeEnergyEnv(        price_data=price, solar_data=solar, demand_data=demand,        price_unit=\"tl_per_mwh\",        enable_deferrable=True,        deferrable_load_power_kw=1.5,        deferrable_load_hours=1.0,        deferrable_window=(6, 22),        deferrable_penalty_coef=2.0,        max_activations_per_day=2,        random_day=True,    )def evaluate_phase3(policy, prices, solar, demand, n_days=90, seed=42):    # n_days episode döngüsü → mean\/std\/min\/max döndürürdef make_phase3_rl_policy(algo_cls, model_path, stats_path, price, solar, demand):    # VecNormalize istatistiklerini yükler, deterministik tahmin yaparmake_phase3_rl_policy generic tasarlandı: PPO, A2C, SAC, TD3'ün hepsi aynı fonksiyondan geçiyor, tek fark algo_cls argümanı. Böylece her algoritma için ayrı yükleyici yazmak gerekmedi.3. Değerlendirme Sonuçlarıpython scripts\/eval\/eval_policy.py --days 90 komutuyla üç aşama sıralı çalıştırıldı. Giriş verisi: data\/aligned_dataset.csv (8784 saatlik EPİAŞ 2026 + PVWatts + UK-DALE).Aşama 1 — Sadece BataryaPolitikaOrt (TL)StdMinMaksBekle (hold)+0.000.00+0.00+0.00Rastgele−25.2716.41−60.78+18.91Eşik−1.8510.92−35.34+16.67PPO+8.024.64+1.40+21.58A2C+2.216.25−15.70+7.86SAC+9.635.12+2.75+22.54TD3+4.711.96+0.30+7.86Aşama 2 — Güneş + TalepPolitikaOrt (TL)StdMinMaksBekle (hold)−4.6712.27−31.28+23.34Rastgele−25.7918.73−73.41+11.78Eşik−3.9415.87−48.87+21.76Öz-tüketim−7.5016.93−54.29+19.41ToU (saat blok)−18.1511.94−47.00+4.26Tahmin kullanır−7.3514.61−45.09+21.76Tepe kesme−12.4712.80−44.34+8.95Şebeke bilinçli−4.3915.98−49.22+21.76PPO+4.8413.05−25.40+30.08A2C−1.4313.89−25.40+30.08SAC+10.0913.71−19.76+37.25TD3+9.7713.90−22.29+36.50Aşama 3 — Batarya + Ertelenebilir CihazPolitikaOrt (TL)StdMinMaksBekle (hold)−6.6712.27−33.28+21.34Rastgele−29.0020.51−72.85+1.80Eşik−8.4217.09−56.30+18.52PPO+3.0513.46−27.40+28.15A2C−3.2613.91−28.46+28.08SAC+8.3214.25−24.24+34.40TD3+7.8014.75−25.99+34.124. Bulgular ve YorumSAC, üç aşamada da en tutarlı algoritma. Aşama 1'de +9.63, Aşama 2'de +10.09, Aşama 3'te +8.32 TL\/gün ortalama sağladı. Off-policy yapısı ve entropi düzenlemesi, değişken gözlem uzaylarına iyi adapte oluyor.Aşama 3'te ödüller düştü ama yine de pozitif. SAC −1.77 TL, TD3 ise Aşama 2'ye kıyasla −1.97 TL geriledi. Bu beklenen bir sonuç; ertelenebilir yük yeni bir karar boyutu ekliyor (ne zaman çalıştıracaksın?) ve deferrable_penalty_coef=2.0 TL cezası basit politikalar için kayıp üretiyor.Hold politikası Aşama 3'te artık sıfır değil. Aşama 1'de hold = +0.00 (hiç aksiyon yok, kayıp yok), Aşama 3'te hold = −6.67. Fark tamamen deferrable_penalty_coef: cihaz hiç çalıştırılmadığında episode sonunda 2.0 TL kesildiği için \"hiçbir şey yapma\" stratejisi artık kötü.Rastgele politika Aşama 3'te çok kötü (−29 TL). Hem batarya hem de ertelenebilir cihaz kararlarını rastgele verince enerji dengesi çok bozuluyor.A2C Aşama 3'te negatife döndü. Aşama 2'de −1.43 TL zaten iyi değildi; Aşama 3'te −3.26'ya indi. PPO da +3.05 ile pozitif ama SAC\/TD3'ten belirgin şekilde geride. On-policy algoritmaların bu karmaşıklıkta off-policy'e kıyasla daha zor optimize ettiği görülüyor.Std değerleri Aşama 3'te yüksek (~14 TL). Aşama 1'de SAC std=5.12 iken Aşama 3'te 14.25. Bu tutarsızlık ertelenebilir cihazın zaman penceresine (06:00–22:00) ve günlük fiyat volatilitesine bağlı; mevsimsel etkiler de devreye giriyor.5. Üç Aşama Karşılaştırması — RL AlgoritmalarıAlgoritmaAşama 1 (TL)Aşama 2 (TL)Aşama 3 (TL)Genel SıralamaSAC+9.63+10.09+8.32 1.TD3+4.71+9.77+7.80 2.PPO+8.02+4.84+3.05 3.A2C+2.21−1.43−3.264.SAC ve TD3'ün off-policy avantajı, birden fazla aksiyon boyutunda özellikle belirginleşiyor. PPO Aşama 1'de iyi performans gösterse de gözlem uzayı büyüdükçe (104 → 106 boyut) geride kalıyor. Optuna'nın PPO için bulduğu hiperparametreler eğitim çöküşüne yol açtığından Aşama 2 hiperparametrelerine geri dönüldüğü de bunda etkili olmuş olabilir.6. Git Commits (Gün 13)feat(eval): add Phase 3 evaluation support to eval_policy.pyfeat(eval): add make_phase3_env, evaluate_phase3, make_phase3_rl_policy helpersfeat(eval): add Phase 3 comparison block to main() with PPO\/A2C\/SAC\/TD37. Teknik ÖğrenimlerGeneric policy loader tasarımı kod tekrarını önledi. algo_cls argümanı sayesinde dört farklı SB3 algoritması tek bir fonksiyonla yüklenebildi. VecNormalize.load() stats dosyasının varlığını kontrol eden Path(stats_path).exists() koruması, model dosyaları eksik olduğunda temiz bir uyarı mesajı veriyor.Curriculum learning'in ödül üzerindeki etkisi gözlemlendi. Her aşama bir öncekinin üzerine yeni bir karar boyutu ekliyor; bu da hem ortamın güçlük seviyesini artırıyor hem de eğitilmiş modellerin davranışını etkiliyor. Aşama 3'te SAC'ın hâlâ pozitif kalması, off-policy deneyim tamponunun hibrit aksiyon uzayında daha verimli öğrenmeyi desteklediğini gösteriyor.Yüksek standart sapma bir sorun mu? Aşama 3'te std≈14 TL yüksek görünse de min değerleri bile (SAC: −24.24) Aşama 1 minimum'larına (SAC: +2.75) kıyasla daha kötü. Bu, ertelenebilir cihaz kararının yanlış zamanlanmasının maliyetini ve fırsatının ödülünü gösteriyor — ortam gerçekten daha zor.Yarın (Gün 14)Aşama 3 eğitim scriptleri (scripts\/train\/) commit edilecek, ardından Faz 4'e geçişe hazırlık başlayacak. Olası bir sonraki adım: üç aşamanın sonuçlarını karşılaştıran bir görsel rapor hazırlamak."
},
{
"day": 14,
"date": "2026-07-31",
"content": "Gün 14 — 500k Adım Eğitim Sonuçları, EPİAŞ Veri Genişletme ve Fiyat Tahmin İyileştirmeleri1. Bugün Ne Yapıldı?SAC (Google Colab, GPU) ve TD3 (lokal, GPU) 500k adım eğitimleri tamamlandı. eval_best_vs_final.py ile dört algoritmanın best\/final model karşılaştırması yapıldı; kesin model seçimleri netleştirildi ve 90 günlük tam değerlendirme çalıştırıldı. Paralelde EPİAŞ fiyat verisi 2022–2026 dönemini kapsayacak şekilde genişletildi (8.784 → 40.176 saat) 2. SAC ve TD3 — 500k Adım Eğitim SonuçlarıSAC (Google Colab, T4 GPU, ~2.5 saat)ep_rew_mean    : 8.1(rollout, normalize edilmiş)eval\/mean_reward: 11.7 (EvalCallback)actor_loss     : -0.364 → -0.424 (negatifleşiyor — iyi)critic_loss    : 0.00356 → 0.00403 (çok düşük, stabil)SAC'ın entropi düzenlemesi Phase 3'ün hibrit aksiyon uzayında tutarlı öğrenme sağladı. Critic kaybının düşük kalması Q-fonksiyonunun yakınsadığını gösteriyor.TD3 TD3, 300k → 500k adım artışıyla Phase 3'te en belirgin iyileşmeyi gösterdi (+0.96 TL\/gün). Model başarıyla kaydedildi3. Best vs Final Model KarşılaştırmasıAlgoritmaFinal (TL\/gün)Best (TL\/gün)en iyi PPO+3.75+3.43finalA2C-3.44-3.16best TD3+8.76+8.18finalSAC+8.94+8.30final4. 90 Günlük Tam Değerlendirme SonuçlarıAşama 3 — Batarya + Ertelenebilir CihazPolitikaOrt (TL\/gün)StdMinMaks Bekle (hold)-6.6712.27-33.28+21.34Rastgele-31.5319.79-84.35+2.15Eşik-8.4217.09-56.30+18.52PPO+3.7513.33-27.40+28.08A2C (best)-3.1613.97-28.46+28.08SAC+8.9413.55-21.38+35.07TD3+8.7614.05-23.91+34.57Phase 3 İyileşmesi:AlgoritmaGün 13 (TL)Gün 14 (TL)Fark PPO+3.05+3.75+0.70A2C-3.26-3.16+0.10SAC+8.32+8.94+0.62TD3+7.80+8.76+0.96500k adım eğitim dört algoritmada da iyileştirme sağladı. TD3 en büyük kazanımı elde etti (+0.96 TL\/gün).5. EPİAŞ Veri Genişletmeepias_2022.csv : 8.760 saat | 0 – 4.800 TL\/MWhepias_2023.csv : 8.760 saat | 0 – 4.200 TL\/MWhepias_2024.csv : 8.784 saat | 0 – 3.000 TL\/MWhepias_2025.csv : 8.760 saat | 0 – 3.400 TL\/MWhepias_2026.csv : 5.112 saat | 0 – 4.500 TL\/MWh─────────────────────────────────────────────────Toplam: 40.176 saat | 2022-01-01 → 2026-08-01scripts\/data\/merge_epias.py ile ham dosyalar birleştirildi. 8.784 → 40.176 saat (4.6x artış). Train\/test bölümü: 2022-01-01 – 2025-09-01 (eğitim) \/ 2025-09-01 – 2026-08-01 (test).6. Fiyat Tahmin Modülü — 40.176 Saatlik Veriyle SonuçlarModelsMAPE (%)MAE (TL)RMSE (TL) LightGBM+Optuna ★29.93265.8398.0LightGBM30.43267.3399.9Ensemble (top-3)32.10290.8419.1XGBoost32.52293.8425.2Random Forest35.63340.9482.0LSTM Bidirectional37.46317.2477.4SVR45.66530.6715.0Holt-Winters62.281241.21674.6SARIMA(1,1,1)(1,0,1,24)71.001758.52256.4ModelEski sMAPEYeni sMAPEİyileşme LightGBM+Optuna51.90%29.93%−21.97 puanLSTM Bidirectional55.92%37.46%−18.46 puanXGBoost~52%32.52%~−20 puanLightGBM+Optuna %29.93 sMAPE ile elektrik fiyat tahmini için literatürde kabul gören %30 eşiğinin altına indi.7. Git Commits (Gün 14)PR #31: https:\/\/github.com\/isambais\/SmartHome-EnergyRL\/pull\/318fd9341fix(data): add add_noise\/seed params to align_to_datesc0e3355feat(forecast): add 4.5-year EPİAŞ dataset + merge scriptebda776fix(eval): add SAC best, DATA_PATH → epias_combined, LSTM batch inference3ebc502docs: add Gün 14 staj defteri851acbdchore: stage raw EPİAŞ CSVs, Colab notebook, Gün 13 docsfbf9987docs: update Gün 14 with forecast results (LightGBM+Optuna 29.93%)8. Teknik ÖğrenimlerOff-policy vs on-policy — eğitim adımı etkisi: TD3 ve SAC'ın 500k adımla elde ettiği kazanım (+0.62–+0.96 TL\/gün), PPO ve A2C'ye kıyasla daha yüksek. Deneyim tamponu tekrar örnekleme sayesinde off-policy algoritmalar her adımdan daha fazla öğreniyor.Veri miktarının önemi: 4.6 kat daha fazla veri, model mimarisinde hiçbir değişiklik yapılmadan ~20 puanlık sMAPE iyileştirmesi sağladı. Bu, hiperparametre aramasından çok daha etkili bir kazanım.Bellek yönetimi — batchli inference: Büyük test setlerinde GPU belleği aşımını önlemek için inference da batchlenmeli; torch.no_grad() ile gradyan tampon belleği de serbest bırakılmalı.Tekrar üretilebilirlik: Ham veri işleme adımları scripts\/data\/merge_epias.py'ye taşındı. Yeni yıl verisi ekleneceğinde yalnızca CSV indirilip aynı script çalıştırılacak.Pazartesi (Gün 15)LightGBM+Optuna tahminini RL ajanına entegre etmek — Oracle \/ Forecast \/ Naive mod karşılaştırması (scripts\/forecast\/compare.py). Hedef: tahmin kullanmanın kural tabanlı politikalara ve tahmin kullanmayan RL'ye kıyasla ne kadar avantaj sağladığını ölçmek."
},
{
"day": 15,
"date": "2026-08-03",
"content": "Gün 15 — Oracle \/ Forecast \/ Ensemble \/ Naive Fiyat Modu Karşılaştırması1. Bugün Ne Yapıldı?Gün 14'te eğitilen RL ajanlarını (SAC, TD3, PPO, A2C) ve kural tabanlı politikaları dört farklı fiyat bilgisi modunda karşılaştıran scripts\/forecast\/compare.py scripti yazıldı, hataları düzeltildi ve iki iterasyonla iyileştirildi. Sonuçlar logs\/forecast_comparison.csv ve docs\/forecast_comparison.png olarak dışa aktarıldı. Bu karşılaştırma, Implementation Plan'ın Faz 3 kapsamındaki son teknik adımı tamamladı: \"ajanın tahmin belirsizliğine dayanıklılığını göstermek.\"2. Tasarım — ForecastEnv Subclass Yaklaşımıenergy_env.py'yi değiştirmeden forecast fiyatlarını ortama enjekte etmek için SmartHomeEnergyEnv'den türeyen ForecastEnv alt sınıfı yazıldı. reset() metodu override edilerek _tomorrow_prices_obs bloğu ML tahmin dizisiyle değiştiriliyor; ödül hesaplaması (step()) dokunulmadan kalıyor.ForecastEnv(forecast_prices_daily=None) → Oracle moduForecastEnv(forecast_prices_daily=array) → Forecast \/ Ensemble \/ Naive moduBu yaklaşımın avantajı: aynı eğitilmiş model ağırlıkları yeniden eğitim gerektirmeden dört modda da değerlendirilebiliyor. Ortamın geri kalanı (batarya fiziği, ödül, cihaz mantığı) tamamen korunuyor.Dört mod:ModKaynakforecast_noise_stdOracleGerçek ertesi gün fiyatı0.05 (eğitim dağılımı korunur)ForecastLightGBM+Optuna (%29.93 sMAPE)0.00EnsembleLGB+XGB+RF ağırlıklı ort. (%32.10 sMAPE)0.00NaiveBir önceki günün aynı saatleri0.003. Düzeltilen Hatalar ve İyileştirmelerHata 1 — load_and_engineer() TypeError:İlk yazımda fonksiyon hem Path hem DataFrame kabul edecek şekilde karışık yazılmıştı; pd.read_csv(DataFrame) çağrısı TypeError verdi. Düzeltme: engineer_features(df: DataFrame) ve load_and_engineer(path: Path) olarak iki ayrı fonksiyona bölündü.Hata 2 — Hardcoded test tarihi:TEST_START = pd.Timestamp(\"2025-09-01\") sabit tarih kullanılıyordu; price_forecast.py ile tutarsız. Düzeltme: TRAIN_RATIO = 0.80 ve get_test_mask() ile oran tabanlı bölme.Hata 3 — Sadece LightGBM+Optuna:Karşılaştırmaya yalnızca tek model alınmıştı. Gün 14'te eğitilen XGBoost ve Random Forest modelleri de eklenerek build_ensemble_prices() ve Ensemble modu tamamlandı.v2 İyileştirmeleri:forecast_noise_std=0.05 Oracle için — Ajan forecast_noise_std=0.05 ile eğitilmişti; Oracle modunda 0.0 kullanmak ajanı dağılım dışına çıkarıyordu. make_env() noise_std parametresi alacak şekilde yeniden düzenlendi.Sadece test seti — aligned_dataset'in son %20'si = 74 gün. split_test() fonksiyonu ile p_test, solar_test, demand_test ve ML tahminleri hepsi bu aralığa kırpıldı.device_activation_rate tablosu — Reward hacking kontrolü için info[\"episode\"][\"device_activation_rate\"] değerleri ayrı pivot tablo olarak yazdırıldı.Grafik temizleme — Tüm modlarda Δ=0.00 veren Bekle\/Eşik\/Öz-tük.\/Şb.Bil. grafikten çıkarıldı; yalnızca SAC\/TD3\/PPO\/A2C\/FcAware gösteriliyor. (Bu politikalar _tomorrow_prices_obs gözlem özelliğini kullanmıyor.)4. Karşılaştırma Sonuçları — 74 Gün (Test Seti)Mod   Oracle Forecast Ensemble Naive Δ Forecast Δ Ensemble Δ Naive─────────────────────────────────────────────────────────────────────────────SAC   +14.38  +14.49  +14.49 +14.18   +0.11   +0.11  -0.20TD3   +14.72  +14.70  +14.64 +14.54   -0.02   -0.08  -0.18PPO   +12.08  +11.98  +11.97 +11.94   -0.10   -0.11  -0.14A2C    -9.01  -9.50  -9.53 -8.79   -0.49   -0.52  +0.22FcAware  -3.34  -2.30  -2.15 +5.73   +1.04   +1.19  +9.07SAC ve TD3 tüm modlarda ±0.2 TL içinde kalıyor. Bu, RL ajanlarının tahmin kalitesine bağımlı olmadığını — yani tahmin belirsizliğine karşı robust eğitildiğini — gösteriyor.5. Cihaz Çalıştırma Oranı (Reward Hacking Kontrolü)Mod   Oracle Forecast Ensemble Naive─────────────────────────────────────────SAC    0.053  0.054  0.054 0.049TD3    0.068  0.065  0.066 0.067PPO    0.083  0.083  0.083 0.083A2C    0.069  0.069  0.069 0.068FcAware  0.083  0.083  0.083 0.083Maksimum oran: max_activations_per_day=2 \/ 24 saat = 0.083.PPO her modda tam kapasitede çalışıyor (0.083) — cihazın net değerine bakmaksızın her gün 2 kez aktive ediyor. SAC (0.053) ve TD3 (0.068) ise üst sınırın altında kalıyor; fiyata ve güneş durumuna göre seçici karar veriyorlar. Bu, SAC\/TD3'ün PPO'ya göre daha nitelikli öğrendiğinin somut kanıtı.6. Önemli Bulgu — FcAware AnomalisiForecastAwarePolicy Naive modda +5.73 TL\/gün (en iyi), Oracle\/Forecast\/Ensemble modlarında ise negatif. Bu kural tabanlı politikanın eşik mantığının dünkü fiyat kalıbıyla uyumlu olduğunu, ML tahminlerinin ise farklı bir dağılım sunarak kural mantığını \"şaşırttığını\" gösteriyor. RL ajanları bu davranışı sergilemiyor çünkü gözlemden bağımsız bir strateji öğrenmişler.7. Git Commits (Gün 15)PR #38: https:\/\/github.com\/isambais\/SmartHome-EnergyRL\/pull\/38cf51f8d feat(forecast): add compare.py — Oracle\/Forecast\/Ensemble\/Naive price mode comparisond32c952 feat(forecast): add comparison outputs — forecast_comparison.png + CSV46dd24c docs: add Gün 15 staj defteri8. Teknik ÖğrenimlerSubclass ile backward-compatible genişletme: energy_env.py'yi değiştirmek yerine ForecastEnv subclass yazmak hem mevcut Phase 1\/2 testlerini bozmuyor hem de yeni özelliği temiz bir soyutlama katmanında tutuyor. Bu, open\/closed prensibinin (açık\/kapalı) pratik bir uygulaması.forecast_noise_std tutarlılığı: Değerlendirmede eğitim dağılımından sapan bir gürültü seviyesi kullanmak out-of-distribution (OOD) değerlendirmeye yol açar. Oracle modunda 0.0 yerine 0.05 kullanmak sonuçları daha güvenilir kıldı.Reward hacking — act_rate metriğinin önemi: Ödül değeri tek başına yeterli değil. PPO, SAC ile benzer ödül aralığında olduğu hâlde cihazı her seferinde maksimum çalıştırıyor. device_activation_rate olmadan bu fark görünmezdi.Veri hizalaması: p_full (40k saat, 2022) + solar\/demand (aligned_dataset, 2025) karıştırıldığında env min(days) alıyor ama fiyatlar 2022'den geliyor, solar\/demand 2025'ten — tamamen yanlış hizalama. Doğru yaklaşım: tüm veriyi aligned_dataset.csv'den almak (Phase 3 eval_policy.py ile tutarlı).Yarın (Gün 16)Streamlit dashboard başlangıcı (dashboard\/app.py) — Faz 4. Saatlik karar zaman serisi grafiği, RL ajanı vs baseline maliyet karşılaştırma paneli ve oracle\/forecast\/naive sekmesi."
},
{
"day": 16,
"date": "2026-08-04",
"content": "Gün 16 — Streamlit BMS Dashboard & Landing Page1. Bugün Ne Yapıldı?Projenin kullanıcıya yönelik katmanı tamamlandı: Streamlit tabanlı tam bir Bina Yönetim Sistemi (BMS) dashboard'u ve projeyi tanıtan bir landing page geliştirildi. Gereksiz klasörler (frontend\/, backend\/) proje ağacından temizlendi; .gitignore'a node_modules\/ eklendi.2. Dashboard Mimarisi2.1 Klasör Yapısıdashboard\/├── app.py             ← Ana sayfa (4 sayfa bağlantısı)├── core\/│ ├── config.py         ← BinaConfig dataclass + tüketim formülleri│ ├── theme.py          ← Dark CSS (#0d1117) + Plotly şablonu│ ├── agent.py          ← SAC yükleme + HeuristicAgent fallback│ ├── simulate.py        ← 24 saatlik fizik simülasyonu│ ├── data.py          ← EPİAŞ API → CSV → sentetik fallback zinciri│ ├── threejs.py         ← Three.js 3D bina HTML (9.6 kB)│ └── ui.py           ← Sidebar konfigüratör + gunu_simule_et()└── pages\/    ├── Bina_Simulasyonu.py  ← 3D + Plotly grafik + metrik kartlar + öneriler    ├── Canli_EPIAS.py    ← EPİAŞ fiyat çubuğu + kesinti simülasyonu    ├── Yatirim_ve_Cevre.py  ← Amorti + CO₂ + fiyat duyarlılık analizi    └── Uzman_Modu.py     ← Algoritma karşılaştırması + ısı haritası + mevsimsel2.2 Veri AkışıEPİAŞ API (TGT auth)    ↓ başarısızarşiv CSV (data\/epias_combined.csv)    ↓ yokSentetik (EPİAŞ deseni, ±gürültü)    ↓gun_fiyati() → saatlik 24 TL\/MWh dizisi    ↓gunu_simule_et(cfg) → simulate_day(fiyat, güneş, talep, batarya, ajan)    ↓DataFrame (24 satır × 20 sütun) → Plotly + Three.js + metrik kartlar3. BinaConfig Tasarımıconfig.py'deki BinaConfig dataclass projenin tüm bina parametrelerini tutar:ParametreAçıklamaVarsayılan (Apartman)katKat sayısı5daire_per_katKat başına daire3aktif_daireGerçekten oturulan daire12odaDaire başına oda3cati_alaniPanel kurulum alanı (m²)140asansor\/hvac\/su_pompasi\/ev_sarj\/...Sistem varlığıtip'e göreTüretilmiş değerler (property):gunluk_tuketim_kwh = aktif_daire × oda × 1.8 + asansör×8 + hvac×kat×3 + ...batarya_kwh = gunluk_tuketim × 0.4batarya_guc_kw = batarya_kwh \/ 2 (C\/2 şarj hızı)panel_sayisi = cati_alani \/ 1.7 m²panel_kw = panel_sayisi × 0.45 kW4. Simülasyon Fiziği (simulate.py)24 saatlik döngüde her saat için:Gözlem vektörü (106 boyut) build_obs() ile oluşturulur — energy_env.py ile birebir aynı düzenAjan kararı: act(obs) → aksiyon ∈ [-1, 1] (deşarj ↔ şarj)Batarya fiziği: verim=0.95, satis_orani=0.60, min_soc=0.10, oz_desarj=0.0005\/hKesinti senaryosu: grid yoksa önce batarya, sonra opsiyonel jeneratör (12 TL\/kWh)Taban maliyet hesaplanır (şebekeden tam çekseydi ne öderdi?) → tasarruf = taban − netÖlçekleme: Ajan 10 kWh ev sistemi için eğitilmiş. Bina k = bina_batarya \/ 10 katsayısıyla ajan ölçeğine indirilir, kararlar gerçek ölçeğe çevrilir.5. Three.js 3D Görselleştirme (threejs.py)building_html(cfg, saat, soc, gunes_kw, outage) fonksiyonu ~9.6 kB tek HTML çıktısı üretir:Bina yüksekliği kat sayısına göre dinamikPencereler: aktif daire + gece saati kombinasyonuna göre aydınlık\/karanlıkGüneş panelleri: gunes_kw değerine göre parlama yoğunluğuBatarya ünitesi: SOC değerine göre yeşil→sarı→kırmızı renk geçişiAsansör: gündüz saatlerinde animasyonlu hareketEV aracı + şarj direğiKesinti modu: kırmızı yanıp sönen alarmGün\/gece gökyüzü döngüsü, güneş\/ay pozisyonuMouse drag: döndür; scroll: yakınlaştırHUD overlay: saat, batarya %, güneş kW, aktif daire6. Sayfa İçerikleriSayfa 1 — Bina Simülasyonu:3D bina animasyonu + 4 metrik kart (tasarruf TL, batarya SOC, güneş kW, toplam tüketim) + dual-axis Plotly grafiği (fiyat + SOC + güneş + şarj\/deşarj kararları) + doğal dil önerileri.Sayfa 2 — Canlı EPİAŞ:EPİAŞ oturum bilgisi girişi + saatlik fiyat çubuğu (şu anki saat sarı, kesinti saatleri kırmızı) + kesinti simülasyonu toggle + saatlik karar tablosu.Sayfa 3 — Yatırım & Çevre:Batarya + panel yatırım maliyeti girişi → yıllık tasarruf tahmini (4 mevsim × temsilci gün simülasyonu) → amorti süresi → CO₂ ton tasarrufu (450 gCO₂\/kWh Türkiye faktörü) → ağaç\/araba eşdeğeri. Fiyat duyarlılık analizi grafiği.Sayfa 4 — Uzman Modu:Tab 1: logs\/forecast_comparison.csv'den SAC\/TD3\/PPO\/A2C Oracle performans bar grafiği.Tab 2: Politika × Fiyat modu ısı haritası (Oracle\/Forecast\/Naive).Tab 3: aligned_dataset'ten aylık fiyat profili + Yaz vs Kış saatlik fiyat & güneş karşılaştırması.7. Tasarım Kararları — Kullanıcı Merkezli YaklaşımAlgoritma adları gizlendi: SAC\/TD3\/PPO\/A2C isimleri normal kullanıcıya bir şey ifade etmiyor. Dashboard \"Yapay Zekâ Ajanı\" olarak sunar; algoritma detayları yalnızca Uzman Modu'nda görünür.Fallback zinciri: API → CSV → Sentetik. Kullanıcı hiçbir zaman hata ekranı görmez.HeuristicAgent: Model yüklenemezse (SB3 kurulu değilse) eşik tabanlı kural politikası otomatik devreye girer, dashboard çökmez.8. Landing Page (landing\/)Proje tanıtım sayfası FintechX template'inden SmartHome-EnergyRL için tamamen yeniden yazıldı:Nav: SmartHome Energy RL logo + Türkçe menü + \"Dashboard'u Aç\" CTAHero: Sahtesi olmayan EPİAŞ fiyat grafiği mockup'ı, şarj\/deşarj karar üçgenleriBina tipleri: Müstakil Ev \/ Villa \/ Apartman \/ Ofis Binası kartlarıÖnce\/Sonra: FintechX'ten SmartHome RL farkı (toggle animasyonu)Özellikler: 3D görselleştirme, SAC\/TD3, EPİAŞ API fallback, batarya fiziği, kesinti korumasıNasıl çalışır: 3 adım interactive panel (Bina Tanımla → Simüle Et → Sonuçları İncele)İstatistikler: Gerçek proje sonuçları (SAC +14.4 TL\/gün, ±0.2 TL robustluk, %29.93 sMAPE)SSS: EPİAŞ bağlantısı, eğitim detayları, batarya boyutu formülüFooter: GitHub bağlantıları, proje bilgisi9. Temizlenen Gereksiz KlasörlerKlasörDurumNedenfrontend\/Silindi (kaynak)React dashboard, Streamlit ile değiştirildibackend\/SilindiFastAPI backend, Streamlit ile değiştirildinode_modules\/.gitignore'a eklendinpm install ile yeniden oluşturulabilir10. Git Commits (Gün 16)PR #39: feat\/gun16-streamlit-dashboard → feat\/gun15-forecast-comparison[commit hash] feat(dashboard): add Streamlit BMS dashboard — 4 pages + core modules + Three.js[commit hash] feat(landing): rewrite landing page for SmartHome-EnergyRL (FintechX → BMS)[commit hash] chore: remove frontend\/ and backend\/ folders, add node_modules to .gitignore[commit hash] docs: add Gün 16 staj defteri11. Teknik Öğrenimlerst.cache_resource vs st.cache_data: Model yükleme (get_agent()) @st.cache_resource ile — nesne tüm kullanıcı oturumlarında paylaşılır, her request'te yeniden yüklenmez. DataFrame sonuçları @st.cache_data ile — immutable serileştirilebilir veri.Streamlit multi-page: pages\/ klasörü Streamlit 1.20+ ile otomatik algılanır. Dosya adı prefix'i sayfa sıralamasını (1_, 2_, ...) ve sidebar görünümünü belirler. Emoji dosya adında doğrudan çalışır.Three.js st.components.v1.html(): Three.js render'ı components.html() içine gömülüyor. iframe sandbox nedeniyle dış CDN yüklenmesi için allow-scripts gerekli — Streamlit bunu varsayılan olarak açar.Ajan ölçekleme sorunu: SAC 10 kWh ev için eğitildi, bina 40 kWh bataryaya sahip. Çözüm: tüm büyüklükler k = bina_kwh \/ 10 katsayısıyla ajan ölçeğine indirilip kararlar gerçek ölçeğe çevrildi. Bu yaklaşım fizik doğrusallığı varsaydığı için gerçek dünyada ancak yaklaşık doğru; tam doğruluk için binaya özel yeniden eğitim gerekir..gitignore ve node_modules: node_modules\/ klasörü binlerce küçük dosya içerdiğinden git repolarına kesinlikle eklenmemeli. npm install ile saniyeler içinde yeniden oluşturulur.Yarın (Gün 17)Landing page deploy (Vercel\/Netlify) ve Streamlit dashboard deploy (Streamlit Cloud). requirements.txt güncelleme, CLAUDE.md proje dokümantasyonu."
},
{
"day": 17,
"date": "2026-08-05",
"content": "Gün 17 — 3D Bina Yenileme & Dashboard UI Redesign1. Bugün Ne Yapıldı?Dün oluşturulan Streamlit dashboard'unun görsel kalitesi ve kullanıcı deneyimi köklü biçimde iyileştirildi. Three.js ile yazılmış 3D bina görselleştirmesi tamamen sıfırdan yeniden yazıldı; gerçekçi mimari detaylar, dinamik gökyüzü sistemi ve tüm bina sistemlerinin 3D yansıması eklendi. Dashboard arayüzü landing page tasarımıyla tutarlı hale getirildi.2. Three.js 3D Bina — Tam Yeniden Yazım2.1 Temel SorunÖnceki Three.js implementasyonunda bina gövdesi opacity: 0.5 şeffaf malzemeyle yazılmıştı. Bu yüzden katlar üst üste pizza kutusu gibi görünüyor, çatı binadan kopuk yüzüyordu. Profesyonel görünüm için tüm geometri ve malzeme sistemi sıfırdan kuruldu.2.2 Yeni MimariBina geometrisi:├── Temel (koyu beton)├── Her kat için:│ ├── Döşeme levhası (solid, gölge atıyor)│ ├── Kolonlar (pencereler arası dikey duvar)│ ├── Üst kiriş + windowsill│ ├── Pencere camları (MeshStandardMaterial, gündüz yansıma \/ gece sarı)│ ├── Pencere çerçeveleri (metal profil)│ ├── İç ışık noktaları (gece saatlerinde PointLight)│ └── Balkon + korkuluk (her katta)├── Çatı: parapet duvarı + güneş panelleri (eğimli, ayaklı)└── Giriş: kapı çerçevesi + metal kapı + 3 basamak merdiven2.3 Işıklandırma SistemiIşık türüRenkAçıklamaHemisphereLightgökyüzü→toprakYumuşak ambient dolguDirectionalLightgüneş rengiGüneş pozisyonuna göre, gölge üretirAmbientLightbeyazMinimum dolgu, gece görünürlüğüPointLight (pencere)#fcd34dGece yanar, 5 birim yarıçapDirectionalLight (ay)#8899ccGece modunda aktif2.4 Dinamik GökyüzüSaat değerine göre 8 farklı gökyüzü renk kademesi:Saat aralığıDurumArka plan rengi00–05Derin gece#01060f05–06Gece sonu#040d1e06–07Şafak#c45c1e07–08Sabah altını#e8955a08–17Gündüz#4a9fd417–18Öğleden sonra#6ab0d818–19Gün batımı#e0703019–21Alaca karanlık#8a2a1021–24Gece#02060eGüneş diski saate göre yay çizerek hareket eder; şafak\/gün batımında turuncu hale, öğlende beyaz glow efekti eklendi. Gece dayF < 0.3 olduğunda 800 noktalı yıldız sistemi aktif olur.3. Bina Sistemlerinin 3D'ye YansıtılmasıHer sistemin checkbox durumu Three.js'e CFG objesi üzerinden iletilir ve sahneye karşılık gelen 3D obje eklenir ya da eklenmez:Sistem3D GörselHVACÇatıda klima kasaları + fan çark geometrisiSu PompasıÇatıda silindirik metal tank + boru bağlantısıGüneş IsıtıcıKolektör plakaları (PV'den daha dik açı, ~0.5 rad) + kırmızı sıcak su borusuJeneratörSol yan tarafta metal kasa + egzoz borusu + sarı plaka; kesintide kırmızı LED + duman küreKamera4 köşede güvenlik kamerası (braket + gövde + lens); gece IR PointLightEV ŞarjDetaylı araç (gövde + kabin + cam + 4 tekerlek + farlar) + şarj direği + yeşil ekranAsansörŞeffaf şaft + sinüs hareketiyle yukarı-aşağı giden kabinTeknik not: building_html() fonksiyonuna hvac, su_pompasi, kamera, gunes_isitici, jenerator parametreleri eklendi. JSON serialize edilerek JavaScript CFG objesine aktarılıyor.4. Dashboard UI Yenileme4.1 Emoji TemizliğiStreamlit'in varsayılan emoji etiketleri (🏗️ Bina Konfigüratörü, 🛗 Asansör, 💰 Bugünkü tasarruf vb.) landing page tasarımıyla tutarsız bir görünüm yaratıyordu. Tüm emoji'ler kaldırıldı; yerine temiz metin ve CSS ile stilize edilmiş etiketler kullanıldı.4.2 Saat Slider'ının TaşınmasıÖnceki durum: Saat slider'ı sidebar'ın en altındaydı — scroll yapmadan görünmüyordu. Kullanıcı \"Saat kaydırıcısıyla günü gezin\" yönlendirmesini görüyor fakat slider'ı bulamıyordu.Yeni durum: Slider, 3D binanın hemen altına \"Simülasyon saati\" etiketi ile taşındı. Saat değişince st.rerun() ile sayfa anında yenileniyor.4.3 Ajan Kararı BadgeSimülasyonun en kritik çıktısı — ajan şu an ne yapıyor — öne çıkarıldı:karar_map = {    \"şarj\": (\"decision-sarj\", \"Batarya şarj ediliyor\", \"Ucuz saat — enerji depolanıyor\"),    \"deşarj\": (\"decision-desarj\", \"Batarya deşarj ediliyor\", \"Pahalı saat — depo kullanılıyor\"),    \"bekle\": (\"decision-bekle\", \"Bekleniyor\",       \"Şarj\/deşarj için uygun fiyat değil\"),}Mavi (şarj) \/ Kırmızı (deşarj) \/ Gri (bekle) renk kodlaması; üçgen ok simgesi ve kısa açıklama metni ile.4.4 Metrik KartlarNative st.metric() yerine custom HTML kartlar: beyaz arka plan, ince border, Inter font, landing page renk paleti. Tasarruf yüzdesi hesabı da düzeltildi — önceki %175 daha az fatura matematiksel olarak yanlıştı, tasarruf \/ taban_maliyet * 100 formülüne çevrildi.5. Landing Page Geliştirmeleri5.1 Parallax 3D HeroHeroScene komponenti: 7 bağımsız katman, her biri farklı translateY hızıyla scroll'a tepki verir:KatmanHız katsayısıGökyüzü0.18Güneş0.22Uzak bulutlar0.30Yakın bulutlar0.24Enerji partikülleri0.35Şehir silüeti0.42Yeşil zemin0.55useEffect içinde window.addEventListener('scroll', handler, { passive: true }) ile performanslı scroll tracking; willChange: 'transform' ile GPU katmanı zorlanıyor.5.2 Scroll-linked Sticky ShowcaseStickyShowcase komponenti: sol taraf position: sticky; top: 14vh ile sabit kalıyor, sağ taraftaki özellik kartları minHeight: 68vh ile scroll edilebilir. IntersectionObserver (threshold: 0.55) her kartın görünürlüğünü izleyerek active state'ini güncelliyor; BuildingViz SVG buna göre 5 durumdan birini gösteriyor.5.3 Bina Tipleri YenilemeEmoji ikonlar → Tip başına özel SVG bina çizimleri (MustakilSvg, VillaSvg, ApartmanSvg, OfisSvg). Hover'da bina yeşile dönüyor, güneş panelleri sarıya yanıyor. Sabit değerler (1 kat · 4 oda) → gerçekçi aralıklar (1–2 kat · 3–7 oda · 60–180 m²).6. Teknik ÖğrenimlerThree.js MeshStandardMaterial vs MeshPhongMaterial: Standard PBR tabanlı — gerçek dünya ışık davranışı, roughness ve metalness parametreleri. Phong daha basit, shininess ile parlama kontrolü. Dashboard'da Standard tercih edildi çünkü HDR toneMapping (ACESFilmicToneMapping) ile daha doğal sonuç veriyor.Streamlit st.rerun(): Slider değeri değişince sayfa yeniden render edilmesi için. st.experimental_rerun() eski API'ydi, Streamlit 1.27+ ile st.rerun() kullanılıyor.CSS position: sticky + IntersectionObserver: Apple ürün sayfalarındaki scroll animasyon tekniği. Sticky element viewport'ta sabit kalırken sibling container scroll edilir; IO her section'ın görünürlüğünü %55 threshold ile izler.Git force push: Yanlış branch'e giden commit'i ayırmak için git reset --hard <hash> + git push --force. Takım çalışmasında riskli — kendi feature branch'inde güvenli.7. Git Commits (Gün 17)PR #XX: feat\/gun17-dashboard-redesign → feat\/gun16-streamlit-dashboard18d0466 feat(dashboard): redesign 3D building + UI — realistic Three.js, remove emojis, agent badge, saat slider         feat(landing): add parallax 3D hero, sticky showcase, custom SVG building cardsYarın (Gün 18)Diğer Streamlit sayfalarının (Canlı EPİAŞ, Yatırım & Çevre, Uzman Modu) UI'larını da landing page stiliyle uyumlu hale getirme. Deploy hazırlığı: requirements.txt güncelleme, Streamlit Cloud konfigürasyonu."
},
{
"day": 18,
"date": "2026-08-06",
"content": "Gün 18 — FastAPI Backend & React Frontend1. Bugün Ne Yapıldı?Projenin ağ katmanı yazıldı. Streamlit prototipinin yerini üretim kalitesinde bir istemci-sunucu mimarisi aldı: FastAPI ile yazılmış bir REST API backend ve React + Vite ile yazılmış 7 sayfalık bir web uygulaması. Backend, daha önceki günlerde geliştirilen simülasyon motorunu (dashboard\/core) yeniden kullanıyor; bu sayede hiçbir simülasyon mantığı tekrar yazılmadı.2. Backend — FastAPI2.1 Mimari Genel Bakışbackend\/├── main.py   FastAPI uygulaması — tüm endpoint'ler├── auth.py   Kimlik doğrulama (PBKDF2 + JWT-style token)├── models.py  SQLAlchemy ORM modelleri├── db.py    Veritabanı bağlantısı ve başlatma├── data.py   EPİAŞ veri katmanı (backend'e özgü)└── requirements.txtdashboard\/core modülleri sys.path ile içe aktarılıyor; yani simulate_day(), get_agent(), building_html() ve BinaConfig tek bir yerden geliyor.2.2 Kimlik DoğrulamaHarici JWT kütüphanesi (PyJWT, python-jose vb.) kullanılmadı; tüm token mekanizması Python standart kütüphanesiyle yazıldı.Şifre hash'leme:def hash_sifre(sifre: str) -> str:    salt = os.urandom(16)    dk = hashlib.pbkdf2_hmac(\"sha256\", sifre.encode(), salt, 200_000)    return salt.hex() + \"$\" + dk.hex()PBKDF2-HMAC-SHA256 ile 200.000 iterasyon — modern brute-force saldırılarına karşı yeterli maliyet. Tuz her kayıt için rastgele üretildiğinden gökkuşağı tablo saldırıları etkisiz.Token:# Header.Payload.İmza — Base64URL kodlu, HMAC-SHA256 imzalıdef token_olustur(user_id: int) -> str:    # 30 günlük geçerlilik, standart JWT yapısıAuthorization: Bearer <token> header'ından çözümleniyor; current_user dependency injection olarak FastAPI endpoint'lerine enjekte ediliyor.2.3 Veritabanı Modellericlass User(Base):    id, ad, email, sifre_hash, created_at    bina: JSON   # Kullanıcının kayıtlı bina konfigürasyonu    gecmis: [SimKaydi]class SimKaydi(Base):    id, user_id (FK), tarih, bina_tipi    tasarruf_tl, gunes_kwh, not_User.bina sütunu JSON tipinde; kullanıcı bina konfigüratöründe ayar yaptığında PUT \/api\/profile\/bina ile tek satıra kaydediliyor. Bir sonraki girişte ayarlar hazır geliyor.2.4 Veritabanı Esnekliği# PostgreSQL (üretim)DATABASE_URL=postgresql+psycopg:\/\/postgres:postgres@localhost:5432\/smarthome# SQLite (geliştirme — docker gerektirmez)DATABASE_URL=sqlite:\/\/\/.\/smarthome.dbdb.py içindeki init_db() uygulamayı açılışında tabloları oluşturuyor (migrate adımı yok, basit dev akışı).2.5 API Endpoint'leriMetotYolAçıklamaPOST\/api\/registerKayıt — token dönerPOST\/api\/loginGiriş — token dönerGET\/api\/profileKullanıcı + simülasyon geçmişiPUT\/api\/profile\/binaBina konfigürasyonunu kaydetPOST\/api\/profile\/gecmisSimülasyon sonucunu geçmişe eklePUT\/api\/profile\/sifreŞifre değiştirPOST\/api\/simulateSAC ajanıyla 24 saatlik simülasyonPOST\/api\/epiasCanlı EPİAŞ verileriyle simülasyonGET\/api\/yatirimAmorti hesabı + aylık tasarrufGET\/api\/uzmanAlgoritma karşılaştırması + mevsimsel analizGET\/api\/3dThree.js bina HTML'iCORS middleware ile http:\/\/localhost:5173 (Vite dev server) white-list'te.3. Frontend — React + Vite3.1 Sayfa Yapısıfrontend\/src\/├── App.jsx     React Router — korumalı + genel rotalar├── state.jsx    Global durum (user, cfg, token) — Context API├── api.js      Backend'e HTTP istekleri — merkezi istemci├── i18n.jsx     Çok dil desteği — TR \/ EN \/ AR├── icons.jsx    SVG ikon bileşenleri├── pages\/│ ├── Auth.jsx   Kayıt \/ Giriş formu│ ├── Landing.jsx Landing sayfası (tam içerik)│ ├── Simulasyon.jsx 24 saat SAC simülasyonu│ ├── Epias.jsx  Canlı EPİAŞ fiyatları│ ├── Yatirim.jsx Amorti & çevre etkisi│ ├── Uzman.jsx  Algoritma karşılaştırması│ └── Profil.jsx  Hesap & geçmiş yönetimi└── components\/    ├── TopNav.jsx  Navigasyon çubuğu    ├── ConfigPanel.jsx Bina konfigüratörü (sidebar)    ├── Building.jsx Three.js bina (iframe)    └── ui.jsx    Paylaşılan UI bileşenleri3.2 Kimlik Doğrulama AkışıKullanıcı → Auth.jsx (kayıt\/giriş formu)         → POST \/api\/register veya \/api\/login         → token + user → state.jsx (Context)         → AppLayout (korumalı rota) — token yoksa \/kayit'a yönlendirToken localStorage'da saklanıyor; sayfa yenilenince kullanıcı oturumu kaybolmuyor.AppLayout bileşeni: const { user } = useApp(); if (!user) return <Navigate to=\"\/kayit\" \/>3.3 Bina Konfigürasyon Yönetimistate.jsx içindeki useApp() hook'u global cfg durumunu tutuyor. ConfigPanel bu durumu güncelliyor; tüm sayfalar (Simulasyon, Epias, Yatirim) aynı cfg'yi API isteğine ekliyor. Kullanıcı oturum açıkken her simülasyondan sonra PUT \/api\/profile\/bina ile bina konfigürasyonu sunucuya kaydediliyor.3.4 Canlı EPİAŞ SayfasıuseDebounced hook'u: Kullanıcı kesinti aralığı slider'ını hareket ettirirken 450 ms debounce — her px harekette API çağrısı yapılmıyor.const dReq = useDebounced({ cfg, kesintiSaatleri }, 450);useEffect(() => {  api.simulate({ config: dReq.cfg, kesinti_saatleri: dReq.kesintiSaatleri })    .then(setSim);}, [JSON.stringify(dReq)]);3.5 Yatırım & Çevre SayfasıAylık tasarruf (12 ay × sezonsal güneş verimliliği)Amorti süresi hesabı: toplam_yatırım \/ yıllık_tasarrufCO₂ tasarrufu → ton\/yıl → eşdeğer ağaç sayısıPDF rapor: Tarayıcının window.open() + document.write() API'si kullanılıyor; dış kütüphane gerektirmiyor. Baskı stili CSS ile biçimlendiriliyor.3.6 Uzman Modu Sayfası3 sekme:Algoritma Karşılaştırması — SAC \/ TD3 \/ PPO \/ A2C günlük tasarruf karşılaştırması (Recharts BarChart + ErrorBar)Fiyat Bilgisi Etkisi — Ajanın önceden kaç saatlik fiyat bilgisiyle çalıştığının etkisiMevsimsel Analiz — 12 ay × algoritma ısı haritası4. Çok Dil Desteği (i18n)i18n.jsx bileşeni: Türkçe, İngilizce ve Arapça destekli minimal i18n sistemi.const S = {  \"nav.sim\": { tr: \"Bina Simülasyonu\", en: \"Building Simulation\", ar: \"محاكاة المبنى\" },  \"auth.register.title\": { tr: \"Hesap oluşturun\", en: \"Create your account\", ar: \"أنشئ حسابك\" },  \/\/ ...}Arapça seçildiğinde document.dir = \"rtl\" ayarlanıyor; tüm flexbox düzeni otomatik ayna görüntüsüne dönüşüyor.TopNav içindeki DilSecici bileşeni: Bayrak + dil adı gösteren açılır menü, localStorage'da seçim saklanıyor.5. Altyapı5.1 Docker Composeservices:  db:    image: postgres:16    environment:      POSTGRES_USER: postgres      POSTGRES_PASSWORD: postgres      POSTGRES_DB: smarthome    ports: [\"5432:5432\"]    volumes: [smarthome_pgdata:\/var\/lib\/postgresql\/data]Geliştirme ortamı: docker compose up -d ile PostgreSQL ayağa kalkıyor. Üretim için DATABASE_URL ortam değişkeni değiştiriliyor.5.2 .env.exampleProjeye katılacak geliştiricilerin ihtiyaç duyduğu tüm değişkenler belgelenmiş halde .env.example'a eklendi. Gerçek .env gitignore'da.6. Teknik ÖğrenimlerFastAPI Dependency Injection: Depends(current_user) pattern'ı — her endpoint'e user: User = Depends(current_user) parametresi ekleniyor; FastAPI header'ı çözümleyip kullanıcıyı bulup enjekte ediyor. HTTPException(401) yetkisiz erişimlerde otomatik fırlatılıyor.SQLAlchemy JSON sütunu: mapped_column(JSON, nullable=True) — ilişkisel tabloya yapılandırılmamış veri saklamanın en basit yolu. Bina konfigürasyonu için ayrı tablo açmak yerine User.bina sütunu tercih edildi; config şeması zamanla değişebileceğinden migration maliyeti düşük tutuluyor.React Context API vs Zustand: Global durum yönetimi için Zustand\/Redux yerine createContext + useReducer tercih edildi. Bağımlılık eklenmedi, bundle boyutu küçük kaldı. Durum: { user, token, cfg }.RTL (Right-to-Left) desteği: CSS direction: rtl + flexbox kendi kendine ayna görüntüsüne geçiyor. Dikkat gerektiren noktalar: margin\/padding yönleri, text-align: left → start, border-left → border-inline-start.PBKDF2 vs bcrypt: bcrypt üretim standardı olarak önerilse de Python standart kütüphanesinde hashlib.pbkdf2_hmac mevcut; bcrypt veya passlib gibi ek bağımlılık gerektirmiyor. 200.000 iterasyon ile hesaplama süresi ~200 ms — kullanıcı kayıt\/girişinde kabul edilebilir, brute-force için pahalı.7. Git Commits (Gün 18)PR #XX: feat\/gun18-react-frontend-fastapi → feat\/gun17-dashboard-redesign95a661b feat(backend+frontend): add FastAPI backend + React frontend         - backend\/: FastAPI, PBKDF2 auth, SQLAlchemy (User + SimKaydi), PostgreSQL\/SQLite         - frontend\/src\/: 7 sayfa, 4 bileşen, i18n TR\/EN\/AR         - docker-compose.yml (postgres:16)         - .env.exampleYarın (Gün 19)Deploy hazırlığı: React uygulamasını npm run build ile üretim bundle'ına derleme, FastAPI'yi uvicorn --workers 4 ile ayağa kaldırma, Nginx ile statik dosya sunumu ve API proxy konfigürasyonu. Gerekirse Railway veya Render üzerinde demo yayını."
},
{
"day": 19,
"date": "2026-08-07",
"content": "Gün 19 — Uçtan Uca Test (Sıfırdan Kurulum) & Deney Kayıt Defteri1. Bugün Ne Yapıldı?İki hedef vardı: (1) projeyi sıfırdan kurulumla baştan sona çalıştırıp uçtan uca doğrulamak, (2) proje boyunca üretilen tüm değerlendirme sonuçlarını tek bir izlenebilir kayıt dosyasında toplamak — docs\/experiments\/results-log.md.Temiz bir sanal ortam kuruldu, bağımlılıklar yüklenmeye başlandı, test paketinin ve değerlendirme scriptlerinin yapısı incelendi ve tüm faz sonuçları (Faz 1, 2, 3 ve tahmin robustluğu) kaynaklarıyla birlikte tek bir deney defterine işlendi.2. Uçtan Uca Kurulum — AdımlarKurulum, README'deki resmi akış izlenerek yapıldı:python -m venv .venvsource .venv\/bin\/activatepip install -r requirements.txtpytest -qpython scripts\/eval\/eval_policy.py --days 30python scripts\/forecast\/compare.pyKurulum gözlemi. Bağımlılıklar iki kategoride değerlendirildi:Hafif paketler (numpy, pandas, gymnasium, statsmodels, pytest, plotly): sorunsuz kuruldu. Ortam fiziği, veri hizalama ve kural tabanlı politikalar bu paketlerle torch olmadan çalışabiliyor.PyTorch + Stable-Baselines3: güncel torch PyPI tekerleği tek başına ~527 MB, üstüne gigabaytlarca nvidia-* CUDA bağımlılığı çekiyor. CPU-only tekerleğin geldiği download.pytorch.org indeksi kısıtlı ortamda erişime kapalıydı. Bu yüzden RL model yükleme gerektiren eval'lar bu kısıtlı ortamda yeniden koşulmadı; bunun yerine defterdeki sayılar projenin daha önce yerel makinede\/Colab'da üretip repoya işlediği gerçek çıktılardan derlendi ve her tablonun kaynağı açıkça belirtildi.Öğrenim: RL projelerinde \"sıfırdan kurulum\" testinin en kırılgan noktası derin öğrenme kütüphanelerinin (torch) platform\/GPU'ya bağlı devasa ikili bağımlılıklarıdır. Bir E2E test planı, bu ağır adımı ayrı bir \"GPU\/Colab ortamı\" ön koşulu olarak açıkça işaretlemeli; hafif doğrulamalar (ortam, veri, baseline, API katmanı) ise torch'suz koşabilecek şekilde ayrık tutulmalı. Bu, hızlı CI için de doğru mimari.3. Deney Kayıt Defteri — docs\/experiments\/results-log.mdBugüne kadar sonuçlar README, training-notes.md ve günlük staj defterlerine dağılmıştı. Hepsi tek bir izlenebilir dosyada toplandı. Her bölüm şunu içeriyor: hangi komut, hangi veri, hangi ortam parametreleri ve kaynak dosya.Toplanan bölümler:Değerlendirme ortamı — SmartHomeEnergyEnv parametreleri ve veri kapsamı.Faz 1 — 30 günlük net kazanç (SAC +8.98, PPO +7.67, A2C +3.19) ve ilk PPO eğitimi notları.Faz 2 — kural tabanlı baseline'ların Optuna öncesi\/sonrası (ThresholdPolicy −2.57 → +2.53 TL).Faz 3 — 74 günlük test setinde tahmin belirsizliğine robustluk tablosu (TD3 +14.72, SAC +14.38 Oracle) + cihaz çalıştırma oranı (reward-hacking kontrolü).Fiyat tahmin modelleri — LightGBM+Optuna %29.93 sMAPE, Ensemble %32.10.Test paketi — 7 dosya, ~24 test; torch gerektiren\/gerektirmeyen ayrımı.Yeniden üretim — sıfırdan kurulum komutları ve ortam notu.Özet çıkarımlar.4. Sonuçların Kısa YorumuEn iyi ajanlar TD3 ve SAC: 74 günlük test setinde +14–15 TL\/gün ve dört fiyat-bilgisi modunda ±0.2 TL içinde kalarak tahmin belirsizliğine robust.Off-policy > on-policy: SAC\/TD3, sürekli batarya kontrol probleminde PPO\/A2C'yi belirgin geçiyor; A2C bu problemde negatif.Kural tabanlı politikalar Optuna ile pozitife çekilebiliyor ama RL'in dağılımdan bağımsız kararlılığına ulaşamıyor (FcAware modlar arası 9 TL oynuyor).Reward-hacking kontrolü: PPO cihazı her modda tam kapasitede (0.083) çalıştırırken SAC (0.053) seçici davranıyor — ödül değeri tek başına yeterli metrik değil; device_activation_rate şart.5. Teknik Öğrenimlerİzlenebilirlik (reproducibility) bir dosya değil, bir disiplindir. Sonuç tablosuna değeri yazmak yetmiyor; o değeri üreten komut, veri kesiti ve ortam parametreleri olmadan sayı tekrar üretilemez. results-log.md bu üçlüyü her satırda zorunlu kıldı.Ağır bağımlılıkları izole et. Torch gibi platform bağımlı, gigabaytlık bağımlılıklar E2E akışının en kırılgan halkası. Hafif doğrulamaları (env, veri, baseline, API) torch'tan ayırmak hem hızlı geri bildirim hem de dayanıklı CI sağlar.Kaynak dürüstlüğü. Bir ortamda taze koşulamayan sonuçlar \"taze koşuldu\" gibi sunulmamalı. Defterde her tablo, üretildiği koşuma atıfla ve yeniden üretim komutuyla birlikte verildi.6. Git Commits (Gün 19)PR #XX: feat\/i18n-en-ar → main[hash] feat(i18n): TR\/EN\/AR çevirisi — landing + uygulama, RTL desteği         - i18n.jsx sözlük + LangProvider, TopNav dil seçici         - tüm sayfalar + ConfigPanel + Footer t() ile[hash] fix(landing): AnimatePresence dil-değişimi donması + toggle\/hero düzeltmeleri         - showcase kartları key={i} (IntersectionObserver kopması giderildi)         - mode=\"wait\" kilidi kaldırıldı, before\/after toggle CSS, hero AI rozeti[hash] feat(i18n): backend önerileri ve 3D bina HUD etiketi dile göre         - simulate.oneriler_kodlu (kod+parametre), Simulasyon.formatOneri         - threejs.building_html unit_label, backend \/api\/building-html dil[hash] docs: deney kayıt defteri (results-log.md) — tüm faz eval sonuçları[hash] docs: Gün 19 staj defteriNot: #XX ve [hash] yer tutucularını gerçek PR numarası ve commit hash'leriyle değiştir (git log --oneline -5).7. Pazaertesi (Gün 20)Projenin son kontrollerinin tamamlanması ve teslim sürecinin hazırlanması planlanmaktadır."
}
]
},
"31": {
"name": "Faruk Tazeoğlu",
"email": "faruktazeoglu9@gmail.com",
"repo": "https:\/\/github.com\/Faruk-T\/baret",
"github_username": "Faruk-T",
"start_date": "2026-07-10",
"end_date": "2026-08-10",
"total_days": 22,
"filled_days": 22,
"entries_sample": {
"first": {
"day": 1,
"date": "2026-07-10",
"content": "Stajımın ilk gününde şirket içi oryantasyon süreçleri tamamlandı ve proje yöneticisiyle genel bir değerlendirme toplantısı yapıldı. Üzerinde çalışacağım 'İnşaat Mühendisleri ve Nalburlar için Çok Satıcılı Pazar Yeri (Multi-vendor Marketplace)' projesinin iş gereksinimleri, hedef kitlesi ve sisteme eklenecek temel özellikler detaylıca analiz edildi. Geliştirme sürecinde kullanılacak teknolojiler (mobil uygulama için React Native, arka uç için Supabase\/Firebase) üzerine literatür araştırması yapıldı. Ayrıca, şirketin versiyon kontrol (Git) ve proje yönetim standartlarına uygun olarak GitHub Flow, Issues ve Kanban panosu süreçleri incelendi. Son olarak, kodlama süreçlerine başlayabilmek için yerel bilgisayarıma gerekli geliştirme ortamı (IDE, Node.js, Git) kurularak altyapı hazırlıkları tamamlandı."
},
"middle": {
"day": 12,
"date": "2026-07-28",
"content": "Bugün Baret projesinde Faz 3 kapsamındaki Gün 15 paketini tamamladım. Amaç, alıcı tarafında ürün detay ekranını ve sepet state yönetimini çalışır hale getirmekti; sipariş oluşturma (checkout) bilinçli olarak bir sonraki güne bırakıldı.Önce day-15-product-detail-cart branch’inde CartContext katmanını ekledim. Sepete ürün ekleme\/çıkarma, adet artırma-azaltma, stok üst sınırı kontrolü ve tek mağaza kuralı (sepette bir mağazanın ürünü varken başka mağazadan ekleme uyarısı) burada toplandı. Ardından Ana Sayfa’dan ürün kartına tıklayınca açılan ProductDetailScreen üzerinde fiyat, stok, teslimat seçenekleri, adet seçici, ara toplam ve “Sepete Ekle” butonunu bağladım. Sepet sekmesinde badge (adet) ve toplam tutar canlı güncelleniyor.İkinci aşamada sepeti yalnızca bellekten yönetmek yerine AsyncStorage ile cihazda kalıcı hale getirdim; uygulama kapanıp açılınca sepet korunuyor. Detay ekranında stok yenileme, sepetteki mevcut adet önizlemesi ve sepet ekranında satır toplamı, sepeti temizleme onayı ile boş sepetten ana sayfaya dönüş CTA’sı eklendi. Checkout butonu \/ sipariş kaydı yazılmadı; ekranda “Sipariş Gün 16’da” notu bırakıldı.Test sırasında satıcı panelinde ürünler görünürken alıcı Ana Sayfa’da “0 ürün \/ onaylı mağazalarda eşleşen ürün yok” mesajı alıyordum. İncelemede kök nedenin hata değil iş kuralı olduğu anlaşıldı: mağaza durumu “Onay bekliyor” (is_approved = false) olduğu için katalog sorgusu ve RLS yalnızca onaylı mağaza ürünlerini gösteriyor. Admin onay ekranı planda Gün 17’de olduğundan demo için Supabase SQL Editor’da ilgili mağazayı is_approved = true yaptım. Onay sonrası alıcıda 5 ürün listelendi; ürün detayından sepete ekleme diyaloğu, sepet badge’i ve satır\/toplam hesapları doğrulandı.Gün sonunda Ümit Bey’e kanıt olması için Expo Go ekran görüntülerini assets\/screenshots\/ altına ekledim (onaylı katalog, ürün detay, sepete eklendi diyaloğu, sepet, SQL onay). README.md ve implementation_plan.md içinde Gün 15’i tamamlandı olarak işaretledim. Pull request açıldı: başlık\/özet, test planı ve reviewer notları (onaysız mağaza görünmez; checkout bu PR’da yok) yazıldı. Görsel redesign \/ tab ikonları bilinçli ertelendi; asıl polish için daha uygun zaman checkout sonrası veya Gün 18 olarak belirlendi.Git Commit Mesajları:[13:03] (7c1c96f) feat: add CartContext and product detail with add-to-cart Started Day 15 by wiring buyer product detail and in-memory cart state. Added CartContext with single-store cart rule and stock checks, ProductDetailScreen with quantity stepper, Home stack navigation into detail, and a live Cart tab with badge\/total. Marked Day 15 as in progress; checkout stays Day 16.[16:48] (a842c7a) feat: persist cart and polish product detail cart UX Continued Day 15 by hardening buyer cart behavior beyond the first add-to-cart pass. Persisted cart items with AsyncStorage, added CartStoreConflictError with a clear-and-add flow for different stores, refreshed product stock on focus, showed in-cart quantity and line previews on detail, and polished CartScreen with confirm-clear, line totals, and a CTA back to Home.[17:30] (6d50696) docs: close Day 15 with detail, cart, and approval proof screenshots Mark Day 15 complete and attach Expo Go evidence for Umit review: approved buyer catalog, product detail, add-to-cart dialog, cart totals, and manual store approve SQL. Checkout remains Day 16. Co-authored-by: Cursor "
},
"last": {
"day": 22,
"date": "2026-08-11",
"content": "Sektörün iPhone ağırlıklı olması nedeniyle Baret’i App Store’a taşımak için iOS yayın hattına geçtim. day-28-ios-app-store branch’inde app.json (bundle com.baret.app, privacy manifests, export compliance), eas.json (iOS preview\/production) ve docs\/ios-app-store.md (TestFlight \/ Connect checklist) hazırladım; npm script’lerini npx eas-cli ile düzelttim. Expo’ya login oldum ve eas build -p ios --profile production denedim; süreç Apple Developer hesabı isteyince durdu — ücretli Program üyeliği olmadan sertifika\/provisioning oluşmuyor. Landing ve README’ye “iOS \/ TestFlight hazırlanıyor” notunu ekledim. Commit’leri küçük parçalarda atıp push ettim. Öğrendiğim: Expo kodu iOS’e hazır olsa da mağaza yolu Apple hesabı + App Store Connect + ekran görüntüleriyle sınırlı; Truncgil’den Developer erişimi gelene kadar build’i zorlamak doğru değil."
}
},
"full_text_length": 54237,
"all_entries": [
{
"day": 1,
"date": "2026-07-10",
"content": "Stajımın ilk gününde şirket içi oryantasyon süreçleri tamamlandı ve proje yöneticisiyle genel bir değerlendirme toplantısı yapıldı. Üzerinde çalışacağım 'İnşaat Mühendisleri ve Nalburlar için Çok Satıcılı Pazar Yeri (Multi-vendor Marketplace)' projesinin iş gereksinimleri, hedef kitlesi ve sisteme eklenecek temel özellikler detaylıca analiz edildi. Geliştirme sürecinde kullanılacak teknolojiler (mobil uygulama için React Native, arka uç için Supabase\/Firebase) üzerine literatür araştırması yapıldı. Ayrıca, şirketin versiyon kontrol (Git) ve proje yönetim standartlarına uygun olarak GitHub Flow, Issues ve Kanban panosu süreçleri incelendi. Son olarak, kodlama süreçlerine başlayabilmek için yerel bilgisayarıma gerekli geliştirme ortamı (IDE, Node.js, Git) kurularak altyapı hazırlıkları tamamlandı."
},
{
"day": 2,
"date": "2026-07-13",
"content": "Baret projesi için kapsamlı implementation_plan.md hazırladım. 4 fazlı 20 günlük yol haritası, Tech Stack (Expo, TypeScript, Supabase, NativeWind), veritabanı mimarisi, ekran envanteri, kullanıcı akışları, RLS güvenlik planı ve Git\/şirket prosedürleri dokümante edildi. Projenin tek kaynak dokümantasyonu oluşturuldu."
},
{
"day": 3,
"date": "2026-07-14",
"content": "14 Temmuz 2026 — Faz 1, Gün 3: Supabase Veritabanı MimarisiBugün Baret projesinin Supabase\/PostgreSQL veritabanı şemasını tasarladım ve kodladım:Kullanıcı rolleri (admin, buyer, seller), sipariş durumu ve teslimat seçeneği için Enum tipleri tanımladım.users, stores, products, orders, reviews tablolarını Foreign Key ilişkileriyle birlikte oluşturdum.Sık filtrelenen alanlar (rol, mağaza sahibi, sipariş durumu, şehir\/ilçe) için performans indeksleri ekledim.updated_at otomatik güncelleme ve yeni kullanıcı kaydında otomatik profil oluşturma trigger'larını yazdım.is_admin() ve is_store_owner() yardımcı fonksiyonlarını, tüm tablolar için Row Level Security (RLS) politikalarını tanımladım — alıcılar sadece kendi siparişlerini, satıcılar sadece kendi mağazalarını, adminler ise her şeyi yönetebiliyor.Çalışmayı day-03-supabase-database-schema branch'inde 3 mantıklı commit'e böldüm (enum\/temizlik → tablolar\/indeksler → trigger\/RLS), GitHub'a push ettim ve Pull Request açtım.Ayrıca proje reposunu (Expo iskeleti + Faz 1 planı) temiz bir başlangıç commit'i ile main'e kurdum.Git Commit Mesajları:[12:53] (8f386ed) chore: initialize Baret Expo project scaffold and Phase 1 plan Co-authored-by: Cursor [18:39] (0577d1f) feat: add cleanup script and enum types for baret schema - Drop existing tables and enum types first so this script can be re-run safely on a fresh Supabase project - Define user_role (admin\/buyer\/seller), order_status and delivery_option enums that the rest of the schema depends on Co-authored-by: Cursor [18:40] (358a13c) feat: add core tables and indexes for baret schema - Create users, stores, products, orders and reviews tables with foreign keys linking buyers, sellers, products and orders together - Add a CHECK constraint on orders so total_amount always matches unit_price * quantity - Add indexes on frequently filtered columns (role, owner_id, store_id, status, city\/district) to keep list and search queries fast Co-authored-by: Cursor [18:41] (ff9fd0f) feat: add triggers, helper functions and RLS policies to baret schema - Add set_updated_at trigger so updated_at is refreshed automatically on every UPDATE - Add handle_new_user trigger to create a public.users row whenever someone signs up through Supabase Auth - Add is_admin and is_store_owner helper functions reused across the RLS policies - Enable Row Level Security on all 5 tables and define per-role policies so buyers only see their own orders, sellers only manage their own store\/products, and admins can manage everything Co-authored-by: Cursor "
},
{
"day": 4,
"date": "2026-07-16",
"content": "Baret projesinde alıcı akışının 3 temel ekranı (Ana Sayfa, Ürün Detay, Sepet) için AI mockup'ları tasarladım. Görseller assets\/mockups\/ klasörüne eklendi, plan güncellendi. PR açıldı.Bugün (Gün 5): Mockup'ları README'de sergileyeceğim — projenin GitHub vitrinini güncelleyeceğim. Gün sonu PR ile kapatacağım.Git Commit Mesajları:[11:42] (7814ecb) feat: add home screen mockup and update plan for Day 4 Marked Day 3 (database.sql schema) as completed in implementation_plan.md and started Day 4, whose task is producing AI-generated UI mockups for the Home, Product Detail, and Cart screens. Added the first mockup: the Home screen, showing the search bar, hardware category chips, nearby store cards, and a popular products grid. This establishes the visual style (safety-orange branding, rounded cards) that the remaining mockups will follow. Updated the Phase 1 progress bar to 50%% (3\/6 days) and adjusted the overall completion tracker to 15%% (3\/20 days).[14:07] (0c52067) feat: add product detail screen mockup Added the second Day 4 mockup: the Product Detail screen for the Baret marketplace app. The screen shows a large product image gallery, product title and brand tag, star rating, price, a verified store info card with a link to the store page, stock availability, delivery option selection (shipping vs. pickup), a quantity stepper, a short description, and a fixed bottom 'Sepete Ekle' bar with the total price. It reuses the safety-orange branding and rounded-card style established in the home screen mockup for visual consistency.[17:50] (910ec62) feat: add cart screen mockup and complete Day 4 Added the third and final Day 4 mockup: the Cart screen for the Baret marketplace app. The screen includes cart item cards with product image, store name, unit price, quantity stepper, and remove action, a promo code input, an order summary section (subtotal, shipping, total), and a fixed bottom checkout button. It follows the same safety-orange branding and rounded-card style as the home and product detail mockups. Marked Day 4 as completed in implementation_plan.md. All three core buyer-flow mockups (Home, Product Detail, Cart) are now stored under assets\/mockups\/. Updated Phase 1 progress to 67% (4\/6 days) and overall project progress to 20% (4\/20 days)."
},
{
"day": 5,
"date": "2026-07-17",
"content": "Baret projesinde alıcı akışı mockup'larını (Ana Sayfa, Ürün Detay, Sepet) README'de sergiledim. README'ye UI Mockups bölümü, tasarım dili tablosu ve 3 ekran görseli eklendi. implementation_plan.md güncellendi, Gün 5 tamamlandı (Faz 1: 5\/6 gün, %83). day-05-readme-mockup-showcase branch'inde 3 commit atıldı, gün sonu PR açıldı. Dünkü Gün 4 PR'ı (#22) gün içinde merge edildi.Git Commit Mesajları:[10:32] (dc6a482) docs: add UI mockups section to README and start Day 5 Started Phase 1 Day 5 by updating the project README with a new UI Mockups section for the buyer flow. Added a design language table (safety-orange branding, rounded cards, tab navigation) and showcased the Home screen mockup from assets\/mockups\/. Updated the project status line to reflect Phase 1 Day 5 in progress. Marked Day 5 as in progress in implementation_plan.md and updated the last-updated date to July 16.[16:44] (b6861f8) docs: showcase product detail and cart mockups in README Extended the UI Mockups section in README with the remaining two buyer-flow screens. Added the Product Detail mockup showing the image gallery, pricing, store info, stock status, delivery options, and add-to-cart bar. Added the Cart mockup showing cart items, quantity controls, promo code input, order summary, and checkout button. All three core buyer screens (Home, Product Detail, Cart) are now visible in the project README for reviewers and visitors.[16:46] (2f9c8c3) docs: complete Day 5 README showcase and update plan Finalized Phase 1 Day 5 by marking the README mockup showcase as complete. Updated the README status section to reflect that all three buyer-flow mockups (Home, Product Detail, Cart) are now displayed in the project README. Marked Day 5 as completed in implementation_plan.md and updated Phase 1 progress to 83% (5\/6 days) and overall project progress to 25% (5\/20 days)."
},
{
"day": 6,
"date": "2026-07-20",
"content": "20 Temmuz 2026 — Faz 2 Gün 7: Expo projesinde NativeWind (TailwindCSS) styling altyapısını kurdum. nativewind, tailwindcss, react-native-reanimated ve react-native-safe-area-context paketlerini ekledim. tailwind.config.js, babel.config.js, metro.config.js, global.css ve nativewind-env.d.ts dosyalarını oluşturdum. Brand rengi (#FF6B00) constants'a alındı, App.tsx'te className smoke test yapıldıGit Commit Mesajları:[10:28] (81d3fd9) feat: install NativeWind and add Tailwind base configuration Started Phase 2 Day 7 by setting up the NativeWind styling infrastructure for the Baret Expo project. Installed nativewind, tailwindcss, react-native-reanimated, and react-native-safe-area-context. Added tailwind.config.js with src\/ and App.tsx content paths plus the Baret safety-orange brand color. Added babel.config.js with NativeWind and Reanimated presets, global.css with Tailwind directives, and nativewind-env.d.ts for TypeScript className support. Marked Day 7 as in progress in implementation_plan.md as Phase 2 begins.[14:15] (95693df) feat: configure Metro bundler for NativeWind pipeline Completed the NativeWind Metro integration for Phase 2 Day 7. Added metro.config.js with withNativeWind to process global.css through the Expo bundler. Set app.json web bundler to metro for cross-platform styling support. Imported global.css in index.ts so Tailwind styles load at app startup. Added src\/constants\/colors.ts with the Baret safety-orange brand palette, confirming the src\/ folder architecture is ready for Phase 2 screen development.[17:21] (bf73683) feat: add NativeWind smoke test and complete Day 7 Finalized Phase 2 Day 7 by verifying NativeWind styles work in App.tsx. Replaced StyleSheet with Tailwind className utilities: a brand-orange Baret badge, confirmation text, and a Phase 2 Day 7 status line. This smoke test confirms the NativeWind + Metro + Babel pipeline is working. Marked Day 7 as completed in implementation_plan.md. Updated Phase 2 progress to 20% (1\/5 days) and overall project progress to 35% (7\/20 days). Updated README status for the upcoming Day 8 Supabase integration."
},
{
"day": 7,
"date": "2026-07-21",
"content": "Bugün uygulamayı Supabase backend’e bağlamak için client tarafını kurdum. Önce @supabase\/supabase-js paketini ve React Native ortamında URL desteği için gerekli polyfill’i ekledim. Ardından src\/services\/supabase.ts dosyasında tek bir paylaşılan Supabase client oluşturdum; bu client ortam değişkenlerinden proje URL’sini ve anon key’i okuyor. Gerçek anahtarların repoya girmemesi için .env.example şablonunu hazırladım ve .gitignore içine .env ekledim.Veritabanı şemasıyla uyumu sağlamak için database.sql dosyasındaki yapıları TypeScript’e taşıdım. user_role, order_status ve delivery_option ENUM’larını tip olarak tanımladım; users, stores, products, orders ve reviews tabloları için interface’ler yazdım. Ayrıca UI’da kullanılmak üzere ENUM değerlerinin Türkçe etiketlerini src\/constants\/enums.ts içine ekledim. Client’ı bu Database tipiyle typed hale getirdim; böylece sonraki sorgular şemayla tip güvenli çalışacak.Son olarak README’ye Supabase kurulum adımlarını ekledim: .env doldurma, SQL Editor’de database.sql çalıştırma ve uygulama tarafındaki ilgili dosyaların ne işe yaradığı. Bu sayede hem ben hem de inceleyen kişi şemanın nasıl uygulanacağını net takip edebiliyor.Git Commit Mesajları:[10:15] (9dbcac5) feat: add Supabase client and environment template Started Phase 2 Day 8 by wiring the Supabase backend client into the Expo app. Installed @supabase\/supabase-js and react-native-url-polyfill. Added src\/services\/supabase.ts as the shared client instance, reading EXPO_PUBLIC_SUPABASE_URL and EXPO_PUBLIC_SUPABASE_ANON_KEY. Added .env.example as a safe template and updated .gitignore so real .env secrets are never committed. Marked Day 8 as in progress in implementation_plan.md.[14:24] (d1f9e04) feat: add TypeScript types and enums matching database schema Mapped the Phase 1 database.sql schema into TypeScript for Day 8. Added UserRole, OrderStatus, and DeliveryOption enums plus User, Store, Product, Order, and Review interfaces in src\/types\/database.ts. Added Turkish UI labels in src\/constants\/enums.ts. Wired the Supabase client with createClient Database so future queries are type-safe against the schema.[17:59] (1cd6733) docs: add Supabase setup guide and complete Day 8 Finalized Phase 2 Day 8 with setup documentation for reviewers and future work. Added a README Supabase setup section covering .env configuration, applying database.sql in the SQL Editor, and the app-side mapping files (supabase.ts, database types, enum constants). Marked Day 8 as completed in implementation_plan.md. Updated Phase 2 progress to 40% (2\/5 days) and overall progress to 40% (8\/20 days)."
},
{
"day": 8,
"date": "2026-07-22",
"content": "Bugün veritabanı güvenlik katmanını ve uygulama navigasyon iskeletini ele aldım.Önce database.sql içindeki trigger ve yardımcı fonksiyonları inceledim. set_updated_at ile tablolarda otomatik zaman damgası, handle_new_user ile Auth kaydından sonra public.users satırının oluşması, is_admin ve is_store_owner ile RLS kontrollerinin nasıl çalıştığını dokümante ettim. Ardından users, stores, products, orders ve reviews tablolarındaki Row Level Security politikalarını tablo tablo yazdım: kim neyi okuyabilir\/yazabilir, onaysız mağazanın halka kapalı olması, stok kontrolü, yalnızca pending siparişin iptali ve yalnızca delivered siparişe yorum gibi iş kurallarını netleştirdim. Sonuna da SQL Editor’de doğrulama için bir kontrol listesi ekledim.Aynı gün React Navigation tarafına geçtim. Gerekli paketleri kurdum, Auth \/ Alıcı \/ Satıcı \/ Admin için typed param listeleri ve ortak bir PlaceholderScreen bileşeni hazırladım. Her rol için boş ekran taslakları ve navigator’ları oluşturdum; Auth stack, alıcı\/satıcı bottom tab’leri ve admin stack’i plana uygun şekilde bağlandı. App.tsx’i RootNavigator’a bağladım; uygulama Auth ekranından açılıyor. Oturum ve role göre otomatik yönlendirme bir sonraki işte yapılacak.Git Commit Mesajları:[10:13] (35e6700) docs: document database triggers and helper functions Started Day 9 by documenting the security layer defined in database.sql. Added docs\/rls-and-triggers.md covering set_updated_at triggers on all core tables, the handle_new_user Auth bridge (including buyer\/seller-only role rules), and the is_admin \/ is_store_owner helpers used by RLS. Linked the doc from README and marked Day 9 as in progress in implementation_plan.md.[10:24] (002ae80) docs: document RLS policies for users stores and products Extended docs\/rls-and-triggers.md with policy-by-policy tables for users, stores, and products. Documented who can SELECT\/INSERT\/UPDATE\/DELETE on each table, including public visibility rules for approved stores and active products, seller ownership checks via is_store_owner, and the restriction that users cannot change their own role. Orders and reviews policies remain for the next commit.[10:26] (6a02bf0) docs: complete RLS reference for orders and reviews Finished Day 9 by documenting orders and reviews RLS policies in docs\/rls-and-triggers.md. Covered buyer\/seller\/admin access rules, stock checks on insert, pending-only buyer cancellation, and delivered-only review creation. Added a verification checklist for SQL Editor testing. Marked Day 9 as completed and updated Phase 2 progress to 60% (3\/5 packages).[13:56] (cec2c91) feat: install React Navigation and add navigation types Started Day 10 by installing React Navigation packages and shared scaffolding. Installed @react-navigation\/native, native-stack, bottom-tabs, and react-native-screens. Added typed param lists for Auth, Buyer, Seller, Admin, and Root navigators, plus a reusable PlaceholderScreen component.[15:53] (af8a21e) feat: add placeholder screens and role navigators Added empty screen stubs for Auth, Buyer, Seller, and Admin flows, plus their navigators. Auth uses a native stack (Login, Register, RoleSelect). Buyer and Seller use bottom tabs matching the planned IA. Admin uses a native stack for approvals, user management, and stats. Screens are placeholders only; Auth logic comes in Day 11.[18:37] (207768b) feat: wire RootNavigator and complete Day 10 Connected App.tsx to RootNavigator with Auth as the default entry stack. Buyer, Seller, and Admin stacks are registered for Day 11 role-based switching. Marked Day 10 as completed and updated Phase 2 progress to 80% (4\/5 packages)."
},
{
"day": 9,
"date": "2026-07-23",
"content": "Bugün Baret projesinde 11. kısım kapsamında Supabase Auth altyapısını tamamladım; AuthContext ile oturum yönetimini ve AsyncStorage üzerinden session kalıcılığını kurdum, Giriş \/ Rol Seçimi \/ Kayıt ekranlarını buyer ve seller metadata ile bağladım ve RootNavigator’ı kullanıcı rolüne göre Auth, alıcı, satıcı ve admin akışlarına yönlendirecek şekilde güncelledim. Aynı gün 12. kısımda satıcı tarafında mağaza oluşturma ve güncelleme formunu onay durumu ile birlikte hayata geçirdim, ürün listeleme ile ekleme–düzenleme–silme CRUD ekranlarını ve ilgili servis katmanını bağladım; Expo Go sürüm uyumsuzluğu ve ortam değişkeni sorunlarını gidererek uygulamayı telefonda çalıştırdım, auth akışının cihaz ekran görüntülerini repoya ekledim ve ürün görseli yükleme işini bilerek sonraki kısma bıraktım.Git Commit Mesajları:[11:42] (a9204ca) feat: add AuthContext with Supabase session persistence Started Day 11 by wiring the authentication state layer. Installed AsyncStorage and configured the Supabase client to persist and refresh sessions. Added AuthContext with session listening, public.users profile sync, and signIn\/signUp\/signOut helpers (buyer\/seller metadata for signUp). Wrapped the app with AuthProvider and marked Day 11 as in progress.[13:15] (1979e57) feat: build Login Register and role select screens Implemented the Day 11 Auth UI flow on top of AuthContext. LoginScreen signs in with email\/password. RoleSelectScreen lets users choose buyer or seller. RegisterScreen collects name, email, and password, then calls signUp with the selected role metadata for the handle_new_user trigger.[14:13] (98f3c23) feat: route by auth role and complete Day 11 Finished Phase 2 Day 11 by connecting navigation to AuthContext. RootNavigator now shows a loading state, then Auth when logged out, or Buyer\/Seller\/Admin stacks based on public.users.role. Added sign-out actions on buyer Profile and seller Store Settings. Marked Day 11 and Phase 2 as completed (11\/20 days).[15:19] (9ca4c06) feat: add seller store profile form and fix babel-preset-expo Started Day 12 with the seller store create\/update flow and fixed local Expo startup. Added stores service helpers and a full StoreSettingsScreen form with approval status. Installed babel-preset-expo so Metro can transform the NativeWind Babel config. Marked Day 12 as in progress.[15:35] (49a722b) feat: add seller product list and CRUD forms Completed Day 12 seller product management on top of the store profile. Added products service (list\/create\/update\/delete), a Products stack navigator, ProductListScreen, and ProductFormScreen with price, stock, delivery options, and active toggle. Sellers must create a store before adding products. Marked Day 12 as completed.[16:08] (dac4fbe) docs: add device screenshots for auth flow proof"
},
{
"day": 10,
"date": "2026-07-24",
"content": "Bugün Baret projesinde 13. kısım kapsamında Supabase Storage entegrasyonunu ve ürün görseli yükleme akışını tamamladım. Sabah product-images bucket kurulum dokümanını ve storage servisini (uploadProductImage, public URL) ekledim; expo-image-picker bağımlılığını kurdum. Öğleden sonra satıcı ürün formuna galeriden görsel seçimi ve önizlemeyi bağladım, kayıttan sonra Storage’a yükleyip products.image_url alanına yazacak şekilde products servisini güncelledim ve ürün listesinde thumbnail gösterimini ekledim. Android’de galeri URI’lerinin fetch ile okunamaması nedeniyle “görsel okunamadı” hatasını tespit ettim; expo-file-system ve base64-arraybuffer ile dosyayı cache üzerinden okuyan düzeltmeyi yaptım. Satıcı hesabıyla giriş yapıp mağaza oluşturma ve ürün listesi akışını telefonda doğruladım, ürün listesi ekran görüntüsünü assets\/screenshots altına ekleyerek README ve storage dokümanını güncelledim. 13. kısım kod ve dokümantasyon olarak kapatıldı; alıcı ana sayfa ürün akışı 14. kısma bırakıldı.Git Commit Mesajları:[10:37] (4de3442) feat: add product image storage service and bucket setup docs[13:44] (464ae62) feat: wire product image picker upload and list thumbnails[13:46] (512421d) docs: complete Day 13 storage integration in plan and README[15:44] (595c43b) fix: read product images via FileSystem for Android gallery URIs[16:54] (94bf10d) docs: add seller product list screenshot and storage Android notes"
},
{
"day": 11,
"date": "2026-07-27",
"content": "27 Temmuz 2026 — Faz 3 Gün 13 kapanışı + Gün 14 (Alıcı ana sayfa katalog ve filtreler)Bugün Baret’te önce Gün 13 (Supabase Storage \/ ürün görseli) PR’ının main’e merge sürecini takip ettim; ardından Faz 3’ün sıradaki paketi olan Gün 14’e geçtim: alıcı Ana Sayfa’daki placeholder’ı kaldırıp onaylı mağazaların aktif ürünlerini gösteren canlı katalog akışını kodladım.Gün 14 kapsamında catalog servisini yazdım (yalnızca is_approved = true mağazalar + aktif ürünler). Ana Sayfa’ya arama kutusu, kategori chip’leri, şehir ve teslimat filtreleri ile ürün kartları (görsel, fiyat, mağaza, stok) ekledim. Öğleden sonra filtreleri genişlettim: ilçe, min\/max fiyat, filtreleri temizle, pull-to-refresh, daha anlaşılır boş durum metinleri ve mağaza konumu ile teslimat seçeneklerini gösteren CatalogProductCard bileşeni.Cihaz testinde ürün kaydı başarılı olsa da görsel yüklemede “Bucket not found” ve ardından Storage RLS (row-level security) hatalarıyla karşılaştım; bu yüzden ürün listede “görsel yok” görünüp kullanıcıya tam kayıt hatası gibi yansıyordu. product-images public bucket’ını oluşturdum, Storage policy’lerini store_id\/% yolu ile düzelttim (geliştirme için geçici authenticated INSERT policy), ProductForm uyarılarını “ürün kaydedildi ama görsel yüklenemedi” diye netleştirdim ve storage-setup dokümanını güncelledim.Gün sonunda alıcı filtre\/katalog ekran görüntülerini assets\/screenshots altına ekleyip README ve implementation_plan’da Gün 14’ü tamamlandı işaretledim; Day 14 PR’ı (#32) main’e merge edildi. Sonraki paket Gün 15 (ürün detay + sepet \/ CartContext) olarak planlandı.Git Commit Mesajları:[10:27] (57d4f97) feat: add buyer home catalog with search and filters Started Day 14 by replacing the buyer Home placeholder with a live product catalog. Added catalog service that lists active products from approved stores, with search, city, delivery-option, and category-chip filters. HomeScreen now shows product cards (image, price, store, stock). Marked Day 14 as in progress in implementation_plan.md.[12:54] (986c192) feat: extend buyer catalog filters and product cards Continued Day 14 by polishing the buyer home catalog experience. Added district and min\/max price filters, a clear-filters action, pull-to-refresh, richer empty states, and a reusable CatalogProductCard that shows store location and delivery options. Updated the Day 14 progress note in implementation_plan.md.[16:43] (f8fe4a2) Merge branch 'main' of https:\/\/github.com\/Faruk-T\/baret into day-14-buyer-home-catalog[17:56] (93ed966) docs: close Day 14 with storage RLS fixes and buyer filter proof Wrapped up Day 14 after fixing product-image upload failures and documenting the buyer catalog filters. During device testing we hit Bucket not found (missing product-images bucket), then new row violates row-level security policy on Storage after the product INSERT already succeeded — so products appeared in the list without images and the alert looked like a full save failure. Fixed by creating the public bucket, replacing foldername policies with LIKE store_id\/% policies (plus a temporary authenticated INSERT policy for dev), clarifying ProductForm alerts to say product saved but image failed, and disabling upload upsert. Also documented buyer Home filters (search, category chips, city\/district, price range, delivery) with screenshots and marked Day 14 complete."
},
{
"day": 12,
"date": "2026-07-28",
"content": "Bugün Baret projesinde Faz 3 kapsamındaki Gün 15 paketini tamamladım. Amaç, alıcı tarafında ürün detay ekranını ve sepet state yönetimini çalışır hale getirmekti; sipariş oluşturma (checkout) bilinçli olarak bir sonraki güne bırakıldı.Önce day-15-product-detail-cart branch’inde CartContext katmanını ekledim. Sepete ürün ekleme\/çıkarma, adet artırma-azaltma, stok üst sınırı kontrolü ve tek mağaza kuralı (sepette bir mağazanın ürünü varken başka mağazadan ekleme uyarısı) burada toplandı. Ardından Ana Sayfa’dan ürün kartına tıklayınca açılan ProductDetailScreen üzerinde fiyat, stok, teslimat seçenekleri, adet seçici, ara toplam ve “Sepete Ekle” butonunu bağladım. Sepet sekmesinde badge (adet) ve toplam tutar canlı güncelleniyor.İkinci aşamada sepeti yalnızca bellekten yönetmek yerine AsyncStorage ile cihazda kalıcı hale getirdim; uygulama kapanıp açılınca sepet korunuyor. Detay ekranında stok yenileme, sepetteki mevcut adet önizlemesi ve sepet ekranında satır toplamı, sepeti temizleme onayı ile boş sepetten ana sayfaya dönüş CTA’sı eklendi. Checkout butonu \/ sipariş kaydı yazılmadı; ekranda “Sipariş Gün 16’da” notu bırakıldı.Test sırasında satıcı panelinde ürünler görünürken alıcı Ana Sayfa’da “0 ürün \/ onaylı mağazalarda eşleşen ürün yok” mesajı alıyordum. İncelemede kök nedenin hata değil iş kuralı olduğu anlaşıldı: mağaza durumu “Onay bekliyor” (is_approved = false) olduğu için katalog sorgusu ve RLS yalnızca onaylı mağaza ürünlerini gösteriyor. Admin onay ekranı planda Gün 17’de olduğundan demo için Supabase SQL Editor’da ilgili mağazayı is_approved = true yaptım. Onay sonrası alıcıda 5 ürün listelendi; ürün detayından sepete ekleme diyaloğu, sepet badge’i ve satır\/toplam hesapları doğrulandı.Gün sonunda Ümit Bey’e kanıt olması için Expo Go ekran görüntülerini assets\/screenshots\/ altına ekledim (onaylı katalog, ürün detay, sepete eklendi diyaloğu, sepet, SQL onay). README.md ve implementation_plan.md içinde Gün 15’i tamamlandı olarak işaretledim. Pull request açıldı: başlık\/özet, test planı ve reviewer notları (onaysız mağaza görünmez; checkout bu PR’da yok) yazıldı. Görsel redesign \/ tab ikonları bilinçli ertelendi; asıl polish için daha uygun zaman checkout sonrası veya Gün 18 olarak belirlendi.Git Commit Mesajları:[13:03] (7c1c96f) feat: add CartContext and product detail with add-to-cart Started Day 15 by wiring buyer product detail and in-memory cart state. Added CartContext with single-store cart rule and stock checks, ProductDetailScreen with quantity stepper, Home stack navigation into detail, and a live Cart tab with badge\/total. Marked Day 15 as in progress; checkout stays Day 16.[16:48] (a842c7a) feat: persist cart and polish product detail cart UX Continued Day 15 by hardening buyer cart behavior beyond the first add-to-cart pass. Persisted cart items with AsyncStorage, added CartStoreConflictError with a clear-and-add flow for different stores, refreshed product stock on focus, showed in-cart quantity and line previews on detail, and polished CartScreen with confirm-clear, line totals, and a CTA back to Home.[17:30] (6d50696) docs: close Day 15 with detail, cart, and approval proof screenshots Mark Day 15 complete and attach Expo Go evidence for Umit review: approved buyer catalog, product detail, add-to-cart dialog, cart totals, and manual store approve SQL. Checkout remains Day 16. Co-authored-by: Cursor "
},
{
"day": 13,
"date": "2026-07-29",
"content": "Bugün Baret projesinde Faz 3 kapsamındaki Gün 15 paketini tamamladım. Amaç, alıcı tarafında ürün detay ekranını ve sepet state yönetimini çalışır hale getirmekti; sipariş oluşturma (checkout) bilinçli olarak bir sonraki güne bırakıldı.Önce day-15-product-detail-cart branch’inde CartContext katmanını ekledim. Sepete ürün ekleme\/çıkarma, adet artırma-azaltma, stok üst sınırı kontrolü ve tek mağaza kuralı (sepette bir mağazanın ürünü varken başka mağazadan ekleme uyarısı) burada toplandı. Ardından Ana Sayfa’dan ürün kartına tıklayınca açılan ProductDetailScreen üzerinde fiyat, stok, teslimat seçenekleri, adet seçici, ara toplam ve “Sepete Ekle” butonunu bağladım. Sepet sekmesinde badge (adet) ve toplam tutar canlı güncelleniyor.İkinci aşamada sepeti yalnızca bellekten yönetmek yerine AsyncStorage ile cihazda kalıcı hale getirdim; uygulama kapanıp açılınca sepet korunuyor. Detay ekranında stok yenileme, sepetteki mevcut adet önizlemesi ve sepet ekranında satır toplamı, sepeti temizleme onayı ile boş sepetten ana sayfaya dönüş CTA’sı eklendi. Checkout butonu \/ sipariş kaydı yazılmadı; ekranda “Sipariş Gün 16’da” notu bırakıldı.Test sırasında satıcı panelinde ürünler görünürken alıcı Ana Sayfa’da “0 ürün \/ onaylı mağazalarda eşleşen ürün yok” mesajı alıyordum. İncelemede kök nedenin hata değil iş kuralı olduğu anlaşıldı: mağaza durumu “Onay bekliyor” (is_approved = false) olduğu için katalog sorgusu ve RLS yalnızca onaylı mağaza ürünlerini gösteriyor. Admin onay ekranı planda Gün 17’de olduğundan demo için Supabase SQL Editor’da ilgili mağazayı is_approved = true yaptım. Onay sonrası alıcıda 5 ürün listelendi; ürün detayından sepete ekleme diyaloğu, sepet badge’i ve satır\/toplam hesapları doğrulandı.Gün sonunda Ümit Bey’e kanıt olması için Expo Go ekran görüntülerini assets\/screenshots\/ altına ekledim (onaylı katalog, ürün detay, sepete eklendi diyaloğu, sepet, SQL onay). README.md ve implementation_plan.md içinde Gün 15’i tamamlandı olarak işaretledim. Pull request açıldı: başlık\/özet, test planı ve reviewer notları (onaysız mağaza görünmez; checkout bu PR’da yok) yazıldı. Görsel redesign \/ tab ikonları bilinçli ertelendi; asıl polish için daha uygun zaman checkout sonrası veya Gün 18 olarak belirlendi.Git Commit Mesajları:[11:00] (5679bfb) feat: add orders service and stock decrement SQL Day 16 foundation: createOrdersFromCart (one orders row per cart line), buyer\/seller list helpers, cancel and status updates. Document SECURITY DEFINER triggers for stock sync.[11:36] (1c6f135) feat: enrich admin home with logout and store filters[11:41] (f271a11) docs: add admin panel proof screenshots[12:24] (7476cc5) feat: add checkout flow from cart Cart stack with CheckoutScreen: delivery chips, address\/phone, place order via orders service, clear cart on success. Siparişe geç CTA on CartScreen.[15:38] (c89de48) feat: order lists and admin store approval Buyer Siparişlerim with cancel-pending; seller status advance pending→delivered; admin SellerApprovals approve\/deactivate pending stores.[15:42] (7df66d6) feat: add tab bar Ionicons and brand tint[16:03] (8107966) docs: close Day 16 with checkout and order status proof[19:33] (538b93b) feat: add Day 17 reviews with proof screenshots"
},
{
"day": 14,
"date": "2026-07-30",
"content": "Bugün Baret pazaryeri uygulamasında hem kritik özellik tamamlamaları hem de yarınki canlı demoya hazırlık yaptım. Gün sonunda day-18-19-polish-docs branch’ini remote’a push edip main üzerine pull request açtım.1. Platform sızıntısını (anti-disintermediation) azaltmaAlıcıların satıcıyla uygulamayı bypass edip WhatsApp\/telefon üzerinden anlaşmasını zorlaştırmak için iletişim bilgisini kapattım:Katalog ve ürün detayda mağaza telefonu, e-posta ve tam adres gösterilmiyor; haritada aç butonu kaldırıldı (mesafe bilgisi kalabilir).Sipariş satıcı tarafından “Hazırlanıyor” ve sonrasına geçince alıcıya güvenli RPC (get_order_store_contact) ile iletişim açılıyor.Yorumlarda telefon \/ WhatsApp benzeri ifadeleri süzmek için contactFilter yardımcı fonksiyonu eklendi.Alıcı “Şikayet et” ile platform_reports kaydı oluşturabiliyor; admin tarafında rapor ekranı var.Platformda kalan satıcıları ödüllendirmek için giriş komisyonu \/ yüksek puan indirimi ayarları (anti-leakage SQL + komisyon ekranı) bağlandı.SQL: docs\/anti-leakage-setup.sql2. Sepet ekranı hatasıSepet kartında ürün görseli görünüyor ama isim, mağaza ve fiyat satırı kayboluyordu (flex layout çökmesi). CartScreen içinde içerik kolonuna flex: 1 ve minWidth: 0 vererek satır detaylarını geri getirdim.3. Teslim \/ gel-al onay koduSipariş akışını güçlendirdim:pending → preparing → shipped → deliveredshipped olunca alıcıya 6 haneli pickup_code üretiliyor; alıcı “Siparişlerim”de büyük kodu görüyor.Satıcı tek tıkla “Teslim Edildi” yapamıyor; alıcının kodunu girip confirm_order_pickup RPC ile doğruluyor.Satıcı listesinde kod istemci tarafında gizleniyor (sadece alıcı görür).Durum etiketi: “Hazır \/ Yolda”SQL: docs\/pickup-code-setup.sql (+ database.sql senkronu)4. TypeScript \/ Supabase tip hatalarıServis katmanında (users, stores, products, orders, reviews, reports, licenses, commission, admin) yaygın never tip hataları vardı. Kök neden: Database tipinde Relationships \/ Views eksikti ve satır modelleri interface olduğu için Supabase’in Record<string, unknown> şartını karşılamıyordu. Satır tiplerini type alias’a çevirdim, şemayı tamamladım; update çağrılarını doğru Update tipiyle hizaladım. Ayrıca *.css side-effect import için tip bildirimi ekledim. tsc temizlendi.5. Kanıt ekran görüntüleri ve PRCanlı akıştan 10 screenshot aldım ve assets\/screenshots\/ altına anlamlı isimlerle ekledim (mağaza ayarları\/GPS, lisans, alıcı teslim kodu, satıcı kod doğrulama, özet KPI, değerlendirme, profil düzenleme, admin lisans anahtarları, komisyon, sepet).Branch’i origin\/day-18-19-polish-docs olarak push ettim; GitHub’da PR açtım. Başlık\/özet: Day 18–19 polish, anti-leakage, pickup codes; test planında SQL sırası ve rol bazlı smoke test maddeleri yer alıyor.Git Commit Mesajları:[10:15] (b08428d) fix: soft-delete products and share format helpers[11:23] (50625cf) feat: add admin stats user list and profile polish[11:23] (2920b5a) docs: close Day 18-19 with soft-delete proof screenshots[12:23] (08d5532) feat: add password visibility toggle on auth screens Login and register previously used secureTextEntry with no way to verify typed passwords. Added a reusable PasswordField with an eye icon toggle so buyers and sellers can show or hide the password while signing in or creating an account.[13:46] (faf95d0) feat: warn sellers when product stock is low Active products at or below 10 units now surface a dashboard alert with the lowest-stock items and a shortcut to the product list. Product cards also get a low-stock badge and amber highlight so sellers can restock before listings run out.[16:20] (3f4868a) feat: let buyers edit name and phone on profile Buyers could view account info but not update it. Added users.updateProfile wiring through AuthContext and an edit mode on ProfileScreen for full name and phone, while keeping email read-only since it is the auth login identity.[17:12] (d93c297) feat: show store distance and open directions in Maps Sellers can capture the phone GPS on store settings and persist latitude\/longitude. Buyers on product detail see haversine distance when location permission is granted and can open Apple Maps or Google Maps for turn-by-turn directions to the store.[17:57] (a421e98) feat: add seller license keys with admin issuance and redeem Admins can generate one-time duration codes and share them with sellers. Sellers redeem a code on store settings to set or extend license_expires_at. Dashboard shows expiry warnings and new product creation is blocked without a valid license.[18:19] (e0a06fd) feat: add platform commission rate and per-order snapshots Admins can set a global commission percentage under platform_settings. New orders create an order_commissions row with rate, platform cut, and seller net; cancellations remove the row. Seller order cards show the breakdown and the admin commission screen summarizes revenue.[18:24] (29b7eb6) feat: polish buyer\/seller UI and add pending order tab badge Sellers see a live badge for pending orders on the Orders tab, plus a NEW chip on those cards. Light visual refresh covers catalog cards, home filters, login\/role select branding, and warmer stone\/orange surfaces without a full redesign.[18:35] (c7b1610) feat: redesign app UI with brand system and status chips Introduced a shared Baret visual kit (gradient BrandHero, cards, buttons, empty states, menu tiles) and applied it across auth, buyer, seller, and admin flows. Added colored order-status chips and seller dashboard KPI\/quick actions so the marketplace feels more polished ahead of the live demo.[18:52] (503bc6e) feat: reduce platform leakage with gated contact and incentives Hide store phone\/address\/maps on the public catalog until the seller accepts an order, then unlock contact via a secure RPC. Sanitize phone\/WhatsApp leaks in reviews, add buyer reports for admins, and reward in-app sellers with intro and high-rating commission discounts.[19:06] (5741ab6) fix: restore cart line details next to product thumbnail Cart cards were collapsing the text column so only the image showed. Rebuild the row layout with an explicit flex child so name, store, price, quantity controls, and line total render again without exposing contact info. Co-authored-by: Cursor [19:08] (7bd3180) feat: add pickup confirmation codes for in-store delivery When a seller marks an order ready (shipped), a 6-character code is generated for the buyer. The buyer shows the code at the store; the seller enters it in the app to mark the order delivered. Sellers cannot skip this step with a one-tap status change, and the code is hidden from the seller list so only the buyer screen reveals it. Co-authored-by: Cursor [19:35] (d5d6984) fix: restore Supabase Database typing for service queries Convert row models to type aliases and complete the GenericSchema shape so insert\/update\/RPC stop collapsing to never.[20:22] (0d8cb5e) docs: add demo screenshots for seller, buyer, and admin flows Capture live proof of store settings, pickup codes, commission, licenses, profile edit, and cart for the day-20 demo \/ PR."
},
{
"day": 15,
"date": "2026-07-31",
"content": "Bugün Baret projesinin canlı teslim ve kapanış günüydü. Uygulamayı Expo Go QR’sız kullanılabilecek şekilde EAS ile Android APK olarak build aldım (preview profili, com.baret.app). Supabase şema kontrollerini yaptım, test verilerini temizleyip demo hesaplarını yeniden kurdum ve alıcı–satıcı–admin senaryolarını uçtan uca doğruladım (sipariş, teslim kodu, iletişim kilidi, komisyon, lisans).Kullanılabilirlik tarafında gerçek kullanıcı testi yaptım: babam checkout’ta klavye yüzünden alt butonu göremediği için formu yeniden düzenledim — adres\/telefon zorunlu kaldı, “Siparişi oluştur” klavyenin üstünde sabit duruyor. Android alt tab’ların sistem navigasyonuna yapışması sorununu safe-area + minimum inset ile giderdim; uygulama ikonunu marka logosuna çektim. Komisyonu tek düz oran yerine sipariş tutarına göre dilimli hale getirdim (küçük\/orta\/büyük + minimum taban) ve admin komisyon ekranını sadeleştirip canlı örnek hesaplayıcı ekledim.APK linkini Ümit Bey’e ilettim; demo hesaplarla test etti, olumlu geri bildirim verdi. Play Store’a çıkış için Google Play Console daveti e-posta adresime geldi. Sonraki işler olarak proje blog yazısı ve uygulama landing page planlandı. Gün sonunda branch’teki commit’ler push’landı; proje MVP olarak demo\/APK seviyesinde teslim edildi.Git Commit Mesajları:[10:24] (a317f62) fix: sync database.sql with anti-leakage schema for day-20 go-live Mirror platform_reports, contact RPC, and intro commission incentives so the canonical schema matches production docs.[11:40] (9392b8e) fix: lift tab bar above system nav and set Baret brand app icon Use safe-area insets on buyer\/seller tabs and replace launcher icons with the hard-hat brand mark for the standalone APK.[12:12] (ae250a6) fix: raise Android tab bar clearance and resolve Expo doctor deps Force a minimum bottom inset so buyer\/seller tabs clear the system nav, and align Expo 57 peer\/package versions (font, worklets, screens).[13:23] (fc19fb2) fix: point tsconfig extends at expo\/tsconfig.base.json Make the IDE\/TS server resolve the Expo base config after the SDK 57 package bump.[13:41] (d088afb) feat: add order-amount commission tiers and redesign admin commission UI Replace the flat rate with small\/mid\/large amount bands plus a minimum cut, and give admins a clearer screen with live previews. Co-authored-by: Cursor [14:06] (18a4605) fix: keep checkout address required and sticky submit above keyboard Always collect phone, address, and city so delivery has a destination, while the order button stays visible when the keyboard is open."
},
{
"day": 16,
"date": "2026-08-03",
"content": "day-21-esn-interest branch’i üzerinden go-live baseline’a ESN interest milestone commit’i atıldı.Mevcut monetizasyon ve operasyon katmanı gözden geçirildi:Sipariş bazlı flat komisyon modeliAdmin finans \/ tahsilat \/ mağaza sağlığı ekranlarıSatıcı sipariş, stok, lisans ve bildirim akışlarıLanding sayfası + APK indirme hattıKomisyon modelinin ileride operasyonel ve hukuki risk yaratabileceği değerlendirildi; alternatif olarak ürün kapasitesine göre aylık abonelik modeli konuşuldu.Sonraki gün için yapılacaklar belirlendi:Komisyon trigger’ının kapatılmasıPlan tablolarının tasarımıAdmin atama + satıcı görünümü + landing güncellemesiTeknik \/ süreç notlarıMilestone commit’lerin branch isimlendirmesiyle (day-21, day-22…) takip edilmesi proje yönetimini kolaylaştırıyor.Büyük model değişikliğine gitmeden önce mevcut sistemin “ne işe yarıyor \/ ne riskli” ayrımını yapmak şart.Karşılaşılan durumlarPazartesi daha çok planlama + durum değerlendirme günü olduğu için kod tarafında büyük feature commit’i yok; asıl uygulama Salı’ya bırakıldı.SonuçESN milestone kaydı tamamlandı.Salı için abonelik planı pivot’unun kapsamı netleşti.Git Commit Mesajları:[20:31] (2c03de1) chore: mark ESN interest milestone on go-live baseline Branch for today's ESN outreach follow-up from the hardened preview APK state. Co-authored-by: Cursor "
},
{
"day": 17,
"date": "2026-08-04",
"content": "Günün amacıSipariş komisyonunu kaldırıp satıcıları Basic \/ Pro \/ Özel abonelik planlarına geçirmek; admin yönetimi, satıcı paneli, veritabanı kuralları ve web sitesini buna göre güncellemek; APK ile test edilebilir hale getirmek.1) Veritabanı \/ iş kurallarıdocs\/seller-plans-setup.sql hazırlandı ve uygulandı:create_order_commission no-op yapıldı → yeni siparişlerde komisyon satırı oluşmuyor.seller_plans tablosu: plan kataloğu (basic \/ pro \/ custom).store_subscriptions tablosu: mağazanın aktif aboneliği, süre, özel kapasite\/fiyat override.RLS politikaları: admin yönetir, satıcı kendi aboneliğini görür.enforce_product_plan_limit trigger: aktif plan yoksa veya kapasite dolduysa ürün INSERT engellenir.Seed fiyatlar önce geçici değerlerle açıldı, sonra iş kararına göre güncellendi:Basic: 20 ürün · ₺4.000\/ayPro: 100 ürün · ₺7.000\/ayÖzel: kapasite + fiyat anlaşmalıKatalog görünürlüğü lisans\/onay ile kaldı; plan asıl olarak ürün ekleme kapasitesi için bağlandı (mevcut mağazaları aniden düşürmemek için).2) Backend \/ service katmanısrc\/services\/plans.ts eklendi:Plan listeleme \/ güncellemeMağazaya abonelik atama \/ yenilemeAktif plan + ürün kullanımı (remainingSlots)Satıcı finans özeti (teslim geliri, açık ciro, plan gideri, tahmini net)createProduct tarafına client kontrolü eklendi (aktif plan + kalan slot).Database type’lara SellerPlan \/ StoreSubscription eklendi.3) Admin tarafıSatıcı planları ekranı: Basic\/Pro\/Özel kapasite ve aylık ücret düzenlenebiliyor.Satıcı \/ mağaza detayında:Plan seçimi (chip)Süre (ay)Özel plan için max ürün + aylık fiyat“Planı uygula \/ yenile”Admin home’da eski komisyon KPI’ları arşiv olarak işaretlendi; yeni menü: Satıcı planları.Takip bugün için satıcı detayından yapılıyor (hangi satıcı hangi planda).4) Satıcı tarafıDashboard yeniden düzenlendi:Bu ay gelir (teslim)Açık sipariş cirosuPlan gideriTahmini netPlan adı, kullanım (x\/y ürün), kalan slot, bitiş tarihi, doluluk çubuğuSipariş kartlarında “komisyon kesintisi” yerine abonelik modeli mesajı; eski komisyon kayıtları arşiv notuyla kalabilir.Aktif plan yoksa \/ kapasite dolduysa yeni ürün eklenemiyor.5) Landing (web)#planlar bölümü eklendi (Basic \/ Pro \/ Özel kartları, güncel fiyatlar).Komisyon odaklı metinler abonelik modeline çevrildi.Üstteki 3 hero görsel:İlk hali fazla soluk\/buğulu kalmıştı → overlay ve düşük opacity kaldırıldı.Sırayla odak animasyonu eklendi (büyüme \/ öne gelme).Vercel production deploy ile canlıya alındı.Yeni EAS preview APK linki landing’e bağlandı.6) Build \/ test hazırlığıEAS preview Android APK build alındı.Test için docs\/reset-buyers-sellers.sql güncellendi: alıcı\/satıcı silinirken store_subscriptions da temizleniyor.day-22-seller-plans branch’i oluşturuldu, commit’ler atıldı, remote’a push edildi, PR açıldı.Karşılaşılan sorunlar ve çözümlerLanding’de değişiklik görünmüyordu: Dosya kaydı \/ commit canlı siteyi güncellemiyor; Vercel --prod deploy gerekti.Hero görseller buğulu ve hareketsizdi: Opacity + güçlü fade overlay yüzünden; net opacity + sıralı focus animasyonu ile düzeltildi.git push upstream hatası: Branch ilk kez push edildiği için git push -u origin day-22-seller-plans kullanıldı.Plan fiyatları iş kararına göre değişti: Seed SQL + landing kartları birlikte güncellendi (20\/4000, 100\/7000).ÖğrenilenlerMonetizasyon modeli değişince sadece UI yetmez; DB trigger, RLS, admin operasyon ve satıcı deneyimi birlikte güncellenmeli.Kapasite limiti hem client’ta hem DB’de olmalı (güvenlik için DB asıl kapı).Marketing site ile app ayrı deploy zincirleri (Vercel \/ EAS); ikisini senkron tutmak şart.Test reset script’leri yeni tablolar geldikçe güncellenmeli.Gün sonu durumuKomisyon → abonelik geçişi kod ve SQL tarafında hazır.Admin plan atayabiliyor, satıcı planını dashboard’da görebiliyor.Landing ve APK güncel.Sonraki adım: production SQL doğrulama, satıcılara plan atama, uçtan uca kayıt → ürün ekleme → sipariş testi."
},
{
"day": 18,
"date": "2026-08-05",
"content": "ün 5 — Çarşamba, 5 Ağustos 2026Bugün ağırlık Play Store \/ production yayın hattı ve bildirim deneyimindeydi. Daha önce Realtime ile uygulama içi bildirim kutusu vardı; kullanıcı uygulamadayken bile sistem tepsisinde sesli uyarı görmüyordu. Bu yüzden expo-notifications kurulumunu tamamladım: Android’de yerel bildirim kanalı (baret_alerts), izinler ve app.json plugin ayarları. Ardından Realtime’dan gelen kayıtları cihaz bildirim tepsisine köprüleyen bir bridge ekledim — yani oturum açık ve Realtime bağlıyken sipariş\/admin uyarıları tray’de görünebiliyor. Kapalı uygulama için FCM’yi bilerek erteledik; bunu da admin bildirim dokümanında “şu an yerel\/tray, push değil” diye netleştirdim ki yanlış beklenti oluşmasın.Play Console Data safety \/ hesap silme politikası için landing’e gizlilik politikası sayfasını (privacy.html) yayınladım; hesap silme talebi sayfası da aynı hattın parçası. Commitleri küçük parçalara böldüm (deps → kanal\/ses → bridge → privacy → docs). Testte kanalın oluştuğunu ve uygulama açıkken tray bildiriminin geldiğini kontrol ettim. Öğrendiğim: mağaza incelemesi sadece APK\/AAB değil; gizlilik URL’si ve bildirim izinlerinin tutarlı anlatımı da zorunlu. Ertesi gün edge-to-edge ve backlog planına geçmek için günü burada kapattım.Git Commit Mesajları:[10:59] (034cf47) chore: add expo-notifications device and constants deps[13:11] (88d1076) feat: add account deletion request page for Play Data safety[15:49] (fef4c64) chore: configure Android notification permission and plugin[15:50] (f8fd891) feat: add local alert channel with default notification sound[18:44] (15f3f59) feat: bridge in-app notifications to device tray alerts[18:45] (3210b23) docs: clarify admin notification center push status[18:45] (11c6f56) feat: publish privacy policy page for Play Console"
},
{
"day": 19,
"date": "2026-08-06",
"content": "Gün 6 — Perşembe, 6 Ağustos 2026Bugün Android 15+ edge-to-edge uyarısına cevap verdim. Play Console’un deprecated system bar API’lerine işaret etmesi üzerine expo-navigation-bar ekledim; status ve navigation bar’ı translucent \/ edge-to-edge olacak şekilde app.json ve uygulama başlangıç konfigürasyonuna bağladım. Tab bar’larda safe-area inset’lerini gözden geçirdip alt sistem çubuğuyla çakışmayı azaltmaya çalıştım. Bu değişiklikleri incelemedeki production AAB’ye yüklemedim — bilinçli olarak bir sonraki sürüm (1.0.1+) için branch’te tuttuk; inceleme bozulmasın diye.Aynı gün docs\/next-release-gaps.md ile yayın sonrası boşluk analizini yazdım: FCM\/Expo push, admin aktif abonelik listesi, plan ödeme, tablet\/orientation, R8 mapping, finance KPI’larının komisyondan plan\/MRR’a çevrilmesi vb. Böylece “canlıya çıktık, sırada ne var?” sorusu tek dosyada toplanmış oldu. Edge-to-edge’i emülatör\/cihazda görsel olarak kontrol ettim; gesture navigation’da tab bar boşluğuna özellikle baktım. Öğrendiğim: store policy uyumu bazen ürün özelliğinden önce gelir; binary’yi inceleme bitmeden şişirmemek doğru taktik.Git Commit Mesajları:[16:12] (e9ee201) chore: add expo-navigation-bar for Android system chrome[16:12] (87dafb8) chore: configure translucent status and navigation bars[16:12] (5200d23) feat: enable edge-to-edge safe system UI on Android[17:31] (22ebe69) docs: add post-launch gap analysis for next Play release"
},
{
"day": 20,
"date": "2026-08-07",
"content": "Gün 7 — Cuma, 7 Ağustos 2026Bugün hem ürün sitesi hem uygulama “profesyonel kapanış” işleri yoğundu.Landing \/ Play: CTA’ları APK’dan Google Play store linkine çevirdim; yorum\/puan bölümü ve footer Play linki eklendi. GSAP\/Lenis ile scroll ve hero’da görsellerin sırayla merkeze kaydığı animasyonu iyileştirdim (yazı görselleri örtmesin diye layout’u üstte sahne \/ altta metin yaptık). README’yi Play yayını + satıcı abonelik planları modeline göre güncelledim.Auth: “Şifremi unuttum” akışını ekledim — e-posta ile resetPasswordForEmail, expo-linking + baret:\/\/reset-password deep link, recovery oturumunda ana panele düşmeden yeni şifre ekranı, updateUser({ password }). Supabase Redirect URLs’e baret:\/\/reset-password eklenmesi gerektiğini dokümante ettim (docs\/password-reset.md).Ümit Bey geri bildirimi: Örnek Credits ekranına uygun olarak uygulamada Credits \/ Open Source Licenses \/ Contact Us; alıcı profil, satıcı mağaza, admin menü girişleri. Landing’de SEO: Open Graph, JSON-LD (Organization + MobileApplication), robots.txt, sitemap.xml, llms.txt. Siteye ayrıca Baret diline uygun “Ekip & iletişim” bölümü (koyu app paneli sitede sırıttığı için açık kart tasarımına çektik). Ümit Bey’e Vercel linkini ilettim; domain’in baret.truncgil.com olarak Truncgil tarafında bağlanacağını, benim env\/blog’da linki kullanacağımı netleştirdik.Gün boyunca day-26 üzerinde bol küçük commit + push; Vercel deploy’un landing\/ klasöründen yapılması gerektiğini (kökten değil) doğruladım. Öğrendiklerim: stajda “ürün bitince bitmiyor” — store politikası, SEO\/GEO, Credits gibi sunum katmanları da teslimin parçası; domain ile deep link’i karıştırmamak kritik (baret:\/\/ app, HTTPS site)."
},
{
"day": 21,
"date": "2026-08-10",
"content": "Haftaya blog ve yayın iletişimine odaklanarak başladım. Ümit Bey’in staj blog yazısına verdiği geri bildirim (çok boşluk, başlık hiyerarşisinin dağınık olması) üzerine metni WordPress’e uygun, sıkı paragraflı hale getirdim; alt başlıkları netleştirdim ve öne çıkan görsel için kısa bir prompt hazırladım. Aynı gün Cuma’nın özetini ve haftanın planını tek cümlelik \/ blog formatında da toparladım: landing Play CTA, Credits\/SEO, şifre sıfırlama ve Truncgil domain sürecinin durumu. Açık PR’lar (day-26 vb.) ve Play production incelemesini takip listeme aldım; domain Truncgil tarafında bağlanana kadar URL güncellemesini bilinçli erteledim. Öğrendiğim: teknik iş bitince bile stajda sunum (blog düzeni) ayrı bir teslim kalemi; Markdown’ı editöre ham yapıştırmak WP’de boşluk felaketine yol açıyor."
},
{
"day": 22,
"date": "2026-08-11",
"content": "Sektörün iPhone ağırlıklı olması nedeniyle Baret’i App Store’a taşımak için iOS yayın hattına geçtim. day-28-ios-app-store branch’inde app.json (bundle com.baret.app, privacy manifests, export compliance), eas.json (iOS preview\/production) ve docs\/ios-app-store.md (TestFlight \/ Connect checklist) hazırladım; npm script’lerini npx eas-cli ile düzelttim. Expo’ya login oldum ve eas build -p ios --profile production denedim; süreç Apple Developer hesabı isteyince durdu — ücretli Program üyeliği olmadan sertifika\/provisioning oluşmuyor. Landing ve README’ye “iOS \/ TestFlight hazırlanıyor” notunu ekledim. Commit’leri küçük parçalarda atıp push ettim. Öğrendiğim: Expo kodu iOS’e hazır olsa da mağaza yolu Apple hesabı + App Store Connect + ekran görüntüleriyle sınırlı; Truncgil’den Developer erişimi gelene kadar build’i zorlamak doğru değil."
}
]
},
"32": {
"name": "Barış Paşa",
"email": "barispasa460@gmail.com",
"repo": "https:\/\/github.com\/baris8138\/UstaFlow_litte",
"github_username": "baris8138",
"start_date": "2026-07-23",
"end_date": "2026-08-23",
"total_days": 22,
"filled_days": 16,
"entries_sample": {
"first": {
"day": 1,
"date": "2026-07-23",
"content": "Stajın birinci gününde, teknik servis ve saha ekiplerinin iş süreçlerini dijital ortamda yönetmesini sağlayacak UstaFlow Lite adlı web tabanlı projenin başlangıç çalışmaları gerçekleştirildi. Proje için GitHub üzerinde bir repository oluşturuldu ve dört haftalık geliştirme sürecinin takip edilebilmesi amacıyla GitHub Projects üzerinde Kanban panosu hazırlandı. Proje görevleri; Backlog, Ready, In Progress, In Review ve Done aşamalarına ayrıldı. Ayrıca dört haftalık çalışma sürecini temsil eden milestone’lar oluşturuldu.İlk geliştirme görevi GitHub Issue olarak tanımlandı ve bu issue’ya bağlı ayrı bir branch açıldı. Projenin başlangıç altyapısı Next.js, TypeScript, App Router ve Tailwind CSS kullanılarak oluşturuldu. Uygulamanın ana sayfası UstaFlow Lite projesini tanıtacak şekilde düzenlendi. Kod kalitesinin doğrulanması amacıyla ESLint ve production build kontrolleri çalıştırıldı ve işlemler başarıyla tamamlandı. Yapılan değişiklikler commit edilerek GitHub’a gönderildi, Pull Request oluşturuldu ve main branch’ine aktarıldı. Böylece issue, branch, commit ve Pull Request tabanlı profesyonel GitHub çalışma süreci uygulamalı olarak öğrenildi."
},
"middle": {
"day": 9,
"date": "2026-08-04",
"content": "Git Commit Mesajları:[23:18] (903e324) Merge pull request #10 from baris8138\/revert-9-feat\/8-add-user-model-and-roles Revert \"feat(database): add user model and role structure\"Bugün UstaFlow Lite projesinde müşteri yönetimi modülünün geliştirilmesine devam edildi. İlk olarak müşteri bilgilerinin sisteme güvenli ve kontrollü bir şekilde kaydedilebilmesi amacıyla müşteri oluşturma işlemleri üzerinde çalışıldı. Müşteri adı, türü, telefon numarası, e-posta adresi, adres, şehir, ilçe ve posta kodu gibi bilgilerin doğrulanması sağlandı. Telefon numarası ve e-posta gibi alanlarda veri standardizasyonu uygulanarak farklı formatlarda girilen bilgilerin ortak bir biçimde veritabanına kaydedilmesi hedeflendi.Aynı telefon numarası veya e-posta adresiyle birden fazla müşteri kaydı oluşturulmasını engellemek amacıyla mükerrer kayıt kontrolleri geliştirildi. Eş zamanlı kayıt işlemlerinde oluşabilecek veritabanı çakışmaları da dikkate alınarak Prisma üzerinden güvenli hata yönetimi gerçekleştirildi. Bunun yanında kayıtlı müşterilerin listelenebilmesi, yalnızca aktif müşterilerin filtrelenebilmesi ve müşteri bilgilerinin oluşturulma tarihine göre sıralanabilmesi sağlandı."
},
"last": {
"day": 16,
"date": "2026-08-13",
"content": "Bugün UstaFlow Lite projesinde servis taleplerinin yönetici tarafından daha performanslı görüntülenebilmesi için server-side pagination özelliği geliştirildi. Servis talebi listeleme servisinde page, skip, take, count, totalPages, hasPreviousPage ve hasNextPage yapıları eklendi. Sayfa başına 10 kayıt gösterilecek şekilde yapılandırma yapıldı ve mevcut arama, durum, öncelik, teknisyen ve atanmamış görev filtrelerinin pagination ile birlikte çalışması sağlandı.Arayüz tarafında servis talepleri ekranına Önceki \/ Sayfa X-Y \/ Sonraki kontrolleri eklendi. Filtrelerin sayfa geçişlerinde korunması, yeni filtre uygulandığında tekrar ilk sayfaya dönülmesi ve geçersiz sayfa numaralarının güvenli biçimde karşılanması sağlandı. Gerçek PostgreSQL veritabanında 23 geçici servis kaydı oluşturularak 10+10+3 sayfalama yapısı, filtreli pagination ve page=99 senaryosu manuel olarak test edildi. TypeScript, lint, production build ve Git kontrolleri başarıyla tamamlandı."
}
},
"full_text_length": 15560,
"all_entries": [
{
"day": 1,
"date": "2026-07-23",
"content": "Stajın birinci gününde, teknik servis ve saha ekiplerinin iş süreçlerini dijital ortamda yönetmesini sağlayacak UstaFlow Lite adlı web tabanlı projenin başlangıç çalışmaları gerçekleştirildi. Proje için GitHub üzerinde bir repository oluşturuldu ve dört haftalık geliştirme sürecinin takip edilebilmesi amacıyla GitHub Projects üzerinde Kanban panosu hazırlandı. Proje görevleri; Backlog, Ready, In Progress, In Review ve Done aşamalarına ayrıldı. Ayrıca dört haftalık çalışma sürecini temsil eden milestone’lar oluşturuldu.İlk geliştirme görevi GitHub Issue olarak tanımlandı ve bu issue’ya bağlı ayrı bir branch açıldı. Projenin başlangıç altyapısı Next.js, TypeScript, App Router ve Tailwind CSS kullanılarak oluşturuldu. Uygulamanın ana sayfası UstaFlow Lite projesini tanıtacak şekilde düzenlendi. Kod kalitesinin doğrulanması amacıyla ESLint ve production build kontrolleri çalıştırıldı ve işlemler başarıyla tamamlandı. Yapılan değişiklikler commit edilerek GitHub’a gönderildi, Pull Request oluşturuldu ve main branch’ine aktarıldı. Böylece issue, branch, commit ve Pull Request tabanlı profesyonel GitHub çalışma süreci uygulamalı olarak öğrenildi."
},
{
"day": 2,
"date": "2026-07-24",
"content": "Stajın ikinci gününde, UstaFlow Lite projesinin dört haftalık geliştirme sürecini ayrıntılı olarak açıklayan Implementation Plan dokümanı hazırlandı. Dokümanda projenin amacı, problem tanımı, kullanıcı rolleri, MVP kapsamı, kullanılacak teknolojiler ve sistem mimarisi açıklandı. Projenin frontend tarafında Next.js, TypeScript ve Tailwind CSS, sunucu tarafında Next.js Server Actions ve Route Handlers, veritabanı tarafında ise PostgreSQL ve Prisma ORM kullanılmasına karar verildi. Kimlik doğrulama işlemleri için Auth.js planlandı ve sistemin modüler monolit mimarisiyle geliştirilmesi kararlaştırıldı.Geliştirme süreci; proje kurulumu, kimlik doğrulama, müşteri ve personel yönetimi, servis talebi yönetimi, teknik personel iş akışı, dashboard ve final testleri olmak üzere fazlara ayrıldı. Ayrıca test stratejisi, güvenlik kuralları, GitHub branch ve commit standartları, Definition of Ready, Definition of Done, risk yönetimi ve final teslim kriterleri dokümana eklendi. Hazırlanan IMPLEMENTATION_PLAN.md dosyası ayrı bir dokümantasyon branch’i üzerinden repository’ye eklendi. Değişiklikler commit edilerek Pull Request hazırlığı tamamlandı ve öğretim elemanının incelemesine sunulacak şekilde yapılandırıldı."
},
{
"day": 3,
"date": "2026-07-27",
"content": "Git Commit Mesajları:[11:52] (41b7ea7) Merge pull request #5 from baris8138\/chore\/4-configure-postgresql-prisma chore(database): configure PostgreSQL and PrismaUstaFlow Lite projesinin PostgreSQL ve Prisma ORM altyapısı hazırlandı. Prisma bağımlılıkları projeye eklendi, PostgreSQL datasource ve schema.prisma yapılandırıldı, prisma.config.ts ile .env.example dosyaları oluşturuldu ve güvenli bir Prisma Client bağlantısı geliştirildi. Prisma doğrulama, client generation, lint ve build kontrolleri başarıyla tamamlandı. Yapılan çalışmalar ayrı commitler hâlinde GitHub’a gönderildi ve Pull Request üzerinden incelemeye sunularak main branch’ine aktarıldı."
},
{
"day": 4,
"date": "2026-07-28",
"content": "Git Commit Mesajları:[18:03] (84cc453) docs(brand): add UstaFlow Lite logo assets[18:19] (06dcb83) docs(mockup): add login screen design[18:29] (e0e4c82) docs(mockup): add admin dashboard design[18:37] (9aff6e7) docs(mockup): add service request form design[19:01] (7d53c47) feat(docs): add technician task mockup[19:30] (2df15d8) docs(readme): document design assets and mockupsUstaFlow Lite projesinin görsel kimliği ve temel arayüz taslakları hazırlandı. Projeye yatay logo ve ikon dosyaları eklendi. Giriş ekranı, yönetici paneli, servis talebi oluşturma ekranı ve teknik personel görev ekranı için responsive HTML\/CSS mockup’ları geliştirildi. Hazırlanan tasarımlar düzenli klasör yapısına yerleştirildi ve README dosyasına mockup bağlantıları eklenerek dokümantasyon güncellendi. Çalışmalar ayrı commitler hâlinde GitHub’a gönderilerek Pull Request üzerinden incelemeye sunuldu."
},
{
"day": 5,
"date": "2026-07-29",
"content": "Git Commit Mesajları:[08:44] (66775b7) feat(database): add user model and role structure[17:41] (bbd5471) feat(database): add user model migrationUygulamanın kullanıcı ve rol altyapısı üzerinde çalışıldı. Prisma şemasına User modeli eklendi ve ADMIN ile TECHNICIAN rolleri enum yapısıyla tanımlandı. Kullanıcı adı, soyadı, benzersiz e-posta adresi, parola özeti, aktiflik durumu ve tarih alanları oluşturuldu. Yerel PostgreSQL kurulumu tamamlandı, UstaFlow’a özel veritabanı ve uygulama kullanıcısı hazırlandı. İlk kullanıcı migration’ı oluşturularak veritabanına uygulandı; Prisma Client, migration, lint ve production build kontrolleri başarıyla tamamlandı."
},
{
"day": 6,
"date": "2026-07-30",
"content": "Git Commit Mesajları:[16:35] (1b468e1) chore(auth): install authentication dependencies[17:07] (03e51c2) feat(auth): add password hashing service[17:13] (a0c735e) feat(auth): add credentials validation schema[17:19] (f29a04a) feat(auth): add user authentication service[17:29] (bcffb20) feat(auth): configure credentials authentication[17:36] (4301d99) docs(auth): document authentication environment variableUstaFlow Lite projesinin kimlik doğrulama altyapısı geliştirildi. Auth.js, bcryptjs ve Zod bağımlılıkları kurularak parola hashleme\/doğrulama servisi, giriş bilgileri doğrulama şeması ve kullanıcı doğrulama servisi oluşturuldu. E-posta ve parola ile giriş yapısı Auth.js Credentials sağlayıcısına bağlandı; kullanıcı rolünün JWT ve oturum bilgisine aktarılması sağlandı. Gerekli ortam değişkenleri .env.example dosyasında dokümante edildi ve TypeScript, lint ile production build kontrolleri başarıyla tamamlandı."
},
{
"day": 7,
"date": "2026-07-31",
"content": "UstaFlow Lite projesinde kimlik doğrulama altyapısının genel kontrollerini gerçekleştirdim. Açılan Pull Request ve reviewer süreçlerini takip ederek branch yapısını kontrol ettim. Sonraki geliştirme adımı olan gerçek giriş sayfası ve oturum yönlendirme akışı için teknik planlama yaptım.Bunu kutuya yazıp Deftere Kaydet diyebilirsin. Commit olmaması, o gün çalışma yapılmadığı anlamına gelmez."
},
{
"day": 8,
"date": "2026-08-03",
"content": "UstaFlow Lite projesinde güvenli çıkış işlemi ile ADMIN ve TECHNICIAN rollerine göre erişim kontrollerini tamamladım. Yetkisiz erişim, oturum yönlendirmesi ve korumalı sayfa testlerini gerçekleştirdim. Ardından müşteri yönetimi modülüne başlayarak Prisma şemasına Customer modeli ve müşteri türlerini ekledim; migration işlemini uygulayıp TypeScript, lint ve production build kontrollerini başarıyla tamamladım."
},
{
"day": 9,
"date": "2026-08-04",
"content": "Git Commit Mesajları:[23:18] (903e324) Merge pull request #10 from baris8138\/revert-9-feat\/8-add-user-model-and-roles Revert \"feat(database): add user model and role structure\"Bugün UstaFlow Lite projesinde müşteri yönetimi modülünün geliştirilmesine devam edildi. İlk olarak müşteri bilgilerinin sisteme güvenli ve kontrollü bir şekilde kaydedilebilmesi amacıyla müşteri oluşturma işlemleri üzerinde çalışıldı. Müşteri adı, türü, telefon numarası, e-posta adresi, adres, şehir, ilçe ve posta kodu gibi bilgilerin doğrulanması sağlandı. Telefon numarası ve e-posta gibi alanlarda veri standardizasyonu uygulanarak farklı formatlarda girilen bilgilerin ortak bir biçimde veritabanına kaydedilmesi hedeflendi.Aynı telefon numarası veya e-posta adresiyle birden fazla müşteri kaydı oluşturulmasını engellemek amacıyla mükerrer kayıt kontrolleri geliştirildi. Eş zamanlı kayıt işlemlerinde oluşabilecek veritabanı çakışmaları da dikkate alınarak Prisma üzerinden güvenli hata yönetimi gerçekleştirildi. Bunun yanında kayıtlı müşterilerin listelenebilmesi, yalnızca aktif müşterilerin filtrelenebilmesi ve müşteri bilgilerinin oluşturulma tarihine göre sıralanabilmesi sağlandı."
},
{
"day": 10,
"date": "2026-08-05",
"content": "Bugün UstaFlow Lite projesinde müşteri yönetimi modülünün geliştirilmesine devam edildi. Öncelikle daha önce sisteme kaydedilen müşteri bilgilerinin güvenli biçimde güncellenebilmesi için gerekli servis yapıları hazırlandı. Müşteri adı, türü, telefon, e-posta, adres, şehir, ilçe ve posta kodu gibi alanların güncellenebilmesi sağlanırken, kayıt sırasında kullanılan doğrulama ve normalizasyon kurallarının güncelleme işlemlerinde de korunmasına dikkat edildi.Müşteri güncelleme işlemlerinde aynı e-posta veya telefon numarasının başka bir müşteriye ait olup olmadığı kontrol edildi. Kullanıcının kendi mevcut e-posta veya telefon bilgisini değiştirmeden kaydetmesi durumunda yanlışlıkla mükerrer kayıt hatası oluşmaması sağlandı. Ayrıca bulunamayan müşteri kayıtları ve veritabanı kaynaklı olası hatalar için güvenli hata yönetimi uygulandı.Bunun yanında müşterilerin sistemden fiziksel olarak silinmesi yerine aktif\/pasif duruma getirilebilmesi için gerekli servis geliştirildi. Bir müşteri pasif hâle getirildiğinde kayıt veritabanında korunmaya devam ederken aktif müşteri listelerinde filtrelenebilmesi sağlandı. Pasif durumdaki müşteri tekrar aktif hâle getirilebilecek şekilde yapı oluşturuldu."
},
{
"day": 11,
"date": "2026-08-06",
"content": "Bugün UstaFlow Lite projesinde servis talebi yönetimi modülünün temel altyapısı üzerinde çalışıldı. Müşteriler adına oluşturulacak teknik servis taleplerinin sistem içerisinde düzenli ve güvenli biçimde saklanabilmesi amacıyla yeni servis talebi veri modeli tasarlandı.İlk olarak servis taleplerinde kullanılacak durum ve öncelik bilgileri enum yapıları şeklinde tanımlandı. Servis talebinin açık, atanmış, işlemde, beklemede, tamamlanmış veya iptal edilmiş olabilmesini sağlayan durum yapısı oluşturuldu. Benzer şekilde düşük, orta, yüksek ve acil olmak üzere servis talebi öncelik seviyeleri tanımlandı.Prisma şemasına ServiceRequest modeli eklenerek servis talebi başlığı, açıklaması, müşteri bilgisi, atanacak teknisyen, durum, öncelik, planlanan servis tarihi ve oluşturulma\/güncellenme tarihleri tanımlandı. Servis talepleri ile müşteri kayıtları arasında zorunlu ilişki kurulurken, teknisyen ilişkisi isteğe bağlı olacak şekilde tasarlandı. Böylece servis talebi ilk oluşturulduğunda henüz bir teknisyene atanmak zorunda olmadan sistemde tutulabilir hâle getirildi.Veritabanı tarafında performans ve ileride yapılacak sorgular dikkate alınarak müşteri, teknisyen, durum, öncelik ve oluşturulma tarihi alanları için gerekli indeksler tanımlandı. Müşteri silme işlemlerinde mevcut servis kayıtlarının yanlışlıkla kaybolmasını önlemek amacıyla ilişki kuralları güvenli şekilde yapılandırıldı. Teknisyen kaydının kaldırılması durumunda ise servis talebinin korunması ve yalnızca teknisyen ilişkisinin boşaltılması hedeflendi.Hazırlanan Prisma şeması doğrulandıktan sonra servis talebi tablosunu oluşturan migration oluşturularak yerel PostgreSQL veritabanına uygulandı. Migration sonrasında Prisma Client yeniden üretildi ve yeni service_requests tablosunun veritabanı üzerinden erişilebilir olduğu kontrol edildi.Gün sonunda Prisma şema doğrulaması, migration durumu, TypeScript, lint ve production build kontrolleri başarıyla tamamlandı. Böylece sonraki aşamalarda geliştirilecek servis talebi oluşturma, listeleme ve teknisyen atama işlemleri için gerekli veritabanı altyapısı hazırlanmış oldu."
},
{
"day": 12,
"date": "2026-08-07",
"content": "Bugün UstaFlow Lite projesinde servis talebi oluşturma ve listeleme işlemleri geliştirildi. Aktif müşteriler adına servis talebi oluşturulması sağlandı ve pasif müşterilere yeni talep açılması engellendi. Yeni taleplerin OPEN durumunda ve teknisyen atanmadan başlaması sağlandı. Ayrıca servis taleplerinin müşteri, öncelik, durum ve tarih bilgileriyle görüntülendiği yönetim ekranı hazırlandı. Geliştirilen işlemler gerçek veritabanı üzerinde test edilerek TypeScript, lint ve build kontrolleri tamamlandı."
},
{
"day": 13,
"date": "2026-08-10",
"content": "Bugün servis taleplerine teknisyen atama ve teknisyenlerin kendi görevlerini görüntüleme özellikleri geliştirildi. Yalnızca aktif ve TECHNICIAN rolündeki kullanıcıların görevlere atanabilmesi sağlandı. Teknisyenler için Görevlerim ekranı oluşturularak yalnızca kendilerine atanmış servis taleplerini ve gerekli müşteri\/saha bilgilerini görebilmeleri sağlandı. Farklı teknisyenlerin birbirlerinin görevlerine erişemediği ve ADMIN kullanıcının teknisyen ekranına giremediği test edildi. Geliştirmeler GitHub branch yapısı üzerinden commit edilerek kontroller başarıyla tamamlandı."
},
{
"day": 14,
"date": "2026-08-11",
"content": "Bugün UstaFlow Lite projesinde teknisyen görev yönetimi üzerinde çalışıldı. Teknisyenlerin yalnızca kendilerine atanmış servis taleplerini görüntüleyebildiği Görevlerim ekranı geliştirildi ve rol bazlı erişim kontrolleri test edildi.Servis talepleri için görev durum akışı oluşturularak teknisyenin görevi Atandı → Devam Ediyor → Beklemede → Devam Ediyor → Tamamlandı durumları arasında kontrollü şekilde yönetebilmesi sağlandı. Geçersiz durum geçişleri ve başka teknisyene ait görevlerin değiştirilmesi engellendi.Geliştirilen işlemler gerçek PostgreSQL veritabanı ve tarayıcı üzerinden test edildi. TypeScript, lint ve production build kontrolleri başarıyla tamamlandı ve çalışmalar ilgili feature branch’lere commit edilerek GitHub’a gönderildi."
},
{
"day": 15,
"date": "2026-08-12",
"content": "Bugün UstaFlow Lite projesinde teknisyenlerin servis taleplerine çalışma notu ekleyebilmesi üzerine çalışıldı. Servis notlarının görev ve teknisyen ile ilişkilendirilebilmesi için ServiceTaskNote veri modeli oluşturuldu ve gerekli Prisma migration işlemleri tamamlandı.Teknisyenlerin yalnızca kendilerine atanmış görevlere not ekleyebilmesi sağlandı. Başka teknisyenlerin görevlerine erişim ve not ekleme işlemleri engellendi. Notların kronolojik olarak listelenmesi ve hangi teknisyen tarafından, hangi tarihte eklendiğinin görüntülenmesi sağlandı.\/my-tasks ekranına Çalışma Notları alanı eklenerek not oluşturma formu ve not geçmişi kullanıcı arayüzüne entegre edildi. Geliştirilen yapı gerçek PostgreSQL veritabanı ve farklı teknisyen hesaplarıyla test edildi. TypeScript, lint ve production build kontrolleri başarıyla tamamlandı ve geliştirmeler GitHub üzerinde ilgili branch'e gönderilerek Pull Request hazırlandı."
},
{
"day": 16,
"date": "2026-08-13",
"content": "Bugün UstaFlow Lite projesinde servis taleplerinin yönetici tarafından daha performanslı görüntülenebilmesi için server-side pagination özelliği geliştirildi. Servis talebi listeleme servisinde page, skip, take, count, totalPages, hasPreviousPage ve hasNextPage yapıları eklendi. Sayfa başına 10 kayıt gösterilecek şekilde yapılandırma yapıldı ve mevcut arama, durum, öncelik, teknisyen ve atanmamış görev filtrelerinin pagination ile birlikte çalışması sağlandı.Arayüz tarafında servis talepleri ekranına Önceki \/ Sayfa X-Y \/ Sonraki kontrolleri eklendi. Filtrelerin sayfa geçişlerinde korunması, yeni filtre uygulandığında tekrar ilk sayfaya dönülmesi ve geçersiz sayfa numaralarının güvenli biçimde karşılanması sağlandı. Gerçek PostgreSQL veritabanında 23 geçici servis kaydı oluşturularak 10+10+3 sayfalama yapısı, filtreli pagination ve page=99 senaryosu manuel olarak test edildi. TypeScript, lint, production build ve Git kontrolleri başarıyla tamamlandı."
}
]
}
}