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
- Retry once the daemon is less loaded
- Reduce workspace size or split the diagnostic into smaller queries
- Profile the daemon's projection_name_diagnostic implementation for hangs
- 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
- Run diagnostics on idle daemons
- Keep projection graphs within tested size limits
- Instrument the daemon diagnostic path to detect hangs
- Only raise the 30s budget for provably large workspaces
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.
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- an Astrid daemon appears to be running but its uplink is unr
- Admin request timed out after {:?} waiting for {want_respons
- connection timed out after 5s
- daemon response timed out after 5s
- daemon metadata lookup failed: {error}
AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09).
Data as JSON: /api/errors/f721b208f7134489.
Report an issue: GitHub.