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

  1. Rewrite release.metadata_asset as "astrid-<canonical-version>-release.toml".
  2. Regenerate and re-sign the channel pointer with the current release tooling.
  3. 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

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


AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09). Data as JSON: /api/errors/1aa6d4e5fd0feb71. Report an issue: GitHub.