Files
fds-os/docs/developer/clap-validation.md
T
2026-09-22 13:23:34 +08:00

6.7 KiB
Raw Blame History

Clap command-line migration validation

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 · Command usage · M12 evidence

Software acceptance completed on 2026-09-21. Every Rust command-line interface uses the shared, locked Clap 4.6.7 dependency. The migration adds no third-party crate versions or shared runtime libraries. Dasung already used Clap; its workspace dependency now shares the same definition. The dependency-free smoketest has no argument interface.

Implemented behavior

  • Typed commands cover fds, its inspect/eject/power aliases, stage0, boottrace, cartridge/profile services, media creation/writing, and release signing.
  • fds burn and fds-burn share one grammar. Format options are specific to the selected class, with duplicate and conflicting options rejected.
  • Clap generates command-specific help, versions, required-option errors and typed bay/size validation. Global --json works around nested commands.
  • fds run BAY -- EXECUTABLE ARGS... preserves every child argument, including --help, --json, empty strings, spaces and an additional --.
  • Private s6 flags and default daemon/PID-1 behavior are preserved. Stage0 enters its emergency path on argument errors as PID 1 instead of exiting.
  • VM client and write/stress helpers now build through Cargo and use Clap. No project-owned Rust source reads or slices a raw process argument vector. Kernel command-line files and metadata remain separate domain parsers.

A regression test caught that Clap's broad argument/subcommand conflict rule also rejected fds-inspect --json image IMAGE. The final implementation uses Clap's typed conversion hook to reject only simultaneous target/image forms; it accepts global options before or after the image subcommand. This behavior passed host parser tests and execution of the actual ARM binary.

Build and runtime evidence

The final tooling run passed 48 Rust unit tests, ELF checks for every ARM executable/alias, real ARM help/version/invalid-input tests, strict metadata checks and stage0 diagnostic fixtures. Evidence: out/logs/clap-tooling-test.log. The independent Dasung simulator/service and host/ARM/OpenSSL signing suites passed in out/logs/clap-dasung-test.log and out/logs/clap-signing-test.log (out/m12-signing.9xgbool5/).

make bootstrap, make smoke-test, and make check passed. The complete make all build passed in out/logs/clap-all-final.log; the earlier clap-all.log attempt was intentionally stopped before fixing the inspection option-placement regression. The final make check also passed in out/logs/clap-check-final.log.

All suites below passed against the rebuilt images. Each has its own out/logs/clap-<make-target>.log and retained VM/image evidence:

Make target Evidence directory
init-test out/m2-vm.lsptD3/
boot-test out/m4-vm.4VJHfm/
console-test out/m5-vm.ktln7za0/
cartridge-test out/m6-vm.nv3oq41q/
data-test out/m7-vm.yv53pjkk/
desktop-test out/m8-vm.q8nwbhgc/
media-image-test out/m9-images.9ts4w_qb/
media-test out/m9-vm.06yddrko/, out/m9-system.a9n8xxb_/
power-test out/m10-vm.yk62sod6/
stress-test out/m11-vm.vg5dicrw/, out/m11-faults.pd52oxs7/
recovery-test out/m12-recovery.0604mqgm/
internal-test out/m12-internal.uj0rbf4i/
clock-test out/m12-clock.f54asrop/
development-test out/m12-development.mu29x4mr/

These checks include actual SYSTEM creation/write/readback/boot, confirmed DATA repair, interrupted-checker quarantine, persistent settings across reboot, window manager and DHCP control, sustained writes, all twelve overlapping I/O intervals, and injected write/flush/readback/worker/daemon failures. They use regular-file images and isolated ARM VMs. No physical media was written.

Executable size and startup measurements

Clap increases executable sizes. All eight production Rust programs (including Dasung) remain statically linked and contain no personal build-path prefix. out/clap-binary-sizes.json records the final hashes and these sizes:

Executable Before, bytes After, bytes
fds 900,720 1,097,960
fds-burn 821,344 990,312
fds-stage0 474,336 633,880
fds-boottrace 442,152 606,672
fds-cartridged 917,328 1,064,832
fds-profile 527,880 687,904
fds-release 434,720 595,776

Five alternating QEMU TCG boot pairs compare the previous complete image set with the rebuilt images, using the same Pi kernel. The previous images also precede Rust source-path normalization; this is an image-level comparison, not an isolated microbenchmark of the parser. Each measurement uses Linux CLOCK_BOOTTIME from kernel start to the first ordinary-user console.

Image set Five samples, ms Median, ms
before 1958.754852, 2031.634456, 1998.790409, 1951.843302, 1961.052514 1961.052514
clap 1917.447815, 1909.301394, 1923.776234, 1955.579658, 2053.676925 1923.776234

The median change was −37.276280 ms, below the +100 ms regression threshold. This does not establish a speedup on the Pi. Input hashes, all sample reports and serial logs are in out/clap-console-pairs.qyyoppcj/; the replay script is out/clap-boot-comparison.py.

The updated stage0 was also built at all three optimization levels and booted three times per level (out/rust-profiles.8hnnusn8/comparison.json):

Optimization Stage0 bytes Median kernel-to-console, ms
z 633,880 1922.658965
2 730,568 1938.769685
3 757,168 1950.010662

Retain z; these VM samples do not establish a physical-hardware winner. The separate twelve-device test observed a +180.457 ms median versus empty bays. That comparison adds twelve emulated USB devices and is not the before/after Clap comparison. Its readiness-gate test still proved that cartridge service readiness does not block the console. Physical Pi boot and shutdown targets, USB electrical behavior, display recovery and flash durability remain deferred.

Release status

The requested CLI migration is complete and included in the signed local 0.1.0 release. Fresh v5 offline builds produced 27 byte-identical artifacts, which also match the normal images used by every runtime suite above. The old v4 candidate was stopped before acceptance. See final M12 evidence and the 67-section implementation ledger.