astrid-runtime/astrid · error
materialized capsule manifest differs from durable registry
Error message
materialized capsule manifest differs from durable registry
What it means
Consistency check in verify_published_materialization: the manifest inside the materialized capsule (name/version) differs from the manifest held in the durable registry, so the cached copy is stale or from a different package version.
Solutions
- Re-publish or re-materialize the capsule so cache and registry agree
- Purge the stale cache directory for this principal/package
- Check whether a version bump was published without re-materializing
Defensive patterns
Strategy: retry
When it happens
Trigger: Thrown at crates/astrid-kernel/src/capsule_materialization.rs:36 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09).
Data as JSON: /api/errors/3ffb02ef77e3462b.
Report an issue: GitHub.
Appendix: source
Thrown at crates/astrid-kernel/src/capsule_materialization.rs:36
let uid = self
.principal_directory
.uid_for(principal)
.map_err(|error| anyhow::anyhow!("resolve capsule cache owner UID: {error}"))?;
let verified = astrid_capsule_install::read_verified_durable_package_for_owner(
self.principal_store
.as_ref()
.ok_or_else(|| anyhow::anyhow!("durable capsule registry is unavailable"))?,
&astrid_storage::StateOwner::Principal(uid),
manifest.package.name.as_str(),
)?
.ok_or_else(|| anyhow::anyhow!("materialized capsule is absent from durable registry"))?;
if verified.snapshot() != snapshot {
anyhow::bail!("materialized capsule snapshot differs from the caller's publication");
}
if verified.manifest().package.name != manifest.package.name
|| verified.manifest().package.version != manifest.package.version
{
anyhow::bail!("materialized capsule manifest differs from durable registry");
}
let manifest_bytes = Self::read_projection_file_nofollow(&dir.join("Capsule.toml"))
.map_err(|error| anyhow::anyhow!("read materialized capsule manifest: {error:#}"))?;
if manifest_bytes != verified.manifest_bytes() {
anyhow::bail!("durable capsule manifest bytes do not match materialization");
}
let metadata_bytes = Self::read_projection_file_nofollow(&dir.join("meta.json"))
.map_err(|error| anyhow::anyhow!("read materialized capsule metadata: {error:#}"))?;
if metadata_bytes != verified.metadata_bytes() {
anyhow::bail!("durable capsule metadata does not match materialization");
}
let authority_bytes = Self::read_projection_file_nofollow(&dir.join("authority.json"))
.map_err(|error| anyhow::anyhow!("read materialized capsule authority: {error:#}"))?;
if authority_bytes != verified.snapshot().package().authority {
anyhow::bail!("durable capsule authority bytes do not match materialization");
}
let mut expected_files = verified
.archive_entries()View on GitHub (pinned to affd8760f4)