jdx/mise · error

incompatible data in (stored , current ); migrate or reset…

Error message

incompatible {preset_name} data in {} (stored {}, current {}); migrate or reset it explicitly

What it means

If the daemon data directory already exists, initialize compares its .mise-daemon-version marker (format 'preset:major') with the marker computed from the currently resolved binary. A mismatch means the existing data was created by an incompatible major/preset and mise refuses to proceed rather than corrupting it.

Solutions

  1. Move or remove the old data directory and re-initialize fresh (dump/restore data first if needed)
  2. Pin the tool back to the major matching the stored marker
  3. Manually migrate the data (pg_dump/pg_upgrade) then reset the directory

Example fix

# before (marker stored postgres:15, binary now 16)
postgres = "16"
# after: either pin back
postgres = "15"
# or start fresh after dumping data
rm -rf ~/.local/share/mise/daemons/postgres/data
Defensive patterns

Strategy: validation

Validate before calling

cat ~/.local/share/mise/daemons/postgres/data/.mise-daemon-version 2>/dev/null # compare with pinned major in mise.toml

Prevention

When it happens

Trigger: Pointing a daemon at a data directory previously initialized with a different preset name or a different major version (e.g. postgres 15 data now used with postgres 16), during initialize.

Common situations: Upgrading the pinned postgres major in mise.toml while reusing the old data dir; renaming the preset; stale data dir left after a tool version change.

Understand the failure class

Background: Checksum mismatch errors: "checksum verification failed", "digest mismatch", "expected vs actual checksum" — what they mean and how to fix them — this error's family across 41 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/25f14457fb816e8d. Report an issue: GitHub.

Appendix: source

Thrown at src/daemons/presets.rs:198

        bail!("daemon presets are not supported on Windows yet");
    }
    let preset = preset(preset_name)?;
    let parent = data
        .parent()
        .ok_or_else(|| eyre::eyre!("daemon data must have a parent directory"))?;
    std::fs::create_dir_all(parent)?;
    let _lock = crate::lock_file::LockFile::new(data).lock()?;
    let output = Command::new(&preset.binary).arg("--version").output()?;
    if !output.status.success() {
        bail!("unable to determine {} version", preset.binary);
    }
    let major = major(preset_name, &String::from_utf8(output.stdout)?)?;
    let marker = format!("{preset_name}:{major}\n");
    if data.exists() {
        let existing = std::fs::read_to_string(data.join(".mise-daemon-version"))
            .wrap_err("daemon data was not initialized completely; inspect it and migrate or reset it explicitly")?;
        if existing != marker {
            bail!(
                "incompatible {preset_name} data in {} (stored {}, current {}); migrate or reset it explicitly",
                data.display(),
                existing.trim(),
                marker.trim()
            );
        }
        if preset_name == "postgres"
            && std::fs::read_to_string(data.join("PG_VERSION"))
                .wrap_err("daemon data was not initialized completely; missing PG_VERSION")?
                .trim()
                != major
        {
            bail!("Postgres data version does not match its initialization marker");
        }
        return Ok(());
    }
    let staging = tempfile::Builder::new()
        .prefix(".mise-init-")

View on GitHub (pinned to 533346cc37)