Status: v0.1.7 (Inside) is the release this tree cuts: Cargo.toml says 0.1.7 and
CHANGELOG.md carries the dated entry. main is exactly the commit a release tag names.
The release workflow is .github/workflows/release.yml.
Audience: whoever cuts a vn-ranger release, and the launcher that installs it.
Ranger follows the vecnode release convention documented in vn-launcher/docs/RELEASES.md. That document is the agreement; this one is ranger's instantiation of it. Where the two disagree, the launcher's document wins, because it is the code that has to read the result.
| Branch | Holds | Moves |
|---|---|---|
main |
Exactly the last cut release. Its tip is the commit the vX.Y.Z tag points at. |
Only when a version is cut: dev is merged into it, the tag is placed on main, and nothing else lands there. |
dev |
Every change in progress, however many waves it spans. | Every commit. This is where work happens and where cargo xtask ci has to be green. |
| Tags | The releases themselves. | Never moved, never re-pointed (AGENTS.md §9). |
There is no per-release branch. A release is cut by merging dev into main, tagging that
commit, and pushing both -- in that order, so the tag never names a commit main does not
have. main is therefore always shippable and always shipped: a person who clones this
repository and checks out main gets the last release, not a half-finished wave.
| Question | Ranger's answer |
|---|---|
| Tag | v<major>.<minor>.<patch>, e.g. v0.1.0 |
| Release title | vn-ranger v<version>, e.g. vn-ranger v0.1.1 |
| Release | A published, non-draft GitHub Release for the tag |
| Asset stem | vn-ranger |
| Asset names | vn-ranger-<version>-<os>-<arch>.<ext> |
os |
windows, macos, linux |
arch |
x86_64, aarch64 |
ext |
zip on Windows, tar.gz elsewhere |
| Archive root | Exactly one directory: vn-ranger-<version>/ |
| Inside | vn-ranger (or vn-ranger.exe), README.md, LICENSE, THIRD-PARTY-NOTICES.md |
| Checksums | SHA256SUMS.txt, generated after every build finishes |
| Trigger | on: push: tags: ['v*'] |
| Pre-release | vn-ranger v0.1.6-rc.1, published with the pre-release flag, for the soak |
| Update mechanism | vn-launcher. Ranger does not update itself. |
The release title is the product and the version, and nothing else. What shipped is described in the milestone and the changelog; a description never becomes the title. The workflow creates every release with that title, so renaming one is a correction, not a step in the process.
So a full set looks like:
vn-ranger-0.1.0-windows-x86_64.zip
vn-ranger-0.1.0-linux-x86_64.tar.gz
vn-ranger-0.1.0-macos-aarch64.tar.gz
SHA256SUMS.txt
The binary is vn-ranger, never ranger. A binary called ranger collides with
the well-known terminal file manager on Linux and macOS, and a security tool that
shadows another program is not a small mistake.
- Read-only inventory: processes, startup items, listeners (Windows and Linux), installed packages, SHA-256 hashes of startup binaries.
- A clean-room hash-signature engine for local
.hdb/.hsbdatabases, with the built-in EICAR self-test. - Fifteen rules and a Findings view, each finding carrying its evidence, its reason and
a named benign explanation; suppressions scoped to one
(rule, subject)pair. - The accepted baseline and the diff against it, a two-second process poll and file watchers.
- An interface layer: command palette, keyboard navigation, filters, saved preferences.
- An opt-in, one-shot administrator scan on Windows.
- No quarantine, no cleaning, no tray, no autostart, no external rules, no network.
The release notes must repeat those limitations. A release that implies antivirus coverage it does not have is the behaviour this project exists to reject.
One release, five waves (docs/PLAN.md §9): an action journal and a typed action API,
quarantine with verified restore, allowlisted cleaning, a tray with opt-in autostart and
a scheduler, signed rule packs with an optional content scan, and a catalogue of rules
that name their technique.
The release notes for it must say, in the same breath:
- Cleanup is an allowlist, not a cleaner. The table in
docs/PLAN.md§6.10 is the whole of it. Browser profiles, trash containers and everything outside it are not cleaned, and the interface says so. - Quarantine is reversible; deletion is not. A permanent delete exists only inside
the quarantine, only by id, and only after
DELETEis typed. - No elevation was added. The administrator scan is still one operation that writes one snapshot and exits; it cannot quarantine, clean or change a setting.
- Still not an antivirus, still no kernel driver, no service, no rootkit detection, no memory scanning, and no claim that a machine is clean.
- A signed rule pack is not a signed release. The archives are verified with
SHA256SUMS.txtand nothing else until v0.2.0; the pack signature proves who wrote a rule file, not who built the binary. - macOS login items, and a Linux tray that works with no status-notifier host,
remain named gaps in
docs/PLAN.md§7.
vn-ranger-0.1.0/
vn-ranger.exe (or vn-ranger on Unix)
README.md
LICENSE
THIRD-PARTY-NOTICES.md
No absolute paths, no .., no symlinks that escape the root. The launcher rejects
those entries, but a rejected archive is a failed install, not a security incident
avoided quietly.
The archive is licensed AGPL-3.0-only, and the licence travels with it. LICENSE is
the licence, THIRD-PARTY-NOTICES.md is the attribution for the crates and typefaces
inside the binary, and the release notes carry the written offer that section 6 of the
licence asks for: the Corresponding Source for this build is this repository at tag
vX.Y.Z. A release whose tag is not in the repository is not shippable, because there
would be no source to point at.
SHA256SUMS.txt covers every other asset, in the format sha256sum produces:
a4a9447b09e37a417c0fb90e7c826c46801c6b32eaf49497b78bbf1842a6b990 vn-ranger-0.1.0-linux-x86_64.tar.gz
It is generated in a job that runs after every build uploads its archive. A checksum file computed before the last upload is a lie.
The launcher uses, in order: SHA256SUMS.txt, then GitHub's own asset digest, then
record-and-warn. Ranger publishes the first, so the first is what will be used.
| Target | Runner | Notes |
|---|---|---|
x86_64-pc-windows-msvc |
windows-latest |
Static CRT (-C target-feature=+crt-static) |
x86_64-unknown-linux-gnu |
ubuntu-22.04 |
Oldest glibc we support; not ubuntu-latest |
aarch64-apple-darwin |
macos-latest |
Universal binary once both macOS targets build in one job |
aarch64-unknown-linux-gnu |
cross or native | Added only when a runner and a test exist |
The workflow builds -p vn-ranger with --locked, so only the application is
packaged and the dependency graph is the one in Cargo.lock. The checksum job runs
after every build has uploaded, and re-downloads the assets rather than trusting the
build directories.
A platform that is not built publishes nothing for that platform. "There is no build
for this system" is a useful answer; a Linux binary named macos is not.
- Start at
v0.1.0. - Patch releases fix defects; the
0.1.xline also carries the interface polish and the watch, explain and act milestones. v0.1.6 is one large release, not three: act, resident and rule packs ship together, in five waves with one gate (docs/PLAN.md§9). The0.2.0minor is distribution and signing;v1.0.0is the audited release. - A release of this size is cut through release candidates.
v0.1.6-rc.Ncarries the pre-release flag, and the 24-hour soak and the manual matrix run on that binary, not on a developer build. A candidate takes fixes, not features. The final tag comes from the last candidate that passed everything. - Never replace an asset on an existing tag. A checksum is a statement about a
file; replacing the file invalidates every verification already made. Cut a patch.
This applies to pre-release tags too:
rc.2is a new tag, never a replaced asset.
v0.1.0 through v0.1.x ship with SHA256SUMS.txt only. The README and the release notes
say so.
From v0.1.6 the rule packs are signed (minisign, detached, verified before parsing), and that is a different claim from a signed release: the pack signature says who wrote a rule file. It says nothing about who built the binary, and the release notes must not let the two blur.
v0.2.0 targets:
- Windows: Authenticode, with a certificate the project owns.
- macOS: Developer ID, hardened runtime, notarisation.
- Linux: a detached
minisignsignature over the archives and the checksum file.
A checksum protects against a truncated download and a corrupted mirror. It does not protect against a compromised maintainer account, because whoever can replace the archive can replace the checksum in the same release. Signing is the answer to that, and it is a v0.2.0 requirement, not a v0.1 claim. The signature primitive is the one the rule packs already use, so it is exercised for a release before it protects one.
-
cargo xtask ciis green on all three runners. The release workflow calls that same check as its gate, so a tag on a red commit publishes nothing: the matrix runs at the cut rather than on every commit, which is why the cut is the one place it cannot be skipped. - The version in
Cargo.tomlmatches the tag. -
CHANGELOG.mdhas the entry. -
README.mdanddocs/PLAN.mdstill describe what the binary does. - The archive unpacks to exactly one directory and contains the binary.
-
SHA256SUMS.txtis generated after the last build. - A clean VM runs the archived binary, and install through vn-launcher is verified as soon as the launcher's install path ships.
- No new dependency brings a network client (
cargo xtask cichecks it). - The release notes name the known limitations, including the ones in this file, and the Corresponding Source for the build: this repository at the tag.
-
THIRD-PARTY-NOTICES.mdmatchesCargo.lock: no crate added, removed or upgraded since it was regenerated, and the totals still add up. - From
v0.1.6: every deletion path has two named reviewers, and the traversal table was written by the second one from the specification. - From
v0.1.6: the 24-hour soak numbers are indocs/BENCHMARKS.md, with the build and the configuration they were taken on. - From
v0.1.6: the default build contains no YARA-X, andcargo treeproves it. - From
v0.1.6: the manual matrix includes a desktop with no status-notifier host, a suspend and resume, and an autostart entry removed by hand.
.msi,.dmg,.deb,.rpmor.AppImageinstallers. The launcher unpacks archives and never runs installers.- A build that was not produced from the tagged commit.
- An archive without the licence, the third-party notices and the README.
- A "portable" asset with a different stem, however convenient it looks today.