Phase E.3 — block as held by the srv reducer’s canonical state.
Blocks are owned by exactly one tab; the tab’s block_ids
field gives the ordering. Block content (view, meta, runtimeopts)
is intentionally not yet tracked — E.3 ships block lifecycle
only; metadata + view land in a follow-up.
Phase E.2b — tab as held by the srv reducer’s canonical state.
Tabs are owned by exactly one workspace; the workspace’s
tab_ids field gives the ordering. E.3 adds block_ids so the
tab tracks which blocks live inside it.
Phase E.5 — window-to-workspace mapping as held by the srv
reducer’s canonical state. Mirrors the persistent
Window.workspaceid field. Used by sagas (TearOff/Restore/
CreateWindow/CloseWindow) that need to coordinate the
window↔workspace lifecycle atomically.
Phase E.2 — workspace as held by the srv reducer’s canonical
state. Mirrors the persistent Workspace struct in
agentmux_srv::backend::obj::Workspace but with the reducer-
canonical fields the cross-process events care about.
Coarse-grained launcher state. Spec §4: Starting → Running →
Quitting → Dead, no other transitions allowed. The reducer in
agentmux-launcher::reducer enforces this; a violation panics
(Job Object reaps via OS).