astrid-runtime/astrid · error

unsupported FSKit service launch schema {}

Error message

unsupported FSKit service launch schema {}

What it means

validate_launch checks that the schema field of StorageProviderServiceLaunchV1 equals STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1 and bails with the received schema value otherwise. This is a version handshake: the service refuses launch payloads produced by an incompatible parent version.

Source

Thrown at crates/astrid-storage-provider-fskit/src/service.rs:125

    result
}

fn read_launch() -> Result<StorageProviderServiceLaunchV1> {
    let mut bytes = Vec::new();
    std::io::stdin()
        .lock()
        .take(MAX_LAUNCH_BYTES + 1)
        .read_to_end(&mut bytes)
        .context("read FSKit service launch")?;
    if bytes.len() as u64 > MAX_LAUNCH_BYTES {
        bail!("FSKit service launch exceeds limit");
    }
    serde_json::from_slice(&bytes).context("decode FSKit service launch")
}

fn validate_launch(launch: &StorageProviderServiceLaunchV1) -> Result<()> {
    if launch.schema != STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1 {
        bail!("unsupported FSKit service launch schema {}", launch.schema);
    }
    validate_launch_parent(&launch.parent)?;
    validate_lease(&launch.lease)?;
    crate::validate_mountpoint_layout(&launch.mountpoint)?;
    if launch.mountpoint == launch.lease.resource_path
        || launch.mountpoint.starts_with(&launch.lease.resource_path)
        || launch.lease.resource_path.starts_with(&launch.mountpoint)
    {
        bail!("FSKit service mountpoint overlaps the lease resource");
    }
    crate::validate_mountpoint_ancestors(&launch.mountpoint)?;
    crate::validate_unmounted_mountpoint(&launch.mountpoint)?;
    validate_control_path(&launch.control_path, &launch.lease.resource_path)?;
    Ok(())
}

fn validate_lease(lease: &astrid_core::storage_filesystem::StorageMountLeaseV1) -> Result<()> {
    if lease.lease_token.len() < 16 || lease.lease_token.len() > 4096 {

View on GitHub (pinned to affd8760f4)

Solutions

  1. Rebuild/reinstall both the parent (CLI) and the FSKit service so they share the same schema constant
  2. Update the launch payload's schema field to STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1
  3. Check installed component versions and align them; clear cached/stale binaries

Example fix

// before
launch.schema = "astrid.filesystem.launch.v2";
// after
launch.schema = STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1; // "...launch.v1"
Defensive patterns

Strategy: validation

Validate before calling

anyhow::ensure!(
    launch.schema == STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1,
    "unsupported launch schema: {}",
    launch.schema
);

Type guard

fn has_current_schema(l: &StorageProviderServiceLaunchV1) -> bool {
    l.schema == STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1
}

Prevention

When it happens

Trigger: A parent built against a different schema constant (older or newer) launches the service; the launch JSON was edited or generated with a wrong schema string; version skew between installed provider components.

Common situations: Partial upgrade where the FSKit extension binary is old but the CLI is new (or vice versa); hand-crafted test payloads using a guessed schema name; a schema bump in a PR where one side wasn't rebuilt.

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/af2cfefe1b2fefe9. Report an issue: GitHub.