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
- Rebuild/reinstall both the parent (CLI) and the FSKit service so they share the same schema constant
- Update the launch payload's schema field to STORAGE_FILESYSTEM_SERVICE_LAUNCH_SCHEMA_V1
- 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
- Always build launch payloads via the shared constant, not string literals
- Upgrade/reinstall parent and service binaries together after schema bumps
- Add a schema compatibility check to CI for cross-version launches
- Reject stale cached binaries during deployment
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
- daemon returned an unexpected status response: {other:?}
- unexpected daemon metadata response: {other:?}
- FSKit service parent process is not alive
- FSKit service launch exceeds limit
- kernel returned an unexpected projection-name diagnostic res
AI-assisted analysis of astrid-runtime/astrid@affd8760f4 (2026-09-09).
Data as JSON: /api/errors/af2cfefe1b2fefe9.
Report an issue: GitHub.