jdx/mise · error
vfox plugin artifact must be portable
Error message
vfox plugin artifact must be portable
What it means
`validate_artifact` requires a vfox plugin artifact to be portable: its manifest must not declare `os`, `arch`, or `libc`. vfox plugins handle platform dispatch themselves at runtime, so platform-scoped artifacts are considered a manifest error and rejected.
Source
Thrown at src/plugins/packslip.rs:190
}
Ok(())
}
pub(crate) fn validate_artifact(artifact: &packslip::model::Artifact) -> Result<()> {
ensure!(
artifact
.extensions
.get("mise")
.and_then(|v| v.get("plugin"))
.and_then(|v| v.as_str())
== Some("vfox"),
"packslip artifact must declare extensions.mise.plugin = vfox"
);
ensure!(
artifact.bin.is_empty(),
"vfox plugin artifacts must not declare executables"
);
ensure!(
artifact.os.is_none() && artifact.arch.is_none() && artifact.libc.is_none(),
"vfox plugin artifact must be portable"
);
ensure!(
artifact.requires.is_none(),
"vfox plugin artifacts must not declare host requirements"
);
ensure!(
matches!(artifact.format.as_deref(), Some("tar.gz" | "tgz")),
"vfox plugin artifacts currently require tar.gz format"
);
Ok(())
}
/// Reject links and special files before extraction, including links whose
/// targets might otherwise be resolved while unpacking a later archive entry.
pub(crate) fn validate_archive(path: &Path) -> Result<()> {
let reader = flate2::read::GzDecoder::new(std::fs::File::open(path)?);View on GitHub (pinned to afd2eddd3a)
Solutions
- Remove the `os`, `arch`, and `libc` keys from the plugin artifact's manifest so it is platform-neutral, and republish.
- Ship a single portable tar.gz plugin artifact and let vfox's Lua hooks handle platform differences.
- If per-platform binaries are truly needed, publish them as a separate non-plugin tool source (aqua/github) instead.
Example fix
// before (manifest) [artifacts.plugin] os = "linux" arch = "x86_64" // after (manifest) [artifacts.plugin] # os/arch/libc removed — plugin must be portable
Defensive patterns
Strategy: validation
Validate before calling
jq -e '.artifacts[] | select(.extensions.mise.plugin == "vfox" and (.os == null and .arch == null and .libc == null))' manifest.json \
|| { echo "vfox plugin artifact must be portable (no os/arch/libc)"; exit 1; } Prevention
- Ship one portable tar.gz for plugins; handle platform logic in the plugin's Lua hooks.
- Configure the release generator with a 'plugin' profile that omits os/arch/libc fields.
- Keep binary-tool manifests out of the plugin release path.
When it happens
Trigger: A packslip manifest declares any of `os`, `arch`, or `libc` (e.g. os = "linux", arch = "x86_64", libc = "gnu") on an artifact validated as a vfox plugin.
Common situations: Release tooling that generates per-platform artifacts also emits os/arch/libc fields; author copied a manifest from a binary tool; CI matrix builds annotate each artifact with its platform.
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
- packslip artifact must declare extensions.mise.plugin = vfox
- vfox plugin artifacts must not declare executables
- vfox plugin artifacts must not declare host requirements
- packslip:{project}@{version}: manifest digest differs from s
- the packslip names an executable {:?}, which is not a plain
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/df37829b1e928524.
Report an issue: GitHub.