Skip to content

Releases: prikk-vcs/prikk

0.35.0

Choose a tag to compare

@github-actions github-actions released this 06 Sep 12:21
0.35.0
0b5345a

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> --locked

cargo 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

Choose a tag to compare

@github-actions github-actions released this 06 Sep 08:48
0.34.0
f1be4c4

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> --locked

cargo 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

Choose a tag to compare

@github-actions github-actions released this 06 Sep 04:38
0.33.0
19f5cea

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.

  • --out and --*-seed-out write a seed only to a path you name, mode 0600, 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 export line 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>/cmdline is world-readable on Linux and shells record arguments in history.
  • --out is refused on Windows, because prikk cannot set restrictive permissions there without
    facilities it does not use. Use prikk key generate without 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> --locked

cargo 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

Choose a tag to compare

@github-actions github-actions released this 05 Sep 11:28
0.32.0
87b65c1

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 exportbundle 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 log prints 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> --locked

cargo 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

Choose a tag to compare

@github-actions github-actions released this 05 Sep 04:05
0.31.1
e30fdd8

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:

  • categoriesdevelopment-tools, command-line-utilities (checked against the live crates.io
    category list; there is no version-control category anywhere in it)
  • keywordsvcs, 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> --locked

cargo 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

Choose a tag to compare

@github-actions github-actions released this 04 Sep 04:34
0.31.0
534dca8

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 exportbundle 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> --locked

cargo 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

Choose a tag to compare

@github-actions github-actions released this 03 Sep 15:12
0.30.0
dd3fc1e

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)

  • PrikkError is 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) became Io { kind: Option<std::io::ErrorKind>, context: String }, and
    From<std::io::Error> now preserves the operating system's error kind instead of discarding it.
    kind is None at 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 --help and prikk worktree-status --help now mention .prikkignore, which shipped
    in 0.29.0 without 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, and RefStore::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-benchmarks workspace member carrying criterion, outside default-members so it
    reaches no product crate's manifest and no shipped dependency graph.

Documentation

  • .prikkignore now 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 verify cost section was corrected. It described verify as
    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
    "merge can reach it". It cannot. Every EditText is authored against the text its
    predecessors produced, so the operations merge composes 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> --locked

cargo 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

Choose a tag to compare

@github-actions github-actions released this 02 Sep 22:04
0.29.0
5ee307a

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. target matches target and everything under it, never
    target2 or targetfoo — 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 onlycommit's worktree walk and worktree-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 make commit see an existing file as deleted. A malformed .prikkignore is
    refused rather than treated as empty.
    No file at all means no rules: every existing repository
    behaves exactly as it did before.

    .prikkignore is an ordinary tracked file, not configuration — it is committed, signed, and
    travels through bundle and sync like 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/full still panicked, because the error report itself panicked on
    its own failed write. The exit code now stays inside the ruled 0/1/2 vocabulary even when the
    message cannot be delivered anywhere.
  • seal and merge now report a bad flag as the usage error it is. Both acquired the maintainer
    signing key before parsing their arguments, so prikk seal --nonsense with no key configured
    reported "maintainer signing is required" and exited 1. It now exits 2 with the argument error,
    matching commit and rollback-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_seq increments 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 declare contents: read explicitly.

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> --locked

cargo 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

Choose a tag to compare

@github-actions github-actions released this 02 Sep 08:25
0.28.0
9389b88

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 unlock declining to clear a lock now exits 1, not 0. It previously reported success
    while the lock was still held — and because its confirmation prompt reads "no" from an empty
    stdin, a non-interactive prikk unlock … && proceed was told everything was fine when nothing had
    happened.
  • An unrecognized argument is now refused with 2 instead of being ignored. prikk status --nonsense previously printed a normal report and exited 0; prikk init a b silently discarded
    b.
  • A repeated flag is now refused with 2 instead of silently taking the last value.
    prikk bundle export --ref heads/main --ref heads/other previously exported heads/other with 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 0o100644 or 0o100755. 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
    (macOS PATH_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 | head no longer panics. A closed reader is not a failure — the tool now exits
    0 silently, on every platform rather than only where SIGPIPE exists. A genuine write failure
    (a full disk on a redirected stdout) still reports, and now exits 1 instead of aborting.
  • prikk worktree-status works. 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 shares commit'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. The 0.24.0 version bump replaced its heading instead
    of inserting above it, which attributed the entire prikk sync release to 0.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> --help prints 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 --message as the long form of -m in
    commit, rollback-draft and tag create.
  • prikk commit now says that it discards your message. The message is still required and still
    validated; it is not stored, it does not appear in prikk log, and persisting it is a later
    increment. It was silently dropped before.
  • A security policy. SECURITY.md states where to report a vulnerability privately, what this
    project does and does not promise, and — plainly — that release-signer verification of a prikk
    binary is not yet available.
  • Backup and restore documentation, plus a self-describing bundle manifest, offline
    bundle verify, and atomic collision-safe writes on the bundle export and sync output
    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> --locked

cargo 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

Choose a tag to compare

@github-actions github-actions released this 31 Aug 02:17

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.sh and uninstall.sh
    with their own checksums:

    curl -fsSL https://github.com/nabbisen/prikk/releases/latest/download/install.sh | sh

    It 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 on PATH.
    --version X.Y.Z pins a release; --prefix DIR chooses the location. The download-then-inspect
    form is documented beside the pipe form. uninstall.sh removes the binary and the one marked
    PATH block it added, and nothing else. Linux (x86_64/aarch64) and macOS (Apple Silicon);
    Windows is refused with a message pointing at cargo install or the .zip.

    What a passing checksum proves is integrity of transport, not authority of origin
    release-signers.toml is 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> --locked

cargo 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.