{"record":{"id":"77d33db11d67753d","repo":"astrid-runtime/astrid","slug":"unexpected-daemon-response-other-77d33d","errorCode":null,"errorMessage":"unexpected daemon response: {other:?}","messagePattern":"unexpected daemon response: (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-cli/src/commands/capsule/list.rs","lineNumber":27,"sourceCode":"use colored::Colorize;\n\n#[cfg(test)]\nuse super::meta::scan_installed_capsules_in_home_for_with_layout;\nuse crate::theme::Theme;\n\n/// List all installed capsules with their provides/requires metadata.\n///\n/// In default mode, shows a compact one-line-per-capsule view with capability\n/// counts. With `--verbose`, expands each capsule to show the full capability\n/// list and install source.\npub(crate) async fn list_capsules(verbose: bool) -> anyhow::Result<()> {\n    let mut client = crate::socket_client::connect_kernel_for_workspace(None).await?;\n    let entries = match client.request(KernelRequest::GetCapsuleMetadata).await? {\n        KernelResponse::CapsuleMetadata(entries) => entries,\n        KernelResponse::Error(message) => {\n            anyhow::bail!(\"daemon rejected capsule metadata request: {message}\")\n        },\n        other => anyhow::bail!(\"unexpected daemon response: {other:?}\"),\n    };\n\n    if entries.is_empty() {\n        println!(\"{}\", Theme::info(\"No capsules installed.\"));\n        return Ok(());\n    }\n\n    println!(\n        \"{} ({})\",\n        Theme::header(\"Installed Capsules\"),\n        entries.len()\n    );\n    println!(\"{}\", Theme::separator());\n    for entry in &entries {\n        let source = entry\n            .source_id\n            .map_or_else(|| \"unloaded\".to_owned(), |id| id.to_string());\n        if verbose {","sourceCodeStart":9,"sourceCodeEnd":45,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-cli/src/commands/capsule/list.rs#L9-L45","documentation":"Raised by `list_capsules` when the daemon's reply to `GetCapsuleMetadata` is neither `CapsuleMetadata` nor `Error` — an unanticipated `KernelResponse` variant. It means the daemon's response no longer matches the protocol the CLI expects, usually because of a version mismatch between the two binaries.","triggerScenarios":"Running `astrid capsule list` against a daemon that answers GetCapsuleMetadata with an unexpected variant (e.g. plain Success, or a newer/older protocol payload), produced by CLI/daemon version skew, stale sockets, or non-standard daemon builds.","commonSituations":"CLI upgraded while an old daemon process is still running; stale socket file pointing at a dead/replaced daemon; multiple daemon instances; experimenting with a forked daemon.","solutions":["Restart the daemon so both sides speak the same protocol version.","Upgrade the daemon binary to match your CLI version.","Inspect the printed `{other:?}` payload to see which variant arrived.","Clean up stale socket files and ensure a single daemon instance owns the workspace."],"exampleFix":"// before\nastrid capsule list\n// error: unexpected daemon response: CapsuleMetadataV1([...])\n\n// after\nastrid daemon restart  # daemon now matches CLI protocol\nastrid capsule list","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"fn as_metadata(resp: KernelResponse) -> Result<Vec<CapsuleMetadataEntry>, KernelResponse> {\n    match resp {\n        KernelResponse::CapsuleMetadata(entries) => Ok(entries),\n        other => Err(other),\n    }\n}","tryCatchPattern":"match list_capsules(verbose).await {\n    Ok(()) => {},\n    Err(e) if e.to_string().starts_with(\"unexpected daemon response\") => {\n        eprintln!(\"{e:#}\\nDaemon protocol mismatch - restart or upgrade the daemon.\");\n        std::process::exit(1);\n    },\n    Err(e) => return Err(e),\n}","preventionTips":["Restart the daemon after upgrading the CLI so both use the same response schema.","Clean stale socket files to avoid talking to a decommissioned daemon.","Pin matched CLI+daemon versions in CI images.","Treat any non-CapsuleMetadata/KernelResponse::Error reply as a version-skew signal."],"tags":["daemon","ipc","protocol"],"backgroundTag":"unexpected-response-shape","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"}