diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,6 +8,20 @@
 
 _No unreleased changes._
 
+## 0.3.0.0 — 2026-07-14
+
+### Changed
+
+- Upgraded to `shibuya-pgmq-adapter` 0.12.0.0 and the `pgmq-*` 0.4 package family
+  (`pgmq-core`, `pgmq-config`, `pgmq-effectful`, `pgmq-hasql`, and `pgmq-migration`
+  in the test suite). `keiro-pgmq`'s own API is unchanged. The adapter's 0.12 fix
+  makes idle streams observe shutdown: a processor with nothing to consume now
+  finishes on request instead of polling until it is forcibly cancelled.
+- The test suite installs the PGMQ schema by appending `pgmq-migration`'s native
+  `pgmqMigrations` component to the suite's framework plan, rather than calling the
+  `migrate` runner that `pgmq-migration` 0.4 removed. One pg-migrate ledger now owns
+  the kiroku, keiro, and pgmq components together.
+
 ## 0.2.0.0 — 2026-07-13
 
 No user-facing changes. `keiro-pgmq` is released at 0.2.0.0 to stay in lockstep
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.2.0.0
+version:         0.3.0.0
 synopsis:        PostgreSQL job-queue (PGMQ) integration for Keiro
 description:
   A typed background-job queue for Keiro applications on top of PGMQ (the
@@ -58,13 +58,13 @@
     , hasql                 >=1.10
     , hasql-pool            >=1.2
     , hs-opentelemetry-api  >=1.0      && <1.1
-    , keiro-core            ^>=0.2.0.0
-    , pgmq-config           >=0.3      && <0.4
-    , pgmq-core             >=0.3      && <0.4
-    , pgmq-effectful        >=0.3      && <0.4
-    , pgmq-hasql            >=0.3      && <0.4
+    , keiro-core            ^>=0.3.0.0
+    , pgmq-config           >=0.4      && <0.5
+    , pgmq-core             >=0.4      && <0.5
+    , pgmq-effectful        >=0.4      && <0.5
+    , pgmq-hasql            >=0.4      && <0.5
     , shibuya-core          >=0.8.0.1  && <0.9
-    , shibuya-pgmq-adapter  >=0.11     && <0.12
+    , shibuya-pgmq-adapter  >=0.12     && <0.13
     , streamly-core         >=0.3
     , text                  >=2.1
     , time                  >=1.12
@@ -85,13 +85,13 @@
     , hs-opentelemetry-propagator-w3c  >=1.0      && <1.1
     , hs-opentelemetry-sdk             >=1.0      && <1.1
     , hspec                            >=2.11
-    , keiro-core                       ^>=0.2.0.0
+    , keiro-core                       ^>=0.3.0.0
     , keiro-pgmq
     , keiro-test-support
-    , pgmq-config                      >=0.3      && <0.4
-    , pgmq-core                        >=0.3      && <0.4
-    , pgmq-effectful                   >=0.3      && <0.4
-    , pgmq-migration                   >=0.3      && <0.4
+    , pgmq-config                      >=0.4      && <0.5
+    , pgmq-core                        >=0.4      && <0.5
+    , pgmq-effectful                   >=0.4      && <0.5
+    , pgmq-migration                   >=0.4      && <0.5
     , shibuya-core                     >=0.8.0.1  && <0.9
-    , shibuya-pgmq-adapter             >=0.11     && <0.12
+    , shibuya-pgmq-adapter             >=0.12     && <0.13
     , text                             >=2.1
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -76,21 +76,15 @@
 type Stack = '[Reader PgmqAdapterEnv, Pgmq, Tracing, Error PgmqRuntimeError, IOE]
 
 main :: IO ()
-main =
-    Postgres.withMigratedSuiteWith installPgmq \fixture ->
+main = do
+    -- PGMQ's schema is installed by appending pgmq-migration's native component to
+    -- the suite's framework plan, so one pg-migrate ledger owns kiroku, keiro, and
+    -- pgmq together.
+    pgmq <- either (fail . show) pure Migration.pgmqMigrations
+    Postgres.withMigratedSuiteWith [pgmq] \fixture ->
         hspec $
             describe "Keiro.PGMQ" $
                 around (Postgres.withFreshDatabase fixture) spec
-
--- | Install the PGMQ schema into the ephemeral database via @pgmq-migration@.
-installPgmq :: Text -> IO ()
-installPgmq connStr =
-    withPool connStr $ \pool -> do
-        result <- Pool.use pool Migration.migrate
-        case result of
-            Left usageErr -> fail ("pgmq pool error during migration: " <> show usageErr)
-            Right (Left migErr) -> fail ("pgmq migration error: " <> show migErr)
-            Right (Right ()) -> pure ()
 
 withPool :: Text -> (Pool -> IO a) -> IO a
 withPool connStr =
