diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,22 @@
 
 ## [Unreleased]
 
+## 0.23.0.0 — 2026-10-30
+
+### Breaking Changes
+
+- Require `kiroku-store ^>=0.13.0.1` from
+  mori://shinzui/kiroku/packages/kiroku-store. Update exhaustive custom Store
+  interpreters, StoreError matches, and KirokuEvent observers for compaction;
+  follow the Keiro upgrade blueprint and its entailed upstream edge.
+
+### Other Changes
+
+- Treat `CompactionConcurrentMutation` as a transient store error so process
+  managers retry commands affected by a concurrent compaction mutation.
+- Refresh runtime guides and user documentation, including workflow replay,
+  snapshots, migration ownership, and operational inspection contracts.
+
 ## 0.22.0.0 — 2026-10-27
 
 ### 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.22.0.0
+version: 0.23.0.0
 synopsis: Event sourcing framework and workflow engine
 description:
   A library that composes kiroku, keiki, and shibuya into an
@@ -176,8 +176,8 @@
     hs-opentelemetry-semantic-conventions >=1.40 && <2,
     keiki >=0.9 && <0.10,
     keiki-codec-json >=0.9 && <0.10,
-    keiro-core ^>=0.22.0.0,
-    kiroku-store ^>=0.12.0.0,
+    keiro-core ^>=0.23.0.0,
+    kiroku-store ^>=0.13.0.1,
     lens >=5.2 && <5.4,
     mmzk-typeid >=0.7 && <0.8,
     random >=1.2.1 && <1.4,
@@ -247,9 +247,9 @@
     keiki,
     keiki-codec-json,
     keiro,
-    keiro-migrations ^>=0.22.0.0,
-    keiro-test-support ^>=0.22.0.0,
-    kiroku-store ^>=0.12.0.0,
+    keiro-migrations ^>=0.23.0.0,
+    keiro-test-support ^>=0.23.0.0,
+    kiroku-store ^>=0.13.0.1,
     process >=1.6 && <1.7,
     shibuya-core ^>=0.12.0.0,
     stm >=2.5 && <2.6,
@@ -284,11 +284,11 @@
     keiki >=0.9 && <0.10,
     keiki-codec-json >=0.9 && <0.10,
     keiro,
-    keiro-core ^>=0.22.0.0,
-    keiro-test-support ^>=0.22.0.0,
-    kiroku-store ^>=0.12.0.0,
+    keiro-core ^>=0.23.0.0,
+    keiro-test-support ^>=0.23.0.0,
+    kiroku-store ^>=0.13.0.1,
     shibuya-core ^>=0.12.0.0,
-    shibuya-kiroku-adapter ^>=0.7.0.0,
+    shibuya-kiroku-adapter ^>=0.7.0.1,
     stm >=2.5 && <2.6,
     streamly-core >=0.3 && <0.4,
     text >=2.1 && <2.2,
@@ -334,9 +334,9 @@
     hs-opentelemetry-sdk >=1.0 && <1.1,
     keiki >=0.9 && <0.10,
     keiro,
-    keiro-core ^>=0.22.0.0,
-    keiro-test-support ^>=0.22.0.0,
-    kiroku-store ^>=0.12.0.0,
+    keiro-core ^>=0.23.0.0,
+    keiro-test-support ^>=0.23.0.0,
+    kiroku-store ^>=0.13.0.1,
     process >=1.6 && <1.7,
     shibuya-core ^>=0.12.0.0,
     streamly-core >=0.3 && <0.4,
diff --git a/src/Keiro/ProcessManager.hs b/src/Keiro/ProcessManager.hs
--- a/src/Keiro/ProcessManager.hs
+++ b/src/Keiro/ProcessManager.hs
@@ -361,6 +361,7 @@
   EmptyAppendBatch {} -> False
   StreamNotFound {} -> False
   HistoryRetentionActive {} -> True
+  CompactionConcurrentMutation {} -> True
   ReservedStreamName {} -> False
   StreamNameTooLong {} -> False
   DuplicateEvent {} -> False
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -364,6 +364,7 @@
     workflowStateCodec,
   )
 import Kiroku.Store qualified as Store
+import Kiroku.Store.Compaction.Types (mkCompactionDigest)
 import Kiroku.Store.Effect (Store)
 import Kiroku.Store.SQL qualified as KirokuSQL
 import Kiroku.Store.Subscription.Stream (AckItem (..), subscriptionAckStream)
@@ -5987,6 +5988,11 @@
       ackForCommandError
         (RetryDelay 5)
         (StoreFailed (Store.TransientTransactionFailure "40P01" "deadlock detected"))
+        `shouldBe` AckRetry (RetryDelay 5)
+      digest <- maybe (fail "invalid test compaction digest") pure (mkCompactionDigest (ByteString.replicate 32 0))
+      ackForCommandError
+        (RetryDelay 5)
+        (StoreFailed (Store.CompactionConcurrentMutation digest "concurrent reference"))
         `shouldBe` AckRetry (RetryDelay 5)
       ackForCommandError (RetryDelay 5) (StoreFailed (Store.EventDecodeFailed (Store.DecodeFailure (EventId sampleUuid) "bad payload")))
         `shouldSatisfy` \case
