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
- Ensure the fetch+verify branch runs before the accessor returns (no early returns between them)
- Check ReleaseManifest::verified isn't short-circuited by caching logic that leaves manifest as None
- If the load can legitimately fail, propagate the error instead of reaching the expect
- 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
- Make lazy accessors load-or-error instead of expecting preloaded state
- Cover the fetch/verify branch with tests before refactoring
- Never add early returns between load and access
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
- artifact directory was initialized
- command wait must complete
- executor must be initialized before displaying cache stats
- executor must be initialized before running tasks
- generated mise usage spec
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)