diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,16 @@
 
 ## [Unreleased]
 
+## [0.4.1.0] - 2026-09-17
+
+### Added
+
+- Proper support for GHC 9.14.
+
+### Fixed
+
+- `tricorder ui` no longer shows "pending test suites" without any test suites.
+
 ## [0.4.0.0] - 2026-09-16
 
 ### Removed
diff --git a/src/Tricorder/CLI/UI/View.hs b/src/Tricorder/CLI/UI/View.hs
--- a/src/Tricorder/CLI/UI/View.hs
+++ b/src/Tricorder/CLI/UI/View.hs
@@ -316,10 +316,12 @@
 
 
 viewPendingTestTargets :: [TestTarget] -> Widget n
-viewPendingTestTargets =
+viewPendingTestTargets [] = emptyWidget
+viewPendingTestTargets tgts =
     vBox
         . ([txt "Pending test suites:"] <>)
         . fmap (subtle . txt . renderTestTarget)
+        $ tgts
 
 
 viewBuildFailed :: Text -> Widget Viewports
diff --git a/tricorder.cabal b/tricorder.cabal
--- a/tricorder.cabal
+++ b/tricorder.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:            tricorder
-version:         0.4.0.0
+version:         0.4.1.0
 synopsis:        Continuous Haskell build status, diagnostics, and tests via a shared daemon
 description:     tricorder rebuilds your Haskell project continuously and surfaces build status, diagnostics, test results, and documentation - for developers and LLM coding agents. Like ghcid and ghciwatch it reloads on every change, but builds run in a background daemon so multiple clients (an interactive TUI, a status CLI, an agent skill) share a single build state without triggering redundant rebuilds. It discovers components across multi-package cabal.project workspaces automatically and ships context-friendly output for agentic use via the CLI.
 category:        Development
@@ -17,9 +17,10 @@
 license-file:    LICENSE
 build-type:      Simple
 tested-with:
-    GHC == 9.10.3
+    GHC == 9.14.1
   , GHC == 9.6.7
   , GHC == 9.8.4
+  , GHC == 9.10.3
   , GHC == 9.12.4
 extra-doc-files:
     README.md
