{
  "node": {
    "id": "term:power",
    "type": "Term",
    "label": "Power",
    "properties": {
      "id": "power",
      "name": "Power",
      "section": "topic-units",
      "definition": "The rate at which a cell delivers or absorbs energy: voltage times current, in watts. Power is limited by internal resistance and temperature long before capacity runs out.",
      "formula": "P = V × I",
      "unit": "W",
      "related": [
        "watt",
        "specific-power",
        "state-of-power",
        "internal-resistance"
      ],
      "example": {
        "title": "Separate power from energy",
        "text": "A 100 W load running for 30 min uses 50 Wh. Power tells you how fast energy is transferred; the duration determines how much energy is transferred."
      },
      "url": "https://lemonergy.com/learn/glossary/power/",
      "mentions": []
    }
  },
  "edges": [
    {
      "id": "edge:usesBlock/term:power/block:ac-current-source",
      "source": "term:power",
      "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:power/block:ac-voltage-source",
      "source": "term:power",
      "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:power/block:active-supervision-interface",
      "source": "term:power",
      "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:power/block:balancing-interface",
      "source": "term:power",
      "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:power/block:battery-ocv",
      "source": "term:power",
      "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:power/block:battery-source",
      "source": "term:power",
      "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:power/block:bidirectional-grid",
      "source": "term:power",
      "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:power/block:capacitor",
      "source": "term:power",
      "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:power/block:charging-policy",
      "source": "term:power",
      "target": "block:charging-policy",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:controlled-contactor",
      "source": "term:power",
      "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:power/block:current-gain-source",
      "source": "term:power",
      "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:power/block:current-sensor",
      "source": "term:power",
      "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:power/block:current-source",
      "source": "term:power",
      "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:power/block:dc-motor",
      "source": "term:power",
      "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:power/block:diode",
      "source": "term:power",
      "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:power/block:edge-cooling-plate",
      "source": "term:power",
      "target": "block:edge-cooling-plate",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:electrical-gyrator",
      "source": "term:power",
      "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:power/block:electrical-switch",
      "source": "term:power",
      "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:power/block:electrothermal-battery",
      "source": "term:power",
      "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:power/block:electrothermal-resistor",
      "source": "term:power",
      "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:power/block:energy-dispatch",
      "source": "term:power",
      "target": "block:energy-dispatch",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:floating-reference",
      "source": "term:power",
      "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:power/block:friction-brake",
      "source": "term:power",
      "target": "block:friction-brake",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:gas-fan",
      "source": "term:power",
      "target": "block:gas-fan",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:ideal-transformer",
      "source": "term:power",
      "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:power/block:inductor",
      "source": "term:power",
      "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:power/block:initial-voltage-constraint",
      "source": "term:power",
      "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:power/block:linear-converter",
      "source": "term:power",
      "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:power/block:memristor",
      "source": "term:power",
      "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:power/block:mutual-inductor",
      "source": "term:power",
      "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:power/block:operational-amplifier",
      "source": "term:power",
      "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:power/block:pack-power-boundary",
      "source": "term:power",
      "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:power/block:parallel-cooling-plate",
      "source": "term:power",
      "target": "block:parallel-cooling-plate",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:passive-supervision-interface",
      "source": "term:power",
      "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:power/block:power-load",
      "source": "term:power",
      "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:power/block:regulated-charger",
      "source": "term:power",
      "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:power/block:resistor",
      "source": "term:power",
      "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:power/block:rotational-converter",
      "source": "term:power",
      "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:power/block:signal-integrator",
      "source": "term:power",
      "target": "block:signal-integrator",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:site-power-allocator",
      "source": "term:power",
      "target": "block:site-power-allocator",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:source-converter",
      "source": "term:power",
      "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:power/block:spring-damper",
      "source": "term:power",
      "target": "block:spring-damper",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:transconductance-source",
      "source": "term:power",
      "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:power/block:transresistance-source",
      "source": "term:power",
      "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:power/block:tyre-contact",
      "source": "term:power",
      "target": "block:tyre-contact",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:u-cooling-plate",
      "source": "term:power",
      "target": "block:u-cooling-plate",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:v2v-converter",
      "source": "term:power",
      "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:power/block:variable-gap-capacitor",
      "source": "term:power",
      "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:power/block:variable-resistor",
      "source": "term:power",
      "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:power/block:voltage-gain-source",
      "source": "term:power",
      "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:power/block:voltage-source",
      "source": "term:power",
      "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:power/block:battery-energy-counter",
      "source": "term:power",
      "target": "block:battery-energy-counter",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:battery-fuel-cell-table",
      "source": "term:power",
      "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:power/block:battery-heater-controller",
      "source": "term:power",
      "target": "block:battery-heater-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:power/block:battery-passive-balancer",
      "source": "term:power",
      "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:power/block:battery-pem-stack",
      "source": "term:power",
      "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:power/block:battery-power-capability",
      "source": "term:power",
      "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:power/block:battery-soe-adaptive-ekf",
      "source": "term:power",
      "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:power/block:battery-soe-adaptive-ekf-variable-capacity",
      "source": "term:power",
      "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:power/block:battery-soe-ekf",
      "source": "term:power",
      "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:power/block:battery-soe-ekf-variable-capacity",
      "source": "term:power",
      "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:power/block:battery-variable-energy-counter",
      "source": "term:power",
      "target": "block:battery-variable-energy-counter",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:converter-loss",
      "source": "term:power",
      "target": "block:converter-loss",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:power/block:fan-suction",
      "source": "term:power",
      "target": "block:fan-suction",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usedIn/term:power/workflow:loss-accounting",
      "source": "term:power",
      "target": "workflow:loss-accounting",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:power/workflow:native-battery-power-capability",
      "source": "term:power",
      "target": "workflow:native-battery-power-capability",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:power/workflow:native-battery-fuel-cell-table",
      "source": "term:power",
      "target": "workflow:native-battery-fuel-cell-table",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:belongsTo/term:power/topic:topic-units",
      "source": "term:power",
      "target": "topic:topic-units",
      "type": "belongsTo",
      "properties": {
        "sourceFile": "terms.json"
      }
    },
    {
      "id": "edge:relatedTo/term:power/term:watt",
      "source": "term:power",
      "target": "term:watt",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:power/term:specific-power",
      "source": "term:power",
      "target": "term:specific-power",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:power/term:state-of-power",
      "source": "term:power",
      "target": "term:state-of-power",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:power/term:internal-resistance",
      "source": "term:power",
      "target": "term:internal-resistance",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:illustratedBy/term:power/visual:energy",
      "source": "term:power",
      "target": "visual:energy",
      "type": "illustratedBy",
      "properties": {
        "sourceFile": "visual-pages.json"
      }
    },
    {
      "id": "edge:cites/term:power/reference:bipm-si",
      "source": "term:power",
      "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:charging-policy",
      "type": "Block",
      "label": "Charging schedule and target policy",
      "properties": {
        "id": "charging-policy",
        "name": "Charging schedule and target policy",
        "kind": "studio",
        "summary": "Sampled permission, current and power requests for an explicit charging target.",
        "behavior": "The immediate, scheduled, opportunity and maintenance strategies use connection, availability, BMS permission and temperature signals. Outputs request charging; the separate regulated charger solves delivered terminal power. Departure shortfall reports unmet demand rather than manufacturing energy.",
        "ports": [
          {
            "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": "available",
            "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": "sitePower",
            "direction": "input",
            "unit": "W",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "chargerDone",
            "direction": "input",
            "unit": "dimensionless",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "permit",
            "direction": "output",
            "unit": "0 or 1",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "requestPower",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "currentCap",
            "direction": "output",
            "unit": "A",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "price",
            "direction": "output",
            "unit": "currency/kWh",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "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": "shortfallJ",
            "direction": "output",
            "unit": "J",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "departureShortfallJ",
            "direction": "output",
            "unit": "J",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "targetSoc",
            "direction": "output",
            "unit": "fraction",
            "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": "strategy",
            "label": "Strategy",
            "unit": "0 immediate, 1 scheduled, 2 opportunity, 3 maintenance",
            "default": 1,
            "min": 0,
            "max": 3,
            "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": "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": "restartSoc",
            "label": "Restart Soc",
            "unit": "fraction",
            "default": 0.7,
            "min": 0,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "departureS",
            "label": "Departure S",
            "unit": "s (0 disables departure)",
            "default": 86400,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "maxPowerW",
            "label": "Max Power W",
            "unit": "W grid-side",
            "default": 7000,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "maxCurrentA",
            "label": "Max 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": "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": "nominalVoltageV",
            "label": "Nominal Voltage V",
            "unit": "V",
            "default": 350,
            "min": 0.01,
            "max": 1000000,
            "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": "pricePerKWh",
            "label": "Price Per KWh",
            "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": "startS",
            "label": "Start S",
            "unit": "s",
            "default": 0,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "endS",
            "label": "End S",
            "unit": "s",
            "default": 86400,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "repeatPeriodS",
            "label": "Repeat Period S",
            "unit": "s (0 absolute)",
            "default": 0,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          }
        ],
        "equations": [],
        "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.",
          "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",
          "home-schedule",
          "depot-allocation",
          "opportunity-window",
          "low-current-maintenance"
        ],
        "type": "charging-policy",
        "implementationId": "charging-policy",
        "url": "https://lemonergy.com/learn/glossary/blocks/charging-policy/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/charging-policy/",
        "sourceFile": "block-library.json",
        "sourceRepository": "battery-design",
        "sourceRevision": "ef9802329b75bc15bb96885f8ed5d49425106696",
        "reviewed": "2026-10-27",
        "studioHelp": {
          "type": "charging-policy",
          "namespace": "physical",
          "slug": "charging-policy",
          "canonicalSlug": "charging-policy",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "charging-policy",
            "name": "Charging schedule and target policy",
            "domain": "signal",
            "family": "controller",
            "operation": "Evaluates availability, schedule, target charge and protection conditions to request charging power and permission.",
            "mechanism": [
              "Schedule and battery state",
              "Charging policy",
              "Permission and power request"
            ],
            "ports": [],
            "terms": [
              {
                "type": "regulated-charger",
                "label": "Regulated CC/CV charger"
              },
              {
                "type": "signal-schedule",
                "label": "Physical availability / signal schedule"
              }
            ],
            "symbol": [
              {
                "tag": "rect",
                "attrs": {
                  "x": 55,
                  "y": 15,
                  "width": 90,
                  "height": 50,
                  "rx": 3
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H55M145 40H190M75 50L90 30L105 50L125 25"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "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": "available",
                "label": "Availability",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Availability 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": "sitePower",
                "label": "Available site power",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Available site power 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": "chargerDone",
                "label": "Charging complete",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Charging complete 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": "permit",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "permit",
                "unit": "1"
              },
              {
                "id": "requestPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "request Power",
                "unit": "W"
              },
              {
                "id": "currentCap",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current Cap",
                "unit": "A"
              },
              {
                "id": "price",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "price",
                "unit": "1"
              },
              {
                "id": "state",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "state",
                "unit": "1"
              },
              {
                "id": "reason",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "reason",
                "unit": "1"
              },
              {
                "id": "shortfallJ",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "shortfall J",
                "unit": "J"
              },
              {
                "id": "departureShortfallJ",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "departure Shortfall J",
                "unit": "J"
              },
              {
                "id": "targetSoc",
                "quantity": "fraction",
                "declared": true,
                "consumers": [],
                "label": "target Soc",
                "unit": "fraction"
              }
            ],
            "parameters": [
              {
                "id": "sampleTimeS",
                "default": 1,
                "unit": "s",
                "min": 0.001,
                "max": 3600,
                "value": 1
              },
              {
                "id": "strategy",
                "default": 1,
                "unit": "0 immediate, 1 scheduled, 2 opportunity, 3 maintenance",
                "min": 0,
                "max": 3,
                "value": 1
              },
              {
                "id": "chemistry",
                "default": 0,
                "unit": "0 Li-ion, 1 lead-acid",
                "min": 0,
                "max": 1,
                "value": 0
              },
              {
                "id": "targetSoc",
                "default": 0.8,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.8
              },
              {
                "id": "restartSoc",
                "default": 0.7,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.7
              },
              {
                "id": "departureS",
                "default": 86400,
                "unit": "s (0 disables departure)",
                "min": 0,
                "max": 1000000000,
                "value": 86400
              },
              {
                "id": "maxPowerW",
                "default": 7000,
                "unit": "W grid-side",
                "min": 0,
                "max": 1000000000,
                "value": 7000
              },
              {
                "id": "maxCurrentA",
                "default": 32,
                "unit": "A",
                "min": 0,
                "max": 1000000,
                "value": 32
              },
              {
                "id": "capacityAh",
                "default": 100,
                "unit": "Ah",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "nominalVoltageV",
                "default": 350,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 350
              },
              {
                "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": "pricePerKWh",
                "default": 0.2,
                "unit": "currency/kWh",
                "min": 0,
                "max": 1000000,
                "value": 0.2
              },
              {
                "id": "startS",
                "default": 0,
                "unit": "s",
                "min": 0,
                "max": 1000000000,
                "value": 0
              },
              {
                "id": "endS",
                "default": 86400,
                "unit": "s",
                "min": 0,
                "max": 1000000000,
                "value": 86400
              },
              {
                "id": "repeatPeriodS",
                "default": 0,
                "unit": "s (0 absolute)",
                "min": 0,
                "max": 1000000000,
                "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:edge-cooling-plate",
      "type": "Block",
      "label": "Edge-cooled plate",
      "properties": {
        "id": "edge-cooling-plate",
        "name": "Edge-cooled plate",
        "kind": "studio",
        "summary": "A plate with four thermal contacts and a defined coolant path. Explore which body connects to each contact and how pressure drives coolant through the plate.",
        "behavior": "Four metal temperature nodes form a fixed 2 × 2 conduction mesh with four thermal contact ports. Coolant follows one two-segment edge path. Metal and coolant have finite heat storage. Pressure difference drives reversible mass and enthalpy transport; hydraulic dissipation enters the coolant energy balance. Each liquid boundary requires an explicit pressure/temperature reservoir.",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal A: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal B: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "h1",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 1 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h2",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 2 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h3",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 3 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h4",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 4 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "massFlow",
            "direction": "output",
            "unit": "kg/s",
            "description": "Total coolant mass flow. Positive means A to B; negative means B to A. Parallel channels contribute to the total."
          },
          {
            "name": "pressureDrop",
            "direction": "output",
            "unit": "Pa",
            "description": "Boundary A pressure minus boundary B pressure. Its sign determines coolant direction."
          },
          {
            "name": "hydraulicPower",
            "direction": "output",
            "unit": "W",
            "description": "Pressure-work dissipation entering the coolant as heat: total mass flow × pressure drop / density."
          },
          {
            "name": "contactHeat",
            "direction": "output",
            "unit": "W",
            "description": "Sum of heat entering the plate through h1 to h4. Positive when the connected bodies deliver heat to the plate."
          },
          {
            "name": "outletTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Coolant temperature leaving the downstream end of the plate, following the actual flow direction. Parallel-channel outlet temperatures are averaged."
          },
          {
            "name": "storedEnergy",
            "direction": "output",
            "unit": "J",
            "description": "Change in metal plus coolant sensible energy relative to their configured initial temperatures."
          }
        ],
        "parameters": [
          {
            "key": "plateCapacityJK",
            "label": "Total plate heat capacity",
            "unit": "J/K",
            "default": 900,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total plate heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantCapacityJK",
            "label": "Total coolant heat capacity",
            "unit": "J/K",
            "default": 420,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total coolant heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "plateConductanceWK",
            "label": "Conductance between metal nodes",
            "unit": "W/K",
            "default": 10,
            "min": 0,
            "max": 1000000,
            "description": "Conductance between metal nodes. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "contactConductanceWK",
            "label": "Thermal contact conductance",
            "unit": "W/K",
            "default": 100,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Thermal contact conductance. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantConductanceWK",
            "label": "Metal-to-coolant conductance per segment",
            "unit": "W/K per segment",
            "default": 20,
            "min": 0,
            "max": 1000000000,
            "description": "Metal-to-coolant conductance per segment. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "hydraulicResistance",
            "label": "Hydraulic resistance per channel",
            "unit": "Pa s/kg per channel",
            "default": 1000000,
            "min": 0.001,
            "max": 1000000000000000,
            "description": "Hydraulic resistance per channel. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "specificHeatJkgK",
            "label": "Coolant specific heat",
            "unit": "J/(kg K)",
            "default": 4200,
            "min": 1,
            "max": 1000000,
            "description": "Coolant specific heat. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "densityKgM3",
            "label": "Coolant density",
            "unit": "kg/m3",
            "default": 1000,
            "min": 1,
            "max": 100000,
            "description": "Coolant density. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialPlateTemperatureK",
            "label": "Initial plate temperature",
            "unit": "K",
            "default": 310,
            "min": 0,
            "max": 5000,
            "description": "Initial plate temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialCoolantTemperatureK",
            "label": "Initial coolant temperature",
            "unit": "K",
            "default": 300,
            "min": 0,
            "max": 5000,
            "description": "Initial coolant temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          }
        ],
        "equations": [
          "mass flow per channel = (pressureA-pressureB)/hydraulicResistance",
          "contact heat[j] = contactConductance*(contactTemperature[j]-plateTemperature[j])",
          "metal heat capacity per node = plateCapacity/4",
          "hydraulicPower = totalMassFlow*(pressureA-pressureB)/density",
          "coolant heat capacity*dT/dt = metal-to-coolant heat + advective enthalpy + hydraulic heat"
        ],
        "example": {
          "title": "Edge-cooled plate worked example",
          "text": "The bundled model connects four thermal masses initially at 320 K to a 310 K plate, with 300 K coolant reservoirs at 200 kPa and 100 kPa. With channel resistance 10^6 Pa s/kg, the total flow is 0.1 kg/s and hydraulic dissipation is 10 W. After 0.2 s all four loads cool below their initial temperature. The loads cool from stored sensible heat; no continuous heater is attached.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-cooling-edge",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "massFlow",
              "label": "Total coolant mass flow",
              "atS": 0.2,
              "value": 0.1,
              "unit": "kg/s",
              "tolerance": 1e-06
            },
            {
              "port": "hydraulicPower",
              "label": "Hydraulic dissipation",
              "atS": 0.2,
              "value": 10,
              "unit": "W",
              "tolerance": 1e-06
            }
          ],
          "inputs": [
            {
              "port": "a",
              "label": "Inlet boundary pressure",
              "value": 200000,
              "unit": "Pa"
            },
            {
              "port": "b",
              "label": "Outlet boundary pressure",
              "value": 100000,
              "unit": "Pa"
            }
          ]
        },
        "limits": [
          "Fixed 2 × 2 metal mesh and the stated coolant path. Constant properties and single-phase incompressible coolant. No arbitrary liquid junction solver, configurable grid, resolved channel geometry or phase change."
        ],
        "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": [
          "openstax-heat"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-edge-cooling-plate"
        ],
        "connectionGuide": {
          "kind": "cooling-plate",
          "title": "Trace the cooling connections",
          "summary": "Select a contact to explain its pin. Open a warm body or boundary to follow that connection into its own reference.",
          "paths": [
            [
              1,
              3
            ]
          ],
          "concepts": [
            {
              "id": "coolant",
              "label": "Coolant"
            },
            {
              "id": "thermal-mass",
              "label": "Thermal mass"
            },
            {
              "id": "heat-transfer-modes",
              "label": "Heat transfer"
            },
            {
              "id": "thermal-model",
              "label": "Thermal model"
            }
          ]
        },
        "type": "edge-cooling-plate",
        "implementationId": "edge-cooling-plate",
        "url": "https://lemonergy.com/learn/glossary/blocks/edge-cooling-plate/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/edge-cooling-plate/",
        "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-cooling-edge"
          ]
        },
        "studioHelp": {
          "type": "edge-cooling-plate",
          "namespace": "physical",
          "slug": "edge-cooling-plate",
          "canonicalSlug": "edge-cooling-plate",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "edge-cooling-plate",
            "name": "Edge-cooled plate",
            "domain": "thermal",
            "family": "cooling",
            "operation": "Exchanges heat between four plate zones, attached bodies and coolant flowing through the declared channel path.",
            "mechanism": [
              "Thermal contacts",
              "Metal and coolant storage",
              "Coolant transport"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal B",
                "net": null,
                "peers": []
              },
              {
                "id": "h1",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h2",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-right thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h3",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h4",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-right thermal contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "liquid-reservoir",
                "label": "Coolant pressure and temperature boundary"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M50 5V60Q50 75 70 75H130Q150 75 150 60V5"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "contactHeat1",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat1",
                "unit": "W"
              },
              {
                "id": "contactHeat2",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat2",
                "unit": "W"
              },
              {
                "id": "contactHeat3",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat3",
                "unit": "W"
              },
              {
                "id": "contactHeat4",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat4",
                "unit": "W"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              },
              {
                "id": "massFlow",
                "quantity": "mass-rate",
                "declared": true,
                "consumers": [],
                "label": "mass Flow",
                "unit": "kg/s"
              },
              {
                "id": "pressureDrop",
                "quantity": "pressure",
                "declared": true,
                "consumers": [],
                "label": "pressure Drop",
                "unit": "Pa"
              },
              {
                "id": "hydraulicPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "hydraulic Power",
                "unit": "W"
              },
              {
                "id": "contactHeat",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat",
                "unit": "W"
              },
              {
                "id": "outletTemperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "outlet Temperature",
                "unit": "K"
              }
            ],
            "parameters": [
              {
                "id": "plateCapacityJK",
                "default": 900,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 900
              },
              {
                "id": "coolantCapacityJK",
                "default": 420,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 420
              },
              {
                "id": "plateConductanceWK",
                "default": 10,
                "unit": "W/K",
                "min": 0,
                "max": 1000000,
                "value": 10
              },
              {
                "id": "contactConductanceWK",
                "default": 100,
                "unit": "W/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "coolantConductanceWK",
                "default": 20,
                "unit": "W/K per segment",
                "min": 0,
                "max": 1000000000,
                "value": 20
              },
              {
                "id": "hydraulicResistance",
                "default": 1000000,
                "unit": "Pa s/kg per channel",
                "min": 0.001,
                "max": 1000000000000000,
                "value": 1000000
              },
              {
                "id": "specificHeatJkgK",
                "default": 4200,
                "unit": "J/(kg K)",
                "min": 1,
                "max": 1000000,
                "value": 4200
              },
              {
                "id": "densityKgM3",
                "default": 1000,
                "unit": "kg/m3",
                "min": 1,
                "max": 100000,
                "value": 1000
              },
              {
                "id": "initialPlateTemperatureK",
                "default": 310,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 310
              },
              {
                "id": "initialCoolantTemperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "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-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:energy-dispatch",
      "type": "Block",
      "label": "Scheduled import / export and load policy",
      "properties": {
        "id": "energy-dispatch",
        "name": "Scheduled import / export and load policy",
        "kind": "studio",
        "summary": "Sampled import and export requests for schedules, load following or outage support.",
        "behavior": "The controller applies connection, availability, BMS and temperature permissions, reserve SOC, target SOC and import/export bounds. Its command is grid-side power: positive requests import and negative requests export. The separate bidirectional interface enforces the physical power path.",
        "ports": [
          {
            "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": "available",
            "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": "loadPower",
            "direction": "input",
            "unit": "W",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "outage",
            "direction": "input",
            "unit": "dimensionless",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "command",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "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": "shortfallJ",
            "direction": "output",
            "unit": "J",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "departureShortfallJ",
            "direction": "output",
            "unit": "J",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "importPrice",
            "direction": "output",
            "unit": "currency/kWh",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "exportPrice",
            "direction": "output",
            "unit": "currency/kWh",
            "description": "Observed result from the solved component or sampled controller."
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample Time S",
            "unit": "s",
            "default": 60,
            "min": 0.001,
            "max": 3600,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "mode",
            "label": "Mode",
            "unit": "0 schedule, 1 load-following, 2 outage support",
            "default": 0,
            "min": 0,
            "max": 2,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "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": "maxImportW",
            "label": "Max Import 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": "maxExportW",
            "label": "Max Export 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": "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": "departureS",
            "label": "Departure S",
            "unit": "s (0 disables departure)",
            "default": 86400,
            "min": 0,
            "max": 1000000000,
            "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": "nominalVoltageV",
            "label": "Nominal Voltage V",
            "unit": "V",
            "default": 350,
            "min": 0.01,
            "max": 1000000,
            "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."
          },
          {
            "key": "startS",
            "label": "Start S",
            "unit": "s",
            "default": 0,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "endS",
            "label": "End S",
            "unit": "s",
            "default": 86400,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "repeatPeriodS",
            "label": "Repeat Period S",
            "unit": "s (0 absolute)",
            "default": 0,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          }
        ],
        "equations": [],
        "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": "energy-dispatch",
        "implementationId": "energy-dispatch",
        "url": "https://lemonergy.com/learn/glossary/blocks/energy-dispatch/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/energy-dispatch/",
        "sourceFile": "block-library.json",
        "sourceRepository": "battery-design",
        "sourceRevision": "ef9802329b75bc15bb96885f8ed5d49425106696",
        "reviewed": "2026-10-27",
        "studioHelp": {
          "type": "energy-dispatch",
          "namespace": "physical",
          "slug": "energy-dispatch",
          "canonicalSlug": "energy-dispatch",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "energy-dispatch",
            "name": "Scheduled import / export and load policy",
            "domain": "signal",
            "family": "controller",
            "operation": "Chooses a grid import or export power command from a schedule, load-following or outage strategy and charge limits.",
            "mechanism": [
              "Schedule, load and SOC",
              "Dispatch decisions",
              "Signed power command"
            ],
            "ports": [],
            "terms": [
              {
                "type": "bidirectional-grid",
                "label": "Bidirectional grid / load interface"
              },
              {
                "type": "signal-schedule",
                "label": "Physical availability / signal schedule"
              }
            ],
            "symbol": [
              {
                "tag": "rect",
                "attrs": {
                  "x": 55,
                  "y": 15,
                  "width": 90,
                  "height": 50,
                  "rx": 3
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H55M145 40H190M75 50L90 30L105 50L125 25"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "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": "available",
                "label": "Availability",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Availability 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": "loadPower",
                "label": "Requested load power",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Requested load power 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": "outage",
                "label": "Grid outage status",
                "quantity": "dimensionless",
                "unit": "1",
                "active": true,
                "summary": "Grid outage 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": "command",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "command",
                "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": "shortfallJ",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "shortfall J",
                "unit": "J"
              },
              {
                "id": "departureShortfallJ",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "departure Shortfall J",
                "unit": "J"
              },
              {
                "id": "importPrice",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "import Price",
                "unit": "1"
              },
              {
                "id": "exportPrice",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "export Price",
                "unit": "1"
              }
            ],
            "parameters": [
              {
                "id": "sampleTimeS",
                "default": 60,
                "unit": "s",
                "min": 0.001,
                "max": 3600,
                "value": 60
              },
              {
                "id": "mode",
                "default": 0,
                "unit": "0 schedule, 1 load-following, 2 outage support",
                "min": 0,
                "max": 2,
                "value": 0
              },
              {
                "id": "powerW",
                "default": 0,
                "unit": "W grid import (+), export (-)",
                "min": -1000000000,
                "max": 1000000000,
                "value": 0
              },
              {
                "id": "maxImportW",
                "default": 7000,
                "unit": "W",
                "min": 0,
                "max": 1000000000,
                "value": 7000
              },
              {
                "id": "maxExportW",
                "default": 7000,
                "unit": "W",
                "min": 0,
                "max": 1000000000,
                "value": 7000
              },
              {
                "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": "departureS",
                "default": 86400,
                "unit": "s (0 disables departure)",
                "min": 0,
                "max": 1000000000,
                "value": 86400
              },
              {
                "id": "capacityAh",
                "default": 100,
                "unit": "Ah",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "nominalVoltageV",
                "default": 350,
                "unit": "V",
                "min": 0.01,
                "max": 1000000,
                "value": 350
              },
              {
                "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": "startS",
                "default": 0,
                "unit": "s",
                "min": 0,
                "max": 1000000000,
                "value": 0
              },
              {
                "id": "endS",
                "default": 86400,
                "unit": "s",
                "min": 0,
                "max": 1000000000,
                "value": 86400
              },
              {
                "id": "repeatPeriodS",
                "default": 0,
                "unit": "s (0 absolute)",
                "min": 0,
                "max": 1000000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "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:friction-brake",
      "type": "Block",
      "label": "Finite-slip friction brake",
      "properties": {
        "id": "friction-brake",
        "kind": "studio",
        "name": "Finite-slip friction brake",
        "summary": "Applies bounded friction torque against relative shaft motion; its command sets the available braking torque.",
        "behavior": "Applies bounded friction torque against relative shaft motion; its command sets the available braking torque.",
        "documentationSlug": "friction-brake",
        "referenceOnly": true,
        "ports": [
          {
            "name": "a",
            "direction": "conserving",
            "unit": "rotational",
            "description": "Shaft side A"
          },
          {
            "name": "b",
            "direction": "conserving",
            "unit": "rotational",
            "description": "Shaft side B"
          },
          {
            "name": "Brake command",
            "direction": "input",
            "unit": "fraction",
            "description": "Brake command is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "heat",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: heat."
          }
        ],
        "parameters": [
          {
            "key": "maximumTorqueNm",
            "label": "maximumTorqueNm",
            "unit": "N m",
            "default": 1000,
            "description": "Declared authoring field: maximumTorqueNm.",
            "min": 0,
            "max": 1000000000
          },
          {
            "key": "command",
            "label": "command",
            "unit": "fraction",
            "default": 0,
            "description": "Declared authoring field: command.",
            "min": 0,
            "max": 1
          },
          {
            "key": "slipScaleRadS",
            "label": "slipScaleRadS",
            "unit": "rad/s",
            "default": 0.01,
            "description": "Declared authoring field: slipScaleRadS.",
            "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": "friction-brake",
        "implementationId": "friction-brake",
        "url": "https://lemonergy.com/learn/glossary/blocks/friction-brake/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/friction-brake/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "friction-brake",
          "namespace": "physical",
          "slug": "friction-brake",
          "canonicalSlug": "friction-brake",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "friction-brake",
            "name": "Finite-slip friction brake",
            "domain": "mechanical",
            "family": "damper",
            "operation": "Applies bounded friction torque against relative shaft motion; its command sets the available braking torque.",
            "mechanism": [
              "Brake command",
              "Opposing slip torque",
              "Dissipated power"
            ],
            "ports": [
              {
                "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": "shaft-damper",
                "label": "Shaft viscous loss"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H75M75 20V60M75 20H130M75 60H130M115 25V55M115 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Brake command",
                "quantity": "fraction",
                "unit": "fraction",
                "active": true,
                "summary": "Brake command 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
              }
            ],
            "outputs": [
              {
                "id": "heat",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "heat",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "maximumTorqueNm",
                "default": 1000,
                "unit": "N m",
                "min": 0,
                "max": 1000000000,
                "value": 1000
              },
              {
                "id": "command",
                "default": 0,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0
              },
              {
                "id": "slipScaleRadS",
                "default": 0.01,
                "unit": "rad/s",
                "min": 1e-09,
                "max": 1000000,
                "value": 0.01
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:gas-fan",
      "type": "Block",
      "label": "Fan pressure curve and power",
      "properties": {
        "id": "gas-fan",
        "kind": "studio",
        "name": "Fan pressure curve and power",
        "summary": "Adds a speed-dependent pressure rise against a flow-resistance curve and accounts for input power.",
        "behavior": "Adds a speed-dependent pressure rise against a flow-resistance curve and accounts for input power.",
        "documentationSlug": "gas-fan",
        "referenceOnly": true,
        "ports": [
          {
            "name": "a",
            "direction": "conserving",
            "unit": "gas",
            "description": "Gas side A"
          },
          {
            "name": "b",
            "direction": "conserving",
            "unit": "gas",
            "description": "Gas side B"
          },
          {
            "name": "Relative fan speed",
            "direction": "input",
            "unit": "fraction",
            "description": "Relative fan speed is a directed fraction input to this component, expressed in fraction. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "mass Flow",
            "direction": "output",
            "unit": "kg/s",
            "description": "Directed output available to compatible consumers: mass Flow."
          },
          {
            "name": "power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: power."
          },
          {
            "name": "fluid Power",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: fluid Power."
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: loss."
          }
        ],
        "parameters": [
          {
            "key": "shutoffPressurePa",
            "label": "shutoffPressurePa",
            "unit": "Pa",
            "default": 2000,
            "description": "Declared authoring field: shutoffPressurePa.",
            "min": 0,
            "max": 100000000
          },
          {
            "key": "linearResistance",
            "label": "linearResistance",
            "unit": "Pa s/m3",
            "default": 1000,
            "description": "Declared authoring field: linearResistance.",
            "min": 1e-06,
            "max": 1000000000000
          },
          {
            "key": "quadraticResistance",
            "label": "quadraticResistance",
            "unit": "Pa s2/m6",
            "default": 1000,
            "description": "Declared authoring field: quadraticResistance.",
            "min": 0,
            "max": 1000000000000
          },
          {
            "key": "speed",
            "label": "speed",
            "unit": "fraction",
            "default": 1,
            "description": "Declared authoring field: speed.",
            "min": 0,
            "max": 2
          },
          {
            "key": "efficiency",
            "label": "efficiency",
            "unit": "fraction",
            "default": 0.8,
            "description": "Declared authoring field: efficiency.",
            "min": 1e-06,
            "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": "gas-fan",
        "implementationId": "gas-fan",
        "url": "https://lemonergy.com/learn/glossary/blocks/gas-fan/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/gas-fan/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "gas-fan",
          "namespace": "physical",
          "slug": "gas-fan",
          "canonicalSlug": "gas-fan",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "gas-fan",
            "name": "Fan pressure curve and power",
            "domain": "gas",
            "family": "fan",
            "operation": "Adds a speed-dependent pressure rise against a flow-resistance curve and accounts for input power.",
            "mechanism": [
              "Speed command",
              "Fan pressure rise",
              "Gas flow and power"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "gas",
                "kind": "conserving",
                "label": "Gas side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "gas",
                "kind": "conserving",
                "label": "Gas side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "gas-duct",
                "label": "Gas resistive duct"
              },
              {
                "type": "gas-sensor",
                "label": "Pressure / temperature sensor"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 32
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H68M132 40H190M100 40C65 10 115 5 100 40C145 30 140 65 100 40C85 80 60 45 100 40"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "speed",
                "label": "Relative fan speed",
                "quantity": "fraction",
                "unit": "fraction",
                "active": true,
                "summary": "Relative fan speed 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
              }
            ],
            "outputs": [
              {
                "id": "massFlow",
                "quantity": "mass-rate",
                "declared": true,
                "consumers": [],
                "label": "mass Flow",
                "unit": "kg/s"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "fluidPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "fluid Power",
                "unit": "W"
              },
              {
                "id": "loss",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "loss",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "shutoffPressurePa",
                "default": 2000,
                "unit": "Pa",
                "min": 0,
                "max": 100000000,
                "value": 2000
              },
              {
                "id": "linearResistance",
                "default": 1000,
                "unit": "Pa s/m3",
                "min": 1e-06,
                "max": 1000000000000,
                "value": 1000
              },
              {
                "id": "quadraticResistance",
                "default": 1000,
                "unit": "Pa s2/m6",
                "min": 0,
                "max": 1000000000000,
                "value": 1000
              },
              {
                "id": "speed",
                "default": 1,
                "unit": "fraction",
                "min": 0,
                "max": 2,
                "value": 1
              },
              {
                "id": "efficiency",
                "default": 0.8,
                "unit": "fraction",
                "min": 1e-06,
                "max": 1,
                "value": 0.8
              }
            ]
          }
        }
      }
    },
    {
      "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: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:parallel-cooling-plate",
      "type": "Block",
      "label": "Parallel-channel plate",
      "properties": {
        "id": "parallel-cooling-plate",
        "name": "Parallel-channel plate",
        "kind": "studio",
        "summary": "A plate with four thermal contacts and a defined coolant path. Explore which body connects to each contact and how pressure drives coolant through the plate.",
        "behavior": "Four metal temperature nodes form a fixed 2 × 2 conduction mesh with four thermal contact ports. Coolant follows two parallel two-segment paths. Metal and coolant have finite heat storage. Pressure difference drives reversible mass and enthalpy transport; hydraulic dissipation enters the coolant energy balance. Each liquid boundary requires an explicit pressure/temperature reservoir.",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal A: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal B: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "h1",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 1 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h2",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 2 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h3",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 3 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h4",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 4 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "massFlow",
            "direction": "output",
            "unit": "kg/s",
            "description": "Total coolant mass flow. Positive means A to B; negative means B to A. Parallel channels contribute to the total."
          },
          {
            "name": "pressureDrop",
            "direction": "output",
            "unit": "Pa",
            "description": "Boundary A pressure minus boundary B pressure. Its sign determines coolant direction."
          },
          {
            "name": "hydraulicPower",
            "direction": "output",
            "unit": "W",
            "description": "Pressure-work dissipation entering the coolant as heat: total mass flow × pressure drop / density."
          },
          {
            "name": "contactHeat",
            "direction": "output",
            "unit": "W",
            "description": "Sum of heat entering the plate through h1 to h4. Positive when the connected bodies deliver heat to the plate."
          },
          {
            "name": "outletTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Coolant temperature leaving the downstream end of the plate, following the actual flow direction. Parallel-channel outlet temperatures are averaged."
          },
          {
            "name": "storedEnergy",
            "direction": "output",
            "unit": "J",
            "description": "Change in metal plus coolant sensible energy relative to their configured initial temperatures."
          }
        ],
        "parameters": [
          {
            "key": "plateCapacityJK",
            "label": "Total plate heat capacity",
            "unit": "J/K",
            "default": 900,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total plate heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantCapacityJK",
            "label": "Total coolant heat capacity",
            "unit": "J/K",
            "default": 420,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total coolant heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "plateConductanceWK",
            "label": "Conductance between metal nodes",
            "unit": "W/K",
            "default": 10,
            "min": 0,
            "max": 1000000,
            "description": "Conductance between metal nodes. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "contactConductanceWK",
            "label": "Thermal contact conductance",
            "unit": "W/K",
            "default": 100,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Thermal contact conductance. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantConductanceWK",
            "label": "Metal-to-coolant conductance per segment",
            "unit": "W/K per segment",
            "default": 20,
            "min": 0,
            "max": 1000000000,
            "description": "Metal-to-coolant conductance per segment. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "hydraulicResistance",
            "label": "Hydraulic resistance per channel",
            "unit": "Pa s/kg per channel",
            "default": 1000000,
            "min": 0.001,
            "max": 1000000000000000,
            "description": "Hydraulic resistance per channel. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "specificHeatJkgK",
            "label": "Coolant specific heat",
            "unit": "J/(kg K)",
            "default": 4200,
            "min": 1,
            "max": 1000000,
            "description": "Coolant specific heat. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "densityKgM3",
            "label": "Coolant density",
            "unit": "kg/m3",
            "default": 1000,
            "min": 1,
            "max": 100000,
            "description": "Coolant density. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialPlateTemperatureK",
            "label": "Initial plate temperature",
            "unit": "K",
            "default": 310,
            "min": 0,
            "max": 5000,
            "description": "Initial plate temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialCoolantTemperatureK",
            "label": "Initial coolant temperature",
            "unit": "K",
            "default": 300,
            "min": 0,
            "max": 5000,
            "description": "Initial coolant temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          }
        ],
        "equations": [
          "mass flow per channel = (pressureA-pressureB)/hydraulicResistance",
          "contact heat[j] = contactConductance*(contactTemperature[j]-plateTemperature[j])",
          "metal heat capacity per node = plateCapacity/4",
          "hydraulicPower = totalMassFlow*(pressureA-pressureB)/density",
          "coolant heat capacity*dT/dt = metal-to-coolant heat + advective enthalpy + hydraulic heat"
        ],
        "example": {
          "title": "Parallel-channel plate worked example",
          "text": "The bundled model connects four thermal masses initially at 320 K to a 310 K plate, with 300 K coolant reservoirs at 200 kPa and 100 kPa. With channel resistance 10^6 Pa s/kg, the total flow is 0.2 kg/s and hydraulic dissipation is 20 W. After 0.2 s all four loads cool below their initial temperature. The loads cool from stored sensible heat; no continuous heater is attached.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-cooling-parallel",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "massFlow",
              "label": "Total coolant mass flow",
              "atS": 0.2,
              "value": 0.2,
              "unit": "kg/s",
              "tolerance": 1e-06
            },
            {
              "port": "hydraulicPower",
              "label": "Hydraulic dissipation",
              "atS": 0.2,
              "value": 20,
              "unit": "W",
              "tolerance": 1e-06
            }
          ],
          "inputs": [
            {
              "port": "a",
              "label": "Inlet boundary pressure",
              "value": 200000,
              "unit": "Pa"
            },
            {
              "port": "b",
              "label": "Outlet boundary pressure",
              "value": 100000,
              "unit": "Pa"
            }
          ]
        },
        "limits": [
          "Fixed 2 × 2 metal mesh and the stated coolant path. Constant properties and single-phase incompressible coolant. No arbitrary liquid junction solver, configurable grid, resolved channel geometry or phase change."
        ],
        "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": [
          "openstax-heat"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-parallel-cooling-plate"
        ],
        "connectionGuide": {
          "kind": "cooling-plate",
          "title": "Trace the cooling connections",
          "summary": "Select a contact to explain its pin. Open a warm body or boundary to follow that connection into its own reference.",
          "paths": [
            [
              1,
              3
            ],
            [
              2,
              4
            ]
          ],
          "concepts": [
            {
              "id": "coolant",
              "label": "Coolant"
            },
            {
              "id": "thermal-mass",
              "label": "Thermal mass"
            },
            {
              "id": "heat-transfer-modes",
              "label": "Heat transfer"
            },
            {
              "id": "thermal-model",
              "label": "Thermal model"
            }
          ]
        },
        "type": "parallel-cooling-plate",
        "implementationId": "parallel-cooling-plate",
        "url": "https://lemonergy.com/learn/glossary/blocks/parallel-cooling-plate/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/parallel-cooling-plate/",
        "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-cooling-parallel"
          ]
        },
        "studioHelp": {
          "type": "parallel-cooling-plate",
          "namespace": "physical",
          "slug": "parallel-cooling-plate",
          "canonicalSlug": "parallel-cooling-plate",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "parallel-cooling-plate",
            "name": "Parallel-channel plate",
            "domain": "thermal",
            "family": "cooling",
            "operation": "Exchanges heat between four plate zones, attached bodies and coolant flowing through the declared channel path.",
            "mechanism": [
              "Thermal contacts",
              "Metal and coolant storage",
              "Coolant transport"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal B",
                "net": null,
                "peers": []
              },
              {
                "id": "h1",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h2",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-right thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h3",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h4",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-right thermal contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "liquid-reservoir",
                "label": "Coolant pressure and temperature boundary"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M50 5V60Q50 75 70 75H130Q150 75 150 60V5"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "contactHeat1",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat1",
                "unit": "W"
              },
              {
                "id": "contactHeat2",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat2",
                "unit": "W"
              },
              {
                "id": "contactHeat3",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat3",
                "unit": "W"
              },
              {
                "id": "contactHeat4",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat4",
                "unit": "W"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              },
              {
                "id": "massFlow",
                "quantity": "mass-rate",
                "declared": true,
                "consumers": [],
                "label": "mass Flow",
                "unit": "kg/s"
              },
              {
                "id": "pressureDrop",
                "quantity": "pressure",
                "declared": true,
                "consumers": [],
                "label": "pressure Drop",
                "unit": "Pa"
              },
              {
                "id": "hydraulicPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "hydraulic Power",
                "unit": "W"
              },
              {
                "id": "contactHeat",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat",
                "unit": "W"
              },
              {
                "id": "outletTemperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "outlet Temperature",
                "unit": "K"
              }
            ],
            "parameters": [
              {
                "id": "plateCapacityJK",
                "default": 900,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 900
              },
              {
                "id": "coolantCapacityJK",
                "default": 420,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 420
              },
              {
                "id": "plateConductanceWK",
                "default": 10,
                "unit": "W/K",
                "min": 0,
                "max": 1000000,
                "value": 10
              },
              {
                "id": "contactConductanceWK",
                "default": 100,
                "unit": "W/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "coolantConductanceWK",
                "default": 20,
                "unit": "W/K per segment",
                "min": 0,
                "max": 1000000000,
                "value": 20
              },
              {
                "id": "hydraulicResistance",
                "default": 1000000,
                "unit": "Pa s/kg per channel",
                "min": 0.001,
                "max": 1000000000000000,
                "value": 1000000
              },
              {
                "id": "specificHeatJkgK",
                "default": 4200,
                "unit": "J/(kg K)",
                "min": 1,
                "max": 1000000,
                "value": 4200
              },
              {
                "id": "densityKgM3",
                "default": 1000,
                "unit": "kg/m3",
                "min": 1,
                "max": 100000,
                "value": 1000
              },
              {
                "id": "initialPlateTemperatureK",
                "default": 310,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 310
              },
              {
                "id": "initialCoolantTemperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "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:signal-integrator",
      "type": "Block",
      "label": "Physical signal integrator",
      "properties": {
        "id": "signal-integrator",
        "kind": "studio",
        "name": "Physical signal integrator",
        "summary": "Accumulates a typed rate over native simulation time, starting from its configured initial value.",
        "behavior": "Accumulates a typed rate over native simulation time, starting from its configured initial value.",
        "documentationSlug": "signal-integrator",
        "referenceOnly": true,
        "ports": [
          {
            "name": "Input signal",
            "direction": "input",
            "unit": "W",
            "description": "Input signal is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "Typed signal output",
            "direction": "output",
            "unit": "J",
            "description": "Directed output available to compatible consumers: Typed signal output."
          }
        ],
        "parameters": [
          {
            "key": "initial",
            "label": "initial",
            "unit": "declared output quantity",
            "default": 0,
            "description": "Declared authoring field: initial.",
            "min": -1000000000000000,
            "max": 1000000000000000
          },
          {
            "key": "stateScale",
            "label": "stateScale",
            "unit": "characteristic output magnitude",
            "default": 1000000,
            "description": "Declared authoring field: stateScale.",
            "min": 1e-09,
            "max": 1000000000000000
          },
          {
            "key": "rateScale",
            "label": "rateScale",
            "unit": "characteristic rate magnitude",
            "default": 1000,
            "description": "Declared authoring field: rateScale.",
            "min": 1e-09,
            "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": "signal-integrator",
        "implementationId": "signal-integrator",
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-integrator/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/signal-integrator/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "signal-integrator",
          "namespace": "physical",
          "slug": "signal-integrator",
          "canonicalSlug": "signal-integrator",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "signal-integrator",
            "name": "Physical signal integrator",
            "domain": "signal",
            "family": "controller",
            "operation": "Accumulates a typed rate over native simulation time, starting from its configured initial value.",
            "mechanism": [
              "Typed rate input",
              "Native time integration",
              "Accumulated quantity"
            ],
            "ports": [],
            "terms": [
              {
                "type": "signal-filter",
                "label": "Physical signal filter"
              },
              {
                "type": "physical-chart",
                "label": "Physical-network sampled chart"
              }
            ],
            "symbol": [
              {
                "tag": "rect",
                "attrs": {
                  "x": 55,
                  "y": 15,
                  "width": 90,
                  "height": 50,
                  "rx": 3
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H55M145 40H190M75 50L90 30L105 50L125 25"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "input",
                "label": "Input signal",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Input signal 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": "out",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "Typed signal output",
                "unit": "J"
              }
            ],
            "parameters": [
              {
                "id": "initial",
                "default": 0,
                "unit": "declared output quantity",
                "min": -1000000000000000,
                "max": 1000000000000000,
                "value": 0
              },
              {
                "id": "stateScale",
                "default": 1000000,
                "unit": "characteristic output magnitude",
                "min": 1e-09,
                "max": 1000000000000000,
                "value": 1000000
              },
              {
                "id": "rateScale",
                "default": 1000,
                "unit": "characteristic rate magnitude",
                "min": 1e-09,
                "max": 1000000000000,
                "value": 1000
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:site-power-allocator",
      "type": "Block",
      "label": "Shared site power allocator",
      "properties": {
        "id": "site-power-allocator",
        "name": "Shared site power allocator",
        "kind": "studio",
        "summary": "Share one grid-side power budget among one to eight requests.",
        "behavior": "Proportional allocation scales all nonnegative demands together. Input-priority allocation fills request 1 before request 2 and subsequent requests. It outputs allocated power for each configured input plus total demand, total allocation and unused power.",
        "ports": [
          {
            "name": "limit",
            "direction": "input",
            "unit": "W",
            "description": "Typed signal input; its quantity must match the connected output."
          },
          {
            "name": "demand1",
            "direction": "input",
            "unit": "W",
            "description": "Nonnegative request. Only demand1 through the configured ports count may be connected."
          },
          {
            "name": "demand2",
            "direction": "input",
            "unit": "W",
            "description": "Nonnegative request. Only demand1 through the configured ports count may be connected."
          },
          {
            "name": "demand3",
            "direction": "input",
            "unit": "W",
            "description": "Nonnegative request. Only demand1 through the configured ports count may be connected."
          },
          {
            "name": "demand4",
            "direction": "input",
            "unit": "W",
            "description": "Nonnegative request. Only demand1 through the configured ports count may be connected."
          },
          {
            "name": "demand5",
            "direction": "input",
            "unit": "W",
            "description": "Nonnegative request. Only demand1 through the configured ports count may be connected."
          },
          {
            "name": "demand6",
            "direction": "input",
            "unit": "W",
            "description": "Nonnegative request. Only demand1 through the configured ports count may be connected."
          },
          {
            "name": "demand7",
            "direction": "input",
            "unit": "W",
            "description": "Nonnegative request. Only demand1 through the configured ports count may be connected."
          },
          {
            "name": "demand8",
            "direction": "input",
            "unit": "W",
            "description": "Nonnegative request. Only demand1 through the configured ports count may be connected."
          },
          {
            "name": "totalDemand",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "totalAllocated",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "unusedPower",
            "direction": "output",
            "unit": "W",
            "description": "Observed result from the solved component or sampled controller."
          },
          {
            "name": "allocation1",
            "direction": "output",
            "unit": "W",
            "description": "Allocated power; outputs exist through the configured ports count."
          },
          {
            "name": "allocation2",
            "direction": "output",
            "unit": "W",
            "description": "Allocated power; outputs exist through the configured ports count."
          },
          {
            "name": "allocation3",
            "direction": "output",
            "unit": "W",
            "description": "Allocated power; outputs exist through the configured ports count."
          },
          {
            "name": "allocation4",
            "direction": "output",
            "unit": "W",
            "description": "Allocated power; outputs exist through the configured ports count."
          },
          {
            "name": "allocation5",
            "direction": "output",
            "unit": "W",
            "description": "Allocated power; outputs exist through the configured ports count."
          },
          {
            "name": "allocation6",
            "direction": "output",
            "unit": "W",
            "description": "Allocated power; outputs exist through the configured ports count."
          },
          {
            "name": "allocation7",
            "direction": "output",
            "unit": "W",
            "description": "Allocated power; outputs exist through the configured ports count."
          },
          {
            "name": "allocation8",
            "direction": "output",
            "unit": "W",
            "description": "Allocated power; outputs exist through the configured ports count."
          }
        ],
        "parameters": [
          {
            "key": "ports",
            "label": "Ports",
            "unit": "count",
            "default": 2,
            "min": 1,
            "max": 8,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "limitW",
            "label": "Limit W",
            "unit": "W grid-side",
            "default": 11000,
            "min": 0,
            "max": 1000000000,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          },
          {
            "key": "allocation",
            "label": "Allocation",
            "unit": "0 proportional, 1 input priority",
            "default": 0,
            "min": 0,
            "max": 1,
            "description": "Configured model parameter; the default is an initial editor value, not an operating recommendation."
          }
        ],
        "equations": [
          "P_i = max(0, demand_i) * min(1, P_limit / sum(max(0, demand_j))), when total demand > 0"
        ],
        "example": {
          "title": "Compare charging policies",
          "text": "Connect a vehicle for eight hours with a cheaper window from hour 1 to hour 7.",
          "url": "https://design.lemonergy.com/cosim.html?example=charging-home",
          "label": "Open the Studio example"
        },
        "limits": [
          "This is deterministic policy comparison, not a forecast or economic optimum.",
          "Downstream unused capacity is not silently redistributed."
        ],
        "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": [
          "home-schedule",
          "depot-allocation"
        ],
        "type": "site-power-allocator",
        "implementationId": "site-power-allocator",
        "url": "https://lemonergy.com/learn/glossary/blocks/site-power-allocator/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/site-power-allocator/",
        "sourceFile": "block-library.json",
        "sourceRepository": "battery-design",
        "sourceRevision": "ef9802329b75bc15bb96885f8ed5d49425106696",
        "reviewed": "2026-10-27",
        "studioHelp": {
          "type": "site-power-allocator",
          "namespace": "physical",
          "slug": "site-power-allocator",
          "canonicalSlug": "site-power-allocator",
          "existing": true,
          "dynamic": true,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "site-power-allocator",
            "name": "Shared site power allocator",
            "domain": "signal",
            "family": "allocator",
            "operation": "Shares a total power limit among configured demand inputs, proportionally or in input-priority order.",
            "mechanism": [
              "Power demands",
              "Shared site limit",
              "Power allocations"
            ],
            "ports": [],
            "terms": [
              {
                "type": "charging-policy",
                "label": "Charging schedule and target policy"
              },
              {
                "type": "regulated-charger",
                "label": "Regulated CC/CV charger"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H90M90 15V65M90 15H190M90 40H190M90 65H190"
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 90,
                  "cy": 40,
                  "r": 4
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "limit",
                "label": "Site power limit",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Site 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": "demand1",
                "label": "Demand 1",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Demand 1 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": "demand2",
                "label": "Demand 2",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Demand 2 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": "demand3",
                "label": "Demand 3",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Demand 3 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": "demand4",
                "label": "Demand 4",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Demand 4 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": "demand5",
                "label": "Demand 5",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Demand 5 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": "demand6",
                "label": "Demand 6",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Demand 6 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": "demand7",
                "label": "Demand 7",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Demand 7 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": "demand8",
                "label": "Demand 8",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Demand 8 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": "totalDemand",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "total Demand",
                "unit": "W"
              },
              {
                "id": "totalAllocated",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "total Allocated",
                "unit": "W"
              },
              {
                "id": "unusedPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "unused Power",
                "unit": "W"
              },
              {
                "id": "allocation1",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "allocation1",
                "unit": "W"
              },
              {
                "id": "allocation2",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "allocation2",
                "unit": "W"
              },
              {
                "id": "allocation3",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "allocation3",
                "unit": "W"
              },
              {
                "id": "allocation4",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "allocation4",
                "unit": "W"
              },
              {
                "id": "allocation5",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "allocation5",
                "unit": "W"
              },
              {
                "id": "allocation6",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "allocation6",
                "unit": "W"
              },
              {
                "id": "allocation7",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "allocation7",
                "unit": "W"
              },
              {
                "id": "allocation8",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "allocation8",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "ports",
                "default": 2,
                "unit": "count",
                "min": 1,
                "max": 8,
                "value": 8
              },
              {
                "id": "limitW",
                "default": 11000,
                "unit": "W grid-side",
                "min": 0,
                "max": 1000000000,
                "value": 11000
              },
              {
                "id": "allocation",
                "default": 0,
                "unit": "0 proportional, 1 input priority",
                "min": 0,
                "max": 1,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "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:spring-damper",
      "type": "Block",
      "label": "Axial suspension spring and damper",
      "properties": {
        "id": "spring-damper",
        "kind": "studio",
        "name": "Axial suspension spring and damper",
        "summary": "Acts along the line between frames, combining elastic force from extension and viscous force from extension rate.",
        "behavior": "Acts along the line between frames, combining elastic force from extension and viscous force from extension rate.",
        "documentationSlug": "spring-damper",
        "referenceOnly": true,
        "ports": [
          {
            "name": "a",
            "direction": "conserving",
            "unit": "frame",
            "description": "Reference frame A"
          },
          {
            "name": "b",
            "direction": "conserving",
            "unit": "frame",
            "description": "Attached frame B"
          },
          {
            "name": "length",
            "direction": "output",
            "unit": "m",
            "description": "Directed output available to compatible consumers: length."
          },
          {
            "name": "force",
            "direction": "output",
            "unit": "N",
            "description": "Directed output available to compatible consumers: force."
          },
          {
            "name": "heat",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: heat."
          }
        ],
        "parameters": [
          {
            "key": "restLengthM",
            "label": "restLengthM",
            "unit": "m",
            "default": 1,
            "description": "Declared authoring field: restLengthM.",
            "min": 1e-09,
            "max": 1000000
          },
          {
            "key": "stiffnessNM",
            "label": "stiffnessNM",
            "unit": "N/m",
            "default": 10000,
            "description": "Declared authoring field: stiffnessNM.",
            "min": 0,
            "max": 1000000000000
          },
          {
            "key": "dampingNSM",
            "label": "dampingNSM",
            "unit": "N s/m",
            "default": 100,
            "description": "Declared authoring field: dampingNSM.",
            "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": "spring-damper",
        "implementationId": "spring-damper",
        "url": "https://lemonergy.com/learn/glossary/blocks/spring-damper/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/spring-damper/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "spring-damper",
          "namespace": "physical",
          "slug": "spring-damper",
          "canonicalSlug": "spring-damper",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "spring-damper",
            "name": "Axial suspension spring and damper",
            "domain": "mechanical",
            "family": "spring",
            "operation": "Acts along the line between frames, combining elastic force from extension and viscous force from extension rate.",
            "mechanism": [
              "Relative extension",
              "Spring and damper",
              "Opposing forces"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "frame",
                "kind": "conserving",
                "label": "Reference frame A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "frame",
                "kind": "conserving",
                "label": "Attached frame B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "body-inertia",
                "label": "Rigid body and inertia"
              },
              {
                "type": "linear-spring",
                "label": "Translational spring"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H40L50 15L65 65L80 15L95 65L110 15L125 65L140 15L150 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "length",
                "quantity": "length",
                "declared": true,
                "consumers": [],
                "label": "length",
                "unit": "m"
              },
              {
                "id": "force",
                "quantity": "force",
                "declared": true,
                "consumers": [],
                "label": "force",
                "unit": "N"
              },
              {
                "id": "heat",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "heat",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "restLengthM",
                "default": 1,
                "unit": "m",
                "min": 1e-09,
                "max": 1000000,
                "value": 1
              },
              {
                "id": "stiffnessNM",
                "default": 10000,
                "unit": "N/m",
                "min": 0,
                "max": 1000000000000,
                "value": 10000
              },
              {
                "id": "dampingNSM",
                "default": 100,
                "unit": "N s/m",
                "min": 0,
                "max": 1000000000000,
                "value": 100
              }
            ]
          }
        }
      }
    },
    {
      "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:tyre-contact",
      "type": "Block",
      "label": "Combined-slip tyre and compliant road contact",
      "properties": {
        "id": "tyre-contact",
        "kind": "studio",
        "name": "Combined-slip tyre and compliant road contact",
        "summary": "Combines compliant road contact with longitudinal and lateral slip forces, coupled to wheel-shaft torque.",
        "behavior": "Combines compliant road contact with longitudinal and lateral slip forces, coupled to wheel-shaft torque.",
        "documentationSlug": "tyre-contact",
        "referenceOnly": true,
        "ports": [
          {
            "name": "a",
            "direction": "conserving",
            "unit": "frame",
            "description": "Reference frame A"
          },
          {
            "name": "b",
            "direction": "conserving",
            "unit": "frame",
            "description": "Attached frame B"
          },
          {
            "name": "shaft",
            "direction": "conserving",
            "unit": "rotational",
            "description": "Wheel rotational shaft"
          },
          {
            "name": "Steering angle",
            "direction": "input",
            "unit": "rad (dimensionless signal)",
            "description": "Steering angle is a directed dimensionless input to this component, expressed in rad (dimensionless signal). Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "normal Force",
            "direction": "output",
            "unit": "N",
            "description": "Directed output available to compatible consumers: normal Force."
          },
          {
            "name": "longitudinal Force",
            "direction": "output",
            "unit": "N",
            "description": "Directed output available to compatible consumers: longitudinal Force."
          },
          {
            "name": "lateral Force",
            "direction": "output",
            "unit": "N",
            "description": "Directed output available to compatible consumers: lateral Force."
          },
          {
            "name": "slip Speed",
            "direction": "output",
            "unit": "m/s",
            "description": "Directed output available to compatible consumers: slip Speed."
          },
          {
            "name": "heat",
            "direction": "output",
            "unit": "W",
            "description": "Directed output available to compatible consumers: heat."
          }
        ],
        "parameters": [
          {
            "key": "radiusM",
            "label": "radiusM",
            "unit": "m",
            "default": 0.3,
            "description": "Declared authoring field: radiusM.",
            "min": 1e-06,
            "max": 10
          },
          {
            "key": "normalStiffnessNM",
            "label": "normalStiffnessNM",
            "unit": "N/m",
            "default": 200000,
            "description": "Declared authoring field: normalStiffnessNM.",
            "min": 1e-06,
            "max": 1000000000000
          },
          {
            "key": "normalDampingNSM",
            "label": "normalDampingNSM",
            "unit": "N s/m",
            "default": 2000,
            "description": "Declared authoring field: normalDampingNSM.",
            "min": 0,
            "max": 1000000000000
          },
          {
            "key": "friction",
            "label": "friction",
            "unit": "1",
            "default": 0.9,
            "description": "Declared authoring field: friction.",
            "min": 0,
            "max": 10
          },
          {
            "key": "longitudinalStiffness",
            "label": "longitudinalStiffness",
            "unit": "N s/m",
            "default": 20000,
            "description": "Declared authoring field: longitudinalStiffness.",
            "min": 0,
            "max": 1000000000000
          },
          {
            "key": "lateralStiffness",
            "label": "lateralStiffness",
            "unit": "N s/m",
            "default": 20000,
            "description": "Declared authoring field: lateralStiffness.",
            "min": 0,
            "max": 1000000000000
          },
          {
            "key": "steeringRad",
            "label": "steeringRad",
            "unit": "rad",
            "default": 0,
            "description": "Declared authoring field: steeringRad.",
            "min": -1.5,
            "max": 1.5
          }
        ],
        "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": "tyre-contact",
        "implementationId": "tyre-contact",
        "url": "https://lemonergy.com/learn/glossary/blocks/tyre-contact/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/tyre-contact/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "tyre-contact",
          "namespace": "physical",
          "slug": "tyre-contact",
          "canonicalSlug": "tyre-contact",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "tyre-contact",
            "name": "Combined-slip tyre and compliant road contact",
            "domain": "mechanical",
            "family": "contact",
            "operation": "Combines compliant road contact with longitudinal and lateral slip forces, coupled to wheel-shaft torque.",
            "mechanism": [
              "Road contact and slip",
              "Friction limit",
              "Body force and wheel torque"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "frame",
                "kind": "conserving",
                "label": "Reference frame A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "frame",
                "kind": "conserving",
                "label": "Attached frame B",
                "net": null,
                "peers": []
              },
              {
                "id": "shaft",
                "domain": "rotational",
                "kind": "conserving",
                "label": "Wheel rotational shaft",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "plane-contact",
                "label": "Compliant unilateral plane contact"
              },
              {
                "type": "shaft-frame",
                "label": "Shaft to rigid-body frame"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M25 65H180M45 70L35 78M80 70L70 78M115 70L105 78M150 70L140 78"
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 35,
                  "r": 29
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "steering",
                "label": "Steering angle",
                "quantity": "dimensionless",
                "unit": "rad (dimensionless signal)",
                "active": true,
                "summary": "Steering angle is a directed dimensionless input to this component, expressed in rad (dimensionless signal). Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "normalForce",
                "quantity": "force",
                "declared": true,
                "consumers": [],
                "label": "normal Force",
                "unit": "N"
              },
              {
                "id": "longitudinalForce",
                "quantity": "force",
                "declared": true,
                "consumers": [],
                "label": "longitudinal Force",
                "unit": "N"
              },
              {
                "id": "lateralForce",
                "quantity": "force",
                "declared": true,
                "consumers": [],
                "label": "lateral Force",
                "unit": "N"
              },
              {
                "id": "slipSpeed",
                "quantity": "linear-speed",
                "declared": true,
                "consumers": [],
                "label": "slip Speed",
                "unit": "m/s"
              },
              {
                "id": "heat",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "heat",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "radiusM",
                "default": 0.3,
                "unit": "m",
                "min": 1e-06,
                "max": 10,
                "value": 0.3
              },
              {
                "id": "normalStiffnessNM",
                "default": 200000,
                "unit": "N/m",
                "min": 1e-06,
                "max": 1000000000000,
                "value": 200000
              },
              {
                "id": "normalDampingNSM",
                "default": 2000,
                "unit": "N s/m",
                "min": 0,
                "max": 1000000000000,
                "value": 2000
              },
              {
                "id": "friction",
                "default": 0.9,
                "unit": "1",
                "min": 0,
                "max": 10,
                "value": 0.9
              },
              {
                "id": "longitudinalStiffness",
                "default": 20000,
                "unit": "N s/m",
                "min": 0,
                "max": 1000000000000,
                "value": 20000
              },
              {
                "id": "lateralStiffness",
                "default": 20000,
                "unit": "N s/m",
                "min": 0,
                "max": 1000000000000,
                "value": 20000
              },
              {
                "id": "steeringRad",
                "default": 0,
                "unit": "rad",
                "min": -1.5,
                "max": 1.5,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:u-cooling-plate",
      "type": "Block",
      "label": "U-channel plate",
      "properties": {
        "id": "u-cooling-plate",
        "name": "U-channel plate",
        "kind": "studio",
        "summary": "A plate with four thermal contacts and a defined coolant path. Explore which body connects to each contact and how pressure drives coolant through the plate.",
        "behavior": "Four metal temperature nodes form a fixed 2 × 2 conduction mesh with four thermal contact ports. Coolant follows one four-segment U path. Metal and coolant have finite heat storage. Pressure difference drives reversible mass and enthalpy transport; hydraulic dissipation enters the coolant energy balance. Each liquid boundary requires an explicit pressure/temperature reservoir.",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal A: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Coolant terminal B: connects to a pressure and temperature boundary. The connected node shares pressure and carries mass and enthalpy flow. Positive plate massFlow is A to B; negative massFlow reverses the inlet and outlet roles."
          },
          {
            "name": "h1",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 1 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h2",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 2 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h3",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 3 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "h4",
            "direction": "terminal",
            "unit": "K / W",
            "description": "Thermal contact for metal zone 4 in the fixed 2 × 2 plate mesh. Connect the h pin of a thermal mass here. Heat enters the plate when the connected body is warmer than this zone; heat can reverse. This is a temperature/heat-flow connection, not a coolant port."
          },
          {
            "name": "massFlow",
            "direction": "output",
            "unit": "kg/s",
            "description": "Total coolant mass flow. Positive means A to B; negative means B to A. Parallel channels contribute to the total."
          },
          {
            "name": "pressureDrop",
            "direction": "output",
            "unit": "Pa",
            "description": "Boundary A pressure minus boundary B pressure. Its sign determines coolant direction."
          },
          {
            "name": "hydraulicPower",
            "direction": "output",
            "unit": "W",
            "description": "Pressure-work dissipation entering the coolant as heat: total mass flow × pressure drop / density."
          },
          {
            "name": "contactHeat",
            "direction": "output",
            "unit": "W",
            "description": "Sum of heat entering the plate through h1 to h4. Positive when the connected bodies deliver heat to the plate."
          },
          {
            "name": "outletTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Coolant temperature leaving the downstream end of the plate, following the actual flow direction. Parallel-channel outlet temperatures are averaged."
          },
          {
            "name": "storedEnergy",
            "direction": "output",
            "unit": "J",
            "description": "Change in metal plus coolant sensible energy relative to their configured initial temperatures."
          }
        ],
        "parameters": [
          {
            "key": "plateCapacityJK",
            "label": "Total plate heat capacity",
            "unit": "J/K",
            "default": 900,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total plate heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantCapacityJK",
            "label": "Total coolant heat capacity",
            "unit": "J/K",
            "default": 420,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Total coolant heat capacity. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "plateConductanceWK",
            "label": "Conductance between metal nodes",
            "unit": "W/K",
            "default": 10,
            "min": 0,
            "max": 1000000,
            "description": "Conductance between metal nodes. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "contactConductanceWK",
            "label": "Thermal contact conductance",
            "unit": "W/K",
            "default": 100,
            "min": 1e-06,
            "max": 1000000000,
            "description": "Thermal contact conductance. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "coolantConductanceWK",
            "label": "Metal-to-coolant conductance per segment",
            "unit": "W/K per segment",
            "default": 20,
            "min": 0,
            "max": 1000000000,
            "description": "Metal-to-coolant conductance per segment. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "hydraulicResistance",
            "label": "Hydraulic resistance per channel",
            "unit": "Pa s/kg per channel",
            "default": 1000000,
            "min": 0.001,
            "max": 1000000000000000,
            "description": "Hydraulic resistance per channel. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "specificHeatJkgK",
            "label": "Coolant specific heat",
            "unit": "J/(kg K)",
            "default": 4200,
            "min": 1,
            "max": 1000000,
            "description": "Coolant specific heat. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "densityKgM3",
            "label": "Coolant density",
            "unit": "kg/m3",
            "default": 1000,
            "min": 1,
            "max": 100000,
            "description": "Coolant density. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialPlateTemperatureK",
            "label": "Initial plate temperature",
            "unit": "K",
            "default": 310,
            "min": 0,
            "max": 5000,
            "description": "Initial plate temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          },
          {
            "key": "initialCoolantTemperatureK",
            "label": "Initial coolant temperature",
            "unit": "K",
            "default": 300,
            "min": 0,
            "max": 5000,
            "description": "Initial coolant temperature. Numerical bounds are model-validation limits, not physical operating ratings."
          }
        ],
        "equations": [
          "mass flow per channel = (pressureA-pressureB)/hydraulicResistance",
          "contact heat[j] = contactConductance*(contactTemperature[j]-plateTemperature[j])",
          "metal heat capacity per node = plateCapacity/4",
          "hydraulicPower = totalMassFlow*(pressureA-pressureB)/density",
          "coolant heat capacity*dT/dt = metal-to-coolant heat + advective enthalpy + hydraulic heat"
        ],
        "example": {
          "title": "U-channel plate worked example",
          "text": "The bundled model connects four thermal masses initially at 320 K to a 310 K plate, with 300 K coolant reservoirs at 200 kPa and 100 kPa. With channel resistance 10^6 Pa s/kg, the total flow is 0.1 kg/s and hydraulic dissipation is 10 W. After 0.2 s all four loads cool below their initial temperature. The loads cool from stored sensible heat; no continuous heater is attached.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-cooling-u",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "massFlow",
              "label": "Total coolant mass flow",
              "atS": 0.2,
              "value": 0.1,
              "unit": "kg/s",
              "tolerance": 1e-06
            },
            {
              "port": "hydraulicPower",
              "label": "Hydraulic dissipation",
              "atS": 0.2,
              "value": 10,
              "unit": "W",
              "tolerance": 1e-06
            }
          ],
          "inputs": [
            {
              "port": "a",
              "label": "Inlet boundary pressure",
              "value": 200000,
              "unit": "Pa"
            },
            {
              "port": "b",
              "label": "Outlet boundary pressure",
              "value": 100000,
              "unit": "Pa"
            }
          ]
        },
        "limits": [
          "Fixed 2 × 2 metal mesh and the stated coolant path. Constant properties and single-phase incompressible coolant. No arbitrary liquid junction solver, configurable grid, resolved channel geometry or phase change."
        ],
        "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": [
          "openstax-heat"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-u-cooling-plate"
        ],
        "connectionGuide": {
          "kind": "cooling-plate",
          "title": "Trace the cooling connections",
          "summary": "Select a contact to explain its pin. Open a warm body or boundary to follow that connection into its own reference.",
          "paths": [
            [
              1,
              3,
              4,
              2
            ]
          ],
          "concepts": [
            {
              "id": "coolant",
              "label": "Coolant"
            },
            {
              "id": "thermal-mass",
              "label": "Thermal mass"
            },
            {
              "id": "heat-transfer-modes",
              "label": "Heat transfer"
            },
            {
              "id": "thermal-model",
              "label": "Thermal model"
            }
          ]
        },
        "type": "u-cooling-plate",
        "implementationId": "u-cooling-plate",
        "url": "https://lemonergy.com/learn/glossary/blocks/u-cooling-plate/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/u-cooling-plate/",
        "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-cooling-u"
          ]
        },
        "studioHelp": {
          "type": "u-cooling-plate",
          "namespace": "physical",
          "slug": "u-cooling-plate",
          "canonicalSlug": "u-cooling-plate",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "u-cooling-plate",
            "name": "U-channel plate",
            "domain": "thermal",
            "family": "cooling",
            "operation": "Exchanges heat between four plate zones, attached bodies and coolant flowing through the declared channel path.",
            "mechanism": [
              "Thermal contacts",
              "Metal and coolant storage",
              "Coolant transport"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant terminal B",
                "net": null,
                "peers": []
              },
              {
                "id": "h1",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h2",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Upper-right thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h3",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-left thermal contact",
                "net": null,
                "peers": []
              },
              {
                "id": "h4",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Lower-right thermal contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "liquid-reservoir",
                "label": "Coolant pressure and temperature boundary"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M50 5V60Q50 75 70 75H130Q150 75 150 60V5"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "contactHeat1",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat1",
                "unit": "W"
              },
              {
                "id": "contactHeat2",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat2",
                "unit": "W"
              },
              {
                "id": "contactHeat3",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat3",
                "unit": "W"
              },
              {
                "id": "contactHeat4",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat4",
                "unit": "W"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              },
              {
                "id": "massFlow",
                "quantity": "mass-rate",
                "declared": true,
                "consumers": [],
                "label": "mass Flow",
                "unit": "kg/s"
              },
              {
                "id": "pressureDrop",
                "quantity": "pressure",
                "declared": true,
                "consumers": [],
                "label": "pressure Drop",
                "unit": "Pa"
              },
              {
                "id": "hydraulicPower",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "hydraulic Power",
                "unit": "W"
              },
              {
                "id": "contactHeat",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "contact Heat",
                "unit": "W"
              },
              {
                "id": "outletTemperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "outlet Temperature",
                "unit": "K"
              }
            ],
            "parameters": [
              {
                "id": "plateCapacityJK",
                "default": 900,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 900
              },
              {
                "id": "coolantCapacityJK",
                "default": 420,
                "unit": "J/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 420
              },
              {
                "id": "plateConductanceWK",
                "default": 10,
                "unit": "W/K",
                "min": 0,
                "max": 1000000,
                "value": 10
              },
              {
                "id": "contactConductanceWK",
                "default": 100,
                "unit": "W/K",
                "min": 1e-06,
                "max": 1000000000,
                "value": 100
              },
              {
                "id": "coolantConductanceWK",
                "default": 20,
                "unit": "W/K per segment",
                "min": 0,
                "max": 1000000000,
                "value": 20
              },
              {
                "id": "hydraulicResistance",
                "default": 1000000,
                "unit": "Pa s/kg per channel",
                "min": 0.001,
                "max": 1000000000000000,
                "value": 1000000
              },
              {
                "id": "specificHeatJkgK",
                "default": 4200,
                "unit": "J/(kg K)",
                "min": 1,
                "max": 1000000,
                "value": 4200
              },
              {
                "id": "densityKgM3",
                "default": 1000,
                "unit": "kg/m3",
                "min": 1,
                "max": 100000,
                "value": 1000
              },
              {
                "id": "initialPlateTemperatureK",
                "default": 310,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 310
              },
              {
                "id": "initialCoolantTemperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "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-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-energy-counter",
      "type": "Block",
      "label": "Energy counter",
      "properties": {
        "id": "battery-energy-counter",
        "name": "Energy counter",
        "kind": "studio",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "behavior": "Integrates signed discharge current or power over elapsed sample time. Charge efficiency applies during charging. The initial sample has zero elapsed time. Variable-capacity variants preserve the current fraction when capacity changes and report the resulting amount revaluation separately. Reset restores the initial fraction without integrating that event.",
        "ports": [
          {
            "name": "rate",
            "direction": "input",
            "unit": "W",
            "description": "Signed battery power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "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": "throughput",
            "direction": "output",
            "unit": "J",
            "description": "Net throughput (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "revaluation",
            "direction": "output",
            "unit": "J",
            "description": "Capacity revaluation (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "boundary",
            "direction": "output",
            "unit": "J",
            "description": "Boundary amount (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          }
        ],
        "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.8,
            "description": "Initial SOE (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "chargeEfficiency",
            "label": "Charging efficiency (0–1)",
            "unit": "0–1",
            "default": 1,
            "description": "Charging efficiency (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "amount[k] = amount[k-1] - effectiveRate[k] * elapsedTime",
          "fraction = clamp(amount / capacity, 0, 1)",
          "charge capacity in coulombs = 3600 * capacityAh"
        ],
        "example": {
          "title": "Energy counter worked example",
          "text": "Use the defaults below with Signed battery power = 2 W, Reset = 0 true / false. At 0 s, State of energy is 0.8 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-energy-counter",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            },
            {
              "port": "throughput",
              "atS": 0,
              "value": 0,
              "tolerance": 0,
              "label": "Net throughput (J)",
              "unit": "J"
            },
            {
              "port": "fraction",
              "atS": 1,
              "value": 0.7997222222222222,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "rate",
              "label": "Signed battery power",
              "value": 2,
              "unit": "W"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "Current or power bias accumulates. Fraction clipping is reported as a boundary amount; it does not make the connected plant respect that boundary. Energy variants need capacity in joules.",
          "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-energy-counter"
        ],
        "exampleTraces": [
          {
            "id": "battery-energy-counter",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-energy-counter.json?v=41d01f400707",
            "title": "Energy counter recorded example",
            "exampleId": "block-battery-energy-counter",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 4,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-energy-counter",
        "implementationId": "battery-energy-counter",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-energy-counter/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-energy-counter/",
        "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-energy-counter"
          ]
        },
        "studioHelp": {
          "type": "battery-energy-counter",
          "namespace": "signal",
          "slug": "signal-block-battery-energy-counter",
          "canonicalSlug": "battery-energy-counter",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Energy counter",
            "label": "Energy counter",
            "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
            "details": [
              "Block type: battery-energy-counter.",
              "2 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": "Energy counter",
              "caption": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately."
            },
            "inputs": [
              {
                "id": "rate",
                "label": "Signed battery power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "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": "throughput",
                "label": "Net throughput (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "revaluation",
                "label": "Capacity revaluation (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "boundary",
                "label": "Boundary amount (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.8,\"chargeEfficiency\":1}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-energy-counter/",
            "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-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-heater-controller",
      "type": "Block",
      "label": "Battery heater controller",
      "properties": {
        "id": "battery-heater-controller",
        "name": "Battery heater controller",
        "kind": "studio",
        "summary": "Controls the hottest cooling channel or coldest heating channel with hysteresis.",
        "behavior": "Uses the hottest channel for cooling or the coldest channel for heating. Separate on and off thresholds provide hysteresis. Enable gates the commanded coolant mass flow or heater power.",
        "ports": [
          {
            "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": "command",
            "direction": "output",
            "unit": "W",
            "description": "Heater power request; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "active",
            "direction": "output",
            "unit": "true / false",
            "description": "Active; 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": "onK",
            "label": "Turn-on temperature (K)",
            "unit": "K",
            "default": 280,
            "description": "Turn-on temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "offK",
            "label": "Turn-off temperature (K)",
            "unit": "K",
            "default": 285,
            "description": "Turn-off temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "command",
            "label": "Heater power request (W)",
            "unit": "W",
            "default": 10,
            "description": "Heater power request (W). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "cooling uses max(cell temperatures); heating uses min(cell temperatures)",
          "command = active ? configured command : 0"
        ],
        "example": {
          "title": "Battery heater controller worked example",
          "text": "Use the defaults below with Cell temperatures = [275, 282, 283] K, Enable = 1 true / false. At 0 s, Heater power request is 10 W. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-heater-controller",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "command",
              "atS": 0,
              "value": 10,
              "tolerance": 1e-08,
              "label": "Heater power request",
              "unit": "W"
            }
          ],
          "inputs": [
            {
              "port": "temperature",
              "label": "Cell temperatures",
              "value": [
                275,
                282,
                283
              ],
              "unit": "K"
            },
            {
              "port": "enable",
              "label": "Enable",
              "value": 1,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "The controller emits a request. Fluid transport and heater heat delivery require connected plant models.",
          "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": [
          "openstax-heat"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-heater-controller"
        ],
        "exampleTraces": [
          {
            "id": "battery-heater-controller",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-heater-controller.json?v=4bf40ff203ae",
            "title": "Battery heater controller recorded example",
            "exampleId": "block-battery-heater-controller",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 2,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-heater-controller",
        "implementationId": "battery-heater-controller",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-heater-controller/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-heater-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-heater-controller"
          ]
        },
        "studioHelp": {
          "type": "battery-heater-controller",
          "namespace": "signal",
          "slug": "signal-block-battery-heater-controller",
          "canonicalSlug": "battery-heater-controller",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Battery heater controller",
            "label": "Battery heater controller",
            "summary": "Controls the hottest cooling channel or coldest heating channel with hysteresis.",
            "details": [
              "Block type: battery-heater-controller.",
              "2 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": "Battery heater controller",
              "caption": "Controls the hottest cooling channel or coldest heating channel with hysteresis."
            },
            "inputs": [
              {
                "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": "command",
                "label": "Heater power request",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "active",
                "label": "Active",
                "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,\"onK\":280,\"offK\":285,\"command\":10}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-heater-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-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-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-variable-energy-counter",
      "type": "Block",
      "label": "Energy counter with capacity input",
      "properties": {
        "id": "battery-variable-energy-counter",
        "name": "Energy counter with capacity input",
        "kind": "studio",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "behavior": "Integrates signed discharge current or power over elapsed sample time. Charge efficiency applies during charging. The initial sample has zero elapsed time. Variable-capacity variants preserve the current fraction when capacity changes and report the resulting amount revaluation separately. Reset restores the initial fraction without integrating that event.",
        "ports": [
          {
            "name": "rate",
            "direction": "input",
            "unit": "W",
            "description": "Signed battery power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "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": "throughput",
            "direction": "output",
            "unit": "J",
            "description": "Net throughput (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "revaluation",
            "direction": "output",
            "unit": "J",
            "description": "Capacity revaluation (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "boundary",
            "direction": "output",
            "unit": "J",
            "description": "Boundary amount (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          }
        ],
        "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.8,
            "description": "Initial SOE (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "chargeEfficiency",
            "label": "Charging efficiency (0–1)",
            "unit": "0–1",
            "default": 1,
            "description": "Charging efficiency (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "amount[k] = amount[k-1] - effectiveRate[k] * elapsedTime",
          "fraction = clamp(amount / capacity, 0, 1)",
          "charge capacity in coulombs = 3600 * capacityAh"
        ],
        "example": {
          "title": "Energy counter with capacity input worked example",
          "text": "Use the defaults below with Signed battery power = 2 W, Reset = 0 true / false, Energy capacity (J) = 7200 J. At 0 s, State of energy is 0.8 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-variable-energy-counter",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            },
            {
              "port": "throughput",
              "atS": 0,
              "value": 0,
              "tolerance": 0,
              "label": "Net throughput (J)",
              "unit": "J"
            },
            {
              "port": "fraction",
              "atS": 1,
              "value": 0.7997222222222222,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "rate",
              "label": "Signed battery power",
              "value": 2,
              "unit": "W"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            },
            {
              "port": "capacity",
              "label": "Energy capacity (J)",
              "value": 7200,
              "unit": "J"
            }
          ]
        },
        "limits": [
          "Current or power bias accumulates. Fraction clipping is reported as a boundary amount; it does not make the connected plant respect that boundary. Energy variants need capacity in joules.",
          "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-variable-energy-counter"
        ],
        "exampleTraces": [
          {
            "id": "battery-variable-energy-counter",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-variable-energy-counter.json?v=621c07293f4b",
            "title": "Energy counter with capacity input recorded example",
            "exampleId": "block-battery-variable-energy-counter",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 4,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-variable-energy-counter",
        "implementationId": "battery-variable-energy-counter",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-variable-energy-counter/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-variable-energy-counter/",
        "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-variable-energy-counter"
          ]
        },
        "studioHelp": {
          "type": "battery-variable-energy-counter",
          "namespace": "signal",
          "slug": "signal-block-battery-variable-energy-counter",
          "canonicalSlug": "battery-variable-energy-counter",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Energy counter with capacity input",
            "label": "Energy counter with capacity input",
            "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
            "details": [
              "Block type: battery-variable-energy-counter.",
              "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": "Energy counter with capacity input",
              "caption": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately."
            },
            "inputs": [
              {
                "id": "rate",
                "label": "Signed battery power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "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": "throughput",
                "label": "Net throughput (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "revaluation",
                "label": "Capacity revaluation (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "boundary",
                "label": "Boundary amount (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.8,\"chargeEfficiency\":1}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-variable-energy-counter/",
            "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:converter-loss",
      "type": "Block",
      "label": "Converter loss",
      "properties": {
        "id": "converter-loss",
        "kind": "studio",
        "name": "Converter loss",
        "summary": "Designer power-electronics class: fixed·P_rated + conduction·P²/P_rated + switching·|P| on the throughput power.",
        "behavior": "Designer power-electronics class: fixed·P_rated + conduction·P²/P_rated + switching·|P| on the throughput power.",
        "documentationSlug": "signal-block-converter-loss",
        "referenceOnly": true,
        "ports": [
          {
            "name": "Throughput power",
            "direction": "input",
            "unit": "W",
            "description": "Power; Scalar; real. Received from a connected producer."
          },
          {
            "name": "Output",
            "direction": "output",
            "unit": "W",
            "description": "Power; Scalar; real. Produced for connected consumers."
          }
        ],
        "parameters": [
          {
            "key": "ratedW",
            "label": "Rated power",
            "unit": "W",
            "default": "100000",
            "description": "Declared authoring field: Rated power."
          },
          {
            "key": "fixedFrac",
            "label": "Fixed loss fraction",
            "unit": "",
            "default": "0.003",
            "description": "Declared authoring field: Fixed loss fraction."
          },
          {
            "key": "conductionFrac",
            "label": "Conduction loss fraction",
            "unit": "",
            "default": "0.012",
            "description": "Declared authoring field: Conduction loss fraction."
          },
          {
            "key": "switchingFrac",
            "label": "Switching loss fraction",
            "unit": "",
            "default": "0.008",
            "description": "Declared authoring field: Switching loss fraction."
          }
        ],
        "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": "converter-loss",
        "implementationId": "converter-loss",
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-converter-loss/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/signal-block-converter-loss/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "converter-loss",
          "namespace": "signal",
          "slug": "signal-block-converter-loss",
          "canonicalSlug": "signal-block-converter-loss",
          "existing": false,
          "dynamic": false,
          "scene": {
            "title": "Converter loss",
            "label": "Converter loss",
            "summary": "Designer power-electronics class: fixed·P_rated + conduction·P²/P_rated + switching·|P| on the throughput power.",
            "details": [
              "Block type: converter-loss.",
              "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": "physical-model",
              "symbol": "inputs → equation → response",
              "label": "Reduced vehicle equation",
              "caption": "Designer power-electronics class: fixed·P_rated + conduction·P²/P_rated + switching·|P| on the throughput power."
            },
            "inputs": [
              {
                "id": "in0",
                "label": "Throughput power",
                "quantity": "power",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "out0",
                "label": "Output",
                "quantity": "power",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "ratedW",
                "label": "Rated power",
                "unit": "W",
                "value": "100000"
              },
              {
                "id": "fixedFrac",
                "label": "Fixed loss fraction",
                "unit": "",
                "value": "0.003"
              },
              {
                "id": "conductionFrac",
                "label": "Conduction loss fraction",
                "unit": "",
                "value": "0.012"
              },
              {
                "id": "switchingFrac",
                "label": "Switching loss fraction",
                "unit": "",
                "value": "0.008"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-converter-loss/",
            "related": [
              {
                "label": "Road load",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-road-load/"
              },
              {
                "label": "Tyre grip",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-tyre-grip/"
              },
              {
                "label": "Ground contact",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-ground-contact/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:fan-suction",
      "type": "Block",
      "label": "Suction fan",
      "properties": {
        "id": "fan-suction",
        "kind": "studio",
        "name": "Suction fan",
        "summary": "Affinity law on the flow fraction f (clamped 0–1): electrical power standby + (rated − standby)·f³ (mode 0, W) or suction force rated·f² (mode 1, N). One equivalent fan at an authored operating point.",
        "behavior": "Affinity law on the flow fraction f (clamped 0–1): electrical power standby + (rated − standby)·f³ (mode 0, W) or suction force rated·f² (mode 1, N). One equivalent fan at an authored operating point.",
        "documentationSlug": "signal-block-fan-suction",
        "referenceOnly": true,
        "ports": [
          {
            "name": "Flow fraction (0–1)",
            "direction": "input",
            "unit": "—",
            "description": "Number; Scalar; real. Received from a connected producer."
          },
          {
            "name": "Electrical power",
            "direction": "output",
            "unit": "W",
            "description": "Power; Scalar; real. Produced for connected consumers."
          },
          {
            "name": "Suction force",
            "direction": "output",
            "unit": "N",
            "description": "Force; Scalar; real. Produced for connected consumers."
          }
        ],
        "parameters": [
          {
            "key": "ratedPowerW",
            "label": "Rated electrical power",
            "unit": "W",
            "default": "100000",
            "description": "Declared authoring field: Rated electrical power."
          },
          {
            "key": "standbyW",
            "label": "Standby power",
            "unit": "W",
            "default": "0",
            "description": "Declared authoring field: Standby power."
          },
          {
            "key": "ratedForceN",
            "label": "Rated suction force",
            "unit": "N",
            "default": "40000",
            "description": "Declared authoring field: Rated suction force."
          },
          {
            "key": "mode",
            "label": "Output (0 power, 1 force)",
            "unit": "",
            "default": "0",
            "description": "Declared authoring field: Output (0 power, 1 force)."
          }
        ],
        "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": "fan-suction",
        "implementationId": "fan-suction",
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-fan-suction/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/signal-block-fan-suction/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "fan-suction",
          "namespace": "signal",
          "slug": "signal-block-fan-suction",
          "canonicalSlug": "signal-block-fan-suction",
          "existing": false,
          "dynamic": false,
          "scene": {
            "title": "Suction fan",
            "label": "Suction fan",
            "summary": "Affinity law on the flow fraction f (clamped 0–1): electrical power standby + (rated − standby)·f³ (mode 0, W) or suction force rated·f² (mode 1, N). One equivalent fan at an authored operating point.",
            "details": [
              "Block type: fan-suction.",
              "1 declared input 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": "physical-model",
              "symbol": "inputs → equation → response",
              "label": "Reduced vehicle equation",
              "caption": "Affinity law on the flow fraction f (clamped 0–1): electrical power standby + (rated − standby)·f³ (mode 0, W) or suction force rated·f² (mode 1, N). One equivalent fan at an authored operating point."
            },
            "inputs": [
              {
                "id": "in0",
                "label": "Flow fraction (0–1)",
                "quantity": "dimensionless",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "out0",
                "label": "Electrical power",
                "quantity": "power",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "out1",
                "label": "Suction force",
                "quantity": "force",
                "unit": "N",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Force",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "ratedPowerW",
                "label": "Rated electrical power",
                "unit": "W",
                "value": "100000"
              },
              {
                "id": "standbyW",
                "label": "Standby power",
                "unit": "W",
                "value": "0"
              },
              {
                "id": "ratedForceN",
                "label": "Rated suction force",
                "unit": "N",
                "value": "40000"
              },
              {
                "id": "mode",
                "label": "Output (0 power, 1 force)",
                "unit": "",
                "value": "0"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-fan-suction/",
            "related": [
              {
                "label": "Road load",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-road-load/"
              },
              {
                "label": "Tyre grip",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-tyre-grip/"
              },
              {
                "label": "Ground contact",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-ground-contact/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "workflow:loss-accounting",
      "type": "Workflow",
      "label": "Compare grid and battery energy",
      "properties": {
        "id": "loss-accounting",
        "title": "Compare grid and battery energy",
        "kind": "studio",
        "summary": "Separate energy and loss signals make efficiency visible.",
        "steps": [
          "Keep battery settings fixed.",
          "Change converter efficiency."
        ],
        "example": "7 kW battery-side power at 95% efficiency requires about 7.37 kW grid power and produces about 0.37 kW converter loss.",
        "observe": "Battery I²R loss differs from converter loss.",
        "limits": "A loss signal is not a predicted temperature. This network takes external temperature.",
        "url": "https://design.lemonergy.com/cosim.html?example=charging-home",
        "label": "Open the Studio example",
        "evidence": [
          "js/charging-control.js",
          "js/charging-scenarios.js",
          "docs/CHARGING_BLOCKS_SPEC.md"
        ]
      }
    },
    {
      "id": "workflow:native-battery-power-capability",
      "type": "Workflow",
      "label": "Pulse power capability worked example",
      "properties": {
        "id": "native-battery-power-capability",
        "title": "Pulse power capability worked example",
        "kind": "studio",
        "summary": "Quasi-static voltage/current/SOC envelope for an explicit prediction horizon.",
        "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 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.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "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.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-power-capability",
        "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": "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:watt",
      "type": "Term",
      "label": "Watt",
      "properties": {
        "id": "watt",
        "name": "Watt",
        "abbr": "W",
        "section": "topic-units",
        "definition": "The SI unit of power: one joule per second, or in a circuit, volts times amperes. A cell delivering 20 A at 3.6 V is supplying 72 W.",
        "formula": "P = V × I",
        "unit": "W",
        "related": [
          "power",
          "watt-hour",
          "specific-power"
        ],
        "example": {
          "title": "Calculate electrical power",
          "text": "At a particular instant, a terminal voltage of 12 V and current magnitude of 3 A correspond to 36 W. State whether the battery is receiving or supplying that power."
        },
        "url": "https://lemonergy.com/learn/glossary/watt/",
        "mentions": [
          "joule"
        ]
      }
    },
    {
      "id": "term:specific-power",
      "type": "Term",
      "label": "Specific power",
      "properties": {
        "id": "specific-power",
        "name": "Specific power",
        "aka": [
          "power density"
        ],
        "section": "topic-ratings",
        "definition": "Deliverable power per unit mass, in watts per kilogram; power density is the same per litre. A cell is designed for energy or for power, rarely both: thin electrodes give power, thick ones give energy.",
        "unit": "W/kg",
        "related": [
          "power",
          "specific-energy",
          "ragone-plot",
          "areal-loading",
          "power-cell-energy-cell"
        ],
        "url": "https://lemonergy.com/learn/glossary/specific-power/",
        "mentions": []
      }
    },
    {
      "id": "term:state-of-power",
      "type": "Term",
      "label": "State of power",
      "properties": {
        "id": "state-of-power",
        "name": "State of power",
        "abbr": "SOP",
        "section": "topic-state",
        "definition": "The maximum charge or discharge power a battery can deliver for the next few seconds without breaking a voltage, current or temperature limit. The BMS recomputes it continuously from SOC, temperature and resistance and sends it to the motor controller.",
        "unit": "W",
        "related": [
          "power",
          "state-of-charge",
          "continuous-current",
          "derating",
          "bms",
          "state-of-function"
        ],
        "url": "https://lemonergy.com/learn/glossary/state-of-power/",
        "mentions": []
      }
    },
    {
      "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": "visual:energy",
      "type": "Visual",
      "label": "From charge to energy",
      "properties": {
        "title": "From charge to energy",
        "summary": "Voltage connects capacity in ampere-hours to nominal energy in watt-hours.",
        "readout": "5 Ah × 12 V = 60 Wh nominal energy.",
        "formula": "E_nominal = Q_nominal V_nominal; actual energy = ∫ VI dt",
        "note": "Specific energy divides energy by mass; energy density divides it by volume.",
        "software": {
          "status": "implemented",
          "label": "Implemented in battery-core",
          "body": "nominal_energy_wh multiplies nominal voltage by capacity. Actual discharge energy requires the integral of voltage × current.",
          "href": "../fundamentals/capacity-and-c-rate/"
        },
        "html": "<figure class=\"visual-figure\"><figcaption>Nominal energy versus capacity</figcaption><svg class=\"visual-chart\" viewBox=\"0 0 360 330\" role=\"img\" aria-labelledby=\"static-energy-0-title static-energy-0-desc\"><title id=\"static-energy-0-title\">Nominal energy versus capacity</title><desc id=\"static-energy-0-desc\">Capacity (Ah) versus Energy (Wh). 12 V rating. 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\">0</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\">60</text><text x=\"141\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">5</text><path d=\"M74,139h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"143\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">120</text><text x=\"208\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">10</text><path d=\"M74,89.5h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"93.5\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">180</text><text x=\"275\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">15</text><path d=\"M74,40h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"44\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">240</text><text x=\"342\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">20</text><path d=\"M74,40v198h268\" fill=\"none\" stroke=\"currentColor\" opacity=\".3\"/><polyline fill=\"none\" stroke=\"#2459a8\" stroke-width=\"2.8\" points=\"74.00,238.00 76.68,236.02 79.36,234.04 82.04,232.06 84.72,230.08 87.40,228.10 90.08,226.12 92.76,224.14 95.44,222.16 98.12,220.18 100.80,218.20 103.48,216.22 106.16,214.24 108.84,212.26 111.52,210.28 114.20,208.30 116.88,206.32 119.56,204.34 122.24,202.36 124.92,200.38 127.60,198.40 130.28,196.42 132.96,194.44 135.64,192.46 138.32,190.48 141.00,188.50 143.68,186.52 146.36,184.54 149.04,182.56 151.72,180.58 154.40,178.60 157.08,176.62 159.76,174.64 162.44,172.66 165.12,170.68 167.80,168.70 170.48,166.72 173.16,164.74 175.84,162.76 178.52,160.78 181.20,158.80 183.88,156.82 186.56,154.84 189.24,152.86 191.92,150.88 194.60,148.90 197.28,146.92 199.96,144.94 202.64,142.96 205.32,140.98 208.00,139.00 210.68,137.02 213.36,135.04 216.04,133.06 218.72,131.08 221.40,129.10 224.08,127.12 226.76,125.14 229.44,123.16 232.12,121.18 234.80,119.20 237.48,117.22 240.16,115.24 242.84,113.26 245.52,111.28 248.20,109.30 250.88,107.32 253.56,105.34 256.24,103.36 258.92,101.38 261.60,99.40 264.28,97.42 266.96,95.44 269.64,93.46 272.32,91.48 275.00,89.50 277.68,87.52 280.36,85.54 283.04,83.56 285.72,81.58 288.40,79.60 291.08,77.62 293.76,75.64 296.44,73.66 299.12,71.68 301.80,69.70 304.48,67.72 307.16,65.74 309.84,63.76 312.52,61.78 315.20,59.80 317.88,57.82 320.56,55.84 323.24,53.86 325.92,51.88 328.60,49.90 331.28,47.92 333.96,45.94 336.64,43.96 339.32,41.98 342.00,40.00\"/><text transform=\"translate(208 303)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">Capacity (Ah)</tspan></text><text transform=\"translate(20 139) rotate(-90)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">Energy (Wh)</tspan></text></svg><div class=\"visual-legend\"><span><i style=\"background:#2459a8\"></i>12 V rating</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"
      }
    }
  ]
}
