{
  "reviewed": "2026-10-27",
  "repository": "battery-design",
  "revision": "ef9802329b75bc15bb96885f8ed5d49425106696",
  "scope": "Registered authoring types at this source revision. Presence means implemented in the catalog, not validated equivalence to another product. Separate namespaces must not be summed as independent physical models.",
  "counts": {
    "registeredStudioTypes": 83,
    "equationRuntimeTypes": 28,
    "structureTypes": 7,
    "physicalTypes": 48,
    "componentChainClasses": 7,
    "componentShelfRecords": 9,
    "analysisModules": 6,
    "protocolKinds": 7
  },
  "registeredStudioTypes": [
    {
      "id": "constant",
      "name": "Constant",
      "family": "equation",
      "group": "Sources",
      "summary": "A fixed sourced value.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "step",
      "name": "Step source",
      "family": "equation",
      "group": "Sources",
      "summary": "A value that changes once at a known time.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "gain",
      "name": "Gain",
      "family": "equation",
      "group": "Math",
      "summary": "Scales one signal with an explicit input quantity.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "sum",
      "name": "Sum",
      "family": "equation",
      "group": "Math",
      "summary": "Adds signals carrying the same quantity.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "product",
      "name": "Product",
      "family": "equation",
      "group": "Math",
      "summary": "Multiplies two typed inputs and an explicit scale.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "limit",
      "name": "Limit",
      "family": "equation",
      "group": "Control",
      "summary": "Keeps a signal inside reviewed minimum and maximum bounds.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "integrator",
      "name": "Integrator",
      "family": "equation",
      "group": "States",
      "summary": "Accumulates a typed rate into a continuous state.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "first-order",
      "name": "First-order state",
      "family": "equation",
      "group": "States",
      "summary": "A state that approaches its input with one time constant.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "thermal-rate",
      "name": "Thermal balance",
      "family": "equation",
      "group": "Battery",
      "summary": "Lumped heat balance with ambient loss.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "sample-hold",
      "name": "Sample and hold",
      "family": "equation",
      "group": "Sampled",
      "summary": "Copies its input at every instant of its sample time and holds it in between (zero-order hold).",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "unit-delay",
      "name": "Unit delay",
      "family": "equation",
      "group": "Sampled",
      "summary": "Publishes the input of the previous instant — the block that breaks a loop between sampled blocks.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "pi-controller",
      "name": "PI controller",
      "family": "equation",
      "group": "Sampled",
      "summary": "Discrete PI on setpoint minus measurement with output bounds; the integral freezes while the output sits at a bound (anti-windup).",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "sensor",
      "name": "Sensor",
      "family": "equation",
      "group": "Sampled",
      "summary": "A sampled reading: seeded Gaussian noise, a quantisation step and a latency in samples — reproducible, not a characterised sensor.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "compare",
      "name": "Compare",
      "family": "equation",
      "group": "Control",
      "summary": "Compares two signals of the same quantity; outputs 0 or 1. Operation: 0 <, 1 ≤, 2 >, 3 ≥, 4 =, 5 ≠. Equality is exact; no hidden tolerance.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "boolean-latch",
      "name": "Boolean latch",
      "family": "equation",
      "group": "Sampled",
      "summary": "Sampled set/reset memory. SET wins when both inputs are 1; holds when both are 0. Inputs must be exactly 0 or 1.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "divide",
      "name": "Divide",
      "family": "equation",
      "group": "Math",
      "summary": "scale · left / right with a guarded denominator: below the minimum magnitude the denominator keeps its sign and takes the minimum, so a variable mass or voltage never produces an infinite result silently.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "power-law",
      "name": "Power law",
      "family": "equation",
      "group": "Math",
      "summary": "gain · sign(x) · |x|^exponent: the odd power law, so fan affinity (f², f³), aerodynamic (v·|v|) and tank blow-down ((m/m₀)ⁿ) terms keep their sign.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "select",
      "name": "Select",
      "family": "equation",
      "group": "Control",
      "summary": "Passes the first value while the control is at least 0.5 and the second otherwise; both values carry the output quantity.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "min-max",
      "name": "Minimum / maximum",
      "family": "equation",
      "group": "Math",
      "summary": "The smaller (operation 0) or larger (operation 1) of two signals of the same quantity.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "absolute",
      "name": "Absolute value",
      "family": "equation",
      "group": "Math",
      "summary": "|x| on one quantity.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "road-load",
      "name": "Road load",
      "family": "equation",
      "group": "Vehicle",
      "summary": "Designer vehicle rule: Crr·max(0, N)·sign(v) above a creep threshold + ½ρ·CdA·v·|v| + m·g·sinθ, in newtons.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "tyre-grip",
      "name": "Tyre grip",
      "family": "equation",
      "group": "Vehicle",
      "summary": "Friction circle: the requested longitudinal force clamped to ±μ·max(0, N). What the tyre cannot deliver is simply not delivered.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "cold-gas-thruster",
      "name": "Cold-gas thruster",
      "family": "equation",
      "group": "Vehicle",
      "summary": "Nozzles firing × gas available × thrust per nozzle (mode 0, N), or the mass flow that thrust costs at the effective exhaust velocity (mode 1, kg/s). Thrust is per nozzle at the supplied state; a tank blow-down is composed upstream by scaling the nozzle count with a Power law of the gas left.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "fan-suction",
      "name": "Suction fan",
      "family": "equation",
      "group": "Vehicle",
      "summary": "Affinity law on the flow fraction f (clamped 0–1): electrical power standby + (rated − standby)·f³ (mode 0, W) or suction force rated·f² (mode 1, N). One equivalent fan at an authored operating point.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "converter-loss",
      "name": "Converter loss",
      "family": "equation",
      "group": "Vehicle",
      "summary": "Designer power-electronics class: fixed·P_rated + conduction·P²/P_rated + switching·|P| on the throughput power.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "ground-contact",
      "name": "Ground contact",
      "family": "equation",
      "group": "Vehicle",
      "summary": "Road-normal contact: on the surface the ground supports what the lift cannot, a one-sided damper arrests a landing and a critically damped spring settles penetration; airborne the lift acts alone. Mode 0 gives the normal acceleration, mode 1 the ground's share.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "chart",
      "name": "Chart",
      "family": "equation",
      "group": "Logic",
      "summary": "Sampled parallel regions, ordered guards and named held outputs.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "mpc",
      "name": "Model predictive controller",
      "family": "equation",
      "group": "Sampled",
      "summary": "Bounded linear, successive-linearisation landing or nonlinear shooting control with explicit solver status outputs.",
      "evidence": [
        "js/cosim-graph.js",
        "rust-core/src/equations.rs"
      ]
    },
    {
      "id": "subsystem",
      "name": "Subsystem",
      "family": "structure",
      "group": "Structure",
      "summary": "A model with a named versioned input/output interface.",
      "evidence": [
        "js/cosim-graph.js",
        "js/studio-model.js"
      ]
    },
    {
      "id": "inport",
      "name": "Inport",
      "family": "structure",
      "group": "Structure",
      "summary": "A named subsystem input.",
      "evidence": [
        "js/cosim-graph.js",
        "js/studio-model.js"
      ]
    },
    {
      "id": "outport",
      "name": "Outport",
      "family": "structure",
      "group": "Structure",
      "summary": "A named subsystem output.",
      "evidence": [
        "js/cosim-graph.js",
        "js/studio-model.js"
      ]
    },
    {
      "id": "bus-create",
      "name": "Bus creator",
      "family": "structure",
      "group": "Structure",
      "summary": "Pack named typed signals without changing their numerical values.",
      "evidence": [
        "js/cosim-graph.js",
        "js/studio-model.js"
      ]
    },
    {
      "id": "bus-select",
      "name": "Bus selector",
      "family": "structure",
      "group": "Structure",
      "summary": "Select one named typed bus field.",
      "evidence": [
        "js/cosim-graph.js",
        "js/studio-model.js"
      ]
    },
    {
      "id": "vector-assemble",
      "name": "Vector assembler",
      "family": "structure",
      "group": "Structure",
      "summary": "Assemble ordered same-quantity scalars.",
      "evidence": [
        "js/cosim-graph.js",
        "js/studio-model.js"
      ]
    },
    {
      "id": "vector-select",
      "name": "Vector selector",
      "family": "structure",
      "group": "Structure",
      "summary": "Select one scalar by index.",
      "evidence": [
        "js/cosim-graph.js",
        "js/studio-model.js"
      ]
    },
    {
      "id": "electrical-reference",
      "name": "Electrical reference",
      "family": "physical",
      "domain": "electrical",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "resistor",
      "name": "Resistor",
      "family": "physical",
      "domain": "electrical",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "capacitor",
      "name": "Capacitor",
      "family": "physical",
      "domain": "electrical",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "inductor",
      "name": "Inductor",
      "family": "physical",
      "domain": "electrical",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "voltage-source",
      "name": "Controlled voltage source",
      "family": "physical",
      "domain": "electrical",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "current-source",
      "name": "Controlled current source",
      "family": "physical",
      "domain": "electrical",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "voltage-sensor",
      "name": "Voltage sensor / signal adapter",
      "family": "physical",
      "domain": "electrical",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "current-sensor",
      "name": "Current sensor / signal adapter",
      "family": "physical",
      "domain": "electrical",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "power-load",
      "name": "Limited P/V electrical load",
      "family": "physical",
      "domain": "electrical",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "battery-source",
      "name": "Battery: resistance and charge state",
      "family": "physical",
      "domain": "electrical",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "dc-motor",
      "name": "DC motor with shaft coupling",
      "family": "physical",
      "domain": "electrical",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "shaft-reference",
      "name": "Rotational reference",
      "family": "physical",
      "domain": "rotational",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "shaft-inertia",
      "name": "Shaft inertia",
      "family": "physical",
      "domain": "rotational",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "shaft-damper",
      "name": "Shaft viscous loss",
      "family": "physical",
      "domain": "rotational",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "shaft-torque",
      "name": "Controlled shaft torque",
      "family": "physical",
      "domain": "rotational",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "gas-tank",
      "name": "Gas tank / storage",
      "family": "physical",
      "domain": "gas",
      "summary": "Perfect gas with constant heat capacities",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "gas-plenum",
      "name": "Gas plenum / duct storage",
      "family": "physical",
      "domain": "gas",
      "summary": "Perfect gas with constant heat capacities",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "gas-reservoir",
      "name": "Gas reservoir boundary",
      "family": "physical",
      "domain": "gas",
      "summary": "Perfect gas with constant heat capacities",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "gas-duct",
      "name": "Gas resistive duct",
      "family": "physical",
      "domain": "gas",
      "summary": "Perfect gas with constant heat capacities",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "gas-nozzle",
      "name": "Compressible restriction / nozzle",
      "family": "physical",
      "domain": "gas",
      "summary": "Perfect gas with constant heat capacities",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "gas-valve",
      "name": "Finite-response gas valve",
      "family": "physical",
      "domain": "gas",
      "summary": "Perfect gas with constant heat capacities",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "gas-regulator",
      "name": "Pressure regulator with dropout",
      "family": "physical",
      "domain": "gas",
      "summary": "Perfect gas with constant heat capacities",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "gas-fan",
      "name": "Fan pressure curve and power",
      "family": "physical",
      "domain": "gas",
      "summary": "Perfect gas with constant heat capacities",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "gas-sensor",
      "name": "Pressure / temperature sensor",
      "family": "physical",
      "domain": "gas",
      "summary": "Perfect gas with constant heat capacities",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "signal-constant",
      "name": "Physical signal source",
      "family": "physical",
      "domain": "signal",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "signal-step",
      "name": "Physical signal step",
      "family": "physical",
      "domain": "signal",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "signal-schedule",
      "name": "Physical availability / signal schedule",
      "family": "physical",
      "domain": "signal",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "signal-filter",
      "name": "Physical signal filter",
      "family": "physical",
      "domain": "signal",
      "summary": "Lumped component equations",
      "evidence": [
        "js/physical-network.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "world-frame",
      "name": "World frame",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "body-inertia",
      "name": "Rigid body and inertia",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "frame-transform",
      "name": "Rigid frame transform",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "force-torque",
      "name": "External force and torque",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "spherical-joint",
      "name": "Spherical joint",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "distance-joint",
      "name": "Fixed-distance joint",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "revolute-joint",
      "name": "Revolute joint around frame Z",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "plane-contact",
      "name": "Compliant unilateral plane contact",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "frame-sensor",
      "name": "Relative frame sensor",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "spring-damper",
      "name": "Axial suspension spring and damper",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "shaft-frame",
      "name": "Shaft to rigid-body frame",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "friction-brake",
      "name": "Finite-slip friction brake",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "tyre-contact",
      "name": "Combined-slip tyre and compliant road contact",
      "family": "physical",
      "domain": "mechanical",
      "summary": "Rigid bodies, constant principal inertias, ideal supported joints; compliant unilateral contact",
      "evidence": [
        "js/physical-network.js",
        "js/physical-mechanics.js",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "battery-ocv",
      "name": "Battery with SOC-dependent OCV",
      "family": "physical",
      "domain": "electrical",
      "summary": "SOC-dependent Thevenin battery; ideal CC/CV converter; sampled supervisory control",
      "evidence": [
        "js/physical-network.js",
        "js/charging-control.js",
        "rust-core/src/charging_control.rs",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "regulated-charger",
      "name": "Regulated CC/CV charger",
      "family": "physical",
      "domain": "electrical",
      "summary": "SOC-dependent Thevenin battery; ideal CC/CV converter; sampled supervisory control",
      "evidence": [
        "js/physical-network.js",
        "js/charging-control.js",
        "rust-core/src/charging_control.rs",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "charging-policy",
      "name": "Charging schedule and target policy",
      "family": "physical",
      "domain": "signal",
      "summary": "SOC-dependent Thevenin battery; ideal CC/CV converter; sampled supervisory control",
      "evidence": [
        "js/physical-network.js",
        "js/charging-control.js",
        "rust-core/src/charging_control.rs",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "site-power-allocator",
      "name": "Shared site power allocator",
      "family": "physical",
      "domain": "signal",
      "summary": "SOC-dependent Thevenin battery; ideal CC/CV converter; sampled supervisory control",
      "evidence": [
        "js/physical-network.js",
        "js/charging-control.js",
        "rust-core/src/charging_control.rs",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "energy-dispatch",
      "name": "Scheduled import / export and load policy",
      "family": "physical",
      "domain": "signal",
      "summary": "SOC-dependent Thevenin battery; ideal CC/CV converter; sampled supervisory control",
      "evidence": [
        "js/physical-network.js",
        "js/charging-control.js",
        "rust-core/src/charging_control.rs",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "bidirectional-grid",
      "name": "Bidirectional grid / load interface",
      "family": "physical",
      "domain": "electrical",
      "summary": "SOC-dependent Thevenin battery; ideal CC/CV converter; sampled supervisory control",
      "evidence": [
        "js/physical-network.js",
        "js/charging-control.js",
        "rust-core/src/charging_control.rs",
        "rust-core/src/physical_network.rs"
      ]
    },
    {
      "id": "v2v-converter",
      "name": "Conserving vehicle-to-vehicle converter",
      "family": "physical",
      "domain": "electrical",
      "summary": "SOC-dependent Thevenin battery; ideal CC/CV converter; sampled supervisory control",
      "evidence": [
        "js/physical-network.js",
        "js/charging-control.js",
        "rust-core/src/charging_control.rs",
        "rust-core/src/physical_network.rs"
      ]
    }
  ],
  "componentChainClasses": [
    {
      "id": "battery-pack",
      "name": "Battery pack",
      "model": "pack-ecm-static@1",
      "summary": "Open-circuit voltage, series resistance and a state-of-charge integrator — the same equivalent-circuit story the mission bench tells.",
      "limitations": "Static OCV and one lumped resistance: a screening chain, not the identified pack model.",
      "evidence": [
        "js/component-blocks.js"
      ],
      "counting": "Composite expansion into registered equation blocks; not another primitive."
    },
    {
      "id": "contactor",
      "name": "Contactor",
      "model": "series-contact@1",
      "summary": "A commanded series contact: closed adds its contact resistance, open interrupts the chain current.",
      "limitations": "Ideal switching edge; no arc, bounce or coil-economizer model.",
      "evidence": [
        "js/component-blocks.js"
      ],
      "counting": "Composite expansion into registered equation blocks; not another primitive."
    },
    {
      "id": "relay",
      "name": "Signal relay",
      "model": "series-contact@1",
      "summary": "The same commanded-contact model, at signal scale — for coil and logic branches only.",
      "limitations": "Never a traction element: no pack-level breaking capacity exists in this class.",
      "evidence": [
        "js/component-blocks.js"
      ],
      "counting": "Composite expansion into registered equation blocks; not another primitive."
    },
    {
      "id": "fuse",
      "name": "Fuse",
      "model": "series-resistance+i2t-verdict@1",
      "summary": "Series resistance in the run; the melting/breaking rules judge the commanded duty BEFORE the run.",
      "limitations": "Pre-run screening against the 2×-continuous and 50%-of-melting rules; no time-current curve is simulated.",
      "evidence": [
        "js/component-blocks.js"
      ],
      "counting": "Composite expansion into registered equation blocks; not another primitive."
    },
    {
      "id": "precharge-branch",
      "name": "Precharge branch",
      "model": "electrical-protection.prechargeStudy@reused",
      "summary": "The existing precharge study runs at its home; its verdict rides the chain manifest.",
      "limitations": "The scalar chain does not fake the RC transient with a steady-state element.",
      "evidence": [
        "js/component-blocks.js"
      ],
      "counting": "Composite expansion into registered equation blocks; not another primitive."
    },
    {
      "id": "dcdc-converter",
      "name": "DC-DC converter",
      "model": "power-electronics.converter@reused",
      "summary": "An auxiliary branch reflected to the chain through the class efficiency at its operating point.",
      "limitations": "Fixed-ratio reflection at the stated operating point; no control dynamics.",
      "evidence": [
        "js/component-blocks.js"
      ],
      "counting": "Composite expansion into registered equation blocks; not another primitive."
    },
    {
      "id": "load",
      "name": "Load",
      "model": "current-step@1",
      "summary": "The duty as a stepped chain-current demand.",
      "limitations": "Current-driven: the chain current is the commanded duty, not solved from power.",
      "evidence": [
        "js/component-blocks.js"
      ],
      "counting": "Composite expansion into registered equation blocks; not another primitive."
    }
  ],
  "componentShelfRecords": [
    {
      "id": "pack-active-design",
      "class": "battery-pack",
      "name": "Battery pack (from the active design or stated parameters)",
      "evidence": [
        "js/component-blocks.js"
      ]
    },
    {
      "id": "contactor-main-450a",
      "class": "contactor",
      "name": "Main contactor, 450 A / 900 V class",
      "evidence": [
        "js/component-blocks.js"
      ]
    },
    {
      "id": "contactor-main-150a",
      "class": "contactor",
      "name": "Main contactor, 150 A / 450 V class",
      "evidence": [
        "js/component-blocks.js"
      ]
    },
    {
      "id": "relay-signal-2a",
      "class": "relay",
      "name": "Signal relay, 2 A / 30 V DC class",
      "evidence": [
        "js/component-blocks.js"
      ]
    },
    {
      "id": "fuse-ev-500a",
      "class": "fuse",
      "name": "EV-class fuse, 500 A / 1000 V",
      "evidence": [
        "js/component-blocks.js"
      ]
    },
    {
      "id": "fuse-ev-200a",
      "class": "fuse",
      "name": "EV-class fuse, 200 A / 500 V",
      "evidence": [
        "js/component-blocks.js"
      ]
    },
    {
      "id": "precharge-p115-class",
      "class": "precharge-branch",
      "name": "Precharge branch (contactor + resistor, P115 class)",
      "evidence": [
        "js/component-blocks.js"
      ]
    },
    {
      "id": "dcdc-aux-3kw",
      "class": "dcdc-converter",
      "name": "Auxiliary DC-DC, 3 kW (HV → 12/24 V)",
      "evidence": [
        "js/component-blocks.js"
      ]
    },
    {
      "id": "load-drive-step",
      "class": "load",
      "name": "Drive duty (stepped current demand)",
      "evidence": [
        "js/component-blocks.js"
      ]
    }
  ],
  "analysisModules": [
    {
      "id": "runaway-propagation",
      "name": "Thermal-runaway propagation",
      "summary": "Compares cell spacing and barrier options after one cell is triggered.",
      "evidence": [
        "js/cosim-graph.js",
        "js/cosim-analysis.js"
      ],
      "counting": "Analysis module, not a connected palette block."
    },
    {
      "id": "vent-sizing",
      "name": "Emergency pressure-relief sizing",
      "summary": "Calculates a conditional free-flow area, supplier vent quantity and provisional placement on reviewed enclosure faces.",
      "evidence": [
        "js/cosim-graph.js",
        "js/cosim-analysis.js"
      ],
      "counting": "Analysis module, not a connected palette block."
    },
    {
      "id": "vibration-screening",
      "name": "Vibration and shock screening",
      "summary": "Places the mounted pack's first mode against the sine sweeps, random envelopes and shocks of its application class, counts the resonance dwell and reports mount and fastener loads.",
      "evidence": [
        "js/cosim-graph.js",
        "js/cosim-analysis.js"
      ],
      "counting": "Analysis module, not a connected palette block."
    },
    {
      "id": "thermal-field",
      "name": "Thermal field across the pack",
      "summary": "Solves the steady zone network of a pack under its continuous heat with the cooling path following the placement of the cooling hardware, and reports the spread, the hottest zone's ageing factors and the sensor positions that bound the pack.",
      "evidence": [
        "js/cosim-graph.js",
        "js/cosim-analysis.js"
      ],
      "counting": "Analysis module, not a connected palette block."
    },
    {
      "id": "corrosion-life",
      "name": "Corrosion over life of a joint",
      "summary": "Corrodes one declared joint over the service life in an ISO 9223 corrosivity class behind the enclosure's protection: the plating stages, the interface loss, the contact resistance climbing and the year it stops being a joint.",
      "evidence": [
        "js/cosim-graph.js",
        "js/cosim-analysis.js"
      ],
      "counting": "Analysis module, not a connected palette block."
    },
    {
      "id": "crush-screening",
      "name": "Crush and intrusion screening",
      "summary": "Screens the declared load path — wall, cross members, rails — against the R100 plate and the GB 38031 semicylinder with closed-form plastic collapse: the stroke into the crush space, the energy absorbed and the load per cell.",
      "evidence": [
        "js/cosim-graph.js",
        "js/cosim-analysis.js"
      ],
      "counting": "Analysis module, not a connected palette block."
    }
  ],
  "protocolKinds": [
    {
      "id": "rest",
      "evidence": [
        "js/test-protocol.js"
      ],
      "counting": "Test sequence step, not a connected palette block."
    },
    {
      "id": "thermal-soak",
      "evidence": [
        "js/test-protocol.js"
      ],
      "counting": "Test sequence step, not a connected palette block."
    },
    {
      "id": "discharge",
      "evidence": [
        "js/test-protocol.js"
      ],
      "counting": "Test sequence step, not a connected palette block."
    },
    {
      "id": "charge",
      "evidence": [
        "js/test-protocol.js"
      ],
      "counting": "Test sequence step, not a connected palette block."
    },
    {
      "id": "pulse",
      "evidence": [
        "js/test-protocol.js"
      ],
      "counting": "Test sequence step, not a connected palette block."
    },
    {
      "id": "dynamic",
      "evidence": [
        "js/test-protocol.js"
      ],
      "counting": "Test sequence step, not a connected palette block."
    },
    {
      "id": "repeat",
      "evidence": [
        "js/test-protocol.js"
      ],
      "counting": "Test sequence step, not a connected palette block."
    }
  ],
  "excluded": [
    "Educational glossary graphs and charts",
    "Presets and example compositions",
    "Hardware product records in js/components.js",
    "Core equation helpers",
    "Imported external FMUs",
    "Design-tool panels"
  ]
}
