Ghost posted SKIPPED on client-only (Compose / LocalSwarmHost) PRs because the ghost runner has no X11/Wayland display server. krill-desktop cannot be launched — xdpyinfo fails with “unable to open display” — so the tester cannot exercise any UI flow.
Verify Agent Ghost.yml never provisioned a virtual framebuffer before handing off to the QA tester. The workflow installed krill-desktop.deb successfully but $DISPLAY was empty, so any attempt to start the desktop app terminated immediately. The tester roles/tester.md already documented the SKIPPED path for this scenario as a short-term workaround (krill-agents#22), but the workflow itself had no way to unblock the display.
.github/workflows/Verify Agent Ghost.yml before the QA tester launch. It installs xvfb if missing, starts Xvfb :99, writes the PID to /tmp/xvfb.pid, and exports DISPLAY=:99 via $GITHUB_ENV so the claude subprocess launched by launch-tester.sh inherits it.xdpyinfo startup probe: the step fails fast if Xvfb doesn’t respond within 1 second rather than silently mis-setting $DISPLAY.xdpyinfo probe pattern whenever a new app requiring a display is added to the package set./tmp/.