{"record":{"id":"9890feea54423305","repo":"jdx/mise","slug":"vfox-plugin-artifacts-must-not-declare-executables","errorCode":null,"errorMessage":"vfox plugin artifacts must not declare executables","messagePattern":"vfox plugin artifacts must not declare executables","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/plugins/packslip.rs","lineNumber":186,"sourceCode":"        if existed {\n            file::rename(backup, destination).wrap_err(\"restoring previous plugin\")?;\n        }\n        return Err(error);\n    }\n    Ok(())\n}\n\npub(crate) fn validate_artifact(artifact: &packslip::model::Artifact) -> Result<()> {\n    ensure!(\n        artifact\n            .extensions\n            .get(\"mise\")\n            .and_then(|v| v.get(\"plugin\"))\n            .and_then(|v| v.as_str())\n            == Some(\"vfox\"),\n        \"packslip artifact must declare extensions.mise.plugin = vfox\"\n    );\n    ensure!(\n        artifact.bin.is_empty(),\n        \"vfox plugin artifacts must not declare executables\"\n    );\n    ensure!(\n        artifact.os.is_none() && artifact.arch.is_none() && artifact.libc.is_none(),\n        \"vfox plugin artifact must be portable\"\n    );\n    ensure!(\n        artifact.requires.is_none(),\n        \"vfox plugin artifacts must not declare host requirements\"\n    );\n    ensure!(\n        matches!(artifact.format.as_deref(), Some(\"tar.gz\" | \"tgz\")),\n        \"vfox plugin artifacts currently require tar.gz format\"\n    );\n    Ok(())\n}\n","sourceCodeStart":168,"sourceCodeEnd":204,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/plugins/packslip.rs#L168-L204","documentation":"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.","triggerScenarios":"A packslip release manifest declares `bin = [...]` (or `[[bin]]` entries) on the artifact that is being validated as a vfox plugin via `plugin_artifact_contract`.","commonSituations":"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.","solutions":["Remove all `bin` entries from the plugin artifact's manifest and republish.","Split the release: keep the vfox plugin artifact free of executables and declare CLI binaries in a separate non-plugin artifact.","If the project is actually a binary tool, install it through the standard packslip tool path instead of the plugin contract."],"exampleFix":"// before (manifest)\n[[artifacts.plugin.bin]]\nname = \"mytool\"\npath = \"bin/mytool\"\n\n// after (manifest)\n[artifacts.plugin.extensions.mise]\nplugin = \"vfox\"\n# bin entries removed\n","handlingStrategy":"validation","validationCode":"// fail the release if a plugin artifact declares executables\njq -e '.artifacts[] | select(.extensions.mise.plugin == \"vfox\" and (.bin | length == 0))' manifest.json \\\n  || { echo \"vfox plugin artifact must not declare bin entries\"; exit 1; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never include a bin section in plugin artifact manifests.","Split plugin payloads and CLI binaries into distinct artifacts/releases.","Add a CI lint that asserts plugin manifests contain no bin entries."],"tags":["packslip","vfox","manifest","validation"],"backgroundTag":"schema-validation-failed","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}