veilor-os/docs/research/2026-05-05-agent-wave/07-kde-skel-branding.md
veilor-org 49a2e2557e docs: 9-agent research wave findings — v0.5.32 blocker map
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.
2026-05-05 14:52:53 +01:00

5.1 KiB

KDE theme + DuckSans + /etc/skel branding audit

Agent 7 of 9-agent wave, 2026-05-05.

Catalog: what's currently shipped

Component Status Path
Color scheme shipped assets/kde/veilor-black.colors/usr/share/color-schemes/
System kdeglobals shipped assets/kde/veilor-default.kdeglobals/etc/xdg/kdedefaults/kdeglobals
Breeze decoration override shipped assets/kde/breezerc/etc/xdg/breezerc
Plasma containment defaults shipped written by 30-apply-v03-theme.sh/etc/xdg/kdedefaults/plasma-org.kde.plasma.desktop-appletsrc
Wallpaper (PNG+SVG) shipped assets/wallpapers/veilor-black.{png,svg}/usr/share/wallpapers/veilor-black/
SDDM theme shipped (full QML) assets/sddm/veilor-black//usr/share/sddm/themes/veilor-black/
SDDM theme activation shipped 30-apply-v03-theme.sh writes /etc/sddm.conf.d/veilor-theme.conf (Current=veilor-black)
Konsole profile + colorscheme shipped assets/konsole/veilor.{profile,colorscheme}/usr/share/konsole/Veilor.* + /etc/xdg/konsolerc
Plymouth theme shipped assets/plymouth/veilor/
os-release branding shipped PRETTY_NAME="veilor-os 0.5.27", LOGO=veilor-logo
Fira Code fontconfig shipped /etc/fonts/conf.d/55-veilor-firacode.conf
DuckSans font DEFERRED — empty dir, README only

Drift inside active configs

  • overlay/etc/sddm.conf.d/veilor.conf sets [Theme] Current=breeze.
  • 30-apply-v03-theme.sh then writes /etc/sddm.conf.d/veilor-theme.conf with Current=veilor-black.
  • SDDM merges alphabetically → veilor-theme.conf wins (loads after).
  • Shipping a Current=breeze line in the overlay is misleading drift.

Specific gaps preventing visual brand consistency

  1. No /etc/skel/ whatsoever. overlay/etc/skel/ does not exist. All KDE config lives in /etc/xdg/kdedefaults/ and /etc/xdg/*rc. Works for fresh boots, but the moment the user clicks anything in System Settings, KDE writes ~/.config/kdeglobals and silently shadows the system defaults. Zero per-user seeding = one click away from losing all branding.

  2. No PRETTY_NAME secondaries. /etc/system-release, /etc/issue, /etc/issue.net, /etc/lsb-release never written. lsb_release -a reports Fedora. KDE About dialog uses os-release (OK) but TTY login banner + many user-space tools read /etc/system-release.

  3. No kwinrc shipped. Plasma 6 Wayland-specific defaults (TitlebarDoubleClick, Compositor backend, FocusPolicy, animation speed) not seeded. Vanilla Fedora KDE animations + click-to-focus prevail.

  4. No panel layout (plasma-org.kde.plasma.desktop-appletsrc containment for panel). The file written by 30-apply-v03-theme.sh only seeds [Containments][1] (desktop containment) for wallpaper. Actual Plasma panel containment (taskbar, system tray, clock, kickoff icon) is unseeded → users get stock Fedora panel with Fedora-blue kickoff button.

  5. DuckSans deferred but README claims it as the brand font. kdeglobals, Konsole, SDDM all hardcode Fira Code. If DuckSans ever ships, ten files need synchronized edits.

  6. overlay/etc/sddm.conf.d/veilor.conf says Current=breeze — internal contradiction with script-written veilor-theme.conf. Cosmetic but confusing.

  7. kde-theme-apply.sh has warn() undefined (line 64) — calls warn but only ok/info defined. If os-release source ever goes missing, script crashes with command not found.

Top 5 /etc/skel/ additions (highest impact, lowest effort)

  1. /etc/skel/.config/kdeglobals — copy of assets/kde/veilor-default.kdeglobals. Single highest-impact file: locks ColorScheme, AccentColor, Font, Icons.Theme, LookAndFeelPackage into the user's first-write file so System Settings interaction won't revert anything to Breeze defaults.

  2. /etc/skel/.config/konsolerc[Desktop Entry] DefaultProfile=Veilor.profile plus [KonsoleWindow] ShowMenuBarByDefault=false. Per-user override of system konsolerc; ensures first konsole launch is branded even if user's home pre-exists.

  3. /etc/skel/.config/kwinrc — Plasma 6 Wayland defaults: [Compositing] AnimationSpeed=0, [Windows] FocusPolicy=ClickToFocus, [Plugins] blurEnabled=false (mirrors the no-animations Breeze override).

  4. /etc/skel/.config/plasma-org.kde.plasma.desktop-appletsrc — full containment file with both desktop containment (wallpaper=veilor-black) AND panel containment (kickoff icon = /usr/share/pixmaps/veilor-logo.svg, panel height/position). Without this, the taskbar is vanilla Fedora.

  5. /etc/skel/.local/share/konsole/Veilor.profile — local copy so user-local konsole sees the profile in its dropdown without needing /usr/share/konsole/ walk. Pair with #2.

Bonus near-zero-effort: write /etc/system-release, /etc/issue, and /etc/lsb-release in kde-theme-apply.sh to close the lsb_release/TTY-banner gap. And fix the undefined warn() in kde-theme-apply.sh:64.