astrid-runtime/astrid · error
unsupported FUSE service launch schema {}
Error message
unsupported FUSE service launch schema {} What it means
run_launch validates that the decoded launch payload's schema field equals STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1. Any other schema string is rejected, because the service only implements that launch contract version.
Source
Thrown at crates/astrid-storage-provider-fuse/src/service.rs:47
/// Run the hidden target-free service mode.
pub(crate) async fn run() -> Result<()> {
let mut bytes = Vec::new();
std::io::stdin()
.lock()
.take(MAX_LAUNCH_BYTES + 1)
.read_to_end(&mut bytes)
.context("read target-free FUSE service launch")?;
if bytes.len() as u64 > MAX_LAUNCH_BYTES {
bail!("FUSE service launch exceeds limit");
}
let launch: StorageProviderServiceLaunchV1 =
serde_json::from_slice(&bytes).context("decode target-free FUSE service launch")?;
run_launch(launch).await
}
async fn run_launch(launch: StorageProviderServiceLaunchV1) -> Result<()> {
if launch.schema != STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1 {
bail!("unsupported FUSE service launch schema {}", launch.schema);
}
validate_launch(&launch)?;
let challenge = storage_provider_service_ready_challenge(
&launch.parent.token,
STORAGE_FILESYSTEM_SERVICE_READY_SCHEMA_V1,
crate::PROVIDER_NAME,
launch.lease.mount_id.as_uuid(),
&launch.control_path,
&launch.lease.resource_path,
&launch.lease.callback_path,
)
.map_err(|error| anyhow::anyhow!(error))?;
if !parent_is_alive(&launch.parent) {
bail!("FUSE service parent process is not alive");
}
probe_callback(&launch).await?;
let listener = bind_control_listener(&launch.control_path)?;
let mut session = match filesystem::start_session(launch.lease.clone(), &launch.mountpoint) {View on GitHub (pinned to affd8760f4)
Solutions
- Update the caller to emit STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1 in the schema field
- Upgrade or downgrade the service/caller pair so versions match
- Fix the schema string in the launch document to the exact expected constant
- Regenerate the launch payload with the current SDK/tooling version
Example fix
// before
{"schema":"astrid.storage.filesystem.launch.v0", ...}
// after
{"schema":"astrid.storage.filesystem.launch.v1", ...} Defensive patterns
Strategy: validation
Validate before calling
fn launch_schema_is_supported(launch: &StorageProviderServiceLaunchV1) -> bool {
launch.schema == STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1
} Type guard
fn has_supported_schema(launch: &StorageProviderServiceLaunchV1) -> bool {
launch.schema == STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1
} Try / catch
match run().await {
Err(e) if e.to_string().starts_with("unsupported FUSE service launch schema") => {
eprintln!("caller/service version mismatch; align launch schema to v1");
}
other => other?,
} Prevention
- Always set the schema field from the shared constant, not a literal
- Keep caller and service versions in lockstep during upgrades
- Validate the schema string before piping the launch document
- Copy launch docs only from the matching provider type
When it happens
Trigger: Sending a launch JSON with schema set to a different version (V0, V2) or a schema string from another provider/service type.
Common situations: Caller and service version skew after an upgrade; hand-written launch documents with a wrong or typo'd schema string; copying a launch doc from a different provider.
Understand the failure class
Background: Schema validation failed / invalid input schema: payload rejected because its shape doesn't match the expected schema — this error's family across 28 libraries.
Related errors
- durable capsule {id} has unsupported authority schema {}
- unsupported WinFsp service launch schema {}
- invite store schema {} is newer than supported schema {STORE
- pair-token store schema {schema_version} is newer than suppo
- opaque capsule assets cannot be symlinks: {}
AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09).
Data as JSON: /api/errors/88f2bf8c532d7f2b.
Report an issue: GitHub.