diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,14 @@
 
 ## Unreleased
 
+## 0.3.1.0 — 2026-11-02
+
+### Changed
+
+- Upgrade `mori://shinzui/baikai/packages/baikai` to `>=0.10.0.0 && <0.11`.
+
+- Update internal dependency bounds for the breaking `shikumi 0.5.0.0` release.
+
 ## 0.3.0.2 — 2026-10-16
 
 ### Changed
diff --git a/shikumi-trace.cabal b/shikumi-trace.cabal
--- a/shikumi-trace.cabal
+++ b/shikumi-trace.cabal
@@ -1,6 +1,6 @@
 cabal-version: 3.4
 name: shikumi-trace
-version: 0.3.0.2
+version: 0.3.1.0
 synopsis:
   Hierarchical tracing, observability, and deterministic replay for shikumi (EP-7)
 
@@ -58,7 +58,7 @@
 
   build-depends:
     aeson >=2.2 && <2.3,
-    baikai >=0.8.0.0 && <0.9,
+    baikai >=0.10.0.0 && <0.11,
     base >=4.20 && <5,
     bytestring >=0.11 && <0.13,
     containers >=0.6 && <0.9,
@@ -67,8 +67,8 @@
     generic-lens >=2.2 && <2.4,
     lens ^>=5.3,
     scientific >=0.3 && <0.4,
-    shikumi ^>=0.4.1.1,
-    shikumi-cache ^>=0.2.0.2,
+    shikumi ^>=0.5.0.0,
+    shikumi-cache ^>=0.2.1.0,
     text ^>=2.1,
     time >=1.12 && <1.17,
     vector >=0.13 && <0.14,
@@ -83,7 +83,7 @@
 
   build-depends:
     base,
-    shikumi-trace ^>=0.3.0.2,
+    shikumi-trace ^>=0.3.1.0,
 
 test-suite shikumi-trace-test
   import: common-options
@@ -95,22 +95,24 @@
     -with-rtsopts=-N
 
   other-modules:
+    DecisionReplaySpec
     ObservationSpec
     TraceFixtures
 
   build-depends:
     QuickCheck,
     aeson,
-    baikai >=0.8.0.0 && <0.9,
+    baikai >=0.10.0.0 && <0.11,
     base,
     bytestring,
     containers,
     effectful,
     generic-lens,
     lens ^>=5.3,
-    shikumi ^>=0.4.1.1,
-    shikumi-cache ^>=0.2.0.2,
-    shikumi-trace ^>=0.3.0.2,
+    shikumi ^>=0.5.0.0,
+    shikumi-cache ^>=0.2.1.0,
+    shikumi-testing,
+    shikumi-trace ^>=0.3.1.0,
     tasty,
     tasty-hunit,
     tasty-quickcheck,
diff --git a/test/DecisionReplaySpec.hs b/test/DecisionReplaySpec.hs
new file mode 100644
--- /dev/null
+++ b/test/DecisionReplaySpec.hs
@@ -0,0 +1,44 @@
+module DecisionReplaySpec (tests) where
+
+import Data.Map.Strict qualified as Map
+import Data.Vector qualified as V
+import Effectful (runEff)
+import Effectful.Error.Static (runErrorNoCallStack)
+import Effectful.Prim (runPrim)
+import Shikumi.Decision
+import Shikumi.Decision.Setting
+import Shikumi.Effect.Time (runTime)
+import Shikumi.Error (ShikumiError)
+import Shikumi.Program
+import Shikumi.Routing
+import Shikumi.Schema (field)
+import Shikumi.Testing.DecisionFixtures
+import Shikumi.Testing.StubLLM (runStubLLM)
+import Shikumi.Testing.SystemOne
+import Shikumi.Trace (runTrace, tracedLLM)
+import Shikumi.Trace.Replay (runLLMReplay)
+import Shikumi.Trace.Store (replayIndex)
+import Test.Tasty
+import Test.Tasty.HUnit
+
+tests :: TestTree
+tests =
+  testGroup
+    "Decision replay"
+    [ testCase "new settings derive a different answer from a recorded response" $ do
+        let program = Predict assessmentSig emptyParams
+            input = Ticket (field "x")
+            responder = systemOneResponder (const [("urgent", FieldNoul (NoulEvidence 0.6)), ("severity", FieldScore (ScoreEvidence (V.fromList [0.1, 0.3, 0.6]) Nothing)), ("category", FieldChoice (ChoiceEvidence (Map.fromList [("billing", 0.2), ("technical", 0.8)]) Nothing))])
+        recorded <- runEff . runPrim . runTime . runErrorNoCallStack @ShikumiError . runRouting (systemOneModel "jev-latest") . runTrace . runStubLLM responder . tracedLLM . routeLLM $ runProgram program input
+        case recorded of
+          Left err -> assertFailure (show err)
+          Right (before, tree) -> case replayIndex tree of
+            Left err -> assertFailure (show err)
+            Right index -> do
+              replayed <-
+                runEff . runErrorNoCallStack @ShikumiError . runRouting (systemOneModel "jev-latest") . runLLMReplay index . routeLLM $
+                  runProgram (mapParams (setDecisionSetting "severity" (ScoreSetting [0.5, 1.6])) program) input
+              case replayed of
+                Left err -> assertFailure (show err)
+                Right after -> assertBool "cuts affect replayed level" (after /= before)
+    ]
diff --git a/test/Main.hs b/test/Main.hs
--- a/test/Main.hs
+++ b/test/Main.hs
@@ -15,6 +15,7 @@
 import Data.Text qualified as T
 import Data.Time.Clock (UTCTime, addUTCTime)
 import Data.Vector qualified as V
+import DecisionReplaySpec qualified
 import Effectful (Eff, runEff, type (:>))
 import Effectful.Error.Static (runErrorNoCallStack)
 import Effectful.Prim (runPrim)
@@ -101,7 +102,7 @@
   defaultMain $
     testGroup
       "shikumi-trace"
-      [ObservationSpec.tests, spikeTests, treeTests, storeTests, replayTests, e2eTests, nodeTests, correlateTests, feedbackTests]
+      [DecisionReplaySpec.tests, ObservationSpec.tests, spikeTests, treeTests, storeTests, replayTests, e2eTests, nodeTests, correlateTests, feedbackTests]
 
 -- ---------------------------------------------------------------------------
 -- M0
