herdrdev/herdr · warning

remote herdr server stop cancelled

Error message

remote herdr server stop cancelled

What it means

During a remote server restart driven by a protocol mismatch, herdr asks to stop the old remote server. When the reason is ProtocolMismatch and the user declines (non-empty answer that is not accepted), this Interrupted error aborts the stop/restart flow rather than proceeding against the user's wishes.

Source

Thrown at src/remote/attach.rs:1340

    let prompt = if reason == RemoteServerRestartReason::ProtocolMismatch {
        "stop the remote server and continue attaching? [Y/n] "
    } else {
        "restart the remote server now? [y/N] "
    };
    eprint!("{prompt}");
    io::stderr().flush()?;

    let mut answer = String::new();
    io::stdin().read_line(&mut answer)?;
    let answer = answer.trim().to_ascii_lowercase();
    if answer == "y" || answer == "yes" {
        return Ok(true);
    }
    if answer.is_empty() && reason == RemoteServerRestartReason::ProtocolMismatch {
        return Ok(true);
    }
    if reason == RemoteServerRestartReason::ProtocolMismatch {
        return Err(io::Error::new(
            io::ErrorKind::Interrupted,
            "remote herdr server stop cancelled",
        ));
    }

    Ok(false)
}

fn live_handoff_remote_server(ssh: &RemoteSsh, remote_herdr: &RemoteHerdr) -> io::Result<()> {
    let command = format!(
        "{} server live-handoff --import-exe {} --expected-protocol {} --expected-version {}",
        remote_herdr.shell_path,
        remote_herdr.shell_path,
        CURRENT_PROTOCOL,
        current_version()
    );
    let output = ssh.sh_output(&command)?;
    if !output.status.success() {

View on GitHub (pinned to f457cff4f2)

Solutions

  1. Answer with the empty default or 'y' at the prompt to allow the stop
  2. Update the remote herdr server so protocol versions match and no restart is needed
  3. Stop the stale remote server manually (herdr server stop on the remote) and re-attach
Defensive patterns

Strategy: try-catch

Try / catch

match attach() {
    Err(e) if e.kind() == std::io::ErrorKind::Interrupted => {
        eprintln!("restart declined; keeping old remote server");
        Ok(())
    }
    r => r,
}

Prevention

When it happens

Trigger: Local and remote herdr report different protocol versions; the user is prompted to stop the old remote server and explicitly answers no (a non-empty refusal). Empty answers default to accepting the stop.

Common situations: Version skew between local herdr and a long-running remote server installed earlier; user declines the stop out of caution and the attach cannot continue.

Related errors


AI-assisted analysis of herdrdev/herdr@f457cff4f2 (2026-08-28). Data as JSON: /api/errors/fadb8ae3aaf0784b. Report an issue: GitHub.