HELP_IDS: readonly [
"channel.name",
"channel.meter",
"channel.gain",
"channel.fader",
"channel.pan",
"channel.mute",
"channel.solo",
"channel.phantom",
"channel.pad",
"channel.polarity",
"channel.saveConfig",
"tab.eq",
"tab.gate",
"tab.comp",
"tab.analysis",
"tab.plugins",
"tab.sends",
"block.fxSortable",
"bay.menuPosition",
"processing.toolbarEdge",
"gate.on",
"gate.attack",
"gate.hold",
"gate.release",
"gate.hysteresis",
"gate.ratio",
"gate.preset",
"gate.key.source",
"gate.key.hp",
"gate.key.lp",
"gate.key.listen",
"delay.curve",
"reverb.curve",
] = ...
THE HELP ID VOCABULARY — every stable control id the console's contextual help is keyed by.
List-first, type-derived, the convention
CHANNEL_FACTSsets. It lives HERE, in the shared declaration vocabulary, because two tables spell it: the web-ui'sHELPregistry (app/utils/help.ts, typedReadonly<Record<HelpId, HelpEntry>>) carries the text, and a contract row'spresents.help(FactSurface) names the entries that teach the fact. With the vocabulary in one home the compiler joins the two — an entry with no id, an id with no entry and a row naming neither all fail typecheck — instead of a ratchet discovering the drift after it shipped (2026-08-06-channel-contract.mdrevision 6;surface-interaction-conventions.md, amendment 2026-09-17).The ORDER is the help table's own, grouped by the surface each id belongs to, so the two files read side by side.