Farrow 0.2.0
Pre-releaseFarrow 0.2.0 is a correctness and hygiene release on top of 0.1.0. It changes
how every command behaves at its boundary — under signals, in --json/--yaml
output, and when given misspelled input — and adds the gates that keep those
boundaries in place. The engine contract, the inventory format, the on-disk
state layout under $FARROW_HOME, and the embedded image catalog
(revision 2026082903, 9 families, 27 artifacts) are unchanged. 0.1.0
deployments continue to work without migration.
Highlights
- VPN split routes no longer block a healthy lab. A less-specific route
such as MonoProxy's physical-interface10.0.0.0/8exclusion cannot beat
Farrow's owned10.10.10.0/24, so preflight now permits it. Equal and
more-specific foreign routes, overlapping interfaces, occupied addresses,
and a missing owned/24remain hard failures. - Guest host markers converge on deployment terminology. New and
recreated guests delete both# farrow-project-hostand
# farrow-deployment-hostrows before writing only the deployment marker,
so upgrading never duplicates Farrow-owned/etc/hostsentries. - Selected scale-out is truly selected.
farrow up u24-1no longer
downloads every image named elsewhere in the inventory. Desired peers that
have not been created are reported asabsent; port/UUID allocation,
stop/start/destroy, persistent-disk validation, and generated SSH/hosts
integrations all operate on committed nodes without losing the full desired
inventory used by later incrementalup. - Clean cancellation.
SIGINT/SIGTERMcancel long-running commands
through one context: the progress line stops, held locks are released, and
the command exits130with exactly one structured result
({"error":"cancelled"}). An interruptedup,recreate, ordestroy
still appends its event toevents.jsonl, so the audit trail shows what the
signal cut short. Ctrl-C inside an SSH session stays remote. reloadis one operation. Definition drift and removed inventory nodes
are refused before any node stops, so a configuration that needs
recreateordestroynever takes a healthy lab down;--jsonemits a
single document instead of one per phase.- Misspelled nodes are refused, not executed.
farrow ssh metaa -- uptime
is a usage error instead of runningmetaa uptimeon the control node.
Unknown or repeated node selectors on any lifecycle command exit2before
host preflight or a confirmation prompt. The ambiguous no---form warns
once;--remains the unambiguous and recommended remote-command boundary. - Confirmations are exact.
destroyasks for the samedestroytoken
whether or not nodes are selected and prints the exact scope (nodes,
persistent disks, keys, state) first.setuptreats end of input at its
[Y/n]prompt as a cancellation; only an answered prompt defaults to yes. - Structured output keeps its reasons. Every failure that used to be
written straight to stderr now reaches the--jsonpayload with its
category; presentation flags never change an exit status. Verbose
diagnostics redact credentials and query strings from source URLs. - Smaller dependency graph. Viper and its nine transitive modules are gone;
the shipped license inventory drops from 19 modules to 9 and the binaries
readFARROW_OUTPUT/FARROW_VERBOSEdirectly. - Installer retention.
install.shand development builds keep at most
three verified release directories under.farrow-releases
(FARROW_INSTALL_KEEP=N,0disables);currentis never touched.
Compatibility notes
- 0.1.0 deployments remain readable without an on-disk format migration. After
upgrading, runfarrow statuswhile each retained VM is live so any
pre-release process-birth identity can be rewritten from native evidence. - A pre-0.1 development deployment whose resolved network is
useris not a
released format. Preserve any required disks, destroy that development
deployment explicitly, and rebuild it on the fixed-IP network. - Existing guests keep their current
/etc/hostsbytes until they are
recreated. Every 0.2 seed removes both the 0.1.0 project marker and the new
deployment marker before writing the current rows. - New exit code
130: interrupted bySIGINT/SIGTERM, or a confirmation was
declined. Scripts that checked for2after a mismatcheddestroytoken or
4after answeringnotosetupmust accept130; a missing--yesor
--forceon a pipe remains2. farrow logs --source eventsrejects a node argument; it is the
deployment-wide log.farrow image listhelp now says what the command always did: every
architecture is listed;infoandpullselect the native one.- Diagnostics say deployment where they used to say project. JSON keys and
file names are unchanged.
Validated boundary
The current source ran a real macOS arm64/HVF replay with MonoProxy's covering
10.0.0.0/8 route present: selected u24-1 creation, SSH, stop/start,
incremental cached el9-1 creation, whole-deployment status with five absent
desired peers, both SSH connections, and full destroy/SSH-fragment cleanup all
passed. On Ubuntu 26.04 amd64/KVM, the current Linux binary audited an existing
four-node deployment as live and reached its control guest over the persisted
SSH identity without mutating that host. make check, the source CI, and the
packaging workflow — including race, four-target builds, installer boundaries,
SBOM/package verification, and the development archive — are green.
For contributors: deadcode (four-target intersection), errcheck, and a
maintenance-inventory check are part of make check; CONTRIBUTING.md
carries an expiry table for every pre-0.1 compatibility path.
Start
Download the archive or native Linux package for your host from this Release.
The release install.sh performs a user-scoped archive install after checking
the selected asset against the checksums.txt generated by GitHub Actions:
chmod +x install.sh
FARROW_VERSION=0.2.0 ./install.sh
farrow setup --dry-run
farrow setup --yes
farrow upUpgrading from 0.1.0 is the same command; the installer switches the current
link atomically and prunes older release directories beyond the retention
bound. Review the installation and privilege boundary before applying setup:
https://farrow.pgsty.com/docs/start/tutorial/.