diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,20 @@
 
 ## Unreleased
 
+## 0.3.0.2 — 2026-08-07
+
+### Changed
+
+- Upgraded the baikai provider cohort to the `0.5` series: `baikai`,
+  `baikai-claude`, and `baikai-openai` now require `>=0.5 && <0.6`.
+  `baikai-effectful` stays on the `0.3` series, floored at `0.3.0.3` — the first
+  release whose own `baikai` bound admits `0.5`. Dependency bounds only; no
+  changes to the exported API.
+
+  baikai 0.5 adds an optional model-call evidence record. shikumi does not opt
+  in: it never sets `Options.evidence`, so no digest is computed and no evidence
+  event is emitted on any call shikumi makes.
+
 ## 0.3.0.1 - 2026-07-20
 
 ### Changed
diff --git a/shikumi.cabal b/shikumi.cabal
--- a/shikumi.cabal
+++ b/shikumi.cabal
@@ -1,6 +1,6 @@
 cabal-version:   3.4
 name:            shikumi
-version:         0.3.0.1
+version:         0.3.0.2
 synopsis:        Typed, structured, evaluable LM programs over baikai
 category:        AI
 description:
@@ -53,11 +53,11 @@
 
   build-depends:
     , aeson
-    , baikai             >=0.4  && <0.5
-    , baikai-claude      >=0.4  && <0.5
-    , baikai-effectful   >=0.3  && <0.4
-    , baikai-openai      >=0.4  && <0.5
-    , base               >=4.20 && <5
+    , baikai             >=0.5     && <0.6
+    , baikai-claude      >=0.5     && <0.6
+    , baikai-effectful   >=0.3.0.3 && <0.4
+    , baikai-openai      >=0.5     && <0.6
+    , base               >=4.20    && <5
     , base64-bytestring
     , bytestring
     , containers
@@ -109,10 +109,10 @@
 
   build-depends:
     , aeson
-    , baikai             >=0.4      && <0.5
-    , baikai-claude      >=0.4      && <0.5
-    , baikai-effectful   >=0.3      && <0.4
-    , baikai-openai      >=0.4      && <0.5
+    , baikai             >=0.5      && <0.6
+    , baikai-claude      >=0.5      && <0.6
+    , baikai-effectful   >=0.3.0.3  && <0.4
+    , baikai-openai      >=0.5      && <0.6
     , base
     , base64-bytestring
     , bytestring
diff --git a/test/RoutingSpec.hs b/test/RoutingSpec.hs
--- a/test/RoutingSpec.hs
+++ b/test/RoutingSpec.hs
@@ -98,7 +98,7 @@
     liftIO (atomicModifyIORef' ref (\xs -> (xs ++ [(m, ctx, o)], ())))
     -- A minimal successful stream whose terminal reassembles to @resp@, so a
     -- routed 'streamProgram' decodes exactly as the blocking path would.
-    pure [EventDone (doneTerminal Nothing Stop (AssistantMessage (resp ^. #message)))]
+    pure [EventDone (doneTerminal Nothing Nothing Stop (AssistantMessage (resp ^. #message)))]
 
 -- | Run a program sequentially under @routeLLM . runRouting model@ over a capturing
 -- stub and return the captured requests.
diff --git a/test/StreamSpec.hs b/test/StreamSpec.hs
--- a/test/StreamSpec.hs
+++ b/test/StreamSpec.hs
@@ -122,7 +122,7 @@
   ]
     ++ [TextDelta (DeltaPayload 0 d) | d <- deltas]
     ++ [ TextEnd (BlockEndPayload 0 (T.concat deltas)),
-         EventDone (doneTerminal Nothing Stop (AssistantMessage (payloadWith terminalText)))
+         EventDone (doneTerminal Nothing Nothing Stop (AssistantMessage (payloadWith terminalText)))
        ]
   where
     payloadWith t = (_Response ^. #message) & #content .~ V.singleton (AssistantText (_TextContent & #text .~ t))
diff --git a/test/StubProvider.hs b/test/StubProvider.hs
--- a/test/StubProvider.hs
+++ b/test/StubProvider.hs
@@ -53,6 +53,14 @@
 stubApi :: Api
 stubApi = Custom "stub"
 
+-- | Every stub ignores 'Options.thinking' and puts nothing on any wire, so the
+-- truthful description of what it does with a reasoning-effort request is
+-- 'noThinkingRequested' — not a translation invented to look plausible.
+-- baikai only calls this for a caller who asked for strict evidence, which no
+-- shikumi interpreter does.
+stubDescribeThinking :: Model -> Options -> ThinkingTranslation
+stubDescribeThinking _ _ = noThinkingRequested
+
 -- | A hand-built 'Model' whose 'api' routes to the stub provider.
 stubModel :: Model
 stubModel =
@@ -101,7 +109,7 @@
     TextStart IndexPayload {contentIndex = 0},
     TextDelta DeltaPayload {contentIndex = 0, delta = t},
     TextEnd BlockEndPayload {contentIndex = 0, content = t},
-    EventDone (doneTerminal Nothing Stop (AssistantMessage (stubPayloadWith t)))
+    EventDone (doneTerminal Nothing Nothing Stop (AssistantMessage (stubPayloadWith t)))
   ]
 
 -- | Build an isolated registry from a @complete@ implementation, reusing the
@@ -114,7 +122,8 @@
     ApiProvider
       { apiTag = stubApi,
         complete = completeFn,
-        stream = \_ _ _ -> Stream.fromList (stubEvents streamText)
+        stream = \_ _ _ -> Stream.fromList (stubEvents streamText),
+        describeThinking = stubDescribeThinking
       }
   pure reg
 
@@ -159,7 +168,7 @@
 streamErrorEvents :: Rational -> Text -> [AssistantMessageEvent]
 streamErrorEvents cost msg =
   [ EventStart StartPayload {partial = AssistantMessage (_Response ^. #message), responseId = Nothing},
-    EventError (doneTerminal Nothing ErrorReason (AssistantMessage errPayload))
+    EventError (doneTerminal Nothing Nothing ErrorReason (AssistantMessage errPayload))
   ]
   where
     errPayload =
@@ -189,7 +198,8 @@
             Stream.fromList $
               if n <= failTimes
                 then streamErrorEvents 0 ("stub stream failure #" <> T.pack (show n))
-                else stubEvents t
+                else stubEvents t,
+        describeThinking = stubDescribeThinking
       }
   pure reg
 
@@ -204,7 +214,8 @@
     ApiProvider
       { apiTag = stubApi,
         complete = \_ _ _ -> pure (stubResponse ""),
-        stream = \_ _ _ -> Stream.fromList (streamErrorEvents cost "stub stream failure")
+        stream = \_ _ _ -> Stream.fromList (streamErrorEvents cost "stub stream failure"),
+        describeThinking = stubDescribeThinking
       }
   pure reg
 
