Undo
Group multiple mutations into ONE native Live undo step. begin_undo_step (MCP) / vibrai undo begin (CLI) returns a token; pass that same token back to end_undo_step / vibrai undo end —token to close the bracket — every Vibrai mutation on any surface in between lands in a single Edit → Undo entry. Auto-closes after ttl_seconds (default 300) — after expiry a late end gets NO_OPEN_UNDO_STEP (or STALE_UNDO_TOKEN if a newer bracket is already open); the mutations up to expiry are still grouped. Nested begins fold into the open bracket (same token, one real step). generate, apply_automation_template, and render_automation (also reached via vibrai automation render and generate’s with_automation flag) all bracket themselves automatically (undo_bracket: “native” in their results; “unavailable” means the Python remote script wasn’t reachable and the op ran unbracketed, OR the bracket opened successfully but its closing call failed — a known limitation under fast/programmatic usage (cssllcio/Vibrai#847) — so read “unavailable” as “don’t trust this was cleanly grouped,” not narrowly as “bridge was down”; null means the operation had nothing to write and never reached Live). Bracket composed multi-step sequences; single calls don’t need it.