jdx/mise · error

release manifest was loaded

Error message

release manifest was loaded

What it means

A Rust internal invariant panic in the release-manifest loader: the code fetches and verifies the signed release manifest and stores it in self.manifest, then immediately unwraps it with expect. The expect can only fire if manifest loading was skipped or failed silently before this accessor is called, i.e. an internal state bug rather than a network problem (network errors surface earlier as the 'failed to fetch' error).

Solutions

  1. Ensure the fetch+verify branch runs before the accessor returns (no early returns between them)
  2. Check ReleaseManifest::verified isn't short-circuited by caching logic that leaves manifest as None
  3. If the load can legitimately fail, propagate the error instead of reaching the expect
  4. Report with the exact command and version if hit in an unmodified build
Defensive patterns

Strategy: try-catch

Validate before calling

// ensure load happened
self.ensure_manifest_loaded()?;
debug_assert!(self.manifest.is_some());

Type guard

fn manifest_loaded(state: &State) -> bool { state.manifest.is_some() }

Try / catch

let manifest = loader.manifest().map_err(|e| anyhow!("manifest unavailable: {e}"))?;

Prevention

When it happens

Trigger: Calling the manifest accessor (returns &ReleaseManifest) without having triggered the load branch — e.g. a refactor made the load conditional, an early return bypassed `self.manifest = Some(...)`.

Common situations: Seen during development when changing the lazy-load logic; users may see it as a panic during mise bootstrap if a modified build skips verification.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


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

Appendix: source

Thrown at src/system/remote.rs:1589

    }

    async fn manifest(&mut self) -> Result<&ReleaseManifest> {
        if self.manifest.is_none() {
            let manifest_url = release_url("SHASUMS256.txt");
            let signature_url = release_url("SHASUMS256.txt.minisig");
            let (contents, signature) = tokio::try_join!(
                HTTP.get_text_cached(&manifest_url),
                HTTP.get_text_cached(&signature_url)
            )
            .wrap_err_with(|| {
                format!(
                    "failed to fetch signed mise {} release checksums",
                    env!("CARGO_PKG_VERSION")
                )
            })?;
            self.manifest = Some(ReleaseManifest::verified(&contents, &signature)?);
        }
        Ok(self.manifest.as_ref().expect("release manifest was loaded"))
    }
}

fn release_url(filename: &str) -> String {
    let version = env!("CARGO_PKG_VERSION");
    format!("{RELEASE_BASE_URL}/v{version}/{filename}")
}

fn release_asset_name(os: &str, arch: &str, libc: Option<LibcFlavor>) -> Result<String> {
    let release_arch = match arch {
        "x86_64" => "x64",
        "aarch64" => "arm64",
        "armv7" => "armv7",
        _ => {
            bail!(
                "mise {} has no official precompiled artifact for {os}/{arch}; set mise_bin, remote_mise, or bootstrap_command",
                env!("CARGO_PKG_VERSION")
            )

View on GitHub (pinned to 533346cc37)