{"record":{"id":"53a7daa92cbbace9","repo":"astrid-runtime/astrid","slug":"daemon-rejected-capsule-metadata-request-message","errorCode":null,"errorMessage":"daemon rejected capsule metadata request: {message}","messagePattern":"daemon rejected capsule metadata request: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-cli/src/commands/capsule/install_update.rs","lineNumber":178,"sourceCode":"            &source,\n            Some(name),\n            workspace,\n            false,\n            approve_untrusted,\n            &[],\n        )\n        .await\n    } else {\n        update_all_capsules(&home, &principal, workspace, approve_untrusted).await\n    }\n}\n\nasync fn daemon_capsule_metadata() -> anyhow::Result<Vec<CapsuleMetadataEntry>> {\n    let mut client = crate::socket_client::connect_kernel_for_workspace(None).await?;\n    match client.request(KernelRequest::GetCapsuleMetadata).await? {\n        KernelResponse::CapsuleMetadata(entries) => Ok(entries),\n        KernelResponse::Error(message) => {\n            bail!(\"daemon rejected capsule metadata request: {message}\")\n        },\n        other => bail!(\"unexpected daemon response: {other:?}\"),\n    }\n}\n\nasync fn update_daemon_capsules(\n    target: Option<&str>,\n    principal: &astrid_core::PrincipalId,\n    approve_untrusted: bool,\n) -> anyhow::Result<()> {\n    let entries = daemon_capsule_metadata().await?;\n    if let Some(name) = target {\n        let entry = entries\n            .into_iter()\n            .find(|entry| entry.name == name)\n            .ok_or_else(|| anyhow::anyhow!(\"Capsule '{name}' is not installed.\"))?;\n        let Some(source) = entry.update_source else {\n            eprintln!(","sourceCodeStart":160,"sourceCodeEnd":196,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-cli/src/commands/capsule/install_update.rs#L160-L196","documentation":"Raised by `daemon_capsule_metadata` when the running astrid daemon answers a `GetCapsuleMetadata` request with a `KernelResponse::Error(message)` instead of capsule metadata. The daemon's own rejection reason is embedded in the message, so the root cause (auth, state, internal daemon failure) comes from the daemon side. Called by `update_daemon_capsules` and `regenerate_distro_lock`.","triggerScenarios":"Running `astrid capsule update` (non-workspace mode) or refreshing the distro lock when the daemon responds Error to `KernelRequest::GetCapsuleMetadata` — e.g. daemon's capsule registry is in a bad state, permissions failure, or an internal daemon error string.","commonSituations":"Daemon version mismatch with the CLI sending a request it mishandles; daemon's metadata store corrupted or unreadable; daemon not fully initialized after start; version-skew after an upgrade where the old daemon rejects new request semantics.","solutions":["Read the daemon's reason embedded in the message and address it directly.","Restart the daemon so it rebuilds its capsule metadata state, then retry.","Ensure the daemon and CLI versions match; upgrade the daemon after a CLI upgrade.","If the metadata store is corrupt, reinstall the affected capsules to rebuild daemon-side metadata."],"exampleFix":"// before: daemon started before CLI upgrade, rejects request\nastrid capsule update\n// error: daemon rejected capsule metadata request: unsupported request version\n\n// after: restart/upgrade the daemon to match the CLI\nastrid daemon restart\nastrid capsule update","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match daemon_capsule_metadata().await {\n    Ok(entries) => update_all(entries),\n    Err(e) if e.to_string().starts_with(\"daemon rejected capsule metadata request\") => {\n        eprintln!(\"{e:#}\\nHint: restart the daemon and ensure CLI/daemon versions match.\");\n        std::process::exit(1);\n    },\n    Err(e) => return Err(e),\n}","preventionTips":["Always upgrade the daemon together with the CLI to avoid protocol skew.","Restart the daemon after upgrades so stale state does not poison metadata responses.","Monitor daemon logs for metadata-request errors before batch updates.","Read the embedded daemon reason — it names the actual server-side cause."],"tags":["daemon","ipc","socket"],"backgroundTag":"api-error-response","analyzedSha":"affd8760f44190dbdfbec23403f4c4b642c33112","analyzedAt":"2026-09-09T21:28:12.402Z","contentChangedAt":"2026-09-09T21:28:12.402Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}