11 KiB
Progress
This file is now intentionally compact.
Detailed chronological history through Phase 18.2 has been archived at:
docs/reports/progress-log-through-phase18-2-freebsd.md
For a broader narrative summary, see:
docs/PROG_SUMMARY.md
Current status
Fruix currently has:
- declarative system modeling on FreeBSD
- content-addressed system closures under
/frx/store - native FreeBSD base artifacts in
/frx/store - declarative FreeBSD source objects and source materialization
- source-driven native base builds from materialized source snapshots
- side-by-side source revisions and boot validation
- a host-driven non-interactive install path:
fruix system install
- a bootable Fruix-managed installer environment:
fruix system installer
- a bootable Fruix-managed installer ISO:
fruix system installer-iso
- an explicit installed-system generation layout under:
/var/lib/fruix/system
- explicit installed-system retention roots under:
/frx/var/fruix/gcroots
- a validated installed-system generation switch/rollback workflow via:
fruix system statusfruix system switchfruix system rollback
- a validated separate in-system development environment overlay via:
/run/current-system/development-profile/run/current-development/usr/local/bin/fruix-development-environment
- a validated separate in-system build environment overlay via:
/run/current-system/build-profile/run/current-build/usr/local/bin/fruix-build-environment/usr/include -> /run/current-system/build-profile/usr/include/usr/share/mk -> /run/current-system/build-profile/usr/share/mk
- a validated host-initiated native base-build path inside a Fruix-managed guest via:
- real XCP-ng boot of a development-enabled Fruix system
- in-guest
buildworld/buildkernel - staged
installworld/distribution/installkernel
- a validated controlled guest self-hosted native base-build prototype via:
/usr/local/bin/fruix-self-hosted-native-build- result roots under
/var/lib/fruix/native-builds - in-guest source recovery from current-system metadata
- a validated promotion path that turns native-build result roots into first-class Fruix store objects via:
fruix native-build promote/frx/store/...-fruix-native-world-.../frx/store/...-fruix-native-kernel-.../frx/store/...-fruix-native-headers-.../frx/store/...-fruix-native-bootloader-.../frx/store/...-fruix-native-build-result-...
- an explicit executor model for native base builds with current executor kinds:
hostssh-guestself-hosted
- end-to-end validated staged-result-plus-promotion paths for executor policies:
ssh-guestself-hosted
- system declarations that can now consume a promoted native-build result bundle directly via:
promoted-native-build-resultoperating-system-from-promoted-native-build-result
- a real XCP-ng boot validation of a system materialized from a promoted native-build result identity
- installed systems that now carry their own canonical declaration inputs and bundled Fruix node CLI sources
- a real XCP-ng validation of in-node:
fruix system buildfruix system build-basefruix system reconfigurefruix system rollback
- local installed-node promotion of native-base results into the node's own
/frx/store - a real XCP-ng validation of host-driven:
fruix system deployonto an installed Fruix node with reboot and rollback preserved
Validated boot modes still are:
freebsd-init+rc.d-shepherdshepherd-pid1
The validated Phase 18 installation work currently uses:
freebsd-init+rc.d-shepherd
Latest completed achievement
2026-04-06 — Fruix now has a real host-driven deploy command for installed nodes
Fruix now supports a validated host-driven:
fruix system deploy
workflow on the approved real XCP-ng path.
Highlights:
- the main Fruix CLI now supports deploying either:
- a declaration file, or
- an already built
/frx/store/...-fruix-system-...closure onto a remote Fruix node over SSH
- deploy now:
- builds or resolves the selected closure locally
- computes the recursive store closure from
.references - transfers only missing store items to the target
- runs remote
fruix system switch - can reboot the target and wait for SSH to return
- the installed helper surface was bumped again and now also accepts:
fruix system deploy ...
- a real bug in the shared store-hash helper was fixed while validating this path:
sha256-stringnow uses a fresh temporary path rather than a fixed/tmp/fruix-system-hash.txt
Validation:
PASS postphase20-system-deploy-xcpng
Reports:
docs/reports/postphase20-system-deploy-freebsd.mddocs/system-deployment-workflow.mddocs/GUIX_DIFFERENCES.md
2026-04-06 — Installed Fruix nodes can now build and promote native base results locally
Installed Fruix nodes now support a validated local:
fruix system build-base
workflow on the approved real XCP-ng path.
Highlights:
- the installed helper at
/usr/local/bin/fruixnow supports:fruix system build-base [--jobs COUNT] [--store DIR]
- installed nodes can now:
- run the strict build-profile-based native base-build helper locally
- stage the mutable result under
/var/lib/fruix/native-builds/... - promote that result into immutable node-local
/frx/store/...objects
operating-system-from-promoted-native-build-resultnow accepts:#:build-packagesso build-capable installed nodes can be declared directly from promoted native-base identities
- this validation keeps the current running system generation unchanged while producing a new promoted native-base identity for later declaration/deployment use
Validation:
PASS postphase20-installed-node-build-base-xcpng
Reports:
docs/reports/postphase20-installed-node-build-base-freebsd.mddocs/system-deployment-workflow.mddocs/GUIX_DIFFERENCES.md
2026-04-06 — Fruix now separates interactive development from strict native base-build environment
Fruix now has a more explicit three-layer model for build-capable FreeBSD systems:
- runtime profile
- development profile
- build profile
Highlights:
<operating-system>now supports separatebuild-packages- system closures can now materialize both:
development-profilebuild-profile
- build-capable systems now expose:
/run/current-system/build-profile/run/current-build/usr/local/bin/fruix-build-environment
- canonical compatibility links for native base builds now come from the build profile:
/usr/include -> /run/current-system/build-profile/usr/include/usr/share/mk -> /run/current-system/build-profile/usr/share/mk
- the new build helper intentionally clears development-shell variables such as:
MAKEFLAGSCPPFLAGSCFLAGSCXXFLAGSLDFLAGS
- the self-hosted native-build helper now uses this stricter build-helper contract instead of manually reconstructing that sanitization ad hoc
- promotion metadata for native-build results now records
build-profileexplicitly
Validation:
PASS phase20-development-environment-xcpngPASS phase20-self-hosted-native-build-xcpngPASS phase20-native-build-store-promotion-xcpngPASS phase20-host-initiated-native-build-xcpngPASS phase20-host-initiated-native-build-store-promotion-xcpng
Representative validated metadata included:
build_profile_guest=/run/current-system/build-profilebuild_profile=/run/current-system/build-profilehelper_version=5executor_version=5
Report:
docs/reports/postphase20-build-profile-separation-freebsd.mddocs/system-deployment-workflow.mddocs/GUIX_DIFFERENCES.md
2026-04-06 — Installed systems can now build and reconfigure themselves from local declaration state
Fruix-installed systems are now meaningfully closer to real Fruix nodes.
Highlights:
- system closures now carry canonical declaration metadata in:
metadata/system-declaration.scmmetadata/system-declaration-info.scmmetadata/system-declaration-system
- system closures now also carry bundled Fruix node CLI sources in:
share/fruix/node/scripts/fruix.scmshare/fruix/node/modules/...share/fruix/node/guix/guix/build/utils.scm
- the installed helper at
/usr/local/bin/fruixnow supports:fruix system buildfruix system reconfigurefruix system statusfruix system switchfruix system rollback
- no-argument in-node
buildandreconfigurenow use the node's own embedded declaration inputs - in-node Fruix builds now reuse the installed Guile/Shepherd runtime stores already referenced by the system instead of assuming host-only
/tmp/...build prefixes - the real XCP-ng validation proved the full installed-node flow:
- boot current system
- build from local declaration state
- build a candidate declaration on-node
reconfigureinto that candidate generation- reboot into the candidate generation
rollback- reboot back into the original generation
Validation:
PASS postphase20-installed-node-build-reconfigure-xcpng
Reports:
docs/reports/postphase20-promoted-native-base-declarations-freebsd.mddocs/reports/postphase20-installed-node-management-freebsd.mddocs/system-deployment-workflow.mddocs/GUIX_DIFFERENCES.md
Recent major milestones
1d00907—Add Fruix bootable installer environment2517710—Add non-interactive Fruix installation flow02a02e3—Document Fruix FreeBSD source policy865012e—Boot Fruix from distinct FreeBSD source revisions8150508—Validate side-by-side FreeBSD source revisions5cbf5b9—Build native bases from materialized FreeBSD sources
Active constraints
- local
bhyveremains blocked under Xen due to lack of nested VT-x exposure - XO self-service creation is still not usable with the current token
- real XCP-ng validation must continue to use:
- VM
90490f2e-e8fc-4b7a-388e-5c26f0157289 - approved A/B VDIs:
0f1f90d3-48ca-4fa2-91d8-fc6339b957437061d761-3639-4bec-87f7-2ba1af924eaa
- VM
- local QEMU/TCG validation keeps conservative default SMP settings;
QEMU_SMPremains overrideable
Next step
docs/PLAN_4.md currently ends at Phase 20.3, and that milestone sequence is now complete.
The next practical follow-up is now clearer:
- grow the installed-node command surface from validated
build/build-base/deploy/reconfigure/rollbacktoward:upgrade
- decide how executor policy, native-base promotion, and installed-node reconfiguration should compose in one operator-facing workflow
- turn the current local
self-hostedbuild-base path into a cleaner first-class local executor story, withjailnow the most promising next candidate - determine how much of native-build request/promotion should remain explicit versus being absorbed into higher-level Fruix node actions
The immediate architectural direction is no longer just “can guest self-hosting work?”
It is now:
- how should Fruix expose real managed-node behavior across declaration inputs, native-base results, generation switching, and deployment actions?