diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,31 @@
 
 ## Unreleased
 
+## 0.13.0.0 — 2026-08-17
+
+### Breaking Changes
+
+- Requires `kiroku-store >=0.8 && <0.9`, replacing the previous `>=0.7 && <0.8`
+  bound. `kiroku-store` 0.8.0.0 maps PostgreSQL's class-40 transaction-rollback
+  codes — `40001` serialization_failure and `40P01` deadlock_detected — to a new
+  `StoreError` constructor, `TransientTransactionFailure`, instead of to
+  `UnexpectedServerError`. Consumers that matched
+  `UnexpectedServerError "40001"` or `UnexpectedServerError "40P01"`, and
+  exhaustive matches over `StoreError`, must adopt the new constructor.
+- Requires the lockstep `keiro-core ^>=0.13.0.0`.
+
+### Other Changes
+
+- `Keiro.ProcessManager.isTransientStoreError` classifies
+  `TransientTransactionFailure` as transient, so a serialization failure or
+  deadlock surfaced by the store finalizes `AckRetry` on the process-manager and
+  router workers rather than halting the subscription. Before this release the
+  same conditions arrived as `UnexpectedServerError` and were classified
+  deterministic, so they halted. `Keiro.Command.isRetryableConflict` is
+  unchanged and still covers only optimistic-concurrency conflicts, so
+  `runCommand` continues to surface a transient failure as
+  `StoreFailed (TransientTransactionFailure …)` for its caller to classify.
+
 ## 0.12.0.0 — 2026-08-14
 
 ### Breaking Changes
diff --git a/keiro.cabal b/keiro.cabal
--- a/keiro.cabal
+++ b/keiro.cabal
@@ -1,6 +1,6 @@
 cabal-version:   3.0
 name:            keiro
-version:         0.12.0.0
+version:         0.13.0.0
 synopsis:        Event sourcing framework and workflow engine
 description:
   A library that composes kiroku, keiki, and shibuya into an
@@ -146,8 +146,8 @@
     , hs-opentelemetry-semantic-conventions  >=1.40      && <2
     , keiki                                  >=0.9       && <0.10
     , keiki-codec-json                       >=0.9       && <0.10
-    , keiro-core                             ^>=0.12.0.0
-    , kiroku-store                           >=0.7       && <0.8
+    , keiro-core                             ^>=0.13.0.0
+    , kiroku-store                           >=0.8       && <0.9
     , lens                                   >=5.2       && <5.4
     , mmzk-typeid                            >=0.7       && <0.8
     , random                                 >=1.2.1     && <1.4
@@ -205,7 +205,7 @@
     , keiki-codec-json
     , keiro
     , keiro-test-support
-    , kiroku-store                           >=0.7      && <0.8
+    , kiroku-store                           >=0.8      && <0.9
     , process                                >=1.6      && <1.7
     , shibuya-core                           ^>=0.9.0.0
     , stm                                    >=2.5      && <2.6
@@ -235,9 +235,9 @@
     , hs-opentelemetry-sdk  >=1.0       && <1.1
     , keiki                 >=0.9       && <0.10
     , keiro
-    , keiro-core            ^>=0.12.0.0
+    , keiro-core            ^>=0.13.0.0
     , keiro-test-support
-    , kiroku-store          >=0.7       && <0.8
+    , kiroku-store          >=0.8       && <0.9
     , shibuya-core          ^>=0.9.0.0
     , streamly-core         >=0.3       && <0.4
     , tasty-bench           >=0.4
diff --git a/src/Keiro/ProcessManager.hs b/src/Keiro/ProcessManager.hs
--- a/src/Keiro/ProcessManager.hs
+++ b/src/Keiro/ProcessManager.hs
@@ -362,6 +362,7 @@
   DuplicateEvent {} -> False
   EventAlreadyLinked {} -> False
   LinkSourceEventMissing {} -> False
+  TransientTransactionFailure {} -> True
   UnexpectedServerError {} -> False
 
 isTransientCommandError :: CommandError -> Bool
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -4658,6 +4658,22 @@
       isRejectionClass (EncodeFailed (NonObjectCallerMetadata Aeson.Null)) `shouldBe` False
       ackForCommandError (RetryDelay 5) (StoreFailed (Store.ConnectionLost "boom"))
         `shouldBe` AckRetry (RetryDelay 5)
+      -- kiroku-store 0.8.0.0 types class-40 rollbacks separately from
+      -- UnexpectedServerError. The transaction rolled back completely and
+      -- nothing was committed, so the source event retries rather than halting
+      -- the subscription; every other server code still halts.
+      ackForCommandError
+        (RetryDelay 5)
+        (StoreFailed (Store.TransientTransactionFailure "40001" "could not serialize access"))
+        `shouldBe` AckRetry (RetryDelay 5)
+      ackForCommandError
+        (RetryDelay 5)
+        (StoreFailed (Store.TransientTransactionFailure "40P01" "deadlock detected"))
+        `shouldBe` AckRetry (RetryDelay 5)
+      ackForCommandError (RetryDelay 5) (StoreFailed (Store.UnexpectedServerError "XX000" "boom"))
+        `shouldSatisfy` \case
+          AckHalt (HaltFatal _) -> True
+          _ -> False
       ackForCommandError (RetryDelay 5) CommandRejected `shouldSatisfy` \case
         AckHalt (HaltFatal _) -> True
         _ -> False
