{"record":{"id":"1a6e0a0c730a1040","repo":"zeroclaw-labs/zeroclaw","slug":"emergency-stop-is-disabled-enable-security-estop","errorCode":null,"errorMessage":"Emergency stop is disabled. Enable [security.estop].enabled = true in config.toml","messagePattern":"Emergency stop is disabled\\. Enable \\[security\\.estop\\]\\.enabled = true in config\\.toml","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/main.rs","lineNumber":6503,"sourceCode":"                if total == 0 {\n                    println!(\"{}\", t(\"cli-plugin-migrate-none\", \"Nothing to migrate.\"));\n                }\n                Ok(())\n            }\n        },\n    }\n}\n\n#[cfg(feature = \"agent-runtime\")]\nfn handle_estop_command(\n    config: &Config,\n    estop_command: Option<EstopSubcommands>,\n    level: Option<EstopLevelArg>,\n    domains: Vec<String>,\n    tools: Vec<String>,\n) -> Result<()> {\n    if !config.security.estop.enabled {\n        bail!(\"Emergency stop is disabled. Enable [security.estop].enabled = true in config.toml\");\n    }\n\n    let config_dir = config\n        .config_path\n        .parent()\n        .context(\"Config path must have a parent directory\")?;\n    let mut manager = security::EstopManager::load(&config.security.estop, config_dir)?;\n\n    match estop_command {\n        Some(EstopSubcommands::Status) => {\n            print_estop_status(&manager.status());\n            Ok(())\n        }\n        Some(EstopSubcommands::Resume {\n            network,\n            domains,\n            tools,\n            otp,","sourceCodeStart":6485,"sourceCodeEnd":6521,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/src/main.rs#L6485-L6521","documentation":"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.","triggerScenarios":"Any `zeroclaw estop ...` command — including `zeroclaw estop status` — while the active config.toml lacks `[security.estop] enabled = true` (the default is false).","commonSituations":"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).","solutions":["Add `enabled = true` under `[security.estop]` in the config file ZeroClaw actually loads (check the path with `zeroclaw config get config_path`) and restart","If OTP-protected resume is also wanted, set `require_otp_to_resume = true` and enable `[security.otp]` at the same time","Confirm the subsystem answers with `zeroclaw estop status`"],"exampleFix":"# before\n[security.estop]\n# section absent, or enabled = false\n# after\n[security.estop]\nenabled = true","handlingStrategy":"validation","validationCode":"[ \"$(zeroclaw config get security.estop.enabled 2>/dev/null)\" = \"true\" ] || {\n  echo \"e-stop disabled in the active config; refusing to run the drill\"; exit 1;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Enable `[security.estop] enabled = true` in the base config template, not per-machine edits","Include `zeroclaw estop status` as a deploy smoke test","Pin the config path (--config or env) in scripts so you never read a stale file"],"tags":["security","estop","config","cli","zeroclaw"],"backgroundTag":"feature-not-enabled-in-config","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}