Collapse Undo Command
data class CollapseUndoCommand(val contextId: <Error class: unknown class>, val survivorId: String, val retiredId: String)
Names one collapse to undo, inside the context that owns it.
The context is required, and it is the reason this type exists. Undo used to take a survivor id and a retired id and nothing more, so ids picked up anywhere at all could reverse a collapse in a context the caller has no business writing to, and every deployment that cared about that had to bolt its own ownership check on in front. undoSingleCollapse now owns the check: both propositions have to live in contextId, and an id from elsewhere is refused with CollapseUndoContextMismatchException before anything is written.