warpdotdev/warp · error

`runner_id` is set in the config file but runner support is

Error message

`runner_id` is set in the config file but runner support is not enabled

What it means

Thrown by the agent run path after merging the loaded config file with defaults: the merged config contains `runner_id`, but the CloudRunners feature flag is disabled in this build. The `run` command has no `--runner` flag to validate against, so this explicit check is the only guard. It rejects runner targeting on builds where cloud runner support has not been rolled out.

Source

Thrown at app/src/ai/agent_sdk/mod.rs:382

    // No config file is involved — the worker never passes --file alongside --task-id.
    if args.task_id.is_some() {
        return build_server_side_task(args, resolved_skill, ctx);
    }

    let loaded_file = match args.config_file.file.as_deref() {
        Some(path) => Some(config_file::load_config_file(path)?),
        None => None,
    };

    let cli_mcp_servers = build_mcp_servers_from_specs(&args.all_mcp_specs())?;

    // Merge precedence: file < CLI < skill
    let file_merged = config_file::merge_with_precedence(loaded_file.as_ref(), Default::default());

    // Runner support is gated. The `run` command has no `--runner` flag, but a
    // config file can still set `runner_id`, so reject it when the flag is off.
    if file_merged.runner_id.is_some() && !FeatureFlag::CloudRunners.is_enabled() {
        return Err(anyhow::anyhow!(
            "`runner_id` is set in the config file but runner support is not enabled"
        ));
    }

    // Skill provides base_prompt and optionally name
    let (skill_name, runtime_base_prompt) = match resolved_skill {
        Some(skill) => (Some(skill.name.clone()), Some(skill.instructions.clone())),
        None => (None, None),
    };

    // When a non-Oz harness is active, --model targets the harness rather than the Oz model.
    let harness_model_id = if args.harness != Harness::Oz {
        args.model.model.clone()
    } else {
        None
    };
    let harness_override = (args.harness != Harness::Oz).then_some(HarnessConfig {
        harness_type: args.harness,

View on GitHub (pinned to e72fd7aacb)

Solutions

  1. Remove `runner_id` from the agent config file so the task runs on the default runtime
  2. Switch to a build/channel where the CloudRunners feature flag is enabled (dogfood or preview build)
  3. Keep per-channel config files so a stable-channel run never sees a runner_id key

Example fix

# before (agent.toml, on a stable build without CloudRunners)
runner_id = "rnr_123"

# after
# runner_id removed; task runs on the default runtime
Defensive patterns

Strategy: validation

Validate before calling

# Before running on a stable channel, reject configs that target runners
if grep -Eq '^[[:space:]]*runner_id[[:space:]]*=' "$CONFIG" && ! is_dogfood_build; then
  echo "config sets runner_id but this build has no runner support" >&2
  exit 1
fi
warp agent run --config "$CONFIG"

Prevention

When it happens

Trigger: Running `warp agent run` with a config file (resolved via the config-file path in the run args) that sets `runner_id`, on any build where `FeatureFlag::CloudRunners.is_enabled()` returns false (flag absent from DOGFOOD/PREVIEW/RELEASE flag sets for that channel).

Common situations: A config file authored on a dogfood or preview build (where CloudRunners is on) is reused on a stable build; a leftover `runner_id` key from an earlier runner experiment; CI pinned to an older CLI while the config assumes runner support.

Related errors


AI-assisted analysis of warpdotdev/warp@e72fd7aacb (2026-08-16). Data as JSON: /api/errors/f63c167adf505c17. Report an issue: GitHub.