# Phase 15.1: make the FreeBSD base version a declarative Fruix input Date: 2026-04-03 ## Goal Phase 15.1 made the FreeBSD base an explicit declarative part of the Fruix system model instead of leaving it as an implicit property of whatever `/usr/src` happened to be present on the builder host. ## Implementation ### New declarative base record Added in `modules/fruix/packages/freebsd.scm`: - `freebsd-base` - `freebsd-base?` - accessors for: - `name` - `version-label` - `release` - `branch` - `source-root` - `target` - `target-arch` - `kernconf` - `make-flags` - `%default-freebsd-base` This gives Fruix an explicit model for the base input used by native FreeBSD artifacts. ### Native package constructors now accept a declared base Added package constructors: - `freebsd-native-kernel-for` - `freebsd-native-world-for` - `freebsd-native-runtime-for` - `freebsd-native-bootloader-for` - `freebsd-native-headers-for` - `freebsd-native-system-packages-for` - `freebsd-native-development-profile-packages-for` The existing exported package variables remain as the `%default-freebsd-base` instances: - `freebsd-native-kernel` - `freebsd-native-world` - `freebsd-native-runtime` - `freebsd-native-bootloader` - `freebsd-native-headers` That preserves the validated Phase 14 path while making alternative declared bases possible. ### Operating-system model now records the declared base Added to `modules/fruix/system/freebsd.scm`: - `operating-system-freebsd-base` - new `#:freebsd-base` field on `operating-system` The declared base is now recorded in: - `operating-system-closure-spec` - `operating-system-image-spec` - `metadata/freebsd-base.scm` - `metadata/store-layout.scm` ### CLI metadata now exposes the declared base `scripts/fruix.scm` now emits, for `fruix system build` and `image`: - `freebsd_base_name` - `freebsd_base_version_label` - `freebsd_base_release` - `freebsd_base_branch` - `freebsd_base_source_root` - `freebsd_base_target` - `freebsd_base_target_arch` - `freebsd_base_kernconf` - `freebsd_base_file` ### Native build metadata now records the declared base Native build manifests and `.freebsd-native-build-info.scm` now carry a `declared-base` block so the native artifacts themselves record the declarative base choice. ## New files Added: - `tests/system/phase15-declarative-base-pid1-operating-system.scm.in` - `tests/system/run-phase15-declarative-base-build.sh` ## Validation Passing run: - `PASS phase15-declarative-base-build` - workdir: `/tmp/phase15-1-build-1775202535` The harness used an explicit declared base: ```scheme (freebsd-base #:name "stable-default" #:version-label "15.0-STABLE-declarative" #:release "15.0-STABLE" #:branch "stable/15" #:source-root "/usr/src" #:target "amd64" #:target-arch "amd64" #:kernconf "GENERIC") ``` Confirmed: ```text kernel_store=/frx/store/8fcef04c7e507e86ea5e92f251fe3c6ac1aa3bcf4809fa77ddd8b92854bfcde0-freebsd-native-kernel-15.0-STABLE-declarative bootloader_store=/frx/store/7a0ba431e487dc35a8f6318108da16a37c8426c43e77e7a7f91404ba1d980eef-freebsd-native-bootloader-15.0-STABLE-declarative runtime_store=/frx/store/17c24ad20ddcb136c39352b68e758deae0b480258ba0128a5546f696a7eba0a6-freebsd-native-runtime-15.0-STABLE-declarative native_base_store_count=3 host_base_store_count=0 freebsd_base_name=stable-default freebsd_base_version_label=15.0-STABLE-declarative freebsd_base_release=15.0-STABLE freebsd_base_branch=stable/15 freebsd_base_source_root=/usr/src freebsd_base_kernconf=GENERIC declarative_base_input=ok ``` The harness also confirmed: - `metadata/freebsd-base.scm` exists - `parameters.scm` records the declared base - `metadata/store-layout.scm` records the declared base - native build info files record the declared base version/branch ## Result Phase 15.1 is complete. Fruix now has an explicit declarative FreeBSD base input in the system model, while still allowing the current validated `/usr/src`-based path to work unchanged by default.