status
This page carries the detailed red/green state that used to live in the README: what has been proven end-to-end, on which rigs, with which caveats. The ROADMAP says where the project is going; this page says what the evidence supports today. The verification ladder itself is defined in milestones.md.
A case is only marked β once the whole chain passes: Windows seed β deploy β Phase-2 boot β seeded file readable from Linux.
Proven end-to-end (KVM E2E rig: Windows 11 + TPM 2.0 + Secure Boot)β
- β
Arm (rung 1): the real
wootc.exearms a virgin Windows VM over QGA β root disk, signed chain, one-shot BCD,state.json = armed(24/24). - β
Deploy: the Secure Boot chain launches the deployer and fisherman lays
down a full bootc image into
root.diskβ every post-deploy check passes (dracut hook, services, loop-root BLS args, ESP kernel-sync,host-esp.conf). - β
Native Phase-2 boot (rung 2): the signed Windows BCD β shim β GRUB
chain boots the installed Bluefin system from the NTFS-hosted
root.disk. The initramfs mounts NTFS with the kernel driver, attaches the raw disk withlosetup, resolves the root UUID, runs OSTree prepare-root, switches to the real deployment, reaches the graphical system, and exposes Linux QGA. - β GUI + migration: installer GUI (Playwright-tested), User Data Bridge and WSL/Office/Steam/browser bridges (unit-tested), external-disk import engine, Try-in-VM orchestration, Phase-3 planner.
- β
Graduate to native disk (Phase 3 / rung 3): the VM boots Phase 2,
independently verifies a blank
/dev/sdb, runs the nativebootc install, reboots into the graduated system, and confirms the file seeded in Windows survived onto the native disk β Windows androot.diskuntouched (29/29). - β
GUI-driven full run: the entire Phase-1 β 2 β 3 chain armed by the
real
wootc.exeGUI (drive mode β the app drives its own live form), green end-to-end onbluefin:lts. The timelapse on the walkthrough page is that run. - β
E2E-gated releases:
v0.1.0-alpha.1was published only after a fresh full GUI-driven run passed on the exact tagged commit; nightly green runs cut automatic pre-releases from the SHA they proved.
Build/test matrixβ
Red/green status per combination, from the KVM E2E rig (laptop runners) and
the hosted-runner matrix (.github/workflows/e2e-matrix.yml). Legend:
β
proven green Β· π‘ in progress / partially proven Β· π΄ known-red (tracked
issue) Β· βͺ not yet run.
Last full matrix sweep: 2026-07-25 β 12 of 22 cases green, with targeted re-runs since (dates on the affected rows).
β οΈ The β s below predating 2026-07-27 are currently UNVERIFIED (per-row exceptions are called out β e.g. the
dakotacomposefs cell was re-proven on the failure-ledger harness on 2026-08-02). Until commit3d7f9e2,fail()only printed β a failed check that did not itself abort could not stop the run reaching "ALL TESTS PASSED". A real BitLocker run was recorded PASS with[FAIL] User data NOT visible in Phase 2 $HOMEin its own log, which is the North Star assertion itself. The harness now records every failure to a ledger and gates the banner on it, so this class of false green cannot recur β but the counts above were produced by the old harness and are being re-run. Treat them as claims awaiting evidence, not as status.
βΉοΈ Resolved (2026-07-27): the hosted-runner TPM blocker (#59) was ours, not GitHub's β our sshd wrapper took PID 1 from
tini, soswtpm's-ddaemonization never wrote its pid file and dockur silently disabled TPM. Fixed in4a087eb; GitHub-hosted runners are back in scope.
Image family Γ phase (Windows 11 Pro, Secure Boot + TPM 2.0):
| Image family | Backend / rootfs | Arm (P1) | Deploy | Phase-2 boot | Phase-3 graduate | GUI-driven full run |
|---|---|---|---|---|---|---|
bluefin:lts | ostree Β· ext4-sealed | β | β | β | β (29/29) | β |
yellowfin:gnome (EL10) | ostree Β· ext4-sealed | β | β | β | β | βͺ |
yellowfin:kde / :xfce (EL10) | ostree Β· ext4-sealed | β | β | β | βͺ | βͺ |
bonito:gnome / :kde / :niri (Fedora) | ostree Β· xfs (unsealed) | β | β | β | βͺ | βͺ |
dakota | composefs-native | β | β | π΄ #209 | βͺ | βͺ |
marlin (Arch) / flounder (Debian) | ostree Β· xfs (unsealed) | β | π΄ | βͺ | βͺ | βͺ |
dakota (composefs-native) went green on the failure-ledger harness β
composefs full chain, run 30710282014 (2026-08-02);
#28 is closed. Its Phase-2
first boot after a clean GUI deploy currently hangs CPU-bound
(#209, 2026-08-22) β being
root-caused for v0.2.0-alpha. marlin/flounder fail in
bootc install with "bootupd is required for ostree-based installs": they are
ostree images that ship no bootupd.
Axes (against the EL10 / bluefin:lts baseline):
| Axis | Status | Notes |
|---|---|---|
| Windows 11 Pro | β | primary proven path |
| Windows 11 Home / Enterprise / LTSC | β | all three green on EL10 |
| Windows 10 Pro | β | green in 37 min via the restored Windows base image |
| Windows 10 Home / Enterprise / LTSC | π΄ | Setup stops on its edition picker β the answer file's product key matches no image in the ISO for those editions β #58 |
Root filesystem: xfs (unsealed) | β | mounted with explicit -t (a typeless mount tried ext4 on xfs) |
Root filesystem: ext4 (sealed, fs-verity) | β | proven sealed default |
Root filesystem: btrfs (sealed) | β | green cell on bonito via wootc.filesystem=btrfs (2026-08-22); blocked on EL10 kernels whose out-of-tree btrfs kmod is rejected under Secure Boot |
| Encryption: none | β | |
Encryption: tpm2-luks | π‘ | #33 fixed (bffd284, 2026-08-10) β Phase-2 dracut regen works; green cell re-verification pending under the failure-ledger harness |
| BitLocker FDE (unencrypted-volume path) | β | refusal path green 2026-08-22; full install path is the v0.3.0-beta gate β #34. Setup carves unencrypted volume E: for root.disk while C: stays encrypted |
Offline (-nic none, pre-downloaded image) | βͺ | code path shipped (branded builds / WOOTC_PRELOAD=1); matrix axis tracked as #217 |
The full three-phase chain (Windows seed β deploy β Phase-2 bridge β
Phase-3 native disk β seeded file on the native disk) is green end-to-end
on bluefin:lts β both via the script path (29/29) and driven entirely
through the real wootc.exe GUI (drive mode), and it gates every release.
Running the E2E yourselfβ
The E2E harness drives a Windows 11 VM (via dockur/windows) over the QEMU Guest Agent β no guest networking required. It needs a host with KVM, UEFI Secure Boot, and TPM 2.0.
just remote-sync # push + reset a runner to origin/main
just remote-e2e # fresh install + deploy (~30 min)
just remote-e2e-quick # reuse the installed disk (~5 min)
just remote-logs # tail the run
just remote-serial # watch the deployer serial console
just remote-status # grep PASS/FAIL markers
Every E2E run records a sped-up timelapse to
tests/e2e/storage/artifacts/<run>/video/. To refresh the
walkthrough on the README,
publish a passing run's clip:
tests/e2e/publish-visual.sh --from-host <host> # or a local artifact dir
git add pages && git commit -m 'docs: refresh E2E walkthrough' && git push origin main
A GitHub-hosted workflow (.github/workflows/pages.yml) then deploys it to
Pages β no self-hosted runner required. The README hero is a committed
relative path, so it renders inline on GitHub even before Pages redeploys.