pub fn run_update(opts: &Opts, env: &UpdateEnv) -> Result<Outcome, (String, u8)>
The full update flow. Everything before the swap is read-only.
(message, exit_code) for every failure mode; the caller renders it.
(message, exit_code)