diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
 # Changelog for pgmq-migration
 
+## 0.6.1.0 -- 2026-09-16
+
+Coordinated family version bump; the migration ledger and validators are unchanged
+from 0.6.0.0.
+
+The test suite now requires `ephemeral-pg >=0.3.1.0` and pins its temporary PostgreSQL
+clusters to `/tmp/ephpg-pgmq-hs-<uid>`, so a run killed mid-test leaves a postmaster a later
+run can reap. It therefore depends on `unix` to read the effective uid. No library
+dependency changed.
+
 ## 0.6.0.0 -- 2026-09-10
 
 Native installs now reach tagged PGMQ 1.13.0 through append-only migrations 0004–0006:
diff --git a/pgmq-migration.cabal b/pgmq-migration.cabal
--- a/pgmq-migration.cabal
+++ b/pgmq-migration.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.4
 name: pgmq-migration
-version: 0.6.0.0
+version: 0.6.1.0
 synopsis: PGMQ schema migrations without PostgreSQL extension
 description:
   Installs the PGMQ schema into PostgreSQL without requiring the pgmq extension.
@@ -80,7 +80,7 @@
     bytestring,
     containers,
     directory,
-    ephemeral-pg >=0.2.1,
+    ephemeral-pg >=0.3.1.0,
     hasql,
     pg-migrate,
     pg-migrate-import-hasql-migration,
@@ -88,3 +88,4 @@
     tasty ^>=1.5,
     tasty-hunit ^>=0.10,
     text,
+    unix,
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -10,6 +10,7 @@
 import Data.Foldable (toList)
 import Data.List.NonEmpty (NonEmpty (..))
 import Data.Map.Strict qualified as Map
+import Data.Monoid (Last (..))
 import Data.Text (Text)
 import Data.Text qualified as T
 import Data.Text.Encoding qualified as Text
@@ -59,8 +60,11 @@
 -- of the same name imported above, so it is reached through this alias only.
 import Database.PostgreSQL.Migrate.Internal qualified as MigrateInternal
 import EphemeralPg
-  ( connectionSettings,
-    withCached,
+  ( Config (temporaryRoot),
+    connectionSettings,
+    defaultCacheConfig,
+    defaultConfig,
+    withCachedConfig,
   )
 import Hasql.Connection qualified as Connection
 import Hasql.Connection.Settings qualified as Settings
@@ -78,14 +82,38 @@
     pgmqHasqlMigrationSourceConfig,
     pgmqHasqlMigrationSourceConfigWithPolicy,
   )
-import System.Directory (doesFileExist)
+import System.Directory (createDirectoryIfMissing, doesFileExist)
 import System.Environment (lookupEnv)
+import System.Posix.User (getEffectiveUserID)
 import Test.Tasty (TestTree, defaultMain, testGroup)
 import Test.Tasty.HUnit (assertBool, assertFailure, testCase, (@?=))
 
+-- | Root directory for ephemeral PostgreSQL clusters.
+--
+-- ephemeral-pg reaps abandoned clusters at startup, but only within its own
+-- temporary root. With 'temporaryRoot' unset that root is @$TMPDIR@, which
+-- @nix develop@ makes unique per shell, so a run never reclaims what an earlier
+-- session abandoned. Pinning one root across sessions keeps them reachable.
+--
+-- The path is keyed by effective uid. It is a fixed location created @0700@, so
+-- a run under a different user -- the Nix build sandbox -- must not collide with
+-- a directory it cannot write to.
+ephemeralRoot :: IO FilePath
+ephemeralRoot = do
+  uid <- getEffectiveUserID
+  pure ("/tmp/ephpg-pgmq-hs-" <> show uid)
+
+-- | Cached-startup configuration pinned to 'ephemeralRoot'.
+ephemeralConfig :: IO Config
+ephemeralConfig = do
+  root <- ephemeralRoot
+  createDirectoryIfMissing True root
+  pure defaultConfig {temporaryRoot = Last (Just root)}
+
 main :: IO ()
 main = do
-  result <- withCached $ \db -> do
+  config <- ephemeralConfig
+  result <- withCachedConfig config defaultCacheConfig $ \db -> do
     let connSettings = connectionSettings db
     connResult <- Connection.acquire connSettings
     case connResult of
