0.28.0
The command line now behaves the way a script expects. An independent external architect audited
this project at 0.27.1 and found, among other things, that prikk verify | head panicked, that
worktree-status failed on every repository this tool can create, that a repeated flag silently took
the last value, and that a required commit message was validated and then discarded. This release is
the corrective program for that audit's first two bands. Almost everything below is a behaviour
change, and each one is named here because prikk is pre-1.0 and this file is where such changes are
declared.
Breaking change — exit codes
prikk previously exited 0 or 1 and nothing else, so a flag typo, a dirty worktree, and a
corrupt repository were indistinguishable to a caller. The contract is now:
0— the operation succeeded and did what was asked.1— operational failure: verification findings, integrity failure, a refusal, a dirty
worktree.2— usage error: unknown argument, missing required flag, malformed value, duplicate flag,
detected before any repository work begins.
A separate code for "findings" was considered and refused: verify --format json already carries
that verdict, structured and three-valued, and duplicating a lossy subset of it into an integer would
give two sources of truth for one question.
Scripts that branch on the old two-code behaviour need review. Specific movements:
prikk unlockdeclining to clear a lock now exits1, not0. It previously reported success
while the lock was still held — and because its confirmation prompt reads "no" from an empty
stdin, a non-interactiveprikk unlock … && proceedwas told everything was fine when nothing had
happened.- An unrecognized argument is now refused with
2instead of being ignored.prikk status --nonsensepreviously printed a normal report and exited0;prikk init a bsilently discarded
b. - A repeated flag is now refused with
2instead of silently taking the last value.
prikk bundle export --ref heads/main --ref heads/otherpreviously exportedheads/otherwith no
indication which ref it had chosen. Nearly every value-carrying flag in the tool had this shape.
Breaking change — the format boundary refuses more
Two classes of input that the encoder would never produce are now rejected at decode as well as at
encode, so a hostile or corrupt artifact cannot enter through a path authoring would have refused:
- File modes must be
0o100644or0o100755. Materialization applies recorded modes through
fchmod, which would otherwise honour setuid, setgid and sticky bits; the only guard was a check
in a different subsystem at seal time. - Repository paths are length-capped — 255 bytes per component (
NAME_MAX) and 1024 bytes total
(macOSPATH_MAX, the strictest total the tool can guarantee). Longer paths previously entered
signed history and then failed to materialize with a raw OS error. Windows' legacy 260-character
limit is not claimed: it depends on where the worktree root sits and cannot be bounded from a
repository-relative length.
Repeated singular fields in a decoded record are also refused now rather than silently taking the
last one. Verified against real committed repository fixtures, including one written by 0.27.0's
own encoder: no existing history is refused by any of this.
Fixed
prikk verify | headno longer panics. A closed reader is not a failure — the tool now exits
0silently, on every platform rather than only whereSIGPIPEexists. A genuine write failure
(a full disk on a redirected stdout) still reports, and now exits1instead of aborting.prikk worktree-statusworks. It had been comparing against a snapshot baseline that no
command has produced since the patch-replay migration, so it failed on every repository this CLI
can create. It now sharescommit's own baseline derivation — one computation backing both, so
they cannot drift apart again — and it says when the active queue belongs to a different ref, since
an "untracked" file there may be committed-but-unsealed work.0.23.0's changelog entry is restored. The0.24.0version bump replaced its heading instead
of inserting above it, which attributed the entireprikk syncrelease to0.24.0. A gate now
checks that every released tag still has exactly one entry, not just the tag being cut.
Added
- Per-command help.
prikk <command> --helpprints that command's own usage, derived from the
same table the top-level help renders from. It works before a repository is opened, and anywhere in
the argument list. - Seven flags the help never mentioned are now documented:
verify --format json,
verify --stop-on-first-error,unlock --force(an alias of--yes),doctor --repair-main-ref
(recognized, and always refused, with the reason), and--messageas the long form of-min
commit,rollback-draftandtag create. prikk commitnow says that it discards your message. The message is still required and still
validated; it is not stored, it does not appear inprikk log, and persisting it is a later
increment. It was silently dropped before.- A security policy.
SECURITY.mdstates where to report a vulnerability privately, what this
project does and does not promise, and — plainly — that release-signer verification of aprikk
binary is not yet available. - Backup and restore documentation, plus a self-describing bundle manifest, offline
bundle verify, and atomic collision-safe writes on thebundle exportandsyncoutput
surfaces.
Changed
- The project moved to
https://github.com/prikk-vcs/prikk. Documentation now lives at
https://prikk-vcs.github.io/prikk/, and the installer downloads from the new location. The old
repository URL redirects; the old documentation URL does not. - CI gained a scheduled advisory-database audit, a rustdoc lint gate, and a book build on pull
requests.
Prebuilt binaries
Linux (aarch64/x86_64), Windows (x86_64), macOS (aarch64). Each archive contains the prikk binary, LICENSE, and a sibling .sha256
checksum plus .build-info.txt recording the exact toolchain and command used to build
it — reproduce with:
git checkout <tag> && cargo build -p prikk --release --target <triple> --lockedcargo install prikk remains the toolchain-based install path; these binaries are an
additional option, not a replacement.
macOS binaries are unsigned. Gatekeeper will warn on first run — right-click (or Control-click) the binary and choose Open, or clear the quarantine attribute directly with xattr -d com.apple.quarantine <path>. Notarization needs an Apple Developer identity and is a stated gap for a future increment, not an oversight.
Release authority — read before relying on this release
This release does not pass the DC-35 signer-authority audit, and does not claim to. The
committed release-signer set (release-signers.toml) is empty and fail-closed, so no release
currently satisfies that gate. A checksum published beside a binary on this page proves integrity of
transport, not authority of origin. Verify what you obtain by content, not by release authority —
see prikk verify and this project's
release-compatibility reference.