TacidOS
Developers
Documentation

Commands and evidence

Workstation validation record

Executed checks, resource limitations and pending workstation tests.

Execution environment: isolated Linux container on a 32 GB filesystem; no physical workstation, no NVIDIA device nodes and no /dev/kvm. Nix 2.35.2 ran in the managed Docker environment with the session CA/proxy, using the repository’s unchanged lock. No host SSD was installed, partitioned or formatted. No credentials or repository visibility were changed. The external parent guide path named by AGENTS.md is absent in this Linux workspace; the repository AGENTS.md and relevant ADRs were read.

Commands below use nix --extra-experimental-features 'nix-command flakes' where needed. Container wrappers are omitted for readability. GIT_CONFIG_GLOBAL was set only for Cargo tests, to an empty temporary configuration, after the first workspace run exposed the container’s /work safe-directory entry in an existing Git test.

The head that merges, after main’s installer changes

The branch was brought up to date with main (the setup screen, SSH keys from GitHub and the owner’s own password) and its decision record renumbered to ADR-0099. Hosted Actions could not start any job on it — every run was refused for the organisation’s billing — so each CI job was run by hand in a Linux cloud container: four cores, an Intel Xeon, no /dev/kvm, every machine booted under QEMU’s software emulation. 8144331 is the merged branch; e17d258 changes only the install and update tests, so the jobs that do not read them were not run again.

CI jobRevisionResult
rust: fmt, clippy -D warnings, the workspace’s 1,562 tests with GIT_CONFIG_GLOBAL=/dev/null, cargo doc -D warnings, design tokens, and the shell workspace’s fmt, clippy and 91 tests8144331Passed.
the documents and the invariants: links, scripts, 99 decisions, inputs, README counts, all 21 named invariants, git diff --checke17d258Passed.
nix: tacid, tacid-shell; the face, session, rules, boot, refusals, workstation, gpu-guard and vm-launcher checks; every output on both architectures evaluates; the two images differ; reference-x86_64 buildse17d258Passed.
vm-tests: secureboot, lifecycle, desktop, libvirt8144331Passed.
vm-tests: install, updatee17d258Passed, after the fix below.
aarch64: both machines and both media evaluate, checks.aarch64-linux.translation, the board’s one pool of memorye17d258Passed.
aarch64: packages.aarch64-linux.tacid, the Rust suite run on aarch64 under qemu-usere17d258Passed: 1,562 tests, none failed or ignored. Five and a half hours under emulation — 78 minutes to build, the rest to compile and run the tests.
workstation packages: NVIDIA open and proprietary, CUDA runtime, CUDA llama.cpp, OVMF, swtpme17d258Not run: the container’s network policy refuses download.nvidia.com and developer.download.nvidia.com, where the driver and the CUDA archives come from. OVMF, swtpm and the open kernel module come from the cache.

Two of these found something. The boot-screen check’s private namespace had no /bin, so the X server could not run xkbcomp through /bin/sh and failed to compile its keymap; /bin is now bound read-only. And the installation test failed: the genome names the processor’s microcode, the test writes one genome on the builder and the live image writes another, and under emulation QEMU’s max processor says AuthenticAMD. On an Intel builder the host’s genome left out hardware.cpu.amd.updateMicrocode, the live image’s had it, and the installer tried to build the difference — 661 derivations, with no network. The live image is now told it is an AMD processor under KVM too, and the host’s genome is given the one line its builder left out; the result is byte for byte the genome written with an AMD /proc/cpuinfo. The update test had the same mismatch, and its follower would have met it building its next generation.

The earlier record below stands as what was run before; where it says a check was not run, this section supersedes it.

CommandResult
nix develop -c cargo test -p tacid-install -p tacid-facts -p tacid-stem -p tacid-cliPassed, including the mixed AMD/two-identical-NVIDIA genesis fixture and existing disk/authorization tests.
nix develop -c cargo test -p tacid-cli -p tacid-install -p tacid-txPassed on the final Rust changes, including installer/transaction invariants.
nix develop -c cargo test --workspaceInitial runs failed on environment Git configuration, then the missing purpose comment in the new VM test. Both causes corrected; final clean-configuration run passed.
nix develop -c cargo clippy --workspace --all-targets -- -D warningsPassed.
nix develop -c cargo fmt --allPassed.
python3 nix/tests/gpu_guard.pyPassed: whole groups/owner approval, active or unknown usage refusal, virtual-console operation, status/recovery distinctions, shutdown no-op and exclusion of the Radeon desktop from NVIDIA idleness checks. No physical GPU reset test.
nix build .#checks.x86_64-linux.workstation .#checks.x86_64-linux.gpu-guard .#checks.x86_64-linux.profiles --no-linkPassed. Workstation/module/package evaluation, generated sandbox rules and curated profiles; no GPU driver execution.
nix eval .#nixosConfigurations.reference-x86_64.config.system.build.toplevel.drvPathPassed after correcting unsupported libvirt options against pinned nixpkgs. Firmware initially evaluated disabled and is now enabled in workstation.
nix eval .#checks.x86_64-linux.libvirt.drvPathEvaluated; VM execution pending.
Pinned package evaluation and nix build --impure --file /tmp/packages.nix driver cuda llama ovmf swtpm --dry-runEvaluated NVIDIA 595.99.02, CUDA runtime 12.9.79, CUDA llama-cpp 0.3.0, OVMF and swtpm. Full set planned 20 local builds and 462 cached paths (5.2 GiB unpacked), beyond already-occupied environment capacity when combined with intermediates.
nix build --impure --file /tmp/packages.nix driver cuda ovmf swtpm --no-linkFailed: filesystem exhaustion during NVIDIA output creation. Not a proven completed NVIDIA package build.
nix build --impure --file /tmp/packages.nix cuda ovmf swtpm -o /tmp/tacid-vm-packagesPassed after garbage collection. CUDA runtime built; OVMF/swtpm closures realized from cache.
python3 nix/tests/{links,scripts,decisions,inputs,counts,invariants}.py . (each script separately)Passed after adding the validation document and updating README counts/index.
nix build .#checks.x86_64-linux.vm-launcher --no-linkPassed: generated desktop item is validated by desktop-file-utils and explicitly opens the status in existing Ghostty; comment describes physical monitor switching.
git diff --checkPassed.

The temporary package expression imported inputs.nixpkgs from this flake with system = "x86_64-linux"; config.allowUnfree = true; and selected linuxPackages.nvidiaPackages.stable, cudaPackages.cuda_cudart, llama-cpp.override { cudaSupport = true; }, OVMFFull and swtpm. The committed checks.x86_64-linux.workstation records evaluated versions and derivation paths against the same pin without realizing the workstation closure.

Corrected intermediate failures: unsupported libvirt option names and a test expression trying to access _module through the evaluated config; an initial missing-sysfs guard fixture; stale README counts; missing validation-document link; the container Git safe-directory test; and the file-purpose invariant. All relevant final reruns above pass. The remaining failure is the resource-limited driver build.

Unexecuted checks / draft exit criteria:

  • Complete the NVIDIA driver and CUDA llama.cpp builds on a builder with sufficient free storage. llama.cpp was evaluated/dry-run only; CUDA runtime success is not a CUDA compiler/engine success. The CUDA hardware sample has not been compiled/run.
  • Run the new checks.x86_64-linux.libvirt VM test (including bind persistence and marker survival), and existing desktop, install, lifecycle, session and face checks on a builder with KVM and enough storage. They were not executed here. A successful emulated libvirt/installer test would still not validate PCIe reset.
  • One concurrent Nix evaluation was interrupted by cargo fmt changing a source snapshot; the unchanged-source rerun passed. Nixfmt was executed; unrelated reformatting of existing large files was reverted to keep review focused. Newly added Nix files retain formatter output.
  • No tacid-shell Rust source changed; its standalone Cargo suite was not run.
  • Zero/one/two real Linux-owned GPU runtime access, inference engine behavior, physical output, VM console installation, TPM/NVRAM upgrades, storage/firmware/NIC support, IOMMU isolation, Windows gaming and repeated GPU return are all pending physical acceptance.
  • The guard samples device usage; it does not hold a scheduler-wide lock. Users must prevent new workloads starting during transitions. Dynamic NVIDIA detachment and safe recovery without host reboot remain unproven. No custom reset workaround, autonomous job killing, monitor-input switching or Looking Glass was added.

The PR remains draft until the resource-dependent builds and required VM checks are completed. Pending physical checks remain explicit even after those pass.

ISO and USB documentation follow-up

  • nix build --dry-run '.#nixosConfigurations.netinstall-x86_64.config.system.build.isoImage' passed evaluation/planning: 429 derivations still needed building. The ISO itself was not built: only 2.3 GB of the 32 GB workspace remained before website dependencies. No new ISO artifact or download was published.
  • python3 nix/tests/links.py . passed with 115 documents and zero broken links after adding the canonical Windows/macOS/Linux USB guide.
  • git diff --check passed. No Rust or Nix implementation changed in this follow-up.
  • The website source had development setup but no USB-writing guide. Both live domains returned HTTP 403 from this environment; source/build checks do not establish what is currently deployed. Website instructions are delivered as a separate reviewable change, not an unverified live-page claim.