{
  "node": {
    "id": "term:voltage",
    "type": "Term",
    "label": "Voltage",
    "properties": {
      "id": "voltage",
      "name": "Voltage",
      "aka": [
        "terminal voltage"
      ],
      "section": "topic-units",
      "definition": "The potential difference between a cell’s two terminals. It comes from the chemical difference between the electrodes, moves with state of charge, and sags under load because of internal resistance.",
      "unit": "V",
      "related": [
        "open-circuit-voltage",
        "nominal-voltage",
        "internal-resistance",
        "ir-drop"
      ],
      "lesson": "fundamentals/cell-anatomy/#voltage",
      "url": "https://lemonergy.com/learn/glossary/voltage/",
      "mentions": [
        "state-of-charge"
      ]
    }
  },
  "edges": [
    {
      "id": "edge:usesBlock/term:voltage/block:ac-current-source",
      "source": "term:voltage",
      "target": "block:ac-current-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:ac-voltage-source",
      "source": "term:voltage",
      "target": "block:ac-voltage-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:active-supervision-interface",
      "source": "term:voltage",
      "target": "block:active-supervision-interface",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:balancing-interface",
      "source": "term:voltage",
      "target": "block:balancing-interface",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-ocv",
      "source": "term:voltage",
      "target": "block:battery-ocv",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-source",
      "source": "term:voltage",
      "target": "block:battery-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:bidirectional-grid",
      "source": "term:voltage",
      "target": "block:bidirectional-grid",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:capacitor",
      "source": "term:voltage",
      "target": "block:capacitor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:controlled-contactor",
      "source": "term:voltage",
      "target": "block:controlled-contactor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:current-gain-source",
      "source": "term:voltage",
      "target": "block:current-gain-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:current-sensor",
      "source": "term:voltage",
      "target": "block:current-sensor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:current-source",
      "source": "term:voltage",
      "target": "block:current-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:dc-motor",
      "source": "term:voltage",
      "target": "block:dc-motor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:diode",
      "source": "term:voltage",
      "target": "block:diode",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:electrical-gyrator",
      "source": "term:voltage",
      "target": "block:electrical-gyrator",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:electrical-reference",
      "source": "term:voltage",
      "target": "block:electrical-reference",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:electrical-switch",
      "source": "term:voltage",
      "target": "block:electrical-switch",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:electrothermal-battery",
      "source": "term:voltage",
      "target": "block:electrothermal-battery",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:electrothermal-resistor",
      "source": "term:voltage",
      "target": "block:electrothermal-resistor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:floating-reference",
      "source": "term:voltage",
      "target": "block:floating-reference",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:ideal-transformer",
      "source": "term:voltage",
      "target": "block:ideal-transformer",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:inductor",
      "source": "term:voltage",
      "target": "block:inductor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:initial-voltage-constraint",
      "source": "term:voltage",
      "target": "block:initial-voltage-constraint",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:linear-converter",
      "source": "term:voltage",
      "target": "block:linear-converter",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:memristor",
      "source": "term:voltage",
      "target": "block:memristor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:mutual-inductor",
      "source": "term:voltage",
      "target": "block:mutual-inductor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:open-circuit",
      "source": "term:voltage",
      "target": "block:open-circuit",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:operational-amplifier",
      "source": "term:voltage",
      "target": "block:operational-amplifier",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:pack-power-boundary",
      "source": "term:voltage",
      "target": "block:pack-power-boundary",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:passive-supervision-interface",
      "source": "term:voltage",
      "target": "block:passive-supervision-interface",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:power-load",
      "source": "term:voltage",
      "target": "block:power-load",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:regulated-charger",
      "source": "term:voltage",
      "target": "block:regulated-charger",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:resistor",
      "source": "term:voltage",
      "target": "block:resistor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:rotational-converter",
      "source": "term:voltage",
      "target": "block:rotational-converter",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:source-converter",
      "source": "term:voltage",
      "target": "block:source-converter",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:transconductance-source",
      "source": "term:voltage",
      "target": "block:transconductance-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:transresistance-source",
      "source": "term:voltage",
      "target": "block:transresistance-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:v2v-converter",
      "source": "term:voltage",
      "target": "block:v2v-converter",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:variable-gap-capacitor",
      "source": "term:voltage",
      "target": "block:variable-gap-capacitor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:variable-resistor",
      "source": "term:voltage",
      "target": "block:variable-resistor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:voltage-gain-source",
      "source": "term:voltage",
      "target": "block:voltage-gain-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:voltage-sensor",
      "source": "term:voltage",
      "target": "block:voltage-sensor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:voltage-source",
      "source": "term:voltage",
      "target": "block:voltage-source",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-cccv-controller",
      "source": "term:voltage",
      "target": "block:battery-cccv-controller",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-cell-delta-soc-ekf",
      "source": "term:voltage",
      "target": "block:battery-cell-delta-soc-ekf",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-cell-delta-soc-ekf-variable-resistance",
      "source": "term:voltage",
      "target": "block:battery-cell-delta-soc-ekf-variable-resistance",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-charge-envelope",
      "source": "term:voltage",
      "target": "block:battery-charge-envelope",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-contact-monitor",
      "source": "term:voltage",
      "target": "block:battery-contact-monitor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-controlled-discharger",
      "source": "term:voltage",
      "target": "block:battery-controlled-discharger",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-cycle-program",
      "source": "term:voltage",
      "target": "block:battery-cycle-program",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-discharge-envelope",
      "source": "term:voltage",
      "target": "block:battery-discharge-envelope",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-ecm-cell",
      "source": "term:voltage",
      "target": "block:battery-ecm-cell",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-fuel-cell-table",
      "source": "term:voltage",
      "target": "block:battery-fuel-cell-table",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-incremental-cccv",
      "source": "term:voltage",
      "target": "block:battery-incremental-cccv",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-module",
      "source": "term:voltage",
      "target": "block:battery-module",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-module-assembly",
      "source": "term:voltage",
      "target": "block:battery-module-assembly",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-pack-assembly",
      "source": "term:voltage",
      "target": "block:battery-pack-assembly",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-pack-soc-adaptive-ekf",
      "source": "term:voltage",
      "target": "block:battery-pack-soc-adaptive-ekf",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-pack-soc-ekf",
      "source": "term:voltage",
      "target": "block:battery-pack-soc-ekf",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-parallel-group",
      "source": "term:voltage",
      "target": "block:battery-parallel-group",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-passive-balancer",
      "source": "term:voltage",
      "target": "block:battery-passive-balancer",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-pem-stack",
      "source": "term:voltage",
      "target": "block:battery-pem-stack",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-power-capability",
      "source": "term:voltage",
      "target": "block:battery-power-capability",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-single-particle-cell",
      "source": "term:voltage",
      "target": "block:battery-single-particle-cell",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-soc-adaptive-ekf",
      "source": "term:voltage",
      "target": "block:battery-soc-adaptive-ekf",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-soc-adaptive-ekf-variable-capacity",
      "source": "term:voltage",
      "target": "block:battery-soc-adaptive-ekf-variable-capacity",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-soc-ekf",
      "source": "term:voltage",
      "target": "block:battery-soc-ekf",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-soc-ekf-variable-capacity",
      "source": "term:voltage",
      "target": "block:battery-soc-ekf-variable-capacity",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-soe-adaptive-ekf",
      "source": "term:voltage",
      "target": "block:battery-soe-adaptive-ekf",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-soe-adaptive-ekf-variable-capacity",
      "source": "term:voltage",
      "target": "block:battery-soe-adaptive-ekf-variable-capacity",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-soe-ekf",
      "source": "term:voltage",
      "target": "block:battery-soe-ekf",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-soe-ekf-variable-capacity",
      "source": "term:voltage",
      "target": "block:battery-soe-ekf-variable-capacity",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-state-space-impedance",
      "source": "term:voltage",
      "target": "block:battery-state-space-impedance",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-supercapacitor",
      "source": "term:voltage",
      "target": "block:battery-supercapacitor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-tabulated-cell",
      "source": "term:voltage",
      "target": "block:battery-tabulated-cell",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:voltage/block:battery-voltage-monitor",
      "source": "term:voltage",
      "target": "block:battery-voltage-monitor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:ohm-circuit",
      "source": "term:voltage",
      "target": "workflow:ohm-circuit",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-battery-current-monitor",
      "source": "term:voltage",
      "target": "workflow:native-battery-current-monitor",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-battery-temperature-monitor",
      "source": "term:voltage",
      "target": "workflow:native-battery-temperature-monitor",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-battery-voltage-monitor",
      "source": "term:voltage",
      "target": "workflow:native-battery-voltage-monitor",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-battery-fuel-cell-table",
      "source": "term:voltage",
      "target": "workflow:native-battery-fuel-cell-table",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-battery-contact-monitor",
      "source": "term:voltage",
      "target": "workflow:native-battery-contact-monitor",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-diode",
      "source": "term:voltage",
      "target": "workflow:native-diode",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-electrical-switch",
      "source": "term:voltage",
      "target": "workflow:native-electrical-switch",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-variable-resistor",
      "source": "term:voltage",
      "target": "workflow:native-variable-resistor",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-open-circuit",
      "source": "term:voltage",
      "target": "workflow:native-open-circuit",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-ac-current-source",
      "source": "term:voltage",
      "target": "workflow:native-ac-current-source",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-ac-voltage-source",
      "source": "term:voltage",
      "target": "workflow:native-ac-voltage-source",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-floating-reference",
      "source": "term:voltage",
      "target": "workflow:native-floating-reference",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-ideal-transformer",
      "source": "term:voltage",
      "target": "workflow:native-ideal-transformer",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-mutual-inductor",
      "source": "term:voltage",
      "target": "workflow:native-mutual-inductor",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-operational-amplifier",
      "source": "term:voltage",
      "target": "workflow:native-operational-amplifier",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-rotational-converter",
      "source": "term:voltage",
      "target": "workflow:native-rotational-converter",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-linear-converter",
      "source": "term:voltage",
      "target": "workflow:native-linear-converter",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-electrical-gyrator",
      "source": "term:voltage",
      "target": "workflow:native-electrical-gyrator",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-initial-voltage-constraint",
      "source": "term:voltage",
      "target": "workflow:native-initial-voltage-constraint",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-memristor",
      "source": "term:voltage",
      "target": "workflow:native-memristor",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-variable-gap-capacitor",
      "source": "term:voltage",
      "target": "workflow:native-variable-gap-capacitor",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-current-gain-source",
      "source": "term:voltage",
      "target": "workflow:native-current-gain-source",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-transresistance-source",
      "source": "term:voltage",
      "target": "workflow:native-transresistance-source",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-transconductance-source",
      "source": "term:voltage",
      "target": "workflow:native-transconductance-source",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:voltage/workflow:native-voltage-gain-source",
      "source": "term:voltage",
      "target": "workflow:native-voltage-gain-source",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:belongsTo/term:voltage/topic:topic-units",
      "source": "term:voltage",
      "target": "topic:topic-units",
      "type": "belongsTo",
      "properties": {
        "sourceFile": "terms.json"
      }
    },
    {
      "id": "edge:relatedTo/term:voltage/term:open-circuit-voltage",
      "source": "term:voltage",
      "target": "term:open-circuit-voltage",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:voltage/term:nominal-voltage",
      "source": "term:voltage",
      "target": "term:nominal-voltage",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:voltage/term:internal-resistance",
      "source": "term:voltage",
      "target": "term:internal-resistance",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:voltage/term:ir-drop",
      "source": "term:voltage",
      "target": "term:ir-drop",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:mentions/voltage/state-of-charge",
      "source": "term:voltage",
      "target": "term:state-of-charge",
      "type": "mentions",
      "properties": {
        "sourceFile": "terms.json",
        "method": "build_glossary.mention_index + mentions",
        "field": "definition",
        "meaning": "Text mention; not a causal claim"
      }
    },
    {
      "id": "edge:explainedIn/term:voltage/lesson:fundamentals/cell-anatomy/",
      "source": "term:voltage",
      "target": "lesson:fundamentals/cell-anatomy/",
      "type": "explainedIn",
      "properties": {
        "sourceFile": "terms.json",
        "url": "https://lemonergy.com/learn/fundamentals/cell-anatomy/#voltage"
      }
    },
    {
      "id": "edge:illustratedBy/term:voltage/visual:voltage",
      "source": "term:voltage",
      "target": "visual:voltage",
      "type": "illustratedBy",
      "properties": {
        "sourceFile": "visual-pages.json"
      }
    },
    {
      "id": "edge:cites/term:voltage/reference:bipm-si",
      "source": "term:voltage",
      "target": "reference:bipm-si",
      "type": "cites",
      "properties": {
        "sourceFile": "wiki-references.json",
        "scope": "direct technical reference"
      }
    }
  ],
  "neighbors": [
    {
      "id": "block:ac-current-source",
      "type": "Block",
      "label": "AC current source",
      "properties": {
        "id": "ac-current-source",
        "name": "AC current source",
        "kind": "studio",
        "summary": "Analytic sinusoidal current, positive from p to n",
        "behavior": "Conserving component solved simultaneously with the connected network. Analytic sinusoidal current, positive from p to n",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Recorded power measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "amplitudeA",
            "label": "Peak current",
            "unit": "A peak",
            "default": 1,
            "description": "Peak sinusoidal current before the current bias is added.",
            "min": 0,
            "max": 1000000
          },
          {
            "key": "frequencyHz",
            "label": "Frequency",
            "unit": "Hz",
            "default": 1,
            "description": "Number of sinusoidal cycles per second.",
            "min": 0,
            "max": 1000000
          },
          {
            "key": "phaseRad",
            "label": "Initial phase",
            "unit": "rad",
            "default": 0,
            "description": "Angular phase added to the sinusoid at time zero.",
            "min": -1000000,
            "max": 1000000
          },
          {
            "key": "biasA",
            "label": "Current bias",
            "unit": "A",
            "default": 0,
            "description": "Constant current added to the sinusoid.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "I(t) = Ibias + Ipeak sin(2π f t + phase)"
        ],
        "example": {
          "title": "AC current source worked example",
          "text": "Editable first-party network. load: resistanceOhm=4. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-ac-current-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "amplitudeA",
              "label": "Peak current",
              "value": 1,
              "unit": "A peak"
            },
            {
              "port": "frequencyHz",
              "label": "Frequency",
              "value": 1,
              "unit": "Hz"
            },
            {
              "port": "phaseRad",
              "label": "Initial phase",
              "value": 0,
              "unit": "rad"
            },
            {
              "port": "biasA",
              "label": "Current bias",
              "value": 0,
              "unit": "A"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 0.25000000000000006,
              "value": 1,
              "unit": "A",
              "tolerance": 9.999999999999997e-07
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 0.25000000000000006,
              "value": -4,
              "unit": "V",
              "tolerance": 4.0000000000000345e-06
            },
            {
              "port": "target/power",
              "label": "power",
              "atS": 0.25000000000000006,
              "value": -4,
              "unit": "W",
              "tolerance": 4.000000000000008e-06
            }
          ]
        },
        "limits": [
          "Analytic sinusoidal current, positive from p to n",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-ac-current-source"
        ],
        "type": "ac-current-source",
        "implementationId": "ac-current-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/ac-current-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/ac-current-source/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-ac-current-source"
          ]
        },
        "studioHelp": {
          "type": "ac-current-source",
          "namespace": "physical",
          "slug": "ac-current-source",
          "canonicalSlug": "ac-current-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "ac-current-source",
            "name": "AC current source",
            "domain": "electrical",
            "family": "current-source",
            "operation": "Imposes a sinusoidal current plus bias, positive from p to n.",
            "mechanism": [
              "Amplitude, phase and frequency",
              "Sinusoidal current"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "current-source",
                "label": "Controlled current source"
              },
              {
                "type": "inductor",
                "label": "Inductor"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 32
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H68M132 40H190M80 40H120L110 30M120 40L110 50"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "amplitudeA",
                "default": 1,
                "unit": "A peak",
                "min": 0,
                "max": 1000000,
                "value": 1
              },
              {
                "id": "frequencyHz",
                "default": 1,
                "unit": "Hz",
                "min": 0,
                "max": 1000000,
                "value": 1
              },
              {
                "id": "phaseRad",
                "default": 0,
                "unit": "rad",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "biasA",
                "default": 0,
                "unit": "A",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:ac-voltage-source",
      "type": "Block",
      "label": "AC voltage source",
      "properties": {
        "id": "ac-voltage-source",
        "name": "AC voltage source",
        "kind": "studio",
        "summary": "Analytic sinusoidal voltage p minus n",
        "behavior": "Conserving component solved simultaneously with the connected network. Analytic sinusoidal voltage p minus n",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "branchCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Recorded branchCurrent measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "amplitudeV",
            "label": "Peak voltage",
            "unit": "V peak",
            "default": 1,
            "description": "Peak sinusoidal voltage before the voltage bias is added.",
            "min": 0,
            "max": 1000000
          },
          {
            "key": "frequencyHz",
            "label": "Frequency",
            "unit": "Hz",
            "default": 1,
            "description": "Number of sinusoidal cycles per second.",
            "min": 0,
            "max": 1000000
          },
          {
            "key": "phaseRad",
            "label": "Initial phase",
            "unit": "rad",
            "default": 0,
            "description": "Angular phase added to the sinusoid at time zero.",
            "min": -1000000,
            "max": 1000000
          },
          {
            "key": "biasV",
            "label": "Voltage bias",
            "unit": "V",
            "default": 0,
            "description": "Constant voltage added to the sinusoid.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "V(t) = Vbias + Vpeak sin(2π f t + phase)"
        ],
        "example": {
          "title": "AC voltage source worked example",
          "text": "Editable first-party network. load: resistanceOhm=4. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-ac-voltage-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "amplitudeV",
              "label": "Peak voltage",
              "value": 1,
              "unit": "V peak"
            },
            {
              "port": "frequencyHz",
              "label": "Frequency",
              "value": 1,
              "unit": "Hz"
            },
            {
              "port": "phaseRad",
              "label": "Initial phase",
              "value": 0,
              "unit": "rad"
            },
            {
              "port": "biasV",
              "label": "Voltage bias",
              "value": 0,
              "unit": "V"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 0.25000000000000006,
              "value": -0.25,
              "unit": "A",
              "tolerance": 2.500000000000001e-07
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 0.25000000000000006,
              "value": 1,
              "unit": "V",
              "tolerance": 9.999999999999997e-07
            },
            {
              "port": "target/branchCurrent",
              "label": "branchCurrent",
              "atS": 0.25000000000000006,
              "value": -0.25,
              "unit": "A",
              "tolerance": 2.500000000000001e-07
            }
          ]
        },
        "limits": [
          "Analytic sinusoidal voltage p minus n",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-ac-voltage-source"
        ],
        "type": "ac-voltage-source",
        "implementationId": "ac-voltage-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/ac-voltage-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/ac-voltage-source/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-ac-voltage-source"
          ]
        },
        "studioHelp": {
          "type": "ac-voltage-source",
          "namespace": "physical",
          "slug": "ac-voltage-source",
          "canonicalSlug": "ac-voltage-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "ac-voltage-source",
            "name": "AC voltage source",
            "domain": "electrical",
            "family": "voltage-source",
            "operation": "Imposes a sinusoidal voltage p minus n plus bias.",
            "mechanism": [
              "Amplitude, phase and frequency",
              "Sinusoidal voltage"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "voltage-source",
                "label": "Controlled voltage source"
              },
              {
                "type": "capacitor",
                "label": "Capacitor"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 32
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H68M132 40H190M100 15V31M92 23H108M92 57H108"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "amplitudeV",
                "default": 1,
                "unit": "V peak",
                "min": 0,
                "max": 1000000,
                "value": 1
              },
              {
                "id": "frequencyHz",
                "default": 1,
                "unit": "Hz",
                "min": 0,
                "max": 1000000,
                "value": 1
              },
              {
                "id": "phaseRad",
                "default": 0,
                "unit": "rad",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "biasV",
                "default": 0,
                "unit": "V",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:active-supervision-interface",
      "type": "Block",
      "label": "Active cell supervision interface",
      "properties": {
        "id": "active-supervision-interface",
        "name": "Active cell supervision interface",
        "kind": "studio",
        "summary": "Discharge current sink below charging command; finite-resistance charging above terminal voltage; no detailed switching converter or hardware I/O.",
        "behavior": "Discharge current sink below charging command; finite-resistance charging above terminal voltage; no detailed switching converter or hardware I/O. The terminal current participates directly in Kirchhoff current balance and changes the connected battery state. Measurements are solved with the physical network.",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V / A",
            "description": "Electrical conserving connection. Across variables are shared at a node; through flows balance."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V / A",
            "description": "Electrical conserving connection. Across variables are shared at a node; through flows balance."
          },
          {
            "name": "discharge",
            "direction": "input",
            "unit": "A",
            "description": "Optional typed command; otherwise the configured default is used. For balancing, currentN addresses the corresponding circuit."
          },
          {
            "name": "chargeVoltage",
            "direction": "input",
            "unit": "V",
            "description": "Optional typed command; otherwise the configured default is used. For balancing, currentN addresses the corresponding circuit."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Observed voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Observed current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Observed power."
          }
        ],
        "parameters": [
          {
            "key": "dischargeCurrentA",
            "label": "Default discharge current",
            "unit": "A",
            "default": 0,
            "min": 0,
            "max": 1000000,
            "description": "Default discharge current. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "chargeVoltageV",
            "label": "Default charging voltage",
            "unit": "V",
            "default": 0,
            "min": 0,
            "max": 1000000,
            "description": "Default charging voltage. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "chargeResistanceOhm",
            "label": "Charging resistance",
            "unit": "ohm",
            "default": 0.1,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Charging resistance. Numerical bounds are model-validation limits, not physical operating ratings."
          }
        ],
        "equations": [
          "if commandVoltage >= terminalVoltage: I = (terminalVoltage-commandVoltage)/chargeResistance",
          "otherwise I = max(0, dischargeRequest)"
        ],
        "example": {
          "title": "Active cell supervision interface worked example",
          "text": "A 4 V cell with 0.1 Ω internal resistance is connected to a 4.2 V charge command through the interface’s 0.1 Ω charging resistance. Solving both resistances gives -1 A interface current and 4.1 V terminal voltage. The negative current charges the cell.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-active-supervision-interface",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "current",
              "label": "Interface current",
              "atS": 1,
              "value": -1,
              "unit": "A",
              "tolerance": 1e-06
            },
            {
              "port": "voltage",
              "label": "Terminal voltage",
              "atS": 1,
              "value": 4.1,
              "unit": "V",
              "tolerance": 1e-06
            }
          ],
          "inputs": [
            {
              "port": "chargeVoltage",
              "label": "Charging command",
              "value": 4.2,
              "unit": "V"
            }
          ]
        },
        "limits": [
          "This is a simulated electrical interface without a target-hardware driver. SOC and temperature pass-throughs, diagnostic mode flags and hardware-specific communication are outside this interface."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "ti-bms"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-active-supervision-interface"
        ],
        "type": "active-supervision-interface",
        "implementationId": "active-supervision-interface",
        "url": "https://lemonergy.com/learn/glossary/blocks/active-supervision-interface/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/active-supervision-interface/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-active-supervision-interface"
          ]
        },
        "studioHelp": {
          "type": "active-supervision-interface",
          "namespace": "physical",
          "slug": "active-supervision-interface",
          "canonicalSlug": "active-supervision-interface",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "active-supervision-interface",
            "name": "Active cell supervision interface",
            "domain": "electrical",
            "family": "controller-power",
            "operation": "Uses a discharge-current sink or finite-resistance charging, depending on the commanded charge voltage and terminal voltage.",
            "mechanism": [
              "Discharge or charge command",
              "Simulated cell interface",
              "Terminal measurements"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "passive-supervision-interface",
                "label": "Passive cell supervision interface"
              },
              {
                "type": "battery-ocv",
                "label": "Battery with SOC-dependent OCV"
              }
            ],
            "symbol": [
              {
                "tag": "rect",
                "attrs": {
                  "x": 60,
                  "y": 10,
                  "width": 80,
                  "height": 60,
                  "rx": 3
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H60M140 40H190M80 55V25H95M105 55V25H120"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "discharge",
                "label": "Discharge current",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Discharge current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "chargeVoltage",
                "label": "Charging voltage",
                "quantity": "voltage",
                "unit": "V",
                "active": true,
                "summary": "Charging voltage is a directed voltage input to this component, expressed in V. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "dischargeCurrentA",
                "default": 0,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "chargeVoltageV",
                "default": 0,
                "unit": "V",
                "min": 0,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "chargeResistanceOhm",
                "default": 0.1,
                "unit": "ohm",
                "min": 1e-06,
                "max": 1000000000,
                "value": 0.1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:balancing-interface",
      "type": "Block",
      "label": "Multi-cell balancing interface",
      "properties": {
        "id": "balancing-interface",
        "name": "Multi-cell balancing interface",
        "kind": "studio",
        "summary": "One to eight independently commanded current-sink circuits with per-cell voltage, current and power; no hardware I/O.",
        "behavior": "One to eight independently commanded current-sink circuits with per-cell voltage, current and power; no hardware I/O. The terminal current participates directly in Kirchhoff current balance and changes the connected battery state. Measurements are solved with the physical network.",
        "ports": [
          {
            "name": "p1",
            "direction": "terminal",
            "unit": "V / A",
            "description": "Electrical conserving connection. Across variables are shared at a node; through flows balance. A pN/nN pair is created for each configured circuit, up to eight."
          },
          {
            "name": "n1",
            "direction": "terminal",
            "unit": "V / A",
            "description": "Electrical conserving connection. Across variables are shared at a node; through flows balance."
          },
          {
            "name": "current1",
            "direction": "input",
            "unit": "A",
            "description": "Optional typed command; otherwise the configured default is used. For balancing, currentN addresses the corresponding circuit."
          },
          {
            "name": "voltage1",
            "direction": "output",
            "unit": "V",
            "description": "Observed voltage1. Each configured circuit has corresponding numbered measurements."
          },
          {
            "name": "current1",
            "direction": "output",
            "unit": "A",
            "description": "Observed current1. Each configured circuit has corresponding numbered measurements."
          },
          {
            "name": "power1",
            "direction": "output",
            "unit": "W",
            "description": "Observed power1. Each configured circuit has corresponding numbered measurements."
          }
        ],
        "parameters": [
          {
            "key": "circuits",
            "label": "Number of balancing circuits",
            "unit": "circuits",
            "default": 1,
            "min": 1,
            "max": 8,
            "description": "Number of balancing circuits. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "defaultCurrentA",
            "label": "Default current per balancing circuit",
            "unit": "A",
            "default": 0,
            "min": 0,
            "max": 1000000,
            "description": "Default current per balancing circuit. Numerical bounds are model-validation limits, not physical operating ratings."
          }
        ],
        "equations": [
          "I[j] = max(0, commanded current[j])",
          "P[j] = V[j]*I[j]"
        ],
        "example": {
          "title": "Multi-cell balancing interface worked example",
          "text": "The bundled two-cell model commands 0.1 A from circuit 1 and zero from circuit 2. The first cell has 4 V OCV and 0.1 Ω resistance, giving 3.99 V under bleed. The second 3.7 V cell remains unloaded.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-balancing-interface",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "current1",
              "label": "First bleed current",
              "atS": 1,
              "value": 0.1,
              "unit": "A",
              "tolerance": 1e-06
            },
            {
              "port": "voltage1",
              "label": "First cell voltage",
              "atS": 1,
              "value": 3.99,
              "unit": "V",
              "tolerance": 1e-06
            }
          ],
          "inputs": [
            {
              "port": "current1",
              "label": "Circuit 1 command",
              "value": 0.1,
              "unit": "A"
            }
          ]
        },
        "limits": [
          "This is a simulated electrical interface without a target-hardware driver. SOC and temperature pass-throughs, diagnostic mode flags and hardware-specific communication are outside this interface.",
          "One to eight independently commanded circuits per instance. The default contract shows one circuit; the worked example configures two."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "ti-bms"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-balancing-interface"
        ],
        "type": "balancing-interface",
        "implementationId": "balancing-interface",
        "url": "https://lemonergy.com/learn/glossary/blocks/balancing-interface/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/balancing-interface/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-balancing-interface"
          ]
        },
        "studioHelp": {
          "type": "balancing-interface",
          "namespace": "physical",
          "slug": "balancing-interface",
          "canonicalSlug": "balancing-interface",
          "existing": true,
          "dynamic": true,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "balancing-interface",
            "name": "Multi-cell balancing interface",
            "domain": "electrical",
            "family": "balancing",
            "operation": "Draws independently commanded nonnegative currents from one to eight cell circuits and reports each circuit’s voltage and power.",
            "mechanism": [
              "Per-cell commands",
              "Independent current sinks",
              "Per-cell measurements"
            ],
            "ports": [
              {
                "id": "p1",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 1 positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n1",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 1 negative terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "p2",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 2 positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n2",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 2 negative terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "p3",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 3 positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n3",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 3 negative terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "p4",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 4 positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n4",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 4 negative terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "p5",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 5 positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n5",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 5 negative terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "p6",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 6 positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n6",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 6 negative terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "p7",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 7 positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n7",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 7 negative terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "p8",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 8 positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n8",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Circuit 8 negative terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "passive-supervision-interface",
                "label": "Passive cell supervision interface"
              },
              {
                "type": "battery-ocv",
                "label": "Battery with SOC-dependent OCV"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 15H70L85 5L100 25L115 5L130 15H190M10 40H70L85 30L100 50L115 30L130 40H190M10 65H70L85 55L100 75L115 55L130 65H190"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "current1",
                "label": "Circuit 1 current",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Circuit 1 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "current2",
                "label": "Circuit 2 current",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Circuit 2 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "current3",
                "label": "Circuit 3 current",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Circuit 3 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "current4",
                "label": "Circuit 4 current",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Circuit 4 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "current5",
                "label": "Circuit 5 current",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Circuit 5 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "current6",
                "label": "Circuit 6 current",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Circuit 6 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "current7",
                "label": "Circuit 7 current",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Circuit 7 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "current8",
                "label": "Circuit 8 current",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Circuit 8 current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage1",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage1",
                "unit": "V"
              },
              {
                "id": "current1",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current1",
                "unit": "A"
              },
              {
                "id": "power1",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power1",
                "unit": "W"
              },
              {
                "id": "voltage2",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage2",
                "unit": "V"
              },
              {
                "id": "current2",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current2",
                "unit": "A"
              },
              {
                "id": "power2",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power2",
                "unit": "W"
              },
              {
                "id": "voltage3",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage3",
                "unit": "V"
              },
              {
                "id": "current3",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current3",
                "unit": "A"
              },
              {
                "id": "power3",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power3",
                "unit": "W"
              },
              {
                "id": "voltage4",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage4",
                "unit": "V"
              },
              {
                "id": "current4",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current4",
                "unit": "A"
              },
              {
                "id": "power4",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power4",
                "unit": "W"
              },
              {
                "id": "voltage5",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage5",
                "unit": "V"
              },
              {
                "id": "current5",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current5",
                "unit": "A"
              },
              {
                "id": "power5",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power5",
                "unit": "W"
              },
              {
                "id": "voltage6",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage6",
                "unit": "V"
              },
              {
                "id": "current6",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current6",
                "unit": "A"
              },
              {
                "id": "power6",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power6",
                "unit": "W"
              },
              {
                "id": "voltage7",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage7",
                "unit": "V"
              },
              {
                "id": "current7",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current7",
                "unit": "A"
              },
              {
                "id": "power7",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power7",
                "unit": "W"
              },
              {
                "id": "voltage8",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage8",
                "unit": "V"
              },
              {
                "id": "current8",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current8",
                "unit": "A"
              },
              {
                "id": "power8",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power8",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "circuits",
                "default": 1,
                "unit": "circuits",
                "min": 1,
                "max": 8,
                "value": 8
              },
              {
                "id": "defaultCurrentA",
                "default": 0,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:battery-ocv",
      "type": "Block",
      "label": "Battery with SOC-dependent OCV",
      "properties": {
        "id": "battery-ocv",
        "name": "Battery with SOC-dependent OCV",
        "kind": "studio",
        "summary": "Lumped battery with a linear SOC-dependent open-circuit voltage and series resistance.",
        "behavior": "The network solves terminal current and integrates charge into SOC. Positive current into the positive terminal charges the battery. Coulombic efficiency applies during charging; discharge uses unity.",
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "ocv",
            "direction": "output",
            "unit": "V",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "socSignal",
            "direction": "output",
            "unit": "fraction",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          }
        ],
        "parameters": [
          {
            "key": "emptyVoltageV",
            "label": "Empty Voltage V",
            "unit": "V",
            "default": 300,
            "min": 0.01,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "fullVoltageV",
            "label": "Full Voltage V",
            "unit": "V",
            "default": 420,
            "min": 0.01,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "resistanceOhm",
            "label": "Resistance Ohm",
            "unit": "ohm",
            "default": 0.08,
            "min": 1e-06,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "capacityAh",
            "label": "Capacity Ah",
            "unit": "Ah",
            "default": 100,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "initialSoc",
            "label": "Initial Soc",
            "unit": "fraction",
            "default": 0.2,
            "min": 0,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "coulombicEfficiency",
            "label": "Coulombic Efficiency",
            "unit": "fraction",
            "default": 1,
            "min": 0.01,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          }
        ],
        "equations": [
          "OCV = V_empty + (V_full - V_empty) * SOC",
          "I = (V_terminal - OCV) / R",
          "dSOC/dt = I * eta_charge / (3600 * Q_Ah), for I >= 0; I / (3600 * Q_Ah) otherwise",
          "P_loss = I^2 * R"
        ],
        "example": {
          "title": "Build CC–CV charging",
          "text": "An illustrative 100 Ah battery with a 420 V ceiling can use a 32 A cap. At the ceiling, current falls as OCV rises.",
          "url": "https://design.lemonergy.com/cosim.html?example=charging-home",
          "label": "Open the Studio example"
        },
        "limits": [
          "The battery uses linear OCV and fixed resistance. It does not automatically add aging, thermal dynamics or balancing.",
          "Internal model SOC is not an estimate of an unknown physical battery. OCV is linear and resistance fixed.",
          "A loss signal is not a predicted temperature. This network takes external temperature.",
          "This is deterministic policy comparison, not a forecast or economic optimum.",
          "Downstream unused capacity is not silently redistributed.",
          "All battery and converter limits still apply. A schedule is not an electrochemical law.",
          "These effective parameters are not a recipe. Lithium-ion does not use indefinite trickle or lead-acid float.",
          "This excludes AC waveforms, synchronization, communications and certification.",
          "No islanding switches, smart-panel circuits or protection coordination are simulated.",
          "The example assumes hardware compatibility; it does not establish connector or communication compatibility."
        ],
        "evidence": [
          "js/charging-control.js",
          "js/charging-scenarios.js",
          "docs/CHARGING_BLOCKS_SPEC.md",
          "js/physical-network.js",
          "rust-core/src/charging_control.rs"
        ],
        "caseIds": [
          "cccv",
          "ocv-charge-balance",
          "loss-accounting",
          "home-schedule",
          "depot-allocation",
          "opportunity-window",
          "low-current-maintenance",
          "v2g",
          "outage-support",
          "v2v"
        ],
        "type": "battery-ocv",
        "implementationId": "battery-ocv",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-ocv/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-ocv/",
        "sourceFile": "block-library.json",
        "sourceRepository": "battery-design",
        "sourceRevision": "ef9802329b75bc15bb96885f8ed5d49425106696",
        "reviewed": "2026-10-27",
        "studioHelp": {
          "type": "battery-ocv",
          "namespace": "physical",
          "slug": "battery-ocv",
          "canonicalSlug": "battery-ocv",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "battery-ocv",
            "name": "Battery with SOC-dependent OCV",
            "domain": "electrical",
            "family": "battery",
            "operation": "Uses state of charge to set open-circuit voltage, adds series resistance, and updates charge from terminal current.",
            "mechanism": [
              "Charge state",
              "OCV and resistance",
              "Terminal voltage"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "battery-source",
                "label": "Battery: resistance and charge state"
              },
              {
                "type": "regulated-charger",
                "label": "Regulated CC/CV charger"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H60M60 10V70M80 25V55M120 10V70M140 25V55M140 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "ocv",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "ocv",
                "unit": "V"
              },
              {
                "id": "socSignal",
                "quantity": "fraction",
                "declared": true,
                "consumers": [],
                "label": "soc Signal",
                "unit": "fraction"
              },
              {
                "id": "loss",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "loss",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "emptyVoltageV",
                "default": 300,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 300
              },
              {
                "id": "fullVoltageV",
                "default": 420,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 420
              },
              {
                "id": "resistanceOhm",
                "default": 0.08,
                "unit": "ohm",
                "min": 1e-06,
                "max": 1000000,
                "value": 0.08
              },
              {
                "id": "capacityAh",
                "default": 100,
                "unit": "Ah",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "initialSoc",
                "default": 0.2,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.2
              },
              {
                "id": "coulombicEfficiency",
                "default": 1,
                "unit": "fraction",
                "min": 0.01,
                "max": 1,
                "value": 1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:battery-source",
      "type": "Block",
      "label": "Battery: resistance and charge state",
      "properties": {
        "id": "battery-source",
        "kind": "studio",
        "name": "Battery: resistance and charge state",
        "summary": "Combines a fixed source voltage and series resistance while counting charge into a state of charge.",
        "behavior": "Combines a fixed source voltage and series resistance while counting charge into a state of charge.",
        "documentationSlug": "battery-source",
        "referenceOnly": true,
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Positive voltage-reference terminal"
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Negative voltage-reference terminal"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Directed output available to compatible consumers: current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: power."
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: loss."
          }
        ],
        "parameters": [
          {
            "key": "voltageV",
            "label": "voltageV",
            "unit": "V",
            "default": 350,
            "description": "Declared authoring field: voltageV.",
            "min": 0.01,
            "max": 1000000
          },
          {
            "key": "resistanceOhm",
            "label": "resistanceOhm",
            "unit": "ohm",
            "default": 0.08,
            "description": "Declared authoring field: resistanceOhm.",
            "min": 1e-09,
            "max": 1000000
          },
          {
            "key": "capacityAh",
            "label": "capacityAh",
            "unit": "Ah",
            "default": 100,
            "description": "Declared authoring field: capacityAh.",
            "min": 1e-09,
            "max": 1000000000
          },
          {
            "key": "initialSoc",
            "label": "initialSoc",
            "unit": "fraction",
            "default": 0.8,
            "description": "Declared authoring field: initialSoc.",
            "min": 0,
            "max": 1
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "battery-source",
        "implementationId": "battery-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-source/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "battery-source",
          "namespace": "physical",
          "slug": "battery-source",
          "canonicalSlug": "battery-source",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "battery-source",
            "name": "Battery: resistance and charge state",
            "domain": "electrical",
            "family": "battery",
            "operation": "Combines a fixed source voltage and series resistance while counting charge into a state of charge.",
            "mechanism": [
              "Source voltage",
              "Series resistance",
              "Charge accounting"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "battery-ocv",
                "label": "Battery with SOC-dependent OCV"
              },
              {
                "type": "resistor",
                "label": "Resistor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H60M60 10V70M80 25V55M120 10V70M140 25V55M140 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "loss",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "loss",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "voltageV",
                "default": 350,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 350
              },
              {
                "id": "resistanceOhm",
                "default": 0.08,
                "unit": "ohm",
                "min": 1e-09,
                "max": 1000000,
                "value": 0.08
              },
              {
                "id": "capacityAh",
                "default": 100,
                "unit": "Ah",
                "min": 1e-09,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "initialSoc",
                "default": 0.8,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.8
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:bidirectional-grid",
      "type": "Block",
      "label": "Bidirectional grid / load interface",
      "properties": {
        "id": "bidirectional-grid",
        "name": "Bidirectional grid / load interface",
        "kind": "studio",
        "summary": "Average-power interface between a DC battery and a grid or load boundary.",
        "behavior": "Import and export obey separate efficiency, power and current limits. Voltage and SOC barriers taper transfer at the configured envelopes. Import/export energy and net cost accumulate from actual transferred power.",
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "command",
            "direction": "input",
            "unit": "W",
            "description": "Requested power; this does not bypass voltage, current, SOC or permission limits."
          },
          {
            "name": "soc",
            "direction": "input",
            "unit": "fraction",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "connected",
            "direction": "input",
            "unit": "dimensionless",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "bmsPermit",
            "direction": "input",
            "unit": "dimensionless",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "temperature",
            "direction": "input",
            "unit": "K",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "importPrice",
            "direction": "input",
            "unit": "currency/kWh",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "exportPrice",
            "direction": "input",
            "unit": "currency/kWh",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "dcPower",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "gridPower",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "allowed",
            "direction": "output",
            "unit": "0 or 1",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          }
        ],
        "parameters": [
          {
            "key": "powerW",
            "label": "Power W",
            "unit": "W grid import (+), export (-)",
            "default": 0,
            "min": -1000000000,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "importLimitW",
            "label": "Import Limit W",
            "unit": "W",
            "default": 7000,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "exportLimitW",
            "label": "Export Limit W",
            "unit": "W",
            "default": 7000,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "importCurrentA",
            "label": "Import Current A",
            "unit": "A",
            "default": 32,
            "min": 0,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "exportCurrentA",
            "label": "Export Current A",
            "unit": "A",
            "default": 32,
            "min": 0,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "importEfficiency",
            "label": "Import Efficiency",
            "unit": "fraction",
            "default": 0.95,
            "min": 0.01,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "exportEfficiency",
            "label": "Export Efficiency",
            "unit": "fraction",
            "default": 0.95,
            "min": 0.01,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "capacityAh",
            "label": "Capacity Ah",
            "unit": "Ah",
            "default": 100,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "reserveSoc",
            "label": "Reserve Soc",
            "unit": "fraction",
            "default": 0.2,
            "min": 0,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "targetSoc",
            "label": "Target Soc",
            "unit": "fraction",
            "default": 0.8,
            "min": 0,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "minimumVoltageV",
            "label": "Minimum Voltage V",
            "unit": "V",
            "default": 250,
            "min": 0.01,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "voltageLimitV",
            "label": "Voltage Limit V",
            "unit": "V",
            "default": 420,
            "min": 0.01,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "boundaryTimeS",
            "label": "Boundary Time S",
            "unit": "s",
            "default": 1,
            "min": 0.001,
            "max": 3600,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "minTemperatureK",
            "label": "Min Temperature K",
            "unit": "K",
            "default": 273.15,
            "min": 1,
            "max": 1000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "maxTemperatureK",
            "label": "Max Temperature K",
            "unit": "K",
            "default": 318.15,
            "min": 1,
            "max": 1000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "importPrice",
            "label": "Import Price",
            "unit": "currency/kWh",
            "default": 0.2,
            "min": 0,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "exportPrice",
            "label": "Export Price",
            "unit": "currency/kWh",
            "default": 0.1,
            "min": 0,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          }
        ],
        "equations": [
          "P_grid_import = P_DC_charge / eta_import",
          "P_grid_export = -P_DC_discharge * eta_export",
          "P_loss = P_grid - P_DC"
        ],
        "example": {
          "title": "Model signed grid exchange",
          "text": "−5 kW requests export; +5 kW requests import. 5 kW exported at 95% efficiency needs about 5.26 kW battery power.",
          "url": "https://design.lemonergy.com/cosim.html?example=charging-v2g",
          "label": "Open the Studio example"
        },
        "limits": [
          "This excludes AC waveforms, synchronization, communications and certification.",
          "No islanding switches, smart-panel circuits or protection coordination are simulated."
        ],
        "evidence": [
          "js/charging-control.js",
          "js/charging-scenarios.js",
          "docs/CHARGING_BLOCKS_SPEC.md",
          "js/physical-network.js",
          "rust-core/src/charging_control.rs"
        ],
        "caseIds": [
          "v2g",
          "outage-support"
        ],
        "type": "bidirectional-grid",
        "implementationId": "bidirectional-grid",
        "url": "https://lemonergy.com/learn/glossary/blocks/bidirectional-grid/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/bidirectional-grid/",
        "sourceFile": "block-library.json",
        "sourceRepository": "battery-design",
        "sourceRevision": "ef9802329b75bc15bb96885f8ed5d49425106696",
        "reviewed": "2026-10-27",
        "studioHelp": {
          "type": "bidirectional-grid",
          "namespace": "physical",
          "slug": "bidirectional-grid",
          "canonicalSlug": "bidirectional-grid",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "bidirectional-grid",
            "name": "Bidirectional grid / load interface",
            "domain": "electrical",
            "family": "controller-power",
            "operation": "Exchanges power between a battery and a grid or load with import/export efficiencies, limits and protection conditions.",
            "mechanism": [
              "Signed power request",
              "Limits and efficiency",
              "Battery power exchange"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "energy-dispatch",
                "label": "Scheduled import / export and load policy"
              },
              {
                "type": "battery-ocv",
                "label": "Battery with SOC-dependent OCV"
              }
            ],
            "symbol": [
              {
                "tag": "rect",
                "attrs": {
                  "x": 60,
                  "y": 10,
                  "width": 80,
                  "height": 60,
                  "rx": 3
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H60M140 40H190M80 55V25H95M105 55V25H120"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Signed power request",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Signed power request is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "soc",
                "label": "State of charge",
                "quantity": "fraction",
                "unit": "fraction",
                "active": true,
                "summary": "State of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "connected",
                "label": "Connection status",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Connection status is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "bmsPermit",
                "label": "Battery protection permission",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Battery protection permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "temperature",
                "label": "Battery temperature",
                "quantity": "temperature",
                "unit": "K",
                "active": true,
                "summary": "Battery temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "importPrice",
                "label": "Import energy price",
                "quantity": "dimensionless",
                "unit": "currency/kWh (dimensionless signal)",
                "active": true,
                "summary": "Import energy price is a directed dimensionless input to this component, expressed in currency/kWh (dimensionless signal). Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "exportPrice",
                "label": "Export energy price",
                "quantity": "dimensionless",
                "unit": "currency/kWh (dimensionless signal)",
                "active": true,
                "summary": "Export energy price is a directed dimensionless input to this component, expressed in currency/kWh (dimensionless signal). Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "dcPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "dc Power",
                "unit": "W"
              },
              {
                "id": "gridPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "grid Power",
                "unit": "W"
              },
              {
                "id": "loss",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "loss",
                "unit": "W"
              },
              {
                "id": "allowed",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "allowed",
                "unit": "1"
              }
            ],
            "parameters": [
              {
                "id": "powerW",
                "default": 0,
                "unit": "W grid import (+), export (-)",
                "min": -1000000000,
                "max": 1000000000,
                "value": 0
              },
              {
                "id": "importLimitW",
                "default": 7000,
                "unit": "W",
                "min": 0,
                "max": 1000000000,
                "value": 7000
              },
              {
                "id": "exportLimitW",
                "default": 7000,
                "unit": "W",
                "min": 0,
                "max": 1000000000,
                "value": 7000
              },
              {
                "id": "importCurrentA",
                "default": 32,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 32
              },
              {
                "id": "exportCurrentA",
                "default": 32,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 32
              },
              {
                "id": "importEfficiency",
                "default": 0.95,
                "unit": "fraction",
                "min": 0.01,
                "max": 1,
                "value": 0.95
              },
              {
                "id": "exportEfficiency",
                "default": 0.95,
                "unit": "fraction",
                "min": 0.01,
                "max": 1,
                "value": 0.95
              },
              {
                "id": "capacityAh",
                "default": 100,
                "unit": "Ah",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "reserveSoc",
                "default": 0.2,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.2
              },
              {
                "id": "targetSoc",
                "default": 0.8,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.8
              },
              {
                "id": "minimumVoltageV",
                "default": 250,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 250
              },
              {
                "id": "voltageLimitV",
                "default": 420,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 420
              },
              {
                "id": "boundaryTimeS",
                "default": 1,
                "unit": "s",
                "min": 0.001,
                "max": 3600,
                "value": 1
              },
              {
                "id": "minTemperatureK",
                "default": 273.15,
                "unit": "K",
                "min": 1,
                "max": 1000,
                "value": 273.15
              },
              {
                "id": "maxTemperatureK",
                "default": 318.15,
                "unit": "K",
                "min": 1,
                "max": 1000,
                "value": 318.15
              },
              {
                "id": "importPrice",
                "default": 0.2,
                "unit": "currency/kWh",
                "min": 0,
                "max": 1000000,
                "value": 0.2
              },
              {
                "id": "exportPrice",
                "default": 0.1,
                "unit": "currency/kWh",
                "min": 0,
                "max": 1000000,
                "value": 0.1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:capacitor",
      "type": "Block",
      "label": "Capacitor",
      "properties": {
        "id": "capacitor",
        "name": "Capacitor",
        "kind": "studio",
        "summary": "An ideal lumped capacitor with an explicit initial voltage.",
        "behavior": "The terminal voltage is the continuous state; branch current equals capacitance times its rate of change. Initial voltage is an initial condition, not an added source.",
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          }
        ],
        "parameters": [
          {
            "key": "capacitanceF",
            "label": "Capacitance F",
            "unit": "F",
            "default": 0.001,
            "min": 1e-12,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "initialVoltageV",
            "label": "Initial Voltage V",
            "unit": "V",
            "default": 0,
            "min": -1000000,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          }
        ],
        "equations": [
          "I = C * d(V_p - V_n)/dt"
        ],
        "example": {
          "title": "Observe an RC time constant",
          "text": "From zero initial voltage with a 1 V step, ideal capacitor voltage is about 0.632 V at 1 s and 0.865 V at 2 s.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-rc",
          "label": "Open the RC example"
        },
        "limits": [
          "This generic circuit does not identify cell parameters from measurements."
        ],
        "evidence": [
          "js/physical-network.js",
          "js/studio-examples.js"
        ],
        "caseIds": [
          "rc-response"
        ],
        "type": "capacitor",
        "implementationId": "capacitor",
        "url": "https://lemonergy.com/learn/glossary/blocks/capacitor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/capacitor/",
        "sourceFile": "block-library.json",
        "sourceRepository": "battery-design",
        "sourceRevision": "ef9802329b75bc15bb96885f8ed5d49425106696",
        "reviewed": "2026-10-27",
        "studioHelp": {
          "type": "capacitor",
          "namespace": "physical",
          "slug": "capacitor",
          "canonicalSlug": "capacitor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "capacitor",
            "name": "Capacitor",
            "domain": "electrical",
            "family": "capacitor",
            "operation": "Stores electrical charge; current changes its voltage over time.",
            "mechanism": [
              "Current",
              "Charge storage",
              "Voltage"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "current-source",
                "label": "Controlled current source"
              },
              {
                "type": "initial-voltage-constraint",
                "label": "Open branch with initial voltage target"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H85M85 10V70M115 10V70M115 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "capacitanceF",
                "default": 0.001,
                "unit": "F",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.001
              },
              {
                "id": "initialVoltageV",
                "default": 0,
                "unit": "V",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:controlled-contactor",
      "type": "Block",
      "label": "Delayed contactor with declared fault mode",
      "properties": {
        "id": "controlled-contactor",
        "kind": "studio",
        "name": "Delayed contactor with declared fault mode",
        "summary": "Changes finite electrical resistance only after the modeled actuation delay, with separate command, actual closed feedback and declared stuck-open or welded faults.",
        "behavior": "Changes finite electrical resistance only after the modeled actuation delay, with separate command, actual closed feedback and declared stuck-open or welded faults.",
        "documentationSlug": "controlled-contactor",
        "referenceOnly": true,
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Positive voltage-reference terminal"
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Negative voltage-reference terminal"
          },
          {
            "name": "h",
            "direction": "conserving",
            "unit": "thermal",
            "description": "Contact dissipation delivered as heat"
          },
          {
            "name": "Close or open command",
            "direction": "input",
            "unit": "1",
            "description": "Close or open command is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Directed output available to compatible consumers: current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: power."
          },
          {
            "name": "closed",
            "direction": "output",
            "unit": "fraction",
            "description": "Directed output available to compatible consumers: closed."
          }
        ],
        "parameters": [
          {
            "key": "onResistanceOhm",
            "label": "onResistanceOhm",
            "unit": "ohm",
            "default": 0.002,
            "description": "Declared authoring field: onResistanceOhm.",
            "min": 1e-06,
            "max": 1000000
          },
          {
            "key": "offResistanceOhm",
            "label": "offResistanceOhm",
            "unit": "ohm",
            "default": 1000000000,
            "description": "Declared authoring field: offResistanceOhm.",
            "min": 1,
            "max": 1000000000000
          },
          {
            "key": "closeDelayS",
            "label": "closeDelayS",
            "unit": "s",
            "default": 0.002,
            "description": "Declared authoring field: closeDelayS.",
            "min": 0,
            "max": 10
          },
          {
            "key": "openDelayS",
            "label": "openDelayS",
            "unit": "s",
            "default": 0.001,
            "description": "Declared authoring field: openDelayS.",
            "min": 0,
            "max": 10
          },
          {
            "key": "sampleTimeS",
            "label": "sampleTimeS",
            "unit": "s",
            "default": 0.001,
            "description": "Declared authoring field: sampleTimeS.",
            "min": 0.001,
            "max": 1
          },
          {
            "key": "initialClosed",
            "label": "initialClosed",
            "unit": "boolean",
            "default": 0,
            "description": "Declared authoring field: initialClosed.",
            "min": 0,
            "max": 1
          },
          {
            "key": "faultMode",
            "label": "faultMode",
            "unit": "0 normal; 1 stuck open; 2 welded",
            "default": 0,
            "description": "Declared authoring field: faultMode.",
            "min": 0,
            "max": 2
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "controlled-contactor",
        "implementationId": "controlled-contactor",
        "url": "https://lemonergy.com/learn/glossary/blocks/controlled-contactor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/controlled-contactor/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "controlled-contactor",
          "namespace": "physical",
          "slug": "controlled-contactor",
          "canonicalSlug": "controlled-contactor",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "controlled-contactor",
            "name": "Delayed contactor with declared fault mode",
            "domain": "electrical",
            "family": "switch",
            "operation": "Changes finite electrical resistance only after the modeled actuation delay, with separate command, actual closed feedback and declared stuck-open or welded faults.",
            "mechanism": [
              "Close or open command",
              "Native actuation delay",
              "Actual contact feedback and heat"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "h",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Contact dissipation delivered as heat",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "electrical-switch",
                "label": "Controlled electrical switch"
              },
              {
                "type": "physical-chart",
                "label": "Physical-network sampled chart"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H65M70 35L125 10M135 40H190"
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 65,
                  "cy": 40,
                  "r": 4
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 135,
                  "cy": 40,
                  "r": 4
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Close or open command",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Close or open command is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "closed",
                "quantity": "fraction",
                "declared": true,
                "consumers": [],
                "label": "closed",
                "unit": "fraction"
              }
            ],
            "parameters": [
              {
                "id": "onResistanceOhm",
                "default": 0.002,
                "unit": "ohm",
                "min": 1e-06,
                "max": 1000000,
                "value": 0.002
              },
              {
                "id": "offResistanceOhm",
                "default": 1000000000,
                "unit": "ohm",
                "min": 1,
                "max": 1000000000000,
                "value": 1000000000
              },
              {
                "id": "closeDelayS",
                "default": 0.002,
                "unit": "s",
                "min": 0,
                "max": 10,
                "value": 0.002
              },
              {
                "id": "openDelayS",
                "default": 0.001,
                "unit": "s",
                "min": 0,
                "max": 10,
                "value": 0.001
              },
              {
                "id": "sampleTimeS",
                "default": 0.001,
                "unit": "s",
                "min": 0.001,
                "max": 1,
                "value": 0.001
              },
              {
                "id": "initialClosed",
                "default": 0,
                "unit": "boolean",
                "min": 0,
                "max": 1,
                "value": 0
              },
              {
                "id": "faultMode",
                "default": 0,
                "unit": "0 normal; 1 stuck open; 2 welded",
                "min": 0,
                "max": 2,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:current-gain-source",
      "type": "Block",
      "label": "Current-controlled current source",
      "properties": {
        "id": "current-gain-source",
        "name": "Current-controlled current source",
        "kind": "studio",
        "summary": "Ideal zero-drop control-current branch and externally powered output",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal zero-drop control-current branch and externally powered output",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "cp",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "cn",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "controlCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Recorded controlCurrent measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "gain",
            "label": "Gain",
            "unit": "A/A",
            "default": 2,
            "description": "Multiplier from the sensed input to the declared output quantity.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "Iout = gain × Icontrol",
          "Vcontrol = 0"
        ],
        "example": {
          "title": "Current-controlled current source worked example",
          "text": "Editable first-party network. supply: currentA=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-current-gain-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "gain",
              "label": "Gain",
              "value": 2,
              "unit": "A/A"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 2,
              "unit": "A",
              "tolerance": 2e-06
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": -8,
              "unit": "V",
              "tolerance": 8e-06
            },
            {
              "port": "target/controlCurrent",
              "label": "controlCurrent",
              "atS": 1,
              "value": 1,
              "unit": "A",
              "tolerance": 1e-06
            }
          ]
        },
        "limits": [
          "Ideal zero-drop control-current branch and externally powered output",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-current-gain-source"
        ],
        "type": "current-gain-source",
        "implementationId": "current-gain-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/current-gain-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/current-gain-source/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-current-gain-source"
          ]
        },
        "studioHelp": {
          "type": "current-gain-source",
          "namespace": "physical",
          "slug": "current-gain-source",
          "canonicalSlug": "current-gain-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "current-gain-source",
            "name": "Current-controlled current source",
            "domain": "electrical",
            "family": "amplifier",
            "operation": "Imposes output current proportional to current through its zero-voltage-drop control branch. This ideal controlled source has an implicit external power supply.",
            "mechanism": [
              "Control current",
              "Current gain",
              "Output current"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "cp",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Control branch positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "cn",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Control branch negative terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "operational-amplifier",
                "label": "Finite-gain operational amplifier"
              },
              {
                "type": "current-sensor",
                "label": "Current sensor / signal adapter"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M60 10L150 40L60 70Z M10 25H60M10 55H60M150 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "gain",
                "default": 2,
                "unit": "A/A",
                "min": -1000000,
                "max": 1000000,
                "value": 2
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:current-sensor",
      "type": "Block",
      "label": "Current sensor / signal adapter",
      "properties": {
        "id": "current-sensor",
        "kind": "studio",
        "name": "Current sensor / signal adapter",
        "summary": "Measures series current through an ideal branch with zero voltage drop.",
        "behavior": "Measures series current through an ideal branch with zero voltage drop.",
        "documentationSlug": "current-sensor",
        "referenceOnly": true,
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Positive voltage-reference terminal"
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Negative voltage-reference terminal"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Directed output available to compatible consumers: current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: power."
          }
        ],
        "parameters": [],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "current-sensor",
        "implementationId": "current-sensor",
        "url": "https://lemonergy.com/learn/glossary/blocks/current-sensor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/current-sensor/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "current-sensor",
          "namespace": "physical",
          "slug": "current-sensor",
          "canonicalSlug": "current-sensor",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "current-sensor",
            "name": "Current sensor / signal adapter",
            "domain": "electrical",
            "family": "sensor",
            "operation": "Measures series current through an ideal branch with zero voltage drop.",
            "mechanism": [
              "Series branch",
              "Zero voltage drop",
              "Current signal"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "voltage-sensor",
                "label": "Voltage sensor / signal adapter"
              },
              {
                "type": "signal-filter",
                "label": "Physical signal filter"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 30
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H70M130 40H190M100 40L116 22M80 52A24 24 0 0 1 120 52"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:current-source",
      "type": "Block",
      "label": "Controlled current source",
      "properties": {
        "id": "current-source",
        "kind": "studio",
        "name": "Controlled current source",
        "summary": "Imposes a signed current from p to n; the network determines its terminal voltage.",
        "behavior": "Imposes a signed current from p to n; the network determines its terminal voltage.",
        "documentationSlug": "current-source",
        "referenceOnly": true,
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Positive voltage-reference terminal"
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Negative voltage-reference terminal"
          },
          {
            "name": "Current command",
            "direction": "input",
            "unit": "A",
            "description": "Current command is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Directed output available to compatible consumers: current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: power."
          }
        ],
        "parameters": [
          {
            "key": "currentA",
            "label": "currentA",
            "unit": "A",
            "default": 1,
            "description": "Declared authoring field: currentA.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "current-source",
        "implementationId": "current-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/current-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/current-source/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "current-source",
          "namespace": "physical",
          "slug": "current-source",
          "canonicalSlug": "current-source",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "current-source",
            "name": "Controlled current source",
            "domain": "electrical",
            "family": "current-source",
            "operation": "Imposes a signed current from p to n; the network determines its terminal voltage.",
            "mechanism": [
              "Current command",
              "Imposed current",
              "Solved voltage"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "electrical-reference",
                "label": "Electrical reference"
              },
              {
                "type": "voltage-source",
                "label": "Controlled voltage source"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 32
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H68M132 40H190M80 40H120L110 30M120 40L110 50"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Current command",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Current command is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "currentA",
                "default": 1,
                "unit": "A",
                "min": -1000000,
                "max": 1000000,
                "value": 1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:dc-motor",
      "type": "Block",
      "label": "DC motor with shaft coupling",
      "properties": {
        "id": "dc-motor",
        "kind": "studio",
        "name": "DC motor with shaft coupling",
        "summary": "Couples electrical current to shaft torque and shaft speed to back EMF, including winding resistance.",
        "behavior": "Couples electrical current to shaft torque and shaft speed to back EMF, including winding resistance.",
        "documentationSlug": "dc-motor",
        "referenceOnly": true,
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Positive voltage-reference terminal"
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Negative voltage-reference terminal"
          },
          {
            "name": "a",
            "direction": "conserving",
            "unit": "rotational",
            "description": "Shaft side A"
          },
          {
            "name": "b",
            "direction": "conserving",
            "unit": "rotational",
            "description": "Shaft side B"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Directed output available to compatible consumers: current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: power."
          },
          {
            "name": "shaft Power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: shaft Power."
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: loss."
          }
        ],
        "parameters": [
          {
            "key": "resistanceOhm",
            "label": "resistanceOhm",
            "unit": "ohm",
            "default": 1,
            "description": "Declared authoring field: resistanceOhm.",
            "min": 1e-09,
            "max": 1000000
          },
          {
            "key": "motorConstant",
            "label": "motorConstant",
            "unit": "V s/rad = N m/A",
            "default": 0.1,
            "description": "Declared authoring field: motorConstant.",
            "min": 1e-09,
            "max": 1000000
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "dc-motor",
        "implementationId": "dc-motor",
        "url": "https://lemonergy.com/learn/glossary/blocks/dc-motor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/dc-motor/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "dc-motor",
          "namespace": "physical",
          "slug": "dc-motor",
          "canonicalSlug": "dc-motor",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "dc-motor",
            "name": "DC motor with shaft coupling",
            "domain": "electrical",
            "family": "converter",
            "operation": "Couples electrical current to shaft torque and shaft speed to back EMF, including winding resistance.",
            "mechanism": [
              "Electrical power",
              "Back EMF and torque",
              "Shaft power"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "a",
                "domain": "rotational",
                "kind": "conserving",
                "label": "Shaft side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "rotational",
                "kind": "conserving",
                "label": "Shaft side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "shaft-inertia",
                "label": "Shaft inertia"
              },
              {
                "type": "rotational-converter",
                "label": "Ideal rotational motor coupler"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 70,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 135,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "shaftPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "shaft Power",
                "unit": "W"
              },
              {
                "id": "loss",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "loss",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "resistanceOhm",
                "default": 1,
                "unit": "ohm",
                "min": 1e-09,
                "max": 1000000,
                "value": 1
              },
              {
                "id": "motorConstant",
                "default": 0.1,
                "unit": "V s/rad = N m/A",
                "min": 1e-09,
                "max": 1000000,
                "value": 0.1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:diode",
      "type": "Block",
      "label": "Piecewise-linear diode",
      "properties": {
        "id": "diode",
        "name": "Piecewise-linear diode",
        "kind": "studio",
        "summary": "Forward threshold and finite slope; reverse leakage conductance, no breakdown or junction charge",
        "behavior": "Conserving component solved simultaneously with the connected network. Forward threshold and finite slope; reverse leakage conductance, no breakdown or junction charge",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Recorded power measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "forwardVoltageV",
            "label": "Forward threshold voltage",
            "unit": "V",
            "default": 0.7,
            "description": "Voltage at which the diode changes from leakage conductance to its forward resistance.",
            "min": 0,
            "max": 1000
          },
          {
            "key": "onResistanceOhm",
            "label": "On-state resistance",
            "unit": "ohm",
            "default": 0.01,
            "description": "Resistance of the conducting branch or conducting end of the memristor model.",
            "min": 1e-06,
            "max": 1000000000
          },
          {
            "key": "offConductanceS",
            "label": "Reverse leakage conductance",
            "unit": "S",
            "default": 0,
            "description": "Conductance applied below the diode forward threshold.",
            "min": 0,
            "max": 1000
          }
        ],
        "equations": [
          "I = Goff V for V ≤ Vf; I = Goff Vf + (V − Vf)/Ron otherwise"
        ],
        "example": {
          "title": "Piecewise-linear diode worked example",
          "text": "Editable first-party network. supply: voltageV=5; resistor: resistanceOhm=100. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-diode",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "forwardVoltageV",
              "label": "Forward threshold voltage",
              "value": 0.7,
              "unit": "V"
            },
            {
              "port": "onResistanceOhm",
              "label": "On-state resistance",
              "value": 0.01,
              "unit": "ohm"
            },
            {
              "port": "offConductanceS",
              "label": "Reverse leakage conductance",
              "value": 0,
              "unit": "S"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 0.0429957004,
              "unit": "A",
              "tolerance": 4.2995700429957e-08
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 0.700429957,
              "unit": "V",
              "tolerance": 7.004299570042994e-07
            },
            {
              "port": "target/power",
              "label": "power",
              "atS": 1,
              "value": 0.0301154766,
              "unit": "W",
              "tolerance": 3.0115476603530505e-08
            }
          ]
        },
        "limits": [
          "Forward threshold and finite slope; reverse leakage conductance, no breakdown or junction charge",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-diode"
        ],
        "type": "diode",
        "implementationId": "diode",
        "url": "https://lemonergy.com/learn/glossary/blocks/diode/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/diode/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-diode"
          ]
        },
        "studioHelp": {
          "type": "diode",
          "namespace": "physical",
          "slug": "diode",
          "canonicalSlug": "diode",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "diode",
            "name": "Piecewise-linear diode",
            "domain": "electrical",
            "family": "diode",
            "operation": "Conducts above a forward-voltage threshold with finite resistance; its reverse branch follows the declared leakage conductance.",
            "mechanism": [
              "Terminal voltage",
              "Forward threshold",
              "Directional conduction"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "resistor",
                "label": "Resistor"
              },
              {
                "type": "electrical-switch",
                "label": "Controlled electrical switch"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H65M65 15L125 40L65 65V15M125 15V65M125 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "forwardVoltageV",
                "default": 0.7,
                "unit": "V",
                "min": 0,
                "max": 1000,
                "value": 0.7
              },
              {
                "id": "onResistanceOhm",
                "default": 0.01,
                "unit": "ohm",
                "min": 1e-06,
                "max": 1000000000,
                "value": 0.01
              },
              {
                "id": "offConductanceS",
                "default": 0,
                "unit": "S",
                "min": 0,
                "max": 1000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:electrical-gyrator",
      "type": "Block",
      "label": "Electrical gyrator",
      "properties": {
        "id": "electrical-gyrator",
        "name": "Electrical gyrator",
        "kind": "studio",
        "summary": "Lossless voltage/current duality with opposing power at the two ports",
        "behavior": "Conserving component solved simultaneously with the connected network. Lossless voltage/current duality with opposing power at the two ports",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "s",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "t",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "voltageSecondary",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage on the secondary port measurement from the conserving simulation."
          },
          {
            "name": "currentSecondary",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current on the secondary port measurement from the conserving simulation."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "gyrationResistanceOhm",
            "label": "Gyration resistance",
            "unit": "ohm",
            "default": 1,
            "description": "Constant relating each port current to the opposing port voltage.",
            "min": 1e-09,
            "max": 1000000000
          }
        ],
        "equations": [
          "Ip = Vs/Rg",
          "Is = −Vp/Rg",
          "Vp Ip + Vs Is = 0"
        ],
        "example": {
          "title": "Electrical gyrator worked example",
          "text": "Editable first-party network. supply: voltageV=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-electrical-gyrator",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "gyrationResistanceOhm",
              "label": "Gyration resistance",
              "value": 1,
              "unit": "ohm"
            }
          ],
          "checks": [
            {
              "port": "target/voltageSecondary",
              "label": "voltageSecondary",
              "atS": 1,
              "value": 4,
              "unit": "V",
              "tolerance": 4e-06
            },
            {
              "port": "target/currentSecondary",
              "label": "currentSecondary",
              "atS": 1,
              "value": -1,
              "unit": "A",
              "tolerance": 1e-06
            },
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 4,
              "unit": "A",
              "tolerance": 4e-06
            }
          ]
        },
        "limits": [
          "Lossless voltage/current duality with opposing power at the two ports",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-electrical-gyrator"
        ],
        "type": "electrical-gyrator",
        "implementationId": "electrical-gyrator",
        "url": "https://lemonergy.com/learn/glossary/blocks/electrical-gyrator/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/electrical-gyrator/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-electrical-gyrator"
          ]
        },
        "studioHelp": {
          "type": "electrical-gyrator",
          "namespace": "physical",
          "slug": "electrical-gyrator",
          "canonicalSlug": "electrical-gyrator",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "electrical-gyrator",
            "name": "Electrical gyrator",
            "domain": "electrical",
            "family": "converter",
            "operation": "Relates each port voltage to current at the other port with opposing transferred powers.",
            "mechanism": [
              "Electrical port 1",
              "Voltage–current duality",
              "Electrical port 2"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "s",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Secondary positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "t",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Secondary negative terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "ideal-transformer",
                "label": "Ideal transformer"
              },
              {
                "type": "rotational-converter",
                "label": "Ideal rotational motor coupler"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 70,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 135,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "voltageSecondary",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage Secondary",
                "unit": "V"
              },
              {
                "id": "currentSecondary",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current Secondary",
                "unit": "A"
              },
              {
                "id": "powerSecondary",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power Secondary",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "gyrationResistanceOhm",
                "default": 1,
                "unit": "ohm",
                "min": 1e-09,
                "max": 1000000000,
                "value": 1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:electrical-reference",
      "type": "Block",
      "label": "Electrical reference",
      "properties": {
        "id": "electrical-reference",
        "name": "Electrical reference",
        "kind": "studio",
        "summary": "Define the zero-voltage potential of an electrical island.",
        "behavior": "Connect its p terminal to the intended reference net. Every disconnected electrical island needs a reference to give the conserving network a determinate voltage datum.",
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          }
        ],
        "parameters": [],
        "equations": [
          "V_reference = 0"
        ],
        "example": {
          "title": "Build CC–CV charging",
          "text": "An illustrative 100 Ah battery with a 420 V ceiling can use a 32 A cap. At the ceiling, current falls as OCV rises.",
          "url": "https://design.lemonergy.com/cosim.html?example=charging-home",
          "label": "Open the Studio example"
        },
        "limits": [
          "The battery uses linear OCV and fixed resistance. It does not automatically add aging, thermal dynamics or balancing.",
          "Internal model SOC is not an estimate of an unknown physical battery. OCV is linear and resistance fixed.",
          "This excludes AC waveforms, synchronization, communications and certification.",
          "The RC example includes a capacitor: transient current varies and source voltage is not always resistor voltage.",
          "This generic circuit does not identify cell parameters from measurements."
        ],
        "evidence": [
          "js/charging-control.js",
          "js/charging-scenarios.js",
          "docs/CHARGING_BLOCKS_SPEC.md",
          "js/physical-network.js",
          "js/studio-examples.js"
        ],
        "caseIds": [
          "cccv",
          "ocv-charge-balance",
          "v2g",
          "ohm-circuit",
          "rc-response"
        ],
        "type": "electrical-reference",
        "implementationId": "electrical-reference",
        "url": "https://lemonergy.com/learn/glossary/blocks/electrical-reference/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/electrical-reference/",
        "sourceFile": "block-library.json",
        "sourceRepository": "battery-design",
        "sourceRevision": "ef9802329b75bc15bb96885f8ed5d49425106696",
        "reviewed": "2026-10-27",
        "studioHelp": {
          "type": "electrical-reference",
          "namespace": "physical",
          "slug": "electrical-reference",
          "canonicalSlug": "electrical-reference",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "electrical-reference",
            "name": "Electrical reference",
            "domain": "electrical",
            "family": "reference",
            "operation": "Sets one electrical connection to zero volts so other voltages have a defined reference.",
            "mechanism": [
              "Voltage datum",
              "V = 0"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Zero-voltage reference",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "voltage-source",
                "label": "Controlled voltage source"
              },
              {
                "type": "resistor",
                "label": "Resistor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M100 5V35M65 35H135M75 47H125M88 59H112"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:electrical-switch",
      "type": "Block",
      "label": "Controlled electrical switch",
      "properties": {
        "id": "electrical-switch",
        "name": "Controlled electrical switch",
        "kind": "studio",
        "summary": "Finite on/off resistance with an explicit control threshold; no arc or contact bounce",
        "behavior": "Conserving component solved simultaneously with the connected network. Finite on/off resistance with an explicit control threshold; no arc or contact bounce",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "closed",
            "direction": "output",
            "unit": "fraction",
            "description": "Recorded closed measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "onResistanceOhm",
            "label": "On-state resistance",
            "unit": "ohm",
            "default": 0.01,
            "description": "Resistance of the conducting branch or conducting end of the memristor model.",
            "min": 1e-06,
            "max": 1000000000
          },
          {
            "key": "offResistanceOhm",
            "label": "Off-state resistance",
            "unit": "ohm",
            "default": 1000000000,
            "description": "Resistance of the open switch or insulating end of the memristor model.",
            "min": 1e-06,
            "max": 1000000000000
          },
          {
            "key": "gate",
            "label": "Switch command",
            "unit": "dimensionless",
            "default": 0,
            "description": "Configured switch command when no external command is connected.",
            "min": 0,
            "max": 1
          },
          {
            "key": "threshold",
            "label": "Switching threshold",
            "unit": "dimensionless",
            "default": 0.5,
            "description": "The switch is on when its command is at least this value.",
            "min": 0,
            "max": 1
          }
        ],
        "equations": [
          "R = Ron when gate ≥ threshold, otherwise Roff",
          "I = V/R"
        ],
        "example": {
          "title": "Controlled electrical switch worked example",
          "text": "Editable first-party network. supply: voltageV=5; target: onResistanceOhm=5; target: gate=1. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-electrical-switch",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "onResistanceOhm",
              "label": "On-state resistance",
              "value": 5,
              "unit": "ohm"
            },
            {
              "port": "offResistanceOhm",
              "label": "Off-state resistance",
              "value": 1000000000,
              "unit": "ohm"
            },
            {
              "port": "gate",
              "label": "Switch command",
              "value": 1,
              "unit": "dimensionless"
            },
            {
              "port": "threshold",
              "label": "Switching threshold",
              "value": 0.5,
              "unit": "dimensionless"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 1,
              "unit": "A",
              "tolerance": 1e-06
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 5,
              "unit": "V",
              "tolerance": 4.9999999999999996e-06
            },
            {
              "port": "target/closed",
              "label": "closed",
              "atS": 1,
              "value": 1,
              "unit": "fraction",
              "tolerance": 1e-06
            }
          ]
        },
        "limits": [
          "Finite on/off resistance with an explicit control threshold; no arc or contact bounce",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-electrical-switch"
        ],
        "type": "electrical-switch",
        "implementationId": "electrical-switch",
        "url": "https://lemonergy.com/learn/glossary/blocks/electrical-switch/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/electrical-switch/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-electrical-switch"
          ]
        },
        "studioHelp": {
          "type": "electrical-switch",
          "namespace": "physical",
          "slug": "electrical-switch",
          "canonicalSlug": "electrical-switch",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "electrical-switch",
            "name": "Controlled electrical switch",
            "domain": "electrical",
            "family": "switch",
            "operation": "Selects a finite on or off resistance according to a control threshold.",
            "mechanism": [
              "Gate command",
              "Threshold",
              "On / off resistance"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "variable-resistor",
                "label": "Controlled resistor"
              },
              {
                "type": "signal-step",
                "label": "Physical signal step"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H65M70 35L125 10M135 40H190"
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 65,
                  "cy": 40,
                  "r": 4
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 135,
                  "cy": 40,
                  "r": 4
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "gate",
                "label": "Switch gate",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Switch gate is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "closed",
                "quantity": "fraction",
                "declared": true,
                "consumers": [],
                "label": "closed",
                "unit": "fraction"
              }
            ],
            "parameters": [
              {
                "id": "onResistanceOhm",
                "default": 0.01,
                "unit": "ohm",
                "min": 1e-06,
                "max": 1000000000,
                "value": 0.01
              },
              {
                "id": "offResistanceOhm",
                "default": 1000000000,
                "unit": "ohm",
                "min": 1e-06,
                "max": 1000000000000,
                "value": 1000000000
              },
              {
                "id": "gate",
                "default": 0,
                "unit": "dimensionless",
                "min": 0,
                "max": 1,
                "value": 0
              },
              {
                "id": "threshold",
                "default": 0.5,
                "unit": "dimensionless",
                "min": 0,
                "max": 1,
                "value": 0.5
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:electrothermal-battery",
      "type": "Block",
      "label": "Independent electrothermal battery",
      "properties": {
        "id": "electrothermal-battery",
        "kind": "studio",
        "name": "Independent electrothermal battery",
        "summary": "Evolves independent state of charge from signed terminal current, using linear OCV and temperature-dependent resistance while delivering Joule heat at h.",
        "behavior": "Evolves independent state of charge from signed terminal current, using linear OCV and temperature-dependent resistance while delivering Joule heat at h.",
        "documentationSlug": "electrothermal-battery",
        "referenceOnly": true,
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Positive voltage-reference terminal"
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Negative voltage-reference terminal"
          },
          {
            "name": "h",
            "direction": "conserving",
            "unit": "thermal",
            "description": "Bulk-temperature and Joule-heat contact"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Directed output available to compatible consumers: current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: power."
          },
          {
            "name": "soc Signal",
            "direction": "output",
            "unit": "fraction",
            "description": "Directed output available to compatible consumers: soc Signal."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Directed output available to compatible consumers: temperature."
          },
          {
            "name": "ocv",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: ocv."
          },
          {
            "name": "resistance",
            "direction": "output",
            "unit": "Ω",
            "description": "Directed output available to compatible consumers: resistance."
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: loss."
          },
          {
            "name": "chemical Energy",
            "direction": "output",
            "unit": "J",
            "description": "Directed output available to compatible consumers: chemical Energy."
          }
        ],
        "parameters": [
          {
            "key": "capacityAh",
            "label": "capacityAh",
            "unit": "Ah",
            "default": 100,
            "description": "Declared authoring field: capacityAh.",
            "min": 1e-06,
            "max": 1000000000
          },
          {
            "key": "initialSoc",
            "label": "initialSoc",
            "unit": "fraction",
            "default": 0.8,
            "description": "Declared authoring field: initialSoc.",
            "min": 0,
            "max": 1
          },
          {
            "key": "emptyVoltageV",
            "label": "emptyVoltageV",
            "unit": "V",
            "default": 300,
            "description": "Declared authoring field: emptyVoltageV.",
            "min": 0.01,
            "max": 1000000
          },
          {
            "key": "fullVoltageV",
            "label": "fullVoltageV",
            "unit": "V",
            "default": 420,
            "description": "Declared authoring field: fullVoltageV.",
            "min": 0.01,
            "max": 1000000
          },
          {
            "key": "resistanceOhm",
            "label": "resistanceOhm",
            "unit": "ohm",
            "default": 0.08,
            "description": "Declared authoring field: resistanceOhm.",
            "min": 1e-08,
            "max": 1000000
          },
          {
            "key": "capacitySoh",
            "label": "capacitySoh",
            "unit": "fraction",
            "default": 1,
            "description": "Declared authoring field: capacitySoh.",
            "min": 0.01,
            "max": 1
          },
          {
            "key": "resistanceMultiplier",
            "label": "resistanceMultiplier",
            "unit": "multiplier",
            "default": 1,
            "description": "Declared authoring field: resistanceMultiplier.",
            "min": 0.01,
            "max": 1000
          },
          {
            "key": "referenceTemperatureK",
            "label": "referenceTemperatureK",
            "unit": "K",
            "default": 298.15,
            "description": "Declared authoring field: referenceTemperatureK.",
            "min": 1,
            "max": 2000
          },
          {
            "key": "resistanceTemperatureCoefficient",
            "label": "resistanceTemperatureCoefficient",
            "unit": "1/K",
            "default": 0,
            "description": "Declared authoring field: resistanceTemperatureCoefficient.",
            "min": -0.01,
            "max": 0.1
          },
          {
            "key": "initialThroughputAh",
            "label": "initialThroughputAh",
            "unit": "Ah",
            "default": 0,
            "description": "Declared authoring field: initialThroughputAh.",
            "min": 0,
            "max": 1000000000000
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "electrothermal-battery",
        "implementationId": "electrothermal-battery",
        "url": "https://lemonergy.com/learn/glossary/blocks/electrothermal-battery/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/electrothermal-battery/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "electrothermal-battery",
          "namespace": "physical",
          "slug": "electrothermal-battery",
          "canonicalSlug": "electrothermal-battery",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "electrothermal-battery",
            "name": "Independent electrothermal battery",
            "domain": "electrical",
            "family": "battery",
            "operation": "Evolves independent state of charge from signed terminal current, using linear OCV and temperature-dependent resistance while delivering Joule heat at h.",
            "mechanism": [
              "SOC and bulk temperature",
              "OCV and series resistance",
              "Terminal power and heat"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "h",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Bulk-temperature and Joule-heat contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "pack-power-boundary",
                "label": "SOC and temperature limited signed power boundary"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H60M60 10V70M80 25V55M120 10V70M140 25V55M140 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "socSignal",
                "quantity": "fraction",
                "declared": true,
                "consumers": [],
                "label": "soc Signal",
                "unit": "fraction"
              },
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "ocv",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "ocv",
                "unit": "V"
              },
              {
                "id": "resistance",
                "quantity": "resistance",
                "declared": true,
                "consumers": [],
                "label": "resistance",
                "unit": "Ω"
              },
              {
                "id": "loss",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "loss",
                "unit": "W"
              },
              {
                "id": "chemicalEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "chemical Energy",
                "unit": "J"
              }
            ],
            "parameters": [
              {
                "id": "capacityAh",
                "default": 100,
                "unit": "Ah",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "initialSoc",
                "default": 0.8,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.8
              },
              {
                "id": "emptyVoltageV",
                "default": 300,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 300
              },
              {
                "id": "fullVoltageV",
                "default": 420,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 420
              },
              {
                "id": "resistanceOhm",
                "default": 0.08,
                "unit": "ohm",
                "min": 1e-08,
                "max": 1000000,
                "value": 0.08
              },
              {
                "id": "capacitySoh",
                "default": 1,
                "unit": "fraction",
                "min": 0.01,
                "max": 1,
                "value": 1
              },
              {
                "id": "resistanceMultiplier",
                "default": 1,
                "unit": "multiplier",
                "min": 0.01,
                "max": 1000,
                "value": 1
              },
              {
                "id": "referenceTemperatureK",
                "default": 298.15,
                "unit": "K",
                "min": 1,
                "max": 2000,
                "value": 298.15
              },
              {
                "id": "resistanceTemperatureCoefficient",
                "default": 0,
                "unit": "1/K",
                "min": -0.01,
                "max": 0.1,
                "value": 0
              },
              {
                "id": "initialThroughputAh",
                "default": 0,
                "unit": "Ah",
                "min": 0,
                "max": 1000000000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:electrothermal-resistor",
      "type": "Block",
      "label": "Electrothermal resistor",
      "properties": {
        "id": "electrothermal-resistor",
        "name": "Electrothermal resistor",
        "kind": "studio",
        "summary": "Linear temperature coefficient with positive floor; all electrical dissipation enters the thermal port",
        "behavior": "Conserving component solved simultaneously with the connected network. Linear temperature coefficient with positive floor; all electrical dissipation enters the thermal port",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "h",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "referenceResistanceOhm",
            "label": "Reference resistance",
            "unit": "ohm",
            "default": 10,
            "description": "Electrical resistance at the reference temperature.",
            "min": 1e-06,
            "max": 1000000000000
          },
          {
            "key": "referenceTemperatureK",
            "label": "Reference temperature",
            "unit": "K",
            "default": 300,
            "description": "Absolute temperature at which the reference resistance is defined.",
            "min": 0,
            "max": 5000
          },
          {
            "key": "alphaPerK",
            "label": "Temperature coefficient",
            "unit": "1/K",
            "default": 0.004,
            "description": "Fractional resistance change for each kelvin relative to the reference temperature.",
            "min": -1,
            "max": 1
          },
          {
            "key": "minimumResistanceOhm",
            "label": "Minimum resistance",
            "unit": "ohm",
            "default": 1e-06,
            "description": "Positive floor applied to the calculated or commanded electrical resistance.",
            "min": 1e-09,
            "max": 1000000000
          }
        ],
        "equations": [
          "R = max(Rref[1 + α(T − Tref)], Rmin)",
          "Q̇h = V I"
        ],
        "example": {
          "title": "Electrothermal resistor worked example",
          "text": "Editable first-party network. supply: voltageV=12; hot-boundary: differenceK=350; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-electrothermal-resistor",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "referenceResistanceOhm",
              "label": "Reference resistance",
              "value": 10,
              "unit": "ohm"
            },
            {
              "port": "referenceTemperatureK",
              "label": "Reference temperature",
              "value": 300,
              "unit": "K"
            },
            {
              "port": "alphaPerK",
              "label": "Temperature coefficient",
              "value": 0.004,
              "unit": "1/K"
            },
            {
              "port": "minimumResistanceOhm",
              "label": "Minimum resistance",
              "value": 1e-06,
              "unit": "ohm"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 1,
              "unit": "A",
              "tolerance": 9.999999999993736e-07
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 12,
              "unit": "V",
              "tolerance": 1.1999999999999997e-05
            },
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 12,
              "unit": "W",
              "tolerance": 1.1999999999140553e-05
            }
          ]
        },
        "limits": [
          "Linear temperature coefficient with positive floor; all electrical dissipation enters the thermal port",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-power",
          "openstax-heat"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-electrothermal-resistor"
        ],
        "type": "electrothermal-resistor",
        "implementationId": "electrothermal-resistor",
        "url": "https://lemonergy.com/learn/glossary/blocks/electrothermal-resistor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/electrothermal-resistor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-electrothermal-resistor"
          ]
        },
        "studioHelp": {
          "type": "electrothermal-resistor",
          "namespace": "physical",
          "slug": "electrothermal-resistor",
          "canonicalSlug": "electrothermal-resistor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "electrothermal-resistor",
            "name": "Electrothermal resistor",
            "domain": "electrical",
            "family": "resistance",
            "operation": "Changes resistance with temperature and transfers all modeled electrical dissipation into its thermal contact.",
            "mechanism": [
              "Electrical current",
              "Temperature-dependent resistance",
              "Heat at h"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "h",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Heat delivery and temperature contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "resistor",
                "label": "Resistor"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H40L50 20L70 60L90 20L110 60L130 20L150 60L160 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "resistance",
                "quantity": "resistance",
                "declared": true,
                "consumers": [],
                "label": "resistance",
                "unit": "Ω"
              },
              {
                "id": "limited",
                "quantity": "fraction",
                "declared": true,
                "consumers": [],
                "label": "limited",
                "unit": "fraction"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "referenceResistanceOhm",
                "default": 10,
                "unit": "ohm",
                "min": 1e-06,
                "max": 1000000000000,
                "value": 10
              },
              {
                "id": "referenceTemperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              },
              {
                "id": "alphaPerK",
                "default": 0.004,
                "unit": "1/K",
                "min": -1,
                "max": 1,
                "value": 0.004
              },
              {
                "id": "minimumResistanceOhm",
                "default": 1e-06,
                "unit": "ohm",
                "min": 1e-09,
                "max": 1000000000,
                "value": 1e-06
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:floating-reference",
      "type": "Block",
      "label": "Capacitive floating reference",
      "properties": {
        "id": "floating-reference",
        "name": "Capacitive floating reference",
        "kind": "studio",
        "summary": "Explicit capacitance to the voltage datum; no DC leakage or forced zero node voltage",
        "behavior": "Conserving component solved simultaneously with the connected network. Explicit capacitance to the voltage datum; no DC leakage or forced zero node voltage",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "stateVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded stateVoltage measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "capacitanceF",
            "label": "Reference capacitance",
            "unit": "F",
            "default": 1e-06,
            "description": "Capacitance between the floating node and the voltage datum.",
            "min": 1e-12,
            "max": 1
          },
          {
            "key": "initialVoltageV",
            "label": "Initial voltage",
            "unit": "V",
            "default": 0,
            "description": "Requested initial electrical voltage for the declared storage or target.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "I = C dV/dt to the voltage datum"
        ],
        "example": {
          "title": "Capacitive floating reference worked example",
          "text": "Editable first-party network. target: initialVoltageV=3; source: voltageV=2; load: resistanceOhm=100. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-floating-reference",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "capacitanceF",
              "label": "Reference capacitance",
              "value": 1e-06,
              "unit": "F"
            },
            {
              "port": "initialVoltageV",
              "label": "Initial voltage",
              "value": 3,
              "unit": "V"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 0,
              "unit": "A",
              "tolerance": 1e-10
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 3,
              "unit": "V",
              "tolerance": 3.0000000000000005e-06
            },
            {
              "port": "target/stateVoltage",
              "label": "stateVoltage",
              "atS": 1,
              "value": 3,
              "unit": "V",
              "tolerance": 3e-06
            }
          ]
        },
        "limits": [
          "Explicit capacitance to the voltage datum; no DC leakage or forced zero node voltage",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-capacitor",
          "physical-circuit"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-floating-reference"
        ],
        "type": "floating-reference",
        "implementationId": "floating-reference",
        "url": "https://lemonergy.com/learn/glossary/blocks/floating-reference/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/floating-reference/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-floating-reference"
          ]
        },
        "studioHelp": {
          "type": "floating-reference",
          "namespace": "physical",
          "slug": "floating-reference",
          "canonicalSlug": "floating-reference",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "floating-reference",
            "name": "Capacitive floating reference",
            "domain": "electrical",
            "family": "capacitor",
            "operation": "Connects a declared capacitance to the voltage datum without forcing the node to zero volts or adding DC leakage.",
            "mechanism": [
              "Node voltage",
              "Capacitance to datum"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Capacitive datum connection",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "electrical-reference",
                "label": "Electrical reference"
              },
              {
                "type": "capacitor",
                "label": "Capacitor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H85M85 10V70M115 10V70M115 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "capacitanceF",
                "default": 1e-06,
                "unit": "F",
                "min": 1e-12,
                "max": 1,
                "value": 1e-06
              },
              {
                "id": "initialVoltageV",
                "default": 0,
                "unit": "V",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:ideal-transformer",
      "type": "Block",
      "label": "Ideal transformer",
      "properties": {
        "id": "ideal-transformer",
        "name": "Ideal transformer",
        "kind": "studio",
        "summary": "Ideal lossless voltage/current transformation; each winding needs a voltage reference",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal lossless voltage/current transformation; each winding needs a voltage reference",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "s",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "t",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "voltageSecondary",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage on the secondary port measurement from the conserving simulation."
          },
          {
            "name": "currentSecondary",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current on the secondary port measurement from the conserving simulation."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "turnsRatio",
            "label": "Turns ratio",
            "unit": "primary/secondary turns",
            "default": 2,
            "description": "Primary turns divided by secondary turns.",
            "min": 1e-06,
            "max": 1000000
          }
        ],
        "equations": [
          "Vp = n Vs",
          "Is = −n Ip",
          "Vp Ip + Vs Is = 0"
        ],
        "example": {
          "title": "Ideal transformer worked example",
          "text": "Editable first-party network. supply: voltageV=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-ideal-transformer",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "turnsRatio",
              "label": "Turns ratio",
              "value": 2,
              "unit": "primary/secondary turns"
            }
          ],
          "checks": [
            {
              "port": "target/voltageSecondary",
              "label": "voltageSecondary",
              "atS": 1,
              "value": 0.5,
              "unit": "V",
              "tolerance": 5e-07
            },
            {
              "port": "target/currentSecondary",
              "label": "currentSecondary",
              "atS": 1,
              "value": -0.125,
              "unit": "A",
              "tolerance": 1.25e-07
            },
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 0.0625,
              "unit": "A",
              "tolerance": 6.25e-08
            }
          ]
        },
        "limits": [
          "Ideal lossless voltage/current transformation; each winding needs a voltage reference",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-transformer"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-ideal-transformer"
        ],
        "type": "ideal-transformer",
        "implementationId": "ideal-transformer",
        "url": "https://lemonergy.com/learn/glossary/blocks/ideal-transformer/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/ideal-transformer/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-ideal-transformer"
          ]
        },
        "studioHelp": {
          "type": "ideal-transformer",
          "namespace": "physical",
          "slug": "ideal-transformer",
          "canonicalSlug": "ideal-transformer",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "ideal-transformer",
            "name": "Ideal transformer",
            "domain": "electrical",
            "family": "transformer",
            "operation": "Transfers electrical power between ideal windings with a fixed voltage/current ratio and no modeled loss.",
            "mechanism": [
              "Primary winding",
              "Turns ratio",
              "Secondary winding"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "s",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Secondary positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "t",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Secondary negative terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "mutual-inductor",
                "label": "Coupled inductors"
              },
              {
                "type": "electrical-reference",
                "label": "Electrical reference"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 15H55C85 15 85 35 55 35C85 35 85 55 55 55C85 55 85 75 55 75H10M95 10V75M105 10V75M190 15H145C115 15 115 35 145 35C115 35 115 55 145 55C115 55 115 75 145 75H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "voltageSecondary",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage Secondary",
                "unit": "V"
              },
              {
                "id": "currentSecondary",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current Secondary",
                "unit": "A"
              },
              {
                "id": "powerSecondary",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power Secondary",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "turnsRatio",
                "default": 2,
                "unit": "primary/secondary turns",
                "min": 1e-06,
                "max": 1000000,
                "value": 2
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:inductor",
      "type": "Block",
      "label": "Inductor",
      "properties": {
        "id": "inductor",
        "kind": "studio",
        "name": "Inductor",
        "summary": "Stores magnetic energy; voltage changes its current over time.",
        "behavior": "Stores magnetic energy; voltage changes its current over time.",
        "documentationSlug": "inductor",
        "referenceOnly": true,
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Positive voltage-reference terminal"
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Negative voltage-reference terminal"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Directed output available to compatible consumers: current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: power."
          }
        ],
        "parameters": [
          {
            "key": "inductanceH",
            "label": "inductanceH",
            "unit": "H",
            "default": 0.01,
            "description": "Declared authoring field: inductanceH.",
            "min": 1e-12,
            "max": 1000000
          },
          {
            "key": "initialCurrentA",
            "label": "initialCurrentA",
            "unit": "A",
            "default": 0,
            "description": "Declared authoring field: initialCurrentA.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "inductor",
        "implementationId": "inductor",
        "url": "https://lemonergy.com/learn/glossary/blocks/inductor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/inductor/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "inductor",
          "namespace": "physical",
          "slug": "inductor",
          "canonicalSlug": "inductor",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "inductor",
            "name": "Inductor",
            "domain": "electrical",
            "family": "inductor",
            "operation": "Stores magnetic energy; voltage changes its current over time.",
            "mechanism": [
              "Voltage",
              "Magnetic storage",
              "Current"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "voltage-source",
                "label": "Controlled voltage source"
              },
              {
                "type": "mutual-inductor",
                "label": "Coupled inductors"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H40C40 10 70 10 70 40C70 10 100 10 100 40C100 10 130 10 130 40C130 10 160 10 160 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "inductanceH",
                "default": 0.01,
                "unit": "H",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.01
              },
              {
                "id": "initialCurrentA",
                "default": 0,
                "unit": "A",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:initial-voltage-constraint",
      "type": "Block",
      "label": "Open branch with initial voltage target",
      "properties": {
        "id": "initial-voltage-constraint",
        "name": "Open branch with initial voltage target",
        "kind": "studio",
        "summary": "Zero current at all times; initializes a directly attached capacitor when its initial voltage is unspecified, otherwise verifies the consistent initial solution",
        "behavior": "Conserving component solved simultaneously with the connected network. Zero current at all times; initializes a directly attached capacitor when its initial voltage is unspecified, otherwise verifies the consistent initial solution",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Recorded power measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "initialVoltageV",
            "label": "Initial voltage",
            "unit": "V",
            "default": 0,
            "description": "Requested initial electrical voltage for the declared storage or target.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "I = 0",
          "V(0) = requested initial voltage, subject to consistent storage initialization"
        ],
        "example": {
          "title": "Open branch with initial voltage target worked example",
          "text": "Editable first-party network. capacitor: capacitanceF=1; load: resistanceOhm=1; target: initialVoltageV=4. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-initial-voltage-constraint",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "initialVoltageV",
              "label": "Initial voltage",
              "value": 4,
              "unit": "V"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 0,
              "unit": "A",
              "tolerance": 1e-10
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 1.47518891,
              "unit": "V",
              "tolerance": 1.4751889140492002e-06
            },
            {
              "port": "target/power",
              "label": "power",
              "atS": 1,
              "value": 0,
              "unit": "W",
              "tolerance": 1e-10
            }
          ]
        },
        "limits": [
          "Zero current at all times; initializes a directly attached capacitor when its initial voltage is unspecified, otherwise verifies the consistent initial solution",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-capacitor",
          "physical-circuit"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-initial-voltage-constraint"
        ],
        "type": "initial-voltage-constraint",
        "implementationId": "initial-voltage-constraint",
        "url": "https://lemonergy.com/learn/glossary/blocks/initial-voltage-constraint/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/initial-voltage-constraint/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-initial-voltage-constraint"
          ]
        },
        "studioHelp": {
          "type": "initial-voltage-constraint",
          "namespace": "physical",
          "slug": "initial-voltage-constraint",
          "canonicalSlug": "initial-voltage-constraint",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "initial-voltage-constraint",
            "name": "Open branch with initial voltage target",
            "domain": "electrical",
            "family": "initial",
            "operation": "Passes zero current while setting or checking an initial voltage target on directly attached capacitance. It does not hold voltage during the run.",
            "mechanism": [
              "Initial voltage target",
              "Initial consistency",
              "Zero branch current"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "capacitor",
                "label": "Capacitor"
              },
              {
                "type": "voltage-source",
                "label": "Controlled voltage source"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 30
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M100 20V40L118 50M10 40H70M130 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "initialVoltageV",
                "default": 0,
                "unit": "V",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:linear-converter",
      "type": "Block",
      "label": "Ideal linear motor coupler",
      "properties": {
        "id": "linear-converter",
        "name": "Ideal linear motor coupler",
        "kind": "studio",
        "summary": "Lossless back-emf/force conversion; no winding loss or electromagnetic storage",
        "behavior": "Conserving component solved simultaneously with the connected network. Lossless back-emf/force conversion; no winding loss or electromagnetic storage",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "a",
            "direction": "terminal",
            "unit": "m; m/s; N",
            "description": "translational conserving connection; shared mechanical position or speed with balanced effort."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "m; m/s; N",
            "description": "translational conserving connection; shared mechanical position or speed with balanced effort."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "mechanicalPower",
            "direction": "output",
            "unit": "W",
            "description": "Recorded mechanicalPower measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "constant",
            "label": "Conversion constant",
            "unit": "V s/m = N/A",
            "default": 1,
            "description": "The same constant relates motion to back-emf and current to mechanical effort.",
            "min": 1e-09,
            "max": 1000000
          }
        ],
        "equations": [
          "V = K (va − vb)",
          "F = K I",
          "V I = F (va − vb)"
        ],
        "example": {
          "title": "Ideal linear motor coupler worked example",
          "text": "Editable first-party network. target: constant=2; supply: currentA=1. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-linear-converter",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "constant",
              "label": "Conversion constant",
              "value": 2,
              "unit": "V s/m = N/A"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 1,
              "unit": "A",
              "tolerance": 1e-06
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 4,
              "unit": "V",
              "tolerance": 3.999999999997121e-06
            },
            {
              "port": "target/mechanicalPower",
              "label": "mechanicalPower",
              "atS": 1,
              "value": 4,
              "unit": "W",
              "tolerance": 3.999999999997121e-06
            }
          ]
        },
        "limits": [
          "Lossless back-emf/force conversion; no winding loss or electromagnetic storage",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-linear-converter"
        ],
        "type": "linear-converter",
        "implementationId": "linear-converter",
        "url": "https://lemonergy.com/learn/glossary/blocks/linear-converter/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/linear-converter/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-linear-converter"
          ]
        },
        "studioHelp": {
          "type": "linear-converter",
          "namespace": "physical",
          "slug": "linear-converter",
          "canonicalSlug": "linear-converter",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "linear-converter",
            "name": "Ideal linear motor coupler",
            "domain": "electrical",
            "family": "converter",
            "operation": "Losslessly couples electrical voltage/current to relative linear velocity/force through its conversion constant.",
            "mechanism": [
              "Electrical port",
              "Back EMF and force",
              "Linear port"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "a",
                "domain": "translational",
                "kind": "conserving",
                "label": "Linear side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "translational",
                "kind": "conserving",
                "label": "Linear side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "linear-mass",
                "label": "Translational mass"
              },
              {
                "type": "rotational-converter",
                "label": "Ideal rotational motor coupler"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 70,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 135,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "mechanicalPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "mechanical Power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "constant",
                "default": 1,
                "unit": "V s/m = N/A",
                "min": 1e-09,
                "max": 1000000,
                "value": 1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:memristor",
      "type": "Block",
      "label": "Bounded drift memristor",
      "properties": {
        "id": "memristor",
        "name": "Bounded drift memristor",
        "kind": "studio",
        "summary": "Synthetic resistance-range and switching-time design with a smooth drift boundary window; no fitted material or measured-device claim.",
        "behavior": "Solves a conserving two-terminal drift model. The example chooses a 200–1000 Ω resistance span, an initial conducting fraction of 0.5 and a 1 mA current. Mobility is derived from a chosen initial fraction rate of 0.01 per second at a nominal 20 nm scale. These choices describe a hypothetical teaching device.",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "state",
            "direction": "output",
            "unit": "fraction",
            "description": "Recorded state measurement from the conserving simulation."
          },
          {
            "name": "resistance",
            "direction": "output",
            "unit": "Ω",
            "description": "Recorded instantaneous resistance from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "onResistanceOhm",
            "label": "On-state resistance",
            "unit": "ohm",
            "default": 200,
            "description": "Chosen endpoint of the hypothetical 5:1 resistance span; not a supplier rating or fitted material value.",
            "min": 1e-06,
            "max": 1000000000
          },
          {
            "key": "offResistanceOhm",
            "label": "Off-state resistance",
            "unit": "ohm",
            "default": 1000,
            "description": "Chosen endpoint of the hypothetical 5:1 resistance span; not a supplier rating or fitted material value.",
            "min": 1e-06,
            "max": 1000000000000
          },
          {
            "key": "thicknessM",
            "label": "Active layer thickness",
            "unit": "m",
            "default": 2e-08,
            "description": "Nominal 20 nm teaching scale used in the mobility derivation; not a measured device thickness.",
            "min": 1e-12,
            "max": 1
          },
          {
            "key": "mobilityM2Vs",
            "label": "Drift mobility",
            "unit": "m2/(V s)",
            "default": 2e-17,
            "description": "Derived teaching value: initial fraction rate × thickness² / (on-state resistance × current) = 0.01 × (20 nm)² / (200 Ω × 1 mA). It is not a measured ionic mobility.",
            "min": 0,
            "max": 1
          },
          {
            "key": "initialState",
            "label": "Initial internal state",
            "unit": "fraction",
            "default": 0.5,
            "description": "Initial normalized conducting-region fraction in the drift model.",
            "min": 0,
            "max": 1
          }
        ],
        "equations": [
          "R = Ron w + Roff (1 − w)",
          "dw/dt = mobility Ron I / thickness² × 4w(1 − w)",
          "At constant 1 mA: dw/dt = 0.04 w(1 − w); w(t) = 1 / (1 + exp(−0.04 t))"
        ],
        "example": {
          "title": "Bounded drift memristor worked example",
          "text": "Drive the hypothetical device with a constant 1 mA for 10 s. Initially w = 0.5, R = 600 Ω and V = 0.6 V. The independently derived logistic solution gives w(10 s) = 0.598687660112452 and V(10 s) = 0.5210498719100384 V. The production native model and exported results agree within the tolerances below. This independently designed teaching fixture is available in Studio.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-memristor",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "onResistanceOhm",
              "label": "On-state resistance",
              "value": 200,
              "unit": "ohm"
            },
            {
              "port": "offResistanceOhm",
              "label": "Off-state resistance",
              "value": 1000,
              "unit": "ohm"
            },
            {
              "port": "thicknessM",
              "label": "Active layer thickness",
              "value": 2e-08,
              "unit": "m"
            },
            {
              "port": "mobilityM2Vs",
              "label": "Drift mobility",
              "value": 2e-17,
              "unit": "m2/(V s)"
            },
            {
              "port": "initialState",
              "label": "Initial internal state",
              "value": 0.5,
              "unit": "fraction"
            },
            {
              "port": "supply/currentA",
              "label": "Prescribed drive current",
              "value": 0.001,
              "unit": "A"
            }
          ],
          "checks": [
            {
              "port": "target/state",
              "label": "Internal fraction",
              "atS": 0,
              "value": 0.5,
              "unit": "fraction",
              "tolerance": 1e-12
            },
            {
              "port": "target/resistance",
              "label": "Resistance",
              "atS": 0,
              "value": 600,
              "unit": "Ω",
              "tolerance": 1e-08
            },
            {
              "port": "target/voltage",
              "label": "Voltage",
              "atS": 0,
              "value": 0.6,
              "unit": "V",
              "tolerance": 1e-10
            },
            {
              "port": "target/current",
              "label": "Current",
              "atS": 10,
              "value": 0.001,
              "unit": "A",
              "tolerance": 1e-10
            },
            {
              "port": "target/state",
              "label": "Internal fraction",
              "atS": 10,
              "value": 0.598687660112452,
              "unit": "fraction",
              "tolerance": 1e-05
            },
            {
              "port": "target/resistance",
              "label": "Resistance",
              "atS": 10,
              "value": 521.0498719100384,
              "unit": "Ω",
              "tolerance": 0.01
            },
            {
              "port": "target/voltage",
              "label": "Voltage",
              "atS": 10,
              "value": 0.5210498719100384,
              "unit": "V",
              "tolerance": 1e-05
            }
          ]
        },
        "limits": [
          "Synthetic parameters were selected through resistance-range and switching-time targets. The earlier undocumented illustrative parameter tuple is not reused. These values do not characterize a material or device.",
          "Joglekar and Wolf support the drift equation and the p = 1 boundary window. That citation does not supply this example’s resistance endpoints, geometry, mobility or numeric outputs.",
          "The boundary window locks at w = 0 and w = 1. This reduced model does not represent every resistive-switching mechanism. Singular constraints or unsupported states stop the run."
        ],
        "references": [
          "physical-memristor"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The independently designed current-driven fixture was verified in production on 28 October 2026. Its native trace and exported results agree with the independent analytical checks within the stated tolerances. These synthetic values do not characterize a measured device."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-28-synthetic-memristor",
        "caseIds": [
          "native-memristor"
        ],
        "type": "memristor",
        "implementationId": "memristor",
        "url": "https://lemonergy.com/learn/glossary/blocks/memristor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/memristor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "46d83ef9a96176e8de3ec4e38df4ab2a1e18d898",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-memristor"
          ]
        },
        "studioHelp": {
          "type": "memristor",
          "namespace": "physical",
          "slug": "memristor",
          "canonicalSlug": "memristor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "memristor",
            "name": "Bounded drift memristor",
            "domain": "electrical",
            "family": "resistance",
            "operation": "Evolves a bounded internal state that changes resistance between configured limits; it is a synthetic reduced model.",
            "mechanism": [
              "Electrical drive",
              "Bounded internal state",
              "Variable resistance"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "resistor",
                "label": "Resistor"
              },
              {
                "type": "variable-resistor",
                "label": "Controlled resistor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H40L50 20L70 60L90 20L110 60L130 20L150 60L160 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "resistance",
                "quantity": "resistance",
                "declared": true,
                "consumers": [],
                "label": "resistance",
                "unit": "Ω"
              }
            ],
            "parameters": [
              {
                "id": "onResistanceOhm",
                "default": 200,
                "unit": "ohm",
                "min": 1e-06,
                "max": 1000000000,
                "value": 200
              },
              {
                "id": "offResistanceOhm",
                "default": 1000,
                "unit": "ohm",
                "min": 1e-06,
                "max": 1000000000000,
                "value": 1000
              },
              {
                "id": "thicknessM",
                "default": 2e-08,
                "unit": "m",
                "min": 1e-12,
                "max": 1,
                "value": 2e-08
              },
              {
                "id": "mobilityM2Vs",
                "default": 2e-17,
                "unit": "m2/(V s)",
                "min": 0,
                "max": 1,
                "value": 2e-17
              },
              {
                "id": "initialState",
                "default": 0.5,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.5
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:mutual-inductor",
      "type": "Block",
      "label": "Coupled inductors",
      "properties": {
        "id": "mutual-inductor",
        "name": "Coupled inductors",
        "kind": "studio",
        "summary": "Symmetric positive-definite inductance matrix; no saturation, hysteresis or winding losses",
        "behavior": "Conserving component solved simultaneously with the connected network. Symmetric positive-definite inductance matrix; no saturation, hysteresis or winding losses",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "s",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "t",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "voltageSecondary",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage on the secondary port measurement from the conserving simulation."
          },
          {
            "name": "currentSecondary",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current on the secondary port measurement from the conserving simulation."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "primaryInductanceH",
            "label": "Primary self-inductance",
            "unit": "H",
            "default": 1,
            "description": "Self-inductance of the primary winding.",
            "min": 1e-09,
            "max": 1000000000
          },
          {
            "key": "secondaryInductanceH",
            "label": "Secondary self-inductance",
            "unit": "H",
            "default": 1,
            "description": "Self-inductance of the secondary winding.",
            "min": 1e-09,
            "max": 1000000000
          },
          {
            "key": "coupling",
            "label": "Magnetic coupling coefficient",
            "unit": "fraction",
            "default": 0.5,
            "description": "Signed mutual coupling; its magnitude must remain below one.",
            "min": -0.999999,
            "max": 0.999999
          },
          {
            "key": "initialPrimaryCurrentA",
            "label": "Initial primary current",
            "unit": "A",
            "default": 0,
            "description": "Current entering the primary winding at initialization.",
            "min": -1000000,
            "max": 1000000
          },
          {
            "key": "initialSecondaryCurrentA",
            "label": "Initial secondary current",
            "unit": "A",
            "default": 0,
            "description": "Current entering the secondary winding at initialization.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "Vp = Lp dIp/dt + M dIs/dt",
          "Vs = M dIp/dt + Ls dIs/dt",
          "M = k sqrt(Lp Ls)"
        ],
        "example": {
          "title": "Coupled inductors worked example",
          "text": "Editable first-party network. supply: voltageV=1; short: voltageV=0. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-mutual-inductor",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "primaryInductanceH",
              "label": "Primary self-inductance",
              "value": 1,
              "unit": "H"
            },
            {
              "port": "secondaryInductanceH",
              "label": "Secondary self-inductance",
              "value": 1,
              "unit": "H"
            },
            {
              "port": "coupling",
              "label": "Magnetic coupling coefficient",
              "value": 0.5,
              "unit": "fraction"
            },
            {
              "port": "initialPrimaryCurrentA",
              "label": "Initial primary current",
              "value": 0,
              "unit": "A"
            }
          ],
          "checks": [
            {
              "port": "target/voltageSecondary",
              "label": "voltageSecondary",
              "atS": 1,
              "value": 0,
              "unit": "V",
              "tolerance": 1e-10
            },
            {
              "port": "target/currentSecondary",
              "label": "currentSecondary",
              "atS": 1,
              "value": -0.666666667,
              "unit": "A",
              "tolerance": 6.666666666666666e-07
            },
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 1.33333333,
              "unit": "A",
              "tolerance": 1.3333333333333328e-06
            }
          ]
        },
        "limits": [
          "Symmetric positive-definite inductance matrix; no saturation, hysteresis or winding losses",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-magnetic"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-mutual-inductor"
        ],
        "type": "mutual-inductor",
        "implementationId": "mutual-inductor",
        "url": "https://lemonergy.com/learn/glossary/blocks/mutual-inductor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/mutual-inductor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-mutual-inductor"
          ]
        },
        "studioHelp": {
          "type": "mutual-inductor",
          "namespace": "physical",
          "slug": "mutual-inductor",
          "canonicalSlug": "mutual-inductor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "mutual-inductor",
            "name": "Coupled inductors",
            "domain": "electrical",
            "family": "transformer",
            "operation": "Couples two inductor currents through a positive-definite mutual inductance matrix.",
            "mechanism": [
              "Primary current",
              "Coupled magnetic storage",
              "Secondary current"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "s",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Secondary positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "t",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Secondary negative terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "inductor",
                "label": "Inductor"
              },
              {
                "type": "ideal-transformer",
                "label": "Ideal transformer"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 15H55C85 15 85 35 55 35C85 35 85 55 55 55C85 55 85 75 55 75H10M95 10V75M105 10V75M190 15H145C115 15 115 35 145 35C115 35 115 55 145 55C115 55 115 75 145 75H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "voltageSecondary",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage Secondary",
                "unit": "V"
              },
              {
                "id": "currentSecondary",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current Secondary",
                "unit": "A"
              },
              {
                "id": "powerSecondary",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power Secondary",
                "unit": "W"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              }
            ],
            "parameters": [
              {
                "id": "primaryInductanceH",
                "default": 1,
                "unit": "H",
                "min": 1e-09,
                "max": 1000000000,
                "value": 1
              },
              {
                "id": "secondaryInductanceH",
                "default": 1,
                "unit": "H",
                "min": 1e-09,
                "max": 1000000000,
                "value": 1
              },
              {
                "id": "coupling",
                "default": 0.5,
                "unit": "fraction",
                "min": -0.999999,
                "max": 0.999999,
                "value": 0.5
              },
              {
                "id": "initialPrimaryCurrentA",
                "default": 0,
                "unit": "A",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "initialSecondaryCurrentA",
                "default": 0,
                "unit": "A",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:open-circuit",
      "type": "Block",
      "label": "Open electrical port",
      "properties": {
        "id": "open-circuit",
        "name": "Open electrical port",
        "kind": "studio",
        "summary": "Zero current termination; no hidden grounding or leakage",
        "behavior": "Conserving component solved simultaneously with the connected network. Zero current termination; no hidden grounding or leakage",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          }
        ],
        "parameters": [],
        "equations": [
          "I = 0"
        ],
        "example": {
          "title": "Open electrical port worked example",
          "text": "Editable first-party network. supply: voltageV=5. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-open-circuit",
          "label": "Open Studio example",
          "inputs": [],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 0,
              "unit": "A",
              "tolerance": 1e-10
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 5,
              "unit": "V",
              "tolerance": 5.000000000203167e-06
            }
          ]
        },
        "limits": [
          "Zero current termination; no hidden grounding or leakage",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-open-circuit"
        ],
        "type": "open-circuit",
        "implementationId": "open-circuit",
        "url": "https://lemonergy.com/learn/glossary/blocks/open-circuit/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/open-circuit/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-open-circuit"
          ]
        },
        "studioHelp": {
          "type": "open-circuit",
          "namespace": "physical",
          "slug": "open-circuit",
          "canonicalSlug": "open-circuit",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "open-circuit",
            "name": "Open electrical port",
            "domain": "electrical",
            "family": "open",
            "operation": "Terminates an electrical pin with zero current without fixing its voltage.",
            "mechanism": [
              "Electrical terminal",
              "No branch current"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Open electrical terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "electrical-reference",
                "label": "Electrical reference"
              },
              {
                "type": "voltage-sensor",
                "label": "Voltage sensor / signal adapter"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H80M120 40H190"
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 85,
                  "cy": 40,
                  "r": 5
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 115,
                  "cy": 40,
                  "r": 5
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              }
            ],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:operational-amplifier",
      "type": "Block",
      "label": "Finite-gain operational amplifier",
      "properties": {
        "id": "operational-amplifier",
        "name": "Finite-gain operational amplifier",
        "kind": "studio",
        "summary": "High impedance inputs, finite open-loop gain and hard output voltage rails; ideal output drive, no slew or supply-current model",
        "behavior": "Conserving component solved simultaneously with the connected network. High impedance inputs, finite open-loop gain and hard output voltage rails; ideal output drive, no slew or supply-current model",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "cp",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "cn",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "branchCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Recorded branchCurrent measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "gain",
            "label": "Gain",
            "unit": "V/V",
            "default": 100000,
            "description": "Multiplier from the sensed input to the declared output quantity.",
            "min": 1,
            "max": 1000000000000
          },
          {
            "key": "minimumOutputV",
            "label": "Lower output rail",
            "unit": "V",
            "default": -15,
            "description": "Smallest permitted output voltage of the amplifier abstraction.",
            "min": -1000000,
            "max": 1000000
          },
          {
            "key": "maximumOutputV",
            "label": "Upper output rail",
            "unit": "V",
            "default": 15,
            "description": "Largest permitted output voltage of the amplifier abstraction.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "Vout = clip(gain × (Vcp − Vcn), lower rail, upper rail)",
          "Icp = Icn = 0"
        ],
        "example": {
          "title": "Finite-gain operational amplifier worked example",
          "text": "Editable first-party network. supply: voltageV=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-operational-amplifier",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "gain",
              "label": "Gain",
              "value": 100000,
              "unit": "V/V"
            },
            {
              "port": "minimumOutputV",
              "label": "Lower output rail",
              "value": -15,
              "unit": "V"
            },
            {
              "port": "maximumOutputV",
              "label": "Upper output rail",
              "value": 15,
              "unit": "V"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": -0.2499975,
              "unit": "A",
              "tolerance": 2.4999750002499973e-07
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 0.99999,
              "unit": "V",
              "tolerance": 9.99990000099999e-07
            },
            {
              "port": "target/branchCurrent",
              "label": "branchCurrent",
              "atS": 1,
              "value": -0.2499975,
              "unit": "A",
              "tolerance": 2.4999750002499973e-07
            }
          ]
        },
        "limits": [
          "High impedance inputs, finite open-loop gain and hard output voltage rails; ideal output drive, no slew or supply-current model",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-amplifier"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-operational-amplifier"
        ],
        "type": "operational-amplifier",
        "implementationId": "operational-amplifier",
        "url": "https://lemonergy.com/learn/glossary/blocks/operational-amplifier/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/operational-amplifier/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-operational-amplifier"
          ]
        },
        "studioHelp": {
          "type": "operational-amplifier",
          "namespace": "physical",
          "slug": "operational-amplifier",
          "canonicalSlug": "operational-amplifier",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "operational-amplifier",
            "name": "Finite-gain operational amplifier",
            "domain": "electrical",
            "family": "amplifier",
            "operation": "Amplifies the control voltage difference with finite gain and hard output-voltage rails; the control input draws no current.",
            "mechanism": [
              "Control voltage",
              "Gain and rails",
              "Output voltage"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "cp",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Control branch positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "cn",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Control branch negative terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "voltage-gain-source",
                "label": "Voltage-controlled voltage source"
              },
              {
                "type": "voltage-sensor",
                "label": "Voltage sensor / signal adapter"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M60 10L150 40L60 70Z M10 25H60M10 55H60M150 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "gain",
                "default": 100000,
                "unit": "V/V",
                "min": 1,
                "max": 1000000000000,
                "value": 100000
              },
              {
                "id": "minimumOutputV",
                "default": -15,
                "unit": "V",
                "min": -1000000,
                "max": 1000000,
                "value": -15
              },
              {
                "id": "maximumOutputV",
                "default": 15,
                "unit": "V",
                "min": -1000000,
                "max": 1000000,
                "value": 15
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:pack-power-boundary",
      "type": "Block",
      "label": "SOC and temperature limited signed power boundary",
      "properties": {
        "id": "pack-power-boundary",
        "kind": "studio",
        "name": "SOC and temperature limited signed power boundary",
        "summary": "Requests signed terminal power while applying supplied SOC, temperature, current and permission limits; unmet power is recorded.",
        "behavior": "Requests signed terminal power while applying supplied SOC, temperature, current and permission limits; unmet power is recorded.",
        "documentationSlug": "pack-power-boundary",
        "referenceOnly": true,
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Positive voltage-reference terminal"
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Negative voltage-reference terminal"
          },
          {
            "name": "Signed power and battery state",
            "direction": "input",
            "unit": "W",
            "description": "Signed power and battery state is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "State of charge",
            "direction": "input",
            "unit": "fraction",
            "description": "State of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "Battery temperature",
            "direction": "input",
            "unit": "K",
            "description": "Battery temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "Operating permission",
            "direction": "input",
            "unit": "1",
            "description": "Operating permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Directed output available to compatible consumers: current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: power."
          },
          {
            "name": "requested Power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: requested Power."
          },
          {
            "name": "delivered Power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: delivered Power."
          },
          {
            "name": "available Discharge Power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: available Discharge Power."
          },
          {
            "name": "available Charge Power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: available Charge Power."
          }
        ],
        "parameters": [
          {
            "key": "powerW",
            "label": "powerW",
            "unit": "W: positive discharge, negative charge",
            "default": 1000,
            "description": "Declared authoring field: powerW.",
            "min": -1000000000,
            "max": 1000000000
          },
          {
            "key": "capacityAh",
            "label": "capacityAh",
            "unit": "Ah effective",
            "default": 100,
            "description": "Declared authoring field: capacityAh.",
            "min": 1e-06,
            "max": 1000000000
          },
          {
            "key": "minimumSoc",
            "label": "minimumSoc",
            "unit": "fraction",
            "default": 0.05,
            "description": "Declared authoring field: minimumSoc.",
            "min": 0,
            "max": 1
          },
          {
            "key": "maximumSoc",
            "label": "maximumSoc",
            "unit": "fraction",
            "default": 0.95,
            "description": "Declared authoring field: maximumSoc.",
            "min": 0,
            "max": 1
          },
          {
            "key": "maxDischargeA",
            "label": "maxDischargeA",
            "unit": "A",
            "default": 500,
            "description": "Declared authoring field: maxDischargeA.",
            "min": 0,
            "max": 1000000
          },
          {
            "key": "maxChargeA",
            "label": "maxChargeA",
            "unit": "A",
            "default": 200,
            "description": "Declared authoring field: maxChargeA.",
            "min": 0,
            "max": 1000000
          },
          {
            "key": "minimumVoltageV",
            "label": "minimumVoltageV",
            "unit": "V",
            "default": 150,
            "description": "Declared authoring field: minimumVoltageV.",
            "min": 0.01,
            "max": 1000000
          },
          {
            "key": "minTemperatureK",
            "label": "minTemperatureK",
            "unit": "K",
            "default": 233.15,
            "description": "Declared authoring field: minTemperatureK.",
            "min": 1,
            "max": 2000
          },
          {
            "key": "maxTemperatureK",
            "label": "maxTemperatureK",
            "unit": "K legacy discharge bound",
            "default": 333.15,
            "description": "Declared authoring field: maxTemperatureK.",
            "min": 1,
            "max": 2000
          },
          {
            "key": "minChargeTemperatureK",
            "label": "minChargeTemperatureK",
            "unit": "K authored charge bound",
            "default": 273.15,
            "description": "Declared authoring field: minChargeTemperatureK.",
            "min": 1,
            "max": 2000
          },
          {
            "key": "maxChargeTemperatureK",
            "label": "maxChargeTemperatureK",
            "unit": "K authored charge bound",
            "default": 318.15,
            "description": "Declared authoring field: maxChargeTemperatureK.",
            "min": 1,
            "max": 2000
          },
          {
            "key": "minDischargeTemperatureK",
            "label": "minDischargeTemperatureK",
            "unit": "K authored discharge bound",
            "default": 233.15,
            "description": "Declared authoring field: minDischargeTemperatureK.",
            "min": 1,
            "max": 2000
          },
          {
            "key": "maxDischargeTemperatureK",
            "label": "maxDischargeTemperatureK",
            "unit": "K authored discharge bound",
            "default": 333.15,
            "description": "Declared authoring field: maxDischargeTemperatureK.",
            "min": 1,
            "max": 2000
          },
          {
            "key": "temperatureDeratingK",
            "label": "temperatureDeratingK",
            "unit": "K taper width",
            "default": 5,
            "description": "Declared authoring field: temperatureDeratingK.",
            "min": 0.001,
            "max": 100
          },
          {
            "key": "barrierTimeS",
            "label": "barrierTimeS",
            "unit": "s",
            "default": 1,
            "description": "Declared authoring field: barrierTimeS.",
            "min": 1e-06,
            "max": 1000000000
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "pack-power-boundary",
        "implementationId": "pack-power-boundary",
        "url": "https://lemonergy.com/learn/glossary/blocks/pack-power-boundary/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/pack-power-boundary/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "pack-power-boundary",
          "namespace": "physical",
          "slug": "pack-power-boundary",
          "canonicalSlug": "pack-power-boundary",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "pack-power-boundary",
            "name": "SOC and temperature limited signed power boundary",
            "domain": "electrical",
            "family": "controller-power",
            "operation": "Requests signed terminal power while applying supplied SOC, temperature, current and permission limits; unmet power is recorded.",
            "mechanism": [
              "Signed power and battery state",
              "SOC and thermal limits",
              "Limited terminal current"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "electrothermal-battery",
                "label": "Independent electrothermal battery"
              },
              {
                "type": "source-converter",
                "label": "Average bidirectional source converter"
              }
            ],
            "symbol": [
              {
                "tag": "rect",
                "attrs": {
                  "x": 60,
                  "y": 10,
                  "width": 80,
                  "height": 60,
                  "rx": 3
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H60M140 40H190M80 55V25H95M105 55V25H120"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Signed power and battery state",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Signed power and battery state is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "soc",
                "label": "State of charge",
                "quantity": "fraction",
                "unit": "fraction",
                "active": true,
                "summary": "State of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "temperature",
                "label": "Battery temperature",
                "quantity": "temperature",
                "unit": "K",
                "active": true,
                "summary": "Battery temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "permit",
                "label": "Operating permission",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Operating permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "requestedPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "requested Power",
                "unit": "W"
              },
              {
                "id": "deliveredPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "delivered Power",
                "unit": "W"
              },
              {
                "id": "availableDischargePower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "available Discharge Power",
                "unit": "W"
              },
              {
                "id": "availableChargePower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "available Charge Power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "powerW",
                "default": 1000,
                "unit": "W: positive discharge, negative charge",
                "min": -1000000000,
                "max": 1000000000,
                "value": 1000
              },
              {
                "id": "capacityAh",
                "default": 100,
                "unit": "Ah effective",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "minimumSoc",
                "default": 0.05,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.05
              },
              {
                "id": "maximumSoc",
                "default": 0.95,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.95
              },
              {
                "id": "maxDischargeA",
                "default": 500,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 500
              },
              {
                "id": "maxChargeA",
                "default": 200,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 200
              },
              {
                "id": "minimumVoltageV",
                "default": 150,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 150
              },
              {
                "id": "minTemperatureK",
                "default": 233.15,
                "unit": "K",
                "min": 1,
                "max": 2000,
                "value": 233.15
              },
              {
                "id": "maxTemperatureK",
                "default": 333.15,
                "unit": "K legacy discharge bound",
                "min": 1,
                "max": 2000,
                "value": 333.15
              },
              {
                "id": "minChargeTemperatureK",
                "default": 273.15,
                "unit": "K authored charge bound",
                "min": 1,
                "max": 2000,
                "value": 273.15
              },
              {
                "id": "maxChargeTemperatureK",
                "default": 318.15,
                "unit": "K authored charge bound",
                "min": 1,
                "max": 2000,
                "value": 318.15
              },
              {
                "id": "minDischargeTemperatureK",
                "default": 233.15,
                "unit": "K authored discharge bound",
                "min": 1,
                "max": 2000,
                "value": 233.15
              },
              {
                "id": "maxDischargeTemperatureK",
                "default": 333.15,
                "unit": "K authored discharge bound",
                "min": 1,
                "max": 2000,
                "value": 333.15
              },
              {
                "id": "temperatureDeratingK",
                "default": 5,
                "unit": "K taper width",
                "min": 0.001,
                "max": 100,
                "value": 5
              },
              {
                "id": "barrierTimeS",
                "default": 1,
                "unit": "s",
                "min": 1e-06,
                "max": 1000000000,
                "value": 1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:passive-supervision-interface",
      "type": "Block",
      "label": "Passive cell supervision interface",
      "properties": {
        "id": "passive-supervision-interface",
        "name": "Passive cell supervision interface",
        "kind": "studio",
        "summary": "Commanded cell current sink and terminal measurements; an abstract simulated interface, no hardware I/O driver.",
        "behavior": "Commanded cell current sink and terminal measurements; an abstract simulated interface, no hardware I/O driver. The terminal current participates directly in Kirchhoff current balance and changes the connected battery state. Measurements are solved with the physical network.",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V / A",
            "description": "Electrical conserving connection. Across variables are shared at a node; through flows balance."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V / A",
            "description": "Electrical conserving connection. Across variables are shared at a node; through flows balance."
          },
          {
            "name": "discharge",
            "direction": "input",
            "unit": "A",
            "description": "Optional typed command; otherwise the configured default is used. For balancing, currentN addresses the corresponding circuit."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Observed voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Observed current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Observed power."
          }
        ],
        "parameters": [
          {
            "key": "dischargeCurrentA",
            "label": "Default discharge current",
            "unit": "A",
            "default": 0,
            "min": 0,
            "max": 1000000,
            "description": "Default discharge current. Numerical bounds are model-validation limits, not physical operating ratings."
          }
        ],
        "equations": [
          "I = max(0, dischargeRequest)",
          "P = terminalVoltage*I"
        ],
        "example": {
          "title": "Passive cell supervision interface worked example",
          "text": "The bundled model draws 0.2 A from a 4 V cell with 0.1 Ω resistance. Terminal voltage is 3.98 V and interface power is 0.796 W. For its 1 Ah cell, SOC decreases by 0.2/3600 after one second.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-passive-supervision-interface",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "current",
              "label": "Interface current",
              "atS": 1,
              "value": 0.2,
              "unit": "A",
              "tolerance": 1e-06
            },
            {
              "port": "voltage",
              "label": "Terminal voltage",
              "atS": 1,
              "value": 3.98,
              "unit": "V",
              "tolerance": 1e-06
            },
            {
              "port": "power",
              "label": "Interface power",
              "atS": 1,
              "value": 0.796,
              "unit": "W",
              "tolerance": 1e-06
            }
          ],
          "inputs": [
            {
              "port": "discharge",
              "label": "Discharge command",
              "value": 0.2,
              "unit": "A"
            }
          ]
        },
        "limits": [
          "This is a simulated electrical interface without a target-hardware driver. SOC and temperature pass-throughs, diagnostic mode flags and hardware-specific communication are outside this interface."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "ti-bms"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-passive-supervision-interface"
        ],
        "type": "passive-supervision-interface",
        "implementationId": "passive-supervision-interface",
        "url": "https://lemonergy.com/learn/glossary/blocks/passive-supervision-interface/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/passive-supervision-interface/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-passive-supervision-interface"
          ]
        },
        "studioHelp": {
          "type": "passive-supervision-interface",
          "namespace": "physical",
          "slug": "passive-supervision-interface",
          "canonicalSlug": "passive-supervision-interface",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "passive-supervision-interface",
            "name": "Passive cell supervision interface",
            "domain": "electrical",
            "family": "current-source",
            "operation": "Draws a commanded nonnegative discharge current and exposes terminal measurements; it represents a simulated supervision interface.",
            "mechanism": [
              "Discharge command",
              "Current sink",
              "Terminal measurements"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "active-supervision-interface",
                "label": "Active cell supervision interface"
              },
              {
                "type": "battery-ocv",
                "label": "Battery with SOC-dependent OCV"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 32
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H68M132 40H190M80 40H120L110 30M120 40L110 50"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "discharge",
                "label": "Discharge current",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Discharge current is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "dischargeCurrentA",
                "default": 0,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:power-load",
      "type": "Block",
      "label": "Limited P/V electrical load",
      "properties": {
        "id": "power-load",
        "kind": "studio",
        "name": "Limited P/V electrical load",
        "summary": "Draws current from a requested electrical power, with a voltage floor and a current limit.",
        "behavior": "Draws current from a requested electrical power, with a voltage floor and a current limit.",
        "documentationSlug": "power-load",
        "referenceOnly": true,
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Positive voltage-reference terminal"
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Negative voltage-reference terminal"
          },
          {
            "name": "Power request",
            "direction": "input",
            "unit": "W",
            "description": "Power request is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Directed output available to compatible consumers: current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: power."
          },
          {
            "name": "requested Power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: requested Power."
          }
        ],
        "parameters": [
          {
            "key": "powerW",
            "label": "powerW",
            "unit": "W",
            "default": 100,
            "description": "Declared authoring field: powerW.",
            "min": 0,
            "max": 1000000000
          },
          {
            "key": "minimumVoltageV",
            "label": "minimumVoltageV",
            "unit": "V",
            "default": 1,
            "description": "Declared authoring field: minimumVoltageV.",
            "min": 1e-06,
            "max": 1000000
          },
          {
            "key": "currentLimitA",
            "label": "currentLimitA",
            "unit": "A",
            "default": 100,
            "description": "Declared authoring field: currentLimitA.",
            "min": 0,
            "max": 1000000
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "power-load",
        "implementationId": "power-load",
        "url": "https://lemonergy.com/learn/glossary/blocks/power-load/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/power-load/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "power-load",
          "namespace": "physical",
          "slug": "power-load",
          "canonicalSlug": "power-load",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "power-load",
            "name": "Limited P/V electrical load",
            "domain": "electrical",
            "family": "resistance",
            "operation": "Draws current from a requested electrical power, with a voltage floor and a current limit.",
            "mechanism": [
              "Power request",
              "P / V with limits",
              "Current demand"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "battery-source",
                "label": "Battery: resistance and charge state"
              },
              {
                "type": "current-sensor",
                "label": "Current sensor / signal adapter"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H40L50 20L70 60L90 20L110 60L130 20L150 60L160 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Power request",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Power request is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "requestedPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "requested Power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "powerW",
                "default": 100,
                "unit": "W",
                "min": 0,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "minimumVoltageV",
                "default": 1,
                "unit": "V",
                "min": 1e-06,
                "max": 1000000,
                "value": 1
              },
              {
                "id": "currentLimitA",
                "default": 100,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 100
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:regulated-charger",
      "type": "Block",
      "label": "Regulated CC/CV charger",
      "properties": {
        "id": "regulated-charger",
        "name": "Regulated CC/CV charger",
        "kind": "studio",
        "summary": "Original sampled CC/CV controller coupled to an ideal electrical converter.",
        "behavior": "A trigger rising edge starts or rearms charging. The controller can enter precharge, constant current, constant voltage, completion, inhibition, or lead-acid float. Completion requires current below the cutoff while at the voltage ceiling for the cutoff dwell. A held trigger does not restart a completed charge.",
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "trigger",
            "direction": "input",
            "unit": "dimensionless",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "dimensionless",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "currentLimit",
            "direction": "input",
            "unit": "A",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "powerLimit",
            "direction": "input",
            "unit": "W",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "bmsPermit",
            "direction": "input",
            "unit": "dimensionless",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "temperature",
            "direction": "input",
            "unit": "K",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "price",
            "direction": "input",
            "unit": "currency/kWh",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "soc",
            "direction": "input",
            "unit": "fraction",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "connected",
            "direction": "input",
            "unit": "dimensionless",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "state",
            "direction": "output",
            "unit": "code",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "reason",
            "direction": "output",
            "unit": "code",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "complete",
            "direction": "output",
            "unit": "0 or 1",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "chargeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "gridPower",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample Time S",
            "unit": "s",
            "default": 1,
            "min": 0.001,
            "max": 3600,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "currentA",
            "label": "Current A",
            "unit": "A",
            "default": 32,
            "min": 0.001,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "voltageV",
            "label": "Voltage V",
            "unit": "V",
            "default": 420,
            "min": 0.01,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "cutoffCurrentA",
            "label": "Cutoff Current A",
            "unit": "A",
            "default": 2,
            "min": 0,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "cutoffHoldS",
            "label": "Cutoff Hold S",
            "unit": "s",
            "default": 30,
            "min": 0,
            "max": 86400,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "prechargeVoltageV",
            "label": "Precharge Voltage V",
            "unit": "V",
            "default": 300,
            "min": 0,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "prechargeCurrentA",
            "label": "Precharge Current A",
            "unit": "A",
            "default": 3,
            "min": 0.001,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "minimumVoltageV",
            "label": "Minimum Voltage V",
            "unit": "V",
            "default": 250,
            "min": 0,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "floatVoltageV",
            "label": "Float Voltage V",
            "unit": "V",
            "default": 405,
            "min": 0.01,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "efficiency",
            "label": "Efficiency",
            "unit": "fraction",
            "default": 0.95,
            "min": 0.01,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "chemistry",
            "label": "Chemistry",
            "unit": "0 Li-ion, 1 lead-acid",
            "default": 0,
            "min": 0,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "minTemperatureK",
            "label": "Min Temperature K",
            "unit": "K",
            "default": 273.15,
            "min": 1,
            "max": 1000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "maxTemperatureK",
            "label": "Max Temperature K",
            "unit": "K",
            "default": 318.15,
            "min": 1,
            "max": 1000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "capacityAh",
            "label": "Capacity Ah",
            "unit": "Ah for SOC barrier",
            "default": 100,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "boundaryTimeS",
            "label": "Boundary Time S",
            "unit": "s for SOC boundary barrier",
            "default": 1,
            "min": 0.001,
            "max": 3600,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          }
        ],
        "equations": [
          "P_grid = P_delivered / eta",
          "P_loss = P_grid - P_delivered",
          "I_SOC_cap = max(0, 1 - SOC) * 3600 * Q_Ah / boundaryTimeS"
        ],
        "example": {
          "title": "Build CC–CV charging",
          "text": "An illustrative 100 Ah battery with a 420 V ceiling can use a 32 A cap. At the ceiling, current falls as OCV rises.",
          "url": "https://design.lemonergy.com/cosim.html?example=charging-home",
          "label": "Open the Studio example"
        },
        "limits": [
          "The battery uses linear OCV and fixed resistance. It does not automatically add aging, thermal dynamics or balancing.",
          "Internal model SOC is not an estimate of an unknown physical battery. OCV is linear and resistance fixed.",
          "A loss signal is not a predicted temperature. This network takes external temperature.",
          "This is deterministic policy comparison, not a forecast or economic optimum.",
          "Downstream unused capacity is not silently redistributed.",
          "All battery and converter limits still apply. A schedule is not an electrochemical law.",
          "These effective parameters are not a recipe. Lithium-ion does not use indefinite trickle or lead-acid float."
        ],
        "evidence": [
          "js/charging-control.js",
          "js/charging-scenarios.js",
          "docs/CHARGING_BLOCKS_SPEC.md",
          "js/physical-network.js",
          "rust-core/src/charging_control.rs"
        ],
        "caseIds": [
          "cccv",
          "ocv-charge-balance",
          "loss-accounting",
          "home-schedule",
          "depot-allocation",
          "opportunity-window",
          "low-current-maintenance"
        ],
        "type": "regulated-charger",
        "implementationId": "regulated-charger",
        "url": "https://lemonergy.com/learn/glossary/blocks/regulated-charger/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/regulated-charger/",
        "sourceFile": "block-library.json",
        "sourceRepository": "battery-design",
        "sourceRevision": "ef9802329b75bc15bb96885f8ed5d49425106696",
        "reviewed": "2026-10-27",
        "studioHelp": {
          "type": "regulated-charger",
          "namespace": "physical",
          "slug": "regulated-charger",
          "canonicalSlug": "regulated-charger",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "regulated-charger",
            "name": "Regulated CC/CV charger",
            "domain": "electrical",
            "family": "controller-power",
            "operation": "Regulates charging current or voltage under sampled enable, temperature, power and battery-protection limits.",
            "mechanism": [
              "Permission and limits",
              "CC / CV regulation",
              "Battery charging"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "charging-policy",
                "label": "Charging schedule and target policy"
              },
              {
                "type": "battery-ocv",
                "label": "Battery with SOC-dependent OCV"
              }
            ],
            "symbol": [
              {
                "tag": "rect",
                "attrs": {
                  "x": 60,
                  "y": 10,
                  "width": 80,
                  "height": 60,
                  "rx": 3
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H60M140 40H190M80 55V25H95M105 55V25H120"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "trigger",
                "label": "Regulator trigger",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Regulator trigger is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Enable is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "currentLimit",
                "label": "Current limit",
                "quantity": "current",
                "unit": "A",
                "active": true,
                "summary": "Current limit is a directed current input to this component, expressed in A. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "powerLimit",
                "label": "Power limit",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Power limit is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "bmsPermit",
                "label": "Battery protection permission",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Battery protection permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "temperature",
                "label": "Battery temperature",
                "quantity": "temperature",
                "unit": "K",
                "active": true,
                "summary": "Battery temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "price",
                "label": "Energy price",
                "quantity": "dimensionless",
                "unit": "currency/kWh (dimensionless signal)",
                "active": true,
                "summary": "Energy price is a directed dimensionless input to this component, expressed in currency/kWh (dimensionless signal). Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "soc",
                "label": "State of charge",
                "quantity": "fraction",
                "unit": "fraction",
                "active": true,
                "summary": "State of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "connected",
                "label": "Connection status",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Connection status is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "state",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "state",
                "unit": "1"
              },
              {
                "id": "reason",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "reason",
                "unit": "1"
              },
              {
                "id": "complete",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "complete",
                "unit": "1"
              },
              {
                "id": "chargeCurrent",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "charge Current",
                "unit": "A"
              },
              {
                "id": "gridPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "grid Power",
                "unit": "W"
              },
              {
                "id": "loss",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "loss",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "sampleTimeS",
                "default": 1,
                "unit": "s",
                "min": 0.001,
                "max": 3600,
                "value": 1
              },
              {
                "id": "currentA",
                "default": 32,
                "unit": "A",
                "min": 0.001,
                "max": 1000000,
                "value": 32
              },
              {
                "id": "voltageV",
                "default": 420,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 420
              },
              {
                "id": "cutoffCurrentA",
                "default": 2,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 2
              },
              {
                "id": "cutoffHoldS",
                "default": 30,
                "unit": "s",
                "min": 0,
                "max": 86400,
                "value": 30
              },
              {
                "id": "prechargeVoltageV",
                "default": 300,
                "unit": "V",
                "min": 0,
                "max": 1000000,
                "value": 300
              },
              {
                "id": "prechargeCurrentA",
                "default": 3,
                "unit": "A",
                "min": 0.001,
                "max": 1000000,
                "value": 3
              },
              {
                "id": "minimumVoltageV",
                "default": 250,
                "unit": "V",
                "min": 0,
                "max": 1000000,
                "value": 250
              },
              {
                "id": "floatVoltageV",
                "default": 405,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 405
              },
              {
                "id": "efficiency",
                "default": 0.95,
                "unit": "fraction",
                "min": 0.01,
                "max": 1,
                "value": 0.95
              },
              {
                "id": "chemistry",
                "default": 0,
                "unit": "0 Li-ion, 1 lead-acid",
                "min": 0,
                "max": 1,
                "value": 0
              },
              {
                "id": "minTemperatureK",
                "default": 273.15,
                "unit": "K",
                "min": 1,
                "max": 1000,
                "value": 273.15
              },
              {
                "id": "maxTemperatureK",
                "default": 318.15,
                "unit": "K",
                "min": 1,
                "max": 1000,
                "value": 318.15
              },
              {
                "id": "capacityAh",
                "default": 100,
                "unit": "Ah for SOC barrier",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "boundaryTimeS",
                "default": 1,
                "unit": "s for SOC boundary barrier",
                "min": 0.001,
                "max": 3600,
                "value": 1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:resistor",
      "type": "Block",
      "label": "Resistor",
      "properties": {
        "id": "resistor",
        "name": "Resistor",
        "kind": "studio",
        "summary": "An ideal linear resistance in a conserving electrical circuit.",
        "behavior": "Terminal voltage drives branch current through the configured resistance. Voltage is p minus n; positive current enters p.",
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          }
        ],
        "parameters": [
          {
            "key": "resistanceOhm",
            "label": "Resistance Ohm",
            "unit": "ohm",
            "default": 1,
            "min": 1e-09,
            "max": 1000000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          }
        ],
        "equations": [
          "I = (V_p - V_n) / R"
        ],
        "example": {
          "title": "Relate current and voltage",
          "text": "A 1 V drop across 2 Ω implies 0.5 A.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-rc",
          "label": "Open the electrical circuit"
        },
        "limits": [
          "The RC example includes a capacitor: transient current varies and source voltage is not always resistor voltage.",
          "This generic circuit does not identify cell parameters from measurements."
        ],
        "evidence": [
          "js/physical-network.js",
          "js/studio-examples.js"
        ],
        "caseIds": [
          "ohm-circuit",
          "rc-response"
        ],
        "type": "resistor",
        "implementationId": "resistor",
        "url": "https://lemonergy.com/learn/glossary/blocks/resistor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/resistor/",
        "sourceFile": "block-library.json",
        "sourceRepository": "battery-design",
        "sourceRevision": "ef9802329b75bc15bb96885f8ed5d49425106696",
        "reviewed": "2026-10-27",
        "studioHelp": {
          "type": "resistor",
          "namespace": "physical",
          "slug": "resistor",
          "canonicalSlug": "resistor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "resistor",
            "name": "Resistor",
            "domain": "electrical",
            "family": "resistance",
            "operation": "A voltage difference drives a proportional current through a resistance, dissipating electrical power.",
            "mechanism": [
              "Voltage difference",
              "Resistance",
              "Current and dissipation"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "voltage-source",
                "label": "Controlled voltage source"
              },
              {
                "type": "electrothermal-resistor",
                "label": "Electrothermal resistor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H40L50 20L70 60L90 20L110 60L130 20L150 60L160 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "resistanceOhm",
                "default": 1,
                "unit": "ohm",
                "min": 1e-09,
                "max": 1000000000000,
                "value": 1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:rotational-converter",
      "type": "Block",
      "label": "Ideal rotational motor coupler",
      "properties": {
        "id": "rotational-converter",
        "name": "Ideal rotational motor coupler",
        "kind": "studio",
        "summary": "Lossless back-emf/torque conversion; no winding resistance, friction or electromagnetic storage",
        "behavior": "Conserving component solved simultaneously with the connected network. Lossless back-emf/torque conversion; no winding resistance, friction or electromagnetic storage",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "a",
            "direction": "terminal",
            "unit": "rad/s; N m",
            "description": "rotational conserving connection; shared mechanical position or speed with balanced effort."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "rad/s; N m",
            "description": "rotational conserving connection; shared mechanical position or speed with balanced effort."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "mechanicalPower",
            "direction": "output",
            "unit": "W",
            "description": "Recorded mechanicalPower measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "constant",
            "label": "Conversion constant",
            "unit": "V s/rad = N m/A",
            "default": 0.1,
            "description": "The same constant relates motion to back-emf and current to mechanical effort.",
            "min": 1e-09,
            "max": 1000000
          }
        ],
        "equations": [
          "V = K (ωa − ωb)",
          "τ = K I",
          "V I = τ (ωa − ωb)"
        ],
        "example": {
          "title": "Ideal rotational motor coupler worked example",
          "text": "Editable first-party network. target: constant=2; supply: currentA=1. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-rotational-converter",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "constant",
              "label": "Conversion constant",
              "value": 2,
              "unit": "V s/rad = N m/A"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 1,
              "unit": "A",
              "tolerance": 1e-06
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 4,
              "unit": "V",
              "tolerance": 3.999999999998847e-06
            },
            {
              "port": "target/mechanicalPower",
              "label": "mechanicalPower",
              "atS": 1,
              "value": 4,
              "unit": "W",
              "tolerance": 3.999999999998847e-06
            }
          ]
        },
        "limits": [
          "Lossless back-emf/torque conversion; no winding resistance, friction or electromagnetic storage",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-rotational-converter"
        ],
        "type": "rotational-converter",
        "implementationId": "rotational-converter",
        "url": "https://lemonergy.com/learn/glossary/blocks/rotational-converter/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/rotational-converter/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-rotational-converter"
          ]
        },
        "studioHelp": {
          "type": "rotational-converter",
          "namespace": "physical",
          "slug": "rotational-converter",
          "canonicalSlug": "rotational-converter",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "rotational-converter",
            "name": "Ideal rotational motor coupler",
            "domain": "electrical",
            "family": "converter",
            "operation": "Losslessly couples electrical voltage/current to relative shaft speed/torque through its conversion constant.",
            "mechanism": [
              "Electrical port",
              "Back EMF and torque",
              "Rotational port"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "a",
                "domain": "rotational",
                "kind": "conserving",
                "label": "Shaft side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "rotational",
                "kind": "conserving",
                "label": "Shaft side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "dc-motor",
                "label": "DC motor with shaft coupling"
              },
              {
                "type": "shaft-inertia",
                "label": "Shaft inertia"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 70,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 135,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "mechanicalPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "mechanical Power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "constant",
                "default": 0.1,
                "unit": "V s/rad = N m/A",
                "min": 1e-09,
                "max": 1000000,
                "value": 0.1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:source-converter",
      "type": "Block",
      "label": "Average bidirectional source converter",
      "properties": {
        "id": "source-converter",
        "kind": "studio",
        "name": "Average bidirectional source converter",
        "summary": "Transfers average power between source p/n and bus s/t with signed direction, current limits and conversion losses delivered to its heat contact.",
        "behavior": "Transfers average power between source p/n and bus s/t with signed direction, current limits and conversion losses delivered to its heat contact.",
        "documentationSlug": "source-converter",
        "referenceOnly": true,
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Positive voltage-reference terminal"
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Negative voltage-reference terminal"
          },
          {
            "name": "s",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Bus positive voltage-reference terminal"
          },
          {
            "name": "t",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Bus negative voltage-reference terminal"
          },
          {
            "name": "h",
            "direction": "conserving",
            "unit": "thermal",
            "description": "Conversion-loss thermal contact"
          },
          {
            "name": "Source and bus terminals",
            "direction": "input",
            "unit": "W",
            "description": "Source and bus terminals is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "Operating permission",
            "direction": "input",
            "unit": "1",
            "description": "Operating permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: voltage."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Directed output available to compatible consumers: current."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: power."
          },
          {
            "name": "source Power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: source Power."
          },
          {
            "name": "bus Power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: bus Power."
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: loss."
          },
          {
            "name": "bus Current",
            "direction": "output",
            "unit": "A",
            "description": "Directed output available to compatible consumers: bus Current."
          }
        ],
        "parameters": [
          {
            "key": "powerW",
            "label": "powerW",
            "unit": "W source to bus; negative reverse",
            "default": 1000,
            "description": "Declared authoring field: powerW.",
            "min": -1000000000,
            "max": 1000000000
          },
          {
            "key": "forwardEfficiency",
            "label": "forwardEfficiency",
            "unit": "fraction",
            "default": 0.95,
            "description": "Declared authoring field: forwardEfficiency.",
            "min": 0.01,
            "max": 1
          },
          {
            "key": "reverseEfficiency",
            "label": "reverseEfficiency",
            "unit": "fraction",
            "default": 0.95,
            "description": "Declared authoring field: reverseEfficiency.",
            "min": 0.01,
            "max": 1
          },
          {
            "key": "maxPowerW",
            "label": "maxPowerW",
            "unit": "W",
            "default": 100000,
            "description": "Declared authoring field: maxPowerW.",
            "min": 0,
            "max": 1000000000
          },
          {
            "key": "maxSourceA",
            "label": "maxSourceA",
            "unit": "A",
            "default": 500,
            "description": "Declared authoring field: maxSourceA.",
            "min": 0,
            "max": 1000000
          },
          {
            "key": "maxBusA",
            "label": "maxBusA",
            "unit": "A",
            "default": 500,
            "description": "Declared authoring field: maxBusA.",
            "min": 0,
            "max": 1000000
          },
          {
            "key": "minimumVoltageV",
            "label": "minimumVoltageV",
            "unit": "V",
            "default": 10,
            "description": "Declared authoring field: minimumVoltageV.",
            "min": 0.01,
            "max": 1000000
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "source-converter",
        "implementationId": "source-converter",
        "url": "https://lemonergy.com/learn/glossary/blocks/source-converter/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/source-converter/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "source-converter",
          "namespace": "physical",
          "slug": "source-converter",
          "canonicalSlug": "source-converter",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "source-converter",
            "name": "Average bidirectional source converter",
            "domain": "electrical",
            "family": "converter",
            "operation": "Transfers average power between source p/n and bus s/t with signed direction, current limits and conversion losses delivered to its heat contact.",
            "mechanism": [
              "Source and bus terminals",
              "Bidirectional power limits",
              "Bus power and conversion heat"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "s",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Bus positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "t",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Bus negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "h",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Conversion-loss thermal contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "electrothermal-battery",
                "label": "Independent electrothermal battery"
              },
              {
                "type": "pack-power-boundary",
                "label": "SOC and temperature limited signed power boundary"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 70,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 135,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Source and bus terminals",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Source and bus terminals is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "permit",
                "label": "Operating permission",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Operating permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "sourcePower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "source Power",
                "unit": "W"
              },
              {
                "id": "busPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "bus Power",
                "unit": "W"
              },
              {
                "id": "loss",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "loss",
                "unit": "W"
              },
              {
                "id": "busCurrent",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "bus Current",
                "unit": "A"
              }
            ],
            "parameters": [
              {
                "id": "powerW",
                "default": 1000,
                "unit": "W source to bus; negative reverse",
                "min": -1000000000,
                "max": 1000000000,
                "value": 1000
              },
              {
                "id": "forwardEfficiency",
                "default": 0.95,
                "unit": "fraction",
                "min": 0.01,
                "max": 1,
                "value": 0.95
              },
              {
                "id": "reverseEfficiency",
                "default": 0.95,
                "unit": "fraction",
                "min": 0.01,
                "max": 1,
                "value": 0.95
              },
              {
                "id": "maxPowerW",
                "default": 100000,
                "unit": "W",
                "min": 0,
                "max": 1000000000,
                "value": 100000
              },
              {
                "id": "maxSourceA",
                "default": 500,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 500
              },
              {
                "id": "maxBusA",
                "default": 500,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 500
              },
              {
                "id": "minimumVoltageV",
                "default": 10,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 10
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:transconductance-source",
      "type": "Block",
      "label": "Voltage-controlled current source",
      "properties": {
        "id": "transconductance-source",
        "name": "Voltage-controlled current source",
        "kind": "studio",
        "summary": "Ideal externally powered controlled source with nonloading voltage sense",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal externally powered controlled source with nonloading voltage sense",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "cp",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "cn",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Recorded power measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "gain",
            "label": "Gain",
            "unit": "A/V",
            "default": 1,
            "description": "Multiplier from the sensed input to the declared output quantity.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "Iout = gain × (Vcp − Vcn)",
          "Icp = Icn = 0"
        ],
        "example": {
          "title": "Voltage-controlled current source worked example",
          "text": "Editable first-party network. supply: voltageV=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-transconductance-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "gain",
              "label": "Gain",
              "value": 1,
              "unit": "A/V"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 1,
              "unit": "A",
              "tolerance": 9.999999999999997e-07
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": -4,
              "unit": "V",
              "tolerance": 4e-06
            },
            {
              "port": "target/power",
              "label": "power",
              "atS": 1,
              "value": -4,
              "unit": "W",
              "tolerance": 3.99999999997058e-06
            }
          ]
        },
        "limits": [
          "Ideal externally powered controlled source with nonloading voltage sense",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-transconductance-source"
        ],
        "type": "transconductance-source",
        "implementationId": "transconductance-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/transconductance-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/transconductance-source/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-transconductance-source"
          ]
        },
        "studioHelp": {
          "type": "transconductance-source",
          "namespace": "physical",
          "slug": "transconductance-source",
          "canonicalSlug": "transconductance-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "transconductance-source",
            "name": "Voltage-controlled current source",
            "domain": "electrical",
            "family": "amplifier",
            "operation": "Imposes an output current proportional to a nonloading control voltage. This ideal controlled source has an implicit external power supply.",
            "mechanism": [
              "Control voltage",
              "Transconductance",
              "Output current"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "cp",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Control branch positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "cn",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Control branch negative terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "operational-amplifier",
                "label": "Finite-gain operational amplifier"
              },
              {
                "type": "current-sensor",
                "label": "Current sensor / signal adapter"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M60 10L150 40L60 70Z M10 25H60M10 55H60M150 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "gain",
                "default": 1,
                "unit": "A/V",
                "min": -1000000,
                "max": 1000000,
                "value": 1
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:transresistance-source",
      "type": "Block",
      "label": "Current-controlled voltage source",
      "properties": {
        "id": "transresistance-source",
        "name": "Current-controlled voltage source",
        "kind": "studio",
        "summary": "Ideal zero-drop control-current branch and externally powered output",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal zero-drop control-current branch and externally powered output",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "cp",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "cn",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "controlCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Recorded controlCurrent measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "gain",
            "label": "Gain",
            "unit": "V/A",
            "default": 2,
            "description": "Multiplier from the sensed input to the declared output quantity.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "Vout = gain × Icontrol",
          "Vcontrol = 0"
        ],
        "example": {
          "title": "Current-controlled voltage source worked example",
          "text": "Editable first-party network. supply: currentA=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-transresistance-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "gain",
              "label": "Gain",
              "value": 2,
              "unit": "V/A"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": -0.5,
              "unit": "A",
              "tolerance": 5e-07
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 2,
              "unit": "V",
              "tolerance": 2e-06
            },
            {
              "port": "target/controlCurrent",
              "label": "controlCurrent",
              "atS": 1,
              "value": 1,
              "unit": "A",
              "tolerance": 1e-06
            }
          ]
        },
        "limits": [
          "Ideal zero-drop control-current branch and externally powered output",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-transresistance-source"
        ],
        "type": "transresistance-source",
        "implementationId": "transresistance-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/transresistance-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/transresistance-source/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-transresistance-source"
          ]
        },
        "studioHelp": {
          "type": "transresistance-source",
          "namespace": "physical",
          "slug": "transresistance-source",
          "canonicalSlug": "transresistance-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "transresistance-source",
            "name": "Current-controlled voltage source",
            "domain": "electrical",
            "family": "amplifier",
            "operation": "Imposes output voltage proportional to current through its zero-voltage-drop control branch. This ideal controlled source has an implicit external power supply.",
            "mechanism": [
              "Control current",
              "Transresistance",
              "Output voltage"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "cp",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Control branch positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "cn",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Control branch negative terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "operational-amplifier",
                "label": "Finite-gain operational amplifier"
              },
              {
                "type": "current-sensor",
                "label": "Current sensor / signal adapter"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M60 10L150 40L60 70Z M10 25H60M10 55H60M150 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "gain",
                "default": 2,
                "unit": "V/A",
                "min": -1000000,
                "max": 1000000,
                "value": 2
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:v2v-converter",
      "type": "Block",
      "label": "Conserving vehicle-to-vehicle converter",
      "properties": {
        "id": "v2v-converter",
        "name": "Conserving vehicle-to-vehicle converter",
        "kind": "studio",
        "summary": "One conserving converter linking donor and recipient electrical islands.",
        "behavior": "The donor supplies the recipient power and converter losses. Donor reserve, recipient target, voltage envelopes, current limits, permissions and temperature signals limit transfer together. Both islands require an electrical reference.",
        "ports": [
          {
            "name": "donorP",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "donorN",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "recipientP",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "recipientN",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "command",
            "direction": "input",
            "unit": "W",
            "description": "Requested power; this does not bypass voltage, current, SOC or permission limits."
          },
          {
            "name": "donorSoc",
            "direction": "input",
            "unit": "fraction",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "recipientSoc",
            "direction": "input",
            "unit": "fraction",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "dimensionless",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "donorBmsPermit",
            "direction": "input",
            "unit": "dimensionless",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "recipientBmsPermit",
            "direction": "input",
            "unit": "dimensionless",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "donorTemperature",
            "direction": "input",
            "unit": "K",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "recipientTemperature",
            "direction": "input",
            "unit": "K",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "donorPower",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "recipientPower",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "donorCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "recipientCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "donorVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "recipientVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "allowed",
            "direction": "output",
            "unit": "0 or 1",
            "description": "Observed result from the solved component or sampled controller."
          }
        ],
        "parameters": [
          {
            "key": "powerW",
            "label": "Power W",
            "unit": "W recipient DC",
            "default": 3000,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "donorCapacityAh",
            "label": "Donor Capacity Ah",
            "unit": "Ah",
            "default": 100,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "recipientCapacityAh",
            "label": "Recipient Capacity Ah",
            "unit": "Ah",
            "default": 100,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "donorReserveSoc",
            "label": "Donor Reserve Soc",
            "unit": "fraction",
            "default": 0.2,
            "min": 0,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "recipientTargetSoc",
            "label": "Recipient Target Soc",
            "unit": "fraction",
            "default": 0.8,
            "min": 0,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "donorMinimumVoltageV",
            "label": "Donor Minimum Voltage V",
            "unit": "V",
            "default": 250,
            "min": 0.01,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "donorVoltageDroopOhm",
            "label": "Donor Voltage Droop Ohm",
            "unit": "ohm near minimum-voltage envelope",
            "default": 0.01,
            "min": 1e-06,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "recipientVoltageLimitV",
            "label": "Recipient Voltage Limit V",
            "unit": "V",
            "default": 420,
            "min": 0.01,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "donorCurrentA",
            "label": "Donor Current A",
            "unit": "A",
            "default": 32,
            "min": 0,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "recipientCurrentA",
            "label": "Recipient Current A",
            "unit": "A",
            "default": 32,
            "min": 0,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "efficiency",
            "label": "Efficiency",
            "unit": "fraction",
            "default": 0.9,
            "min": 0.01,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "boundaryTimeS",
            "label": "Boundary Time S",
            "unit": "s",
            "default": 1,
            "min": 0.001,
            "max": 3600,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "minTemperatureK",
            "label": "Min Temperature K",
            "unit": "K",
            "default": 273.15,
            "min": 1,
            "max": 1000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "maxTemperatureK",
            "label": "Max Temperature K",
            "unit": "K",
            "default": 318.15,
            "min": 1,
            "max": 1000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          }
        ],
        "equations": [
          "P_donor = P_recipient / eta",
          "P_loss = P_donor - P_recipient"
        ],
        "example": {
          "title": "Transfer between two batteries",
          "text": "5 kW delivered at 90% efficiency needs about 5.56 kW from the donor and produces about 0.56 kW loss.",
          "url": "https://design.lemonergy.com/cosim.html?example=charging-v2v",
          "label": "Open the Studio example"
        },
        "limits": [
          "The example assumes hardware compatibility; it does not establish connector or communication compatibility."
        ],
        "evidence": [
          "js/charging-control.js",
          "js/charging-scenarios.js",
          "docs/CHARGING_BLOCKS_SPEC.md",
          "js/physical-network.js",
          "rust-core/src/charging_control.rs"
        ],
        "caseIds": [
          "v2v"
        ],
        "type": "v2v-converter",
        "implementationId": "v2v-converter",
        "url": "https://lemonergy.com/learn/glossary/blocks/v2v-converter/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/v2v-converter/",
        "sourceFile": "block-library.json",
        "sourceRepository": "battery-design",
        "sourceRevision": "ef9802329b75bc15bb96885f8ed5d49425106696",
        "reviewed": "2026-10-27",
        "studioHelp": {
          "type": "v2v-converter",
          "namespace": "physical",
          "slug": "v2v-converter",
          "canonicalSlug": "v2v-converter",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "v2v-converter",
            "name": "Conserving vehicle-to-vehicle converter",
            "domain": "electrical",
            "family": "converter",
            "operation": "Transfers power from a donor battery to a recipient, accounting for conversion efficiency and each battery’s limits.",
            "mechanism": [
              "Donor battery",
              "Conversion and protection",
              "Recipient battery"
            ],
            "ports": [
              {
                "id": "donorP",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Donor positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "donorN",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Donor negative terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "recipientP",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Recipient positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "recipientN",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Recipient negative terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "battery-ocv",
                "label": "Battery with SOC-dependent OCV"
              },
              {
                "type": "bidirectional-grid",
                "label": "Bidirectional grid / load interface"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 70,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 135,
                  "cy": 40,
                  "r": 25
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H45M160 40H190M70 30L85 40L70 50M135 30L120 40L135 50"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Donor battery",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Donor battery is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "donorSoc",
                "label": "Donor state of charge",
                "quantity": "fraction",
                "unit": "fraction",
                "active": true,
                "summary": "Donor state of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "recipientSoc",
                "label": "Recipient state of charge",
                "quantity": "fraction",
                "unit": "fraction",
                "active": true,
                "summary": "Recipient state of charge is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Enable is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "donorBmsPermit",
                "label": "Donor protection permission",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Donor protection permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "recipientBmsPermit",
                "label": "Recipient protection permission",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Recipient protection permission is a directed dimensionless input to this component, expressed in 1. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "donorTemperature",
                "label": "Donor temperature",
                "quantity": "temperature",
                "unit": "K",
                "active": true,
                "summary": "Donor temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              },
              {
                "id": "recipientTemperature",
                "label": "Recipient temperature",
                "quantity": "temperature",
                "unit": "K",
                "active": true,
                "summary": "Recipient temperature is a directed temperature input to this component, expressed in K. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "donorPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "donor Power",
                "unit": "W"
              },
              {
                "id": "recipientPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "recipient Power",
                "unit": "W"
              },
              {
                "id": "loss",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "loss",
                "unit": "W"
              },
              {
                "id": "donorCurrent",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "donor Current",
                "unit": "A"
              },
              {
                "id": "recipientCurrent",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "recipient Current",
                "unit": "A"
              },
              {
                "id": "donorVoltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "donor Voltage",
                "unit": "V"
              },
              {
                "id": "recipientVoltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "recipient Voltage",
                "unit": "V"
              },
              {
                "id": "allowed",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "allowed",
                "unit": "1"
              }
            ],
            "parameters": [
              {
                "id": "powerW",
                "default": 3000,
                "unit": "W recipient DC",
                "min": 0,
                "max": 1000000000,
                "value": 3000
              },
              {
                "id": "donorCapacityAh",
                "default": 100,
                "unit": "Ah",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "recipientCapacityAh",
                "default": 100,
                "unit": "Ah",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "donorReserveSoc",
                "default": 0.2,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.2
              },
              {
                "id": "recipientTargetSoc",
                "default": 0.8,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.8
              },
              {
                "id": "donorMinimumVoltageV",
                "default": 250,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 250
              },
              {
                "id": "donorVoltageDroopOhm",
                "default": 0.01,
                "unit": "ohm near minimum-voltage envelope",
                "min": 1e-06,
                "max": 1000000,
                "value": 0.01
              },
              {
                "id": "recipientVoltageLimitV",
                "default": 420,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 420
              },
              {
                "id": "donorCurrentA",
                "default": 32,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 32
              },
              {
                "id": "recipientCurrentA",
                "default": 32,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 32
              },
              {
                "id": "efficiency",
                "default": 0.9,
                "unit": "fraction",
                "min": 0.01,
                "max": 1,
                "value": 0.9
              },
              {
                "id": "boundaryTimeS",
                "default": 1,
                "unit": "s",
                "min": 0.001,
                "max": 3600,
                "value": 1
              },
              {
                "id": "minTemperatureK",
                "default": 273.15,
                "unit": "K",
                "min": 1,
                "max": 1000,
                "value": 273.15
              },
              {
                "id": "maxTemperatureK",
                "default": 318.15,
                "unit": "K",
                "min": 1,
                "max": 1000,
                "value": 318.15
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:variable-gap-capacitor",
      "type": "Block",
      "label": "Electromechanical variable-gap capacitor",
      "properties": {
        "id": "variable-gap-capacitor",
        "name": "Electromechanical variable-gap capacitor",
        "kind": "studio",
        "summary": "Parallel-plate field energy and attractive force; a-minus-b motion closes the gap. No fringing or contact model; gap closure refuses.",
        "behavior": "Conserving component solved simultaneously with the connected network. Parallel-plate field energy and attractive force; a-minus-b motion closes the gap. No fringing or contact model; gap closure refuses.",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "a",
            "direction": "terminal",
            "unit": "m; m/s; N",
            "description": "translational conserving connection; shared mechanical position or speed with balanced effort."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "m; m/s; N",
            "description": "translational conserving connection; shared mechanical position or speed with balanced effort."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "storedEnergy",
            "direction": "output",
            "unit": "J",
            "description": "Recorded stored energy measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "areaM2",
            "label": "Exchange area",
            "unit": "m2",
            "default": 0.01,
            "description": "Area used by the declared heat-transfer or parallel-plate field equation.",
            "min": 1e-12,
            "max": 1000000
          },
          {
            "key": "permittivityFm",
            "label": "Permittivity",
            "unit": "F/m",
            "default": 8.8541878128e-12,
            "description": "Permittivity of the uniform material between the capacitor plates.",
            "min": 1e-15,
            "max": 1
          },
          {
            "key": "initialGapM",
            "label": "Reference plate separation",
            "unit": "m",
            "default": 0.001,
            "description": "Plate separation before relative mechanical displacement is subtracted.",
            "min": 1e-09,
            "max": 1000
          },
          {
            "key": "minimumGapM",
            "label": "Minimum plate separation",
            "unit": "m",
            "default": 1e-06,
            "description": "Separation at which the model refuses further motion because contact is not modeled.",
            "min": 1e-12,
            "max": 1000
          },
          {
            "key": "initialVoltageV",
            "label": "Initial voltage",
            "unit": "V",
            "default": 0,
            "description": "Requested initial electrical voltage for the declared storage or target.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "gap = initial separation − (xa − xb)",
          "C = permittivity × area / gap",
          "V = q/C; I = dq/dt",
          "F = q²/(2 × permittivity × area)"
        ],
        "example": {
          "title": "Electromechanical variable-gap capacitor worked example",
          "text": "Editable first-party network. mass: massKg=0.001; target: initialVoltageV=10. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-variable-gap-capacitor",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "areaM2",
              "label": "Exchange area",
              "value": 0.01,
              "unit": "m2"
            },
            {
              "port": "permittivityFm",
              "label": "Permittivity",
              "value": 8.8541878128e-12,
              "unit": "F/m"
            },
            {
              "port": "initialGapM",
              "label": "Reference plate separation",
              "value": 0.001,
              "unit": "m"
            },
            {
              "port": "minimumGapM",
              "label": "Minimum plate separation",
              "value": 1e-06,
              "unit": "m"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 0.01,
              "value": -1.12103877e-42,
              "unit": "A",
              "tolerance": 1e-10
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 0.01,
              "value": 9.99767578,
              "unit": "V",
              "tolerance": 9.997675775699118e-06
            },
            {
              "port": "target/storedEnergy",
              "label": "storedEnergy",
              "atS": 0.01,
              "value": 4.42606495e-09,
              "unit": "J",
              "tolerance": 1e-10
            }
          ]
        },
        "limits": [
          "Parallel-plate field energy and attractive force; a-minus-b motion closes the gap. No fringing or contact model; gap closure refuses.",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-capacitor",
          "physical-circuit"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-variable-gap-capacitor"
        ],
        "type": "variable-gap-capacitor",
        "implementationId": "variable-gap-capacitor",
        "url": "https://lemonergy.com/learn/glossary/blocks/variable-gap-capacitor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/variable-gap-capacitor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-variable-gap-capacitor"
          ]
        },
        "studioHelp": {
          "type": "variable-gap-capacitor",
          "namespace": "physical",
          "slug": "variable-gap-capacitor",
          "canonicalSlug": "variable-gap-capacitor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "variable-gap-capacitor",
            "name": "Electromechanical variable-gap capacitor",
            "domain": "electrical",
            "family": "capacitor",
            "operation": "Couples stored electric-field energy to attractive mechanical force; relative a-minus-b motion closes the modeled plate gap.",
            "mechanism": [
              "Electrical field",
              "Variable plate gap",
              "Attractive force"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "a",
                "domain": "translational",
                "kind": "conserving",
                "label": "Linear side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "translational",
                "kind": "conserving",
                "label": "Linear side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "capacitor",
                "label": "Capacitor"
              },
              {
                "type": "linear-mass",
                "label": "Translational mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H85M85 10V70M115 10V70M115 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "gap",
                "quantity": "length",
                "declared": true,
                "consumers": [],
                "label": "gap",
                "unit": "m"
              },
              {
                "id": "force",
                "quantity": "force",
                "declared": true,
                "consumers": [],
                "label": "force",
                "unit": "N"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              }
            ],
            "parameters": [
              {
                "id": "areaM2",
                "default": 0.01,
                "unit": "m2",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.01
              },
              {
                "id": "permittivityFm",
                "default": 8.8541878128e-12,
                "unit": "F/m",
                "min": 1e-15,
                "max": 1,
                "value": 8.8541878128e-12
              },
              {
                "id": "initialGapM",
                "default": 0.001,
                "unit": "m",
                "min": 1e-09,
                "max": 1000,
                "value": 0.001
              },
              {
                "id": "minimumGapM",
                "default": 1e-06,
                "unit": "m",
                "min": 1e-12,
                "max": 1000,
                "value": 1e-06
              },
              {
                "id": "initialVoltageV",
                "default": 0,
                "unit": "V",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:variable-resistor",
      "type": "Block",
      "label": "Controlled resistor",
      "properties": {
        "id": "variable-resistor",
        "name": "Controlled resistor",
        "kind": "studio",
        "summary": "Live resistance with declared positive floor and a limited-command diagnostic",
        "behavior": "Conserving component solved simultaneously with the connected network. Live resistance with declared positive floor and a limited-command diagnostic",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "resistance",
            "direction": "output",
            "unit": "ohm",
            "description": "Recorded resistance measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "resistanceOhm",
            "label": "Electrical resistance",
            "unit": "ohm",
            "default": 1,
            "description": "Configured resistance when no external resistance command is connected.",
            "min": 1e-06,
            "max": 1000000000000
          },
          {
            "key": "minimumResistanceOhm",
            "label": "Minimum resistance",
            "unit": "ohm",
            "default": 1e-06,
            "description": "Positive floor applied to the calculated or commanded electrical resistance.",
            "min": 1e-09,
            "max": 1000000000
          }
        ],
        "equations": [
          "R = max(Rcommand, Rmin)",
          "I = V/R"
        ],
        "example": {
          "title": "Controlled resistor worked example",
          "text": "Editable first-party network. supply: voltageV=5. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-variable-resistor",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "resistanceOhm",
              "label": "Electrical resistance",
              "value": 1,
              "unit": "ohm"
            },
            {
              "port": "minimumResistanceOhm",
              "label": "Minimum resistance",
              "value": 1e-06,
              "unit": "ohm"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 5,
              "unit": "A",
              "tolerance": 4.9999999999999996e-06
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 5,
              "unit": "V",
              "tolerance": 4.9999999999999996e-06
            },
            {
              "port": "target/resistance",
              "label": "resistance",
              "atS": 1,
              "value": 1,
              "unit": "ohm",
              "tolerance": 1e-06
            }
          ]
        },
        "limits": [
          "Live resistance with declared positive floor and a limited-command diagnostic",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-variable-resistor"
        ],
        "type": "variable-resistor",
        "implementationId": "variable-resistor",
        "url": "https://lemonergy.com/learn/glossary/blocks/variable-resistor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/variable-resistor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-variable-resistor"
          ]
        },
        "studioHelp": {
          "type": "variable-resistor",
          "namespace": "physical",
          "slug": "variable-resistor",
          "canonicalSlug": "variable-resistor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "variable-resistor",
            "name": "Controlled resistor",
            "domain": "electrical",
            "family": "resistance",
            "operation": "Uses a live resistance command with a positive lower bound to relate voltage and current.",
            "mechanism": [
              "Resistance command",
              "Positive floor",
              "Voltage–current relation"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "resistor",
                "label": "Resistor"
              },
              {
                "type": "electrical-switch",
                "label": "Controlled electrical switch"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H40L50 20L70 60L90 20L110 60L130 20L150 60L160 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "resistance",
                "label": "Resistance command",
                "quantity": "resistance",
                "unit": "Ω",
                "active": true,
                "summary": "Resistance command is a directed resistance input to this component, expressed in Ω. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "resistance",
                "quantity": "resistance",
                "declared": true,
                "consumers": [],
                "label": "resistance",
                "unit": "Ω"
              },
              {
                "id": "limited",
                "quantity": "fraction",
                "declared": true,
                "consumers": [],
                "label": "limited",
                "unit": "fraction"
              }
            ],
            "parameters": [
              {
                "id": "resistanceOhm",
                "default": 1,
                "unit": "ohm",
                "min": 1e-06,
                "max": 1000000000000,
                "value": 1
              },
              {
                "id": "minimumResistanceOhm",
                "default": 1e-06,
                "unit": "ohm",
                "min": 1e-09,
                "max": 1000000000,
                "value": 1e-06
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:voltage-gain-source",
      "type": "Block",
      "label": "Voltage-controlled voltage source",
      "properties": {
        "id": "voltage-gain-source",
        "name": "Voltage-controlled voltage source",
        "kind": "studio",
        "summary": "Ideal externally powered controlled source with nonloading voltage sense",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal externally powered controlled source with nonloading voltage sense",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "cp",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "cn",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "branchCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Recorded branchCurrent measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "gain",
            "label": "Gain",
            "unit": "V/V",
            "default": 2,
            "description": "Multiplier from the sensed input to the declared output quantity.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "Vout = gain × (Vcp − Vcn)",
          "Icp = Icn = 0"
        ],
        "example": {
          "title": "Voltage-controlled voltage source worked example",
          "text": "Editable first-party network. supply: voltageV=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-voltage-gain-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "gain",
              "label": "Gain",
              "value": 2,
              "unit": "V/V"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": -0.5,
              "unit": "A",
              "tolerance": 5e-07
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 1,
              "value": 2,
              "unit": "V",
              "tolerance": 2e-06
            },
            {
              "port": "target/branchCurrent",
              "label": "branchCurrent",
              "atS": 1,
              "value": -0.5,
              "unit": "A",
              "tolerance": 5e-07
            }
          ]
        },
        "limits": [
          "Ideal externally powered controlled source with nonloading voltage sense",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-circuit",
          "physical-power"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-voltage-gain-source"
        ],
        "type": "voltage-gain-source",
        "implementationId": "voltage-gain-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/voltage-gain-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/voltage-gain-source/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-voltage-gain-source"
          ]
        },
        "studioHelp": {
          "type": "voltage-gain-source",
          "namespace": "physical",
          "slug": "voltage-gain-source",
          "canonicalSlug": "voltage-gain-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "voltage-gain-source",
            "name": "Voltage-controlled voltage source",
            "domain": "electrical",
            "family": "amplifier",
            "operation": "Imposes an output voltage proportional to a nonloading control voltage. This ideal controlled source has an implicit external power supply.",
            "mechanism": [
              "Control voltage",
              "Voltage gain",
              "Output voltage"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "cp",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Control branch positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "cn",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Control branch negative terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "operational-amplifier",
                "label": "Finite-gain operational amplifier"
              },
              {
                "type": "current-sensor",
                "label": "Current sensor / signal adapter"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M60 10L150 40L60 70Z M10 25H60M10 55H60M150 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "gain",
                "default": 2,
                "unit": "V/V",
                "min": -1000000,
                "max": 1000000,
                "value": 2
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:voltage-sensor",
      "type": "Block",
      "label": "Voltage sensor / signal adapter",
      "properties": {
        "id": "voltage-sensor",
        "kind": "studio",
        "name": "Voltage sensor / signal adapter",
        "summary": "Reads p minus n without drawing current. Its voltage signal can drive a controller.",
        "behavior": "Reads p minus n without drawing current. Its voltage signal can drive a controller.",
        "documentationSlug": "voltage-sensor",
        "referenceOnly": true,
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Positive voltage-reference terminal"
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "electrical",
            "description": "Negative voltage-reference terminal"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Directed output available to compatible consumers: voltage."
          }
        ],
        "parameters": [],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "voltage-sensor",
        "implementationId": "voltage-sensor",
        "url": "https://lemonergy.com/learn/glossary/blocks/voltage-sensor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/voltage-sensor/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "voltage-sensor",
          "namespace": "physical",
          "slug": "voltage-sensor",
          "canonicalSlug": "voltage-sensor",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "voltage-sensor",
            "name": "Voltage sensor / signal adapter",
            "domain": "electrical",
            "family": "sensor",
            "operation": "Reads p minus n without drawing current. Its voltage signal can drive a controller.",
            "mechanism": [
              "Electrical potential",
              "Nonloading measurement",
              "Voltage signal"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "current-sensor",
                "label": "Current sensor / signal adapter"
              },
              {
                "type": "signal-filter",
                "label": "Physical signal filter"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 30
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H70M130 40H190M100 40L116 22M80 52A24 24 0 0 1 120 52"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              }
            ],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:voltage-source",
      "type": "Block",
      "label": "Controlled voltage source",
      "properties": {
        "id": "voltage-source",
        "name": "Controlled voltage source",
        "kind": "studio",
        "summary": "An ideal voltage source with an optional typed command input.",
        "behavior": "The source enforces p-minus-n terminal voltage from its command signal, or voltageV when no command is connected. The network determines its current.",
        "ports": [
          {
            "name": "p",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "n",
            "direction": "conserving",
            "unit": "V, A",
            "description": "Electrical terminal: potential and charge-conserving current."
          },
          {
            "name": "command",
            "direction": "input",
            "unit": "V",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          }
        ],
        "parameters": [
          {
            "key": "voltageV",
            "label": "Voltage V",
            "unit": "V",
            "default": 12,
            "min": -1000000,
            "max": 1000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          }
        ],
        "equations": [
          "V_p - V_n = command, or voltageV when unconnected"
        ],
        "example": {
          "title": "Relate current and voltage",
          "text": "A 1 V drop across 2 Ω implies 0.5 A.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-rc",
          "label": "Open the electrical circuit"
        },
        "limits": [
          "The RC example includes a capacitor: transient current varies and source voltage is not always resistor voltage.",
          "This generic circuit does not identify cell parameters from measurements."
        ],
        "evidence": [
          "js/physical-network.js",
          "js/studio-examples.js"
        ],
        "caseIds": [
          "ohm-circuit",
          "rc-response"
        ],
        "type": "voltage-source",
        "implementationId": "voltage-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/voltage-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/voltage-source/",
        "sourceFile": "block-library.json",
        "sourceRepository": "battery-design",
        "sourceRevision": "ef9802329b75bc15bb96885f8ed5d49425106696",
        "reviewed": "2026-10-27",
        "studioHelp": {
          "type": "voltage-source",
          "namespace": "physical",
          "slug": "voltage-source",
          "canonicalSlug": "voltage-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "voltage-source",
            "name": "Controlled voltage source",
            "domain": "electrical",
            "family": "voltage-source",
            "operation": "Imposes the commanded voltage p minus n; the network determines the required current.",
            "mechanism": [
              "Voltage command",
              "Imposed voltage",
              "Solved current"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "electrical-reference",
                "label": "Electrical reference"
              },
              {
                "type": "current-source",
                "label": "Controlled current source"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 32
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H68M132 40H190M100 15V31M92 23H108M92 57H108"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Voltage command",
                "quantity": "voltage",
                "unit": "V",
                "active": true,
                "summary": "Voltage command is a directed voltage input to this component, expressed in V. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "voltageV",
                "default": 12,
                "unit": "V",
                "min": -1000000,
                "max": 1000000,
                "value": 12
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:battery-cccv-controller",
      "type": "Block",
      "label": "CC-CV current controller",
      "properties": {
        "id": "battery-cccv-controller",
        "name": "CC-CV current controller",
        "kind": "studio",
        "summary": "PI voltage regulation with an external current envelope and anti-windup.",
        "behavior": "Uses a PI voltage loop and an external current magnitude envelope to request charge current. Conditional integration limits windup while the request is saturated. Charging is negative in the discharge-positive current convention; disabling resets control memory.",
        "ports": [
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Highest cell voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "limit",
            "direction": "input",
            "unit": "A",
            "description": "Charge-current magnitude limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "true / false",
            "description": "Enable; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "request",
            "direction": "output",
            "unit": "A",
            "description": "Signed current request (charge negative); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "mode",
            "direction": "output",
            "unit": "1",
            "description": "Mode (0 disabled, 1 CC, 2 CV); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 0.1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "targetV",
            "label": "Voltage target (V)",
            "unit": "V",
            "default": 4,
            "description": "Voltage target (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "kp",
            "label": "Proportional gain (A/V)",
            "unit": "A/V",
            "default": 10,
            "description": "Proportional gain (A/V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ki",
            "label": "Integral gain (A/(V·s))",
            "unit": "A/(V·s)",
            "default": 0,
            "description": "Integral gain (A/(V·s)). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "error = targetV - highestCellVoltage",
          "request = -clamp(kp * error + integral, 0, currentLimit)"
        ],
        "example": {
          "title": "CC-CV current controller worked example",
          "text": "Use the defaults below with Highest cell voltage = 3.9 V, Charge-current magnitude limit = 2 A, Enable = 1 true / false. At 0 s, Signed current request (charge negative) is -1 A. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-cccv-controller",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "request",
              "atS": 0,
              "value": -1,
              "tolerance": 1e-08,
              "label": "Signed current request (charge negative)",
              "unit": "A"
            }
          ],
          "inputs": [
            {
              "port": "voltage",
              "label": "Highest cell voltage",
              "value": 3.9,
              "unit": "V"
            },
            {
              "port": "limit",
              "label": "Charge-current magnitude limit",
              "value": 2,
              "unit": "A"
            },
            {
              "port": "enable",
              "label": "Enable",
              "value": 1,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "This block generates a current request. The plant, actuator limits and loop stability must be modeled separately.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "astrom-murray-feedback",
          "tomaszewska-charging"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-cccv-controller"
        ],
        "exampleTraces": [
          {
            "id": "battery-cccv-controller",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-cccv-controller.json?v=8c62eaf84855",
            "title": "CC-CV current controller recorded example",
            "exampleId": "block-battery-cccv-controller",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 11,
            "channels": 2,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-cccv-controller",
        "implementationId": "battery-cccv-controller",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-cccv-controller/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-cccv-controller/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-cccv-controller"
          ]
        },
        "studioHelp": {
          "type": "battery-cccv-controller",
          "namespace": "signal",
          "slug": "signal-block-battery-cccv-controller",
          "canonicalSlug": "battery-cccv-controller",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "CC-CV current controller",
            "label": "CC-CV current controller",
            "summary": "PI voltage regulation with an external current envelope and anti-windup.",
            "details": [
              "Block type: battery-cccv-controller.",
              "3 declared inputs and 2 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "CC-CV current controller",
              "caption": "PI voltage regulation with an external current envelope and anti-windup."
            },
            "inputs": [
              {
                "id": "voltage",
                "label": "Highest cell voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "limit",
                "label": "Charge-current magnitude limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "request",
                "label": "Signed current request (charge negative)",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "mode",
                "label": "Mode (0 disabled, 1 CC, 2 CV)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":0.1,\"targetV\":4,\"kp\":10,\"ki\":0}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-cccv-controller/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-cell-delta-soc-ekf",
      "type": "Block",
      "label": "Cell-delta SOC EKF",
      "properties": {
        "id": "battery-cell-delta-soc-ekf",
        "name": "Cell-delta SOC EKF",
        "kind": "studio",
        "summary": "Estimates deviation from a supplied average. Average-error variance enters voltage uncertainty under an explicit independent-error assumption.",
        "behavior": "Estimates the target cell SOC deviation from a supplied pack average. The variable-resistance version accepts the target resistance as an input. Average-estimate variance enters the voltage uncertainty under an independent-error assumption.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Series current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured cell voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "average",
            "direction": "input",
            "unit": "1 (fraction)",
            "description": "Average SOC; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "averageVariance",
            "direction": "input",
            "unit": "1",
            "description": "Average SOC variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Aligned measurements valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "delta",
            "direction": "output",
            "unit": "1",
            "description": "SOC deviation from average; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Reconstructed cell SOC; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Delta SOC variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Cell voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Observer status; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "cellCapacityAh",
            "label": "Target-cell capacity (Ah)",
            "unit": "Ah",
            "default": 2,
            "description": "Target-cell capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "averageCapacityAh",
            "label": "Average-cell capacity (Ah)",
            "unit": "Ah",
            "default": 2,
            "description": "Average-cell capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialDelta",
            "label": "Initial SOC deviation from average",
            "unit": "1",
            "default": 0,
            "description": "Initial SOC deviation from average. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.01,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R",
          "cellSOC = suppliedAverageSOC + estimatedDelta"
        ],
        "example": {
          "title": "Cell-delta SOC EKF worked example",
          "text": "Use the defaults below with Series current = 1 A, Measured cell voltage = 3.73 V, Average SOC = 0.8 1 (fraction), Average SOC variance = 0 1, Aligned measurements valid = 1 true / false, Reset = 0 true / false. At 0 s, SOC deviation from average is -0.01 1. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-cell-delta-soc-ekf",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "delta",
              "atS": 0,
              "value": -0.01,
              "tolerance": 1e-08,
              "label": "SOC deviation from average",
              "unit": "1"
            },
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.79,
              "tolerance": 1e-08,
              "label": "Reconstructed cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.005,
              "tolerance": 1e-08,
              "label": "Delta SOC variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": -0.02,
              "tolerance": 1e-08,
              "label": "Cell voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.5,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Series current",
              "value": 1,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured cell voltage",
              "value": 3.73,
              "unit": "V"
            },
            {
              "port": "average",
              "label": "Average SOC",
              "value": 0.8,
              "unit": "1 (fraction)"
            },
            {
              "port": "averageVariance",
              "label": "Average SOC variance",
              "value": 0,
              "unit": "1"
            },
            {
              "port": "valid",
              "label": "Aligned measurements valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "No jointly estimated correlated covariance between the average and the cell deviation.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-cell-delta-soc-ekf"
        ],
        "exampleTraces": [
          {
            "id": "battery-cell-delta-soc-ekf",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-cell-delta-soc-ekf.json?v=010904b7a0e8",
            "title": "Cell-delta SOC EKF recorded example",
            "exampleId": "block-battery-cell-delta-soc-ekf",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-cell-delta-soc-ekf",
        "implementationId": "battery-cell-delta-soc-ekf",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-cell-delta-soc-ekf/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-cell-delta-soc-ekf/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-cell-delta-soc-ekf"
          ]
        },
        "studioHelp": {
          "type": "battery-cell-delta-soc-ekf",
          "namespace": "signal",
          "slug": "signal-block-battery-cell-delta-soc-ekf",
          "canonicalSlug": "battery-cell-delta-soc-ekf",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Cell-delta SOC EKF",
            "label": "Cell-delta SOC EKF",
            "summary": "Estimates deviation from a supplied average. Average-error variance enters voltage uncertainty under an explicit independent-error assumption.",
            "details": [
              "Block type: battery-cell-delta-soc-ekf.",
              "6 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "Cell-delta SOC EKF",
              "caption": "Estimates deviation from a supplied average. Average-error variance enters voltage uncertainty under an explicit independent-error assumption."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Series current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured cell voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "average",
                "label": "Average SOC",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "averageVariance",
                "label": "Average SOC variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Aligned measurements valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "delta",
                "label": "SOC deviation from average",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "fraction",
                "label": "Reconstructed cell SOC",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Delta SOC variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Cell voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Observer status",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"cellCapacityAh\":2,\"averageCapacityAh\":2,\"initialDelta\":0,\"initialVariance\":0.01,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-cell-delta-soc-ekf/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-cell-delta-soc-ekf-variable-resistance",
      "type": "Block",
      "label": "Cell-delta SOC EKF with resistance input",
      "properties": {
        "id": "battery-cell-delta-soc-ekf-variable-resistance",
        "name": "Cell-delta SOC EKF with resistance input",
        "kind": "studio",
        "summary": "Estimates deviation from a supplied average. Average-error variance enters voltage uncertainty under an explicit independent-error assumption.",
        "behavior": "Estimates the target cell SOC deviation from a supplied pack average. The variable-resistance version accepts the target resistance as an input. Average-estimate variance enters the voltage uncertainty under an independent-error assumption.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Series current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured cell voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "average",
            "direction": "input",
            "unit": "1 (fraction)",
            "description": "Average SOC; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "averageVariance",
            "direction": "input",
            "unit": "1",
            "description": "Average SOC variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Aligned measurements valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "resistance",
            "direction": "input",
            "unit": "1",
            "description": "Cell resistance (ohm); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "delta",
            "direction": "output",
            "unit": "1",
            "description": "SOC deviation from average; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Reconstructed cell SOC; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Delta SOC variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Cell voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Observer status; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "cellCapacityAh",
            "label": "Target-cell capacity (Ah)",
            "unit": "Ah",
            "default": 2,
            "description": "Target-cell capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "averageCapacityAh",
            "label": "Average-cell capacity (Ah)",
            "unit": "Ah",
            "default": 2,
            "description": "Average-cell capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialDelta",
            "label": "Initial SOC deviation from average",
            "unit": "1",
            "default": 0,
            "description": "Initial SOC deviation from average. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.01,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R",
          "cellSOC = suppliedAverageSOC + estimatedDelta"
        ],
        "example": {
          "title": "Cell-delta SOC EKF with resistance input worked example",
          "text": "Use the defaults below with Series current = 1 A, Measured cell voltage = 3.73 V, Average SOC = 0.8 1 (fraction), Average SOC variance = 0 1, Aligned measurements valid = 1 true / false, Reset = 0 true / false, Cell resistance (ohm) = 0.05 1. At 0 s, SOC deviation from average is -0.01 1. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-cell-delta-soc-ekf-variable-resistance",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "delta",
              "atS": 0,
              "value": -0.01,
              "tolerance": 1e-08,
              "label": "SOC deviation from average",
              "unit": "1"
            },
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.79,
              "tolerance": 1e-08,
              "label": "Reconstructed cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.005,
              "tolerance": 1e-08,
              "label": "Delta SOC variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": -0.02,
              "tolerance": 1e-08,
              "label": "Cell voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.5,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Series current",
              "value": 1,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured cell voltage",
              "value": 3.73,
              "unit": "V"
            },
            {
              "port": "average",
              "label": "Average SOC",
              "value": 0.8,
              "unit": "1 (fraction)"
            },
            {
              "port": "averageVariance",
              "label": "Average SOC variance",
              "value": 0,
              "unit": "1"
            },
            {
              "port": "valid",
              "label": "Aligned measurements valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            },
            {
              "port": "resistance",
              "label": "Cell resistance (ohm)",
              "value": 0.05,
              "unit": "1"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "No jointly estimated correlated covariance between the average and the cell deviation.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-cell-delta-soc-ekf-variable-resistance"
        ],
        "exampleTraces": [
          {
            "id": "battery-cell-delta-soc-ekf-variable-resistance",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-cell-delta-soc-ekf-variable-resistance.json?v=86e0fa072c2c",
            "title": "Cell-delta SOC EKF with resistance input recorded example",
            "exampleId": "block-battery-cell-delta-soc-ekf-variable-resistance",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-cell-delta-soc-ekf-variable-resistance",
        "implementationId": "battery-cell-delta-soc-ekf-variable-resistance",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-cell-delta-soc-ekf-variable-resistance/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-cell-delta-soc-ekf-variable-resistance/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-cell-delta-soc-ekf-variable-resistance"
          ]
        },
        "studioHelp": {
          "type": "battery-cell-delta-soc-ekf-variable-resistance",
          "namespace": "signal",
          "slug": "signal-block-battery-cell-delta-soc-ekf-variable-resistance",
          "canonicalSlug": "battery-cell-delta-soc-ekf-variable-resistance",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Cell-delta SOC EKF with resistance input",
            "label": "Cell-delta SOC EKF with resistance input",
            "summary": "Estimates deviation from a supplied average. Average-error variance enters voltage uncertainty under an explicit independent-error assumption.",
            "details": [
              "Block type: battery-cell-delta-soc-ekf-variable-resistance.",
              "7 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "Cell-delta SOC EKF with resistance input",
              "caption": "Estimates deviation from a supplied average. Average-error variance enters voltage uncertainty under an explicit independent-error assumption."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Series current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured cell voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "average",
                "label": "Average SOC",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "averageVariance",
                "label": "Average SOC variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Aligned measurements valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "resistance",
                "label": "Cell resistance (ohm)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "delta",
                "label": "SOC deviation from average",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "fraction",
                "label": "Reconstructed cell SOC",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Delta SOC variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Cell voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Observer status",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"cellCapacityAh\":2,\"averageCapacityAh\":2,\"initialDelta\":0,\"initialVariance\":0.01,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-cell-delta-soc-ekf-variable-resistance/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-charge-envelope",
      "type": "Block",
      "label": "Charge-current envelope",
      "properties": {
        "id": "battery-charge-envelope",
        "name": "Charge-current envelope",
        "kind": "studio",
        "summary": "Selects the most restrictive cell voltage and temperature current limit.",
        "behavior": "Interpolates voltage and temperature limit tables for every channel, then selects the smallest nonnegative magnitude together with the nominal cap. Disabling the block returns zero. The envelope feeds a controller or current actuator.",
        "ports": [
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Cell voltages; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "temperature",
            "direction": "input",
            "unit": "K",
            "description": "Cell temperatures; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "true / false",
            "description": "Enable; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "limit",
            "direction": "output",
            "unit": "A",
            "description": "Allowed current magnitude; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltageLimit",
            "direction": "output",
            "unit": "A",
            "description": "Voltage limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "temperatureLimit",
            "direction": "output",
            "unit": "A",
            "description": "Temperature limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "cells",
            "label": "Number of measurement channels",
            "unit": "1",
            "default": 3,
            "description": "Number of measurement channels. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "nominalA",
            "label": "Nominal current limit (A)",
            "unit": "A",
            "default": 2,
            "description": "Nominal current limit (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "voltageTable",
            "label": "Voltage limit table [V, A]",
            "unit": "See field order",
            "default": [
              [
                4,
                2
              ],
              [
                4.1,
                0
              ]
            ],
            "description": "Voltage limit table [V, A]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "temperatureTable",
            "label": "Temperature limit table [K, A]",
            "unit": "See field order",
            "default": [
              [
                273.15,
                0
              ],
              [
                283.15,
                2
              ],
              [
                313.15,
                2
              ],
              [
                323.15,
                0
              ]
            ],
            "description": "Temperature limit table [K, A]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "allowed = enable ? min(nominal, all voltage limits, all temperature limits) : 0"
        ],
        "example": {
          "title": "Charge-current envelope worked example",
          "text": "Use the defaults below with Cell voltages = [4, 4.05, 4.02] V, Cell temperatures = [298.15, 318.15, 300] K, Enable = 1 true / false. At 0 s, Allowed current magnitude is 1 A. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-charge-envelope",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "limit",
              "atS": 0,
              "value": 1,
              "tolerance": 1e-08,
              "label": "Allowed current magnitude",
              "unit": "A"
            }
          ],
          "inputs": [
            {
              "port": "voltage",
              "label": "Cell voltages",
              "value": [
                4,
                4.05,
                4.02
              ],
              "unit": "V"
            },
            {
              "port": "temperature",
              "label": "Cell temperatures",
              "value": [
                298.15,
                318.15,
                300
              ],
              "unit": "K"
            },
            {
              "port": "enable",
              "label": "Enable",
              "value": 1,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "The tables are supplied by the model author. Their synthetic defaults do not establish a safe charging or discharging envelope.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "tomaszewska-charging"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-charge-envelope"
        ],
        "exampleTraces": [
          {
            "id": "battery-charge-envelope",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-charge-envelope.json?v=d05749eba926",
            "title": "Charge-current envelope recorded example",
            "exampleId": "block-battery-charge-envelope",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 3,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-charge-envelope",
        "implementationId": "battery-charge-envelope",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-charge-envelope/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-charge-envelope/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-charge-envelope"
          ]
        },
        "studioHelp": {
          "type": "battery-charge-envelope",
          "namespace": "signal",
          "slug": "signal-block-battery-charge-envelope",
          "canonicalSlug": "battery-charge-envelope",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Charge-current envelope",
            "label": "Charge-current envelope",
            "summary": "Selects the most restrictive cell voltage and temperature current limit.",
            "details": [
              "Block type: battery-charge-envelope.",
              "3 declared inputs and 3 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Charge-current envelope",
              "caption": "Selects the most restrictive cell voltage and temperature current limit."
            },
            "inputs": [
              {
                "id": "voltage",
                "label": "Cell voltages",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperatures",
                "quantity": "temperature",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "limit",
                "label": "Allowed current magnitude",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltageLimit",
                "label": "Voltage limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperatureLimit",
                "label": "Temperature limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"cells\":3,\"nominalA\":2,\"voltageTable\":[[4,2],[4.1,0]],\"temperatureTable\":[[273.15,0],[283.15,2],[313.15,2],[323.15,0]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-charge-envelope/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-contact-monitor",
      "type": "Block",
      "label": "Cell contact residual monitor",
      "properties": {
        "id": "battery-contact-monitor",
        "name": "Cell contact residual monitor",
        "kind": "studio",
        "summary": "Filters cell/group voltage residuals against their median and qualifies persistent differences. Residuals are not a unique contact-fault diagnosis.",
        "behavior": "Forms measured-minus-predicted voltage residuals, subtracts their channel median, filters the differences and qualifies consecutive threshold crossings when current is large enough.",
        "ports": [
          {
            "name": "measured",
            "direction": "input",
            "unit": "V",
            "description": "Measured cell/group voltages; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "predicted",
            "direction": "input",
            "unit": "V",
            "description": "Predicted healthy voltages; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "true / false",
            "description": "Enable; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "residual",
            "direction": "output",
            "unit": "V",
            "description": "Filtered differential residual; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "faults",
            "direction": "output",
            "unit": "true / false",
            "description": "Qualified channel symptoms; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "fault",
            "direction": "output",
            "unit": "true / false",
            "description": "Any qualified symptom; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "valid",
            "direction": "output",
            "unit": "true / false",
            "description": "Sufficient current; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "cells",
            "label": "Number of measurement channels",
            "unit": "1",
            "default": 3,
            "description": "Number of measurement channels. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "filterWeight",
            "label": "Residual filter weight (0–1)",
            "unit": "0–1",
            "default": 0.5,
            "description": "Residual filter weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "thresholdV",
            "label": "Residual threshold (V)",
            "unit": "V",
            "default": 0.008,
            "description": "Residual threshold (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minCurrentA",
            "label": "Minimum diagnostic current (A)",
            "unit": "A",
            "default": 1,
            "description": "Minimum diagnostic current (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "requiredSamples",
            "label": "Consecutive qualifying samples",
            "unit": "1",
            "default": 2,
            "description": "Consecutive qualifying samples. This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "d[j] = measured[j] - predicted[j]",
          "residual[j] = filtered(d[j] - median(d))"
        ],
        "example": {
          "title": "Cell contact residual monitor worked example",
          "text": "Use the defaults below with Measured cell/group voltages = [3.64, 3.66, 3.66] V, Predicted healthy voltages = [3.66, 3.66, 3.66] V, Signed current = 2 A, Enable = 1 true / false. At 0 s, Filtered differential residual is [0, 0, 0] V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-contact-monitor",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "residual",
              "atS": 0,
              "value": [
                0,
                0,
                0
              ],
              "tolerance": 1e-08,
              "label": "Filtered differential residual",
              "unit": "V"
            },
            {
              "port": "fault",
              "atS": 0,
              "value": 0,
              "tolerance": 1e-08,
              "label": "Any qualified symptom",
              "unit": "true / false"
            },
            {
              "port": "valid",
              "atS": 0,
              "value": 1,
              "tolerance": 1e-08,
              "label": "Sufficient current",
              "unit": "true / false"
            },
            {
              "port": "fault",
              "atS": 2,
              "value": 1,
              "tolerance": 0,
              "label": "Any qualified symptom",
              "unit": "true / false"
            }
          ],
          "inputs": [
            {
              "port": "measured",
              "label": "Measured cell/group voltages",
              "value": [
                3.64,
                3.66,
                3.66
              ],
              "unit": "V"
            },
            {
              "port": "predicted",
              "label": "Predicted healthy voltages",
              "value": [
                3.66,
                3.66,
                3.66
              ],
              "unit": "V"
            },
            {
              "port": "current",
              "label": "Signed current",
              "value": 2,
              "unit": "A"
            },
            {
              "port": "enable",
              "label": "Enable",
              "value": 1,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "Requires at least three channels. Contact loss, parameter mismatch and sensor bias can produce the same symptom; this is not a unique fault diagnosis.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "ti-bms"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-contact-monitor"
        ],
        "exampleTraces": [
          {
            "id": "battery-contact-monitor",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-contact-monitor.json?v=5297694cf49e",
            "title": "Cell contact residual monitor recorded example",
            "exampleId": "block-battery-contact-monitor",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 4,
            "channels": 8,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-contact-monitor",
        "implementationId": "battery-contact-monitor",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-contact-monitor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-contact-monitor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-contact-monitor"
          ]
        },
        "studioHelp": {
          "type": "battery-contact-monitor",
          "namespace": "signal",
          "slug": "signal-block-battery-contact-monitor",
          "canonicalSlug": "battery-contact-monitor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Cell contact residual monitor",
            "label": "Cell contact residual monitor",
            "summary": "Filters cell/group voltage residuals against their median and qualifies persistent differences. Residuals are not a unique contact-fault diagnosis.",
            "details": [
              "Block type: battery-contact-monitor.",
              "4 declared inputs and 4 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "control",
              "symbol": "signal → bounds → fault",
              "label": "Compare monitored channels",
              "caption": "Filters cell/group voltage residuals against their median and qualifies persistent differences. Residuals are not a unique contact-fault diagnosis."
            },
            "inputs": [
              {
                "id": "measured",
                "label": "Measured cell/group voltages",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "predicted",
                "label": "Predicted healthy voltages",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "current",
                "label": "Signed current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "residual",
                "label": "Filtered differential residual",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "faults",
                "label": "Qualified channel symptoms",
                "quantity": "dimensionless",
                "shape": [
                  3
                ],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Array 3",
                "elementLabel": "bool"
              },
              {
                "id": "fault",
                "label": "Any qualified symptom",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "valid",
                "label": "Sufficient current",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"cells\":3,\"filterWeight\":0.5,\"thresholdV\":0.008,\"minCurrentA\":1,\"requiredSamples\":2}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-contact-monitor/",
            "related": [
              {
                "label": "Compare",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
              },
              {
                "label": "Boolean latch",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
              },
              {
                "label": "Pi controller",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-controlled-discharger",
      "type": "Block",
      "label": "Controlled discharger",
      "properties": {
        "id": "battery-controlled-discharger",
        "name": "Controlled discharger",
        "kind": "studio",
        "summary": "Triggered discharge request with low-voltage/time cutoff, recorded charge and latched completion.",
        "behavior": "A trigger starts a discharge-current request. Measured voltage cutoff or maximum active time ends the run and latches completion. Measured discharge current accumulates removed ampere-hours. Disable pauses actuation.",
        "ports": [
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Measured discharge current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "trigger",
            "direction": "input",
            "unit": "true / false",
            "description": "Start trigger; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "true / false",
            "description": "Enable; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "request",
            "direction": "output",
            "unit": "A",
            "description": "Discharge-current request; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "done",
            "direction": "output",
            "unit": "true / false",
            "description": "Complete; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "mode",
            "direction": "output",
            "unit": "1",
            "description": "Mode (0 idle, 1 discharge, 2 complete, 3 paused); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "charge",
            "direction": "output",
            "unit": "Ah",
            "description": "Removed charge (Ah); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "elapsed",
            "direction": "output",
            "unit": "s",
            "description": "Active discharge time (s); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "currentA",
            "label": "Discharge request (A)",
            "unit": "A",
            "default": 1,
            "description": "Discharge request (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "cutoffV",
            "label": "Discharge cutoff voltage (V)",
            "unit": "V",
            "default": 3.2,
            "description": "Discharge cutoff voltage (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumS",
            "label": "Maximum discharge duration (s)",
            "unit": "s",
            "default": 3600,
            "description": "Maximum discharge duration (s). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "removedAh = integral(measured discharge current dt) / 3600",
          "finish when terminal voltage <= cutoffV or active time >= maximumS"
        ],
        "example": {
          "title": "Controlled discharger worked example",
          "text": "Use the defaults below with Measured terminal voltage = 3.8 V, Measured discharge current = 1 A, Start trigger = 1 true / false, Enable = 1 true / false. At 0 s, Discharge-current request is 1 A. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-controlled-discharger",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "request",
              "atS": 0,
              "value": 1,
              "tolerance": 1e-08,
              "label": "Discharge-current request",
              "unit": "A"
            },
            {
              "port": "done",
              "atS": 0,
              "value": 0,
              "tolerance": 1e-08,
              "label": "Complete",
              "unit": "true / false"
            },
            {
              "port": "charge",
              "atS": 0,
              "value": 0,
              "tolerance": 1e-08,
              "label": "Removed charge (Ah)",
              "unit": "Ah"
            },
            {
              "port": "elapsed",
              "atS": 0,
              "value": 0,
              "tolerance": 1e-08,
              "label": "Active discharge time (s)",
              "unit": "s"
            }
          ],
          "inputs": [
            {
              "port": "voltage",
              "label": "Measured terminal voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "current",
              "label": "Measured discharge current",
              "value": 1,
              "unit": "A"
            },
            {
              "port": "trigger",
              "label": "Start trigger",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "enable",
              "label": "Enable",
              "value": 1,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "The controller requests current; a separate plant or physical sink performs the discharge. The synthetic example is not a standardized cell test.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "inl-ev-tests"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-controlled-discharger"
        ],
        "exampleTraces": [
          {
            "id": "battery-controlled-discharger",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-controlled-discharger.json?v=475ae3da406b",
            "title": "Controlled discharger recorded example",
            "exampleId": "block-battery-controlled-discharger",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 5,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-controlled-discharger",
        "implementationId": "battery-controlled-discharger",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-controlled-discharger/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-controlled-discharger/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-controlled-discharger"
          ]
        },
        "studioHelp": {
          "type": "battery-controlled-discharger",
          "namespace": "signal",
          "slug": "signal-block-battery-controlled-discharger",
          "canonicalSlug": "battery-controlled-discharger",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Controlled discharger",
            "label": "Controlled discharger",
            "summary": "Triggered discharge request with low-voltage/time cutoff, recorded charge and latched completion.",
            "details": [
              "Block type: battery-controlled-discharger.",
              "4 declared inputs and 5 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Controlled discharger",
              "caption": "Triggered discharge request with low-voltage/time cutoff, recorded charge and latched completion."
            },
            "inputs": [
              {
                "id": "voltage",
                "label": "Measured terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "current",
                "label": "Measured discharge current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "trigger",
                "label": "Start trigger",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "request",
                "label": "Discharge-current request",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "done",
                "label": "Complete",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "mode",
                "label": "Mode (0 idle, 1 discharge, 2 complete, 3 paused)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "charge",
                "label": "Removed charge (Ah)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "elapsed",
                "label": "Active discharge time (s)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"currentA\":1,\"cutoffV\":3.2,\"maximumS\":3600}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-controlled-discharger/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-cycle-program",
      "type": "Block",
      "label": "Battery cycle program",
      "properties": {
        "id": "battery-cycle-program",
        "name": "Battery cycle program",
        "kind": "studio",
        "summary": "Native rest/CC/CV phase sequencer with repeats, voltage interlocks and taper dwell. Commands use discharge-positive current.",
        "behavior": "Runs repeated rest, constant-current and constant-voltage phases. Phase duration, voltage conditions and taper dwell control advancement. A voltage interlock stops the program. Charging commands are negative.",
        "ports": [
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Measured signed current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "trigger",
            "direction": "input",
            "unit": "true / false",
            "description": "Start trigger; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "true / false",
            "description": "Enable; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "request",
            "direction": "output",
            "unit": "A",
            "description": "Signed current request; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "done",
            "direction": "output",
            "unit": "true / false",
            "description": "Program complete; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "phase",
            "direction": "output",
            "unit": "1",
            "description": "Zero-based active phase; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "elapsed",
            "direction": "output",
            "unit": "s",
            "description": "Phase elapsed time (s); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "cycles",
            "direction": "output",
            "unit": "1",
            "description": "Finished cycles; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "fault",
            "direction": "output",
            "unit": "true / false",
            "description": "Voltage interlock fault; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 0.1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "repeats",
            "label": "Cycle repetitions",
            "unit": "1",
            "default": 1,
            "description": "Cycle repetitions. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumV",
            "label": "Low-voltage interlock (V)",
            "unit": "V",
            "default": 2.5,
            "description": "Low-voltage interlock (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumV",
            "label": "High-voltage interlock (V)",
            "unit": "V",
            "default": 4.3,
            "description": "High-voltage interlock (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "steps",
            "label": "Phases [mode, A, V, duration s, cutoff A, dwell s, gain]",
            "unit": "See field order",
            "default": [
              [
                0,
                0,
                0,
                1,
                0,
                0,
                0
              ],
              [
                1,
                1,
                3,
                2,
                0,
                0,
                0
              ],
              [
                0,
                0,
                0,
                1,
                0,
                0,
                0
              ]
            ],
            "description": "Each row: mode (0 rest, 1 CC, 2 CV), current (A), voltage (V), duration (s), cutoff magnitude (A), taper dwell (s), CV gain. Signed currents use discharge-positive convention."
          }
        ],
        "equations": [
          "mode 0 = rest; mode 1 = constant current; mode 2 = constant voltage",
          "phase row = [mode, current A, voltage V, duration s, cutoff A, dwell s, gain]"
        ],
        "example": {
          "title": "Battery cycle program worked example",
          "text": "Use the defaults below with Measured terminal voltage = 3.8 V, Measured signed current = 1 A, Start trigger = 1 true / false, Enable = 1 true / false. At 0 s, Signed current request is 0 A. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-cycle-program",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "request",
              "atS": 0,
              "value": 0,
              "tolerance": 1e-08,
              "label": "Signed current request",
              "unit": "A"
            },
            {
              "port": "done",
              "atS": 0,
              "value": 0,
              "tolerance": 1e-08,
              "label": "Program complete",
              "unit": "true / false"
            },
            {
              "port": "phase",
              "atS": 0,
              "value": 0,
              "tolerance": 1e-08,
              "label": "Zero-based active phase",
              "unit": "1"
            },
            {
              "port": "cycles",
              "atS": 0,
              "value": 0,
              "tolerance": 1e-08,
              "label": "Finished cycles",
              "unit": "1"
            },
            {
              "port": "phase",
              "atS": 1,
              "value": 1,
              "tolerance": 0,
              "label": "Zero-based active phase",
              "unit": "1"
            },
            {
              "port": "done",
              "atS": 4,
              "value": 1,
              "tolerance": 0,
              "label": "Program complete",
              "unit": "true / false"
            }
          ],
          "inputs": [
            {
              "port": "voltage",
              "label": "Measured terminal voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "current",
              "label": "Measured signed current",
              "value": 1,
              "unit": "A"
            },
            {
              "port": "trigger",
              "label": "Start trigger",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "enable",
              "label": "Enable",
              "value": 1,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "The phase program is a signal controller; actuation and measured response come from the connected plant. Synthetic phase settings do not establish a test standard.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "inl-ev-tests"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-cycle-program"
        ],
        "exampleTraces": [
          {
            "id": "battery-cycle-program",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-cycle-program.json?v=0664c4d77f5d",
            "title": "Battery cycle program recorded example",
            "exampleId": "block-battery-cycle-program",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 51,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-cycle-program",
        "implementationId": "battery-cycle-program",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-cycle-program/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-cycle-program/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-cycle-program"
          ]
        },
        "studioHelp": {
          "type": "battery-cycle-program",
          "namespace": "signal",
          "slug": "signal-block-battery-cycle-program",
          "canonicalSlug": "battery-cycle-program",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Battery cycle program",
            "label": "Battery cycle program",
            "summary": "Native rest/CC/CV phase sequencer with repeats, voltage interlocks and taper dwell. Commands use discharge-positive current.",
            "details": [
              "Block type: battery-cycle-program.",
              "4 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Battery cycle program",
              "caption": "Native rest/CC/CV phase sequencer with repeats, voltage interlocks and taper dwell. Commands use discharge-positive current."
            },
            "inputs": [
              {
                "id": "voltage",
                "label": "Measured terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "current",
                "label": "Measured signed current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "trigger",
                "label": "Start trigger",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "request",
                "label": "Signed current request",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "done",
                "label": "Program complete",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "phase",
                "label": "Zero-based active phase",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "elapsed",
                "label": "Phase elapsed time (s)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cycles",
                "label": "Finished cycles",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "fault",
                "label": "Voltage interlock fault",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":0.1,\"repeats\":1,\"minimumV\":2.5,\"maximumV\":4.3,\"steps\":[[0,0,0,1,0,0,0],[1,1,3,2,0,0,0],[0,0,0,1,0,0,0]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-cycle-program/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-discharge-envelope",
      "type": "Block",
      "label": "Discharge-current envelope",
      "properties": {
        "id": "battery-discharge-envelope",
        "name": "Discharge-current envelope",
        "kind": "studio",
        "summary": "Selects the most restrictive cell voltage and temperature current limit.",
        "behavior": "Interpolates voltage and temperature limit tables for every channel, then selects the smallest nonnegative magnitude together with the nominal cap. Disabling the block returns zero. The envelope feeds a controller or current actuator.",
        "ports": [
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Cell voltages; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "temperature",
            "direction": "input",
            "unit": "K",
            "description": "Cell temperatures; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "true / false",
            "description": "Enable; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "limit",
            "direction": "output",
            "unit": "A",
            "description": "Allowed current magnitude; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltageLimit",
            "direction": "output",
            "unit": "A",
            "description": "Voltage limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "temperatureLimit",
            "direction": "output",
            "unit": "A",
            "description": "Temperature limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "cells",
            "label": "Number of measurement channels",
            "unit": "1",
            "default": 3,
            "description": "Number of measurement channels. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "nominalA",
            "label": "Nominal current limit (A)",
            "unit": "A",
            "default": 4,
            "description": "Nominal current limit (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "voltageTable",
            "label": "Voltage limit table [V, A]",
            "unit": "See field order",
            "default": [
              [
                3,
                0
              ],
              [
                3.2,
                4
              ]
            ],
            "description": "Voltage limit table [V, A]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "temperatureTable",
            "label": "Temperature limit table [K, A]",
            "unit": "See field order",
            "default": [
              [
                273.15,
                0
              ],
              [
                283.15,
                4
              ],
              [
                313.15,
                4
              ],
              [
                323.15,
                0
              ]
            ],
            "description": "Temperature limit table [K, A]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "allowed = enable ? min(nominal, all voltage limits, all temperature limits) : 0"
        ],
        "example": {
          "title": "Discharge-current envelope worked example",
          "text": "Use the defaults below with Cell voltages = [3.2, 3.1, 3.15] V, Cell temperatures = [298.15, 318.15, 300] K, Enable = 1 true / false. At 0 s, Allowed current magnitude is 2 A. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-discharge-envelope",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "limit",
              "atS": 0,
              "value": 2,
              "tolerance": 1e-08,
              "label": "Allowed current magnitude",
              "unit": "A"
            }
          ],
          "inputs": [
            {
              "port": "voltage",
              "label": "Cell voltages",
              "value": [
                3.2,
                3.1,
                3.15
              ],
              "unit": "V"
            },
            {
              "port": "temperature",
              "label": "Cell temperatures",
              "value": [
                298.15,
                318.15,
                300
              ],
              "unit": "K"
            },
            {
              "port": "enable",
              "label": "Enable",
              "value": 1,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "The tables are supplied by the model author. Their synthetic defaults do not establish a safe charging or discharging envelope.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "tomaszewska-charging"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-discharge-envelope"
        ],
        "exampleTraces": [
          {
            "id": "battery-discharge-envelope",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-discharge-envelope.json?v=33f9143b20ed",
            "title": "Discharge-current envelope recorded example",
            "exampleId": "block-battery-discharge-envelope",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 3,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-discharge-envelope",
        "implementationId": "battery-discharge-envelope",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-discharge-envelope/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-discharge-envelope/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-discharge-envelope"
          ]
        },
        "studioHelp": {
          "type": "battery-discharge-envelope",
          "namespace": "signal",
          "slug": "signal-block-battery-discharge-envelope",
          "canonicalSlug": "battery-discharge-envelope",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Discharge-current envelope",
            "label": "Discharge-current envelope",
            "summary": "Selects the most restrictive cell voltage and temperature current limit.",
            "details": [
              "Block type: battery-discharge-envelope.",
              "3 declared inputs and 3 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Discharge-current envelope",
              "caption": "Selects the most restrictive cell voltage and temperature current limit."
            },
            "inputs": [
              {
                "id": "voltage",
                "label": "Cell voltages",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperatures",
                "quantity": "temperature",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "limit",
                "label": "Allowed current magnitude",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltageLimit",
                "label": "Voltage limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperatureLimit",
                "label": "Temperature limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"cells\":3,\"nominalA\":4,\"voltageTable\":[[3,0],[3.2,4]],\"temperatureTable\":[[273.15,0],[283.15,4],[313.15,4],[323.15,0]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-discharge-envelope/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-ecm-cell",
      "type": "Block",
      "label": "Electrothermal ECM cell",
      "properties": {
        "id": "battery-ecm-cell",
        "name": "Electrothermal ECM cell",
        "kind": "studio",
        "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
        "behavior": "Accepts signed discharge current, ambient temperature and external heat. Charge balance drives SOC; an OCV table sets equilibrium voltage. The ECM adds two RC polarization states. Both variants include an ohmic loss and a lumped temperature state.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed cell current (discharge positive); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Ambient temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External heat flow; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "soc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of charge; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Cell temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Irreversible heat; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "ocv",
            "direction": "output",
            "unit": "V",
            "description": "Open-circuit voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "inRange",
            "direction": "output",
            "unit": "true / false",
            "description": "SOC in characterized range; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "capacityAh",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 5,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "r1Ohm",
            "label": "First polarization resistance (Ω)",
            "unit": "Ω",
            "default": 0.02,
            "description": "First polarization resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "c1F",
            "label": "First polarization capacitance (F)",
            "unit": "F",
            "default": 500,
            "description": "First polarization capacitance (F). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "r2Ohm",
            "label": "Second polarization resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Second polarization resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "c2F",
            "label": "Second polarization capacitance (F)",
            "unit": "F",
            "default": 2000,
            "description": "Second polarization capacitance (F). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "heatCapacityJPerK",
            "label": "Heat capacity (J/K)",
            "unit": "J/K",
            "default": 100,
            "description": "Heat capacity (J/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "conductanceWPerK",
            "label": "Ambient thermal conductance (W/K)",
            "unit": "W/K",
            "default": 1,
            "description": "Ambient thermal conductance (W/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialSoc",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.8,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialTemperatureK",
            "label": "Initial cell temperature (K)",
            "unit": "K",
            "default": 298.15,
            "description": "Initial cell temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "dSOC/dt = -I / (3600 * capacityAh)",
          "dVk/dt = (I - Vk/Rk) / Ck  [ECM branches only]",
          "Vterminal = OCV(SOC) - I*R0 - sum(Vk)",
          "Cthermal*dT/dt = I^2*R0 + sum(Vk^2/Rk) + Qexternal - G*(T-Tambient)"
        ],
        "example": {
          "title": "Electrothermal ECM cell worked example",
          "text": "Use the defaults below with Signed cell current (discharge positive) = 2 A, Ambient temperature = 298.15 K, External heat flow = 0 W. At 0 s, Terminal voltage is 3.68 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-ecm-cell",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 3.68,
              "tolerance": 1e-08,
              "label": "Terminal voltage",
              "unit": "V"
            },
            {
              "port": "soc",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "State of charge",
              "unit": "1 (fraction)"
            },
            {
              "port": "voltage",
              "atS": 10,
              "value": 3.646845790452711,
              "tolerance": 1e-06,
              "label": "Terminal voltage",
              "unit": "V"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed cell current (discharge positive)",
              "value": 2,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Ambient temperature",
              "value": 298.15,
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External heat flow",
              "value": 0,
              "unit": "W"
            }
          ]
        },
        "limits": [
          "The external interface is causal current-to-voltage, without conserving terminals. Parameters are constant except the one-dimensional SOC-to-OCV table. No hysteresis, aging, reversible entropic heat or automatic parameter identification.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-ecm-cell"
        ],
        "exampleTraces": [
          {
            "id": "battery-ecm-cell",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-ecm-cell.json?v=4bb6ace37339",
            "title": "Electrothermal ECM cell recorded example",
            "exampleId": "block-battery-ecm-cell",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-ecm-cell",
        "implementationId": "battery-ecm-cell",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-ecm-cell/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-ecm-cell/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-ecm-cell"
          ]
        },
        "studioHelp": {
          "type": "battery-ecm-cell",
          "namespace": "signal",
          "slug": "signal-block-battery-ecm-cell",
          "canonicalSlug": "battery-ecm-cell",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Electrothermal ECM cell",
            "label": "Electrothermal ECM cell",
            "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
            "details": [
              "Block type: battery-ecm-cell.",
              "3 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "I → SOC, RC → V, T",
              "label": "Equivalent-circuit cell",
              "caption": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed cell current (discharge positive)",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Ambient temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External heat flow",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "soc",
                "label": "State of charge",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "loss",
                "label": "Irreversible heat",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ocv",
                "label": "Open-circuit voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "inRange",
                "label": "SOC in characterized range",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"capacityAh\":5,\"resistanceOhm\":0.01,\"r1Ohm\":0.02,\"c1F\":500,\"r2Ohm\":0.01,\"c2F\":2000,\"heatCapacityJPerK\":100,\"conductanceWPerK\":1,\"initialSoc\":0.8,\"initialTemperatureK\":298.15,\"ocvTable\":[[0,3.7],[1,3.7]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/",
            "related": [
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-fuel-cell-table",
      "type": "Block",
      "label": "Tabulated fuel-cell stack",
      "properties": {
        "id": "battery-fuel-cell-table",
        "name": "Tabulated fuel-cell stack",
        "kind": "studio",
        "summary": "Interpolated polarization table with explicit out-of-table diagnostic.",
        "behavior": "Linearly interpolates a current-to-stack-voltage polarization table and reports power. An in-range output distinguishes interpolation from operation beyond the supplied current domain.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Stack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Stack voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Stack power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "inRange",
            "direction": "output",
            "unit": "true / false",
            "description": "Current in table range; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "voltageTable",
            "label": "Polarization table [A, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                5
              ],
              [
                1,
                4.8
              ],
              [
                2,
                4.4
              ]
            ],
            "description": "Polarization table [A, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "Pstack = Istack * Vtable(Istack)"
        ],
        "example": {
          "title": "Tabulated fuel-cell stack worked example",
          "text": "Use the defaults below with Stack current = 1.5 A. At 0 s, Stack voltage is 4.6 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-fuel-cell-table",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 4.6,
              "tolerance": 1e-08,
              "label": "Stack voltage",
              "unit": "V"
            },
            {
              "port": "power",
              "atS": 0,
              "value": 6.9,
              "tolerance": 1e-08,
              "label": "Stack power",
              "unit": "W"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Stack current",
              "value": 1.5,
              "unit": "A"
            }
          ]
        },
        "limits": [
          "This static table has no gas, thermal, pressure or electrochemical states. A measured polarization curve is required for a particular stack.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "netl-fuel-cell-handbook"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-fuel-cell-table"
        ],
        "exampleTraces": [
          {
            "id": "battery-fuel-cell-table",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-fuel-cell-table.json?v=c50e9910d149",
            "title": "Tabulated fuel-cell stack recorded example",
            "exampleId": "block-battery-fuel-cell-table",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 3,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-fuel-cell-table",
        "implementationId": "battery-fuel-cell-table",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-fuel-cell-table/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-fuel-cell-table/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-fuel-cell-table"
          ]
        },
        "studioHelp": {
          "type": "battery-fuel-cell-table",
          "namespace": "signal",
          "slug": "signal-block-battery-fuel-cell-table",
          "canonicalSlug": "battery-fuel-cell-table",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Tabulated fuel-cell stack",
            "label": "Tabulated fuel-cell stack",
            "summary": "Interpolated polarization table with explicit out-of-table diagnostic.",
            "details": [
              "Block type: battery-fuel-cell-table.",
              "1 declared input and 3 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Tabulated fuel-cell stack",
              "caption": "Interpolated polarization table with explicit out-of-table diagnostic."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Stack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Stack voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "power",
                "label": "Stack power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "inRange",
                "label": "Current in table range",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"voltageTable\":[[0,5],[1,4.8],[2,4.4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-fuel-cell-table/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-incremental-cccv",
      "type": "Block",
      "label": "Incremental CC-CV controller",
      "properties": {
        "id": "battery-incremental-cccv",
        "name": "Incremental CC-CV controller",
        "kind": "studio",
        "summary": "Updates a bounded charge request from voltage error each sample.",
        "behavior": "Adds a proportional voltage-error correction to the previous charging magnitude at each sample, clamps it to the external envelope and emits the negative signed request. Disabling resets the request.",
        "ports": [
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Highest cell voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "limit",
            "direction": "input",
            "unit": "A",
            "description": "Charge-current magnitude limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "true / false",
            "description": "Enable; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "request",
            "direction": "output",
            "unit": "A",
            "description": "Signed current request (charge negative); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "mode",
            "direction": "output",
            "unit": "1",
            "description": "Mode (0 disabled, 1 CC, 2 CV); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 0.1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "targetV",
            "label": "Voltage target (V)",
            "unit": "V",
            "default": 4,
            "description": "Voltage target (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "kp",
            "label": "Proportional gain (A/V)",
            "unit": "A/V",
            "default": 5,
            "description": "Proportional gain (A/V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ki",
            "label": "Integral gain (A/(V·s))",
            "unit": "A/(V·s)",
            "default": 0,
            "description": "Integral gain (A/(V·s)). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "magnitude[k] = clamp(magnitude[k-1] + kp * (targetV - voltage[k]), 0, limit[k])",
          "request[k] = -magnitude[k]"
        ],
        "example": {
          "title": "Incremental CC-CV controller worked example",
          "text": "Use the defaults below with Highest cell voltage = 3.9 V, Charge-current magnitude limit = 2 A, Enable = 1 true / false. At 0 s, Signed current request (charge negative) is -0.5 A. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-incremental-cccv",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "request",
              "atS": 0,
              "value": -0.5,
              "tolerance": 1e-08,
              "label": "Signed current request (charge negative)",
              "unit": "A"
            }
          ],
          "inputs": [
            {
              "port": "voltage",
              "label": "Highest cell voltage",
              "value": 3.9,
              "unit": "V"
            },
            {
              "port": "limit",
              "label": "Charge-current magnitude limit",
              "value": 2,
              "unit": "A"
            },
            {
              "port": "enable",
              "label": "Enable",
              "value": 1,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "The gain acts per update. Changing sample interval changes the response; this is an incremental controller, not the PI variant.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "astrom-murray-feedback",
          "tomaszewska-charging"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-incremental-cccv"
        ],
        "exampleTraces": [
          {
            "id": "battery-incremental-cccv",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-incremental-cccv.json?v=c88fa0132d9a",
            "title": "Incremental CC-CV controller recorded example",
            "exampleId": "block-battery-incremental-cccv",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 11,
            "channels": 2,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-incremental-cccv",
        "implementationId": "battery-incremental-cccv",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-incremental-cccv/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-incremental-cccv/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-incremental-cccv"
          ]
        },
        "studioHelp": {
          "type": "battery-incremental-cccv",
          "namespace": "signal",
          "slug": "signal-block-battery-incremental-cccv",
          "canonicalSlug": "battery-incremental-cccv",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Incremental CC-CV controller",
            "label": "Incremental CC-CV controller",
            "summary": "Updates a bounded charge request from voltage error each sample.",
            "details": [
              "Block type: battery-incremental-cccv.",
              "3 declared inputs and 2 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Incremental CC-CV controller",
              "caption": "Updates a bounded charge request from voltage error each sample."
            },
            "inputs": [
              {
                "id": "voltage",
                "label": "Highest cell voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "limit",
                "label": "Charge-current magnitude limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "request",
                "label": "Signed current request (charge negative)",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "mode",
                "label": "Mode (0 disabled, 1 CC, 2 CV)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":0.1,\"targetV\":4,\"kp\":5,\"ki\":0}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-incremental-cccv/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-module",
      "type": "Block",
      "label": "Battery module",
      "properties": {
        "id": "battery-module",
        "name": "Battery module",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 10 channels at the default configuration.",
            "shape": [
              10
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 10 channels at the default configuration.",
            "shape": [
              10
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "seriesGroups",
            "label": "Series groups in each module",
            "unit": "1",
            "default": 3,
            "description": "Series groups in each module. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Battery module worked example",
          "text": "Use the defaults below with Signed pack current = 6 A, Cell ambient temperatures = [298.15, 298.15, 298.15, 298.15, 298.15, 298.15] K, External cell heat inputs = [0, 0, 0, 0, 0, 0] W. At 0 s, Pack terminal voltage is 10.92 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-module",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 10.92,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                3,
                3,
                3,
                3,
                3,
                3
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 6,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0,
                0,
                0,
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-module"
        ],
        "exampleTraces": [
          {
            "id": "battery-module",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-module.json?v=36868c05ddb3",
            "title": "Battery module recorded example",
            "exampleId": "block-battery-module",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 39,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-module",
        "implementationId": "battery-module",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-module/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-module/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-module"
          ]
        },
        "studioHelp": {
          "type": "battery-module",
          "namespace": "signal",
          "slug": "signal-block-battery-module",
          "canonicalSlug": "battery-module",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Battery module",
            "label": "Battery module",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-module.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Battery module",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  10
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 10",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  10
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 10",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-module/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-module-assembly",
      "type": "Block",
      "label": "Module assembly",
      "properties": {
        "id": "battery-module-assembly",
        "name": "Module assembly",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 21 channels at the default configuration.",
            "shape": [
              21
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 21 channels at the default configuration.",
            "shape": [
              21
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "seriesGroups",
            "label": "Series groups in each module",
            "unit": "1",
            "default": 3,
            "description": "Series groups in each module. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "modules",
            "label": "Modules in each assembly",
            "unit": "1",
            "default": 2,
            "description": "Modules in each assembly. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "moduleConnection",
            "label": "Module connection (0 series, 1 parallel)",
            "unit": "0 series, 1 parallel",
            "default": 0,
            "description": "0 connects modules in series; 1 connects them in parallel."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Module assembly worked example",
          "text": "Use the defaults below with Signed pack current = 6 A, Cell ambient temperatures = 12 channels each 298.15 K, External cell heat inputs = 12 channels each 0 W. At 0 s, Pack terminal voltage is 21.84 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-module-assembly",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 21.84,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 6,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-module-assembly"
        ],
        "exampleTraces": [
          {
            "id": "battery-module-assembly",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-module-assembly.json?v=fdf80bf25db5",
            "title": "Module assembly recorded example",
            "exampleId": "block-battery-module-assembly",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 91,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-module-assembly",
        "implementationId": "battery-module-assembly",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-module-assembly/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-module-assembly/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-module-assembly"
          ]
        },
        "studioHelp": {
          "type": "battery-module-assembly",
          "namespace": "signal",
          "slug": "signal-block-battery-module-assembly",
          "canonicalSlug": "battery-module-assembly",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Module assembly",
            "label": "Module assembly",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-module-assembly.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Module assembly",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  21
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 21",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  21
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 21",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"modules\":2,\"moduleConnection\":0,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-module-assembly/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-pack-assembly",
      "type": "Block",
      "label": "Battery pack assembly",
      "properties": {
        "id": "battery-pack-assembly",
        "name": "Battery pack assembly",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 43 channels at the default configuration.",
            "shape": [
              43
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 43 channels at the default configuration.",
            "shape": [
              43
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "seriesGroups",
            "label": "Series groups in each module",
            "unit": "1",
            "default": 3,
            "description": "Series groups in each module. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "modules",
            "label": "Modules in each assembly",
            "unit": "1",
            "default": 2,
            "description": "Modules in each assembly. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "moduleConnection",
            "label": "Module connection (0 series, 1 parallel)",
            "unit": "0 series, 1 parallel",
            "default": 0,
            "description": "0 connects modules in series; 1 connects them in parallel."
          },
          {
            "key": "seriesAssemblies",
            "label": "Series assemblies in each string",
            "unit": "1",
            "default": 1,
            "description": "Series assemblies in each string. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "parallelStrings",
            "label": "Parallel pack strings",
            "unit": "1",
            "default": 2,
            "description": "Parallel pack strings. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Battery pack assembly worked example",
          "text": "Use the defaults below with Signed pack current = 12 A, Cell ambient temperatures = 24 channels each 298.15 K, External cell heat inputs = 24 channels each 0 W. At 0 s, Pack terminal voltage is 21.84 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-pack-assembly",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 21.84,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 12,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-pack-assembly"
        ],
        "exampleTraces": [
          {
            "id": "battery-pack-assembly",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-pack-assembly.json?v=8c005753d771",
            "title": "Battery pack assembly recorded example",
            "exampleId": "block-battery-pack-assembly",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 195,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-pack-assembly",
        "implementationId": "battery-pack-assembly",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-pack-assembly/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-pack-assembly/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-pack-assembly"
          ]
        },
        "studioHelp": {
          "type": "battery-pack-assembly",
          "namespace": "signal",
          "slug": "signal-block-battery-pack-assembly",
          "canonicalSlug": "battery-pack-assembly",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Battery pack assembly",
            "label": "Battery pack assembly",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-pack-assembly.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Battery pack assembly",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  43
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 43",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  43
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 43",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"modules\":2,\"moduleConnection\":0,\"seriesAssemblies\":1,\"parallelStrings\":2,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-pack-assembly/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-pack-soc-adaptive-ekf",
      "type": "Block",
      "label": "Pack-average SOC adaptive EKF",
      "properties": {
        "id": "battery-pack-soc-adaptive-ekf",
        "name": "Pack-average SOC adaptive EKF",
        "kind": "studio",
        "summary": "Homogeneous series-cell average observer. Voltage, resistance and observation slope scale by series count; output is an average, not individual cell SOC.",
        "behavior": "Estimates the average SOC of homogeneous series cells. Voltage, resistance and observation slope scale by series count. Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Series pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured pack voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Average SOC; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Average SOC variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Pack voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Pack voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Observer status; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 2,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.75,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.01,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.04,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0.1,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "seriesCells",
            "label": "Number of series cells",
            "unit": "1",
            "default": 4,
            "description": "Number of series cells. This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R",
          "Vpack,predicted = seriesCells * (OCV(averageSOC) - I*Rcell)"
        ],
        "example": {
          "title": "Pack-average SOC adaptive EKF worked example",
          "text": "Use the defaults below with Series pack current = 1 A, Measured pack voltage = 15 V, Voltage valid = 1 true / false, Reset = 0 true / false. At 0 s, Average SOC is 0.79 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-pack-soc-adaptive-ekf",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.79,
              "tolerance": 1e-08,
              "label": "Average SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.002,
              "tolerance": 1e-08,
              "label": "Average SOC variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Pack voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Series pack current",
              "value": 1,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured pack voltage",
              "value": 15,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The estimate is a pack average, without independently estimated cell states.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-pack-soc-adaptive-ekf"
        ],
        "exampleTraces": [
          {
            "id": "battery-pack-soc-adaptive-ekf",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-pack-soc-adaptive-ekf.json?v=1c15907cd51c",
            "title": "Pack-average SOC adaptive EKF recorded example",
            "exampleId": "block-battery-pack-soc-adaptive-ekf",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-pack-soc-adaptive-ekf",
        "implementationId": "battery-pack-soc-adaptive-ekf",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-pack-soc-adaptive-ekf/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-pack-soc-adaptive-ekf/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-pack-soc-adaptive-ekf"
          ]
        },
        "studioHelp": {
          "type": "battery-pack-soc-adaptive-ekf",
          "namespace": "signal",
          "slug": "signal-block-battery-pack-soc-adaptive-ekf",
          "canonicalSlug": "battery-pack-soc-adaptive-ekf",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Pack-average SOC adaptive EKF",
            "label": "Pack-average SOC adaptive EKF",
            "summary": "Homogeneous series-cell average observer. Voltage, resistance and observation slope scale by series count; output is an average, not individual cell SOC.",
            "details": [
              "Block type: battery-pack-soc-adaptive-ekf.",
              "4 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "Pack-average SOC adaptive EKF",
              "caption": "Homogeneous series-cell average observer. Voltage, resistance and observation slope scale by series count; output is an average, not individual cell SOC."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Series pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured pack voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "Average SOC",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Average SOC variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Pack voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Pack voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Observer status",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.75,\"initialVariance\":0.01,\"processNoise\":0,\"measurementNoise\":0.04,\"resistanceOhm\":0.05,\"adaptationRate\":0.1,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]],\"seriesCells\":4}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-pack-soc-adaptive-ekf/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-pack-soc-ekf",
      "type": "Block",
      "label": "Pack-average SOC EKF",
      "properties": {
        "id": "battery-pack-soc-ekf",
        "name": "Pack-average SOC EKF",
        "kind": "studio",
        "summary": "Homogeneous series-cell average observer. Voltage, resistance and observation slope scale by series count; output is an average, not individual cell SOC.",
        "behavior": "Estimates the average SOC of homogeneous series cells. Voltage, resistance and observation slope scale by series count. Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Series pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured pack voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Average SOC; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Average SOC variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Pack voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Pack voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Observer status; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 2,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.75,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.01,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.04,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "seriesCells",
            "label": "Number of series cells",
            "unit": "1",
            "default": 4,
            "description": "Number of series cells. This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R",
          "Vpack,predicted = seriesCells * (OCV(averageSOC) - I*Rcell)"
        ],
        "example": {
          "title": "Pack-average SOC EKF worked example",
          "text": "Use the defaults below with Series pack current = 1 A, Measured pack voltage = 15 V, Voltage valid = 1 true / false, Reset = 0 true / false. At 0 s, Average SOC is 0.79 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-pack-soc-ekf",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.79,
              "tolerance": 1e-08,
              "label": "Average SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.002,
              "tolerance": 1e-08,
              "label": "Average SOC variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Pack voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Series pack current",
              "value": 1,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured pack voltage",
              "value": 15,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The estimate is a pack average, without independently estimated cell states.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-pack-soc-ekf"
        ],
        "exampleTraces": [
          {
            "id": "battery-pack-soc-ekf",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-pack-soc-ekf.json?v=bdbb2729551f",
            "title": "Pack-average SOC EKF recorded example",
            "exampleId": "block-battery-pack-soc-ekf",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-pack-soc-ekf",
        "implementationId": "battery-pack-soc-ekf",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-pack-soc-ekf/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-pack-soc-ekf/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-pack-soc-ekf"
          ]
        },
        "studioHelp": {
          "type": "battery-pack-soc-ekf",
          "namespace": "signal",
          "slug": "signal-block-battery-pack-soc-ekf",
          "canonicalSlug": "battery-pack-soc-ekf",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Pack-average SOC EKF",
            "label": "Pack-average SOC EKF",
            "summary": "Homogeneous series-cell average observer. Voltage, resistance and observation slope scale by series count; output is an average, not individual cell SOC.",
            "details": [
              "Block type: battery-pack-soc-ekf.",
              "4 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "Pack-average SOC EKF",
              "caption": "Homogeneous series-cell average observer. Voltage, resistance and observation slope scale by series count; output is an average, not individual cell SOC."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Series pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured pack voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "Average SOC",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Average SOC variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Pack voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Pack voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Observer status",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.75,\"initialVariance\":0.01,\"processNoise\":0,\"measurementNoise\":0.04,\"resistanceOhm\":0.05,\"adaptationRate\":0,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]],\"seriesCells\":4}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-pack-soc-ekf/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-parallel-group",
      "type": "Block",
      "label": "Parallel cell group",
      "properties": {
        "id": "battery-parallel-group",
        "name": "Parallel cell group",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Parallel cell group worked example",
          "text": "Use the defaults below with Signed pack current = 4 A, Cell ambient temperatures = [298.15, 298.15] K, External cell heat inputs = [0, 0] W. At 0 s, Pack terminal voltage is 3.66 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-parallel-group",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 3.66,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                2,
                2
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.798888888888889,
                0.798888888888889
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 4,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-parallel-group"
        ],
        "exampleTraces": [
          {
            "id": "battery-parallel-group",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-parallel-group.json?v=d377de1011ff",
            "title": "Parallel cell group recorded example",
            "exampleId": "block-battery-parallel-group",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 5,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          },
          {
            "id": "battery-parallel-mismatch",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-parallel-mismatch.json?v=9c00f108fa95",
            "title": "Unequal parallel cells",
            "exampleId": "block-battery-parallel-mismatch",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 5,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          },
          {
            "id": "battery-cell-thermal-link",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-cell-thermal-link.json?v=a5718ede583b",
            "title": "Heat exchange between cells",
            "exampleId": "block-battery-cell-thermal-link",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 5,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-parallel-group",
        "implementationId": "battery-parallel-group",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-parallel-group/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-parallel-group/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-cell-thermal-link",
            "https://design.lemonergy.com/cosim.html?example=block-battery-parallel-group",
            "https://design.lemonergy.com/cosim.html?example=block-battery-parallel-mismatch"
          ]
        },
        "studioHelp": {
          "type": "battery-parallel-group",
          "namespace": "signal",
          "slug": "signal-block-battery-parallel-group",
          "canonicalSlug": "battery-parallel-group",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Parallel cell group",
            "label": "Parallel cell group",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-parallel-group.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Parallel cell group",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-parallel-group/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-passive-balancer",
      "type": "Block",
      "label": "Passive cell balancer",
      "properties": {
        "id": "battery-passive-balancer",
        "name": "Passive cell balancer",
        "kind": "studio",
        "summary": "Hysteresis selects high cells and reports bleed current and resistor heat.",
        "behavior": "Selects cells above the lowest cell voltage using separate turn-on and turn-off differences. Enabled channels report bleed current and resistor heat; the signal block itself does not impose the electrical current.",
        "ports": [
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Cell voltages; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "true / false",
            "description": "Enable; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "active",
            "direction": "output",
            "unit": "true / false",
            "description": "Bleed switches; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Bleed currents; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "heat",
            "direction": "output",
            "unit": "W",
            "description": "Bleed power; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "power"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "cells",
            "label": "Number of measurement channels",
            "unit": "1",
            "default": 3,
            "description": "Number of measurement channels. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "onDeltaV",
            "label": "Turn-on voltage difference (V)",
            "unit": "V",
            "default": 0.02,
            "description": "Turn-on voltage difference (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "offDeltaV",
            "label": "Turn-off voltage difference (V)",
            "unit": "V",
            "default": 0.01,
            "description": "Turn-off voltage difference (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Bleed resistor (Ω)",
            "unit": "Ω",
            "default": 40,
            "description": "Bleed resistor (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minVoltageV",
            "label": "Minimum voltage (V)",
            "unit": "V",
            "default": 3,
            "description": "Minimum voltage (V). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "Ibleed[j] = selected[j] * voltage[j] / resistance",
          "Pbleed[j] = voltage[j] * Ibleed[j]"
        ],
        "example": {
          "title": "Passive cell balancer worked example",
          "text": "Use the defaults below with Cell voltages = [3.95, 4, 3.96] V, Enable = 1 true / false. At 0 s, Bleed switches is [0, 1, 0] true / false. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-passive-balancer",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "active",
              "atS": 0,
              "value": [
                0,
                1,
                0
              ],
              "tolerance": 1e-08,
              "label": "Bleed switches",
              "unit": "true / false"
            },
            {
              "port": "current",
              "atS": 0,
              "value": [
                0,
                0.1,
                0
              ],
              "tolerance": 1e-08,
              "label": "Bleed currents",
              "unit": "A"
            },
            {
              "port": "heat",
              "atS": 0,
              "value": [
                0,
                0.4,
                0
              ],
              "tolerance": 1e-08,
              "label": "Bleed power",
              "unit": "W"
            }
          ],
          "inputs": [
            {
              "port": "voltage",
              "label": "Cell voltages",
              "value": [
                3.95,
                4,
                3.96
              ],
              "unit": "V"
            },
            {
              "port": "enable",
              "label": "Enable",
              "value": 1,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "Connect the request to a physical balancing interface to load a conserving network. The synthetic resistor is not a hardware rating.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "ti-bms"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-passive-balancer"
        ],
        "exampleTraces": [
          {
            "id": "battery-passive-balancer",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-passive-balancer.json?v=78e92535a6a1",
            "title": "Passive cell balancer recorded example",
            "exampleId": "block-battery-passive-balancer",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 9,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-passive-balancer",
        "implementationId": "battery-passive-balancer",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-passive-balancer/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-passive-balancer/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-passive-balancer"
          ]
        },
        "studioHelp": {
          "type": "battery-passive-balancer",
          "namespace": "signal",
          "slug": "signal-block-battery-passive-balancer",
          "canonicalSlug": "battery-passive-balancer",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Passive cell balancer",
            "label": "Passive cell balancer",
            "summary": "Hysteresis selects high cells and reports bleed current and resistor heat.",
            "details": [
              "Block type: battery-passive-balancer.",
              "2 declared inputs and 3 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Passive cell balancer",
              "caption": "Hysteresis selects high cells and reports bleed current and resistor heat."
            },
            "inputs": [
              {
                "id": "voltage",
                "label": "Cell voltages",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "active",
                "label": "Bleed switches",
                "quantity": "dimensionless",
                "shape": [
                  3
                ],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Array 3",
                "elementLabel": "bool"
              },
              {
                "id": "current",
                "label": "Bleed currents",
                "quantity": "current",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "heat",
                "label": "Bleed power",
                "quantity": "power",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"cells\":3,\"onDeltaV\":0.02,\"offDeltaV\":0.01,\"resistanceOhm\":40,\"minVoltageV\":3}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-passive-balancer/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-pem-stack",
      "type": "Block",
      "label": "Reduced PEM fuel-cell stack",
      "properties": {
        "id": "battery-pem-stack",
        "name": "Reduced PEM fuel-cell stack",
        "kind": "studio",
        "summary": "Prescribed gas/temperature Nernst potential with activation, ohmic and limiting-current losses plus an identified polarization lag. No humidity, gas-flow or thermal network states.",
        "behavior": "Computes a reduced PEM stack polarization from prescribed hydrogen/oxygen pressures and temperature. Nernst potential, activation, ohmic and limiting-current losses determine cell voltage. An identified first-order polarization lag adds dynamics. Faraday balance gives reactant consumption.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Stack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "temperature",
            "direction": "input",
            "unit": "K",
            "description": "Cell temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "hydrogenPressure",
            "direction": "input",
            "unit": "Pa",
            "description": "Hydrogen partial pressure; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "pressure"
          },
          {
            "name": "oxygenPressure",
            "direction": "input",
            "unit": "Pa",
            "description": "Oxygen partial pressure; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "pressure"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Stack voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Electrical output power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "heat",
            "direction": "output",
            "unit": "W",
            "description": "Thermoneutral power difference; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "hydrogen",
            "direction": "output",
            "unit": "1",
            "description": "Hydrogen consumption (mol/s); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "oxygen",
            "direction": "output",
            "unit": "1",
            "description": "Oxygen consumption (mol/s); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "reversible",
            "direction": "output",
            "unit": "V",
            "description": "Per-cell reversible voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "polarization",
            "direction": "output",
            "unit": "V",
            "description": "Per-cell polarization state; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "activationTarget",
            "direction": "output",
            "unit": "V",
            "description": "Steady activation loss; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "concentration",
            "direction": "output",
            "unit": "V",
            "description": "Concentration loss; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          }
        ],
        "parameters": [
          {
            "key": "seriesCells",
            "label": "Number of series cells",
            "unit": "1",
            "default": 5,
            "description": "Number of series cells. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "reversibleV",
            "label": "Reference reversible cell voltage (V)",
            "unit": "V",
            "default": 1.229,
            "description": "Reference reversible cell voltage (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "temperatureSlopeVPerK",
            "label": "Reversible-voltage temperature slope (V/K)",
            "unit": "V/K",
            "default": -0.00085,
            "description": "Reversible-voltage temperature slope (V/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "referenceTemperatureK",
            "label": "Reference temperature (K)",
            "unit": "K",
            "default": 298.15,
            "description": "Reference temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "referencePressurePa",
            "label": "Reference pressure (Pa)",
            "unit": "Pa",
            "default": 100000,
            "description": "Reference pressure (Pa). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "waterActivity",
            "label": "Liquid-water activity",
            "unit": "1",
            "default": 1,
            "description": "Liquid-water activity. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Per-cell ohmic resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Per-cell ohmic resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "exchangeCurrentA",
            "label": "Effective exchange current (A)",
            "unit": "A",
            "default": 1,
            "description": "Effective exchange current (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "limitingCurrentA",
            "label": "Limiting current (A)",
            "unit": "A",
            "default": 20,
            "description": "Limiting current (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "transferCoefficient",
            "label": "Effective transfer coefficient",
            "unit": "1",
            "default": 0.5,
            "description": "Effective transfer coefficient. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "timeConstantS",
            "label": "Polarization time constant (s)",
            "unit": "s",
            "default": 1,
            "description": "Polarization time constant (s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialPolarizationV",
            "label": "Initial polarization loss (V)",
            "unit": "V",
            "default": 0,
            "description": "Initial polarization loss (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "thermoneutralV",
            "label": "Thermoneutral cell voltage (V)",
            "unit": "V",
            "default": 1.48,
            "description": "Thermoneutral cell voltage (V). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "Vstack = cells * (E_Nernst - eta_activation - I*R - eta_concentration)",
          "tau*deta_activation/dt = eta_steady - eta_activation",
          "hydrogen mol/s = cells*I/(2*F)",
          "oxygen mol/s = cells*I/(4*F)"
        ],
        "example": {
          "title": "Reduced PEM fuel-cell stack worked example",
          "text": "Use the defaults below with Stack current = 2 A, Cell temperature = 298.15 K, Hydrogen partial pressure = 100000 Pa, Oxygen partial pressure = 100000 Pa. At 0 s, Stack voltage is 6.038232542 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-pem-stack",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 6.03823254153795,
              "tolerance": 1e-08,
              "label": "Stack voltage",
              "unit": "V"
            },
            {
              "port": "hydrogen",
              "atS": 0,
              "value": 5.1821348283088646e-05,
              "tolerance": 1e-08,
              "label": "Hydrogen consumption (mol/s)",
              "unit": "1"
            },
            {
              "port": "oxygen",
              "atS": 0,
              "value": 2.5910674141544323e-05,
              "tolerance": 1e-08,
              "label": "Oxygen consumption (mol/s)",
              "unit": "1"
            },
            {
              "port": "voltage",
              "atS": 10,
              "value": 5.811795216042423,
              "tolerance": 1e-06,
              "label": "Stack voltage",
              "unit": "V"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Stack current",
              "value": 2,
              "unit": "A"
            },
            {
              "port": "temperature",
              "label": "Cell temperature",
              "value": 298.15,
              "unit": "K"
            },
            {
              "port": "hydrogenPressure",
              "label": "Hydrogen partial pressure",
              "value": 100000,
              "unit": "Pa"
            },
            {
              "port": "oxygenPressure",
              "label": "Oxygen partial pressure",
              "value": 100000,
              "unit": "Pa"
            }
          ]
        },
        "limits": [
          "Positive gas pressures and temperature are required; current is nonnegative and below the limiting current. No hydration, gas-channel flow, internal thermal or conserving network states. Literature supplies background, not a claim to reproduce a full published model.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "netl-fuel-cell-handbook",
          "haddad-pem"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-pem-stack"
        ],
        "exampleTraces": [
          {
            "id": "battery-pem-stack",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-pem-stack.json?v=0a7e3822b2f0",
            "title": "Reduced PEM fuel-cell stack recorded example",
            "exampleId": "block-battery-pem-stack",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 9,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-pem-stack",
        "implementationId": "battery-pem-stack",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-pem-stack/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-pem-stack/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-pem-stack"
          ]
        },
        "studioHelp": {
          "type": "battery-pem-stack",
          "namespace": "signal",
          "slug": "signal-block-battery-pem-stack",
          "canonicalSlug": "battery-pem-stack",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Reduced PEM fuel-cell stack",
            "label": "Reduced PEM fuel-cell stack",
            "summary": "Prescribed gas/temperature Nernst potential with activation, ohmic and limiting-current losses plus an identified polarization lag. No humidity, gas-flow or thermal network states.",
            "details": [
              "Block type: battery-pem-stack.",
              "4 declared inputs and 9 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Reduced PEM fuel-cell stack",
              "caption": "Prescribed gas/temperature Nernst potential with activation, ohmic and limiting-current losses plus an identified polarization lag. No humidity, gas-flow or thermal network states."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Stack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "hydrogenPressure",
                "label": "Hydrogen partial pressure",
                "quantity": "pressure",
                "shape": [],
                "elementType": "real",
                "unit": "Pa",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Pressure",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "oxygenPressure",
                "label": "Oxygen partial pressure",
                "quantity": "pressure",
                "shape": [],
                "elementType": "real",
                "unit": "Pa",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Pressure",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Stack voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "power",
                "label": "Electrical output power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "heat",
                "label": "Thermoneutral power difference",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "hydrogen",
                "label": "Hydrogen consumption (mol/s)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "oxygen",
                "label": "Oxygen consumption (mol/s)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "reversible",
                "label": "Per-cell reversible voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "polarization",
                "label": "Per-cell polarization state",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "activationTarget",
                "label": "Steady activation loss",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "concentration",
                "label": "Concentration loss",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"seriesCells\":5,\"reversibleV\":1.229,\"temperatureSlopeVPerK\":-0.00085,\"referenceTemperatureK\":298.15,\"referencePressurePa\":100000,\"waterActivity\":1,\"resistanceOhm\":0.01,\"exchangeCurrentA\":1,\"limitingCurrentA\":20,\"transferCoefficient\":0.5,\"timeConstantS\":1,\"initialPolarizationV\":0,\"thermoneutralV\":1.48}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-pem-stack/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-power-capability",
      "type": "Block",
      "label": "Pulse power capability",
      "properties": {
        "id": "battery-power-capability",
        "name": "Pulse power capability",
        "kind": "studio",
        "summary": "Quasi-static voltage/current/SOC envelope for an explicit prediction horizon.",
        "behavior": "Combines a constant open-circuit voltage, effective resistance, voltage/current limits and available charge over a prediction horizon. It returns separate charge and discharge current and terminal-power magnitudes.",
        "ports": [
          {
            "name": "ocv",
            "direction": "input",
            "unit": "V",
            "description": "Open-circuit voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "resistance",
            "direction": "input",
            "unit": "1",
            "description": "Effective pulse resistance (ohm); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "soc",
            "direction": "input",
            "unit": "1 (fraction)",
            "description": "State of charge; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "discharge",
            "direction": "output",
            "unit": "A",
            "description": "Discharge-current limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "charge",
            "direction": "output",
            "unit": "A",
            "description": "Charge-current magnitude limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "dischargePower",
            "direction": "output",
            "unit": "W",
            "description": "Discharge power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "chargePower",
            "direction": "output",
            "unit": "W",
            "description": "Charge power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          }
        ],
        "parameters": [
          {
            "key": "capacityAh",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 2,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "horizonS",
            "label": "Prediction horizon (s)",
            "unit": "s",
            "default": 60,
            "description": "Prediction horizon (s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minVoltageV",
            "label": "Minimum voltage (V)",
            "unit": "V",
            "default": 3,
            "description": "Minimum voltage (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maxVoltageV",
            "label": "Maximum voltage (V)",
            "unit": "V",
            "default": 4.2,
            "description": "Maximum voltage (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maxDischargeA",
            "label": "Maximum discharge current (A)",
            "unit": "A",
            "default": 5,
            "description": "Maximum discharge current (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maxChargeA",
            "label": "Maximum charge current (A)",
            "unit": "A",
            "default": 3,
            "description": "Maximum charge current (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minSoc",
            "label": "Minimum SOC (0–1)",
            "unit": "0–1",
            "default": 0.2,
            "description": "Minimum SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maxSoc",
            "label": "Maximum SOC (0–1)",
            "unit": "0–1",
            "default": 0.8,
            "description": "Maximum SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "Vterminal = OCV - I * R",
          "discharge charge-budget limit = 3600 * capacityAh * (SOC - minSOC) / horizonS",
          "Pdischarge = Idischarge * (OCV - Idischarge * R)"
        ],
        "example": {
          "title": "Pulse power capability worked example",
          "text": "Use the defaults below with Open-circuit voltage = 3.8 V, Effective pulse resistance (ohm) = 0.1 1, State of charge = 0.5 1 (fraction). At 0 s, Discharge-current limit is 5 A. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-power-capability",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "discharge",
              "atS": 0,
              "value": 5,
              "tolerance": 1e-08,
              "label": "Discharge-current limit",
              "unit": "A"
            },
            {
              "port": "charge",
              "atS": 0,
              "value": 3,
              "tolerance": 1e-08,
              "label": "Charge-current magnitude limit",
              "unit": "A"
            },
            {
              "port": "dischargePower",
              "atS": 0,
              "value": 16.5,
              "tolerance": 1e-08,
              "label": "Discharge power",
              "unit": "W"
            },
            {
              "port": "chargePower",
              "atS": 0,
              "value": 12.3,
              "tolerance": 1e-08,
              "label": "Charge power",
              "unit": "W"
            }
          ],
          "inputs": [
            {
              "port": "ocv",
              "label": "Open-circuit voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "resistance",
              "label": "Effective pulse resistance (ohm)",
              "value": 0.1,
              "unit": "1"
            },
            {
              "port": "soc",
              "label": "State of charge",
              "value": 0.5,
              "unit": "1 (fraction)"
            }
          ]
        },
        "limits": [
          "This is a quasi-static bound. It excludes polarization dynamics, temperature evolution and weakest-cell limits in a pack.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-power-capability"
        ],
        "exampleTraces": [
          {
            "id": "battery-power-capability",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-power-capability.json?v=d263c9002090",
            "title": "Pulse power capability recorded example",
            "exampleId": "block-battery-power-capability",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 4,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-power-capability",
        "implementationId": "battery-power-capability",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-power-capability/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-power-capability/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-power-capability"
          ]
        },
        "studioHelp": {
          "type": "battery-power-capability",
          "namespace": "signal",
          "slug": "signal-block-battery-power-capability",
          "canonicalSlug": "battery-power-capability",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Pulse power capability",
            "label": "Pulse power capability",
            "summary": "Quasi-static voltage/current/SOC envelope for an explicit prediction horizon.",
            "details": [
              "Block type: battery-power-capability.",
              "3 declared inputs and 4 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Pulse power capability",
              "caption": "Quasi-static voltage/current/SOC envelope for an explicit prediction horizon."
            },
            "inputs": [
              {
                "id": "ocv",
                "label": "Open-circuit voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "resistance",
                "label": "Effective pulse resistance (ohm)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "soc",
                "label": "State of charge",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "discharge",
                "label": "Discharge-current limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "charge",
                "label": "Charge-current magnitude limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "dischargePower",
                "label": "Discharge power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "chargePower",
                "label": "Charge power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"capacityAh\":2,\"horizonS\":60,\"minVoltageV\":3,\"maxVoltageV\":4.2,\"maxDischargeA\":5,\"maxChargeA\":3,\"minSoc\":0.2,\"maxSoc\":0.8}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-power-capability/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-single-particle-cell",
      "type": "Block",
      "label": "Single-particle cell",
      "properties": {
        "id": "battery-single-particle-cell",
        "name": "Single-particle cell",
        "kind": "studio",
        "summary": "Native spherical solid diffusion and Butler-Volmer kinetics with tabulated electrode OCPs. Isothermal material parameters; no electrolyte transport, aging or conserving adapter.",
        "behavior": "Solves spherical solid diffusion in separate negative and positive representative particles with conservative radial finite volumes. Opposite Faradaic fluxes transfer lithium between electrodes. Surface stoichiometries drive tabulated OCPs and Butler-Volmer overpotentials; temperature is prescribed.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed cell current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "temperature",
            "direction": "input",
            "unit": "K",
            "description": "Kinetics temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "socNegative",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Negative-window SOC; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "socPositive",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Positive-window SOC; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "surfaceNegative",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Negative surface stoichiometry; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "surfacePositive",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Positive surface stoichiometry; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "lithium",
            "direction": "output",
            "unit": "1",
            "description": "Solid lithium inventory (mol); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "concentrationNegative",
            "direction": "output",
            "unit": "1",
            "description": "Negative shell concentrations (mol/m³); 8 channels at the default configuration.",
            "shape": [
              8
            ],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "concentrationPositive",
            "direction": "output",
            "unit": "1",
            "description": "Positive shell concentrations (mol/m³); 8 channels at the default configuration.",
            "shape": [
              8
            ],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "shells",
            "label": "Radial shells per particle",
            "unit": "1",
            "default": 8,
            "description": "Radial shells per particle. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "areaM2",
            "label": "Electrode area (m²)",
            "unit": "m²",
            "default": 0.01,
            "description": "Electrode area (m²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Contact resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Contact resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialSoc",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.5,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "negative",
            "label": "Negative electrode parameters (see model notes)",
            "unit": "See field order",
            "default": [
              5e-06,
              0.0001,
              0.5,
              30000,
              1e-13,
              2,
              0.1,
              0.9
            ],
            "description": "Ordered fields: particle radius (m), electrode thickness (m), solid volume fraction, maximum concentration (mol/m³), diffusion coefficient (m²/s), exchange-current density at half filling (A/m²), empty stoichiometry, full stoichiometry."
          },
          {
            "key": "positive",
            "label": "Positive electrode parameters (see model notes)",
            "unit": "See field order",
            "default": [
              5e-06,
              0.0001,
              0.5,
              30000,
              1e-13,
              2,
              0.9,
              0.1
            ],
            "description": "Ordered fields: particle radius (m), electrode thickness (m), solid volume fraction, maximum concentration (mol/m³), diffusion coefficient (m²/s), exchange-current density at half filling (A/m²), empty stoichiometry, full stoichiometry."
          },
          {
            "key": "negativeOcp",
            "label": "Negative electrode OCP [stoichiometry, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                0.1
              ],
              [
                1,
                0.1
              ]
            ],
            "description": "Negative electrode OCP [stoichiometry, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "positiveOcp",
            "label": "Positive electrode OCP [stoichiometry, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                4.1
              ],
              [
                1,
                4.1
              ]
            ],
            "description": "Positive electrode OCP [stoichiometry, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "dc/dt = D/r^2 * d/dr(r^2 * dc/dr)",
          "surface molar flux magnitude = I / (F * active particle area)",
          "V = Up(surface) - Un(surface) - etaP - etaN - I*Rseries"
        ],
        "example": {
          "title": "Single-particle cell worked example",
          "text": "Use the defaults below with Signed cell current = 1 A, Kinetics temperature = 298.15 K. At 0 s, Terminal voltage is 3.912048435 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-single-particle-cell",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 3.9120484354726908,
              "tolerance": 1e-08,
              "label": "Terminal voltage",
              "unit": "V"
            },
            {
              "port": "socNegative",
              "atS": 0,
              "value": 0.5,
              "tolerance": 1e-08,
              "label": "Negative-window SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "socPositive",
              "atS": 0,
              "value": 0.5,
              "tolerance": 1e-08,
              "label": "Positive-window SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "lithium",
              "atS": 0,
              "value": 0.015,
              "tolerance": 1e-08,
              "label": "Solid lithium inventory (mol)",
              "unit": "1"
            },
            {
              "port": "socNegative",
              "atS": 10,
              "value": 0.49136310861948523,
              "tolerance": 1e-08,
              "label": "Negative-window SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "socPositive",
              "atS": 10,
              "value": 0.49136310861948523,
              "tolerance": 1e-08,
              "label": "Positive-window SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "lithium",
              "atS": 10,
              "value": 0.015,
              "tolerance": 1e-10,
              "label": "Solid lithium inventory (mol)",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed cell current",
              "value": 1,
              "unit": "A"
            },
            {
              "port": "temperature",
              "label": "Kinetics temperature",
              "value": 298.15,
              "unit": "K"
            }
          ]
        },
        "limits": [
          "Fixed solid diffusion and material coefficients; no electrolyte transport, aging, thermal state or conserving boundary adapter. Surface concentrations must stay strictly inside their physical range. The cited paper explains model assumptions and a richer electrolyte extension; this block implements the stated solid-only model.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "marquis-spm"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-single-particle-cell"
        ],
        "exampleTraces": [
          {
            "id": "battery-single-particle-cell",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-single-particle-cell.json?v=e78ff128bfde",
            "title": "Single-particle cell recorded example",
            "exampleId": "block-battery-single-particle-cell",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 10,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-single-particle-cell",
        "implementationId": "battery-single-particle-cell",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-single-particle-cell/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-single-particle-cell/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-single-particle-cell"
          ]
        },
        "studioHelp": {
          "type": "battery-single-particle-cell",
          "namespace": "signal",
          "slug": "signal-block-battery-single-particle-cell",
          "canonicalSlug": "battery-single-particle-cell",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Single-particle cell",
            "label": "Single-particle cell",
            "summary": "Native spherical solid diffusion and Butler-Volmer kinetics with tabulated electrode OCPs. Isothermal material parameters; no electrolyte transport, aging or conserving adapter.",
            "details": [
              "Block type: battery-single-particle-cell.",
              "2 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "diffusion → kinetics → V",
              "label": "Single-particle cell",
              "caption": "Native spherical solid diffusion and Butler-Volmer kinetics with tabulated electrode OCPs. Isothermal material parameters; no electrolyte transport, aging or conserving adapter."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed cell current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Kinetics temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "socNegative",
                "label": "Negative-window SOC",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "socPositive",
                "label": "Positive-window SOC",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "surfaceNegative",
                "label": "Negative surface stoichiometry",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "surfacePositive",
                "label": "Positive surface stoichiometry",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "lithium",
                "label": "Solid lithium inventory (mol)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "concentrationNegative",
                "label": "Negative shell concentrations (mol/m³)",
                "quantity": "dimensionless",
                "shape": [
                  8
                ],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Array 8",
                "elementLabel": "real"
              },
              {
                "id": "concentrationPositive",
                "label": "Positive shell concentrations (mol/m³)",
                "quantity": "dimensionless",
                "shape": [
                  8
                ],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Array 8",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"shells\":8,\"areaM2\":0.01,\"resistanceOhm\":0.01,\"initialSoc\":0.5,\"negative\":[0.000005,0.0001,0.5,30000,1e-13,2,0.1,0.9],\"positive\":[0.000005,0.0001,0.5,30000,1e-13,2,0.9,0.1],\"negativeOcp\":[[0,0.1],[1,0.1]],\"positiveOcp\":[[0,4.1],[1,4.1]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-single-particle-cell/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-soc-adaptive-ekf",
      "type": "Block",
      "label": "SOC adaptive EKF",
      "properties": {
        "id": "battery-soc-adaptive-ekf",
        "name": "SOC adaptive EKF",
        "kind": "studio",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
        "behavior": "Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed battery current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage measurement valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of charge; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Posterior fraction variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 2,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.6,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.04,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0.1,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R"
        ],
        "example": {
          "title": "SOC adaptive EKF worked example",
          "text": "Use the defaults below with Signed battery current = 0 A, Measured voltage = 3.8 V, Voltage measurement valid = 1 true / false, Reset = 0 true / false. At 0 s, State of charge is 0.76 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-soc-adaptive-ekf",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.76,
              "tolerance": 1e-08,
              "label": "State of charge",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.008,
              "tolerance": 1e-08,
              "label": "Posterior fraction variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed battery current",
              "value": 0,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage measurement valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-soc-adaptive-ekf"
        ],
        "exampleTraces": [
          {
            "id": "battery-soc-adaptive-ekf",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-soc-adaptive-ekf.json?v=d15c008d6b58",
            "title": "SOC adaptive EKF recorded example",
            "exampleId": "block-battery-soc-adaptive-ekf",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-soc-adaptive-ekf",
        "implementationId": "battery-soc-adaptive-ekf",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-soc-adaptive-ekf/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-soc-adaptive-ekf/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-soc-adaptive-ekf"
          ]
        },
        "studioHelp": {
          "type": "battery-soc-adaptive-ekf",
          "namespace": "signal",
          "slug": "signal-block-battery-soc-adaptive-ekf",
          "canonicalSlug": "battery-soc-adaptive-ekf",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "SOC adaptive EKF",
            "label": "SOC adaptive EKF",
            "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
            "details": [
              "Block type: battery-soc-adaptive-ekf.",
              "4 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "SOC adaptive EKF",
              "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed battery current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage measurement valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of charge",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Posterior fraction variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0.1,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soc-adaptive-ekf/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-soc-adaptive-ekf-variable-capacity",
      "type": "Block",
      "label": "SOC adaptive EKF with capacity input",
      "properties": {
        "id": "battery-soc-adaptive-ekf-variable-capacity",
        "name": "SOC adaptive EKF with capacity input",
        "kind": "studio",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
        "behavior": "Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed battery current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage measurement valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "capacity",
            "direction": "input",
            "unit": "Ah",
            "description": "Charge capacity (Ah); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of charge; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Posterior fraction variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 2,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.6,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.04,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0.1,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R"
        ],
        "example": {
          "title": "SOC adaptive EKF with capacity input worked example",
          "text": "Use the defaults below with Signed battery current = 0 A, Measured voltage = 3.8 V, Voltage measurement valid = 1 true / false, Reset = 0 true / false, Charge capacity (Ah) = 2 Ah. At 0 s, State of charge is 0.76 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-soc-adaptive-ekf-variable-capacity",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.76,
              "tolerance": 1e-08,
              "label": "State of charge",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.008,
              "tolerance": 1e-08,
              "label": "Posterior fraction variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed battery current",
              "value": 0,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage measurement valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            },
            {
              "port": "capacity",
              "label": "Charge capacity (Ah)",
              "value": 2,
              "unit": "Ah"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-soc-adaptive-ekf-variable-capacity"
        ],
        "exampleTraces": [
          {
            "id": "battery-soc-adaptive-ekf-variable-capacity",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-soc-adaptive-ekf-variable-capacity.json?v=9bcd2ed98d6b",
            "title": "SOC adaptive EKF with capacity input recorded example",
            "exampleId": "block-battery-soc-adaptive-ekf-variable-capacity",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-soc-adaptive-ekf-variable-capacity",
        "implementationId": "battery-soc-adaptive-ekf-variable-capacity",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-soc-adaptive-ekf-variable-capacity/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-soc-adaptive-ekf-variable-capacity/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-soc-adaptive-ekf-variable-capacity"
          ]
        },
        "studioHelp": {
          "type": "battery-soc-adaptive-ekf-variable-capacity",
          "namespace": "signal",
          "slug": "signal-block-battery-soc-adaptive-ekf-variable-capacity",
          "canonicalSlug": "battery-soc-adaptive-ekf-variable-capacity",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "SOC adaptive EKF with capacity input",
            "label": "SOC adaptive EKF with capacity input",
            "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
            "details": [
              "Block type: battery-soc-adaptive-ekf-variable-capacity.",
              "5 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "SOC adaptive EKF with capacity input",
              "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed battery current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage measurement valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "capacity",
                "label": "Charge capacity (Ah)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of charge",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Posterior fraction variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0.1,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soc-adaptive-ekf-variable-capacity/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-soc-ekf",
      "type": "Block",
      "label": "SOC EKF",
      "properties": {
        "id": "battery-soc-ekf",
        "name": "SOC EKF",
        "kind": "studio",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
        "behavior": "Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed battery current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage measurement valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of charge; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Posterior fraction variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 2,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.6,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.04,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R"
        ],
        "example": {
          "title": "SOC EKF worked example",
          "text": "Use the defaults below with Signed battery current = 0 A, Measured voltage = 3.8 V, Voltage measurement valid = 1 true / false, Reset = 0 true / false. At 0 s, State of charge is 0.76 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-soc-ekf",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.76,
              "tolerance": 1e-08,
              "label": "State of charge",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.008,
              "tolerance": 1e-08,
              "label": "Posterior fraction variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed battery current",
              "value": 0,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage measurement valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-soc-ekf"
        ],
        "exampleTraces": [
          {
            "id": "battery-soc-ekf",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-soc-ekf.json?v=7f32a1ff81ad",
            "title": "SOC EKF recorded example",
            "exampleId": "block-battery-soc-ekf",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-soc-ekf",
        "implementationId": "battery-soc-ekf",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-soc-ekf/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-soc-ekf/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-soc-ekf"
          ]
        },
        "studioHelp": {
          "type": "battery-soc-ekf",
          "namespace": "signal",
          "slug": "signal-block-battery-soc-ekf",
          "canonicalSlug": "battery-soc-ekf",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "SOC EKF",
            "label": "SOC EKF",
            "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
            "details": [
              "Block type: battery-soc-ekf.",
              "4 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "SOC EKF",
              "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed battery current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage measurement valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of charge",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Posterior fraction variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soc-ekf/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-soc-ekf-variable-capacity",
      "type": "Block",
      "label": "SOC EKF with capacity input",
      "properties": {
        "id": "battery-soc-ekf-variable-capacity",
        "name": "SOC EKF with capacity input",
        "kind": "studio",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
        "behavior": "Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed battery current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage measurement valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "capacity",
            "direction": "input",
            "unit": "Ah",
            "description": "Charge capacity (Ah); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of charge; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Posterior fraction variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 2,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.6,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.04,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R"
        ],
        "example": {
          "title": "SOC EKF with capacity input worked example",
          "text": "Use the defaults below with Signed battery current = 0 A, Measured voltage = 3.8 V, Voltage measurement valid = 1 true / false, Reset = 0 true / false, Charge capacity (Ah) = 2 Ah. At 0 s, State of charge is 0.76 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-soc-ekf-variable-capacity",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.76,
              "tolerance": 1e-08,
              "label": "State of charge",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.008,
              "tolerance": 1e-08,
              "label": "Posterior fraction variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed battery current",
              "value": 0,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage measurement valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            },
            {
              "port": "capacity",
              "label": "Charge capacity (Ah)",
              "value": 2,
              "unit": "Ah"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-soc-ekf-variable-capacity"
        ],
        "exampleTraces": [
          {
            "id": "battery-soc-ekf-variable-capacity",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-soc-ekf-variable-capacity.json?v=aa3942bed11e",
            "title": "SOC EKF with capacity input recorded example",
            "exampleId": "block-battery-soc-ekf-variable-capacity",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-soc-ekf-variable-capacity",
        "implementationId": "battery-soc-ekf-variable-capacity",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-soc-ekf-variable-capacity/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-soc-ekf-variable-capacity/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-soc-ekf-variable-capacity"
          ]
        },
        "studioHelp": {
          "type": "battery-soc-ekf-variable-capacity",
          "namespace": "signal",
          "slug": "signal-block-battery-soc-ekf-variable-capacity",
          "canonicalSlug": "battery-soc-ekf-variable-capacity",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "SOC EKF with capacity input",
            "label": "SOC EKF with capacity input",
            "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
            "details": [
              "Block type: battery-soc-ekf-variable-capacity.",
              "5 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "SOC EKF with capacity input",
              "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed battery current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage measurement valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "capacity",
                "label": "Charge capacity (Ah)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of charge",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Posterior fraction variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":2,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soc-ekf-variable-capacity/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-soe-adaptive-ekf",
      "type": "Block",
      "label": "SOE adaptive EKF",
      "properties": {
        "id": "battery-soe-adaptive-ekf",
        "name": "SOE adaptive EKF",
        "kind": "studio",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
        "behavior": "Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "power",
            "direction": "input",
            "unit": "W",
            "description": "Signed battery power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed battery current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage measurement valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of energy; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Posterior fraction variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Energy capacity (J)",
            "unit": "J",
            "default": 7200,
            "description": "Energy capacity (J). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOE (0–1)",
            "unit": "0–1",
            "default": 0.6,
            "description": "Initial SOE (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.04,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0.1,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "OCV table [energy fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "OCV table [energy fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R"
        ],
        "example": {
          "title": "SOE adaptive EKF worked example",
          "text": "Use the defaults below with Signed battery power = 0 W, Signed battery current = 0 A, Measured voltage = 3.8 V, Voltage measurement valid = 1 true / false, Reset = 0 true / false. At 0 s, State of energy is 0.76 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-soe-adaptive-ekf",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.76,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.008,
              "tolerance": 1e-08,
              "label": "Posterior fraction variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "power",
              "label": "Signed battery power",
              "value": 0,
              "unit": "W"
            },
            {
              "port": "current",
              "label": "Signed battery current",
              "value": 0,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage measurement valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-soe-adaptive-ekf"
        ],
        "exampleTraces": [
          {
            "id": "battery-soe-adaptive-ekf",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-soe-adaptive-ekf.json?v=a4b640b8a173",
            "title": "SOE adaptive EKF recorded example",
            "exampleId": "block-battery-soe-adaptive-ekf",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-soe-adaptive-ekf",
        "implementationId": "battery-soe-adaptive-ekf",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-soe-adaptive-ekf/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-soe-adaptive-ekf/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-soe-adaptive-ekf"
          ]
        },
        "studioHelp": {
          "type": "battery-soe-adaptive-ekf",
          "namespace": "signal",
          "slug": "signal-block-battery-soe-adaptive-ekf",
          "canonicalSlug": "battery-soe-adaptive-ekf",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "SOE adaptive EKF",
            "label": "SOE adaptive EKF",
            "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
            "details": [
              "Block type: battery-soe-adaptive-ekf.",
              "5 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "SOE adaptive EKF",
              "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance."
            },
            "inputs": [
              {
                "id": "power",
                "label": "Signed battery power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "current",
                "label": "Signed battery current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage measurement valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of energy",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Posterior fraction variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0.1,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soe-adaptive-ekf/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-soe-adaptive-ekf-variable-capacity",
      "type": "Block",
      "label": "SOE adaptive EKF with capacity input",
      "properties": {
        "id": "battery-soe-adaptive-ekf-variable-capacity",
        "name": "SOE adaptive EKF with capacity input",
        "kind": "studio",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
        "behavior": "Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "power",
            "direction": "input",
            "unit": "W",
            "description": "Signed battery power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed battery current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage measurement valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "capacity",
            "direction": "input",
            "unit": "J",
            "description": "Energy capacity (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of energy; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Posterior fraction variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Energy capacity (J)",
            "unit": "J",
            "default": 7200,
            "description": "Energy capacity (J). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOE (0–1)",
            "unit": "0–1",
            "default": 0.6,
            "description": "Initial SOE (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.04,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0.1,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "OCV table [energy fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "OCV table [energy fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R"
        ],
        "example": {
          "title": "SOE adaptive EKF with capacity input worked example",
          "text": "Use the defaults below with Signed battery power = 0 W, Signed battery current = 0 A, Measured voltage = 3.8 V, Voltage measurement valid = 1 true / false, Reset = 0 true / false, Energy capacity (J) = 7200 J. At 0 s, State of energy is 0.76 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-soe-adaptive-ekf-variable-capacity",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.76,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.008,
              "tolerance": 1e-08,
              "label": "Posterior fraction variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "power",
              "label": "Signed battery power",
              "value": 0,
              "unit": "W"
            },
            {
              "port": "current",
              "label": "Signed battery current",
              "value": 0,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage measurement valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            },
            {
              "port": "capacity",
              "label": "Energy capacity (J)",
              "value": 7200,
              "unit": "J"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-soe-adaptive-ekf-variable-capacity"
        ],
        "exampleTraces": [
          {
            "id": "battery-soe-adaptive-ekf-variable-capacity",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-soe-adaptive-ekf-variable-capacity.json?v=ef4e0098c467",
            "title": "SOE adaptive EKF with capacity input recorded example",
            "exampleId": "block-battery-soe-adaptive-ekf-variable-capacity",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-soe-adaptive-ekf-variable-capacity",
        "implementationId": "battery-soe-adaptive-ekf-variable-capacity",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-soe-adaptive-ekf-variable-capacity/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-soe-adaptive-ekf-variable-capacity/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-soe-adaptive-ekf-variable-capacity"
          ]
        },
        "studioHelp": {
          "type": "battery-soe-adaptive-ekf-variable-capacity",
          "namespace": "signal",
          "slug": "signal-block-battery-soe-adaptive-ekf-variable-capacity",
          "canonicalSlug": "battery-soe-adaptive-ekf-variable-capacity",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "SOE adaptive EKF with capacity input",
            "label": "SOE adaptive EKF with capacity input",
            "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
            "details": [
              "Block type: battery-soe-adaptive-ekf-variable-capacity.",
              "6 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "SOE adaptive EKF with capacity input",
              "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance."
            },
            "inputs": [
              {
                "id": "power",
                "label": "Signed battery power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "current",
                "label": "Signed battery current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage measurement valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "capacity",
                "label": "Energy capacity (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of energy",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Posterior fraction variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0.1,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soe-adaptive-ekf-variable-capacity/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-soe-ekf",
      "type": "Block",
      "label": "SOE EKF",
      "properties": {
        "id": "battery-soe-ekf",
        "name": "SOE EKF",
        "kind": "studio",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
        "behavior": "Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "power",
            "direction": "input",
            "unit": "W",
            "description": "Signed battery power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed battery current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage measurement valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of energy; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Posterior fraction variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Energy capacity (J)",
            "unit": "J",
            "default": 7200,
            "description": "Energy capacity (J). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOE (0–1)",
            "unit": "0–1",
            "default": 0.6,
            "description": "Initial SOE (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.04,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "OCV table [energy fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "OCV table [energy fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R"
        ],
        "example": {
          "title": "SOE EKF worked example",
          "text": "Use the defaults below with Signed battery power = 0 W, Signed battery current = 0 A, Measured voltage = 3.8 V, Voltage measurement valid = 1 true / false, Reset = 0 true / false. At 0 s, State of energy is 0.76 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-soe-ekf",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.76,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.008,
              "tolerance": 1e-08,
              "label": "Posterior fraction variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "power",
              "label": "Signed battery power",
              "value": 0,
              "unit": "W"
            },
            {
              "port": "current",
              "label": "Signed battery current",
              "value": 0,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage measurement valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-soe-ekf"
        ],
        "exampleTraces": [
          {
            "id": "battery-soe-ekf",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-soe-ekf.json?v=af43eb420cff",
            "title": "SOE EKF recorded example",
            "exampleId": "block-battery-soe-ekf",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-soe-ekf",
        "implementationId": "battery-soe-ekf",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-soe-ekf/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-soe-ekf/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-soe-ekf"
          ]
        },
        "studioHelp": {
          "type": "battery-soe-ekf",
          "namespace": "signal",
          "slug": "signal-block-battery-soe-ekf",
          "canonicalSlug": "battery-soe-ekf",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "SOE EKF",
            "label": "SOE EKF",
            "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
            "details": [
              "Block type: battery-soe-ekf.",
              "5 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "SOE EKF",
              "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity."
            },
            "inputs": [
              {
                "id": "power",
                "label": "Signed battery power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "current",
                "label": "Signed battery current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage measurement valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of energy",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Posterior fraction variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soe-ekf/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-soe-ekf-variable-capacity",
      "type": "Block",
      "label": "SOE EKF with capacity input",
      "properties": {
        "id": "battery-soe-ekf-variable-capacity",
        "name": "SOE EKF with capacity input",
        "kind": "studio",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
        "behavior": "Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "power",
            "direction": "input",
            "unit": "W",
            "description": "Signed battery power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed battery current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage measurement valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "capacity",
            "direction": "input",
            "unit": "J",
            "description": "Energy capacity (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of energy; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Posterior fraction variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Energy capacity (J)",
            "unit": "J",
            "default": 7200,
            "description": "Energy capacity (J). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOE (0–1)",
            "unit": "0–1",
            "default": 0.6,
            "description": "Initial SOE (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.04,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "OCV table [energy fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "OCV table [energy fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R"
        ],
        "example": {
          "title": "SOE EKF with capacity input worked example",
          "text": "Use the defaults below with Signed battery power = 0 W, Signed battery current = 0 A, Measured voltage = 3.8 V, Voltage measurement valid = 1 true / false, Reset = 0 true / false, Energy capacity (J) = 7200 J. At 0 s, State of energy is 0.76 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-soe-ekf-variable-capacity",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.76,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.008,
              "tolerance": 1e-08,
              "label": "Posterior fraction variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "power",
              "label": "Signed battery power",
              "value": 0,
              "unit": "W"
            },
            {
              "port": "current",
              "label": "Signed battery current",
              "value": 0,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage measurement valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            },
            {
              "port": "capacity",
              "label": "Energy capacity (J)",
              "value": 7200,
              "unit": "J"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-soe-ekf-variable-capacity"
        ],
        "exampleTraces": [
          {
            "id": "battery-soe-ekf-variable-capacity",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-soe-ekf-variable-capacity.json?v=84eaa2347ccf",
            "title": "SOE EKF with capacity input recorded example",
            "exampleId": "block-battery-soe-ekf-variable-capacity",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-soe-ekf-variable-capacity",
        "implementationId": "battery-soe-ekf-variable-capacity",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-soe-ekf-variable-capacity/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-soe-ekf-variable-capacity/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-soe-ekf-variable-capacity"
          ]
        },
        "studioHelp": {
          "type": "battery-soe-ekf-variable-capacity",
          "namespace": "signal",
          "slug": "signal-block-battery-soe-ekf-variable-capacity",
          "canonicalSlug": "battery-soe-ekf-variable-capacity",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "SOE EKF with capacity input",
            "label": "SOE EKF with capacity input",
            "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
            "details": [
              "Block type: battery-soe-ekf-variable-capacity.",
              "6 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "SOE EKF with capacity input",
              "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity."
            },
            "inputs": [
              {
                "id": "power",
                "label": "Signed battery power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "current",
                "label": "Signed battery current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage measurement valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "capacity",
                "label": "Energy capacity (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of energy",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Posterior fraction variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soe-ekf-variable-capacity/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-state-space-impedance",
      "type": "Block",
      "label": "State-space impedance",
      "properties": {
        "id": "battery-state-space-impedance",
        "name": "State-space impedance",
        "kind": "studio",
        "summary": "Continuous current-to-voltage linear dynamics with direct feedthrough. User supplies identified matrices.",
        "behavior": "Solves a user-supplied continuous linear state model from current inputs to voltage outputs. Dense matrices support multiple input/output channels and direct feedthrough. Matrices are displayed as rows in configuration.",
        "ports": [
          {
            "name": "input",
            "direction": "input",
            "unit": "A",
            "description": "Current inputs; 1 channels at the default configuration.",
            "shape": [
              1
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "output",
            "direction": "output",
            "unit": "V",
            "description": "Voltage outputs; 1 channels at the default configuration.",
            "shape": [
              1
            ],
            "elementType": "real",
            "quantity": "voltage"
          }
        ],
        "parameters": [
          {
            "key": "A",
            "label": "State matrix A",
            "unit": "Model-dependent",
            "default": [
              [
                -0.1
              ]
            ],
            "description": "Row-oriented state matrix. Dimensions must agree with B, C, D and the initial state."
          },
          {
            "key": "B",
            "label": "Input matrix B",
            "unit": "Model-dependent",
            "default": [
              [
                0.005
              ]
            ],
            "description": "Row-oriented input matrix. One column per input channel."
          },
          {
            "key": "C",
            "label": "Output matrix C",
            "unit": "Model-dependent",
            "default": [
              [
                1
              ]
            ],
            "description": "Row-oriented output matrix. One row per output channel."
          },
          {
            "key": "D",
            "label": "Feedthrough matrix D",
            "unit": "Model-dependent",
            "default": [
              [
                0.01
              ]
            ],
            "description": "Row-oriented direct feedthrough matrix; output rows by input columns."
          },
          {
            "key": "initial",
            "label": "Initial state vector",
            "unit": "See field order",
            "default": [
              0
            ],
            "description": "Initial state vector, with one value per state."
          }
        ],
        "equations": [
          "dx/dt = A*x + B*u",
          "y = C*x + D*u"
        ],
        "example": {
          "title": "State-space impedance worked example",
          "text": "Use the defaults below with Current inputs = [2] A. At 0 s, Voltage outputs is [0.02] V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-state-space-impedance",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "output",
              "atS": 0,
              "value": [
                0.02
              ],
              "tolerance": 1e-08,
              "label": "Voltage outputs",
              "unit": "V"
            }
          ],
          "inputs": [
            {
              "port": "input",
              "label": "Current inputs",
              "value": [
                2
              ],
              "unit": "A"
            }
          ]
        },
        "limits": [
          "At most 16 states and eight inputs or outputs. The model author must identify stable, physically meaningful matrices and consistent units. No automatic impedance fitting is performed.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "astrom-murray-feedback"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-state-space-impedance"
        ],
        "exampleTraces": [
          {
            "id": "battery-state-space-impedance",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-state-space-impedance.json?v=25cc56ce40bd",
            "title": "State-space impedance recorded example",
            "exampleId": "block-battery-state-space-impedance",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 1,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-state-space-impedance",
        "implementationId": "battery-state-space-impedance",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-state-space-impedance/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-state-space-impedance/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-state-space-impedance"
          ]
        },
        "studioHelp": {
          "type": "battery-state-space-impedance",
          "namespace": "signal",
          "slug": "signal-block-battery-state-space-impedance",
          "canonicalSlug": "battery-state-space-impedance",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "State-space impedance",
            "label": "State-space impedance",
            "summary": "Continuous current-to-voltage linear dynamics with direct feedthrough. User supplies identified matrices.",
            "details": [
              "Block type: battery-state-space-impedance.",
              "1 declared input and 1 declared output in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "State-space impedance",
              "caption": "Continuous current-to-voltage linear dynamics with direct feedthrough. User supplies identified matrices."
            },
            "inputs": [
              {
                "id": "input",
                "label": "Current inputs",
                "quantity": "current",
                "shape": [
                  1
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 1",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "output",
                "label": "Voltage outputs",
                "quantity": "voltage",
                "shape": [
                  1
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 1",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"A\":[[-0.1]],\"B\":[[0.005]],\"C\":[[1]],\"D\":[[0.01]],\"initial\":[0]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-state-space-impedance/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-supercapacitor",
      "type": "Block",
      "label": "Supercapacitor cell",
      "properties": {
        "id": "battery-supercapacitor",
        "name": "Supercapacitor cell",
        "kind": "studio",
        "summary": "Causal capacitor state with series loss, leakage and stored energy.",
        "behavior": "Integrates the internal capacitor voltage from discharge current and leakage. A series resistance produces terminal voltage drop and heat. Stored energy uses the internal capacitor voltage.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed discharge current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "internalVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Capacitor voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "energy",
            "direction": "output",
            "unit": "J",
            "description": "Stored energy; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Dissipated heat; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          }
        ],
        "parameters": [
          {
            "key": "capacitanceF",
            "label": "Capacitance (F)",
            "unit": "F",
            "default": 100,
            "description": "Capacitance (F). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "leakageSiemens",
            "label": "Leakage conductance (S)",
            "unit": "S",
            "default": 0,
            "description": "Leakage conductance (S). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVoltageV",
            "label": "Initial capacitor voltage (V)",
            "unit": "V",
            "default": 2.5,
            "description": "Initial capacitor voltage (V). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "C*dVcap/dt = -I - Gleak*Vcap",
          "Vterminal = Vcap - I*Rseries",
          "E = 0.5*C*Vcap^2",
          "Ploss = I^2*Rseries + Gleak*Vcap^2"
        ],
        "example": {
          "title": "Supercapacitor cell worked example",
          "text": "Use the defaults below with Signed discharge current = 1 A. At 0 s, Terminal voltage is 2.45 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-supercapacitor",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 2.45,
              "tolerance": 1e-08,
              "label": "Terminal voltage",
              "unit": "V"
            },
            {
              "port": "energy",
              "atS": 0,
              "value": 312.5,
              "tolerance": 1e-08,
              "label": "Stored energy",
              "unit": "J"
            },
            {
              "port": "energy",
              "atS": 10,
              "value": 288,
              "tolerance": 1e-06,
              "label": "Stored energy",
              "unit": "J"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed discharge current",
              "value": 1,
              "unit": "A"
            }
          ]
        },
        "limits": [
          "Constant capacitance, series resistance and leakage. The external interface is causal; voltage- or temperature-dependent parameters are not included.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "bipm-si"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-supercapacitor"
        ],
        "exampleTraces": [
          {
            "id": "battery-supercapacitor",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-supercapacitor.json?v=8efe06cb84e3",
            "title": "Supercapacitor cell recorded example",
            "exampleId": "block-battery-supercapacitor",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 4,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-supercapacitor",
        "implementationId": "battery-supercapacitor",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-supercapacitor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-supercapacitor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-supercapacitor"
          ]
        },
        "studioHelp": {
          "type": "battery-supercapacitor",
          "namespace": "signal",
          "slug": "signal-block-battery-supercapacitor",
          "canonicalSlug": "battery-supercapacitor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Supercapacitor cell",
            "label": "Supercapacitor cell",
            "summary": "Causal capacitor state with series loss, leakage and stored energy.",
            "details": [
              "Block type: battery-supercapacitor.",
              "1 declared input and 4 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Supercapacitor cell",
              "caption": "Causal capacitor state with series loss, leakage and stored energy."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed discharge current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "internalVoltage",
                "label": "Capacitor voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "energy",
                "label": "Stored energy",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "loss",
                "label": "Dissipated heat",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"capacitanceF\":100,\"resistanceOhm\":0.05,\"leakageSiemens\":0,\"initialVoltageV\":2.5}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-supercapacitor/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-tabulated-cell",
      "type": "Block",
      "label": "Tabulated OCV cell",
      "properties": {
        "id": "battery-tabulated-cell",
        "name": "Tabulated OCV cell",
        "kind": "studio",
        "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
        "behavior": "Accepts signed discharge current, ambient temperature and external heat. Charge balance drives SOC; an OCV table sets equilibrium voltage. The ECM adds two RC polarization states. Both variants include an ohmic loss and a lumped temperature state.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed cell current (discharge positive); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Ambient temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External heat flow; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "soc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of charge; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Cell temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Irreversible heat; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "ocv",
            "direction": "output",
            "unit": "V",
            "description": "Open-circuit voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "inRange",
            "direction": "output",
            "unit": "true / false",
            "description": "SOC in characterized range; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "capacityAh",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 5,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "heatCapacityJPerK",
            "label": "Heat capacity (J/K)",
            "unit": "J/K",
            "default": 100,
            "description": "Heat capacity (J/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "conductanceWPerK",
            "label": "Ambient thermal conductance (W/K)",
            "unit": "W/K",
            "default": 1,
            "description": "Ambient thermal conductance (W/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialSoc",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.8,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialTemperatureK",
            "label": "Initial cell temperature (K)",
            "unit": "K",
            "default": 298.15,
            "description": "Initial cell temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "dSOC/dt = -I / (3600 * capacityAh)",
          "dVk/dt = (I - Vk/Rk) / Ck  [ECM branches only]",
          "Vterminal = OCV(SOC) - I*R0 - sum(Vk)",
          "Cthermal*dT/dt = I^2*R0 + sum(Vk^2/Rk) + Qexternal - G*(T-Tambient)"
        ],
        "example": {
          "title": "Tabulated OCV cell worked example",
          "text": "Use the defaults below with Signed cell current (discharge positive) = 2 A, Ambient temperature = 298.15 K, External heat flow = 0 W. At 0 s, Terminal voltage is 3.68 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-tabulated-cell",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 3.68,
              "tolerance": 1e-08,
              "label": "Terminal voltage",
              "unit": "V"
            },
            {
              "port": "soc",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "State of charge",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed cell current (discharge positive)",
              "value": 2,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Ambient temperature",
              "value": 298.15,
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External heat flow",
              "value": 0,
              "unit": "W"
            }
          ]
        },
        "limits": [
          "The external interface is causal current-to-voltage, without conserving terminals. Parameters are constant except the one-dimensional SOC-to-OCV table. No hysteresis, aging, reversible entropic heat or automatic parameter identification.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-tabulated-cell"
        ],
        "exampleTraces": [
          {
            "id": "battery-tabulated-cell",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-tabulated-cell.json?v=eaf379d0c89d",
            "title": "Tabulated OCV cell recorded example",
            "exampleId": "block-battery-tabulated-cell",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-tabulated-cell",
        "implementationId": "battery-tabulated-cell",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-tabulated-cell/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-tabulated-cell/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-tabulated-cell"
          ]
        },
        "studioHelp": {
          "type": "battery-tabulated-cell",
          "namespace": "signal",
          "slug": "signal-block-battery-tabulated-cell",
          "canonicalSlug": "battery-tabulated-cell",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Tabulated OCV cell",
            "label": "Tabulated OCV cell",
            "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
            "details": [
              "Block type: battery-tabulated-cell.",
              "3 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "I → cell state → V, T",
              "label": "Tabulated electrical cell",
              "caption": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed cell current (discharge positive)",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Ambient temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External heat flow",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "soc",
                "label": "State of charge",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "loss",
                "label": "Irreversible heat",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ocv",
                "label": "Open-circuit voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "inRange",
                "label": "SOC in characterized range",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"capacityAh\":5,\"resistanceOhm\":0.01,\"heatCapacityJPerK\":100,\"conductanceWPerK\":1,\"initialSoc\":0.8,\"initialTemperatureK\":298.15,\"ocvTable\":[[0,3.7],[1,3.7]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-tabulated-cell/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-voltage-monitor",
      "type": "Block",
      "label": "Battery voltage monitor",
      "properties": {
        "id": "battery-voltage-monitor",
        "name": "Battery voltage monitor",
        "kind": "studio",
        "summary": "Reports each channel below/above its bounds and a combined fault.",
        "behavior": "Compares each measured channel with strict lower and upper bounds. A value equal to a bound does not trip. The combined output is true when any channel is outside the bounds.",
        "ports": [
          {
            "name": "values",
            "direction": "input",
            "unit": "V",
            "description": "Channel measurements; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "low",
            "direction": "output",
            "unit": "true / false",
            "description": "Below lower bound; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "high",
            "direction": "output",
            "unit": "true / false",
            "description": "Above upper bound; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "fault",
            "direction": "output",
            "unit": "true / false",
            "description": "Any fault; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "cells",
            "label": "Number of measurement channels",
            "unit": "1",
            "default": 3,
            "description": "Number of measurement channels. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "lower",
            "label": "Lower threshold (V)",
            "unit": "V",
            "default": 3,
            "description": "Lower threshold (V). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "upper",
            "label": "Upper threshold (V)",
            "unit": "V",
            "default": 4.2,
            "description": "Upper threshold (V). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "low[j] = value[j] < lower",
          "high[j] = value[j] > upper",
          "fault = any(low) or any(high)"
        ],
        "example": {
          "title": "Battery voltage monitor worked example",
          "text": "Use the defaults below with Channel measurements = [3, 4, 4.3] V. At 0 s, Any fault is 1 true / false. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-voltage-monitor",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fault",
              "atS": 0,
              "value": 1,
              "tolerance": 1e-08,
              "label": "Any fault",
              "unit": "true / false"
            }
          ],
          "inputs": [
            {
              "port": "values",
              "label": "Channel measurements",
              "value": [
                3,
                4,
                4.3
              ],
              "unit": "V"
            }
          ]
        },
        "limits": [
          "Bounds are user-supplied. This comparator does not disconnect a circuit or diagnose a sensor failure.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "ti-bms"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-voltage-monitor"
        ],
        "exampleTraces": [
          {
            "id": "battery-voltage-monitor",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-voltage-monitor.json?v=5694383c3d4d",
            "title": "Battery voltage monitor recorded example",
            "exampleId": "block-battery-voltage-monitor",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 7,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-voltage-monitor",
        "implementationId": "battery-voltage-monitor",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-voltage-monitor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-voltage-monitor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-voltage-monitor"
          ]
        },
        "studioHelp": {
          "type": "battery-voltage-monitor",
          "namespace": "signal",
          "slug": "signal-block-battery-voltage-monitor",
          "canonicalSlug": "battery-voltage-monitor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Battery voltage monitor",
            "label": "Battery voltage monitor",
            "summary": "Reports each channel below/above its bounds and a combined fault.",
            "details": [
              "Block type: battery-voltage-monitor.",
              "1 declared input and 3 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "control",
              "symbol": "signal → bounds → fault",
              "label": "Compare monitored channels",
              "caption": "Reports each channel below/above its bounds and a combined fault."
            },
            "inputs": [
              {
                "id": "values",
                "label": "Channel measurements",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "low",
                "label": "Below lower bound",
                "quantity": "dimensionless",
                "shape": [
                  3
                ],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Array 3",
                "elementLabel": "bool"
              },
              {
                "id": "high",
                "label": "Above upper bound",
                "quantity": "dimensionless",
                "shape": [
                  3
                ],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Array 3",
                "elementLabel": "bool"
              },
              {
                "id": "fault",
                "label": "Any fault",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"cells\":3,\"lower\":3,\"upper\":4.2}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-voltage-monitor/",
            "related": [
              {
                "label": "Compare",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
              },
              {
                "label": "Boolean latch",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
              },
              {
                "label": "Pi controller",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "workflow:ohm-circuit",
      "type": "Workflow",
      "label": "Relate current and voltage",
      "properties": {
        "id": "ohm-circuit",
        "title": "Relate current and voltage",
        "kind": "studio",
        "summary": "Conserving components solve constitutive relations and node balance.",
        "steps": [
          "Inspect source and resistor in the RC example.",
          "Compare branch current with resistor voltage."
        ],
        "example": "A 1 V drop across 2 Ω implies 0.5 A.",
        "observe": "Topology sets individual element voltages.",
        "limits": "The RC example includes a capacitor: transient current varies and source voltage is not always resistor voltage.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-rc",
        "label": "Open the electrical circuit",
        "evidence": [
          "js/physical-network.js",
          "js/studio-examples.js"
        ]
      }
    },
    {
      "id": "workflow:native-battery-current-monitor",
      "type": "Workflow",
      "label": "Battery current monitor worked example",
      "properties": {
        "id": "native-battery-current-monitor",
        "title": "Battery current monitor worked example",
        "kind": "studio",
        "summary": "Reports each channel below/above its bounds and a combined fault.",
        "steps": [
          "Review the block inputs, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare the output channels with the numerical checks; change one input and run again."
        ],
        "example": "Use the defaults below with Channel measurements = [-2, 0, 3.1] A. At 0 s, Any fault is 1 true / false. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "Bounds are user-supplied. This comparator does not disconnect a circuit or diagnose a sensor failure. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-current-monitor",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-temperature-monitor",
      "type": "Workflow",
      "label": "Battery temperature monitor worked example",
      "properties": {
        "id": "native-battery-temperature-monitor",
        "title": "Battery temperature monitor worked example",
        "kind": "studio",
        "summary": "Reports each channel below/above its bounds and a combined fault.",
        "steps": [
          "Review the block inputs, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare the output channels with the numerical checks; change one input and run again."
        ],
        "example": "Use the defaults below with Channel measurements = [272, 298.15, 318.15] K. At 0 s, Any fault is 1 true / false. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "Bounds are user-supplied. This comparator does not disconnect a circuit or diagnose a sensor failure. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-temperature-monitor",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-voltage-monitor",
      "type": "Workflow",
      "label": "Battery voltage monitor worked example",
      "properties": {
        "id": "native-battery-voltage-monitor",
        "title": "Battery voltage monitor worked example",
        "kind": "studio",
        "summary": "Reports each channel below/above its bounds and a combined fault.",
        "steps": [
          "Review the block inputs, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare the output channels with the numerical checks; change one input and run again."
        ],
        "example": "Use the defaults below with Channel measurements = [3, 4, 4.3] V. At 0 s, Any fault is 1 true / false. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "Bounds are user-supplied. This comparator does not disconnect a circuit or diagnose a sensor failure. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-voltage-monitor",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-fuel-cell-table",
      "type": "Workflow",
      "label": "Tabulated fuel-cell stack worked example",
      "properties": {
        "id": "native-battery-fuel-cell-table",
        "title": "Tabulated fuel-cell stack worked example",
        "kind": "studio",
        "summary": "Interpolated polarization table with explicit out-of-table diagnostic.",
        "steps": [
          "Review the block inputs, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare the output channels with the numerical checks; change one input and run again."
        ],
        "example": "Use the defaults below with Stack current = 1.5 A. At 0 s, Stack voltage is 4.6 V. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "This static table has no gas, thermal, pressure or electrochemical states. A measured polarization curve is required for a particular stack. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-fuel-cell-table",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-contact-monitor",
      "type": "Workflow",
      "label": "Cell contact residual monitor worked example",
      "properties": {
        "id": "native-battery-contact-monitor",
        "title": "Cell contact residual monitor worked example",
        "kind": "studio",
        "summary": "Filters cell/group voltage residuals against their median and qualifies persistent differences. Residuals are not a unique contact-fault diagnosis.",
        "steps": [
          "Review the block inputs, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare the output channels with the numerical checks; change one input and run again."
        ],
        "example": "Use the defaults below with Measured cell/group voltages = [3.64, 3.66, 3.66] V, Predicted healthy voltages = [3.66, 3.66, 3.66] V, Signed current = 2 A, Enable = 1 true / false. At 0 s, Filtered differential residual is [0, 0, 0] V. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "Requires at least three channels. Contact loss, parameter mismatch and sensor bias can produce the same symptom; this is not a unique fault diagnosis. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-contact-monitor",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-diode",
      "type": "Workflow",
      "label": "Piecewise-linear diode worked example",
      "properties": {
        "id": "native-diode",
        "title": "Piecewise-linear diode worked example",
        "kind": "studio",
        "summary": "Forward threshold and finite slope; reverse leakage conductance, no breakdown or junction charge",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: voltageV=5; resistor: resistanceOhm=100. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Forward threshold and finite slope; reverse leakage conductance, no breakdown or junction charge Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-diode",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-electrical-switch",
      "type": "Workflow",
      "label": "Controlled electrical switch worked example",
      "properties": {
        "id": "native-electrical-switch",
        "title": "Controlled electrical switch worked example",
        "kind": "studio",
        "summary": "Finite on/off resistance with an explicit control threshold; no arc or contact bounce",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: voltageV=5; target: onResistanceOhm=5; target: gate=1. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Finite on/off resistance with an explicit control threshold; no arc or contact bounce Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-electrical-switch",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-variable-resistor",
      "type": "Workflow",
      "label": "Controlled resistor worked example",
      "properties": {
        "id": "native-variable-resistor",
        "title": "Controlled resistor worked example",
        "kind": "studio",
        "summary": "Live resistance with declared positive floor and a limited-command diagnostic",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: voltageV=5. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Live resistance with declared positive floor and a limited-command diagnostic Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-variable-resistor",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-open-circuit",
      "type": "Workflow",
      "label": "Open electrical port worked example",
      "properties": {
        "id": "native-open-circuit",
        "title": "Open electrical port worked example",
        "kind": "studio",
        "summary": "Zero current termination; no hidden grounding or leakage",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: voltageV=5. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Zero current termination; no hidden grounding or leakage Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-open-circuit",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-ac-current-source",
      "type": "Workflow",
      "label": "AC current source worked example",
      "properties": {
        "id": "native-ac-current-source",
        "title": "AC current source worked example",
        "kind": "studio",
        "summary": "Analytic sinusoidal current, positive from p to n",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. load: resistanceOhm=4. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Analytic sinusoidal current, positive from p to n Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-ac-current-source",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-ac-voltage-source",
      "type": "Workflow",
      "label": "AC voltage source worked example",
      "properties": {
        "id": "native-ac-voltage-source",
        "title": "AC voltage source worked example",
        "kind": "studio",
        "summary": "Analytic sinusoidal voltage p minus n",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. load: resistanceOhm=4. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Analytic sinusoidal voltage p minus n Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-ac-voltage-source",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-floating-reference",
      "type": "Workflow",
      "label": "Capacitive floating reference worked example",
      "properties": {
        "id": "native-floating-reference",
        "title": "Capacitive floating reference worked example",
        "kind": "studio",
        "summary": "Explicit capacitance to the voltage datum; no DC leakage or forced zero node voltage",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. target: initialVoltageV=3; source: voltageV=2; load: resistanceOhm=100. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Explicit capacitance to the voltage datum; no DC leakage or forced zero node voltage Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-floating-reference",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-ideal-transformer",
      "type": "Workflow",
      "label": "Ideal transformer worked example",
      "properties": {
        "id": "native-ideal-transformer",
        "title": "Ideal transformer worked example",
        "kind": "studio",
        "summary": "Ideal lossless voltage/current transformation; each winding needs a voltage reference",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: voltageV=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Ideal lossless voltage/current transformation; each winding needs a voltage reference Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-ideal-transformer",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-mutual-inductor",
      "type": "Workflow",
      "label": "Coupled inductors worked example",
      "properties": {
        "id": "native-mutual-inductor",
        "title": "Coupled inductors worked example",
        "kind": "studio",
        "summary": "Symmetric positive-definite inductance matrix; no saturation, hysteresis or winding losses",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: voltageV=1; short: voltageV=0. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Symmetric positive-definite inductance matrix; no saturation, hysteresis or winding losses Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-mutual-inductor",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-operational-amplifier",
      "type": "Workflow",
      "label": "Finite-gain operational amplifier worked example",
      "properties": {
        "id": "native-operational-amplifier",
        "title": "Finite-gain operational amplifier worked example",
        "kind": "studio",
        "summary": "High impedance inputs, finite open-loop gain and hard output voltage rails; ideal output drive, no slew or supply-current model",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: voltageV=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "High impedance inputs, finite open-loop gain and hard output voltage rails; ideal output drive, no slew or supply-current model Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-operational-amplifier",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-rotational-converter",
      "type": "Workflow",
      "label": "Ideal rotational motor coupler worked example",
      "properties": {
        "id": "native-rotational-converter",
        "title": "Ideal rotational motor coupler worked example",
        "kind": "studio",
        "summary": "Lossless back-emf/torque conversion; no winding resistance, friction or electromagnetic storage",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. target: constant=2; supply: currentA=1. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Lossless back-emf/torque conversion; no winding resistance, friction or electromagnetic storage Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-rotational-converter",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-linear-converter",
      "type": "Workflow",
      "label": "Ideal linear motor coupler worked example",
      "properties": {
        "id": "native-linear-converter",
        "title": "Ideal linear motor coupler worked example",
        "kind": "studio",
        "summary": "Lossless back-emf/force conversion; no winding loss or electromagnetic storage",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. target: constant=2; supply: currentA=1. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Lossless back-emf/force conversion; no winding loss or electromagnetic storage Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-linear-converter",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-electrical-gyrator",
      "type": "Workflow",
      "label": "Electrical gyrator worked example",
      "properties": {
        "id": "native-electrical-gyrator",
        "title": "Electrical gyrator worked example",
        "kind": "studio",
        "summary": "Lossless voltage/current duality with opposing power at the two ports",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: voltageV=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Lossless voltage/current duality with opposing power at the two ports Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-electrical-gyrator",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-initial-voltage-constraint",
      "type": "Workflow",
      "label": "Open branch with initial voltage target worked example",
      "properties": {
        "id": "native-initial-voltage-constraint",
        "title": "Open branch with initial voltage target worked example",
        "kind": "studio",
        "summary": "Zero current at all times; initializes a directly attached capacitor when its initial voltage is unspecified, otherwise verifies the consistent initial solution",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. capacitor: capacitanceF=1; load: resistanceOhm=1; target: initialVoltageV=4. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Zero current at all times; initializes a directly attached capacitor when its initial voltage is unspecified, otherwise verifies the consistent initial solution Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-initial-voltage-constraint",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-memristor",
      "type": "Workflow",
      "label": "Bounded drift memristor worked example",
      "properties": {
        "id": "native-memristor",
        "title": "Bounded drift memristor worked example",
        "kind": "studio",
        "summary": "Synthetic resistance-range and switching-time design with a smooth drift boundary window; no fitted material or measured-device claim.",
        "steps": [
          "Review the derived teaching parameters, units and model limits.",
          "Open the revised Studio example and run its bundled current-driven model.",
          "Compare the output with the analytic logistic solution within the listed tolerances."
        ],
        "example": "Drive the hypothetical device with a constant 1 mA for 10 s. Initially w = 0.5, R = 600 Ω and V = 0.6 V. The independently derived logistic solution gives w(10 s) = 0.598687660112452 and V(10 s) = 0.5210498719100384 V. The production native model and exported results agree within the tolerances below. This independently designed teaching fixture is available in Studio.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Synthetic parameters were selected through resistance-range and switching-time targets. The earlier undocumented illustrative parameter tuple is not reused. These values do not characterize a material or device. Joglekar and Wolf support the drift equation and the p = 1 boundary window. That citation does not supply this example’s resistance endpoints, geometry, mobility or numeric outputs. The boundary window locks at w = 0 and w = 1. This reduced model does not represent every resistive-switching mechanism. Singular constraints or unsupported states stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-memristor",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-variable-gap-capacitor",
      "type": "Workflow",
      "label": "Electromechanical variable-gap capacitor worked example",
      "properties": {
        "id": "native-variable-gap-capacitor",
        "title": "Electromechanical variable-gap capacitor worked example",
        "kind": "studio",
        "summary": "Parallel-plate field energy and attractive force; a-minus-b motion closes the gap. No fringing or contact model; gap closure refuses.",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. mass: massKg=0.001; target: initialVoltageV=10. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Parallel-plate field energy and attractive force; a-minus-b motion closes the gap. No fringing or contact model; gap closure refuses. Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-variable-gap-capacitor",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-current-gain-source",
      "type": "Workflow",
      "label": "Current-controlled current source worked example",
      "properties": {
        "id": "native-current-gain-source",
        "title": "Current-controlled current source worked example",
        "kind": "studio",
        "summary": "Ideal zero-drop control-current branch and externally powered output",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: currentA=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Ideal zero-drop control-current branch and externally powered output Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-current-gain-source",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-transresistance-source",
      "type": "Workflow",
      "label": "Current-controlled voltage source worked example",
      "properties": {
        "id": "native-transresistance-source",
        "title": "Current-controlled voltage source worked example",
        "kind": "studio",
        "summary": "Ideal zero-drop control-current branch and externally powered output",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: currentA=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Ideal zero-drop control-current branch and externally powered output Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-transresistance-source",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-transconductance-source",
      "type": "Workflow",
      "label": "Voltage-controlled current source worked example",
      "properties": {
        "id": "native-transconductance-source",
        "title": "Voltage-controlled current source worked example",
        "kind": "studio",
        "summary": "Ideal externally powered controlled source with nonloading voltage sense",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: voltageV=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Ideal externally powered controlled source with nonloading voltage sense Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-transconductance-source",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-voltage-gain-source",
      "type": "Workflow",
      "label": "Voltage-controlled voltage source worked example",
      "properties": {
        "id": "native-voltage-gain-source",
        "title": "Voltage-controlled voltage source worked example",
        "kind": "studio",
        "summary": "Ideal externally powered controlled source with nonloading voltage sense",
        "steps": [
          "Review the interface, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare outputs with the numerical checks; change one input and run again."
        ],
        "example": "Editable first-party network. supply: voltageV=1; load: resistanceOhm=4. Checks below were verified in the native execution engine.",
        "observe": "Inspect the output channels and checks on the block reference page.",
        "limits": "Ideal externally powered controlled source with nonloading voltage sense Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run.",
        "url": "https://design.lemonergy.com/cosim.html?example=physical-voltage-gain-source",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "topic:topic-units",
      "type": "Topic",
      "label": "Units and electrical basics",
      "properties": {
        "id": "topic-units",
        "name": "Units and electrical basics",
        "lede": "The quantities every datasheet is written in, and how they relate.",
        "context": "Use consistent units and cell/pack basis.",
        "example": "10 A for 30 min transfers 5 Ah. At constant 3.6 V this is 18 Wh; varying voltage requires integration.",
        "lesson_url": "https://lemonergy.com/learn/fundamentals/capacity-and-c-rate/",
        "lesson_label": "Open capacity and C-rate"
      }
    },
    {
      "id": "term:open-circuit-voltage",
      "type": "Term",
      "label": "Open-circuit voltage",
      "properties": {
        "id": "open-circuit-voltage",
        "name": "Open-circuit voltage",
        "abbr": "OCV",
        "section": "topic-state",
        "definition": "The voltage across a cell’s terminals when no current flows and the cell has rested long enough for the voltage to settle. It depends on state of charge and temperature, and a cell whose open-circuit voltage falls unusually fast in storage may have an internal short.",
        "unit": "V",
        "related": [
          "ocv-soc-curve",
          "relaxation",
          "voltage-hysteresis",
          "k-value",
          "internal-short-circuit"
        ],
        "lesson": "fundamentals/cell-production/#finishing",
        "url": "https://lemonergy.com/learn/glossary/open-circuit-voltage/",
        "mentions": [
          "state-of-charge"
        ]
      }
    },
    {
      "id": "term:nominal-voltage",
      "type": "Term",
      "label": "Nominal voltage",
      "properties": {
        "id": "nominal-voltage",
        "name": "Nominal voltage",
        "section": "topic-ratings",
        "definition": "A representative average voltage of a cell over a full discharge, such as 3.6–3.7 V for an oxide/graphite cell or about 3.2 V for LFP/graphite. Multiplied by capacity, it gives nominal energy.",
        "unit": "V",
        "related": [
          "nominal-energy",
          "open-circuit-voltage",
          "voltage-window",
          "lfp"
        ],
        "lesson": "fundamentals/capacity-and-c-rate/#energy",
        "url": "https://lemonergy.com/learn/glossary/nominal-voltage/",
        "mentions": [
          "graphite"
        ]
      }
    },
    {
      "id": "term:internal-resistance",
      "type": "Term",
      "label": "Internal resistance",
      "properties": {
        "id": "internal-resistance",
        "name": "Internal resistance",
        "abbr": "IR",
        "aka": [
          "DC resistance",
          "DCIR"
        ],
        "section": "topic-units",
        "definition": "The resistance a cell presents to current, from its foils, electrolyte, interfaces and the reactions themselves. It converts part of the delivered energy into heat, sets the voltage drop under load, and rises as the cell ages; a large automotive cell has about a milliohm, a small cylindrical cell tens.",
        "unit": "mΩ",
        "related": [
          "ohms-law",
          "ir-drop",
          "impedance-rise",
          "dcir",
          "area-specific-resistance",
          "resistance-capacity-product"
        ],
        "lesson": "fundamentals/battery-basics/#datasheet",
        "url": "https://lemonergy.com/learn/glossary/internal-resistance/",
        "mentions": [
          "electrolyte",
          "cylindrical-cell"
        ]
      }
    },
    {
      "id": "term:ir-drop",
      "type": "Term",
      "label": "IR drop",
      "properties": {
        "id": "ir-drop",
        "name": "IR drop",
        "aka": [
          "ohmic drop",
          "voltage sag"
        ],
        "section": "topic-charging",
        "definition": "The instant step in terminal voltage when current starts or stops, equal to current times internal resistance. It is lost as heat and is the reason a cell’s voltage under load sits below its open-circuit voltage.",
        "formula": "ΔV = I × R",
        "unit": "V",
        "related": [
          "internal-resistance",
          "ohms-law",
          "polarization",
          "open-circuit-voltage"
        ],
        "example": {
          "title": "Distinguish a current step from SOC change",
          "text": "When discharge current jumps from 0 A to 10 A through an illustrative 20 mΩ resistance, terminal voltage immediately drops by 0.2 V. Slower polarization and SOC change are separate effects."
        },
        "url": "https://lemonergy.com/learn/glossary/ir-drop/",
        "mentions": [
          "voltage",
          "closed-circuit-voltage"
        ]
      }
    },
    {
      "id": "term:state-of-charge",
      "type": "Term",
      "label": "State of charge",
      "properties": {
        "id": "state-of-charge",
        "name": "State of charge",
        "abbr": "SOC",
        "section": "topic-state",
        "definition": "How full a cell is, as a fraction of its available capacity. State of charge, like temperature, affects how fast a stored cell ages.",
        "unit": "%",
        "related": [
          "depth-of-discharge",
          "ocv-soc-curve",
          "coulomb-counting",
          "state-of-health",
          "bms"
        ],
        "lesson": "fundamentals/battery-aging/#storage-soc",
        "example": {
          "title": "Interpret a charge inventory",
          "text": "If available capacity is 5 Ah and 3 Ah remains by the chosen estimator, SOC is 60%. A different estimate of available capacity changes this percentage, so compare SOC values only with the capacity convention recorded."
        },
        "url": "https://lemonergy.com/learn/glossary/state-of-charge/",
        "mentions": [
          "usable-capacity"
        ]
      }
    },
    {
      "id": "lesson:fundamentals/cell-anatomy/",
      "type": "Lesson",
      "label": "Lesson 1 · Cell anatomy",
      "properties": {
        "url": "https://lemonergy.com/learn/fundamentals/cell-anatomy/"
      }
    },
    {
      "id": "visual:voltage",
      "type": "Visual",
      "label": "Voltage under load",
      "properties": {
        "title": "Voltage under load",
        "summary": "Discharge current creates an ohmic drop below open-circuit voltage.",
        "readout": "5 A through 20 mΩ gives 0.1 V ohmic drop.",
        "formula": "V_terminal = OCV − I_discharge R",
        "note": "Chosen OCV curve; no chemistry calibration, hysteresis or voltage cutoff.",
        "software": {
          "status": "studio",
          "label": "Voltage relationship in Studio",
          "body": "The native battery calculates terminal voltage from OCV and resistance. The curve here is an illustrative OCV relationship, not a fitted cell dataset.",
          "href": "https://design.lemonergy.com/cosim.html?example=charging-home"
        },
        "html": "<figure class=\"visual-figure\"><figcaption>Illustrative OCV and loaded voltage</figcaption><svg class=\"visual-chart\" viewBox=\"0 0 360 330\" role=\"img\" aria-labelledby=\"static-voltage-0-title static-voltage-0-desc\"><title id=\"static-voltage-0-title\">Illustrative OCV and loaded voltage</title><desc id=\"static-voltage-0-desc\">SOC (%) versus Voltage (V). Open circuit; Under load. Interpretation follows the graphs.</desc><path d=\"M74,238h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"242\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">1.8</text><text x=\"74\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">0</text><path d=\"M74,188.5h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"192.5\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">2.42</text><text x=\"141\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">25</text><path d=\"M74,139.00000000000003h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"143.00000000000003\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">3.05</text><text x=\"208\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">50</text><path d=\"M74,89.50000000000003h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"93.50000000000003\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">3.67</text><text x=\"275\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">75</text><path d=\"M74,40h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"44\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">4.3</text><text x=\"342\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">100</text><path d=\"M74,40v198h268\" fill=\"none\" stroke=\"currentColor\" opacity=\".3\"/><polyline fill=\"none\" stroke=\"#6953a8\" stroke-width=\"2.8\" points=\"74.00,142.96 76.68,142.29 79.36,141.61 82.04,140.94 84.72,140.27 87.40,139.59 90.08,138.92 92.76,138.25 95.44,137.57 98.12,136.90 100.80,136.23 103.48,135.55 106.16,134.88 108.84,134.21 111.52,133.54 114.20,132.86 116.88,132.19 119.56,131.52 122.24,130.84 124.92,130.17 127.60,129.50 130.28,128.82 132.96,128.15 135.64,127.48 138.32,126.80 141.00,126.13 143.68,125.46 146.36,124.78 149.04,124.11 151.72,123.44 154.40,122.76 157.08,122.09 159.76,121.41 162.44,120.74 165.12,120.07 167.80,119.39 170.48,118.72 173.16,118.04 175.84,117.37 178.52,116.69 181.20,116.02 183.88,115.34 186.56,114.66 189.24,113.98 191.92,113.31 194.60,112.63 197.28,111.95 199.96,111.26 202.64,110.58 205.32,109.89 208.00,109.21 210.68,108.52 213.36,107.83 216.04,107.13 218.72,106.44 221.40,105.74 224.08,105.03 226.76,104.32 229.44,103.61 232.12,102.89 234.80,102.17 237.48,101.44 240.16,100.70 242.84,99.96 245.52,99.21 248.20,98.44 250.88,97.67 253.56,96.89 256.24,96.10 258.92,95.29 261.60,94.47 264.28,93.63 266.96,92.77 269.64,91.90 272.32,91.01 275.00,90.09 277.68,89.15 280.36,88.19 283.04,87.20 285.72,86.17 288.40,85.12 291.08,84.03 293.76,82.90 296.44,81.73 299.12,80.52 301.80,79.26 304.48,77.96 307.16,76.59 309.84,75.17 312.52,73.69 315.20,72.14 317.88,70.53 320.56,68.83 323.24,67.06 325.92,65.20 328.60,63.24 331.28,61.19 333.96,59.04 336.64,56.77 339.32,54.39 342.00,51.88\"/><polyline fill=\"none\" stroke=\"#2459a8\" stroke-width=\"2.8\" stroke-dasharray=\"7 4\" points=\"74.00,150.88 76.68,150.21 79.36,149.53 82.04,148.86 84.72,148.19 87.40,147.51 90.08,146.84 92.76,146.17 95.44,145.49 98.12,144.82 100.80,144.15 103.48,143.47 106.16,142.80 108.84,142.13 111.52,141.46 114.20,140.78 116.88,140.11 119.56,139.44 122.24,138.76 124.92,138.09 127.60,137.42 130.28,136.74 132.96,136.07 135.64,135.40 138.32,134.72 141.00,134.05 143.68,133.38 146.36,132.70 149.04,132.03 151.72,131.36 154.40,130.68 157.08,130.01 159.76,129.33 162.44,128.66 165.12,127.99 167.80,127.31 170.48,126.64 173.16,125.96 175.84,125.29 178.52,124.61 181.20,123.94 183.88,123.26 186.56,122.58 189.24,121.90 191.92,121.23 194.60,120.55 197.28,119.87 199.96,119.18 202.64,118.50 205.32,117.81 208.00,117.13 210.68,116.44 213.36,115.75 216.04,115.05 218.72,114.36 221.40,113.66 224.08,112.95 226.76,112.24 229.44,111.53 232.12,110.81 234.80,110.09 237.48,109.36 240.16,108.62 242.84,107.88 245.52,107.13 248.20,106.36 250.88,105.59 253.56,104.81 256.24,104.02 258.92,103.21 261.60,102.39 264.28,101.55 266.96,100.69 269.64,99.82 272.32,98.93 275.00,98.01 277.68,97.07 280.36,96.11 283.04,95.12 285.72,94.09 288.40,93.04 291.08,91.95 293.76,90.82 296.44,89.65 299.12,88.44 301.80,87.18 304.48,85.88 307.16,84.51 309.84,83.09 312.52,81.61 315.20,80.06 317.88,78.45 320.56,76.75 323.24,74.98 325.92,73.12 328.60,71.16 331.28,69.11 333.96,66.96 336.64,64.69 339.32,62.31 342.00,59.80\"/><text transform=\"translate(208 303)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">SOC (%)</tspan></text><text transform=\"translate(20 139) rotate(-90)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">Voltage (V)</tspan></text></svg><div class=\"visual-legend\"><span><i style=\"background:#6953a8\"></i>Open circuit</span><span><i style=\"background:#2459a8\"></i>Under load (dashed)</span></div></figure>"
      }
    },
    {
      "id": "reference:bipm-si",
      "type": "Reference",
      "label": "The International System of Units (SI), 9th edition",
      "properties": {
        "title": "The International System of Units (SI), 9th edition",
        "publisher": "Bureau International des Poids et Mesures",
        "url": "https://doi.org/10.59161/AUEZ1291",
        "type": "Metrology reference",
        "scope": "Definitions of SI units and coherent derived units; 2026 revision.",
        "year": 2026,
        "accessed": "2026-10-27"
      }
    }
  ]
}
