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
- Reinstall or repair the product release so the runtime bin directory exists at the expected path
- Verify the release_runtime_bin path exists before calling migrate_runtime
- 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
- Verify release integrity (bin directory present) after every install/upgrade
- Match the configured release version to the installed runtime layout
- Exclude the runtime bin directory from cleanup glob patterns
- Re-run the installer's repair step if a partial install is detected
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
- standalone runtime has no existing system lock; refusing an…
- failed to preserve imported activation state
- failed to validate ephemeral state exclusion
- failed to inspect imported distro locks
- imported principal home contains a non-UTF-8 name
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)