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
- Re-ingest/publish the WASM content into the store so `bin/<locked_hex>.wasm` exists in the catalog
- Regenerate Distro.lock against the currently published WASM hashes
- Verify the storage backend/catalog path configuration matches the environment the lock was made in
- 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
- Keep locks generated from the same store you validate against
- Avoid GC/pruning content referenced by active locks
- Confirm storage backend config matches the environment that produced the lock
- Regenerate the lock after rebuilding WASM artifacts
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
- Distro.lock capsule '{capsule}' catalog entry has no readabl
- durable capsule {id} WASM hash differs between metadata and
- durable capsule {id} metadata names a hash for a non-WASM co
- durable capsule {id} metadata names a component absent from
- Distro.lock capsule '{capsule}' content blob bytes do not ma
AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09).
Data as JSON: /api/errors/a6b468a441574bf8.
Report an issue: GitHub.