zeroclaw-labs/zeroclaw · error · anyhow::Error

Emergency stop is disabled. Enable [security.estop].enabled

Error message

Emergency stop is disabled. Enable [security.estop].enabled = true in config.toml

What it means

The emergency-stop subsystem is opt-in. `handle_estop_command` checks `config.security.estop.enabled` first and bails for every `zeroclaw estop` verb (engage, status, resume) when it is false, so a disabled e-stop can never be engaged or resumed by accident.

Source

Thrown at src/main.rs:6503

                if total == 0 {
                    println!("{}", t("cli-plugin-migrate-none", "Nothing to migrate."));
                }
                Ok(())
            }
        },
    }
}

#[cfg(feature = "agent-runtime")]
fn handle_estop_command(
    config: &Config,
    estop_command: Option<EstopSubcommands>,
    level: Option<EstopLevelArg>,
    domains: Vec<String>,
    tools: Vec<String>,
) -> Result<()> {
    if !config.security.estop.enabled {
        bail!("Emergency stop is disabled. Enable [security.estop].enabled = true in config.toml");
    }

    let config_dir = config
        .config_path
        .parent()
        .context("Config path must have a parent directory")?;
    let mut manager = security::EstopManager::load(&config.security.estop, config_dir)?;

    match estop_command {
        Some(EstopSubcommands::Status) => {
            print_estop_status(&manager.status());
            Ok(())
        }
        Some(EstopSubcommands::Resume {
            network,
            domains,
            tools,
            otp,

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Add `enabled = true` under `[security.estop]` in the config file ZeroClaw actually loads (check the path with `zeroclaw config get config_path`) and restart
  2. If OTP-protected resume is also wanted, set `require_otp_to_resume = true` and enable `[security.otp]` at the same time
  3. Confirm the subsystem answers with `zeroclaw estop status`

Example fix

# before
[security.estop]
# section absent, or enabled = false
# after
[security.estop]
enabled = true
Defensive patterns

Strategy: validation

Validate before calling

[ "$(zeroclaw config get security.estop.enabled 2>/dev/null)" = "true" ] || {
  echo "e-stop disabled in the active config; refusing to run the drill"; exit 1;
}

Prevention

When it happens

Trigger: Any `zeroclaw estop ...` command — including `zeroclaw estop status` — while the active config.toml lacks `[security.estop] enabled = true` (the default is false).

Common situations: Fresh installs where estop was never enabled; disabling estop after testing and forgetting to re-enable; editing a different config.toml than the one ZeroClaw loads (custom --config path or environment override).

Related errors


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/1a6e0a0c730a1040. Report an issue: GitHub.