{
  "node": {
    "id": "term:energy",
    "type": "Term",
    "label": "Energy",
    "properties": {
      "id": "energy",
      "name": "Energy",
      "section": "topic-units",
      "definition": "What a battery stores and delivers: the integral of power over time, in watt-hours or joules. It is capacity times voltage, which is why two cells with equal ampere-hours can hold different energy.",
      "formula": "E = ∫ V·I dt",
      "unit": "Wh",
      "related": [
        "watt-hour",
        "nominal-energy",
        "energy-density"
      ],
      "lesson": "fundamentals/capacity-and-c-rate/#energy",
      "example": {
        "title": "Integrate a changing power trace",
        "text": "A load that draws 40 W for 15 min and then 20 W for 30 min uses 20 Wh in total. Add the area under each part of the power-versus-time trace."
      },
      "url": "https://lemonergy.com/learn/glossary/energy/",
      "mentions": []
    }
  },
  "edges": [
    {
      "id": "edge:usesBlock/term:energy/block:body-inertia",
      "source": "term:energy",
      "target": "block:body-inertia",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:energy/block:charging-policy",
      "source": "term:energy",
      "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:energy/block:edge-cooling-plate",
      "source": "term:energy",
      "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:energy/block:electrothermal-battery",
      "source": "term:energy",
      "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:energy/block:energy-dispatch",
      "source": "term:energy",
      "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:energy/block:mutual-inductor",
      "source": "term:energy",
      "target": "block:mutual-inductor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:energy/block:parallel-cooling-plate",
      "source": "term:energy",
      "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:energy/block:phase-change-mass",
      "source": "term:energy",
      "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:energy/block:signal-integrator",
      "source": "term:energy",
      "target": "block:signal-integrator",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:energy/block:thermal-mass",
      "source": "term:energy",
      "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:energy/block:u-cooling-plate",
      "source": "term:energy",
      "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:energy/block:variable-gap-capacitor",
      "source": "term:energy",
      "target": "block:variable-gap-capacitor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:energy/block:battery-energy-counter",
      "source": "term:energy",
      "target": "block:battery-energy-counter",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:energy/block:battery-soe-adaptive-ekf-variable-capacity",
      "source": "term:energy",
      "target": "block:battery-soe-adaptive-ekf-variable-capacity",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:energy/block:battery-soe-ekf-variable-capacity",
      "source": "term:energy",
      "target": "block:battery-soe-ekf-variable-capacity",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:energy/block:battery-supercapacitor",
      "source": "term:energy",
      "target": "block:battery-supercapacitor",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usesBlock/term:energy/block:battery-variable-energy-counter",
      "source": "term:energy",
      "target": "block:battery-variable-energy-counter",
      "type": "usesBlock",
      "properties": {
        "sourceFile": "studio-help-catalog.json",
        "scope": "Declared interface quantity or semantic operation; not a numerical validation claim"
      }
    },
    {
      "id": "edge:usedIn/term:energy/workflow:nominal-energy",
      "source": "term:energy",
      "target": "workflow:nominal-energy",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:energy/workflow:native-battery-charge-counter",
      "source": "term:energy",
      "target": "workflow:native-battery-charge-counter",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:energy/workflow:native-battery-variable-charge-counter",
      "source": "term:energy",
      "target": "workflow:native-battery-variable-charge-counter",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:energy/workflow:native-battery-energy-counter",
      "source": "term:energy",
      "target": "workflow:native-battery-energy-counter",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:usedIn/term:energy/workflow:native-battery-variable-energy-counter",
      "source": "term:energy",
      "target": "workflow:native-battery-variable-energy-counter",
      "type": "usedIn",
      "properties": {
        "sourceFile": "wiki-blocks.json"
      }
    },
    {
      "id": "edge:belongsTo/term:energy/topic:topic-units",
      "source": "term:energy",
      "target": "topic:topic-units",
      "type": "belongsTo",
      "properties": {
        "sourceFile": "terms.json"
      }
    },
    {
      "id": "edge:relatedTo/term:energy/term:watt-hour",
      "source": "term:energy",
      "target": "term:watt-hour",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:energy/term:nominal-energy",
      "source": "term:energy",
      "target": "term:nominal-energy",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:relatedTo/term:energy/term:energy-density",
      "source": "term:energy",
      "target": "term:energy-density",
      "type": "relatedTo",
      "properties": {
        "sourceFile": "terms.json",
        "meaning": "Related context; not a causal claim"
      }
    },
    {
      "id": "edge:explainedIn/term:energy/lesson:fundamentals/capacity-and-c-rate/",
      "source": "term:energy",
      "target": "lesson:fundamentals/capacity-and-c-rate/",
      "type": "explainedIn",
      "properties": {
        "sourceFile": "terms.json",
        "url": "https://lemonergy.com/learn/fundamentals/capacity-and-c-rate/#energy"
      }
    },
    {
      "id": "edge:illustratedBy/term:energy/visual:energy",
      "source": "term:energy",
      "target": "visual:energy",
      "type": "illustratedBy",
      "properties": {
        "sourceFile": "visual-pages.json"
      }
    },
    {
      "id": "edge:cites/term:energy/reference:bipm-si",
      "source": "term:energy",
      "target": "reference:bipm-si",
      "type": "cites",
      "properties": {
        "sourceFile": "wiki-references.json",
        "scope": "direct technical reference"
      }
    }
  ],
  "neighbors": [
    {
      "id": "block:body-inertia",
      "type": "Block",
      "label": "Rigid body and inertia",
      "properties": {
        "id": "body-inertia",
        "kind": "studio",
        "name": "Rigid body and inertia",
        "summary": "Represents a moving rigid body with mass and principal inertias; forces and torques change its motion.",
        "behavior": "Represents a moving rigid body with mass and principal inertias; forces and torques change its motion.",
        "documentationSlug": "body-inertia",
        "referenceOnly": true,
        "ports": [
          {
            "name": "frame",
            "direction": "conserving",
            "unit": "frame",
            "description": "Rigid-body frame"
          },
          {
            "name": "energy",
            "direction": "output",
            "unit": "J",
            "description": "Directed output available to compatible consumers: energy."
          },
          {
            "name": "quaternion Norm",
            "direction": "output",
            "unit": "1",
            "description": "Directed output available to compatible consumers: quaternion Norm."
          }
        ],
        "parameters": [
          {
            "key": "xM",
            "label": "xM",
            "unit": "m",
            "default": 0,
            "description": "Declared authoring field: xM.",
            "min": -1000000000,
            "max": 1000000000
          },
          {
            "key": "yM",
            "label": "yM",
            "unit": "m",
            "default": 0,
            "description": "Declared authoring field: yM.",
            "min": -1000000000,
            "max": 1000000000
          },
          {
            "key": "zM",
            "label": "zM",
            "unit": "m",
            "default": 0,
            "description": "Declared authoring field: zM.",
            "min": -1000000000,
            "max": 1000000000
          },
          {
            "key": "qw",
            "label": "qw",
            "unit": "1",
            "default": 1,
            "description": "Declared authoring field: qw.",
            "min": -1,
            "max": 1
          },
          {
            "key": "qx",
            "label": "qx",
            "unit": "1",
            "default": 0,
            "description": "Declared authoring field: qx.",
            "min": -1,
            "max": 1
          },
          {
            "key": "qy",
            "label": "qy",
            "unit": "1",
            "default": 0,
            "description": "Declared authoring field: qy.",
            "min": -1,
            "max": 1
          },
          {
            "key": "qz",
            "label": "qz",
            "unit": "1",
            "default": 0,
            "description": "Declared authoring field: qz.",
            "min": -1,
            "max": 1
          },
          {
            "key": "massKg",
            "label": "massKg",
            "unit": "kg",
            "default": 1,
            "description": "Declared authoring field: massKg.",
            "min": 1e-09,
            "max": 1000000000000
          },
          {
            "key": "ixKgM2",
            "label": "ixKgM2",
            "unit": "kg m2",
            "default": 1,
            "description": "Declared authoring field: ixKgM2.",
            "min": 1e-09,
            "max": 1000000000000
          },
          {
            "key": "iyKgM2",
            "label": "iyKgM2",
            "unit": "kg m2",
            "default": 1,
            "description": "Declared authoring field: iyKgM2.",
            "min": 1e-09,
            "max": 1000000000000
          },
          {
            "key": "izKgM2",
            "label": "izKgM2",
            "unit": "kg m2",
            "default": 1,
            "description": "Declared authoring field: izKgM2.",
            "min": 1e-09,
            "max": 1000000000000
          },
          {
            "key": "vxMS",
            "label": "vxMS",
            "unit": "m/s",
            "default": 0,
            "description": "Declared authoring field: vxMS.",
            "min": -1000000,
            "max": 1000000
          },
          {
            "key": "vyMS",
            "label": "vyMS",
            "unit": "m/s",
            "default": 0,
            "description": "Declared authoring field: vyMS.",
            "min": -1000000,
            "max": 1000000
          },
          {
            "key": "vzMS",
            "label": "vzMS",
            "unit": "m/s",
            "default": 0,
            "description": "Declared authoring field: vzMS.",
            "min": -1000000,
            "max": 1000000
          },
          {
            "key": "wxRadS",
            "label": "wxRadS",
            "unit": "rad/s",
            "default": 0,
            "description": "Declared authoring field: wxRadS.",
            "min": -1000000,
            "max": 1000000
          },
          {
            "key": "wyRadS",
            "label": "wyRadS",
            "unit": "rad/s",
            "default": 0,
            "description": "Declared authoring field: wyRadS.",
            "min": -1000000,
            "max": 1000000
          },
          {
            "key": "wzRadS",
            "label": "wzRadS",
            "unit": "rad/s",
            "default": 0,
            "description": "Declared authoring field: wzRadS.",
            "min": -1000000,
            "max": 1000000
          },
          {
            "key": "gravityMS2",
            "label": "gravityMS2",
            "unit": "m/s2",
            "default": 9.80665,
            "description": "Declared authoring field: gravityMS2.",
            "min": 0,
            "max": 1000000
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "body-inertia",
        "implementationId": "body-inertia",
        "url": "https://lemonergy.com/learn/glossary/blocks/body-inertia/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/body-inertia/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "body-inertia",
          "namespace": "physical",
          "slug": "body-inertia",
          "canonicalSlug": "body-inertia",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "body-inertia",
            "name": "Rigid body and inertia",
            "domain": "mechanical",
            "family": "body",
            "operation": "Represents a moving rigid body with mass and principal inertias; forces and torques change its motion.",
            "mechanism": [
              "Force and torque",
              "Mass and inertia",
              "Position and orientation"
            ],
            "ports": [
              {
                "id": "frame",
                "domain": "frame",
                "kind": "conserving",
                "label": "Rigid-body frame",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "world-frame",
                "label": "World frame"
              },
              {
                "type": "force-torque",
                "label": "External force and torque"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M60 25L100 5L145 25L100 48Z M60 25V60L100 80L145 60V25M100 48V80"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "energy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "energy",
                "unit": "J"
              },
              {
                "id": "quaternionNorm",
                "quantity": "dimensionless",
                "declared": true,
                "consumers": [],
                "label": "quaternion Norm",
                "unit": "1"
              }
            ],
            "parameters": [
              {
                "id": "xM",
                "default": 0,
                "unit": "m",
                "min": -1000000000,
                "max": 1000000000,
                "value": 0
              },
              {
                "id": "yM",
                "default": 0,
                "unit": "m",
                "min": -1000000000,
                "max": 1000000000,
                "value": 0
              },
              {
                "id": "zM",
                "default": 0,
                "unit": "m",
                "min": -1000000000,
                "max": 1000000000,
                "value": 0
              },
              {
                "id": "qw",
                "default": 1,
                "unit": "1",
                "min": -1,
                "max": 1,
                "value": 1
              },
              {
                "id": "qx",
                "default": 0,
                "unit": "1",
                "min": -1,
                "max": 1,
                "value": 0
              },
              {
                "id": "qy",
                "default": 0,
                "unit": "1",
                "min": -1,
                "max": 1,
                "value": 0
              },
              {
                "id": "qz",
                "default": 0,
                "unit": "1",
                "min": -1,
                "max": 1,
                "value": 0
              },
              {
                "id": "massKg",
                "default": 1,
                "unit": "kg",
                "min": 1e-09,
                "max": 1000000000000,
                "value": 1
              },
              {
                "id": "ixKgM2",
                "default": 1,
                "unit": "kg m2",
                "min": 1e-09,
                "max": 1000000000000,
                "value": 1
              },
              {
                "id": "iyKgM2",
                "default": 1,
                "unit": "kg m2",
                "min": 1e-09,
                "max": 1000000000000,
                "value": 1
              },
              {
                "id": "izKgM2",
                "default": 1,
                "unit": "kg m2",
                "min": 1e-09,
                "max": 1000000000000,
                "value": 1
              },
              {
                "id": "vxMS",
                "default": 0,
                "unit": "m/s",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "vyMS",
                "default": 0,
                "unit": "m/s",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "vzMS",
                "default": 0,
                "unit": "m/s",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "wxRadS",
                "default": 0,
                "unit": "rad/s",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "wyRadS",
                "default": 0,
                "unit": "rad/s",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "wzRadS",
                "default": 0,
                "unit": "rad/s",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "gravityMS2",
                "default": 9.80665,
                "unit": "m/s2",
                "min": 0,
                "max": 1000000,
                "value": 9.80665
              }
            ]
          }
        }
      }
    },
    {
      "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:mutual-inductor",
      "type": "Block",
      "label": "Coupled inductors",
      "properties": {
        "id": "mutual-inductor",
        "name": "Coupled inductors",
        "kind": "studio",
        "summary": "Symmetric positive-definite inductance matrix; no saturation, hysteresis or winding losses",
        "behavior": "Conserving component solved simultaneously with the connected network. Symmetric positive-definite inductance matrix; no saturation, hysteresis or winding losses",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "s",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "t",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "voltageSecondary",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage on the secondary port measurement from the conserving simulation."
          },
          {
            "name": "currentSecondary",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current on the secondary port measurement from the conserving simulation."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "primaryInductanceH",
            "label": "Primary self-inductance",
            "unit": "H",
            "default": 1,
            "description": "Self-inductance of the primary winding.",
            "min": 1e-09,
            "max": 1000000000
          },
          {
            "key": "secondaryInductanceH",
            "label": "Secondary self-inductance",
            "unit": "H",
            "default": 1,
            "description": "Self-inductance of the secondary winding.",
            "min": 1e-09,
            "max": 1000000000
          },
          {
            "key": "coupling",
            "label": "Magnetic coupling coefficient",
            "unit": "fraction",
            "default": 0.5,
            "description": "Signed mutual coupling; its magnitude must remain below one.",
            "min": -0.999999,
            "max": 0.999999
          },
          {
            "key": "initialPrimaryCurrentA",
            "label": "Initial primary current",
            "unit": "A",
            "default": 0,
            "description": "Current entering the primary winding at initialization.",
            "min": -1000000,
            "max": 1000000
          },
          {
            "key": "initialSecondaryCurrentA",
            "label": "Initial secondary current",
            "unit": "A",
            "default": 0,
            "description": "Current entering the secondary winding at initialization.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "Vp = Lp dIp/dt + M dIs/dt",
          "Vs = M dIp/dt + Ls dIs/dt",
          "M = k sqrt(Lp Ls)"
        ],
        "example": {
          "title": "Coupled inductors worked example",
          "text": "Editable first-party network. supply: voltageV=1; short: voltageV=0. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-mutual-inductor",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "primaryInductanceH",
              "label": "Primary self-inductance",
              "value": 1,
              "unit": "H"
            },
            {
              "port": "secondaryInductanceH",
              "label": "Secondary self-inductance",
              "value": 1,
              "unit": "H"
            },
            {
              "port": "coupling",
              "label": "Magnetic coupling coefficient",
              "value": 0.5,
              "unit": "fraction"
            },
            {
              "port": "initialPrimaryCurrentA",
              "label": "Initial primary current",
              "value": 0,
              "unit": "A"
            }
          ],
          "checks": [
            {
              "port": "target/voltageSecondary",
              "label": "voltageSecondary",
              "atS": 1,
              "value": 0,
              "unit": "V",
              "tolerance": 1e-10
            },
            {
              "port": "target/currentSecondary",
              "label": "currentSecondary",
              "atS": 1,
              "value": -0.666666667,
              "unit": "A",
              "tolerance": 6.666666666666666e-07
            },
            {
              "port": "target/current",
              "label": "current",
              "atS": 1,
              "value": 1.33333333,
              "unit": "A",
              "tolerance": 1.3333333333333328e-06
            }
          ]
        },
        "limits": [
          "Symmetric positive-definite inductance matrix; no saturation, hysteresis or winding losses",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-magnetic"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-mutual-inductor"
        ],
        "type": "mutual-inductor",
        "implementationId": "mutual-inductor",
        "url": "https://lemonergy.com/learn/glossary/blocks/mutual-inductor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/mutual-inductor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-mutual-inductor"
          ]
        },
        "studioHelp": {
          "type": "mutual-inductor",
          "namespace": "physical",
          "slug": "mutual-inductor",
          "canonicalSlug": "mutual-inductor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "mutual-inductor",
            "name": "Coupled inductors",
            "domain": "electrical",
            "family": "transformer",
            "operation": "Couples two inductor currents through a positive-definite mutual inductance matrix.",
            "mechanism": [
              "Primary current",
              "Coupled magnetic storage",
              "Secondary current"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "s",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Secondary positive terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "t",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Secondary negative terminal",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "inductor",
                "label": "Inductor"
              },
              {
                "type": "ideal-transformer",
                "label": "Ideal transformer"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 15H55C85 15 85 35 55 35C85 35 85 55 55 55C85 55 85 75 55 75H10M95 10V75M105 10V75M190 15H145C115 15 115 35 145 35C115 35 115 55 145 55C115 55 115 75 145 75H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "voltageSecondary",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage Secondary",
                "unit": "V"
              },
              {
                "id": "currentSecondary",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current Secondary",
                "unit": "A"
              },
              {
                "id": "powerSecondary",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power Secondary",
                "unit": "W"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              }
            ],
            "parameters": [
              {
                "id": "primaryInductanceH",
                "default": 1,
                "unit": "H",
                "min": 1e-09,
                "max": 1000000000,
                "value": 1
              },
              {
                "id": "secondaryInductanceH",
                "default": 1,
                "unit": "H",
                "min": 1e-09,
                "max": 1000000000,
                "value": 1
              },
              {
                "id": "coupling",
                "default": 0.5,
                "unit": "fraction",
                "min": -0.999999,
                "max": 0.999999,
                "value": 0.5
              },
              {
                "id": "initialPrimaryCurrentA",
                "default": 0,
                "unit": "A",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              },
              {
                "id": "initialSecondaryCurrentA",
                "default": 0,
                "unit": "A",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block: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:signal-integrator",
      "type": "Block",
      "label": "Physical signal integrator",
      "properties": {
        "id": "signal-integrator",
        "kind": "studio",
        "name": "Physical signal integrator",
        "summary": "Accumulates a typed rate over native simulation time, starting from its configured initial value.",
        "behavior": "Accumulates a typed rate over native simulation time, starting from its configured initial value.",
        "documentationSlug": "signal-integrator",
        "referenceOnly": true,
        "ports": [
          {
            "name": "Input signal",
            "direction": "input",
            "unit": "W",
            "description": "Input signal is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection."
          },
          {
            "name": "Typed signal output",
            "direction": "output",
            "unit": "J",
            "description": "Directed output available to compatible consumers: Typed signal output."
          }
        ],
        "parameters": [
          {
            "key": "initial",
            "label": "initial",
            "unit": "declared output quantity",
            "default": 0,
            "description": "Declared authoring field: initial.",
            "min": -1000000000000000,
            "max": 1000000000000000
          },
          {
            "key": "stateScale",
            "label": "stateScale",
            "unit": "characteristic output magnitude",
            "default": 1000000,
            "description": "Declared authoring field: stateScale.",
            "min": 1e-09,
            "max": 1000000000000000
          },
          {
            "key": "rateScale",
            "label": "rateScale",
            "unit": "characteristic rate magnitude",
            "default": 1000,
            "description": "Declared authoring field: rateScale.",
            "min": 1e-09,
            "max": 1000000000000
          }
        ],
        "equations": [],
        "example": {
          "title": "Use this authoring component",
          "text": "Choose this component in the Studio library and configure its declared interface. This reference describes the authoring contract; it does not claim a standalone numerical validation or a measured result.",
          "url": "https://design.lemonergy.com/cosim",
          "label": "Open Studio"
        },
        "limits": [
          "The symbolic diagram describes the component and its declared interface. It is not a solved circuit or simulated output.",
          "Configured parameters and model connections determine the result. Check the complete model before interpreting its outputs."
        ],
        "evidence": [
          "docs/glossary/studio-help-catalog.json"
        ],
        "caseIds": [],
        "sourceRepository": "battery-design",
        "sourceRevision": "0a28f1a0a75a0447903b868cbcc734133a77a847",
        "reviewed": "2026-10-30",
        "type": "signal-integrator",
        "implementationId": "signal-integrator",
        "url": "https://lemonergy.com/learn/glossary/blocks/signal-integrator/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/signal-integrator/",
        "sourceFile": "studio-help-catalog.json",
        "studioHelp": {
          "type": "signal-integrator",
          "namespace": "physical",
          "slug": "signal-integrator",
          "canonicalSlug": "signal-integrator",
          "existing": false,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "signal-integrator",
            "name": "Physical signal integrator",
            "domain": "signal",
            "family": "controller",
            "operation": "Accumulates a typed rate over native simulation time, starting from its configured initial value.",
            "mechanism": [
              "Typed rate input",
              "Native time integration",
              "Accumulated quantity"
            ],
            "ports": [],
            "terms": [
              {
                "type": "signal-filter",
                "label": "Physical signal filter"
              },
              {
                "type": "physical-chart",
                "label": "Physical-network sampled chart"
              }
            ],
            "symbol": [
              {
                "tag": "rect",
                "attrs": {
                  "x": 55,
                  "y": 15,
                  "width": 90,
                  "height": 50,
                  "rx": 3
                }
              },
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H55M145 40H190M75 50L90 30L105 50L125 25"
                }
              }
            ],
            "selection": {},
            "commands": [
              {
                "id": "input",
                "label": "Input signal",
                "quantity": "power",
                "unit": "W",
                "active": true,
                "summary": "Input signal is a directed power input to this component, expressed in W. Its binding supplies information; it is not a conserving connection.",
                "source": null,
                "target": null
              }
            ],
            "outputs": [
              {
                "id": "out",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "Typed signal output",
                "unit": "J"
              }
            ],
            "parameters": [
              {
                "id": "initial",
                "default": 0,
                "unit": "declared output quantity",
                "min": -1000000000000000,
                "max": 1000000000000000,
                "value": 0
              },
              {
                "id": "stateScale",
                "default": 1000000,
                "unit": "characteristic output magnitude",
                "min": 1e-09,
                "max": 1000000000000000,
                "value": 1000000
              },
              {
                "id": "rateScale",
                "default": 1000,
                "unit": "characteristic rate magnitude",
                "min": 1e-09,
                "max": 1000000000000,
                "value": 1000
              }
            ]
          }
        }
      }
    },
    {
      "id": "block: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: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:variable-gap-capacitor",
      "type": "Block",
      "label": "Electromechanical variable-gap capacitor",
      "properties": {
        "id": "variable-gap-capacitor",
        "name": "Electromechanical variable-gap capacitor",
        "kind": "studio",
        "summary": "Parallel-plate field energy and attractive force; a-minus-b motion closes the gap. No fringing or contact model; gap closure refuses.",
        "behavior": "Conserving component solved simultaneously with the connected network. Parallel-plate field energy and attractive force; a-minus-b motion closes the gap. No fringing or contact model; gap closure refuses.",
        "ports": [
          {
            "name": "p",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "n",
            "direction": "terminal",
            "unit": "V; A",
            "description": "electrical conserving connection; voltage across and current through the connected branch."
          },
          {
            "name": "a",
            "direction": "terminal",
            "unit": "m; m/s; N",
            "description": "translational conserving connection; shared mechanical position or speed with balanced effort."
          },
          {
            "name": "b",
            "direction": "terminal",
            "unit": "m; m/s; N",
            "description": "translational conserving connection; shared mechanical position or speed with balanced effort."
          },
          {
            "name": "current",
            "direction": "output",
            "unit": "A",
            "description": "Recorded current measurement from the conserving simulation."
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Recorded voltage measurement from the conserving simulation."
          },
          {
            "name": "storedEnergy",
            "direction": "output",
            "unit": "J",
            "description": "Recorded stored energy measurement from the conserving simulation."
          }
        ],
        "parameters": [
          {
            "key": "areaM2",
            "label": "Exchange area",
            "unit": "m2",
            "default": 0.01,
            "description": "Area used by the declared heat-transfer or parallel-plate field equation.",
            "min": 1e-12,
            "max": 1000000
          },
          {
            "key": "permittivityFm",
            "label": "Permittivity",
            "unit": "F/m",
            "default": 8.8541878128e-12,
            "description": "Permittivity of the uniform material between the capacitor plates.",
            "min": 1e-15,
            "max": 1
          },
          {
            "key": "initialGapM",
            "label": "Reference plate separation",
            "unit": "m",
            "default": 0.001,
            "description": "Plate separation before relative mechanical displacement is subtracted.",
            "min": 1e-09,
            "max": 1000
          },
          {
            "key": "minimumGapM",
            "label": "Minimum plate separation",
            "unit": "m",
            "default": 1e-06,
            "description": "Separation at which the model refuses further motion because contact is not modeled.",
            "min": 1e-12,
            "max": 1000
          },
          {
            "key": "initialVoltageV",
            "label": "Initial voltage",
            "unit": "V",
            "default": 0,
            "description": "Requested initial electrical voltage for the declared storage or target.",
            "min": -1000000,
            "max": 1000000
          }
        ],
        "equations": [
          "gap = initial separation − (xa − xb)",
          "C = permittivity × area / gap",
          "V = q/C; I = dq/dt",
          "F = q²/(2 × permittivity × area)"
        ],
        "example": {
          "title": "Electromechanical variable-gap capacitor worked example",
          "text": "Editable first-party network. mass: massKg=0.001; target: initialVoltageV=10. Checks below were verified in the native execution engine.",
          "url": "https://design.lemonergy.com/cosim.html?example=physical-variable-gap-capacitor",
          "label": "Open Studio example",
          "inputs": [
            {
              "port": "areaM2",
              "label": "Exchange area",
              "value": 0.01,
              "unit": "m2"
            },
            {
              "port": "permittivityFm",
              "label": "Permittivity",
              "value": 8.8541878128e-12,
              "unit": "F/m"
            },
            {
              "port": "initialGapM",
              "label": "Reference plate separation",
              "value": 0.001,
              "unit": "m"
            },
            {
              "port": "minimumGapM",
              "label": "Minimum plate separation",
              "value": 1e-06,
              "unit": "m"
            }
          ],
          "checks": [
            {
              "port": "target/current",
              "label": "current",
              "atS": 0.01,
              "value": -1.12103877e-42,
              "unit": "A",
              "tolerance": 1e-10
            },
            {
              "port": "target/voltage",
              "label": "voltage",
              "atS": 0.01,
              "value": 9.99767578,
              "unit": "V",
              "tolerance": 9.997675775699118e-06
            },
            {
              "port": "target/storedEnergy",
              "label": "storedEnergy",
              "atS": 0.01,
              "value": 4.42606495e-09,
              "unit": "J",
              "tolerance": 1e-10
            }
          ]
        },
        "limits": [
          "Parallel-plate field energy and attractive force; a-minus-b motion closes the gap. No fringing or contact model; gap closure refuses.",
          "Demonstration parameters are not calibrated hardware data. Singular or incompatible ideal constraints and unsupported state ranges stop the run."
        ],
        "references": [
          "physical-capacitor",
          "physical-circuit"
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-variable-gap-capacitor"
        ],
        "type": "variable-gap-capacitor",
        "implementationId": "variable-gap-capacitor",
        "url": "https://lemonergy.com/learn/glossary/blocks/variable-gap-capacitor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/variable-gap-capacitor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=physical-variable-gap-capacitor"
          ]
        },
        "studioHelp": {
          "type": "variable-gap-capacitor",
          "namespace": "physical",
          "slug": "variable-gap-capacitor",
          "canonicalSlug": "variable-gap-capacitor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "kind": "component",
            "componentId": "reference",
            "type": "variable-gap-capacitor",
            "name": "Electromechanical variable-gap capacitor",
            "domain": "electrical",
            "family": "capacitor",
            "operation": "Couples stored electric-field energy to attractive mechanical force; relative a-minus-b motion closes the modeled plate gap.",
            "mechanism": [
              "Electrical field",
              "Variable plate gap",
              "Attractive force"
            ],
            "ports": [
              {
                "id": "p",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Positive voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "n",
                "domain": "electrical",
                "kind": "conserving",
                "label": "Negative voltage-reference terminal",
                "net": null,
                "peers": []
              },
              {
                "id": "a",
                "domain": "translational",
                "kind": "conserving",
                "label": "Linear side A",
                "net": null,
                "peers": []
              },
              {
                "id": "b",
                "domain": "translational",
                "kind": "conserving",
                "label": "Linear side B",
                "net": null,
                "peers": []
              }
            ],
            "terms": [
              {
                "type": "capacitor",
                "label": "Capacitor"
              },
              {
                "type": "linear-mass",
                "label": "Translational mass"
              }
            ],
            "symbol": [
              {
                "tag": "path",
                "attrs": {
                  "d": "M10 40H85M85 10V70M115 10V70M115 40H190"
                }
              }
            ],
            "selection": {},
            "commands": [],
            "outputs": [
              {
                "id": "voltage",
                "quantity": "voltage",
                "declared": true,
                "consumers": [],
                "label": "voltage",
                "unit": "V"
              },
              {
                "id": "current",
                "quantity": "current",
                "declared": true,
                "consumers": [],
                "label": "current",
                "unit": "A"
              },
              {
                "id": "power",
                "quantity": "power",
                "declared": true,
                "consumers": [],
                "label": "power",
                "unit": "W"
              },
              {
                "id": "gap",
                "quantity": "length",
                "declared": true,
                "consumers": [],
                "label": "gap",
                "unit": "m"
              },
              {
                "id": "force",
                "quantity": "force",
                "declared": true,
                "consumers": [],
                "label": "force",
                "unit": "N"
              },
              {
                "id": "storedEnergy",
                "quantity": "energy",
                "declared": true,
                "consumers": [],
                "label": "stored Energy",
                "unit": "J"
              }
            ],
            "parameters": [
              {
                "id": "areaM2",
                "default": 0.01,
                "unit": "m2",
                "min": 1e-12,
                "max": 1000000,
                "value": 0.01
              },
              {
                "id": "permittivityFm",
                "default": 8.8541878128e-12,
                "unit": "F/m",
                "min": 1e-15,
                "max": 1,
                "value": 8.8541878128e-12
              },
              {
                "id": "initialGapM",
                "default": 0.001,
                "unit": "m",
                "min": 1e-09,
                "max": 1000,
                "value": 0.001
              },
              {
                "id": "minimumGapM",
                "default": 1e-06,
                "unit": "m",
                "min": 1e-12,
                "max": 1000,
                "value": 1e-06
              },
              {
                "id": "initialVoltageV",
                "default": 0,
                "unit": "V",
                "min": -1000000,
                "max": 1000000,
                "value": 0
              }
            ]
          }
        }
      }
    },
    {
      "id": "block:battery-energy-counter",
      "type": "Block",
      "label": "Energy counter",
      "properties": {
        "id": "battery-energy-counter",
        "name": "Energy counter",
        "kind": "studio",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "behavior": "Integrates signed discharge current or power over elapsed sample time. Charge efficiency applies during charging. The initial sample has zero elapsed time. Variable-capacity variants preserve the current fraction when capacity changes and report the resulting amount revaluation separately. Reset restores the initial fraction without integrating that event.",
        "ports": [
          {
            "name": "rate",
            "direction": "input",
            "unit": "W",
            "description": "Signed battery power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of energy; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "throughput",
            "direction": "output",
            "unit": "J",
            "description": "Net throughput (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "revaluation",
            "direction": "output",
            "unit": "J",
            "description": "Capacity revaluation (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "boundary",
            "direction": "output",
            "unit": "J",
            "description": "Boundary amount (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Energy capacity (J)",
            "unit": "J",
            "default": 7200,
            "description": "Energy capacity (J). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOE (0–1)",
            "unit": "0–1",
            "default": 0.8,
            "description": "Initial SOE (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "chargeEfficiency",
            "label": "Charging efficiency (0–1)",
            "unit": "0–1",
            "default": 1,
            "description": "Charging efficiency (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "amount[k] = amount[k-1] - effectiveRate[k] * elapsedTime",
          "fraction = clamp(amount / capacity, 0, 1)",
          "charge capacity in coulombs = 3600 * capacityAh"
        ],
        "example": {
          "title": "Energy counter worked example",
          "text": "Use the defaults below with Signed battery power = 2 W, Reset = 0 true / false. At 0 s, State of energy is 0.8 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-energy-counter",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            },
            {
              "port": "throughput",
              "atS": 0,
              "value": 0,
              "tolerance": 0,
              "label": "Net throughput (J)",
              "unit": "J"
            },
            {
              "port": "fraction",
              "atS": 1,
              "value": 0.7997222222222222,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "rate",
              "label": "Signed battery power",
              "value": 2,
              "unit": "W"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            }
          ]
        },
        "limits": [
          "Current or power bias accumulates. Fraction clipping is reported as a boundary amount; it does not make the connected plant respect that boundary. Energy variants need capacity in joules.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-energy-counter"
        ],
        "exampleTraces": [
          {
            "id": "battery-energy-counter",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-energy-counter.json?v=41d01f400707",
            "title": "Energy counter recorded example",
            "exampleId": "block-battery-energy-counter",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 4,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-energy-counter",
        "implementationId": "battery-energy-counter",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-energy-counter/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-energy-counter/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-energy-counter"
          ]
        },
        "studioHelp": {
          "type": "battery-energy-counter",
          "namespace": "signal",
          "slug": "signal-block-battery-energy-counter",
          "canonicalSlug": "battery-energy-counter",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Energy counter",
            "label": "Energy counter",
            "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
            "details": [
              "Block type: battery-energy-counter.",
              "2 declared inputs and 4 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Energy counter",
              "caption": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately."
            },
            "inputs": [
              {
                "id": "rate",
                "label": "Signed battery power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of energy",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "throughput",
                "label": "Net throughput (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "revaluation",
                "label": "Capacity revaluation (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "boundary",
                "label": "Boundary amount (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.8,\"chargeEfficiency\":1}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-energy-counter/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-soe-adaptive-ekf-variable-capacity",
      "type": "Block",
      "label": "SOE adaptive EKF with capacity input",
      "properties": {
        "id": "battery-soe-adaptive-ekf-variable-capacity",
        "name": "SOE adaptive EKF with capacity input",
        "kind": "studio",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
        "behavior": "Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "power",
            "direction": "input",
            "unit": "W",
            "description": "Signed battery power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed battery current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage measurement valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "capacity",
            "direction": "input",
            "unit": "J",
            "description": "Energy capacity (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of energy; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Posterior fraction variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Energy capacity (J)",
            "unit": "J",
            "default": 7200,
            "description": "Energy capacity (J). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOE (0–1)",
            "unit": "0–1",
            "default": 0.6,
            "description": "Initial SOE (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.04,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0.1,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "OCV table [energy fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "OCV table [energy fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R"
        ],
        "example": {
          "title": "SOE adaptive EKF with capacity input worked example",
          "text": "Use the defaults below with Signed battery power = 0 W, Signed battery current = 0 A, Measured voltage = 3.8 V, Voltage measurement valid = 1 true / false, Reset = 0 true / false, Energy capacity (J) = 7200 J. At 0 s, State of energy is 0.76 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-soe-adaptive-ekf-variable-capacity",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.76,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.008,
              "tolerance": 1e-08,
              "label": "Posterior fraction variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "power",
              "label": "Signed battery power",
              "value": 0,
              "unit": "W"
            },
            {
              "port": "current",
              "label": "Signed battery current",
              "value": 0,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage measurement valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            },
            {
              "port": "capacity",
              "label": "Energy capacity (J)",
              "value": 7200,
              "unit": "J"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-soe-adaptive-ekf-variable-capacity"
        ],
        "exampleTraces": [
          {
            "id": "battery-soe-adaptive-ekf-variable-capacity",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-soe-adaptive-ekf-variable-capacity.json?v=ef4e0098c467",
            "title": "SOE adaptive EKF with capacity input recorded example",
            "exampleId": "block-battery-soe-adaptive-ekf-variable-capacity",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-soe-adaptive-ekf-variable-capacity",
        "implementationId": "battery-soe-adaptive-ekf-variable-capacity",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-soe-adaptive-ekf-variable-capacity/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-soe-adaptive-ekf-variable-capacity/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-soe-adaptive-ekf-variable-capacity"
          ]
        },
        "studioHelp": {
          "type": "battery-soe-adaptive-ekf-variable-capacity",
          "namespace": "signal",
          "slug": "signal-block-battery-soe-adaptive-ekf-variable-capacity",
          "canonicalSlug": "battery-soe-adaptive-ekf-variable-capacity",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "SOE adaptive EKF with capacity input",
            "label": "SOE adaptive EKF with capacity input",
            "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance.",
            "details": [
              "Block type: battery-soe-adaptive-ekf-variable-capacity.",
              "6 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "SOE adaptive EKF with capacity input",
              "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity. Innovation matching adapts bounded voltage-noise variance."
            },
            "inputs": [
              {
                "id": "power",
                "label": "Signed battery power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "current",
                "label": "Signed battery current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage measurement valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "capacity",
                "label": "Energy capacity (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of energy",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Posterior fraction variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0.1,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soe-adaptive-ekf-variable-capacity/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-soe-ekf-variable-capacity",
      "type": "Block",
      "label": "SOE EKF with capacity input",
      "properties": {
        "id": "battery-soe-ekf-variable-capacity",
        "name": "SOE EKF with capacity input",
        "kind": "studio",
        "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
        "behavior": "Predicts a charge or energy fraction from signed throughput and corrects it using terminal voltage and a calibrated fraction-to-OCV table. Scalar Joseph covariance updates preserve nonnegative variance. Invalid voltage measurements skip correction; flat OCV regions report limited observability. Adaptive variants bound an innovation-based voltage-noise estimate.",
        "ports": [
          {
            "name": "power",
            "direction": "input",
            "unit": "W",
            "description": "Signed battery power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed battery current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "input",
            "unit": "V",
            "description": "Measured voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "valid",
            "direction": "input",
            "unit": "true / false",
            "description": "Voltage measurement valid; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "capacity",
            "direction": "input",
            "unit": "J",
            "description": "Energy capacity (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of energy; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "variance",
            "direction": "output",
            "unit": "1",
            "description": "Posterior fraction variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "innovation",
            "direction": "output",
            "unit": "V",
            "description": "Voltage innovation; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "gain",
            "direction": "output",
            "unit": "1",
            "description": "Correction gain; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "noise",
            "direction": "output",
            "unit": "1",
            "description": "Voltage-noise variance; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          },
          {
            "name": "status",
            "direction": "output",
            "unit": "1",
            "description": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "dimensionless"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Energy capacity (J)",
            "unit": "J",
            "default": 7200,
            "description": "Energy capacity (J). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOE (0–1)",
            "unit": "0–1",
            "default": 0.6,
            "description": "Initial SOE (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVariance",
            "label": "Initial fraction variance",
            "unit": "1",
            "default": 0.04,
            "description": "Initial fraction variance. This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "processNoise",
            "label": "Process variance rate (fraction²/s)",
            "unit": "fraction²/s",
            "default": 0,
            "description": "Process variance rate (fraction²/s). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "measurementNoise",
            "label": "Voltage measurement variance (V²)",
            "unit": "V²",
            "default": 0.01,
            "description": "Voltage measurement variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "adaptationRate",
            "label": "Noise adaptation weight (0–1)",
            "unit": "0–1",
            "default": 0,
            "description": "Noise adaptation weight (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "minimumNoise",
            "label": "Minimum voltage variance (V²)",
            "unit": "V²",
            "default": 1e-06,
            "description": "Minimum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "maximumNoise",
            "label": "Maximum voltage variance (V²)",
            "unit": "V²",
            "default": 1,
            "description": "Maximum voltage variance (V²). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "ocvTable",
            "label": "OCV table [energy fraction, V]",
            "unit": "See field order",
            "default": [
              [
                0,
                3
              ],
              [
                1,
                4
              ]
            ],
            "description": "OCV table [energy fraction, V]. Rows are ordered coordinate/value pairs; the first column must be strictly increasing."
          }
        ],
        "equations": [
          "innovation = Vmeasured - Vpredicted",
          "K = Ppredicted*H / (H^2*Ppredicted + R)",
          "fraction = predictedFraction + K*innovation",
          "P = (1-K*H)^2*Ppredicted + K^2*R"
        ],
        "example": {
          "title": "SOE EKF with capacity input worked example",
          "text": "Use the defaults below with Signed battery power = 0 W, Signed battery current = 0 A, Measured voltage = 3.8 V, Voltage measurement valid = 1 true / false, Reset = 0 true / false, Energy capacity (J) = 7200 J. At 0 s, State of energy is 0.76 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-soe-ekf-variable-capacity",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.76,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            },
            {
              "port": "variance",
              "atS": 0,
              "value": 0.008,
              "tolerance": 1e-08,
              "label": "Posterior fraction variance",
              "unit": "1"
            },
            {
              "port": "innovation",
              "atS": 0,
              "value": 0.2,
              "tolerance": 1e-08,
              "label": "Voltage innovation",
              "unit": "V"
            },
            {
              "port": "gain",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "Correction gain",
              "unit": "1"
            }
          ],
          "inputs": [
            {
              "port": "power",
              "label": "Signed battery power",
              "value": 0,
              "unit": "W"
            },
            {
              "port": "current",
              "label": "Signed battery current",
              "value": 0,
              "unit": "A"
            },
            {
              "port": "voltage",
              "label": "Measured voltage",
              "value": 3.8,
              "unit": "V"
            },
            {
              "port": "valid",
              "label": "Voltage measurement valid",
              "value": 1,
              "unit": "true / false"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            },
            {
              "port": "capacity",
              "label": "Energy capacity (J)",
              "value": 7200,
              "unit": "J"
            }
          ]
        },
        "limits": [
          "One-state extended Kalman observers, without an unscented transform, RC polarization states or automatic cell identification. SOE requires its own energy-fraction-to-OCV calibration. Synthetic filter settings are not accuracy guarantees.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-estimation",
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-soe-ekf-variable-capacity"
        ],
        "exampleTraces": [
          {
            "id": "battery-soe-ekf-variable-capacity",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-soe-ekf-variable-capacity.json?v=84eaa2347ccf",
            "title": "SOE EKF with capacity input recorded example",
            "exampleId": "block-battery-soe-ekf-variable-capacity",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 6,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-soe-ekf-variable-capacity",
        "implementationId": "battery-soe-ekf-variable-capacity",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-soe-ekf-variable-capacity/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-soe-ekf-variable-capacity/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-soe-ekf-variable-capacity"
          ]
        },
        "studioHelp": {
          "type": "battery-soe-ekf-variable-capacity",
          "namespace": "signal",
          "slug": "signal-block-battery-soe-ekf-variable-capacity",
          "canonicalSlug": "battery-soe-ekf-variable-capacity",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "SOE EKF with capacity input",
            "label": "SOE EKF with capacity input",
            "summary": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity.",
            "details": [
              "Block type: battery-soe-ekf-variable-capacity.",
              "6 declared inputs and 6 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "state",
              "symbol": "predict → innovation → update",
              "label": "SOE EKF with capacity input",
              "caption": "One-state extended Kalman observer with a calibrated fraction-to-OCV table, Joseph covariance update and explicit measurement validity."
            },
            "inputs": [
              {
                "id": "power",
                "label": "Signed battery power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "current",
                "label": "Signed battery current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "voltage",
                "label": "Measured voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "valid",
                "label": "Voltage measurement valid",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "capacity",
                "label": "Energy capacity (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of energy",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "variance",
                "label": "Posterior fraction variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "innovation",
                "label": "Voltage innovation",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "gain",
                "label": "Correction gain",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "noise",
                "label": "Voltage-noise variance",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "status",
                "label": "Status (0 prediction, 1 correction, 2 unobservable, 3 clipped)",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "real",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.6,\"initialVariance\":0.04,\"processNoise\":0,\"measurementNoise\":0.01,\"resistanceOhm\":0.05,\"adaptationRate\":0,\"minimumNoise\":0.000001,\"maximumNoise\":1,\"ocvTable\":[[0,3],[1,4]]}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-soe-ekf-variable-capacity/",
            "related": [
              {
                "label": "Integrator",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-integrator/"
              },
              {
                "label": "First order",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-first-order/"
              },
              {
                "label": "Sample hold",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-sample-hold/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-supercapacitor",
      "type": "Block",
      "label": "Supercapacitor cell",
      "properties": {
        "id": "battery-supercapacitor",
        "name": "Supercapacitor cell",
        "kind": "studio",
        "summary": "Causal capacitor state with series loss, leakage and stored energy.",
        "behavior": "Integrates the internal capacitor voltage from discharge current and leakage. A series resistance produces terminal voltage drop and heat. Stored energy uses the internal capacitor voltage.",
        "ports": [
          {
            "name": "current",
            "direction": "input",
            "unit": "A",
            "description": "Signed discharge current; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "current"
          },
          {
            "name": "voltage",
            "direction": "output",
            "unit": "V",
            "description": "Terminal voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "internalVoltage",
            "direction": "output",
            "unit": "V",
            "description": "Capacitor voltage; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "voltage"
          },
          {
            "name": "energy",
            "direction": "output",
            "unit": "J",
            "description": "Stored energy; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "loss",
            "direction": "output",
            "unit": "W",
            "description": "Dissipated heat; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "heat"
          }
        ],
        "parameters": [
          {
            "key": "capacitanceF",
            "label": "Capacitance (F)",
            "unit": "F",
            "default": 100,
            "description": "Capacitance (F). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "resistanceOhm",
            "label": "Series resistance (Ω)",
            "unit": "Ω",
            "default": 0.05,
            "description": "Series resistance (Ω). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "leakageSiemens",
            "label": "Leakage conductance (S)",
            "unit": "S",
            "default": 0,
            "description": "Leakage conductance (S). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialVoltageV",
            "label": "Initial capacitor voltage (V)",
            "unit": "V",
            "default": 2.5,
            "description": "Initial capacitor voltage (V). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "C*dVcap/dt = -I - Gleak*Vcap",
          "Vterminal = Vcap - I*Rseries",
          "E = 0.5*C*Vcap^2",
          "Ploss = I^2*Rseries + Gleak*Vcap^2"
        ],
        "example": {
          "title": "Supercapacitor cell worked example",
          "text": "Use the defaults below with Signed discharge current = 1 A. At 0 s, Terminal voltage is 2.45 V. Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-supercapacitor",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "voltage",
              "atS": 0,
              "value": 2.45,
              "tolerance": 1e-08,
              "label": "Terminal voltage",
              "unit": "V"
            },
            {
              "port": "energy",
              "atS": 0,
              "value": 312.5,
              "tolerance": 1e-08,
              "label": "Stored energy",
              "unit": "J"
            },
            {
              "port": "energy",
              "atS": 10,
              "value": 288,
              "tolerance": 1e-06,
              "label": "Stored energy",
              "unit": "J"
            }
          ],
          "inputs": [
            {
              "port": "current",
              "label": "Signed discharge current",
              "value": 1,
              "unit": "A"
            }
          ]
        },
        "limits": [
          "Constant capacitance, series resistance and leakage. The external interface is causal; voltage- or temperature-dependent parameters are not included.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "bipm-si"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-supercapacitor"
        ],
        "exampleTraces": [
          {
            "id": "battery-supercapacitor",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-supercapacitor.json?v=8efe06cb84e3",
            "title": "Supercapacitor cell recorded example",
            "exampleId": "block-battery-supercapacitor",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 103,
            "channels": 4,
            "omittedChannels": 0,
            "interpolation": "linear",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "non-stiff-time-scales"
            }
          }
        ],
        "type": "battery-supercapacitor",
        "implementationId": "battery-supercapacitor",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-supercapacitor/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-supercapacitor/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-supercapacitor"
          ]
        },
        "studioHelp": {
          "type": "battery-supercapacitor",
          "namespace": "signal",
          "slug": "signal-block-battery-supercapacitor",
          "canonicalSlug": "battery-supercapacitor",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Supercapacitor cell",
            "label": "Supercapacitor cell",
            "summary": "Causal capacitor state with series loss, leakage and stored energy.",
            "details": [
              "Block type: battery-supercapacitor.",
              "1 declared input and 4 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Supercapacitor cell",
              "caption": "Causal capacitor state with series loss, leakage and stored energy."
            },
            "inputs": [
              {
                "id": "current",
                "label": "Signed discharge current",
                "quantity": "current",
                "shape": [],
                "elementType": "real",
                "unit": "A",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Current",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "voltage",
                "label": "Terminal voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "internalVoltage",
                "label": "Capacitor voltage",
                "quantity": "voltage",
                "shape": [],
                "elementType": "real",
                "unit": "V",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Voltage",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "energy",
                "label": "Stored energy",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "loss",
                "label": "Dissipated heat",
                "quantity": "heat",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Heat flow",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"capacitanceF\":100,\"resistanceOhm\":0.05,\"leakageSiemens\":0,\"initialVoltageV\":2.5}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-supercapacitor/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "block:battery-variable-energy-counter",
      "type": "Block",
      "label": "Energy counter with capacity input",
      "properties": {
        "id": "battery-variable-energy-counter",
        "name": "Energy counter with capacity input",
        "kind": "studio",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "behavior": "Integrates signed discharge current or power over elapsed sample time. Charge efficiency applies during charging. The initial sample has zero elapsed time. Variable-capacity variants preserve the current fraction when capacity changes and report the resulting amount revaluation separately. Reset restores the initial fraction without integrating that event.",
        "ports": [
          {
            "name": "rate",
            "direction": "input",
            "unit": "W",
            "description": "Signed battery power; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "power"
          },
          {
            "name": "reset",
            "direction": "input",
            "unit": "true / false",
            "description": "Reset; scalar.",
            "shape": [],
            "elementType": "bool",
            "quantity": "dimensionless"
          },
          {
            "name": "capacity",
            "direction": "input",
            "unit": "J",
            "description": "Energy capacity (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "fraction",
            "direction": "output",
            "unit": "1 (fraction)",
            "description": "State of energy; scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "fraction"
          },
          {
            "name": "throughput",
            "direction": "output",
            "unit": "J",
            "description": "Net throughput (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "revaluation",
            "direction": "output",
            "unit": "J",
            "description": "Capacity revaluation (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          },
          {
            "name": "boundary",
            "direction": "output",
            "unit": "J",
            "description": "Boundary amount (J); scalar.",
            "shape": [],
            "elementType": "real",
            "quantity": "energy"
          }
        ],
        "parameters": [
          {
            "key": "sampleTimeS",
            "label": "Sample interval (s)",
            "unit": "s",
            "default": 1,
            "description": "Positive sample interval. Initialization has zero elapsed time; subsequent accepted samples update memory."
          },
          {
            "key": "capacity",
            "label": "Energy capacity (J)",
            "unit": "J",
            "default": 7200,
            "description": "Energy capacity (J). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "initialFraction",
            "label": "Initial SOE (0–1)",
            "unit": "0–1",
            "default": 0.8,
            "description": "Initial SOE (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          },
          {
            "key": "chargeEfficiency",
            "label": "Charging efficiency (0–1)",
            "unit": "0–1",
            "default": 1,
            "description": "Charging efficiency (0–1). This is an editable model input; the default belongs to the synthetic worked example."
          }
        ],
        "equations": [
          "amount[k] = amount[k-1] - effectiveRate[k] * elapsedTime",
          "fraction = clamp(amount / capacity, 0, 1)",
          "charge capacity in coulombs = 3600 * capacityAh"
        ],
        "example": {
          "title": "Energy counter with capacity input worked example",
          "text": "Use the defaults below with Signed battery power = 2 W, Reset = 0 true / false, Energy capacity (J) = 7200 J. At 0 s, State of energy is 0.8 1 (fraction). Additional checks are listed below.",
          "url": "https://design.lemonergy.com/cosim.html?example=block-battery-variable-energy-counter",
          "label": "Open Studio example",
          "checks": [
            {
              "port": "fraction",
              "atS": 0,
              "value": 0.8,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            },
            {
              "port": "throughput",
              "atS": 0,
              "value": 0,
              "tolerance": 0,
              "label": "Net throughput (J)",
              "unit": "J"
            },
            {
              "port": "fraction",
              "atS": 1,
              "value": 0.7997222222222222,
              "tolerance": 1e-08,
              "label": "State of energy",
              "unit": "1 (fraction)"
            }
          ],
          "inputs": [
            {
              "port": "rate",
              "label": "Signed battery power",
              "value": 2,
              "unit": "W"
            },
            {
              "port": "reset",
              "label": "Reset",
              "value": 0,
              "unit": "true / false"
            },
            {
              "port": "capacity",
              "label": "Energy capacity (J)",
              "value": 7200,
              "unit": "J"
            }
          ]
        },
        "limits": [
          "Current or power bias accumulates. Fraction clipping is reported as a boundary amount; it does not make the connected plant respect that boundary. Energy variants need capacity in joules.",
          "The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks."
        ],
        "availability": {
          "status": "released",
          "label": "Available in Lemonergy Studio",
          "detail": "The bundled example is available in the production release verified on 28 October 2026. The parameters and examples here are synthetic teaching fixtures, not a characterized cell or a validated operating limit."
        },
        "references": [
          "plett-modeling"
        ],
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ],
        "sourceRepository": "Lemonergy Studio public contract",
        "sourceRevision": "verification-2026-10-27",
        "caseIds": [
          "native-battery-variable-energy-counter"
        ],
        "exampleTraces": [
          {
            "id": "battery-variable-energy-counter",
            "url": "https://lemonergy.com/learn/glossary/api/traces/battery-variable-energy-counter.json?v=621c07293f4b",
            "title": "Energy counter with capacity input recorded example",
            "exampleId": "block-battery-variable-energy-counter",
            "source": "Executed synthetic Lemonergy Studio example",
            "recordedOn": "2026-10-28",
            "points": 2,
            "channels": 4,
            "omittedChannels": 0,
            "interpolation": "step",
            "solver": {
              "method": "dormand-prince-45",
              "reason": "no-continuous-states"
            }
          }
        ],
        "type": "battery-variable-energy-counter",
        "implementationId": "battery-variable-energy-counter",
        "url": "https://lemonergy.com/learn/glossary/blocks/battery-variable-energy-counter/",
        "documentationUrl": "https://lemonergy.com/learn/glossary/blocks/battery-variable-energy-counter/",
        "sourceFile": "block-library.json",
        "reviewed": "2026-10-27",
        "releaseEvidence": {
          "environment": "production",
          "status": "verified",
          "revision": "e76cadfc203e15eb41f3478d8b1044a5b851953d",
          "verifiedOn": "2026-10-28",
          "exampleUrls": [
            "https://design.lemonergy.com/cosim.html?example=block-battery-variable-energy-counter"
          ]
        },
        "studioHelp": {
          "type": "battery-variable-energy-counter",
          "namespace": "signal",
          "slug": "signal-block-battery-variable-energy-counter",
          "canonicalSlug": "battery-variable-energy-counter",
          "existing": true,
          "dynamic": false,
          "scene": {
            "title": "Energy counter with capacity input",
            "label": "Energy counter with capacity input",
            "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
            "details": [
              "Block type: battery-variable-energy-counter.",
              "3 declared inputs and 4 declared outputs in this model.",
              "Arrows show the direction of signal data. They are not conserving electrical, thermal or mechanical connections."
            ],
            "operation": {
              "kind": "battery",
              "symbol": "battery signals → operation",
              "label": "Energy counter with capacity input",
              "caption": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately."
            },
            "inputs": [
              {
                "id": "rate",
                "label": "Signed battery power",
                "quantity": "power",
                "shape": [],
                "elementType": "real",
                "unit": "W",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Power",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "reset",
                "label": "Reset",
                "quantity": "dimensionless",
                "shape": [],
                "elementType": "bool",
                "unit": "—",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Number",
                "shapeLabel": "Scalar",
                "elementLabel": "bool"
              },
              {
                "id": "capacity",
                "label": "Energy capacity (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "outputs": [
              {
                "id": "fraction",
                "label": "State of energy",
                "quantity": "fraction",
                "shape": [],
                "elementType": "real",
                "unit": "0–1",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Fraction",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "throughput",
                "label": "Net throughput (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "revaluation",
                "label": "Capacity revaluation (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              },
              {
                "id": "boundary",
                "label": "Boundary amount (J)",
                "quantity": "energy",
                "shape": [],
                "elementType": "real",
                "unit": "J",
                "unitDeclared": true,
                "fields": [],
                "quantityLabel": "Energy",
                "shapeLabel": "Scalar",
                "elementLabel": "real"
              }
            ],
            "parameters": [
              {
                "id": "configuration",
                "label": "Configuration",
                "unit": "",
                "value": "{\"sampleTimeS\":1,\"capacity\":7200,\"initialFraction\":0.8,\"chargeEfficiency\":1}"
              }
            ],
            "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-variable-energy-counter/",
            "related": [
              {
                "label": "Battery ecm cell",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-ecm-cell/"
              },
              {
                "label": "Battery current monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-current-monitor/"
              },
              {
                "label": "Battery temperature monitor",
                "url": "https://lemonergy.com/learn/glossary/blocks/signal-block-battery-temperature-monitor/"
              }
            ],
            "selected": null,
            "connections": []
          }
        }
      }
    },
    {
      "id": "workflow:nominal-energy",
      "type": "Workflow",
      "label": "Estimate nominal energy",
      "properties": {
        "id": "nominal-energy",
        "title": "Estimate nominal energy",
        "kind": "core",
        "summary": "Lemonergy Core evaluates this relation.",
        "steps": [
          "Open the lesson and inspect the equation.",
          "Change one input while holding the others fixed."
        ],
        "example": "A 5 Ah cell rated 3.6 V has 18 Wh nominal energy. Ten identical cells contain 180 Wh nominally.",
        "observe": "Compare the result with the equation and units.",
        "limits": "This is a rating estimate, not integrated delivered terminal energy.",
        "url": "https://lemonergy.com/learn/fundamentals/capacity-and-c-rate/#energy",
        "label": "Open the worked lesson",
        "evidence": [
          "src/battery_core/capacity.py"
        ]
      }
    },
    {
      "id": "workflow:native-battery-charge-counter",
      "type": "Workflow",
      "label": "Charge counter worked example",
      "properties": {
        "id": "native-battery-charge-counter",
        "title": "Charge counter worked example",
        "kind": "studio",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "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 Signed battery current = 2 A, Reset = 0 true / false. At 0 s, State of charge is 0.8 1 (fraction). Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "Current or power bias accumulates. Fraction clipping is reported as a boundary amount; it does not make the connected plant respect that boundary. Energy variants need capacity in joules. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-charge-counter",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-variable-charge-counter",
      "type": "Workflow",
      "label": "Charge counter with capacity input worked example",
      "properties": {
        "id": "native-battery-variable-charge-counter",
        "title": "Charge counter with capacity input worked example",
        "kind": "studio",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "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 Signed battery current = 2 A, Reset = 0 true / false, Charge capacity (Ah) = 2 Ah. At 0 s, State of charge is 0.8 1 (fraction). Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "Current or power bias accumulates. Fraction clipping is reported as a boundary amount; it does not make the connected plant respect that boundary. Energy variants need capacity in joules. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-variable-charge-counter",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-energy-counter",
      "type": "Workflow",
      "label": "Energy counter worked example",
      "properties": {
        "id": "native-battery-energy-counter",
        "title": "Energy counter worked example",
        "kind": "studio",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "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 Signed battery power = 2 W, Reset = 0 true / false. At 0 s, State of energy is 0.8 1 (fraction). Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "Current or power bias accumulates. Fraction clipping is reported as a boundary amount; it does not make the connected plant respect that boundary. Energy variants need capacity in joules. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-energy-counter",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "workflow:native-battery-variable-energy-counter",
      "type": "Workflow",
      "label": "Energy counter with capacity input worked example",
      "properties": {
        "id": "native-battery-variable-energy-counter",
        "title": "Energy counter with capacity input worked example",
        "kind": "studio",
        "summary": "Integrates signed throughput. Changing capacity preserves fraction and reports revaluation separately.",
        "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 Signed battery power = 2 W, Reset = 0 true / false, Energy capacity (J) = 7200 J. At 0 s, State of energy is 0.8 1 (fraction). Additional checks are listed below.",
        "observe": "Inspect the outputs and numerical checks on the block reference page.",
        "limits": "Current or power bias accumulates. Fraction clipping is reported as a boundary amount; it does not make the connected plant respect that boundary. Energy variants need capacity in joules. The example verifies numerical behavior for synthetic parameters. Cell characterization and validation for an intended use are separate tasks.",
        "url": "https://design.lemonergy.com/cosim.html?example=block-battery-variable-energy-counter",
        "label": "Open Studio example",
        "evidence": [
          "docs/glossary/native-block-verification.json"
        ]
      }
    },
    {
      "id": "topic:topic-units",
      "type": "Topic",
      "label": "Units and electrical basics",
      "properties": {
        "id": "topic-units",
        "name": "Units and electrical basics",
        "lede": "The quantities every datasheet is written in, and how they relate.",
        "context": "Use consistent units and cell/pack basis.",
        "example": "10 A for 30 min transfers 5 Ah. At constant 3.6 V this is 18 Wh; varying voltage requires integration.",
        "lesson_url": "https://lemonergy.com/learn/fundamentals/capacity-and-c-rate/",
        "lesson_label": "Open capacity and C-rate"
      }
    },
    {
      "id": "term:watt-hour",
      "type": "Term",
      "label": "Watt-hour",
      "properties": {
        "id": "watt-hour",
        "name": "Watt-hour",
        "abbr": "Wh",
        "section": "topic-units",
        "definition": "A unit of energy: one watt for one hour, or 3600 joules. A cell’s nominal energy in watt-hours is its capacity in ampere-hours times its nominal voltage — 20 Ah at 3.65 V is 73 Wh.",
        "formula": "E = Q × V",
        "unit": "Wh",
        "related": [
          "nominal-energy",
          "kilowatt-hour",
          "ampere-hour",
          "nominal-voltage"
        ],
        "lesson": "fundamentals/capacity-and-c-rate/#energy",
        "example": {
          "title": "Compare a Wh rating with Ah",
          "text": "A nominal 3.6 V, 5 Ah cell is rated at approximately 18 Wh. Watt-hours measure energy, while ampere-hours measure charge; the voltage is needed to convert between them."
        },
        "url": "https://lemonergy.com/learn/glossary/watt-hour/",
        "mentions": [
          "watt"
        ]
      }
    },
    {
      "id": "term:nominal-energy",
      "type": "Term",
      "label": "Nominal energy",
      "properties": {
        "id": "nominal-energy",
        "name": "Nominal energy",
        "section": "topic-ratings",
        "definition": "Nominal capacity times nominal voltage, in watt-hours: the headline energy figure on a datasheet. The energy actually delivered depends on the load, the temperature and how the voltage curve is weighted.",
        "formula": "E = Q × V_nominal",
        "unit": "Wh",
        "related": [
          "nominal-capacity",
          "nominal-voltage",
          "watt-hour",
          "energy-density"
        ],
        "lesson": "fundamentals/capacity-and-c-rate/#energy",
        "example": {
          "title": "Turn capacity into a nominal energy",
          "text": "A 5 Ah cell with a nominal voltage of 3.6 V has 18 Wh of nominal energy. This estimate uses the nominal voltage; delivered energy is the integral of measured terminal voltage multiplied by current."
        },
        "url": "https://lemonergy.com/learn/glossary/nominal-energy/",
        "mentions": [
          "datasheet",
          "discharge-curve"
        ]
      }
    },
    {
      "id": "term:energy-density",
      "type": "Term",
      "label": "Energy density",
      "properties": {
        "id": "energy-density",
        "name": "Energy density",
        "aka": [
          "volumetric energy density"
        ],
        "section": "topic-ratings",
        "definition": "Stored energy per unit volume, in watt-hours per litre. It is the figure that matters when space is the constraint, as in a phone or under a car floor; high-energy cylindrical cells pass 700 Wh/L.",
        "unit": "Wh/L",
        "related": [
          "specific-energy",
          "nominal-energy",
          "ragone-plot",
          "areal-loading"
        ],
        "lesson": "fundamentals/capacity-and-c-rate/#energy",
        "url": "https://lemonergy.com/learn/glossary/energy-density/",
        "mentions": []
      }
    },
    {
      "id": "lesson:fundamentals/capacity-and-c-rate/",
      "type": "Lesson",
      "label": "Lesson 2 · Capacity and C-rate",
      "properties": {
        "url": "https://lemonergy.com/learn/fundamentals/capacity-and-c-rate/"
      }
    },
    {
      "id": "visual:energy",
      "type": "Visual",
      "label": "From charge to energy",
      "properties": {
        "title": "From charge to energy",
        "summary": "Voltage connects capacity in ampere-hours to nominal energy in watt-hours.",
        "readout": "5 Ah × 12 V = 60 Wh nominal energy.",
        "formula": "E_nominal = Q_nominal V_nominal; actual energy = ∫ VI dt",
        "note": "Specific energy divides energy by mass; energy density divides it by volume.",
        "software": {
          "status": "implemented",
          "label": "Implemented in battery-core",
          "body": "nominal_energy_wh multiplies nominal voltage by capacity. Actual discharge energy requires the integral of voltage × current.",
          "href": "../fundamentals/capacity-and-c-rate/"
        },
        "html": "<figure class=\"visual-figure\"><figcaption>Nominal energy versus capacity</figcaption><svg class=\"visual-chart\" viewBox=\"0 0 360 330\" role=\"img\" aria-labelledby=\"static-energy-0-title static-energy-0-desc\"><title id=\"static-energy-0-title\">Nominal energy versus capacity</title><desc id=\"static-energy-0-desc\">Capacity (Ah) versus Energy (Wh). 12 V rating. Interpretation follows the graphs.</desc><path d=\"M74,238h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"242\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">0</text><text x=\"74\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">0</text><path d=\"M74,188.5h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"192.5\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">60</text><text x=\"141\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">5</text><path d=\"M74,139h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"143\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">120</text><text x=\"208\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">10</text><path d=\"M74,89.5h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"93.5\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">180</text><text x=\"275\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">15</text><path d=\"M74,40h268\" stroke=\"currentColor\" opacity=\".13\"/><text x=\"64\" y=\"44\" text-anchor=\"end\" font-size=\"13\" fill=\"currentColor\">240</text><text x=\"342\" y=\"265\" text-anchor=\"middle\" font-size=\"13\" fill=\"currentColor\">20</text><path d=\"M74,40v198h268\" fill=\"none\" stroke=\"currentColor\" opacity=\".3\"/><polyline fill=\"none\" stroke=\"#2459a8\" stroke-width=\"2.8\" points=\"74.00,238.00 76.68,236.02 79.36,234.04 82.04,232.06 84.72,230.08 87.40,228.10 90.08,226.12 92.76,224.14 95.44,222.16 98.12,220.18 100.80,218.20 103.48,216.22 106.16,214.24 108.84,212.26 111.52,210.28 114.20,208.30 116.88,206.32 119.56,204.34 122.24,202.36 124.92,200.38 127.60,198.40 130.28,196.42 132.96,194.44 135.64,192.46 138.32,190.48 141.00,188.50 143.68,186.52 146.36,184.54 149.04,182.56 151.72,180.58 154.40,178.60 157.08,176.62 159.76,174.64 162.44,172.66 165.12,170.68 167.80,168.70 170.48,166.72 173.16,164.74 175.84,162.76 178.52,160.78 181.20,158.80 183.88,156.82 186.56,154.84 189.24,152.86 191.92,150.88 194.60,148.90 197.28,146.92 199.96,144.94 202.64,142.96 205.32,140.98 208.00,139.00 210.68,137.02 213.36,135.04 216.04,133.06 218.72,131.08 221.40,129.10 224.08,127.12 226.76,125.14 229.44,123.16 232.12,121.18 234.80,119.20 237.48,117.22 240.16,115.24 242.84,113.26 245.52,111.28 248.20,109.30 250.88,107.32 253.56,105.34 256.24,103.36 258.92,101.38 261.60,99.40 264.28,97.42 266.96,95.44 269.64,93.46 272.32,91.48 275.00,89.50 277.68,87.52 280.36,85.54 283.04,83.56 285.72,81.58 288.40,79.60 291.08,77.62 293.76,75.64 296.44,73.66 299.12,71.68 301.80,69.70 304.48,67.72 307.16,65.74 309.84,63.76 312.52,61.78 315.20,59.80 317.88,57.82 320.56,55.84 323.24,53.86 325.92,51.88 328.60,49.90 331.28,47.92 333.96,45.94 336.64,43.96 339.32,41.98 342.00,40.00\"/><text transform=\"translate(208 303)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">Capacity (Ah)</tspan></text><text transform=\"translate(20 139) rotate(-90)\" text-anchor=\"middle\" font-size=\"14\" fill=\"currentColor\"><tspan x=\"0\" dy=\"0\">Energy (Wh)</tspan></text></svg><div class=\"visual-legend\"><span><i style=\"background:#2459a8\"></i>12 V rating</span></div></figure>"
      }
    },
    {
      "id": "reference:bipm-si",
      "type": "Reference",
      "label": "The International System of Units (SI), 9th edition",
      "properties": {
        "title": "The International System of Units (SI), 9th edition",
        "publisher": "Bureau International des Poids et Mesures",
        "url": "https://doi.org/10.59161/AUEZ1291",
        "type": "Metrology reference",
        "scope": "Definitions of SI units and coherent derived units; 2026 revision.",
        "year": 2026,
        "accessed": "2026-10-27"
      }
    }
  ]
}
