v1.0.0: The format goes to version 1
packslip declares its manifest format stable at version 1 and cuts the CLI and GitHub Action to 1.0.0. The rest of this release is a batch of fixes and small CLI additions found while wiring packslip into the release runs of the jdx.dev CLIs. packslip remains a work-in-progress proposal with only experimental mise support; version 1 fixes the field meanings, names, vocabularies, and selection rules that consumers rely on, but "version 1" of the format and the crate's semver are different numbers, and a future version 2 would be its own predicate type published alongside this one rather than a break of anything signed under release/v1.
Added
-
Platform scoping for
packslip create --resource, so a release with a per-platform layout no longer needs a generatedpackslip.tomlfor a one-line difference. The scope goes after the kind head as@os,@os/arch, or@os/arch/libc; the@is only split off the closed grammar of the kind, so an@inside anexecargv or arepopath is left untouched. The Action'sresources:lines pass through unchanged, so this works there with no new input. (#64, @jdx)packslip create --resource 'man@linux=archive:share/man/man1/tool.1' packslip create --resource 'completion/zsh@darwin/aarch64=archive:share/zsh/site-functions/_tool'
-
A
--format FILENAME=FORMATflag and a matchingformatsinput on the Action, so a vendor can name an artifact's file type without a manifest when inference cannot read it from the name. The value stays open, so a vendor may declare a type this specification does not name. (#65, @jdx) -
A
tests/conformance/suite of plain-JSON cases covering artifact selection, resource selection, tag parsing, and statement validity, for other implementations (mise's consumer being the immediate reader) to test against. (#62, @jdx)
Fixed
packslip createnow infersformat = "raw"for a bare executable whose name ends in a dotted version, such asmise-v2026.9.1-linux-x64. Previously the version tail was mistaken for an extension, no known format matched, and the bare artifact landed in the manifest with noformatfield at all, leaving a consumer nothing to go on. (#59, @jdx)- An
archiveresource source no longer applies to a bare-format artifact (raw,gz,xz,zst,bz2). An archive entry names a path inside the selected artifact, but a bare artifact has no paths inside it, so a consumer that picked the bare executable was being told to hunt for a file inside the binary. The same resource can still reach a bare artifact through anassetorreposource. Naming a bare artifact from anarchiveentry is now its own document error rather than being misreported as a platform-scope problem. This lets a project that ships both tarballs and a bare executable per platform collapse many hand-named entries into a single unscoped one. (#63, @jdx) - The
packslip.dev/releases/v1predicate URL, written into every signed release list, previously 404'd; it is now an alias onto the specification, and the generated JSON schemas now carry an$idnaming their published URL. (#62, @jdx)
Changed
- The GitHub Action's
attestinput gains a third mode,link. It writes theprovenancelinks onto the manifest without re-attesting, for workflows where the build jobs already attested each artifact — the stronger claim, since the attestation is made by the job that did the build. GitHub serves an artifact's provenance at the same URL whoever attested it, solinkneeds noattestations: writepermission. It belongs only in a workflow that really does attest every file it publishes, since an unattested artifact would leave a dead link. An unrecognizedattestvalue now fails the step instead of being silently treated asfalse. (#60, @jdx)
Breaking Changes
- Every artifact in a signed release must now declare a
format. An artifact with no format is unselectable by construction —select_artifactskips it — so this is enforced in the spec, the JSON schema,validate(which now names the offending artifact), andpackslip create(which refuses to write one and names the two ways out: set--formator leave the file out ofartifacts). Broadartifactsglobs that previously swept up non-installable files such as.dylib/.dllFFI libraries or C headers will now fail at create time until those files are excluded or given a format. (#65, @jdx) - The format is declared stable at version 1, and the CLI and Action move to 1.0.0. From this release the Rust API is covered by the crate's semver and checked by
semver_check; a verify-only consumer takes the crate withdefault-features = false. (#62, @jdx)
Full Changelog: v0.3.1...v1.0.0