jdx/mise · error

bootstrap compose project '{name}' wait_timeout requires wai

Error message

bootstrap compose project '{name}' wait_timeout requires wait = true

What it means

`wait_timeout` bounds how long mise waits for `docker compose up --wait` to report healthy; it only has meaning when waiting is enabled. `ComposeRequest::from_toml` rejects a timeout set while `wait` is false (its default) so the silently-ignored option cannot mislead you.

Source

Thrown at src/system/compose.rs:292

        if !config.project_dir.is_absolute() {
            bail!(
                "bootstrap compose project '{name}' project_dir must be absolute: {}",
                config.project_dir.display()
            );
        }
        validate_project_name(config.project_name.as_deref())?;
        validate_values("profile", &config.profiles)?;
        validate_values("service", &config.services)?;
        validate_values("oneshot service", &config.oneshot)?;
        validate_command("command", &config.command)?;
        validate_command("engine_command", &config.engine_command)?;
        if config.state == ComposeState::Absent && !config.services.is_empty() {
            bail!(
                "bootstrap compose project '{name}' services cannot be combined with state = \"absent\" because compose down removes the entire project"
            );
        }
        if !config.wait && config.wait_timeout.is_some() {
            bail!("bootstrap compose project '{name}' wait_timeout requires wait = true");
        }
        if config.wait_timeout == Some(0) {
            bail!("bootstrap compose project '{name}' wait_timeout must be greater than zero");
        }
        if config.state != ComposeState::Absent
            && (config.down_volumes || config.down_images.is_some())
        {
            bail!(
                "bootstrap compose project '{name}' down_volumes and down_images require state = \"absent\""
            );
        }
        if config.state != ComposeState::Running && config.renew_anonymous_volumes {
            bail!(
                "bootstrap compose project '{name}' renew_anonymous_volumes requires state = \"running\""
            );
        }
        let explicit_dependencies = config
            .depends_on

View on GitHub (pinned to 9dcfcaa0dc)

Solutions

  1. Add `wait = true` next to the timeout.
  2. Or remove `wait_timeout` if you do not actually want mise to wait for health.

Example fix

# before
[bootstrap.compose.web]
project_dir = "/srv/web"
wait_timeout = 120

# after
[bootstrap.compose.web]
project_dir = "/srv/web"
wait = true
wait_timeout = 120
Defensive patterns

Strategy: validation

Validate before calling

if let Some(t) = cfg.wait_timeout {
    assert!(cfg.wait, "wait_timeout = {t} requires wait = true");
}

Prevention

When it happens

Trigger: A compose table sets `wait_timeout = 120` without `wait = true` on the same table. Parsing bails immediately during `mise bootstrap compose plan`/`apply`.

Common situations: Adding a timeout while debugging slow healthchecks but forgetting the wait flag; upgrading configs after the wait feature changed defaults.

Understand the failure class

Related errors


AI-assisted analysis of jdx/mise@9dcfcaa0dc (2026-08-17). Data as JSON: /api/errors/f240df552c7a8ef3. Report an issue: GitHub.