# M0 validation report Development reference and historical context. For current operating instructions, use the [user manual](../README.md). Acceptance applies only to the source and artifacts identified in each record. [Documentation index](README.md) · [First build](getting-started.md) · [Roadmap](roadmap.md) 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: ```sh cd /home/felis/source/fds make bootstrap make smoke-test make check ``` The underlying cross-build commands are: ```sh 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`: ```text 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) - [Smoke-test log](../../out/logs/smoke-test.log) - [Package build log](../../out/logs/xbps-hello.log) - [Guardrail and formatting checks](../../out/logs/check.log) - [Build package inventory](../../out/manifests/void-build-packages.txt) - [Cached package input digests](../../out/manifests/void-package-inputs.sha256) - [Artifact digests](../../out/manifests/artifacts.sha256) 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](build-host.md#known-limitations). ## 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 ```text .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 ```