4.2 KiB
Phase 19.1: canonical Fruix deployment workflow on FreeBSD
Date: 2026-04-04
Goal
Phase 19.1 is about turning Fruix's already-validated closure/image/install behavior into a clear operator-facing deployment story.
The verification target here is documentation clarity rather than a new low-level boot primitive.
The repo needed a single coherent explanation of how Fruix expects operators to:
- build a system closure
- materialize a rootfs or image
- install directly to an image or block device
- use the installer image and installer ISO paths
- roll forward to a candidate declaration
- roll back to an earlier declaration
Result
Phase 19.1 is complete.
The repository now documents a first-class Fruix deployment workflow in:
docs/system-deployment-workflow.md
That document defines the current canonical command surface and explains how the already-existing validated paths fit together operationally.
What was documented
Canonical frontend
The documented user-facing frontend is now explicitly:
./bin/fruix system ...
This includes the currently supported deployment-oriented actions:
buildrootfsimageinstallinstallerinstaller-iso
Canonical deployment model
The workflow document now defines Fruix's current deployment model as:
- declare a system in Scheme
- build the system closure in
/frx/store - materialize the artifact appropriate to the target environment
- boot or install that artifact
- treat the resulting closure path and emitted provenance metadata as the deployment identity
Roll-forward and rollback semantics
The document makes explicit an important current design point:
- Fruix rollback is already real at the declaration/closure/deployment layer
- but it is not yet a first-class installed-system generation switch operation
So the documented rollback workflow today is:
- retain the earlier declaration
- rebuild or rematerialize it
- redeploy or reboot that earlier closure again
That matches what Fruix has already validated in earlier phases.
Platform-specific installer target-device detail
The workflow document also records the now-important target-device distinctions between validated environments:
- installer disk-image path under QEMU:
/dev/vtbd1
- installer ISO path under QEMU:
/dev/vtbd0
- installer ISO path under XCP-ng:
/dev/ada0
That makes the deployment story less harness-specific and more operator-explicit.
Why this satisfies Phase 19.1
Before this phase, Fruix already had the machinery for:
- building declarative system closures
- generating bootable images
- performing direct non-interactive installation
- booting a Fruix installer environment
- booting and installing from a Fruix installer ISO
- rollback-friendly redeploy of earlier declarations
What was missing was a repo-level explanation that unified those into a single operator workflow.
The new document closes that gap by connecting:
- Phase 10 command-surface work
- Phase 15 redeploy/rollback validation
- Phase 18 install and installer-media validation
- and the recent QEMU + XCP-ng installer ISO validation
Current boundaries now made explicit
The documentation intentionally records what Fruix has not solved yet:
- installed-system generation links
- explicit rollback targets and generation metadata
- a first-class
switchorreconfigurecommand - installed-system rollback as an in-place operator workflow
- GC-root management for installed systems
Those are left for later Phase 19 steps rather than being blurred into the current deployment story.
References to existing validation
The documented workflow rests on already-passing validation paths, including:
PASS phase18-system-installPASS phase18-installer-environmentPASS phase18-installer-isoPASS phase18-installer-iso-xcpngPASS phase15-base-rollback-qemuPASS phase15-base-rollback-xcpng
Conclusion
Phase 19.1 is now complete.
Fruix has a documented canonical deployment workflow for FreeBSD covering:
- build
- image generation
- direct install
- installer-media install
- roll-forward
- rollback by redeploying an earlier declaration
The next step is Phase 19.2:
- model installed-system generations, rollback targets, and deployment roots more explicitly.