- Remove conn.commit() from write_undo_entry (caller's with conn: block owns commit)
- Remove conn.commit() from _restore_category raw INSERT path (same reason)
- Convert undo_cascade to with conn: pattern; drop explicit commit/rollback
- Remove broad except-swallow from _delete_target; let XNotFound propagate to error envelope
- Add combine_output_var opt-out branch that updates payload.output_var, not name field
- Move new_name validation guards above with conn: in cascade-on path
- Add regression tests: delete-not-found returns error; combine opt-out rename updates payload