Releases: prikk-vcs/prikk
Release list
0.35.0
Added — prikk status --format json, and which patches a seal will freeze
prikk status could say how many patches were queued, but not which ones. --format json
(status-report-v1) now carries everything the prose form does, plus the queue itself: for each
queued patch, in queue order, its patch id, its operations' kinds, and the paths those operations
affect. This is for knowing which patches a seal will freeze, not only how many — the same
information a seal ceremony needs to ask for informed consent before an irreversible act, not just
a count of how much is about to happen. Bare prikk status is unchanged and pays nothing new; the
queue is only resolved when --format json actually asks for it.
Changed — six more refusals now say precondition not met, not lock conflict
A full active-patch queue, an active WAL owned by the wrong ref for a commit, an incomplete ref
publication, a non-empty active WAL at rollback-draft or seal-from-accepted time, and an active WAL
holding more than a rollback draft at verify time were all reported as lock conflict: .... None
of them involve a lock: nothing is held, no other writer is racing, and waiting never made any of
them go away — only running seal, doctor, or retrying with the right ref did. They now read
precondition not met: ..., matching what was actually wrong and what actually fixes it.
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.
0.34.0
Added — prikk trust maintainer list and check: asking what a repository trusts
Until now there was no way to ask which MAINTAINER keys a repository currently trusts — a caller
had to attempt a seal and see whether it failed. prikk trust maintainer list [--format json]
enumerates every currently adopted key, in adoption order; prikk trust maintainer check --key-id <ID> [--format json] answers whether one specific id is adopted. Both read a policy already
loaded on every seal; neither adds any new state, and neither changes adoption, revocation, or
what seal requires.
check exits 0 whichever way the question resolves. "Key X is not trusted" is a successful
answer, not an operational failure — exiting 1 for a negative answer would file a successful
query as a refusal, the exact conflation a machine-readable exit code exists to avoid. 1 and 2
keep their usual meanings: an unreadable policy is 1, a missing or malformed --key-id is 2.
Changed — trust maintainer add and setup print a derived count, not a literal
Both used to print policy: required=1 after adopting a key — a literal, from a policy that has
no such field (MaintainerTrustPolicy holds a Vec and nothing else; trust is any-of-N by
construction). They now print adopted maintainer keys: <n>, where <n> is read back from the
policy and changes as more keys are adopted. prikk trust maintainer list already states what
trust means; this line's job is only to say how many.
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.
0.33.0
Added — prikk setup and prikk key: a first repository without inventing anything
Before this release a new user could not reach a sealed commit at all. It required two 32-byte
seeds invented by hand and a public key derived from one of them — and no command derived a public
key. There was no way to do it with prikk.
$ prikk setup ./my-repo
initialized Prikk repository at ./my-repo/.prikk
trusted maintainer key: maintainer
policy: required=1
export these before committing:
export PRIKK_AUTHOR_KEY_ID="author"
export PRIKK_AUTHOR_SEED="..."
export PRIKK_MAINTAINER_KEY_ID="maintainer"
export PRIKK_MAINTAINER_SEED="..."
note: at least one seed above is now in your terminal scrollback -- treat it as a secret
next steps:
prikk commit -m "<message>"
prikk seal --allow-no-audit # no audit trust policy is configured yet; see `prikk seal --help`Following that output word for word reaches a sealed, verified commit. Measured on a clean path,
the number of unfamiliar steps drops from eleven to five.
prikk setup [<path>] [--author-seed-out <path>] [--maintainer-seed-out <path>]— creates the
repository, generates both keys, registers the maintainer key, and prints what you need next. It
shows the trust decision it makes: registering a maintainer key is a trust act, and a one-shot
flow that performed it invisibly would teach you that the step is a formality.prikk key generate [--out <path>]— a fresh seed from the OS CSPRNG, with its public key and
the exact next commands.prikk key public --seed-env <NAME>— the public key for a seed you already hold.
How prikk handles secrets, stated because it is a deliberate limit
prikk never invents a location for key material, never reads one back, and never manages its
lifecycle. It has no keystore and will not gain one.
--outand--*-seed-outwrite a seed only to a path you name, mode0600, refusing to
overwrite an existing file and refusing any path inside.prikk/.- When you give an output path the seed is never printed — the printed
exportline reads
"$(cat <path>)", so the secret reaches neither your scrollback nor your shell history. Without a
path the seed is printed and prikk says so plainly. - A seed is never accepted as a command-line argument, only through an environment variable you
name./proc/<pid>/cmdlineis world-readable on Linux and shells record arguments in history. --outis refused on Windows, because prikk cannot set restrictive permissions there without
facilities it does not use. Useprikk key generatewithout a path and place the seed yourself.
Durable configuration for policy settings (PRIKK_ACTIVE_PATCH_LIMIT and the rest) is deliberately
not part of this — see RFC 135.
Changed — two error messages changed their classification prefix
Reported by an external front-end (stikk) matching on our error text: two refusals were reported
under the wrong error class, because each was built from whichever PrikkError variant happened to
be nearest the call site rather than one that describes the condition. Both refusals were already
correct; only the leading word was wrong, and a caller matching on it could reasonably conclude the
wrong thing about what to do next.
$ prikk commit --from-worktree --ref heads/other -m "x"
-error: lock conflict: active WAL is owned by heads/main; requested ref heads/other
+error: precondition not met: active WAL is owned by heads/main; requested ref heads/other
$ prikk commit --from-worktree -m "nothing changed"
-error: invalid name: worktree has no node-addressed changes to commit
+error: precondition not met: worktree has no node-addressed changes to commit
Neither was ever a lock (nothing is held, no other process is racing this one) or a name-validation
failure (no name is involved). Both are the caller asking for something the current state cannot
satisfy — waiting does not help, only changing the request does — the case prikk-error's new
Precondition variant (added non-breaking, since PrikkError is #[non_exhaustive]) now names
directly. Anything matching on the old lock conflict: or invalid name: prefix for either of these
two specific messages needs to match precondition not met: instead. No other error site, no exit
code, and no command's control flow changed.
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.
0.32.0
Read this before upgrading one machine and not another. Nothing about using prikk changes —
no command, flag, or exit code differs from 0.31.1. But repositories written after this change
cannot be read by earlier releases.
Breaking change — repositories written here are not readable by 0.31.1 or earlier
prikk commit -m <message>'s message is no longer discarded: it is now signed, identity-bearing
evidence, recorded on every Patch at schema 4, which earlier releases do not admit. This
applies to every commit, not only ones that carry an unusual message — -m was already
mandatory, so every patch this release authors carries one.
An older prikk reads such a repository, or imports a bundle exported from one, and refuses:
error: integrity error: format-2 patch does not accept envelope schema 4 (accepted: [1, 2, 3])
A bundle offered directly (bypassing repository-level schema admission) refuses earlier still, at
decode:
error: malformed persisted data: invalid PatchPurpose canonical form: canonical encoding error: unknown PatchPayload field tag: 6
It fails closed with an accurate message — nothing is corrupted and no history is lost — but the
older build cannot proceed. Both the local case and the bundle export → bundle import case were
demonstrated against a 0.31.1 build, not assumed.
Upgrade every machine that shares a repository before committing with this release.
This direction is the one the compatibility contract does not promise. Repositories written
before this release keep working exactly as they did — a 0.31.1 build still reads and verifies
them cleanly, confirmed rather than assumed.
Why the schema changed
prikk commit -m <message> validated the message, then dropped it — a repository whose whole claim
is that it is evidence could not answer "what was this change?" The message is now an optional,
identity-bearing field on Patch (tag 6), mirroring TagPayload.message, and is shown per patch
under each block in prikk log. A patch written before this change carries no message and shows no
message line — absence, not a placeholder.
Raised by the external architecture audit of 2026-08-31; designed and ruled on in
RFC 123.
Changed
prikk commit's interim note that the message is "validated but not stored" is removed — it is
stored now.prikk logprints one line per patch that carries a message, under its block.
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.
0.31.1
Nothing about running prikk changes, and this release cannot strand a machine. No command,
flag, exit code, message, object format or on-disk layout differs from 0.31.0, and repositories
written by 0.31.1 are readable by 0.31.0 — the opposite of the previous release, which was
one-way. Not one line of runtime source changed between the two tags; only crate manifests and one
test file did.
Why it exists — the published crates were miscatalogued
Every crate published up to and including 0.31.0 carried no categories, no keywords, and no
documentation URL. crates.io renders a crate's page from its published manifest, so the fix had
to travel in a release; there was no other way to deliver it.
All eight published crates now carry:
- categories —
development-tools,command-line-utilities(checked against the live crates.io
category list; there is no version-control category anywhere in it) - keywords —
vcs,version-control,dvcs,patch,merge - documentation — a per-crate
https://docs.rs/<crate>link - homepage — previously set on one crate of eight
The project has a front page
https://prikk-vcs.github.io/prikk/ now serves a landing page, and the documentation moved to
https://prikk-vcs.github.io/prikk/docs/. Existing links to the book need /docs/ inserting;
links to the site root still work and now land on the front page.
This shipped when it was published, not with this tag — it is noted here because the URL moved.
Also in this release
CONTRIBUTING.md, describing how work is actually reviewed in this repository.- A Git → prikk mapping page, a
command-correspondence table plus the four places the two models genuinely differ. - A slimmer
README.md, with the command surface, current state and repository layout routed into
the book. - The documentation-currency gate now reads HTML code context, so the landing page's commands are
checked against the live command registry like every other declared page.
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.
0.31.0
Read this before upgrading one machine and not another. Nothing about using prikk changes —
no command, flag, exit code, or message differs from 0.30.0. But repositories written by this
release cannot be read by older ones.
Breaking change — repositories written by 0.31.0 are not readable by 0.30.0 or earlier
Every patch this release authors is recorded at Patch schema 3, which earlier releases do not
admit. This applies to every commit, not only ones that edit text.
An older prikk reads such a repository, or imports a bundle exported from one, and refuses:
error: integrity error: format-2 patch does not accept envelope schema 3 (accepted: [1, 2])
It fails closed with an accurate message — nothing is corrupted and no history is lost — but the
older build cannot proceed. Both the local case and the bundle export → bundle import case were
demonstrated against a 0.30.0 build, not assumed.
Upgrade every machine that shares a repository before committing with 0.31.0.
This direction is the one the compatibility contract does not promise. prikk guarantees that
any release can read every object any prior release wrote, and that identity and signatures never
require migration — backward, not forward. Repositories written before this release keep working
exactly as they did, and the operations inside them still resolve through their original scheme,
permanently.
Why the schema changed
A text edit records which span it replaces. Until now that identity included the span's position
among identical occurrences, recomputed against whatever the file looked like at the time — so an
edit to one of two identical passages could renumber the other. Schema 3 replaces that with an
identity derived only from content and surrounding context, and guarantees uniqueness when the edit
is authored rather than guessing at replay.
The old behaviour was not reachable through ordinary use — every edit is authored against the
result of the ones before it, which kept the numbering consistent — and it was recorded as a known
limitation in 0.30.0. This release removes the fragility rather than continuing to rely on that
invariant holding.
Found by this project's own patch-algebra property tests
(RFC 134).
Changed
- A sequence of operations that cannot compose is now refused as "sequence operations do not compose
against a shared baseline" rather than reported as malformed evidence — the same refusal, named for
what it is.
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.
0.30.0
A verification and library-surface release. Nothing about using prikk from the command line
changes except two help lines. The one breaking change is in the library API, and it is the kind that
makes future releases less disruptive rather than more.
Breaking change — PrikkError (library only, no CLI effect)
PrikkErroris now#[non_exhaustive]. Code that matches on it must carry a wildcard arm.
This is the change worth having: from here, adding a new error variant is no longer a breaking
change for anyone matching on the type.Io(String)becameIo { kind: Option<std::io::ErrorKind>, context: String }, and
From<std::io::Error>now preserves the operating system's error kind instead of discarding it.
kindisNoneat the sites that construct the variant by hand — which is most of them today, and
is recorded honestly rather than filled with a placeholder.
No message text and no exit code changed. Display renders exactly as before, and the CLI
converts every error to a string before it reaches you, so this release is invisible from the command
line except for the help text below.
Crate source APIs remain an explicitly unstable compatibility surface
(release compatibility).
Changed
prikk commit --helpandprikk worktree-status --helpnow mention.prikkignore, which shipped
in0.29.0without appearing in either.
Verification
None of this changes behaviour; it changes what the project can catch.
- Ten doctests on the kernel entry points — compiler-verified examples on
ObjectId,
CanonicalWriter, path validation, the Ed25519 surface, andRefStore::publish. The workspace
previously ran zero. - Property tests for the patch algebra, covering classifier conservatism and the difference
between pairwise and full-order replay. - A
prikk-benchmarksworkspace member carrying criterion, outsidedefault-membersso it
reaches no product crate's manifest and no shipped dependency graph.
Documentation
-
.prikkignorenow has a guide page describing its syntax, the two commands that consult it,
the surfaces it deliberately does not affect, and its limits. -
The architecture reference's
verifycost section was corrected. It describedverifyas
roughly O(N³) — about 34 seconds at 160 blocks — which stopped being true on 2026-08-18.verify
is linear: 27.04 ms at 160 blocks, and the property is held by a gate. -
A latent fragility is recorded, in the architecture reference's known-costs table. A text
span's identity includes its position among textually- and contextually-identical occurrences,
recomputed against the buffer in front of it — so a sequence of edits authored against a shared
baseline, rather than each against its predecessor's result, does not replay. It was found by this
release's own new property tests. Tracked as RFC 134.Corrected 2026-09-04, the same day this release was published. This entry first said
"mergecan reach it". It cannot. EveryEditTextis authored against the text its
predecessors produced, so the operationsmergecomposes carry indices consistent with the replay
that reproduces them — verified by building the exact two-commit case and replaying it, not by
reading. No user-facing path reaches this, and no shipped behaviour is affected: the correction
is to a claim about the code, not to the code. What remains is an unstated invariant that nothing
checks, and a refusal reported as malformed evidence rather than as what it is.
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.
0.29.0
Generated files can be kept out of a commit. Until now commit scanned and signed everything in
the worktree — a limitation this project's own README named as a reason not to use it. .prikkignore
closes that gap. The rest of this release finishes the corrective program for the 2026-08-31 external
audit, including a correction to something 0.28.0's own notes claimed and only half delivered.
Added
-
.prikkignore— a worktree ignore mechanism. A file at the repository root, one rule per line,
each a literal repo-relative path prefix.targetmatchestargetand everything under it, never
target2ortargetfoo— whole path components, so a rule cannot over-match a differently-named
sibling. There is no globbing, no negation, no comments, and no per-directory files, and that
is a stated limit rather than a first step: an ignore syntax that nearly matched gitignore's
semantics would be worse than one that plainly does not attempt to.It binds at discovery only —
commit's worktree walk andworktree-status's, and nothing
else. Applying, replaying, verifying, and materializing history ignore it entirely, so two
repositories with different ignore files can never disagree about the same signed history.A rule can never hide a path that is already tracked, or one under an already-tracked path, so
adding a line cannot makecommitsee an existing file as deleted. A malformed.prikkignoreis
refused rather than treated as empty. No file at all means no rules: every existing repository
behaves exactly as it did before..prikkignoreis an ordinary tracked file, not configuration — it is committed, signed, and
travels throughbundleandsynclike anything else.
Fixed
- A full-disk stdout and stderr together no longer exits
101.0.28.0's notes announced this
fix and delivered half of it: the single-stream case was corrected, while
prikk verify >/dev/full 2>/dev/fullstill panicked, because the error report itself panicked on
its own failed write. The exit code now stays inside the ruled0/1/2vocabulary even when the
message cannot be delivered anywhere. sealandmergenow report a bad flag as the usage error it is. Both acquired the maintainer
signing key before parsing their arguments, soprikk seal --nonsensewith no key configured
reported "maintainer signing is required" and exited1. It now exits2with the argument error,
matchingcommitandrollback-draft.
Changed
- A worktree path that is not valid UTF-8 is now reported as an invalid name rather than as a
repository integrity failure. An empty path remains an integrity failure. - Three internal
update_seqincrements now refuse rather than wrap on overflow — unreachable in
ordinary use, changed for consistency with the ref-log's existing checked arithmetic. - The workspace now denies
unwrap,expect, and direct indexing in product code at build time
rather than warning, the patch algebra gained oracle-backed property tests, and the three
check-only CI workflows declarecontents: readexplicitly.
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.
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.
0.27.1
A one-command install, and a beginner's path through the docs. No library or command behaviour
changed in this release — prikk itself is byte-for-byte the same tool as 0.27.0. This cut exists
so the installer has a release to attach to.
Added
-
A shell installer and uninstaller, attached to this release as
install.shanduninstall.sh
with their own checksums:curl -fsSL https://github.com/nabbisen/prikk/releases/latest/download/install.sh | shIt detects the platform, downloads the matching archive, verifies its SHA-256 and refuses to
install if verification fails or if no checksum tool is present, and puts the binary onPATH.
--version X.Y.Zpins a release;--prefix DIRchooses the location. The download-then-inspect
form is documented beside the pipe form.uninstall.shremoves the binary and the one marked
PATHblock it added, and nothing else. Linux (x86_64/aarch64) and macOS (Apple Silicon);
Windows is refused with a message pointing atcargo installor the.zip.What a passing checksum proves is integrity of transport, not authority of origin —
release-signers.tomlis still empty and fail-closed, so no release yet satisfies the DC-35
signer-authority audit. The installer says so itself when it finishes. -
A beginner's on-ramp in the documentation — a tutorial,
a troubleshooting page, and an
FAQ, placed before the signing setup a reader
previously met first. The tutorial's commands are run by a test on every change, so a release
that breaks them fails CI rather than the reader. -
Build-from-source guidance for platforms without a prebuilt binary — other Linux architectures
build with no reduction in capability; the BSDs compile but are read-only, since repository
mutation is refused off Linux, macOS, and Windows.
Fixed
Nothing — no behaviour changed.
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.