unicity-aos/aos-ce · error · io::Error

bundled product release runtime executable set is not…

Error message

bundled product release runtime executable set is not installed

What it means

validate_release_runtime_bin reads symlink metadata of the release runtime bin directory; when that fails with NotFound, it converts the error into this InvalidInput error. It means the required executable-set directory of the product release runtime is missing entirely, so migration cannot proceed.

Solutions

  1. Reinstall or repair the product release so the runtime bin directory exists at the expected path
  2. Verify the release_runtime_bin path exists before calling migrate_runtime
  3. Check that the configured release version matches the actually installed runtime layout

Example fix

// before
migrate_runtime(&target, &missing_bin)?;

// after
if !release_runtime_bin.try_exists()? {
    repair_release_install(&release_runtime_bin)?;
}
migrate_runtime(&target, &release_runtime_bin)?;
Defensive patterns

Strategy: validation

Validate before calling

fn release_bin_installed(release_runtime_bin: &std::path::Path) -> bool {
    std::fs::symlink_metadata(release_runtime_bin)
        .map(|m| m.is_dir())
        .unwrap_or(false)
}

Try / catch

match migrate_runtime(&target, &release_bin) {
    Ok(()) => {},
    Err(e) if e.to_string().contains("executable set is not installed") =>
        eprintln!("release runtime bin missing at {}; reinstall the release", release_bin.display()),
    Err(e) => return Err(e),
}

Prevention

When it happens

Trigger: Calling migrate_runtime (via validate_target or validate_completed_target) when the release runtime bin path does not exist on disk, or exists as a broken path after a partial install.

Common situations: A partial/failed product install that never created the bin directory; a version change relocating the bin path; cleaning scripts removing the executable set.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of unicity-aos/aos-ce@f6f22024fb (2026-09-13). Data as JSON: /api/errors/d850312452908100. Report an issue: GitHub.

Appendix: source

Thrown at crates/unicity-aos-bootstrap/src/migration.rs:694

                    .iter()
                    .any(|runtime| name == OsStr::new(runtime))
                {
                    return invalid(
                        "completed product runtime contains a shipped executable in mutable state",
                    );
                }
            }
        }
        Err(error) if error.kind() == io::ErrorKind::NotFound => {}
        Err(error) => return Err(error),
    }
    Ok(())
}

fn validate_release_runtime_bin(release_runtime_bin: &Path) -> io::Result<()> {
    let metadata = fs::symlink_metadata(release_runtime_bin).map_err(|error| {
        if error.kind() == io::ErrorKind::NotFound {
            io::Error::new(
                io::ErrorKind::InvalidInput,
                "bundled product release runtime executable set is not installed",
            )
        } else {
            error
        }
    })?;
    if metadata.file_type().is_symlink() || !metadata.is_dir() {
        return invalid("bundled product release runtime bin must be a real directory");
    }
    let expected: HashSet<_> = RUNTIME_EXECUTABLE_NAMES.iter().copied().collect();
    let mut actual = HashSet::new();
    for entry in fs::read_dir(release_runtime_bin)? {
        let entry = entry?;
        let name = entry.file_name().into_string().map_err(|_| {
            io::Error::new(
                io::ErrorKind::InvalidInput,
                "product release runtime bin contains a non-UTF-8 entry",

View on GitHub (pinned to f6f22024fb)