diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,21 @@
 [Keep a Changelog](https://keepachangelog.com/), and the package follows the
 [Haskell Package Versioning Policy](https://pvp.haskell.org/).
 
+## Unreleased
+
+## 0.12.0.0 — 2026-08-14
+
+### Breaking Changes
+
+- Requires `keiro-core ^>=0.12.0.0`, the PGMQ package family
+  `>=0.5 && <0.6`, `shibuya-core ^>=0.9.0.0`, and
+  `shibuya-pgmq-adapter ^>=0.14.0.0`, replacing the 0.11 release's
+  Keiro-core 0.11, PGMQ 0.4, Shibuya 0.8, and adapter 0.12 bounds.
+
+### Other Changes
+
+- The source distribution now includes the BSD-3-Clause license file.
+
 ## [0.11.0.0] - 2026-08-05
 
 No user-facing changes beyond the lockstep `keiro-core ^>=0.11.0.0` bound.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,28 @@
+BSD 3-Clause License
+
+Copyright (c) 2026, Nadeem Bitar
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its contributors
+   may be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT INCLUDING
+NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
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.11.0.0
+version:         0.12.0.0
 synopsis:        PostgreSQL job-queue (PGMQ) integration for Keiro
 description:
   A typed background-job queue for Keiro applications on top of PGMQ (the
@@ -10,6 +10,7 @@
   @p -> Eff es JobOutcome@.
 
 license:         BSD-3-Clause
+license-file:    LICENSE
 author:          Nadeem Bitar
 maintainer:      nadeem@gmail.com
 copyright:       2026 Nadeem Bitar
@@ -59,13 +60,13 @@
     , hasql                 >=1.10      && <1.11
     , hasql-pool            >=1.2       && <1.5
     , hs-opentelemetry-api  >=1.0       && <1.1
-    , keiro-core            ^>=0.11.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.12      && <0.13
+    , keiro-core            ^>=0.12.0.0
+    , pgmq-config           >=0.5       && <0.6
+    , pgmq-core             >=0.5       && <0.6
+    , pgmq-effectful        >=0.5       && <0.6
+    , pgmq-hasql            >=0.5       && <0.6
+    , shibuya-core          ^>=0.9.0.0
+    , shibuya-pgmq-adapter  ^>=0.14.0.0
     , streamly-core         >=0.3       && <0.4
     , text                  >=2.1       && <2.2
     , time                  >=1.12      && <1.15
@@ -87,13 +88,13 @@
     , hs-opentelemetry-propagator-w3c      >=1.0       && <1.1
     , hs-opentelemetry-sdk                 >=1.0       && <1.1
     , hspec                                >=2.11
-    , keiro-core                           ^>=0.11.0.0
+    , keiro-core                           ^>=0.12.0.0
     , keiro-pgmq
     , keiro-test-support
-    , 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.12      && <0.13
+    , pgmq-config                          >=0.5       && <0.6
+    , pgmq-core                            >=0.5       && <0.6
+    , pgmq-effectful                       >=0.5       && <0.6
+    , pgmq-migration                       >=0.5       && <0.6
+    , shibuya-core                         ^>=0.9.0.0
+    , shibuya-pgmq-adapter                 ^>=0.14.0.0
     , text                                 >=2.1       && <2.2
diff --git a/src/Keiro/PGMQ/Dlq.hs b/src/Keiro/PGMQ/Dlq.hs
--- a/src/Keiro/PGMQ/Dlq.hs
+++ b/src/Keiro/PGMQ/Dlq.hs
@@ -30,6 +30,7 @@
     purgeDlq,
     archiveDlq,
     archiveDlqEntry,
+    archiveDlqEntryById,
   )
 where
 
@@ -45,7 +46,7 @@
 import "pgmq-effectful" Pgmq.Effectful
   ( Message (..),
     MessageBody (..),
-    MessageId,
+    MessageId (..),
     MessageQuery (..),
     Pgmq,
     ReadMessage (..),
@@ -239,3 +240,8 @@
       { queueName = job.jobQueue.dlqName,
         messageId = msgId
       }
+
+-- | Numeric-id convenience wrapper for operator surfaces that should not need
+-- a direct dependency on the lower-level @pgmq-effectful@ package.
+archiveDlqEntryById :: (Pgmq :> es, IOE :> es) => Job p -> Int64 -> Eff es Bool
+archiveDlqEntryById job = archiveDlqEntry job . MessageId
diff --git a/src/Keiro/PGMQ/Job.hs b/src/Keiro/PGMQ/Job.hs
--- a/src/Keiro/PGMQ/Job.hs
+++ b/src/Keiro/PGMQ/Job.hs
@@ -174,6 +174,7 @@
     DeadLetterReason (..),
     HaltReason (..),
     RetryDelay (..),
+    renderDeadLetterReason,
   )
 import "shibuya-core" Shibuya.Core.Ingested qualified as Shibuya
 import "shibuya-core" Shibuya.Core.Lease (Lease (..))
@@ -821,7 +822,7 @@
   setStatus traceSpan $ case decision of
     AckOk -> Ok
     AckRetry _ -> Ok
-    AckDeadLetter reason -> Error (deadLetterReasonText reason)
+    AckDeadLetter reason -> Error (renderDeadLetterReason reason)
     AckHalt reason -> Error (haltReasonText reason)
 
 -- | The @shibuya.ack.decision@ value for a decision, matching shibuya's runner.
@@ -830,12 +831,6 @@
 ackDecisionText (AckRetry _) = "ack_retry"
 ackDecisionText (AckDeadLetter _) = "ack_dead_letter"
 ackDecisionText (AckHalt _) = "ack_halt"
-
--- | The @ERROR@ status description for a dead-letter, matching shibuya's runner.
-deadLetterReasonText :: DeadLetterReason -> Text
-deadLetterReasonText (PoisonPill t) = "poison_pill: " <> t
-deadLetterReasonText (InvalidPayload t) = "invalid_payload: " <> t
-deadLetterReasonText MaxRetriesExceeded = "max_retries_exceeded"
 
 -- | The @ERROR@ status description for a halt, matching shibuya's runner.
 haltReasonText :: HaltReason -> Text
