{"record":{"id":"bbdb1e18490e3deb","repo":"astrid-runtime/astrid","slug":"detached-fuse-service-returned-an-incompatible-rea","errorCode":null,"errorMessage":"detached FUSE service returned an incompatible readiness response","messagePattern":"detached FUSE service returned an incompatible readiness response","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-storage-provider-fuse/src/main.rs","lineNumber":346,"sourceCode":"            )\n        },\n    )\n}\n\nfn require_ready_control_response(\n    response: ControlResponse,\n    expected_access: StorageProviderAccessV1,\n) -> Result<()> {\n    match response {\n        ControlResponse::Status { access } if access == expected_access => Ok(()),\n        ControlResponse::Status { access } => {\n            bail!(\"detached FUSE service readiness access {access:?} does not match its lease\")\n        },\n        ControlResponse::Failure { code, message } => {\n            bail!(\"detached FUSE service readiness failed [{code}]: {message}\")\n        },\n        ControlResponse::Done => {\n            bail!(\"detached FUSE service returned an incompatible readiness response\")\n        },\n    }\n}\n\nasync fn sync(\n    client: &mut AdminClient,\n    acting_principal: &astrid_core::PrincipalId,\n    selector: &StorageMountSelectorV1,\n) -> Result<StorageProviderSuccessV1> {\n    let record = registry::resolve_record(selector)?;\n    let status = require_live_lease(client, acting_principal, &record).await?;\n    validate_record(&record, &status)?;\n    let control = live_control_status(client, acting_principal, &record).await?;\n    match control {\n        ControlResponse::Status { access } if access == record.access => {},\n        ControlResponse::Status { access } => {\n            bail!(\"detached FUSE service access {access:?} does not match lease\")\n        },","sourceCodeStart":328,"sourceCodeEnd":364,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-storage-provider-fuse/src/main.rs#L328-L364","documentation":"This error means the detached FUSE service answered its readiness probe with `ControlResponse::Done`, which is not a valid readiness response. Readiness requires a `Status` carrying the served access; `Done` signals the service is terminating or speaking an incompatible protocol shape. It is thrown from the readiness validation helper in main.rs:346.","triggerScenarios":"The readiness check matches `ControlResponse::Done` — e.g. the service shut down immediately after start, or a different/newer control protocol maps the reply onto the Done variant.","commonSituations":"The detached service crashed or exited before becoming ready; the control socket was answered by a stale or foreign process; client and service crate versions disagree on response semantics.","solutions":["Check whether the detached service process is still alive and inspect its logs for early exit.","Clean up stale artifacts (control socket, mountpoint) and restart the service from the current lease.","Align client/service crate versions so ControlResponse variants mean the same thing on both sides.","Retry readiness with a short backoff in case the probe raced service startup shutdown logic."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":"fn is_ready_status(resp: &ControlResponse) -> bool {\n    matches!(resp, ControlResponse::Status { .. })\n}","tryCatchPattern":"match validate_readiness(resp, &lease.access) {\n    Err(e) if e.to_string().contains(\"incompatible readiness response\") => {\n        // check service liveness, restart with backoff\n    }\n    r => r?,\n}","preventionTips":["Confirm the service process stays alive between start and readiness probe","Retry readiness with short backoff to avoid racing startup/shutdown","Match ControlResponse semantics by using the same crate version on both sides"],"tags":["fuse","readiness","protocol-mismatch"],"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"}