Phase E.5 — record a new window→workspace mapping. Validates
the parent workspace exists; otherwise emits Event::Error
(non-fatal). Idempotent on duplicate window_id: re-issuing
for the same window updates the workspace pointer if it
changed, or no-ops if identical.
Phase E.5 — change which workspace a window points at. Errors
(non-fatal) if the window or destination workspace is unknown.
No-op if the window is already pointing at the destination.
Phase E.5.x (issue #855) — apply a meta-patch to a window. Pass-
through to Event::WindowMetaUpdated; the persist subscriber
performs the merge against wstore. Same shape as
handle_update_workspace_meta — reducer state does NOT track
window meta, the migration property is “every mutation goes
through the reducer’s broadcast bus” so the WaveObjUpdate bridge
can fan out to the frontend.