{
  "ad": "SarjMenzil",
  "slug": "sarj-menzil",
  "surum": "4.0.0",
  "onceki_surum": "3.0.0",
  "uyumluluk": {
    "degisiklik": "uyumsuz",
    "neden": "maliyet tüketim ölçüm sınırı ile fiyatlama ölçüm sınırı kaynak/hedef zinciri ayrımı yapıldı; batarya/çekiş dışı tüketimin başka bir fiyatlama sınırına dönüştürülmesi TUKETIM_FIYAT_SINIRI_UYUMSUZ ile reddedilir.",
    "eski_davranis": "3.x, tuketimKWh100 ve tuketimOlcumNoktasi ile birlikte herhangi bir fiyatOlcumNoktasi kabul ediyor; resmî WLTP E_AC / SEBEKE_GIRISI tüketimini bile ARAC_TRANSFER_NOKTASI fiyatına tek verim zinciriyle dönüştürebiliyordu.",
    "yeni_davranis": "4.x, kaynak (tuketimOlcumNoktasi) ile hedef (fiyatOlcumNoktasi) zincirini ayırır. Kanonik BATARYA_CEKIS tüketimi her fiyatlama sınırına hedef zincir verimiyle taşınır; çoğul A/B senaryo kıyası yalnız BATARYA_CEKIS girdisiyle yapılır. SEBEKE_GIRISI (resmî WLTP E_AC dahil) yalnız SEBEKE_SAYACI'nda, ARAC_TRANSFER_NOKTASI yalnız kendi sınırında doğrudan fiyatlanır; başka sınır TUKETIM_FIYAT_SINIRI_UYUMSUZ üretir çünkü resmî WLTP→DC teslim enerjisi çarpanı yoktur."
  },
  "aciklama": "Elektrikli araç şarj süresi, menzil, kilometre maliyeti ve benzinli/dizel enerji maliyeti kıyası için ölçüm sınırı açık makine sözleşmesi.",
  "deterministik": true,
  "offline": true,
  "fiyat_politikasi": "fiyatlar gömülü değildir, çağıran taraf sağlar",
  "olcum_noktalari": {
    "SEBEKE_GIRISI": "EVSE'nin elektrik aldığı mains/sayaç tarafındaki güç veya enerji; resmî WLTP E_AC tüketim sınırı bu enumdadır ve araç üstü şarj cihazı kayıplarını içerir.",
    "SEBEKE_SAYACI": "Kullanıcının elektrik tarifesinin uygulandığı şebeke sayacı enerjisi.",
    "ARAC_TRANSFER_NOKTASI": "EVSE çıkışı ile araç girişi arasındaki teslim noktası; AC'de araç girişindeki AC, DC'de konnektörde araca verilen DC enerji.",
    "BATARYADA_DEPOLANAN": "Şarj sonunda çekiş bataryasının kullanılabilir enerjisine eklenen enerji.",
    "BATARYA_CEKIS": "Sürüşte batarya/çekiş tarafında 100 km başına kullanılan enerji; menzil formülünün desteklediği tüketim sınırı."
  },
  "deger_kaynaklari": {
    "OLCUM": "Aynı sınırlar arasında yapılmış ölçüm.",
    "URETICI": "Üretici veya istasyon tarafından bildirilen değer; seans ölçümü değildir.",
    "VARSAYIM": "Ölçülmemiş modelleme varsayımı."
  },
  "verim_modeli": {
    "evseVerimYuzde": "SEBEKE_GIRISI → ARAC_TRANSFER_NOKTASI",
    "aracVerimYuzde": "ARAC_TRANSFER_NOKTASI → BATARYADA_DEPOLANAN",
    "uctanUcaVerimYuzde": "evseVerimYuzde × aracVerimYuzde / 100",
    "etiketleme": "Güç veya iki verimden biri ölçüm değilse sarjSuresi.tahminMi true olur. Maliyette iki verimden biri ölçüm değilse maliyet.tahminMi true olur; varsayimlar alanı ölçülmeyen sınırları kodlar."
  },
  "sayi_politikasi": {
    "makine_girdisi": "JSON number; ondalık ayırıcı noktadır.",
    "kullanici_arayuzu": "Türkçe virgül ve İngilizce nokta ondalık ayırıcıları kabul edilir.",
    "cikti": "Motor sonlu sayıları yuvarlamadan döndürür; hamSureDakika pozitif ham dakikadır, saat/dakika en yakın toplam dakikaya yuvarlanır. UI hamSureDakika < 1 ise '1 dakikadan az' gösterir; para ve mesafeyi son adımda Türkçe biçimler."
  },
  "hata_modeli": {
    "davranis": "throw",
    "aciklama": "Geçersiz girdide sonuç nesnesi dönmez; code ve alan özelliklerini taşıyan HesaplamaHatasi fırlatılır.",
    "nesne": {
      "name": "HesaplamaHatasi",
      "code": "string",
      "alan": "string veya null",
      "message": "string"
    }
  },
  "hata_kodlari": {
    "HEDEF_MEVCUTTAN_KUCUK": "Hedef şarj yüzdesi mevcut şarj yüzdesinden büyük değildir.",
    "GUC_GECERSIZ": "gucKW veya verilmiş aracMaxKW sonlu ve sıfırdan büyük değildir.",
    "VERIM_ARALIK_DISI": "evseVerimYuzde veya aracVerimYuzde yüzde 50–100 kapalı aralığında değildir.",
    "OLCUM_NOKTASI_GECERSIZ": "Güç, tüketim veya fiyat ölçüm noktası izin verilen enum değerlerinden biri değildir.",
    "TUKETIM_NOKTASI_DESTEKLENMIYOR": "Geçerli tüketim ölçüm noktası seçilen formülde desteklenmez; menzil yalnız BATARYA_CEKIS kabul eder.",
    "TUKETIM_FIYAT_SINIRI_UYUMSUZ": "Tüketim ölçüm sınırı ile fiyatlama ölçüm sınırı uyumsuz. Batarya/çekiş dışı tüketim (resmî WLTP E_AC / SEBEKE_GIRISI veya ARAC_TRANSFER_NOKTASI) yalnız kendi sınırında doğrudan fiyatlanır; başka sınır resmî WLTP→DC çarpanı olmadığından reddedilir, kanonik BATARYA_CEKIS girdisi gerekir.",
    "KAYNAK_GECERSIZ": "Güç, araç maksimum güç veya verim kaynağı izin verilen enum değerlerinden biri değildir.",
    "TUKETIM_SIFIR": "Enerji veya yakıt tüketimi sıfırdır; sıfıra bölme yapılmaz.",
    "FIYAT_EKSIK": "Hesap için gereken kWh veya litre fiyatı verilmemiş ya da pozitif sayı değildir.",
    "GIRDI_GECERSIZ": "Başka bir zorunlu girdi eksik, sonlu olmayan veya sözleşmedeki aralığın dışındadır."
  },
  "uyari_kodlari": {
    "ARAC_MAX_GUC_SINIRI": "Araç transfer noktasına çevrilmiş araç limiti, aynı noktaya çevrilmiş gucKW değerini sınırladı.",
    "DC_GUC_SABIT_DEGIL": "DC hızlı şarj gücü sabit değildir; gucKW ilgili şarj aralığındaki ortalama olmalıdır.",
    "DC_80_USTU_TAPER": "DC hedefi yüzde 80'in üzerindedir; araç özgü eğri olmadığı için tahmin kısa kalabilir."
  },
  "varsayim_kodlari": {
    "GUC_OLCULMEDI": "gucKaynagi OLCUM değildir.",
    "ARAC_MAX_GUCU_OLCULMEDI": "Ölçüm dışı aracMaxKW etkin gücü kırpmıştır.",
    "EVSE_VERIMI_OLCULMEDI": "evseVerimKaynagi OLCUM değildir.",
    "ARAC_VERIMI_OLCULMEDI": "aracVerimKaynagi OLCUM değildir."
  },
  "bloklar": {
    "sarj_suresi": {
      "baslik": "Şarj süresi",
      "fonksiyon": "sarjSuresi",
      "imza": "sarjSuresi({bataryaKWh, mevcutYuzde, hedefYuzde, gucKW, gucOlcumNoktasi, gucKaynagi, aracMaxKW, aracMaxOlcumNoktasi, aracMaxKaynagi, evseVerimYuzde, evseVerimKaynagi, aracVerimYuzde, aracVerimKaynagi, tip})",
      "girdiler": [
        {
          "ad": "bataryaKWh",
          "tip": "number",
          "birim": "kWh",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"exclusiveMinimum": 0},
          "olcum_noktasi": "BATARYADA_DEPOLANAN kapasite sınırı",
          "formuldeki_rol": "SoC farkıyla çarpılarak bataryayaDepolananKWh değerini üretir.",
          "hata_davranisi": "Eksik, sonlu değil veya <=0 ise GIRDI_GECERSIZ alan=bataryaKWh.",
          "cikti_semantigi": "Şarj çıktısındaki bataryayaDepolananKWh üst sınırının temelidir.",
          "aciklama": "Bataryanın kullanılabilir kapasitesi."
        },
        {
          "ad": "mevcutYuzde",
          "tip": "number",
          "birim": "%",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"minimum": 0, "maximum": 100},
          "olcum_noktasi": "BATARYADA_DEPOLANAN SoC göstergesi",
          "formuldeki_rol": "hedefYuzde ile farkı bataryaya eklenecek enerji kesrini verir.",
          "hata_davranisi": "Aralık dışıysa GIRDI_GECERSIZ alan=mevcutYuzde.",
          "cikti_semantigi": "Doğrudan dönmez; depolanan enerjiye yansır."
        },
        {
          "ad": "hedefYuzde",
          "tip": "number",
          "birim": "%",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"minimum": 0, "maximum": 100, "exclusiveMinimumAlan": "mevcutYuzde"},
          "olcum_noktasi": "BATARYADA_DEPOLANAN SoC göstergesi",
          "formuldeki_rol": "mevcutYuzde ile farkı bataryaya eklenecek enerji kesrini verir.",
          "hata_davranisi": "Aralık dışıysa GIRDI_GECERSIZ; mevcut değerden büyük değilse HEDEF_MEVCUTTAN_KUCUK.",
          "cikti_semantigi": "Doğrudan dönmez; depolanan enerjiye ve DC taper uyarısına yansır."
        },
        {
          "ad": "gucKW",
          "tip": "number",
          "birim": "kW",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"exclusiveMinimum": 0},
          "olcum_noktasi": "gucOlcumNoktasi alanı belirler",
          "formuldeki_rol": "SEBEKE_GIRISI ise EVSE verimiyle çarpılıp, ARAC_TRANSFER_NOKTASI ise aynen etkin güç adayına dönüşür.",
          "hata_davranisi": "Eksik, sonlu değil veya <=0 ise GUC_GECERSIZ alan=gucKW.",
          "cikti_semantigi": "etkinTransferGucuKW hesabının istasyon/ortalama güç adayıdır.",
          "aciklama": "DC için ilgili SoC aralığının ortalama gücü; tepe/nameplate güç ancak gerçekten ortalamayı temsil ediyorsa kullanılmalıdır."
        },
        {
          "ad": "gucOlcumNoktasi",
          "tip": "string",
          "birim": "birimsiz enum",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"enum": ["SEBEKE_GIRISI", "ARAC_TRANSFER_NOKTASI"]},
          "olcum_noktasi": "Alan bizzat gucKW sınırını bildirir.",
          "formuldeki_rol": "gucKW değerinin EVSE verimiyle dönüştürülüp dönüştürülmeyeceğini seçer.",
          "hata_davranisi": "Enum dışıysa OLCUM_NOKTASI_GECERSIZ alan=gucOlcumNoktasi.",
          "cikti_semantigi": "Çıktıdaki etkinTransferGucuKW her durumda ARAC_TRANSFER_NOKTASI olur."
        },
        {
          "ad": "gucKaynagi",
          "tip": "string",
          "birim": "birimsiz enum",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"enum": ["OLCUM", "URETICI", "VARSAYIM"]},
          "olcum_noktasi": "gucOlcumNoktasi ile birlikte yorumlanır.",
          "formuldeki_rol": "Aritmetiği değiştirmez; ölçüm niteliğini taşır.",
          "hata_davranisi": "Enum dışıysa KAYNAK_GECERSIZ alan=gucKaynagi.",
          "cikti_semantigi": "OLCUM değilse tahminMi=true ve varsayimlar içinde GUC_OLCULMEDI."
        },
        {
          "ad": "aracMaxKW",
          "tip": ["number", "null"],
          "birim": "kW",
          "zorunlu": false,
          "varsayilan": null,
          "gecerli_aralik": {"exclusiveMinimum": 0, "nullable": true},
          "olcum_noktasi": "aracMaxOlcumNoktasi alanı belirler",
          "formuldeki_rol": "Verilmişse araç transfer noktasına çevrilir ve gucKW adayını min() ile sınırlar; null ise sınır uygulanmaz.",
          "hata_davranisi": "null dışında sonlu değil veya <=0 ise GUC_GECERSIZ alan=aracMaxKW.",
          "cikti_semantigi": "Sınırlarsa ARAC_MAX_GUC_SINIRI ve daha düşük etkinTransferGucuKW üretir.",
          "aciklama": "Aracın azami kabul gücü; üretici değeri çoğunlukla ARAC_TRANSFER_NOKTASI sınırındadır."
        },
        {
          "ad": "aracMaxOlcumNoktasi",
          "tip": "string",
          "birim": "birimsiz enum",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"enum": ["SEBEKE_GIRISI", "ARAC_TRANSFER_NOKTASI"]},
          "olcum_noktasi": "Alan bizzat aracMaxKW sınırını bildirir.",
          "formuldeki_rol": "aracMaxKW değerinin EVSE verimiyle dönüştürülüp dönüştürülmeyeceğini seçer.",
          "hata_davranisi": "Enum dışıysa OLCUM_NOKTASI_GECERSIZ alan=aracMaxOlcumNoktasi; aracMaxKW null olsa da enum zorunludur.",
          "cikti_semantigi": "Sınır karşılaştırmasının iki gücü de ARAC_TRANSFER_NOKTASI yapmasını sağlar."
        },
        {
          "ad": "aracMaxKaynagi",
          "tip": ["string", "null"],
          "birim": "birimsiz enum",
          "zorunlu": "aracMaxKW null değilken true; aksi halde false",
          "varsayilan": null,
          "gecerli_aralik": {"enum": ["OLCUM", "URETICI", "VARSAYIM"], "nullable": true},
          "olcum_noktasi": "aracMaxOlcumNoktasi ile birlikte yorumlanır.",
          "formuldeki_rol": "Aritmetiği değiştirmez; yalnız aracMaxKW etkin gücü kırptığında sonuç niteliğini belirler.",
          "hata_davranisi": "aracMaxKW null değilken eksik veya enum dışıysa KAYNAK_GECERSIZ alan=aracMaxKaynagi.",
          "cikti_semantigi": "Ölçüm dışı maksimum güç etkin sonucu kırparsa tahminMi=true ve varsayimlar içinde ARAC_MAX_GUCU_OLCULMEDI; kırpmazsa sonuç niteliğini değiştirmez."
        },
        {
          "ad": "evseVerimYuzde",
          "tip": "number",
          "birim": "%",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"minimum": 50, "maximum": 100},
          "olcum_noktasi": "SEBEKE_GIRISI → ARAC_TRANSFER_NOKTASI",
          "formuldeki_rol": "Şebeke sınırındaki güçleri transfer noktasına çevirir ve sebekedenKWh için uçtan uca verimin ilk çarpanıdır; transfer gücüyle süre hesabına ayrıca uygulanmaz.",
          "hata_davranisi": "Aralık dışıysa VERIM_ARALIK_DISI alan=evseVerimYuzde.",
          "cikti_semantigi": "sebekedenKWh ve uctanUcaVerimYuzde değerlerini etkiler."
        },
        {
          "ad": "evseVerimKaynagi",
          "tip": "string",
          "birim": "birimsiz enum",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"enum": ["OLCUM", "VARSAYIM"]},
          "olcum_noktasi": "SEBEKE_GIRISI → ARAC_TRANSFER_NOKTASI",
          "formuldeki_rol": "Aritmetiği değiştirmez; EVSE veriminin ölçülüp ölçülmediğini taşır.",
          "hata_davranisi": "Enum dışıysa KAYNAK_GECERSIZ alan=evseVerimKaynagi.",
          "cikti_semantigi": "VARSAYIM ise tahminMi=true ve EVSE_VERIMI_OLCULMEDI kodu."
        },
        {
          "ad": "aracVerimYuzde",
          "tip": "number",
          "birim": "%",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"minimum": 50, "maximum": 100},
          "olcum_noktasi": "ARAC_TRANSFER_NOKTASI → BATARYADA_DEPOLANAN",
          "formuldeki_rol": "Süre paydasında etkinTransferGucuKW ile çarpılır; aracTransferKWh ve uçtan uca enerji zincirini belirler.",
          "hata_davranisi": "Aralık dışıysa VERIM_ARALIK_DISI alan=aracVerimYuzde.",
          "cikti_semantigi": "Süreyi, aracTransferKWh, sebekedenKWh ve uctanUcaVerimYuzde değerlerini etkiler."
        },
        {
          "ad": "aracVerimKaynagi",
          "tip": "string",
          "birim": "birimsiz enum",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"enum": ["OLCUM", "VARSAYIM"]},
          "olcum_noktasi": "ARAC_TRANSFER_NOKTASI → BATARYADA_DEPOLANAN",
          "formuldeki_rol": "Aritmetiği değiştirmez; araç tarafı veriminin ölçülüp ölçülmediğini taşır.",
          "hata_davranisi": "Enum dışıysa KAYNAK_GECERSIZ alan=aracVerimKaynagi.",
          "cikti_semantigi": "VARSAYIM ise tahminMi=true ve ARAC_VERIMI_OLCULMEDI kodu."
        },
        {
          "ad": "tip",
          "tip": "string",
          "birim": "birimsiz enum",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"enum": ["AC", "DC"]},
          "olcum_noktasi": "uygulanmaz",
          "formuldeki_rol": "Aritmetiği değiştirmez; DC uyarılarını seçer.",
          "hata_davranisi": "Enum dışıysa GIRDI_GECERSIZ alan=tip.",
          "cikti_semantigi": "DC_GUC_SABIT_DEGIL ve gerekiyorsa DC_80_USTU_TAPER uyarılarını belirler."
        }
      ],
      "formuller": [
        "bataryayaDepolananKWh = bataryaKWh × (hedefYuzde − mevcutYuzde) / 100",
        "gucTransferKW = gucOlcumNoktasi SEBEKE_GIRISI ise gucKW × evseVerimYuzde/100; aksi halde gucKW",
        "aracMaxTransferKW = aracMaxKW null ise null; aracMaxOlcumNoktasi SEBEKE_GIRISI ise aracMaxKW × evseVerimYuzde/100; aksi halde aracMaxKW",
        "etkinTransferGucuKW = min(gucTransferKW, aracMaxTransferKW null değilse)",
        "sureSaat = bataryayaDepolananKWh / (etkinTransferGucuKW × aracVerimYuzde/100)",
        "aracTransferKWh = bataryayaDepolananKWh / (aracVerimYuzde/100)",
        "sebekedenKWh = bataryayaDepolananKWh / ((evseVerimYuzde/100) × (aracVerimYuzde/100))",
        "uctanUcaVerimYuzde = evseVerimYuzde × aracVerimYuzde / 100"
      ],
      "sure_yuvarlama": "hamSureDakika = sureSaat × 60 yuvarlanmadan döner; toplamDakika = round(hamSureDakika); saat = floor(toplamDakika / 60); dakika = toplamDakika mod 60. UI hamSureDakika < 1 ise '1 dakikadan az' gösterir.",
      "cikti_semasi": {
        "tip": "object",
        "additionalProperties": false,
        "zorunlu": ["saat", "dakika", "hamSureDakika", "bataryayaDepolananKWh", "aracTransferKWh", "sebekedenKWh", "etkinTransferGucuKW", "uctanUcaVerimYuzde", "tahminMi", "varsayimlar", "uyarilar"],
        "alanlar": {
          "saat": {"tip": "integer", "birim": "saat", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"minimum": 0}, "olcum_noktasi": "zaman", "formuldeki_rol": "Yuvarlanmış toplam dakikanın floor(toplamDakika/60) bileşeni.", "hata_davranisi": "Ham süre sonlu/pozitif değilse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "dakika ile birlikte en yakın dakikaya yuvarlanmış süre."},
          "dakika": {"tip": "integer", "birim": "dakika", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"minimum": 0, "maximum": 59}, "olcum_noktasi": "zaman", "formuldeki_rol": "Yuvarlanmış toplam dakikanın mod 60 bileşeni.", "hata_davranisi": "Ham süre güvenli tamsayı sınırını aşarsa çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "saat ile birlikte süre; hiçbir zaman 60 değildir."},
          "hamSureDakika": {"tip": "number", "birim": "dakika", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "zaman", "formuldeki_rol": "sureSaat × 60; saat/dakika yuvarlamasının girdisi.", "hata_davranisi": "Sonlu/pozitif değilse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "Yuvarlanmamış ham süre; bir dakikadan kısa pozitif süreyi korur."},
          "bataryayaDepolananKWh": {"tip": "number", "birim": "kWh", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "BATARYADA_DEPOLANAN", "formuldeki_rol": "SoC farkı × kullanılabilir kapasite; süre ve enerji zincirinin payı.", "hata_davranisi": "Sonlu/pozitif sonuç üretilemezse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "SoC farkına göre bataryanın kullanılabilir enerjisine eklenecek yuvarlanmamış değer."},
          "aracTransferKWh": {"tip": "number", "birim": "kWh", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "ARAC_TRANSFER_NOKTASI", "formuldeki_rol": "bataryayaDepolananKWh / araç verimi.", "hata_davranisi": "Sonlu/pozitif sonuç üretilemezse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "Araç tarafı kaybından önce transfer edilen yuvarlanmamış enerji."},
          "sebekedenKWh": {"tip": "number", "birim": "kWh", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "SEBEKE_GIRISI", "formuldeki_rol": "bataryayaDepolananKWh / (EVSE verimi × araç verimi).", "hata_davranisi": "Sonlu/pozitif sonuç üretilemezse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "Uçtan uca verimle hesaplanan yuvarlanmamış şebeke enerjisi; kaynaklar varsayımsa tahmindir."},
          "etkinTransferGucuKW": {"tip": "number", "birim": "kW", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "ARAC_TRANSFER_NOKTASI", "formuldeki_rol": "Normalize edilmiş iki güç arasındaki min(); süre paydasının güç çarpanı.", "hata_davranisi": "Sonlu/pozitif sonuç üretilemezse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "İki güç aynı sınıra çevrildikten sonra süre için kullanılan yuvarlanmamış güç."},
          "uctanUcaVerimYuzde": {"tip": "number", "birim": "%", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"minimum": 25, "maximum": 100}, "olcum_noktasi": "SEBEKE_GIRISI → BATARYADA_DEPOLANAN", "formuldeki_rol": "evseVerimYuzde × aracVerimYuzde / 100.", "hata_davranisi": "Girdi verimleri aralık dışıysa çıktı yerine VERIM_ARALIK_DISI.", "cikti_semantigi": "İki ayrı verimin bilgi amaçlı çarpımı; süreye yeniden uygulanmaz."},
          "tahminMi": {"tip": "boolean", "birim": "birimsiz", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"enum": [true, false]}, "olcum_noktasi": "metadata", "formuldeki_rol": "varsayimlar.length > 0.", "hata_davranisi": "Kaynak enumu geçersizse çıktı yerine KAYNAK_GECERSIZ.", "cikti_semantigi": "Güç veya iki verim ölçüm değilse ya da etkin gücü kırpan aracMaxKW ölçüm dışıysa true."},
          "varsayimlar": {"tip": "array", "birim": "birimsiz kod", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"itemsEnum": ["GUC_OLCULMEDI", "ARAC_MAX_GUCU_OLCULMEDI", "EVSE_VERIMI_OLCULMEDI", "ARAC_VERIMI_OLCULMEDI"]}, "olcum_noktasi": "metadata", "formuldeki_rol": "Kaynak enumlarından sonucu etkileyen ölçülmemiş sınır kodlarını toplar.", "hata_davranisi": "Kaynak enumu geçersizse çıktı yerine KAYNAK_GECERSIZ.", "cikti_semantigi": "Ölçülmeyen güç/verim sınırları ve etkin kırpma kaynağının sıralı kodları; yoksa boş dizi."},
          "uyarilar": {"tip": "array", "birim": "birimsiz kod", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"itemsEnum": ["ARAC_MAX_GUC_SINIRI", "DC_GUC_SABIT_DEGIL", "DC_80_USTU_TAPER"]}, "olcum_noktasi": "metadata", "formuldeki_rol": "Normalize edilmiş güç karşılaştırması, tip ve hedefYuzde koşullarından üretilir.", "hata_davranisi": "Uyarı koşulu yoksa hata değil boş dizi döner.", "cikti_semantigi": "Güç sınırı ve DC eğrisi hakkında sıralı makine uyarıları."}
        }
      },
      "hata_kodlari": ["HEDEF_MEVCUTTAN_KUCUK", "GUC_GECERSIZ", "VERIM_ARALIK_DISI", "OLCUM_NOKTASI_GECERSIZ", "KAYNAK_GECERSIZ", "GIRDI_GECERSIZ"]
    },
    "menzil": {
      "baslik": "Menzil",
      "fonksiyon": "menzil",
      "imza": "menzil({bataryaKWh, tuketimKWh100, tuketimOlcumNoktasi, katsayiYuzde})",
      "girdiler": [
        {"ad": "bataryaKWh", "tip": "number", "birim": "kWh", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "BATARYA_CEKIS kullanılabilir kapasite", "formuldeki_rol": "Menzil formülünün enerji payıdır.", "hata_davranisi": "Eksik, sonlu değil veya <=0 ise GIRDI_GECERSIZ alan=bataryaKWh.", "cikti_semantigi": "km ve guvenliKm hesabını ölçekler."},
        {"ad": "tuketimKWh100", "tip": "number", "birim": "kWh/100km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "tuketimOlcumNoktasi alanı belirler; bu fonksiyonda yalnız BATARYA_CEKIS desteklenir.", "formuldeki_rol": "BATARYA_CEKIS tüketimi olarak katsayıyla artırılıp kullanılabilir batarya kapasitesinin bölenidir.", "hata_davranisi": "0 ise TUKETIM_SIFIR; negatif/eksik/sonlu değilse GIRDI_GECERSIZ alan=tuketimKWh100.", "cikti_semantigi": "Batarya/çekiş tarafındaki 100 km enerjisi; resmî WLTP E_AC değildir."},
        {"ad": "tuketimOlcumNoktasi", "tip": "string", "birim": "birimsiz enum", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"enum": ["BATARYA_CEKIS"]}, "olcum_noktasi": "Alan bizzat tuketimKWh100 sınırını bildirir.", "formuldeki_rol": "Kullanılabilir batarya ile uyumlu tüketim sınırını zorunlu kılar; aritmetiği değiştirmez.", "hata_davranisi": "Global enum dışıysa OLCUM_NOKTASI_GECERSIZ; ARAC_TRANSFER_NOKTASI veya SEBEKE_GIRISI ise TUKETIM_NOKTASI_DESTEKLENMIYOR alan=tuketimOlcumNoktasi.", "cikti_semantigi": "Çıktıda BATARYA_CEKIS olarak aynen yankılanır; şebeke/WLTP yolu desteklenmez ve kullanıcı resmî menzil değerine yönlendirilir."},
        {"ad": "katsayiYuzde", "tip": ["number", "null"], "birim": "%", "zorunlu": false, "varsayilan": 0, "gecerli_aralik": {"minimum": 0, "nullable": true}, "olcum_noktasi": "BATARYA_CEKIS tüketim düzeltmesi", "formuldeki_rol": "tuketimKWh100 değerini (1 + katsayiYuzde/100) ile artırır.", "hata_davranisi": "Negatif/sonlu değilse GIRDI_GECERSIZ alan=katsayiYuzde; null 0 kabul edilir.", "cikti_semantigi": "km ve guvenliKm değerlerini azaltabilen kullanıcı düzeltmesi."}
      ],
      "formuller": [
        "tuketimOlcumNoktasi yalnız BATARYA_CEKIS olabilir; SEBEKE_GIRISI (resmî WLTP E_AC dahil) ve ARAC_TRANSFER_NOKTASI TUKETIM_NOKTASI_DESTEKLENMIYOR üretir",
        "km = bataryaKWh × 100 / (BATARYA_CEKIS tuketimKWh100 × (1 + katsayiYuzde/100))",
        "guvenliKm = km × 0.8"
      ],
      "cikti_semasi": {
        "tip": "object",
        "additionalProperties": false,
        "zorunlu": ["km", "guvenliKm", "tuketimOlcumNoktasi"],
        "alanlar": {
          "km": {"tip": "number", "birim": "km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "mesafe", "formuldeki_rol": "Kullanılabilir batarya / BATARYA_CEKIS tüketimi.", "hata_davranisi": "Sonlu/pozitif sonuç üretilemezse GIRDI_GECERSIZ.", "cikti_semantigi": "Yuvarlanmamış tahmini menzil; resmî menzil değildir."},
          "guvenliKm": {"tip": "number", "birim": "km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "mesafe", "formuldeki_rol": "km × 0.8.", "hata_davranisi": "km sonlu/pozitif değilse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "[KAYNAK-DOĞRULANMADI] %20 ürün planlama rezervli değer; garanti değildir."},
          "tuketimOlcumNoktasi": {"tip": "string", "birim": "birimsiz enum", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"enum": ["BATARYA_CEKIS"]}, "olcum_noktasi": "metadata", "formuldeki_rol": "Girdi tüketim sınırını çıktıda yankılar.", "hata_davranisi": "Desteklenmeyen sınırda çıktı yerine TUKETIM_NOKTASI_DESTEKLENMIYOR.", "cikti_semantigi": "Menzil sonucunun yalnız BATARYA_CEKIS tüketiminden üretildiğini makinece bildirir."}
        }
      },
      "hata_kodlari": ["TUKETIM_SIFIR", "TUKETIM_NOKTASI_DESTEKLENMIYOR", "OLCUM_NOKTASI_GECERSIZ", "GIRDI_GECERSIZ"]
    },
    "km_maliyeti": {
      "baslik": "Kilometre başına enerji maliyeti",
      "fonksiyon": "maliyet",
      "imza": "maliyet({tuketimKWh100, tuketimOlcumNoktasi, kwhFiyat, fiyatOlcumNoktasi, evseVerimYuzde, evseVerimKaynagi, aracVerimYuzde, aracVerimKaynagi, aylikKm})",
      "girdiler": [
        {
          "ad": "tuketimKWh100",
          "tip": "number",
          "birim": "kWh/100km",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"exclusiveMinimum": 0},
          "olcum_noktasi": "tuketimOlcumNoktasi alanı BATARYA_CEKIS, ARAC_TRANSFER_NOKTASI veya SEBEKE_GIRISI olarak belirler.",
          "formuldeki_rol": "Seçilen sınırdaki başlangıç enerjisidir; diğer iki sınıra yalnız gereken yöndeki verimle çevrilir.",
          "hata_davranisi": "0 ise TUKETIM_SIFIR; negatif/eksik/sonlu değilse GIRDI_GECERSIZ.",
          "cikti_semantigi": "Verildiği sınır tuketimOlcumNoktasi ile çıktıda yankılanır; SEBEKE_GIRISI resmî WLTP E_AC dahil şebeke tüketimidir."
        },
        {
          "ad": "tuketimOlcumNoktasi",
          "tip": "string",
          "birim": "birimsiz enum",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"enum": ["BATARYA_CEKIS", "ARAC_TRANSFER_NOKTASI", "SEBEKE_GIRISI"]},
          "olcum_noktasi": "Alan bizzat tuketimKWh100 kaynak sınırını bildirir.",
          "formuldeki_rol": "Kaynak şarj zincirinin başlangıç noktasıdır. Yalnız BATARYA_CEKIS kanonik girdi her fiyatlama sınırına hedef zincir verimiyle taşınır; batarya dışı tüketim fiyatOlcumNoktasi ile aynı sınır değilse dönüştürülmez.",
          "hata_davranisi": "Eksik veya enum dışıysa OLCUM_NOKTASI_GECERSIZ alan=tuketimOlcumNoktasi; fiyatOlcumNoktasi ile uyumsuzsa TUKETIM_FIYAT_SINIRI_UYUMSUZ alan=fiyatOlcumNoktasi.",
          "cikti_semantigi": "Çıktıda aynen yankılanır. Çoğul A/B senaryo kıyası yalnız BATARYA_CEKIS girdisiyle yapılır; SEBEKE_GIRISI/WLTP tüketimine araç kaybı ikinci kez eklenmez ve başka fiyatlama sınırına taşınmaz."
        },
        {
          "ad": "kwhFiyat",
          "tip": "number",
          "birim": "TL/kWh",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"exclusiveMinimum": 0},
          "olcum_noktasi": "fiyatOlcumNoktasi alanı belirler",
          "formuldeki_rol": "Yalnız fiyatlananKWh100km ile çarpılır.",
          "hata_davranisi": "Eksik, sonlu değil veya <=0 ise FIYAT_EKSIK alan=kwhFiyat.",
          "cikti_semantigi": "tl100km ve tlKm değerlerini ölçekler; başka noktadaki kayıp ayrıca fiyatlanmaz."
        },
        {
          "ad": "fiyatOlcumNoktasi",
          "tip": "string",
          "birim": "birimsiz enum",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"enum": ["SEBEKE_SAYACI", "ARAC_TRANSFER_NOKTASI"]},
          "olcum_noktasi": "Alan bizzat kwhFiyat tarifesinin hedef sınırını bildirir.",
          "formuldeki_rol": "Hedef fiyatlama sınırıdır. SEBEKE_SAYACI ise sebekedenKWh100km; ARAC_TRANSFER_NOKTASI ise aracTransferKWh100km fiyatlanır; tuketimOlcumNoktasi BATARYA_CEKIS değilse yalnız aynı sınır kabul edilir.",
          "hata_davranisi": "Enum dışıysa OLCUM_NOKTASI_GECERSIZ alan=fiyatOlcumNoktasi; tuketimOlcumNoktasi ile uyumsuzsa TUKETIM_FIYAT_SINIRI_UYUMSUZ alan=fiyatOlcumNoktasi.",
          "cikti_semantigi": "Çıktıda aynen yankılanır ve fiyatlananKWh100km anlamını sabitler; kaynak/hedef sınır çakışması reddedilir."
        },
        {
          "ad": "evseVerimYuzde",
          "tip": "number",
          "birim": "%",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"minimum": 50, "maximum": 100},
          "olcum_noktasi": "SEBEKE_GIRISI → ARAC_TRANSFER_NOKTASI",
          "formuldeki_rol": "BATARYA_CEKIS veya ARAC_TRANSFER_NOKTASI girdisini şebekeye taşırken bölme; SEBEKE_GIRISI girdisini transfer noktasına taşırken çarpma yönünde kullanılır.",
          "hata_davranisi": "Aralık dışıysa VERIM_ARALIK_DISI alan=evseVerimYuzde.",
          "cikti_semantigi": "Şebeke enerjisini her zaman açıklar; yalnız şebeke sayacı tarifesinde maliyeti etkiler."
        },
        {
          "ad": "evseVerimKaynagi",
          "tip": "string",
          "birim": "birimsiz enum",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"enum": ["OLCUM", "VARSAYIM"]},
          "olcum_noktasi": "SEBEKE_GIRISI → ARAC_TRANSFER_NOKTASI",
          "formuldeki_rol": "Aritmetiği değiştirmez.",
          "hata_davranisi": "Enum dışıysa KAYNAK_GECERSIZ alan=evseVerimKaynagi.",
          "cikti_semantigi": "VARSAYIM ise tahminMi=true ve EVSE_VERIMI_OLCULMEDI."
        },
        {
          "ad": "aracVerimYuzde",
          "tip": "number",
          "birim": "%",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"minimum": 50, "maximum": 100},
          "olcum_noktasi": "ARAC_TRANSFER_NOKTASI → BATARYADA_DEPOLANAN",
          "formuldeki_rol": "BATARYA_CEKIS girdisini transfer noktasına taşırken bölme; transfer/şebeke girdisini batarya tarafına taşırken çarpma yönünde kullanılır.",
          "hata_davranisi": "Aralık dışıysa VERIM_ARALIK_DISI alan=aracVerimYuzde.",
          "cikti_semantigi": "Araç transferi ve şebeke enerjisini, dolayısıyla maliyeti etkiler."
        },
        {
          "ad": "aracVerimKaynagi",
          "tip": "string",
          "birim": "birimsiz enum",
          "zorunlu": true,
          "varsayilan": null,
          "gecerli_aralik": {"enum": ["OLCUM", "VARSAYIM"]},
          "olcum_noktasi": "ARAC_TRANSFER_NOKTASI → BATARYADA_DEPOLANAN",
          "formuldeki_rol": "Aritmetiği değiştirmez.",
          "hata_davranisi": "Enum dışıysa KAYNAK_GECERSIZ alan=aracVerimKaynagi.",
          "cikti_semantigi": "VARSAYIM ise tahminMi=true ve ARAC_VERIMI_OLCULMEDI."
        },
        {
          "ad": "aylikKm",
          "tip": ["number", "null"],
          "birim": "km/ay",
          "zorunlu": false,
          "varsayilan": null,
          "gecerli_aralik": {"minimum": 0, "nullable": true},
          "olcum_noktasi": "kullanım miktarı",
          "formuldeki_rol": "Verilmişse tlKm ile çarpılarak aylik üretilir.",
          "hata_davranisi": "null dışında negatif/sonlu değilse GIRDI_GECERSIZ alan=aylikKm.",
          "cikti_semantigi": "null ise aylik null; sayıysa TL/ay."
        }
      ],
      "formuller": [
        "kaynak/hedef sınır kuralı: tuketimOlcumNoktasi BATARYA_CEKIS ise her fiyatOlcumNoktasi kabul; SEBEKE_GIRISI yalnız SEBEKE_SAYACI, ARAC_TRANSFER_NOKTASI yalnız ARAC_TRANSFER_NOKTASI ile; başka kombinasyon TUKETIM_FIYAT_SINIRI_UYUMSUZ",
        "BATARYA_CEKIS girdisi: bataryaCekisKWh100km = tuketimKWh100; aracTransferKWh100km = bataryaCekisKWh100km / (aracVerimYuzde/100); sebekedenKWh100km = aracTransferKWh100km / (evseVerimYuzde/100)",
        "ARAC_TRANSFER_NOKTASI girdisi: aracTransferKWh100km = tuketimKWh100; bataryaCekisKWh100km = aracTransferKWh100km × (aracVerimYuzde/100); sebekedenKWh100km = aracTransferKWh100km / (evseVerimYuzde/100)",
        "SEBEKE_GIRISI girdisi (resmî WLTP E_AC dahil): sebekedenKWh100km = tuketimKWh100; aracTransferKWh100km = sebekedenKWh100km × (evseVerimYuzde/100); bataryaCekisKWh100km = aracTransferKWh100km × (aracVerimYuzde/100)",
        "fiyatlananKWh100km = fiyatOlcumNoktasi SEBEKE_SAYACI ise sebekedenKWh100km; ARAC_TRANSFER_NOKTASI ise aracTransferKWh100km",
        "tl100km = fiyatlananKWh100km × kwhFiyat",
        "tlKm = tl100km / 100",
        "aylik = aylikKm null değilse tlKm × aylikKm; aksi halde null"
      ],
      "cikti_semasi": {
        "tip": "object",
        "additionalProperties": false,
        "zorunlu": ["tlKm", "tl100km", "aylik", "tuketimOlcumNoktasi", "fiyatOlcumNoktasi", "fiyatlananKWh100km", "bataryaCekisKWh100km", "aracTransferKWh100km", "sebekedenKWh100km", "tahminMi", "varsayimlar"],
        "alanlar": {
          "tlKm": {"tip": "number", "birim": "TL/km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"minimum": 0}, "olcum_noktasi": "fiyatOlcumNoktasi", "formuldeki_rol": "tl100km / 100.", "hata_davranisi": "Sonlu sonuç üretilemezse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "Yuvarlanmamış yalnız enerji maliyeti; TCO değildir."},
          "tl100km": {"tip": "number", "birim": "TL/100km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"minimum": 0}, "olcum_noktasi": "fiyatOlcumNoktasi", "formuldeki_rol": "fiyatlananKWh100km × kwhFiyat.", "hata_davranisi": "Sonlu sonuç üretilemezse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "Yuvarlanmamış yalnız enerji maliyeti; sonraki kıyasa ham aktarılır."},
          "aylik": {"tip": ["number", "null"], "birim": "TL/ay", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"minimum": 0, "nullable": true}, "olcum_noktasi": "fiyatOlcumNoktasi", "formuldeki_rol": "aylikKm varsa tlKm × aylikKm.", "hata_davranisi": "aylikKm yoksa hata değil null; sonlu sonuç üretilemezse GIRDI_GECERSIZ.", "cikti_semantigi": "Yuvarlanmamış aylık yalnız enerji maliyeti veya null."},
          "tuketimOlcumNoktasi": {"tip": "string", "birim": "birimsiz enum", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"enum": ["BATARYA_CEKIS", "ARAC_TRANSFER_NOKTASI", "SEBEKE_GIRISI"]}, "olcum_noktasi": "metadata", "formuldeki_rol": "Enerji dönüşüm dalını seçen girdi çıktıda aynen yankılanır.", "hata_davranisi": "Girdi enum dışıysa çıktı yerine OLCUM_NOKTASI_GECERSIZ.", "cikti_semantigi": "tuketimKWh100 değerinin hangi fiziksel sınırda verildiğini sabitler."},
          "fiyatOlcumNoktasi": {"tip": "string", "birim": "birimsiz enum", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"enum": ["SEBEKE_SAYACI", "ARAC_TRANSFER_NOKTASI"]}, "olcum_noktasi": "metadata", "formuldeki_rol": "Fiyatlanan enerji dalını seçen girdi çıktıda aynen yankılanır.", "hata_davranisi": "Girdi enum dışıysa çıktı yerine OLCUM_NOKTASI_GECERSIZ.", "cikti_semantigi": "Hangi kWh'nin fiyatlandığını makinece okunur biçimde sabitler."},
          "fiyatlananKWh100km": {"tip": "number", "birim": "kWh/100km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "fiyatOlcumNoktasi", "formuldeki_rol": "SEBEKE_SAYACI dalında sebekedenKWh100km; transfer dalında aracTransferKWh100km.", "hata_davranisi": "Sonlu/pozitif sonuç üretilemezse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "kwhFiyat ile çarpılan tek enerji; başka sınırdaki kayıp ikinci kez fiyatlanmaz."},
          "bataryaCekisKWh100km": {"tip": "number", "birim": "kWh/100km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "BATARYA_CEKIS", "formuldeki_rol": "Başlangıç sınırına göre tuketimKWh100 değerinin kendisi veya aşağı yönde araç verimiyle çarpılmış karşılığıdır.", "hata_davranisi": "Sonlu/pozitif sonuç üretilemezse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "Batarya/çekiş tarafında 100 km başına kullanılan yuvarlanmamış enerji."},
          "aracTransferKWh100km": {"tip": "number", "birim": "kWh/100km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "ARAC_TRANSFER_NOKTASI", "formuldeki_rol": "Başlangıç sınırına göre tuketimKWh100, batarya tüketimi / araç verimi veya şebeke tüketimi × EVSE verimidir.", "hata_davranisi": "Sonlu/pozitif sonuç üretilemezse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "Araç transfer noktasında 100 km için teslim edilen yuvarlanmamış enerji."},
          "sebekedenKWh100km": {"tip": "number", "birim": "kWh/100km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "SEBEKE_GIRISI", "formuldeki_rol": "Başlangıç sınırına göre tuketimKWh100 veya transfer enerjisi / EVSE verimidir.", "hata_davranisi": "Sonlu/pozitif sonuç üretilemezse çıktı yerine GIRDI_GECERSIZ.", "cikti_semantigi": "Şebeke/mains tarafında 100 km için çekilen yuvarlanmamış enerji; resmî WLTP E_AC bu sınırda doğrudan aynı kalır."},
          "tahminMi": {"tip": "boolean", "birim": "birimsiz", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"enum": [true, false]}, "olcum_noktasi": "metadata", "formuldeki_rol": "varsayimlar.length > 0.", "hata_davranisi": "Kaynak enumu geçersizse çıktı yerine KAYNAK_GECERSIZ.", "cikti_semantigi": "İki verimden biri ölçüm değilse true."},
          "varsayimlar": {"tip": "array", "birim": "birimsiz kod", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"itemsEnum": ["EVSE_VERIMI_OLCULMEDI", "ARAC_VERIMI_OLCULMEDI"]}, "olcum_noktasi": "metadata", "formuldeki_rol": "İki verim kaynağından ölçülmeyen sınır kodlarını toplar.", "hata_davranisi": "Kaynak enumu geçersizse çıktı yerine KAYNAK_GECERSIZ.", "cikti_semantigi": "Ölçülmeyen verim sınırlarının sıralı kodları; yoksa boş dizi."}
        }
      },
      "hata_kodlari": ["TUKETIM_SIFIR", "VERIM_ARALIK_DISI", "OLCUM_NOKTASI_GECERSIZ", "TUKETIM_FIYAT_SINIRI_UYUMSUZ", "KAYNAK_GECERSIZ", "FIYAT_EKSIK", "GIRDI_GECERSIZ"]
    },
    "benzinli_dizel_kiyas": {
      "baslik": "Benzinli/dizel kıyas",
      "fonksiyon": "kiyas",
      "imza": "kiyas({elektrik100km, yakitL100, yakitFiyat, satinAlmaFarki, aylikKm})",
      "girdiler": [
        {"ad": "elektrik100km", "tip": "number", "birim": "TL/100km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"minimum": 0}, "olcum_noktasi": "maliyet().fiyatOlcumNoktasi sınırındaki enerji maliyeti", "formuldeki_rol": "fark100km ve tasarrufYuzde payında yakıt maliyetiyle karşılaştırılan elektrik enerji maliyetidir.", "hata_davranisi": "Eksik, sonlu değil veya negatifse GIRDI_GECERSIZ alan=elektrik100km.", "cikti_semantigi": "fark100km ve tasarrufYuzde değerlerini etkiler; TCO değildir.", "aciklama": "maliyet().tl100km ham çıktısı."},
        {"ad": "yakitL100", "tip": "number", "birim": "L/100km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "yakıt tüketimi", "formuldeki_rol": "yakitFiyat ile çarpılarak yakit100km üretir.", "hata_davranisi": "0 ise TUKETIM_SIFIR; negatif/eksik/sonlu değilse GIRDI_GECERSIZ alan=yakitL100.", "cikti_semantigi": "yakit100km hesabının enerji payıdır.", "aciklama": "Yakıt tüketimi."},
        {"ad": "yakitFiyat", "tip": "number", "birim": "TL/L", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"exclusiveMinimum": 0}, "olcum_noktasi": "yakıt litre fiyatı", "formuldeki_rol": "yakitL100 ile çarpılarak yakit100km üretir.", "hata_davranisi": "Eksik, sonlu değil veya <=0 ise FIYAT_EKSIK alan=yakitFiyat.", "cikti_semantigi": "yakit100km değerini ölçekler; gömülü fiyat değildir.", "aciklama": "Kullanıcının güncel litre fiyatı."},
        {"ad": "satinAlmaFarki", "tip": ["number", "null"], "birim": "TL", "zorunlu": false, "varsayilan": null, "gecerli_aralik": {"sonlu": true, "negatif_deger_kabul": true, "nullable": true}, "olcum_noktasi": "satın alma fiyat farkı", "formuldeki_rol": "toplamEvAvantajiTL(km) = −satinAlmaFarki + fark100km × km/100 denkleminde sabit terimdir; basaBasKm ve basaBasDurumu belirler.", "hata_davranisi": "null dışında sonlu değilse GIRDI_GECERSIZ alan=satinAlmaFarki.", "cikti_semantigi": "İşareti avantaj/dezavantaj yönünü seçer; null ise başabaş çözülmez.", "aciklama": "EV fiyatı eksi kıyas aracı fiyatı."},
        {"ad": "aylikKm", "tip": ["number", "null"], "birim": "km/ay", "zorunlu": false, "varsayilan": null, "gecerli_aralik": {"minimum": 0, "nullable": true}, "olcum_noktasi": "kullanım miktarı", "formuldeki_rol": "basaBasKm > 0 ise basaBasKm / aylikKm ile basaBasAy üretir.", "hata_davranisi": "null dışında negatif/sonlu değilse GIRDI_GECERSIZ alan=aylikKm.", "cikti_semantigi": "null ise basaBasAy null; pozitif sayıysa başabaş ayı.", "aciklama": "Başa hit ayı için aylık yol."}
      ],
      "formuller": [
        "yakit100km = yakitL100 × yakitFiyat",
        "fark100km = yakit100km − elektrik100km",
        "toplamEvAvantajiTL(km) = −satinAlmaFarki + fark100km × km / 100",
        "tasarrufYuzde = fark100km / yakit100km × 100",
        "basaBasKm = satinAlmaFarki ve fark100km aynı işaretli ve sıfır değilse satinAlmaFarki / (fark100km/100); satın alma farkı 0 ise 0; pozitif gelecek çözümü yoksa null",
        "basaBasAy = basaBasKm number ve aylikKm > 0 ise basaBasKm / aylikKm; aksi halde null"
      ],
      "kapsam_uyarisi": "Yalnız enerji maliyeti; bakım, sigorta, MTV, diğer vergiler, finansman ve ikinci el değer farkı dahil değildir.",
      "cikti_semasi": {
        "tip": "object",
        "additionalProperties": false,
        "zorunlu": ["yakit100km", "fark100km", "tasarrufYuzde", "basaBasKm", "basaBasAy", "basaBasDurumu"],
        "alanlar": {
          "yakit100km": {"tip": "number", "birim": "TL/100km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"minimum": 0}, "olcum_noktasi": "yakıt enerji maliyeti", "formuldeki_rol": "yakitL100 × yakitFiyat.", "hata_davranisi": "Sonlu sonuç üretilemezse çıktı yerine ilgili hata.", "cikti_semantigi": "Yakıt enerji maliyeti."},
          "fark100km": {"tip": "number", "birim": "TL/100km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"negatif_deger_kabul": true}, "olcum_noktasi": "enerji maliyet farkı", "formuldeki_rol": "yakit100km − elektrik100km.", "hata_davranisi": "Sonlu sonuç üretilemezse çıktı yerine ilgili hata.", "cikti_semantigi": "Pozitifse elektrik enerjisi senaryosu daha ucuz."},
          "tasarrufYuzde": {"tip": "number", "birim": "%", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"negatif_deger_kabul": true}, "olcum_noktasi": "enerji maliyet oranı", "formuldeki_rol": "fark100km / yakit100km × 100.", "hata_davranisi": "Sonlu sonuç üretilemezse çıktı yerine ilgili hata.", "cikti_semantigi": "Yakıt enerji maliyetine göre oran; TCO değildir."},
          "basaBasKm": {"tip": ["number", "null"], "birim": "km", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"minimum": 0, "nullable": true}, "olcum_noktasi": "toplam EV avantajı kökü", "formuldeki_rol": "satinAlmaFarki ve fark100km aynı işaretli ve sıfır değilse satinAlmaFarki / (fark100km/100); fark 0 ise 0; kök yoksa null.", "hata_davranisi": "Geçerli girdide sayı veya null döner; hesap hata üretmez.", "cikti_semantigi": "Toplam EV avantajı denkleminin gelecekteki ham pozitif kökü; satın alma farkı sıfırsa 0, kök yoksa null."},
          "basaBasAy": {"tip": ["number", "null"], "birim": "ay", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"minimum": 0, "nullable": true}, "olcum_noktasi": "toplam EV avantajı kökü", "formuldeki_rol": "basaBasKm number ve aylikKm > 0 ise basaBasKm / aylikKm; aksi halde null.", "hata_davranisi": "Geçerli girdide sayı veya null döner.", "cikti_semantigi": "Ham başabaş ayı; basaBasKm veya pozitif aylikKm yoksa null."},
          "basaBasDurumu": {"tip": "string", "birim": "birimsiz enum", "zorunlu": true, "varsayilan": null, "gecerli_aralik": {"enum": ["HESAPLANMADI", "ILERI_ODEME_BASABASI", "BASLANGIC_AVANTAJI_KAYBI", "BASTAN_VE_SUREKLI_AVANTAJLI", "BASTAN_VE_SUREKLI_DEZAVANTAJLI", "BASLANGICTA_ESIT", "MALIYETLER_PARALEL"]}, "olcum_noktasi": "toplam enerji maliyeti kıyası metadata'sı", "formuldeki_rol": "satinAlmaFarki ile fark100km işaretlerinden pozitif kökün yönünü veya yokluğunu seçer.", "hata_davranisi": "Girdiler geçersizse çıktı yerine ilgili hata fırlatılır; geçerli her girdide enum döner.", "cikti_semantigi": "Satın alma farkı ve enerji farkı işaretlerine göre eşitliğin yönünü veya gelecekte eşitlik bulunmadığını bildirir."}
        }
      },
      "hata_kodlari": ["TUKETIM_SIFIR", "FIYAT_EKSIK", "GIRDI_GECERSIZ"]
    }
  },
  "ornekler": [
    {
      "id": "sarj-dc-transfer-yuzde95",
      "fonksiyon": "sarjSuresi",
      "girdi": {
        "bataryaKWh": 77,
        "mevcutYuzde": 10,
        "hedefYuzde": 80,
        "gucKW": 100,
        "gucOlcumNoktasi": "ARAC_TRANSFER_NOKTASI",
        "gucKaynagi": "OLCUM",
        "aracMaxKW": null,
        "aracMaxOlcumNoktasi": "ARAC_TRANSFER_NOKTASI",
        "aracMaxKaynagi": null,
        "evseVerimYuzde": 95,
        "evseVerimKaynagi": "VARSAYIM",
        "aracVerimYuzde": 95,
        "aracVerimKaynagi": "OLCUM",
        "tip": "DC"
      },
      "cikti": {
        "saat": 0,
        "dakika": 34,
        "hamSureDakika": 34.04210526315789,
        "bataryayaDepolananKWh": 53.9,
        "aracTransferKWh": 56.73684210526316,
        "sebekedenKWh": 59.72299168975069,
        "etkinTransferGucuKW": 100,
        "uctanUcaVerimYuzde": 90.25,
        "tahminMi": true,
        "varsayimlar": ["EVSE_VERIMI_OLCULMEDI"],
        "uyarilar": ["DC_GUC_SABIT_DEGIL"]
      }
    },
    {
      "id": "menzil-kolay",
      "fonksiyon": "menzil",
      "girdi": {"bataryaKWh": 60, "tuketimKWh100": 16, "tuketimOlcumNoktasi": "BATARYA_CEKIS", "katsayiYuzde": 0},
      "cikti": {"km": 375, "guvenliKm": 300, "tuketimOlcumNoktasi": "BATARYA_CEKIS"}
    },
    {
      "id": "maliyet-ev-ac-sebeke-sayaci",
      "fonksiyon": "maliyet",
      "girdi": {
        "tuketimKWh100": 16,
        "tuketimOlcumNoktasi": "BATARYA_CEKIS",
        "kwhFiyat": 3,
        "fiyatOlcumNoktasi": "SEBEKE_SAYACI",
        "evseVerimYuzde": 100,
        "evseVerimKaynagi": "VARSAYIM",
        "aracVerimYuzde": 90,
        "aracVerimKaynagi": "VARSAYIM",
        "aylikKm": 1500
      },
      "cikti": {
        "tlKm": 0.5333333333333333,
        "tl100km": 53.333333333333336,
        "aylik": 800,
        "tuketimOlcumNoktasi": "BATARYA_CEKIS",
        "fiyatOlcumNoktasi": "SEBEKE_SAYACI",
        "fiyatlananKWh100km": 17.77777777777778,
        "bataryaCekisKWh100km": 16,
        "aracTransferKWh100km": 17.77777777777778,
        "sebekedenKWh100km": 17.77777777777778,
        "tahminMi": true,
        "varsayimlar": ["EVSE_VERIMI_OLCULMEDI", "ARAC_VERIMI_OLCULMEDI"]
      }
    },
    {
      "id": "kiyas-basabas-ham",
      "fonksiyon": "kiyas",
      "girdi": {
        "elektrik100km": 53.333333333333336,
        "yakitL100": 7,
        "yakitFiyat": 45,
        "satinAlmaFarki": 300000,
        "aylikKm": 1500
      },
      "cikti": {
        "yakit100km": 315,
        "fark100km": 261.6666666666667,
        "tasarrufYuzde": 83.06878306878306,
        "basaBasKm": 114649.68152866242,
        "basaBasAy": 76.43312101910828,
        "basaBasDurumu": "ILERI_ODEME_BASABASI"
      },
      "gorunur_son_adim": {
        "alan": "basaBasKm",
        "politika": "elleBicimle(deger, 0)",
        "metin": "yaklaşık 114.650 km"
      }
    },
    {
      "id": "maliyet-wltp-sebeke-kaybi-ikinci-kez-ekleme",
      "fonksiyon": "maliyet",
      "girdi": {
        "tuketimKWh100": 16,
        "tuketimOlcumNoktasi": "SEBEKE_GIRISI",
        "kwhFiyat": 3,
        "fiyatOlcumNoktasi": "SEBEKE_SAYACI",
        "evseVerimYuzde": 100,
        "evseVerimKaynagi": "OLCUM",
        "aracVerimYuzde": 90,
        "aracVerimKaynagi": "OLCUM",
        "aylikKm": null
      },
      "cikti": {
        "tlKm": 0.48,
        "tl100km": 48,
        "aylik": null,
        "tuketimOlcumNoktasi": "SEBEKE_GIRISI",
        "fiyatOlcumNoktasi": "SEBEKE_SAYACI",
        "fiyatlananKWh100km": 16,
        "bataryaCekisKWh100km": 14.4,
        "aracTransferKWh100km": 16,
        "sebekedenKWh100km": 16,
        "tahminMi": false,
        "varsayimlar": []
      }
    },
    {
      "id": "maliyet-transfer-evse-yalniz-sebeke-dali",
      "fonksiyon": "maliyet",
      "girdi": {
        "tuketimKWh100": 16,
        "tuketimOlcumNoktasi": "ARAC_TRANSFER_NOKTASI",
        "kwhFiyat": 3,
        "fiyatOlcumNoktasi": "ARAC_TRANSFER_NOKTASI",
        "evseVerimYuzde": 80,
        "evseVerimKaynagi": "OLCUM",
        "aracVerimYuzde": 90,
        "aracVerimKaynagi": "OLCUM",
        "aylikKm": null
      },
      "cikti": {
        "tlKm": 0.48,
        "tl100km": 48,
        "aylik": null,
        "tuketimOlcumNoktasi": "ARAC_TRANSFER_NOKTASI",
        "fiyatOlcumNoktasi": "ARAC_TRANSFER_NOKTASI",
        "fiyatlananKWh100km": 16,
        "bataryaCekisKWh100km": 14.4,
        "aracTransferKWh100km": 16,
        "sebekedenKWh100km": 20,
        "tahminMi": false,
        "varsayimlar": []
      }
    },
    {
      "id": "maliyet-batarya-cekis-dc-transfer-kanonik",
      "fonksiyon": "maliyet",
      "girdi": {
        "tuketimKWh100": 14.4,
        "tuketimOlcumNoktasi": "BATARYA_CEKIS",
        "kwhFiyat": 8,
        "fiyatOlcumNoktasi": "ARAC_TRANSFER_NOKTASI",
        "evseVerimYuzde": 100,
        "evseVerimKaynagi": "OLCUM",
        "aracVerimYuzde": 100,
        "aracVerimKaynagi": "OLCUM",
        "aylikKm": null
      },
      "cikti": {
        "tlKm": 1.1520000000000001,
        "tl100km": 115.2,
        "aylik": null,
        "tuketimOlcumNoktasi": "BATARYA_CEKIS",
        "fiyatOlcumNoktasi": "ARAC_TRANSFER_NOKTASI",
        "fiyatlananKWh100km": 14.4,
        "bataryaCekisKWh100km": 14.4,
        "aracTransferKWh100km": 14.4,
        "sebekedenKWh100km": 14.4,
        "tahminMi": false,
        "varsayimlar": []
      }
    },
    {
      "id": "kiyas-baslangic-avantaji-kaybi",
      "fonksiyon": "kiyas",
      "girdi": {
        "elektrik100km": 400,
        "yakitL100": 7,
        "yakitFiyat": 45,
        "satinAlmaFarki": -100000,
        "aylikKm": 1500
      },
      "cikti": {
        "yakit100km": 315,
        "fark100km": -85,
        "tasarrufYuzde": -26.984126984126984,
        "basaBasKm": 117647.05882352941,
        "basaBasAy": 78.43137254901961,
        "basaBasDurumu": "BASLANGIC_AVANTAJI_KAYBI"
      }
    }
  ]
}
