Optional ReadonlyallocationThe console the show was mixed on — the DECLARATION the desk was built from, not a derivation of it (ruling 2026-08-14: "a session must store its allocation, otherwise how do we restore it?").
The channel lists above say which strips existed; only this says how big the console
they lived on WAS. That distinction is load-bearing because the native summing lanes are
sized at allocation time: restoring a 24-input show onto an 8-input desk by growing the
strip list alone is refused by MAIN itself (bus main/1 is full (16 input slots)), so
the size has to be re-declared through StructuralDsp.applyAllocation — the one
doorway that builds strips and sizes their bus lanes together — before any value lands.
Absent on sessions saved before this field: the console keeps the size it booted with and restores what fits, which is the behaviour those sessions were saved under.
Optional ReadonlybpmConsole-wide tempo (BPM) for tempo-synced FX. Optional + additive: absent → the default.
ReadonlybusesReadonlychannelsOptional ReadonlycueThe cue bus + console-wide cue state (mode, monitor-output designation) — the cue/solo-to-monitor spec. Optional + additive: absent on sessions saved before the feature, which restore to the PFL default with no monitor output.
ReadonlydcasOptional ReadonlyexpectedThe expected hardware at save time (issue #154) — stageboxes, soundcards, control surfaces. On restore the server diffs it against what is present and surfaces a missing-hardware summary. Optional + additive: absent on sessions saved before this field.
Optional ReadonlyheadThe desk's DESIRED analog head-amp — phantom / pad / gain — keyed by PHYSICAL INPUT, not by
channel (the one-physical-input and head-amp-by-port laws; input-patchbay.ts, spec §6c:
"the kept value has one store, and it is the session file"). A channel's own phantom /
pad / headAmpGainDb fields already round-trip the values for a port CURRENTLY sourced
by that channel; this block is what survives a re-patch or a restart for a port that is
not — a channel repatched away from a preamp still owes it the phantom it turned on, and
before this block that fact lived only in the running process's memory.
Absence is a fact, exactly like stripOrder: a session with no headAmps block
restores nothing and asserts no default onto any preamp — the house floor
(/console/defaults) is a never-seen port's answer, never this block's.
ReadonlymatrixReadonlymuteMute groups (membership + live active flag), captured/restored like dcas.
ReadonlyoutputsOptional ReadonlypagesThe operator's USER pages (SurfacePageJson) — show content, beside the look above. Absent restores the EMPTY set (never the previous session's pages): a show that built no page has none, and a page is never invented.
Optional ReadonlypendingThe shape the console will be built at on its NEXT BOOT — an accepted reshape waiting for a
restart (2026-09-14-console-allocation.md §4(d)). Absent when none is scheduled.
It lives HERE, beside allocation, and not in a store of its own: the session is the one place a console's definition is recorded, and "the shape it is" and "the shape it will be" are two facts about the same thing. A second store for the next shape is the second ledger the house forbids — two answers to "how big is this desk", neither announcing the other.
Nothing applies it live. The boot seed reads it AHEAD of allocation and builds at it, grow or shrink alike, because a fresh build has no mid-show ratchet to satisfy; on that boot it becomes the declared shape and this field goes away.
Optional ReadonlypreferencesThe operator's view preferences — the desk's LOOK (see SurfacePreferencesJson). Absent means the console never had any set, which seeds DEFAULT_SURFACE_PREFERENCES; absence is a fact, not a migration.
Optional ReadonlyreacThe REAC segments' DESIRED config (ReacSegmentConfigJson), keyed by the segment's
own /reac/segment/{name} address. Absent restores NOTHING ASSERTED — the daemon's
best-drivable default stands — never a hardcoded rate and never the previous show's.
Optional ReadonlysafetyGig-safety pre-loads (spares, mute groups, panic targets). Optional and additive — a session written before this field is read back with no safety config (see emptySafety), so the schema version is unchanged.
Optional ReadonlyspeakerThe loudspeaker-alignment SETUP — which channel carries the measurement microphone and
which output is the reference (/console/speakerAlign, spec 2026-08-31-smart-alignment.md
§9b, amended 2026-09-08 — issue #838: a console restart answered {mic:null,reference:null}
and every loudspeaker row read no-mic). A show fact like talkback's mic route, not
a view choice: "the mic is on input 9" describes how THIS alignment session was set up, for
whoever stands at the desk next. Absent restores UNPICKED, never the previous show's picks.
Optional Readonlymic?: ChannelRefJsonOptional Readonlyreference?: ChannelRefJsonOptional ReadonlyreferenceSide?: ChannelRoleWHICH SIDE of the reference output is the reference BOX (#845) — absent reads as 'L',
which is what a stereo desk has always meant by "aligned to MAIN".
Optional ReadonlystripThe DESK's strip order — the operator's reordering of the /channel roster, one order
for every client (ruling 2026-08-11). The stored fact is the OVERRIDE only: absent means
the operator never reordered, which reads as the allocation's natural order — the
derivation is never stored. Strips the loaded console does not hold are dropped on read,
and ones the override does not name append in natural order; the override itself is
never rewritten.
ReadonlysurfacesOptional ReadonlytalkbackThe talkback MIC route — a show fact (operator ruling 2026-08-19), unlike the generator routes, which are instrument state the assignment row re-declares at runtime and which a session therefore never carries. Optional + additive: absent restores an unrouted mic.
The full console body — every addressable element of state.