plan
Generated 2026-07-17 from the GUI/Phase-1 worktree session.
Historical note (2026-07-23): both lanes below merged to
main. The VHDX exploration concluded in a RAWroot.disk(8136ae6) and the full three-phase E2E is green (see docs/milestones.md). Read this file as a snapshot of remaining SPEC coverage, not as live lane status.
State at handoffβ
Two active lanes running in parallel across 3 E2E hosts:
| Lane | Branch | Host(s) | Status |
|---|---|---|---|
| GUI / Phase 1 | worktree-gui-phase1 | dilli (local), kanpur | 5 commits ahead of main; LUKS backend dirty |
| VHDX / Phase 2 | explore/vhdx-root-disk | himachal, dilli | Deployer reaches fisherman; partitioning NBD race fixed; OCI export fix landed |
Fisherman fork (tuna-os/fisherman) is unarchived, dev branch carries both fixes.
Communication between tracks: handoff.md (untracked, live file in main checkout).
Remaining SPEC items (ranked by impact Γ independence)β
1. LUKS encryption (Β§2.6) β IN PROGRESSβ
Backend: plumbed but uncommitted. InstallConfig.Encryption ("none" | "tpm2-luks" | "luks-passphrase") + LuksPassphrase field. grub.cfg forwards wootc.luks=<type> on the cmdline.
Remaining:
- Commit the dirty
app/app.go+app/installer_windows.gochanges (β4543d8b) - Add
Encryptionfield to non-WindowsgetSystemInfo()stub - GUI: encryption section on launchpad (radio: None / TPM auto-unlock / Passphrase) β source written, not yet built
- GUI: passphrase input field β source written, not yet built
- Frontend binding:
Encryption+LuksPassphraseinstartInstall()β source written - Playwright test: encryption chooser β test written, fails (stale dist/)
-
.gitignore: add*caveat*.txtexports
BLOCKER: Playwright serves the built bundle from app/frontend/dist/.
Source changes don't appear until cd app/frontend && npm run build.
The LUKS test fails because dist/ still has the old bundle.
Next: rebuild frontend, re-run Playwright (expect 10/10 green).
2. NTFS defrag preflight (Β§3.6)β
What: Before creating root.vhdx, check the NTFS volume's fragmentation level. If heavily fragmented, offer to defrag so VHDX extent allocation is reasonably contiguous (performance, not correctness).
Implementation:
- Add
defragRecommendedtoSystemInfoβ calldefrag C: /A /Vand parse "You should defragment this volume" - GUI: warning banner on launchpad when defrag recommended, with a "Defrag now" button
- Backend:
DefragDrive()exported method β runsdefrag C: /U /V(admin) - Playwright: defrag warning scenario
Files to touch: app/installer_windows.go, app/installer_other.go, app/app.go, app/frontend/src/main.js, tests/gui/gui.spec.js
3. VM modes detection (Β§6.1, Β§6.2)β
What: Detect whether the Windows host has WHPX (Hyper-V) or HAXM available for accelerated VM boot. Bundle a minimal QEMU for Windows so "Boot in VM" works out of the box.
Already done: app/vm_windows.go (QEMU launcher), app/vm_other.go (stubs), "Boot in VM" button on control panel.
Remaining:
- Bundle QEMU for Windows (or document that the user needs to install it)
- Detect WHPX: check
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All - Detect HAXM: check for Intel HAXM driver
-
GetVMCapability()returns richer info: which accelerator, QEMU path, whether QEMU is bundled - "Boot in VM" button shows disabled state with reason when no accelerator
- If QEMU not found, offer download link or bundle path
Files to touch: app/vm_windows.go, app/vm_other.go, app/installer_windows.go, app/frontend/src/main.js
4. systemd-boot option (Β§1.2)β
What: Offer systemd-boot as an alternative bootloader in the UI. However, systemd-boot won't chain-load under Secure Boot for EL targets (shim only signs GRUB). For a non-Secure-Boot or UKI future, add it as a hidden/advanced option.
Implementation:
- Add
"systemd-boot"to the bootloader dropdown (hidden behind an "Advanced" toggle) - Backend: stage
systemd-bootx64.efion ESP, write loader entries for the deployer - Document: Secure Boot limitation β this path only works with SB off or a future signed UKI
Files to touch: app/frontend/src/main.js, app/installer_windows.go, app/app.go
5. polkit policy hookupβ
What: The migration helpers (wootc-convert-dir, wootc-apply-look) currently use pkexec with a generic prompt. Ship a polkit policy so the prompt reads "TunaOS migration needs toβ¦" instead of a raw binary path.
Already done: org.tunaos.wootc.policy file exists.
Remaining:
- Wire it into deploy.sh's migration install block (copy the .policy to /usr/share/polkit-1/actions/)
- Verify
pkaction --action-id org.tunaos.wootc.convert-dirworks post-install - Test: run
wootc-convert-diras non-root, confirm the polkit dialog text
Files to touch: payload/deployer/deploy.sh, payload/migration/org.tunaos.wootc.policy
6. CI β Playwright on PRsβ
What: Run the Playwright mock suite on every PR, and the CDP (real wootc.exe) suite on a Windows self-hosted runner.
Implementation:
- GitHub Actions workflow:
tests/gui/Playwright suite (Linux, 9 tests) - GitHub Actions workflow:
tests/gui/cdp.spec.json Windows self-hosted runner (gated byWOOTC_CDP_URL) - Upload screenshots as artifacts
- Block merge on failure
Files to touch: .github/workflows/gui-tests.yml (new)
7. Cleanupβ
What: Git hygiene items from the session.
- Add
*caveat*.txtto.gitignore - Add
app/wootc(built binary) to.gitignore - Commit
docs/gui-phase1-architecture.md - Delete the stale conversation export:
app/2026-07-17-042039-local-command-caveatcaveat-the-messages-below.txt
Dependency graphβ
LUKS backend commit (1a)
βββ LUKS GUI wiring (1b)
βββ LUKS Playwright test (1c)
NTFS defrag preflight (2) βββ independent
VM modes detection (3) βββ depends on QEMU bundling decision
systemd-boot option (4) βββ independent, low priority
polkit hookup (5) βββ independent
CI (6) βββ independent, but benefits from all tests passing
Cleanup (7) βββ do first
Next steps (order of execution)β
- Cleanup β commit dirty files, add gitignore entries
- Finish LUKS β GUI wiring + test (unblocks "all SPEC" claim)
- NTFS defrag preflight β quick win, no dependencies
- polkit hookup β quick win, already have the .policy file
- VM modes detection β needs QEMU-bundling decision first
- systemd-boot β low priority, hidden option
- CI β benefits from all tests green