UI smoke tests ~~~~~~~~~~~~~~ These tests launch each GUI (axis, touchy, gmoccapy, qtdragon) under xvfb-run against an existing sim config and verify the GUI starts and the NML task is reachable. Phase 1 ("does it start"); functional checks (load G-code, jog, MDI) belong in tests/ui-functional/. Each test directory contains: test.sh launches the GUI under xvfb-run, runs drive.py checkresult examines the captured output for crash markers skip skips this test only when xvfb-run is not on the host Shared helpers live in _lib/: drive.py common NML driver, prints UI_SMOKE_OK on success launch.sh xvfb-run wrapper, signal escalation for shutdown cleanup-runtime.sh belt-and-suspenders: kill stray daemons, ipcrm shared memory, drop /tmp/linuxcnc.lock checkresult.sh shared pass/fail predicate skip-if-missing.sh shared skip predicate Skip vs fail policy: the only condition we skip on is xvfb-run absence (rare local dev env). Python and gi typelib deps the GUIs need are declared in debian/control under !nocheck so apt-get build-dep installs them on CI; if they are missing the test should fail loudly rather than silently skip, so missing deps surface during review.