Readonlyinvalid-message: NoMessageParamsThe request did not parse against the wire schema.
Readonlyno-stagebox-registry: NoMessageParamsNo persisted stagebox registry, so a rename has nothing to write to.
Readonlyno-state-dir: NoMessageParamsNo --state-dir/OPENMIXER_STATE_DIR, so nothing the operator sets can persist.
Readonlysip-disarmed: NoMessageParamsSolo-in-place is locked; it must be unlocked in Setup first.
Readonlytakeover-unsupported: NoMessageParamsThis server cannot take the device graph over from whatever owns it.
Readonlychannel.order.drive-before-eq.detail: StageOrderParamsReadonlychannel.order.drive-before-eq.title: StageOrderParamsDrive runs before the EQ — informational, the most defensible of the three.
Readonlychannel.order.gate-not-first.detail: StageOrderParamsReadonlychannel.order.gate-not-first.title: StageOrderParamsThe gate is not the first stage this strip walks.
Readonlychannel.order.tail-before-dynamics.detail: StageOrderParamsReadonlychannel.order.tail-before-dynamics.title: StageOrderParamsA time-based tail (delay or reverb) runs before the gate or the compressor.
Readonlyclock.device-disabled.detail: DeviceDisabledParamsReadonlyclock.device-disabled.rate-detail: DeviceDisabledRateParamsSame finding, rates known (amendment 2026-09-15) — the real reason, not the generic one.
Readonlyclock.device-disabled.title: DeviceDisabledParamsAn undeclared ALSA device the exclusivity policy has disabled.
Readonlyclock.device-row.rates-unknown: DeviceDisabledParamsSame list row, rates not yet probed — absence, never a fabricated menu.
Readonlyclock.device-row.resampled: DeviceRowReasonParamsSame list row, rates known but the graph rate is NOT among them — resampled either way; an ENABLED device reading this is the accepted-risk case, shown, never hidden.
Readonlyclock.device-row.synchronous: DeviceRowReasonParams/clock/devices list row reason (follow-up, 2026-09-15): this device's rates include the
graph rate — it runs sample-synchronous, whichever way its enabled reads.
Readonlyclock.driver-ring-shallow.detail: DriverRingShallowParamsReadonlyclock.driver-ring-shallow.title: DriverRingShallowParamsThe driver ALSA ring's period-num is below the proven-safe minimum for the current
quantum/rate (driver-ring-policy.ts).
Readonlyclock.follower-rate-mismatch.detail: FollowerRateMismatchParamsReadonlyclock.follower-rate-mismatch.title: FollowerRateMismatchParamsA linked, running sink whose native rate set does not include the graph rate.
Readonlyclock.master-profile.detail: MasterProfileParamsReadonlyclock.master-profile.title: MasterProfileParamsThe declared clock master is NOT in the pro-audio profile (amendment 2026-09-15 §4) —
the console needs every port of its clock reference, and a desktop sound panel's stereo
profile publishes two. Informational: switching the profile drops the card's links, so it
stays the operator's act.
Readonlyclock.no-owner.detail: NoMessageParamsReadonlyclock.no-owner.title: NoMessageParamsopenmixer is following and nothing on the segment was seen owning the pace.
Readonlyclock.synthetic-driver.detail: NoMessageParamsReadonlyclock.synthetic-driver.title: ClockDriverParamsA software timer is driving the graph: audio runs, its timing means nothing.
Readonlyclock.two-owners.detail: ClockOwnerParamsReadonlyclock.two-owners.title: NoMessageParamsopenmixer owns the pace and so does something else — the classic click/dropout cause.
Readonlyclock.unqualified-master.title: NoMessageParamsopenmixer owns the pace off a reference that does not qualify for it.
Readonlydiscovery.blind.global: BlindGlobalParamsA protocol's probe could not scan at all.
Readonlydiscovery.blind.link: BlindLinkParamsA protocol's probe could not scan one named link.
Readonlydiscovery.reac.active-probe-failed: ProbeErrorParamsThe active probe threw on this link.
Readonlydiscovery.reac.active-probe-no-reason: NoMessageParamsThe active probe declined to run and gave no reason.
Readonlydiscovery.reac.link-busy: BusyLinkParamsThe link carries traffic, so it was deliberately NOT active-probed.
Readonlydiscovery.reac.nic-enumeration-failed: ProbeErrorParamsThe host's NIC list could not be read, so no link was looked at.
Readonlydiscovery.reac.not-listening-here: OtherScopesParamsreac-pw is watching other NICs, so this one went unscanned.
Readonlydiscovery.reac.not-publishing: NoMessageParamsNo reac-playback node is publishing discovery on this host.
Readonlydiscovery.reac.passive-listen-failed: ProbeErrorParamsThe passive listen threw on this link.
Readonlydiscovery.reac.predates-discovery: NoMessageParamsThis reac-pw predates the discovery properties.
Readonlydiscovery.reac.registry-unloaded: NoMessageParamsThe native PipeWire registry is not loaded, so reac-pw's discovery cannot be read.
Readonlydiscovery.reac.stale: StaleProbeParamsEvery published sighting has aged out — the publisher appears wedged.
Readonlydiscovery.reac.unknown-state: UnknownProbeStateParamsreac-pw reports a discovery state this build does not understand.
Readonlydiscovery.reac.unparseable: NoMessageParamsreac-pw published discovery data that did not parse.
Readonlyexport.already-running: NoMessageParamsOne export at a time, for render.already-running's reason.
Readonlyexport.empty: NoMessageParamsThe MAIN capture holds no frames: an armed track whose source never made a sound.
Readonlyexport.no-engine: NoMessageParamsThe console has no take library, so nothing can be exported.
Readonlyexport.no-main: NoMessageParamsThe take carries no MAIN capture, and the print IS the main capture — there is nothing lesser to offer in its place.
Readonlyexport.no-space: RenderSpaceParamsThe print does not fit on the disk. Refused BEFORE the first sample, like a render's.
Readonlyexport.unreadable: NoMessageParamsThe MAIN capture cannot be read as a float WAV, so no print can be made from it.
Readonlyfeedback.loop.no-cuttable-edge: NoMessageParamsThe standing routing loop runs entirely through console structure — no operator patch lies on it, so there is nothing a break may cut without dismantling the desk.
Readonlyhardware.contradiction.channels: ContradictionCountParamsThe configured preamp count is not the count the box reports. The box wins.
Readonlyhardware.contradiction.model: ContradictionParamsThe configured box model is not the model the box reports. The box wins.
Readonlyhardware.contradiction.width: ContradictionCountParamsThe configured channel width is not the width the box reports. The box wins.
Readonlyhardware.missing.bridge-down: NoMessageParamsThe REAC bridge itself is down, so nothing could establish.
Readonlyhardware.missing.clause-separator: NoMessageParamsWhat joins two clauses — keyed so a locale can punctuate its own way.
Readonlyhardware.missing.configured-on: ConfiguredIfaceParamsThe rig's own configuration expects this box on a named NIC.
Readonlyhardware.missing.input-patches: DependentCountParamsRestored channel input patches feeding from the absent device.
Readonlyhardware.missing.no-patches: NoMessageParamsThe device is absent but nothing in the show is patched to it.
Readonlyhardware.missing.not-connected: NoMessageParamsThe bridge sees the box's node but the box has not established.
Readonlyhardware.missing.output-routes: DependentCountParamsRestored bus output routes feeding to the absent device.
Readonlyhardware.missing.summary: MissingHardwareParamsThe whole "what depends on this absent device" line, built from the clauses below.
Readonlyhardware.missing.surface: NoMessageParamsThe absent device is a control surface.
Readonlyinput.foreign-link-removed.detail: ForeignLinkParamsReadonlyinput.foreign-link-removed.title: ForeignLinkParamsA foreign link onto a console INPUT port, from an undeclared device, removed (§5b,
amendment 2026-09-17) — the input-side twin of output.foreign-link-removed.
Readonlymeasurement.already-running: NoMessageParamsA sweep is already in progress; a second one would fight it for the CPU.
Readonlymeasurement.engine-live: MeasurementBusyParamsThe engine is processing audio, so a CPU-heavy plugin sweep is refused.
Readonlymeasurement.no-rates: NoMessageParamsNeither a live rate nor a supported-rate list is known, so nothing can be measured.
Readonlymeasurement.nothing-local: NoMessageParamsNothing has been measured on this machine, so there is nothing to discard.
Readonlyoutput.app-stream-parked.detail: AppStreamParamsReadonlyoutput.app-stream-parked.title: AppStreamParamsSafe mode: a new app stream was patched NOWHERE, and is waiting in the patchbay.
Readonlyoutput.default-sink-foreign.detail: DefaultSinkForeignParamsReadonlyoutput.default-sink-foreign.title: DefaultSinkForeignParamsThe console asserted default.audio.sink at its parking sink and something else holds it
(§6) — query-and-compare, so this says what disagrees rather than re-asserting blindly.
Readonlyoutput.foreign-link-removed.detail: ForeignLinkParamsReadonlyoutput.foreign-link-removed.title: ForeignLinkParamsA foreign link onto a routed physical output, removed. Informational: the exclusive latch is on and this is what it did, named so a silent app is explainable.
Readonlyoutput.route-adopted.detail: RouteAdoptedParamsReadonlyoutput.route-adopted.title: RouteAdoptedParamsA link the OPERATOR made by hand, taken into the bus's route row (§4). Never silent: the desk now states what they did, and the session will re-lay it.
Readonlyoutput.route-healed.detail: RouteHealedParamsReadonlyoutput.route-healed.title: RouteHealedParamsA bus's destination stopped existing and the console re-routed it. Never silent: a heal is an act the console took on the operator's desk.
Readonlyoutput.route-no-target.detail: RouteNoTargetParamsReadonlyoutput.route-no-target.title: RouteNoTargetParamsThe destination is gone and nothing eligible exists to take it — the row stays unrouted and the next cycle tries again.
Readonlyoutput.route-restored.detail: RouteRestoredParamsReadonlyoutput.route-restored.title: RouteRestoredParamsThe card a bus was healed OFF came back and the row re-took it (§9g R2). Never silent, for the same reason a heal is not: the console moved the operator's mix.
Readonlyplugins.instances-exhausted: PluginInstancesParamsEvery mod-host instance id is spoken for, so no further plugin can be racked.
Readonlyrecord.already-running: NoMessageParamsA take is already running; a second one would give a channel two rings and neither would hold the whole show.
Readonlyrecord.no-engine: NoMessageParamsThere is no audio engine to record from.
Readonlyrecord.no-space: RecordSpaceParamsThe disk cannot hold the take's first minutes, so starting would be a promise it cannot keep and the show would truncate at the worst moment.
Readonlyrecord.nothing-armed: NoMessageParamsNo channel would be captured — everything is opted out, or nothing is patched. Starting anyway produces a folder nobody can explain the next morning.
Readonlyrecord.rate-unknown: NoMessageParamsThe graph has not resolved a sample rate, so there is nothing honest to stamp the take with. A take carries the rate it was captured at (§5) and the NODE is the only thing that knows what that is; a file stamped with a default is one the desk will later refuse to play and cannot explain (2026-09-01).
Readonlyrecord.vsc-active: NoMessageParamsA take is loaded for a virtual soundcheck, and record XOR playback holds on one graph (§3.5): capturing while a soundcheck replays would write yesterday's take back to disk under a new name, with nothing to tell the two apart.
Readonlyrender.already-running: NoMessageParamsOne render at a time: two at once would only halve each other's speed.
Readonlyrender.no-engine: NoMessageParamsThis build carries no offline render engine, so the console cannot render a take.
Readonlyrender.no-space: RenderSpaceParamsA render writes a second copy of every selected track, and the disk cannot hold it. Refused BEFORE the first sample rather than halfway through a folder of half-files.
Readonlyrender.no-tracks: NoMessageParamsNot one track of the take could be opened as a renderable file.
Readonlyrender.playback: NoMessageParamsA virtual soundcheck is replaying, which is the desk in use.
Readonlyrender.recording: NoMessageParamsA take is being CAPTURED. §0.5 puts rendering on a console that is idle after the show, and a capture is the one thing here that cannot be done again.
Readonlyreverse.no-tracks: NoMessageParamsNot one selected track of the take could be opened as a renderable file.
Readonlyreverse.region-outside-take: NoMessageParamsThe region names frames the take does not carry — including an empty one. A render that quietly moved the boundary to what fits would answer a question nobody asked.
Readonlyreverse.region-too-long: NoMessageParamsThe mirror reads the region BACKWARDS, so the region is held in memory and the binding declares how much of it it will hold. Refused at the ceiling, never clamped to it.
Readonlyreverse.reverb-off: NoMessageParamsThe reverb this render was asked to use is OFF. The render would then be a copy of the source under a new name, which is the worst answer an operation can land.
Readonlyrt.budget: RtBudgetParamsThe engine's measured share of its real-time budget.
Readonlystagebox.model-table-used.detail: StageboxModelTableUsedParamsReadonlystagebox.model-table-used.title: StageboxModelTableUsedParamsA DECLARED box (bound, but not on the wire right now) is publishing its width/geometry from the closed model table rather than a live device — the wire-over-table law's own admission that it has nothing better right now.
Readonlyundo.label.bpm: NoMessageParamsThe desk tempo.
Readonlyundo.label.delay: ScopeLabelParamsA strip's delay.
Readonlyundo.label.drive: ScopeLabelParamsA strip's drive stage.
Readonlyundo.label.eq: ScopeLabelParamsA channel's EQ.
Readonlyundo.label.gate: ScopeLabelParamsA strip's gate.
Readonlyundo.label.paste: PasteLabelParamsA clipboard paste onto one or more channels (#57) — count is how many it landed on.
Readonlyundo.label.reverb: ScopeLabelParamsA strip's reverb.
Readonlyundo.label.route: RouteLabelParamsA route toggled between two scopes.
Readonlyundo.label.send: RouteLabelParamsA send's level or tap — from is the source strip, to the destination bus.
Readonlyundo.label.stripOrder: NoMessageParamsThe desk's strip order — the /channel roster reordered (console-wide, no strip scope).
Readonlyvsc.no-engine: NoMessageParamsThere is no audio engine to play a take through.
Readonlyvsc.no-such-take: NoMessageParamsThe take id names nothing in the take library.
Readonlyvsc.no-take: NoMessageParamsNo take is loaded, so there is nothing for a channel to listen to.
Readonlyvsc.no-track: NoMessageParamsThe take carries no track for this channel, so it stays on its live input — a soundcheck never replays silence over a microphone that is working (§3.2).
Readonlyvsc.not-engaged: NoMessageParamsPlay means hear it (§3.4): the write would run the transport with no channel listening to the take, so it is refused. Engage in the same write, or check the take can serve these channels.
Readonlyvsc.rate-mismatch: VscRateParamsThe take was captured at one rate and the graph runs at another. There is no resampler on the playback path by design (§5), so it would play at the wrong pitch and the wrong length: match the clock or re-record.
Readonlyvsc.recording: NoMessageParamsA take is being RECORDED, and record XOR playback holds on one graph (§3.5).
Readonlyvsc.take-unplayable: NoMessageParamsThe take is there and its audio is not playable — a missing, truncated or re-encoded track file. A soundcheck missing one channel is worse than one that did not start, because nothing about it looks wrong.
Readonlyxrun.growing.detail.raise: XrunRaiseParamsRoom to raise the quantum; no node's request explains the current one.
Readonlyxrun.growing.detail.raise-holder: XrunRaiseHolderParamsRoom to raise the quantum, AND a node's request explains the current one.
Readonlyxrun.growing.detail.relax: XrunRelaxParamsNo room left to raise (at the ceiling); a node's request explains the current quantum.
Readonlyxrun.growing.detail.unknown: XrunGraphParamsNo room left to raise, and no node's request explains the current quantum either.
Readonlyxrun.growing.title: XrunRateParamsXruns are landing now (a delta since the previous observation, never the running total).
Readonlyxrun.node.detail: NodeXrunParamsReadonlyxrun.node.title: NodeXrunParamsOne node's own xrun counter is moving — not the graph aggregate above.
Every message code, mapped to the parameters its localised sentence interpolates.
The wire codes in the first block are the ones already shipped; their spelling is a wire contract and must not be renamed (a renamed code silently degrades every older client to the raw code text).