{
  "date": "2026-08-12",
  "entries": [
    {
      "title": "Maillerin İngilizce çerçevesi gitti — tasarımcının mail kiti uygulandı",
      "tickets": [
        "EGT-105"
      ],
      "changes": {
        "musteri": {
          "fixed": [
            "Davet maili «Hello!» diye başlıyor, «Regards,» diye bitiyor ve altında «If you're having trouble clicking the button…» yazıyordu. Gövde Türkçeydi, çerçeve değildi: Laravel'in kendi şablonu araya giriyordu. Artık üç mail de (davet, giriş bağlantısı, şifre sıfırlama) tasarımcının kitindeki gövdeyi kullanıyor — tek kolon, tek buton, altında düz bağlantı kopyası, altta neden aldığınızı söyleyen satır.",
            "⚠ Davet bağlantısı «1 saat geçerlidir» diyordu ama gerçekte 30 dakika yaşıyordu — mail, kendisine verilen süreyi iki katı gösteriyordu. Artık davet kendi süresine sahip: 7 gün. Sebebi basit: davet, beklemediğiniz bir anda gelen bir postadır; ertesi sabah açan kişi «yeni davet isteyin» duvarına toslamamalı.",
            "Davet artık şifre belirletiyor. Öncesinde bağlantı «kabul edildi» deyip giriş ekranına gönderiyordu, kişinin şifresi boş kalıyordu.",
            "Katılımcının giriş bağlantısı, kayıtlı olduğu eğitimin adını, tarihini ve referans kodunu taşıyor; eğitim bitimine kadar geçerli. Yoklama, sınav sonrası ve sertifika için aynı maile dönülebiliyor — üç ayrı mail göndermeye gerek kalmıyor. ⚠ Bağlantı tek başına kapı değil: her açılışta TC kimlik numarasının son 4 hanesi soruluyor.",
            "Şifre sıfırlama maili artık isteğin ne zaman ve kabaca nereden yapıldığını yazıyor (IP maskeli). «Ben istemedim» diyen kişinin bakabileceği tek ipucu buydu."
          ]
        },
        "altyapi": {
          "added": [
            "Her mailin düz metin karşılığı da üretiliyor. Metin bölümü olmayan bir mail hem spam filtrelerinde düşük puan alır hem de metni öne alan istemcilerde (saat, ekran okuyucu, kurumsal geçitler) bomboş görünür."
          ]
        }
      }
    },
    {
      "title": "Firma kendi yetki belgelerini ve istediği eğitimleri girebiliyor",
      "tickets": [
        "EGT-111"
      ],
      "changes": {
        "musteri": {
          "added": [
            "Firma panelinde «Firma profili» ekranı açıldı. İki soru soruyor: hangi yetki belgelerine sahipsiniz, hangi eğitimlerle ilgileniyorsunuz. Bir kez cevaplamak yeterli.",
            "Yetki belgeleri mevzuattan çıkarıldı ve listeye kondu: deniz gözetim işletme yetki belgesi, tehlikeli yük deniz gözetim yetki belgesi, Kıyı Tesisi Tehlikeli Yük Uygunluk Belgesi (TYUB), Yeşil Liman Sertifikası, Tehlikeli Madde Faaliyet Belgesi (TMFB), TMGDK yetki belgesi ve karayolu taşımacı yetki belgesi. Her birinin yanında hangi maddeye dayandığı yazıyor — firma hangi belgeden bahsettiğimizi oradan tanıyor.",
            "⚠ Belge YÜKLEMEK zorunlu değil: işaretlemek, belge numarası ve geçerlilik tarihi yazmak yeterli. Tarihi soruyoruz çünkü «süresi dolmuş» ile «kayıtlı» ayrımını ancak tarih varsa yapabiliyoruz. Mevzuatta süresi yazılı üç belgede düzenlenme tarihini yazınca bitiş tarihi öneriliyor (5 yıl), değiştirilebiliyor.",
            "Belgenin kopyasını da yükleyebiliyorsunuz — isteğe bağlı, PDF ya da fotoğraf. Yüklemezseniz beyan yine kaydedilir; yüklerseniz satırda «kopyası yüklü» yazar ve ofis tarafı da bunu görür. ⚠ Yenilenen belge için yeni dosya seçtiğinizde eskisi silinmez, kayıtta kalır: bir yıl sonra sorulacak olan o eski nüshadır.",
            "İkinci soru 3E'nin kendi eğitim kataloğundan geliyor: üç mevzuat başlığı altında 32 eğitim, tek tek işaretleniyor. ⛔ Hiçbiri seçili gelmiyor — seçim tamamen firmanındır."
          ]
        },
        "operasyon": {
          "added": [
            "Müşteri kartına «Firmanın beyanı» bloğu geldi: firmanın girdiği belgeler ve ilgilendiği eğitimler. Firma henüz cevaplamadıysa blok bunu söylüyor — yani bir satışçı «bu firma neydi» diye baktığında en azından hangi alanda çalıştığına ve ne alabileceğine dair fikir ediniyor.",
            "⚠ Blok, bunun firmanın kendi beyanı olduğunu ve 3E tarafından doğrulanmadığını açıkça yazıyor. Belge yerine geçmez."
          ]
        },
        "altyapi": {
          "fixed": [
            "Firma belgeleri tablosu vardı ama bugüne kadar hiçbir şey ona yazmıyordu — teklif isteğindeki «firmadan beklenen belge» uyarısı hiç dolmayacak bir çekmeceye bakıyordu. Artık doluyor."
          ]
        }
      }
    },
    {
      "title": "Yanlış şifre artık hata kaydı açmıyor",
      "tickets": [
        "OPS-7",
        "OPS-8",
        "OPS-9",
        "OPS-10"
      ],
      "changes": {
        "altyapi": {
          "changed": [
            "Bir öğleden sonra dört hata kaydı açıldı ve dördü de kapının çalıştığını anlatıyordu: iki kez yanlış şifre, bir kez «çok fazla deneme» sınırı, bir kez süresi dolmuş giriş bağlantısı. Bunlar arıza değil, sisteme doğru şekilde «hayır» dedirtmek. Artık hata izlemeye gönderilmiyorlar.",
            "⚠ Kayıt kaybolmuyor: başarısız giriş denemeleri ve kilitlenmeler zaten işlem günlüğüne yazılıyor (production'da 17 kayıt duruyor) ve sebebi orada okunabiliyor — kullanıcıya söylenmeyen ayrım (şifre mi yanlış, hesap mı kapalı) yalnız orada. Hata izleme bunun ikinci kopyasıydı.",
            "⚠ «Çok fazla deneme» de bu kapsamda. Birinin şifre denediğini haber verecek bir alarm istenirse, o alarm işlem günlüğü üzerine bilinçli olarak kurulur — bir yabancı şifreyi yanlış yazdı diye düşen hata kaydının üstünden değil."
          ]
        }
      }
    },
    {
      "title": "Firmanın türü artık kayıtta",
      "tickets": [
        "EGT-110"
      ],
      "changes": {
        "operasyon": {
          "added": [
            "Firma açarken artık «Firma türü» de seçiliyor: Gözetim (deniz ticareti / tehlikeli madde), Lojistik, Sanayi, Liman, Diğer. Bugüne kadar kayıtta yalnız «hukuki tür» vardı — o, faturayı kimin imzaladığını söylüyor, firmanın NE İŞ YAPTIĞINI değil. Oysa sıradaki soruların hepsi bunu soruyor: firmadan hangi yetki belgesi bekleniyor, personeli hangi eğitimleri almak zorunda, planlamacı ona hangi eğitimi önermeli.",
            "Tür listesi yönetici tanımlı: backoffice → Seçenek listeleri → «Firma türü». Yeni bir tür eklemek veri girişi, yazılım işi değil. Mevzuatta firma kategorisi diye bir tanım yok; bu liste 3E'nin kendi müşteri sınıflandırması.",
            "Müşteri listesinde «Firma türü» kolonu var, «＋ Filtre» ile türe göre süzülüyor ve arama kutusu türü de arıyor. «Türü belirtilmemiş» ayrı bir seçenek — hangi firmaların eksik olduğunu görmek için.",
            "Müşteri kartında tür, hukuki türün yanında künyede ve «Firma bilgileri» bloğunda görünüyor. Değişirse işlem günlüğüne düşüyor: bir firmanın gözetimden lojistiğe geçmesi, kimin ne zaman değiştirdiği sorulabilecek bir bilgi."
          ],
          "changed": [
            "⚠ Mevcut firmalar türsüz görünüyor (listede «—»). Alan zorunlu değil; eski kayıtlara tür uydurmak yerine boş bırakıldı, düzenleme ekranından tek tek girilebilir."
          ]
        }
      }
    },
    {
      "title": "Sunucu yeniden başladığında kuyruk artık Redis'i bekliyor",
      "tickets": [
        "OPS-5"
      ],
      "changes": {
        "altyapi": {
          "fixed": [
            "Kuyruk ve canlı yayın servisleri, sunucu yeniden başladığında altyapı hazır olmadan ayağa kalkabiliyordu: veritabanı ve Redis docker'da koşuyor, «docker başladı» demek ise «container'lar hazır» demek değil. Servis tanımları bunu bekliyor gibi görünüyordu ama beklediği şey sistemde hiç olmayan bir birimdi — yani sıra fiilen çalışmıyordu. Artık iki servis de bağımlılıkları gerçekten cevap verene kadar bekliyor (en fazla 2 dakika), sonra başlıyor.",
            "⚠ Bekleme, servisin kendi içinde. Systemd'nin «çok sık yeniden başlıyor, vazgeçtim» eşiğine takılmaması için bu şart: takılsaydı kuyruk kalıcı olarak ölü kalır ve hiçbir ekran bunu söylemezdi."
          ],
          "changed": [
            "Aynı hata dakikada bir kez raporlanıyor artık. Yeniden bağlanmayı deneyen bir servis, aynı üç satırı saatte binlerce kez hata izlemeye yazabiliyordu (12.08'de ölçüldü: bir günde 92.683 kayıt). İlk kayıt neyse gerisi onun tekrarıydı; panodaki sayılar da olayın büyüdüğünü sanmaya yol açıyordu. ⚠ Açılan kayıt sayısı değişmiyor — zaten hepsi tek bir kayıttı; değişen, gönderilen olay sayısı. Pencere ayardan kapatılabiliyor."
          ]
        }
      }
    },
    {
      "title": "Firma panelinde eğitim detayı açılmıyordu",
      "tickets": [
        "EGT-109"
      ],
      "changes": {
        "musteri": {
          "fixed": [
            "Firma panelinde satın alınan bir eğitimin detay ekranı açılmıyor, «Hata kaydedildi» sayfası çıkıyordu. Ekran katılımcı adaylarını listelerken her kişi için «bu eğitimden muaf olabilir mi» sorusunu da soruyor; bu soru kişinin KENDİ firmasının kapsamında sorulmak zorunda, ama aday listesi okunurken kişinin firma bilgisi hiç okunmuyordu. Sonuç: kapsam boş kalıyor, sistem güvenlik gereği işlemi reddediyor ve ekran hiç çizilemiyordu. Eğitim tanımı olan her eğitimde, yani pratikte hepsinde oluyordu."
          ]
        },
        "altyapi": {
          "changed": [
            "Muafiyet motoru artık firma bilgisi okunmamış bir kişiyi sessizce kabul etmiyor: hangi kişide ve hangi sebeple durduğunu adıyla söylüyor. Öncesinde hata, sebebinden üç adım uzakta ve bambaşka bir dilde (kapsam ihlali) görünüyordu — teşhis yanlış yerde aranıyordu.",
            "Ekranı uçtan uca açan regresyon testi eklendi; kolon tekrar unutulursa test kırılıyor."
          ]
        }
      }
    },
    {
      "title": "Satır menüsü tablonun içinde kalıyordu",
      "tickets": [
        "EGT-106"
      ],
      "changes": {
        "musteri": {
          "fixed": [
            "Personel listesinde bir satırın sonundaki «⋮» işaretine basıldığında açılan menü tablonun kenarında kesiliyordu: ilk bir iki kalem görünüyor, «Evrak yükle» ve «Pasifleştir» gibi alttakiler hiç görünmüyordu. Sebep, menünün tablonun kaydırma kutusunun İÇİNDE çizilmesiydi — yana kayabilen bir kutu, dışına taşan her şeyi keser. Menü artık sayfanın en üst katmanında çiziliyor ve hiçbir kutu onu kesemiyor.",
            "Menü, satırın altında yer kalmadığında yukarı doğru açılıyor; ikisi de yetmeyecek kadar dar bir ekranda kendi içinde kayıyor. Böylece hiçbir kalem erişilemez kalmıyor.",
            "Bir satırın menüsü açıkken başka bir satırın «⋮» işaretine basılırsa öncekisi kapanıyor. Önceden ikisi birden açık kalıyor ve üst üste biniyorlardı."
          ]
        },
        "operasyon": {
          "fixed": [
            "Aynı düzeltme ofis tarafındaki listelerde de geçerli — faturalar ve eğitmenler ekranlarındaki satır menüsü aynı bileşen."
          ]
        },
        "altyapi": {
          "added": [
            "Menünün ekrandan taşmadığını, satırına yapışık kaldığını ve aynı anda tek menü açık olduğunu dört ekran genişliğinde ölçen tarayıcı testleri eklendi."
          ]
        }
      }
    },
    {
      "title": "Parola yöneticisi açıkken TCKN alanı ekranı çökertiyordu",
      "tickets": [
        "OPS-4"
      ],
      "changes": {
        "musteri": {
          "fixed": [
            "Ekibim › Personel › «Yeni personel» ekranında, TCKN alanına yazmaya başlayan bazı kişilerde sayfa donuyordu — form çiziliyor, ilk tuşta ekran cevap vermez oluyordu. Sebep alanın kendisi değil, tuşu değerlendiren kontrol: rakam dışındaki tuşları daha ekrana düşmeden geri çeviriyor ve bunu yaparken basılan tuşun ADINI okuyor. Bir parola yöneticisi ya da tarayıcı eklentisi alanı kendisi doldurduğunda üretilen tuş olayının adı olmuyor; okuma boşa düşüyor ve sayfanın tamamı duruyor.",
            "Aynı satır üç kontrolde birden yazılıydı: TCKN gibi hassas alanlar, maskeli alanlar (vergi no, IBAN gibi) ve telefon. Yani hata yalnız bu ekrana ait değildi — parola yöneticisi kullanan bir kişi, rakam girilen HERHANGİ bir alanda aynı şeyi yaşayabilirdi. Üçü birden düzeltildi.",
            "Tanımadığı bir tuş artık geri çevrilmiyor, geçiriliyor: alanın ikinci süzgeci zaten rakam olmayan her şeyi bir an sonra siliyor. Yani ekran hem ayakta kalıyor hem de alana rakam dışında bir şey yazılamıyor."
          ]
        },
        "altyapi": {
          "added": [
            "Aynı hatanın bir daha yazılmasını engelleyen kontrol eklendi: bir kontrol basılan tuşun adını okuyorsa, önce o adın gerçekten geldiğini doğrulamak zorunda — doğrulamıyorsa testler kırılıyor."
          ],
          "fixed": [
            "11.08.2026 gecesi Redis geçişi sırasında iki hata kaydı düştü (OPS-2, OPS-3): kuyruk ve önbellek birkaç saniye boyunca eski adrese bağlanmaya çalıştı. Yeni yapılandırma devreye girdiğinde kesildi; 12.08'de tek bir kayıt yok. Kullanıcı tarafında görünen bir etkisi olmadı."
          ]
        }
      }
    },
    {
      "title": "Geçerlilik tarihi artık takvimden aranmıyor — süre seçiliyor",
      "tickets": [
        "EGT-107"
      ],
      "changes": {
        "planlama": {
          "changed": [
            "Yoklama ekranında sertifika girilirken «Geçerlilik bitişi» ikinci bir takvim değil: 1 yıl / 2 yıl / 3 yıl / 5 yıl / Süresiz / Kendim gireceğim kutucukları var. Seçilen süre veriliş tarihine eklenip hesaplanıyor ve sonuç ALTINDA yazıyla görünüyor — «Geçerlilik sonu: 1 Eki 2027». Kimse görmediği bir tarihi kaydetmiyor.",
            "Eğitim tanımında «yenileme süresi» doluysa o süre önceden işaretli geliyor ve kutucuğun yanında «(tanımlı)» yazıyor. Zorlamıyor: her kutucuk elle değiştirilebilir, «Kendim gireceğim» her zaman duruyor."
          ]
        },
        "musteri": {
          "changed": [
            "Aynı kısayol firma profilindeki yetki belgelerinde, personel sertifikası beyanında ve yeni personel ekranındaki sertifika satırlarında da var.",
            "Firma profilinde geçerlilik tarihi zaten kendiliğinden öneriliyordu ama sessizce: tarih ikinci takvimin içine yazılıyordu, kimse bakmıyordu. Artık öneri ekranda okunuyor."
          ],
          "fixed": [
            "Ayın 31'inde düzenlenen bir belgede önerilen geçerlilik tarihi bir sonraki ayın 3'üne kayabiliyordu (31 Ocak + 1 ay = 3 Mart). Artık ayın son gününe sabitleniyor."
          ]
        },
        "operasyon": {
          "changed": [
            "Kurum belgeleri ekranında «Geçerlilik bitişi» de aynı kutucuklarla dolduruluyor; belge türünün tanımlı süresi önceden işaretli geliyor."
          ]
        },
        "altyapi": {
          "fixed": [
            "Tarih alanının kendisi düzeltildi — asıl şikâyet buydu: takvimde yalnız «önceki ay / sonraki ay» okları vardı, iki yıl ileri gitmek on dört tıklama, bir doğum tarihine ulaşmak yüzlerce tıklamaydı. Artık alana doğrudan «01.10.2027» yazılabiliyor, takvimde çift ok bir YIL atlıyor ve ay adına basınca yıl ızgarası açılıyor.",
            "Tarih alanı artık gerçek bir yazı alanı; eskiden düğmeydi, yani klavyeyle doldurulamıyordu."
          ],
          "added": [
            "Veriliş tarihi olan bir formda geçerlilik alanının yeniden çıplak takvime dönmesini engelleyen kontrol eklendi; kısayolun kendisi de gerçek ekranda, dört ekran genişliğinde tarayıcı testiyle ölçülüyor."
          ]
        }
      }
    },
    {
      "title": "Teklif geçerliliği de kutucukla seçiliyor",
      "tickets": [
        "EGT-125"
      ],
      "changes": {
        "satis": {
          "changed": [
            "Teklif gönderilirken «Geçerlilik» alanı takvim değil: 1 hafta · 2 hafta · 30 gün · Kendim gireceğim. Süre bugüne eklenir ve hesaplanan tarih altta yazıyla görünür.",
            "Hiçbiri önceden işaretli gelmez — bir teklifin ne kadar açık kalacağı ticari bir karardır ve arkasında yönetici tarafından tanımlanmış bir alan yok; varsayılan seçmek o kararı ekrana gömmek olurdu."
          ]
        }
      }
    }
  ]
}