Optional ReadonlydirtiesSession?: booleanDoes a committed write here make the live session different from its last capture?
Optional Readonlyundoable?: falseOptional ReadonlyundoBarrier?: booleanDoes a committed write here invalidate the fine undo history (whole-console change)?
Optional ReadonlydirtiesSession?: booleanReadonlyundoable: truePrior field values ARE the inverse patch: the registry records {path, id, prior fields}
as the undo step and {path, id, landed fields} as the redo step.
Optional ReadonlyundoBarrier?: booleanOptional ReadonlyundoCoalesce?: UndoCoalesceDefaults to discrete; a drag-driven scalar declares continuous.
ReadonlyundoLabel: (id: ResourceId) => AnyCodedMessageThe entry's label, as a translatable CODE + parameters — never prose. Required with
undoable, because an unlabelled entry cannot be offered to an operator.
What a COMMITTED write to this entity means for the console's bookkeeping — the session's dirtiness and the operator's history — declared once beside ConsoleResource.path, ConsoleResource.ripples and ConsoleResource.lifecycle.
This exists because the bookkeeping must not be a hand-maintained list of verb names: every door that is not that one switch (REST, a control surface, an internal handle) then silently does neither — the operator mixes and nothing autosaves, and the undo stack stays empty. The declaration lives on the ROW, where the registry's one commit point acts on it for every door at once.
The defaults, and why they point where they do
dirtiesSessiondefaults totrue. A committed write to a row is, by construction, a change to console state somebody asked for; the safe direction to be wrong in is a redundant debounce reset, not a lost mix. Rows whose state the session snapshot does not carry — ephemeral surface state, momentary latches, telemetry demand, one-shot operations — declarefalseand say why in a comment.undoabledefaults tofalse, and requires a label when set. It is BOTH the journal's population and the undo's: a row that does not declare it records nothing at all. The gig-safety set — mute, solo, solo-safe, cue/monitor/talkback/dim, a spare'sheld, recall-safe — stays undeclared for that reason, argued in2026-09-01-undo-history.md§4. Undo must never restore a guessed value: the registry derives the inverse from the PRIOR field values it read before the write, so a row is undoable exactly when its patch keys are its state keys and those values are the whole story. A row whose PATCH is a COMMAND (running: true, a momentaryactive) has no inverse and must stay non-undoable.undoBarrierdefaults tofalse. A whole-console change (a session load, a scene recall) invalidates every slice-inverse recorded before it, so it clears both stacks.