astrid-runtime/astrid · error
WASM binary not found at {}
Error message
WASM binary not found at {} What it means
Like error 1120, the signed channel pointer's release.metadata_asset must equal format!("astrid-{version}-release.toml"). This instance is the same ensure! reached for any channel (stable/dev/nightly) whenever the asset name string does not match the canonical pattern derived from the pointer's canonical version.
Source
Thrown at crates/astrid-build/src/archiver.rs:111
// security measure and we want this invariant to survive upstream default changes).
tar.follow_symlinks(true);
// 1. Write the synthesized Capsule.toml directly from memory
let mut header = deterministic_header(
manifest_content.len() as u64,
0o644,
tar::EntryType::Regular,
);
tar.append_data(&mut header, "Capsule.toml", manifest_content.as_bytes())
.context("Failed to write Capsule.toml to archive")?;
// 2. Append the WASM binary (if present)
if let Some(wasm) = wasm_path {
if wasm.exists() {
let file_name = wasm.file_name().unwrap_or_default();
append_file(&mut tar, Path::new(file_name), wasm)?;
} else {
anyhow::bail!("WASM binary not found at {}", wasm.display());
}
}
// 3. Append additional contextual and opaque asset files.
// Use a cycle-safe recursive walk instead of tar's append_dir_all, because
// follow_symlinks(true) + append_dir_all has no cycle detection — a symlink
// pointing to an ancestor directory would cause infinite recursion and OOM.
let mut ordered_files: Vec<(&Path, PathBuf)> = additional_files
.iter()
.filter(|path| path.exists())
.map(|path| {
let relative = path
.strip_prefix(base_dir)
.unwrap_or(Path::new(path.file_name().unwrap_or_default()))
.to_path_buf();
(*path, relative)
})
.collect();View on GitHub (pinned to affd8760f4)
Solutions
- Rewrite release.metadata_asset as "astrid-<canonical-version>-release.toml".
- Regenerate and re-sign the channel pointer with the current release tooling.
- Re-run parse_channel to confirm the pointer validates.
Example fix
# before metadata_asset = "astrid-1.2.3-release.toml.bak" # after metadata_asset = "astrid-1.2.3-release.toml"
Defensive patterns
Strategy: validation
Validate before calling
fn asset_name_matches(version: &str, asset: &str) -> bool {
asset == format!("astrid-{version}-release.toml")
} Try / catch
if let Err(e) = parse_channel(&bytes, channel, now) {
if e.to_string().contains("metadata asset is invalid") { eprintln!("fix metadata_asset naming"); }
return Err(e.into());
} Prevention
- Single source of truth for derived pointer fields
- Validate pointers in CI pre-publication
- Avoid manual edits to signed files
When it happens
Trigger: validate_pointer (via parse_channel or enforce_continuity) is given a ChannelPointer where pointer.release.metadata_asset != format!("astrid-{version}-release.toml").
Common situations: Signed pointer generated by a script using an old asset naming scheme; manual edit of the channel file; asset renamed during a re-release but pointer not regenerated.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- opaque asset path must be a directory: {}
- opaque capsule asset directories cannot be symlinks: {}
- capsule archive already contains {PROVENANCE_FILE}
- capsule archive contains duplicate entry '{requested}'
- distro.id '{}' is invalid (must match ^[a-z][a-z0-9-]*$)
AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09).
Data as JSON: /api/errors/1aa6d4e5fd0feb71.
Report an issue: GitHub.