The parameter and component model: "nothing hardcoded", as a type.
Every number describing hardware is a :class:`Param` -- a value, the unit it was
written in, where it came from, and how well it is known::
from feedtwin.model import Param, Provenance
Param(1.2, "Cv", Provenance.MANUFACTURER, "SS-8BK-V51 datasheet rev C")
There is no default for the source. A number with no provenance is a validation
error, because "nobody remembers where this came from" is the state this layer
exists to make impossible -- and it is the state most of a propulsion team's
numbers are in by the second year.
What each piece is for
----------------------
:mod:`~feedtwin.model.units`
Conversion at the boundary and dimension checking. Author in psi and
inches; the solver sees SI floats. A pressure written where a length
belongs fails at load with both dimensions named.
:mod:`~feedtwin.model.param`
:class:`Param`, :class:`Provenance`, :class:`Uncertainty`, and the report
helpers that turn a pile of parameters into "nine measured, four datasheet,
two guesses".
:mod:`~feedtwin.model.spec`
:class:`ComponentSpec` -- what a kind of component has. Loaded from
``components.toml``, so a component's schema is data and only its physics is
code. Validation, the Phase 10 inspector and the generated parameter tables
all read this one declaration.
:mod:`~feedtwin.model.segments`
:class:`LineSegment` and the loss-method ladder -- how a line's resistance
is known, and which of several statements of it wins.
:mod:`~feedtwin.model.component`
:class:`ComponentInstance`, one configured piece of hardware, and the
provisional :class:`Component` protocol that Phase 03 implements against.
:mod:`~feedtwin.model.catalog`
Part numbers to parameters, with datasheet values and measurements kept
separately so the difference between them stays visible.
Serialisation is TOML in, plain dicts through, JSON for exact round-trips.
Deliberately not YAML: PyYAML parses ``1e-3`` as the *string* ``"1e-3"``, which
in a config full of orifice diameters is a silent, load-bearing bug.