astrid-runtime/astrid · error

Distro.lock capsule '{capsule}' catalog entry is missing: bi

Error message

Distro.lock capsule '{capsule}' catalog entry is missing: bin/{locked_hex}.wasm

What it means

When validating a locked capsule's WASM artifact, the storage catalog is asked to `describe` the content object `bin/<locked_hex>.wasm`. The store returns None (no descriptor), meaning the catalog has no entry for the locked WASM content hash. The library treats this as a broken lock because the pinned content is not present in the catalog.

Source

Thrown at crates/astrid-cli/src/commands/init_grant.rs:389

    if !declares_wasm {
        bail!(
            "Distro.lock capsule '{capsule}' does not declare WASM but installed metadata carries a WASM hash"
        );
    }
    let locked = parse_locked_blake3(capsule, locked_hash)?;
    let locked_hex = locked.to_hex().to_string();
    if meta_hash != locked_hex {
        bail!("Distro.lock capsule '{capsule}' hash disagrees with installed metadata");
    }
    let bytes = if let Some(store) = store {
        let name = astrid_storage::ContentName::new(format!("bin/{locked_hex}.wasm"))?;
        let descriptor = store
            .content()
            .describe(&astrid_storage::StateOwner::System, &name)
            .map_err(|error| anyhow::anyhow!(error))?
            .ok_or_else(|| {
                anyhow::anyhow!(
                    "Distro.lock capsule '{capsule}' catalog entry is missing: bin/{locked_hex}.wasm"
                )
            })?;
        store
            .content()
            .read_range(
                &astrid_storage::StateOwner::System,
                &name,
                0,
                descriptor.logical_bytes(),
            )
            .map_err(|error| anyhow::anyhow!(error))?
            .ok_or_else(|| {
                anyhow::anyhow!(
                    "Distro.lock capsule '{capsule}' catalog entry has no readable bytes: bin/{locked_hex}.wasm"
                )
            })?
    } else {

View on GitHub (pinned to affd8760f4)

Solutions

  1. Re-ingest/publish the WASM content into the store so `bin/<locked_hex>.wasm` exists in the catalog
  2. Regenerate Distro.lock against the currently published WASM hashes
  3. Verify the storage backend/catalog path configuration matches the environment the lock was made in
  4. Re-sync the distro from its signed source so locked content is fetched into the catalog

Example fix

# before: hex in lock not present in catalog
$ astrid init-grant
# after
$ astrid distro sync     # fetch locked wasm into catalog
$ astrid init-grant
Defensive patterns

Strategy: validation

Validate before calling

fn catalog_has_wasm(store: &Store, locked_hex: &str) -> bool {
    let name = astrid_storage::ContentName::new(format!("bin/{locked_hex}.wasm")).unwrap();
    store.content().describe(&astrid_storage::StateOwner::System, &name).map(|d| d.is_some()).unwrap_or(false)
}

Try / catch

match res {
    Err(e) if e.to_string().contains("catalog entry is missing") => reingest_wasm_and_retry(),
    other => other,
}

Prevention

When it happens

Trigger: `validate_locked_wasm` calls `store.content().describe(&StateOwner::System, &name)` where name is built from the locked BLAKE3 hex; a None descriptor triggers this error. Occurs when the content was never ingested into the store, the catalog was pruned, or the lock pins a hash from a different environment.

Common situations: Content garbage-collected or pruned from the catalog; lock generated on another machine whose blobs were never synced; storage backend misconfigured so the catalog points elsewhere; lock regenerated against a rebuilt WASM so the hex differs from what is stored.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


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