diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,17 @@
 
 ## [Unreleased]
 
+## 0.20.0.0 — 2026-10-12
+
+### Other Changes
+
+- Require [`shibuya-core`](mori://shinzui/shibuya/packages/shibuya-core)
+  `^>=0.10.0.1` and the [pgmq-hs libraries](mori://shinzui/pgmq-hs)
+  `>=0.6.1.1 && <0.7`; retain the PGMQ adapter at `^>=0.16.1.0`.
+  The tested releases support random 1.3, Effectful 2.7, and pg-migrate 1.2
+  with the existing queue APIs and migration SQL. Add integration coverage
+  requiring an idle worker to report a clean shutdown within ten seconds.
+
 ## 0.19.0.1 — 2026-10-05
 
 ### Other Changes
diff --git a/keiro-pgmq.cabal b/keiro-pgmq.cabal
--- a/keiro-pgmq.cabal
+++ b/keiro-pgmq.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.0
 name: keiro-pgmq
-version: 0.19.0.1
+version: 0.20.0.0
 synopsis: PostgreSQL job-queue (PGMQ) integration for Keiro
 description:
   A typed background-job queue for Keiro applications on top of PGMQ (the
@@ -65,12 +65,12 @@
     hasql >=1.10 && <1.11,
     hasql-pool >=1.2 && <1.5,
     hs-opentelemetry-api >=1.0 && <1.1,
-    keiro-core ^>=0.19.0.1,
-    pgmq-config >=0.6 && <0.7,
-    pgmq-core >=0.6 && <0.7,
-    pgmq-effectful >=0.6 && <0.7,
-    pgmq-hasql >=0.6 && <0.7,
-    shibuya-core ^>=0.10.0.0,
+    keiro-core ^>=0.20.0.0,
+    pgmq-config >=0.6.1.1 && <0.7,
+    pgmq-core >=0.6.1.1 && <0.7,
+    pgmq-effectful >=0.6.1.1 && <0.7,
+    pgmq-hasql >=0.6.1.1 && <0.7,
+    shibuya-core ^>=0.10.0.1,
     shibuya-pgmq-adapter ^>=0.16.1.0,
     streamly-core >=0.3 && <0.4,
     text >=2.1 && <2.2,
@@ -97,13 +97,13 @@
     hs-opentelemetry-propagator-w3c >=1.0 && <1.1,
     hs-opentelemetry-sdk >=1.0 && <1.1,
     hspec >=2.11,
-    keiro-core ^>=0.19.0.1,
+    keiro-core ^>=0.20.0.0,
     keiro-pgmq,
-    keiro-test-support ^>=0.19.0.1,
-    pgmq-config >=0.6 && <0.7,
-    pgmq-core >=0.6 && <0.7,
-    pgmq-effectful >=0.6 && <0.7,
+    keiro-test-support ^>=0.20.0.0,
+    pgmq-config >=0.6.1.1 && <0.7,
+    pgmq-core >=0.6.1.1 && <0.7,
+    pgmq-effectful >=0.6.1.1 && <0.7,
     pgmq-migration >=0.6.1.1 && <0.7,
-    shibuya-core ^>=0.10.0.0,
+    shibuya-core ^>=0.10.0.1,
     shibuya-pgmq-adapter ^>=0.16.1.0,
     text >=2.1 && <2.2,
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -33,6 +33,7 @@
 import Data.Text qualified as Text
 import Effectful (Eff, IOE, liftIO, (:>))
 import Effectful.Error.Static (Error)
+import Effectful.Exception qualified as Exception
 import Effectful.Reader.Static (Reader)
 import GHC.Generics (Generic)
 import Hasql.Connection.Settings qualified as Conn
@@ -656,6 +657,24 @@
     processed `shouldBe` True
     len <- runDb connStr (queueLen job.jobQueue.physicalName)
     len `shouldBe` 0
+
+  it "runJobWorkers shuts down an idle worker cleanly" $ \connStr -> do
+    let job = mkJob "keiro_pgmq_test.worker_idle_shutdown"
+    cleanShutdown <-
+      timeout 10_000_000 $
+        runDb connStr $ do
+          ensureJobQueue job
+          Exception.bracket
+            ( do
+                result <- runJobWorkers IgnoreFailures 16 [jobProcessor job \_payload -> pure Done]
+                either (liftIO . fail . ("runJobWorkers failed: " <>) . show) pure result
+            )
+            stopAppQuickly
+            ( \app -> do
+                liftIO $ threadDelay 100_000
+                stopAppGracefully ShutdownConfig {drainTimeout = 1, totalShutdownTimeout = 5} app
+            )
+    cleanShutdown `shouldBe` Just True
 
   it "runJobWorkers survives a transient database error during polling" $ \_connStr ->
     pendingWith "needs a deterministic keiro-pgmq-level transient polling fault injector; EP-1 covers this in upstream shibuya and shibuya-pgmq-adapter tests"
