astrid-runtime/astrid · error

projection-name response timed out after 30s

Error message

projection-name response timed out after 30s

What it means

The projection-name diagnostic request is given a generous 30-second timeout (larger than the 5s defaults elsewhere because the diagnostic can be expensive). If the daemon fails to respond within 30 seconds, this error is raised. The connection succeeded but the diagnostic computation did not finish in time.

Source

Thrown at crates/astrid-cli/src/commands/doctor.rs:291

        )),
    }
}

async fn projection_name_diagnostic(
    policy: ProjectionNamePolicyPreset,
) -> Result<ProjectionNameDiagnostic> {
    let mut client = tokio::time::timeout(
        Duration::from_secs(5),
        crate::socket_client::connect_kernel_for_workspace(None),
    )
    .await
    .map_err(|_| anyhow::anyhow!("connection timed out after 5s"))??;
    tokio::time::timeout(
        Duration::from_secs(30),
        client.projection_name_diagnostic(policy),
    )
    .await
    .map_err(|_| anyhow::anyhow!("projection-name response timed out after 30s"))?
}

/// Render the FAIL detail line for a not-ready report: each missing piece,
/// space-separated, with unsatisfied interfaces as `ns:iface (req)`.
fn readiness_detail(report: &astrid_core::kernel_api::AgentLoopReadiness) -> String {
    let mut parts: Vec<String> = Vec::new();
    if report.prompt_subscribers.is_empty() {
        parts.push(format!(
            "no capsule subscribes {}",
            astrid_capsule::readiness::AGENT_PROMPT_TOPIC
        ));
    }
    if report.response_publishers.is_empty() {
        parts.push(format!(
            "no capsule publishes {}",
            astrid_capsule::readiness::AGENT_RESPONSE_TOPIC
        ));
    }

View on GitHub (pinned to affd8760f4)

Solutions

  1. Retry once the daemon is less loaded
  2. Reduce workspace size or split the diagnostic into smaller queries
  3. Profile the daemon's projection_name_diagnostic implementation for hangs
  4. Raise the 30s timeout only as a last resort
Defensive patterns

Strategy: retry

Try / catch

for attempt in 0..2 {
    match projection_name_diagnostic(&policy).await {
        Err(e) if e.to_string().contains("timed out after 30s") && attempt == 0 => continue,
        other => return other,
    }
}

Prevention

When it happens

Trigger: Calling client.projection_name_diagnostic(policy) against a daemon whose diagnostic pass (projection naming analysis) exceeds 30s — very large workspaces or a stalled daemon.

Common situations: Huge projection graphs, daemon busy with other requests, or a daemon bug causing the diagnostic to hang.

Understand the failure class

Background: Request timed out: what client-side request timeouts mean across libraries (Request timed out, TIMED_OUT, APITimeoutError) — this error's family across 39 libraries.

Related errors


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