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

  1. Remove the `os`, `arch`, and `libc` keys from the plugin artifact's manifest so it is platform-neutral, and republish.
  2. Ship a single portable tar.gz plugin artifact and let vfox's Lua hooks handle platform differences.
  3. 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

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


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/df37829b1e928524. Report an issue: GitHub.