1
Developer M0 Validation
Felis edited this page 2026-09-24 13:51:28 +08:00
Table of Contents
include_toc
include_toc
true

M0 validation report

Development reference and historical context. For current operating instructions, use the user manual. Acceptance applies only to the source and artifacts identified in each record.

Documentation index · First build · Roadmap

This is the initial acceptance record, not a setup tutorial. Later documentation improvements do not change the build results or skips recorded here. Linked logs and artifacts are generated local files and are not included in a fresh checkout.

Validated on 2026-09-20 in /home/felis/source/fds on an x86_64 Arch Linux Framework host, running Linux 7.2.6-arch2-1.

M0 is complete: the host bootstrapped an upstream Void build container, cross-built an aarch64 glibc XBPS package, and built a static-musl AArch64 Rust executable. M1 remains a proposal.

All project-owned documentation, source comments, diagnostics, and ongoing development context use English. The complete master plan retains its 67 numbered sections. The pinned upstream submodule has no tracked modifications.

Changes

  • Added the repository skeleton, milestone instructions, master plan, architecture contracts, and build documentation.
  • Pinned vendor/void-packages to 02a3cbc132c3c4a3a9d59e9b98f517af5dd11cd1 using a Git submodule and VOID_PACKAGES_COMMIT.
  • Added versioned, checksum-verified static XBPS host tools and a bubblewrap bootstrap workflow for ordinary Arch users.
  • Added FDS overlay preparation with upstream collision and stale-copy checks.
  • Added the Rust workspace, Rust 1.98.0 pin, static musl linking configuration, dependency-free fds-smoketest, and release settings from the plan.
  • Added make bootstrap, make smoke-test, make check, package export, ELF inspection, failure-path checks, and build input manifests.
  • Reserved future component directories without implementing later milestones.

The initial M0 file inventory appears at the end of this report; guides added after acceptance are not included in that historical inventory.

Exact build commands

These public entry points all completed with exit status 0:

cd /home/felis/source/fds
make bootstrap
make smoke-test
make check

The underlying cross-build commands are:

cargo build --locked --offline --release \
  --target aarch64-unknown-linux-musl -p fds-smoketest

export PATH="$PWD/.host/xbps/usr/bin:$PATH"
export XBPS_ARCH=x86_64
cd vendor/void-packages
./xbps-src -A x86_64 binary-bootstrap
./xbps-src -a aarch64 pkg hello

The first bootstrap created the build environment on this host. The final public command runs reused verified downloads and that environment. Large archives were prefetched from official servers with SHA-256 verification; XBPS also verified package signatures. This was not a test of a pristine clone on a second machine.

Smoke-test output

Actual excerpts from out/logs/smoke-test.log:

Void commit: 02a3cbc132c3c4a3a9d59e9b98f517af5dd11cd1
rustc 1.98.0 (88d9e12ae 2026-08-18)
cargo 1.98.0 (797e8a9bc 2026-08-05)
PASS: x86_64 static ELF
PASS: aarch64 static ELF
ldd (host diagnostic, exit 1): 	not a dynamic executable
PASS: aarch64 package exported to out/packages/
PASS: aarch64 glibc ELF
PASS: XBPS package hello-2.12.3_1 architecture=aarch64 (glibc)
SKIP: ARM execution (optional qemu-aarch64 not installed); ELF verification passed
PASS: M0 smoke test complete

Rust file output identifies an ELF 64-bit LSB executable, ARM aarch64, statically linked, stripped. readelf confirms no interpreter, shared library dependency, or glibc symbol version requirement. The extracted GNU hello ELF uses /lib/ld-linux-aarch64.so.1 and requires libc.so.6.

make check passed its ABI rejection, invalid-input, Void pin, dirty-upstream, overlay collision, stale-overlay, configuration protection, and formatting checks. An initial package-index architecture error was corrected by explicitly setting XBPS_ARCH=aarch64 when indexing the exported package; the full smoke-test then passed.

Actual logs and inventories:

  • Bootstrap log (out/logs/bootstrap.log, workstation-only evidence)
  • Smoke-test log (out/logs/smoke-test.log, workstation-only evidence)
  • Package build log (out/logs/xbps-hello.log, workstation-only evidence)
  • Guardrail and formatting checks (out/logs/check.log, workstation-only evidence)
  • Build package inventory (out/manifests/void-build-packages.txt, workstation-only evidence)
  • Cached package input digests (out/manifests/void-package-inputs.sha256, workstation-only evidence)
  • Artifact digests (out/manifests/artifacts.sha256, workstation-only evidence)

Generated output is ignored by Git. These links refer to this validated checkout; rerun the commands to recreate the output in another checkout.

Artifacts

Artifact Verified ABI SHA-256
out/fds-smoketest AArch64, static musl 3c719a386cfef5b67f90488d9c67075c835c1a42d4db0efac0b475267dfc25ee
out/packages/hello-2.12.3_1.aarch64.xbps aarch64 package, glibc executable 2703e81cff78d3d11b1a36f323c0af25691b258effcd60fe7f6d074ca8cdf1d8

Known limitations

  • QEMU execution was skipped because qemu-aarch64 is not installed. No ARM hardware, Pi boot, bay topology, E-Ink, or boot/shutdown timing was tested.
  • Void source, Rust, and host XBPS are pinned. Rolling binary dependencies are audited through cached digests and version inventories, but a complete binary repository snapshot and reproducible release are still future work.
  • This is a cross-build foundation; there is no bootable FDS image yet.
  • Initial upstream bubblewrap cleanup reported a busy /tmp mount point while returning success. Subsequent container execution and cross-build checks passed. See the build guide.

Next milestone proposal

M1 should implement fds-base and fds-base-files, assemble an aarch64 glibc rootfs with GNU userspace and XBPS, and generate out/rootfs-aarch64.tar. Acceptance should audit package contents, confirm glibc/coreutils/binutils, require no musl runtime package, and exclude BusyBox, systemd, and runit. Begin M1 only after an explicit request.

Initial M0 changed-file inventory

These are the paths recorded at M0. The manual now lives in the fds-os.wiki submodule; this historical inventory retains its original paths.

.cargo/config.toml
.gitignore
.gitmodules
AGENTS.md
Cargo.lock
Cargo.toml
Makefile
README.md
VOID_PACKAGES_COMMIT
config/host-tools.conf
config/xbps-src.conf
docs/architecture.md
docs/boot.md
docs/build-host.md
docs/cartridges.md
docs/m0-validation.md
docs/master-plan.md
docs/packages.md
docs/performance.md
docs/recovery.md
docs/services.md
image/.gitkeep
out/.gitkeep
packages/fds-base-files/.gitkeep
packages/fds-base/.gitkeep
packages/fds-cartridged/.gitkeep
packages/fds-cli/.gitkeep
packages/fds-eink/.gitkeep
packages/fds-kernel/.gitkeep
profiles/.gitkeep
rust-toolchain.toml
rust/fds-boottrace/.gitkeep
rust/fds-burn/.gitkeep
rust/fds-cartridged/.gitkeep
rust/fds-cli/.gitkeep
rust/fds-common/.gitkeep
rust/fds-smoketest/Cargo.toml
rust/fds-smoketest/src/main.rs
rust/fds-stage0/.gitkeep
s6/source/.gitkeep
tests/hardware/.gitkeep
tests/integration/m0-checks
tests/unit/.gitkeep
tools/bootstrap-host
tools/build-package
tools/lib.sh
tools/prepare-void
tools/smoke-test
tools/verify-elf
vendor/void-packages