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

  1. Update the caller to emit STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1 in the schema field
  2. Upgrade or downgrade the service/caller pair so versions match
  3. Fix the schema string in the launch document to the exact expected constant
  4. 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

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


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