Logs the full output of the 9-agent deep-dive run on 2026-05-05 to
docs/research/2026-05-05-agent-wave/. Pulls every actionable finding
into one indexed location so v0.5.32 planning has a paper trail.
Files:
docs/research/2026-05-05-agent-wave/README.md — index
docs/research/2026-05-05-agent-wave/01-...real-hardware.md — Plymouth + LUKS edge cases
docs/research/2026-05-05-agent-wave/02-...firstboot-ux.md — SDDM + first-boot UX
docs/research/2026-05-05-agent-wave/03-...spike-plan.md — bootc-image-builder 1-week spike
docs/research/2026-05-05-agent-wave/04-...tier-2.md — AppArmor + nftables + audit + homed
docs/research/2026-05-05-agent-wave/05-...launch.md — threat model + v0.7 launch checklist
docs/research/2026-05-05-agent-wave/06-...log-capture.md — virtio-9p host-share for anaconda logs
docs/research/2026-05-05-agent-wave/07-...skel-branding.md — /etc/skel gap audit
docs/research/2026-05-05-agent-wave/08-...ci-hardening.md — SHA-pin actions + SBOM + SLSA L3
docs/research/2026-05-05-agent-wave/09-...failure-modes.md — real-hardware pessimistic audit
Plus the prior linter-applied:
docs/ROADMAP.md — Lessons learned section, v0.5.32 active block,
v0.6 promotion of veilor-postinstall + veilor-doctor,
v0.7 bootc spike scheduled
docs/THREAT-MODEL.md — drafted by Agent 5; in/out scope, comparison
matrix, v0.7 launch checklist
Top blockers identified for v0.5.32 (cross-cited in README):
1. Suspend/resume wifi death (kernel.modules_disabled=1)
2. veilor-firstboot.service WantedBy=graphical.target
3. kernel-upgrade grub drift
4. USBGuard hash-rules problem (already learned on onyx)
5. firewalld blocks tailscale0
6. /etc/skel/ empty
7. virtio-9p log capture replaces broken virtio-serial path
Wave + verifier pattern (per ROADMAP lessons learned #4) validated:
9 parallel agents on distinct topics produced converging blocker
list. The same pattern landed v0.5.31 four-bug fix from the prior
4-agent verification wave on v0.5.30 outcome.
4.9 KiB
4.9 KiB
SDDM + first-boot UX failure modes
Agent 2 of 9-agent wave, 2026-05-05.
Findings
1. SDDM has no username prefilled — BLOCKS LOGIN (perceived)
- User sees blank greeter; no signal that the only user is
admin. - Fix:
/etc/sddm.conf.d/veilor.confadd[Users]\nRememberLastUser=trueplus seed/var/lib/sddm/state.conf [Last]\nUser=admin\nSession=plasma.
2. chage -d 0 + SDDM autologin race
- With
Relogin=false(current), single-shot is safe. - Fix: Document
Relogin=false. Don't combineAutologin=truewithchage -d 0.
3. PAM expired-pw change inline in SDDM
- Plasma 6 SDDM 0.21+ renders the chain. But if password fails
pwquality (cracklib min=14 + complexity from
10-harden-base.sh), error text shown briefly then form resets — user sees no clear reason for rejection. - Fix:
/etc/security/pwquality.conf.d/10-veilor.confwith documented rules + Plasma startup notification showing them.
4. Wayland session start failure on virtio-vga — BLOCKS LOGIN
- KWin tries
wlroots/DRM, fails to acquire/dev/dri/card0ifvirtio_gpukernel module not loaded. - Fix: add
plasma-workspace-x11to%packages. SDDM session menu showsPlasma (X11)fallback.
5. Plasma 6 first-run wizards on /etc/skel-empty
- KWin compositor backend pick + Plasma welcome center + accent colour wizard — modal stealing focus on first session.
- Fix: seed
/etc/skel/.config/:kwinrc[Compositing]\nBackend=OpenGLkdeglobals [General]\nAccentColor=...plasma-welcomerc [General]\nLastSeenVersion=99(suppresses welcome)
6. SELinux relabel after first boot — looks like hang
touch /.autorelabeltriggers full restore on rootfs; 90s on 4 GB live install, 3-5min on real disk. User hard-resets thinking it crashed → corrupted relabel state.- Fix: replace with
veilor-relabel.servicethat prints[veilor] relabeling SELinux file contexts (1/N): %sto TTY1 with progress, plus one-time post-relabel KDialog notification.
7. USBGuard blocks input at SDDM — BLOCKS LOGIN on desktops
- If
/etc/usbguard/rules.confempty/missing, USBGuardImplicitPolicyTarget=block(default) blocks USB. SDDM running but USB keyboard dead. - Fix: ship a baseline
rules.conf:allow with-interface equals { 03:00:* 03:01:* }(HID class) so any keyboard/mouse works pre-policy.
8. NetworkManager DHCP — LOW severity
- Wired auto-connects fine. Wi-Fi: silent failure unless SSID
preconfigured. Acceptable; Plasma 6 ships
plasma-nmwidget. - Polish:
/etc/xdg/autostart/veilor-firstboot-net-check.desktop→ KDialog "Connect to network?" ifnmcli generalisdisconnected.
9. veilor-firstboot.service ordering — BLOCKS LOGIN on real installs
- Current:
WantedBy=multi-user.targetonly. - Real installs: default to
graphical.target, so unit never runs. - Admin pw stays
veilor+ chage-expired. SDDM PAM bounces to chauthtok screen — recoverable but ugly. - Fix:
WantedBy=graphical.target multi-user.target. AddBefore=graphical.target. Verifysystemctl enable veilor-firstboot.service(in installer line 884) resolves both. AddDefaultDependencies=no+Wants=systemd-vconsole-setup.service.
Endeavour OS welcome app — design notes for veilor-postinstall
EOS welcome (endeavouros-team/welcome on GitHub) is bash + yad,
~3000 LOC. Patterns to lift for veilor:
- Yad GTK dialog as runtime (single binary dep). veilor (KDE)
uses
kdialog+qmlsceneinstead — native Plasma look. - Tabbed layout: Welcome | Set up apps | Security | System info | Shortcuts.
- Self-disabling autostart:
~/.config/autostart/veilor-welcome.desktopremoved after user clicks "Don't show again". - External script dispatch:
/usr/share/veilor-os/postinstall/<step>.shper step. Decouples UI from actions. - Update channel awareness: pull from
github.com/veilor-org/veilor-osreleases atom feed; show CVE advisories fromsecurity.atomwe publish.
Recommended stack:
/usr/bin/veilor-welcome(bash entrypoint, ≤300 LOC)/usr/share/veilor-os/postinstall/welcome.qml(QtQuick/Kirigami UI)/usr/share/veilor-os/postinstall/steps/{01-account,02-network,03-usbguard-policy,04-update,05-tour}.sh/etc/xdg/autostart/veilor-welcome.desktop- Replace current
scripts/firstboot.shplaceholder withstep 03-usbguard-policy(auto-generate-policy is the unfinished core item).
Top three to ship next (highest UX impact, lowest risk)
WantedBy=graphical.target multi-user.targetinveilor-firstboot.service— fixes silent SDDM-PAM-chauthtok bounce on real installs.- Username prefill in
sddm.conf.d/veilor.conf: add[Users] RememberLastUser=true+/var/lib/sddm/state.conf [Last] User=admin Session=plasma. - USBGuard HID baseline
rules.conf— un-bricks any desktop with USB keyboard.