{
  "node": {
    "id": "term:operating-temperature",
    "type": "Term",
    "label": "Operating temperature",
    "properties": {
      "id": "operating-temperature",
      "name": "Operating temperature",
      "section": "topic-ratings",
      "definition": "The temperature range a cell may be charged and discharged in, typically 0–45 °C for charging and −20–60 °C for discharging. Charging below 0 °C risks lithium plating; above the range the cell ages fast and may vent.",
      "unit": "°C",
      "related": [
        "lithium-plating",
        "arrhenius",
        "thermal-management",
        "datasheet"
      ],
      "lesson": "fundamentals/battery-aging/#temperature",
      "url": "https://lemonergy.com/learn/glossary/operating-temperature/",
      "mentions": []
    }
  },
  "edges": [
    {
      "id": "edge:usesBlock/term:operating-temperature/block:bidirectional-grid",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:charging-policy",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:edge-cooling-plate",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:electrothermal-battery",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:energy-dispatch",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:gas-sensor",
      "source": "term:operating-temperature",
      "target": "block:gas-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:operating-temperature/block:initial-temperature-constraint",
      "source": "term:operating-temperature",
      "target": "block:initial-temperature-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:operating-temperature/block:liquid-reservoir",
      "source": "term:operating-temperature",
      "target": "block:liquid-reservoir",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:pack-power-boundary",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:parallel-cooling-plate",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:phase-change-mass",
      "source": "term:operating-temperature",
      "target": "block:phase-change-mass",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:regulated-charger",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:thermal-conductor",
      "source": "term:operating-temperature",
      "target": "block:thermal-conductor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:thermal-controlled-heat-source",
      "source": "term:operating-temperature",
      "target": "block:thermal-controlled-heat-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:operating-temperature/block:thermal-controlled-temperature-source",
      "source": "term:operating-temperature",
      "target": "block:thermal-controlled-temperature-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:operating-temperature/block:thermal-convection",
      "source": "term:operating-temperature",
      "target": "block:thermal-convection",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:thermal-flow-sensor",
      "source": "term:operating-temperature",
      "target": "block:thermal-flow-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:operating-temperature/block:thermal-heat-source",
      "source": "term:operating-temperature",
      "target": "block:thermal-heat-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:operating-temperature/block:thermal-insulator",
      "source": "term:operating-temperature",
      "target": "block:thermal-insulator",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:thermal-mass",
      "source": "term:operating-temperature",
      "target": "block:thermal-mass",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:thermal-radiation",
      "source": "term:operating-temperature",
      "target": "block:thermal-radiation",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:thermal-reference",
      "source": "term:operating-temperature",
      "target": "block:thermal-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:operating-temperature/block:thermal-resistance",
      "source": "term:operating-temperature",
      "target": "block:thermal-resistance",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:thermal-temperature-sensor",
      "source": "term:operating-temperature",
      "target": "block:thermal-temperature-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:operating-temperature/block:thermal-temperature-source",
      "source": "term:operating-temperature",
      "target": "block:thermal-temperature-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:operating-temperature/block:thermal-variable-resistance",
      "source": "term:operating-temperature",
      "target": "block:thermal-variable-resistance",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:u-cooling-plate",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:v2v-converter",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:battery-charge-envelope",
      "source": "term:operating-temperature",
      "target": "block:battery-charge-envelope",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:battery-coolant-controller",
      "source": "term:operating-temperature",
      "target": "block:battery-coolant-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:operating-temperature/block:battery-discharge-envelope",
      "source": "term:operating-temperature",
      "target": "block:battery-discharge-envelope",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:battery-ecm-cell",
      "source": "term:operating-temperature",
      "target": "block:battery-ecm-cell",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:battery-heater-controller",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:battery-module",
      "source": "term:operating-temperature",
      "target": "block:battery-module",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:battery-module-assembly",
      "source": "term:operating-temperature",
      "target": "block:battery-module-assembly",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:battery-pack-assembly",
      "source": "term:operating-temperature",
      "target": "block:battery-pack-assembly",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:battery-parallel-group",
      "source": "term:operating-temperature",
      "target": "block:battery-parallel-group",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:battery-pem-stack",
      "source": "term:operating-temperature",
      "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:operating-temperature/block:battery-single-particle-cell",
      "source": "term:operating-temperature",
      "target": "block:battery-single-particle-cell",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:battery-tabulated-cell",
      "source": "term:operating-temperature",
      "target": "block:battery-tabulated-cell",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:battery-temperature-monitor",
      "source": "term:operating-temperature",
      "target": "block:battery-temperature-monitor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:battery-thermal-state-space",
      "source": "term:operating-temperature",
      "target": "block:battery-thermal-state-space",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:native-unit-conversion",
      "source": "term:operating-temperature",
      "target": "block:native-unit-conversion",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:operating-temperature/block:thermal-rate",
      "source": "term:operating-temperature",
      "target": "block:thermal-rate",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usedIn/term:operating-temperature/workflow:charge-thermal",
      "source": "term:operating-temperature",
      "target": "workflow:charge-thermal",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:operating-temperature/workflow:native-battery-current-monitor",
      "source": "term:operating-temperature",
      "target": "workflow:native-battery-current-monitor",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:operating-temperature/workflow:native-battery-temperature-monitor",
      "source": "term:operating-temperature",
      "target": "workflow:native-battery-temperature-monitor",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:operating-temperature/workflow:native-battery-voltage-monitor",
      "source": "term:operating-temperature",
      "target": "workflow:native-battery-voltage-monitor",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:operating-temperature/workflow:native-battery-charge-envelope",
      "source": "term:operating-temperature",
      "target": "workflow:native-battery-charge-envelope",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:operating-temperature/workflow:native-battery-discharge-envelope",
      "source": "term:operating-temperature",
      "target": "workflow:native-battery-discharge-envelope",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:operating-temperature/workflow:native-battery-coolant-controller",
      "source": "term:operating-temperature",
      "target": "workflow:native-battery-coolant-controller",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:operating-temperature/workflow:native-battery-heater-controller",
      "source": "term:operating-temperature",
      "target": "workflow:native-battery-heater-controller",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:belongsTo/term:operating-temperature/topic:topic-ratings",
      "source": "term:operating-temperature",
      "target": "topic:topic-ratings",
      "type": "belongsTo",
      "properties": {
        "sourceFile": "terms.json"
      }
    },
    {
      "id": "edge:relatedTo/term:operating-temperature/term:lithium-plating",
      "source": "term:operating-temperature",
      "target": "term:lithium-plating",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:operating-temperature/term:arrhenius",
      "source": "term:operating-temperature",
      "target": "term:arrhenius",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:operating-temperature/term:thermal-management",
      "source": "term:operating-temperature",
      "target": "term:thermal-management",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:operating-temperature/term:datasheet",
      "source": "term:operating-temperature",
      "target": "term:datasheet",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:explainedIn/term:operating-temperature/lesson:fundamentals/battery-aging/",
      "source": "term:operating-temperature",
      "target": "lesson:fundamentals/battery-aging/",
      "type": "explainedIn",
      "properties": {
        "sourceFile": "terms.json",
        "url": "https://lemonergy.com/learn/fundamentals/battery-aging/#temperature"
      }
    },
    {
      "id": "edge:illustratedBy/term:operating-temperature/visual:arrhenius",
      "source": "term:operating-temperature",
      "target": "visual:arrhenius",
      "type": "illustratedBy",
      "properties": {
        "sourceFile": "visual-pages.json"
      }
    }
  ],
  "neighbors": [
    {
      "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: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: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: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: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:gas-sensor",
      "type": "Block",
      "label": "Pressure / temperature sensor",
      "properties": {
        "id": "gas-sensor",
        "kind": "studio",
        "name": "Pressure / temperature sensor",
        "summary": "Reads pressure and temperature on a gas connection without adding storage or a flow restriction.",
        "behavior": "Reads pressure and temperature on a gas connection without adding storage or a flow restriction.",
        "documentationSlug": "gas-sensor",
        "referenceOnly": true,
        "ports": [
          {
            "name": "a",
            "direction": "conserving",
            "unit": "gas",
            "description": "Measured gas connection"
          },
          {
            "name": "pressure",
            "direction": "output",
            "unit": "Pa",
            "description": "Directed output available to compatible consumers: pressure."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Directed output available to compatible consumers: temperature."
          }
        ],
        "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": "gas-sensor",
        "implementationId": "gas-sensor",
        "url": "https://lemonergy.com/learn/glossary/blocks/gas-sensor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/gas-sensor/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "gas-sensor",
          "namespace": "physical",
          "slug": "gas-sensor",
          "canonicalSlug": "gas-sensor",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "gas-sensor",
            "name": "Pressure / temperature sensor",
            "domain": "gas",
            "family": "sensor",
            "operation": "Reads pressure and temperature on a gas connection without adding storage or a flow restriction.",
            "mechanism": [
              "Gas connection",
              "Pressure and temperature",
              "Measurement signals"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "gas",
                "kind": "conserving",
                "label": "Measured gas connection",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "gas-tank",
                "label": "Gas tank / storage"
              },
              {
                "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": "pressure",
                "quantity": "pressure",
                "declared": true,
                "consumers": [],
                "label": "pressure",
                "unit": "Pa"
              },
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              }
            ],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:initial-temperature-constraint",
      "type": "Block",
      "label": "Insulated branch with initial temperature target",
      "properties": {
        "id": "initial-temperature-constraint",
        "name": "Insulated branch with initial temperature target",
        "kind": "studio",
        "summary": "Zero heat transfer; initializes directly attached unspecified thermal storage temperatures and verifies the consistent initial difference",
        "behavior": "Conserving component solved simultaneously with the connected network. Zero heat transfer; initializes directly attached unspecified thermal storage temperatures and verifies the consistent initial difference",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "initialDifferenceK",
            "label": "Initial temperature difference",
            "unit": "K difference",
            "default": 0,
            "description": "Requested initial temperature at a minus temperature at b.",
            "min": -5000,
            "max": 5000
          }
        ],
        "equations": [
          "Q̇ = 0",
          "Ta(0) − Tb(0) = requested initial difference, subject to consistent storage initialization"
        ],
        "example": {
          "title": "Insulated branch with initial temperature target worked example",
          "text": "Editable first-party network. constraint: initialDifferenceK=20. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-initial-temperature-constraint",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "initialDifferenceK",
              "label": "Initial temperature difference",
              "value": 20,
              "unit": "K difference"
            }
          ],
          "checks": [
            {
              "port": "constraint/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 0,
              "unit": "W",
              "tolerance": 1e-10
            },
            {
              "port": "constraint/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "constraint/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": 20,
              "unit": "K",
              "tolerance": 1.9999999999999998e-05
            }
          ]
        },
        "limits": [
          "Zero heat transfer; initializes directly attached unspecified thermal storage temperatures and verifies the consistent initial difference",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-temperature-constraint"
        ],
        "type": "initial-temperature-constraint",
        "implementationId": "initial-temperature-constraint",
        "url": "https://lemonergy.com/learn/glossary/blocks/initial-temperature-constraint/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/initial-temperature-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-temperature-constraint"
          ]
        },
        "studioHelp": {
          "type": "initial-temperature-constraint",
          "namespace": "physical",
          "slug": "initial-temperature-constraint",
          "canonicalSlug": "initial-temperature-constraint",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "initial-temperature-constraint",
            "name": "Insulated branch with initial temperature target",
            "domain": "thermal",
            "family": "initial",
            "operation": "Passes no heat and applies an initial temperature-difference target to directly attached storage. It does not hold that difference during the run.",
            "mechanism": [
              "Initial temperature target",
              "Initial consistency",
              "Zero heat transfer"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-source",
                "label": "Temperature difference source"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 30
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M100 20V40L118 50M10 40H70M130 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "initialDifferenceK",
                "default": 0,
                "unit": "K difference",
                "min": -5000,
                "max": 5000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:liquid-reservoir",
      "type": "Block",
      "label": "Coolant pressure and temperature boundary",
      "properties": {
        "id": "liquid-reservoir",
        "name": "Coolant pressure and temperature boundary",
        "kind": "studio",
        "summary": "Fixes pressure and inflowing coolant temperature at one liquid terminal. In the plate example, inlet and outlet are two instances of this same boundary.",
        "behavior": "This ideal boundary supplies or receives coolant while holding its configured pressure and inflow temperature. A pressure difference across the cooling plate determines the flow. When flow reverses, the receiving boundary becomes the supplying boundary. Outgoing coolant carries the plate outlet temperature; the receiving boundary does not clamp that outlet temperature.",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "Pa / kg/s / K / W",
            "description": "Thermal-liquid terminal connecting this boundary to a cooling plate. The boundary fixes pressure and the temperature used when coolant flows out of the boundary. Mass and enthalpy reaction flows balance the connected plate."
          },
          {
            "name": "pressure",
            "direction": "output",
            "unit": "Pa",
            "description": "The configured absolute pressure at this boundary."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "The configured inflow temperature, not a measurement of returning coolant."
          },
          {
            "name": "massFlow",
            "direction": "output",
            "unit": "kg/s",
            "description": "Net mass flow into this boundary. Negative when it supplies the plate; positive when it receives returning coolant."
          },
          {
            "name": "enthalpyFlow",
            "direction": "output",
            "unit": "W",
            "description": "Net advected enthalpy flow into this boundary. Returning coolant uses its plate outlet temperature."
          }
        ],
        "parameters": [
          {
            "key": "pressurePa",
            "label": "Boundary pressure",
            "unit": "Pa",
            "default": 101325,
            "min": 1,
            "max": 1000000000.0,
            "description": "Absolute pressure held at this liquid node. Set a pressure difference between the two boundaries to drive coolant flow."
          },
          {
            "key": "temperatureK",
            "label": "Coolant supply temperature",
            "unit": "K",
            "default": 300,
            "min": 0,
            "max": 5000,
            "description": "Temperature of coolant supplied by this boundary. It is used as the inlet condition only when flow leaves this boundary."
          }
        ],
        "equations": [
          "pressure = pressurePa",
          "inflow temperature = temperatureK",
          "boundary massFlow + mass flow leaving the boundary = 0"
        ],
        "example": {
          "title": "Two boundaries in the U-channel plate example",
          "text": "The existing U-channel example sets inlet to 200000 Pa and outlet to 100000 Pa, both at 300 K. The plate carries 0.1 kg/s from inlet to outlet. These checks describe the boundary within the released plate network, not a separate standalone validation.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-cooling-u",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "inlet/pressure",
              "label": "Supply boundary pressure",
              "atS": 0,
              "value": 200000,
              "unit": "Pa",
              "tolerance": 1e-06
            },
            {
              "port": "inlet/temperature",
              "label": "Supply coolant temperature",
              "atS": 0,
              "value": 300,
              "unit": "K",
              "tolerance": 1e-06
            },
            {
              "port": "inlet/massFlow",
              "label": "Mass supplied by inlet boundary",
              "atS": 0,
              "value": -0.1,
              "unit": "kg/s",
              "tolerance": 1e-09
            }
          ]
        },
        "limits": [
          "Ideal fixed pressure and inflow temperature, not a finite tank, pump or radiator model. Each coolant node requires exactly one explicit boundary in the current bounded plate solver.",
          "Boundary checks reuse the existing released U-channel network; they are synthetic model checks, not measured equipment data."
        ],
        "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",
          "native-parallel-cooling-plate",
          "native-u-cooling-plate"
        ],
        "connectionGuide": {
          "kind": "boundary",
          "title": "What inlet and outlet actually mean",
          "summary": "Both are coolant boundary blocks. Their names describe the example role; their pressures determine the actual direction.",
          "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": "liquid-reservoir",
        "implementationId": "liquid-reservoir",
        "url": "https://lemonergy.com/learn/glossary/blocks/liquid-reservoir/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/liquid-reservoir/",
        "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": "liquid-reservoir",
          "namespace": "physical",
          "slug": "liquid-reservoir",
          "canonicalSlug": "liquid-reservoir",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "liquid-reservoir",
            "name": "Coolant pressure and temperature boundary",
            "domain": "thermal-liquid",
            "family": "fluid-boundary",
            "operation": "Sets an ideal coolant pressure and temperature boundary and supplies or receives mass and energy.",
            "mechanism": [
              "Pressure and temperature",
              "Coolant boundary",
              "Mass and energy reaction"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal-liquid",
                "kind": "conserving",
                "label": "Coolant pressure and temperature boundary",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "u-cooling-plate",
                "label": "U-channel plate"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M190 40H140M140 10V70M65 10H140M65 70H140M75 25H125M75 55H125"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "massFlow",
                "quantity": "mass-rate",
                "declared": true,
                "consumers": [],
                "label": "mass Flow",
                "unit": "kg/s"
              },
              {
                "id": "enthalpyFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "enthalpy Flow",
                "unit": "W"
              },
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "pressure",
                "quantity": "pressure",
                "declared": true,
                "consumers": [],
                "label": "pressure",
                "unit": "Pa"
              }
            ],
            "parameters": [
              {
                "id": "pressurePa",
                "default": 101325,
                "unit": "Pa",
                "min": 1,
                "max": 1000000000,
                "value": 101325
              },
              {
                "id": "temperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "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:phase-change-mass",
      "type": "Block",
      "label": "Phase-change thermal mass",
      "properties": {
        "id": "phase-change-mass",
        "name": "Phase-change thermal mass",
        "kind": "studio",
        "summary": "Enthalpy storage with a finite linear melting interval; constant sensible heat capacity, no supercooling or hysteresis",
        "behavior": "Conserving component solved simultaneously with the connected network. Enthalpy storage with a finite linear melting interval; constant sensible heat capacity, no supercooling or hysteresis",
        "ports": [
          {
            "name": "h",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "liquidFraction",
            "direction": "output",
            "unit": "fraction",
            "description": "Recorded liquid fraction measurement from the conserving simulation."
          },
          {
            "name": "storedEnergy",
            "direction": "output",
            "unit": "J",
            "description": "Recorded stored energy measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "massKg",
            "label": "Mass",
            "unit": "kg",
            "default": 1,
            "description": "Material mass that contributes sensible and, where enabled, latent heat storage.",
            "min": 1e-09,
            "max": 1000000000
          },
          {
            "key": "specificHeatJkgK",
            "label": "Specific heat capacity",
            "unit": "J/(kg K)",
            "default": 2000,
            "description": "Sensible heat required per unit mass and kelvin.",
            "min": 1e-06,
            "max": 1000000000
          },
          {
            "key": "latentHeatJkg",
            "label": "Latent heat",
            "unit": "J/kg",
            "default": 200000,
            "description": "Energy per unit mass stored while the liquid fraction changes from zero to one.",
            "min": 0,
            "max": 1000000000
          },
          {
            "key": "solidusK",
            "label": "Solidus temperature",
            "unit": "K",
            "default": 330,
            "description": "Temperature at which melting begins in the finite transition interval.",
            "min": 0,
            "max": 5000
          },
          {
            "key": "liquidusK",
            "label": "Liquidus temperature",
            "unit": "K",
            "default": 334,
            "description": "Temperature at which the model is fully liquid.",
            "min": 0,
            "max": 5000
          },
          {
            "key": "initialTemperatureK",
            "label": "Initial temperature",
            "unit": "K",
            "default": 300,
            "description": "Absolute initial temperature of the thermal storage.",
            "min": 0,
            "max": 5000
          }
        ],
        "equations": [
          "H = m cp T + m latentHeat × liquidFraction",
          "liquidFraction = clip((T − solidus)/(liquidus − solidus), 0, 1)",
          "dH/dt = Σ Q̇in"
        ],
        "example": {
          "title": "Phase-change thermal mass worked example",
          "text": "Editable first-party network. mass: specificHeatJkgK=2; mass: latentHeatJkg=100; mass: solidusK=310; mass: liquidusK=320; mass: initialTemperatureK=310; heater: heatFlowW=12. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-phase-change-mass",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "massKg",
              "label": "Mass",
              "value": 1,
              "unit": "kg"
            },
            {
              "port": "specificHeatJkgK",
              "label": "Specific heat capacity",
              "value": 2,
              "unit": "J/(kg K)"
            },
            {
              "port": "latentHeatJkg",
              "label": "Latent heat",
              "value": 100,
              "unit": "J/kg"
            },
            {
              "port": "solidusK",
              "label": "Solidus temperature",
              "value": 310,
              "unit": "K"
            }
          ],
          "checks": [
            {
              "port": "mass/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 311,
              "unit": "K",
              "tolerance": 0.00031100000000000273
            },
            {
              "port": "mass/liquidFraction",
              "label": "liquidFraction",
              "atS": 1,
              "value": 0.1,
              "unit": "fraction",
              "tolerance": 1.0000000000020123e-07
            },
            {
              "port": "mass/storedEnergy",
              "label": "storedEnergy",
              "atS": 1,
              "value": 12,
              "unit": "J",
              "tolerance": 1.2000000000020007e-05
            }
          ]
        },
        "limits": [
          "Enthalpy storage with a finite linear melting interval; constant sensible heat capacity, no supercooling or hysteresis",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-phase",
          "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-phase-change-mass"
        ],
        "type": "phase-change-mass",
        "implementationId": "phase-change-mass",
        "url": "https://lemonergy.com/learn/glossary/blocks/phase-change-mass/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/phase-change-mass/",
        "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-phase-change-mass"
          ]
        },
        "studioHelp": {
          "type": "phase-change-mass",
          "namespace": "physical",
          "slug": "phase-change-mass",
          "canonicalSlug": "phase-change-mass",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "phase-change-mass",
            "name": "Phase-change thermal mass",
            "domain": "thermal",
            "family": "thermal-storage",
            "operation": "Stores sensible and latent heat across a finite melting interval; temperature and liquid fraction follow its enthalpy.",
            "mechanism": [
              "Heat exchange",
              "Sensible and latent storage",
              "Temperature and liquid fraction"
            ],
            "ports": [
              {
                "id": "h",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Enthalpy-storage thermal contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-heat-source",
                "label": "Heat flow source"
              }
            ],
            "symbol": [
              {
                "tag": "rect",
                "attrs": {
                  "x": 65,
                  "y": 10,
                  "width": 70,
                  "height": 60,
                  "rx": 3
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H65M80 20V60M100 20V60M120 20V60"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              },
              {
                "id": "liquidFraction",
                "quantity": "fraction",
                "declared": true,
                "consumers": [],
                "label": "liquid Fraction",
                "unit": "fraction"
              }
            ],
            "parameters": [
              {
                "id": "massKg",
                "default": 1,
                "unit": "kg",
                "min": 1e-09,
                "max": 1000000000,
                "value": 1
              },
              {
                "id": "specificHeatJkgK",
                "default": 2000,
                "unit": "J/(kg K)",
                "min": 1e-06,
                "max": 1000000000,
                "value": 2000
              },
              {
                "id": "latentHeatJkg",
                "default": 200000,
                "unit": "J/kg",
                "min": 0,
                "max": 1000000000,
                "value": 200000
              },
              {
                "id": "solidusK",
                "default": 330,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 330
              },
              {
                "id": "liquidusK",
                "default": 334,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 334
              },
              {
                "id": "initialTemperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "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:thermal-conductor",
      "type": "Block",
      "label": "Thermal conductor",
      "properties": {
        "id": "thermal-conductor",
        "name": "Thermal conductor",
        "kind": "studio",
        "summary": "One-dimensional lumped Fourier conductance",
        "behavior": "Conserving component solved simultaneously with the connected network. One-dimensional lumped Fourier conductance",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "conductivityWmK",
            "label": "Thermal conductivity",
            "unit": "W/(m K)",
            "default": 200,
            "description": "Material conductivity used by the one-dimensional conduction law.",
            "min": 0,
            "max": 1000000
          },
          {
            "key": "areaM2",
            "label": "Exchange area",
            "unit": "m2",
            "default": 0.001,
            "description": "Area used by the declared heat-transfer or parallel-plate field equation.",
            "min": 1e-12,
            "max": 1000000
          },
          {
            "key": "lengthM",
            "label": "Conduction length",
            "unit": "m",
            "default": 0.01,
            "description": "Distance through the conducting material.",
            "min": 1e-12,
            "max": 1000000
          }
        ],
        "equations": [
          "Q̇a→b = k A (Ta − Tb)/length"
        ],
        "example": {
          "title": "Thermal conductor worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-conductor",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "conductivityWmK",
              "label": "Thermal conductivity",
              "value": 200,
              "unit": "W/(m K)"
            },
            {
              "port": "areaM2",
              "label": "Exchange area",
              "value": 0.001,
              "unit": "m2"
            },
            {
              "port": "lengthM",
              "label": "Conduction length",
              "value": 0.01,
              "unit": "m"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 400,
              "unit": "W",
              "tolerance": 0.00039999999999999996
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": 20,
              "unit": "K",
              "tolerance": 1.9999999999999998e-05
            }
          ]
        },
        "limits": [
          "One-dimensional lumped Fourier conductance",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-conductor"
        ],
        "type": "thermal-conductor",
        "implementationId": "thermal-conductor",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-conductor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-conductor/",
        "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-thermal-conductor"
          ]
        },
        "studioHelp": {
          "type": "thermal-conductor",
          "namespace": "physical",
          "slug": "thermal-conductor",
          "canonicalSlug": "thermal-conductor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-conductor",
            "name": "Thermal conductor",
            "domain": "thermal",
            "family": "thermal-transfer",
            "operation": "Transfers heat by a lumped conductance set by conductivity, area and length.",
            "mechanism": [
              "Temperature difference",
              "Material conductance",
              "Heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "conductivityWmK",
                "default": 200,
                "unit": "W/(m K)",
                "min": 0,
                "max": 1000000,
                "value": 200
              },
              {
                "id": "areaM2",
                "default": 0.001,
                "unit": "m2",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.001
              },
              {
                "id": "lengthM",
                "default": 0.01,
                "unit": "m",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.01
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-controlled-heat-source",
      "type": "Block",
      "label": "Controlled heat flow source",
      "properties": {
        "id": "thermal-controlled-heat-source",
        "name": "Controlled heat flow source",
        "kind": "studio",
        "summary": "Ideal commanded heat transfer from a to b",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal commanded heat transfer from a to b",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "heatFlowW",
            "label": "Heat flow",
            "unit": "W",
            "default": 100,
            "description": "Heat transferred from terminal a to terminal b.",
            "min": -1000000000000,
            "max": 1000000000000
          }
        ],
        "equations": [
          "Q̇a→b = commanded heat flow"
        ],
        "example": {
          "title": "Controlled heat flow source worked example",
          "text": "Editable first-party network. heater: heatFlowW=100; command: before=100; command: after=200; command: atS=0.5. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-controlled-heat-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "heatFlowW",
              "label": "Heat flow",
              "value": 100,
              "unit": "W"
            }
          ],
          "checks": [
            {
              "port": "heater/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 200,
              "unit": "W",
              "tolerance": 0.00019999999999999998
            },
            {
              "port": "heater/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 0,
              "unit": "K",
              "tolerance": 1e-10
            },
            {
              "port": "heater/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": -300.15,
              "unit": "K",
              "tolerance": 0.0003001500000000037
            }
          ]
        },
        "limits": [
          "Ideal commanded heat transfer from a to b",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-controlled-heat-source"
        ],
        "type": "thermal-controlled-heat-source",
        "implementationId": "thermal-controlled-heat-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-controlled-heat-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-controlled-heat-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-thermal-controlled-heat-source"
          ]
        },
        "studioHelp": {
          "type": "thermal-controlled-heat-source",
          "namespace": "physical",
          "slug": "thermal-controlled-heat-source",
          "canonicalSlug": "thermal-controlled-heat-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-controlled-heat-source",
            "name": "Controlled heat flow source",
            "domain": "thermal",
            "family": "heat-source",
            "operation": "Transfers the configured or commanded heat flow from a to b; negative values reverse that transfer.",
            "mechanism": [
              "Heat-flow setting",
              "Energy transfer a → b"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-reference",
                "label": "Thermal reference"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 30
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H70M130 40H190M85 55C70 40 105 40 90 20M110 55C95 40 130 40 115 20"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Heat-flow setting",
                "quantity": "heat",
                "unit": "W",
                "active": true,
                "summary": "Heat-flow setting is a directed heat input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "heatFlowW",
                "default": 100,
                "unit": "W",
                "min": -1000000000000,
                "max": 1000000000000,
                "value": 100
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-controlled-temperature-source",
      "type": "Block",
      "label": "Controlled temperature difference source",
      "properties": {
        "id": "thermal-controlled-temperature-source",
        "name": "Controlled temperature difference source",
        "kind": "studio",
        "summary": "Ideal commanded Tb-Ta with solved reaction heat flow",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal commanded Tb-Ta with solved reaction heat flow",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "branchHeatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded branchHeatFlow measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "differenceK",
            "label": "Temperature difference",
            "unit": "K difference",
            "default": 300,
            "description": "Temperature at terminal b minus temperature at terminal a.",
            "min": -5000,
            "max": 5000
          }
        ],
        "equations": [
          "Tb − Ta = commanded temperature difference"
        ],
        "example": {
          "title": "Controlled temperature difference source worked example",
          "text": "Editable first-party network. target: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-controlled-temperature-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "differenceK",
              "label": "Temperature difference",
              "value": 320,
              "unit": "K difference"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 0,
              "unit": "K",
              "tolerance": 1e-10
            },
            {
              "port": "target/branchHeatFlow",
              "label": "branchHeatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            }
          ]
        },
        "limits": [
          "Ideal commanded Tb-Ta with solved reaction heat flow",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-controlled-temperature-source"
        ],
        "type": "thermal-controlled-temperature-source",
        "implementationId": "thermal-controlled-temperature-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-controlled-temperature-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-controlled-temperature-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-thermal-controlled-temperature-source"
          ]
        },
        "studioHelp": {
          "type": "thermal-controlled-temperature-source",
          "namespace": "physical",
          "slug": "thermal-controlled-temperature-source",
          "canonicalSlug": "thermal-controlled-temperature-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-controlled-temperature-source",
            "name": "Controlled temperature difference source",
            "domain": "thermal",
            "family": "temperature-source",
            "operation": "Imposes temperature at b minus temperature at a; the network solves the reaction heat flow needed to enforce it.",
            "mechanism": [
              "Temperature difference",
              "Imposed Tb − Ta",
              "Solved heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-reference",
                "label": "Thermal reference"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 53,
                  "r": 12
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M93 43V14A7 7 0 0 1 107 14V43M100 48V19M10 40H65M135 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "command",
                "label": "Temperature difference",
                "quantity": "temperature-difference",
                "unit": "K difference",
                "active": true,
                "summary": "Temperature difference is a directed temperature-difference input to this component, expressed in K difference. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "differenceK",
                "default": 300,
                "unit": "K difference",
                "min": -5000,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-convection",
      "type": "Block",
      "label": "Thermal convection",
      "properties": {
        "id": "thermal-convection",
        "name": "Thermal convection",
        "kind": "studio",
        "summary": "Prescribed lumped film coefficient; no resolved fluid dynamics",
        "behavior": "Conserving component solved simultaneously with the connected network. Prescribed lumped film coefficient; no resolved fluid dynamics",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "coefficientWm2K",
            "label": "Convection coefficient",
            "unit": "W/(m2 K)",
            "default": 10,
            "description": "Prescribed heat-transfer coefficient multiplying area and temperature difference.",
            "min": 0,
            "max": 1000000000
          },
          {
            "key": "areaM2",
            "label": "Exchange area",
            "unit": "m2",
            "default": 0.2,
            "description": "Area used by the declared heat-transfer or parallel-plate field equation.",
            "min": 1e-12,
            "max": 1000000
          }
        ],
        "equations": [
          "Q̇a→b = h A (Ta − Tb)"
        ],
        "example": {
          "title": "Thermal convection worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-convection",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "coefficientWm2K",
              "label": "Convection coefficient",
              "value": 10,
              "unit": "W/(m2 K)"
            },
            {
              "port": "areaM2",
              "label": "Exchange area",
              "value": 0.2,
              "unit": "m2"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 40,
              "unit": "W",
              "tolerance": 3.9999999999999996e-05
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": 20,
              "unit": "K",
              "tolerance": 1.9999999999999998e-05
            }
          ]
        },
        "limits": [
          "Prescribed lumped film coefficient; no resolved fluid dynamics",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-convection"
        ],
        "type": "thermal-convection",
        "implementationId": "thermal-convection",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-convection/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-convection/",
        "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-thermal-convection"
          ]
        },
        "studioHelp": {
          "type": "thermal-convection",
          "namespace": "physical",
          "slug": "thermal-convection",
          "canonicalSlug": "thermal-convection",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-convection",
            "name": "Thermal convection",
            "domain": "thermal",
            "family": "thermal-transfer",
            "operation": "Transfers heat using a prescribed film coefficient and area; it does not solve the surrounding fluid.",
            "mechanism": [
              "Temperature difference",
              "Film coefficient × area",
              "Heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "coefficientWm2K",
                "default": 10,
                "unit": "W/(m2 K)",
                "min": 0,
                "max": 1000000000,
                "value": 10
              },
              {
                "id": "areaM2",
                "default": 0.2,
                "unit": "m2",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.2
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-flow-sensor",
      "type": "Block",
      "label": "Heat flow sensor",
      "properties": {
        "id": "thermal-flow-sensor",
        "name": "Heat flow sensor",
        "kind": "studio",
        "summary": "Ideal inline sensor with zero temperature drop; positive flow a to b",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal inline sensor with zero temperature drop; positive flow a to b",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "branchHeatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded branchHeatFlow measurement from the conserving simulation."
          }
        ],
        "parameters": [],
        "equations": [
          "Ta = Tb",
          "Q̇a→b is solved by the connected heat balance"
        ],
        "example": {
          "title": "Heat flow sensor worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-flow-sensor",
          "label": "Open Studio example",
          "inputs": [],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/branchHeatFlow",
              "label": "branchHeatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            }
          ]
        },
        "limits": [
          "Ideal inline sensor with zero temperature drop; positive flow a to b",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-flow-sensor"
        ],
        "type": "thermal-flow-sensor",
        "implementationId": "thermal-flow-sensor",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-flow-sensor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-flow-sensor/",
        "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-thermal-flow-sensor"
          ]
        },
        "studioHelp": {
          "type": "thermal-flow-sensor",
          "namespace": "physical",
          "slug": "thermal-flow-sensor",
          "canonicalSlug": "thermal-flow-sensor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-flow-sensor",
            "name": "Heat flow sensor",
            "domain": "thermal",
            "family": "sensor",
            "operation": "Measures series heat flow with zero temperature difference across its terminals. Positive measured flow is a to b.",
            "mechanism": [
              "Series thermal branch",
              "Zero temperature drop",
              "Heat-flow signal"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              },
              {
                "type": "thermal-conductor",
                "label": "Thermal conductor"
              }
            ],
            "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": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:thermal-heat-source",
      "type": "Block",
      "label": "Heat flow source",
      "properties": {
        "id": "thermal-heat-source",
        "name": "Heat flow source",
        "kind": "studio",
        "summary": "Ideal configured heat transfer from a to b",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal configured heat transfer from a to b",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "heatFlowW",
            "label": "Heat flow",
            "unit": "W",
            "default": 100,
            "description": "Heat transferred from terminal a to terminal b.",
            "min": -1000000000000,
            "max": 1000000000000
          }
        ],
        "equations": [
          "Q̇a→b = configured heat flow"
        ],
        "example": {
          "title": "Heat flow source worked example",
          "text": "Editable first-party network. heater: heatFlowW=100. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-heat-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "heatFlowW",
              "label": "Heat flow",
              "value": 100,
              "unit": "W"
            }
          ],
          "checks": [
            {
              "port": "heater/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 100,
              "unit": "W",
              "tolerance": 9.999999999999999e-05
            },
            {
              "port": "heater/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 0,
              "unit": "K",
              "tolerance": 1e-10
            },
            {
              "port": "heater/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": -300.1,
              "unit": "K",
              "tolerance": 0.0003001000000000015
            }
          ]
        },
        "limits": [
          "Ideal configured heat transfer from a to b",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-heat-source"
        ],
        "type": "thermal-heat-source",
        "implementationId": "thermal-heat-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-heat-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-heat-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-thermal-heat-source"
          ]
        },
        "studioHelp": {
          "type": "thermal-heat-source",
          "namespace": "physical",
          "slug": "thermal-heat-source",
          "canonicalSlug": "thermal-heat-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-heat-source",
            "name": "Heat flow source",
            "domain": "thermal",
            "family": "heat-source",
            "operation": "Transfers the configured or commanded heat flow from a to b; negative values reverse that transfer.",
            "mechanism": [
              "Heat-flow setting",
              "Energy transfer a → b"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-reference",
                "label": "Thermal reference"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 40,
                  "r": 30
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H70M130 40H190M85 55C70 40 105 40 90 20M110 55C95 40 130 40 115 20"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "heatFlowW",
                "default": 100,
                "unit": "W",
                "min": -1000000000000,
                "max": 1000000000000,
                "value": 100
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-insulator",
      "type": "Block",
      "label": "Insulated thermal port",
      "properties": {
        "id": "thermal-insulator",
        "name": "Insulated thermal port",
        "kind": "studio",
        "summary": "Zero heat-flow termination with unconstrained temperature",
        "behavior": "Conserving component solved simultaneously with the connected network. Zero heat-flow termination with unconstrained temperature",
        "ports": [
          {
            "name": "h",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          }
        ],
        "parameters": [],
        "equations": [
          "Q̇ = 0"
        ],
        "example": {
          "title": "Insulated thermal port worked example",
          "text": "Editable first-party network. heater: heatFlowW=100. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-insulator",
          "label": "Open Studio example",
          "inputs": [],
          "checks": [
            {
              "port": "insulator/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 0,
              "unit": "W",
              "tolerance": 1e-10
            },
            {
              "port": "insulator/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 300.1,
              "unit": "K",
              "tolerance": 0.0003001000000000015
            }
          ]
        },
        "limits": [
          "Zero heat-flow termination with unconstrained temperature",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-insulator"
        ],
        "type": "thermal-insulator",
        "implementationId": "thermal-insulator",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-insulator/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-insulator/",
        "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-thermal-insulator"
          ]
        },
        "studioHelp": {
          "type": "thermal-insulator",
          "namespace": "physical",
          "slug": "thermal-insulator",
          "canonicalSlug": "thermal-insulator",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-insulator",
            "name": "Insulated thermal port",
            "domain": "thermal",
            "family": "open",
            "operation": "Terminates a thermal pin with zero heat flow without fixing its temperature.",
            "mechanism": [
              "Thermal contact",
              "No heat transfer"
            ],
            "ports": [
              {
                "id": "h",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Insulated thermal contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-reference",
                "label": "Thermal reference"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H80M120 40H190"
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 85,
                  "cy": 40,
                  "r": 5
                }
              },
              {
                "tag": "circle",
                "attrs": {
                  "cx": 115,
                  "cy": 40,
                  "r": 5
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:thermal-mass",
      "type": "Block",
      "label": "Thermal mass",
      "properties": {
        "id": "thermal-mass",
        "name": "Thermal mass",
        "kind": "studio",
        "summary": "Constant heat capacity with conserved sensible energy",
        "behavior": "Conserving component solved simultaneously with the connected network. Constant heat capacity with conserved sensible energy",
        "ports": [
          {
            "name": "h",
            "direction": "terminal",
            "unit": "K; W",
            "description": "Thermal conserving terminal. It shares the connected node temperature and exchanges heat in watts. Incoming heat raises the body temperature according to mass × specific heat; outgoing heat lowers it. The thermal mass does not generate heat by itself."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "storedEnergy",
            "direction": "output",
            "unit": "J",
            "description": "Recorded stored energy measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "massKg",
            "label": "Mass",
            "unit": "kg",
            "default": 1,
            "description": "Material mass that contributes sensible and, where enabled, latent heat storage.",
            "min": 1e-09,
            "max": 1000000000
          },
          {
            "key": "specificHeatJkgK",
            "label": "Specific heat capacity",
            "unit": "J/(kg K)",
            "default": 1000,
            "description": "Sensible heat required per unit mass and kelvin.",
            "min": 1e-06,
            "max": 1000000000
          },
          {
            "key": "initialTemperatureK",
            "label": "Initial temperature",
            "unit": "K",
            "default": 300,
            "description": "Absolute initial temperature of the thermal storage.",
            "min": 0,
            "max": 5000
          }
        ],
        "equations": [
          "m cp dT/dt = Σ Q̇in"
        ],
        "example": {
          "title": "Thermal mass worked example",
          "text": "Editable first-party network. heater: heatFlowW=100. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-mass",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "massKg",
              "label": "Mass",
              "value": 1,
              "unit": "kg"
            },
            {
              "port": "specificHeatJkgK",
              "label": "Specific heat capacity",
              "value": 1000,
              "unit": "J/(kg K)"
            },
            {
              "port": "initialTemperatureK",
              "label": "Initial temperature",
              "value": 300,
              "unit": "K"
            }
          ],
          "checks": [
            {
              "port": "mass/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 300.1,
              "unit": "K",
              "tolerance": 0.0003001000000000015
            },
            {
              "port": "mass/storedEnergy",
              "label": "storedEnergy",
              "atS": 1,
              "value": 100,
              "unit": "J",
              "tolerance": 0.00010000000000159174
            }
          ]
        },
        "limits": [
          "Constant heat capacity with conserved sensible energy",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-mass",
          "native-edge-cooling-plate",
          "native-parallel-cooling-plate",
          "native-u-cooling-plate"
        ],
        "connectionGuide": {
          "kind": "thermal-mass",
          "title": "A load is a body with stored heat",
          "summary": "In the plate example, load1 to load4 are passive thermal masses. Their temperatures change as heat crosses their h terminals.",
          "concepts": [
            {
              "id": "thermal-mass",
              "label": "Thermal mass"
            },
            {
              "id": "heat-transfer-modes",
              "label": "Heat transfer"
            },
            {
              "id": "thermal-model",
              "label": "Thermal model"
            },
            {
              "id": "specific-heat-capacity",
              "label": "Specific heat capacity"
            }
          ]
        },
        "type": "thermal-mass",
        "implementationId": "thermal-mass",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-mass/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-mass/",
        "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-thermal-mass"
          ]
        },
        "studioHelp": {
          "type": "thermal-mass",
          "namespace": "physical",
          "slug": "thermal-mass",
          "canonicalSlug": "thermal-mass",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-mass",
            "name": "Thermal mass",
            "domain": "thermal",
            "family": "thermal-storage",
            "operation": "Stores sensible heat; net heat input changes temperature according to mass times specific heat.",
            "mechanism": [
              "Net heat flow",
              "Heat capacity",
              "Temperature"
            ],
            "ports": [
              {
                "id": "h",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Stored-heat body contact",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-heat-source",
                "label": "Heat flow source"
              },
              {
                "type": "thermal-conductor",
                "label": "Thermal conductor"
              }
            ],
            "symbol": [
              {
                "tag": "rect",
                "attrs": {
                  "x": 65,
                  "y": 10,
                  "width": 70,
                  "height": 60,
                  "rx": 3
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H65M80 20V60M100 20V60M120 20V60"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              }
            ],
            "parameters": [
              {
                "id": "massKg",
                "default": 1,
                "unit": "kg",
                "min": 1e-09,
                "max": 1000000000,
                "value": 1
              },
              {
                "id": "specificHeatJkgK",
                "default": 1000,
                "unit": "J/(kg K)",
                "min": 1e-06,
                "max": 1000000000,
                "value": 1000
              },
              {
                "id": "initialTemperatureK",
                "default": 300,
                "unit": "K",
                "min": 0,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-radiation",
      "type": "Block",
      "label": "Thermal radiation",
      "properties": {
        "id": "thermal-radiation",
        "name": "Thermal radiation",
        "kind": "studio",
        "summary": "Effective two-body Stefan-Boltzmann exchange at absolute temperatures",
        "behavior": "Conserving component solved simultaneously with the connected network. Effective two-body Stefan-Boltzmann exchange at absolute temperatures",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "emissivity",
            "label": "Effective emissivity",
            "unit": "fraction",
            "default": 0.8,
            "description": "Effective surface emissivity used in radiative heat exchange.",
            "min": 0,
            "max": 1
          },
          {
            "key": "viewFactor",
            "label": "Effective view factor",
            "unit": "fraction",
            "default": 1,
            "description": "Fraction of radiative exchange represented between the two modeled surfaces.",
            "min": 0,
            "max": 1
          },
          {
            "key": "areaM2",
            "label": "Exchange area",
            "unit": "m2",
            "default": 0.02,
            "description": "Area used by the declared heat-transfer or parallel-plate field equation.",
            "min": 1e-12,
            "max": 1000000
          }
        ],
        "equations": [
          "Q̇a→b = ε F σ A (Ta⁴ − Tb⁴)"
        ],
        "example": {
          "title": "Thermal radiation worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-radiation",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "emissivity",
              "label": "Effective emissivity",
              "value": 0.8,
              "unit": "fraction"
            },
            {
              "port": "viewFactor",
              "label": "Effective view factor",
              "value": 1,
              "unit": "fraction"
            },
            {
              "port": "areaM2",
              "label": "Exchange area",
              "value": 0.02,
              "unit": "m2"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 2.1645044,
              "unit": "W",
              "tolerance": 2.1645043958220922e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": 20,
              "unit": "K",
              "tolerance": 1.9999999999999998e-05
            }
          ]
        },
        "limits": [
          "Effective two-body Stefan-Boltzmann exchange at absolute temperatures",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-radiation"
        ],
        "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-thermal-radiation"
        ],
        "type": "thermal-radiation",
        "implementationId": "thermal-radiation",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-radiation/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-radiation/",
        "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-thermal-radiation"
          ]
        },
        "studioHelp": {
          "type": "thermal-radiation",
          "namespace": "physical",
          "slug": "thermal-radiation",
          "canonicalSlug": "thermal-radiation",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-radiation",
            "name": "Thermal radiation",
            "domain": "thermal",
            "family": "thermal-transfer",
            "operation": "Exchanges heat according to absolute temperatures to the fourth power, emissivity, area and view factor.",
            "mechanism": [
              "Absolute temperatures",
              "Radiative exchange",
              "Heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "emissivity",
                "default": 0.8,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 0.8
              },
              {
                "id": "viewFactor",
                "default": 1,
                "unit": "fraction",
                "min": 0,
                "max": 1,
                "value": 1
              },
              {
                "id": "areaM2",
                "default": 0.02,
                "unit": "m2",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.02
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-reference",
      "type": "Block",
      "label": "Thermal reference",
      "properties": {
        "id": "thermal-reference",
        "name": "Thermal reference",
        "kind": "studio",
        "summary": "Absolute-zero temperature datum; not an ambient-temperature boundary",
        "behavior": "Conserving component solved simultaneously with the connected network. Absolute-zero temperature datum; not an ambient-temperature boundary",
        "ports": [
          {
            "name": "h",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "reactionHeat",
            "direction": "output",
            "unit": "W",
            "description": "Recorded reactionHeat measurement from the conserving simulation."
          }
        ],
        "parameters": [],
        "equations": [
          "T = 0 K"
        ],
        "example": {
          "title": "Thermal reference worked example",
          "text": "Editable first-party network. heater: heatFlowW=100. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-reference",
          "label": "Open Studio example",
          "inputs": [],
          "checks": [
            {
              "port": "reference/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 0,
              "unit": "K",
              "tolerance": 1e-10
            },
            {
              "port": "reference/reactionHeat",
              "label": "reactionHeat",
              "atS": 1,
              "value": 100,
              "unit": "W",
              "tolerance": 9.999999999999999e-05
            }
          ]
        },
        "limits": [
          "Absolute-zero temperature datum; not an ambient-temperature boundary",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-reference"
        ],
        "type": "thermal-reference",
        "implementationId": "thermal-reference",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-reference/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-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-thermal-reference"
          ]
        },
        "studioHelp": {
          "type": "thermal-reference",
          "namespace": "physical",
          "slug": "thermal-reference",
          "canonicalSlug": "thermal-reference",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-reference",
            "name": "Thermal reference",
            "domain": "thermal",
            "family": "reference",
            "operation": "Provides an absolute-zero temperature datum; an ambient boundary requires a temperature source.",
            "mechanism": [
              "Absolute temperature datum",
              "T = 0 K"
            ],
            "ports": [
              {
                "id": "h",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Absolute-zero thermal reference",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-temperature-source",
                "label": "Temperature difference source"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M100 5V35M65 35H135M75 47H125M88 59H112"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "reactionHeat",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "reaction Heat",
                "unit": "W"
              }
            ],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:thermal-resistance",
      "type": "Block",
      "label": "Thermal resistance",
      "properties": {
        "id": "thermal-resistance",
        "name": "Thermal resistance",
        "kind": "studio",
        "summary": "Finite linear two-port thermal resistance",
        "behavior": "Conserving component solved simultaneously with the connected network. Finite linear two-port thermal resistance",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "resistanceKW",
            "label": "Thermal resistance",
            "unit": "K/W",
            "default": 2,
            "description": "Temperature difference required per unit heat flow.",
            "min": 1e-09,
            "max": 1000000000000
          }
        ],
        "equations": [
          "Q̇a→b = (Ta − Tb)/Rthermal"
        ],
        "example": {
          "title": "Thermal resistance worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-resistance",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "resistanceKW",
              "label": "Thermal resistance",
              "value": 2,
              "unit": "K/W"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": 20,
              "unit": "K",
              "tolerance": 1.9999999999999998e-05
            }
          ]
        },
        "limits": [
          "Finite linear two-port thermal resistance",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-resistance"
        ],
        "type": "thermal-resistance",
        "implementationId": "thermal-resistance",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-resistance/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-resistance/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-resistance"
          ]
        },
        "studioHelp": {
          "type": "thermal-resistance",
          "namespace": "physical",
          "slug": "thermal-resistance",
          "canonicalSlug": "thermal-resistance",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-resistance",
            "name": "Thermal resistance",
            "domain": "thermal",
            "family": "thermal-transfer",
            "operation": "Transfers heat in proportion to temperature difference divided by thermal resistance.",
            "mechanism": [
              "Temperature difference",
              "Thermal resistance",
              "Heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "resistanceKW",
                "default": 2,
                "unit": "K/W",
                "min": 1e-09,
                "max": 1000000000000,
                "value": 2
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-temperature-sensor",
      "type": "Block",
      "label": "Temperature sensor",
      "properties": {
        "id": "thermal-temperature-sensor",
        "name": "Temperature sensor",
        "kind": "studio",
        "summary": "Nonloading absolute temperature at a and temperature difference a minus b",
        "behavior": "Conserving component solved simultaneously with the connected network. Nonloading absolute temperature at a and temperature difference a minus b",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "temperatureDifference",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperatureDifference measurement from the conserving simulation."
          }
        ],
        "parameters": [],
        "equations": [
          "Tmeasured = Ta",
          "ΔTmeasured = Ta − Tb",
          "Q̇ = 0"
        ],
        "example": {
          "title": "Temperature sensor worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-temperature-sensor",
          "label": "Open Studio example",
          "inputs": [],
          "checks": [
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/temperatureDifference",
              "label": "temperatureDifference",
              "atS": 1,
              "value": 20,
              "unit": "K",
              "tolerance": 1.9999999999999998e-05
            }
          ]
        },
        "limits": [
          "Nonloading absolute temperature at a and temperature difference a minus b",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-temperature-sensor"
        ],
        "type": "thermal-temperature-sensor",
        "implementationId": "thermal-temperature-sensor",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-temperature-sensor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-temperature-sensor/",
        "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-thermal-temperature-sensor"
          ]
        },
        "studioHelp": {
          "type": "thermal-temperature-sensor",
          "namespace": "physical",
          "slug": "thermal-temperature-sensor",
          "canonicalSlug": "thermal-temperature-sensor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-temperature-sensor",
            "name": "Temperature sensor",
            "domain": "thermal",
            "family": "sensor",
            "operation": "Measures temperature at a and the difference a minus b without transferring heat.",
            "mechanism": [
              "Two temperatures",
              "Nonloading measurement",
              "Temperature signals"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-flow-sensor",
                "label": "Heat flow sensor"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "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": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              }
            ],
            "parameters": []
          }
        }
      }
    },
    {
      "id": "block:thermal-temperature-source",
      "type": "Block",
      "label": "Temperature difference source",
      "properties": {
        "id": "thermal-temperature-source",
        "name": "Temperature difference source",
        "kind": "studio",
        "summary": "Ideal constraint Tb-Ta; reaction heat flow is solved, not prescribed",
        "behavior": "Conserving component solved simultaneously with the connected network. Ideal constraint Tb-Ta; reaction heat flow is solved, not prescribed",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "branchHeatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded branchHeatFlow measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "differenceK",
            "label": "Temperature difference",
            "unit": "K difference",
            "default": 300,
            "description": "Temperature at terminal b minus temperature at terminal a.",
            "min": -5000,
            "max": 5000
          }
        ],
        "equations": [
          "Tb − Ta = configured temperature difference"
        ],
        "example": {
          "title": "Temperature difference source worked example",
          "text": "Editable first-party network. target: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-temperature-source",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "differenceK",
              "label": "Temperature difference",
              "value": 320,
              "unit": "K difference"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 0,
              "unit": "K",
              "tolerance": 1e-10
            },
            {
              "port": "target/branchHeatFlow",
              "label": "branchHeatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            }
          ]
        },
        "limits": [
          "Ideal constraint Tb-Ta; reaction heat flow is solved, not prescribed",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-temperature-source"
        ],
        "type": "thermal-temperature-source",
        "implementationId": "thermal-temperature-source",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-temperature-source/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-temperature-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-thermal-temperature-source"
          ]
        },
        "studioHelp": {
          "type": "thermal-temperature-source",
          "namespace": "physical",
          "slug": "thermal-temperature-source",
          "canonicalSlug": "thermal-temperature-source",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-temperature-source",
            "name": "Temperature difference source",
            "domain": "thermal",
            "family": "temperature-source",
            "operation": "Imposes temperature at b minus temperature at a; the network solves the reaction heat flow needed to enforce it.",
            "mechanism": [
              "Temperature difference",
              "Imposed Tb − Ta",
              "Solved heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-reference",
                "label": "Thermal reference"
              },
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              }
            ],
            "symbol": [
              {
                "tag": "circle",
                "attrs": {
                  "cx": 100,
                  "cy": 53,
                  "r": 12
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M93 43V14A7 7 0 0 1 107 14V43M100 48V19M10 40H65M135 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              }
            ],
            "parameters": [
              {
                "id": "differenceK",
                "default": 300,
                "unit": "K difference",
                "min": -5000,
                "max": 5000,
                "value": 300
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:thermal-variable-resistance",
      "type": "Block",
      "label": "Controlled thermal resistance",
      "properties": {
        "id": "thermal-variable-resistance",
        "name": "Controlled thermal resistance",
        "kind": "studio",
        "summary": "Live thermal resistance with declared positive floor and limited-command diagnostic",
        "behavior": "Conserving component solved simultaneously with the connected network. Live thermal resistance with declared positive floor and limited-command diagnostic",
        "ports": [
          {
            "name": "a",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "K; W",
            "description": "thermal conserving connection; absolute temperature with balanced heat flow."
          },
          {
            "name": "heatFlow",
            "direction": "output",
            "unit": "W",
            "description": "Recorded heat flow measurement from the conserving simulation."
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Recorded temperature measurement from the conserving simulation."
          },
          {
            "name": "limited",
            "direction": "output",
            "unit": "fraction",
            "description": "Recorded limited measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "resistanceKW",
            "label": "Thermal resistance",
            "unit": "K/W",
            "default": 2,
            "description": "Temperature difference required per unit heat flow.",
            "min": 1e-09,
            "max": 1000000000000
          },
          {
            "key": "minimumResistanceKW",
            "label": "Minimum thermal resistance",
            "unit": "K/W",
            "default": 1e-06,
            "description": "Positive floor applied to the commanded thermal resistance.",
            "min": 1e-12,
            "max": 1000000000
          }
        ],
        "equations": [
          "R = max(Rcommand, Rmin)",
          "Q̇a→b = (Ta − Tb)/R"
        ],
        "example": {
          "title": "Controlled thermal resistance worked example",
          "text": "Editable first-party network. hot-boundary: differenceK=320; cold-boundary: differenceK=300. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-thermal-variable-resistance",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "resistanceKW",
              "label": "Thermal resistance",
              "value": 2,
              "unit": "K/W"
            },
            {
              "port": "minimumResistanceKW",
              "label": "Minimum thermal resistance",
              "value": 1e-06,
              "unit": "K/W"
            }
          ],
          "checks": [
            {
              "port": "target/heatFlow",
              "label": "heatFlow",
              "atS": 1,
              "value": 10,
              "unit": "W",
              "tolerance": 9.999999999999999e-06
            },
            {
              "port": "target/temperature",
              "label": "temperature",
              "atS": 1,
              "value": 320,
              "unit": "K",
              "tolerance": 0.00031999999999999997
            },
            {
              "port": "target/limited",
              "label": "limited",
              "atS": 1,
              "value": 0,
              "unit": "fraction",
              "tolerance": 1e-10
            }
          ]
        },
        "limits": [
          "Live thermal resistance with declared positive floor and limited-command diagnostic",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "openstax-heat",
          "physical-enthalpy"
        ],
        "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-thermal-variable-resistance"
        ],
        "type": "thermal-variable-resistance",
        "implementationId": "thermal-variable-resistance",
        "url": "https://lemonergy.com/learn/glossary/blocks/thermal-variable-resistance/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/thermal-variable-resistance/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-thermal-variable-resistance"
          ]
        },
        "studioHelp": {
          "type": "thermal-variable-resistance",
          "namespace": "physical",
          "slug": "thermal-variable-resistance",
          "canonicalSlug": "thermal-variable-resistance",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "thermal-variable-resistance",
            "name": "Controlled thermal resistance",
            "domain": "thermal",
            "family": "thermal-transfer",
            "operation": "Transfers heat through a commanded thermal resistance with a positive lower bound.",
            "mechanism": [
              "Resistance command",
              "Temperature difference",
              "Heat flow"
            ],
            "ports": [
              {
                "id": "a",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "thermal",
                "kind": "conserving",
                "label": "Thermal side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "thermal-mass",
                "label": "Thermal mass"
              },
              {
                "type": "thermal-temperature-sensor",
                "label": "Temperature sensor"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 25H75L90 15L105 35L120 25H190M10 55H75L90 45L105 65L120 55H190"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "resistance",
                "label": "Resistance command",
                "quantity": "thermal-resistance",
                "unit": "K/W",
                "active": true,
                "summary": "Resistance command is a directed thermal-resistance input to this component, expressed in K/W. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "temperature",
                "quantity": "temperature",
                "declared": true,
                "consumers": [],
                "label": "temperature",
                "unit": "K"
              },
              {
                "id": "temperatureDifference",
                "quantity": "temperature-difference",
                "declared": true,
                "consumers": [],
                "label": "temperature Difference",
                "unit": "K difference"
              },
              {
                "id": "heatFlow",
                "quantity": "heat",
                "declared": true,
                "consumers": [],
                "label": "heat Flow",
                "unit": "W"
              },
              {
                "id": "resistance",
                "quantity": "thermal-resistance",
                "declared": true,
                "consumers": [],
                "label": "resistance",
                "unit": "K/W"
              },
              {
                "id": "limited",
                "quantity": "fraction",
                "declared": true,
                "consumers": [],
                "label": "limited",
                "unit": "fraction"
              }
            ],
            "parameters": [
              {
                "id": "resistanceKW",
                "default": 2,
                "unit": "K/W",
                "min": 1e-09,
                "max": 1000000000000,
                "value": 2
              },
              {
                "id": "minimumResistanceKW",
                "default": 1e-06,
                "unit": "K/W",
                "min": 1e-12,
                "max": 1000000000,
                "value": 1e-06
              }
            ]
          }
        }
      }
    },
    {
      "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:battery-charge-envelope",
      "type": "Block",
      "label": "Charge-current envelope",
      "properties": {
        "id": "battery-charge-envelope",
        "name": "Charge-current envelope",
        "kind": "studio",
        "summary": "Selects the most restrictive cell voltage and temperature current limit.",
        "behavior": "Interpolates voltage and temperature limit tables for every channel, then selects the smallest nonnegative magnitude together with the nominal cap. Disabling the block returns zero. The envelope feeds a controller or current actuator.",
        "ports": [
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Cell voltages; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "temperature",
            "direction": "input",
            "unit": "K",
            "description": "Cell temperatures; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "true / false",
            "description": "Enable; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "limit",
            "direction": "output",
            "unit": "A",
            "description": "Allowed current magnitude; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltageLimit",
            "direction": "output",
            "unit": "A",
            "description": "Voltage limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "temperatureLimit",
            "direction": "output",
            "unit": "A",
            "description": "Temperature limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "cells",
            "label": "Number of measurement channels",
            "unit": "1",
            "default": 3,
            "description": "Number of measurement channels. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "nominalA",
            "label": "Nominal current limit (A)",
            "unit": "A",
            "default": 2,
            "description": "Nominal current limit (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "voltageTable",
            "label": "Voltage limit table [V, A]",
            "unit": "See field order",
            "default": [
              [
                4,
                2
              ],
              [
                4.1,
                0
              ]
            ],
            "description": "Voltage limit table [V, A]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "temperatureTable",
            "label": "Temperature limit table [K, A]",
            "unit": "See field order",
            "default": [
              [
                273.15,
                0
              ],
              [
                283.15,
                2
              ],
              [
                313.15,
                2
              ],
              [
                323.15,
                0
              ]
            ],
            "description": "Temperature limit table [K, A]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "allowed = enable ? min(nominal, all voltage limits, all temperature limits) : 0"
        ],
        "example": {
          "title": "Charge-current envelope worked example",
          "text": "Use the defaults below with Cell voltages = [4, 4.05, 4.02] V, Cell temperatures = [298.15, 318.15, 300] K, Enable = 1 true / false. At 0 s, Allowed current magnitude is 1 A. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-charge-envelope",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "limit",
              "atS": 0,
              "value": 1,
              "tolerance": 1e-08,
              "label": "Allowed current magnitude",
              "unit": "A"
            }
          ],
          "inputs": [
            {
              "port": "voltage",
              "label": "Cell voltages",
              "value": [
                4,
                4.05,
                4.02
              ],
              "unit": "V"
            },
            {
              "port": "temperature",
              "label": "Cell temperatures",
              "value": [
                298.15,
                318.15,
                300
              ],
              "unit": "K"
            },
            {
              "port": "enable",
              "label": "Enable",
              "value": 1,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "The tables are supplied by the model author. Their synthetic defaults do not establish a safe charging or discharging envelope.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "tomaszewska-charging"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-charge-envelope"
        ],
        "exampleTraces": [
          {
            "id": "battery-charge-envelope",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-charge-envelope.json?v=d05749eba926",
            "title": "Charge-current envelope recorded example",
            "exampleId": "block-battery-charge-envelope",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 3,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-charge-envelope",
        "implementationId": "battery-charge-envelope",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-charge-envelope/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-charge-envelope/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-charge-envelope"
          ]
        },
        "studioHelp": {
          "type": "battery-charge-envelope",
          "namespace": "signal",
          "slug": "signal-block-battery-charge-envelope",
          "canonicalSlug": "battery-charge-envelope",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Charge-current envelope",
            "label": "Charge-current envelope",
            "summary": "Selects the most restrictive cell voltage and temperature current limit.",
            "details": [
              "Block type: battery-charge-envelope.",
              "3 declared inputs and 3 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Charge-current envelope",
              "caption": "Selects the most restrictive cell voltage and temperature current limit."
            },
            "inputs": [
              {
                "id": "voltage",
                "label": "Cell voltages",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperatures",
                "quantity": "temperature",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "limit",
                "label": "Allowed current magnitude",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltageLimit",
                "label": "Voltage limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperatureLimit",
                "label": "Temperature limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"cells\":3,\"nominalA\":2,\"voltageTable\":[[4,2],[4.1,0]],\"temperatureTable\":[[273.15,0],[283.15,2],[313.15,2],[323.15,0]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-charge-envelope/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-coolant-controller",
      "type": "Block",
      "label": "Coolant flow controller",
      "properties": {
        "id": "battery-coolant-controller",
        "name": "Coolant flow 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": "kg/s",
            "description": "Coolant flow request; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "mass-rate"
          },
          {
            "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": 310,
            "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": 305,
            "description": "Turn-off temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "command",
            "label": "Coolant flow request (kg/s)",
            "unit": "kg/s",
            "default": 0.1,
            "description": "Coolant flow request (kg/s). 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": "Coolant flow controller worked example",
          "text": "Use the defaults below with Cell temperatures = [300, 315, 310] K, Enable = 1 true / false. At 0 s, Coolant flow request is 0.1 kg/s. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-coolant-controller",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "command",
              "atS": 0,
              "value": 0.1,
              "tolerance": 1e-08,
              "label": "Coolant flow request",
              "unit": "kg/s"
            }
          ],
          "inputs": [
            {
              "port": "temperature",
              "label": "Cell temperatures",
              "value": [
                300,
                315,
                310
              ],
              "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-coolant-controller"
        ],
        "exampleTraces": [
          {
            "id": "battery-coolant-controller",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-coolant-controller.json?v=fd3e8d3c9d7a",
            "title": "Coolant flow controller recorded example",
            "exampleId": "block-battery-coolant-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-coolant-controller",
        "implementationId": "battery-coolant-controller",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-coolant-controller/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-coolant-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-coolant-controller"
          ]
        },
        "studioHelp": {
          "type": "battery-coolant-controller",
          "namespace": "signal",
          "slug": "signal-block-battery-coolant-controller",
          "canonicalSlug": "battery-coolant-controller",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Coolant flow controller",
            "label": "Coolant flow controller",
            "summary": "Controls the hottest cooling channel or coldest heating channel with hysteresis.",
            "details": [
              "Block type: battery-coolant-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": "Coolant flow 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": "Coolant flow request",
                "quantity": "mass-rate",
                "shape": [],
                "elementType": "real",
                "unit": "kg/s",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Mass flow",
                "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\":310,\"offK\":305,\"command\":0.1}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-coolant-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-discharge-envelope",
      "type": "Block",
      "label": "Discharge-current envelope",
      "properties": {
        "id": "battery-discharge-envelope",
        "name": "Discharge-current envelope",
        "kind": "studio",
        "summary": "Selects the most restrictive cell voltage and temperature current limit.",
        "behavior": "Interpolates voltage and temperature limit tables for every channel, then selects the smallest nonnegative magnitude together with the nominal cap. Disabling the block returns zero. The envelope feeds a controller or current actuator.",
        "ports": [
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Cell voltages; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "temperature",
            "direction": "input",
            "unit": "K",
            "description": "Cell temperatures; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "enable",
            "direction": "input",
            "unit": "true / false",
            "description": "Enable; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "limit",
            "direction": "output",
            "unit": "A",
            "description": "Allowed current magnitude; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltageLimit",
            "direction": "output",
            "unit": "A",
            "description": "Voltage limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "temperatureLimit",
            "direction": "output",
            "unit": "A",
            "description": "Temperature limit; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "cells",
            "label": "Number of measurement channels",
            "unit": "1",
            "default": 3,
            "description": "Number of measurement channels. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "nominalA",
            "label": "Nominal current limit (A)",
            "unit": "A",
            "default": 4,
            "description": "Nominal current limit (A). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "voltageTable",
            "label": "Voltage limit table [V, A]",
            "unit": "See field order",
            "default": [
              [
                3,
                0
              ],
              [
                3.2,
                4
              ]
            ],
            "description": "Voltage limit table [V, A]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "temperatureTable",
            "label": "Temperature limit table [K, A]",
            "unit": "See field order",
            "default": [
              [
                273.15,
                0
              ],
              [
                283.15,
                4
              ],
              [
                313.15,
                4
              ],
              [
                323.15,
                0
              ]
            ],
            "description": "Temperature limit table [K, A]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "allowed = enable ? min(nominal, all voltage limits, all temperature limits) : 0"
        ],
        "example": {
          "title": "Discharge-current envelope worked example",
          "text": "Use the defaults below with Cell voltages = [3.2, 3.1, 3.15] V, Cell temperatures = [298.15, 318.15, 300] K, Enable = 1 true / false. At 0 s, Allowed current magnitude is 2 A. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-discharge-envelope",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "limit",
              "atS": 0,
              "value": 2,
              "tolerance": 1e-08,
              "label": "Allowed current magnitude",
              "unit": "A"
            }
          ],
          "inputs": [
            {
              "port": "voltage",
              "label": "Cell voltages",
              "value": [
                3.2,
                3.1,
                3.15
              ],
              "unit": "V"
            },
            {
              "port": "temperature",
              "label": "Cell temperatures",
              "value": [
                298.15,
                318.15,
                300
              ],
              "unit": "K"
            },
            {
              "port": "enable",
              "label": "Enable",
              "value": 1,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "The tables are supplied by the model author. Their synthetic defaults do not establish a safe charging or discharging envelope.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "tomaszewska-charging"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-discharge-envelope"
        ],
        "exampleTraces": [
          {
            "id": "battery-discharge-envelope",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-discharge-envelope.json?v=33f9143b20ed",
            "title": "Discharge-current envelope recorded example",
            "exampleId": "block-battery-discharge-envelope",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 3,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-discharge-envelope",
        "implementationId": "battery-discharge-envelope",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-discharge-envelope/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-discharge-envelope/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-discharge-envelope"
          ]
        },
        "studioHelp": {
          "type": "battery-discharge-envelope",
          "namespace": "signal",
          "slug": "signal-block-battery-discharge-envelope",
          "canonicalSlug": "battery-discharge-envelope",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Discharge-current envelope",
            "label": "Discharge-current envelope",
            "summary": "Selects the most restrictive cell voltage and temperature current limit.",
            "details": [
              "Block type: battery-discharge-envelope.",
              "3 declared inputs and 3 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Discharge-current envelope",
              "caption": "Selects the most restrictive cell voltage and temperature current limit."
            },
            "inputs": [
              {
                "id": "voltage",
                "label": "Cell voltages",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperatures",
                "quantity": "temperature",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "enable",
                "label": "Enable",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "limit",
                "label": "Allowed current magnitude",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltageLimit",
                "label": "Voltage limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperatureLimit",
                "label": "Temperature limit",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"cells\":3,\"nominalA\":4,\"voltageTable\":[[3,0],[3.2,4]],\"temperatureTable\":[[273.15,0],[283.15,4],[313.15,4],[323.15,0]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-discharge-envelope/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-ecm-cell",
      "type": "Block",
      "label": "Electrothermal ECM cell",
      "properties": {
        "id": "battery-ecm-cell",
        "name": "Electrothermal ECM cell",
        "kind": "studio",
        "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
        "behavior": "Accepts signed discharge current, ambient temperature and external heat. Charge balance drives SOC; an OCV table sets equilibrium voltage. The ECM adds two RC polarization states. Both variants include an ohmic loss and a lumped temperature state.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed cell current (discharge positive); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Ambient temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External heat flow; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "soc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of charge; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Cell temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Irreversible heat; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "ocv",
            "direction": "output",
            "unit": "V",
            "description": "Open-circuit voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "inRange",
            "direction": "output",
            "unit": "true / false",
            "description": "SOC in characterized range; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "capacityAh",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 5,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "r1Ohm",
            "label": "First polarization resistance (Ω)",
            "unit": "Ω",
            "default": 0.02,
            "description": "First polarization resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "c1F",
            "label": "First polarization capacitance (F)",
            "unit": "F",
            "default": 500,
            "description": "First polarization capacitance (F). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "r2Ohm",
            "label": "Second polarization resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Second polarization resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "c2F",
            "label": "Second polarization capacitance (F)",
            "unit": "F",
            "default": 2000,
            "description": "Second polarization capacitance (F). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "heatCapacityJPerK",
            "label": "Heat capacity (J/K)",
            "unit": "J/K",
            "default": 100,
            "description": "Heat capacity (J/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "conductanceWPerK",
            "label": "Ambient thermal conductance (W/K)",
            "unit": "W/K",
            "default": 1,
            "description": "Ambient thermal conductance (W/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialSoc",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.8,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialTemperatureK",
            "label": "Initial cell temperature (K)",
            "unit": "K",
            "default": 298.15,
            "description": "Initial cell temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "dSOC/dt = -I / (3600 * capacityAh)",
          "dVk/dt = (I - Vk/Rk) / Ck  [ECM branches only]",
          "Vterminal = OCV(SOC) - I*R0 - sum(Vk)",
          "Cthermal*dT/dt = I^2*R0 + sum(Vk^2/Rk) + Qexternal - G*(T-Tambient)"
        ],
        "example": {
          "title": "Electrothermal ECM cell worked example",
          "text": "Use the defaults below with Signed cell current (discharge positive) = 2 A, Ambient temperature = 298.15 K, External heat flow = 0 W. At 0 s, Terminal voltage is 3.68 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-ecm-cell",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 3.68,
              "tolerance": 1e-08,
              "label": "Terminal voltage",
              "unit": "V"
            },
            {
              "port": "soc",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "State of charge",
              "unit": "1 (fraction)"
            },
            {
              "port": "voltage",
              "atS": 10,
              "value": 3.646845790452711,
              "tolerance": 1e-06,
              "label": "Terminal voltage",
              "unit": "V"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed cell current (discharge positive)",
              "value": 2,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Ambient temperature",
              "value": 298.15,
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External heat flow",
              "value": 0,
              "unit": "W"
            }
          ]
        },
        "limits": [
          "The external interface is causal current-to-voltage, without conserving terminals. Parameters are constant except the one-dimensional SOC-to-OCV table. No hysteresis, aging, reversible entropic heat or automatic parameter identification.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-ecm-cell"
        ],
        "exampleTraces": [
          {
            "id": "battery-ecm-cell",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-ecm-cell.json?v=4bb6ace37339",
            "title": "Electrothermal ECM cell recorded example",
            "exampleId": "block-battery-ecm-cell",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-ecm-cell",
        "implementationId": "battery-ecm-cell",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-ecm-cell/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-ecm-cell/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-ecm-cell"
          ]
        },
        "studioHelp": {
          "type": "battery-ecm-cell",
          "namespace": "signal",
          "slug": "signal-block-battery-ecm-cell",
          "canonicalSlug": "battery-ecm-cell",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Electrothermal ECM cell",
            "label": "Electrothermal ECM cell",
            "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
            "details": [
              "Block type: battery-ecm-cell.",
              "3 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "I → SOC, RC → V, T",
              "label": "Equivalent-circuit cell",
              "caption": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed cell current (discharge positive)",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Ambient temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External heat flow",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "soc",
                "label": "State of charge",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "loss",
                "label": "Irreversible heat",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ocv",
                "label": "Open-circuit voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "inRange",
                "label": "SOC in characterized range",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"capacityAh\":5,\"resistanceOhm\":0.01,\"r1Ohm\":0.02,\"c1F\":500,\"r2Ohm\":0.01,\"c2F\":2000,\"heatCapacityJPerK\":100,\"conductanceWPerK\":1,\"initialSoc\":0.8,\"initialTemperatureK\":298.15,\"ocvTable\":[[0,3.7],[1,3.7]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/",
            "related": [
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-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-module",
      "type": "Block",
      "label": "Battery module",
      "properties": {
        "id": "battery-module",
        "name": "Battery module",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 6 channels at the default configuration.",
            "shape": [
              6
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 10 channels at the default configuration.",
            "shape": [
              10
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 10 channels at the default configuration.",
            "shape": [
              10
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "seriesGroups",
            "label": "Series groups in each module",
            "unit": "1",
            "default": 3,
            "description": "Series groups in each module. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Battery module worked example",
          "text": "Use the defaults below with Signed pack current = 6 A, Cell ambient temperatures = [298.15, 298.15, 298.15, 298.15, 298.15, 298.15] K, External cell heat inputs = [0, 0, 0, 0, 0, 0] W. At 0 s, Pack terminal voltage is 10.92 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-module",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 10.92,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                3,
                3,
                3,
                3,
                3,
                3
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 6,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0,
                0,
                0,
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-module"
        ],
        "exampleTraces": [
          {
            "id": "battery-module",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-module.json?v=36868c05ddb3",
            "title": "Battery module recorded example",
            "exampleId": "block-battery-module",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 39,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-module",
        "implementationId": "battery-module",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-module/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-module/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-module"
          ]
        },
        "studioHelp": {
          "type": "battery-module",
          "namespace": "signal",
          "slug": "signal-block-battery-module",
          "canonicalSlug": "battery-module",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Battery module",
            "label": "Battery module",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-module.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Battery module",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  6
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 6",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  10
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 10",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  10
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 10",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-module/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-module-assembly",
      "type": "Block",
      "label": "Module assembly",
      "properties": {
        "id": "battery-module-assembly",
        "name": "Module assembly",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 12 channels at the default configuration.",
            "shape": [
              12
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 21 channels at the default configuration.",
            "shape": [
              21
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 21 channels at the default configuration.",
            "shape": [
              21
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "seriesGroups",
            "label": "Series groups in each module",
            "unit": "1",
            "default": 3,
            "description": "Series groups in each module. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "modules",
            "label": "Modules in each assembly",
            "unit": "1",
            "default": 2,
            "description": "Modules in each assembly. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "moduleConnection",
            "label": "Module connection (0 series, 1 parallel)",
            "unit": "0 series, 1 parallel",
            "default": 0,
            "description": "0 connects modules in series; 1 connects them in parallel."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Module assembly worked example",
          "text": "Use the defaults below with Signed pack current = 6 A, Cell ambient temperatures = 12 channels each 298.15 K, External cell heat inputs = 12 channels each 0 W. At 0 s, Pack terminal voltage is 21.84 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-module-assembly",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 21.84,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 6,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-module-assembly"
        ],
        "exampleTraces": [
          {
            "id": "battery-module-assembly",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-module-assembly.json?v=fdf80bf25db5",
            "title": "Module assembly recorded example",
            "exampleId": "block-battery-module-assembly",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 91,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-module-assembly",
        "implementationId": "battery-module-assembly",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-module-assembly/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-module-assembly/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-module-assembly"
          ]
        },
        "studioHelp": {
          "type": "battery-module-assembly",
          "namespace": "signal",
          "slug": "signal-block-battery-module-assembly",
          "canonicalSlug": "battery-module-assembly",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Module assembly",
            "label": "Module assembly",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-module-assembly.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Module assembly",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  12
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 12",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  21
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 21",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  21
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 21",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"modules\":2,\"moduleConnection\":0,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-module-assembly/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-pack-assembly",
      "type": "Block",
      "label": "Battery pack assembly",
      "properties": {
        "id": "battery-pack-assembly",
        "name": "Battery pack assembly",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 24 channels at the default configuration.",
            "shape": [
              24
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 43 channels at the default configuration.",
            "shape": [
              43
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 43 channels at the default configuration.",
            "shape": [
              43
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "seriesGroups",
            "label": "Series groups in each module",
            "unit": "1",
            "default": 3,
            "description": "Series groups in each module. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "modules",
            "label": "Modules in each assembly",
            "unit": "1",
            "default": 2,
            "description": "Modules in each assembly. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "moduleConnection",
            "label": "Module connection (0 series, 1 parallel)",
            "unit": "0 series, 1 parallel",
            "default": 0,
            "description": "0 connects modules in series; 1 connects them in parallel."
          },
          {
            "key": "seriesAssemblies",
            "label": "Series assemblies in each string",
            "unit": "1",
            "default": 1,
            "description": "Series assemblies in each string. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "parallelStrings",
            "label": "Parallel pack strings",
            "unit": "1",
            "default": 2,
            "description": "Parallel pack strings. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Battery pack assembly worked example",
          "text": "Use the defaults below with Signed pack current = 12 A, Cell ambient temperatures = 24 channels each 298.15 K, External cell heat inputs = 24 channels each 0 W. At 0 s, Pack terminal voltage is 21.84 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-pack-assembly",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 21.84,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3,
                3
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333,
                0.7983333333333333
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 12,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-pack-assembly"
        ],
        "exampleTraces": [
          {
            "id": "battery-pack-assembly",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-pack-assembly.json?v=8c005753d771",
            "title": "Battery pack assembly recorded example",
            "exampleId": "block-battery-pack-assembly",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 195,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-pack-assembly",
        "implementationId": "battery-pack-assembly",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-pack-assembly/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-pack-assembly/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-pack-assembly"
          ]
        },
        "studioHelp": {
          "type": "battery-pack-assembly",
          "namespace": "signal",
          "slug": "signal-block-battery-pack-assembly",
          "canonicalSlug": "battery-pack-assembly",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Battery pack assembly",
            "label": "Battery pack assembly",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-pack-assembly.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Battery pack assembly",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  24
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 24",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  43
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 43",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  43
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 43",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"seriesGroups\":3,\"modules\":2,\"moduleConnection\":0,\"seriesAssemblies\":1,\"parallelStrings\":2,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-pack-assembly/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-parallel-group",
      "type": "Block",
      "label": "Parallel cell group",
      "properties": {
        "id": "battery-parallel-group",
        "name": "Parallel cell group",
        "kind": "studio",
        "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
        "behavior": "Builds an explicit series/parallel hierarchy with a separate SOC, two RC voltages and temperature for every cell. Subtree voltage/resistance reduction and Kirchhoff current sharing determine each cell current. Optional thermal links exchange equal and opposite heat. Per-cell overrides introduce controlled variation.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed pack current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Cell ambient temperatures; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External cell heat inputs; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Pack terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Individual cell voltages; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "cellCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Individual cell currents; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "cellSoc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Individual cell SOC; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "cellTemperature",
            "direction": "output",
            "unit": "K",
            "description": "Individual cell temperatures; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "cellHeat",
            "direction": "output",
            "unit": "W",
            "description": "Individual cell heat generation; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "nodeVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Hierarchy node voltages; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "nodeCurrent",
            "direction": "output",
            "unit": "A",
            "description": "Hierarchy node currents; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "current"
          }
        ],
        "parameters": [
          {
            "key": "parallelCells",
            "label": "Parallel cells in each group",
            "unit": "1",
            "default": 2,
            "description": "Parallel cells in each group. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "cellProfile",
            "label": "Cell parameters [Ah, Ω, Ω, F, Ω, F, J/K, W/K, SOC, K, V offset]",
            "unit": "See field order",
            "default": [
              5,
              0.02,
              0.02,
              500,
              0.01,
              2000,
              100,
              1,
              0.8,
              298.15,
              0
            ],
            "description": "Ordered fields: capacity (Ah), R0 (Ω), R1 (Ω), C1 (F), R2 (Ω), C2 (F), heat capacity (J/K), ambient conductance (W/K), initial SOC, initial temperature (K), OCV offset (V)."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "cellOverrides",
            "label": "Overrides [cell index, parameter index, value]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain zero-based cell index, zero-based cell-profile parameter index and replacement value. Empty means every cell uses the base profile."
          },
          {
            "key": "thermalEdges",
            "label": "Thermal links [cell index, cell index, W/K]",
            "unit": "See field order",
            "default": [],
            "description": "Rows contain two distinct zero-based cell indices and conductance (W/K). Each edge exchanges equal and opposite heat. Empty means no cell-to-cell links."
          }
        ],
        "equations": [
          "series: current is shared; voltages add",
          "parallel: terminal voltage is shared; branch currents sum to imposed current",
          "Icell = (Ecell - Vparallel) / Rcell",
          "Qij = Gij*(Ti-Tj); Qji = -Qij"
        ],
        "example": {
          "title": "Parallel cell group worked example",
          "text": "Use the defaults below with Signed pack current = 4 A, Cell ambient temperatures = [298.15, 298.15] K, External cell heat inputs = [0, 0] W. At 0 s, Pack terminal voltage is 3.66 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-parallel-group",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 3.66,
              "tolerance": 1e-08,
              "label": "Pack terminal voltage",
              "unit": "V"
            },
            {
              "port": "cellCurrent",
              "atS": 0,
              "value": [
                2,
                2
              ],
              "tolerance": 1e-08,
              "label": "Individual cell currents",
              "unit": "A"
            },
            {
              "port": "cellSoc",
              "atS": 0,
              "value": [
                0.8,
                0.8
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "cellSoc",
              "atS": 10,
              "value": [
                0.798888888888889,
                0.798888888888889
              ],
              "tolerance": 1e-08,
              "label": "Individual cell SOC",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed pack current",
              "value": 4,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Cell ambient temperatures",
              "value": [
                298.15,
                298.15
              ],
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External cell heat inputs",
              "value": [
                0,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Bounded to 256 cells with the supported series/parallel construction. External pack current is imposed causally; no arbitrary geometry, conserving terminal adapter or topology reconfiguration. Each cell parameter set still needs characterization.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-parallel-group"
        ],
        "exampleTraces": [
          {
            "id": "battery-parallel-group",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-parallel-group.json?v=d377de1011ff",
            "title": "Parallel cell group recorded example",
            "exampleId": "block-battery-parallel-group",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 5,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          },
          {
            "id": "battery-parallel-mismatch",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-parallel-mismatch.json?v=9c00f108fa95",
            "title": "Unequal parallel cells",
            "exampleId": "block-battery-parallel-mismatch",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 5,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          },
          {
            "id": "battery-cell-thermal-link",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-cell-thermal-link.json?v=a5718ede583b",
            "title": "Heat exchange between cells",
            "exampleId": "block-battery-cell-thermal-link",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 5,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-parallel-group",
        "implementationId": "battery-parallel-group",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-parallel-group/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-parallel-group/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-cell-thermal-link",
            "https://design.lemonergy.com/cosim.html?example=block-battery-parallel-group",
            "https://design.lemonergy.com/cosim.html?example=block-battery-parallel-mismatch"
          ]
        },
        "studioHelp": {
          "type": "battery-parallel-group",
          "namespace": "signal",
          "slug": "signal-block-battery-parallel-group",
          "canonicalSlug": "battery-parallel-group",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Parallel cell group",
            "label": "Parallel cell group",
            "summary": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary.",
            "details": [
              "Block type: battery-parallel-group.",
              "3 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Parallel cell group",
              "caption": "Generated series/parallel cell hierarchy with individual SOC, RC and temperature states, KCL current sharing and optional thermal links. Causal pack-current boundary."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed pack current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Cell ambient temperatures",
                "quantity": "temperature",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External cell heat inputs",
                "quantity": "heat",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Pack terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "cellVoltage",
                "label": "Individual cell voltages",
                "quantity": "voltage",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellCurrent",
                "label": "Individual cell currents",
                "quantity": "current",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellSoc",
                "label": "Individual cell SOC",
                "quantity": "fraction",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellTemperature",
                "label": "Individual cell temperatures",
                "quantity": "temperature",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "cellHeat",
                "label": "Individual cell heat generation",
                "quantity": "heat",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              },
              {
                "id": "nodeVoltage",
                "label": "Hierarchy node voltages",
                "quantity": "voltage",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              },
              {
                "id": "nodeCurrent",
                "label": "Hierarchy node currents",
                "quantity": "current",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"parallelCells\":2,\"cellProfile\":[5,0.02,0.02,500,0.01,2000,100,1,0.8,298.15,0],\"ocvTable\":[[0,3.7],[1,3.7]],\"cellOverrides\":[],\"thermalEdges\":[]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-parallel-group/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-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-single-particle-cell",
      "type": "Block",
      "label": "Single-particle cell",
      "properties": {
        "id": "battery-single-particle-cell",
        "name": "Single-particle cell",
        "kind": "studio",
        "summary": "Native spherical solid diffusion and Butler-Volmer kinetics with tabulated electrode OCPs. Isothermal material parameters; no electrolyte transport, aging or conserving adapter.",
        "behavior": "Solves spherical solid diffusion in separate negative and positive representative particles with conservative radial finite volumes. Opposite Faradaic fluxes transfer lithium between electrodes. Surface stoichiometries drive tabulated OCPs and Butler-Volmer overpotentials; temperature is prescribed.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed cell current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "temperature",
            "direction": "input",
            "unit": "K",
            "description": "Kinetics temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "socNegative",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Negative-window SOC; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "socPositive",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Positive-window SOC; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "surfaceNegative",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Negative surface stoichiometry; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "surfacePositive",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "Positive surface stoichiometry; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "lithium",
            "direction": "output",
            "unit": "1",
            "description": "Solid lithium inventory (mol); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "concentrationNegative",
            "direction": "output",
            "unit": "1",
            "description": "Negative shell concentrations (mol/m³); 8 channels at the default configuration.",
            "shape": [
              8
            ],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "concentrationPositive",
            "direction": "output",
            "unit": "1",
            "description": "Positive shell concentrations (mol/m³); 8 channels at the default configuration.",
            "shape": [
              8
            ],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "shells",
            "label": "Radial shells per particle",
            "unit": "1",
            "default": 8,
            "description": "Radial shells per particle. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "areaM2",
            "label": "Electrode area (m²)",
            "unit": "m²",
            "default": 0.01,
            "description": "Electrode area (m²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Contact resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Contact resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialSoc",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.5,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "negative",
            "label": "Negative electrode parameters (see model notes)",
            "unit": "See field order",
            "default": [
              5e-06,
              0.0001,
              0.5,
              30000,
              1e-13,
              2,
              0.1,
              0.9
            ],
            "description": "Ordered fields: particle radius (m), electrode thickness (m), solid volume fraction, maximum concentration (mol/m³), diffusion coefficient (m²/s), exchange-current density at half filling (A/m²), empty stoichiometry, full stoichiometry."
          },
          {
            "key": "positive",
            "label": "Positive electrode parameters (see model notes)",
            "unit": "See field order",
            "default": [
              5e-06,
              0.0001,
              0.5,
              30000,
              1e-13,
              2,
              0.9,
              0.1
            ],
            "description": "Ordered fields: particle radius (m), electrode thickness (m), solid volume fraction, maximum concentration (mol/m³), diffusion coefficient (m²/s), exchange-current density at half filling (A/m²), empty stoichiometry, full stoichiometry."
          },
          {
            "key": "negativeOcp",
            "label": "Negative electrode OCP [stoichiometry, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                0.1
              ],
              [
                1,
                0.1
              ]
            ],
            "description": "Negative electrode OCP [stoichiometry, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          },
          {
            "key": "positiveOcp",
            "label": "Positive electrode OCP [stoichiometry, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                4.1
              ],
              [
                1,
                4.1
              ]
            ],
            "description": "Positive electrode OCP [stoichiometry, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "dc/dt = D/r^2 * d/dr(r^2 * dc/dr)",
          "surface molar flux magnitude = I / (F * active particle area)",
          "V = Up(surface) - Un(surface) - etaP - etaN - I*Rseries"
        ],
        "example": {
          "title": "Single-particle cell worked example",
          "text": "Use the defaults below with Signed cell current = 1 A, Kinetics temperature = 298.15 K. At 0 s, Terminal voltage is 3.912048435 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-single-particle-cell",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 3.9120484354726908,
              "tolerance": 1e-08,
              "label": "Terminal voltage",
              "unit": "V"
            },
            {
              "port": "socNegative",
              "atS": 0,
              "value": 0.5,
              "tolerance": 1e-08,
              "label": "Negative-window SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "socPositive",
              "atS": 0,
              "value": 0.5,
              "tolerance": 1e-08,
              "label": "Positive-window SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "lithium",
              "atS": 0,
              "value": 0.015,
              "tolerance": 1e-08,
              "label": "Solid lithium inventory (mol)",
              "unit": "1"
            },
            {
              "port": "socNegative",
              "atS": 10,
              "value": 0.49136310861948523,
              "tolerance": 1e-08,
              "label": "Negative-window SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "socPositive",
              "atS": 10,
              "value": 0.49136310861948523,
              "tolerance": 1e-08,
              "label": "Positive-window SOC",
              "unit": "1 (fraction)"
            },
            {
              "port": "lithium",
              "atS": 10,
              "value": 0.015,
              "tolerance": 1e-10,
              "label": "Solid lithium inventory (mol)",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed cell current",
              "value": 1,
              "unit": "A"
            },
            {
              "port": "temperature",
              "label": "Kinetics temperature",
              "value": 298.15,
              "unit": "K"
            }
          ]
        },
        "limits": [
          "Fixed solid diffusion and material coefficients; no electrolyte transport, aging, thermal state or conserving boundary adapter. Surface concentrations must stay strictly inside their physical range. The cited paper explains model assumptions and a richer electrolyte extension; this block implements the stated solid-only model.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "marquis-spm"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-single-particle-cell"
        ],
        "exampleTraces": [
          {
            "id": "battery-single-particle-cell",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-single-particle-cell.json?v=e78ff128bfde",
            "title": "Single-particle cell recorded example",
            "exampleId": "block-battery-single-particle-cell",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 12,
            "omittedChannels": 10,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-single-particle-cell",
        "implementationId": "battery-single-particle-cell",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-single-particle-cell/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-single-particle-cell/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-single-particle-cell"
          ]
        },
        "studioHelp": {
          "type": "battery-single-particle-cell",
          "namespace": "signal",
          "slug": "signal-block-battery-single-particle-cell",
          "canonicalSlug": "battery-single-particle-cell",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Single-particle cell",
            "label": "Single-particle cell",
            "summary": "Native spherical solid diffusion and Butler-Volmer kinetics with tabulated electrode OCPs. Isothermal material parameters; no electrolyte transport, aging or conserving adapter.",
            "details": [
              "Block type: battery-single-particle-cell.",
              "2 declared inputs and 8 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "diffusion → kinetics → V",
              "label": "Single-particle cell",
              "caption": "Native spherical solid diffusion and Butler-Volmer kinetics with tabulated electrode OCPs. Isothermal material parameters; no electrolyte transport, aging or conserving adapter."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed cell current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Kinetics temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "socNegative",
                "label": "Negative-window SOC",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "socPositive",
                "label": "Positive-window SOC",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "surfaceNegative",
                "label": "Negative surface stoichiometry",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "surfacePositive",
                "label": "Positive surface stoichiometry",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "lithium",
                "label": "Solid lithium inventory (mol)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "concentrationNegative",
                "label": "Negative shell concentrations (mol/m³)",
                "quantity": "dimensionless",
                "shape": [
                  8
                ],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Array 8",
                "elementLabel": "real"
              },
              {
                "id": "concentrationPositive",
                "label": "Positive shell concentrations (mol/m³)",
                "quantity": "dimensionless",
                "shape": [
                  8
                ],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Array 8",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"shells\":8,\"areaM2\":0.01,\"resistanceOhm\":0.01,\"initialSoc\":0.5,\"negative\":[0.000005,0.0001,0.5,30000,1e-13,2,0.1,0.9],\"positive\":[0.000005,0.0001,0.5,30000,1e-13,2,0.9,0.1],\"negativeOcp\":[[0,0.1],[1,0.1]],\"positiveOcp\":[[0,4.1],[1,4.1]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-single-particle-cell/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-tabulated-cell",
      "type": "Block",
      "label": "Tabulated OCV cell",
      "properties": {
        "id": "battery-tabulated-cell",
        "name": "Tabulated OCV cell",
        "kind": "studio",
        "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
        "behavior": "Accepts signed discharge current, ambient temperature and external heat. Charge balance drives SOC; an OCV table sets equilibrium voltage. The ECM adds two RC polarization states. Both variants include an ohmic loss and a lumped temperature state.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed cell current (discharge positive); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "ambient",
            "direction": "input",
            "unit": "K",
            "description": "Ambient temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "externalHeat",
            "direction": "input",
            "unit": "W",
            "description": "External heat flow; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "soc",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of charge; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "temperature",
            "direction": "output",
            "unit": "K",
            "description": "Cell temperature; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Irreversible heat; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "ocv",
            "direction": "output",
            "unit": "V",
            "description": "Open-circuit voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "inRange",
            "direction": "output",
            "unit": "true / false",
            "description": "SOC in characterized range; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "capacityAh",
            "label": "Charge capacity (Ah)",
            "unit": "Ah",
            "default": 5,
            "description": "Charge capacity (Ah). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.01,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "heatCapacityJPerK",
            "label": "Heat capacity (J/K)",
            "unit": "J/K",
            "default": 100,
            "description": "Heat capacity (J/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "conductanceWPerK",
            "label": "Ambient thermal conductance (W/K)",
            "unit": "W/K",
            "default": 1,
            "description": "Ambient thermal conductance (W/K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialSoc",
            "label": "Initial SOC (0–1)",
            "unit": "0–1",
            "default": 0.8,
            "description": "Initial SOC (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialTemperatureK",
            "label": "Initial cell temperature (K)",
            "unit": "K",
            "default": 298.15,
            "description": "Initial cell temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "Open-circuit voltage table [SOC fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3.7
              ],
              [
                1,
                3.7
              ]
            ],
            "description": "Open-circuit voltage table [SOC fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "dSOC/dt = -I / (3600 * capacityAh)",
          "dVk/dt = (I - Vk/Rk) / Ck  [ECM branches only]",
          "Vterminal = OCV(SOC) - I*R0 - sum(Vk)",
          "Cthermal*dT/dt = I^2*R0 + sum(Vk^2/Rk) + Qexternal - G*(T-Tambient)"
        ],
        "example": {
          "title": "Tabulated OCV cell worked example",
          "text": "Use the defaults below with Signed cell current (discharge positive) = 2 A, Ambient temperature = 298.15 K, External heat flow = 0 W. At 0 s, Terminal voltage is 3.68 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-tabulated-cell",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 3.68,
              "tolerance": 1e-08,
              "label": "Terminal voltage",
              "unit": "V"
            },
            {
              "port": "soc",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "State of charge",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed cell current (discharge positive)",
              "value": 2,
              "unit": "A"
            },
            {
              "port": "ambient",
              "label": "Ambient temperature",
              "value": 298.15,
              "unit": "K"
            },
            {
              "port": "externalHeat",
              "label": "External heat flow",
              "value": 0,
              "unit": "W"
            }
          ]
        },
        "limits": [
          "The external interface is causal current-to-voltage, without conserving terminals. Parameters are constant except the one-dimensional SOC-to-OCV table. No hysteresis, aging, reversible entropic heat or automatic parameter identification.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling",
          "bernardi-energy"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-tabulated-cell"
        ],
        "exampleTraces": [
          {
            "id": "battery-tabulated-cell",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-tabulated-cell.json?v=eaf379d0c89d",
            "title": "Tabulated OCV cell recorded example",
            "exampleId": "block-battery-tabulated-cell",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-tabulated-cell",
        "implementationId": "battery-tabulated-cell",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-tabulated-cell/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-tabulated-cell/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-tabulated-cell"
          ]
        },
        "studioHelp": {
          "type": "battery-tabulated-cell",
          "namespace": "signal",
          "slug": "signal-block-battery-tabulated-cell",
          "canonicalSlug": "battery-tabulated-cell",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Tabulated OCV cell",
            "label": "Tabulated OCV cell",
            "summary": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included.",
            "details": [
              "Block type: battery-tabulated-cell.",
              "3 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "I → cell state → V, T",
              "label": "Tabulated electrical cell",
              "caption": "Causal current-to-voltage model with charge and thermal states. Conserving ports are not yet included."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed cell current (discharge positive)",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ambient",
                "label": "Ambient temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "externalHeat",
                "label": "External heat flow",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "soc",
                "label": "State of charge",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "temperature",
                "label": "Cell temperature",
                "quantity": "temperature",
                "shape": [],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "loss",
                "label": "Irreversible heat",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "ocv",
                "label": "Open-circuit voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "inRange",
                "label": "SOC in characterized range",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"capacityAh\":5,\"resistanceOhm\":0.01,\"heatCapacityJPerK\":100,\"conductanceWPerK\":1,\"initialSoc\":0.8,\"initialTemperatureK\":298.15,\"ocvTable\":[[0,3.7],[1,3.7]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-tabulated-cell/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-temperature-monitor",
      "type": "Block",
      "label": "Battery temperature monitor",
      "properties": {
        "id": "battery-temperature-monitor",
        "name": "Battery temperature monitor",
        "kind": "studio",
        "summary": "Reports each channel below/above its bounds and a combined fault.",
        "behavior": "Compares each measured channel with strict lower and upper bounds. A value equal to a bound does not trip. The combined output is true when any channel is outside the bounds.",
        "ports": [
          {
            "name": "values",
            "direction": "input",
            "unit": "K",
            "description": "Channel measurements; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "real",
            "quantity": "temperature"
          },
          {
            "name": "low",
            "direction": "output",
            "unit": "true / false",
            "description": "Below lower bound; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "high",
            "direction": "output",
            "unit": "true / false",
            "description": "Above upper bound; 3 channels at the default configuration.",
            "shape": [
              3
            ],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "fault",
            "direction": "output",
            "unit": "true / false",
            "description": "Any fault; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "cells",
            "label": "Number of measurement channels",
            "unit": "1",
            "default": 3,
            "description": "Number of measurement channels. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "lower",
            "label": "Lower threshold (K)",
            "unit": "K",
            "default": 273.15,
            "description": "Lower threshold (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "upper",
            "label": "Upper threshold (K)",
            "unit": "K",
            "default": 318.15,
            "description": "Upper threshold (K). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "low[j] = value[j] < lower",
          "high[j] = value[j] > upper",
          "fault = any(low) or any(high)"
        ],
        "example": {
          "title": "Battery temperature monitor worked example",
          "text": "Use the defaults below with Channel measurements = [272, 298.15, 318.15] K. At 0 s, Any fault is 1 true / false. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-temperature-monitor",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fault",
              "atS": 0,
              "value": 1,
              "tolerance": 1e-08,
              "label": "Any fault",
              "unit": "true / false"
            }
          ],
          "inputs": [
            {
              "port": "values",
              "label": "Channel measurements",
              "value": [
                272,
                298.15,
                318.15
              ],
              "unit": "K"
            }
          ]
        },
        "limits": [
          "Bounds are user-supplied. This comparator does not disconnect a circuit or diagnose a sensor failure.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "ti-bms"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-temperature-monitor"
        ],
        "exampleTraces": [
          {
            "id": "battery-temperature-monitor",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-temperature-monitor.json?v=c457b18223f2",
            "title": "Battery temperature monitor recorded example",
            "exampleId": "block-battery-temperature-monitor",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 7,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-temperature-monitor",
        "implementationId": "battery-temperature-monitor",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-temperature-monitor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-temperature-monitor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-temperature-monitor"
          ]
        },
        "studioHelp": {
          "type": "battery-temperature-monitor",
          "namespace": "signal",
          "slug": "signal-block-battery-temperature-monitor",
          "canonicalSlug": "battery-temperature-monitor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Battery temperature monitor",
            "label": "Battery temperature monitor",
            "summary": "Reports each channel below/above its bounds and a combined fault.",
            "details": [
              "Block type: battery-temperature-monitor.",
              "1 declared input and 3 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "control",
              "symbol": "signal → bounds → fault",
              "label": "Compare monitored channels",
              "caption": "Reports each channel below/above its bounds and a combined fault."
            },
            "inputs": [
              {
                "id": "values",
                "label": "Channel measurements",
                "quantity": "temperature",
                "shape": [
                  3
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 3",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "low",
                "label": "Below lower bound",
                "quantity": "dimensionless",
                "shape": [
                  3
                ],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Array 3",
                "elementLabel": "bool"
              },
              {
                "id": "high",
                "label": "Above upper bound",
                "quantity": "dimensionless",
                "shape": [
                  3
                ],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Array 3",
                "elementLabel": "bool"
              },
              {
                "id": "fault",
                "label": "Any fault",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"cells\":3,\"lower\":273.15,\"upper\":318.15}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/",
            "related": [
              {
                "label": "Compare",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-compare/"
              },
              {
                "label": "Boolean latch",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-boolean-latch/"
              },
              {
                "label": "Pi controller",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-pi-controller/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-thermal-state-space",
      "type": "Block",
      "label": "Thermal state-space model",
      "properties": {
        "id": "battery-thermal-state-space",
        "name": "Thermal state-space model",
        "kind": "studio",
        "summary": "Linear thermal rise model with a positive diagonal heat-capacity descriptor. User supplies validated matrices.",
        "behavior": "Solves a linear temperature-rise model with positive diagonal heat capacities. Heat inputs drive the state; output temperatures add the configured ambient temperature to the linear result.",
        "ports": [
          {
            "name": "input",
            "direction": "input",
            "unit": "W",
            "description": "Heat inputs; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "heat"
          },
          {
            "name": "output",
            "direction": "output",
            "unit": "K",
            "description": "Temperature outputs; 2 channels at the default configuration.",
            "shape": [
              2
            ],
            "elementType": "real",
            "quantity": "temperature"
          }
        ],
        "parameters": [
          {
            "key": "ambientK",
            "label": "Ambient temperature (K)",
            "unit": "K",
            "default": 298.15,
            "description": "Ambient temperature (K). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "A",
            "label": "State matrix A",
            "unit": "Model-dependent",
            "default": [
              [
                -2,
                1
              ],
              [
                1,
                -2
              ]
            ],
            "description": "Row-oriented state matrix. Dimensions must agree with B, C, D and the initial state."
          },
          {
            "key": "B",
            "label": "Input matrix B",
            "unit": "Model-dependent",
            "default": [
              [
                1,
                0
              ],
              [
                0,
                1
              ]
            ],
            "description": "Row-oriented input matrix. One column per input channel."
          },
          {
            "key": "C",
            "label": "Output matrix C",
            "unit": "Model-dependent",
            "default": [
              [
                1,
                0
              ],
              [
                0,
                1
              ]
            ],
            "description": "Row-oriented output matrix. One row per output channel."
          },
          {
            "key": "D",
            "label": "Feedthrough matrix D",
            "unit": "Model-dependent",
            "default": [
              [
                0,
                0
              ],
              [
                0,
                0
              ]
            ],
            "description": "Row-oriented direct feedthrough matrix; output rows by input columns."
          },
          {
            "key": "initial",
            "label": "Initial state vector",
            "unit": "See field order",
            "default": [
              0,
              0
            ],
            "description": "Initial state vector, with one value per state."
          },
          {
            "key": "capacityDiagonal",
            "label": "Node heat capacities (J/K)",
            "unit": "See field order",
            "default": [
              100,
              100
            ],
            "description": "Node heat capacities (J/K). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "diag(capacity)*dx/dt = A*x + B*Q",
          "Toutput = ambientK + C*x + D*Q"
        ],
        "example": {
          "title": "Thermal state-space model worked example",
          "text": "Use the defaults below with Heat inputs = [10, 0] W. At 0 s, Temperature outputs is [298.15, 298.15] K. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-thermal-state-space",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "output",
              "atS": 0,
              "value": [
                298.15,
                298.15
              ],
              "tolerance": 1e-08,
              "label": "Temperature outputs",
              "unit": "K"
            }
          ],
          "inputs": [
            {
              "port": "input",
              "label": "Heat inputs",
              "value": [
                10,
                0
              ],
              "unit": "W"
            }
          ]
        },
        "limits": [
          "Supports a positive diagonal descriptor, not an arbitrary descriptor matrix. No finite-element import or conserving thermal adapter; supplied matrices determine heat conservation and stability.",
          "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",
          "astrom-murray-feedback"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-thermal-state-space"
        ],
        "exampleTraces": [
          {
            "id": "battery-thermal-state-space",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-thermal-state-space.json?v=e398d07c9249",
            "title": "Thermal state-space model recorded example",
            "exampleId": "block-battery-thermal-state-space",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 2,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-thermal-state-space",
        "implementationId": "battery-thermal-state-space",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-thermal-state-space/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-thermal-state-space/",
        "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-thermal-state-space"
          ]
        },
        "studioHelp": {
          "type": "battery-thermal-state-space",
          "namespace": "signal",
          "slug": "signal-block-battery-thermal-state-space",
          "canonicalSlug": "battery-thermal-state-space",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Thermal state-space model",
            "label": "Thermal state-space model",
            "summary": "Linear thermal rise model with a positive diagonal heat-capacity descriptor. User supplies validated matrices.",
            "details": [
              "Block type: battery-thermal-state-space.",
              "1 declared input and 1 declared output in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Thermal state-space model",
              "caption": "Linear thermal rise model with a positive diagonal heat-capacity descriptor. User supplies validated matrices."
            },
            "inputs": [
              {
                "id": "input",
                "label": "Heat inputs",
                "quantity": "heat",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "output",
                "label": "Temperature outputs",
                "quantity": "temperature",
                "shape": [
                  2
                ],
                "elementType": "real",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Array 2",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"ambientK\":298.15,\"A\":[[-2,1],[1,-2]],\"B\":[[1,0],[0,1]],\"C\":[[1,0],[0,1]],\"D\":[[0,0],[0,0]],\"initial\":[0,0],\"capacityDiagonal\":[100,100]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-thermal-state-space/",
            "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:native-unit-conversion",
      "type": "Block",
      "label": "Explicit unit conversion",
      "properties": {
        "id": "native-unit-conversion",
        "name": "Explicit unit conversion",
        "kind": "studio",
        "summary": "Applies output = scale × input + offset. The worked example converts an external Celsius number into a Kelvin temperature port.",
        "behavior": "y = scale × u + offset. Kelvin temperature = Celsius value + 273.15.",
        "ports": [
          {
            "name": "in0",
            "direction": "input",
            "unit": "1",
            "description": "Temperature in Celsius; real scalar.",
            "shape": [],
            "elementType": "real"
          },
          {
            "name": "out0",
            "direction": "output",
            "unit": "temperature",
            "description": "Temperature in Kelvin; real scalar.",
            "shape": [],
            "elementType": "real"
          }
        ],
        "parameters": [
          {
            "key": "params[0]",
            "label": "Scale",
            "unit": "1",
            "default": 1,
            "description": "Configured value for Scale."
          },
          {
            "key": "params[1]",
            "label": "Offset",
            "unit": "1",
            "default": 273.15,
            "description": "Configured value for Offset."
          }
        ],
        "equations": [
          "y = scale × u + offset",
          "Kelvin temperature = Celsius value + 273.15"
        ],
        "example": {
          "title": "Explicit unit conversion — worked example",
          "text": "Temperature in Celsius = 25. Temperature in Kelvin at 0 s = 298.15.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-native-unit-conversion",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "in0",
              "label": "Temperature in Celsius",
              "value": 25,
              "unit": "1"
            }
          ],
          "checks": [
            {
              "port": "out0",
              "label": "Temperature in Kelvin",
              "atS": 0,
              "value": 298.15,
              "unit": "temperature",
              "tolerance": 1e-09
            }
          ]
        },
        "limits": [
          "Scale and offset are explicit user parameters; no automatic dimensional inference or unit-system selection is performed."
        ],
        "references": [
          "bipm-si"
        ],
        "caseIds": [
          "native-native-unit-conversion"
        ],
        "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",
        "exampleTraces": [
          {
            "id": "native-unit-conversion",
            "url": "https://lemonergy.com/learn/glossary/api/traces/native-unit-conversion.json?v=59070e07c00b",
            "title": "Explicit unit conversion recorded example",
            "exampleId": "block-native-unit-conversion",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 1,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "native-unit-conversion",
        "implementationId": "native-unit-conversion",
        "url": "https://lemonergy.com/learn/glossary/blocks/native-unit-conversion/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/native-unit-conversion/",
        "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-native-unit-conversion"
          ]
        },
        "studioHelp": {
          "type": "native-unit-conversion",
          "namespace": "signal",
          "slug": "signal-block-native-unit-conversion",
          "canonicalSlug": "native-unit-conversion",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Explicit unit conversion",
            "label": "Explicit unit conversion",
            "summary": "Applies output = scale × input + offset. The worked example converts an external Celsius number into a Kelvin temperature port.",
            "details": [
              "Block type: native-unit-conversion.",
              "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": "math",
              "symbol": "input → operation → result",
              "label": "Explicit unit conversion",
              "caption": "Applies output = scale × input + offset. The worked example converts an external Celsius number into a Kelvin temperature port."
            },
            "inputs": [
              {
                "label": "Temperature in Celsius",
                "shape": [],
                "elementType": "real",
                "quantity": "dimensionless",
                "id": "in0",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "label": "Temperature in Kelvin",
                "shape": [],
                "elementType": "real",
                "quantity": "temperature",
                "id": "out0",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "config",
                "label": "Configuration",
                "unit": "",
                "value": "{\"inputs\":[{\"label\":\"Temperature in Celsius\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"dimensionless\"}],\"outputs\":[{\"label\":\"Temperature in Kelvin\",\"shape\":[],\"elementType\":\"real\",\"quantity\":\"temperature\"}],\"params\":[1,273.15],\"sampleTimeS\":0}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-native-unit-conversion/",
            "related": [
              {
                "label": "Gain",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-gain/"
              },
              {
                "label": "Sum",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sum/"
              },
              {
                "label": "Product",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-product/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:thermal-rate",
      "type": "Block",
      "label": "Thermal balance",
      "properties": {
        "id": "thermal-rate",
        "kind": "studio",
        "name": "Thermal balance",
        "summary": "Lumped heat balance with ambient loss.",
        "behavior": "Lumped heat balance with ambient loss.",
        "documentationSlug": "signal-block-thermal-rate",
        "referenceOnly": true,
        "ports": [
          {
            "name": "Generated heat",
            "direction": "input",
            "unit": "W",
            "description": "Heat flow; Scalar; real. Received from a connected producer."
          },
          {
            "name": "Temperature",
            "direction": "input",
            "unit": "K",
            "description": "Temperature; Scalar; real. Received from a connected producer."
          },
          {
            "name": "Ambient",
            "direction": "input",
            "unit": "K",
            "description": "Temperature; Scalar; real. Received from a connected producer."
          },
          {
            "name": "Output",
            "direction": "output",
            "unit": "K/s",
            "description": "Temperature rate; Scalar; real. Produced for connected consumers."
          }
        ],
        "parameters": [
          {
            "key": "heatCapacityJPerK",
            "label": "Heat capacity",
            "unit": "J/K",
            "default": "900",
            "description": "Declared authoring field: Heat capacity."
          },
          {
            "key": "conductanceWPerK",
            "label": "Ambient conductance",
            "unit": "W/K",
            "default": "1",
            "description": "Declared authoring field: Ambient conductance."
          }
        ],
        "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": "thermal-rate",
        "implementationId": "thermal-rate",
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-thermal-rate/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/signal-block-thermal-rate/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "thermal-rate",
          "namespace": "signal",
          "slug": "signal-block-thermal-rate",
          "canonicalSlug": "signal-block-thermal-rate",
          "existing": false,
          "dynamic": false,
          "scene": {
            "title": "Thermal balance",
            "label": "Thermal balance",
            "summary": "Lumped heat balance with ambient loss.",
            "details": [
              "Block type: thermal-rate.",
              "3 declared inputs 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": "thermal",
              "symbol": "(Q − UA·ΔT) / C",
              "label": "Lumped heat balance",
              "caption": "Lumped heat balance with ambient loss."
            },
            "inputs": [
              {
                "id": "in0",
                "label": "Generated heat",
                "quantity": "heat",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "in1",
                "label": "Temperature",
                "quantity": "temperature",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "in2",
                "label": "Ambient",
                "quantity": "temperature",
                "unit": "K",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "out0",
                "label": "Output",
                "quantity": "temperature-rate",
                "unit": "K/s",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Temperature rate",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "heatCapacityJPerK",
                "label": "Heat capacity",
                "unit": "J/K",
                "value": "900"
              },
              {
                "id": "conductanceWPerK",
                "label": "Ambient conductance",
                "unit": "W/K",
                "value": "1"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-thermal-rate/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "workflow:charge-thermal",
      "type": "Workflow",
      "label": "Inspect pack temperature",
      "properties": {
        "id": "charge-thermal",
        "title": "Inspect pack temperature",
        "kind": "protocol",
        "summary": "The separate Charge session can include a lumped thermal node.",
        "steps": [
          "Provide thermal mass and conductance.",
          "Compare two ambient temperatures."
        ],
        "example": "100 kJ/K thermal mass and 100 W/K conductance give a 1000 s no-source temperature-difference time constant.",
        "observe": "Temperature limits can pause charge; heater and mass are separate.",
        "limits": "One node does not resolve gradients, coolant geometry or runaway. Studio’s native charger instead uses external temperature.",
        "url": "https://design.lemonergy.com/",
        "label": "Open Design → Charge session",
        "evidence": [
          "js/charger.js"
        ]
      }
    },
    {
      "id": "workflow:native-battery-current-monitor",
      "type": "Workflow",
      "label": "Battery current monitor worked example",
      "properties": {
        "id": "native-battery-current-monitor",
        "title": "Battery current monitor worked example",
        "kind": "studio",
        "summary": "Reports each channel below/above its bounds and a combined fault.",
        "steps": [
          "Review the block inputs, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare the output channels with the numerical checks; change one input and run again."
        ],
        "example": "Use the defaults below with Channel measurements = [-2, 0, 3.1] A. At 0 s, Any fault is 1 true / false. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "Bounds are user-supplied. This comparator does not disconnect a circuit or diagnose a sensor failure. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-current-monitor",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-temperature-monitor",
      "type": "Workflow",
      "label": "Battery temperature monitor worked example",
      "properties": {
        "id": "native-battery-temperature-monitor",
        "title": "Battery temperature monitor worked example",
        "kind": "studio",
        "summary": "Reports each channel below/above its bounds and a combined fault.",
        "steps": [
          "Review the block inputs, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare the output channels with the numerical checks; change one input and run again."
        ],
        "example": "Use the defaults below with Channel measurements = [272, 298.15, 318.15] K. At 0 s, Any fault is 1 true / false. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "Bounds are user-supplied. This comparator does not disconnect a circuit or diagnose a sensor failure. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-temperature-monitor",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-voltage-monitor",
      "type": "Workflow",
      "label": "Battery voltage monitor worked example",
      "properties": {
        "id": "native-battery-voltage-monitor",
        "title": "Battery voltage monitor worked example",
        "kind": "studio",
        "summary": "Reports each channel below/above its bounds and a combined fault.",
        "steps": [
          "Review the block inputs, units and model limits.",
          "Open the Studio example and run its bundled model.",
          "Compare the output channels with the numerical checks; change one input and run again."
        ],
        "example": "Use the defaults below with Channel measurements = [3, 4, 4.3] V. At 0 s, Any fault is 1 true / false. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "Bounds are user-supplied. This comparator does not disconnect a circuit or diagnose a sensor failure. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-voltage-monitor",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-charge-envelope",
      "type": "Workflow",
      "label": "Charge-current envelope worked example",
      "properties": {
        "id": "native-battery-charge-envelope",
        "title": "Charge-current envelope worked example",
        "kind": "studio",
        "summary": "Selects the most restrictive cell voltage and temperature current limit.",
        "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 Cell voltages = [4, 4.05, 4.02] V, Cell temperatures = [298.15, 318.15, 300] K, Enable = 1 true / false. At 0 s, Allowed current magnitude is 1 A. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "The tables are supplied by the model author. Their synthetic defaults do not establish a safe charging or discharging envelope. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-charge-envelope",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-discharge-envelope",
      "type": "Workflow",
      "label": "Discharge-current envelope worked example",
      "properties": {
        "id": "native-battery-discharge-envelope",
        "title": "Discharge-current envelope worked example",
        "kind": "studio",
        "summary": "Selects the most restrictive cell voltage and temperature current limit.",
        "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 Cell voltages = [3.2, 3.1, 3.15] V, Cell temperatures = [298.15, 318.15, 300] K, Enable = 1 true / false. At 0 s, Allowed current magnitude is 2 A. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "The tables are supplied by the model author. Their synthetic defaults do not establish a safe charging or discharging envelope. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-discharge-envelope",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-coolant-controller",
      "type": "Workflow",
      "label": "Coolant flow controller worked example",
      "properties": {
        "id": "native-battery-coolant-controller",
        "title": "Coolant flow controller worked example",
        "kind": "studio",
        "summary": "Controls the hottest cooling channel or coldest heating channel with hysteresis.",
        "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 Cell temperatures = [300, 315, 310] K, Enable = 1 true / false. At 0 s, Coolant flow request is 0.1 kg/s. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "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.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-coolant-controller",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-heater-controller",
      "type": "Workflow",
      "label": "Battery heater controller worked example",
      "properties": {
        "id": "native-battery-heater-controller",
        "title": "Battery heater controller worked example",
        "kind": "studio",
        "summary": "Controls the hottest cooling channel or coldest heating channel with hysteresis.",
        "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 Cell temperatures = [275, 282, 283] K, Enable = 1 true / false. At 0 s, Heater power request is 10 W. Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "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.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-heater-controller",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "topic:topic-ratings",
      "type": "Topic",
      "label": "Capacity, energy, power and ratings",
      "properties": {
        "id": "topic-ratings",
        "name": "Capacity, energy, power and ratings",
        "lede": "The numbers that size a cell and let two cells be compared.",
        "context": "Separate nameplate ratings from test results.",
        "example": "5 Ah at 3.6 V gives 18 Wh nominally. Integrated measured terminal power may give a different result.",
        "lesson_url": "https://lemonergy.com/learn/fundamentals/capacity-and-c-rate/",
        "lesson_label": "Open capacity and C-rate"
      }
    },
    {
      "id": "term:lithium-plating",
      "type": "Term",
      "label": "Lithium plating",
      "properties": {
        "id": "lithium-plating",
        "name": "Lithium plating",
        "section": "topic-aging",
        "definition": "Lithium metal depositing on the negative-electrode surface instead of intercalating into it. It is promoted by charging at low temperature or high current.",
        "related": [
          "dendrite",
          "fast-charging",
          "intercalation",
          "np-ratio",
          "dead-lithium",
          "electrodeposition"
        ],
        "lesson": "fundamentals/battery-aging/#plating",
        "url": "https://lemonergy.com/learn/glossary/lithium-plating/",
        "mentions": []
      }
    },
    {
      "id": "term:arrhenius",
      "type": "Term",
      "label": "Arrhenius law",
      "properties": {
        "id": "arrhenius",
        "name": "Arrhenius law",
        "section": "topic-aging",
        "definition": "The rule that a rate constant is proportional to exp(−Ea/RT), so a thermally activated reaction speeds up steeply with temperature. Near room temperature many degradation reactions roughly double their rate for every +10 °C.",
        "formula": "k = A·exp(−Eₐ/RT)",
        "related": [
          "activation-energy",
          "calendar-aging",
          "operating-temperature",
          "accelerated-aging",
          "celsius-kelvin"
        ],
        "lesson": "fundamentals/battery-aging/#arrhenius",
        "example": {
          "title": "Compare reaction-rate factors",
          "text": "For an illustrative activation energy of 40 kJ/mol, increasing temperature from 25 °C to 35 °C multiplies the modeled rate by about 1.69. Convert both temperatures to kelvin before evaluating the exponential."
        },
        "notes": [
          "A reaction-rate factor alone is not a prediction of battery lifetime."
        ],
        "url": "https://lemonergy.com/learn/glossary/arrhenius/",
        "mentions": [
          "room-temperature"
        ]
      }
    },
    {
      "id": "term:thermal-management",
      "type": "Term",
      "label": "Thermal management",
      "properties": {
        "id": "thermal-management",
        "name": "Thermal management",
        "abbr": "TMS",
        "aka": [
          "battery thermal management system",
          "BTMS"
        ],
        "section": "topic-thermal",
        "definition": "Keeping cells in their comfortable range, roughly 15–35 °C, and within a few degrees of each other: liquid cooling plates, refrigerant plates or immersion for heat removal, and heaters or waste heat for warming before fast charging in the cold.",
        "related": [
          "cooling-plate",
          "thermal-interface-material",
          "operating-temperature",
          "heat-generation",
          "preconditioning",
          "temperature-sensor"
        ],
        "url": "https://lemonergy.com/learn/glossary/thermal-management/",
        "mentions": [
          "fast-charging"
        ]
      }
    },
    {
      "id": "term:datasheet",
      "type": "Term",
      "label": "Datasheet",
      "properties": {
        "id": "datasheet",
        "name": "Datasheet",
        "section": "topic-ratings",
        "definition": "The manufacturer’s specification sheet for a cell: nominal capacity, nominal voltage, voltage window, continuous and peak currents, operating temperatures, dimensions, mass and cycle life, each tied to the test conditions it was measured under.",
        "related": [
          "nominal-capacity",
          "nominal-voltage",
          "operating-temperature",
          "cycle-life",
          "iec-62620"
        ],
        "lesson": "fundamentals/battery-basics/#datasheet",
        "url": "https://lemonergy.com/learn/glossary/datasheet/",
        "mentions": [
          "voltage-window"
        ]
      }
    },
    {
      "id": "lesson:fundamentals/battery-aging/",
      "type": "Lesson",
      "label": "Lesson 4 · Battery aging",
      "properties": {
        "url": "https://lemonergy.com/learn/fundamentals/battery-aging/"
      }
    },
    {
      "id": "visual:arrhenius",
      "type": "Visual",
      "label": "Temperature and reaction rate",
      "properties": {
        "title": "Temperature and reaction rate",
        "summary": "Compare an activated process with its rate at 25 °C.",
        "readout": "At 25 °C: 1×. At 35 °C: 1.924×. At 45 °C: 3.554×.",
        "formula": "k(T)/k(T_ref) = exp[(Eₐ/R)(1/T_ref − 1/T)]",
        "note": "The equation uses kelvin. One activated process is represented, not lifetime.",
        "software": {
          "status": "implemented",
          "label": "Implemented in battery-core",
          "body": "arrhenius_factor returns a rate multiplier from temperature and activation energy. It does not predict cell lifetime.",
          "href": "../fundamentals/battery-aging/"
        },
        "html": "<figure class=\"visual-figure\"><figcaption>Relative reaction rate</figcaption><svg class=\"visual-chart\" viewBox=\"0 0 360 330\" role=\"img\" aria-labelledby=\"static-arrhenius-0-title static-arrhenius-0-desc\"><title id=\"static-arrhenius-0-title\">Relative reaction rate</title><desc id=\"static-arrhenius-0-desc\">Temperature (°C) versus Rate multiplier (×). Relative to 25 °C. 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\">2.18</text><text x=\"141\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">15</text><path d=\"M74,139h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"143\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">4.37</text><text x=\"208\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">30</text><path d=\"M74,89.5h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"93.5\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">6.55</text><text x=\"275\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">45</text><path d=\"M74,40h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"44\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">8.74</text><text x=\"342\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">60</text><path d=\"M74,40v198h268\" fill=\"none\" stroke=\"currentColor\" opacity=\".3\"/><polyline fill=\"none\" stroke=\"#a45b2b\" stroke-width=\"2.8\" points=\"74.00,234.42 76.23,234.28 78.47,234.12 80.70,233.97 82.93,233.80 85.17,233.63 87.40,233.46 89.63,233.27 91.87,233.09 94.10,232.89 96.33,232.69 98.57,232.48 100.80,232.26 103.03,232.03 105.27,231.80 107.50,231.56 109.73,231.31 111.97,231.05 114.20,230.78 116.43,230.50 118.67,230.22 120.90,229.92 123.13,229.61 125.37,229.29 127.60,228.97 129.83,228.63 132.07,228.28 134.30,227.91 136.53,227.54 138.77,227.15 141.00,226.75 143.23,226.33 145.47,225.91 147.70,225.46 149.93,225.01 152.17,224.54 154.40,224.05 156.63,223.55 158.87,223.03 161.10,222.49 163.33,221.94 165.57,221.37 167.80,220.78 170.03,220.17 172.27,219.54 174.50,218.90 176.73,218.23 178.97,217.54 181.20,216.83 183.43,216.10 185.67,215.34 187.90,214.56 190.13,213.76 192.37,212.94 194.60,212.08 196.83,211.21 199.07,210.30 201.30,209.37 203.53,208.41 205.77,207.42 208.00,206.40 210.23,205.35 212.47,204.27 214.70,203.16 216.93,202.01 219.17,200.83 221.40,199.62 223.63,198.37 225.87,197.09 228.10,195.76 230.33,194.40 232.57,193.00 234.80,191.56 237.03,190.08 239.27,188.55 241.50,186.99 243.73,185.38 245.97,183.72 248.20,182.01 250.43,180.26 252.67,178.46 254.90,176.61 257.13,174.71 259.37,172.75 261.60,170.74 263.83,168.68 266.07,166.56 268.30,164.38 270.53,162.14 272.77,159.85 275.00,157.49 277.23,155.06 279.47,152.57 281.70,150.02 283.93,147.40 286.17,144.70 288.40,141.94 290.63,139.10 292.87,136.19 295.10,133.20 297.33,130.13 299.57,126.99 301.80,123.76 304.03,120.45 306.27,117.05 308.50,113.57 310.73,110.00 312.97,106.33 315.20,102.57 317.43,98.72 319.67,94.77 321.90,90.72 324.13,86.57 326.37,82.32 328.60,77.96 330.83,73.49 333.07,68.91 335.30,64.21 337.53,59.40 339.77,54.48 342.00,49.43\"/><text transform=\"translate(208 303)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">Temperature (°C)</tspan></text><text transform=\"translate(20 139) rotate(-90)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">Rate multiplier (×)</tspan></text></svg><div class=\"visual-legend\"><span><i style=\"background:#a45b2b\"></i>Relative to 25 °C</span></div></figure>"
      }
    }
  ]
}
