Split out of #19. That issue is about Wayland and is not fixable in this repository — baseview has no Wayland backend at 0.2 or 0.3, and the pin is forced rather than conservative (published egui-baseview 0.6.0 requires baseview 0.2.2). This issue is the part that is fixable here, and it is worth more than it looks.
The mechanism is misattributed in #19
#19's body says GLX. It is sRGB. crates/namir-ui/src/app.rs builds its window as:
let settings = egui_baseview::EguiWindowSettings { title, size, ..Default::default() };
so GlConfig::srgb stays true, and glXChooseFBConfig then matches none of Xvfb's 320 available configs. The window never opens under a headless X server, and the failure reads as a GLX problem because that is the call that returns nothing.
(#19's own comment already suspected this; the body was never corrected. Its closing claim that the UI manual scripts were never executed is also stale — fr-ui-020 and fr-ui-070 were run by a human at M9b, 1621caf / 9e712d3.)
Why this is worth doing
Six Verify: M Musts currently record no pass, and five of them are UI scripts that need a human at a screen: FR-UI-030, FR-UI-040, FR-UI-050, FR-UI-070, plus FR-IN-020's display half, which has no manual document at all (it went uncovered when the traceability gate learned to read compound Verify: methods, #27).
If the window can open headless, those scripts become runnable in CI instead of by hand. That does not automatically make them Verify: M artifacts — D-18.6 still governs what a manual document can stand for — but it converts "needs someone at a machine" into "runs on every push", which is the actual reason those six have sat unexecuted.
Suggested shape
Make sRGB optional in open_blocking / open_parented: attempt the default config, and on failure retry with srgb: false. Both call sites are in crates/namir-ui/src/app.rs. A headless runner gets a window; a real machine is unaffected because the first attempt succeeds.
Worth confirming the fallback does not change rendered colour on a real display before relying on it for a screenshot-comparing test — an sRGB-less framebuffer will differ, which matters if any script asserts on appearance rather than on structure.
Split out of #19. That issue is about Wayland and is not fixable in this repository —
baseviewhas no Wayland backend at 0.2 or 0.3, and the pin is forced rather than conservative (publishedegui-baseview0.6.0 requiresbaseview0.2.2). This issue is the part that is fixable here, and it is worth more than it looks.The mechanism is misattributed in #19
#19's body says GLX. It is sRGB.
crates/namir-ui/src/app.rsbuilds its window as:so
GlConfig::srgbstaystrue, andglXChooseFBConfigthen matches none of Xvfb's 320 available configs. The window never opens under a headless X server, and the failure reads as a GLX problem because that is the call that returns nothing.(#19's own comment already suspected this; the body was never corrected. Its closing claim that the UI manual scripts were never executed is also stale —
fr-ui-020andfr-ui-070were run by a human at M9b,1621caf/9e712d3.)Why this is worth doing
Six
Verify: MMusts currently record no pass, and five of them are UI scripts that need a human at a screen: FR-UI-030, FR-UI-040, FR-UI-050, FR-UI-070, plus FR-IN-020's display half, which has no manual document at all (it went uncovered when the traceability gate learned to read compoundVerify:methods, #27).If the window can open headless, those scripts become runnable in CI instead of by hand. That does not automatically make them
Verify: Martifacts — D-18.6 still governs what a manual document can stand for — but it converts "needs someone at a machine" into "runs on every push", which is the actual reason those six have sat unexecuted.Suggested shape
Make sRGB optional in
open_blocking/open_parented: attempt the default config, and on failure retry withsrgb: false. Both call sites are incrates/namir-ui/src/app.rs. A headless runner gets a window; a real machine is unaffected because the first attempt succeeds.Worth confirming the fallback does not change rendered colour on a real display before relying on it for a screenshot-comparing test — an sRGB-less framebuffer will differ, which matters if any script asserts on appearance rather than on structure.