astrid-runtime/astrid · error

unexpected daemon metadata response: {other:?}

Error message

unexpected daemon metadata response: {other:?}

What it means

`show_tree` matches the daemon's `KernelResponse` against the expected metadata-carrying variants; the `Error` variant is handled separately, and anything else falls into this catch-all bail. It means the daemon returned a response variant the CLI's dependency-tree code does not recognize — a protocol/shape mismatch, not a reported daemon error.

Source

Thrown at crates/astrid-cli/src/commands/capsule/deps.rs:156

// ---------------------------------------------------------------------------
// Display
// ---------------------------------------------------------------------------

/// Show the capsule dependency tree (imports/exports graph).
pub(crate) async fn show_tree() -> anyhow::Result<()> {
    let mut client = crate::socket_client::connect_kernel_for_workspace(None).await?;
    let capsules = match client.request(KernelRequest::GetCapsuleMetadata).await? {
        KernelResponse::CapsuleMetadata(entries) => entries
            .into_iter()
            .map(|entry| CapsuleDependencyMetadata {
                name: entry.name,
                imports: entry.imports,
                exports: entry.exports,
            })
            .collect::<Vec<_>>(),
        KernelResponse::Error(error) => bail!("daemon metadata lookup failed: {error}"),
        other => bail!("unexpected daemon metadata response: {other:?}"),
    };

    if capsules.is_empty() {
        println!("{}", Theme::info("No capsules installed."));
        return Ok(());
    }

    let (all_trees, unsatisfied) = build_dep_graph(&capsules);

    for (i, tree) in all_trees.iter().enumerate() {
        if i > 0 {
            println!();
        }

        println!("{}", tree.name.bold());

        // Show exports.
        if tree.exports.is_empty() && tree.imports.is_empty() {

View on GitHub (pinned to affd8760f4)

Solutions

  1. Upgrade or rebuild astrid-cli to match the daemon version (schema drift is the usual cause).
  2. Log the `other:?` payload to see which variant came back.
  3. Restart the daemon to rule out a wedged state.
  4. Report the payload to maintainers if versions match.
Defensive patterns

Strategy: type-guard

Validate before calling

// detect CLI/daemon version skew before issuing the metadata query
let v = daemon.request(VersionQuery).await?;
if v.major != expected_major { eprintln!("version mismatch: cli={}, daemon={}", expected_major, v.major); }

Type guard

fn as_metadata(resp: &KernelResponse) -> Option<&Vec<CapsuleMetadata>> {
    match resp { KernelResponse::Metadata(m) => Some(m), _ => None }
}

Try / catch

let resp = daemon.request(MetadataQuery).await?;
if as_metadata(&resp).is_none() && !matches!(resp, KernelResponse::Error(_)) {
    eprintln!("daemon returned unknown variant {resp:?}; upgrade astrid-cli to match the daemon");
}

Prevention

When it happens

Trigger: show_tree receives a `KernelResponse` that is neither the metadata variant nor `KernelResponse::Error` — e.g. after a daemon upgrade changed response types, or the request hit a handler replying with a different response kind.

Common situations: Version skew between astrid-cli and the running daemon; a proxy/relay rewriting kernel responses; a daemon bug answering the metadata request with the wrong variant.

Related errors


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