jdx/mise · error

vfox plugin artifacts must not declare executables

Error message

vfox plugin artifacts must not declare executables

What it means

As part of the vfox plugin artifact contract, `validate_artifact` (src/plugins/packslip.rs) rejects artifacts that declare executables (`artifact.bin` non-empty). vfox plugins ship Lua/agent code inside a tarball, not standalone binaries, so any `bin` entries indicate a plain tool artifact mislabeled as a plugin.

Source

Thrown at src/plugins/packslip.rs:186

        if existed {
            file::rename(backup, destination).wrap_err("restoring previous plugin")?;
        }
        return Err(error);
    }
    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(())
}

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Remove all `bin` entries from the plugin artifact's manifest and republish.
  2. Split the release: keep the vfox plugin artifact free of executables and declare CLI binaries in a separate non-plugin artifact.
  3. If the project is actually a binary tool, install it through the standard packslip tool path instead of the plugin contract.

Example fix

// before (manifest)
[[artifacts.plugin.bin]]
name = "mytool"
path = "bin/mytool"

// after (manifest)
[artifacts.plugin.extensions.mise]
plugin = "vfox"
# bin entries removed
Defensive patterns

Strategy: validation

Validate before calling

// fail the release if a plugin artifact declares executables
jq -e '.artifacts[] | select(.extensions.mise.plugin == "vfox" and (.bin | length == 0))' manifest.json \
  || { echo "vfox plugin artifact must not declare bin entries"; exit 1; }

Prevention

When it happens

Trigger: A packslip release manifest declares `bin = [...]` (or `[[bin]]` entries) on the artifact that is being validated as a vfox plugin via `plugin_artifact_contract`.

Common situations: Author reused a binary-tool manifest as a plugin manifest; the release template always emits a `bin` section; an artifact bundles both a plugin and a CLI binary.

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