Reads the pad-aware HeadAmpCapability.gainRange (source.ts's headAmpGainRangeOf) —
the REAC 0..55 travel by default, an RME mic input's 0..65 when the capability says so.
The per-channel FADER TAPER the topology declares (ChannelCapabilities.faderScaleFor,
model.ts's FaderScale) — a position↔dB coupling, not a min/max pair. The server's
fader row derives db through it and the DCA override shares it; a consumer that couples
position to dB any other way is the class-D "both must keep the same taper" hazard.
The desk's own digital input-TRIM travel — TRIM_RANGE (control-descriptor.ts), the
declared TRIM_MIN_DB..TRIM_MAX_DB pair the trim row's codec clamps by.
The processor's limit table in @freemixer/catalog (GATE_LIMITS / COMP_LIMITS),
which its server controller seeds and clamps by — the desk-independent DSP law.
The SESSION's allocation: how many of a thing this channel may carry — sends, DCA members,
insert slots, chain entries, bindable sources. The bound is a COUNT, not a travel in a unit,
and it is neither a constant nor a device fact: a 32-bus session and an 8-bus session answer
differently for the same code. Supplied through BoundsContext like catalogLimits,
and legitimately ABSENT before a session is loaded — an absence to render, never a default
to substitute (#150).
A travel CORE itself declares, per field, in the module that owns the fact — eq.ts's
EQ_*_RANGE / HPF/LPF, fbs.ts's FBS_*_RANGE, strip-fx-limits.ts's delay and
reverb travels. Resolvable with NO context at all, which is the point: these are facts of
the desk's own DSP, one per rig, so nothing has to be handed in to reach them.
Distinct from catalogLimits only by WHO declares it — catalog depends on core, so its
tables must be injected while these can simply be read. Same authority class, two homes.
Where a fact's presentation LIMITS come from — never a hardcoded constant (#66's precedent,
HeadAmpCapability.gainRange/headAmpGainRangeOf). Each member is a POINTER at the owning declaration, never a copied number: the consumer resolves it against the declaration it already imports, so the contract cannot hold a second spelling of a travel that then drifts.Facts with no
rangeeither have no numeric travel at all (a name, a membership set) or their limits live in a declaration this column does not point at yet (the EQ's ownEQ_GAIN_LIMIT_DB/EQ_FREQ_RANGEineq.ts; delay/reverb, whose params carry no declared limit table today) — absences, recorded as such rather than guessed.